From 7b7963f3a230be48ee434544e952851cd41cc0f4 Mon Sep 17 00:00:00 2001 From: black Date: Sun, 9 Dec 2007 23:01:08 +0000 Subject: [PATCH] Get rid of the attic - this is not cvs and if anyone needs stuff from it, they can copy it from the previous revision. git-svn-id: svn://svn.icculus.org/nexuiz/trunk@3011 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- attic/TeamNexuiz/default.cfg | 533 - attic/TeamNexuiz/game/Nexuiz.dsp | 281 - attic/TeamNexuiz/game/Nexuiz.dsw | 29 - attic/TeamNexuiz/game/Nexuiz.ncb | Bin 508928 -> 0 bytes attic/TeamNexuiz/game/Nexuiz.opt | Bin 70656 -> 0 bytes attic/TeamNexuiz/game/fteqccgui.exe | Bin 233472 -> 0 bytes attic/TeamNexuiz/game/gamec/GameC.dsp | 521 - attic/TeamNexuiz/game/gamec/GameC.dsw | 29 - attic/TeamNexuiz/game/gamec/GameC.ncb | Bin 107520 -> 0 bytes attic/TeamNexuiz/game/gamec/GameC.opt | Bin 58880 -> 0 bytes attic/TeamNexuiz/game/gamec/GameC.plg | 1015 - attic/TeamNexuiz/game/gamec/Makefile | 5 - attic/TeamNexuiz/game/gamec/bot.c | 1239 - attic/TeamNexuiz/game/gamec/bot_ai.c | 1023 - attic/TeamNexuiz/game/gamec/bot_ed.c | 1367 - attic/TeamNexuiz/game/gamec/bot_fight.c | 438 - attic/TeamNexuiz/game/gamec/bot_maps.c | 152 - attic/TeamNexuiz/game/gamec/bot_misc.c | 841 - attic/TeamNexuiz/game/gamec/bot_move.c | 512 - attic/TeamNexuiz/game/gamec/bot_phys.c | 666 - attic/TeamNexuiz/game/gamec/bot_way.c | 1001 - attic/TeamNexuiz/game/gamec/builtins.h | 76 - attic/TeamNexuiz/game/gamec/civilian.c | 42 - attic/TeamNexuiz/game/gamec/cl_client.c | 1233 - attic/TeamNexuiz/game/gamec/cl_impulse.c | 247 - attic/TeamNexuiz/game/gamec/cl_physics.c | 318 - attic/TeamNexuiz/game/gamec/cl_physics.c_bh | 305 - attic/TeamNexuiz/game/gamec/cl_player.c | 416 - .../game/gamec/cl_weaponanimations.c | 25 - attic/TeamNexuiz/game/gamec/cl_weapons.c | 374 - attic/TeamNexuiz/game/gamec/cl_weaponsystem.c | 347 - attic/TeamNexuiz/game/gamec/class.c | 553 - attic/TeamNexuiz/game/gamec/constants.h | 200 - attic/TeamNexuiz/game/gamec/ctf.c | 396 - attic/TeamNexuiz/game/gamec/defs.h | 255 - attic/TeamNexuiz/game/gamec/domination.c | 239 - attic/TeamNexuiz/game/gamec/engineer.c | 1053 - attic/TeamNexuiz/game/gamec/extensions.h | 976 - attic/TeamNexuiz/game/gamec/g_casings.c | 91 - attic/TeamNexuiz/game/gamec/g_damage.c | 394 - attic/TeamNexuiz/game/gamec/g_decors.c | 246 - attic/TeamNexuiz/game/gamec/g_lights.c | 120 - attic/TeamNexuiz/game/gamec/g_subs.c | 456 - attic/TeamNexuiz/game/gamec/g_tetris.c | 746 - attic/TeamNexuiz/game/gamec/g_triggers.c | 869 - attic/TeamNexuiz/game/gamec/g_violence.c | 58 - attic/TeamNexuiz/game/gamec/g_world.c | 724 - attic/TeamNexuiz/game/gamec/mauvebot.c | 860 - attic/TeamNexuiz/game/gamec/medic.c | 124 - attic/TeamNexuiz/game/gamec/pyro.c | 179 - attic/TeamNexuiz/game/gamec/scout.c | 207 - attic/TeamNexuiz/game/gamec/soldier.c | 234 - attic/TeamNexuiz/game/gamec/spy.c | 365 - attic/TeamNexuiz/game/gamec/sv_main.c | 18 - attic/TeamNexuiz/game/gamec/sv_stats.c | 5 - attic/TeamNexuiz/game/gamec/sys.h | 145 - attic/TeamNexuiz/game/gamec/t_fort.c | 195 - attic/TeamNexuiz/game/gamec/t_halflife.c | 58 - attic/TeamNexuiz/game/gamec/t_items.c | 356 - attic/TeamNexuiz/game/gamec/t_jumppads.c | 96 - attic/TeamNexuiz/game/gamec/t_plats.c | 446 - attic/TeamNexuiz/game/gamec/t_quake.c | 48 - attic/TeamNexuiz/game/gamec/t_quake3.c | 18 - attic/TeamNexuiz/game/gamec/t_teleporters.c | 308 - attic/TeamNexuiz/game/gamec/tf_ball.c | 1236 - attic/TeamNexuiz/game/gamec/tf_constants.c | 60 - attic/TeamNexuiz/game/gamec/tf_w_mac10.c | 119 - attic/TeamNexuiz/game/gamec/tf_w_pistol.c | 126 - attic/TeamNexuiz/game/gamec/tf_w_proxi.c | 311 - attic/TeamNexuiz/game/gamec/tf_w_railgun.c | 116 - attic/TeamNexuiz/game/gamec/tfai.c | 101 - attic/TeamNexuiz/game/gamec/tfbuttons.c | 166 - attic/TeamNexuiz/game/gamec/tfclient.c | 169 - attic/TeamNexuiz/game/gamec/tfcombat.c | 709 - attic/TeamNexuiz/game/gamec/tfdefs.c | 330 - attic/TeamNexuiz/game/gamec/tfdoors.c | 865 - attic/TeamNexuiz/game/gamec/tfextractor.c | 60 - attic/TeamNexuiz/game/gamec/tffunctions.c | 2664 - attic/TeamNexuiz/game/gamec/tfgrenades.c | 959 - attic/TeamNexuiz/game/gamec/tfhud.c | 49 - attic/TeamNexuiz/game/gamec/tfitems.c | 194 - attic/TeamNexuiz/game/gamec/tfmapitems.c | 3186 - attic/TeamNexuiz/game/gamec/tfmenus.c | 606 - attic/TeamNexuiz/game/gamec/tfplats.c | 496 - attic/TeamNexuiz/game/gamec/tfq3fitems.c | 434 - attic/TeamNexuiz/game/gamec/tfsentry.c | 549 - attic/TeamNexuiz/game/gamec/tftesla.c | 463 - .../TeamNexuiz/game/gamec/tn_clientcommands.c | 598 - attic/TeamNexuiz/game/gamec/tn_misc.c | 112 - attic/TeamNexuiz/game/gamec/w_bombletts.c | 129 - attic/TeamNexuiz/game/gamec/w_common.c | 1314 - attic/TeamNexuiz/game/gamec/w_crylink.c | 122 - attic/TeamNexuiz/game/gamec/w_electro.c | 146 - attic/TeamNexuiz/game/gamec/w_flamer.c | 165 - .../TeamNexuiz/game/gamec/w_grenadelauncher.c | 112 - attic/TeamNexuiz/game/gamec/w_grenades.c | 841 - attic/TeamNexuiz/game/gamec/w_hagar.c | 122 - attic/TeamNexuiz/game/gamec/w_healgun.c | 111 - attic/TeamNexuiz/game/gamec/w_hook.c | 250 - attic/TeamNexuiz/game/gamec/w_hotbombs.c | 267 - attic/TeamNexuiz/game/gamec/w_incendiary_r.c | 174 - attic/TeamNexuiz/game/gamec/w_laser.c | 112 - attic/TeamNexuiz/game/gamec/w_namek.c | 138 - attic/TeamNexuiz/game/gamec/w_nex.c | 103 - .../TeamNexuiz/game/gamec/w_rocketlauncher.c | 157 - attic/TeamNexuiz/game/gamec/w_setrope.c | 84 - attic/TeamNexuiz/game/gamec/w_shotgun.c | 127 - attic/TeamNexuiz/game/gamec/w_uzi.c | 106 - attic/TeamNexuiz/game/progs.dat | Bin 442038 -> 0 bytes attic/TeamNexuiz/game/progs.lno | Bin 125224 -> 0 bytes attic/TeamNexuiz/game/progs.src | 105 - attic/TeamNexuiz/game/qcc2.exe | Bin 184320 -> 0 bytes attic/TeamNexuiz/menu/constants.menu | 94 - attic/TeamNexuiz/menu/creategame.menu | 63 - attic/TeamNexuiz/menu/credits.menu | 85 - attic/TeamNexuiz/menu/data.menu | 25 - attic/TeamNexuiz/menu/ingame.menu | 4 - attic/TeamNexuiz/menu/joingame.menu | 200 - attic/TeamNexuiz/menu/main.menu | 57 - attic/TeamNexuiz/menu/menu | 18 - attic/TeamNexuiz/menu/messagebox.menu | 82 - attic/TeamNexuiz/menu/normal.menu | 85 - attic/TeamNexuiz/menu/options.menu | 75 - attic/TeamNexuiz/menu/qcc.exe | Bin 208896 -> 0 bytes attic/TeamNexuiz/menu/quit.menu | 76 - attic/TeamNexuiz/menu/teamselect.menu | 72 - attic/TeamNexuiz/menu/templates.menu | 256 - attic/TeamNexuiz/menu/test.menu | 21 - attic/TeamNexuiz/menuqc/dotmenu.txt | 51 - attic/TeamNexuiz/menuqc/fteqccgui.exe | Bin 233472 -> 0 bytes attic/TeamNexuiz/menuqc/mbuiltin.qc | 250 - attic/TeamNexuiz/menuqc/menu.qc | 151 - attic/TeamNexuiz/menuqc/menu.qh | 35 - attic/TeamNexuiz/menuqc/menu1.qc | 151 - attic/TeamNexuiz/menuqc/msys.qc | 278 - attic/TeamNexuiz/menuqc/progdefs.h | 13 - attic/TeamNexuiz/menuqc/progs.src | 180 - attic/TeamNexuiz/menuqc/qc.asm | 17163 ------ attic/TeamNexuiz/menuqc/qcc.bat | 2 - attic/TeamNexuiz/menuqc/qcc.exe | Bin 208896 -> 0 bytes attic/TeamNexuiz/menuqc/teamselect.menu | 72 - attic/TeamNexuiz/menuqc/todo | 75 - attic/armour1skin.jpg | Bin 12401 -> 0 bytes attic/armour1skin_glow.jpg | Bin 1523 -> 0 bytes attic/armour25skin.jpg | Bin 43405 -> 0 bytes attic/armour25skin_bump.jpg | Bin 15427 -> 0 bytes attic/env/sav-graysky1/sav-graysky1_bk.jpg | Bin 1847 -> 0 bytes attic/env/sav-graysky1/sav-graysky1_dn.jpg | Bin 1847 -> 0 bytes attic/env/sav-graysky1/sav-graysky1_ft.jpg | Bin 1847 -> 0 bytes attic/env/sav-graysky1/sav-graysky1_lf.jpg | Bin 1847 -> 0 bytes attic/env/sav-graysky1/sav-graysky1_rt.jpg | Bin 1847 -> 0 bytes attic/env/sav-graysky1/sav-graysky1_up.jpg | Bin 1847 -> 0 bytes attic/env/sav-graysky1/sav-greysky1_bk.jpg | Bin 1847 -> 0 bytes attic/env/sav-graysky1/sav-greysky1_dn.jpg | Bin 1847 -> 0 bytes attic/env/sav-graysky1/sav-greysky1_ft.jpg | Bin 1847 -> 0 bytes attic/env/sav-graysky1/sav-greysky1_lf.jpg | Bin 1847 -> 0 bytes attic/env/sav-graysky1/sav-greysky1_rt.jpg | Bin 1847 -> 0 bytes attic/env/sav-graysky1/sav-greysky1_up.jpg | Bin 1847 -> 0 bytes attic/gfx/loading-15.tga | Bin 1048594 -> 0 bytes attic/gfx/loading.tga | Bin 199370 -> 0 bytes attic/gfx/m_apply.tga | Bin 15400 -> 0 bytes attic/gfx/m_background.tga | Bin 525349 -> 0 bytes attic/gfx/m_start.tga | Bin 21474 -> 0 bytes attic/gfx/m_strength.tga | Bin 185417 -> 0 bytes attic/gfx/m_top_creategame.tga | Bin 49487 -> 0 bytes attic/gfx/m_top_credits.tga | Bin 29803 -> 0 bytes attic/gfx/m_top_joingame.tga | Bin 76544 -> 0 bytes attic/gfx/m_top_options.tga | Bin 36370 -> 0 bytes attic/gfx/m_top_quit.tga | Bin 37560 -> 0 bytes attic/gfx/m_top_sel_creategame.tga | Bin 42964 -> 0 bytes attic/gfx/m_top_sel_joingame.tga | Bin 39484 -> 0 bytes attic/gfx/m_top_sel_options.tga | Bin 26260 -> 0 bytes attic/gfx/m_top_sel_quit.tga | Bin 15588 -> 0 bytes attic/gfx/m_top_sel_singleplayer.tga | Bin 42964 -> 0 bytes attic/gfx/m_top_sel_video.tga | Bin 19532 -> 0 bytes attic/gfx/table1.tga | Bin 263205 -> 0 bytes attic/gfx/table2.tga | Bin 68812 -> 0 bytes attic/gfx/table3.tga | Bin 145486 -> 0 bytes attic/health1skin.jpg | Bin 9032 -> 0 bytes attic/health1skin_bump.jpg | Bin 3606 -> 0 bytes attic/health1skin_glow.jpg | Bin 2888 -> 0 bytes attic/health25skin.jpg | Bin 12440 -> 0 bytes attic/health25skin_bump.jpg | Bin 16768 -> 0 bytes attic/health25skin_gloss.tga | Bin 196652 -> 0 bytes attic/health25skin_glow.jpg | Bin 2145 -> 0 bytes attic/maps/arena_dismal.mapcfg | 4 - attic/maps/arena_dismal.txt | 16 - attic/maps/arena_dsi.mapcfg | 4 - attic/maps/arena_dsi.txt | 15 - attic/maps/arena_nexdm08.mapcfg | 4 - attic/maps/arena_nexdm08.txt | 15 - attic/maps/arena_nexdm15.mapcfg | 4 - attic/maps/arena_nexdm15.txt | 20 - attic/maps/arena_nexdm17.mapcfg | 4 - attic/maps/arena_nexdm17.txt | 17 - attic/maps/arena_slimepit.mapcfg | 4 - attic/maps/compile.sh | 69 - attic/maps/ctf_tznex01.mapcfg | 4 - attic/maps/ctf_tznex01.txt | 15 - attic/maps/dm_dismal.mapcfg | 3 - attic/maps/dm_dismal.txt | 16 - attic/maps/dm_dsi.mapcfg | 3 - attic/maps/dm_dsi.txt | 15 - attic/maps/dm_nexdm08.mapcfg | 3 - attic/maps/dm_nexdm08.txt | 15 - attic/maps/dm_nexdm11.mapcfg | 3 - attic/maps/dm_nexdm11.txt | 16 - attic/maps/dm_nexdm15.mapcfg | 3 - attic/maps/dm_nexdm15.txt | 20 - attic/maps/dm_nexdm17.mapcfg | 3 - attic/maps/dm_nexdm17.txt | 17 - attic/maps/dm_nexdmctf02.mapcfg | 3 - attic/maps/dm_nexdmctf02.txt | 17 - attic/maps/dm_slimepit.mapcfg | 3 - attic/maps/dom_dismal.mapcfg | 4 - attic/maps/dom_dismal.txt | 16 - attic/maps/dom_dsi.mapcfg | 4 - attic/maps/dom_dsi.txt | 17 - attic/maps/dom_nexctf02.mapcfg | 4 - attic/maps/dom_nexctf02.txt | 17 - attic/maps/dom_nexdm08.mapcfg | 4 - attic/maps/dom_nexdm08.txt | 17 - attic/maps/dom_nexdm11.mapcfg | 4 - attic/maps/dom_nexdm11.txt | 18 - attic/maps/dom_nexdm15.mapcfg | 4 - attic/maps/dom_nexdm15.txt | 22 - attic/maps/dom_nexdm17.mapcfg | 4 - attic/maps/dom_nexdm17.txt | 19 - attic/maps/dom_slimepit.mapcfg | 4 - attic/maps/dsi.bsp | Bin 3948648 -> 0 bytes attic/maps/dsi.bsp.nnl | 843 - attic/maps/dsi.cfg | 1 - attic/maps/dsi.ent | 358 - attic/maps/dsi.instantaction | 10 - attic/maps/dsi.jpg | Bin 22014 -> 0 bytes attic/maps/dsi.rtlights | 10 - attic/maps/dsi.waypoints | 159 - attic/maps/lms_dismal.mapcfg | 4 - attic/maps/lms_dismal.txt | 11 - attic/maps/lms_dsi.mapcfg | 4 - attic/maps/lms_dsi.txt | 11 - attic/maps/lms_nexdm08.mapcfg | 4 - attic/maps/lms_nexdm08.txt | 15 - attic/maps/lms_nexdm11.mapcfg | 4 - attic/maps/lms_nexdm11.txt | 16 - attic/maps/lms_slimepit.mapcfg | 4 - attic/maps/nexdm01.txt | 16 - attic/maps/nexdm02.txt | 19 - attic/maps/nexdm03.txt | 17 - attic/maps/nexdm04.txt | 18 - attic/maps/nexdm05.txt | 17 - attic/maps/nexdm07.txt | 15 - attic/maps/nexdm08.bsp | Bin 4452312 -> 0 bytes attic/maps/nexdm08.cfg | 1 - attic/maps/nexdm08.ent | 231 - attic/maps/nexdm08.jpg | Bin 25242 -> 0 bytes attic/maps/nexdm08.map | 8482 --- attic/maps/nexdm08.rtlights | 3 - attic/maps/nexdm08.txt | 15 - attic/maps/nexdm08.waypoints | 165 - attic/maps/nexdm09.txt | 18 - attic/maps/nexdm10.txt | 19 - attic/maps/nexdm11.bsp | Bin 3672184 -> 0 bytes attic/maps/nexdm11.cfg | 1 - attic/maps/nexdm11.ent | 388 - attic/maps/nexdm11.jpg | Bin 28545 -> 0 bytes attic/maps/nexdm11.map | 20022 ------- attic/maps/nexdm11.rtlights | 5 - attic/maps/nexdm11.txt | 17 - attic/maps/nexdm12.txt | 15 - attic/maps/nexdm13.txt | 15 - attic/maps/nexdm14.txt | 14 - attic/maps/nexdm15.bsp | Bin 8069516 -> 0 bytes attic/maps/nexdm15.cfg | 1 - attic/maps/nexdm15.ent | 720 - attic/maps/nexdm15.jpg | Bin 26272 -> 0 bytes attic/maps/nexdm15.map | 23625 -------- attic/maps/nexdm15.txt | 20 - attic/maps/nexdm15.waypoints | 195 - attic/maps/nexdm151.ent | 660 - attic/maps/nexdm16.txt | 17 - attic/maps/nexdm17.bsp | Bin 5850284 -> 0 bytes attic/maps/nexdm17.cfg | 1 - attic/maps/nexdm17.ent | 1452 - attic/maps/nexdm17.jpg | Bin 30075 -> 0 bytes attic/maps/nexdm17.map | 48097 ---------------- attic/maps/nexdm17.rtlights | 3 - attic/maps/nexdm17.txt | 20 - attic/maps/nexdm17.waypoints | 381 - attic/maps/nexdmextra1.txt | 15 - attic/maps/rune_dismal.mapcfg | 4 - attic/maps/rune_dismal.txt | 16 - attic/maps/rune_dsi.mapcfg | 4 - attic/maps/rune_dsi.txt | 15 - attic/maps/rune_nexctf02.mapcfg | 4 - attic/maps/rune_nexctf02.txt | 17 - attic/maps/rune_nexdm08.mapcfg | 4 - attic/maps/rune_nexdm08.txt | 15 - attic/maps/rune_nexdm11.mapcfg | 4 - attic/maps/rune_nexdm11.txt | 16 - attic/maps/rune_nexdm15.mapcfg | 4 - attic/maps/rune_nexdm15.txt | 20 - attic/maps/rune_nexdm17.mapcfg | 4 - attic/maps/rune_nexdm17.txt | 17 - attic/maps/rune_slimepit.mapcfg | 4 - attic/maps/tdm_dismal.mapcfg | 4 - attic/maps/tdm_dismal.txt | 16 - attic/maps/tdm_dsi.mapcfg | 4 - attic/maps/tdm_dsi.txt | 15 - attic/maps/tdm_nexctf02.mapcfg | 5 - attic/maps/tdm_nexctf02.txt | 17 - attic/maps/tdm_nexdm08.mapcfg | 4 - attic/maps/tdm_nexdm08.txt | 15 - attic/maps/tdm_nexdm11.mapcfg | 4 - attic/maps/tdm_nexdm11.txt | 16 - attic/maps/tdm_nexdm15.mapcfg | 4 - attic/maps/tdm_nexdm15.txt | 20 - attic/maps/tdm_nexdm17.mapcfg | 4 - attic/maps/tdm_nexdm17.txt | 17 - attic/maps/tdm_slimepit.mapcfg | 4 - attic/maps/tdm_tznex01.mapcfg | 4 - attic/maps/tdm_tznex01.txt | 15 - attic/maps/tznex01.bsp | Bin 1584544 -> 0 bytes attic/maps/tznex01.ent | 253 - attic/maps/tznex01.jpg | Bin 36556 -> 0 bytes attic/maps/tznex01.map | 8631 --- attic/maps/tznex01.rtlights | 28 - attic/maps/tznex01.txt | 19 - attic/maps/tznex01.waypoints | 99 - attic/maps/unused/ctf_kaznexctf1.mapcfg | 5 - attic/maps/unused/ctf_kaznexctf1.txt | 14 - attic/maps/unused/dom_kaznexctf1.mapcfg | 5 - attic/maps/unused/dom_kaznexctf1.txt | 14 - attic/maps/unused/dom_kaznexdom1.mapcfg | 5 - attic/maps/unused/dom_kaznexdom1.txt | 14 - attic/maps/unused/kaznexctf1.ent | 201 - attic/medi100.jpg | Bin 33121 -> 0 bytes attic/medi100_bump.jpg | Bin 12099 -> 0 bytes attic/medi100_glow.jpg | Bin 18615 -> 0 bytes attic/models/newprojectiles3.blend | Bin 176660 -> 0 bytes attic/models/newprojectiles4.blend | Bin 176660 -> 0 bytes attic/models/player/anarchist.jpg | Bin 29426 -> 0 bytes attic/models/player/anarchist.txt | 10 - attic/models/player/crash.jpg | Bin 31019 -> 0 bytes attic/models/player/crash.txt | 10 - attic/models/player/crash.zym_1.skin | 1 - attic/models/player/crash.zym_2.skin | 1 - attic/models/player/elite.jpg | Bin 28491 -> 0 bytes attic/models/player/elite.txt | 10 - .../models/player/insurrectionist.zym_1.skin | 1 - attic/models/player/jeandarc.jpg | Bin 31872 -> 0 bytes attic/models/player/jeandarc.txt | 10 - attic/models/player/jeandarc.zym_1.skin | 1 - attic/models/player/lycanthrope.zym_1.skin | 1 - attic/models/player/marine.zym_1.skin | 1 - attic/models/player/mechanical.jpg | Bin 16863 -> 0 bytes attic/models/player/mechanical.txt | 9 - attic/models/player/mulder.jpg | Bin 17877 -> 0 bytes attic/models/player/mulder.txt | 9 - attic/models/player/nexus.zym_1.skin | 1 - attic/models/player/private.jpg | Bin 22061 -> 0 bytes attic/models/player/private.txt | 10 - attic/models/player/pyria.zym_1.skin | 1 - attic/models/player/rebel.jpg | Bin 15042 -> 0 bytes attic/models/player/rebel.txt | 10 - attic/models/player/shock.zym_1.skin | 1 - attic/models/player/skadi.zym_1.skin | 1 - attic/models/player/soldier.jpg | Bin 12807 -> 0 bytes attic/models/player/soldier.txt | 10 - attic/models/player/visitant.jpg | Bin 13302 -> 0 bytes attic/models/player/visitant.txt | 10 - attic/models/player/visitant.zym_1.skin | 1 - attic/models/player/wolf.jpg | Bin 15035 -> 0 bytes attic/models/player/wolf.txt | 10 - attic/models/sprites/bubbles.spr | Bin 588 -> 0 bytes attic/models/sprites/electrocombo.spr32 | Bin 7864956 -> 0 bytes attic/models/sprites/grenadeexplosion.spr32 | Bin 1311156 -> 0 bytes attic/models/sprites/grenexpl.spr | Bin 1052 -> 0 bytes attic/models/sprites/grenexpl.spr_0.tga | Bin 262683 -> 0 bytes attic/models/sprites/grenexpl.spr_1.tga | Bin 262683 -> 0 bytes attic/models/sprites/grenexpl.spr_10.tga | Bin 262683 -> 0 bytes attic/models/sprites/grenexpl.spr_11.tga | Bin 262683 -> 0 bytes attic/models/sprites/grenexpl.spr_12.tga | Bin 262683 -> 0 bytes attic/models/sprites/grenexpl.spr_2.tga | Bin 262683 -> 0 bytes attic/models/sprites/grenexpl.spr_3.tga | Bin 262683 -> 0 bytes attic/models/sprites/grenexpl.spr_4.tga | Bin 262683 -> 0 bytes attic/models/sprites/grenexpl.spr_5.tga | Bin 262683 -> 0 bytes attic/models/sprites/grenexpl.spr_6.tga | Bin 262683 -> 0 bytes attic/models/sprites/grenexpl.spr_7.tga | Bin 262683 -> 0 bytes attic/models/sprites/grenexpl.spr_8.tga | Bin 262683 -> 0 bytes attic/models/sprites/grenexpl.spr_9.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr | Bin 1052 -> 0 bytes attic/models/sprites/hagar.spr_0.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr_1.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr_10.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr_11.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr_12.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr_2.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr_3.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr_4.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr_5.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr_6.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr_7.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr_8.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagar.spr_9.tga | Bin 262683 -> 0 bytes attic/models/sprites/hagarexplosion.spr32 | Bin 2050896 -> 0 bytes attic/models/sprites/muzzleflash.spr32 | Bin 1236 -> 0 bytes attic/models/sprites/rocketexplosion.spr32 | Bin 7987756 -> 0 bytes attic/models/sprites/rockexpl.spr | Bin 1052 -> 0 bytes attic/models/sprites/rockexpl.spr_0.tga | Bin 28768 -> 0 bytes attic/models/sprites/rockexpl.spr_1.tga | Bin 33257 -> 0 bytes attic/models/sprites/rockexpl.spr_10.tga | Bin 138743 -> 0 bytes attic/models/sprites/rockexpl.spr_11.tga | Bin 132199 -> 0 bytes attic/models/sprites/rockexpl.spr_12.tga | Bin 124946 -> 0 bytes attic/models/sprites/rockexpl.spr_2.tga | Bin 46585 -> 0 bytes attic/models/sprites/rockexpl.spr_3.tga | Bin 52319 -> 0 bytes attic/models/sprites/rockexpl.spr_4.tga | Bin 67428 -> 0 bytes attic/models/sprites/rockexpl.spr_5.tga | Bin 73266 -> 0 bytes attic/models/sprites/rockexpl.spr_6.tga | Bin 85305 -> 0 bytes attic/models/sprites/rockexpl.spr_7.tga | Bin 96570 -> 0 bytes attic/models/sprites/rockexpl.spr_8.tga | Bin 114438 -> 0 bytes attic/models/sprites/rockexpl.spr_9.tga | Bin 126605 -> 0 bytes attic/models/sprites/s_explod.spr | Bin 393372 -> 0 bytes attic/models/sprites/s_hexpl.spr | Bin 4212 -> 0 bytes attic/models/sprites/spark.spr | Bin 1140 -> 0 bytes attic/navnodeedit/NavNodeEdit_readme.txt | 163 - attic/navnodeedit/autoexec.cfg | 1 - attic/navnodeedit/config.cfg | 84 - attic/navnodeedit/content.pk3 | Bin 1493175 -> 0 bytes attic/navnodeedit/data/nexdm01.bsp.nnl | 297 - attic/navnodeedit/data/nexdm07.bsp.nnl | 843 - attic/navnodeedit/data/nexdmextra1.bsp.nnl | 661 - attic/navnodeedit/navnodeedit.cfg | 90 - attic/navnodeedit/progs.dat | Bin 137914 -> 0 bytes attic/navnodeedit/quake.rc | 18 - attic/navnodeedit/src/client.qc | 1123 - attic/navnodeedit/src/defs.qc | 450 - attic/navnodeedit/src/dpextensions.qc | 1199 - attic/navnodeedit/src/junk.qc | 197 - attic/navnodeedit/src/linkjunk.qc | 1009 - attic/navnodeedit/src/main.qc | 33 - attic/navnodeedit/src/menu.qc | 452 - attic/navnodeedit/src/progs.src | 11 - attic/navnodeedit/src/shit.qc | 417 - attic/navnodeedit/src/wsystem.qc | 1786 - attic/readme.txt | 1 - attic/textures/anarchist.tga | Bin 786450 -> 0 bytes attic/textures/anarchist_glow.tga | Bin 78293 -> 0 bytes attic/textures/carni_bump.tga | Bin 786476 -> 0 bytes attic/textures/carni_gloss.tga | Bin 786476 -> 0 bytes attic/textures/carni_norm.tga | Bin 786476 -> 0 bytes attic/textures/crash.tga | Bin 786450 -> 0 bytes attic/textures/crash_bump.tga | Bin 536730 -> 0 bytes attic/textures/crash_glow.tga | Bin 39040 -> 0 bytes attic/textures/elite.tga | Bin 758508 -> 0 bytes attic/textures/evil1_metals/rmetal2c_bump.jpg | Bin 37082 -> 0 bytes .../textures/evil1_metals/rmetal2c_gloss.jpg | Bin 31460 -> 0 bytes attic/textures/evil1_metals/rmetal2d_bump.jpg | Bin 37042 -> 0 bytes .../textures/evil1_metals/rmetal2d_gloss.jpg | Bin 44392 -> 0 bytes attic/textures/evil1_metals/rmetal2e_bump.jpg | Bin 51731 -> 0 bytes .../textures/evil1_metals/rmetal2e_gloss.jpg | Bin 60861 -> 0 bytes attic/textures/hazardgl.jpg | Bin 172887 -> 0 bytes attic/textures/jeandarc.tga | Bin 602875 -> 0 bytes attic/textures/jeandarc_glow.tga | Bin 113301 -> 0 bytes attic/textures/mechanical.tga | Bin 1048594 -> 0 bytes attic/textures/mulder.tga | Bin 786450 -> 0 bytes attic/textures/mulder_glow.tga | Bin 109474 -> 0 bytes attic/textures/nexskin.tga | Bin 786476 -> 0 bytes attic/textures/nexskin_bump.tga | Bin 786476 -> 0 bytes attic/textures/nexskin_gloss.tga | Bin 786476 -> 0 bytes attic/textures/nexskin_glow.tga | Bin 786476 -> 0 bytes attic/textures/nexskin_pants.tga | Bin 786476 -> 0 bytes attic/textures/nexskin_shirt.tga | Bin 786476 -> 0 bytes attic/textures/private.jpg | Bin 47807 -> 0 bytes attic/textures/private_glow.jpg | Bin 6673 -> 0 bytes attic/textures/rebel.tga | Bin 786971 -> 0 bytes attic/textures/rebel_glow.tga | Bin 205965 -> 0 bytes attic/textures/soldier.tga | Bin 786476 -> 0 bytes attic/textures/soldier_glow.tga | Bin 26025 -> 0 bytes attic/textures/visitant.tga | Bin 786450 -> 0 bytes attic/textures/visitant_bump.tga | Bin 559524 -> 0 bytes attic/textures/visitant_glow.tga | Bin 147275 -> 0 bytes attic/textures/wolf.tga | Bin 580619 -> 0 bytes attic/textures/wolf_glow.tga | Bin 50442 -> 0 bytes data/menu/creategame.menu | 4 +- data/menu/data.menu | 4 +- data/menu/normal.menu | 30 +- data/menu/templates.menu | 4 + 488 files changed, 29 insertions(+), 188308 deletions(-) delete mode 100644 attic/TeamNexuiz/default.cfg delete mode 100644 attic/TeamNexuiz/game/Nexuiz.dsp delete mode 100644 attic/TeamNexuiz/game/Nexuiz.dsw delete mode 100644 attic/TeamNexuiz/game/Nexuiz.ncb delete mode 100644 attic/TeamNexuiz/game/Nexuiz.opt delete mode 100644 attic/TeamNexuiz/game/fteqccgui.exe delete mode 100644 attic/TeamNexuiz/game/gamec/GameC.dsp delete mode 100644 attic/TeamNexuiz/game/gamec/GameC.dsw delete mode 100644 attic/TeamNexuiz/game/gamec/GameC.ncb delete mode 100644 attic/TeamNexuiz/game/gamec/GameC.opt delete mode 100644 attic/TeamNexuiz/game/gamec/GameC.plg delete mode 100644 attic/TeamNexuiz/game/gamec/Makefile delete mode 100644 attic/TeamNexuiz/game/gamec/bot.c delete mode 100644 attic/TeamNexuiz/game/gamec/bot_ai.c delete mode 100644 attic/TeamNexuiz/game/gamec/bot_ed.c delete mode 100644 attic/TeamNexuiz/game/gamec/bot_fight.c delete mode 100644 attic/TeamNexuiz/game/gamec/bot_maps.c delete mode 100644 attic/TeamNexuiz/game/gamec/bot_misc.c delete mode 100644 attic/TeamNexuiz/game/gamec/bot_move.c delete mode 100644 attic/TeamNexuiz/game/gamec/bot_phys.c delete mode 100644 attic/TeamNexuiz/game/gamec/bot_way.c delete mode 100644 attic/TeamNexuiz/game/gamec/builtins.h delete mode 100644 attic/TeamNexuiz/game/gamec/civilian.c delete mode 100644 attic/TeamNexuiz/game/gamec/cl_client.c delete mode 100644 attic/TeamNexuiz/game/gamec/cl_impulse.c delete mode 100644 attic/TeamNexuiz/game/gamec/cl_physics.c delete mode 100644 attic/TeamNexuiz/game/gamec/cl_physics.c_bh delete mode 100644 attic/TeamNexuiz/game/gamec/cl_player.c delete mode 100644 attic/TeamNexuiz/game/gamec/cl_weaponanimations.c delete mode 100644 attic/TeamNexuiz/game/gamec/cl_weapons.c delete mode 100644 attic/TeamNexuiz/game/gamec/cl_weaponsystem.c delete mode 100644 attic/TeamNexuiz/game/gamec/class.c delete mode 100644 attic/TeamNexuiz/game/gamec/constants.h delete mode 100644 attic/TeamNexuiz/game/gamec/ctf.c delete mode 100644 attic/TeamNexuiz/game/gamec/defs.h delete mode 100644 attic/TeamNexuiz/game/gamec/domination.c delete mode 100644 attic/TeamNexuiz/game/gamec/engineer.c delete mode 100644 attic/TeamNexuiz/game/gamec/extensions.h delete mode 100644 attic/TeamNexuiz/game/gamec/g_casings.c delete mode 100644 attic/TeamNexuiz/game/gamec/g_damage.c delete mode 100644 attic/TeamNexuiz/game/gamec/g_decors.c delete mode 100644 attic/TeamNexuiz/game/gamec/g_lights.c delete mode 100644 attic/TeamNexuiz/game/gamec/g_subs.c delete mode 100644 attic/TeamNexuiz/game/gamec/g_tetris.c delete mode 100644 attic/TeamNexuiz/game/gamec/g_triggers.c delete mode 100644 attic/TeamNexuiz/game/gamec/g_violence.c delete mode 100644 attic/TeamNexuiz/game/gamec/g_world.c delete mode 100644 attic/TeamNexuiz/game/gamec/mauvebot.c delete mode 100644 attic/TeamNexuiz/game/gamec/medic.c delete mode 100644 attic/TeamNexuiz/game/gamec/pyro.c delete mode 100644 attic/TeamNexuiz/game/gamec/scout.c delete mode 100644 attic/TeamNexuiz/game/gamec/soldier.c delete mode 100644 attic/TeamNexuiz/game/gamec/spy.c delete mode 100644 attic/TeamNexuiz/game/gamec/sv_main.c delete mode 100644 attic/TeamNexuiz/game/gamec/sv_stats.c delete mode 100644 attic/TeamNexuiz/game/gamec/sys.h delete mode 100644 attic/TeamNexuiz/game/gamec/t_fort.c delete mode 100644 attic/TeamNexuiz/game/gamec/t_halflife.c delete mode 100644 attic/TeamNexuiz/game/gamec/t_items.c delete mode 100644 attic/TeamNexuiz/game/gamec/t_jumppads.c delete mode 100644 attic/TeamNexuiz/game/gamec/t_plats.c delete mode 100644 attic/TeamNexuiz/game/gamec/t_quake.c delete mode 100644 attic/TeamNexuiz/game/gamec/t_quake3.c delete mode 100644 attic/TeamNexuiz/game/gamec/t_teleporters.c delete mode 100644 attic/TeamNexuiz/game/gamec/tf_ball.c delete mode 100644 attic/TeamNexuiz/game/gamec/tf_constants.c delete mode 100644 attic/TeamNexuiz/game/gamec/tf_w_mac10.c delete mode 100644 attic/TeamNexuiz/game/gamec/tf_w_pistol.c delete mode 100644 attic/TeamNexuiz/game/gamec/tf_w_proxi.c delete mode 100644 attic/TeamNexuiz/game/gamec/tf_w_railgun.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfai.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfbuttons.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfclient.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfcombat.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfdefs.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfdoors.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfextractor.c delete mode 100644 attic/TeamNexuiz/game/gamec/tffunctions.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfgrenades.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfhud.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfitems.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfmapitems.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfmenus.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfplats.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfq3fitems.c delete mode 100644 attic/TeamNexuiz/game/gamec/tfsentry.c delete mode 100644 attic/TeamNexuiz/game/gamec/tftesla.c delete mode 100644 attic/TeamNexuiz/game/gamec/tn_clientcommands.c delete mode 100644 attic/TeamNexuiz/game/gamec/tn_misc.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_bombletts.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_common.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_crylink.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_electro.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_flamer.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_grenadelauncher.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_grenades.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_hagar.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_healgun.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_hook.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_hotbombs.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_incendiary_r.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_laser.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_namek.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_nex.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_rocketlauncher.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_setrope.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_shotgun.c delete mode 100644 attic/TeamNexuiz/game/gamec/w_uzi.c delete mode 100644 attic/TeamNexuiz/game/progs.dat delete mode 100644 attic/TeamNexuiz/game/progs.lno delete mode 100644 attic/TeamNexuiz/game/progs.src delete mode 100644 attic/TeamNexuiz/game/qcc2.exe delete mode 100644 attic/TeamNexuiz/menu/constants.menu delete mode 100644 attic/TeamNexuiz/menu/creategame.menu delete mode 100644 attic/TeamNexuiz/menu/credits.menu delete mode 100644 attic/TeamNexuiz/menu/data.menu delete mode 100644 attic/TeamNexuiz/menu/ingame.menu delete mode 100644 attic/TeamNexuiz/menu/joingame.menu delete mode 100644 attic/TeamNexuiz/menu/main.menu delete mode 100644 attic/TeamNexuiz/menu/menu delete mode 100644 attic/TeamNexuiz/menu/messagebox.menu delete mode 100644 attic/TeamNexuiz/menu/normal.menu delete mode 100644 attic/TeamNexuiz/menu/options.menu delete mode 100644 attic/TeamNexuiz/menu/qcc.exe delete mode 100644 attic/TeamNexuiz/menu/quit.menu delete mode 100644 attic/TeamNexuiz/menu/teamselect.menu delete mode 100644 attic/TeamNexuiz/menu/templates.menu delete mode 100644 attic/TeamNexuiz/menu/test.menu delete mode 100644 attic/TeamNexuiz/menuqc/dotmenu.txt delete mode 100644 attic/TeamNexuiz/menuqc/fteqccgui.exe delete mode 100644 attic/TeamNexuiz/menuqc/mbuiltin.qc delete mode 100644 attic/TeamNexuiz/menuqc/menu.qc delete mode 100644 attic/TeamNexuiz/menuqc/menu.qh delete mode 100644 attic/TeamNexuiz/menuqc/menu1.qc delete mode 100644 attic/TeamNexuiz/menuqc/msys.qc delete mode 100644 attic/TeamNexuiz/menuqc/progdefs.h delete mode 100644 attic/TeamNexuiz/menuqc/progs.src delete mode 100644 attic/TeamNexuiz/menuqc/qc.asm delete mode 100644 attic/TeamNexuiz/menuqc/qcc.bat delete mode 100644 attic/TeamNexuiz/menuqc/qcc.exe delete mode 100644 attic/TeamNexuiz/menuqc/teamselect.menu delete mode 100644 attic/TeamNexuiz/menuqc/todo delete mode 100644 attic/armour1skin.jpg delete mode 100644 attic/armour1skin_glow.jpg delete mode 100644 attic/armour25skin.jpg delete mode 100644 attic/armour25skin_bump.jpg delete mode 100644 attic/env/sav-graysky1/sav-graysky1_bk.jpg delete mode 100644 attic/env/sav-graysky1/sav-graysky1_dn.jpg delete mode 100644 attic/env/sav-graysky1/sav-graysky1_ft.jpg delete mode 100644 attic/env/sav-graysky1/sav-graysky1_lf.jpg delete mode 100644 attic/env/sav-graysky1/sav-graysky1_rt.jpg delete mode 100644 attic/env/sav-graysky1/sav-graysky1_up.jpg delete mode 100644 attic/env/sav-graysky1/sav-greysky1_bk.jpg delete mode 100644 attic/env/sav-graysky1/sav-greysky1_dn.jpg delete mode 100644 attic/env/sav-graysky1/sav-greysky1_ft.jpg delete mode 100644 attic/env/sav-graysky1/sav-greysky1_lf.jpg delete mode 100644 attic/env/sav-graysky1/sav-greysky1_rt.jpg delete mode 100644 attic/env/sav-graysky1/sav-greysky1_up.jpg delete mode 100644 attic/gfx/loading-15.tga delete mode 100644 attic/gfx/loading.tga delete mode 100644 attic/gfx/m_apply.tga delete mode 100644 attic/gfx/m_background.tga delete mode 100644 attic/gfx/m_start.tga delete mode 100644 attic/gfx/m_strength.tga delete mode 100644 attic/gfx/m_top_creategame.tga delete mode 100644 attic/gfx/m_top_credits.tga delete mode 100644 attic/gfx/m_top_joingame.tga delete mode 100644 attic/gfx/m_top_options.tga delete mode 100644 attic/gfx/m_top_quit.tga delete mode 100644 attic/gfx/m_top_sel_creategame.tga delete mode 100644 attic/gfx/m_top_sel_joingame.tga delete mode 100644 attic/gfx/m_top_sel_options.tga delete mode 100644 attic/gfx/m_top_sel_quit.tga delete mode 100644 attic/gfx/m_top_sel_singleplayer.tga delete mode 100644 attic/gfx/m_top_sel_video.tga delete mode 100644 attic/gfx/table1.tga delete mode 100644 attic/gfx/table2.tga delete mode 100644 attic/gfx/table3.tga delete mode 100644 attic/health1skin.jpg delete mode 100644 attic/health1skin_bump.jpg delete mode 100644 attic/health1skin_glow.jpg delete mode 100644 attic/health25skin.jpg delete mode 100644 attic/health25skin_bump.jpg delete mode 100644 attic/health25skin_gloss.tga delete mode 100644 attic/health25skin_glow.jpg delete mode 100644 attic/maps/arena_dismal.mapcfg delete mode 100644 attic/maps/arena_dismal.txt delete mode 100644 attic/maps/arena_dsi.mapcfg delete mode 100644 attic/maps/arena_dsi.txt delete mode 100644 attic/maps/arena_nexdm08.mapcfg delete mode 100644 attic/maps/arena_nexdm08.txt delete mode 100644 attic/maps/arena_nexdm15.mapcfg delete mode 100644 attic/maps/arena_nexdm15.txt delete mode 100644 attic/maps/arena_nexdm17.mapcfg delete mode 100644 attic/maps/arena_nexdm17.txt delete mode 100644 attic/maps/arena_slimepit.mapcfg delete mode 100644 attic/maps/compile.sh delete mode 100644 attic/maps/ctf_tznex01.mapcfg delete mode 100644 attic/maps/ctf_tznex01.txt delete mode 100644 attic/maps/dm_dismal.mapcfg delete mode 100644 attic/maps/dm_dismal.txt delete mode 100644 attic/maps/dm_dsi.mapcfg delete mode 100644 attic/maps/dm_dsi.txt delete mode 100644 attic/maps/dm_nexdm08.mapcfg delete mode 100644 attic/maps/dm_nexdm08.txt delete mode 100644 attic/maps/dm_nexdm11.mapcfg delete mode 100644 attic/maps/dm_nexdm11.txt delete mode 100644 attic/maps/dm_nexdm15.mapcfg delete mode 100644 attic/maps/dm_nexdm15.txt delete mode 100644 attic/maps/dm_nexdm17.mapcfg delete mode 100644 attic/maps/dm_nexdm17.txt delete mode 100644 attic/maps/dm_nexdmctf02.mapcfg delete mode 100644 attic/maps/dm_nexdmctf02.txt delete mode 100644 attic/maps/dm_slimepit.mapcfg delete mode 100644 attic/maps/dom_dismal.mapcfg delete mode 100644 attic/maps/dom_dismal.txt delete mode 100644 attic/maps/dom_dsi.mapcfg delete mode 100644 attic/maps/dom_dsi.txt delete mode 100644 attic/maps/dom_nexctf02.mapcfg delete mode 100644 attic/maps/dom_nexctf02.txt delete mode 100644 attic/maps/dom_nexdm08.mapcfg delete mode 100644 attic/maps/dom_nexdm08.txt delete mode 100644 attic/maps/dom_nexdm11.mapcfg delete mode 100644 attic/maps/dom_nexdm11.txt delete mode 100644 attic/maps/dom_nexdm15.mapcfg delete mode 100644 attic/maps/dom_nexdm15.txt delete mode 100644 attic/maps/dom_nexdm17.mapcfg delete mode 100644 attic/maps/dom_nexdm17.txt delete mode 100644 attic/maps/dom_slimepit.mapcfg delete mode 100644 attic/maps/dsi.bsp delete mode 100644 attic/maps/dsi.bsp.nnl delete mode 100644 attic/maps/dsi.cfg delete mode 100644 attic/maps/dsi.ent delete mode 100644 attic/maps/dsi.instantaction delete mode 100644 attic/maps/dsi.jpg delete mode 100644 attic/maps/dsi.rtlights delete mode 100644 attic/maps/dsi.waypoints delete mode 100644 attic/maps/lms_dismal.mapcfg delete mode 100644 attic/maps/lms_dismal.txt delete mode 100644 attic/maps/lms_dsi.mapcfg delete mode 100644 attic/maps/lms_dsi.txt delete mode 100644 attic/maps/lms_nexdm08.mapcfg delete mode 100644 attic/maps/lms_nexdm08.txt delete mode 100644 attic/maps/lms_nexdm11.mapcfg delete mode 100644 attic/maps/lms_nexdm11.txt delete mode 100644 attic/maps/lms_slimepit.mapcfg delete mode 100644 attic/maps/nexdm01.txt delete mode 100644 attic/maps/nexdm02.txt delete mode 100644 attic/maps/nexdm03.txt delete mode 100644 attic/maps/nexdm04.txt delete mode 100644 attic/maps/nexdm05.txt delete mode 100644 attic/maps/nexdm07.txt delete mode 100644 attic/maps/nexdm08.bsp delete mode 100644 attic/maps/nexdm08.cfg delete mode 100644 attic/maps/nexdm08.ent delete mode 100644 attic/maps/nexdm08.jpg delete mode 100644 attic/maps/nexdm08.map delete mode 100644 attic/maps/nexdm08.rtlights delete mode 100644 attic/maps/nexdm08.txt delete mode 100644 attic/maps/nexdm08.waypoints delete mode 100644 attic/maps/nexdm09.txt delete mode 100644 attic/maps/nexdm10.txt delete mode 100644 attic/maps/nexdm11.bsp delete mode 100644 attic/maps/nexdm11.cfg delete mode 100644 attic/maps/nexdm11.ent delete mode 100644 attic/maps/nexdm11.jpg delete mode 100644 attic/maps/nexdm11.map delete mode 100644 attic/maps/nexdm11.rtlights delete mode 100644 attic/maps/nexdm11.txt delete mode 100644 attic/maps/nexdm12.txt delete mode 100644 attic/maps/nexdm13.txt delete mode 100644 attic/maps/nexdm14.txt delete mode 100644 attic/maps/nexdm15.bsp delete mode 100644 attic/maps/nexdm15.cfg delete mode 100644 attic/maps/nexdm15.ent delete mode 100644 attic/maps/nexdm15.jpg delete mode 100644 attic/maps/nexdm15.map delete mode 100644 attic/maps/nexdm15.txt delete mode 100644 attic/maps/nexdm15.waypoints delete mode 100644 attic/maps/nexdm151.ent delete mode 100644 attic/maps/nexdm16.txt delete mode 100644 attic/maps/nexdm17.bsp delete mode 100644 attic/maps/nexdm17.cfg delete mode 100644 attic/maps/nexdm17.ent delete mode 100644 attic/maps/nexdm17.jpg delete mode 100644 attic/maps/nexdm17.map delete mode 100644 attic/maps/nexdm17.rtlights delete mode 100644 attic/maps/nexdm17.txt delete mode 100644 attic/maps/nexdm17.waypoints delete mode 100644 attic/maps/nexdmextra1.txt delete mode 100644 attic/maps/rune_dismal.mapcfg delete mode 100644 attic/maps/rune_dismal.txt delete mode 100644 attic/maps/rune_dsi.mapcfg delete mode 100644 attic/maps/rune_dsi.txt delete mode 100644 attic/maps/rune_nexctf02.mapcfg delete mode 100644 attic/maps/rune_nexctf02.txt delete mode 100644 attic/maps/rune_nexdm08.mapcfg delete mode 100644 attic/maps/rune_nexdm08.txt delete mode 100644 attic/maps/rune_nexdm11.mapcfg delete mode 100644 attic/maps/rune_nexdm11.txt delete mode 100644 attic/maps/rune_nexdm15.mapcfg delete mode 100644 attic/maps/rune_nexdm15.txt delete mode 100644 attic/maps/rune_nexdm17.mapcfg delete mode 100644 attic/maps/rune_nexdm17.txt delete mode 100644 attic/maps/rune_slimepit.mapcfg delete mode 100644 attic/maps/tdm_dismal.mapcfg delete mode 100644 attic/maps/tdm_dismal.txt delete mode 100644 attic/maps/tdm_dsi.mapcfg delete mode 100644 attic/maps/tdm_dsi.txt delete mode 100644 attic/maps/tdm_nexctf02.mapcfg delete mode 100644 attic/maps/tdm_nexctf02.txt delete mode 100644 attic/maps/tdm_nexdm08.mapcfg delete mode 100644 attic/maps/tdm_nexdm08.txt delete mode 100644 attic/maps/tdm_nexdm11.mapcfg delete mode 100644 attic/maps/tdm_nexdm11.txt delete mode 100644 attic/maps/tdm_nexdm15.mapcfg delete mode 100644 attic/maps/tdm_nexdm15.txt delete mode 100644 attic/maps/tdm_nexdm17.mapcfg delete mode 100644 attic/maps/tdm_nexdm17.txt delete mode 100644 attic/maps/tdm_slimepit.mapcfg delete mode 100644 attic/maps/tdm_tznex01.mapcfg delete mode 100644 attic/maps/tdm_tznex01.txt delete mode 100644 attic/maps/tznex01.bsp delete mode 100644 attic/maps/tznex01.ent delete mode 100644 attic/maps/tznex01.jpg delete mode 100644 attic/maps/tznex01.map delete mode 100644 attic/maps/tznex01.rtlights delete mode 100644 attic/maps/tznex01.txt delete mode 100644 attic/maps/tznex01.waypoints delete mode 100644 attic/maps/unused/ctf_kaznexctf1.mapcfg delete mode 100644 attic/maps/unused/ctf_kaznexctf1.txt delete mode 100644 attic/maps/unused/dom_kaznexctf1.mapcfg delete mode 100644 attic/maps/unused/dom_kaznexctf1.txt delete mode 100644 attic/maps/unused/dom_kaznexdom1.mapcfg delete mode 100644 attic/maps/unused/dom_kaznexdom1.txt delete mode 100644 attic/maps/unused/kaznexctf1.ent delete mode 100644 attic/medi100.jpg delete mode 100644 attic/medi100_bump.jpg delete mode 100644 attic/medi100_glow.jpg delete mode 100644 attic/models/newprojectiles3.blend delete mode 100644 attic/models/newprojectiles4.blend delete mode 100644 attic/models/player/anarchist.jpg delete mode 100644 attic/models/player/anarchist.txt delete mode 100644 attic/models/player/crash.jpg delete mode 100644 attic/models/player/crash.txt delete mode 100644 attic/models/player/crash.zym_1.skin delete mode 100644 attic/models/player/crash.zym_2.skin delete mode 100644 attic/models/player/elite.jpg delete mode 100644 attic/models/player/elite.txt delete mode 100644 attic/models/player/insurrectionist.zym_1.skin delete mode 100644 attic/models/player/jeandarc.jpg delete mode 100644 attic/models/player/jeandarc.txt delete mode 100644 attic/models/player/jeandarc.zym_1.skin delete mode 100644 attic/models/player/lycanthrope.zym_1.skin delete mode 100644 attic/models/player/marine.zym_1.skin delete mode 100644 attic/models/player/mechanical.jpg delete mode 100644 attic/models/player/mechanical.txt delete mode 100644 attic/models/player/mulder.jpg delete mode 100644 attic/models/player/mulder.txt delete mode 100644 attic/models/player/nexus.zym_1.skin delete mode 100644 attic/models/player/private.jpg delete mode 100644 attic/models/player/private.txt delete mode 100644 attic/models/player/pyria.zym_1.skin delete mode 100644 attic/models/player/rebel.jpg delete mode 100644 attic/models/player/rebel.txt delete mode 100644 attic/models/player/shock.zym_1.skin delete mode 100644 attic/models/player/skadi.zym_1.skin delete mode 100644 attic/models/player/soldier.jpg delete mode 100644 attic/models/player/soldier.txt delete mode 100644 attic/models/player/visitant.jpg delete mode 100644 attic/models/player/visitant.txt delete mode 100644 attic/models/player/visitant.zym_1.skin delete mode 100644 attic/models/player/wolf.jpg delete mode 100644 attic/models/player/wolf.txt delete mode 100644 attic/models/sprites/bubbles.spr delete mode 100644 attic/models/sprites/electrocombo.spr32 delete mode 100644 attic/models/sprites/grenadeexplosion.spr32 delete mode 100644 attic/models/sprites/grenexpl.spr delete mode 100644 attic/models/sprites/grenexpl.spr_0.tga delete mode 100644 attic/models/sprites/grenexpl.spr_1.tga delete mode 100644 attic/models/sprites/grenexpl.spr_10.tga delete mode 100644 attic/models/sprites/grenexpl.spr_11.tga delete mode 100644 attic/models/sprites/grenexpl.spr_12.tga delete mode 100644 attic/models/sprites/grenexpl.spr_2.tga delete mode 100644 attic/models/sprites/grenexpl.spr_3.tga delete mode 100644 attic/models/sprites/grenexpl.spr_4.tga delete mode 100644 attic/models/sprites/grenexpl.spr_5.tga delete mode 100644 attic/models/sprites/grenexpl.spr_6.tga delete mode 100644 attic/models/sprites/grenexpl.spr_7.tga delete mode 100644 attic/models/sprites/grenexpl.spr_8.tga delete mode 100644 attic/models/sprites/grenexpl.spr_9.tga delete mode 100644 attic/models/sprites/hagar.spr delete mode 100644 attic/models/sprites/hagar.spr_0.tga delete mode 100644 attic/models/sprites/hagar.spr_1.tga delete mode 100644 attic/models/sprites/hagar.spr_10.tga delete mode 100644 attic/models/sprites/hagar.spr_11.tga delete mode 100644 attic/models/sprites/hagar.spr_12.tga delete mode 100644 attic/models/sprites/hagar.spr_2.tga delete mode 100644 attic/models/sprites/hagar.spr_3.tga delete mode 100644 attic/models/sprites/hagar.spr_4.tga delete mode 100644 attic/models/sprites/hagar.spr_5.tga delete mode 100644 attic/models/sprites/hagar.spr_6.tga delete mode 100644 attic/models/sprites/hagar.spr_7.tga delete mode 100644 attic/models/sprites/hagar.spr_8.tga delete mode 100644 attic/models/sprites/hagar.spr_9.tga delete mode 100644 attic/models/sprites/hagarexplosion.spr32 delete mode 100644 attic/models/sprites/muzzleflash.spr32 delete mode 100644 attic/models/sprites/rocketexplosion.spr32 delete mode 100644 attic/models/sprites/rockexpl.spr delete mode 100644 attic/models/sprites/rockexpl.spr_0.tga delete mode 100644 attic/models/sprites/rockexpl.spr_1.tga delete mode 100644 attic/models/sprites/rockexpl.spr_10.tga delete mode 100644 attic/models/sprites/rockexpl.spr_11.tga delete mode 100644 attic/models/sprites/rockexpl.spr_12.tga delete mode 100644 attic/models/sprites/rockexpl.spr_2.tga delete mode 100644 attic/models/sprites/rockexpl.spr_3.tga delete mode 100644 attic/models/sprites/rockexpl.spr_4.tga delete mode 100644 attic/models/sprites/rockexpl.spr_5.tga delete mode 100644 attic/models/sprites/rockexpl.spr_6.tga delete mode 100644 attic/models/sprites/rockexpl.spr_7.tga delete mode 100644 attic/models/sprites/rockexpl.spr_8.tga delete mode 100644 attic/models/sprites/rockexpl.spr_9.tga delete mode 100644 attic/models/sprites/s_explod.spr delete mode 100644 attic/models/sprites/s_hexpl.spr delete mode 100644 attic/models/sprites/spark.spr delete mode 100644 attic/navnodeedit/NavNodeEdit_readme.txt delete mode 100644 attic/navnodeedit/autoexec.cfg delete mode 100644 attic/navnodeedit/config.cfg delete mode 100644 attic/navnodeedit/content.pk3 delete mode 100644 attic/navnodeedit/data/nexdm01.bsp.nnl delete mode 100644 attic/navnodeedit/data/nexdm07.bsp.nnl delete mode 100644 attic/navnodeedit/data/nexdmextra1.bsp.nnl delete mode 100644 attic/navnodeedit/navnodeedit.cfg delete mode 100644 attic/navnodeedit/progs.dat delete mode 100644 attic/navnodeedit/quake.rc delete mode 100644 attic/navnodeedit/src/client.qc delete mode 100644 attic/navnodeedit/src/defs.qc delete mode 100644 attic/navnodeedit/src/dpextensions.qc delete mode 100644 attic/navnodeedit/src/junk.qc delete mode 100644 attic/navnodeedit/src/linkjunk.qc delete mode 100644 attic/navnodeedit/src/main.qc delete mode 100644 attic/navnodeedit/src/menu.qc delete mode 100644 attic/navnodeedit/src/progs.src delete mode 100644 attic/navnodeedit/src/shit.qc delete mode 100644 attic/navnodeedit/src/wsystem.qc delete mode 100644 attic/readme.txt delete mode 100644 attic/textures/anarchist.tga delete mode 100644 attic/textures/anarchist_glow.tga delete mode 100644 attic/textures/carni_bump.tga delete mode 100644 attic/textures/carni_gloss.tga delete mode 100644 attic/textures/carni_norm.tga delete mode 100644 attic/textures/crash.tga delete mode 100644 attic/textures/crash_bump.tga delete mode 100644 attic/textures/crash_glow.tga delete mode 100644 attic/textures/elite.tga delete mode 100644 attic/textures/evil1_metals/rmetal2c_bump.jpg delete mode 100644 attic/textures/evil1_metals/rmetal2c_gloss.jpg delete mode 100644 attic/textures/evil1_metals/rmetal2d_bump.jpg delete mode 100644 attic/textures/evil1_metals/rmetal2d_gloss.jpg delete mode 100644 attic/textures/evil1_metals/rmetal2e_bump.jpg delete mode 100644 attic/textures/evil1_metals/rmetal2e_gloss.jpg delete mode 100644 attic/textures/hazardgl.jpg delete mode 100644 attic/textures/jeandarc.tga delete mode 100644 attic/textures/jeandarc_glow.tga delete mode 100644 attic/textures/mechanical.tga delete mode 100644 attic/textures/mulder.tga delete mode 100644 attic/textures/mulder_glow.tga delete mode 100644 attic/textures/nexskin.tga delete mode 100644 attic/textures/nexskin_bump.tga delete mode 100644 attic/textures/nexskin_gloss.tga delete mode 100644 attic/textures/nexskin_glow.tga delete mode 100644 attic/textures/nexskin_pants.tga delete mode 100644 attic/textures/nexskin_shirt.tga delete mode 100644 attic/textures/private.jpg delete mode 100644 attic/textures/private_glow.jpg delete mode 100644 attic/textures/rebel.tga delete mode 100644 attic/textures/rebel_glow.tga delete mode 100644 attic/textures/soldier.tga delete mode 100644 attic/textures/soldier_glow.tga delete mode 100644 attic/textures/visitant.tga delete mode 100644 attic/textures/visitant_bump.tga delete mode 100644 attic/textures/visitant_glow.tga delete mode 100644 attic/textures/wolf.tga delete mode 100644 attic/textures/wolf_glow.tga diff --git a/attic/TeamNexuiz/default.cfg b/attic/TeamNexuiz/default.cfg deleted file mode 100644 index a1cc088c1..000000000 --- a/attic/TeamNexuiz/default.cfg +++ /dev/null @@ -1,533 +0,0 @@ -set g_teamnexuiz_version .1 // sets TN version so you dont get the centerprint on joining -// player defaults - -seta bot_number 0 -skill 1 - - -_cl_color 0 -_cl_name Player -_cl_playermodel models/class/scout_female.zym -_cl_playerskin 0 -crosshair 5 -fov 90 -freelook 1 -sensitivity 6 -v_gamma 1.125000 -viewsize 110 -bgmvolume 1 -volume 0.5 -// fullscreen 1024x768x32bit -vid_bitsperpixel "32" -vid_fullscreen "1" -vid_width "1024" -vid_height "768" -// 2D resolution 640x480 -vid_conwidth "640" -vid_conheight "480" -scr_conforcewhiledisconnected "0" - -// server settings -scr_screenshot_gamma 1 -hostname "Nexuiz Server" -sv_maxrate 10000 -seta g_viewweapon_bobintensity 1 -seta g_viewweapon_q1pitching 1 -seta nex_numbots 0 -cl_forwardspeed 480 -cl_backspeed 480 -cl_sidespeed 480 -cl_upspeed 400 -cl_movement 1 -cl_movement_accelerate 5.5 -cl_movement_edgefriction 0 -cl_movement_friction 5 -cl_movement_jumpvelocity 300 -cl_movement_maxairspeed 400 -cl_movement_maxspeed 400 -cl_movement_stepheight 34 -cl_stairsmoothspeed 200 -edgefriction 0 -set g_balance_jumpheight 300 -set sv_maxairspeed 100 -sv_accelerate 5.5 -sv_friction 5 -sv_maxspeed 400 -set sv_jumppad_control 100 //0.2 -sv_stepheight 34 -//sv_stopspeed 50 -pausable 0 - - - -// drop extra weapon (slot #5) -alias drop_weapon "+use; wait; impulse 5; wait; -use;"; - - - -set g_use_ammunition 1 // use ammunition. if 0, none is used (cool 1.3 feature eh?) - -set g_instagib 0 -set g_rocketarena 0 -set g_fullbrightplayers 0 -set g_fullbrightitems 0 -set g_casings 0 -seta g_maplist "nexdm01 nexdm02 nexdm03 nexdm04 nexdm05 nexdm06 nexdm07 nexdm08 nexdm09 nexdm10 nexdm11 nexdm12 nexdm13 nexdm14 nexdm15 nexdm16 nexdmextra1" - -// server game balance settings -set g_balance_armor_regen 0.05 //0.1 -set g_balance_armor_rot 0.2 //0.3 -set g_balance_armor_stable 50 -set g_balance_armor_start 50 -set g_balance_armor_effectiveness 1.0 // ratio of normal blocking effectiveness (0.5 is half, etc) -set g_balance_armor_takedamage 1.0 // ratio of damage armor takes when it blocks attacks -set g_balance_rot_wait 3.0 // how long to wait after healing before degeneration starts -set g_balance_regen_wait 3.0 // how long to wait after taking damage before regenerating starts -set g_balance_health_regen 0.05 // 0.1 -set g_balance_health_rot 0.07 //0.15 -set g_balance_health_stable 100 -set g_balance_health_start 150 -set g_balance_selfdamagepercent 0.6 -set g_balance_weaponswitchdelay 0.3 -// powerup balance settings -set g_balance_powerup_invincible_takedamage 0.2 -set g_balance_powerup_invincible_time 30 -set g_balance_powerup_strength_damage 3 -set g_balance_powerup_strength_force 4 -set g_balance_powerup_strength_time 30 - - -// weapon balance settings -set g_balance_laser_damage 15 -set g_balance_laser_edgedamage 10 -set g_balance_laser_force 200 -set g_balance_laser_radius 70 -set g_balance_laser_speed 3000 -set g_balance_laser_refire 0.3 -set g_balance_grenadelauncher_damage 65 -set g_balance_grenadelauncher_edgedamage 35 -set g_balance_grenadelauncher_force 400 -set g_balance_grenadelauncher_radius 140 -set g_balance_grenadelauncher_speed 2000 -set g_balance_grenadelauncher_speed2 900 -set g_balance_grenadelauncher_speed2_up 200 -set g_balance_grenadelauncher_speed_up 200 -set g_balance_grenadelauncher_refire 0.8 -set g_balance_crylink_damage 20 -set g_balance_crylink_edgedamage 0 -set g_balance_crylink_force 55 -set g_balance_crylink_radius 3 -set g_balance_crylink_refire 0.4 -set g_balance_crylink_speed 1800 -set g_balance_crylink_spread 0.15 -set g_balance_nex_damage 200 -set g_balance_nex_refire 1 -set g_balance_hagar_damage 40 -set g_balance_hagar_edgedamage 15 -set g_balance_hagar_force 100 -set g_balance_hagar_radius 70 -set g_balance_hagar_speed 3000 -set g_balance_hagar_speed2 1400 -set g_balance_hagar_speed2_up 100 - -// scout -set g_balance_grapple_damage 30 -set g_balance_grapple_damage2 8 -set g_balance_grapple_hurtrate 0.5 -set g_balance_grapple_force 250 -set g_balance_grapple_speed 800 //1200 -set g_balance_grapple_pullspeed 500 //1000 -set g_balance_grapple_refire 0.6 - -set g_balance_shield_duration 3 -set g_balance_shield_emergency_duration 0.75 -set g_balance_shield_protection 95 -set g_balance_shield_recharge_time 13 - -// spy -set g_balance_grenade_nail_numspikes 5 -set g_balance_grenade_nail_spikedamage 40 -set g_balance_grenade_nail_spread 35 -set g_balance_grenade_nail_spikespeed 1200 -set g_balance_grenade_nail_spikegrav 0.25 -set g_balance_grenade_nail_spikeforce 50 -set g_balance_grenade_nail_numclusters 8 -set g_balance_grenade_nail_cluster_rate 0.3 -set g_balance_grenade_nail_anglechange 60 -set g_balance_grenade_nail_deploytime 0.4 -set g_balance_grenade_nail_deployheight 35 -set g_balance_grenade_nail_speed 600 -set g_balance_grenade_nail_speed_up 200 -set g_balance_grenade_nail_refire 3 - -// soldier -set g_balance_ricochet_firerate 1 // testing -set g_balance_ricochet_bouncecount 3 // total number of stages (including rocket player fires) -set g_balance_ricochet_nulltime 0.25 // time before freshly spawned mini-rockets can interact -set g_balance_ricochet_nulltouches 1 // min times to touch before starting to interact -set g_balance_ricochet_splitcount 3 -set g_balance_ricochet_spread 0.2 -set g_balance_ricochet_damage 130 -set g_balance_ricochet_edgedamage 50 -set g_balance_ricochet_force 600 -set g_balance_ricochet_radius 170 -set g_balance_ricochet_speed 250 -//set g_balance_ricochet_gravity 0.1 -set g_balance_ricochet_splitcount2 2 -set g_balance_ricochet_spread2 0.4 -set g_balance_ricochet_damage2 130 -set g_balance_ricochet_edgedamage2 50 -set g_balance_ricochet_force2 600 -set g_balance_ricochet_radius2 170 -set g_balance_ricochet_speed2 350 -//set g_balance_ricochet_gravity2 0.3 -set g_balance_ricochet_spread3 0.6 -set g_balance_ricochet_damage3 130 -set g_balance_ricochet_edgedamage3 50 -set g_balance_ricochet_force3 600 -set g_balance_ricochet_radius3 170 -set g_balance_ricochet_speed3 450 -//set g_balance_ricochet_gravity3 0.7 - -set g_balance_grenade_frag_damage 170 -set g_balance_grenade_frag_edgedamage 100 -set g_balance_grenade_frag_force 700 -set g_balance_grenade_frag_radius 300 -set g_balance_grenade_frag_speed 600 -set g_balance_grenade_frag_speed_up 200 -set g_balance_grenade_frag_refire 3 - -set g_balance_grenade_mirv_speed 600 -set g_balance_grenade_mirv_speed_up 200 -set g_balance_grenade_mirv_speed2 400 -set g_balance_grenade_mirv_count 4 -set g_balance_grenade_mirv_spread 8 //0.35 -set g_balance_grenade_mirv_damage 90 -set g_balance_grenade_mirv_edgedamage 55 -set g_balance_grenade_mirv_force 300 -set g_balance_grenade_mirv_radius 160 -set g_balance_grenade_mirv_refire 3 - -set g_balance_shotgun_bullets 10 -set g_balance_shotgun_damage 6.5 //3.5 -set g_balance_shotgun_spread 0.09 -set g_balance_shotgun_clipsize 7 -set g_balance_shotgun_refire 0.4 -set g_balance_shotgun_loadclip 0.4 -set g_balance_shotgun_loadclip2 0.3 -set g_balance_shotgun_force 50 - -set g_balance_namek_damage 25 //18 -set g_balance_namek_refire 0.08 -set g_balance_namek_speed 1700 -set g_balance_namek_spread 0.08 -set g_balance_namek_range_min 400 -set g_balance_namek_range_max 600 -set g_balance_namek_force 100 -set g_balance_namek_damage2 30 //13 // note: fires 2 shots per attack -set g_balance_namek_refire2 0.2 -set g_balance_namek_speed2 800 -set g_balance_namek_range2 1500 - -set g_balance_electro_ballspeed 900 -set g_balance_electro_ballspeed_up 200 -set g_balance_electro_damage 90 -set g_balance_electro_edgedamage 45 -set g_balance_electro_force 200 -set g_balance_electro_radius 100 -set g_balance_electro_refire 1 -set g_balance_electro_speed 2000 - -set g_balance_rocketlauncher_damage 130 -set g_balance_rocketlauncher_edgedamage 50 -set g_balance_rocketlauncher_force 600 -set g_balance_rocketlauncher_radius 170 -set g_balance_rocketlauncher_speed 850 -set g_balance_rocketlauncher_refire 1.2 - -// pyro -set g_balance_heatup_rate 2.0 //1.5 // // how fast fire heats up other targets (ignites when 1.0 is reached) -set g_balance_cooloff_rate 0.5 //1.0 // how fast heat dissapates -set g_balance_maxheat 3 //2 // maximum heat value -set g_balance_heat_radius 200 //180 // radius of heat -set g_balance_heat_damage 0.6 // ratio of damage to deal in radius (based on how much the target is currently taking) -set g_balance_heat_edgeratio 0.4 // ratio of effect heat up & damage has at edge of radius -set g_balance_heat_transfer 1.2 // ratio of burntime to transfer to target (damage & rate stay the same) -set g_balance_heat_timemax 8 // maximum burn time from transfer - -set g_balance_napalm_firerate 20 -set g_balance_napalm_glob_duration 8 -set g_balance_napalm_speed 800 -set g_balance_napalm_speed_up 180 -set g_balance_napalm_numglobs 3 //6 -set g_balance_napalm_glob_speedv 100 -set g_balance_napalm_glob_speedh 100 -set g_balance_napalm_glob_gravity 0.3 -set g_balance_napalm_glob_radius 250 -set g_balance_napalm_glob_damage 15 //2 //15 -set g_balance_napalm_glob_edgedamage 2 //1 //2 -set g_balance_napalm_glob_damagerate 0.2 -set g_balance_napalm_glob_force 70 //100 - -set g_balance_grenade_concussion_radius 450 //300 -set g_balance_grenade_concussion_force 1000 -set g_balance_grenade_concussion_force_up 200 -set g_balance_grenade_concussion_restrictflight 0 -set g_balance_grenade_concussion_stuntime 3 -set g_balance_grenade_concussion_speed 600 -set g_balance_grenade_concussion_speed_up 150 -set g_balance_grenade_concussion_refire 3 - -set g_balance_grenade_firebomb_burntime 7 //4.5 // how long bomb burns -set g_balance_grenade_firebomb_burndmg 5 // damage per attack -set g_balance_grenade_firebomb_burnrate 0.1 // how often bomb's flame attacks -set g_balance_grenade_firebomb_burnradius 200 // bomb's flame range -set g_balance_grenade_firebomb_edgeratio 0.4 // damage per attack at edge -set g_balance_grenade_firebomb_flametime 7 // how long to set targets on fire -set g_balance_grenade_firebomb_flamedmg 3 // damage per fire attack -set g_balance_grenade_firebomb_flamerate 0.3 // how often flame attacks -set g_balance_grenade_firebomb_speed 900 -set g_balance_grenade_firebomb_speed_up 150 -set g_balance_grenade_firebomb_flamecolor "128 128 255" -set g_balance_grenade_firebomb_flamec_strength 0.6 -set g_balance_grenade_firebomb_refire 3 - -set g_balance_bombletts_damage 65 -set g_balance_bombletts_edgedamage 35 -set g_balance_bombletts_force 200 -set g_balance_bombletts_radius 140 -set g_balance_bombletts_speed 600 -set g_balance_bombletts_speed_up 160 -set g_balance_bombletts_refire 0.6 -set g_balance_bombletts_bounce_speed 0.9 - -set g_balance_flamer_damage 16 //8 -set g_balance_flamer_edgedamage 7 -set g_balance_flamer_radius 35 -set g_balance_flamer_refire 0.05 -set g_balance_flamer_speed 750 -set g_balance_flamer_force 15 -set g_balance_flamer_burndamage 9 -set g_balance_flamer_burnrate 0.3 -set g_balance_flamer_burntime 4 //1.5 -set g_balance_flamer_burntime_inc 0.5 //0.3 -set g_balance_flamer_burntime_max 6.5 //4.5 -//set g_balance_flamer_dillute 0.7 // how much flame dillutes with distance (higher number = less damage & burntime at long range) - -set g_balance_incendiaryrocket_damage 20 -set g_balance_incendiaryrocket_edgedamage 5 -set g_balance_incendiaryrocket_force 70 -set g_balance_incendiaryrocket_radius 160 -set g_balance_incendiaryrocket_speed 600 -set g_balance_incendiaryrocket_refire 1.4 -set g_balance_incendiaryrocket_burnradius 160 -set g_balance_incendiaryrocket_burndamage 9 //5 -set g_balance_incendiaryrocket_burnrate 0.3 -set g_balance_incendiaryrocket_burntime 4 -set g_balance_incendiaryrocket_burnedge_ratio 0.3 - -set g_balance_hotbombs_allowed 5 -set g_balance_hotbombs_speed 140 -set g_balance_hotbombs_refire 0.5 //1.0 -set g_balance_hotbombs_refire2 0.1 -set g_balance_hotbombs_damage 80 //60 -set g_balance_hotbombs_edgedamage 40 //30 -set g_balance_hotbombs_force 300 -set g_balance_hotbombs_radius 130 -set g_balance_hotbombs_burnradius 160 -set g_balance_hotbombs_burndamage 10 -set g_balance_hotbombs_burnrate 0.3 -set g_balance_hotbombs_burntime 8 -set g_balance_hotbombs_burnedge_ratio 0.85 //0.7 - -// medic -set g_balance_class_medic_grenade_delayattack 5 // medic's status grenades delay normal attacks too for a while - -set g_balance_grenade_poison_radius 250 -set g_balance_grenade_poison_damage 125 //100 -set g_balance_grenade_poison_duration 3 -set g_balance_grenade_poison_speed 600 -set g_balance_grenade_poison_speed_up 150 -set g_balance_grenade_poison_refire 3 - -set g_balance_grenade_armor_radius 250 -set g_balance_grenade_armor_speed 600 -set g_balance_grenade_armor_speed_up 150 -set g_balance_grenade_armor_refire 3 - -set g_balance_uzi_damage 5 -set g_balance_uzi_refire 0.05 -set g_balance_uzi_spread 0.05 -set g_balance_uzi_damage2 15 -set g_balance_uzi_refire2 0.2 -set g_balance_uzi_spread2 0.01 - -set g_balance_healgun_range 250 -set g_balance_healgun_refire 0.05 -set g_balance_healgun_refire2 0.2 -set g_balance_healgun_selfhp_min 10 -set g_balance_healgun_selfhp_maxratio 1.25 -set g_balance_healgun_targhp_maxratio 1.5 -set g_balance_healgun_selfdrain 0.25 -set g_balance_healgun_targheal 0.25 -set g_balance_healgun_targdrain 0.5 -set g_balance_healgun_selfheal 0.25 - -//MAC10 -set g_balance_mac_damage 5 -set g_balance_mac_refire 0.06 -set g_balance_mac_spread 0.035 -set g_balance_mac_damage2 10 -set g_balance_mac_refire2 0.5 -set g_balance_mac_spread2 0.01 - -//Pistol -set g_balance_pistol_damage 10 -set g_balance_pistol_refire .25 -set g_balance_pistol_refire2 .3 -set g_balance_pistol_bullets 1 - - -// class balancing -set g_balance_class_scout_health 50 //80 -set g_balance_class_scout_armor 30 // 40 -set g_balance_class_scout_speed 400 -set g_balance_class_scout_mass 0.7 //0.5 - - -set g_balance_class_spy_health 120 -set g_balance_class_spy_armor 25 -set g_balance_class_spy_speed 300 //340 -set g_balance_class_spy_mass 1.0 //0.7 - -set g_balance_spy_cloak_min_health 15 -set g_balance_spy_cloak_cost_start 10 -set g_balance_spy_cloak_cost_upkeeph 2 -set g_balance_spy_cloak_cost_upkeepa 3 - -//set g_balance_spy_move_safespeed 0.5 -set g_balance_spy_move_alpha 0.15 -set g_balance_spy_move_alpha_max 0.5 - - -set g_balance_class_soldier_health 120 -set g_balance_class_soldier_armor 60 -set g_balance_class_soldier_speed 270 //300 -set g_balance_class_soldier_mass 4 //1.7 //1.0 - - -set g_balance_class_pyro_health 120 -set g_balance_class_pyro_armor 90 -set g_balance_class_pyro_speed 250 //180 -set g_balance_class_pyro_mass 3.5 //2.0 //1.2 - - -set g_balance_class_medic_health 130 -set g_balance_class_medic_armor 10 -set g_balance_class_medic_speed 280 //220 -set g_balance_class_medic_mass 1.5 //2.0 -set g_balance_class_medic_flame_takedamage 0.2 -set g_balance_medic_heal_radius 200 // radius of ping -set g_balance_medic_heal_pingrate 1.0 // how often to ping -set g_balance_medic_heal_pingheal 25 // amount of health to heal with each ping -set g_balance_medic_heal_pingarmor 25 // amount of armor to heal with each ping -set g_balance_medic_heal_max 1.25 // ratio of player's max health/armor to heal to -set g_balance_medic_heal_reducestatus 0.5 // ratio to reduce status effects each ping - - - -set g_balance_class_engineer_health 50 -set g_balance_class_engineer_armor 80 -set g_balance_class_engineer_speed 320 //260 -set g_balance_class_engineer_mass 1.2 - - - -// class changing options - -set g_classchange_force_respawn 0 -set g_classchange_delay_until_death 1 -set g_classchange_not_allowed 0 - - - -// effects -cl_decals 1 -cl_particles 1 -cl_stainmaps 0 -gl_flashblend 0 -r_bloom 1 -r_coronas 1 -r_dynamic 1 -r_shadow_bumpscale_basetexture 5 -r_shadow_realtime_world 1 -r_shadow_realtime_world_lightmaps 1 -r_shadow_glsl_offsetmapping 0 - -// misc -host_maxfps 1000 -host_minfps 10 -scr_conbrightness 0 -scr_screenshot_jpeg 1 -scr_screenshot_jpeg_quality 0.9 -sv_maxvelocity 1000000000 - -// aliases: -alias +attack2 +button3 -alias -attack2 -button3 -alias +zoom +button4 -alias -zoom -button4 -alias +crouch +button5 -alias -crouch -button5 -alias weapnext "impulse 10" -alias weapprev "impulse 12" -alias bot_add "impulse 100" -alias bot_add2 "impulse 101" -alias bot_kick "impulse 102" -alias bot_cam "impulse 102" -alias bot_wayedit "impulse 102" - -// movement -bind w +forward -bind a +moveleft -bind s +back -bind d +moveright -bind UPARROW +forward -bind LEFTARROW +moveleft -bind DOWNARROW +back -bind RIGHTARROW +moveright -bind SHIFT +crouch -bind ENTER +jump -bind SPACE +jump - -// weapons -bind 1 "impulse 1" -bind 2 "impulse 2" -bind 3 "impulse 3" -bind 4 "impulse 4" -bind 5 "impulse 5" -bind 6 "impulse 6" -bind 7 "impulse 7" -bind 8 "impulse 8" -bind 9 "impulse 9" -bind 0 "impulse 210" -bind MOUSE1 +attack -bind MOUSE2 +attack2 -bind MOUSE3 +zoom -bind MWHEELUP weapnext -bind MWHEELDOWN weapprev - -// misc -bind - sizedown -bind = sizeup -bind ` toggleconsole -bind ~ toggleconsole -bind TAB +showscores -bind ESCAPE togglemenu -bind r messagemode2 -bind t messagemode -bind y messagemode2 -bind PAUSE pause -bind F10 quit -bind F12 screenshot - diff --git a/attic/TeamNexuiz/game/Nexuiz.dsp b/attic/TeamNexuiz/game/Nexuiz.dsp deleted file mode 100644 index 49c3a040d..000000000 --- a/attic/TeamNexuiz/game/Nexuiz.dsp +++ /dev/null @@ -1,281 +0,0 @@ -# Microsoft Developer Studio Project File - Name="Game code" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=Game code - 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 "GameC.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 "GameC.mak" CFG="Game code - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Game code - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "Game code - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Game code - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Game_code___Win32_Release" -# PROP BASE Intermediate_Dir "Game_code___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Game_code___Win32_Release" -# PROP Intermediate_Dir "Game_code___Win32_Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GAMECODE_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GAMECODE_EXPORTS" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x419 /d "NDEBUG" -# ADD RSC /l 0x419 /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 gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 - -!ELSEIF "$(CFG)" == "Game code - 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 Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GAMECODE_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GAMECODE_EXPORTS" /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x419 /d "_DEBUG" -# ADD RSC /l 0x419 /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 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 - -!ENDIF - -# Begin Target - -# Name "Game code - Win32 Release" -# Name "Game code - Win32 Debug" -# Begin Group "Header Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\builtins.h -# End Source File -# Begin Source File - -SOURCE=.\constants.h -# End Source File -# Begin Source File - -SOURCE=.\defs.h -# End Source File -# Begin Source File - -SOURCE=.\extensions.h -# End Source File -# Begin Source File - -SOURCE=.\sys.h -# End Source File -# End Group -# Begin Group "Source Files" - -# PROP Default_Filter "" -# Begin Group "client" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\cl_aliases.c -# End Source File -# Begin Source File - -SOURCE=.\cl_client.c -# End Source File -# Begin Source File - -SOURCE=.\cl_impulse.c -# End Source File -# Begin Source File - -SOURCE=.\cl_physics.c -# End Source File -# Begin Source File - -SOURCE=.\cl_player.c -# End Source File -# Begin Source File - -SOURCE=.\cl_weaponanimations.c -# End Source File -# Begin Source File - -SOURCE=.\cl_weaponsystem.c -# End Source File -# End Group -# Begin Group "server" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\sv_main.c -# End Source File -# Begin Source File - -SOURCE=.\sv_stats.c -# End Source File -# End Group -# Begin Group "frikbot" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\bot.c -# End Source File -# Begin Source File - -SOURCE=.\bot_ai.c -# End Source File -# Begin Source File - -SOURCE=.\bot_ed.c -# End Source File -# Begin Source File - -SOURCE=.\bot_fight.c -# End Source File -# Begin Source File - -SOURCE=.\bot_maps.c -# End Source File -# Begin Source File - -SOURCE=.\bot_misc.c -# End Source File -# Begin Source File - -SOURCE=.\bot_move.c -# End Source File -# Begin Source File - -SOURCE=.\bot_phys.c -# End Source File -# Begin Source File - -SOURCE=.\bot_way.c -# End Source File -# End Group -# Begin Group "game" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\g_casings.c -# End Source File -# Begin Source File - -SOURCE=.\g_damage.c -# End Source File -# Begin Source File - -SOURCE=.\g_decors.c -# End Source File -# Begin Source File - -SOURCE=.\g_subs.c -# End Source File -# Begin Source File - -SOURCE=.\g_tetris.c -# End Source File -# Begin Source File - -SOURCE=.\g_triggers.c -# End Source File -# Begin Source File - -SOURCE=.\g_violence.c -# End Source File -# Begin Source File - -SOURCE=.\g_world.c -# End Source File -# End Group -# Begin Group "map" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\t_halflife.c -# End Source File -# Begin Source File - -SOURCE=.\t_items.c -# End Source File -# Begin Source File - -SOURCE=.\t_jumppads.c -# End Source File -# Begin Source File - -SOURCE=.\t_plats.c -# End Source File -# Begin Source File - -SOURCE=.\t_quake.c -# End Source File -# Begin Source File - -SOURCE=.\t_quake3.c -# End Source File -# Begin Source File - -SOURCE=.\t_teleporters.c -# End Source File -# End Group -# Begin Group "weapons" - -# PROP Default_Filter "" -# End Group -# End Group -# Begin Source File - -SOURCE=..\progs.src -# End Source File -# Begin Source File - -SOURCE=..\todo.txt -# End Source File -# End Target -# End Project diff --git a/attic/TeamNexuiz/game/Nexuiz.dsw b/attic/TeamNexuiz/game/Nexuiz.dsw deleted file mode 100644 index 9eb6db644..000000000 --- a/attic/TeamNexuiz/game/Nexuiz.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "Game code"=.\gamec\GameC.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/attic/TeamNexuiz/game/Nexuiz.ncb b/attic/TeamNexuiz/game/Nexuiz.ncb deleted file mode 100644 index 55425c8f987891f76dbab625cb9a3d276afc4df1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508928 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
  • =AJE;T2T&xz!7BKb6lUo(a#@w2*vzEfHmPz$8G-o&-li_LKyzAT4!JI_Y_YSZL|ka%0Plt@+qW$5uMF(y=uTJL9l34m**gHJY?C z&Y?{1uB?D|Q75~heCkN+6Y8LJ%0T0;Bxr?|)2pz5751;fekAcn5`QG| zM-qPuHdC<4x!}ueKQx0e zcNEW@B~UArXlf;G7Jtc>j}G0qh>Y?kMC&AvX%SQOL0lgmkZ-=`pPV(U=sjFSQo9u@2c~3b>pQbmFB~UAr$T*YP zThbAY&1gM|xE{~-c&^8D{QxoCOZx65efN?+p6m2Gs!tZv6DMC2hh{Ji+fBam;V0>b zHS@XzYK7DmcGDK};V0==MnhSwk1!b_W?x zy&357{D(F`haj!(od{oJt(LqVd)H&{dhCtF&PeQx#Lh_U@GK=w8=ynbB>JM!XzF>K z23<#)9EGNvMWkyZb~a*XBX$zGnuwi5>?C3*f|`uri9Lz;s42V)OyONXo}&b8saH-y zHVN4zOLii%YlzV_?!)GN*t`#$lSs=X(lUuFlSoS}YoKCT12q=?vFMLQf2@`FE#z%A zd3>6FOe+(YK&?=sc`0#TN}RDs>Mg>BO&2y@*krxBnM{1i#FtEbTZq4c^9s%@IM<4- z@z@%VEmmNdbFeiBTYAe)COnz&WWsrup$%?;4nZnwek?&;DafTDmx5dha&6de$9_BZ z+p+KBdE?@F1Q%13NRYqqor%;!GjV6yn^$c@yVNoHubk8awLIw4!|ydXvzbgq}(` zig-ql#u21(1Zhklt_0#rAg%=BiYDc;^t7y@pkD4oW;XrC7HG9OhPs$dT$d8prNnh9 zanZ9w&ykmCs0!K+%_CnAvqn!P(IhyFOP=QH$_29pjJqAGMj#X3$&VN!PEFawfZ>&YJv28 zNaflF=nyms`C>@#CS#$ML0lE0c&oYZsA{%?5xZ#sUM;rTz!*ACDB z4bT4#&;Je2{|(Ro4bT4#&;MyQe0cuv|DW@J|Nhgz|HMR_@kRX%ekIGr-4*rQD&6zk z8*AzoFLJMA**WX8gIrl&xpmieBYWusBGRojO9= zt|N$I;GP}D*JhVy=M=2ZSy!|!uVB4VRa;-)WGJ*aZ)HJYLBWPKMsZ<&-ty9A%L+@Z z3(ND0v$>Fyz23-MU%Fv4pDbBln!RpQeqO<9!F7e%t8>a z5-!LqSh?`Lvqk5fEjCu~6mS?TWT1jkq zWK9_@%G!uh*803`uUOWG^@YZo;+3UY`T5?EYYX$TS-ZM^eL-nK;kq@(hN9(JBx_k- zLDsrW{`4;+y~vS_yn>AgtTQO6^^|UDalZ0x8z{&zmgi)x&n;b{2+oyQv9W&Lh8&|P zzx3L?oQ* zp^7Tb$zGSUURhgSx_lFrWnEgGm!F?Q!o1a@^7b|~f1KxX>n)V^Ir%v&)@7|!!4&7_ zc%jgfg`(Yq`a@wF6?+4%`dmhfqd_9>Yh3FKi?L)iWol!2 zj+(PK#^vh@H_|Gsbn{OIP*k`vXWfP(rJ*1zk0hKkL+dJ1174oD#%h&T{Ofbp6j2j- z)?GW`HVxdlXZg|~xAp+}0Y8;+rgH9A63)bZKag-H?b}GmnKVE2*il}wFrD9D45_dz zD|_{ZB7bLQ_h?quKTvr)UF1219hG&v^y4Jzu&8uJe%8v;yfsA|@{73*oR)P%O=DAi zEjG63qlxyhaJLWfy&AqY?mOOQ;nD0ny=VWGWf-5F#+PcfSf4|?&+6;VDSTW=I|Eec zqpSgkc2v|C+&@>&cS~7BJe}#{>HOeAU#QnE=55Qo!e8XWjSJ!oWA6%VvG6FL#Y1=V zAtCJ~cR(Kxw2#Rw)}O|LsD*nCBU1}uIX=N6Kka6$otO7R+GRjrNdM@itXF1nWhvLS zi?eoJ-k=X4*@t%J)=rHnP5l0YYr&4+=>vU39GUER@FeNiPT48-tTlu_#X`=wGQNYf zlQmlh4C60+I8k3+)|c7G&ozwEEb`QD!a6qFWh$&)EwnqEjxSSIzC$|{3_P}TUAsmH z9ubu54&vAG7vcTs z@iEF#$0e!Qrk-?YcaKay4)+H>?5CX`SMfpNa%9Wy=G#-0%V!sR<-T`0bxvE+P6yiM z@D^mX!}F5 z4?46v-pFOtFE-9>^@i!o?f)+IV(nO=;|p$!8CjI+VHRSRMH*P$=S>-gn0hVdEd$OEK@pA8t={opX|YcdP3#vEgP z>>gy@vhF>!W5hx7{mM4#E0(x7Qy#RhY|_3MDu%RM_q*g*yHggs=_d%gHk02;VYiHa zK*x)TUj72Q+WCDlq}?V{cF?v`4dZRnrrlY37m=R?+7ju@Y(|E>W+MCXblSrmyo5f$ zn%{ZYz|M;^scX{o2y%gkcDpVm|4+cR`*R~7C(WF17{8@Xue*tK-ySIK$J)iWZ9Dzm zecrHVJ^pJxw2$@}?8xR``t%a+724g;sHb0pe?`7-CO>an%o{Z6HK|AK;9O3*&upM? zX{7B_K4VC~zOet38|c@N+q9B8B;B7R-LDX?oy+&vVE2B$^EQRHi4A?}{uJRiyTO!C z8RfM4h&N^0?NwjS*P$KOeMdg^^d0&z-%-guG@ACHV-4k{op1w>wo>{o(x*c^cj`EB z9p4ko<_qt{{qaotJv&b8BLCh>qkkgJ{LsZZw0l86`TE+O!3j zW|D8;p&fvO9r@UJmOT7{GS&_q+QlT|6594m`e*7!yYSvpjy>A(Hx3{}S^JL96nN36 z<{QT2v;`g7MMPg~*G{rJ-huY4r~d4F^@r5i>$ExT#+iN0Fm}`-w{Xq)~-0Im(doM(uYfW+X16Wv*6Ta^D95`g zU*FMshY!(@+HK-3!e}n%j;eq*uE6Egt#%1{1-shy^OuxEG56aqa=j|C6TSS1T}Msa z_g^pM-lJ@uMdpvBZ_gOo@+|rmyWUdB^CZe=8aA^Uz52HYq+2^;0P zRJ$JhYYN>gZNPV&nae#-|E1k^FQPnkTthjZCH}3n=fw;8y$o&oZNjxX_H$c!_aYwc zND=HfJ&rz&bm^#Z^V zj`H~v<@4utmKkI2)%1g;`55+g#T$lp{?^X1+F2?e``TGXJ0tI;+_mekcA-5+zH2DY zWu>&?RctPk!f%>rXFso}+`u)InRZz@Lpc`F=C#{yBk4*;{*9gV&EP9Wk-qELMS(Pz z@eVlc7G!86U*TTV?mgwSnKEo0y`A?-;*3h5JrkF9AiDl8?wPy2>DT`Pj~@#)O`|`i zT#i#NU(MtB!+k%+zQ@wZi;gGU7Bj{^K)T6y${O$aqGC4opk4OZ*9%C~#eFxtqM>g28igMBMHTo1C+8HC6_NbjL&QwyDq({34%`xetlBqA+ zmv&SI7+(BD$Po`f% z?kshX+Ul481?Bn#ZR#7eVeNY6I}YE9Ecx&qca!cXd68Ah@y9`B;_hZ=5j$~_Zp^j*KEb}*> z-A`WtHV=7Ys!HE~~)mcLLYIx1thhq*s~j$RslO*U=oY1*fDn17plse-hAgZO@YDSc-t z-=ZfkIv%Htw4;jeNQq}mgzTN9L%UUPx{UGTKCaTvZ=qeEZswkCr7aN0u_=b}-^+cP ze*OUWpLS^1&U|lS>xG-V*Xl3v%f#L0#mBJw18n(@J1BP@ucdo=1L@aM#J&8-TvglU()55;nC z60df?X`>Ak$5HO9c+aEnd6#=tI~}^qDEm7N<3`%TRrmQU1?Sq$?t54A93^kJ9SJTo zk230=bpEyPeb{>*JDa$b`|_}8SfCZ@5P9`Snii|Q=Y!# zD?BrN$31TPMraoO&0&@2+Ov;|;>rv`&M?Cj0`Mief`?#;Z3a!HS&*;}SbDtig zTsN+#Y}&kbXJJFfZ!!(zzjzkDMSAYxx^@@)KH-1yy}+&pjib);X%XwsEUef>9W z@o)t3a-YnlJ?$Zm`Q*QWd);@uK{|g@#533~SM9K;Ba?W2$F1DYPjbQ(lXXmA=et6^ zQ9m!ol*`336#Im+onl-+Lbt77Cm zlvU$>J`2ba&%ddsz+)@%)+JEhY4mS3wDn7913U2}t@KKL68p1=>jY)~bIN=UGTM>u zFlAYKDenTb*Q2TUEDm_(*I@sD_EJ~GH7Ca()2o?&EHoCIU!fc`A2f__R{5_TA^mSc z8SS(wyS@%$U&j*4UOR&7$a7olyno-k+kd)zq+$Gsv_=xgC%8`@;atbpYw4$tdGT#~ zyj(lK>8OkF^6zoq1|FZIe1Q{ipA!C#`Rfp}q-QMt*)y zesw%gzS6GtV&DIpsK-Rlj@q0FA){(FOaR>!rJS0DGk zn>P4`o4sM$z3&a~mB;L|ROqZ3+|T4KZ--Y#JJD)))>pRj8cCfz7a%K%R};K)`mbFq zF9|sRlbiR0`TpzQyo!7;^ocC(!OG4LolN?vHAlPS;d ztn*&cPR2K1%NT!pprjWUQI5W&o3eair1xy~0>&h?>D?dVITGUyi=|v*NxOD%_E1*7 z#9vB&{+F~&y}~Q`opyXp~c-JY8 z(qAIKzT;;4hkv{A8Phg4ZO5;Y;Js2#dwibz?fVrzN#0rP_T&#C?WD7kHZmoG_eRR~ zE!yEq+QH?dIgh&hCio%BxeL;cu@%(W{bh{nwo(t(%-xW8e&}z!9MAKEdpZ4b#+2mw zcDsBYu=}Zf^f!N|?0iQW@%^og`;hYgrJFWKKAtE44^h8Ap$)!{t*hs7uaG|NLhCMK zJVf2D-G~h3e=X^FiS+r7jz-!)bujR_ingOeyO`d0mlx~*@5qnucm-V@Hz9kHI(rUE zCH@JCv^VbG(N(;!q;el3Cv*J)b}U8vUrrfqv5>^?xbXvKP}|lFv_FLfb_D_%`qL zw<#OnF`4>VRE{5eHEk8UGbxiI+N5?k|21*{iuA`dP>#pAPMP?Qy<@41Si&jmfyZI$ zCGhwTav!IDUx@RDYFFLsXy0!I*wdApuHn5YFHqBuM^7dHwEZ;l{ql$Cui)C%{9Ob>b=YH-%@^m|P7E*3|miV=vBy0-z<#zgktGI_Bp}Zy(^UjR^^cdb( z5q*NR|1qHct=*5gww3aK3i-#WyK66EtW5cL(}#ScmHrT0*`&3Vw(u3?j;g-6*FIm# zJw$nIq3v!Y?Bn;+r+gT_qx47Q_glpGF6~I)AgqM`MA}+NdnNh5e>ZJCo3go^cF#Rn zM}PS@$~*ATZql#VWm>wPK8L!Es9Hs0k9D1>Jn^I~MEBX<^MM;YBYo$)H+ zbKE>*D8F|pqk%`Eo$s%qlS-QYNZUR%j`!A7=Cw&n8gVXY!(V^T`I>*3MBBZEHbOm( zpnQDCXH>omNCSM}@jKeVv`BAgK4r6F2Jg@-k-v(x4*?q%Gogk5nPbx0X3rLHbt&2yaeetA3X zg>tJ|$ebKuPL7?2y;3K*cYMc4>ZXDFTF0xj)gvbDjr#N*f4ho#u`B2|2DFK{DVHyj z=O2*HNb2zIRrogHfyZ*vJT{=-_ELtQM8~zrE48Np8^rl1>dSXjH z>hAF&%7;GgN$Tk`;ygw+Ei+jiAfE_k2Su)Za8 z6#{TCOrYO#EKxjx?Q zuv~(yGu~6``x^Cy*r=;)zQ9xr`Uv-hB**_%?hCQv{d~4%p{ac5_R6LOL$4Npe<|>uY^$tloL?Pg`YW58D(h4R;hSjO z8@_G@oupC22g{u|*n#C&8-8bK*Wrcqhyf=ykN27Vj;LdwKzD~v9FU~;J4rpg^* zC#7*WYnyBIN&fH}H~NiD<<`Cp;TbspapUkQX%_;zrRDl+f7nr%R&Ki>^{Sff)#2Y8 zO8<`XhVWZ~WuT_9;)3$9qki|$FDi4tnr?1<>TAmwh#0H*w?JD)G(+x92&ZcgVkV^SJ%~QN zYej8nU3_pWA;0qmHxu&9?+|7}?CyhG3BSvKKYJnE@b7CT#I8Sxt&qF_;5I^h1Ozb> z(qkaFen^jkAxwnwI2gi2h>wIJtc3Ph7|KXUkA|U)yx-%&(XTpr%IT(d{*W3XC40)X zYmUQbeGnTJO;s19zpZ{pO`WwZ&IOs-URqJ!SW~zC!U|-2>9+D6<=cmTayzLSj8sAywNRTq|&rqUY585dS6O{F*P+R@NZzU@NIG}MMP=8y5bpxTn;=9o>ak*}k)~u6$c% zz;1IFVr|&}7qr5M{eS0umtvs*3fEgxc^!|pa9wzz4HO4NAI>0gfQgU>hy!%P7#t3^ z5c0rqu!)cdg+WY&I3OHsA^gGMP_{yN4i0G|#6jQyJ0TAM2kVD8_#0p#q=DaH-H--- zLDWMT@C8v1aj+M}LTCfMUOgL=fe;6AgA9Z^fE#2Ww87gT^-u?HgAIf{Xd7fA^a0x-6Cn=P2Iz+~P#a_- z#6j91{m=(!gG_`tI2)uN;=nApeh7oIK?cGakPWaB`e1CZfpZ%;I~?>3vJmnhY>RkHzQPMre{21Yt+ka+aukPM{Ci3Rtc014J*74HW$U)pl<(YI8p3+8 z0WD!qX;m$A;TK|{y1q%-34au5ch6zpiF-BwIQdrJ5Q`a{s1CJ+!HI4Vf0ProAw5w}ln48uoM;W@eR8N9 z-0$R2Ik?Bksd6x1lM~$wXidRAIZh%SVhxuQ)u4C3GsPihrJN}T8|FCE9AbduOgY%l z#+hcYK}`sn1BWxtREHkOIME;MS#hE@q))|(@=)FsXSzZCC=OMFc~G3G2KAjdQw`!Z zai$p5U*b?TxTnOK@(?}}XUf66BTh7f4K|$U4e_?@L^arJx)Z%1@7GS$f(?iq=>>fw zcceLJ5amQ`=(lfY+Cg8Kov9A-s_abpectz-83^)@>P#{C+odzz;NBZ&y20LxooT+W zr^A_v;64s#y20E$&NK)6MV#qX1a-4H(dG5@1EvI>SUEQa8)B7%GaJF&YtA$WJI0*o zoy+^ckz;7e!6q-ASQx^+>P&TrF|QNlrYh#^!hZRzVu8-q@_~b8XYp3;s;g+Seg|~^ z5=dv-;V0P|Ert_i&_(6WQXB4T_Taf>XYt*HsYyQxJHK8W z{k(Jtr-LKip}Y=`l!Le(9O(_|cW|UV*zw>eGiVcgE=1@DG%X& zaHJdD{oqtJ%rztxTY@?u9L0Je)2)g(SdZZ_;vswx4z+{zjt*6Wc_Bhk9q5K|s5`VD z!jXZ&jtEC;LwX_{X%FR!aHt&A7vWSlm@~qmZcuN8L){?m2#1WXxD^8^`O29 zhq^;JCmd?Ok9WeMg&^(;hnm6t6AqPwJ186~2lG%kRDE9;g+m*`eH0FrgE=W2st)#2 zI8q$2g<6OUf_Po2I=7!%7`ndA)k0Pc@UB$$K6q3U1{ zizCG$T`VDL2lKHwG9f1mL(C75T{wS{y}Be=Nr#~9E8!4Syd~>c;k*(JL(5l^j#UHP zR3YdDxCR_+HC6e20wE~*HbM+R#W(H=K_$Rv7J`;Ppy`I8J;({^FuUiPau{(2@eDhRHLz)i5%IYu9)@l}Qx91?aNpaIm7A)3 zeQgM;{%31=Zd<>8n66vDfzaKze%)|gxPA*EyK()hVY+h9GZ2xpdFB5QbaV zZy-F^u3tYa_wIS>VYqnx`r){F1GR@(Z1w^DRiFjmYfo5rZ#W-5(6cl!0bx8_0@cHC z{SHzO(fu2!AGQnFZzN}1L3%Y&(jaXEgYyHj%zqjKXmtSpmsPe z;`8*wauWwy2+vg&)f}jPA@1ftJ7Kw; z0}X`Xb`Dgpt}L(JzAJ>!1D*c{vZpj;-?cyX@cq|;Hp1~?2kM96$M&m->C5&TIOlyV zudCT%eMT-s--zGTIq%94YX%*^*M|I2^nq<6WZ$+w6X(h!>|*d+@Ofs#dOHvB(uS!Y zo>#$N6k+If>8B8U=qaInjNe$BHxcpidNMs=*#6&NPGFs?Ib^ z_wc>&iiPO|7Jd$?yeunw^@bv=p#A^k<_^`6+~anA;UllC+cmJy9x@5%X%cNi4W9+C zB?C9Izsn5vmtp%Bkw_@4df%W!~POzIXME zjL-b}ns@&7v)}yd-T&V9=8ix8;vfHb@0ukG|9$LV-}w6#KmO-|QNOz;^1XO_Tb9Jj z*pm|cEPJ}-635c3**6P*Cws^InedbB`SK<_ZVvnOz*n#*PXX6I#$GP};CwxM=X?@A zZ3Fv86Q0U`GuMk>>)khMEBoMV=DhoI_69>v+rem;giFW^TMQW=akG~reEU-Nkb=jv zrwm)f7;fzM!+$!LeR<&7=>HPlI*Pq?;CCXl7`s1ae;#ddb1(Tg1OM6@_G%)$0~*cw zUsBkU25zooKOn-MhtGwZ>}OO<_?6^)1?MgBmGJCr_CJOvvWL$&_;=^Ce;0DgR{CtY@bjs&{;HRND=#pg08$N=)s+!@y z8qc0@@SjX0PWXe7q#xcpkA3#wpT_8K;g3-t*I{=l4S*~fFR)KgB54-B`VH)@1b1P-f$*0L**A#u zT@%=Ei1Tt6dyv8}Bc5f1Z=B9vTAW7{$rYUccr5#QalV)MjwpPpVcZITgu=NF{>2FI zJ@vDTs0YqVNX<D$cnD464r<0sU(Zd$PiRO!{d8Mg;j!f|q7c=I~FZvkwz|73sVg z{v(Y26aM>5+Bxa?C*>_$%lMbd`L{{*6P#zSWUnyJV@cnKInTU=GJ>yP$bNP3|DxXi z4&O-q6u?)IjuY^e3n&ZtW9$J%Q5f+g_D}E!uVkM}`0_mV>BDXW?d&qR_QSk^@aHI( zD>=W5@{NFBoq$cke@XlJ9lU%!a)jqlABY&8lz#>1o80Uz%6UEQ;fL`2jg&v(iSQcu zC9~N#i*W5Rw;Xew^|oE5;=9{R#LeDrE>zfO6*2mcm{+yh@m{8N$NO8xyW=dWDGo^|kX^VwGs-b!K3 z;`$YrvVSD!-zJeA@V{{WW%#4Sr#?6HOXx2Draa(*D2I^cZa681sk{CW!UDaq4*{tEvHjk*|qhWdC6?m~V7 z@{_q=HgSG<8GGt+ejSB7U2@&|Z%9QPGGb)I)m#xd9)#rX0Fb#qLC{~6;S=d_LT*bQ%A$g>81bQXDqe>RhQ8o46c-!C}dhy26v#U%cl@H=97 zM#7KM4vxdsxlBj?8RS03>6fC32R?Z^aln7#W{*F32{PP@#%k*OEc`g-`&sy#6wdAN zsnjD?Z!98HL~UF|z6^A>WpS^=^N?#H=!ew9&*0N&cUQs>lFwJ*&D6(8V>K@ zqVmw^Jfeu_7W`vb^vCdr5_#5g{pa9#IN}CHVI5KYe{~uALUQfNrH1hi=L<>958$&P z$+npJ)g zG1N1>g!_glt-ZIq;Ug9q#`oZ7Hc(gCxsyUz4bMVv2jP>(l0M0iuP5QZ=RVm6e~EI; zK<*Rcc}8&l5i04Y@TDYn1mUN-i5fXywu<*I&R-^-Mer{4D+nJ?<-ZHRVpG z;nop?U&OnT=A4IW;6UL6TvNVvIR4daAx9mSGs72ec#aI8b{I|!pK5px44-zW&I_Mj zIF1XSZs<-6pJtd23!i#8&I+II5RM8*t@8ik`ky*_mPC5&-sDa*hVIoprIQfe1Z>^_ zzx)}V0C4p>eejIe>Fwd_r5dJonorSFw!)>?4X=(fj2<{0lF@62_rdRsL=XNk!d=rk zO*(cX1^!`p8vHce18;`s!s%cc-FUB8+vm-2f{ix#PkBssz@rH1f@i|J;nMGcORm?x z-UsjDydVBJS6uE+^MBwe@J_1u=PO}7KisnG?m zhIiZ7d*I8t-V0Yb^uasf{cxD!n(ob43S6W6G`Q03fooKr3zuAp&8uzRZ1Xmoci6nk z=G`{$v3W1N6FYr2?}tZm?n?FAPl3C5b4r6NogOZ=W6b`xMq0kD+R9WX>iq-2d;9+g?GYB z;4q`wK5vGrzS`hQcLzKjy)L-qx^3QL^In_x*}UK8u1mb~DK<~Dxd)z$om{xy21?*3 z;MMS_;LUKD(Pr}wcrE8$Ht&YN#CZ=~qxfF9E}M7TyvOFfHt(}}zs+59?f7k;W^<3tb8TK?^J<$n+q})@9X9W> zdAH4bY~E}0KAZR3+%?aR-{xsH_t-qw<|Q_-wt2J7+ic!p^Ddir+q}o-y*BT&dB4qF z^X>R;o@R58&2w#DV)JU7H`~0;<{dWgvU#`7du-lo^FEvR+uXIlj^E~KHuu;(*XAWQ zueN!!&D(6=Ve>AVciX%NuKuVOu6EpKhxfzPAGy-K{ZR^B?Kcg63hsfcKgxxxA1Q&W z-B!b4Ml)RfQ5#(SQ3qW1yWnc)-Ef%E1Mh_Q!eyrqF1da?+_lioKV1D$8axB;fm_c% zcqiv2a4UYe`lDtz!A2Wg{ZWT~y$i1XsN25Y1Fz-07q0%O53c^GAFlq$waD8arN9X` z(roUrd9KY%Y+h~iW}CO!yu;>QHt)81kIj2+-e>cEo4Xd<`L}r*T>X{DKF_sziOs8R z-V9ecx53q4b->kMb=lXuZQcV{x%I-W`nSXT;p&%M8D2Xna88Xhxa2(cc`jV-q6BW0 zza8Fe^ER7z*u2Z;-8S#Bd9Tg;Y~ByQAHVKH%o%*ieA+x|e%b6czhZvXe8zm%{F?c7 z^EvaB`Mmjp`J(x<`HJ}sv&a0V`7QHR^V{ZY=6B3bnQQT)6f=Xg0dM9;qXZx4W}_RA z-&dJ+`Y9f+SMe&I#smEZUf{psVM{eHHfNX_X0y51yv5vS9x;!a51TKUUFN6F&zS#V zK4pH^{G9oD^Mv^YGuO;BSDOW9p;=_EHP@NN=6Z93d9At8EHO8ko6YOYE#~#+4Q8oX zW|o^<%?fjyS!q_8+s$gT#=OzI$*eVZn002o*@I^MHA$xy(Fh-eulxwwZ^_d(3;y51WV0cJn^-e)E|5fcc>LkogJolf3&qVLoYo z(Hw)Xd>r#P$@oSl;18cO3lY3n~v9R z5gxn@yn~lBQ{`dyY^C|1Ot0<0KUI%!CJX;=DRV2knOA7S$CQg7d^K|>YnZ<%#J9Sg z`M4V9lJ3HfcpJXUR{U!>8V8L1%r6|nN7;s7=^osfw=jQ@hwrHtf9h7|#+Ktp-(%dt z?9RP-%#-j6Uv4fjKY`cfqj*No;9dT*@ho!;Cz2(|CeTG5hxlp3EM+ zuHVMf^Bugj-(yDf2Y8`>f+zkL%xeA`PkJA-YrkU#@DF%9|A=SuEVD0vVTLkrRr;RN z;q^ZiTf+5q1umcn%ik4fAlRaU5AbRPs$ba88^ZkATwnsiaGeFJhvz;Ev=FKbEl@Wc zH(H>6=&rOt?J(VGfhNLnsRil};Z}39Dr6|HniJjO^*`I*_ha+J>wlPgVSXfNFapp?V#`k&$TKc{F1!|Q*T^XB<5y#8l+{m=0FpW*dC!|Q(rum7nm z-%(I`-j6rr^$6>SncjsMIF7>Gw@dL}$PY4o(TDY8OrLTXKg9H@hWr~!uj2a*bU(n! z?c{$A2o=C*Spyx&UtjQGAz7xHqnFnpu~@*ma` zx^tx$?pB|=)A(u-Z$>U_{m-M;`k#a;j}pR)MVptwwf?68?jpPwuJu2C@D$F=rao$| z|7n0ruM4jAKizQ6r}Wt2y>M$C0Q_Tw_ro>6;+poTHJ_6LKh1d>+?of1Yu+W-zFuOV zSHlT5n&Dbc(gxRjSqD55-UXL_H(YW(_Vr%4=6(9$k8`CTuJt4?_oLQ4TMAtAX>iTQ zdEg!JT)6C)z&kmwhAUmoaLvcH!8v6e5c!68+1I<_njh?es~mdao$x+5jCDZXe7mMU zYRwO(z?JSaxYqx8;F8O=d5O)dZQgA2Hk)_Yyvyd@Ht&IVVyD;UeefvG`|azlRO*#^ z(iFJTnFfck4#-L&2Y_=w!xL|4!Fvt3vSJW+UGrRf{k9d>Z=c~ z^6ZDJzFZf3^;6)IOM~mW2d?_c{eRlKn^?`MI*#M_AZmTV7x1MhDhpl?2#Pu;1$>z( zCXFjhSab)*#MES#CU&ohUE<1W2s|cgx|jtaE*eeD#IWeX1W=KxBchJl#0?7*Yt-oX z*Yg`@hPi>6%M1dR%_sl1PoL+WbLL!b|L6H1RDV^d{;F}u@dkl)K&ihvRDboT*AKWO z9#NlbLiN{-gscNf{gqvl&gZE9il}xdaEB!V>wr>Rqw={8>gR58%|oKD>+N7iJK5PT zHoG>xF1Ha&?o*)hxg{!ZTj5cx5m*P5Z1D(jXM22@ctGWON7VI`o$X??>-_$Boa-Vg zpIYG4#HG(ywzdtb|60c#Y8>^b_8WYBME$#;@Pyjm#}_=tb=mc49ObBXji~-A5LgG4 zK1YS>pBi=l1~txF)O8*1ut(izKwUTb_=JReGwR>>f`>4RX}sjPBaXPfKWe;`$YIt2 zrSVexe1qzr*5^A^KlHe^KdRqGR6k63lz2v99Z)j6A(`7~3tQUC*0!;&?QCxc)c717 zPjm90_j)A)Rgnio2s@9lv4_dBBcX+phj_W8wT@AuDd zqb+P{D_h&fwzjjq9qec)JKM!(H~IZ-w1q8gWoz5m)^@hHgB|T;XS>+!X1~9Uwy>qG zY;7Cc+RpZNu%n&qY!{n-!0&IPEo^BkTieFAwzIt*>}V%D+r?%d^!wXr3tQUC*0!;& z?QCxc)O<9e#_{CiGip9sQ1elCOB%m99^<-*`n^`5=8+OLZYu=V0j2qi!*S zocE~f2HfF@y3d5VZuap73HP!OrTHkwL&Oo+-+#CxE^&Q-)O=JUhgk=d=A+ib4(t^5AcF6CKx-L2{Q1e=eYy10nZ5!L# z&h~b&qn%F1w?7cR!S}GV0_Y)Dp*(vH(3z`!9tn?z$HLFT&%-am+iPQClVpI@DR zkApnJI{ozrc#d`I>+xow4{ojGh z=ARl!U;g5@{_ngt^E|!jw)KDe)U`af<%9eFMme{a?)S^&++MlgQr&ZV<@uKFy148A zzQo^&*YLO1<@_D=92LB7-70u(6}-O67}+X#Z56y;$`!n}%3WLKE{gnYmAj|_^a$;+ zRqo<>FaM9TRqowi-HAJqX;ekG$G zkMb}%K8g{Q2P#l`m(u4e$2D@8^*^beOpD5wb$A$i)awV-b)(Nus4+gH){`ul*8imM z+2^jy6Y);2E3m^7b^i)?#5L-3HJH}_r1$BFYmWCmKcMo1Bd+-;)az%2wGPmlf1)0b z@`E|9`7ccCf6{d&v97OdZ5!L#&h~b&Bi_&JCp+V%dVinKsK=Am|D?|uiS>R3s=rE1 z>wi*z)x^g*-(Xt*lRkGxtaj;9KiA-RL_*g8r2d*w?YZD#%&5nspF4M5o`^bMp!%ys z^;d;y{ZDGghFJG)QT^4S`m0C1e!v~^i27U;ru9GRbqlfjE2AEd&gZE9im3i7aEB$r zS_epRO|1TEP@lWSwEibu*Zcaxj&`!MU2NuhJh_cna^C{)#S$OH3Xfuqa7G=VBg7rY zWseWzfNA|tx_W>0ptpoHlR>bO`8r44yYMiycuEQO1kGju*x^DFG z2?<&Mlg7(}hln%k@o2o{xFe3ZzCWh*Kk0Q9vBpd7^9`zhT7tBpIKpLN_1EkOQTy=odjyZLC()u6wKe5`cbiJO+)~NPre7?m<-1&TO2OK#* zqV7MTUN`&vVl&s{$!)ZSEp26M+t}82wzq>F?PO=W*v$2KavN=7OIz96Hnz2$?d@Pk zJK5PTHgi3m+(uj2(pI*%jcsjbdpp?CPIk77&0LQsx6u~1w3V%GV_VzV-VS!Olb!8i zGuP$GZM20gZDniQ*w%Kow*#j2KWQ9KK0c%7qXjh|Wz^%*_|5ScMojB}(mYZUYur`{ zYaJlXM-8#&qZak=q(hDK-q#JdBOX!n(S*8g_VEP?S^tyfqZ|(rM_hmZ;f}b(_5Cre z|4FZFh&3OzKHs6{qaI7IxcK!D_f)5xxuvlC(T!#&-ZpfwcChl_sPd+)V#Ey?vuGLPma1S zIxbM-qQtfReZ01fZEa_JJJ|7L%P!EfJuLpgJ{kX{M)JR@%m1G}iiC$t!mAjSuMV#XujOCI z>%!~98^RmIW#LWX&5WkEhReeh;cemV;T_?fArDuEcZGL{tHOK2d&B#})#2K3UAR8P za6`B;JVDLnTf=SP_VBUr@$iZ8$#6K_5k9k4A3A$I)P=12GqEegk6z?eKR1PQuln=s zRX^Wh_mWig=b;y2)sHsrx$DfYft{X$-0FWkcOedaqvzzG;`?p{e%|>%l^DN_6>j_S4IFKEnPVH73SChy4 z!CiZMw>ZyNqw;?Z>Um1*;~na`oAQJAaeP2MUr~Ng&tWFywtF+`InaW7?vjzG)A<|~ zM}##$sPB`P#Cl#<;bE*%uWx)^>+>DzxlfPZ<+=ftPa1K@@d;tg58jCjafccCx-~!G z{9QzSjsn;G01~eG!5V9ySAKAPK8R`um}-QSEzQW zQ9oDXxJANspAhv|PptMF@Gy?3*H6A~_W1?XUm1Bi^;eGSuZTO27YJ*9Q2kXAtG{a0 z{TpA`qCQuL>aQLN*ZiRRYxMaE)n7BJ9TwbS<~&`FiX*DO3e@K=QO_YOBwX`@vT@wn z&h~b&qn+%GC9hxbUd+hTJ%~9T#fY%x2W3fo1S?zP!^92hId6-)uCu)z>}V%E&UG^? z|F_`N#F_JTxsA5K!`!)aT%pEMjcUKf$6M4m>hOfxA2p5!Jcc7`98IWpol*U@AW$D5 zeU2Q}KM{5R0yWM`)O8i^utwddL0#ASc!z{*eo*6OAU=d6YP?LoZpQWfQR5|ZzE1f; zjhBczU!eM@^!beEyXuFUcx``FzqP1-=X=kIbGZDC7W+1fU! z@!2}=Y;OlUGw-V%Ct{7`8Q1_I9wNo$PEEn>kOH+h_}0+RE0pv90ZFZwEWt$}(gCIZv0{XbW4~%GS2At?g`Y2Rquy&UUex^LDw7 zwy>qGY;7CVeAJ@GY3JiTYCalJ^U;VJzY`wA88sg*sCgtKPp5I4J6{)3^J0OTk4n`2 zE7Ulz5!U?R4qIZ~r}K3^>iFR6M$~*X;USz+^U;F3E+b#JzCUU{ipb%0pAgMQrO#KW z`Kb1JqGY;7Cc+RpZNu%n$& z^VRHlv6=IBxsA@-6{z{DM9o)~&)2p=wOfm8|ND54nwJJte~msqp{|=9FQ{>mk-uBp z-+8?1yD`Kl&kdc6gG^+S%XYKRd(s`|yYG$8aM2Df~J7g}py6 zRK9P&Jw#sUo*t*~*>UEM9p4OH_*VEfRSHh-F7mlE_7^!j!*}McCl@l`r`=0_@;}J; zsfNP-`+R)uS^Io^DttP8o;nb_y?fXV=JCBd*nQ=*?7#BkJ?+4veLn6C7jK^r2KV;g z)&g4#Y%Q?0z}5m=3v4a0wZPT_TMKM0u(iO}0$U4gEwHt~)&g4#Y%Q?0z$>-|{tJXk Bos|Fp diff --git a/attic/TeamNexuiz/game/Nexuiz.opt b/attic/TeamNexuiz/game/Nexuiz.opt deleted file mode 100644 index f5b0e77b57537f9c304a6379ffd16740b623e925..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70656 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 NU_dY+82ExR@c#o0w{`#k diff --git a/attic/TeamNexuiz/game/fteqccgui.exe b/attic/TeamNexuiz/game/fteqccgui.exe deleted file mode 100644 index 9bace9fcd48128fcb61f3a28c22a6d89dbd44d7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233472 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≶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 diff --git a/attic/TeamNexuiz/game/gamec/GameC.dsp b/attic/TeamNexuiz/game/gamec/GameC.dsp deleted file mode 100644 index 480a301ec..000000000 --- a/attic/TeamNexuiz/game/gamec/GameC.dsp +++ /dev/null @@ -1,521 +0,0 @@ -# Microsoft Developer Studio Project File - Name="Game code" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=Game code - 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 "GameC.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 "GameC.mak" CFG="Game code - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Game code - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "Game code - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Game code - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Game_code___Win32_Release" -# PROP BASE Intermediate_Dir "Game_code___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Game_code___Win32_Release" -# PROP Intermediate_Dir "Game_code___Win32_Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GAMECODE_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GAMECODE_EXPORTS" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x419 /d "NDEBUG" -# ADD RSC /l 0x419 /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 gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 - -!ELSEIF "$(CFG)" == "Game code - 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 Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GAMECODE_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GAMECODE_EXPORTS" /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x419 /d "_DEBUG" -# ADD RSC /l 0x419 /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 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 - -!ENDIF - -# Begin Target - -# Name "Game code - Win32 Release" -# Name "Game code - Win32 Debug" -# Begin Group "Header Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\builtins.h -# End Source File -# Begin Source File - -SOURCE=.\constants.h -# End Source File -# Begin Source File - -SOURCE=.\defs.h -# End Source File -# Begin Source File - -SOURCE=.\extensions.h -# End Source File -# Begin Source File - -SOURCE=.\sys.h -# End Source File -# End Group -# Begin Group "Source Files" - -# PROP Default_Filter "" -# Begin Group "client" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\cl_client.c -# End Source File -# Begin Source File - -SOURCE=.\cl_impulse.c -# End Source File -# Begin Source File - -SOURCE=.\cl_physics.c -# End Source File -# Begin Source File - -SOURCE=.\cl_player.c -# End Source File -# Begin Source File - -SOURCE=.\mauvebot.c -# End Source File -# End Group -# Begin Group "server" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\sv_main.c -# End Source File -# Begin Source File - -SOURCE=.\sv_stats.c -# End Source File -# End Group -# Begin Group "map" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\t_fort.c -# End Source File -# Begin Source File - -SOURCE=.\t_halflife.c -# End Source File -# Begin Source File - -SOURCE=.\t_items.c -# End Source File -# Begin Source File - -SOURCE=.\t_jumppads.c -# End Source File -# Begin Source File - -SOURCE=.\t_plats.c -# End Source File -# Begin Source File - -SOURCE=.\t_quake.c -# End Source File -# Begin Source File - -SOURCE=.\t_quake3.c -# End Source File -# Begin Source File - -SOURCE=.\t_teleporters.c -# End Source File -# End Group -# Begin Group "game" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\ctf.c -# End Source File -# Begin Source File - -SOURCE=.\domination.c -# End Source File -# Begin Source File - -SOURCE=.\g_casings.c -# End Source File -# Begin Source File - -SOURCE=.\g_damage.c -# End Source File -# Begin Source File - -SOURCE=.\g_decors.c -# End Source File -# Begin Source File - -SOURCE=.\g_lights.c -# End Source File -# Begin Source File - -SOURCE=.\g_subs.c -# End Source File -# Begin Source File - -SOURCE=.\g_tetris.c -# End Source File -# Begin Source File - -SOURCE=.\g_triggers.c -# End Source File -# Begin Source File - -SOURCE=.\g_violence.c -# End Source File -# Begin Source File - -SOURCE=.\g_world.c -# End Source File -# End Group -# Begin Group "class" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\civilian.c -# End Source File -# Begin Source File - -SOURCE=.\class.c -# End Source File -# Begin Source File - -SOURCE=.\engineer.c -# End Source File -# Begin Source File - -SOURCE=.\medic.c -# End Source File -# Begin Source File - -SOURCE=.\pyro.c -# End Source File -# Begin Source File - -SOURCE=.\scout.c -# End Source File -# Begin Source File - -SOURCE=.\soldier.c -# End Source File -# Begin Source File - -SOURCE=.\spy.c -# End Source File -# End Group -# Begin Group "weapons" - -# PROP Default_Filter "" -# Begin Group "pyro" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\w_bombletts.c -# End Source File -# Begin Source File - -SOURCE=.\w_flamer.c -# End Source File -# Begin Source File - -SOURCE=.\w_hotbombs.c -# End Source File -# Begin Source File - -SOURCE=.\w_incendiary_r.c -# End Source File -# End Group -# Begin Group "scout" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\w_hook.c -# End Source File -# Begin Source File - -SOURCE=.\w_setrope.c -# End Source File -# End Group -# Begin Group "soldier" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\tf_w_proxi.c -# End Source File -# Begin Source File - -SOURCE=.\w_electro.c -# End Source File -# Begin Source File - -SOURCE=.\w_namek.c -# End Source File -# Begin Source File - -SOURCE=.\w_rocketlauncher.c -# End Source File -# Begin Source File - -SOURCE=.\w_shotgun.c -# End Source File -# End Group -# Begin Group "spy" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\tf_w_mac10.c -# End Source File -# Begin Source File - -SOURCE=.\w_laser.c -# End Source File -# End Group -# Begin Group "medic" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\w_healgun.c -# End Source File -# Begin Source File - -SOURCE=.\w_uzi.c -# End Source File -# End Group -# Begin Group "engineer" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\tf_w_railgun.c -# End Source File -# Begin Source File - -SOURCE=.\tfextractor.c -# End Source File -# Begin Source File - -SOURCE=.\tfsentry.c -# End Source File -# Begin Source File - -SOURCE=.\tftesla.c -# End Source File -# Begin Source File - -SOURCE=.\w_crylink.c -# End Source File -# End Group -# Begin Group "unused" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\cl_weaponanimations.c -# End Source File -# Begin Source File - -SOURCE=.\w_grenadelauncher.c -# End Source File -# Begin Source File - -SOURCE=.\w_hagar.c -# End Source File -# Begin Source File - -SOURCE=.\w_nex.c -# End Source File -# End Group -# Begin Source File - -SOURCE=.\cl_weapons.c -# End Source File -# Begin Source File - -SOURCE=.\cl_weaponsystem.c -# End Source File -# Begin Source File - -SOURCE=.\tf_w_pistol.c -# End Source File -# Begin Source File - -SOURCE=.\w_common.c -# End Source File -# Begin Source File - -SOURCE=.\w_grenades.c -# End Source File -# End Group -# Begin Group "TF map items" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\tf_ball.c -# End Source File -# Begin Source File - -SOURCE=.\tfbuttons.c -# End Source File -# Begin Source File - -SOURCE=.\tfdoors.c -# End Source File -# Begin Source File - -SOURCE=.\tfitems.c -# End Source File -# Begin Source File - -SOURCE=.\tfmapitems.c -# End Source File -# Begin Source File - -SOURCE=.\tfplats.c -# End Source File -# Begin Source File - -SOURCE=.\tfq3fitems.c -# End Source File -# Begin Source File - -SOURCE=.\tn_misc.c -# End Source File -# End Group -# Begin Group "TF combat" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\tfai.c -# End Source File -# Begin Source File - -SOURCE=.\tfcombat.c -# End Source File -# End Group -# Begin Group "TF Defs&Functs" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\tf_constants.c -# End Source File -# Begin Source File - -SOURCE=.\tfdefs.c -# End Source File -# Begin Source File - -SOURCE=.\tffunctions.c -# End Source File -# Begin Source File - -SOURCE=.\tfmenus.c -# End Source File -# Begin Source File - -SOURCE=.\tn_clientcommands.c -# End Source File -# End Group -# Begin Group "TF Client" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\tfclient.c -# End Source File -# Begin Source File - -SOURCE=.\tfhud.c -# End Source File -# End Group -# Begin Group "TF Weaponry" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\tfgrenades.c -# End Source File -# End Group -# End Group -# Begin Source File - -SOURCE=..\progs.src -# End Source File -# Begin Source File - -SOURCE=..\todo.txt -# End Source File -# End Target -# End Project diff --git a/attic/TeamNexuiz/game/gamec/GameC.dsw b/attic/TeamNexuiz/game/gamec/GameC.dsw deleted file mode 100644 index fb12d9365..000000000 --- a/attic/TeamNexuiz/game/gamec/GameC.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "Game code"=.\GameC.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/attic/TeamNexuiz/game/gamec/GameC.ncb b/attic/TeamNexuiz/game/gamec/GameC.ncb deleted file mode 100644 index e4a081aa243889ffbd5bf0c9a9c049a2c4eb2767..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107520 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 F{2!pI13dr$ diff --git a/attic/TeamNexuiz/game/gamec/GameC.plg b/attic/TeamNexuiz/game/gamec/GameC.plg deleted file mode 100644 index 2b05476e1..000000000 --- a/attic/TeamNexuiz/game/gamec/GameC.plg +++ /dev/null @@ -1,1015 +0,0 @@ - - -
    -

    Build Log

    -

    ---------------------Configuration: Game code - Win32 Debug-------------------- -

    -

    Command Lines

    -Creating temporary file "C:\DOCUME~1\User\LOCALS~1\Temp\RSP66.tmp" with contents -[ -/nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GAMECODE_EXPORTS" /Fp"Debug/GameC.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weapons.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\sv_main.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ed.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_fight.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_maps.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_misc.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_move.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_phys.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_way.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\ctf.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\domination.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\g_casings.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\g_damage.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\g_decors.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\g_lights.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\g_subs.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\g_tetris.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\g_triggers.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\g_violence.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\g_world.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\t_halflife.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\t_items.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\t_jumppads.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\t_plats.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\t_quake.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\t_quake3.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\t_teleporters.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_bombletts.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_common.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_crylink.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_electro.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_flamer.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_grenadelauncher.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_hagar.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_incendiary_r.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_laser.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_nex.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_rocketlauncher.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_shotgun.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_uzi.c" -"C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\w_hotbombs.c" -] -Creating command line "cl.exe @C:\DOCUME~1\User\LOCALS~1\Temp\RSP66.tmp" -Creating temporary file "C:\DOCUME~1\User\LOCALS~1\Temp\RSP67.tmp" with contents -[ -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 /incremental:yes /pdb:"Debug/GameC.pdb" /debug /machine:I386 /out:"Debug/GameC.dll" /implib:"Debug/GameC.lib" /pdbtype:sept -.\Debug\class.obj -.\Debug\engineer.obj -.\Debug\medic.obj -.\Debug\pyro.obj -.\Debug\scout.obj -.\Debug\soldier.obj -.\Debug\spy.obj -.\Debug\cl_client.obj -.\Debug\cl_impulse.obj -.\Debug\cl_physics.obj -.\Debug\cl_player.obj -.\Debug\cl_weaponanimations.obj -.\Debug\cl_weapons.obj -.\Debug\cl_weaponsystem.obj -.\Debug\sv_main.obj -.\Debug\sv_stats.obj -.\Debug\bot.obj -.\Debug\bot_ai.obj -.\Debug\bot_ed.obj -.\Debug\bot_fight.obj -.\Debug\bot_maps.obj -.\Debug\bot_misc.obj -.\Debug\bot_move.obj -.\Debug\bot_phys.obj -.\Debug\bot_way.obj -.\Debug\ctf.obj -.\Debug\domination.obj -.\Debug\g_casings.obj -.\Debug\g_damage.obj -.\Debug\g_decors.obj -.\Debug\g_lights.obj -.\Debug\g_subs.obj -.\Debug\g_tetris.obj -.\Debug\g_triggers.obj -.\Debug\g_violence.obj -.\Debug\g_world.obj -.\Debug\t_halflife.obj -.\Debug\t_items.obj -.\Debug\t_jumppads.obj -.\Debug\t_plats.obj -.\Debug\t_quake.obj -.\Debug\t_quake3.obj -.\Debug\t_teleporters.obj -.\Debug\w_bombletts.obj -.\Debug\w_common.obj -.\Debug\w_crylink.obj -.\Debug\w_electro.obj -.\Debug\w_flamer.obj -.\Debug\w_grenadelauncher.obj -.\Debug\w_hagar.obj -.\Debug\w_incendiary_r.obj -.\Debug\w_laser.obj -.\Debug\w_nex.obj -.\Debug\w_rocketlauncher.obj -.\Debug\w_shotgun.obj -.\Debug\w_uzi.obj -.\Debug\w_hotbombs.obj -] -Creating command line "link.exe @C:\DOCUME~1\User\LOCALS~1\Temp\RSP67.tmp" -

    Output Window

    -Compiling... -class.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(2) : error C2146: syntax error : missing ')' before identifier 'inflictor' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(2) : error C2081: 'entity' : name in formal parameter list illegal -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(2) : error C2061: syntax error : identifier 'inflictor' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(2) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(2) : error C2059: syntax error : ',' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(2) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(13) : error C2061: syntax error : identifier 'NameOfClass' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(13) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(13) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(48) : warning C4013: 'substring' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(48) : error C2065: 'self' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(48) : error C2224: left of '.playermodel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(49) : warning C4047: '==' : 'int ' differs in levels of indirection from 'char [6]' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(50) : error C2065: 'CLASS_SCOUT' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(50) : warning C4244: 'return' : conversion from 'int ' to 'float ', possible loss of data -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(51) : error C2224: left of '.playermodel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(52) : warning C4047: '==' : 'int ' differs in levels of indirection from 'char [4]' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(53) : error C2065: 'CLASS_SPY' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(53) : warning C4244: 'return' : conversion from 'int ' to 'float ', possible loss of data -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(54) : error C2224: left of '.playermodel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(55) : warning C4047: '==' : 'int ' differs in levels of indirection from 'char [8]' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(56) : error C2065: 'CLASS_SOLDIER' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(56) : warning C4244: 'return' : conversion from 'int ' to 'float ', possible loss of data -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(57) : error C2224: left of '.playermodel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(58) : warning C4047: '==' : 'int ' differs in levels of indirection from 'char [5]' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(59) : error C2065: 'CLASS_PYRO' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(59) : warning C4244: 'return' : conversion from 'int ' to 'float ', possible loss of data -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(60) : error C2224: left of '.playermodel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(61) : warning C4047: '==' : 'int ' differs in levels of indirection from 'char [6]' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(62) : error C2065: 'CLASS_MEDIC' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(62) : warning C4244: 'return' : conversion from 'int ' to 'float ', possible loss of data -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(63) : error C2224: left of '.playermodel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(64) : warning C4047: '==' : 'int ' differs in levels of indirection from 'char [9]' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(65) : error C2065: 'CLASS_ENGINEER' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(65) : warning C4244: 'return' : conversion from 'int ' to 'float ', possible loss of data -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(82) : warning C4013: 'bprint' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(82) : error C2224: left of '.netname' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(82) : warning C4013: 'NameOfClass' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(82) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(89) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(89) : error C2224: left of '.max_health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(90) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(90) : error C2224: left of '.max_health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(98) : error C2224: left of '.armorvalue' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(98) : error C2224: left of '.max_armor' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(99) : error C2224: left of '.armorvalue' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(99) : error C2224: left of '.max_armor' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(107) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(108) : warning C4013: 'BecomeScout' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(110) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(111) : warning C4013: 'BecomeSpy' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(113) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(114) : warning C4013: 'BecomeSoldier' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(116) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(117) : warning C4013: 'BecomePyro' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(119) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(120) : warning C4013: 'BecomeMedic' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(122) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(123) : warning C4013: 'BecomeEngineer' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(127) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(127) : warning C4013: 'ceil' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(127) : error C2224: left of '.max_health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(129) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(129) : error C2224: left of '.max_health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(132) : error C2224: left of '.armorvalue' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(132) : error C2224: left of '.max_armor' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(134) : error C2224: left of '.armorvalue' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(134) : error C2224: left of '.max_armor' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(141) : error C2146: syntax error : missing ')' before identifier 'pl' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(141) : error C2061: syntax error : identifier 'pl' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(141) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(141) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(142) : error C2449: found '{' at file scope (missing function header?) -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(178) : error C2059: syntax error : '}' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(254) : error C2146: syntax error : missing ')' before identifier 'pl' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(254) : error C2061: syntax error : identifier 'pl' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(254) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(254) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(255) : error C2449: found '{' at file scope (missing function header?) -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(262) : error C2059: syntax error : '}' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(282) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(287) : error C2224: left of '.playermodel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(287) : error C2224: left of '.mdl' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(293) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(295) : error C2224: left of '.change_mdl_on_respawn' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(296) : error C2224: left of '.change_mdl_on_respawn' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(306) : warning C4013: 'cvar' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(308) : error C2224: left of '.playermodel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(308) : error C2224: left of '.mdl' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(309) : warning C4013: 'ResetPlayerModel' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(324) : error C2224: left of '.change_mdl_on_respawn' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(324) : error C2224: left of '.playermodel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(325) : error C2224: left of '.change_mdl_on_respawn' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(325) : warning C4013: 'strzone' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(325) : error C2224: left of '.change_mdl_on_respawn' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(326) : error C2224: left of '.playermodel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(326) : error C2224: left of '.model' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(327) : warning C4013: 'sprint' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(335) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(336) : warning C4013: 'SpyDecloak' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(338) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(346) : warning C4013: 'PlayerKilled' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(346) : error C2065: 'TRUE' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(346) : error C2065: 'world' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(346) : error C2065: 'DEATH_CLASSCHANGE' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(346) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(346) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(347) : warning C4013: 'respawn' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(352) : warning C4244: 'function' : conversion from 'int ' to 'float ', possible loss of data -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(352) : warning C4244: 'function' : conversion from 'int ' to 'float ', possible loss of data -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(358) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(359) : warning C4013: 'ScoutSpecial' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(360) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(361) : warning C4013: 'SpySpecial' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(362) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(363) : warning C4013: 'SoldierSpecial' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(364) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(365) : warning C4013: 'PyroSpecial' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(366) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(367) : warning C4013: 'MedicSpecial' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(368) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(369) : warning C4013: 'EngineerSpecial' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(374) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(375) : warning C4013: 'ScoutPreThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(376) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(377) : warning C4013: 'SpyPreThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(378) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(379) : warning C4013: 'SoldierPreThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(380) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(381) : warning C4013: 'PyroPreThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(382) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(383) : warning C4013: 'MedicPreThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(384) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(385) : warning C4013: 'EngineerPreThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(390) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(391) : warning C4013: 'ScoutPostThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(392) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(393) : warning C4013: 'SpyPostThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(394) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(395) : warning C4013: 'SoldierPostThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(396) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(397) : warning C4013: 'PyroPostThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(398) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(399) : warning C4013: 'MedicPostThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(400) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\class.c(401) : warning C4013: 'EngineerPostThink' undefined; assuming extern returning int -engineer.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(3) : warning C4013: 'sprint' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(3) : error C2065: 'self' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(16) : error C2224: left of '.max_health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(16) : warning C4013: 'cvar' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(18) : error C2224: left of '.max_armor' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(20) : error C2224: left of '.mass' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(22) : warning C4013: 'SetPlayerSpeed' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(24) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(24) : error C2065: 'IT_WEP1' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(24) : error C2065: 'IT_WEP2' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(24) : error C2065: 'IT_WEP3' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(24) : error C2065: 'IT_WEP4' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(25) : error C2224: left of '.switchweapon' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(26) : error C2224: left of '.ammo_shells' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(26) : warning C4013: 'floor' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(27) : error C2224: left of '.ammo_nails' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(28) : error C2224: left of '.ammo_rockets' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\engineer.c(29) : error C2224: left of '.ammo_cells' must have struct/union type -medic.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(3) : warning C4013: 'sprint' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(3) : error C2065: 'self' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(16) : error C2224: left of '.max_health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(16) : warning C4013: 'cvar' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(18) : error C2224: left of '.max_armor' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(20) : error C2224: left of '.mass' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(22) : warning C4013: 'SetPlayerSpeed' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(24) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(24) : error C2065: 'IT_WEP1' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(24) : error C2065: 'IT_WEP2' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(24) : error C2065: 'IT_WEP3' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(24) : error C2065: 'IT_WEP4' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(25) : error C2224: left of '.switchweapon' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(26) : error C2224: left of '.ammo_shells' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(26) : warning C4013: 'floor' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(27) : error C2224: left of '.ammo_nails' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(28) : error C2224: left of '.ammo_rockets' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\medic.c(29) : error C2224: left of '.ammo_cells' must have struct/union type -pyro.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(3) : warning C4013: 'sprint' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(3) : error C2065: 'self' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(16) : error C2224: left of '.max_health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(16) : warning C4013: 'cvar' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(18) : error C2224: left of '.max_armor' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(20) : error C2224: left of '.mass' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(22) : warning C4013: 'SetPlayerSpeed' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(24) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(24) : error C2065: 'IT_WEP1' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(24) : error C2065: 'IT_WEP2' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(24) : error C2065: 'IT_WEP3' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(24) : error C2065: 'IT_WEP4' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(25) : error C2224: left of '.switchweapon' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(26) : error C2224: left of '.ammo_shells' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(26) : warning C4013: 'floor' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(27) : error C2224: left of '.ammo_nails' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(28) : error C2224: left of '.ammo_rockets' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\pyro.c(29) : error C2224: left of '.ammo_cells' must have struct/union type -scout.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(3) : warning C4013: 'sprint' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(3) : error C2065: 'self' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(16) : error C2224: left of '.max_health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(16) : warning C4013: 'cvar' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(18) : error C2224: left of '.max_armor' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(20) : error C2224: left of '.mass' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(22) : warning C4013: 'SetPlayerSpeed' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(24) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(24) : error C2065: 'IT_WEP1' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(24) : error C2065: 'IT_WEP2' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(24) : error C2065: 'IT_WEP3' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(24) : error C2065: 'IT_WEP4' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(25) : error C2224: left of '.switchweapon' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(26) : error C2224: left of '.ammo_shells' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(26) : warning C4013: 'floor' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(27) : error C2224: left of '.ammo_nails' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(28) : error C2224: left of '.ammo_rockets' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\scout.c(29) : error C2224: left of '.ammo_cells' must have struct/union type -soldier.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(3) : warning C4013: 'sprint' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(3) : error C2065: 'self' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(16) : error C2224: left of '.max_health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(16) : warning C4013: 'cvar' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(18) : error C2224: left of '.max_armor' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(20) : error C2224: left of '.mass' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(22) : warning C4013: 'SetPlayerSpeed' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(24) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(24) : error C2065: 'IT_WEP1' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(24) : error C2065: 'IT_WEP2' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(24) : error C2065: 'IT_WEP3' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(24) : error C2065: 'IT_WEP4' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(25) : error C2224: left of '.switchweapon' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(26) : error C2224: left of '.ammo_shells' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(26) : warning C4013: 'floor' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(27) : error C2224: left of '.ammo_nails' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(28) : error C2224: left of '.ammo_rockets' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\soldier.c(29) : error C2224: left of '.ammo_cells' must have struct/union type -spy.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(4) : error C2065: 'self' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(4) : error C2224: left of '.special_active' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(6) : error C2224: left of '.special_active' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(7) : warning C4013: 'ResetPlayerModel' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(8) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(9) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(11) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(16) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(18) : warning C4013: 'sprint' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(22) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(22) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(24) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(26) : error C2224: left of '.special_active' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(27) : error C2224: left of '.special_time' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(27) : error C2065: 'time' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(32) : error C2224: left of '.special_active' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(42) : error C2065: 'local' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(42) : error C2146: syntax error : missing ';' before identifier 'vector' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(42) : error C2065: 'vector' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(42) : error C2146: syntax error : missing ';' before identifier 'm1' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(42) : error C2065: 'm1' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(42) : error C2065: 'm2' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(43) : error C2224: left of '.special_active' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(45) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(49) : error C2224: left of '.model' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(49) : error C2224: left of '.special_time' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(51) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(51) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(52) : error C2224: left of '.weaponentity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(52) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(53) : error C2224: left of '.special_time' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(54) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(56) : error C2224: left of '.mins' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(57) : error C2224: left of '.maxs' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(58) : warning C4013: 'setmodel' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(59) : warning C4013: 'setsize' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(60) : error C2224: left of '.special_time' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(63) : error C2224: left of '.special_time' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(65) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(65) : error C2224: left of '.weaponentity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(66) : error C2224: left of '.special_time' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(69) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(69) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(70) : error C2224: left of '.armorvalue' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(71) : error C2224: left of '.armorvalue' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(71) : error C2224: left of '.armorvalue' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(76) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(76) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(78) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(78) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(79) : error C2224: left of '.weaponentity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(79) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(80) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(81) : error C2224: left of '.alpha' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(84) : error C2224: left of '.weaponentity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(87) : error C2224: left of '.exteriorweaponentity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(87) : error C2224: left of '.weaponentity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(96) : error C2224: left of '.max_health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(96) : warning C4013: 'cvar' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(98) : error C2224: left of '.max_armor' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(100) : error C2224: left of '.mass' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(102) : warning C4013: 'SetPlayerSpeed' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(104) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(104) : error C2065: 'IT_WEP1' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(104) : error C2065: 'IT_WEP2' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(104) : error C2065: 'IT_WEP3' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(104) : error C2065: 'IT_WEP4' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(105) : error C2224: left of '.switchweapon' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(106) : error C2224: left of '.ammo_shells' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(106) : warning C4013: 'floor' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(107) : error C2224: left of '.ammo_nails' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(108) : error C2224: left of '.ammo_rockets' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\spy.c(109) : error C2224: left of '.ammo_cells' must have struct/union type -cl_client.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(3) : error C2065: 'self' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(3) : error C2224: left of '.classname' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(17) : error C2061: syntax error : identifier 'SelectSpawnPoint' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(17) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(17) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(65) : error C2061: syntax error : identifier 'CheckPlayerModel' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(65) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(65) : error C2146: syntax error : missing ')' before identifier 'playermodel' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(65) : error C2061: syntax error : identifier 'playermodel' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(65) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(65) : error C2449: found '{' at file scope (missing function header?) -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(72) : error C2059: syntax error : '}' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(136) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(137) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(138) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(139) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(154) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(185) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(224) : warning C4013: 'Damage' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(224) : error C2065: 'DEATH_KILL' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(224) : error C2224: left of '.origin' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(224) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(236) : warning C4013: 'ClientInRankings' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(237) : warning C4013: 'bprint' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(237) : error C2224: left of '.netname' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(239) : warning C4013: 'stuffcmd' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(239) : warning C4013: 'strcat' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(239) : error C2065: 'mapname' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(241) : warning C4013: 'ftos' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(241) : warning C4013: 'cvar' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(260) : warning C4013: 'ClientDisconnected' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(261) : error C2224: left of '.netname' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(265) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(266) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(267) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(275) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(275) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(282) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(294) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(294) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(301) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(306) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(307) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(308) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(309) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(310) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(311) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(312) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(324) : error C2224: left of '.waterlevel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(326) : error C2224: left of '.watertype' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(326) : error C2065: 'CONTENT_WATER' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(327) : error C2224: left of '.velocity_z' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(328) : error C2224: left of '.watertype' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(328) : error C2065: 'CONTENT_SLIME' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(329) : error C2224: left of '.velocity_z' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(331) : error C2224: left of '.velocity_z' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(335) : error C2224: left of '.jump_pad' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(339) : warning C4013: 'CapPlayerVelocity' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(339) : error C2224: left of '.speed' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(342) : error C2224: left of '.flags' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(342) : error C2065: 'FL_ONGROUND' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(345) : error C2224: left of '.flags' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(345) : error C2065: 'FL_JUMPRELEASED' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(348) : error C2224: left of '.velocity_z' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(348) : error C2224: left of '.velocity_z' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(350) : error C2224: left of '.flags' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(350) : error C2224: left of '.flags' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(351) : error C2224: left of '.flags' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(351) : error C2224: left of '.flags' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(354) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(355) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(371) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(402) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(410) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(429) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(461) : warning C4013: 'CopyBody' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(462) : warning C4013: 'PutClientInServer' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(467) : error C2224: left of '.effects' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(467) : error C2224: left of '.effects' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(467) : error C2224: left of '.effects' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(467) : error C2065: 'EF_RED' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(467) : error C2065: 'EF_BLUE' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(467) : error C2065: 'EF_ADDITIVE' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(467) : error C2065: 'EF_FULLBRIGHT' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(468) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(468) : error C2065: 'IT_STRENGTH' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(470) : error C2224: left of '.effects' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(470) : error C2224: left of '.effects' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(471) : error C2065: 'time' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(471) : error C2224: left of '.strength_finished' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(473) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(473) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(473) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(474) : warning C4013: 'sprint' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(479) : error C2224: left of '.strength_finished' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(481) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(481) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(485) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(485) : error C2065: 'IT_INVINCIBLE' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(487) : error C2224: left of '.effects' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(487) : error C2224: left of '.effects' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(488) : error C2224: left of '.invincible_finished' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(490) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(490) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(490) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(496) : error C2224: left of '.invincible_finished' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(498) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(498) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(506) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(507) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(507) : warning C4013: 'bound' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(507) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(507) : error C2224: left of '.health' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(507) : error C2065: 'frametime' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_client.c(507) : fatal error C1003: error count exceeds 100; stopping compilation -cl_impulse.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(12) : error C2065: 'self' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(12) : error C2224: left of '.think' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(13) : error C2224: left of '.nextthink' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(13) : error C2065: 'time' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(14) : warning C4013: 'SV_PlayerPhysics' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(15) : warning C4013: 'PlayerPreThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(17) : warning C4013: 'PlayerPostThink' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(22) : error C2224: left of '.impulse' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(22) : error C2224: left of '.impulse' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(23) : warning C4013: 'W_SwitchWeapon' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(23) : error C2224: left of '.impulse' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(24) : error C2224: left of '.impulse' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(25) : warning C4013: 'W_NextWeapon' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(26) : error C2224: left of '.impulse' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(27) : warning C4013: 'W_PreviousWeapon' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(28) : error C2224: left of '.impulse' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(28) : warning C4013: 'cvar' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(30) : warning C4013: 'makevectors' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(30) : error C2224: left of '.v_angle' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(31) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(31) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(31) : error C2065: 'v_forward' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(33) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(33) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(35) : error C2224: left of '.impulse' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(37) : error C2224: left of '.impulse' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(39) : error C2224: left of '.items' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(39) : error C2065: 'IT_WEP1' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(39) : error C2065: 'IT_WEP2' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(39) : error C2065: 'IT_WEP3' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(39) : error C2065: 'IT_WEP4' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(39) : error C2065: 'IT_WEP5' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(40) : error C2224: left of '.ammo_shells' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(41) : error C2224: left of '.ammo_nails' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(42) : error C2224: left of '.ammo_rockets' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(43) : error C2224: left of '.ammo_cells' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(46) : error C2224: left of '.impulse' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(48) : warning C4013: 'ClassSpecial' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(52) : error C2224: left of '.impulse' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(55) : warning C4013: 'sprint' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(56) : warning C4013: 'NameOfClass' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(56) : error C2224: left of '.class' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(58) : error C2224: left of '.playermodel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_impulse.c(62) : error C2224: left of '.impulse' must have struct/union type -cl_physics.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(7) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(8) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(9) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(11) : error C2061: syntax error : identifier 'HorizVelocity' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(11) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(11) : error C2146: syntax error : missing ')' before identifier 'vel' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(11) : error C2061: syntax error : identifier 'vel' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(11) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(12) : error C2449: found '{' at file scope (missing function header?) -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(15) : error C2059: syntax error : '}' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(35) : error C2065: 'local' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(35) : error C2146: syntax error : missing ';' before identifier 'vector' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(35) : error C2065: 'vector' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(35) : error C2146: syntax error : missing ';' before identifier 'wishvel' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(35) : error C2065: 'wishvel' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(35) : error C2065: 'wishdir' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(35) : error C2065: 'v' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(36) : error C2143: syntax error : missing ';' before 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(38) : error C2143: syntax error : missing ';' before 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(40) : error C2065: 'self' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(40) : error C2224: left of '.movetype' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(40) : error C2065: 'MOVETYPE_NONE' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(43) : error C2224: left of '.punchangle' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(43) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(45) : error C2065: 'f' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(45) : warning C4013: 'vlen' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(45) : error C2224: left of '.punchangle' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(45) : error C2065: 'frametime' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(47) : error C2224: left of '.punchangle' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(47) : warning C4013: 'normalize' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(47) : error C2224: left of '.punchangle' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(49) : error C2224: left of '.punchangle' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(49) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(52) : error C2224: left of '.punchvector' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(52) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(54) : error C2224: left of '.punchvector' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(56) : error C2224: left of '.punchvector' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(56) : error C2224: left of '.punchvector' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(58) : error C2224: left of '.punchvector' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(58) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(62) : error C2224: left of '.deadflag' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(66) : warning C4013: 'SetPlayerSpeed' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(67) : error C2065: 'classmaxspeed' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(67) : error C2224: left of '.speed' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(69) : warning C4244: '=' : conversion from 'float ' to 'int ', possible loss of data -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(72) : error C2065: 'classstopspeed' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(72) : error C2224: left of '.speed' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(74) : error C2224: left of '.fixangle' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(76) : error C2224: left of '.angles_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(77) : error C2224: left of '.angles_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(77) : error C2224: left of '.v_angle_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(78) : error C2224: left of '.angles_z' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(81) : error C2224: left of '.flags' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(81) : error C2065: 'FL_WATERJUMP' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(83) : error C2224: left of '.velocity_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(83) : error C2224: left of '.movedir_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(84) : error C2224: left of '.velocity_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(84) : error C2224: left of '.movedir_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(85) : error C2065: 'time' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(85) : error C2224: left of '.teleport_time' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(85) : error C2224: left of '.waterlevel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(87) : error C2224: left of '.flags' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(87) : error C2224: left of '.flags' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(87) : error C2224: left of '.flags' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(88) : error C2224: left of '.teleport_time' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(91) : error C2224: left of '.movetype' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(91) : error C2065: 'MOVETYPE_NOCLIP' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(91) : error C2224: left of '.movetype' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(91) : error C2065: 'MOVETYPE_FLY' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(94) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(94) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(95) : warning C4013: 'makevectors' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(95) : error C2224: left of '.v_angle' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(97) : error C2065: 'v_forward' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(97) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(97) : error C2065: 'v_right' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(97) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(97) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(97) : error C2224: left of '.movement_z' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(100) : error C2065: 'wishspeed' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(103) : error C2224: left of '.teleport_time' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(105) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(107) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(107) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(107) : warning C4013: 'min' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(110) : error C2224: left of '.waterlevel' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(113) : error C2224: left of '.v_angle' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(115) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(115) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(115) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(115) : error C2224: left of '.movement_z' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(116) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(117) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(123) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(126) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(126) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(129) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(131) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(131) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(132) : warning C4013: 'CapPlayerVelocity' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(134) : error C2224: left of '.ladder_time' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(137) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(137) : error C2224: left of '.velocity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(138) : error C2224: left of '.v_angle' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(140) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(140) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(140) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(140) : error C2224: left of '.movement_z' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(141) : error C2224: left of '.gravity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_physics.c(141) : fatal error C1003: error count exceeds 100; stopping compilation -cl_player.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(1) : error C2061: syntax error : identifier 'die1' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(1) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(1) : error C2061: syntax error : identifier 'draw' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(1) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(1) : error C2061: syntax error : identifier 'duckwalk' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(1) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(1) : error C2061: syntax error : identifier 'duckidle' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(1) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(2) : error C2061: syntax error : identifier '$frame' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(2) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(2) : error C2061: syntax error : identifier 'pain1' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(2) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(2) : error C2061: syntax error : identifier 'shoot' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(2) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(2) : error C2061: syntax error : identifier 'run' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(2) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(3) : error C2061: syntax error : identifier '$frame' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(3) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(3) : error C2061: syntax error : identifier 'straferight' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(3) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(3) : error C2061: syntax error : identifier 'dead2' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(3) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(4) : error C2061: syntax error : identifier '$frame' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(4) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(4) : error C2061: syntax error : identifier 'backright' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(4) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(17) : error C2054: expected '(' to follow 'backleft' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(18) : error C2085: 'CopyBody' : not in formal parameter list -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(18) : error C2143: syntax error : missing ';' before '{' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(60) : error C2065: 'self' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(60) : error C2224: left of '.deadflag' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(60) : error C2065: 'DEAD_NO' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(62) : error C2065: 'time' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(62) : error C2224: left of '.dead_time' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(64) : error C2224: left of '.maxs_z' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(65) : warning C4013: 'setsize' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(65) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(65) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(66) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(66) : error C2224: left of '.dead_frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(69) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(69) : error C2224: left of '.die_frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(74) : error C2224: left of '.crouch' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(76) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(76) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(76) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(76) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(77) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(77) : error C2065: '$duckwalk' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(79) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(79) : error C2065: '$duckidle' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(81) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(81) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(81) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(81) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(83) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(83) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(84) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(84) : error C2065: '$run' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(85) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(85) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(86) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(86) : error C2065: '$runbackwards' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(87) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(87) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(88) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(88) : error C2065: '$straferight' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(89) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(89) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(90) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(90) : error C2065: '$strafeleft' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(91) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(91) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(92) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(92) : error C2065: '$forwardright' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(93) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(93) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(94) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(94) : error C2065: '$forwardleft' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(95) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(95) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(96) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(96) : error C2065: '$backright' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(97) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(97) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(98) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(98) : error C2065: '$backleft' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(100) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(102) : error C2224: left of '.pain_finished' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(103) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(103) : error C2224: left of '.pain_frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(104) : error C2224: left of '.attack_finished' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(105) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(105) : error C2065: '$shoot' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(107) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(107) : error C2065: '$idle' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(109) : error C2224: left of '.flags' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(109) : error C2065: 'FL_ONGROUND' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(110) : error C2224: left of '.frame' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(110) : error C2065: '$jump' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(114) : error C2146: syntax error : missing ')' before identifier 'org' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(114) : error C2061: syntax error : identifier 'org' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_player.c(114) : fatal error C1003: error count exceeds 100; stopping compilation -cl_weaponanimations.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(1) : error C2061: syntax error : identifier 'fire' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(1) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(1) : error C2061: syntax error : identifier 'idle' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(1) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(4) : error C2054: expected '(' to follow 'run' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(4) : error C2085: 'WFRAME_FIRE1' : not in formal parameter list -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(4) : error C2143: syntax error : missing ';' before '=' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(14) : error C2065: 'self' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(14) : error C2224: left of '.attack_finished' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(14) : error C2065: 'time' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(15) : error C2224: left of '.weaponframe' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(15) : error C2065: '$fire' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(16) : error C2224: left of '.movement_x' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(16) : error C2224: left of '.movement_y' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(17) : error C2224: left of '.weaponframe' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(17) : error C2065: '$run' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(19) : error C2224: left of '.weaponframe' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(19) : error C2065: '$idle' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(23) : error C2224: left of '.weaponentity' must have struct/union type -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponanimations.c(24) : error C2224: left of '.weaponentity' must have struct/union type -cl_weapons.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weapons.c(4) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weapons.c(102) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weapons.c(117) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weapons.c(139) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weapons.c(161) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weapons.c(285) : error C2015: too many characters in constant -cl_weaponsystem.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(10) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(22) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(57) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(69) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(70) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(80) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(81) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(87) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(102) : error C2146: syntax error : missing ')' before identifier 'cl' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(102) : error C2061: syntax error : identifier 'cl' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(102) : error C2059: syntax error : ',' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(102) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(129) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(142) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(149) : error C2146: syntax error : missing ')' before identifier 'e' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(149) : error C2061: syntax error : identifier 'e' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(149) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(150) : error C2054: expected '(' to follow 'w_getbestweapon' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(169) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(197) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(205) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(235) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(258) : error C2146: syntax error : missing ')' before identifier 'ent' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(258) : error C2061: syntax error : identifier 'ent' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(258) : error C2059: syntax error : ',' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(258) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(260) : error C2015: too many characters in constant -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(266) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\cl_weaponsystem.c(276) : error C2059: syntax error : 'type' -sv_main.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\sv_main.c(10) : error C2065: 'sv_maxspeed' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\sv_main.c(10) : warning C4013: 'cvar' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\sv_main.c(11) : error C2065: 'sv_friction' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\sv_main.c(12) : error C2065: 'sv_accelerate' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\sv_main.c(13) : error C2065: 'sv_stopspeed' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\sv_main.c(14) : error C2065: 'teamplay' : undeclared identifier -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\sv_main.c(16) : warning C4013: 'BotFrame' undefined; assuming extern returning int -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\sv_main.c(17) : warning C4013: 'CheckRules_World' undefined; assuming extern returning int -bot.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(88) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(107) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(108) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(109) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(110) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(111) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(112) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(113) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(114) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(115) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(116) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(117) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(118) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(119) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(120) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(121) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(123) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(124) : error C2059: syntax error : '.' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(198) : error C2061: syntax error : identifier 'fixer' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(198) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(199) : error C2061: syntax error : identifier 'route_table' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(199) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(200) : error C2061: syntax error : identifier 'b_temp1' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(200) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(200) : error C2059: syntax error : ',' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(201) : error C2061: syntax error : identifier 'player_head' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(201) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(201) : error C2059: syntax error : ',' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(207) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(208) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(209) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(212) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(213) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(214) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(215) : error C2146: syntax error : missing ')' before identifier 'bot' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(215) : error C2061: syntax error : identifier 'bot' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(215) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(216) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(217) : error C2146: syntax error : missing ')' before identifier 'who' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(217) : error C2061: syntax error : identifier 'who' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(217) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(220) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(221) : error C2146: syntax error : missing ')' before identifier 'org' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(221) : error C2061: syntax error : identifier 'org' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(221) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(221) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(222) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(223) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(224) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(225) : error C2146: syntax error : missing ')' before identifier 'this' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(225) : error C2061: syntax error : identifier 'this' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(225) : error C2059: syntax error : ',' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(225) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(226) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(227) : error C2146: syntax error : missing ')' before identifier 'start' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(227) : error C2061: syntax error : identifier 'start' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(227) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(227) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(230) : error C2146: syntax error : missing ')' before identifier 'e' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(230) : error C2061: syntax error : identifier 'e' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(230) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(231) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(232) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(233) : error C2146: syntax error : missing ')' before identifier 'weird' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(233) : error C2061: syntax error : identifier 'weird' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(233) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(234) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(235) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(236) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(237) : error C2146: syntax error : missing ')' before identifier 'sdir' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(237) : error C2061: syntax error : identifier 'sdir' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(237) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(238) : error C2146: syntax error : missing ')' before identifier 'whichway' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(238) : error C2061: syntax error : identifier 'whichway' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(238) : error C2059: syntax error : ',' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(238) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(239) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(240) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(241) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(244) : error C2061: syntax error : identifier 'PickARandomName' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(244) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(245) : error C2146: syntax error : missing ')' before identifier 'targ' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(245) : error C2061: syntax error : identifier 'targ' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(245) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(246) : error C2059: syntax error : 'type' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(247) : error C2146: syntax error : missing ')' before identifier 'targ1' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(247) : error C2061: syntax error : identifier 'targ1' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(247) : error C2059: syntax error : ',' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(247) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(248) : error C2146: syntax error : missing ')' before identifier 'targ' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(248) : error C2061: syntax error : identifier 'targ' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(248) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(249) : error C2146: syntax error : missing ')' before identifier 'targ' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(249) : error C2061: syntax error : identifier 'targ' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(249) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(250) : error C2146: syntax error : missing ')' before identifier 'ent' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(250) : error C2061: syntax error : identifier 'ent' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(250) : error C2059: syntax error : ';' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(250) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(251) : error C2146: syntax error : missing ')' before identifier 'ent' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(251) : error C2061: syntax error : identifier 'ent' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot.c(251) : fatal error C1003: error count exceeds 100; stopping compilation -bot_ai.c -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(55) : error C2146: syntax error : missing ')' before identifier 'scot' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(55) : error C2061: syntax error : identifier 'scot' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(55) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(57) : error C2059: syntax error : 'if' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(59) : error C2059: syntax error : 'else' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(61) : error C2059: syntax error : 'else' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(63) : error C2059: syntax error : 'else' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(65) : error C2059: syntax error : 'else' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(67) : error C2059: syntax error : 'else' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(69) : error C2059: syntax error : '}' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(82) : error C2146: syntax error : missing ')' before identifier 'ent' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(82) : error C2061: syntax error : identifier 'ent' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(82) : error C2059: syntax error : ')' -C:\Games\Nexuiz\TeamNexuiz\src\game\gamec\bot_ai.c(84) : error C2059: syntax error : 'if' -cl.exe terminated at user request. - -
    - - diff --git a/attic/TeamNexuiz/game/gamec/Makefile b/attic/TeamNexuiz/game/gamec/Makefile deleted file mode 100644 index 37764fae7..000000000 --- a/attic/TeamNexuiz/game/gamec/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -../../data/progs.dat: *.nc *.qc bot/*.qc bot/maps/*.qc Makefile progs.src - frikqcc /O2 -warn 2 || true - -clean: - rm -f ../../data/progs.dat progdefs.h error.log diff --git a/attic/TeamNexuiz/game/gamec/bot.c b/attic/TeamNexuiz/game/gamec/bot.c deleted file mode 100644 index 537f359f3..000000000 --- a/attic/TeamNexuiz/game/gamec/bot.c +++ /dev/null @@ -1,1239 +0,0 @@ - -/* -====================================== -FrikBot X (Version 0.10.1) -====================================== - -This program is in the Public Domain. My crack legal -team would like to add: - -RYAN "FRIKAC" SMITH IS PROVIDING THIS SOFTWARE "AS IS" -AND MAKES NO WARRANTY, EXPRESS OR IMPLIED, AS TO THE -ACCURACY, CAPABILITY, EFFICIENCY, MERCHANTABILITY, OR -FUNCTIONING OF THIS SOFTWARE AND/OR DOCUMENTATION. IN -NO EVENT WILL RYAN "FRIKAC" SMITH BE LIABLE FOR ANY -GENERAL, CONSEQUENTIAL, INDIRECT, INCIDENTAL, -EXEMPLARY, OR SPECIAL DAMAGES, EVEN IF RYAN "FRIKAC" -SMITH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES, IRRESPECTIVE OF THE CAUSE OF SUCH DAMAGES. - -You accept this software on the condition that you -indemnify and hold harmless Ryan "FrikaC" Smith from -any and all liability or damages to third parties, -including attorney fees, court costs, and other -related costs and expenses, arising out of your use -of this software irrespective of the cause of said -liability. - -The export from the United States or the subsequent -reexport of this software is subject to compliance -with United States export control and munitions -control restrictions. You agree that in the event you -seek to export this software, you assume full -responsibility for obtaining all necessary export -licenses and approvals and for assuring compliance -with applicable reexport restrictions. - -Any reproduction of this software must contain -this notice in its entirety. - -====================================== -These installation instructions only apply to Normal Quake (as does this -entire file). For QuakeWorld, please refer to bot_qw.qc - --------------------------------------- -To install on a new mod, do all this: --------------------------------------- -Place all included bot*.qc files in the subdirectory "frikbot" -in your source folder, then... - -* Add the following lines to progs.src right after the defs.qc line -frikbot/bot.qc -frikbot/bot_way.qc -frikbot/bot_fight.qc -frikbot/bot_ai.qc -frikbot/bot_misc.qc -frikbot/bot_phys.qc -frikbot/bot_move.qc -frikbot/bot_ed.qc - --------------------------------------- -* Comment out the following functions in defs.qc -sound, stuffcmd, sprint, aim, centerprint, setspawnparms -WriteByte, WriteChar, WriteShort, WriteLong, WriteCoord -WriteAngle, WriteString, WriteEntity --------------------------------------- -* Add this to worldspawn() in world.qc, right at the very top, before InitBodyQue(); -BotInit(); // FrikBot --------------------------------------- -* add this line to StartFrame() in world.qc, at the very top -BotFrame(); // FrikBot --------------------------------------- -* Add these two lines to PlayerPreThink in client.qc at the very top -if (BotPreFrame()) // FrikBot - return; --------------------------------------- -* Add this line to PlayerPostThink in client.qc at the very top -if (BotPostFrame()) // FrikBot - return; --------------------------------------- -* Add the following line to the very top of Client Connect in client.qc -ClientInRankings(); // FrikBot --------------------------------------- -* Add these lines to the very top of ClientDisconnect in client.qc -ClientDisconnected(); // FrikBot --------------------------------------- -*/ - -void() bot_map_load = -{ - // place your qc loaded waypoints here - //if (mapname == "mattrye1_nex") - // map_mattrye1_nex(); -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Variables and shtuff - -bot.qc has become pretty much a header file -for all variable in the bot... - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -// ----- entity fields --- -.float wallhug, keys, oldkeys, ishuman; -.float b_frags, b_clientno, b_shirt, b_pants; -.float ai_time, b_sound, missile_speed; -.float portal_time, b_skill, switch_wallhug; -.float b_aiflags, b_num, b_chattime; -.float b_menu, b_menu_time, b_menu_value; -.float route_failed, dyn_flags, dyn_time; -.float dyn_plat; -.entity temp_way, last_way, phys_obj; -.entity target1, target2, target3, target4; -.entity _next, _last; -.entity current_way; -.vector b_angle, mouse_emu, obs_dir; -.vector movement, b_dir; -.vector dyn_dest; - -.float search_time; -.vector dest1, dest2; - -// --------defines----- -//float SVC_UPDATENAME = 13; -//float SVC_UPDATEFRAGS = 14; -//float SVC_UPDATECOLORS = 17; - -// used for the physics & movement AI -float KEY_MOVEUP = 1; -float KEY_MOVEDOWN = 2; -float KEY_MOVELEFT = 4; -float KEY_MOVERIGHT = 8; -float KEY_MOVEFORWARD = 16; -float KEY_MOVEBACK = 32; -float KEY_LOOKUP = 64; -float KEY_LOOKDOWN = 128; -float KEY_LOOKLEFT = 256; -float KEY_LOOKRIGHT = 512; - -// these are aiflags for waypoints -// some overlap to the bot -float AI_TELELINK_1 = 1; // link type -float AI_TELELINK_2 = 2; // link type -float AI_TELELINK_3 = 4; // link type -float AI_TELELINK_4 = 8; // link type -float AI_DOORFLAG = 16; // read ahead -float AI_PRECISION = 32; // read ahead + point -float AI_SURFACE = 64; // point -float AI_BLIND = 128; // read ahead + point -float AI_JUMP = 256; // point + ignore -float AI_DIRECTIONAL = 512; // read ahead + ignore -float AI_PLAT_BOTTOM = 1024; // read ahead -float AI_RIDE_TRAIN = 2048; // read ahead -float AI_SUPER_JUMP = 4096; // point + ignore + route test -float AI_SNIPER = 8192; // point type -float AI_AMBUSH = 16384; // point type -float AI_DOOR_NO_OPEN = 32768; // read ahead -float AI_DIFFICULT = 65536; // route test -float AI_TRACE_TEST = 131072; // route test -float AI_CARELESS = 262144; // Electro - jumppads, bot doesn't have to touch this entity, only get close - -// these are flags for bots/players (dynamic/editor flags) -float AI_OBSTRUCTED = 1; -float AI_HOLD_SELECT = 2; -float AI_ROUTE_FAILED = 2; -float AI_WAIT = 4; -float AI_DANGER = 8; - - -// addition masks -float AI_POINT_TYPES = 29152; -float AI_READAHEAD_TYPES = 36528; -float AI_IGNORE_TYPES = 4864; - -float WM_UNINIT = 0; -float WM_DYNAMIC = 1; -float WM_LOADING = 2; -float WM_LOADED = 3; -float WM_EDITOR = 4; -float WM_EDITOR_DYNAMIC = 5; -float WM_EDITOR_DYNLINK = 6; - - -float OPT_SAVEBOTS = 1; -float OPT_NOCHAT = 2; - -// -------globals----- -float active_clients; -float max_clients, real_frametime; -float bot_count, b_options; -float waypoint_mode, dump_mode; -float waypoints, direct_route; -float sv_friction, sv_gravity; -float sv_accelerate, sv_maxairspeed, sv_maxspeed, sv_stopspeed; -entity fixer; -entity route_table; -entity b_temp1, b_temp2, b_temp3; -entity player_head, phys_head, way_head; -float busy_waypoints; -float saved_bots, saved_skills1, saved_skills2, current_bots; - -// -------ProtoTypes------ -// external -void() ClientConnect; -void() ClientDisconnect; -void() SetNewParms; - -// rankings -float(float clientno) ClientBitFlag; -float() ClientNextAvailable; -void(float whichteam, float whatbot, float whatskill) BotConnect; -void(entity bot) BotDisconnect; -void(float clientno) BotInvalidClientNo; -void(entity who) UpdateClient; - -// waypointing -void() DynamicWaypoint; -entity(vector org) make_waypoint; -void() ClearAllWays; -void() FixWaypoints; -float() begin_route; -void(entity this, float direct) bot_get_path; -void() WaypointThink; -entity(entity start) FindWayPoint; - -// physics & movement -float(entity e) bot_can_rj; -void() bot_jump; -void() frik_bot_roam; -float(vector weird) frik_walkmove; -void() frik_movetogoal; -void() frik_obstacles; -float(float flag) frik_recognize_plat; -float(vector sdir) frik_KeysForDir; -void(vector whichway, float danger) frik_obstructed; -void() SV_Physics_Client; -void() SV_ClientThink; -void() CL_KeyMove; - -// ai & misc -string() PickARandomName; -float(entity targ) fov; -float(float y1, float y2) angcomp; -float(entity targ1, entity targ2) wisible; -float(entity targ) sisible; -float(entity targ) fisible; -vector(entity ent) realorigin; -void(entity ent) target_drop; -void(entity ent) target_add; -void() KickABot; -void() BotImpulses; -void(entity targ, float success) bot_lost; -string(float r) BotName; -float(float v) frik_anglemod; -//void() bot_chat; -void(float tpic) bot_start_topic; - - -// editor stuffs - -void() bot_way_edit; -void() bot_menu_display; - - -// ----------Commands--------- -void(entity e, float chan, string samp, float vol, float atten) frik_sound = #8; -void(entity client, string s) frik_stuffcmd = #21; -void(entity client, string s) frik_sprint = #24; -vector(entity e, float sped) frik_aim = #44; -void(entity client, string s) frik_centerprint = #73; -void(entity e) frik_setspawnparms = #78; -void(float to, float f) frik_WriteByte = #52; -void(float to, float f) frik_WriteChar = #53; -void(float to, float f) frik_WriteShort = #54; -void(float to, float f) frik_WriteLong = #55; -void(float to, float f) frik_WriteCoord = #56; -void(float to, float f) frik_WriteAngle = #57; -void(float to, string s) frik_WriteString = #58; -void(float to, entity s) frik_WriteEntity = #59; - -void(entity client, string s1, string s2, string s3, string s4, string s5, string s6, string s7) -frik_big_centerprint = #73; - -//---------------------------------------------------------------------------- - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Function redclarations. These allow function -designed to work for clients (sprint, so forth) -to mainly not complain when working with a bot - -Although these shouldn't be needed anymore, -as the bots truly are clients now, if you don't -stop the SZ_ buffer from filling up by disabling -direct messages to the bots, it crashes quake :-( - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ -void(entity client, string s) stuffcmd = -{ - if (client.ishuman == 1) - frik_stuffcmd(client, s); - b_temp1 = player_head; - - while(b_temp1) - { - if (b_temp1.classname == "botcam") - { - if ((b_temp1.enemy == client) && b_temp1.ishuman) - frik_stuffcmd(b_temp1, s); - } - b_temp1 = b_temp1._next; - } -}; - -void(entity e) setspawnparms = -{ - if (e.ishuman == 1) - frik_setspawnparms(e); - else - { - b_temp1 = player_head; - while(b_temp1) - { - if (b_temp1.ishuman) - { - frik_setspawnparms(b_temp1); - return; - } - b_temp1 = b_temp1._next; - } - SetNewParms(); - } -}; -void(entity client, string s) sprint = -{ - if (client.ishuman == 1) - frik_sprint(client, s); - b_temp1 = player_head; - - while(b_temp1) - { - if (b_temp1.classname == "botcam") - { - if ((b_temp1.enemy == client) && b_temp1.ishuman) - frik_sprint(b_temp1, s); - } - b_temp1 = b_temp1._next; - } - -}; -void(entity client, string s) centerprint = -{ - if (client.ishuman == 1) - frik_centerprint(client, s); - b_temp1 = player_head; - - while(b_temp1) - { - if (b_temp1.classname == "botcam") - { - if ((b_temp1.enemy == client) && b_temp1.ishuman) - frik_centerprint(b_temp1, s); - } - b_temp1 = b_temp1._next; - } -}; - -vector(entity e, float sped) aim = -{ - e.missile_speed = sped; - return frik_aim(e, sped); -}; - -void(entity e, float chan, string samp, float vol, float atten) sound = -{ - - frik_sound(e, chan, samp, vol, atten); - if (samp == "items/inv3.wav") - return; - else if (e.classname == "player") - e.b_sound = time + 1; - else if (other.classname == "player") - other.b_sound = time + 1; - -}; -void(float to, float f) WriteByte = -{ - if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE)) - return; - frik_WriteByte(to, f); -}; -void(float to, float f) WriteChar = -{ - if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE)) - return; - frik_WriteChar(to, f); -}; -void(float to, float f) WriteShort = -{ - if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE)) - return; - frik_WriteShort(to, f); -}; -void(float to, float f) WriteLong = -{ - if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE)) - return; - frik_WriteLong(to, f); -}; -void(float to, float f) WriteCoord = -{ - if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE)) - return; - frik_WriteCoord(to, f); -}; -void(float to, float f) WriteAngle = -{ - if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE)) - return; - frik_WriteAngle(to, f); -}; -void(float to, string s) WriteString = -{ - if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE)) - return; - frik_WriteString(to, s); -}; -void(float to, entity s) WriteEntity = -{ - if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE)) - return; - frik_WriteEntity(to, s); -}; -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Bot Cam, see what the bot sees (or any other player) - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -float() botcam = -{ - if (self.classname != "botcam") - return FALSE; - setorigin(self, self.enemy.origin); - self.items = self.enemy.items; - self.weapon = self.enemy.weapon; - self.weaponmodel = self.enemy.weaponmodel; - self.currentammo = self.enemy.currentammo; - self.weaponframe = self.enemy.weaponframe; - self.ammo_shells = self.enemy.ammo_shells; - self.ammo_nails = self.enemy.ammo_nails; - self.ammo_rockets= self.enemy.ammo_rockets; - self.ammo_cells = self.enemy.ammo_cells; - self.view_ofs = self.enemy.view_ofs; - self.health = self.enemy.health; - self.armorvalue = self.enemy.armorvalue; - self.dmg_take = self.enemy.dmg_take; - self.dmg_save = self.enemy.dmg_save; - self.dmg_inflictor = self.enemy.dmg_inflictor; - self.punchangle = self.enemy.punchangle; - self.deadflag = self.enemy.deadflag; - msg_entity = self; - WriteByte (MSG_ONE,5); - WriteEntity (MSG_ONE, self.enemy); - WriteByte (MSG_ONE, 10); - WriteAngle (MSG_ONE,self.enemy.v_angle_x); - WriteAngle (MSG_ONE,self.enemy.v_angle_y); - WriteAngle (MSG_ONE,self.enemy.v_angle_z); - self.modelindex = 0; - - self.impulse = 0; - return TRUE; - -}; - -void() botcam_u = -{ - - // sloppy cycling code - if (self.classname != "botcam") - { - self.enemy = player_head; - } - else - { - do - self.enemy = self.enemy._next; - while (self.enemy.classname == "botcam"); - } - if (self.enemy == self) - { - do - self.enemy = self.enemy._next; - while (self.enemy.classname == "botcam"); - } - - self.classname = "botcam"; - self.solid = SOLID_NOT; - self.movetype = MOVETYPE_NONE; - self.takedamage = DAMAGE_NO; - - - if (!self.enemy) - { - sprint(self, "No one left to track!\n"); - msg_entity = self; - WriteByte (MSG_ONE,5); - WriteEntity (MSG_ONE, self); - PutClientInServer(); - return; - } - if (!self.enemy.ishuman) - { - self.enemy.dmg_take = 0; - self.enemy.dmg_save = 0; - } - sprint(self, "Now tracking "); - sprint(self, self.enemy.netname); - sprint(self, "\n"); -}; - - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Stuff mentioned up top -it just links the bot into the mod - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() ClientFixRankings = -{ - local float cno; - if (self.switch_wallhug > time) - return; - self.switch_wallhug = 0; - - b_temp2 = nextent(world); - cno = 0; - - while (cno < max_clients) - { - if ((!b_temp2.ishuman) && (active_clients & ClientBitFlag(cno))) - UpdateClient(b_temp2); - cno = cno + 1; - b_temp2 = nextent(b_temp2); - } -}; - -void() ClientInRankings = -{ - local float cno; - if (player_head) - player_head._last = self; - - self._next = player_head; - self._last = world; - player_head = self; - - if (!self.phys_obj) - { - b_temp2 = phys_head; - while (b_temp2 != world && b_temp2.owner != self) - b_temp2 = b_temp2._next; - self.phys_obj = b_temp2; - } - - if (self.ishuman == 2) - { - self.ishuman = FALSE; - return; - } - cno = self.colormap - 1; - BotInvalidClientNo (cno); - active_clients = active_clients | ClientBitFlag(cno); - - self.b_clientno = cno; - self.ishuman = TRUE; - self.switch_wallhug = time + 1; -}; - - -void() ClientDisconnected = -{ - if (player_head == self) - player_head = self._next; - if (self._next) - self._next._last = self._last; - if (self._last) - self._last._next = self._next; - - active_clients = active_clients - active_clients & ClientBitFlag(self.b_clientno); -}; -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -BotPreFrame & BotPostFrame, used to make the -bot easier to install - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ -float () BotPreFrame = -{ - if (self.b_clientno == -1) - return TRUE; - if (self.ishuman) - { - if (self.switch_wallhug) - ClientFixRankings(); - if (self.classname == "botcam") - return TRUE; - } - if (self.b_frags != self.frags) - { - - if (self.b_frags > self.frags) - { - if (pointcontents(self.origin) == CONTENT_LAVA) - bot_start_topic(10); - else - bot_start_topic(9); - } - else - bot_start_topic(2); - self.b_frags = self.frags; - } - DynamicWaypoint(); - return FALSE; -}; -float () BotPostFrame = -{ - if (self.b_clientno == -1) - return TRUE; - if (self.ishuman) - { - - if (waypoint_mode > WM_LOADED) - bot_menu_display(); - - BotImpulses(); - - if (botcam()) - return TRUE; - } - return FALSE; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Bot Chat code - -The rest of this code is in bot_misc.qc - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ -void(string h) BotSay = // simulate talking by composing a 'chat' message -{ - WriteByte(MSG_ALL, 8); - WriteByte(MSG_ALL, 1); - WriteString(MSG_ALL, self.netname); - WriteByte(MSG_ALL, 8); - WriteByte(MSG_ALL, 2); - WriteString(MSG_ALL, h); -}; -void() BotSayInit = -{ - WriteByte(MSG_ALL, 8); - WriteByte(MSG_ALL, 1); - WriteString(MSG_ALL, self.netname); -}; -void(string h) BotSay2 = -{ - WriteByte(MSG_ALL, 8); - WriteByte(MSG_ALL, 2); - WriteString(MSG_ALL, h); -}; -void(string h) BotSayTeam = -{ - local entity t; - if (!teamplay) - return; - t = player_head; - while(t) - { - if (t.team == self.team) - { - msg_entity = t; - WriteByte(MSG_ONE, 8); - WriteByte(MSG_ONE, 1); - WriteByte(MSG_ONE, 40); - WriteString(MSG_ONE, self.netname); - WriteByte(MSG_ONE, 8); - WriteByte(MSG_ONE, 2); - WriteByte(MSG_ONE, 41); - WriteString(MSG_ONE, h); - } - t = t._next; - } -}; -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -BotInit - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - - -void() BotInit = -{ - local entity ent, fisent; - local float numents; - - // spawn entities for the physics - ent = nextent(world); - max_clients = 0; - - while(ent != world) - { - max_clients = max_clients + 1; - ent = nextent(ent); - } - if (max_clients > 16) - max_clients = 16; - - ent = nextent(world); - fisent = world; - while (numents < max_clients) - { - - phys_head = spawn(); - if (fisent) - fisent._next = phys_head; - phys_head._last = fisent; - fisent = phys_head; - ent.phys_obj = phys_head; - phys_head.classname = "phys_obj"; - phys_head.owner = ent; - numents = numents + 1; - ent = nextent(ent); - } - //precache_model("progs/s_light.spr"); // file missing from nexuiz - //precache_model("progs/s_bubble.spr"); // file missing from nexuiz - // the bots return! - b_options = cvar("saved1"); - if (coop || (b_options & OPT_SAVEBOTS)) - { - saved_bots = cvar("scratch1"); - saved_skills1 = cvar("scratch2"); - saved_skills2 = cvar("scratch3"); - } - cvar_set ("saved4", "0"); - if (max_clients > 1) - { - localcmd("exec maps/"); - localcmd(mapname); - localcmd(".way\n"); - waypoint_mode = WM_DYNAMIC; - bot_map_load(); - } - else - waypoint_mode = WM_LOADED; - -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Rankings 'utilities'. Written by Alan Kivlin, -this code just fools clients by sending precisely -the same network messages as when a real player -signs on to the server. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - - -void(entity who) UpdateClient = -{ - WriteByte (MSG_ALL, SVC_UPDATENAME); - WriteByte (MSG_ALL, who.b_clientno); - WriteString (MSG_ALL, who.netname); - WriteByte (MSG_ALL, SVC_UPDATECOLORS); - WriteByte (MSG_ALL, who.b_clientno); - WriteByte (MSG_ALL, who.b_shirt * 16 + who.b_pants); - WriteByte (MSG_ALL, SVC_UPDATEFRAGS); - WriteByte (MSG_ALL, who.b_clientno); - WriteShort (MSG_ALL, who.frags); -}; - -float(float clientno) ClientBitFlag = -{ - // bigger, but faster - if (clientno == 0) - return 1; - else if (clientno == 1) - return 2; - else if (clientno == 2) - return 4; - else if (clientno == 3) - return 8; - else if (clientno == 4) - return 16; - else if (clientno == 5) - return 32; - else if (clientno == 6) - return 64; - else if (clientno == 7) - return 128; - else if (clientno == 8) - return 256; - else if (clientno == 9) - return 512; - else if (clientno == 10) - return 1024; - else if (clientno == 11) - return 2048; - else if (clientno == 12) - return 4096; - else if (clientno == 13) - return 8192; - else if (clientno == 14) - return 16384; - else if (clientno == 15) - return 32768; - return 0; -}; - -float() ClientNextAvailable = -{ - local float clientno; - - clientno = max_clients; - while(clientno > 0) - { - clientno = clientno - 1; - - if(!(active_clients & ClientBitFlag(clientno))) - return clientno; - } - - return -1; -}; - - -void(entity e1, entity e2, float flag) DeveloperLightning = -{ - // used to show waypoint links for debugging - WriteByte (MSG_BROADCAST, 23); - if (flag) - WriteByte (MSG_BROADCAST, 6); - else - WriteByte (MSG_BROADCAST, 13); - WriteEntity (MSG_BROADCAST, e2); - WriteCoord (MSG_BROADCAST, e1.origin_x); - WriteCoord (MSG_BROADCAST, e1.origin_y); - WriteCoord (MSG_BROADCAST, e1.origin_z); - WriteCoord (MSG_BROADCAST, e2.origin_x); - WriteCoord (MSG_BROADCAST, e2.origin_y); - WriteCoord (MSG_BROADCAST, e2.origin_z); -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Find Another Color - -Team finding code - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -float(float tcolor) FindAnotherColor = -{ - local float bestbet, scolor, pcount, bestp; - bestbet = -1; - bestp = 16; - while(scolor < 14) - { - if (scolor != tcolor) - { - b_temp2 = player_head; - pcount = 0; - while(b_temp2 != world) - { - if (b_temp2.team == scolor + 1) - pcount = pcount + 1; - b_temp2 = b_temp2._next; - } - if ((pcount < bestp) && pcount) - { - bestbet = scolor; - bestp = pcount; - } - } - scolor = scolor + 1; - } - if (bestbet < 0) - { - bestbet = tcolor; - while (bestbet == tcolor) - { - bestbet = floor(random() * 13); - } - } - return bestbet; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -BotConnect and related functions. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ -entity(float num) GetClientEntity = -{ - local entity upsy; - upsy = world; - num = num + 1; - while (num > 0) - { - num = num - 1; - upsy = nextent(upsy); - } - return upsy; -}; - -void(float whichteam, float whatbot, float whatskill) BotConnect = -{ - local float f; - local string h; - local entity uself; - - f = ClientNextAvailable(); - uself = self; - if(f == -1) - { - bprint("Unable to connect a bot, server is full.\n"); - return; - } - - // chat thing - - active_clients = active_clients | ClientBitFlag(f); - bot_count = bot_count + 1; - self = GetClientEntity(f); - if (!saved_bots) - bot_start_topic(1); - self.b_clientno = f; - self.colormap = f + 1; - if (whatbot) - self.netname = BotName(whatbot); - else - self.netname = PickARandomName(); - - - // players can set skill all weird, so leave these checks in - whatskill = rint(whatskill); - if (whatskill > 3) - whatskill = 3; - else if (whatskill < 0) - whatskill = 0; - self.b_skill = whatskill; - - if (teamplay && !coop) - { - if (whichteam) - self.b_pants = FindAnotherColor(uself.team - 1); - else - self.b_pants = uself.team - 1; - self.b_shirt = self.b_pants; - } - - self.team = self.b_pants + 1; - UpdateClient(self); - SetNewParms(); - self.ishuman = 2; - ClientConnect(); - PutClientInServer(); - - // this is risky... could corrupt .way files if done wrong - // If you're not the gambling type, comment this out - - f = ClientBitFlag(self.b_num - 1); - current_bots = current_bots | f; - - if (self.b_num <= 8) - saved_skills1 = (saved_skills1 & (65536 - (3 * f)) | (self.b_skill * f)); - else - { - f = ClientBitFlag(self.b_num - 9); - saved_skills2 = (saved_skills2 & (65536 - (3 * f)) | (self.b_skill * f)); - } - - h = ftos(current_bots); - cvar_set("scratch1", h); - h = ftos(saved_skills1); - cvar_set("scratch2", h); - h = ftos(saved_skills2); - cvar_set("scratch3", h); - self = uself; - -}; - -void(entity bot) BotDisconnect = -{ - local string h; - local entity uself; - uself = self; - self = bot; - - bot_count = bot_count - 1; - current_bots = current_bots - (current_bots & ClientBitFlag(self.b_num - 1)); - h = ftos(current_bots); - cvar_set("scratch1", h); - - - ClientDisconnect(); - - if (self.b_clientno != -1) - { - // the bot's client number is not in use by a real player so we - // must remove it's entry in the rankings - // Quake engine sets all fields to 0, can only do the most important here - self.b_frags = self.frags = 0; - self.netname = ""; - self.classname = ""; - self.health = 0; - self.items = 0; - self.armorvalue = 0; - self.weaponmodel = ""; - self.b_pants = 0; - self.b_shirt = 0; - self.ammo_shells = self.ammo_nails = self.ammo_rockets = self.ammo_cells = 0; - UpdateClient(self); - active_clients = active_clients - (active_clients & ClientBitFlag(self.b_clientno)); - self.b_clientno = -1; - } - self = uself; -}; -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -BotInvalidClientNo -kicks a bot if a player connects and takes the bot's space - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void(float clientno) BotInvalidClientNo = -{ - local entity bot; - - bot = GetClientEntity(clientno); - if(bot.b_clientno > 0) - { - if (!bot.ishuman) - { - bot.b_clientno = -1; - BotDisconnect(bot); - active_clients = active_clients | ClientBitFlag(self.b_clientno); - BotConnect(0, bot.b_num, bot.b_skill); - return; - } - } -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Waypoint Loading from file - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ -void() LoadWaypoint = -{ - local vector org; - local entity tep; - local float r; - org_x = cvar("saved1"); - org_y = cvar("saved2"); - org_z = cvar("saved3"); - - tep = make_waypoint(org); - - r = cvar("saved4"); - - tep.b_aiflags = floor(r / 4); - tep.b_pants = cvar("scratch1"); - tep.b_skill = cvar("scratch2"); - tep.b_shirt = cvar("scratch3"); - tep.b_frags = cvar("scratch4"); -}; - -void() bot_return = -{ - if (time > 2) - { - if ((waypoint_mode == WM_DYNAMIC) || (waypoint_mode == WM_LOADED)) - { - // minor precaution - - if (saved_bots & 1) BotConnect(0, 1, saved_skills1 & 3); - if (saved_bots & 2) BotConnect(0, 2, (saved_skills1 & 12) / 4); - if (saved_bots & 4) BotConnect(0, 3, (saved_skills1 & 48) / 16); - if (saved_bots & 8) BotConnect(0, 4, (saved_skills1 & 192) / 64); - if (saved_bots & 16) BotConnect(0, 5, (saved_skills1 & 768) / 256); - if (saved_bots & 32) BotConnect(0, 6, (saved_skills1 & 3072) / 1024); - if (saved_bots & 64) BotConnect(0, 7, (saved_skills1 & 12288) / 4096); - if (saved_bots & 128) BotConnect(0, 8, (saved_skills1 & 49152) / 16384); - if (saved_bots & 256) BotConnect(0, 9, saved_skills2 & 3); - if (saved_bots & 512) BotConnect(0, 10, (saved_skills2 & 12) / 4); - if (saved_bots & 1024) BotConnect(0, 11, (saved_skills2& 48) / 16); - if (saved_bots & 2048) BotConnect(0, 12, (saved_skills2 & 192) / 64); - if (saved_bots & 4096) BotConnect(0, 13, (saved_skills2 & 768) / 256); - if (saved_bots & 8192) BotConnect(0, 14, (saved_skills2 & 3072) / 1024); - if (saved_bots & 16384) BotConnect(0, 15, (saved_skills2 & 12288) / 4096); - if (saved_bots & 32768) BotConnect(0, 16, (saved_skills2 & 49152) / 16384); - saved_bots = 0; - } - } -}; - - -void() WaypointWatch = -{ - // Waypoint Baywatch - local float bigboobs; - local string h; - - if (max_clients < 2) - return; - if (waypoint_mode != WM_UNINIT) - { - bigboobs = cvar("saved4"); - if (bigboobs != 0) - { - if ((bigboobs & 3) == 1) - ClearAllWays(); - else if ((bigboobs & 3) == 3) - { - FixWaypoints(); - h = ftos(b_options); - cvar_set("saved1", h); - cvar_set("saved4", "0"); - cvar_set("scratch1", "0"); - waypoint_mode = WM_LOADED; - return; - } - LoadWaypoint(); - waypoint_mode = WM_LOADING; - cvar_set("saved4", "0"); - } - } -}; -void() BotFrame = -{ - local float num; - - // for the sake of speed - sv_maxairspeed = cvar("sv_maxairspeed"); - sv_maxspeed = cvar("sv_maxspeed"); - sv_gravity = cvar("sv_gravity"); - sv_friction = cvar("sv_friction"); - sv_accelerate = cvar("sv_accelerate"); - sv_stopspeed = cvar("sv_stopspeed"); - real_frametime = frametime; // in NQ this is alright - - self = nextent(world); - num = 0; - while (num < max_clients) - { - if (self.ishuman == FALSE) - { - if (active_clients & ClientBitFlag(num)) - { - frik_obstacles(); - CL_KeyMove(); - SV_ClientThink(); - SV_Physics_Client(); - } - } - self = nextent(self); - num = num + 1; - } - WaypointWatch(); - - if (saved_bots) - bot_return(); -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Bot Impulses. Allows the player to perform bot -related functions. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() BotImpulses = -{ -/* local float f; - if (self.impulse == 100) - { - f = cvar("skill"); - BotConnect(0, 0, f); - } - if (self.impulse == 101) - { - f = cvar("skill"); - BotConnect(1, 0, f); - } - else if (self.impulse == 102) - KickABot(); - else if (self.impulse == 103) - botcam_u(); - else if (self.impulse == 104) - bot_way_edit(); - else - return; - - self.impulse = 0; -*/ - }; - - - diff --git a/attic/TeamNexuiz/game/gamec/bot_ai.c b/attic/TeamNexuiz/game/gamec/bot_ai.c deleted file mode 100644 index c5b8751aa..000000000 --- a/attic/TeamNexuiz/game/gamec/bot_ai.c +++ /dev/null @@ -1,1023 +0,0 @@ -/*********************************************** -* * -* FrikBot General AI * -* "The I'd rather be playing Quake AI" * -* * -***********************************************/ - -/* - -This program is in the Public Domain. My crack legal -team would like to add: - -RYAN "FRIKAC" SMITH IS PROVIDING THIS SOFTWARE "AS IS" -AND MAKES NO WARRANTY, EXPRESS OR IMPLIED, AS TO THE -ACCURACY, CAPABILITY, EFFICIENCY, MERCHANTABILITY, OR -FUNCTIONING OF THIS SOFTWARE AND/OR DOCUMENTATION. IN -NO EVENT WILL RYAN "FRIKAC" SMITH BE LIABLE FOR ANY -GENERAL, CONSEQUENTIAL, INDIRECT, INCIDENTAL, -EXEMPLARY, OR SPECIAL DAMAGES, EVEN IF RYAN "FRIKAC" -SMITH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES, IRRESPECTIVE OF THE CAUSE OF SUCH DAMAGES. - -You accept this software on the condition that you -indemnify and hold harmless Ryan "FrikaC" Smith from -any and all liability or damages to third parties, -including attorney fees, court costs, and other -related costs and expenses, arising out of your use -of this software irrespective of the cause of said -liability. - -The export from the United States or the subsequent -reexport of this software is subject to compliance -with United States export control and munitions -control restrictions. You agree that in the event you -seek to export this software, you assume full -responsibility for obtaining all necessary export -licenses and approvals and for assuring compliance -with applicable reexport restrictions. - -Any reproduction of this software must contain -this notice in its entirety. - -*/ - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -target_onstack - -checks to see if an entity is on the bot's stack - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -float(entity scot) target_onstack = -{ - if (scot == world) - return FALSE; - else if (self.target1 == scot) - return 1; - else if (self.target2 == scot) - return 2; - else if (self.target3 == scot) - return 3; - else if (self.target4 == scot) - return 4; - else - return FALSE; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -target_add - -adds a new entity to the stack, since it's a -LIFO stack, this will be the bot's new target1 - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void(entity ent) target_add = -{ - if (ent == world) - return; - if (target_onstack(ent)) - return; - self.target4 = self.target3; - self.target3 = self.target2; - self.target2 = self.target1; - self.target1 = ent; - self.search_time = time + 5; -}; - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -target_drop - -Removes an entity from the bot's target stack. -The stack will empty everything up to the object -So if you have target2 item_health, target1 -waypoint, and you drop the health, the waypoint -is gone too. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void(entity ent) target_drop = -{ - local float tg; - - tg = target_onstack(ent); - if (tg == 1) - { - self.target1 = self.target2; - self.target2 = self.target3; - self.target3 = self.target4; - self.target4 = world; - } - else if (tg == 2) - { - self.target1 = self.target3; - self.target2 = self.target4; - self.target3 = self.target4 = world; - } - else if (tg == 3) - { - self.target1 = self.target4; - self.target2 = self.target3 = self.target4 = world; - } - else if (tg == 4) - self.target1 = self.target2 = self.target3 = self.target4 = world; - self.search_time = time + 5; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -bot_lost - -Bot has lost its target. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void(entity targ, float success) bot_lost = -{ - if (!targ) - return; - - target_drop(targ); - if (targ.classname == "waypoint") - targ.b_sound = targ.b_sound - (targ.b_sound & ClientBitFlag(self.b_clientno)); - - // find a new route - if (!success) - { - self.target1 = self.target2 = self.target3 = self.target4 = world; - self.last_way = FindWayPoint(self.current_way); - ClearMyRoute(); - self.b_aiflags = 0; - } - else - { - if (targ.classname == "item_artifact_invisibility") - if (self.items & 524288) - bot_start_topic(3); - - if (targ.flags & FL_ITEM) - { - if (targ.model == string_null) - targ._last = world; - else - targ._last = self; - } - } - - - if (targ.classname != "player") - targ.search_time = time + 5; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -bot_check_lost - -decide if my most immediate target should be -removed. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ -void(entity targ) bot_check_lost = -{ - local vector dist; - dist = realorigin(targ) - self.origin; - dist_z = 0; - if (targ == world) - return; - - // waypoints and items are lost if you get close enough to them - - else if (targ.flags & FL_ITEM) - { - if (vlen(targ.origin - self.origin) < 32) - bot_lost(targ, TRUE); - else if (targ.model == string_null) - bot_lost(targ, TRUE); - } - else if (targ.classname == "waypoint") - { - if (!(self.b_aiflags & (AI_SNIPER | AI_AMBUSH))) - { - if (self.b_aiflags & AI_RIDE_TRAIN) - { - if (vlen(targ.origin - self.origin) < 48) - bot_lost(targ, TRUE); - } - else if (self.b_aiflags & AI_PRECISION) - { - if (vlen(targ.origin - self.origin) < 24) - bot_lost(targ, TRUE); - } - else if (vlen(targ.origin - self.origin) < 32) - bot_lost(targ, TRUE); - else if (self.b_aiflags & AI_CARELESS) // Electro - better for jumppads - { - if (vlen(targ.origin - self.origin) < 128) - bot_lost(targ, TRUE); - } - } - } - else if (targ.classname == "temp_waypoint") - { - if (vlen(targ.origin - self.origin) < 32) - bot_lost(targ, TRUE); - } - else if (targ.classname == "player") - { - if (targ.health <= 0) - bot_lost(targ, TRUE); - else if ((coop) || (teamplay && targ.team == self.team)) - { - if (targ.target1.classname == "player") - { - if (!targ.target1.ishuman) - bot_lost(targ, TRUE); - } - else if (targ.teleport_time > time) - { - // try not to telefrag teammates - self.keys = self.keys & 960; - } - else if (vlen(targ.origin - self.origin) < 128) - { - if (vlen(targ.origin - self.origin) < 48) - frik_walkmove(self.origin - targ.origin); - else - { - self.keys = self.keys & 960; - bot_start_topic(4); - } - self.search_time = time + 5; // never time out - } - else if (!fisible(targ)) - bot_lost(targ, FALSE); - } - else if (waypoint_mode > WM_LOADED) - { - if (vlen(targ.origin - self.origin) < 128) - { - bot_lost(targ, TRUE); - } - } - } - - // buttons are lost of their frame changes - else if (targ.classname == "func_button") - { - if (targ.frame) - { - bot_lost(targ, TRUE); - if (self.enemy == targ) - self.enemy = world; - //if (self.target1) - // bot_get_path(self.target1, TRUE); - - } - } - // trigger_multiple style triggers are lost if their thinktime changes - else if ((targ.movetype == MOVETYPE_NONE) && (targ.solid == SOLID_TRIGGER)) - { - if (targ.nextthink >= time) - { - bot_lost(targ, TRUE); - //if (self.target1) - // bot_get_path(self.target1, TRUE); - } - } - // lose any target way above the bot's head - // FIXME: if the bot can fly in your mod.. - if ((targ.origin_z - self.origin_z) > 64) - { - dist = targ.origin - self.origin; - dist_z = 0; - if (vlen(dist) < 32) - if (self.flags & FL_ONGROUND) - if(!frik_recognize_plat(FALSE)) - bot_lost(targ, FALSE); - } - else if (targ.classname == "train") - { - if (frik_recognize_plat(FALSE)) - bot_lost(targ, TRUE); - } - // targets are lost if the bot's search time has expired - if (time > self.search_time) - bot_lost(targ, FALSE); -}; - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -bot_handle_ai - -This is a 0.10 addition. Handles any action -based b_aiflags. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() bot_handle_ai = -{ - local entity newt; - local vector v; - - // handle ai flags -- note, not all aiflags are handled - // here, just those that perform some sort of action - - // wait is used by the ai to stop the bot until his search time expires / or route changes - - if (self.b_aiflags & AI_WAIT) - self.keys = self.keys & 960; - - if (self.b_aiflags & AI_DOORFLAG) // was on a door when spawned - { - b_temp3 = self; - self = self.last_way; - if (!frik_recognize_plat(FALSE)) // if there is nothing there now - { - newt = FindThing("door"); // this is likely the door responsible (crossfingers) - self = b_temp3; - - if (self.b_aiflags & AI_DOOR_NO_OPEN) - { - if (newt.nextthink) - self.keys = self.keys & 960; // wait until it closes - else - { - bot_lost(self.last_way, FALSE); - } - } - else - { - if (newt.targetname) - { - newt = find(world, target, newt.targetname); - if (newt.health > 0) - { - self.enemy = newt; - bot_weapon_switch(1); - } - else - { - // target_drop(self.last_way); - target_add(newt); - // bot_get_path(newt, TRUE); - } - } - self.b_aiflags = self.b_aiflags - AI_DOORFLAG; - } - } - else - self = b_temp3; - } - - if (self.b_aiflags & AI_JUMP) - { - if (self.flags & FL_ONGROUND) - { - bot_jump(); - self.b_aiflags = self.b_aiflags - AI_JUMP; - } - } - else if (self.b_aiflags & AI_SUPER_JUMP) - { - if (self.weapon != WEP_LASER) - self.impulse = 7; - else if (self.flags & FL_ONGROUND) - { - self.b_aiflags = self.b_aiflags - AI_SUPER_JUMP; - if (bot_can_rj(self)) - { - bot_jump(); - self.v_angle_x = self.b_angle_x = 80; - self.button0 = TRUE; - } - else - bot_lost(self.target1, FALSE); - - } - } - if (self.b_aiflags & AI_SURFACE) - { - if (self.waterlevel > 2) - { - self.keys = KEY_MOVEUP; - self.button2 = TRUE; // swim! - } - else - self.b_aiflags = self.b_aiflags - AI_SURFACE; - } - if (self.b_aiflags & AI_RIDE_TRAIN) - { - // simple, but effective - // this can probably be used for a lot of different - // things, not just trains (door elevators come to mind) - b_temp3 = self; - self = self.last_way; - - if (!frik_recognize_plat(FALSE)) // if there is nothing there now - { - self = b_temp3; - self.keys = self.keys & 960; - } - else - { - self = b_temp3; - if (frik_recognize_plat(FALSE)) - { - v = realorigin(trace_ent) + trace_ent.origin - self.origin; - v_z = 0; - if (vlen(v) < 24) - self.keys = self.keys & 960; - else - { - self.b_aiflags = self.b_aiflags | AI_PRECISION; - self.keys = frik_KeysForDir(v); - } - } - } - } - if (self.b_aiflags & AI_PLAT_BOTTOM) - { - newt = FindThing("plat"); - if (newt.state != 1) - { - v = self.origin - realorigin(newt); - v_z = 0; - if (vlen(v) > 96) - self.keys = self.keys & 960; - else - frik_walkmove(v); - } - else - self.b_aiflags = self.b_aiflags - AI_PLAT_BOTTOM; - } - if (self.b_aiflags & AI_DIRECTIONAL) - { - if ((normalize(self.last_way.origin - self.origin) * self.b_dir) > 0.4) - { - self.b_aiflags = self.b_aiflags - AI_DIRECTIONAL; - bot_lost(self.target1, TRUE); - } - } - if (self.b_aiflags & AI_SNIPER) - { - self.b_aiflags = (self.b_aiflags | AI_WAIT | AI_PRECISION) - AI_SNIPER; - // FIXME: Add a switch to wep command - // FIXME: increase delay? - } - if (self.b_aiflags & AI_AMBUSH) - { - self.b_aiflags = (self.b_aiflags | AI_WAIT) - AI_AMBUSH; - // FIXME: Add a switch to wep command - // FIXME: increase delay? - } - -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -bot_path - -Bot will follow a route generated by the -begin_route set of functions in bot_way.qc. -This code, while it works pretty well, can get -confused - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() bot_path = -{ - local entity jj, tele; - - bot_check_lost(self.target1); - if (!self.target1) - { - self.keys=0; - return; - } - if (target_onstack(self.last_way)) - return; // old waypoint still being hunted - - jj = FindRoute(self.last_way); - if (!jj) - { - // this is an ugly hack - if (self.target1.current_way != self.last_way) - { - if (self.target1.classname != "temp_waypoint") - if (self.target1.classname != "player") - bot_lost(self.target1, FALSE); - } - - return; - } - - // update the bot's special ai features - - // Readahed types are AI conditions to perform while heading to a waypoint - // point types are AI flags that should be executed once reaching a waypoint - - self.b_aiflags = (jj.b_aiflags & AI_READAHEAD_TYPES) | (self.last_way.b_aiflags & AI_POINT_TYPES); - target_add(jj); - if (self.last_way) - { - if (CheckLinked(self.last_way, jj) == 2) // waypoints are telelinked - { - tele = FindThing("trigger_teleport"); // this is probbly the teleport responsible - target_add(tele); - } - traceline(self.last_way.origin, jj.origin, FALSE, self); // check for blockage - if (trace_fraction != 1) - { - if (trace_ent.classname == "door" && !(self.b_aiflags & AI_DOOR_NO_OPEN)) // a door blocks the way - { - // linked doors fix - if (trace_ent.owner) - trace_ent = trace_ent.owner; - if ((trace_ent.health > 0) && (self.enemy == world)) - { - self.enemy = trace_ent; - bot_weapon_switch(1); - self.b_aiflags = self.b_aiflags | AI_BLIND; // nick knack paddy hack - } - else if (trace_ent.targetname) - { - tele = find(world, target, trace_ent.targetname); - if (tele.health > 0) - { - self.enemy = tele; - bot_weapon_switch(1); - } - else - { - // target_drop(jj); - target_add(tele); - // bot_get_path(tele, TRUE); - self.b_aiflags = self.b_aiflags | AI_BLIND; // give a bot a bone - return; - } - } - } - else if (trace_ent.classname == "func_wall") - { - // give up - bot_lost(self.target1, FALSE); - return; - } - } - } - // this is used for AI_DRIECTIONAL - self.b_dir = normalize(jj.origin - self.last_way.origin); - - self.last_way = jj; -}; - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Bot Priority Look. What a stupid name. This is where -the bot finds things it wants to kill/grab. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ -// priority scale -// 0 - 10 virtually ignore -// 10 - 30 normal item range -// 30 - 50 bot will consider this a target worth changing course for -// 50 - 90 bot will hunt these as vital items - -// *!* Make sure you add code to bot_check_lost to remove the target *!* - -float(entity thing) priority_for_thing = -{ - local float thisp; - thisp = 0; - // This is the most executed function in the bot. Careful what you do here. - - if (thing.flags & FL_ITEM && thing.model != string_null && thing.search_time < time) - { - // ugly hack - if (thing._last != self) - thisp = 20; - else if (thing.classname == "item_strength") // IT_STRENGTH - thisp = 65; - else if (thing.classname == "item_invincible") // IT_INVINCIBLE - thisp = 65; - //else if (thing.classname == "item_speed") // IT_SPEED - // thisp = 65; - //else if (thing.classname == "item_slowmo") // IT_SLOWMO - // thisp = 65; - else if (thing.classname == "item_health") - { - if (thing.spawnflags & 2) - thisp = 55; - if (self.health < 40) - thisp = thisp + 50; - } - else if (thing.classname == "item_health1" || thing.classname == "item_health2") - { - thisp = 20; - if (self.health < 40) - thisp = thisp + 50; - } - else if (thing.classname == "item_health100") - { - thisp = 55; - if (self.health < 40) - thisp = thisp + 50; - } - else if (thing.classname == "item_armor1") - { - thisp = 20; - if (self.armorvalue < 100) - thisp = thisp + 25; - } - else if (thing.classname == "item_armor25") - { - thisp = 60; - if (self.armorvalue < 100) - thisp = thisp + 25; - } - else if (thing.classname == "weapon_shotgun") - { - if (!(self.items & IT_SHOTGUN)) - thisp = 25; - } - else if (thing.classname == "weapon_uzi") - { - if (!(self.items & IT_UZI)) - thisp = 30; - } - else if (thing.classname == "weapon_electro") - { - if (!(self.items & IT_ELECTRO)) - thisp = 35; - } - else if (thing.classname == "weapon_grenadelauncher") - { - if (!(self.items & IT_GRENADE_LAUNCHER)) - thisp = 45; - } - else if (thing.classname == "weapon_crylink") - { - if (!(self.items & IT_CRYLINK)) - thisp = 60; - } - else if (thing.classname == "weapon_nex") - { - if (!(self.items & IT_NEX)) // IT_LIGHTNING - thisp = 50; - } - else if (thing.classname == "weapon_hagar") - { - if (!(self.items & IT_HAGAR)) - thisp = 45; - } - else if (thing.classname == "weapon_rocketlauncher") - { - if (!(self.items & IT_ROCKET_LAUNCHER)) - thisp = 50; - } - } - else if (thing.classname == "player") - { - if (thing.health > 0) - { - if (thing == self) - return 0; - else - { - if (coop) - { - thisp = 100; - if (thing.target1.classname == "player") - if (!thing.target1.ishuman) - return 0; - } - else if (teamplay && thing.team == self.team) - { - thisp = 100; - if (thing.target1.classname == "player") - return 0; - } - else thisp = 30; - } - } - } - else if (thing.classname == "waypoint") - { - if (thing.b_aiflags & AI_SNIPER) - thisp = 30; - else if (thing.b_aiflags & AI_AMBUSH) - thisp = 30; - } - if (pointcontents(thing.origin) < -3) - return 0; - if (thisp) - { - if (thing.current_way) - { - // check to see if it's unreachable - if (thing.current_way.items == -1) - return 0; - else - thisp = thisp + (13000 - thing.current_way.items) * 0.05; - - } - } - return thisp; -}; - -void(float scope) bot_look_for_crap = -{ - local entity foe, best; - local float thatp, bestp, dist; - - if (scope == 1) - foe = findradius(self.origin, 13000); - else - foe = findradius(self.origin, 500); - - bestp = 1; - while(foe) - { - thatp = priority_for_thing(foe); - if (thatp) - if (!scope) - if (!sisible(foe)) - thatp = 0; - if (thatp > bestp) - { - bestp = thatp; - best = foe; - dist = vlen(self.origin - foe.origin); - } - foe = foe.chain; - } - if (best == world) - return; - if (!target_onstack(best)) - { - target_add(best); - if (scope) - { - bot_get_path(best, FALSE); - self.b_aiflags = self.b_aiflags | AI_WAIT; - } - } -}; - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -bot_angle_set - -Sets the bots look keys & b_angle to point at -the target - used for fighting and just -generally making the bot look good. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() bot_angle_set = -{ - local float h; - local vector view; - - if (self.enemy) - { - if (self.enemy.items & 524288) - if (random() > 0.2) - return; - if (self.missile_speed == 0) - self.missile_speed = 10000; - if (self.enemy.solid == SOLID_BSP) - { - view = (((self.enemy.absmin + self.enemy.absmax) * 0.5) - self.origin); - } - else - { - h = vlen(self.enemy.origin - self.origin) / self.missile_speed; - if (self.enemy.flags & FL_ONGROUND) - view = self.enemy.velocity * h; - else - view = (self.enemy.velocity - (sv_gravity * '0 0 1') * h) * h; - view = self.enemy.origin + view; - // FIXME: ? - traceline(self.enemy.origin, view, FALSE, self); - view = trace_endpos; - - if (self.weapon == WEP_GRENADE_LAUNCHER || self.weapon == WEP_ELECTRO || self.weapon == WEP_HAGAR || self.weapon == WEP_ROCKET_LAUNCHER) - view = view - '0 0 22'; - - view = normalize(view - self.origin); - } - view = vectoangles(view); - view_x = view_x * -1; - self.b_angle = view; - } - else if (self.target1) - { - view = realorigin(self.target1); - if (self.target1.flags & FL_ITEM) - view = view + '0 0 48'; - view = view - (self.origin + self.view_ofs); - view = vectoangles(view); - view_x = view_x * -1; - self.b_angle = view; - } - else - self.b_angle_x = 0; - // HACK HACK HACK HACK - // The bot falls off ledges a lot because of "turning around" - // so let the bot use instant turn around when not hunting a player - if (self.b_skill == 3) - { - self.keys = self.keys & 63; - self.v_angle = self.b_angle; - while (self.v_angle_x < -180) - self.v_angle_x = self.v_angle_x + 360; - while (self.v_angle_x > 180) - self.v_angle_x = self.v_angle_x - 360; - - } - else if ((self.enemy == world || self.enemy.movetype == MOVETYPE_PUSH) && self.target1.classname != "player") - { - self.keys = self.keys & 63; - self.v_angle = self.b_angle; - while (self.v_angle_x < -180) - self.v_angle_x = self.v_angle_x + 360; - while (self.v_angle_x > 180) - self.v_angle_x = self.v_angle_x - 360; - } - else if (self.b_skill < 2) // skill 2 handled in bot_phys - { - if (self.b_angle_x > 180) - self.b_angle_x = self.b_angle_x - 360; - self.keys = self.keys & 63; - - if (angcomp(self.b_angle_y, self.v_angle_y) > 10) - self.keys = self.keys | KEY_LOOKLEFT; - else if (angcomp(self.b_angle_y, self.v_angle_y) < -10) - self.keys = self.keys | KEY_LOOKRIGHT; - if (angcomp(self.b_angle_x, self.v_angle_x) < -10) - self.keys = self.keys | KEY_LOOKUP; - else if (angcomp(self.b_angle_x, self.v_angle_x) > 10) - self.keys = self.keys | KEY_LOOKDOWN; - } -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -BotAI - -This is the main ai loop. Though called every -frame, the ai_time limits it's actual updating - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ -float stagger_think; -float intermission_running; - -void() BotAI = -{ - // am I dead? Fire randomly until I respawn - // health < 1 is used because fractional healths show up as 0 on normal player - // status bars, and the mod probably already compensated for that - - if (self.health < 1) - { - self.button0 = floor(random() * 2); - self.button2 = 0; - self.keys = 0; - self.b_aiflags = 0; - ClearMyRoute(); - self.target1 = self.target2 = self.target3 = self.target4 = self.enemy = world; - self.last_way = world; - return; - } - - // stagger the bot's AI out so they all don't think at the same time, causing game - // 'spikes' - if (self.b_skill < 2) - { - if (self.ai_time > time) - return; - - self.ai_time = time + 0.05; - if (bot_count > 0) - { - if ((time - stagger_think) < (0.1 / bot_count)) - self.ai_time = self.ai_time + 0.1 / (2 * bot_count); - } - else - return; - } - if (intermission_running) - bot_start_topic(7); - stagger_think = time; - - // shut the bot's buttons off, various functions will turn them on by AI end - - self.button2 = 0; - self.button0 = 0; - - - // target1 is like goalentity in normal Quake monster AI. - // it's the bot's most immediate target - if (route_table == self) - { - if (busy_waypoints <= 0) - { - if (waypoint_mode < WM_EDITOR) - bot_look_for_crap(TRUE); - } - self.b_aiflags = 0; - self.keys = 0; - } - else if (self.target1) - { - frik_movetogoal(); - bot_path(); - } - else - { - if (waypoint_mode < WM_EDITOR) - { - if(self.route_failed) - { - frik_bot_roam(); - self.route_failed = 0; - } - else if(!begin_route()) - { - bot_look_for_crap(FALSE); - } - self.keys = 0; - } - else - { - self.b_aiflags = AI_WAIT; - self.keys = 0; - } - } - - // bot_angle_set points the bot at it's goal (self.enemy or target1) - - bot_angle_set(); - - // fight my enemy. Enemy is probably a field QC coders will most likely use a lot - // for their own needs, since it's unused on a normal player - // FIXME - if (self.enemy) - bot_fight_style(); - else if (random() < 0.2) - if (random() < 0.2) - bot_weapon_switch(-1); - bot_dodge_stuff(); - - // checks to see if bot needs to start going up for air -/* if (self.waterlevel > 2) - { - if (time > (self.air_finished - 2)) - { - traceline (self.origin, self.origin + '0 0 6800', TRUE, self); - if (trace_inopen) - { - self.keys = KEY_MOVEUP; - self.button2 = TRUE; // swim! - return; // skip ai flags for now - this is life or death - } - } - } -*/ - // b_aiflags handling - - - if (self.b_aiflags) - bot_handle_ai(); - //else - // bot_chat(); // don't want chat to screw him up if he's rjing or something -}; diff --git a/attic/TeamNexuiz/game/gamec/bot_ed.c b/attic/TeamNexuiz/game/gamec/bot_ed.c deleted file mode 100644 index 6d3d065f8..000000000 --- a/attic/TeamNexuiz/game/gamec/bot_ed.c +++ /dev/null @@ -1,1367 +0,0 @@ -/*********************************************** -* * -* FrikBot Waypoint Editor * -* "The 'wtf is this doing in my mod' code" * -* * -***********************************************/ - -/* - -This program is in the Public Domain. My crack legal -team would like to add: - -RYAN "FRIKAC" SMITH IS PROVIDING THIS SOFTWARE "AS IS" -AND MAKES NO WARRANTY, EXPRESS OR IMPLIED, AS TO THE -ACCURACY, CAPABILITY, EFFICIENCY, MERCHANTABILITY, OR -FUNCTIONING OF THIS SOFTWARE AND/OR DOCUMENTATION. IN -NO EVENT WILL RYAN "FRIKAC" SMITH BE LIABLE FOR ANY -GENERAL, CONSEQUENTIAL, INDIRECT, INCIDENTAL, -EXEMPLARY, OR SPECIAL DAMAGES, EVEN IF RYAN "FRIKAC" -SMITH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES, IRRESPECTIVE OF THE CAUSE OF SUCH DAMAGES. - -You accept this software on the condition that you -indemnify and hold harmless Ryan "FrikaC" Smith from -any and all liability or damages to third parties, -including attorney fees, court costs, and other -related costs and expenses, arising out of your use -of this software irrespective of the cause of said -liability. - -The export from the United States or the subsequent -reexport of this software is subject to compliance -with United States export control and munitions -control restrictions. You agree that in the event you -seek to export this software, you assume full -responsibility for obtaining all necessary export -licenses and approvals and for assuring compliance -with applicable reexport restrictions. - -Any reproduction of this software must contain -this notice in its entirety. - -*/ - -float saved1, saved2, saved3, scratch1, scratch2, scratch3, scratch4; -float bytecounter, filecount; - -float MENU_MAIN = 1; -float MENU_WAYPOINTS = 2; -float MENU_LINKS = 3; -float MENU_FLAGS = 4; -float MENU_FLAGS2 = 5; -float MENU_BOTS = 6; -float MENU_WAYLIST = 7; -// 8 = link way -// 9 = telelink way -// 10 = delete link -// 11 = create link X2 -// 12 = delete link x2 -// 13 = confirmation of delete all -// 14 = Teleport to way -// 15 = confirmation of delete point - -void() BSPDumpWaypoints; -void() QCDumpWaypoints; -void() DumpWaypoints; -/* -// source for the menu strings... - --- Main Menu --\n -[1] >>Waypoint Management\n -[2] >>Link Management \n -[3] >>AI Flag Management \n -[4] >>Bot Management \n -[5] >>Waylist Management \n -[6] [#] Noclip \n -[7] [#] Godmode \n -[8] [#] Hold Select \n -[9] Teleport to Way # \n -[0] Close Menu \n - -// missing from main is show way info -// iffy on the teleport to way thing being on main...seems like either a bot or way list thing - --- Waypoint Management --\n -[1] Move Waypoint \n -[2] Delete Waypoint \n -[3] Make Waypoint \n -[4] Make Way + Link \n -[5] Make Way + Link X2 \n -[6] Make Way + Telelink \n -[7] Show waypoint info \n -[8] >>Link Management \n -[9] >>AI Flag Management \n -[0] >>Main Menu \n - --- Link Management --\n -[1] Unlink Waypoint \n -[2] Create Link \n -[3] Create Telelink \n -[4] Delete Link \n -[5] Create Link X2 \n -[6] Delete Link X2 \n -[7] >Make Waypoint \n -[8] >>Waypoint Management\n -[9] >>AI Flag Management \n -[0] >>Main Menu \n - -// Ai flags...ugh - --- AI Flag Management --\n -[1] [#] Door Flag \n -[2] [#] Precision \n -[3] [#] Surface for air \n -[4] [#] Blind mode \n -[5] [#] Jump \n -[6] [#] Dark \n -[7] [#] Super Jump \n -\n -[9] >>AI Flags page 2 \n -[0] >>Main Menu \n - --- AI Flags pg. 2--\n -[1] [#] Difficult \n -[2] [#] Wait for plat \n -[3] [#] Ride train \n -[4] [#] Door flag no open\n -[5] [#] Ambush \n -[6] [#] Snipe \n -[7] [#] Trace Test \n -\n -[9] >>AI Flag Management \n -[0] >>Main Menu \n - --- Bot Management --\n -[1] Add a Test Bot \n -[2] Order Test Bot here \n -[3] Remove Test Bot \n -[4] Stop Test Bot \n -[5] Teleport Bot here \n -[6] Teleport to Way # \n -\n -\n -\n -[0] >>Main Menu \n - --- Waylist Management --\n -[1] Delete ALL Waypoints \n -[2] Dump Waypoints \n -[3] Check For Errors \n -[4] Save Waypoints \n -[5] [#] Dynamic Mode \n -[6] [#] Dynamic Link \n -[7] [#] WAY output \n -[8] [#] QC output \n -[9] [#] BSP ents output \n -[0] Main Menu \n - -*/ - -void() bot_menu_display = -{ -// build options - local string s1, s2, s3, s4, s5, s6, s7, h; - local entity t; - -// check impulses - if (self.impulse > 0 && self.impulse < 11 && self.b_menu) - { - if (self.b_menu == MENU_MAIN) - { - if (self.impulse == 1) - { - self.b_menu = MENU_WAYPOINTS; - self.b_menu_time = time; - } - else if (self.impulse == 2) - { - self.b_menu = MENU_LINKS; - self.b_menu_time = time; - } - else if (self.impulse == 3) - { - self.b_menu = MENU_FLAGS; - self.b_menu_time = time; - } - else if (self.impulse == 4) - { - self.b_menu = MENU_BOTS; - self.b_menu_time = time; - } - else if (self.impulse == 5) - { - self.b_menu = MENU_WAYLIST; - self.b_menu_time = time; - } - else if (self.impulse == 6) - { - if (self.movetype == MOVETYPE_NOCLIP) - self.movetype = MOVETYPE_WALK; - else - self.movetype = MOVETYPE_NOCLIP; - self.b_menu_time = time; - - } - else if (self.impulse == 7) - { - if (self.flags & FL_GODMODE) - self.flags = self.flags - FL_GODMODE; - else - self.flags = self.flags | FL_GODMODE; - self.b_menu_time = time; - - } - else if (self.impulse == 8) - { - if (self.b_aiflags & AI_HOLD_SELECT) - self.b_aiflags = self.b_aiflags - AI_HOLD_SELECT; - else - self.b_aiflags = self.b_aiflags | AI_HOLD_SELECT; - self.b_menu_time = time; - } - else if (self.impulse == 9) - { - self.b_menu = 14; - self.b_menu_time = time; - } - else if (self.impulse == 10) - bot_way_edit(); - } - else if (self.b_menu == MENU_WAYPOINTS) - { - if (self.impulse == 1) - { - if (self.current_way) - setorigin(self.current_way, self.origin + self.view_ofs); - } - else if (self.impulse == 2) - { - if (self.current_way) - { - self.b_menu = 15; - self.b_menu_time = time; - self.last_way = self.current_way; - } - } - else if (self.impulse == 3) - { - make_waypoint(self.origin + self.view_ofs); - } - else if (self.impulse == 4) - { - t = make_waypoint(self.origin + self.view_ofs); - if (!LinkWays(self.current_way, t)) - sprint(self, "Unable to link them\n"); - } - else if (self.impulse == 5) - { - t = make_waypoint(self.origin + self.view_ofs); - if (!LinkWays(self.current_way, t)) - sprint(self, "Unable to link old to new\n"); - LinkWays(t, self.current_way); - } - else if (self.impulse == 6) - { - t = make_waypoint(self.origin + self.view_ofs); - if (!TeleLinkWays(self.current_way, t)) - sprint(self, "Unable to link them\n"); - } - else if (self.impulse == 7) - { - if (self.current_way) - { - sprint(self, "\nwaypoint info for waypoint #"); - h = ftos(self.current_way.count); - sprint(self, h); - sprint(self, "\nAI Flag value: "); - h = ftos(self.current_way.b_aiflags); - sprint(self, h); - - if (self.current_way.target1) - { - h = ftos(self.current_way.target1.count); - if (self.current_way.b_aiflags & AI_TELELINK_1) - sprint(self, "\nTelelink1 to:"); - else - sprint(self, "\nLink1 to:"); - sprint(self, h); - } - if (self.current_way.target2) - { - h = ftos(self.current_way.target2.count); - if (self.current_way.b_aiflags & AI_TELELINK_2) - sprint(self, "\nTelelink2 to:"); - else - sprint(self, "\nLink2 to:"); - sprint(self, h); - } - if (self.current_way.target3) - { - h = ftos(self.current_way.target3.count); - if (self.current_way.b_aiflags & AI_TELELINK_3) - sprint(self, "\nTelelink3 to:"); - else - sprint(self, "\nLink3 to:"); - sprint(self, h); - } - if (self.current_way.target4) - { - h = ftos(self.current_way.target4.count); - if (self.current_way.b_aiflags & AI_TELELINK_4) - sprint(self, "\nTelelink4 to:"); - else - sprint(self, "\nLink4 to:"); - sprint(self, h); - } - sprint(self, "\n\n"); - } - - } - if (self.impulse == 8) - { - self.b_menu = MENU_LINKS; - self.b_menu_time = time; - } - else if (self.impulse == 9) - { - self.b_menu = MENU_FLAGS; - self.b_menu_time = time; - } - else if (self.impulse == 10) - { - self.b_menu = MENU_MAIN; - self.b_menu_time = time; - } - } - else if (self.b_menu == MENU_LINKS) - { - if (self.impulse == 1) - { - if (self.current_way) - self.current_way.target1 = self.current_way.target2 = self.current_way.target3 = self.current_way.target4 = world; - } - else if (self.impulse == 2) - { - self.b_menu = 8; - self.b_menu_time = time; - self.last_way = self.current_way; - } - else if (self.impulse == 3) - { - self.b_menu = 9; - self.b_menu_time = time; - self.last_way = self.current_way; - } - else if (self.impulse == 4) - { - self.b_menu = 10; - self.b_menu_time = time; - self.last_way = self.current_way; - } - else if (self.impulse == 5) - { - self.b_menu = 11; - self.b_menu_time = time; - self.last_way = self.current_way; - } - else if (self.impulse == 6) - { - self.b_menu = 12; - self.b_menu_time = time; - self.last_way = self.current_way; - } - else if (self.impulse == 7) - make_waypoint(self.origin + self.view_ofs); - else if (self.impulse == 8) - { - self.b_menu = MENU_WAYPOINTS; - self.b_menu_time = time; - } - else if (self.impulse == 9) - { - self.b_menu = MENU_FLAGS; - self.b_menu_time = time; - } - else if (self.impulse == 10) - { - self.b_menu = MENU_MAIN; - self.b_menu_time = time; - } - } - else if (self.b_menu == MENU_FLAGS) - { - - if (self.current_way) - { - if (self.impulse == 1) - { - if (self.current_way.b_aiflags & AI_DOORFLAG) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_DOORFLAG); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_DOORFLAG; - - self.b_menu_time = time; - } - else if (self.impulse == 2) - { - if (self.current_way.b_aiflags & AI_PRECISION) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_PRECISION); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_PRECISION; - self.b_menu_time = time; - } - else if (self.impulse == 3) - { - if (self.current_way.b_aiflags & AI_SURFACE) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_SURFACE); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_SURFACE; - self.b_menu_time = time; - } - else if (self.impulse == 4) - { - if (self.current_way.b_aiflags & AI_BLIND) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_BLIND); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_BLIND; - self.b_menu_time = time; - } - else if (self.impulse == 5) - { - if (self.current_way.b_aiflags & AI_JUMP) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_JUMP); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_JUMP; - self.b_menu_time = time; - } - else if (self.impulse == 6) - { - if (self.current_way.b_aiflags & AI_DIRECTIONAL) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_DIRECTIONAL); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_DIRECTIONAL; - self.b_menu_time = time; - } - else if (self.impulse == 7) - { - if (self.current_way.b_aiflags & AI_SUPER_JUMP) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_SUPER_JUMP); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_SUPER_JUMP; - self.b_menu_time = time; - } - else if (self.impulse == 8) - { - if (self.current_way.b_aiflags & AI_CARELESS) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_CARELESS); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_CARELESS; - self.b_menu_time = time; - } - } - if (self.impulse == 9) - { - self.b_menu = MENU_FLAGS2; - self.b_menu_time = time; - } - else if (self.impulse == 10) - { - self.b_menu = MENU_MAIN; - self.b_menu_time = time; - } - } - else if (self.b_menu == MENU_FLAGS2) - { - - if (self.current_way) - { - if (self.impulse == 1) - { - if (self.current_way.b_aiflags & AI_DIFFICULT) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_DIFFICULT); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_DIFFICULT; self.b_menu_time = time; - } - else if (self.impulse == 2) - { - if (self.current_way.b_aiflags & AI_PLAT_BOTTOM) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_PLAT_BOTTOM); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_PLAT_BOTTOM; - self.b_menu_time = time; - } - else if (self.impulse == 3) - { - if (self.current_way.b_aiflags & AI_RIDE_TRAIN) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_RIDE_TRAIN); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_RIDE_TRAIN; - self.b_menu_time = time; - } - else if (self.impulse == 4) - { - if (self.current_way.b_aiflags & AI_DOOR_NO_OPEN) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_DOOR_NO_OPEN); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_DOOR_NO_OPEN; - self.b_menu_time = time; - } - else if (self.impulse == 5) - { - if (self.current_way.b_aiflags & AI_AMBUSH) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_AMBUSH); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_AMBUSH; - self.b_menu_time = time; - } - else if (self.impulse == 6) - { - if (self.current_way.b_aiflags & AI_SNIPER) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_SNIPER); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_SNIPER; - self.b_menu_time = time; - } - else if (self.impulse == 7) - { - if (self.current_way.b_aiflags & AI_TRACE_TEST) - self.current_way.b_aiflags = self.current_way.b_aiflags - (self.current_way.b_aiflags & AI_TRACE_TEST); - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_TRACE_TEST; - self.b_menu_time = time; - } - - } - if (self.impulse == 9) - { - self.b_menu = MENU_FLAGS; - self.b_menu_time = time; - } - else if (self.impulse == 10) - { - self.b_menu = MENU_MAIN; - self.b_menu_time = time; - } - } - - else if (self.b_menu == MENU_BOTS) - { - if (self.impulse == 1) - { - self.impulse = 100; - return; - } - else if (self.impulse == 2) - { - b_temp3 = self; - self = player_head; - while(self) - { - if (!self.ishuman) - { - target_add(b_temp3); - bot_get_path(b_temp3, TRUE); - self = world; - } - else - self = self._next; - } - self = b_temp3; - } - else if (self.impulse == 3) - { - self.impulse = 102; - return; - } - else if (self.impulse == 4) - { - b_temp1 = self; - self = player_head; - while(self) - { - if (!self.ishuman) - { - self.target1 = self.target2 = self.target3 = self.target4 = world; - route_table = world; - } - self = self._next; - } - self = b_temp1; - } - else if (self.impulse == 5) - { - if (self.current_way) - { - b_temp1 = self; - self = player_head; - while(self) - { - if (!self.ishuman) - { - setorigin(self, b_temp1.current_way.origin); - } - self = self._next; - } - self = b_temp1; - } - else - sprint(self, "select a waypoint first\n"); - } - else if (self.impulse == 6) - { - self.b_menu = 14; - self.b_menu_time = time; - } - else if (self.impulse == 10) - { - self.b_menu = MENU_MAIN; - self.b_menu_time = time; - } - } - else if (self.b_menu == MENU_WAYLIST) - { - if (self.impulse == 1) - { - self.b_menu = 13; - self.b_menu_time = time; - } - else if (self.impulse == 2) - { - if (dump_mode == 0) - DumpWaypoints(); - else if (dump_mode == 1) - QCDumpWaypoints(); - else if (dump_mode == 2) - BSPDumpWaypoints(); - } - else if (self.impulse == 3) - { - t = way_head; - while(t) - { - if ((t.target1 == world) && (t.target2 == world) && (t.target3 == world) && (t.target4 == world)) - { - sprint(self, "Waypoint #"); - h = ftos(t.count); - sprint(self, h); - sprint(self, " has no outbound links\n"); - } - if ((t.target1 == t) || (t.target2 == t) || (t.target3 == t) || (t.target4 == t)) - { - sprint(self, "Waypoint #"); - h = ftos(t.count); - sprint(self, h); - sprint(self, " links to itself (??)\n"); - } - t = t._next; - } - sprint(self, "Error check complete\n"); - } - else if (self.impulse == 4) - { - sprint(self, "not in this version (FBX 0.10.0)\n"); - } - else if (self.impulse == 5) - { - if (waypoint_mode == WM_EDITOR_DYNAMIC) - waypoint_mode = WM_EDITOR; - else - waypoint_mode = WM_EDITOR_DYNAMIC; - self.b_menu_time = time; - - } - else if (self.impulse == 6) - { - if (waypoint_mode == WM_EDITOR_DYNLINK) - waypoint_mode = WM_EDITOR; - else - waypoint_mode = WM_EDITOR_DYNLINK; - self.b_menu_time = time; - } - else if (self.impulse == 7) - { - dump_mode = 0; - self.b_menu_time = time; - } - else if (self.impulse == 8) - { - dump_mode = 1; - self.b_menu_time = time; - } - else if (self.impulse == 9) - { - dump_mode = 2; - self.b_menu_time = time; - } - else if (self.impulse == 10) - { - self.b_menu = MENU_MAIN; - self.b_menu_time = time; - } - } - else if (self.b_menu == 8) - { - if (self.impulse == 1) - { - if (self.current_way) - { - if (!LinkWays(self.last_way, self.current_way)) - sprint(self, "Unable to link them\n"); - self.b_menu = MENU_LINKS; - self.b_menu_time = time; - } - } - else if (self.impulse == 2) - { - self.b_menu = MENU_LINKS; - self.b_menu_time = time; - } - } - else if (self.b_menu == 9) - { - if (self.impulse == 1) - { - if (self.current_way) - { - if (!TeleLinkWays(self.last_way, self.current_way)) - sprint(self, "Unable to link them\n"); - self.b_menu = MENU_LINKS; - self.b_menu_time = time; - } - } - else if (self.impulse == 2) - { - self.b_menu = MENU_LINKS; - self.b_menu_time = time; - } - } - else if (self.b_menu == 10) - { - if (self.impulse == 1) - { - if (self.current_way) - { - UnlinkWays(self.last_way, self.current_way); - self.b_menu = MENU_LINKS; - self.b_menu_time = time; - } - } - else if (self.impulse == 2) - { - self.b_menu = MENU_LINKS; - self.b_menu_time = time; - } - } - else if (self.b_menu == 11) - { - if (self.impulse == 1) - { - if (self.current_way) - { - if (!LinkWays(self.last_way, self.current_way)) - sprint(self, "Unable to link 1 to 2\n"); - if (!LinkWays(self.current_way, self.last_way)) - sprint(self, "Unable to link 2 to 1\n"); - self.b_menu = MENU_LINKS; - self.b_menu_time = time; - } - } - else if (self.impulse == 2) - { - self.b_menu = MENU_LINKS; - self.b_menu_time = time; - } - } - else if (self.b_menu == 12) - { - if (self.impulse == 1) - { - if (self.current_way) - { - UnlinkWays(self.last_way, self.current_way); - UnlinkWays(self.current_way, self.last_way); - self.b_menu = MENU_LINKS; - self.b_menu_time = time; - } - } - else if (self.impulse == 2) - { - self.b_menu = MENU_LINKS; - self.b_menu_time = time; - } - } - else if (self.b_menu == 13) - { - if (self.impulse == 1) - { - ClearAllWays(); - self.b_menu = MENU_WAYLIST; - self.b_menu_time = time; - } - else if (self.impulse == 2) - { - self.b_menu = MENU_WAYLIST; - self.b_menu_time = time; - } - } - else if (self.b_menu == 14) - { - if (self.impulse == 10) - self.impulse = 0; - self.b_menu_value = self.b_menu_value * 10 + self.impulse; - self.b_menu_time = 0; - } - else if (self.b_menu == 15) - { - if (self.impulse == 1) - { - delete_waypoint(self.last_way); - self.b_menu = MENU_WAYPOINTS; - self.b_menu_time = time; - } - else if (self.impulse == 2) - { - self.b_menu = MENU_WAYPOINTS; - self.b_menu_time = time; - } - } - self.impulse = 0; - - } - if (self.b_menu_time < time) - { - if (self.b_menu == MENU_MAIN) - { - s1 = "-- Main Menu --\n[1] >>Waypoint Management\n[2] >>Link Management \n[3] >>AI Flag Management \n[4] >>Bot Management \n[5] >>Waylist Management \n"; - if (self.movetype == MOVETYPE_NOCLIP) - s2 = "[6] [#] Noclip \n"; - else - s2 = "[6] [ ] Noclip \n"; - - if (self.flags & FL_GODMODE) - s3 = "[7] [#] Godmode \n"; - else - s3 = "[7] [ ] Godmode \n"; - if (self.b_aiflags & AI_HOLD_SELECT) - s4 = "[8] [#] Hold Select \n"; - else - s4 = "[8] [ ] Hold Select \n"; - s5 = "[9] Teleport to Way # \n[0] Close Menu \n"; - } - else if (self.b_menu == MENU_WAYPOINTS) - { - s1 = "-- Waypoint Management --\n[1] Move Waypoint \n[2] Delete Waypoint \n[3] Make Waypoint \n[4] Make Way + Link \n[5] Make Way + Link X2 \n[6] Make Way + Telelink \n[7] Show waypoint info \n[8] >>Link Management \n[9] >>AI Flag Management \n[0] >>Main Menu \n"; - } - else if (self.b_menu == MENU_LINKS) - { - s1 = "-- Link Management --\n[1] Unlink Waypoint \n[2] Create Link \n[3] Create Telelink \n[4] Delete Link \n[5] Create Link X2 \n[6] Delete Link X2 \n[7] >Make Waypoint \n[8] >>Waypoint Management\n[9] >>AI Flag Management \n[0] >>Main Menu \n"; - } - else if (self.b_menu == MENU_FLAGS) - { - if (self.current_way.b_aiflags & AI_DOORFLAG) - s1 = "-- AI Flag Management --\n[1] [#] Door Flag \n"; - else - s1 = "-- AI Flag Management --\n[1] [ ] Door Flag \n"; - - if (self.current_way.b_aiflags & AI_PRECISION) - s2 = "[2] [#] Precision \n"; - else - s2 = "[2] [ ] Precision \n"; - - if (self.current_way.b_aiflags & AI_SURFACE) - s3 = "[3] [#] Surface for air \n"; - else - s3 = "[3] [ ] Surface for air \n"; - - if (self.current_way.b_aiflags & AI_BLIND) - s4 = "[4] [#] Blind mode \n"; - else - s4 = "[4] [ ] Blind mode \n"; - - if (self.current_way.b_aiflags & AI_JUMP) - s5 = "[5] [#] Jump \n"; - else - s5 = "[5] [ ] Jump \n"; - - if (self.current_way.b_aiflags & AI_DIRECTIONAL) - s6 = "[6] [#] Directional \n"; - else - s6 = "[6] [ ] Directional \n"; - - // Electro - eww - if ( (self.current_way.b_aiflags & AI_SUPER_JUMP) && (self.current_way.b_aiflags & AI_CARELESS) ) - s7 = "[7] [#] Super Jump \n[8] [#] Careless \n[9] >>AI Flags page 2 \n[0] >>Main Menu \n"; - else if ( (self.current_way.b_aiflags & AI_SUPER_JUMP) && (!(self.current_way.b_aiflags & AI_CARELESS)) ) - s7 = "[7] [#] Super Jump \n[8] [ ] Careless \n[9] >>AI Flags page 2 \n[0] >>Main Menu \n"; - else if ( (!(self.current_way.b_aiflags & AI_SUPER_JUMP)) && (self.current_way.b_aiflags & AI_CARELESS) ) - s7 = "[7] [ ] Super Jump \n[8] [#] Careless \n[9] >>AI Flags page 2 \n[0] >>Main Menu \n"; - else if ( (!(self.current_way.b_aiflags & AI_SUPER_JUMP)) && (!(self.current_way.b_aiflags & AI_CARELESS)) ) - s7 = "[7] [ ] Super Jump \n[8] [ ] Careless \n[9] >>AI Flags page 2 \n[0] >>Main Menu \n"; - } - else if (self.b_menu == MENU_FLAGS2) - { - if (self.current_way.b_aiflags & AI_DIFFICULT) - s1 = "-- AI Flags pg. 2--\n[1] [#] Difficult \n"; - else - s1 = "-- AI Flags pg. 2--\n[1] [ ] Difficult \n"; - - if (self.current_way.b_aiflags & AI_PLAT_BOTTOM) - s2 = "[2] [#] Wait for plat \n"; - else - s2 = "[2] [ ] Wait for plat \n"; - - if (self.current_way.b_aiflags & AI_RIDE_TRAIN) - s3 = "[3] [#] Ride train \n"; - else - s3 = "[3] [ ] Ride train \n"; - - if (self.current_way.b_aiflags & AI_DOOR_NO_OPEN) - s4 = "[4] [#] Door flag no open\n"; - else - s4 = "[4] [ ] Door flag no open\n"; - - if (self.current_way.b_aiflags & AI_AMBUSH) - s5 = "[5] [#] Ambush \n"; - else - s5 = "[5] [ ] Ambush \n"; - - if (self.current_way.b_aiflags & AI_SNIPER) - s6 = "[6] [#] Snipe \n"; - else - s6 = "[6] [ ] Snipe \n"; - - if (self.current_way.b_aiflags & AI_TRACE_TEST) - s7 = "[7] [#] Trace Test \n\n[9] >>AI Flag Management \n[0] >>Main Menu \n"; - else - s7 = "[7] [ ] Trace Test \n\n[9] >>AI Flag Management \n[0] >>Main Menu \n"; - - } - else if (self.b_menu == MENU_BOTS) - { - s1 = "-- Bot Management --\n[1] Add a Test Bot \n[2] Order Test Bot here \n[3] Remove Test Bot \n[4] Stop Test Bot \n[5] Teleport Bot here \n[6] Teleport to Way # \n\n\n\n[0] >>Main Menu \n"; - } - else if (self.b_menu == MENU_WAYLIST) - { - s1 = "-- Waylist Management --\n[1] Delete ALL Waypoints \n[2] Dump Waypoints \n[3] Check For Errors \n[4] Save Waypoints \n"; - - if (waypoint_mode == WM_EDITOR_DYNAMIC) - s2 = "[5] [#] Dynamic Mode \n[6] [#] Dynamic Link \n"; - else if (waypoint_mode == WM_EDITOR_DYNLINK) - s2 = "[5] [ ] Dynamic Mode \n[6] [#] Dynamic Link \n"; - else - s2 = "[5] [ ] Dynamic Mode \n[6] [ ] Dynamic Link \n"; - if (dump_mode == 0) - s3 = "[7] [#] WAY output \n[8] [ ] QC output \n[9] [ ] BSP ents output \n[0] Main Menu \n"; - else if (dump_mode == 1) - s3 = "[7] [ ] WAY output \n[8] [#] QC output \n[9] [ ] BSP ents output \n[0] Main Menu \n"; - else if (dump_mode == 2) - s3 = "[7] [ ] WAY output \n[8] [ ] QC output \n[9] [#] BSP ents output \n[0] Main Menu \n"; - - } - else if (self.b_menu == 8) - s1 = "-- Link Ways --\n\nSelect another way and push 1\nor press 2 to cancel"; - else if (self.b_menu == 9) - s1 = "-- Telelink Ways --\n\nSelect another way and push 1\nor press 2 to cancel"; - else if (self.b_menu == 10) - s1 = "-- Delete Link --\n\nSelect another way and push 1\nor press 2 to cancel"; - else if (self.b_menu == 11) - s1 = "-- Create Link X2 --\n\nSelect another way and push 1\nor press 2 to cancel"; - else if (self.b_menu == 12) - s1 = "-- Delete Link X2 --\n\nSelect another way and push 1\nor press 2 to cancel"; - else if (self.b_menu == 13) - s1 = "-- Delete ALL Ways --\n\nAre you sure? Push 1 to go\nthrough with it, 2 to cancel"; - else if (self.b_menu == 14) - { - s1 = "-- Teleport to Way # --\n\nEnter way number and press\nimpulse 104 to warp\n\nWaypoint #"; - s2 = ftos(self.b_menu_value); - - } - else if (self.b_menu == 15) - s1 = "-- Delete Waypoint --\n\nAre you sure? Push 1 to go\nthrough with it, 2 to cancel"; - frik_big_centerprint(self, s1, s2, s3, s4, s5, s6, s7); - self.b_menu_time = time + 1.25; - } -}; - - -// engage menu -void() bot_way_edit = -{ - local entity t; - local float f; - if (self.b_menu_value) - { - if (self.b_menu == 14) - { - t = WaypointForNum(self.b_menu_value); - if (t) - setorigin(self, t.origin - self.view_ofs); - else - sprint(self, "No waypoint with that number\n"); - - self.b_menu = MENU_MAIN; - self.b_menu_time = time; - } - self.b_menu_value = 0; - return; - } - if (waypoint_mode < WM_EDITOR) - { - self.b_menu = MENU_MAIN; - waypoint_mode = WM_EDITOR; - self.b_menu_time = 0; - cvar_set("saved2", "0"); - WriteByte(MSG_ALL, 8); - WriteByte(MSG_ALL, 1); - WriteString(MSG_ALL, "MAKE SURE THE FOLLOWING LINE CONTAINS -CONDEBUG BEFORE PROCEEDING\n"); - localcmd("cmdline\n"); - t = way_head; - while (t) - { - setmodel(t, "progs/s_bubble.spr"); // show the waypoints // file missing from nexuiz - t = t._next; - } - if (self.current_way) - setmodel(self.current_way, "progs/s_light.spr"); // file missing from nexuiz - } - else - { - saved2 = cvar("saved2"); - if (saved2 != 0) - { - f = self.b_menu; - self.b_menu = floor(saved2/16); - self.impulse = saved2 & 15; - bot_menu_display(); - self.b_menu = f; - cvar_set("saved2", "0"); - return; - } - self.b_menu = 0; - waypoint_mode = WM_LOADED; - t = way_head; - while (t) - { - setmodel(t, string_null); // hide the waypoints - t = t._next; - } - } -}; - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Waypoint Saving to file. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - - -// bytecount is really iffy -// since there is no true way to determine the length of an ftos -// it uses an approximate of 5 -// various other things are guesses, but I don't cut it at the absolute -// max so it should be okay - -void() PrintWaypoint = -{ - local entity t; - local float needcolon; - local string h; - - if (self.enemy == world) - t = way_head; - else - t = self.enemy._next; - if (bytecounter >= 8000) - { - bprint("exec maps/"); - bprint(mapname); - bprint(".wa"); - h = ftos(filecount); - bprint(h); - filecount = filecount + 1; - bprint("\n// **** break here **** \n"); - bytecounter = 26; - } - if (t == world) - { - remove(self); - fixer = world; - bprint("saved4 3\n// end waypoint dump\n"); - bytecounter = bytecounter + 27; - return; - } - if ((t.origin_x != saved1) || (t.count == 1)) - { - bprint("saved1 "); - h = ftos(t.origin_x); - bprint(h); - saved1 = t.origin_x; - bytecounter = bytecounter + 12; - needcolon = TRUE; - } - if ((t.origin_y != saved2) || (t.count == 1)) - { - if (needcolon) - { - bprint("; "); - bytecounter = bytecounter + 2; - } - else - needcolon = TRUE; - bprint("saved2 "); - h = ftos(t.origin_y); - bprint(h); - bytecounter = bytecounter + 12; - saved2 = t.origin_y; - } - if ((t.origin_z != saved3) || (t.count == 1)) - { - if (needcolon) - { - bprint("; "); - bytecounter = bytecounter + 2; - } - else - needcolon = TRUE; - bprint("saved3 "); - h = ftos(t.origin_z); - bprint(h); - bytecounter = bytecounter + 12; - saved3 = t.origin_z; - } - bytecounter = bytecounter + 1; - bprint("\n"); - needcolon = FALSE; - if ((scratch1 != t.target1.count) || t.count == 1) - { - needcolon = TRUE; - bprint("scratch1 "); - bytecounter = bytecounter + 14; - h = ftos(t.target1.count); - bprint(h); - scratch1 = t.target1.count; - } - if ((scratch2 != t.target2.count) || t.count == 1) - { - if (needcolon) - { - bprint("; "); - bytecounter = bytecounter + 2; - } - else - needcolon = TRUE; - bprint("scratch2 "); - bytecounter = bytecounter + 14; - h = ftos(t.target2.count); - bprint(h); - scratch2 = t.target2.count; - } - if ((scratch3 != t.target3.count) || t.count == 1) - { - if (needcolon) - { - bprint("; "); - bytecounter = bytecounter + 2; - } - else - needcolon = TRUE; - bprint("scratch3 "); - bytecounter = bytecounter + 14; - h = ftos(t.target3.count); - bprint(h); - scratch3 = t.target3.count; - } - if ((scratch4 != t.target4.count) || t.count == 1) - { - if (needcolon) - { - bprint("; "); - bytecounter = bytecounter + 2; - } - else - needcolon = TRUE; - bprint("scratch4 "); - bytecounter = bytecounter + 14; - h = ftos(t.target4.count); - bprint(h); - scratch4 = t.target4.count; - } - bprint("\nsaved4 "); - bytecounter = bytecounter + 19; - if (t.count != 1) - h = ftos(t.b_aiflags * 4 + 2); - else - h = ftos(t.b_aiflags * 4 + 1); - bprint(h); - bprint ("; wait\n"); - self.nextthink = time + 0.01; - self.enemy = t; -}; - -// to allow for 100+ waypoints, we need to trick the runaway loop counter -void() DumpWaypoints = -{ - bytecounter = 50; - filecount = 1; - - bprint("// "); - bprint(world.message); - bprint("- maps/"); - bprint(mapname); - bprint(".way\n"); - bprint("// Ways by "); - bprint(self.netname); - bprint("\n"); - if (!fixer) - { - fixer = spawn(); - fixer.nextthink = time + 0.01; - fixer.think = PrintWaypoint; - fixer.enemy = world; - } -}; - -void() PrintQCWaypoint = -{ - local entity t; - local string h; - - if (self.enemy == world) - t = way_head; - else - t = self.enemy._next; - - if (t == world) - { - remove(self); - fixer = world; - bprint("};\n\n// End dump\n"); - return; - } - bprint(" make_way("); - h = vtos(t.origin); - bprint(h); - bprint(", '"); - h = ftos(t.target1.count); - bprint(h); - bprint(" "); - h = ftos(t.target2.count); - bprint(h); - bprint(" "); - h = ftos(t.target3.count); - bprint(h); - bprint("', "); - h = ftos(t.target4.count); - bprint(h); - bprint(", "); - h = ftos(t.b_aiflags); - bprint(h); - bprint(");\n"); - self.nextthink = time + 0.01; - self.enemy = t; - -}; -void() QCDumpWaypoints = -{ - bprint("/* QC Waypoint Dump - src/frikbot/map_"); - - bprint(mapname); - bprint(".qc\nFor instructions please read the\nreadme.html that comes with FrikBot */\n\nvoid(vector org, vector bit1, float bit4, float flargs) make_way;\n"); - bprint("// Ways by "); - bprint(self.netname); - bprint("\n\n"); - - bprint("void() map_"); - bprint(mapname); - bprint(" =\n{\n"); - - - if (!fixer) - { - fixer = spawn(); - fixer.nextthink = time + 0.01; - fixer.think = PrintQCWaypoint; - fixer.enemy = world; - } -}; - -void() PrintBSPWaypoint = -{ - local entity t; - local string h; - - if (self.enemy == world) - t = way_head; - else - t = self.enemy._next; - - if (t == world) - { - bprint("\n\n// End dump\n"); - remove(self); - fixer = world; - return; - } - bprint("{\n\"classname\" \"waypoint\"\n\"origin\" \""); - h = ftos(t.origin_x); - bprint(h); - bprint(" "); - h = ftos(t.origin_y); - bprint(h); - bprint(" "); - h = ftos(t.origin_z); - bprint(h); - if (t.target1.count) - { - bprint("\"\n\"b_pants\" \""); - h = ftos(t.target1.count); - bprint(h); - } - if (t.target2.count) - { - bprint("\"\n\"b_skill\" \""); - h = ftos(t.target2.count); - bprint(h); - } - if (t.target3.count) - { - bprint("\"\n\"b_shirt\" \""); - h = ftos(t.target3.count); - bprint(h); - } - if (t.target4.count) - { - bprint("\"\n\"b_frags\" \""); - h = ftos(t.target4.count); - bprint(h); - } - if (t.b_aiflags) - { - bprint("\"\n\"b_aiflags\" \""); - h = ftos(t.b_aiflags); - bprint(h); - } - bprint("\"\n}\n"); - self.nextthink = time + 0.01; - self.enemy = t; - -}; -void() BSPDumpWaypoints = -{ - bprint("/* BSP entities Dump - maps/"); - - bprint(mapname); - bprint(".ent\nFor instructions please read the\nreadme.html that comes with FrikBot */\n\n\n"); - - if (!fixer) - { - fixer = spawn(); - fixer.nextthink = time + 0.01; - fixer.think = PrintBSPWaypoint; - fixer.enemy = world; - } -}; diff --git a/attic/TeamNexuiz/game/gamec/bot_fight.c b/attic/TeamNexuiz/game/gamec/bot_fight.c deleted file mode 100644 index 36cd200a5..000000000 --- a/attic/TeamNexuiz/game/gamec/bot_fight.c +++ /dev/null @@ -1,438 +0,0 @@ -/*********************************************** -* * -* FrikBot Fight Code * -* "Because I ain't no Ghandi code" * -* * -***********************************************/ - -/* - -This program is in the Public Domain. My crack legal -team would like to add: - -RYAN "FRIKAC" SMITH IS PROVIDING THIS SOFTWARE "AS IS" -AND MAKES NO WARRANTY, EXPRESS OR IMPLIED, AS TO THE -ACCURACY, CAPABILITY, EFFICIENCY, MERCHANTABILITY, OR -FUNCTIONING OF THIS SOFTWARE AND/OR DOCUMENTATION. IN -NO EVENT WILL RYAN "FRIKAC" SMITH BE LIABLE FOR ANY -GENERAL, CONSEQUENTIAL, INDIRECT, INCIDENTAL, -EXEMPLARY, OR SPECIAL DAMAGES, EVEN IF RYAN "FRIKAC" -SMITH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES, IRRESPECTIVE OF THE CAUSE OF SUCH DAMAGES. - -You accept this software on the condition that you -indemnify and hold harmless Ryan "FrikaC" Smith from -any and all liability or damages to third parties, -including attorney fees, court costs, and other -related costs and expenses, arising out of your use -of this software irrespective of the cause of said -liability. - -The export from the United States or the subsequent -reexport of this software is subject to compliance -with United States export control and munitions -control restrictions. You agree that in the event you -seek to export this software, you assume full -responsibility for obtaining all necessary export -licenses and approvals and for assuring compliance -with applicable reexport restrictions. - -Any reproduction of this software must contain -this notice in its entirety. - -*/ - -.entity avoid; - -float(entity e) bot_size_player = -{ - local float sz; - - sz = e.health + e.armorvalue * e.armortype; - if (e.weapon == WEP_ROCKET_LAUNCHER) - sz = sz + 60; - else if (e.weapon == WEP_HAGAR) - sz = sz + 60; - else if (e.weapon == WEP_NEX) - sz = sz + 60; - else if (e.weapon == WEP_CRYLINK) - sz = sz + 50; - else if (e.weapon == WEP_ELECTRO) - sz = sz + 50; - else if (e.weapon == WEP_GRENADE_LAUNCHER) - sz = sz + 40; - else if (e.weapon == WEP_UZI) - sz = sz + 40; - else if (e.weapon == WEP_SHOTGUN) - sz = sz + 10; - else if (e.weapon == WEP_LASER) - sz = sz - 50; - if (e.items & 4194304) // Quad - sz = sz + 200; - if (e.items & 1048576) // Invul - sz = sz + 300; - if (e.items & 524288) // Invis - sz = sz + 250; - return sz; -}; - -void() bot_dodge_stuff = -{ - local entity foe; - local float foedist, avdist, foesz, flen, tsz; - local vector v; - - if (waypoint_mode > WM_LOADED) - return; - - self.avoid = world; - - - if (self.enemy) - { - v = self.origin - realorigin(self.enemy); - foedist = vlen(v); - foesz = bot_size_player(self.enemy); - } - else - { - foedist = 3000; - foesz = 9999999; - } - avdist = 256; - - foe = find(world, classname, "grenade"); - while(foe) - { - flen = vlen(foe.origin - self.origin); - if (flen < avdist) - { - avdist = flen; - self.avoid = foe; - } - foe = find(foe, classname, "grenade"); - } - if (!self.avoid) - { - foe = find(world, classname, "missile"); - while(foe) - { - if (foe.owner != self) - { - flen = vlen(foe.origin - self.origin); - if (flen < avdist) - { - avdist = flen; - self.avoid = foe; - } - } - foe = find(foe, classname, "missile"); - } - if (!self.avoid) - { - foe = find(world, classname, "spike"); - while(foe) - { - if (foe.owner != self) - { - flen = vlen(foe.origin - self.origin); - if (flen < avdist) - { - avdist = flen; - self.avoid = foe; - } - } - foe = find(foe, classname, "spike"); - } - } - } - if (coop) - { - if (!self.enemy) - { - foe = findradius(self.origin, foedist); - while(foe) - { - if(foe.flags & FL_MONSTER) - { - if(foe.health > 0) - { - flen = vlen(foe.origin - self.origin); - if (flen < foedist) - { - tsz = bot_size_player(foe); - if (tsz < foesz) - { - if (fisible(foe)) - { - self.enemy = foe; - foedist = flen; - foesz = tsz; - } - } - } - } - } - foe = foe.chain; - } - } - } - else - { - foe = player_head; - while(foe) - { - if(foe != self) - { - if (foe.modelindex != 0) - { - if (foe.health > 0) - { - if (!(teamplay && self.team == foe.team)) - { - flen = vlen(foe.origin - self.origin); - if (flen < foedist) - { - tsz = bot_size_player(foe); - if (tsz < foesz) - { - if (fov(foe) || foe.b_sound > time || self.b_skill == 3) - { - if (fisible(foe)) - { - self.enemy = foe; - foedist = vlen(foe.origin - self.origin); - } - } - } - } - } - } - } - } - foe = foe._next; - } - } -}; - - - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -weapon_range - -_x "sweet spot range" - try to maintain this range if possible -_y minimum range bot can be to be effective (rl/gl) (move away) -_z maximum range bot can be to be effective (lg/axe) (move in) --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -vector(float wep) weapon_range = -{ - if (wep == IT_LASER) // IT_AXE - return '48 0 300'; - else if (wep == IT_SHOTGUN) // IT_SHOTGUN - return '128 0 99999'; - else if (wep == IT_CRYLINK) // IT_SUPER_SHOTGUN - return '128 0 99999'; - else if (wep == IT_UZI) // IT_NAILGUN - return '180 0 3000'; - else if (wep == IT_HAGAR) // IT_SUPER_NAILGUN - return '180 48 3000'; - else if (wep == IT_GRENADE_LAUNCHER) // IT_GRENADE_LAUNCHER - return '180 48 3000'; - else if (wep == IT_ELECTRO) // IT_ROCKET_LAUNCHER - return '180 48 3000'; - else if (wep == IT_ROCKET_LAUNCHER) // IT_ROCKET_LAUNCHER - return '180 48 3000'; - else if (wep == IT_NEX) // IT_LIGHTNING - return '350 0 99999'; - return '48 0 300'; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -bot_weapon_switch - -Pick a weapon based on range / ammo - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void(float brange) bot_weapon_switch = -{ - local float it, flag, pulse; - local vector v; - - it = self.items & 127; - pulse = 0; - - while(it) - { - if ((self.ammo_rockets >= 3) && (it & IT_ROCKET_LAUNCHER)){flag = IT_ROCKET_LAUNCHER;pulse = 9;} - else if ((self.ammo_rockets >= 1) && (it & IT_HAGAR)){flag = IT_HAGAR;pulse = 8;} - else if ((self.ammo_cells >= 5) && (it & IT_NEX)){flag = IT_NEX;pulse = 7;} - else if ((self.ammo_cells >= 1) && (it & IT_CRYLINK)){flag = IT_CRYLINK;pulse = 6;} - else if ((self.ammo_cells >= 2) && (it & IT_ELECTRO)){flag = IT_ELECTRO;pulse = 5;} - else if ((self.ammo_rockets >= 3) && (it & IT_GRENADE_LAUNCHER)){flag = IT_GRENADE_LAUNCHER;pulse = 4;} - else if ((self.ammo_nails >= 1) && (it & IT_UZI)){flag = IT_UZI;pulse = 3;} - else if ((self.ammo_shells >= 1) && (it & IT_SHOTGUN)){flag = IT_SHOTGUN;pulse = 2;} - else - { - if (pulse) - self.impulse = pulse; - return; - } - - if (brange == -1) - { - if (pulse) - self.impulse = pulse; - return; - } - - v = weapon_range(flag); - if (brange < v_y || brange > v_z) - it = it - flag; - else - { - if (pulse) - self.impulse = pulse; - return; - } - } -}; - -void() bot_shoot = -{ - // quick little function to stop making him shoot the wrong way ! Argh - local float g; - g = angcomp(self.v_angle_x, self.b_angle_x); - if (fabs(g) > 30) - return; // argh, too far away - g = angcomp(self.v_angle_y, self.b_angle_y); - if (fabs(g) > 30) - return; // not again! - self.button0 = TRUE; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Bot_fight_style - -This is the core of the bot's thinking when -attacking an enemy. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() bot_fight_style = -{ - local vector v, v1, v2, org; - local float foedist, mysz, foesz; - - - if (self.enemy.health <= 0) - { - self.enemy = world; - return; - } - else if (!self.enemy.takedamage) - { - self.enemy = world; - return; - } - else if (!fisible(self.enemy)) - { - self.enemy = world; - return; - } - - org = realorigin(self.enemy); - makevectors(self.v_angle); - - // decide if I should shoot - - foedist = vlen(org - self.origin); - v = weapon_range(self.weapon); - if (foedist > v_y && foedist < v_z) - { - traceline(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * v_z, FALSE, self); - if (vlen(trace_endpos - (self.origin + self.view_ofs)) >= v_y) - { - // try to avoid shooting teammates - if (trace_ent.classname == "player") - if ((trace_ent.team == self.team && teamplay) || (coop)) - return; - bot_shoot(); - } - } - else - bot_weapon_switch(foedist); - - if (!(self.b_aiflags & (AI_PRECISION | AI_BLIND | AI_OBSTRUCTED))) - { - foesz = bot_size_player(self.enemy); - mysz = bot_size_player(self) + 5; - - if (foesz > mysz) - { - if (teamplay) - { - if (random() < 0.02) - { - bot_start_topic(5); - self.b_chattime = 1; - } - } - - return; - } - else if (mysz < 140) - return; - else if (self.avoid) - { - if (self.avoid.velocity) - v = self.avoid.velocity; - else - v = normalize(self.avoid.origin - self.origin); - v1_x = v_y; - v1_y = v_y * -1; - v2_x = v_y; - v2_y = v_y * -1; - foedist = vlen(self.avoid.origin - (self.origin + v1)); - if (foedist < vlen(self.avoid.origin - (self.origin + v2))) - frik_walkmove(v2); - else - frik_walkmove(v1); - } - else if (!self.enemy.flags & FL_MONSTER) - { - if (foedist + 32 < v_x) - frik_walkmove(self.origin - org); - else if (foedist - 32 > v_x) - frik_walkmove(org - self.origin); - else if (self.wallhug) - frik_walkmove(v_right); - else - frik_walkmove(v_right * -1); - } - } - else - { - foesz = bot_size_player(self.enemy); - mysz = bot_size_player(self) + 5; - - if (foesz > mysz) - return; - else if (mysz < 140) - return; - self.keys = self.keys & 960; - } -}; - - diff --git a/attic/TeamNexuiz/game/gamec/bot_maps.c b/attic/TeamNexuiz/game/gamec/bot_maps.c deleted file mode 100644 index a28220003..000000000 --- a/attic/TeamNexuiz/game/gamec/bot_maps.c +++ /dev/null @@ -1,152 +0,0 @@ -void(vector org, vector bit1, float bit4, float flargs) make_way; -// Ways by Electro - -void() map_mattrye1_nex = -{ - make_way('655.3 370.1 -34.0', '2 43 0', 0, 0); - make_way('214.7 338.9 -34.0', '1 3 0', 0, 0); - make_way('-70.7 197.7 -34.0', '2 4 5', 0, 0); - make_way('-263.8 27.5 -34.0', '3 5 6', 10, 0); - make_way('-263.8 199.7 -34.0', '4 6 3', 0, 0); - make_way('-394.6 201.2 -34.0', '5 7 4', 0, 0); - make_way('-617.8 260.5 -34.0', '6 8 0', 0, 0); - make_way('-644.1 428.5 -34.0', '7 9 0', 0, 0); - make_way('-642.2 727.9 -34.0', '8 0 0', 0, 0); - make_way('-259.3 -187.2 -34.0', '4 11 12', 0, 0); - make_way('-26.8 -384.2 -34.0', '10 12 32', 0, 0); - make_way('-254.3 -368.7 -34.0', '10 11 13', 0, 0); - make_way('-453.0 -380.6 -34.0', '12 14 0', 0, 0); - make_way('-634.6 -436.6 -34.0', '13 15 0', 0, 0); - make_way('-724.5 -730.3 -34.0', '14 16 0', 0, 0); - make_way('-1118.6 -771.6 -34.0', '15 17 0', 0, 0); - make_way('-1509.0 -737.1 62.0', '16 18 0', 0, 0); - make_way('-1519.2 -374.8 182.0', '17 19 41', 0, 0); - make_way('-1035.7 -196.8 182.0', '18 20 39', 41, 0); - make_way('-749.3 -135.9 182.0', '19 21 0', 0, 0); - make_way('-576.4 -26.8 182.0', '20 22 0', 0, 0); - make_way('-404.1 -18.0 182.0', '21 23 12', 0, 0); - make_way('-123.2 -18.2 182.0', '22 24 10', 12, 0); - make_way('102.6 -27.2 182.0', '23 25 0', 0, 0); - make_way('106.8 -383.1 182.0', '24 26 36', 0, 0); - make_way('-232.4 -342.7 278.0', '25 27 13', 0, 0); - make_way('-245.5 -20.1 374.0', '26 28 29', 21, 0); - make_way('107.1 6.3 374.0', '27 25 0', 0, 0); - make_way('-277.8 554.4 374.0', '27 30 0', 0, 0); - make_way('-520.5 574.9 374.0', '29 31 9', 8, 0); - make_way('-768.3 574.9 374.0', '30 8 9', 0, 0); - make_way('465.9 -423.7 -34.0', '11 33 0', 0, 0); - make_way('543.3 -660.4 -34.0', '32 34 0', 0, 0); - make_way('537.0 -955.6 -34.0', '33 35 0', 0, 0); - make_way('165.7 -926.3 86.0', '34 36 0', 0, 0); - make_way('138.8 -740.6 155.8', '35 25 33', 0, 0); - make_way('581.8 195.7 -21.1', '38 0 0', 0, 262144); - make_way('847.0 120.2 191.0', '28 0 0', 0, 262144); - make_way('-1101.5 176.0 182.0', '19 40 0', 0, 0); - make_way('-1584.0 173.6 182.0', '39 0 0', 0, 0); - make_way('-1295.4 -37.8 148.2', '18 42 19', 0, 0); - make_way('-1362.7 -55.6 -221.2', '41 0 0', 0, 0); - make_way('769.2 196.2 -34.0', '1 44 0', 0, 0); - make_way('633.1 193.1 -34.0', '43 37 0', 0, 256); -}; -/* -// Ways by Electro - -void() map_mattrye2 = -{ - make_way('-652.5 -1043.9 511.0', '4 0 0', 0, 0); - make_way('-992.5 -617.0 415.0', '3 7 0', 0, 0); - make_way('-953.0 -50.2 351.0', '6 8 0', 0, 0); - make_way('-647.0 77.1 351.0', '7 9 0', 0, 0); - make_way('-698.8 764.0 239.0', '8 10 0', 0, 0); - make_way('-1054.6 766.4 239.0', '9 11 0', 0, 0); - make_way('-1357.9 786.5 239.0', '10 12 0', 0, 0); - make_way('-1373.6 1502.7 127.0', '11 13 0', 0, 0); - make_way('-1110.3 1625.0 127.0', '12 14 0', 0, 0); - make_way('-985.9 2144.7 127.0', '13 15 0', 0, 0); - make_way('-495.4 2230.9 127.0', '14 16 17', 0, 0); - make_way('-47.4 2158.4 127.0', '15 40 0', 0, 0); - make_way('-501.6 2626.1 127.0', '15 18 0', 0, 0); - make_way('346.4 2679.1 223.0', '17 19 20', 0, 0); - make_way('433.6 2248.8 223.0', '18 20 0', 0, 0); - make_way('550.4 2675.8 223.0', '19 18 21', 0, 0); - make_way('876.8 2671.6 271.0', '20 22 0', 0, 0); - make_way('837.9 2263.6 319.0', '21 19 23', 0, 0); - make_way('925.9 1798.9 319.0', '22 24 0', 0, 0); - make_way('1644.3 1772.2 351.0', '23 25 0', 0, 0); - make_way('1628.4 1068.5 351.0', '24 26 0', 0, 0); - make_way('1409.9 965.9 351.0', '25 27 0', 0, 0); - make_way('1073.8 789.9 351.0', '26 28 44', 45, 0); - make_way('1408.4 645.5 416.0', '27 29 26', 0, 0); - make_way('1653.5 624.0 479.0', '28 30 0', 0, 0); - make_way('1662.9 317.8 479.0', '29 31 45', 0, 0); - make_way('1637.0 28.1 479.0', '30 32 0', 0, 0); - make_way('1060.8 -48.7 479.0', '31 33 0', 0, 0); - make_way('996.9 -484.3 479.0', '32 34 0', 0, 0); - make_way('550.8 -491.1 479.0', '33 35 37', 39, 0); - make_way('542.9 -914.0 479.0', '34 36 37', 39, 0); - make_way('712.4 -1089.3 511.0', '35 0 0', 0, 0); - make_way('-13.4 -289.6 479.0', '34 39 35', 3, 0); - make_way('-97.3 -677.8 479.0', '2 4 3', 0, 0); - make_way('144.7 -679.1 479.0', '35 37 34', 0, 0); - make_way('2.3 1824.9 127.0', '16 41 0', 0, 0); - make_way('6.0 1232.9 127.0', '40 42 0', 0, 0); - make_way('10.5 768.3 127.0', '41 43 0', 0, 0); - make_way('5.0 375.1 127.0', '42 44 0', 0, 0); - make_way('875.6 378.7 351.0', '43 45 27', 0, 0); - make_way('1090.9 453.8 351.0', '44 27 0', 0, 0); - make_way('-560.0 1269.1 351.0', '0 0 0', 0, 0); - make_way('-434.0 1282.5 127.0', '41 40 42', 0, 0); - make_way('602.4 1275.2 351.0', '0 0 0', 0, 0); - make_way('430.0 1282.1 127.0', '41 42 40', 0, 0); -}; - -// Ways by Electro - -void() map_mattrye1_nex = -{ - make_way('655.3 370.1 -34.0', '2 43 0', 0, 0); - make_way('214.7 338.9 -34.0', '1 3 0', 0, 0); - make_way('-70.7 197.7 -34.0', '2 4 5', 0, 0); - make_way('-263.8 27.5 -34.0', '3 5 6', 10, 0); - make_way('-263.8 199.7 -34.0', '4 6 3', 0, 0); - make_way('-394.6 201.2 -34.0', '5 7 4', 0, 0); - make_way('-617.8 260.5 -34.0', '6 8 0', 0, 0); - make_way('-644.1 428.5 -34.0', '7 9 0', 0, 0); - make_way('-642.2 727.9 -34.0', '8 0 0', 0, 0); - make_way('-259.3 -187.2 -34.0', '4 11 12', 0, 0); - make_way('-26.8 -384.2 -34.0', '10 12 32', 0, 0); - make_way('-254.3 -368.7 -34.0', '10 11 13', 0, 0); - make_way('-453.0 -380.6 -34.0', '12 14 0', 0, 0); - make_way('-634.6 -436.6 -34.0', '13 15 0', 0, 0); - make_way('-724.5 -730.3 -34.0', '14 16 0', 0, 0); - make_way('-1118.6 -771.6 -34.0', '15 17 0', 0, 0); - make_way('-1509.0 -737.1 62.0', '16 18 0', 0, 0); - make_way('-1519.2 -374.8 182.0', '17 19 41', 0, 0); - make_way('-1035.7 -196.8 182.0', '18 20 39', 41, 0); - make_way('-749.3 -135.9 182.0', '19 21 0', 0, 0); - make_way('-576.4 -26.8 182.0', '20 22 0', 0, 0); - make_way('-404.1 -18.0 182.0', '21 23 12', 0, 0); - make_way('-123.2 -18.2 182.0', '22 24 10', 12, 0); - make_way('102.6 -27.2 182.0', '23 25 0', 0, 0); - make_way('106.8 -383.1 182.0', '24 26 36', 0, 0); - make_way('-232.4 -342.7 278.0', '25 27 13', 0, 0); - make_way('-245.5 -20.1 374.0', '26 28 29', 21, 0); - make_way('107.1 6.3 374.0', '27 25 0', 0, 0); - make_way('-277.8 554.4 374.0', '27 30 0', 0, 0); - make_way('-520.5 574.9 374.0', '29 31 9', 8, 0); - make_way('-768.3 574.9 374.0', '30 8 9', 0, 0); - make_way('465.9 -423.7 -34.0', '11 33 0', 0, 0); - make_way('543.3 -660.4 -34.0', '32 34 0', 0, 0); - make_way('537.0 -955.6 -34.0', '33 35 0', 0, 0); - make_way('165.7 -926.3 86.0', '34 36 0', 0, 0); - make_way('138.8 -740.6 155.8', '35 25 33', 0, 0); - make_way('581.8 195.7 -21.1', '38 0 0', 0, 262144); - make_way('847.0 120.2 191.0', '28 0 0', 0, 262144); - make_way('-1101.5 176.0 182.0', '19 40 0', 0, 0); - make_way('-1584.0 173.6 182.0', '39 0 0', 0, 0); - make_way('-1295.4 -37.8 148.2', '18 42 19', 0, 0); - make_way('-1362.7 -55.6 -221.2', '41 0 0', 0, 0); - make_way('769.2 196.2 -34.0', '1 44 0', 0, 0); - make_way('633.1 193.1 -34.0', '43 37 0', 0, 256); -}; -*/ diff --git a/attic/TeamNexuiz/game/gamec/bot_misc.c b/attic/TeamNexuiz/game/gamec/bot_misc.c deleted file mode 100644 index c78752a49..000000000 --- a/attic/TeamNexuiz/game/gamec/bot_misc.c +++ /dev/null @@ -1,841 +0,0 @@ -/*********************************************** -* * -* FrikBot Misc Code * -* "Because you can't name it anything else" * -* * -***********************************************/ - -/* -This program is in the Public Domain. My crack legal -team would like to add: - -RYAN "FRIKAC" SMITH IS PROVIDING THIS SOFTWARE "AS IS" -AND MAKES NO WARRANTY, EXPRESS OR IMPLIED, AS TO THE -ACCURACY, CAPABILITY, EFFICIENCY, MERCHANTABILITY, OR -FUNCTIONING OF THIS SOFTWARE AND/OR DOCUMENTATION. IN -NO EVENT WILL RYAN "FRIKAC" SMITH BE LIABLE FOR ANY -GENERAL, CONSEQUENTIAL, INDIRECT, INCIDENTAL, -EXEMPLARY, OR SPECIAL DAMAGES, EVEN IF RYAN "FRIKAC" -SMITH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES, IRRESPECTIVE OF THE CAUSE OF SUCH DAMAGES. - -You accept this software on the condition that you -indemnify and hold harmless Ryan "FrikaC" Smith from -any and all liability or damages to third parties, -including attorney fees, court costs, and other -related costs and expenses, arising out of your use -of this software irrespective of the cause of said -liability. - -The export from the United States or the subsequent -reexport of this software is subject to compliance -with United States export control and munitions -control restrictions. You agree that in the event you -seek to export this software, you assume full -responsibility for obtaining all necessary export -licenses and approvals and for assuring compliance -with applicable reexport restrictions. - -Any reproduction of this software must contain -this notice in its entirety. - -*/ - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -BotName - -Sets bot's name and colors - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ -string(float r) BotName = -{ - self.b_num = r; - if (r == 1) - { - self.playermodel = "models/player/visitant.zym"; - self.playerskin = "0"; - return "Visitant"; - } - else if (r == 2) - { - self.playermodel = "models/player/marine.zym"; - self.playerskin = "0"; - return "Marine"; - } - else if (r == 3) - { - self.playermodel = "models/player/specop.zym"; - self.playerskin = "0"; - return "Specop"; - } - else if (r == 4) - { - self.playermodel = "models/player/nexus.zym"; - self.playerskin = "0"; - return "Nexus"; - } - else if (r == 5) - { - self.playermodel = "models/player/skadi.zym"; - self.playerskin = "0"; - return "Skadi"; - } - else if (r == 6) - { - self.playermodel = "models/player/lurk.zym"; - self.playerskin = "0"; - return "Lurk"; - } - else if (r == 7) - { - self.playermodel = "models/player/headhunter.zym"; - self.playerskin = "0"; - return "HeadHunter"; - } - else if (r == 8) - { - self.playermodel = "models/player/carni.zym"; - self.playerskin = "0"; - return "Carni"; - } - else if (r == 9) - { - self.playermodel = "models/player/grunt.zym"; - self.playerskin = "0"; - return "Grunt"; - } - else if (r == 10) - { - self.playermodel = "models/player/insurrectionist.zym"; - self.playerskin = "0"; - return "Insurrectionist"; - } - else if (r == 11) - { - self.playermodel = "models/player/jeandarc.zym"; - self.playerskin = "0"; - return "Jeandarc"; - } - else if (r == 12) - { - self.playermodel = "models/player/lycanthrope.zym"; - self.playerskin = "0"; - return "Lycanthrope"; - } - else if (r == 13) - { - self.playermodel = "models/player/pyria.zym"; - self.playerskin = "0"; - return "Pyria"; - } - else if (r == 14) - { - self.playermodel = "models/player/shock.zym"; - self.playerskin = "0"; - return "Shock"; - } - else if (r == 15) - { - self.playermodel = "models/player/marine.zym"; - self.playerskin = "1"; - return "Private"; - } - else if (r == 16) - { - self.playermodel = "models/player/nexus.zym"; - self.playerskin = "1"; - return "Mulder"; - } - else if (r == 17) - { - self.playermodel = "models/player/skadi.zym"; - self.playerskin = "1"; - return "Elite"; - } - else if (r == 18) - { - self.playermodel = "models/player/lurk.zym"; - self.playerskin = "1"; - return "Reptile"; - } - else if (r == 19) - { - self.playermodel = "models/player/crash.zym"; - self.playerskin = "2"; - return "mechanical"; - } - else if (r == 20) - { - self.playermodel = "models/player/crash.zym"; - self.playerskin = "1"; - return "Quark"; - } - else if (r == 21) - { - self.playermodel = "models/player/insurrectionist.zym"; - self.playerskin = "1"; - return "Anarchist"; - } - else if (r == 22) - { - self.playermodel = "models/player/jeandarc.zym"; - self.playerskin = "1"; - return "Heroine"; - } - else if (r == 23) - { - self.playermodel = "models/player/lycanthrope.zym"; - self.playerskin = "1"; - return "Wolf"; - } - else if (r == 24) - { - self.playermodel = "models/player/pyria.zym"; - self.playerskin = "1"; - return "Soldier"; - } - else if (r == 25) - { - self.playermodel = "models/player/rebel.zym"; - self.playerskin = "0"; - return "Rebel"; - } - else - { - self.playermodel = "models/player/crash.zym"; - self.playerskin = "0"; - return "Crash"; - } - -}; -string () PickARandomName = -{ - if (bot_count > 16) - return "player"; - - local float y, test; - local string h; - local entity t; - y = TRUE; - while(y) - { - test = ceil(random() * 16); - h = BotName(test); - t = find(world, netname, h); - if (t == world) - y = FALSE; - } - return h; -}; - - - -// I didn't like the old code so this is very stripped down - -entity b_originator; -float b_topic; -/* FBX Topics - -b_originator == self - 1 - sign on - 2 - killed targ - 3 - team message "friendly eyes" - 4 - team message "on your back" - 5 - team message "need back up" - 6 - excuses - ---- - 7 - gameover - ---- - 8 - welcoming someone onto server - 9 - ridicule lost frag (killed self?) - 10 - ridicule lost frag (lava) - 11 - lag -b_originator == targ - - -*/ -void(float tpic) bot_start_topic = -{ - if (random() < 0.2) - { - b_topic = tpic; - b_originator = self; - } - else - b_topic = 0; -}; - -/* -void() bot_chat = -{ - local float r; - if (b_options & OPT_NOCHAT) - return; - r = ceil (random() * 6); - - if (self.b_chattime > time) - { - if (self.b_skill < 2) - self.keys = self.button0 = self.button2 = 0; - return; - } - else if (self.b_chattime) - { - if (b_topic == 1) - { - if (b_originator == self) - { - if (r == 1) - { - BotSay(": lo all\n"); - bot_start_topic(8); - } - else if (r == 2) - { - BotSay(": hey everyone\n"); - bot_start_topic(8); - } - else if (r == 3) - { - BotSay(": prepare to be fragged!\n"); - bot_start_topic(0); - } - else if (r == 4) - { - BotSay(": boy this is laggy\n"); - bot_start_topic(11); - } - else if (r == 5) - { - BotSay(": #mm getting some lag here\n"); - bot_start_topic(11); - } - else - { - BotSay(": hi everyone\n"); - bot_start_topic(8); - } - } - } - else if (b_topic == 2) - { - if (b_originator == self) - { - if (r == 1) - BotSay(": take that\n"); - else if (r == 2) - BotSay(": yehaww!\n"); - else if (r == 3) - BotSay(": wh00p\n"); - else if (r == 4) - BotSay(": j00_sawk();\n"); - else if (r == 5) - BotSay(": i rule\n"); - else - BotSay(": eat that\n"); - bot_start_topic(0); - } - } - else if (b_topic == 3) - { - if (b_originator == self) - { - if (r < 3) - BotSayTeam(": friendly eyes\n"); - else - BotSayTeam(": team eyes\n"); - bot_start_topic(0); - } - } - else if (b_topic == 4) - { - if (b_originator == self) - { - if (r < 3) - BotSayTeam(": on your back\n"); - else - BotSayTeam(": I'm with you\n"); - bot_start_topic(0); - } - } - else if (b_topic == 5) - { - if (b_originator == self) - { - if (r < 3) - BotSayTeam(": I need help\n"); - else - BotSayTeam(": need backup\n"); - bot_start_topic(0); - } - } - else if (b_topic == 6) - { - if (b_originator == self) - { - if (r == 1) - { - BotSay(": sun got in my eyes\n"); - bot_start_topic(0); - } - else if (r == 2) - { - BotSay(": mouse needs cleaning\n"); - bot_start_topic(0); - } - else if (r == 3) - { - BotSay(": i meant to do that\n"); - bot_start_topic(0); - } - else if (r == 4) - { - BotSay(": lag\n"); - bot_start_topic(11); - } - else if (r == 5) - { - BotSay(": killer lag\n"); - bot_start_topic(11); - } - else - { - BotSay(": 100% lag\n"); - bot_start_topic(11); - } - } - } - else if (b_topic == 7) - { - if (r == 1) - BotSay(": gg\n"); - else if (r == 2) - BotSay(": gg all\n"); - else if (r == 3) - BotSay(": that was fun\n"); - else if (r == 4) - BotSay(": good game\n"); - else if (r == 5) - BotSay(": pah\n"); - else - BotSay(": hrm\n"); - bot_start_topic(0); - } - else if (b_topic == 8) - { - if (b_originator != self) - { - if (r == 1) - { - BotSay(": heya\n"); - bot_start_topic(0); - } - else if (r == 2) - { - BotSay(": welcome\n"); - bot_start_topic(0); - } - else if (r == 3) - { - BotSayInit(); - BotSay2(": hi "); - BotSay2(b_originator.netname); - BotSay2("\n"); - bot_start_topic(0); - } - else if (r == 4) - { - BotSayInit(); - BotSay2(": hey "); - BotSay2(b_originator.netname); - BotSay2("\n"); - bot_start_topic(0); - } - else if (r == 5) - { - BotSay(": howdy\n"); - bot_start_topic(0); - } - else - { - BotSay(": lo\n"); - bot_start_topic(0); - } - } - } - - else if (b_topic == 9) - { - if (b_originator != self) - { - if (r == 1) - BotSay(": hah\n"); - else if (r == 2) - BotSay(": heheh\n"); - else if (r == 3) - { - BotSayInit(); - BotSay2(": good work "); - BotSay2(b_originator.netname); - BotSay2("\n"); - } - else if (r == 4) - { - BotSayInit(); - BotSay2(": nice1 "); - BotSay2(b_originator.netname); - BotSay2("\n"); - } - else if (r == 5) - BotSay(": lol\n"); - else - BotSay(": :)\n"); - b_topic = 6; - } - } - else if (b_topic == 10) - { - if (b_originator != self) - { - if (r == 1) - BotSay(": have a nice dip?\n"); - else if (r == 2) - BotSay(": bah I hate levels with lava\n"); - else if (r == 3) - { - BotSayInit(); - BotSay2(": good job "); - BotSay2(b_originator.netname); - BotSay2("\n"); - } - else if (r == 4) - { - BotSayInit(); - BotSay2(": nice backflip "); - BotSay2(b_originator.netname); - BotSay2("\n"); - } - else if (r == 5) - BotSay(": watch your step\n"); - else - BotSay(": hehe\n"); - b_topic = 6; - } - } - - else if (b_topic == 11) - { - if (b_originator != self) - { - if (r == 1) - { - BotSayInit(); - BotSay2(": yeah right "); - BotSay2(b_originator.netname); - BotSay2("\n"); - bot_start_topic(0); - } - else if (r == 2) - { - BotSay(": ping\n"); - bot_start_topic(0); - } - else if (r == 3) - { - BotSay(": shuddup, you're an lpb\n"); - bot_start_topic(0); - } - else if (r == 4) - { - BotSay(": lag my eye\n"); - bot_start_topic(0); - } - else if (r == 5) - { - BotSay(": yeah\n"); - bot_start_topic(11); - } - else - { - BotSay(": totally\n"); - bot_start_topic(11); - } - } - } - self.b_chattime = 0; - } - else if (b_topic) - { - if (random() < 0.5) - { - if (self == b_originator) - { - if (b_topic <= 7) - self.b_chattime = time + 2; - } - else - { - if (b_topic >= 7) - self.b_chattime = time + 2; - } - } - } -}; -*/ - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Kick A Bot. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() KickABot = -{ - local entity ty; - ty = find(world, classname, "player"); - while (ty != world) - { - if (!(ty.ishuman)) - { - - BotDisconnect(ty); - ty.ishuman = TRUE; - ty = world; - } - else - ty = find(ty, classname, "player"); - } - -}; - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Simplified origin checking. - -God, I wish I had inline - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -vector(entity ent) realorigin = -{ -// even more simplified... - return (ent.absmin + ent.absmax) * 0.5; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -fisible - -a version of visible that checks for corners -of the bounding boxes - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -float (entity targ) fisible = -{ - local vector spot1, org; - local float thruwater, pc1, pc2; - - org = realorigin(targ); - spot1 = self.origin + self.view_ofs; - - if (targ.solid == SOLID_BSP) - { - traceline (spot1, org, TRUE, self); - if (trace_ent == targ) - return TRUE; - else if (trace_fraction == 1) - return TRUE; - return FALSE; - } - else - { - pc1 = pointcontents(org); - pc2 = pointcontents(spot1); - if (targ.classname == "player") - thruwater = FALSE; - else if (pc1 == CONTENT_LAVA) - return FALSE; - else - thruwater = TRUE; - } - - if (pc1 < -1) // targ's origin is in water or other liquid - { - if (pc2 != pc1) - { - // look for their head - traceline (spot1, org + targ.mins, TRUE, self); - // cross the water check - if (trace_inopen) - if (trace_inwater) - if (!thruwater) - return FALSE; - if (trace_ent == targ) - return TRUE; - else if (trace_fraction == 1) - return TRUE; - return FALSE; - } - } - else - { - if (pc2 != pc1) - { - traceline (spot1, org + targ.maxs, TRUE, self); - if (trace_inopen) - if (trace_inwater) - if (!thruwater) - return FALSE; - if (trace_ent == targ) - return TRUE; - else if (trace_fraction == 1) - return TRUE; - return FALSE; - } - } - traceline (spot1, org, TRUE, self); - if (trace_ent == targ) - return TRUE; - else if (trace_fraction == 1) - return TRUE; - traceline (spot1, org + targ.maxs, TRUE, self); - if (trace_ent == targ) - return TRUE; - else if (trace_fraction == 1) - return TRUE; - traceline (spot1, org + targ.mins, TRUE, self); - if (trace_ent == targ) - return TRUE; - else if (trace_fraction == 1) - return TRUE; - return FALSE; -}; - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Wisible - -goes through movable brushes/entities, used -for waypoints - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -// this is used for waypoint stuff.... -float (entity targ1, entity targ2) wisible = -{ - local vector spot1, spot2; - local entity ignore; - - spot1 = targ1.origin; - spot2 = realorigin(targ2); - - ignore = self; - do - { - traceline (spot1, spot2, TRUE, ignore); - spot1 = realorigin(trace_ent); - ignore = trace_ent; - } while ((trace_ent != world) && (trace_fraction != 1)); - if (trace_endpos == spot2) - return TRUE; - else - return FALSE; -}; - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -sisible - -Now this is getting ridiculous. Simple visible, -used when we need just a simple traceline nothing else - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -float (entity targ) sisible = -{ - traceline (self.origin, targ.origin, TRUE, self); - if (trace_ent == targ) - return TRUE; - else if (trace_fraction == 1) - return TRUE; - return FALSE; -}; -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -angcomp - -subtracts one angle from another - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -float (float y1, float y2) angcomp = -{ - y1 = frik_anglemod(y1); - y2 = frik_anglemod(y2); - - local float answer; - answer = y1 - y2; - if (answer > 180) - answer = (360 - answer) * -1; - else if (answer < -180) - answer = answer + 360; - return answer; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -fov - -is the entity in the bot's field of view - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ -float (entity targ) fov = -{ - local vector yawn; - local float g; - yawn = realorigin(targ); - yawn = (yawn + targ.view_ofs) - (self.origin + self.view_ofs); - yawn = normalize(yawn); - yawn = vectoangles(yawn); - g = angcomp(self.v_angle_x, yawn_x); - if (fabs(g) > 45) - return FALSE; - g = angcomp(self.v_angle_y, yawn_y); - if (fabs(g) > 60) - return FALSE; - - return TRUE; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -frik_anglemod - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ -float(float v) frik_anglemod = -{ - return v - floor(v/360) * 360; -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/bot_move.c b/attic/TeamNexuiz/game/gamec/bot_move.c deleted file mode 100644 index fabba0722..000000000 --- a/attic/TeamNexuiz/game/gamec/bot_move.c +++ /dev/null @@ -1,512 +0,0 @@ -/*********************************************** -* * -* FrikBot Movement AI * -* "The slightly better movement AI" * -* * -***********************************************/ - -/* - -This program is in the Public Domain. My crack legal -team would like to add: - -RYAN "FRIKAC" SMITH IS PROVIDING THIS SOFTWARE "AS IS" -AND MAKES NO WARRANTY, EXPRESS OR IMPLIED, AS TO THE -ACCURACY, CAPABILITY, EFFICIENCY, MERCHANTABILITY, OR -FUNCTIONING OF THIS SOFTWARE AND/OR DOCUMENTATION. IN -NO EVENT WILL RYAN "FRIKAC" SMITH BE LIABLE FOR ANY -GENERAL, CONSEQUENTIAL, INDIRECT, INCIDENTAL, -EXEMPLARY, OR SPECIAL DAMAGES, EVEN IF RYAN "FRIKAC" -SMITH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES, IRRESPECTIVE OF THE CAUSE OF SUCH DAMAGES. - -You accept this software on the condition that you -indemnify and hold harmless Ryan "FrikaC" Smith from -any and all liability or damages to third parties, -including attorney fees, court costs, and other -related costs and expenses, arising out of your use -of this software irrespective of the cause of said -liability. - -The export from the United States or the subsequent -reexport of this software is subject to compliance -with United States export control and munitions -control restrictions. You agree that in the event you -seek to export this software, you assume full -responsibility for obtaining all necessary export -licenses and approvals and for assuring compliance -with applicable reexport restrictions. - -Any reproduction of this software must contain -this notice in its entirety. - -*/ - -void() bot_jump = -{ - // TODO check for precision, etc. - self.button2 = TRUE; -}; - -float(entity e) bot_can_rj = -{ - // this returns true of the bot can rocket/superjump/hook - // if your mod doesn't have an RL you can just return FALSE all the time - // if it has a hook or some other means for the bot to get to high places - // you can check here for that capability - - // am I dumb? - if (e.b_skill == 0) - return FALSE; - - // quad = bad - if (e.items & 4194304) - return FALSE; - - // do I have rockets & RL? - if (!((e.items & 32) && (e.ammo_rockets > 0))) - return FALSE; - - // do I have pent? - if (e.items & 1048576) - return TRUE; - - if (e.health > 50) - return TRUE; - else - return FALSE; -}; - -float(float flag) frik_recognize_plat = -{ - if ((self.classname != "waypoint") && !(self.flags & FL_ONGROUND)) - return FALSE; - traceline(self.origin, self.origin - '0 0 64', TRUE, self); - if (trace_ent != world) - { - if (flag) // afect bot movement too - { - if (self.keys & KEY_MOVEUP) - { - if (trace_ent.velocity_z > 0) - self.keys = self.keys & 960; // 960 is all view keys - } - else if (self.keys & KEY_MOVEDOWN) - { - if (trace_ent.velocity_z < 0) - self.keys = self.keys & 960; - } - } - return TRUE; - } - else - return FALSE; -}; - -float(vector sdir) frik_KeysForDir = -{ - - local vector keydir; - local float outkeys, tang; - outkeys = 0; - if (sdir_x || sdir_y) - { - // Everything is tested against 60 degrees, - // this allows the bot to overlap the keys - // 30 degrees on each diagonal 45 degrees - // might look more realistic - - keydir = vectoangles(sdir); - tang = angcomp(keydir_y, self.v_angle_y); - if ((tang <= 150) && (tang >= 30)) - outkeys = outkeys + KEY_MOVELEFT; - else if ((tang >= -150) && (tang <= -30)) - outkeys = outkeys + KEY_MOVERIGHT; - if (fabs(tang) <= 60) - outkeys = outkeys + KEY_MOVEFORWARD; - else if (fabs(tang) >= 120) - outkeys = outkeys + KEY_MOVEBACK; - } - if (sdir_z > 0.7) - outkeys = outkeys + KEY_MOVEUP; - else if (sdir_z < 0.7) - outkeys = outkeys + KEY_MOVEDOWN; - return outkeys; - -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -frik_obstructed - -Bot has hit a ledge or wall that he should -manuever around. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void(vector whichway, float danger) frik_obstructed = -{ - local float dist; - local vector disway, org; -// TODO: something - if (self.b_aiflags & AI_BLIND) - return; - org = realorigin(self.target1); - - if (danger) - { - self.b_aiflags = self.b_aiflags | AI_DANGER; - self.keys = frik_KeysForDir('0 0 0' - whichway); - } - if (self.b_aiflags & AI_PRECISION) - return; - - - if (self.target1) - { - if (self.b_aiflags & AI_OBSTRUCTED) - { - if (!(self.b_aiflags & AI_DANGER)) - { - self.b_aiflags = self.b_aiflags - AI_OBSTRUCTED; - return; - } - else if (!danger) - return; - } - self.obs_dir = whichway; - disway_x = whichway_y * -1; - disway_y = whichway_x; - dist = vlen(org - (self.origin + disway)); - disway_x = whichway_y; - disway_y = whichway_x * -1; - self.wallhug = vlen(org - (self.origin + disway)) > dist; - self.b_aiflags = self.b_aiflags | AI_OBSTRUCTED; - - } - else - { - disway_x = whichway_y * -1; - disway_y = whichway_x; - dist = vlen(disway - self.obs_dir); - disway_x = whichway_y; - disway_y = whichway_x * -1; - self.wallhug = vlen(disway - self.obs_dir) < dist; - self.obs_dir = whichway; - - self.b_aiflags = self.b_aiflags | AI_OBSTRUCTED; - } -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -frik_obstacles - -Detects small bumps the bot needs to jump over -or ledges the bot should avoid falling in. - -Also responsible for jumping gaps. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() frik_obstacles = -{ - local vector start, stop, ang; - local float test, conts, dist, hgt; - - if (!(self.flags & FL_ONGROUND)) - return; - if (self.b_aiflags & AI_BLIND) - return; - - ang = normalize(self.velocity); - ang_z = 0; - start = self.origin + ang * 32; // ahem - start_z = self.origin_z + self.maxs_z; - stop = start; - stop_z = self.origin_z + self.mins_z; - traceline(start, stop - '0 0 256', TRUE, self); - if (trace_allsolid || trace_startsolid) - return; - hgt = trace_endpos_z - stop_z; - - if (hgt > 18) - { - bot_jump(); - return; - } - if (hgt >= 0) - return; - - conts = pointcontents(trace_endpos + '0 0 4'); - start = stop - '0 0 8'; - stop = start + ang * 256; - traceline(start, stop, TRUE, self); - test = vlen(trace_endpos - start); - if (test <= 20) - return; // it's a walkable gap, do nothing - ang_x = self.velocity_y * -1; - ang_y = self.velocity_x; - ang = normalize(ang); - traceline(start - (ang * 10), start + (ang * 10), TRUE, self); - if ((trace_fraction != 1) || trace_startsolid) - return; // gap is only 20 wide, walkable - ang = self.velocity; - ang_z = 0; - dist = ((540 / sv_gravity) * vlen(ang))/* + 32*/; - if (test > dist) // I can't make it - { - if (conts < -3) // bad stuff down dare - { - frik_obstructed(ang, TRUE); - return; - } - else - { - if (self.target1) - { - stop = realorigin(self.target1); - if ((stop_z - self.origin_z) < -32) - return; // safe to fall - } - frik_obstructed(ang, FALSE); - return; - } - } - else - { - ang = normalize(ang); - //look for a ledge - traceline(self.origin, self.origin + (ang * (test + 20)), TRUE, self); - if (trace_fraction != 1) - { - if (conts < -3) // bad stuff down dare - { - frik_obstructed(ang, TRUE); - return; - } - else - { - if (self.target1) - { - stop = realorigin(self.target1); - if ((stop_z - self.origin_z) < -32) - return; // safe to fall - } - frik_obstructed(ang, FALSE); - return; - } - } - - if (self.target1) - { - // getting furter away from my target? - test = vlen(self.target1.origin - (ang + self.origin)); - if (test > vlen(self.target1.origin - self.origin)) - { - if (conts < -3) // bad stuff down dare - { - frik_obstructed(ang, TRUE); - return; - } - else - { - frik_obstructed(ang, FALSE); - return; - } - } - } - } - if (hgt < -18) - { - if (self.target1) - { - stop = realorigin(self.target1); - if ((stop_z - self.origin_z) < -32) - return; // safe to fall - } - bot_jump(); - } - // go for it - -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -After frik_obstructed, the bot uses the -following funtion to move "around" the obstacle - -I have no idea how well it will work - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() frik_dodge_obstruction = -{ - local vector way, org; - local float oflags, yaw; - - if (!(self.b_aiflags & AI_OBSTRUCTED)) - return; - if ((self.b_aiflags & (AI_BLIND | AI_PRECISION)) || !(self.flags & FL_ONGROUND)) - { - self.b_aiflags = self.b_aiflags - AI_OBSTRUCTED; - return; - } - - // perform a walkmove check to see if the obs_dir is still obstructed - // walkmove is less forgiving than frik_obstacles, so I dunno - // how well this will work - - oflags = self.flags; - org = self.origin; - - yaw = vectoyaw(self.obs_dir); - if (walkmove(yaw, 32)) - self.b_aiflags = self.b_aiflags - AI_OBSTRUCTED; - else - { - if (self.b_aiflags & AI_DANGER) - { - way = '0 0 0' - self.obs_dir; - } - else if (self.wallhug) - { - way_x = self.obs_dir_y * -1; - way_y = self.obs_dir_x; - } - else - { - way_x = self.obs_dir_y; - way_y = self.obs_dir_x * -1; - } - self.keys = self.keys & 960 + frik_KeysForDir(way); - } - - // fix the bot - - self.origin = org; - self.flags = oflags; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -movetogoal and walkmove replacements - -blah - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() frik_movetogoal = -{ - local vector way; - local float g; - - if (self.target1 == world) - { - makevectors(self.v_angle); - frik_walkmove(v_forward); - return; - } - way = realorigin(self.target1) - self.origin; - if (vlen(way) < 25) - { - self.keys = self.keys & 960; - return; - } - - way = normalize(way); - self.keys = self.keys & 960 + frik_KeysForDir(way); - - frik_dodge_obstruction(); - frik_recognize_plat(TRUE); - - if (self.b_aiflags & AI_PRECISION) - { - g = angcomp(self.v_angle_x, self.b_angle_x); - if (fabs(g) > 10) - self.keys = self.keys & 960; - g = angcomp(self.v_angle_y, self.b_angle_y); - if (fabs(g) > 10) - self.keys = self.keys & 960; - } -}; - -float(vector weird) frik_walkmove = -{ - // okay so it's not walkmove - // sue me - self.keys = self.keys & 960 + frik_KeysForDir(weird); - - frik_dodge_obstruction(); - frik_recognize_plat(TRUE); - if (self.b_aiflags & AI_OBSTRUCTED) - return FALSE; - else - return TRUE; -}; - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -The "hook" method of navigation. This nav -system is copyrighted 1999 by Ryan "Frika C" -Smith, keep that in mind when you steal it. - -I brought this back because normal roaming -won't work - the bot gets distracted by it's -own waypoints. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() frik_bot_roam = -{ - local vector org, ang, org1; - local float loopcount, flag, dist; - - loopcount = 26; - flag = FALSE; - while((loopcount > 0) && !flag) - { - loopcount = loopcount - 1; - org = self.origin + self.view_ofs; - ang = self.angles; - ang_y = frik_anglemod(ang_y - 90 + (random() * 180)); - ang_x = 0; // avoid upward sloping - makevectors(ang); - traceline(org, org + v_forward * 2300, TRUE, self); - if (trace_fraction != 1) - { - org1 = trace_endpos; - ang = normalize(trace_plane_normal); - ang_z = 0; // avoid upward sloping - traceline(org1, org1 + (ang * 2300), TRUE, self); - if ((trace_fraction != 1) && (vlen(trace_endpos - org1) >= 64)) - { - org = trace_endpos; - traceline(org, self.origin + self.view_ofs, TRUE, self); - if (trace_fraction != 1) - { - dist = vlen(org1 - org) /2; - org = org1 + (ang * dist); - traceline(org, org - '0 0 48', TRUE, self); - if (trace_fraction != 1) - { - SpawnTempWaypoint(org); - flag = TRUE; - } - } - } - } - } - self.b_angle_y = self.v_angle_y + 10; -}; diff --git a/attic/TeamNexuiz/game/gamec/bot_phys.c b/attic/TeamNexuiz/game/gamec/bot_phys.c deleted file mode 100644 index 5b72de0c0..000000000 --- a/attic/TeamNexuiz/game/gamec/bot_phys.c +++ /dev/null @@ -1,666 +0,0 @@ -/*********************************************** -* * -* FrikBot Physics * -* The near-perfect emulation of * -* Client movement * -* * -* Special Thanks to: Asdf, Frog * -* Alan "Strider" Kivlin * -* * -* * -***********************************************/ - -/* - -This program is in the Public Domain. My crack legal -team would like to add: - -RYAN "FRIKAC" SMITH IS PROVIDING THIS SOFTWARE "AS IS" -AND MAKES NO WARRANTY, EXPRESS OR IMPLIED, AS TO THE -ACCURACY, CAPABILITY, EFFICIENCY, MERCHANTABILITY, OR -FUNCTIONING OF THIS SOFTWARE AND/OR DOCUMENTATION. IN -NO EVENT WILL RYAN "FRIKAC" SMITH BE LIABLE FOR ANY -GENERAL, CONSEQUENTIAL, INDIRECT, INCIDENTAL, -EXEMPLARY, OR SPECIAL DAMAGES, EVEN IF RYAN "FRIKAC" -SMITH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES, IRRESPECTIVE OF THE CAUSE OF SUCH DAMAGES. - -You accept this software on the condition that you -indemnify and hold harmless Ryan "FrikaC" Smith from -any and all liability or damages to third parties, -including attorney fees, court costs, and other -related costs and expenses, arising out of your use -of this software irrespective of the cause of said -liability. - -The export from the United States or the subsequent -reexport of this software is subject to compliance -with United States export control and munitions -control restrictions. You agree that in the event you -seek to export this software, you assume full -responsibility for obtaining all necessary export -licenses and approvals and for assuring compliance -with applicable reexport restrictions. - -Any reproduction of this software must contain -this notice in its entirety. - -*/ - -/* -========================================= - -Stuff mimicking cl_input.c code - -========================================= -*/ -float(float key) CL_KeyState = -{ - return ((self.keys & key) > 0); -}; - -void() CL_KeyMove = // CL_BaseMove + CL_AdjustAngles -{ - local float anglespeed; - local vector view; - if (self.keys != self.oldkeys) - { - self.movement = '0 0 0'; - self.movement_y = self.movement_y + (350 * CL_KeyState(KEY_MOVERIGHT)); - // 350 is the default cl_sidespeed - self.movement_y = self.movement_y - (350 * CL_KeyState(KEY_MOVELEFT)); - // 350 is the default cl_sidespeed - self.movement_x = self.movement_x + (200 * CL_KeyState(KEY_MOVEFORWARD)); - // 200 is the default cl_forwardspeed - self.movement_x = self.movement_x - (200 * CL_KeyState(KEY_MOVEBACK)); - // 200 is the default cl_backspeed - self.movement_z = self.movement_z + (200 * CL_KeyState(KEY_MOVEUP)); - // 200 is the default cl_upspeed - self.movement_z = self.movement_z - (200 * CL_KeyState(KEY_MOVEDOWN)); - // 200 is the default cl_upspeed - if (!self.b_aiflags & AI_PRECISION) - self.movement = self.movement * 2; - // 2 is the default cl_movespeedkey & bot always has +speed - } - self.oldkeys = self.keys; - - if (self.b_skill != 2) // use mouse emulation - { - anglespeed = 1.5 * real_frametime; - // 1.5 is the default cl_anglespeedkey & bot always has +speed - self.v_angle_y = self.v_angle_y + anglespeed * CL_KeyState(KEY_LOOKLEFT) * 140; - // 140 is default cl_yawspeed - self.v_angle_y = self.v_angle_y - anglespeed * CL_KeyState(KEY_LOOKRIGHT) * 140; - // 140 is default cl_yawspeed - self.v_angle_x = self.v_angle_x - anglespeed * CL_KeyState(KEY_LOOKUP) * 150; - // 150 is default cl_pitchspeed - self.v_angle_x = self.v_angle_x + anglespeed * CL_KeyState(KEY_LOOKDOWN) * 150; - // 150 is default cl_pitchspeed - } - else - { - view_x = angcomp(self.b_angle_x, self.v_angle_x); - view_y = angcomp(self.b_angle_y, self.v_angle_y); - if (vlen(view) > 30) - { - self.mouse_emu = self.mouse_emu + (view * 30); - if (vlen(self.mouse_emu) > 180) - self.mouse_emu = normalize(self.mouse_emu) * 180; - } - else - self.mouse_emu = view * (1 / real_frametime); - self.v_angle = self.v_angle + self.mouse_emu * real_frametime; - - - } - if (self.v_angle_x > 80) - self.v_angle_x = 80; - else if (self.v_angle_x < -70) - self.v_angle_x = -70; - - if (self.v_angle_z > 50) - self.v_angle_z = 50; - else if (self.v_angle_z < -50) - self.v_angle_z = -50; - self.v_angle_y = frik_anglemod(self.v_angle_y); - -}; - -/* -========================================= - -Stuff mimicking sv_user.c - -========================================= -*/ -void() SV_UserFriction = -{ - local vector vel; - local float sped, friction, newspeed; - - vel = self.velocity; - vel_z =0; - sped = vlen(vel); - vel = self.velocity; - - if (!sped) - return; - - friction = sv_friction; - if (sped < sv_stopspeed) - newspeed = sped - real_frametime * sv_stopspeed * friction; - else - newspeed = sped - real_frametime * sped * friction; - - if (newspeed < 0) - newspeed = 0; - newspeed = newspeed / sped; - - self.velocity_y = vel_y * newspeed; - self.velocity_x = vel_x * newspeed; -}; -void() SV_WaterJump = -{ - if (time > self.teleport_time || !self.waterlevel) - { - self.flags = self.flags - (self.flags & FL_WATERJUMP); - self.teleport_time = 0; - } - self.velocity_x = self.movedir_x; - self.velocity_y = self.movedir_y; -}; - -void() DropPunchAngle = -{ - local float len; - len = vlen(self.punchangle); - self.punchangle = normalize(self.punchangle); - len = len - 10 * real_frametime; - if (len < 0) - len = 0; - self.punchangle = self.punchangle * len; -}; - - -void(vector wishvel) SV_AirAccelerate = -{ - local float addspeed, wishspd, accelspeed, currentspeed; - - wishspd = vlen(wishvel); - wishvel = normalize(wishvel); - if (wishspd > 30) - wishspd = 30; - currentspeed = self.velocity * wishvel; - addspeed = wishspd - currentspeed; - if (addspeed <= 0) - return; - accelspeed = 10 * sv_accelerate * wishspd * real_frametime; - if (accelspeed > addspeed) - accelspeed = addspeed; - - self.velocity = self.velocity + accelspeed * wishvel; -}; - -void(vector wishvel) SV_Accelerate = -{ - local float addspeed, wishspd, accelspeed, currentspeed; - - wishspd = vlen(wishvel); - wishvel = normalize(wishvel); - - currentspeed = self.velocity * wishvel; - addspeed = wishspd - currentspeed; - if (addspeed <= 0) - return; - accelspeed = sv_accelerate * wishspd * real_frametime; - if (accelspeed > addspeed) - accelspeed = addspeed; - - self.velocity = self.velocity + accelspeed * wishvel; -}; -void() SV_WaterMove = -{ - local vector wishvel; - local float wishspeed, addspeed, cspeed, newspeed; - makevectors(self.v_angle); - wishvel = v_right * self.movement_y + v_forward * self.movement_x; - - if (self.movement == '0 0 0') - wishvel_z = wishvel_z - 60; - else - wishvel_z = wishvel_z + self.movement_z; - wishspeed = vlen(wishvel); - - if (wishspeed > sv_maxspeed) - { - wishvel = (sv_maxspeed / wishspeed) * wishvel; - wishspeed = sv_maxspeed; - } - wishspeed = wishspeed * 0.7; - cspeed = vlen(self.velocity); - if (cspeed) - { - newspeed = cspeed - (real_frametime * cspeed * sv_friction); - if (newspeed < 0) - newspeed = 0; - self.velocity = self.velocity * (newspeed / cspeed); - - } - else - newspeed = 0; - - if (!wishspeed) - return; - addspeed = wishspeed - newspeed; - if (addspeed <= 0) - return; - wishvel = normalize(wishvel); - cspeed = sv_accelerate * wishspeed * real_frametime; - if (cspeed > addspeed) - cspeed = addspeed; - self.velocity = self.velocity + cspeed * wishvel; -}; -void() SV_AirMove = -{ - local vector wishvel, vangle; - - vangle = self.v_angle; - vangle_x = vangle_z = 0; - makevectors(vangle); - if (time < self.teleport_time && (self.movement_x < 0)) - self.movement_x = 0; - wishvel = v_right * self.movement_y + v_forward * self.movement_x; - - - if (self.movetype != MOVETYPE_WALK) - wishvel_z = self.movement_z; - else - wishvel_z = 0; - if (vlen(wishvel) > sv_maxspeed) - wishvel = normalize(wishvel) * sv_maxspeed; - if (self.movetype == MOVETYPE_NOCLIP) - self.velocity = wishvel; - else if (self.flags & FL_ONGROUND) - { - SV_UserFriction(); - SV_Accelerate(wishvel); - } - else - SV_AirAccelerate (wishvel); -}; - -void() SV_ClientThink = -{ - local vector vangle; - - if (self.movetype == MOVETYPE_NONE) - return; - DropPunchAngle(); - if (self.health <= 0) - return; - self.v_angle_z = 0; // V_CalcRoll removed, sucks - self.angles_z = self.v_angle_z * 4; - vangle = self.v_angle + self.punchangle; - if (!self.fixangle) - { - self.angles_x = (vangle_x / -3); - self.angles_y = vangle_y; - } else - { - self.v_angle = self.angles; - self.fixangle = 0; - } - if (self.flags & FL_WATERJUMP) - { - SV_WaterJump(); - return; - } - if ((self.waterlevel >= 2) && (self.movetype != MOVETYPE_NOCLIP)) - { - SV_WaterMove(); - return; - } - SV_AirMove(); - -}; -/* -========================================= - -Stuff mimicking sv_phys.c - -========================================= -*/ - -float() SV_RunThink = -{ - local float thinktime, bkuptime; - thinktime = self.nextthink; - bkuptime = time; - if (thinktime <= 0 || thinktime > (time + real_frametime)) - return TRUE; - if (thinktime < time) - thinktime = time; - self.nextthink = 0; - time = thinktime; - other = world; - makevectors(self.v_angle); // hack - self.think(); - time = bkuptime; - return TRUE; -}; - -void(float scal) SV_AddGravity = -{ - self.velocity_z = self.velocity_z - (scal * sv_gravity * real_frametime); -}; - -float() SV_CheckWater = -{ - local vector point; - local float cont; - - point_x = self.origin_x; - point_y = self.origin_y; - self.waterlevel = 0; - self.watertype = CONTENT_EMPTY; - point_z = self.origin_z + self.mins_z + 1; - cont = pointcontents(point); - if (cont <= CONTENT_WATER) - { - self.watertype = cont; - self.waterlevel = 1; - point_z = self.origin_z + (self.mins_z + self.maxs_z) * 0.5; - cont = pointcontents(point); - if (cont <= CONTENT_WATER) - { - self.waterlevel = 2; - point_z = self.origin_z + self.view_ofs_z; - cont = pointcontents(point); - if (cont <= CONTENT_WATER) - self.waterlevel = 3; - } - } - return (self.waterlevel > 1); - -}; -void() RemoveThud = // well sometimes -{ - local entity oself; - if (other == world) - { - if (self.flags & FL_ONGROUND) - { - self.flags = self.flags - FL_ONGROUND; - } - } - else - { - if (other.solid == SOLID_BSP && (self.flags & FL_ONGROUND)) - { - // RM: Does this break anything? - // If not, then some more thuds have been removed. - self.flags = self.flags - FL_ONGROUND; - } - if (other == self.owner) - return; - if (self.owner.solid == SOLID_NOT) - return; - oself = other; - other = self.owner; - self = oself; - if (self.solid == SOLID_BSP) - if (self.touch) - self.touch(); - } - -}; -void() SV_CheckOnGround = -{ - local vector org, v; - org = self.origin; - local float currentflags; - currentflags = self.flags; - self.flags = self.flags | FL_ONGROUND | FL_PARTIALGROUND; - walkmove(0,0); // perform C touch function - self.flags = currentflags | FL_ONGROUND; - if ((org_x != self.origin_x) || (org_y != self.origin_y)) - org = self.origin; - else - self.origin = org; - v = org; - v_z = self.maxs_z + org_z + 1; - traceline (org, v, TRUE, self); - if ((self.waterlevel == 3) && (self.movetype == MOVETYPE_WALK)) - self.flags = self.flags - FL_ONGROUND; - else if ((trace_plane_normal_z <= 0.7) && (trace_fraction != 1)) - self.flags = self.flags - FL_ONGROUND; - else if (!droptofloor(0,0)) - self.flags = self.flags - FL_ONGROUND; - else if (org_z - self.origin_z < 2) - self.flags = self.flags | FL_ONGROUND; - else - self.flags = self.flags - FL_ONGROUND; - setorigin(self, org); -}; -// Thanks to Alan Kivlin for this function -// modified heavily by me -float(vector dir) botCheckForStep = -{ - local vector currentorigin, v; - local float currentflags, yaw, stepdistance, movedistance; - currentorigin = self.origin; - currentflags = self.flags; - self.flags = FL_ONGROUND | FL_PARTIALGROUND; - dir = normalize(dir); - dir_z = 0; - yaw = vectoyaw(dir); - if(walkmove(yaw, 3)) - { - if(droptofloor(0,0)) - { - stepdistance = self.origin_z - currentorigin_z; - v = self.origin - currentorigin; - v_z = 0; - movedistance = vlen(v); - if((stepdistance > 0 && stepdistance <= 16) && movedistance != 0) - { - self.flags = currentflags | FL_PARTIALGROUND; - return 1; - } - } - } - self.flags = currentflags; - setorigin(self, currentorigin); - return 0; -}; -// this is merely here to fix a problem with e3m5 -void(vector dir) BruteForceStep = -{ - local vector currentorigin; - local float currentflags, i, len; - - currentorigin = self.origin; - currentflags = self.flags; - len = vlen(dir); - if (len > 16) - dir = normalize(dir) * 16; - - setorigin(self, currentorigin + dir); - - while(i < 18 && !walkmove(0, 0)) - { - self.origin_z = currentorigin_z + i; - i = i + 2; - } - self.flags = currentflags; - if (i >=18) - setorigin(self, currentorigin); -}; - -void() PostPhysics = -{ - local vector obstr, org; - local float back, dst,cflags; - - self = self.owner; - - self.velocity = self.velocity - self.phys_obj.dest1 + self.phys_obj.velocity; - if (self.phys_obj.dest2 == self.origin) - { - setorigin(self, self.phys_obj.origin); - // might've been moved during other person's physics - // (teleporters / plats) - - if (self.movetype == MOVETYPE_WALK) - { - - if (self.phys_obj.dest1_x || self.phys_obj.dest1_y) - { - if ((self.flags & FL_ONGROUND) || (self.waterlevel <= 2)) - { - obstr = self.phys_obj.movedir - self.origin; - obstr_z = 0; - if (vlen(obstr) > 0.1) - { - dst = vlen(obstr); - back = vectoyaw(obstr); - cflags = self.flags; - self.flags = self.flags | FL_PARTIALGROUND; - if(walkmove(back, dst)) - { - self.flags = cflags; - self.phys_obj.dest1_z = 0; - self.velocity = self.velocity + self.phys_obj.dest1 - self.phys_obj.velocity; - } - else - { - if (dst > 1) - frik_obstructed(obstr, FALSE); - - org = self.origin; - self.flags = cflags; - obstr = self.phys_obj.dest1; - obstr_x = 0; - if (!botCheckForStep(obstr)) - { - obstr = self.phys_obj.dest1; - obstr_y = 0; - if (!botCheckForStep(obstr)) - { - // if no steps were found, bot is really obstucted - BruteForceStep(self.phys_obj.dest1); - } - } - } - } - } - } - } - } - - SV_CheckOnGround(); - - PlayerPostThink(); - BotAI(); - self.dmg_take = self.dmg_save = 0; - -}; -// Avoid calling BotAI and the physics at the same time -// Can trip the runaway loop counter - -void() SV_FlyMove = -{ - // This is nothing like the Quake function. - - if (self.phys_obj == world) - { - self.phys_obj = find(world,classname,"phys_obj"); - while (self.phys_obj.owner != self) - { - self.phys_obj = find(self.phys_obj,classname,"phys_obj"); - if (self.phys_obj == world) - { - error("No physics entity spawned!\nMake sure BotInit was called\n"); - } - } - } - - setmodel (self.phys_obj, string_null); - self.phys_obj.movetype = MOVETYPE_STEP; - - self.phys_obj.solid = SOLID_TRIGGER; - self.phys_obj.touch = RemoveThud; - setsize(self.phys_obj, self.mins, self.maxs); - self.phys_obj.dest2 = self.phys_obj.origin = self.origin; - self.phys_obj.watertype = 0; - self.phys_obj.movedir = self.origin + real_frametime * self.velocity; - self.phys_obj.dest1 = self.phys_obj.velocity = self.velocity; - self.phys_obj.velocity_z = self.phys_obj.velocity_z + sv_gravity * real_frametime; - self.phys_obj.flags = 0; - self.phys_obj.think = PostPhysics; - self.phys_obj.nextthink = time; -}; - - -void() SV_Physics_Toss = -{ - if (!SV_RunThink()) - return; - if (self.flags & FL_ONGROUND) - { - self.velocity = '0 0 0'; - BotAI(); - return; - } - if (self.movetype != MOVETYPE_FLY) - SV_AddGravity(1); - self.angles = self.angles + real_frametime * self.avelocity; - SV_FlyMove(); - -}; -void() SV_Physics_Client = -{ - - PlayerPreThink(); - - if (self.movetype == MOVETYPE_NONE) - { - if (!SV_RunThink()) - return; - PlayerPostThink(); - BotAI(); - - } - else if ((self.movetype == MOVETYPE_WALK) || (self.movetype == MOVETYPE_STEP)) - { - if (!SV_RunThink()) - return; - if (!(SV_CheckWater()) && (!(self.flags & FL_WATERJUMP))) - SV_AddGravity(1); - SV_FlyMove(); - } - else if ((self.movetype == MOVETYPE_TOSS) || (self.movetype == MOVETYPE_BOUNCE)) - { - SV_Physics_Toss(); - } - else if (self.movetype == MOVETYPE_FLY) - { - if (!SV_RunThink()) - return; - SV_FlyMove(); - } - else if (self.movetype == MOVETYPE_NOCLIP) - { - if (!SV_RunThink()) - return; - self.origin = self.origin + real_frametime * self.velocity; - - PlayerPostThink(); - BotAI(); - } - else - error ("SV_Physics_Client: Bad Movetype (BOT)"); - -}; - - diff --git a/attic/TeamNexuiz/game/gamec/bot_way.c b/attic/TeamNexuiz/game/gamec/bot_way.c deleted file mode 100644 index fb0641549..000000000 --- a/attic/TeamNexuiz/game/gamec/bot_way.c +++ /dev/null @@ -1,1001 +0,0 @@ - /*********************************************** -* * -* FrikBot Waypoints * -* "The better than roaming AI" * -* * -***********************************************/ - -/* - -This program is in the Public Domain. My crack legal -team would like to add: - -RYAN "FRIKAC" SMITH IS PROVIDING THIS SOFTWARE "AS IS" -AND MAKES NO WARRANTY, EXPRESS OR IMPLIED, AS TO THE -ACCURACY, CAPABILITY, EFFICIENCY, MERCHANTABILITY, OR -FUNCTIONING OF THIS SOFTWARE AND/OR DOCUMENTATION. IN -NO EVENT WILL RYAN "FRIKAC" SMITH BE LIABLE FOR ANY -GENERAL, CONSEQUENTIAL, INDIRECT, INCIDENTAL, -EXEMPLARY, OR SPECIAL DAMAGES, EVEN IF RYAN "FRIKAC" -SMITH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES, IRRESPECTIVE OF THE CAUSE OF SUCH DAMAGES. - -You accept this software on the condition that you -indemnify and hold harmless Ryan "FrikaC" Smith from -any and all liability or damages to third parties, -including attorney fees, court costs, and other -related costs and expenses, arising out of your use -of this software irrespective of the cause of said -liability. - -The export from the United States or the subsequent -reexport of this software is subject to compliance -with United States export control and munitions -control restrictions. You agree that in the event you -seek to export this software, you assume full -responsibility for obtaining all necessary export -licenses and approvals and for assuring compliance -with applicable reexport restrictions. - -Any reproduction of this software must contain -this notice in its entirety. - -*/ - - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Waypoint Linking code - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - - -float (entity e1, entity e2) CheckLinked = -{ - if ((e1 == e2) || (e2 == world) || (e1 == world)) - return FALSE; - else if (e1.target1 == e2) - { - if (e1.b_aiflags & AI_TELELINK_1) - return 2; - else return TRUE; - } - else if (e1.target2 == e2) - { - if (e1.b_aiflags & AI_TELELINK_2) - return 2; - else return TRUE; - } - else if (e1.target3 == e2) - { - if (e1.b_aiflags & AI_TELELINK_3) - return 2; - else return TRUE; - } - else if (e1.target4 == e2) - { - if (e1.b_aiflags & AI_TELELINK_4) - return 2; - else return TRUE; - } - - else return FALSE; -}; - - -float (entity e1, entity e2) LinkWays = -{ - if ((e1 == e2) || (e2 == world) || (e1 == world)) - return FALSE; - else if (CheckLinked(e1, e2)) - return FALSE; // already linked!!! - - if (e1.target1 == world) - { - e1.target1 = e2; - return TRUE; - } - else if (e1.target2 == world) - { - e1.target2 = e2; - return TRUE; - } - else if (e1.target3 == world) - { - e1.target3 = e2; - return TRUE; - } - else if (e1.target4 == world) - { - e1.target4 = e2; - return TRUE; - } - else return FALSE; - -}; -// Link Ways part 2, used only for teleporters - -float (entity e1, entity e2) TeleLinkWays = -{ - if ((e1 == e2) || (e2 == world) || (e1 == world)) - return FALSE; - else if (CheckLinked(e1, e2)) - return FALSE; // already linked!!! - - if (e1.target1 == world) - { - e1.target1 = e2; - e1.b_aiflags = e1.b_aiflags | AI_TELELINK_1; - return TRUE; - } - else if (e1.target2 == world) - { - e1.target2 = e2; - e1.b_aiflags = e1.b_aiflags | AI_TELELINK_2; - return TRUE; - } - else if (e1.target3 == world) - { - e1.target3 = e2; - e1.b_aiflags = e1.b_aiflags | AI_TELELINK_3; - return TRUE; - } - else if (e1.target4 == world) - { - e1.target4 = e2; - e1.b_aiflags = e1.b_aiflags | AI_TELELINK_4; - return TRUE; - } - else - return FALSE; - -}; - -void (entity e1, entity e2) UnlinkWays = -{ - if ((e1 == e2) || (e2 == world) || (e1 == world)) - return; - else if (!CheckLinked(e1, e2)) - return; - - if (e1.target1 == e2) - { - e1.b_aiflags = e1.b_aiflags - (e1.b_aiflags & AI_TELELINK_1); - e1.target1 = world; - } - if (e1.target2 == e2) - { - e1.b_aiflags = e1.b_aiflags - (e1.b_aiflags & AI_TELELINK_2); - e1.target2 = world; - } - if (e1.target3 == e2) - { - e1.b_aiflags = e1.b_aiflags - (e1.b_aiflags & AI_TELELINK_3); - e1.target3 = world; - } - if (e1.target4 == e2) - { - e1.b_aiflags = e1.b_aiflags - (e1.b_aiflags & AI_TELELINK_4); - e1.target4 = world; - } - -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -FindWaypoint - -This is used quite a bit, by many different -functions big lag causer - -Finds the closest, fisible, waypoint to e - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -entity(entity start) FindWayPoint = -{ - local entity t; - local vector org; - local float dst, tdst; - local entity best; - - org = realorigin(self); - - t = way_head; - if (start != world) - { - dst = vlen(start.origin - org); - best = start; - } - else - { - dst = 100000; - best = world; - } - while(t) - { - // real players cut through ignore types - if (dst < 20) - return best; - if (!(t.b_aiflags & AI_IGNORE_TYPES) || self.ishuman) - { - tdst = vlen(t.origin - org); - if (tdst < dst) - { - if (sisible(t)) - { - dst = tdst; - best = t; - } - } - } - t = t._next; - } - return best; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Waypoint Spawning Code - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -entity way_foot; // Ugh. Do I need a foot for this or not? - -entity(vector org) make_waypoint = -{ - local entity point; - point = spawn(); - point.classname = "waypoint"; - point.search_time = time; // don't double back for me; - point.solid = SOLID_TRIGGER; - point.movetype = MOVETYPE_NONE; - point.items = -1; - setorigin(point, org); - - setsize(point, PL_MIN, PL_MAX); - waypoints = waypoints + 1; - if (!way_head) - { - way_head = point; - way_foot = point; - } - else - { - way_foot._next = point; - point._last = way_foot; - way_foot = point; - } - - point.count = waypoints; - if (waypoint_mode > WM_LOADED) // editor modes - setmodel(point, "progs/s_bubble.spr"); // file missing from nexuiz - return point; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Dynamic Waypoint spawning and linking. Not -very good all things considered. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() DynamicWaypoint = -{ - local entity t; - local float dist, dynlink, dynpoint, editor; - - if (self.teleport_time > self.portal_time) - { - if (!self.flags & FL_WATERJUMP) - { - self.dyn_flags = 2; - if (!self.ishuman) - { - bot_lost(self.target1, TRUE); - self.enemy = world; - } - } - self.portal_time = self.teleport_time; - } -// stacking everything on waypoint_mode might've been good for the editor, -// but it sucks to beat hell for this code. - - -// convert waypoint_mode to something more usable.. - if (waypoint_mode > WM_LOADED) - { - if (self.ishuman) - { - if (waypoint_mode == WM_EDITOR_DYNLINK) - dynlink = 1; - else if (waypoint_mode == WM_EDITOR_DYNAMIC) - dynlink = dynpoint = 1; - editor = 1; - } - } - else if (waypoint_mode == WM_DYNAMIC) - dynlink = dynpoint = 1; - -// if there's nothing for dynamic to do.. - if (!dynpoint) - { - if (!editor) - return; - } -// for speed sake, I won't have bots dynamic waypoint in coop - if (!self.ishuman) - if (coop) - return; - -// don't waypoint in single player - if (max_clients < 2) - return; -// if you're dead - else if (self.health <= 0) - { - if (dynpoint) - { - if (self.current_way) - { - if (pointcontents(self.origin) < -4) - { - if (self.current_way.b_aiflags & AI_BLIND) - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_PRECISION; - else - self.current_way.b_aiflags = self.current_way.b_aiflags | AI_BLIND; - } - } - } - self.dyn_dest = '0 0 0'; - self.current_way = world; - self.dyn_flags = 0; - return; - } - -// you shouldn't be making waypoints mid air - if (dynpoint) - { - if (!((self.flags & FL_ONGROUND) || self.waterlevel == 3)) - { - if (self.dyn_flags != 2) - { - self.dyn_flags = 1; - } - return; - } - } -// keep from doing the rest of this every frame - if (self.dyn_time > time) - return; - self.dyn_time = time + 0.2; - -// display the links for editor mode - if (editor) - { - if (self.current_way) - { - if (self.current_way.target1) - DeveloperLightning(self.current_way, self.current_way.target1, self.current_way.b_aiflags & AI_TELELINK_1); - if (self.current_way.target2) - DeveloperLightning(self.current_way, self.current_way.target2, self.current_way.b_aiflags & AI_TELELINK_2); - if (self.current_way.target3) - DeveloperLightning(self.current_way, self.current_way.target3, self.current_way.b_aiflags & AI_TELELINK_3); - if (self.current_way.target4) - DeveloperLightning(self.current_way, self.current_way.target4, self.current_way.b_aiflags & AI_TELELINK_4); - } - if (self.b_aiflags & AI_HOLD_SELECT) - return; - } - - t = FindWayPoint(self.current_way); - if (t) - { - dist = vlen(self.origin - t.origin); - if (dist < 192) - { - if (dist < 64) - { - - if (t != self.current_way) - { - if (dynlink) - { - if (!self.dyn_flags) - { - if (wisible(t, self.current_way)) - LinkWays(t, self.current_way); - } - if (self.dyn_flags == 2) - TeleLinkWays(self.current_way, t); - else if (wisible(t, self.current_way)) - LinkWays(self.current_way, t); - } - if (editor) - { - setmodel(t, "progs/s_light.spr"); // file missing from nexuiz - if (self.current_way) - setmodel(self.current_way, "progs/s_bubble.spr"); // file missing from nexuiz - } - } - self.current_way = t; - self.dyn_flags = 0; - } - self.dyn_dest = self.origin + self.view_ofs; - return; - } - } - - if (frik_recognize_plat(FALSE)) - { - if (vlen(trace_ent.velocity) > 0) - { - if (self.dyn_plat) - return; - self.dyn_plat = TRUE; - if (!self.dyn_flags) - self.dyn_flags = 1; - //bprint("on a plat!!!!!\n"); - } - else - self.dyn_plat = FALSE; - } - else - self.dyn_plat = FALSE; - - if (self.dyn_flags == 2) - self.dyn_dest = self.origin + self.view_ofs; - else if (self.dyn_dest == '0 0 0') - self.dyn_dest = self.origin + self.view_ofs; - if (!dynpoint) - return; - t = make_waypoint(self.dyn_dest); - - if (!self.dyn_flags) - { - if (wisible(t, self.current_way)) - LinkWays(t, self.current_way); - } - if (self.dyn_flags == 2) - TeleLinkWays(self.current_way, t); - else if (wisible(t, self.current_way)) - LinkWays(self.current_way, t); - - if (editor) - { - setmodel(t, "progs/s_light.spr"); // file missing from nexuiz - if (self.current_way) - setmodel(self.current_way, "progs/s_bubble.spr"); // file missing from nexuiz - } - self.current_way = t; - self.dyn_flags = 0; - - self.dyn_dest = self.origin + self.view_ofs; - - if (frik_recognize_plat(FALSE)) - { - if (trace_ent.classname == "door") - t.b_aiflags = t.b_aiflags | AI_DOORFLAG; - } -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Waypoint Loading from file - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() ClearAllWays = -{ - - local entity t, n; - t = way_head; - while(t) - { - n = t._next; - remove(t); - t = n; - } - way_head = world; - way_foot = world; - waypoints = 0; -}; - -entity(float num) WaypointForNum = -{ - local entity t; - if (!num) - return world; - - t = way_head; - while (t) - { - if (t.count == num) - return t; - t = t._next; - } - return world; -}; - -void() FixThisWaypoint = -{ - self.enemy.target1 = WaypointForNum(self.enemy.b_pants); - self.enemy.target2 = WaypointForNum(self.enemy.b_skill); - self.enemy.target3 = WaypointForNum(self.enemy.b_shirt); - self.enemy.target4 = WaypointForNum(self.enemy.b_frags); - self.enemy = self.enemy._next; - self.nextthink = time; - if (self.enemy == world) - { - remove(self); - fixer = world; - } -}; - -void() FixWaypoints = -{ - if (!fixer) - fixer = spawn(); - fixer.nextthink = time; - fixer.think = FixThisWaypoint; - fixer.enemy = way_head; -}; - - - -void(entity what) delete_waypoint = -{ - local entity t; - - if (way_head == what) - way_head = what._next; - if (way_foot == what) - way_foot = what._last; - if (what._last) - what._last._next = what._next; - if (what._next) - what._next._last = what._last; - waypoints = 0; - t = way_head; - while(t) - { - t.count = waypoints = waypoints + 1; - if (CheckLinked(t, what)) - UnlinkWays(t, what); - t = t._next; - } - if (self.current_way == what) - self.current_way = world; - remove(what); -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -FindRoute & FindThing used by the pathing code -in bot_ai.qc - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - - -entity(string s) FindThing = -{ - local entity t; - local float tdst, dst; - local entity best; - dst = 100000; - best = world; - t = find (world, classname, s); - while (t != world) - { - tdst = vlen(((t.absmin + t.absmax) * 0.5) - self.origin); - if (tdst < dst) - { - dst = tdst; - best = t; - } - t = find(t, classname, s); - } - return best; -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -FindRoute, this is a key function in the -pathing. The name is a bit misleading, this -code finds the closest waypoint that is part -of a route calculated by the begin_route and -end_route routines This is a definite path to -an object. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -entity(entity lastone) FindRoute = -{ - // kinda like FindWaypoint, only of this bots route though - local entity t, best; - local float dst, tdst, flag; - flag = ClientBitFlag(self.b_clientno); - t = way_head; - dst = 100000; - best = world; - while(t) - { - tdst = vlen(t.origin - self.origin); - if ((tdst < dst) && (t.b_sound & flag)) - { - if ((lastone == world) || (CheckLinked(lastone, t))) - { - dst = tdst; - best = t; - } - } - t = t._next; - } - return best; -}; -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Route & path table management - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() ClearRouteTable = -{ - // cleans up route table - - local entity t; - t = way_head; - while (t) - { - t. keys = FALSE; - t.enemy = world; - t.items = -1; // not in table - t = t._next; - } -}; - -void() ClearMyRoute = -{ - local float flag; - local entity t; - - flag = ClientBitFlag(self.b_clientno); - - t = way_head; - while (t) - { - t.b_sound = t.b_sound - (t.b_sound & flag); - t = t._next; - } -}; - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Mark_path - -After the route has been found, mark it with -bitflags so the table can be used for a -different bot. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - - -void(entity this) mark_path = -{ - local entity t, oself; - local float flag; - - ClearMyRoute(); - - oself = self; - self = this; - t = FindWayPoint(this.current_way); - self = oself; - // FIXME - // ugh, better way to find players please!!! - if (this.classname != "player") - this.current_way = t; - - if (t.enemy == world) - { - bot_lost(this, FALSE); - if (waypoint_mode == WM_DYNAMIC) - self.route_failed = TRUE; - return; - } - - flag = ClientBitFlag(self.b_clientno); - - while(t) - { - if (t.b_sound & flag) - return; - if (t == self.last_way) - return; - t.b_sound = t.b_sound | flag; - t = t.enemy; - } -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -WaypointThink - -Calculates the routes. We use thinks to avoid -tripping the runaway loop counter - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void(entity e2, float b_bit) FollowLink = -{ - local float dist; - - if (self.b_aiflags & b_bit) - dist = self.items; - else - dist = vlen(self.origin - e2.origin) + self.items; - - // check if this is an RJ link - if (e2.b_aiflags & AI_SUPER_JUMP) - { - if (!bot_can_rj(route_table)) - return; - } - if (e2.b_aiflags & AI_DIFFICULT) - dist = dist + 1000; - - dist = dist + random() * 100; // add a little chaos - - if ((dist < e2.items) || (e2.items == -1)) - { - if (!e2.keys) - busy_waypoints = busy_waypoints + 1; - e2.keys = TRUE; - e2.items = dist; - e2.think = WaypointThink; - e2.nextthink = time; - e2.enemy = self; - } -}; - -void() WaypointThink = -{ - local entity oself; - - if (self.items == -1) - return; - // can you say ugly? - if (self.b_aiflags & AI_TRACE_TEST) - { - if (self.target1) - { - traceline(self.origin, self.target1.origin, TRUE, self); - if (trace_fraction == 1) - FollowLink(self.target1, AI_TELELINK_1); - } - if (self.target2) - { - traceline(self.origin, self.target2.origin, TRUE, self); - if (trace_fraction == 1) - FollowLink(self.target2, AI_TELELINK_2); - } - if (self.target3) - { - traceline(self.origin, self.target3.origin, TRUE, self); - if (trace_fraction == 1) - FollowLink(self.target3, AI_TELELINK_3); - } - if (self.target4) - { - traceline(self.origin, self.target4.origin, TRUE, self); - if (trace_fraction == 1) - FollowLink(self.target4, AI_TELELINK_4); - } - } - else - { - if (self.target1) - FollowLink(self.target1, AI_TELELINK_1); - if (self.target2) - FollowLink(self.target2, AI_TELELINK_2); - if (self.target3) - FollowLink(self.target3, AI_TELELINK_3); - if (self.target4) - FollowLink(self.target4, AI_TELELINK_4); - } - - busy_waypoints = busy_waypoints - 1; - self.keys = FALSE; - - if (busy_waypoints <= 0) - { - if (direct_route) - { - oself = self; - self = route_table; - bot_get_path(self.target1, FALSE); - self = oself; - direct_route = FALSE; - } - } -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -begin_route and bot_get_path - -PLEASE NOTE: bot_get_path replaces the old -calls to begin_route. - -Routing isn't done all at once now, but in two -stages, the bot will calc a route *THEN* -choose a target, *THEN* mark a path. - -Boy it's confusing. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -float() begin_route = -{ - if (busy_waypoints > 0) - return FALSE; - - if (route_table != world) - { - if (!route_table.ishuman) - { - if (route_table.b_clientno != -1) - return FALSE; - } - } - - route_table = self; - ClearRouteTable(); - self.last_way = FindWayPoint(self.current_way); - - if (self.last_way != world) - { - self.last_way.items = vlen(self.last_way.origin - self.origin); - self.last_way.nextthink = time; - self.last_way.think = WaypointThink; - self.last_way.keys = TRUE; - busy_waypoints = 1; - return TRUE; - } - else - { - route_table = world; - busy_waypoints = 0; - return FALSE; - } -}; - -void(entity this, float direct) bot_get_path = -{ - if (this == world) - return; - - if (route_table == self) - { - if (busy_waypoints <= 0) - { - route_table = world; - mark_path(this); - } - return; - } - if (direct) - { - if(begin_route()) - direct_route = TRUE; - else - bot_lost(this, FALSE); - return; - } -}; - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -BSP/QC Waypoint loading - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void() waypoint = -{ - self.search_time = time; - self.solid = SOLID_TRIGGER; - self.movetype = MOVETYPE_NONE; - setorigin(self, self.origin); - - setsize(self, PL_MIN, PL_MAX); - waypoints = waypoints + 1; - if (!way_head) - { - way_head = self; - way_foot = self; - } - else - { - way_foot._next = self; - self._last = way_foot; - way_foot = self; - } - - self.count = waypoints; - waypoint_mode = WM_LOADED; - if (self.count == 1) - { - self.think = FixWaypoints; // wait until all bsp loaded points are spawned - self.nextthink = time; - } -}; - -void(vector org, vector bit1, float bit4, float flargs) make_way = -{ - local entity y; - waypoint_mode = WM_LOADED; - y = make_waypoint(org); - y.b_aiflags = flargs; - y.b_pants = bit1_x; - y.b_skill = bit1_y; - y.b_shirt = bit1_z; - y.b_frags = bit4; - if (y.count == 1) - { - y.think = FixWaypoints; // wait until all qc loaded points are spawned - y.nextthink = time; - } -}; - - -/* --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Temporary Marker code - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -*/ - -void(vector org) SpawnTempWaypoint = -{ - local entity tep; - - if (!self.temp_way) - self.temp_way = tep = spawn(); - else - tep = self.temp_way; - - tep.classname = "temp_waypoint"; - tep.search_time = 0; - tep.solid = SOLID_TRIGGER; - tep.movetype = MOVETYPE_NOCLIP; - setorigin(tep, org); - target_add(tep); - setsize(tep, PL_MIN, PL_MAX); // FIXME: convert these to numerical -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/builtins.h b/attic/TeamNexuiz/game/gamec/builtins.h deleted file mode 100644 index b32e40888..000000000 --- a/attic/TeamNexuiz/game/gamec/builtins.h +++ /dev/null @@ -1,76 +0,0 @@ - -void makevectors (vector ang) = #1; -void setorigin (entity e, vector o) = #2; -void setmodel (entity e, string m) = #3; -void setsize (entity e, vector min, vector max) = #4; - -void crash (void) = #6; -float random (void) = #7; -void(entity e, float chan, string samp, float vol, float atten) sound = #8; -vector normalize (vector v) = #9; -void error (string e) = #10; -void objerror (string e) = #11; -float vlen (vector v) = #12; -float vectoyaw (vector v) = #13; -entity spawn (void) = #14; -//entity spawn_real (void) = #14; -// spawn redirect function -//entity spawn (); -void remove (entity e) = #15; -void traceline (vector v1, vector v2, float nomonst, entity forent) = #16; -entity checkclient (void) = #17; -entity find (entity start, .string fld, string match) = #18; -string precache_sound (string s) = #19; -string precache_model (string s) = #20; -void(entity client, string s)stuffcmd = #21; -entity findradius (vector org, float rad) = #22; -void bprint (string s, ...) = #23; -void(entity client, string s) sprint = #24; -void dprint (string s, ...) = #25; -string ftos (float f) = #26; -string vtos (vector v) = #27; -void coredump (void) = #28; -void traceon (void) = #29; -void traceoff (void) = #30; -void eprint (entity e) = #31; -float walkmove (float yaw, float dist) = #32; - -float droptofloor (float yaw, float dist) = #34; -void lightstyle (float style, string value) = #35; -float rint (float v) = #36; -float floor (float v) = #37; -float ceil (float v) = #38; - -float checkbottom (entity e) = #40; -float pointcontents (vector v) = #41; - -float fabs (float f) = #43; -vector(entity e, float speed) aim = #44; -float cvar (string s) = #45; -void localcmd (string s) = #46; -entity nextent (entity e) = #47; -void particle (vector v, vector d, float colour, float count) = #48; -void ChangeYaw (void) = #49; - -vector vectoangles (vector v) = #51; -//void(float to, float f) WriteByte = #52; -//void(float to, float f) WriteCoord = #56; -void(float to, float f) WriteByte = #52; -void(float to, float f) WriteChar = #53; -void(float to, float f) WriteShort = #54; -void(float to, float f) WriteLong = #55; -void(float to, float f) WriteCoord = #56; -void(float to, float f) WriteAngle = #57; -void(float to, string s) WriteString = #58; -void(float to, entity s) WriteEntity = #59; -void movetogoal (float step) = #67; -string precache_file (string s) = #68; -void makestatic (entity e) = #69; -void changelevel (string s) = #70; - -void cvar_set (string var, string val) = #72; -void(entity client, string s) centerprint = #73; -void ambientsound (vector pos, string samp, float vol, float atten) = #74; -string precache_model2 (string s) = #75; -string precache_sound2 (string s) = #76; -string precache_file2 (string s) = #77; diff --git a/attic/TeamNexuiz/game/gamec/civilian.c b/attic/TeamNexuiz/game/gamec/civilian.c deleted file mode 100644 index 8e38410ec..000000000 --- a/attic/TeamNexuiz/game/gamec/civilian.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - -=[Team:Nexuiz]=- - Class: Civilian - Grenade 1 type: none - Grenade 2 type: none - Weapon 1: Ball Launcher (on enabled maps) - Weapon 2: none - Weapon 3: none - Weapon 4: none - Special 1: none - Special 2: none - Purpose: Generally used in hostage rescue scenario maps (hunted, border1) and also - sports maps like tn_soccer and sandrena. -*/ - -void BecomeCivilian(float portion) -{ - self.max_health = cvar("g_balance_class_civilian_health") * portion; - - self.max_armor = cvar("g_balance_class_civilian_armor") * portion; - - self.mass = cvar("g_balance_class_civilian_mass"); - - SetPlayerSpeed(self); - - self.items = 0/*IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4*/; - self.switchweapon = 0; - self.ammo_shells = floor(20 * portion); - self.ammo_nails = floor(20 * portion); - self.ammo_rockets = floor(1 * portion); - self.ammo_cells = floor(0 * portion); - self.playerclass = TF_CLASS_CIVILIAN; // TF P.C. - SetMaxAmmoFor (CLASS_CIVILIAN); -} - -void CivilianPreThink() -{ -} - -void CivilianPostThink() -{ -} \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/cl_client.c b/attic/TeamNexuiz/game/gamec/cl_client.c deleted file mode 100644 index fef162cb0..000000000 --- a/attic/TeamNexuiz/game/gamec/cl_client.c +++ /dev/null @@ -1,1233 +0,0 @@ -void info_player_start (void) -{ - if (self.allowteams != "") - { - if (self.allowteams == "blue") - self.team_no = 1; - if (self.allowteams == "red") - self.team_no = 2; - if (!self.goal_state) - self.goal_state = 1; - if (!self.group_no) - self.group_no = 1; - i_p_t(); - return; - } - else - { - self.classname = "info_player_deathmatch"; - } -}; - -void info_player_deathmatch (void) -{ -} -/* -=============== - Find Team Spawn Point (NexTF!) - =============== -*/ -entity (float team_num) FindTeamSpawnPoint = -{ - local entity spot; - local entity at_spot; - local float spot_found; - local float attempts; - - if ((team_num == 1)) - { - spot = lastspawn_team1; - attempts = 0; - while (1) - { - attempts = (attempts + 1); - spot = find (spot, team_str_home, "ts1"); - if ((spot == world)) - { - spot = find (world, team_str_home, "ts1"); - } - if ((spot == world)) - { - return (world); - } - at_spot = findradius (spot.origin, 40); - spot_found = 1; - while ((at_spot != world)) - { - if (((at_spot.classname == "player") && (at_spot.deadflag == 0))) - { - spot_found = 0; - } - at_spot = at_spot.chain; - } - if (!Activated (spot, self)) - { - spot_found = 0; - } - if ((spot_found || (attempts >= 30))) - { - lastspawn_team1 = spot; - return (spot); - } - } - } - else - { - if ((team_num == 2)) - { - spot = lastspawn_team2; - attempts = 0; - while (1) - { - attempts = (attempts + 1); - spot = find (spot, team_str_home, "ts2"); - if ((spot == world)) - { - spot = find (world, team_str_home, "ts2"); - } - if ((spot == world)) - { - return (world); - } - at_spot = findradius (spot.origin, 40); - spot_found = 1; - while ((at_spot != world)) - { - if (((at_spot.classname == "player") && (at_spot.deadflag == 0))) - { - spot_found = 0; - } - at_spot = at_spot.chain; - } - if (!Activated (spot, self)) - { - spot_found = 0; - } - if ((spot_found || (attempts >= 30))) - { - lastspawn_team2 = spot; - return (spot); - } - } - } - else - { - if ((team_num == 3)) - { - spot = lastspawn_team3; - attempts = 0; - while (1) - { - attempts = (attempts + 1); - spot = find (spot, team_str_home, "ts3"); - if ((spot == world)) - { - spot = find (world, team_str_home, "ts3"); - } - if ((spot == world)) - { - return (world); - } - at_spot = findradius (spot.origin, 40); - spot_found = 1; - while ((at_spot != world)) - { - if (((at_spot.classname == "player") && (at_spot.deadflag == 0))) - { - spot_found = 0; - } - at_spot = at_spot.chain; - } - if (!Activated (spot, self)) - { - spot_found = 0; - } - if ((spot_found || (attempts >= 30))) - { - lastspawn_team3 = spot; - return (spot); - } - } - } - else - { - if ((team_num == 4)) - { - spot = lastspawn_team4; - attempts = 0; - while (1) - { - attempts = (attempts + 1); - spot = find (spot, team_str_home, "ts4"); - if ((spot == world)) - { - spot = find (world, team_str_home, "ts4"); - } - if ((spot == world)) - { - return (world); - } - at_spot = findradius (spot.origin, 40); - spot_found = 1; - while ((at_spot != world)) - { - if (((at_spot.classname == "player") && (at_spot.deadflag == 0))) - { - spot_found = 0; - } - at_spot = at_spot.chain; - } - if (!Activated (spot, self)) - { - spot_found = 0; - } - if ((spot_found || (attempts >= 30))) - { - lastspawn_team4 = spot; - return (spot); - } - } - } - } - } - } - return (world); -}; - -/* -============= -SelectSpawnPoint - -Finds a point to respawn -============= -*/ -entity () SelectSpawnPoint = -{ - local entity spot; - local entity at_spot; - local float spot_found; - local float attempts; - - if (self.team_no < 1) - { -// self.origin_z = self.origin_z + 30; - if (!cvar("g_teamnexuiz_version")) - self.current_menu = MENU_NEED_TN; - else - { - stuffcmd(self, "alias menu_showteamselect \"set scmenu_directmenu TeamSelect; togglemenu\"\n"); - stuffcmd(self, "set scmenu_directmenu TeamSelect; togglemenu\n"); - stuffcmd(self, "alias classmenu \"impulse 73\"\n"); - stuffcmd(self, "cl_bobmodel 0\n"); // So the HUD items dont bob around - } -// spot = find (world, classname, "item_tfgoal"); -// return (spot); - } - self.is_dead = 0; //TEMP - - if ((self.team_no != 0)) - { - spot = FindTeamSpawnPoint (self.team_no); - if ((spot != world)) - { - return (spot); - } - } - if (coop) - { - lastspawn = find (lastspawn, classname, "info_player_coop"); - if ((lastspawn == world)) - { - lastspawn = find (world, classname, "info_player_coop"); - } - if ((lastspawn != world)) - { - return (lastspawn); - } - } - else - { - if (deathmatch) - { - spot = find (lastspawn, classname, "info_player_deathmatch"); - if ((spot == world)) - { - spot = find (world, classname, "info_player_deathmatch"); - } - attempts = 0; - while (((spot != world) && (attempts < 100))) - { - attempts = (attempts + 1); - at_spot = findradius (spot.origin, 40); - spot_found = 1; - while (at_spot) - { - if (((at_spot.classname == "player") && (at_spot.deadflag == 0))) - { - spot_found = 0; - } - at_spot = at_spot.chain; - } - if ((spot_found || (attempts >= 10))) - { - lastspawn = spot; - return (spot); - } - spot = find (spot, classname, "info_player_deathmatch"); - if ((spot == world)) - { - spot = find (world, classname, "info_player_deathmatch"); - } - } - } - } - if (serverflags) - { - spot = find (world, classname, "info_player_start2"); - if (spot) - { - return (spot); - } - } - spot = find (world, classname, "info_player_start"); - /*if (!spot) - { - spot = find (world, is_converted_goal, "yes"); - }*/ - spot = find(world, classname, "info_player_start"); - if (!spot) - { - spot = find (world, classname, "info_player_intermission"); - } - if (!spot) - { - spot = find (world, classname, "info_tfgoal"); - } - if (!spot) - { - error ("PutClientInServer: no info_player_start on level\n"); - } - return (spot); -}; - -/*entity SelectSpawnPoint (void) // Old, non-tf code -{ - local entity spot, thing; - local float pcount; - - spot = find (world, classname, "testplayerstart"); - if (spot) - return spot; - - spot = lastspawn; - while (1) - { - spot = find(spot, classname, "info_player_deathmatch"); - if (spot != world) - { - if (spot == lastspawn) - return lastspawn; - pcount = 0; - thing = findradius(spot.origin, 70); - while(thing) - { - if (thing.classname == "player") - pcount = pcount + 1; - thing = thing.chain; - } - if (pcount == 0) - { - lastspawn = spot; - return spot; - } - } - } - - spot = find (world, classname, "info_player_start"); - if (!spot) - error ("PutClientInServer: no info_player_start on level"); - - return spot; -}*/ - -/* -============= -CheckPlayerModel - -Checks if the argument string can be a valid playermodel. -Returns a valid one in doubt. -============= -*/ -string CheckPlayerModel(string playermodel) { - if( substring(playermodel,0,13) != "models/class/") playermodel = "models/class/scout.zym"; - - /* Possible Fixme: Check if server can open the model? - This would kill custom models, however. */ - - return playermodel; -} - - -/* -============= -PutClientInServer - -Called when a client spawns in the server -============= -*/ -void PutClientInServer (void) -{ - entity spot; - float oldcl; - if (self.team_no < 1) - { - self.movetype = 0; - self.solid = 0; - self.flags = FL_CLIENT; - self.takedamage = DAMAGE_AIM; - self.effects = 0; - self.health = cvar("g_balance_health_start"); - self.max_health = cvar("g_balance_health_stable"); - self.armorvalue = cvar("g_balance_armor_start"); - self.max_armor = self.armorvalue; - self.damageforcescale = 2; - self.death_time = 0; - self.dead_time = 0; - self.dead_frame = 0; - self.die_frame = 0; - self.alpha = 0; - self.scale = 0; - self.fade_time = 0; - self.pain_frame = 0; - self.pain_finished = 0; - self.strength_finished = 0; - self.invincible_finished = 0; - //self.speed_finished = 0; - //self.slowmo_finished = 0; - // players have no think function - self.think = SUB_Null; - self.nextthink = 0; - self.speed = -1; - self.jump_pad = 0; - spot = SelectSpawnPoint(); - setorigin (self, spot.origin + '0 0 1' * (1 - self.mins_z - 14)); -// setorigin (self, spot.origin + '0 0 1' * (1 - self.mins_z + 24)); -// setorigin (self, spot.origin + '-2 0 4' * (1 - self.mins_z + 24)); -// self.angles_y = self.angles_y + 180; - return; - } - if (self.playerclass < 1) - { - stuffcmd(self, "set scmenu_directmenu ClassSelect; togglemenu\n"); - return; - } - - // fixme: are these the right teams & colors? - /*if(self.team == 5) // Wazat -- I'm using TeamFortress_TeamSet for this now - { - self.team_no = 1; - } - if(self.team == 14) - { - self.team_no = 2; - } - if(self.team == 4) - { - self.team_no = 3; - } - if(self.team == 13) - { - self.team_no = 4; - }*/ - - DoTFAliases (); - -// spot = SelectSpawnPoint (); // moved down - self.classname = "player"; - self.movetype = MOVETYPE_WALK; - self.solid = SOLID_SLIDEBOX; - self.flags = FL_CLIENT; - self.takedamage = DAMAGE_AIM; - self.effects = 0; - self.health = cvar("g_balance_health_start"); - self.max_health = cvar("g_balance_health_stable"); - self.armorvalue = cvar("g_balance_armor_start"); - self.max_armor = self.armorvalue; - self.damageforcescale = 2; - self.death_time = 0; - self.dead_time = 0; - self.dead_frame = 0; - self.die_frame = 0; - self.alpha = 0; - self.scale = 0; - self.fade_time = 0; - self.pain_frame = 0; - self.pain_finished = 0; - self.strength_finished = 0; - self.invincible_finished = 0; - //self.speed_finished = 0; - //self.slowmo_finished = 0; - // players have no think function - self.think = SUB_Null; - self.nextthink = 0; - self.speed = -1; - self.jump_pad = 0; - //self.wpn5 = 0; // not carrying an extra weapon - ResetExtraWeapon(); // not carrying an extra weapon - - DelayHealthRegen(self); - DelayArmorRegen(self); - DelayHealthRot(self); - DelayArmorRot(self); - - - self.special_active = 0; - self.special_time = 0; - - self.grenade_time = 0; - - if(self.onfire != world) - remove(self.onfire); - self.onfire = world; - self.flame_heat = 0; - self.flame_heat_time = 0; - - self.poison_damage = 0; - self.poison_rate = 0; - - self.is_feigning = 0; - self.current_menu = 0; - - // if the player is supposed to change model (and hence class) on respawn, do it. - if(self.change_mdl_on_respawn != "") - { - self.playermodel = self.change_mdl_on_respawn; - //strunzone(self.change_mdl_on_respawn); // can't unzone or it'll crash later - } - // set the class. If he changed classes while dead it will take effect now. - oldcl = self.class; - self.class = GetPlayerClass(); - Do_TFClass_Conversion(); - ChangeClass((oldcl != self.class), FALSE); - - - - self.deadflag = DEAD_NO; - - spot = SelectSpawnPoint (); // maybe temp - self.angles = spot.angles; - self.fixangle = TRUE; // turn this way immediately - self.velocity = '0 0 0'; - self.avelocity = '0 0 0'; - self.punchangle = '0 0 0'; - self.punchvector = '0 0 0'; - - self.viewzoom = 0.6; - - - self.playermodel = CheckPlayerModel(self.playermodel); - - precache_model (self.playermodel); - setmodel (self, self.playermodel); - self.skin = stof(self.playerskin); - self.mdl = strzone(self.playermodel); - - self.crouch = FALSE; - self.view_ofs = PL_VIEW_OFS; - setsize (self, PL_MIN, PL_MAX); - setorigin (self, spot.origin + '0 0 1' * (1 - self.mins_z - 24)); - // don't reset back to last position, even if new position is stuck in solid - self.oldorigin = self.origin; - -// self.items = IT_LASER | IT_UZI| IT_SHOTGUN | IT_GRENADE_LAUNCHER | IT_ELECTRO | IT_CRYLINK | IT_NEX | IT_HAGAR | IT_ROCKET_LAUNCHER; -// self.weapon = IT_UZI; - - - // fixme: move this to Become code -/* self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4; - //self.weapon = 1; - self.switchweapon = IT_WEP2; - self.ammo_shells = 50; - self.ammo_nails = 0; - self.ammo_rockets = 0; - self.ammo_cells = 0;*/ - - if (cvar("g_fullbrightplayers") == 1) - self.effects = EF_FULLBRIGHT; - - self.event_damage = PlayerDamage; - - self.statdraintime = time + 5; - self.button0 = self.button1 = self.button2 = self.button3 = 0; - - /* - W_UpdateWeapon(); - W_UpdateAmmo(); - */ - CL_SpawnWeaponentity(); - self.weaponentity.alpha = self.exteriorweaponentity.alpha = 0; - self.weaponentity.colormod = '0 0 0'; - self.weaponentity.scale = 0; - - //stuffcmd(self, "chase_active 0"); -} - -/* -============= -SetNewParms -============= -*/ -void SetNewParms (void) -{ - -} - -/* -============= -SetChangeParms -============= -*/ -void SetChangeParms (void) -{ - -} - -/* -============= -ClientKill - -Called when a client types 'kill' in the console -============= -*/ -void ClientKill (void) -{ - Damage(self, self, self, 100000, DEATH_KILL, self.origin, '0 0 0'); -} - -/* -============= -ClientConnect - -Called when a client connects to the server -============= -*/ -void ClientConnect (void) -{ - //ClientInRankings(); - bprint ("^4",self.netname); - bprint (" connected\n"); - stuffcmd(self, strcat("exec maps/", mapname, ".cfg\n")); - // send prediction settings to the client - stuffcmd(self, strcat("cl_movement_maxspeed ", ftos(cvar("sv_maxspeed")), "\n")); - stuffcmd(self, strcat("cl_movement_maxairspeed ", ftos(cvar("sv_maxairspeed")), "\n")); - stuffcmd(self, strcat("cl_movement_accelerate ", ftos(cvar("sv_accelerate")), "\n")); - stuffcmd(self, strcat("cl_movement_friction ", ftos(cvar("sv_friction")), "\n")); - stuffcmd(self, strcat("cl_movement_stopspeed ", ftos(cvar("sv_stopspeed")), "\n")); - stuffcmd(self, strcat("cl_movement_jumpvelocity ", ftos(cvar("g_balance_jumpheight")), "\n")); - stuffcmd(self, strcat("cl_movement_stepheight ", ftos(cvar("sv_stepheight")), "\n")); - stuffcmd(self, strcat("cl_movement_edgefriction 0\n")); - // TEMP FOR TESTING PURPOSES! - //teamplay = 21?TeamFortress; - DecodeLevelParms (); - //cvar_set ("teamplay", "21?TeamFortress"); - // teamplay = cvar ("teamplay"); - -/* joinorder = joinorder + 1; // old temp autoteam, but now we have a menu instead :P - if (joinorder == 1 || joinorder == 3 || joinorder == 5 || joinorder == 7) - TeamFortress_TeamSet (1); - else { - TeamFortress_TeamSet (2); - }*/ -} - -/* -============= -ClientDisconnect - -Called when a client disconnects from the server -============= -*/ -.entity chatbubbleentity; -void ClientDisconnect (void) -{ - //ClientDisconnected(); - self.has_disconnected = 1; - bprint ("^4",self.netname); - bprint (" disconnected\n"); - - if (self.chatbubbleentity) - { - remove (self.chatbubbleentity); - self.chatbubbleentity = world; - } - - if (self.teambubble_friendly) - { - remove (self.teambubble_friendly); - self.teambubble_friendly = world; - } - if (self.teambubble_needhealth) - { - remove (self.teambubble_needhealth); - self.teambubble_needhealth = world; - } -} - -.entity chatbubbleentity; -.float buttonchat; -void() ChatBubbleThink = -{ - self.nextthink = time; - if (!self.owner.modelindex || self.owner.chatbubbleentity != self) - { - remove(self); - return; - } - setorigin(self, self.owner.origin + '0 0 15' + self.owner.maxs_z * '0 0 1'); - if (self.owner.buttonchat) - self.effects = 0; - else - self.effects = EF_NODRAW; -}; - -void() UpdateChatBubble = -{ - if (!self.modelindex) - return; - // spawn a chatbubble entity if needed - if (!self.chatbubbleentity) - { - self.chatbubbleentity = spawn(); - self.chatbubbleentity.owner = self; - self.chatbubbleentity.think = ChatBubbleThink; - self.chatbubbleentity.nextthink = time; - setmodel(self.chatbubbleentity, "models/misc/chatbubble.spr"); - setorigin(self.chatbubbleentity, self.origin + '0 0 15' + self.maxs_z * '0 0 1'); - self.chatbubbleentity.effects = EF_NODRAW; - } -} - -// LordHavoc: this hack will be removed when proper _pants/_shirt layers are -// added to the model skins -void() UpdateColorModHack = -{ - local float c; - c = self.clientcolors & 15; - // LordHavoc: only bothering to support white, green, red, yellow, blue - if (teamplay == 0) self.colormod = '0 0 0'; - else if (c == 0) self.colormod = '1.00 1.00 1.00'; - else if (c == 3) self.colormod = '0.10 1.73 0.10'; - else if (c == 4) self.colormod = '1.73 0.10 0.10'; - else if (c == 12) self.colormod = '1.22 1.22 0.10'; - else if (c == 13) self.colormod = '0.10 0.10 1.73'; - else self.colormod = '1 1 1'; -}; - -/* -============= -PlayerJump - -When you press the jump key -============= -*/ -void PlayerJump (void) -{ - if (self.waterlevel >= 2) - { - if (self.watertype == CONTENT_WATER) - self.velocity_z = 200; - else if (self.watertype == CONTENT_SLIME) - self.velocity_z = 80; - else - self.velocity_z = 50; - - return; - } - if(self.jump_pad) - return; - -// self.jump_pad = 0; - CapPlayerVelocity(self, self.speed); - - - if (!(self.flags & FL_ONGROUND)) - return; - - if (!(self.flags & FL_JUMPRELEASED)) - return; - - self.velocity_z = self.velocity_z + cvar("g_balance_jumpheight"); - - self.flags = self.flags - FL_ONGROUND; - self.flags = self.flags - FL_JUMPRELEASED; -} - -.float watersound_finished; -void() WaterMove = -{ - if (self.movetype == MOVETYPE_NOCLIP) - return; - if (self.health < 0) - return; - - if (self.waterlevel != 3) - { - self.air_finished = time + 12; - self.dmg = 2; - } - else if (self.air_finished < time) - { // drown! - if (self.pain_finished < time) - { - Damage (self, world, world, 5, DEATH_DROWN, self.origin, '0 0 0'); - self.pain_finished = time + 0.5; - } - } - - if (!self.waterlevel) - { - if (self.flags & FL_INWATER) - { - // play leave water sound - self.flags = self.flags - FL_INWATER; - } - return; - } - - if (self.watersound_finished < time) - { - self.watersound_finished = time + 0.5; - if (self.watertype == CONTENT_LAVA) - sound (self, CHAN_BODY, "player/lava.wav", 1, ATTN_NORM); - if (self.watertype == CONTENT_SLIME) - sound (self, CHAN_BODY, "player/slime.wav", 1, ATTN_NORM); - //if (self.watertype == CONTENT_WATER) - // sound (self, CHAN_BODY, "player/water.wav", 1, ATTN_NORM); - } - - if (self.watertype == CONTENT_LAVA) - { // do damage - - // lava sets me to the maximum heat level, so I'll catch fire easily - self.flame_heat = cvar("g_balance_maxheat"); - - if (self.dmgtime < time) - { - self.dmgtime = time + 0.1; - Damage (self, world, world, 3 * self.waterlevel, DEATH_LAVA, self.origin, '0 0 0'); - } - } - else if (self.watertype == CONTENT_SLIME) - { // do damage - - // cool me off - self.flame_heat = 0; - - if (self.dmgtime < time) - { - self.dmgtime = time + 0.1; - Damage (self, world, world, 1 * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0'); - } - } - else if (self.watertype == CONTENT_WATER) - { - // cool me off - self.flame_heat = 0; - } - - if ( !(self.flags & FL_INWATER) ) - { - - //if (self.watertype == CONTENT_LAVA) - // sound (self, CHAN_BODY, "player/inlava.wav", 1, ATTN_NORM); - //if (self.watertype == CONTENT_WATER) - // sound (self, CHAN_BODY, "player/inh2o.wav", 1, ATTN_NORM); - //if (self.watertype == CONTENT_SLIME) - // sound (self, CHAN_BODY, "player/slimbrn2.wav", 1, ATTN_NORM); - - self.flags = self.flags + FL_INWATER; - self.dmgtime = 0; - } -}; - -void() CheckWaterJump = -{ - local vector start, end; - -// check for a jump-out-of-water - makevectors (self.angles); - start = self.origin; - start_z = start_z + 8; - v_forward_z = 0; - normalize(v_forward); - end = start + v_forward*24; - traceline (start, end, TRUE, self); - if (trace_fraction < 1) - { // solid at waist - start_z = start_z + self.maxs_z - 8; - end = start + v_forward*24; - self.movedir = trace_plane_normal * -50; - traceline (start, end, TRUE, self); - if (trace_fraction == 1) - { // open at eye level - self.flags = self.flags | FL_WATERJUMP; - self.velocity_z = 225; - self.flags = self.flags - (self.flags & FL_JUMPRELEASED); - self.teleport_time = time + 2; // safety net - return; - } - } -}; - - -void respawn(void) -{ - CopyBody(1); - PutClientInServer(); -} - -void player_powerups (void) -{ - self.effects = self.effects - (self.effects & (EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT)); - if (self.items & IT_STRENGTH) - { - self.effects = self.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT); - if (time > self.strength_finished) - { - self.items = self.items - (self.items & IT_STRENGTH); - sprint(self, "^3Strength has worn off\n"); - } - } - else - { - if (time < self.strength_finished) - { - self.items = self.items | IT_STRENGTH; - sprint(self, "^3Strength infuses your weapons with devestating power\n"); - } - } - if (self.items & IT_INVINCIBLE) - { - self.effects = self.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT); - if (time > self.invincible_finished) - { - self.items = self.items - (self.items & IT_INVINCIBLE); - sprint(self, "^3Shield has worn off\n"); - } - } - else - { - if (time < self.invincible_finished) - { - self.items = self.items | IT_INVINCIBLE; - sprint(self, "^3Shield surrounds you\n"); - } - } -} - -void player_regen_health (float maxh, float regen_rate_mod) -{ - if (self.health < maxh && time > self.health_regen_delay && self.health > 2) // dont regen is HP is 2 - self.health = bound(0, self.health + regen_rate_mod*(maxh- self.health) * cvar("g_balance_health_regen") * frametime, 1000); -} -void player_rot_health (float maxh, float rot_rate_mod) -{ - if (self.health > maxh && time > self.health_rot_delay) - self.health = bound(0, self.health + rot_rate_mod*(maxh - self.health) * cvar("g_balance_health_rot") * frametime, 1000); -} -void player_regen_armor (float maxa, float regen_rate_mod) -{ - if (self.armorvalue < maxa && time > self.armor_regen_delay) - self.armorvalue = bound(0, self.armorvalue + regen_rate_mod*(maxa - self.armorvalue) * cvar("g_balance_armor_regen") * frametime, 1000); -} -void player_rot_armor (float maxa, float regen_rot_mod) -{ - if (self.armorvalue > maxa && time > self.armor_rot_delay) - self.armorvalue = bound(0, self.armorvalue + regen_rot_mod*(maxa - self.armorvalue) * cvar("g_balance_armor_rot") * frametime, 1000); -} - -void player_clearpoison(entity targ) -{ - targ.poison_damage = targ.poison_rate = 0; -} - -void DelayHealthRegen(entity e) { e.health_regen_delay = time + cvar("g_balance_regen_wait");} -void DelayHealthRot(entity e) { e.health_rot_delay = time + cvar("g_balance_rot_wait");} -void DelayArmorRegen(entity e) { e.armor_regen_delay = time + cvar("g_balance_regen_wait");} -void DelayArmorRot(entity e) { e.armor_rot_delay = time + cvar("g_balance_rot_wait");} - - -void player_takepoison() -{ - float oldhealth, take; - if(self.health <= 5) - { - player_clearpoison(self); - return; - } - oldhealth = self.health; - - take = bound(0, self.poison_rate * frametime, self.health - 5); - if(take <= 0) - { - player_clearpoison(self); - return; - } - - DelayHealthRegen(self); - self.health = self.health - take; - self.poison_damage = self.poison_damage - take; - - if(self.health <= 5 || self.poison_damage <= 0) - { - player_clearpoison(self); - return; - } -} - -// cool off so you're not so vulnerable to fire -void player_cooloff () -{ - if(self.flame_heat_time > time)//heat up - self.flame_heat = bound(0, self.flame_heat + self.flame_heat * cvar("g_balance_heatup_rate") * frametime, cvar("g_balance_maxheat")); - else//cool off - self.flame_heat = bound(0, self.flame_heat - self.flame_heat * cvar("g_balance_cooloff_rate") * frametime, cvar("g_balance_maxheat")); -} - -void player_regen (void) -{ - local float maxh; - local float maxa; - maxh = self.max_health;//cvar("g_balance_health_stable"); - maxa = self.max_armor;//cvar("g_balance_armor_stable"); - - if(self.poison_damage) - { - player_takepoison(); - return; - } - - if(self.class == CLASS_SPY) - {// don't let spy regenerate if cloaked, but do allow rot if above max - if(self.special_active) - { - //if(self.health > maxh) - player_rot_health(maxh, 1.0); - //if(self.armorvalue > maxa) - player_rot_armor(maxa, 1.0); - } - else - { - player_regen_health(maxh, 0.1); // spies regenerate slowly, and mostly rely on health packs - player_regen_armor(maxa, 1.0); - player_rot_health(maxh, 1.0); - player_rot_armor(maxa, 1.0); - } - } - else - { - player_regen_health(maxh, 1.0); - player_regen_armor(maxa, 1.0); - player_rot_health(maxh, 1.0); - player_rot_armor(maxa, 1.0); - } - - player_cooloff(); -} - -/* -============= -PlayerPreThink - -Called every frame for each client before the physics are run -============= -*/ -.float attack_finished; -void PlayerPreThink (void) -{ - local vector m1, m2; - - CheckRules_Player(); - - if (intermission_running) - { - IntermissionThink (); // otherwise a button could be missed between - return; // the think tics - } - - if (self.deadflag != DEAD_NO) - { - player_anim(); - weapon_freeze(); - if (self.deadflag == DEAD_DYING) - { - if (time > self.dead_time) - self.deadflag = DEAD_DEAD; - } - else if (self.deadflag == DEAD_DEAD) - { - if (!self.button0 && !self.button2 && !self.button3) - self.deadflag = DEAD_RESPAWNABLE; - } - else if (self.deadflag == DEAD_RESPAWNABLE) - { - if (self.button0 || self.button2 || self.button3 || self.button4) - respawn(); - } - return; - } - - if (self.button5) - { - if (!self.crouch) - { - self.crouch = TRUE; - self.view_ofs = PL_CROUCH_VIEW_OFS; - setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); - } - } - else - { - if (self.crouch) - { - tracebox(self.origin, PL_MIN, PL_MAX, self.origin, FALSE, self); - if (!trace_startsolid) - { - self.crouch = FALSE; - self.view_ofs = PL_VIEW_OFS; - setsize (self, PL_MIN, PL_MAX); - } - } - } - - if (self.playermodel != self.mdl) - { - //bprint("playermodel changed\n"); - self.playermodel = CheckPlayerModel(self.playermodel); - if(CheckForClassChange()) // check if we'll allow it - return; // if there's a return value, drop what you're doing and let the player respawn - - if(self.playermodel != self.mdl) // if change has been allowed - { - m1 = self.mins; - m2 = self.maxs; - precache_model (self.playermodel); - if(self.model != "") - { - setmodel (self, self.playermodel); - setsize (self, m1, m2); - } - self.mdl = strzone(self.playermodel); - } - } - - ClassPreThink(); - - if (self.skin != stof(self.playerskin)) - self.skin = stof(self.playerskin); - - if(self.class == CLASS_SCOUT) - GrapplingHookFrame(); - - W_WeaponFrame(); - - if (self.button4 || (self.weapon == WEP_NEX && self.button3)) - { - if (self.viewzoom > 0.4) - self.viewzoom = max (0.4, self.viewzoom - frametime * 2); - } - else if (self.viewzoom < 1.0) - self.viewzoom = min (1.0, self.viewzoom + frametime); - - - if (self.button2) - PlayerJump (); - else - self.flags = self.flags | FL_JUMPRELEASED; - - - player_powerups(); - player_regen(); - player_anim(); - - //self.angles_y=self.v_angle_y + 90; // temp - - WaterMove (); - if (self.waterlevel == 2) - CheckWaterJump (); - - //if (TetrisPreFrame()) return; - - PlayerLasergatePreThink(); -} - -// Update weapon colors -void UpdatePlayerColors () { - if(self.weaponentity) { - self.weaponentity.colormap = self.colormap; - self.exteriorweaponentity.colormap = self.colormap; - } -} - -/* -============= -PlayerPostThink - -Called every frame for each client after the physics are run -============= -*/ -void PlayerPostThink (void) -{ - float soundrandom; - CheckRules_Player(); - UpdateChatBubble(); - UpdateColorModHack(); - UpdateTeamBubble(); - UpdatePlayerColors(); - if (self.deadflag == DEAD_NO) - if (self.impulse) - ImpulseCommands (); - if (intermission_running) - return; // intermission or finale - - // VorteX: landing on floor, landing damage etc. - // LordHavoc: removed 'big fall' death code that VorteX added - if (self.flags & FL_ONGROUND || (self.waterlevel >= 2 && self.velocity_z <= 0)) - self.jump_pad = 0; - - if (self.flags & FL_ONGROUND) - { - CapPlayerVelocity(self, self.speed); - - if (self.jump_flag < -100 && !self.watertype == CONTENT_WATER) // HitGround - { - soundrandom = random() * 4; - - self.air_time = time; //temp BH var - - if (soundrandom < 1) - sound (self, CHAN_BODY, "misc/hitground1.wav", 1, ATTN_NORM); - else if (soundrandom < 2) - sound (self, CHAN_BODY, "misc/hitground2.wav", 1, ATTN_NORM); - else if (soundrandom < 3) - sound (self, CHAN_BODY, "misc/hitground3.wav", 1, ATTN_NORM); - else if (soundrandom < 4) - sound (self, CHAN_BODY, "misc/hitground4.wav", 1, ATTN_NORM); - if (self.jump_flag < -650) // landing damage - { - local float dm; - dm = bound(0, 0.1*(fabs(self.jump_flag) - 600), 5); - Damage (self, world, world, dm, DEATH_FALL, self.origin, '0 0 0'); - } - self.jump_flag = 0; - } - } - else - self.jump_flag = self.velocity_z; - - ClassPostThink(); - - //if (TetrisPostFrame()) return; - PlayerLasergatePostThink(); -} - diff --git a/attic/TeamNexuiz/game/gamec/cl_impulse.c b/attic/TeamNexuiz/game/gamec/cl_impulse.c deleted file mode 100644 index 758fb3c92..000000000 --- a/attic/TeamNexuiz/game/gamec/cl_impulse.c +++ /dev/null @@ -1,247 +0,0 @@ -void CopyBody(float keepvelocity); -void () DropFlag; - -// changes by LordHavoc on 03/30/04 -// cleaned up dummy code -// dummies are now removed eventually after being gibbed (norespawn = TRUE) -// dummy impulse now checks sv_cheats to prevent players from overwhelming server with dummies -// dummies now use player code where possible - -void player_anim (void); -void DummyThink(void) -{ - self.think = DummyThink; - self.nextthink = time; - SV_PlayerPhysics(); - PlayerPreThink(); - //player_anim(); - PlayerPostThink(); -} - -void CopyBody2(float keepvelocity, float testbody); -void ImpulseCommands (void) -{ - local float swpn; // returns self.weapon amount -- the slot that weapon is in (WEP1, WEP2 etc) - local float awpn; // returns self.wpn amount (WEP_PISTOL, WEP_NEX etc.) - - if (self.impulse_wait > time) // So the GUI menus doesnt flicker - return; - - if (self.playerclass < 1) // Bring up menu if no team/class - { - if (self.team_no < 1) - { - stuffcmd(self, "set scmenu_directmenu TeamSelect; togglemenu\n"); - } - else - { - stuffcmd(self, "set scmenu_directmenu ClassSelect; togglemenu\n"); - } - self.impulse = 0; - self.impulse_wait = time + .5; - return; - } - if (self.impulse == DROP_FLAG_IMPULSE) - { - DropFlag(); - } - - if (self.impulse == 71) - { - local string whee; - whee = ftos (self.maxammo_rockets); - sprint(self, whee); - sprint(self, "\n"); - } - - if (self.impulse == 73) - { - stuffcmd(self, "cmd changeclass\n"); - self.impulse = 0; - return; - } - if (self.impulse == 70) { // reload impulse - swpn = self.weapon; - awpn = self.wpn; - - if (awpn == WEP_PISTOL) - DoReload (1, (CLIP_MAX_PISTOL - self.clip_pistol)); - - if(self.class == CLASS_SOLDIER) - { - if (swpn == WEP4) - DoReload (3, (CLIP_MAX_ROCKETS - self.clip_rockets)); // weapon type 3 is RL, and reload X rockets. - } - else if(self.class == CLASS_PYRO) - { - if (swpn == WEP1) - DoReload (4, (CLIP_MAX_PIPEGRENADES - self.clip_pipegrenades)); - } - else if(self.class == CLASS_SCOUT || self.class == CLASS_ENGINEER) - { - if (swpn == WEP4) - DoReload (2, (CLIP_MAX_CRYLINK - self.clip_crylink)); - } - } - if (self.impulse == 68) { - local entity barrel; - barrel = spawn(); - barrel.mdl = "models/sentry/turr1_barrel.md3"; - barrel.yaw_speed = 10; - setmodel(barrel, barrel.mdl); - setorigin(barrel, self.origin + '8 0 8'); - barrel.angles_y = barrel.angles_y; - - local entity barrel2; - barrel2 = spawn(); - barrel2.mdl = "models/sentry/turr1_barrel.md3"; - barrel2.yaw_speed = 10; - barrel2.angles_y = barrel2.angles_z + 90; - setmodel(barrel2, barrel.mdl); - setorigin(barrel2, '0 0 0'); - - setattachment(barrel2, barrel, "tag_barrel_bullet1"); - - local float barrel_tag; - local vector fire_from; - barrel_tag = gettagindex (barrel2, "tag_barrel_bullet1"); - fire_from = gettaginfo (barrel2, barrel_tag); - bprint(vtos(fire_from)); - bprint("\n"); - - local entity e; - e = spawn(); - e.scale = 4; - setmodel(e, "models/plasmatrail.mdl"); - setorigin (e, fire_from); - bprint(vtos(e.origin)); - bprint("\n"); - - } - if (self.impulse == 67) { - TeamFortress_Build (6); - //self.current_menu = 18; - } - if (self.impulse == 69) { -/* local entity isneardoor; - local string st; - isneardoor = findradius (self.origin, 200); - while (isneardoor) - { - if ((isneardoor.classname == "door")) - { -// st = stos(isneardoor.model); - sprint (self, isneardoor.model); - sprint (self, "\n"); - dremove(newmis); - return; - } - isneardoor = isneardoor.chain; - }*/ - TeamFortress_Build (2); - } - if (self.impulse == 8) { - TeamFortress_ThrowGrenade(); } - if ((self.impulse == 150)) // GREN TYPE 1 - { - TeamFortress_PrimeGrenade(); - } - if ((self.impulse == 151)) // GREN TYPE 2 - { - TeamFortress_PrimeGrenade(); - } - if ((self.impulse == 152)) - { - TeamFortress_ThrowGrenade(); - } - - if (self.impulse == FEIGN_IMPULSE) - { - TeamNexuiz_Feign(); - } - if (self.impulse == 153) - TeamNexuiz_HUD_ShowSign(self, NO_AMMO_WARNING); - if (self.impulse >= 1 && self.impulse <= 5) - { - if(self.buttonuse) - { - if(self.impulse == 5 && self.wpn5.weapon) - { - weapon_action(self.weapon, WR_DROP); - SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.wpn5.weapon); - self.weapon = 0; - ResetExtraWeapon(); - self.switchweapon = w_getbestweapon(self); - if(self.switchweapon == WEP5) - self.switchweapon = WEP1; - } - } - else if (self.reload_time < time) { - W_SwitchWeapon (self.impulse); } - } - else if (self.impulse == 10) { - if (self.reload_time < time) { - W_NextWeapon (); } - } - else if (self.impulse == 12) { - if (self.reload_time < time) { - W_PreviousWeapon (); } - } - - if (self.impulse == 13 && cvar("sv_cheats")) - { - makevectors (self.v_angle); - self.velocity = self.velocity + v_forward * 300; - CopyBody2(1, TRUE); - self.velocity = self.velocity - v_forward * 300; - } - else if (self.impulse == 14 && cvar("sv_cheats")) - CopyBody2(0, TRUE); - else if (self.impulse == 99 && cvar("sv_cheats")) - { - self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4 | IT_WEP5; - self.ammo_shells = 999; - self.ammo_nails = 999; - self.ammo_rockets = 999; - self.ammo_cells = 999; - } - - if(self.impulse == 20) - { - ClassSpecial(); - } - - if(self.impulse == 30) - { - ClassGrenade(WR_GRENADE1); - } - if(self.impulse == 31) - { - ClassGrenade(WR_GRENADE2); - } - if (self.impulse == TELL_POSITION_IMPULSE) - { - sprint(self,vtos(self.origin)); - sprint(self, "\n"); - } - - // model/class test - if(self.impulse == 57) - { - //self.class = GetPlayerClass(); - sprint(self, "Current class: "); - sprint(self, NameOfClass(self.class)); - sprint(self, ", model: "); - sprint(self, self.playermodel); - sprint(self, "\n"); - } - if(self.impulse == 211) // XavioR test impulse - { - local string woottest; - woottest = ftos(self.team_no); - sprint (self, woottest); - sprint (self, "\n"); - } - //TetrisImpulses(); - self.impulse = 0; -} \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/cl_physics.c b/attic/TeamNexuiz/game/gamec/cl_physics.c deleted file mode 100644 index 3e31c732a..000000000 --- a/attic/TeamNexuiz/game/gamec/cl_physics.c +++ /dev/null @@ -1,318 +0,0 @@ -float sv_accelerate; -float sv_maxairspeed; -float sv_friction; -float sv_maxspeed; -float sv_stopspeed; -float sv_gravity; -.float ladder_time; -.entity ladder_entity; -.float gravity; -.float slip_time; -.float slip_amount; - -vector HorizVelocity(vector vel) -{ - vel_z = 0; - return vel; -} - -void CapPlayerVelocity(entity pl, float classmaxspeed) -{ - if(self.jump_pad || self.hook.state) - return; - vector wishvel; - // prevent bunnyhopping - wishvel = pl.velocity; - wishvel_z = 0; - if(vlen(wishvel) > classmaxspeed) - { - wishvel = normalize(wishvel) * classmaxspeed; - pl.velocity_x = wishvel_x; - pl.velocity_y = wishvel_y; - } -} - -void MauveBot_AI(); - -void SV_PlayerPhysics() -{ - if (self.is_building == 1 || self.is_feigning == 1) - { - self.velocity = '0 0 0'; - return; - } - - local vector wishvel, wishdir, v; - local float wishspeed, prevspeed, f; - - local float classmaxspeed, classmaxairspeed, classstopspeed; - - MauveBot_AI(); - - if (self.movetype == MOVETYPE_NONE) - return; - - if (self.punchangle != '0 0 0') - { - f = vlen(self.punchangle) - 10 * frametime; - if (f > 0) - self.punchangle = normalize(self.punchangle) * f; - else - self.punchangle = '0 0 0'; - } - - if (self.punchvector != '0 0 0') - { - f = vlen(self.punchvector) - 30 * frametime; - if (f > 0) - self.punchvector = normalize(self.punchvector) * f; - else - self.punchvector = '0 0 0'; - } - - // if dead, behave differently - if (self.deadflag) - return; - - // determine the max speed this class can move at - SetPlayerSpeed(self); - classmaxspeed = self.speed; - - if (self.leg_damage) // Railgun does leg damage :D - { - if ((self.leg_damage > 6)) - { - self.leg_damage = 6; - } - classmaxspeed = (classmaxspeed * ((10 - self.leg_damage) / 10)); - } - - if(classmaxspeed < 0) - classmaxspeed = sv_maxspeed; - - // help the slower players climb slopes a little more easily - classstopspeed = sv_stopspeed * (self.speed / sv_maxspeed); - - if (!self.fixangle) - { - self.angles_x = 0; - self.angles_y = self.v_angle_y; - self.angles_z = 0; - } - - if (self.flags & FL_WATERJUMP ) - { - self.velocity_x = self.movedir_x; - self.velocity_y = self.movedir_y; - if (time > self.teleport_time || self.waterlevel == 0) - { - self.flags = self.flags - (self.flags & FL_WATERJUMP); - self.teleport_time = 0; - } - } - else if (self.movetype == MOVETYPE_NOCLIP || (self.movetype == MOVETYPE_FLY && !self.hook.state)) - { - // noclipping or flying - self.velocity = self.velocity * (1 - frametime * sv_friction); - makevectors(self.v_angle); - //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z; - wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z; - // acceleration - wishdir = normalize(wishvel); - wishspeed = vlen(wishvel); - if (wishspeed > classmaxspeed)//sv_maxspeed) - wishspeed = classmaxspeed;//sv_maxspeed; - if (time >= self.teleport_time) - { - f = wishspeed - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed); - } - } - else if (self.waterlevel >= 2) - { - // swimming - makevectors(self.v_angle); - //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z; - wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z; - if (wishvel == '0 0 0') - wishvel = '0 0 -60'; // drift towards bottom - - wishdir = normalize(wishvel); - wishspeed = vlen(wishvel); - if (wishspeed > classmaxspeed)//sv_maxspeed) - wishspeed = classmaxspeed;//sv_maxspeed; - wishspeed = wishspeed * 0.7; - - //if(self.jump_pad || self.hook.state) - //{ - // //wishspeed = wishspeed * cvar("sv_jumppad_control"); // give player limited control on a jump pad - // wishspeed = cvar("sv_jumppad_control"); // give player limited control on a jump pad - //} - - // water friction - self.velocity = self.velocity * (1 - frametime * sv_friction); - - // water acceleration - f = wishspeed - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed); - CapPlayerVelocity(self, classmaxspeed); - } - else if (time < self.ladder_time) - { - if (self.ladder_entity.classname == "scout_rope") - { - // friction - self.velocity = self.velocity * (1 - frametime * sv_friction); - - makevectors(self.v_angle); - - // forward makes you move up, backward makes you move down. - wishvel = '0 0 1' * self.movement_x + v_right * self.movement_y; - // also push forward when reaching the top - if(//self.movement_x > 0 && - (self.origin_z + self.mins_z*0.9 > self.ladder_entity.origin_z + self.ladder_entity.maxs_z)) - wishvel = wishvel + v_forward * self.movement_x; - - // negate gravity - if (self.gravity) - self.velocity_z = self.velocity_z + self.gravity * sv_gravity * frametime; - else - self.velocity_z = self.velocity_z + sv_gravity * frametime; - - // acceleration - wishdir = normalize(wishvel); - wishspeed = vlen(wishvel); - - - if (wishspeed > classmaxspeed)//sv_maxspeed) - wishspeed = classmaxspeed;//sv_maxspeed; - if (time >= self.teleport_time) - { - f = wishspeed - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed); - } - CapPlayerVelocity(self, classmaxspeed); - } - else - { - // on a func_ladder or swimming in func_water - self.velocity = self.velocity * (1 - frametime * sv_friction); - makevectors(self.v_angle); - //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z; - wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z; - if (self.gravity) - self.velocity_z = self.velocity_z + self.gravity * sv_gravity * frametime; - else - self.velocity_z = self.velocity_z + sv_gravity * frametime; - if (self.ladder_entity.classname == "func_water") - { - f = vlen(wishvel); - if (f > self.ladder_entity.speed) - wishvel = wishvel * (self.ladder_entity.speed / f); - - self.watertype = self.ladder_entity.skin; - f = self.ladder_entity.origin_z + self.ladder_entity.maxs_z; - if ((self.origin_z + self.view_ofs_z) < f) - self.waterlevel = 3; - else if ((self.origin_z + (self.mins_z + self.maxs_z) * 0.5) < f) - self.waterlevel = 2; - else if ((self.origin_z + self.mins_z + 1) < f) - self.waterlevel = 1; - else - { - self.waterlevel = 0; - self.watertype = CONTENT_EMPTY; - } - } - // acceleration - wishdir = normalize(wishvel); - wishspeed = vlen(wishvel); - - - if (wishspeed > classmaxspeed)//sv_maxspeed) - wishspeed = classmaxspeed;//sv_maxspeed; - if (time >= self.teleport_time) - { - f = wishspeed - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed); - } - CapPlayerVelocity(self, classmaxspeed); - } - } - else if (self.flags & FL_ONGROUND) - { - // walking - makevectors(self.v_angle_y * '0 1 0'); - wishvel = v_forward * self.movement_x + v_right * self.movement_y; - // friction - if (self.velocity_x || self.velocity_y) - { - v = self.velocity; - v_z = 0; - f = vlen(v); - if (self.slip_time > time) - sv_friction = sv_friction / self.slip_amount; - if (f < classstopspeed)//sv_stopspeed) - f = 1 - frametime * (classstopspeed / f) * sv_friction;//sv_stopspeed / f) * sv_friction; - else - f = 1 - frametime * sv_friction; - if (f > 0) - self.velocity = self.velocity * f; - else - self.velocity = '0 0 0'; - } - // acceleration - wishdir = normalize(wishvel); - wishspeed = vlen(wishvel); - if(self.jump_pad || self.hook.state) - { - //wishspeed = wishspeed * cvar("sv_jumppad_control"); // give player limited control on a jump pad - wishspeed = cvar("sv_jumppad_control"); // give player limited control on a jump pad - } - - if (wishspeed > classmaxspeed)//sv_maxspeed) - wishspeed = classmaxspeed;//sv_maxspeed; - if (time >= self.teleport_time) - { - f = wishspeed - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed); - } - - CapPlayerVelocity(self, classmaxspeed); - } - else - { - classmaxairspeed = classmaxspeed;//*0.8; - if(self.jump_pad || self.hook.state) // allow limited air control and upper velocity when coming off a jump pad - prevspeed = vlen(HorizVelocity(self.velocity)); - else - prevspeed = classmaxairspeed; - // airborn - makevectors(self.v_angle_y * '0 1 0'); - wishvel = v_forward * self.movement_x + v_right * self.movement_y; - // acceleration - wishdir = normalize(wishvel); - wishspeed = vlen(wishvel); - - if(self.jump_pad || self.hook.state) - { - //wishspeed = wishspeed * cvar("sv_jumppad_control"); // give player limited control on a jump pad - wishspeed = cvar("sv_jumppad_control"); // give player limited control on a jump pad - } - - if (wishspeed > classmaxairspeed)//sv_maxairspeed) - wishspeed = classmaxairspeed;//sv_maxairspeed; - if (time >= self.teleport_time) - { - f = wishspeed;// - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed); - } - CapPlayerVelocity(self, max(prevspeed, classmaxairspeed)); - } -}; diff --git a/attic/TeamNexuiz/game/gamec/cl_physics.c_bh b/attic/TeamNexuiz/game/gamec/cl_physics.c_bh deleted file mode 100644 index cd27f1ab7..000000000 --- a/attic/TeamNexuiz/game/gamec/cl_physics.c_bh +++ /dev/null @@ -1,305 +0,0 @@ -float sv_accelerate; -float sv_maxairspeed; -float sv_friction; -float sv_maxspeed; -float sv_stopspeed; -float sv_gravity; -.float ladder_time; -.entity ladder_entity; -.float gravity; - -vector HorizVelocity(vector vel) -{ - vel_z = 0; - return vel; -} - -void CapPlayerVelocity(entity pl, float classmaxspeed) -{ - if(self.jump_pad || self.hook.state) - return; - vector wishvel; - // prevent bunnyhopping - wishvel = pl.velocity; - wishvel_z = 0; - if(vlen(wishvel) > classmaxspeed) - { - wishvel = normalize(wishvel) * classmaxspeed; - pl.velocity_x = wishvel_x; - pl.velocity_y = wishvel_y; - } -} - -void MauveBot_AI(); - -void SV_PlayerPhysics() -{ - local vector wishvel, wishdir, v; - local float wishspeed, prevspeed, f; - - local float classmaxspeed, classmaxairspeed, classstopspeed; - - MauveBot_AI(); - - if (self.movetype == MOVETYPE_NONE) - return; - - if (self.punchangle != '0 0 0') - { - f = vlen(self.punchangle) - 10 * frametime; - if (f > 0) - self.punchangle = normalize(self.punchangle) * f; - else - self.punchangle = '0 0 0'; - } - - if (self.punchvector != '0 0 0') - { - f = vlen(self.punchvector) - 30 * frametime; - if (f > 0) - self.punchvector = normalize(self.punchvector) * f; - else - self.punchvector = '0 0 0'; - } - - // if dead, behave differently - if (self.deadflag) - return; - - // determine the max speed this class can move at - SetPlayerSpeed(self); - classmaxspeed = self.speed; - if(classmaxspeed < 0) - classmaxspeed = sv_maxspeed; - - // help the slower players climb slopes a little more easily - classstopspeed = sv_stopspeed * (self.speed / sv_maxspeed); - - if (!self.fixangle) - { - self.angles_x = 0; - self.angles_y = self.v_angle_y; - self.angles_z = 0; - } - - if (self.flags & FL_WATERJUMP ) - { - self.velocity_x = self.movedir_x; - self.velocity_y = self.movedir_y; - if (time > self.teleport_time || self.waterlevel == 0) - { - self.flags = self.flags - (self.flags & FL_WATERJUMP); - self.teleport_time = 0; - } - } - else if (self.movetype == MOVETYPE_NOCLIP || (self.movetype == MOVETYPE_FLY && !self.hook.state)) - { - // noclipping or flying - self.velocity = self.velocity * (1 - frametime * sv_friction); - makevectors(self.v_angle); - //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z; - wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z; - // acceleration - wishdir = normalize(wishvel); - wishspeed = vlen(wishvel); - if (wishspeed > classmaxspeed)//sv_maxspeed) - wishspeed = classmaxspeed;//sv_maxspeed; - if (time >= self.teleport_time) - { - f = wishspeed - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed); - } - } - else if (self.waterlevel >= 2) - { - // swimming - makevectors(self.v_angle); - //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z; - wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z; - if (wishvel == '0 0 0') - wishvel = '0 0 -60'; // drift towards bottom - - wishdir = normalize(wishvel); - wishspeed = vlen(wishvel); - if (wishspeed > classmaxspeed)//sv_maxspeed) - wishspeed = classmaxspeed;//sv_maxspeed; - wishspeed = wishspeed * 0.7; - - //if(self.jump_pad || self.hook.state) - //{ - // //wishspeed = wishspeed * cvar("sv_jumppad_control"); // give player limited control on a jump pad - // wishspeed = cvar("sv_jumppad_control"); // give player limited control on a jump pad - //} - - // water friction - self.velocity = self.velocity * (1 - frametime * sv_friction); - - // water acceleration - f = wishspeed - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed); - CapPlayerVelocity(self, classmaxspeed); - } - else if (time < self.ladder_time) - { - if (self.ladder_entity.classname == "scout_rope") - { - // friction - self.velocity = self.velocity * (1 - frametime * sv_friction); - - makevectors(self.v_angle); - - // forward makes you move up, backward makes you move down. - wishvel = '0 0 1' * self.movement_x + v_right * self.movement_y; - // also push forward when reaching the top - if(//self.movement_x > 0 && - (self.origin_z + self.mins_z*0.9 > self.ladder_entity.origin_z + self.ladder_entity.maxs_z)) - wishvel = wishvel + v_forward * self.movement_x; - - // negate gravity - if (self.gravity) - self.velocity_z = self.velocity_z + self.gravity * sv_gravity * frametime; - else - self.velocity_z = self.velocity_z + sv_gravity * frametime; - - // acceleration - wishdir = normalize(wishvel); - wishspeed = vlen(wishvel); - - - if (wishspeed > classmaxspeed)//sv_maxspeed) - wishspeed = classmaxspeed;//sv_maxspeed; - if (time >= self.teleport_time) - { - f = wishspeed - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed); - } - CapPlayerVelocity(self, classmaxspeed); - } - else - { - // on a func_ladder or swimming in func_water - self.velocity = self.velocity * (1 - frametime * sv_friction); - makevectors(self.v_angle); - //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z; - wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z; - if (self.gravity) - self.velocity_z = self.velocity_z + self.gravity * sv_gravity * frametime; - else - self.velocity_z = self.velocity_z + sv_gravity * frametime; - if (self.ladder_entity.classname == "func_water") - { - f = vlen(wishvel); - if (f > self.ladder_entity.speed) - wishvel = wishvel * (self.ladder_entity.speed / f); - - self.watertype = self.ladder_entity.skin; - f = self.ladder_entity.origin_z + self.ladder_entity.maxs_z; - if ((self.origin_z + self.view_ofs_z) < f) - self.waterlevel = 3; - else if ((self.origin_z + (self.mins_z + self.maxs_z) * 0.5) < f) - self.waterlevel = 2; - else if ((self.origin_z + self.mins_z + 1) < f) - self.waterlevel = 1; - else - { - self.waterlevel = 0; - self.watertype = CONTENT_EMPTY; - } - } - // acceleration - wishdir = normalize(wishvel); - wishspeed = vlen(wishvel); - - - if (wishspeed > classmaxspeed)//sv_maxspeed) - wishspeed = classmaxspeed;//sv_maxspeed; - if (time >= self.teleport_time) - { - f = wishspeed - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed); - } -// CapPlayerVelocity(self, classmaxspeed); - } - } - else if (self.flags & FL_ONGROUND) - { - // walking - makevectors(self.v_angle_y * '0 1 0'); - wishvel = v_forward * self.movement_x + v_right * self.movement_y; - // friction - if (self.velocity_x || self.velocity_y) - { - v = self.velocity; - v_z = 0; - f = vlen(v); - if (f < classstopspeed)//sv_stopspeed) - f = 1 - frametime * (classstopspeed / f) * sv_friction;//sv_stopspeed / f) * sv_friction; - else - f = 1 - frametime * sv_friction; -// if (f > 0) // Bunny hopping? lets chat - if (f > 0 && self.air_time < (time - .05)) - self.velocity = self.velocity * f; - else - if (self.air_time < (time - .05)) - { - self.velocity = '0 0 0'; - } - } - // acceleration - wishdir = normalize(wishvel); - wishspeed = vlen(wishvel); - if(self.jump_pad || self.hook.state) - { - //wishspeed = wishspeed * cvar("sv_jumppad_control"); // give player limited control on a jump pad - wishspeed = cvar("sv_jumppad_control"); // give player limited control on a jump pad - } - - if (wishspeed > classmaxspeed)//sv_maxspeed) - wishspeed = classmaxspeed;//sv_maxspeed; - if (time >= self.teleport_time) - { - f = wishspeed - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed); - } - -// CapPlayerVelocity(self, classmaxspeed); - } - else - { - classmaxairspeed = classmaxspeed;//*0.8; - if(self.jump_pad || self.hook.state) // allow limited air control and upper velocity when coming off a jump pad - prevspeed = vlen(HorizVelocity(self.velocity)); - else - prevspeed = classmaxairspeed; - // airborn - makevectors(self.v_angle_y * '0 1 0'); - - wishvel = v_forward * self.movement_x + v_right * (self.movement_y/50); - - // acceleration - wishdir = normalize(wishvel); - wishspeed = vlen(wishvel); - - if(self.jump_pad || self.hook.state) - { - //wishspeed = wishspeed * cvar("sv_jumppad_control"); // give player limited control on a jump pad - wishspeed = cvar("sv_jumppad_control"); // give player limited control on a jump pad - } - -// if (wishspeed > classmaxairspeed)//sv_maxairspeed) -// wishspeed = classmaxairspeed;//sv_maxairspeed; - if (time >= self.teleport_time) - { - f = wishspeed;// - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * 26/*min(f, sv_accelerate * frametime * wishspeed)*/; - - } -// CapPlayerVelocity(self, max(prevspeed, classmaxairspeed)); //temp - } -}; diff --git a/attic/TeamNexuiz/game/gamec/cl_player.c b/attic/TeamNexuiz/game/gamec/cl_player.c deleted file mode 100644 index c423e400f..000000000 --- a/attic/TeamNexuiz/game/gamec/cl_player.c +++ /dev/null @@ -1,416 +0,0 @@ -$frame die1 die2 draw duck duckwalk duckjump duckidle idle -$frame jump pain1 pain2 shoot taunt run runbackwards -$frame strafeleft straferight dead1 dead2 forwardright -$frame forwardleft backright backleft - -// changes by LordHavoc on 03/29/04 and 03/30/04 at Vermeulen's request -// merged player_run and player_stand to player_anim -// added death animations to player_anim -// can now spawn thrown weapons from anywhere, not just from players -// thrown weapons now fade out after 20 seconds -// created PlayerGib function -// PlayerDie no longer uses hitloc or damage -// PlayerDie now supports dying animations as well as gibbing -// cleaned up PlayerDie a lot -// added CopyBody - -void player_cooloff(); -void BodyFakePhysics() -{ - self.think = BodyFakePhysics; - self.nextthink = time; - - SV_PlayerPhysics(); - - player_cooloff(); -} - -void CopyBody2(float keepvelocity, float testbody) -{ - local entity oldself; - if (self.effects & EF_NODRAW) - return; - oldself = self; - self = spawn(); - self.angles = oldself.angles; - self.avelocity = oldself.avelocity; - self.classname = "body"; - self.mass = oldself.mass; - self.damageforcescale = oldself.damageforcescale; - self.effects = oldself.effects; - self.event_damage = oldself.event_damage; - self.frame = oldself.frame; - self.health = oldself.health; - self.model = oldself.model; - self.modelindex = oldself.modelindex; - self.movetype = oldself.movetype; - self.nextthink = oldself.nextthink; - self.skin = oldself.skin; - self.solid = oldself.solid; - self.takedamage = oldself.takedamage; - self.think = oldself.think; - if (keepvelocity == 1) - self.velocity = oldself.velocity; - self.fade_time = oldself.fade_time; - self.fade_rate = oldself.fade_rate; - //self.weapon = oldself.weapon; - setorigin(self, oldself.origin); - setsize(self, oldself.mins, oldself.maxs);//'-16 -16 -24', '16 16 5'); - self.oldorigin = oldself.origin; - // move any fire burning me to the corpse - if(oldself.onfire != world) - { - self.onfire = oldself.onfire; // corpse is now on fire - self.onfire.enemy = self; // burn corpse instead of me when I respawn - oldself.onfire = world; // I'm not on fire anymore - setattachment(self.onfire, self, ""); - } - - if(testbody) - { - self.armorvalue = oldself.armorvalue; - self.think = BodyFakePhysics; - self.nextthink = time; - } - - self = oldself; -} - -void CopyBody(float keepvelocity) -{ - CopyBody2(keepvelocity, FALSE); -} - -void player_anim (void) -{ - if (self.deadflag != DEAD_NO) - { - if (time > self.dead_time) - { - if (self.maxs_z > 5) - setsize(self, '-16 -16 -24', '16 16 5'); - self.frame = self.dead_frame; - } - else - self.frame = self.die_frame; - return; - } - - if (self.is_feigning == 1) - { - self.frame = self.die_frame; - return; - } - - if (self.crouch) - { - if (self.movement_x * self.movement_x + self.movement_y * self.movement_y > 20) - self.frame = $duckwalk; - else - self.frame = $duckidle; - } - else if ((self.movement_x * self.movement_x + self.movement_y * self.movement_y) > 20) - { - if (self.movement_x > 0 && self.movement_y == 0) - { - self.frame = $run; - } - else if (self.movement_x < 0 && self.movement_y == 0) - self.frame = $runbackwards; - else if (self.movement_x == 0 && self.movement_y > 0) - self.frame = $straferight; - else if (self.movement_x == 0 && self.movement_y < 0) - self.frame = $strafeleft; - else if (self.movement_x > 0 && self.movement_y > 0) - self.frame = $forwardright; - else if (self.movement_x > 0 && self.movement_y < 0) - self.frame = $forwardleft; - else if (self.movement_x < 0 && self.movement_y > 0) - self.frame = $backright; - else if (self.movement_x < 0 && self.movement_y < 0) - self.frame = $backleft; - else - self.frame = $run; - } - else if (self.pain_finished > time) - self.frame = self.pain_frame; - else if (self.attack_finished > time) - self.frame = $shoot; - else - self.frame = $idle; - - if (!(self.flags & FL_ONGROUND)) - { - if (self.crouch) - self.frame = $duckwalk; - else - self.frame = $jump; - } -} -//End change by Supajoe on 11:44 PM EST 11/16/03 (Subject: Player animations) - - -void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - local float take, save; - te_blood (hitloc, force, damage); - // damage resistance (ignore most of the damage from a bullet or similar) - damage = max(damage - 5, 1); - save = bound(0, damage * 0.6, self.armorvalue); - take = bound(0, damage - save, damage); - self.armorvalue = self.armorvalue - save; - self.health = self.health - take; - self.dmg_save = self.dmg_save + save; - self.dmg_take = self.dmg_take + take; - self.dmg_inflictor = inflictor; - if (self.health <= -50) - { - // don't use any animations as a gib - self.frame = 0; - self.dead_frame = 0; - self.die_frame = 0; - // view just above the floor - self.view_ofs = '0 0 4'; - - // make a juicy mess - te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 800, 1000); - te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 400, 1000); - - // make a meaty mess - TossGib (self, "models/gibs/eye.md3", self.origin, self.velocity,0); - TossGib (world, "models/gibs/bloodyskull.md3", self.origin, '0 0 600',0); - - TossGib (world, "models/gibs/gib1.md3", self.origin, self.velocity,0); - //TossGib (world, "models/gibs/gib2.md3", self.origin, self.velocity,0); - TossGib (world, "models/gibs/gib1.mdl", self.origin, self.velocity,0); - //TossGib (world, "models/gibs/gib3.md3", self.origin, self.velocity,0); - TossGib (world, "models/gibs/gib2.mdl", self.origin, self.velocity,0); - //TossGib (world, "models/gibs/gib4.md3", self.origin, self.velocity,0); - TossGib (world, "models/gibs/gib3.mdl", self.origin, self.velocity,0); - - // these destory on impact - TossGib (world, "models/gibs/gib5.md3", self.origin, '-500 0 450',1); - //TossGib (world, "models/gibs/gib6.md3", self.origin, '0 500 450',1); - TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 -500 450',1); - TossGib (world, "models/gibs/chunk.mdl", self.origin, '500 0 450',1); - TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity,1); - TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 0 450',1); - - sound (trace_ent, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM); - - } -} - -void PlayerKilled (float unnatural_death, entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - if(self.class == CLASS_SPY) - SpyDecloak(); - - // fixes death while reloading glitch - inflictor.reload_time = 0; - // fixes flash effects staying after death bug - self.FlashTime = 0; - stuffcmd(inflictor, "v_cshift 0 0 0 0\n"); - - // throw a weapon - SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.wpn5.weapon);//self.weapon); - // print an obituary message - Obituary (attacker, self, deathtype); - // Drop flag or any carried item - TeamFortress_RemoveTimers (); - // Make sure corpse cant take tfgoal items - self.is_dead = 1; - // make the corpse upright (not tilted) - self.angles_x = 0; - self.angles_z = 0; - // don't spin - self.avelocity = '0 0 0'; - // no weapon when dead - self.weaponmodel = ""; - w_clear(); - // view from the floor - self.view_ofs = '0 0 -8'; - // toss the corpse - self.movetype = MOVETYPE_TOSS; - // shootable corpse - self.solid = SOLID_CORPSE; - // don't stick to the floor - self.flags = self.flags - (self.flags & FL_ONGROUND); - // dying animation - self.deadflag = DEAD_DYING; - // when to allow respawn - self.death_time = time + 0.5; - // when to switch to the dead_frame - self.dead_time = time + 2; - if(!unnatural_death) - { - if (random() < 0.5) - { - self.die_frame = $die1; - self.dead_frame = $dead1; - } - else - { - self.die_frame = $die2; - self.dead_frame = $dead2; - } - } - else - { - self.die_frame = $dead2; - self.dead_frame = $dead2; - if(self.health > -1) - self.health = -1; - } - // start the animation - player_anim(); - // set damage function to corpse damage - self.event_damage = PlayerCorpseDamage; - // call the corpse damage function just in case it wants to gib - self.event_damage(inflictor, attacker, 0, deathtype, hitloc, force); - // set up to fade out later - SUB_SetFade (self, time + 12 + random () * 4, 1); -} - -float PlayerShouldDie (entity inflictor, entity attacker, float damage, float deathtype) -{ - // returns true if player should die from this source of damage. - // If so, don't block this damage in any way - - if(damage > 2000) - return TRUE; - - if( deathtype == DEATH_FALL - || deathtype == DEATH_TELEFRAG - || deathtype == DEATH_DROWN - || deathtype == DEATH_HURTTRIGGER - || deathtype == DEATH_LAVA - || deathtype == DEATH_SLIME - || deathtype == DEATH_KILL - || deathtype == DEATH_CLASSCHANGE -// || deathtype == DEATH_BURNING - || deathtype == DEATH_LASERGATE - ) - return TRUE; - - return FALSE; -} - -void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - local float take, save, damagearmor; - - te_blood (hitloc, force, damage); - if (self.pain_finished < time) //Don't switch pain sequences like crazy - { - if (random() > 0.5) - self.pain_frame = $pain1; - else - self.pain_frame = $pain2; - self.pain_finished = time + 0.5; //Supajoe - } - - if(self.class == CLASS_MEDIC) - { - if(deathtype == DEATH_BURNING) - damage = 0; // being on fire or near burning targets does nothing to medics - // the flame thrower, flame rockets, and hotbombs also do minimal damage - else if(deathtype == WEP_FLAMER || - deathtype == WEP_ROCKET_INCENDIARY || - deathtype == WEP_HOTBOMBS) - damage = damage * cvar("g_balance_class_medic_flame_takedamage"); - } - - // how much damage to deal to armor - damagearmor = bound(0, damage * 0.2 * (self.armorvalue / 50) * cvar("g_balance_armor_takedamage"), self.armorvalue); - // how much damage armor blocks - save = bound(0, damage * (self.armorvalue / 100) * cvar("g_balance_armor_effectiveness"), damage); - // how much damage to deal to player - take = bound(0, damage - save, damage); - - // if being telefragged or killed by a death trigger etc, don't block that - if(PlayerShouldDie(inflictor, attacker, damage, deathtype)) - { - if(take < damage) - take = damage; // deal full damage - } - else - { - // keep the damage the armor allowed through, and further reduce it if the player is using the shield - if(self.class == CLASS_SCOUT) - take = SpecialShieldProtect(take); - } - - if (save > 10) - sound (self, CHAN_IMPACT, "misc/armorimpact.wav", 1, ATTN_NORM); - if (take > 10) - sound (self, CHAN_IMPACT, "misc/bodyimpact1.wav", 1, ATTN_NORM); - if (take > 30) - sound (self, CHAN_IMPACT, "misc/bodyimpact2.wav", 1, ATTN_NORM); - - if (take > 50) - TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.1,1); - if (take > 100) - TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.1,1); - - if (!(self.flags & FL_GODMODE)) - { - self.armorvalue = self.armorvalue - damagearmor; - self.health = self.health - take; - } - - DelayHealthRegen(self); - DelayArmorRegen(self); - - - self.dmg_save = self.dmg_save + max(save - 10, 0); - self.dmg_take = self.dmg_take + max(take - 10, 0); - self.dmg_inflictor = inflictor; - if (self.health <= 2) - { - PlayerKilled(FALSE, inflictor, attacker, damage, deathtype, hitloc, force); - - // make the corpse upright (not tilted) - self.angles_x = 0; - self.angles_z = 0; - // don't spin - self.avelocity = '0 0 0'; - // no weapon when dead - self.weaponmodel = ""; - w_clear(); - // view from the floor - self.view_ofs = '0 0 -8'; - // toss the corpse - self.movetype = MOVETYPE_TOSS; - // shootable corpse - self.solid = SOLID_CORPSE; - // don't stick to the floor - self.flags = self.flags - (self.flags & FL_ONGROUND); - // dying animation - self.deadflag = DEAD_DYING; - // when to allow respawn - self.death_time = time + 0.5; - // when to switch to the dead_frame - self.dead_time = time + 2; - if (random() < 0.5) - { - self.die_frame = $die1; - self.dead_frame = $dead1; - } - else - { - self.die_frame = $die2; - self.dead_frame = $dead2; - } - // start the animation - player_anim(); - // set damage function to corpse damage - self.event_damage = PlayerCorpseDamage; - // call the corpse damage function just in case it wants to gib - self.event_damage(inflictor, attacker, 0, deathtype, hitloc, force); - // set up to fade out later - SUB_SetFade (self, time + 12 + random () * 4, 1); - - } -} - diff --git a/attic/TeamNexuiz/game/gamec/cl_weaponanimations.c b/attic/TeamNexuiz/game/gamec/cl_weaponanimations.c deleted file mode 100644 index 87683b778..000000000 --- a/attic/TeamNexuiz/game/gamec/cl_weaponanimations.c +++ /dev/null @@ -1,25 +0,0 @@ -$frame fire fire2 idle run - -// VorteX: static frame globals -float WFRAME_FIRE1 = 0; -float WFRAME_FIRE2 = 1; -float WFRAME_IDLE = 2; -float WFRAME_RUN = 3; - -// changes by LordHavoc on 03/30/04 -// cleaned up code formatting a bit -// renamed to weapon_anim -void weapon_anim () -{ - if (self.attack_finished > time) - self.weaponframe = $fire; - else if (self.movement_x || self.movement_y) - self.weaponframe = $run; - else - self.weaponframe = $idle; -} -void weapon_freeze () -{ - if (self.weaponentity) - self.weaponentity.frame = WFRAME_IDLE; -} \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/cl_weapons.c b/attic/TeamNexuiz/game/gamec/cl_weapons.c deleted file mode 100644 index bc5f15130..000000000 --- a/attic/TeamNexuiz/game/gamec/cl_weapons.c +++ /dev/null @@ -1,374 +0,0 @@ - -// generic weapons table -// add new weapons here -void (float wreq) w_railgun; -void (float wreq) w_healgun; -void (float wreq) w_mac; -void (float wreq) w_pistol; -void(float wpn, float wrequest) weapon_action = -{ - if ((self.reload_time + .25) > time || self.is_feigning == 1) { - return; } - if (wpn == WEP5) - { - wpn = self.wpn5.weapon; - - // various extra weapons the player can equip - if (wpn == WEP_LASER) - w_laser(wrequest); - else if (wpn == WEP_SHOTGUN) - w_shotgun(wrequest); - else if (wpn == WEP_UZI) - w_uzi(wrequest); - else if (wpn == WEP_GRENADE_LAUNCHER) - w_glauncher(wrequest); - else if (wpn == WEP_ELECTRO) - w_electro(wrequest); - else if (wpn == WEP_CRYLINK) - w_crylink(wrequest); - else if (wpn == WEP_NEX) - w_nex(wrequest); - else if (wpn == WEP_HAGAR) - w_hagar(wrequest); - else if (wpn == WEP_ROCKET_LAUNCHER) - w_rlauncher(wrequest); - return; - } - else if(self.class == CLASS_SCOUT) - { - if (wpn == WEP1) - w_shotgun(wrequest); - else if (wpn == WEP2) - w_grapple(wrequest); - else if (wpn == WEP3) - w_uzi(wrequest); - else if (wpn == WEP4) - w_crylink(wrequest); - } - else if(self.class == CLASS_SPY) - { - if (wpn == WEP1) - w_laser(wrequest); - else if (wpn == WEP2) - w_uzi(wrequest); //later be replaced with tranq gun - else if (wpn == WEP3) - w_shotgun(wrequest); -// w_uzi(wrequest); - else if (wpn == WEP4) - w_mac(wrequest); -// w_uzi(wrequest); - } - else if(self.class == CLASS_SOLDIER) - { - if (wpn == WEP1) - w_pistol(wrequest); - //w_shotgun(wrequest); - else if (wpn == WEP2) - w_shotgun(wrequest); - //w_namek(wrequest); - else if (wpn == WEP3) - w_namek(wrequest); -// w_electro(wrequest); - else if (wpn == WEP4) - w_rlauncher(wrequest); - } - else if(self.class == CLASS_PYRO) - { - if (wpn == WEP1) - w_bombletts(wrequest); - else if (wpn == WEP2) - w_flamer(wrequest); - else if (wpn == WEP3) - w_rincendiary(wrequest); - else if (wpn == WEP4) - w_hotbombs(wrequest); - } - else if(self.class == CLASS_MEDIC) - { - if (wpn == WEP1) - w_healgun(wrequest); - else if (wpn == WEP2) - w_shotgun(wrequest); - else if (wpn == WEP3) - w_laser(wrequest); - else if (wpn == WEP4) - w_uzi(wrequest); - } - else if(self.class == CLASS_ENGINEER) - { - if (wpn == WEP1) - w_laser(wrequest); - else if (wpn == WEP2) - w_railgun(wrequest); - else if (wpn == WEP3) - w_shotgun(wrequest); - //w_electro(wrequest); - else if (wpn == WEP4) - w_electro(wrequest); - //w_rlauncher(wrequest); - } - else - { - if (wpn == WEP_LASER) - w_laser(wrequest); - else if (wpn == WEP_SHOTGUN) - w_shotgun(wrequest); - else if (wpn == WEP_UZI) - w_uzi(wrequest); - else if (wpn == WEP_GRENADE_LAUNCHER) - w_glauncher(wrequest); - else if (wpn == WEP_ELECTRO) - w_electro(wrequest); - else if (wpn == WEP_CRYLINK) - w_crylink(wrequest); - else if (wpn == WEP_NEX) - w_nex(wrequest); - else if (wpn == WEP_HAGAR) - w_hagar(wrequest); - else if (wpn == WEP_ROCKET_LAUNCHER) - w_rlauncher(wrequest); - } - -}; - -void () CheckTeamClass = -{ - if (self.impulse_wait > time) // So the GUI menus doesnt flicker - return; - if (self.playerclass < 1) // Bring up menu if no team/class - { - if (self.team_no < 1) - { - stuffcmd(self, "set scmenu_directmenu TeamSelect; togglemenu\n"); - } - else - { - stuffcmd(self, "set scmenu_directmenu ClassSelect; togglemenu\n"); - } - self.impulse_wait = time + .5; - return; - } -}; - -// switch between weapons -void(float imp) W_SwitchWeapon -{ -/* if (self.reload_time > time - .1) - { - return; - }*/ - weapon_hasammo = TRUE; - if (!client_hasweapon(self, imp, TRUE)) - { - if (!weapon_hasammo) -// sprint(self, "You don't have any ammo for that weapon\n"); - TeamNexuiz_HUD_ShowSign(self, NO_AMMO_WARNING); - else - sprint(self, "You don't own that weapon\n"); - } - else - self.switchweapon = imp; -}; - -// next weapon -void() W_NextWeapon = -{ - local float weaponwant, i; - - weaponwant = self.switchweapon + 1; - if (weaponwant < WEP_FIRST) - weaponwant = WEP_LAST; - if (weaponwant > WEP_LAST) - weaponwant = WEP_FIRST; - weapon_hasammo = TRUE; - i = 0; - while(!client_hasweapon(self, weaponwant, TRUE)) - { - i = i + 1; - if(i >= 20) - return; // failed; there's probably some weird problem causing an infinite loop - weaponwant = weaponwant + 1; - if (weaponwant < WEP_FIRST) - weaponwant = WEP_LAST; - if (weaponwant > WEP_LAST) - weaponwant = WEP_FIRST; - } - self.switchweapon = weaponwant; -}; - -// prev weapon -void() W_PreviousWeapon = -{ - local float weaponwant, i; - - weaponwant = self.switchweapon - 1; - if (weaponwant < WEP_FIRST) - weaponwant = WEP_LAST; - if (weaponwant > WEP_LAST) - weaponwant = WEP_FIRST; - weapon_hasammo = TRUE; - i = 0; - while(!client_hasweapon(self, weaponwant, TRUE)) - { - i = i + 1; - if(i >= 20) - return; // failed; there's probably some weird problem causing an infinite loop - weaponwant = weaponwant - 1; - if (weaponwant < WEP_FIRST) - weaponwant = WEP_LAST; - if (weaponwant > WEP_LAST) - weaponwant = WEP_FIRST; - } - self.switchweapon = weaponwant; -}; - -void () Use_Function; -// Brought back weapon frame -void() W_WeaponFrame = -{ - if (self.current_menu > 0) // calls the text menu display - { - Player_Menu (); - if ((self.impulse > 0) && (self.impulse < 11)) - { - Menu_Input (self.impulse); - } - } - if(self.buttonuse) - Use_Function(); // for engineer and medic, though I'm putting this in engineer.c... - - if (self.button0 || self.button2 || self.button3 || self.button4) - CheckTeamClass(); - if (!self.weaponentity || self.health <= 0) - return; // Dead player can't use weapons and injure impulse commands - - if (cvar("g_antilag")) - { - // if aiming at a player and the original trace won't hit that player - // anymore, try aiming at the player's new position - if (self.cursor_trace_ent) - { - if (self.cursor_trace_ent.takedamage) - { - traceline(self.origin + self.view_ofs, self.cursor_trace_endpos, FALSE, self); - if (trace_ent != self.cursor_trace_ent) - { - traceline(self.origin + self.view_ofs, self.cursor_trace_ent.origin + (self.cursor_trace_ent.mins + self.cursor_trace_ent.maxs) * 0.5, FALSE, self); - if (trace_ent == self.cursor_trace_ent) - self.cursor_trace_endpos = trace_endpos; - } - } - } - self.v_angle = vectoangles(self.cursor_trace_endpos - (self.origin + self.view_ofs)); - self.v_angle_x = 0 - self.v_angle_x; - } - - makevectors(self.v_angle); - - // Change weapon - if (self.weapon != self.switchweapon && self.is_feigning != 1) - { - //bprint("switching weapon: "); - //bprint(ftos(self.weapon)); - //bprint(" --> "); - //bprint(ftos(self.switchweapon)); - //bprint("\n"); - - //self.weaponentity.state = WS_CLEAR; - if (self.weaponentity.state == WS_CLEAR) - { - //bprint("switching in\n"); - self.weaponentity.state = WS_RAISE; - weapon_action(self.switchweapon, WR_SETUP); - // VorteX: add player model weapon select frame here - // setcustomframe(PlayerWeaponRaise); - weapon_action(self.weapon, WR_UPDATECOUNTS); - weapon_action(self.weapon, WR_RAISE); - } - else if (self.weaponentity.state == WS_READY) - { - //bprint("switching out\n"); - sound (self, CHAN_WEAPON, "weapons/weapon_switch.wav", 1, ATTN_NORM); - self.weaponentity.state = WS_DROP; - // VorteX: add player model weapon deselect frame here - // setcustomframe(PlayerWeaponDrop); - weapon_action(self.weapon, WR_DROP); - } - } - - if (self.button0) - { - if (self.pistol_fired == 1) // code so that if fire is held down with pistol, - { //// it will not keep firing automatically. - self.next_pistol_fire = time + .2; - } - weapon_action(self.weapon, WR_FIRE1); - } - if (self.button3) - weapon_action(self.weapon, WR_FIRE2); - - if (!self.button0 && self.pistol_fired == 1) - self.pistol_fired = 0; - // do weapon think - if (time >= self.weapon_nextthink) - if (self.weapon_nextthink > 0) - self.weapon_think(); - - // weapon bobbing and script actions - local float bobintensity, q1pitching, framespeed, diff; - local vector vel, realorg, layer1, boblayer; - - bobintensity = cvar("g_viewweapon_bobintensity"); // weapon bob intensity - q1pitching = fabs(cvar("g_viewweapon_q1pitching")); // q1 style of "bob" when looking up and down - - realorg = self.weaponentity.origin + self.weaponentity.view_ofs; - realorg = realorg - self.weaponentity.finaldest; // finaldest is last bob position - - // VorteX: actually this is needed for weapon screen offset - if (q1pitching) - { - self.weaponentity.view_ofs_x = q1pitching*bound(-5.5, self.v_angle_x/45, 5.5); - self.weaponentity.view_ofs_z = q1pitching*bound(-1.5, self.v_angle_x/60, 1.5); - } - - // weapon origin interpolation, layer 1 - if (realorg != self.weaponentity.pos1) - { - framespeed = frametime*self.weaponentity.lip*10; // lip is speed of origin changing (of layer1) - diff = vlen(realorg - self.weaponentity.pos1); - // VorteX: add speed modifier (haste)? - layer1 = frametime*10*self.weaponentity.lip*normalize(self.weaponentity.pos1 - realorg); - if (diff <= vlen(layer1)) - layer1 = normalize(self.weaponentity.pos1 - realorg)*diff; - } - - // weapon bobbing (q3-style) - if (self.flags & FL_ONGROUND && self.waterlevel < 2) - { - // VorteX: only xy velocity matters - vel_x = self.velocity_x; - vel_y = self.velocity_y; - framespeed = vlen(vel); - // Y axis - diff = bobintensity*framespeed/300; - self.weaponentity.destvec_y = self.weaponentity.destvec_y + frametime*10; - boblayer_y = diff*cos(self.weaponentity.destvec_y + 90); - // Z axis - diff = bobintensity*framespeed/540; - self.weaponentity.destvec_z = self.weaponentity.destvec_z + frametime*20; - boblayer_z = diff*cos(self.weaponentity.destvec_z); - self.weaponentity.finaldest = boblayer; - } - else if (self.waterlevel > 0) - {// swim, all velocity matters - // X axis - framespeed = vlen(self.velocity); - diff = bobintensity*framespeed/100; - self.weaponentity.destvec_x = self.weaponentity.destvec_x + frametime*6; - boblayer_x = diff*cos(self.weaponentity.destvec_x); - self.weaponentity.finaldest = boblayer; - } - else - self.weaponentity.finaldest = '0 0 0'; - self.weaponentity.origin = realorg + boblayer + layer1 - self.weaponentity.view_ofs; -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/cl_weaponsystem.c b/attic/TeamNexuiz/game/gamec/cl_weaponsystem.c deleted file mode 100644 index 8e52e745c..000000000 --- a/attic/TeamNexuiz/game/gamec/cl_weaponsystem.c +++ /dev/null @@ -1,347 +0,0 @@ -/* -=========================================================================== - - CLIENT WEAPONSYSTEM CODE - Bring back W_Weaponframe - -=========================================================================== -*/ - -void() CL_Weaponentity_Think = -{ - self.nextthink = time; - if (self.owner.weaponentity != self) - { - remove(self); - return; - } - self.effects = self.owner.effects; - if(!(self.class == CLASS_SPY && self.special_active)) - self.alpha = self.owner.alpha; -}; - -void() CL_ExteriorWeaponentity_Think = -{ - self.nextthink = time; - if (self.owner.exteriorweaponentity != self) - { - remove(self); - return; - } - if (self.cnt != self.owner.weaponentity.modelindex || self.dmg != self.owner.modelindex || self.deadflag != self.owner.deadflag) - { - self.cnt = self.owner.weaponentity.modelindex; - self.dmg = self.owner.modelindex; - self.deadflag = self.owner.deadflag; - if (self.owner.deadflag) self.model = ""; - else if (self.owner.wpn == WEP_LASER) setmodel(self, "models/weapons/v_laser.md3"); - else if (self.owner.wpn == WEP_SHOTGUN) setmodel(self, "models/weapons/v_shotgun.md3"); - else if (self.owner.wpn == WEP_UZI) setmodel(self, "models/weapons/v_uzi.md3"); - else if (self.owner.wpn == WEP_GRENADE_LAUNCHER) setmodel(self, "models/weapons/v_gl.md3"); - else if (self.owner.wpn == WEP_ELECTRO) setmodel(self, "models/weapons/v_electro.md3"); - else if (self.owner.wpn == WEP_CRYLINK) setmodel(self, "models/weapons/v_crylink.md3"); - else if (self.owner.wpn == WEP_NEX) setmodel(self, "models/weapons/v_nex.md3"); - else if (self.owner.wpn == WEP_HAGAR) setmodel(self, "models/weapons/v_hagar.md3"); - else if (self.owner.wpn == WEP_ROCKET_LAUNCHER) setmodel(self, "models/weapons/v_rl.md3"); - else if (self.owner.wpn == WEP_BOMBLETTS) setmodel(self, "models/weapons/v_nadelauncher.md3"); - else if (self.owner.wpn == WEP_ROCKET_INCENDIARY) setmodel(self, "models/weapons/v_rli.md3"); - else if (self.owner.wpn == WEP_HOTBOMBS) setmodel(self, "models/weapons/v_hotbombs.md3"); - else if (self.owner.wpn == WEP_GRAPPLE) setmodel(self, "models/weapons/v_grapple.md3"); - else if (self.owner.wpn == WEP_NAMEK) setmodel(self, "models/weapons/v_namek.md3"); - else if (self.owner.wpn == WEP_RAILGUN) setmodel(self, "models/weapons/v_nex.md3"); - else if (self.owner.wpn == WEP_MAC) setmodel(self, "models/weapons/v_mac.md3"); - else if (self.owner.wpn == WEP_FLAMER) setmodel(self, "models/weapons/v_flamethrower.md3"); - else if (self.owner.wpn == WEP_PISTOL) setmodel(self, "models/weapons/v_soldpistol.md3"); - setattachment(self, self.owner, "bip01 r hand"); - // if that didn't find a tag, hide the exterior weapon model - if (!self.tag_index) - self.model = ""; - } - self.effects = self.owner.weaponentity.effects; -}; - -// spawning weaponentity for client -void() CL_SpawnWeaponentity = -{ - if (self.weaponentity) - { - w_clear(); - return; - } - self.weaponentity = spawn(); - self.weaponentity.solid = SOLID_NOT; - self.weaponentity.owner = self; - self.weaponentity.weaponentity = self.weaponentity; - setmodel(self.weaponentity, ""); - self.weaponentity.origin = '0 0 0'; - self.weaponentity.angles = '0 0 0'; - self.weaponentity.viewmodelforclient = self; - self.weaponentity.flags = 0; - self.weaponentity.think = CL_Weaponentity_Think; - self.weaponentity.nextthink = time; - - self.exteriorweaponentity = spawn(); - self.exteriorweaponentity.solid = SOLID_NOT; - self.exteriorweaponentity.exteriorweaponentity = self.exteriorweaponentity; - self.exteriorweaponentity.owner = self; - self.exteriorweaponentity.origin = '0 0 0'; - self.exteriorweaponentity.angles = '0 0 0'; - self.exteriorweaponentity.think = CL_ExteriorWeaponentity_Think; - self.exteriorweaponentity.nextthink = time; -}; - -// convertion from index (= impulse) to flag in .items -float(float index) weapon_translateindextoflag = -{ - if (index == WEP1) - return IT_WEP1; - else if (index == WEP2) - return IT_WEP2; - else if (index == WEP3) - return IT_WEP3; - else if (index == WEP4) - return IT_WEP4; - else if (index == WEP5) - return IT_WEP5; - return IT_WEP1; -}; - -float(entity cl, float wpn, float andammo) client_hasweapon = -{ - local float itemcode; - local entity oldself; - - weapon_hasammo = TRUE; - if (wpn < WEP_FIRST || wpn > WEP_LAST) - return FALSE; - itemcode = weapon_translateindextoflag(wpn); - if (cl.items & itemcode) - { - if (andammo) - { - oldself = self; - self = cl; - weapon_action(wpn, WR_CHECKAMMO); - self = oldself; - if (weapon_hasammo) - return TRUE; - return FALSE; - } - return TRUE; - } - return FALSE; -}; - -// Weapon subs -void() w_clear = -{ - weapon_action(self.weapon, WR_CLEAR); - if (self.weapon != -1) - self.weapon = 0; - if (self.weaponentity) - { - self.weaponentity.state = WS_CLEAR; - setmodel(self.weaponentity, ""); - self.weaponentity.effects = 0; - } -}; - -void() w_ready = -{ - self.weaponentity.state = WS_READY; - weapon_action(self.weapon, WR_IDLE); -}; - -// FIXME: add qw-style client-custom weaponrating (cl_weaponrating)? -float(entity e) w_getbestweapon -{// add new weapons here - if(e.class == CLASS_SCOUT) - { - if (client_hasweapon(e, WEP5, TRUE)) - return WEP5; - else if (client_hasweapon(e, WEP3, TRUE)) - return WEP3; - else if (client_hasweapon(e, WEP2, TRUE)) - return WEP2; - weapon_hasammo = TRUE; - return WEP1; - } - if(e.class == CLASS_SPY) - { - if (client_hasweapon(e, WEP5, TRUE)) - return WEP5; - else if (client_hasweapon(e, WEP2, TRUE)) - return WEP2; - weapon_hasammo = TRUE; - return WEP1; - } - if(e.class == CLASS_SOLDIER) - { - if (client_hasweapon(e, WEP5, TRUE)) - return WEP5; - else if (client_hasweapon(e, WEP4, TRUE)) - return WEP4; - else if (client_hasweapon(e, WEP3, TRUE)) - return WEP3; - else if (client_hasweapon(e, WEP2, TRUE)) - return WEP2; - weapon_hasammo = TRUE; - return WEP1; - } - if(e.class == CLASS_PYRO) - { - if (client_hasweapon(e, WEP5, TRUE)) - return WEP5; - else if (client_hasweapon(e, WEP3, TRUE)) - return WEP3; - else if (client_hasweapon(e, WEP2, TRUE)) - return WEP2; - else if (client_hasweapon(e, WEP4, TRUE)) - return WEP4; - weapon_hasammo = TRUE; - return WEP1; - } - if(e.class == CLASS_MEDIC) - { - if (client_hasweapon(e, WEP5, TRUE)) - return WEP5; - else if (client_hasweapon(e, WEP4, TRUE)) - return WEP4; - else if (client_hasweapon(e, WEP3, TRUE)) - return WEP3; - else if (client_hasweapon(e, WEP2, TRUE)) - return WEP2; - weapon_hasammo = TRUE; - return WEP1; - } - if(e.class == CLASS_ENGINEER) - { - if (client_hasweapon(e, WEP5, TRUE)) - return WEP5; - else if (client_hasweapon(e, WEP4, TRUE)) - return WEP4; - else if (client_hasweapon(e, WEP3, TRUE)) - return WEP3; - else if (client_hasweapon(e, WEP2, TRUE)) - return WEP2; - weapon_hasammo = TRUE; - return WEP1; - } - weapon_hasammo = TRUE; - return WEP1; -}; - -// Setup weapon for client (after this raise frame will be launched) -void(float new_wep, string wmodel, float hudammo) weapon_setup = -{ - local string weaponmdl; - - self.items = self.items - (self.items & (IT_SHELLS | IT_NAILS | IT_ROCKETS | IT_CELLS)); - self.items = self.items | hudammo; - - self.weapon = self.switchweapon; - //self.weapon = weapon_translateindextoflag(new_wep); - self.wpn = new_wep; - - if (wmodel != "") - { - weaponmdl = strzone(strcat("models/weapons/", wmodel)); - setmodel(self.weaponentity, weaponmdl); - } - // VorteX: update visible weapon - // CL_ViswepUpdate(); -}; - -/*void(float new_wep, string wmodel, float hudammo, void spfunciton()) weapon_setup_special = -{ - weapon_setup(new_wep, wmodel, hudammo); - spfunction(); -}*/ - -// shot direction -float WEAPON_MAXRELX = 14; // if more, shot can be spawned after wall surface (in empty worldspace) or inside other entity if client stands close to it -void(float x, float y, float z) weapon_shotdir = -{ - makevectors(self.v_angle); - self.shotorg = self.origin + self.view_ofs + v_forward*bound(0, x, WEAPON_MAXRELX) + v_right*(y + self.weaponentity.view_ofs_y) + v_up*z; - self.shotdir = aim(self, 1000); -}; - -// perform weapon to attack (weaponstate and attack_finished check is here) -void(float() checkfunc1, float() checkfunc2, void() firefunc, float atktime) weapon_prepareattack = -{ - // fixme: does spy need to decloak here? - //if(self.class == CLASS_SPY) - //{ - // SpyDecloak(); - //} - // Change to best weapon if failed - if ((cvar("g_instagib") == 0) && (cvar("g_rocketarena") == 0)) - { - if (!checkfunc1()) - { - if (!checkfunc2()) - self.switchweapon = w_getbestweapon(self); - return; - } - } - // Don't do shot if previos attack not finished - if (time < self.attack_finished) - return; - // Can't do shot if changing weapon - if (self.weaponentity.state != WS_READY) - return; - - self.attack_finished = time + atktime; - firefunc(); -}; - -void SpyDecloak(); -// perform weapon attack -void(float() checkfunc1, float() checkfunc2, void() firefunc) weapon_doattack -{ - if(self.class == CLASS_SPY) - { - SpyDecloak(); - } - - - // Change to best weapon if failed - if ((cvar("g_instagib") == 0) && (cvar("g_rocketarena") == 0)) - { - if (!checkfunc1()) - { - if (!checkfunc2()) - self.switchweapon = w_getbestweapon(self); - return; - } - } - self.weaponentity.state = WS_INUSE; - firefunc(); - weapon_action(self.weapon, WR_UPDATECOUNTS); // update ammo now -}; - -void(entity ent, float recoil) weapon_recoil = -{ - ent.punchangle = (randomvec() + '-1 0 0')*recoil; - ent.punchangle_z = 0; // don't want roll - if (recoil > 3) // push back if large recoil - ent.velocity = ent.velocity - normalize(ent.shotdir)*recoil*25; -}; - -void(float fr, float t, void() func) weapon_thinkf = -{ - if (fr >= 0) - if (self.weaponentity != world) - self.weaponentity.frame = fr; - // VorteX: haste can be added here - self.weapon_nextthink = time + t; - self.weapon_think = func; -}; - -void(float spd, vector org) weapon_boblayer1 = -{ - // VorteX: haste can be added here - self.weaponentity.pos1 =org; - self.weaponentity.lip = spd; -}; diff --git a/attic/TeamNexuiz/game/gamec/class.c b/attic/TeamNexuiz/game/gamec/class.c deleted file mode 100644 index 1eb7b0391..000000000 --- a/attic/TeamNexuiz/game/gamec/class.c +++ /dev/null @@ -1,553 +0,0 @@ - -void PlayerKilled (float unnatural_death, entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force); - - - -/* -============= -NameOfClass - -Translates class number to a string for printing -============= -*/ -string NameOfClass(float cl) -{ - if(cl == CLASS_SCOUT) - return "Scout"; - if(cl == CLASS_SPY) - return "Spy"; - if(cl == CLASS_SOLDIER) - return "Soldier"; - if(cl == CLASS_PYRO) - return "Pryo"; - if(cl == CLASS_MEDIC) - return "Medic"; - if(cl == CLASS_ENGINEER) - return "Engineer"; - if(cl == CLASS_CIVILIAN) - return "Civilian"; - return "Invalid Class"; -} - -/* -============= -GetPlayerClass - -Returns the player's class by checking his model name -============= -*/ -float GetPlayerClass() -{ - //string s; - //s = substring(self.playermodel,13,3); - - //bprint("Class Prefix: "); - //bprint(s); - //bprint("\n"); - - // only the prefix matters; - // thus, you could have multiple medic models, such as a male and female. - if(substring(self.playermodel,13,5) - == "scout") - return CLASS_SCOUT; - if(substring(self.playermodel,13,3) - == "spy") - return CLASS_SPY; - if(substring(self.playermodel,13,7) - == "soldier") - return CLASS_SOLDIER; - if(substring(self.playermodel,13,4) - == "pyro") - return CLASS_PYRO; - if(substring(self.playermodel,13,5) - == "medic") - return CLASS_MEDIC; - if(substring(self.playermodel,13,8) - == "engineer") - return CLASS_ENGINEER; - - return -1; -} - -/* -============= -ChangeClass - -Changes the player's class -============= -*/ - -void ChangeClass(float announce_change, float instant_change) -{ - float portion, aportion; - if(announce_change) - bprint(self.netname, " becomes a ", NameOfClass(self.class), "\n"); - - portion = 1.0; - - if(instant_change) - { - // health - if(self.health < self.max_health) - aportion = self.health / self.max_health; - else - aportion = 1.0; - - if(aportion < portion) - portion = aportion; - - // armor - if(self.armorvalue < self.max_armor) - aportion = self.armorvalue / self.max_armor; - else - aportion = 1.0; - - if(aportion < portion) - portion = aportion; - } - - if(self.class == CLASS_SCOUT) - BecomeScout(portion); - - if(self.class == CLASS_SPY) - BecomeSpy(portion); - - if(self.class == CLASS_SOLDIER) - BecomeSoldier(portion); - - if(self.class == CLASS_PYRO) - BecomePyro(portion); - - if(self.class == CLASS_MEDIC) - BecomeMedic(portion); - - if(self.class == CLASS_ENGINEER) - BecomeEngineer(portion); - - if(self.class == CLASS_CIVILIAN) - BecomeCivilian(portion); - - - // set starting health - if(!instant_change && self.class != CLASS_CIVILIAN)//portion == 1.0) - self.health = ceil(self.max_health * 1.2); - else - self.health = self.max_health; - // set starting armor - if(!instant_change)//portion == 1.0) - self.armorvalue = ceil(self.max_armor * 1.2); - else - self.armorvalue = self.max_armor; - - // test code - //if(instant_change) - // self.health = 2 + self.health * 0.8; -}; - -float SetPlayerMass(entity pl) -{ - float m, extra_mass; - if(self.class == CLASS_SCOUT) - { - m = cvar("g_balance_class_scout_mass"); - } - else if(self.class == CLASS_SPY) - { - m = cvar("g_balance_class_spy_mass"); - } - else if(self.class == CLASS_SOLDIER) - { - m = cvar("g_balance_class_soldier_mass"); - } - else if(self.class == CLASS_PYRO) - { - m = cvar("g_balance_class_pyro_mass"); - } - else if(self.class == CLASS_MEDIC) - { - m = cvar("g_balance_class_medic_mass"); - } - else if(self.class == CLASS_ENGINEER) - { - m = cvar("g_balance_class_engineer_mass"); - } - else - m = cvar("sv_maxspeed"); - - // fixme: if I'm carrying a flag or extra weapon, add that mass - extra_mass = 0; - - if(self.wpn5.mass) - extra_mass = extra_mass + self.wpn5.mass; - - - self.mass = m + extra_mass; - - return m; // return what my natural mass is -}; - -void SetPlayerSpeed(entity pl) -{ - local float s, m, plmass; - string temp; - if(self.class == CLASS_SCOUT) - { - s = cvar("g_balance_class_scout_speed"); - //m = cvar("g_balance_class_scout_mass"); - } - else if(self.class == CLASS_SPY) - { - s = cvar("g_balance_class_spy_speed"); - //m = cvar("g_balance_class_spy_mass"); - } - else if(self.class == CLASS_SOLDIER) - { - s = cvar("g_balance_class_soldier_speed"); - //m = cvar("g_balance_class_soldier_mass"); - } - else if(self.class == CLASS_PYRO) - { - s = cvar("g_balance_class_pyro_speed"); - //m = cvar("g_balance_class_pyro_mass"); - } - else if(self.class == CLASS_MEDIC) - { - s = cvar("g_balance_class_medic_speed"); - //m = cvar("g_balance_class_medic_mass"); - } - else if(self.class == CLASS_ENGINEER) - { - s = cvar("g_balance_class_engineer_speed"); - //m = cvar("g_balance_class_engineer_mass"); - } - else if(self.class == CLASS_CIVILIAN) - { - s = cvar("g_balance_class_civilian_speed"); - } - - - - // fixme: if I'm in a manned turret, set my speed to 0 - // fixme: if I'm piloting a vehicle, what to do? - - - // if my mass is different because of what I'm carrying, - // slow me down - - m = SetPlayerMass(pl); - - if(pl.mass == 0) - plmass = 1; - else - plmass = pl.mass; - s = ceil( s * (m / plmass ) ); - - if(s != pl.speed) - { - //bprint("debug: adjusting speed\n"); - temp = ftos(s); - - //stuffcmd( pl, strcat("cl_movement_maxspeed ", temp , "\n")); - //stuffcmd( pl, strcat("cl_movement_maxairspeed ", temp , "\n")); - - //stuffcmd( pl, strcat("cl_forwardspeed ", temp , "\n")); - //stuffcmd( pl, strcat("cl_backspeed ", temp , "\n")); - //stuffcmd( pl, strcat("cl_sidespeed ", temp , "\n")); - //stuffcmd( pl, strcat("cl_upspeed ", temp , "\n")); - } - - pl.speed = s; -} - - - -/* -============= -ResetPlayerModel - -Resets the player's model to what it should be when returning from invisibility, - or trying to change class but not being allowed. -============= -*/ - -void ResetPlayerModel(entity pl) -{ - local vector m1, m2; - m1 = pl.mins; - m2 = pl.maxs; - //precache_model (self.playermodel); needed? - setmodel (pl, pl.playermodel); - setsize (pl, m1, m2); -} - -/* -============= -CheckForClassChange - -Returns the player's class by checking his model. -Called from PlayerPreThink whenever the player changes his model, before change is made. -============= -*/ - -void() respawn; -float CheckForClassChange() -{ - float cl; - float tfcl; - - // FIXME: need an option to not allow class changes at all once the player has changed once - - //bprint("check if allow change\n"); - - // don't monitor the player's model when he's dead. - // this means he can change class when dead and respawn as the new class. - //if(self.health <= 0) // fixme: or if player is an observer - // return 0; - -// bprint("healthy\n"); - - if(self.playermodel == self.mdl) - return 0; // haven't changed models since last legitimate change - - //bprint("model has changed\n"); - - cl = GetPlayerClass(); - if(self.class == cl) // changed models, but it didn't affect my class - { - if(self.change_mdl_on_respawn) // if was going to change class, but I just switched models of the same class I'm in now, undo the future class change - self.change_mdl_on_respawn = ""; - return 0; - } - - //bprint("class changed\n"); - - - // it's changed; now figure out what to do about it - - // don't allow player class - if(cvar("g_classchange_not_allowed")) - { - self.playermodel = self.mdl; // return to old model - ResetPlayerModel(self); - - /*local vector m1, m2; - self.playermodel = self.model; // return to old model - m1 = self.mins; - m2 = self.maxs; - //precache_model (self.playermodel); needed? - setmodel (self, self.playermodel); - setsize (self, m1, m2);*/ - return 0; - } - - if (cl == CLASS_SCOUT) - { - tfcl = TF_CLASS_SCOUT; - } - else if (cl == CLASS_SOLDIER) - { - tfcl = TF_CLASS_SOLDIER; - } - else if (cl == CLASS_MEDIC) - { - tfcl = TF_CLASS_MEDIC; - } - else if (cl == CLASS_PYRO) - { - tfcl = TF_CLASS_PYRO; - } - else if (cl == CLASS_ENGINEER) - { - tfcl = TF_CLASS_ENGINEER; - } - else if (cl == CLASS_SPY) - { - tfcl = TF_CLASS_SPY; - } - - if (self.lives == 0) - { - self.playermodel = self.mdl; // return to old model - ResetPlayerModel(self); - sprint(self, "You have no lives left.\n"); - return 0; - } - if (!IsLegalClass(tfcl)) // Checks if class is legal for the map - { - self.playermodel = self.mdl; // return to old model - ResetPlayerModel(self); - sprint(self, "You cannot play that playerclass on this map. \n"); - TeamFortress_DisplayLegalClasses(); - return 0; - } - self.respawn_as_new_class = tfcl; // makes sure conversion from TF .playerclass goes through - - // allow change, but don't take effect until death - if(cvar("g_classchange_delay_until_death")) - { - self.change_mdl_on_respawn = self.playermodel; - self.change_mdl_on_respawn = strzone(self.change_mdl_on_respawn); - self.playermodel = self.model; - if (self.team_no > 0) - { - sprint (self, "After dying, you will return as a "); - TeamFortress_PrintClassName (self, cl, (self.tfstate & 8)); - } -// sprint(self, "You will change class after you die\n"); - return 0; - } - - // allow change, possibly with stipulations (like force respawn) - - //bprint("allowing change\n"); - - if(self.class == CLASS_SPY) - SpyDecloak(); - - self.class = cl; - //self.mdl = strzone(self.playermodel); - - - // allow change, but instant kill & respawn - if(cvar("g_classchange_force_respawn")) - { - PlayerKilled(TRUE, world, world, 1, DEATH_CLASSCHANGE, '0 0 0', '0 0 0'); - respawn(); - return 1; - } - - // allow class change without a hitch - ChangeClass(TRUE, TRUE); - return 0; -} - -void ClassSpecial() -{ - if(self.class == CLASS_SCOUT) - ScoutSpecial(); - if(self.class == CLASS_SPY) - SpySpecial(); - if(self.class == CLASS_SOLDIER) - SoldierSpecial(); - if(self.class == CLASS_PYRO) - PyroSpecial(); - if(self.class == CLASS_MEDIC) - MedicSpecial(); - if(self.class == CLASS_ENGINEER) - EngineerSpecial(); -} - -void ClassGrenade(float req) -{ - if(self.grenade_time > time) - return; - - if(self.class == CLASS_SCOUT) - ScoutGrenade(req); - if(self.class == CLASS_SPY) - SpyGrenade(req); - if(self.class == CLASS_SOLDIER) - SoldierGrenade(req); - if(self.class == CLASS_PYRO) - PyroGrenade(req); - if(self.class == CLASS_MEDIC) - MedicGrenade(req); - if(self.class == CLASS_ENGINEER) - EngineerGrenade(req); -} - -void ClassPreThink() -{ - if(self.class == CLASS_SCOUT) - ScoutPreThink(); - if(self.class == CLASS_SPY) - SpyPreThink(); - if(self.class == CLASS_SOLDIER) - SoldierPreThink(); - if(self.class == CLASS_PYRO) - PyroPreThink(); - if(self.class == CLASS_MEDIC) - MedicPreThink(); - if(self.class == CLASS_ENGINEER) - EngineerPreThink(); - if(self.class == CLASS_CIVILIAN) - EngineerPreThink(); -} - -void ClassPostThink() -{ - if(self.class == CLASS_SCOUT) - ScoutPostThink(); - if(self.class == CLASS_SPY) - SpyPostThink(); - if(self.class == CLASS_SOLDIER) - SoldierPostThink(); - if(self.class == CLASS_PYRO) - PyroPostThink(); - if(self.class == CLASS_MEDIC) - MedicPostThink(); - if(self.class == CLASS_ENGINEER) - EngineerPostThink(); - if(self.class == CLASS_CIVILIAN) - CivilianPostThink(); -} - -/* -========================= - Set MaxAmmo for classes - Wazat - edit these values to whatever - ========================= -*/ -void (float classnum) SetMaxAmmoFor = -{ - self.is_feigning = 0; - self.leg_damage = 0; //temp here //so leg damage doesnt stay on player respawn - // if no class is found, it will just default to these - self.maxammo_shells = 200; - self.maxammo_nails = 200; - self.maxammo_cells = 40; - self.maxammo_rockets = 40; - self.maxammo_metal = 0; - self.no_grenades_1 = 4; - self.clip_rockets = CLIP_MAX_ROCKETS; - self.clip_pistol = CLIP_MAX_PISTOL; - self.tp_grenades_1 = 1; - self.tp_grenades_2 = 0; - - if (classnum == CLASS_SCOUT) // Scout Supplies - { - self.maxammo_shells = 200; - self.maxammo_nails = 200; - self.maxammo_cells = 40; - self.maxammo_rockets = 45; - self.clip_crylink = CLIP_MAX_CRYLINK; - self.tp_grenades_1 = 9; - } - else if (classnum == CLASS_SPY) { // Spy supplies - self.maxammo_shells = 150; - self.maxammo_nails = 200; // MAC10 uses nails - self.maxammo_cells = 70; - self.maxammo_rockets = 15; - self.ammo_nails = 100; - self.tp_grenades_1 = 9; - self.no_grenades_2 = 1; - } - else if (classnum == CLASS_SOLDIER) { - self.ammo_rockets = 62; //translates to 20 - self.maxammo_rockets = 40; - self.tp_grenades_2 = 3; - self.no_grenades_2 = 1; - } - else if (classnum == CLASS_PYRO) { - self.clip_pipegrenades = 6; - } - else if (classnum == CLASS_ENGINEER) { - self.maxammo_cells = 200; - self.ammo_cells = 100; - self.ammo_metal = 0; - self.maxammo_metal = 200; - } - else if (classnum == CLASS_CIVILIAN) { -// self.health = 50; - } -}; diff --git a/attic/TeamNexuiz/game/gamec/constants.h b/attic/TeamNexuiz/game/gamec/constants.h deleted file mode 100644 index 4312b9f8f..000000000 --- a/attic/TeamNexuiz/game/gamec/constants.h +++ /dev/null @@ -1,200 +0,0 @@ - -float FALSE = 0; -float TRUE = 1; - -float FL_FLY = 1; -float FL_SWIM = 2; -float FL_CLIENT = 8; -float FL_INWATER = 16; -float FL_MONSTER = 32; -float FL_GODMODE = 64; -float FL_NOTARGET = 128; -float FL_ITEM = 256; -float FL_ONGROUND = 512; -float FL_PARTIALGROUND = 1024; -float FL_WATERJUMP = 2048; -float FL_JUMPRELEASED = 4096; -float FL_WEAPON = 8192; -float FL_POWERUP = 16384; - -float MOVETYPE_NONE = 0; -float MOVETYPE_ANGLENOCLIP = 1; -float MOVETYPE_ANGLECLIP = 2; -float MOVETYPE_WALK = 3; -float MOVETYPE_STEP = 4; -float MOVETYPE_FLY = 5; -float MOVETYPE_TOSS = 6; -float MOVETYPE_PUSH = 7; -float MOVETYPE_NOCLIP = 8; -float MOVETYPE_FLYMISSILE = 9; -float MOVETYPE_BOUNCE = 10; -//float MOVETYPE_BOUNCEMISSILE = 11; // Like bounce but doesn't lose speed on bouncing -//float MOVETYPE_FOLLOW = 12; // 'Attaches' the entity to its aim_ent - -float SOLID_NOT = 0; -float SOLID_TRIGGER = 1; -float SOLID_BBOX = 2; -float SOLID_SLIDEBOX = 3; -float SOLID_BSP = 4; -//float SOLID_CORPSE = 5; // Unobstructed by CORPSE or SLIDEBOX - -float DEAD_NO = 0; -float DEAD_DYING = 1; -float DEAD_DEAD = 2; -float DEAD_RESPAWNABLE = 3; - -float DAMAGE_NO = 0; -float DAMAGE_YES = 1; -float DAMAGE_AIM = 2; - -float CONTENT_EMPTY = -1; -float CONTENT_SOLID = -2; -float CONTENT_WATER = -3; -float CONTENT_SLIME = -4; -float CONTENT_LAVA = -5; -float CONTENT_SKY = -6; - -float SVC_BAD = 0; -float SVC_NOP = 1; -float SVC_DISCONNECT = 2; -float SVC_UPDATESTAT = 3; -float SVC_VERSION = 4; -float SVC_SETVIEW = 5; -float SVC_SOUND = 6; -float SVC_TIME = 7; -float SVC_PRINT = 8; -float SVC_STUFFTEXT = 9; -float SVC_SETANGLE = 10; -float SVC_SERVERINFO = 11; -float SVC_LIGHTSTYLE = 12; -float SVC_UPDATENAME = 13; -float SVC_UPDATEFRAGS = 14; -float SVC_CLIENTDATA = 15; -float SVC_STOPSOUND = 16; -float SVC_UPDATECOLORS = 17; -float SVC_PARTICLE = 18; -float SVC_DAMAGE = 19; -float SVC_SPAWNSTATIC = 20; -float SVC_SPAWNBINARY = 21; -float SVC_SPAWNBASELINE = 22; -float SVC_TEMPENTITY = 23; -float SVC_SETPAUSE = 24; -float SVC_SIGNONNUM = 25; -float SVC_CENTERPRINT = 26; -float SVC_KILLEDMONSTER = 27; -float SVC_FOUNDSECRET = 28; -float SVC_SPAWNSTATICSOUND = 29; -float SVC_INTERMISSION = 30; -float SVC_FINALE = 31; -float SVC_CDTRACK = 32; -float SVC_SELLSCREEN = 33; -float SVC_CUTSCENE = 34; - -float TE_SPIKE = 0; -float TE_SUPERSPIKE = 1; -float TE_GUNSHOT = 2; -float TE_EXPLOSION = 3; -float TE_TAREXPLOSION = 4; -float TE_LIGHTNING1 = 5; -float TE_LIGHTNING2 = 6; -float TE_WIZSPIKE = 7; -float TE_KNIGHTSPIKE = 8; -float TE_LIGHTNING3 = 9; -float TE_LAVASPLASH = 10; -float TE_TELEPORT = 11; - -float CHAN_AUTO = 0; -float CHAN_WEAPON = 1; -float CHAN_VOICE = 2; -float CHAN_ITEM = 3; -float CHAN_BODY = 4; -float CHAN_IMPACT = 5; - -float ATTN_NONE = 0; -float ATTN_NORM = 0.5; -float ATTN_IDLE = 2; -float ATTN_STATIC = 3; - -float UPDATE_GENERAL = 0; -float UPDATE_STATIC = 1; -float UPDATE_BINARY = 2; -float UPDATE_TEMP = 3; - -float EF_BRIGHTFIELD = 1; -float EF_MUZZLEFLASH = 2; -float EF_BRIGHTLIGHT = 4; -float EF_DIMLIGHT = 8; - -float MSG_BROADCAST = 0; -float MSG_ONE = 1; -float MSG_ALL = 2; -float MSG_INIT = 3; - -// Deathtypes (weapon deathtypes are WEP_*) -float DEATH_FALL = 10000; -float DEATH_TELEFRAG = 10001; -float DEATH_DROWN = 10002; -float DEATH_HURTTRIGGER = 10003; -float DEATH_LAVA = 10004; -float DEATH_SLIME = 10005; -float DEATH_KILL = 10006; -float DEATH_CLASSCHANGE = 10007; -float DEATH_BURNING = 10008; -float DEATH_LASERGATE = 10009; - -float IT_LASER = 4096; -float IT_SHOTGUN = 1; -float IT_UZI = 2; -float IT_GRENADE_LAUNCHER = 4; -float IT_ELECTRO = 8; -float IT_CRYLINK = 16; -float IT_NEX = 32; -float IT_HAGAR = 64; -float IT_ROCKET_LAUNCHER = 128; - -float IT_WEP1 = 4096; -float IT_WEP2 = 1; -float IT_WEP3 = 2; -float IT_WEP4 = 4; -float IT_WEP5 = 8; - -float IT_SHELLS = 256; -float IT_NAILS = 512; -float IT_ROCKETS = 1024; -float IT_CELLS = 2048; - -float IT_STRENGTH = 8192; -float IT_INVINCIBLE = 16384; -//float IT_SPEED = 32768; -//float IT_SLOWMO = 65536; - -float IT_KEY1 = 131072; -float IT_KEY2 = 262144; - -vector PL_VIEW_OFS = '0 0 35'; -vector PL_MIN = '-16 -16 -24'; -vector PL_MAX = '16 16 45'; -vector PL_CROUCH_VIEW_OFS = '0 0 15'; -vector PL_CROUCH_MIN = '-16 -16 -24'; -vector PL_CROUCH_MAX = '16 16 25'; - -// Sajt - added these, just as constants. Not sure how you want them actually put in the game, but I just -// did this so at least they worked -// NOTE: instagib IS NOT compatible with rocket-arena, so make sure to prevent selecting both in a menu -//float GAME_INSTAGIB = 1; /// everyone gets the nex gun with infinite ammo, and one shot kills -//float GAME_ROCKET_ARENA = 16; /// Everyone starts with a rocket launcher -//float GAME_FULLBRIGHT_PLAYERS = 64; /// makes the players model fullbright -//float GAME_TEAMS = 128; /// Teams, red/green/yellow/blue - -float game; // set to "gamecfg" on worldspawn - - -//float POWERUP_STRENGTH_DAMAGE = 2; // damage multiplier for strength powerup -//float POWERUP_STRENGTH_FORCE = 4; // force multiplier for strength powerup - -//float POWERUP_INVINCIBLE_TAKEDAMAGE = 0.2; // received damage multiplier for invincible powerup - - - -float TE_BEAM = 13; // grappling hook - diff --git a/attic/TeamNexuiz/game/gamec/ctf.c b/attic/TeamNexuiz/game/gamec/ctf.c deleted file mode 100644 index 9ef05c86c..000000000 --- a/attic/TeamNexuiz/game/gamec/ctf.c +++ /dev/null @@ -1,396 +0,0 @@ - -.entity flagcarried; - -float FLAGSCORE_PICKUP = 1; -float FLAGSCORE_RETURN = 5; // returned by owner team -float FLAGSCORE_RETURNROGUE = 10; // returned by rogue team -float FLAGSCORE_CAPTURE = 5; -float FLAGSCORE_CAPTURE_TEAM = 20; - -float FLAG_BASE = 1; -float FLAG_CARRY = 2; -float FLAG_DROPPED = 3; - -void() FlagThink; -void() FlagTouch; - -void() place_flag = -{ - self.mdl = self.model; - self.flags = FL_ITEM; - self.solid = SOLID_TRIGGER; - self.movetype = MOVETYPE_TOSS; - self.velocity = '0 0 0'; - self.origin_z = self.origin_z + 6; - self.think = FlagThink; - self.touch = FlagTouch; - self.nextthink = time + 0.1; - self.cnt = FLAG_BASE; - self.mangle = self.angles; - self.effects = self.effects | EF_DIMLIGHT; - if (!droptofloor(0, 0)) - { - dprint("Flag fell out of level at ", vtos(self.origin), "\n"); - remove(self); - return; - } - self.oldorigin = self.origin; -}; - -void(entity e) RegenFlag = -{ - e.movetype = MOVETYPE_TOSS; - e.solid = SOLID_TRIGGER; - // TODO: play a sound here - sound (e, CHAN_AUTO, self.noise3, 1, ATTN_NONE); - setorigin(e, e.oldorigin); - e.angles = e.mangle; - e.cnt = FLAG_BASE; - e.owner = world; - e.flags = FL_ITEM; // clear FL_ONGROUND and any other junk -}; - -void(entity e) ReturnFlag = -{ - if (e.owner) - if (e.owner.flagcarried == e) - e.owner.flagcarried = world; - e.owner = world; - RegenFlag(e); -}; - -/*void(entity e) DropFlag = // Gold - using TF function for this one :x -{ - local entity p; - - if (!e.owner) - { - dprint("FLAG: drop - no owner?!?!\n"); - return; - } - p = e.owner; - if (p.flagcarried != e) - { - dprint("FLAG: drop - owner is not carrying this flag??\n"); - return; - } - bprint(p.netname); - if (e.team == 5) - bprint(" lost the RED flag\n"); - else - bprint(" lost the BLUE flag\n"); - if (p.flagcarried == e) - p.flagcarried = world; - e.owner = world; - - e.flags = FL_ITEM; // clear FL_ONGROUND and any other junk - e.solid = SOLID_TRIGGER; - e.movetype = MOVETYPE_TOSS; - // setsize(e, '-16 -16 0', '16 16 74'); - setorigin(e, p.origin - '0 0 24'); - e.cnt = FLAG_DROPPED; - e.velocity = '0 0 300'; - e.pain_finished = time + 30; -};*/ - -void() FlagThink = -{ - local entity e; - local vector v; - local float f; - - self.nextthink = time + 0.1; - - if (self.cnt == FLAG_BASE) - return; - - if (self.cnt == FLAG_DROPPED) - { - if (time > self.pain_finished) - { - if (self.team == 5) - bprint("The RED flag has returned to base\n"); - else - bprint("The BLUE flag has returned to base\n"); - ReturnFlag(self); - } - return; - } - - e = self.owner; - if (e.classname != "player" || (e.deadflag) || (e.flagcarried != self)) - { - DropFlag(self); - return; - } - - // borrowed from threewave CTF, because it would be way too much work - - makevectors (e.angles); - v = v_forward; - v_z = 0 - v_z; // reverse z - - f = 14; - /* - if (e.frame >= 29 && e.frame <= 40) - { - if (e.frame >= 29 && e.frame <= 34) - { - //axpain - if (e.frame == 29) f = f + 2; - else if (e.frame == 30) f = f + 8; - else if (e.frame == 31) f = f + 12; - else if (e.frame == 32) f = f + 11; - else if (e.frame == 33) f = f + 10; - else if (e.frame == 34) f = f + 4; - } - else if (e.frame >= 35 && e.frame <= 40) - { - // pain - if (e.frame == 35) f = f + 2; - else if (e.frame == 36) f = f + 10; - else if (e.frame == 37) f = f + 10; - else if (e.frame == 38) f = f + 8; - else if (e.frame == 39) f = f + 4; - else if (e.frame == 40) f = f + 2; - } - } - else if (e.frame >= 103 && e.frame <= 118) - { - if (e.frame >= 103 && e.frame <= 104) f = f + 6; //nailattack - else if (e.frame >= 105 && e.frame <= 106) f = f + 6; //light - else if (e.frame >= 107 && e.frame <= 112) f = f + 7; //rocketattack - else if (e.frame >= 112 && e.frame <= 118) f = f + 7; //shotattack - } - */ - self.angles = e.angles + '0 0 -45'; - setorigin (self, e.origin + '0 0 -16' - f*v + v_right * 22); - self.nextthink = time + 0.01; -}; - -float flagcaptimerecord; -.float flagpickuptime; - -void() FlagTouch = -{ - local float t; - local entity head; - if (other.classname != "player") - return; - if (other.health < 1) // ignore dead players - return; - - if (self.cnt == FLAG_CARRY) - return; - - if (self.cnt == FLAG_BASE) - if (other.team == self.team) - if (other.flagcarried) // he's got a flag - if (other.flagcarried.team != self.team) // capture - { - t = time - other.flagpickuptime; - if (flagcaptimerecord == 0) - { - if (other.flagcarried.team == 5) - bprint(other.netname, " captured the RED flag in ", ftos(t), " seconds\n"); - else - bprint(other.netname, " captured the BLUE flag in ", ftos(t), " seconds\n"); - flagcaptimerecord = t; - } - else if (t < flagcaptimerecord) - { - if (other.flagcarried.team == 5) - bprint(other.netname, " captured the RED flag in ", ftos(t), ", breaking the previous record of", ftos(flagcaptimerecord), " seconds\n"); - else - bprint(other.netname, " captured the BLUE flag in ", ftos(t), ", breaking the previous record of", ftos(flagcaptimerecord), " seconds\n"); - flagcaptimerecord = t; - } - else - { - if (other.flagcarried.team == 5) - bprint(other.netname, " captured the RED flag in ", ftos(t), ", failing to break the previous record of", ftos(flagcaptimerecord), " seconds\n"); - else - bprint(other.netname, " captured the BLUE flag in ", ftos(t), ", failing to break the previous record of", ftos(flagcaptimerecord), " seconds\n"); - } - other.frags = other.frags + FLAGSCORE_CAPTURE; - head = find(head, classname, "player"); - while (head) - { - if (head.team == self.goalentity.team) - head.frags = head.frags + FLAGSCORE_CAPTURE_TEAM; - head = find(head, classname, "player"); - } - sound (self, CHAN_AUTO, self.noise2, 1, ATTN_NONE); - ReturnFlag(other.flagcarried); - } - if (self.cnt == FLAG_BASE) - if (other.team == 5 || other.team == 14) // only red and blue team can steal flags - if (other.team != self.team) - if (!other.flagcarried) - { - // pick up - other.flagpickuptime = time; // used for timing runs - self.solid = SOLID_NOT; - setorigin(self, self.origin); // relink - self.owner = other; - other.flagcarried = self; - self.cnt = FLAG_CARRY; - if (other.flagcarried.team == 5) - bprint(other.netname, " got the RED flag\n"); - else - bprint(other.netname, " got the BLUE flag\n"); - other.frags = other.frags + FLAGSCORE_PICKUP; - sound (self, CHAN_AUTO, self.noise, 1, ATTN_NONE); - return; - } - - if (self.cnt == FLAG_DROPPED) - { - self.flags = FL_ITEM; // clear FL_ONGROUND and any other junk - if (other.team == self.team || (other.team != 5 && other.team != 14)) - { - // return flag - if (self.team == 5) - bprint(other.netname, " returned the RED flag\n"); - else - bprint(other.netname, " returned the BLUE flag\n"); - if (other.team == 5 || other.team == 14) - other.frags = other.frags + FLAGSCORE_RETURN; - else - other.frags = other.frags + FLAGSCORE_RETURNROGUE; - sound (self, CHAN_AUTO, self.noise1, 1, ATTN_NONE); - ReturnFlag(self); - } - else if (!other.flagcarried) - { - // pick up - other.flagpickuptime = time; // used for timing runs - self.solid = SOLID_NOT; - setorigin(self, self.origin); // relink - self.owner = other; - other.flagcarried = self; - self.cnt = FLAG_CARRY; - if (self.team == 5) - bprint(other.netname, " picked up the RED flag\n"); - else - bprint(other.netname, " picked up the BLUE flag\n"); - other.frags = other.frags + FLAGSCORE_PICKUP; - sound (self, CHAN_AUTO, self.noise, 1, ATTN_NONE); - } - } -}; - -/*QUAKED info_player_team1 (1 0 0) (-16 -16 -24) (16 16 24) -CTF Starting point for a player -in team one (Red). - -Keys: -"angle" - viewing angle when spawning -*/ -//void() info_player_team1 = {};//self.team = 4;self.classname = "info_player_start";info_player_start();}; - -/*QUAKED info_player_team2 (1 0 0) (-16 -16 -24) (16 16 24) -CTF Starting point for a player in -team two (Blue). - -Keys: -"angle" - viewing angle when spawning -*/ -//void() info_player_team2 = {};//self.team = 13;self.classname = "info_player_start";info_player_start();}; - -/*QUAKED item_flag_team1 (0 0.5 0.8) (-48 -48 -24) (48 48 64) -CTF flag for team one (Red). -Multiple are allowed. - -Keys: -"angle" - Angle the flag will point -(minus 90 degrees) -"model" - model to use, note this needs red and blue as skins 0 and 1 - (default models/ctf/flag.md3) -"noise" - sound played when flag is picked up - (default ctf/take.wav) -"noise1" - sound played when flag is returned by a teammate - (default ctf/return.wav) -"noise2" - sound played when flag is captured - (default ctf/capture.wav) -"noise3" - sound played when flag is lost in the field and respawns itself - (default ctf/respawn.wav) -*/ - -/*void() item_flag_team1 = -{ - if (!cvar("g_ctf")) - return; - self.team = 5; // color 4 team (red) - self.items = IT_KEY2; // gold key (redish enough) - self.skin = 0; - if (!self.model) - self.model = "models/ctf/flag.md3"; - if (!self.noise) - self.noise = "ctf/take.wav"; - if (!self.noise1) - self.noise1 = "ctf/return.wav"; - if (!self.noise2) - self.noise2 = "ctf/capture.wav"; - if (!self.noise3) - self.noise3 = "ctf/respawn.wav"; - precache_model (self.model); - setmodel (self, self.model); - precache_sound (self.noise); - precache_sound (self.noise1); - precache_sound (self.noise2); - precache_sound (self.noise3); - setsize(self, '-16 -16 0', '16 16 74'); - self.nextthink = time + 0.2; // start after doors etc - self.think = place_flag; -}; -*/ - -/*QUAKED item_flag_team2 (0 0.5 0.8) (-48 -48 -24) (48 48 64) -CTF flag for team two (Blue). -Multiple are allowed. - -Keys: -"angle" - Angle the flag will point -(minus 90 degrees) - -*/ - -/* -void() item_flag_team2 = -{ - if (!cvar("g_ctf")) - return; - self.team = 14; // color 13 team (blue) - self.items = IT_KEY1; // silver key (bluish enough) - self.skin = 1; - if (!self.model) - self.model = "models/ctf/flag.md3"; - if (!self.noise) - self.noise = "ctf/take.wav"; - if (!self.noise1) - self.noise1 = "ctf/return.wav"; - if (!self.noise2) - self.noise2 = "ctf/capture.wav"; - if (!self.noise3) - self.noise3 = "ctf/respawn.wav"; - precache_model (self.model); - setmodel (self, self.model); - precache_sound (self.noise); - precache_sound (self.noise1); - precache_sound (self.noise2); - precache_sound (self.noise3); - setsize(self, '-16 -16 0', '16 16 74'); - self.nextthink = time + 0.2; // start after doors etc - self.think = place_flag; -}; -*/ diff --git a/attic/TeamNexuiz/game/gamec/defs.h b/attic/TeamNexuiz/game/gamec/defs.h deleted file mode 100644 index ffc2aa644..000000000 --- a/attic/TeamNexuiz/game/gamec/defs.h +++ /dev/null @@ -1,255 +0,0 @@ - -// Globals - -entity activator; -string string_null; - -//entity casing; -//entity dest; - -// Fields - -.void(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) event_damage; - -//.string wad; -//.string map; - -//.float worldtype; -.float delay; -.float wait; -.float lip; -//.float light_lev; -.float speed; -//.float style; -//.float skill; - -.string killtarget; - -.vector pos1, pos2; -.vector mangle; - -.float jump_flag; // storing velocity_z for falling damage -.float attack_finished; -.float pain_finished; //Added by Supajoe -.float pain_frame; //" -.float statdraintime; // record the one-second intervals between draining health and armour when they're over 100 -.float crouch; // Crouching or not? - -.float strength_finished; -//.float speed_finished; -.float invincible_finished; -//.float slowmo_finished; - -.vector finaldest, finalangle; //plat.qc stuff -.void() think1; -.float state; -.float t_length, t_width; - -.vector dest1; -.vector dest2; -.vector destvec; // for rain -.float cnt; // for rain -.float count; -//.float cnt2; - -.float death_time; -.float dead_time; -.float dead_frame; -.float die_frame; -.float fade_time; -.float fade_rate; - -.string mdl; - -.string playermodel; -.string playerskin; - -.float respawntime; -//.float chasecam; - -.float electrocount; -//.float crylinkcount; - -.float damageforcescale; - -//.float gravity; - -.float dmg; - -// for railgun damage (hitting multiple enemies) -.float railgunhit; -.float railgunhitsolidbackup; -.vector railgunhitloc; - -.float air_finished; -.float dmgtime; - -.float killcount; - -// definistions for weaponsystem - -.entity weaponentity; -.entity exteriorweaponentity; -.float switchweapon; -void(float wpn, float wrequest) weapon_action; -float(entity cl, float wpn, float andammo) client_hasweapon; -void() w_clear; -// VorteX: standalone think for weapons, so normal think on weaponentity can be reserved by weaponflashes (which needs update even player dies) -.float weapon_nextthink; -.void() weapon_think; -.vector shotdir, shotorg; // new generic aiming system for all weapons (not finished yet, can be removed) -float weapon_hasammo; // sets by WR_CHECKAMMO request - -//float PLAYER_WEAPONSELECTION_DELAY = ); -float PLAYER_WEAPONSELECTION_SPEED = 18; -vector PLAYER_WEAPONSELECTION_RANGE = '0 20 -40'; - -// weapon states (self.weaponentity.state) -float WS_CLEAR = 0; // no weapon selected -float WS_RAISE = 1; // raise frame -float WS_DROP = 2; // deselecting frame -float WS_INUSE = 3; // fire state -float WS_READY = 4; // idle frame - -// weapon requests -float WR_SETUP = 1; // setup weapon data -float WR_UPDATECOUNTS = 2; // update ammo display -float WR_IDLE = 3; // idle frame -float WR_DROP = 4; // deselect frame -float WR_RAISE = 5; // select frame -float WR_FIRE1 = 6; // primary fire frame -float WR_FIRE2 = 7; // secondary fire -float WR_FIRE3 = 8; // third fire -float WR_CHECKAMMO = 9; // checks ammo for weapon -float WR_CLEAR = 10; // runs afted deselecting frames, remove weapon parts (if presented). This useful for quake3-style chaingun - -// not part of weapon requests, but almost was, thus the naming convention -float WR_GRENADE1 = 11; -float WR_GRENADE2 = 12; - -// Weapon indexes -float WEP_LASER = 1; // float IT_LASER = 4096; -float WEP_SHOTGUN = 2; // float IT_SHOTGUN = 1; -float WEP_UZI = 3; // float IT_UZI = 2; -float WEP_GRENADE_LAUNCHER = 4; // float IT_GRENADE_LAUNCHER = 4; -float WEP_ELECTRO = 5; // float IT_ELECTRO = 8; -float WEP_CRYLINK = 6; // float IT_CRYLINK = 16; -float WEP_NEX = 7; // float IT_NEX = 32; -float WEP_HAGAR = 8; // float IT_HAGAR = 64; -float WEP_ROCKET_LAUNCHER = 9; // float IT_ROCKET_LAUNCHER = 128; -float WEP_BOMBLETTS = 10; -float WEP_ROCKET_INCENDIARY = 11; -float WEP_FLAMER = 12; -float WEP_HOTBOMBS = 13; -float WEP_GRAPPLE = 14; -float WEP_NAMEK = 15; -float WEP_RAILGUN = 16; -float WEP_HEALGUN = 17; -float WEP_MAC = 18; -float WEP_PISTOL = 19; - -float WEP_SCOUT_SPECIAL = 50; -float WEP_SPY_SPECIAL = 51; -float WEP_SOLDIER_SPECIAL = 52; -float WEP_PYRO_SPECIAL = 53; -float WEP_MEDIC_SPECIAL = 54; -float WEP_ENGINEER_SPECIAL = 55; - -float WEP_GRENADE_MIRV = 60; -float WEP_GRENADE_FRAG = 61; - -float WEP1 = 1; -float WEP2 = 2; -float WEP3 = 3; -float WEP4 = 4; -float WEP5 = 5; - -// For weapon cycling commands -float WEP_FIRST = 1; -float WEP_LAST = 5;//9; - - - - - - - -// class definitions -// (TF-numbered class defs in tfdefs.c) -float CLASS_SCOUT = 1; -float CLASS_SPY = 2; -float CLASS_SOLDIER = 4; -float CLASS_PYRO = 8; -float CLASS_MEDIC = 16; -float CLASS_ENGINEER = 32; -float CLASS_CIVILIAN = 64; - -.float team_no; - -.float class; -.float max_health; -.float max_armor; -.float mass; -.float wpn; // the weapon that's in the slot I've selected -.entity wpn5; // what weapon I'm holding in my extra (5th) slot -//.float oldclass; -.string change_mdl_on_respawn; // for changing class after death - -.float special_active; -.float special_time; - -.float grenade_time; - -.float jump_pad; // true if just hit a jump pad (don't slow player when jump pads launch him) - -.entity onfire; // world if not on fire, otherwise points to entity burning you -.float flame_heat; // starts at 0. Being near someone on fire raises it. When it hits 1, the flame spreads to you. -.float flame_heat_time; // set when near a fire so code elsewhere knows to heat up instead of cool down - -.float poison_damage; // total damage poison will deal over time -.float poison_rate; // how fast to deal the poison - -.float create_time; // tracks the time an entity was created to we can know which - // is the oldest when limiting the player's # of turrets or - // hotbombs, for example - - -.float buttonuse; // 1 if player is using +use - - -// health regen/rot -.float health_regen_delay; -.float health_rot_delay; -.float armor_regen_delay; -.float armor_rot_delay; - -void DelayHealthRegen(entity e); -void DelayHealthRot(entity e); -void DelayArmorRegen(entity e); -void DelayArmorRot(entity e); - - -// grappling hook -.entity hook; -void GrapplingHookFrame(); -void RemoveGrapplingHook(entity pl); - - - -string NameOfClass(float cl); -float GetPlayerClass(); -void ResetPlayerModel(entity pl); -void SetPlayerSpeed(entity pl); - - -// entity limiting function, to limit # of bombs etc a player can have. -float W_LimitNumEnts(string clname, float num_allowed, void() DeathFunc); - -// functions to let players cross lasergates -void PlayerLasergatePreThink(); -void PlayerLasergatePostThink(); - -void SpyCloakFlicker(entity pl); - -// BH Test Var -.float air_time; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/domination.c b/attic/TeamNexuiz/game/gamec/domination.c deleted file mode 100644 index 21e6b9982..000000000 --- a/attic/TeamNexuiz/game/gamec/domination.c +++ /dev/null @@ -1,239 +0,0 @@ - -/* -Domination as a plugin for netquake mods -by LordHavoc (lordhavoc@ghdigital.com) - -How to add domination points to a mod: -1. Add this line to progs.src above world.qc: -domination.qc -2. Comment out all lines in ClientObituary in client.qc that begin with targ.frags or attacker.frags. -3. Add this above worldspawn in world.qc: -void() dom_init; -4. Add this line to the end of worldspawn in world.qc: -dom_init(); - -Note: The only teams who can use dom control points are identified by dom_team entities (if none exist these default to red and blue and use only quake models/sounds). -*/ - -void() dom_spawnteams; - -void() dompointthink = -{ - local entity head; - self.nextthink = time + 3; - if (!self.goalentity.netname) - return; - head = find(head, classname, "player"); - while (head) - { - if (head.team == self.goalentity.team) - head.frags = head.frags + 1; - head = find(head, classname, "player"); - } -}; - -void() dompointtouch = -{ - local entity head; - if (other.classname != "player") - return; - if (other.health < 1) - return; - // only valid teams can claim it - head = find(world, classname, "dom_team"); - while (head && head.team != other.team) - head = find(head, classname, "dom_team"); - if (!head || head.netname == "" || head == self.goalentity) - return; - - self.goalentity = head; - self.model = head.mdl; - self.modelindex = head.dmg; - self.skin = head.skin; - - bprint(head.message); - bprint("\n"); - - if (head.noise != "") - sound(self, CHAN_BODY, head.noise, 1, ATTN_NORM); - if (head.noise1 != "") - sound(self, CHAN_VOICE, head.noise1, 1, ATTN_NONE); -}; - -/*QUAKED dom_team (0 .5 .8) (-16 -16 -24) (16 16 32) -Team declaration for Domination gameplay, this allows you to decide what team -names and control point models are used in your map. - -Note: If you use dom_team entities you must define at least 3 and only two -can have netname set! The nameless team owns all control points at start. - -Keys: -"netname" - Name of the team (for example Red, Blue, Green, Yellow, Life, Death, etc) -"cnt" - Scoreboard color of the team (for example 4 is red and 13 is blue) -"model" - Model to use for control points owned by this team (for example - "progs/b_g_key.mdl" is a gold keycard, and "progs/b_s_key.mdl" is a silver - keycard) -"skin" - Skin of the model to use (for team skins on a single model) -"noise" - Sound to play when this team captures a point. - (this is a localized sound, like a small alarm or other effect) -"noise1" - Narrator speech to play when this team captures a point. - (this is a global sound, like "Red team has captured a control point") -"message" - Message to show when a team captures a point - (for example "Red team has captured a control point", or - "The forces of light have captured a mana well") -*/ - -void() dom_team = -{ - precache_model(self.model); - if (self.noise != "") - precache_sound(self.noise); - if (self.noise1 != "") - precache_sound(self.noise1); - self.classname = "dom_team"; - setmodel(self, self.model); - self.mdl = self.model; - self.dmg = self.modelindex; - self.model = ""; - self.modelindex = 0; - // this would have to be changed if used in quakeworld - self.team = self.cnt + 1; -}; - -void() dom_controlpoint_setup = -{ - local entity head; - // find the dom_team representing unclaimed points - head = find(world, classname, "dom_team"); - while(head && head.netname != "") - head = find(head, classname, "dom_team"); - if (!head) - objerror("no dom_team with netname \"\" found\n"); - - // copy important properties from dom_team entity - self.goalentity = head; - setmodel(self, head.mdl); - self.skin = head.skin; - - self.think = dompointthink; - self.nextthink = time; - self.touch = dompointtouch; - self.solid = SOLID_TRIGGER; - setsize(self, '-16 -16 -24', '16 16 32'); - setorigin(self, self.origin); - droptofloor(0, 0); -}; - -/*QUAKED dom_controlpoint (0 .5 .8) (-16 -16 -24) (16 16 32) -Control point for Domination gameplay. -*/ -void() dom_controlpoint = -{ - self.think = dom_controlpoint_setup; - self.nextthink = time + 0.1; -}; - -// code from here on is just to support maps that don't have control point and team entities -void(string teamname, float teamcolor, string pointmodel, float pointskin, string capsound, string capnarration, string capmessage) dom_spawnteam = -{ - local entity oldself; - oldself = self; - self = spawn(); - self.classname = "dom_team"; - self.netname = teamname; - self.cnt = teamcolor; - self.model = pointmodel; - self.skin = pointskin; - self.noise = capsound; - self.noise1 = capnarration; - self.message = capmessage; - - // this code is identical to dom_team - setmodel(self, self.model); - self.mdl = self.model; - self.dmg = self.modelindex; - self.model = ""; - self.modelindex = 0; - // this would have to be changed if used in quakeworld - self.team = self.cnt + 1; - - //eprint(self); - self = oldself; -}; - -void(vector org) dom_spawnpoint = -{ - local entity oldself; - oldself = self; - self = spawn(); - self.classname = "dom_controlpoint"; - self.think = dom_controlpoint; - self.nextthink = time; - self.origin = org; - dom_controlpoint(); - self = oldself; -}; - -void() dom_spawnteams = -{ - // LordHavoc: edit this if you want to change defaults - dom_spawnteam("Red", 4, "models/domination/dom_red.md3", 0, "domination/claim.wav", "", "Red team has captured a control point"); - dom_spawnteam("Blue", 13, "models/domination/dom_blue.md3", 0, "domination/claim.wav", "", "Blue team has captured a control point"); - dom_spawnteam("Green", 3, "models/domination/dom_green.md3", 0, "domination/claim.wav", "", "Green team has captured a control point"); - dom_spawnteam("Yellow", 12, "models/domination/dom_yellow.md3", 0, "domination/claim.wav", "", "Yellow team has captured a control point"); - dom_spawnteam("", 0, "models/domination/dom_unclaimed.md3", 0, "", "", ""); -}; - -void() dom_delayedinit = -{ - local entity head; - // if no teams are found, spawn defaults - if (find(world, classname, "dom_team") == world) - dom_spawnteams(); - // if no control points are found, spawn defaults - if (find(world, classname, "dom_controlpoint") == world) - { - // here follow default domination points for each map - /* - if (world.model == "maps/e1m1.bsp") - { - dom_spawnpoint('0 0 0'); - } - else - */ - { - // if no supported map was found, make every deathmatch spawn a point - head = find(world, classname, "info_player_deathmatch"); - while (head) - { - dom_spawnpoint(head.origin); - head = find(head, classname, "info_player_deathmatch"); - } - } - } -}; - -void() dom_init = -{ - local entity e; - // we have to precache default models/sounds even if they might not be - // used because worldspawn is executed before any other entities are read, - // so we don't even know yet if this map is set up for domination... - precache_model("models/domination/dom_red.md3"); - precache_model("models/domination/dom_blue.md3"); - precache_model("models/domination/dom_green.md3"); - precache_model("models/domination/dom_yellow.md3"); - precache_model("models/domination/dom_unclaimed.md3"); - precache_sound("domination/claim.wav"); - e = spawn(); - e.think = dom_delayedinit; - e.nextthink = time + 0.1; -}; - diff --git a/attic/TeamNexuiz/game/gamec/engineer.c b/attic/TeamNexuiz/game/gamec/engineer.c deleted file mode 100644 index 97a9d7ad2..000000000 --- a/attic/TeamNexuiz/game/gamec/engineer.c +++ /dev/null @@ -1,1053 +0,0 @@ -.float option; -.float has_mine; -.void (entity enty) th_use; -void () MagnetMineTouch; -void () MagTimer; -void () RemoveMagnetMine; -//tesla -void () Tesla_Die; -void () Tesla_Pain; -void () Tesla_Idle; -void () Tesla_Touch; -// metal extractor -void () Extractor_Idle; -void () Extractor_Die; -void (entity enty) Engineer_UseExtractor; - -void() SUB_NULL = {}; - -//temp -void (entity bld) CheckBelowBuilding; -void (entity gunhead) CheckSentry; -void () Sentry_Rotate; -float () Sentry_FindTarget; -void () Sentry_FoundTarget; -void () Sentry_HuntTarget; -void () Sentry_Pain; -void () Sentry_Die; - -void EngineerSpecial() -{ - if (self.current_menu == MENU_ENGINEER_BUILD) - { - ResetMenu (); - } - else - { - ResetMenu (); - self.current_menu = MENU_ENGINEER_BUILD; - } - - // sprint(self, "Not done yet\n"); - // this is gonna contain build menu eventually -}; - -/*========================== - TF Engineer Build Function - =========================*/ -void(entity gunhead) CheckSentry = -{ - local vector dist; - local entity gunbase; - gunbase = gunhead.trigger_field; - dist = gunbase.origin - gunhead.origin; - if (vlen(dist) > 15) - { - bprint(self.real_owner.netname); - bprint("'s sentry gun malfunctioned\n"); - Sentry_Die(); - } -}; - -void () TeamFortress_EngineerBuild = -{ - local entity te; - - if ((self.is_building == 0)) - { -// if ((((self.ammo_cells < 100) && (self.has_dispenser == 0)) && (self.has_sentry == 0))) -// { -// CenterPrint (self, "You don't have enough metal to \nbuild anything.\n\n"); -// return; -// } - self.current_menu = 15; - self.menu_count = 25; - } - else - { - if ((self.is_building == 1)) - { - sprint (self, "You stop building.\n"); - - if (self.weaponentity.pos1 != '0 0 0') - { - self.reload_time = time; - self.weaponentity.pos1 = '0 0 0'; - self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED; - } - - self.pausetime = 0; - self.tfstate = (self.tfstate - (self.tfstate & 65536)); - TeamFortress_SetSpeed (self); - te = find (world, netname, "build_timer"); - while (te) - { - if ((te.owner == self)) - { - dremove (te); - te = world; - } - else - { - te = find (te, netname, "build_timer"); - } - } - self.is_building = 0; -// self.current_weapon = self.weapon; // add function to make weapon disappear? - W_SetCurrentAmmo (); - } - } -}; - -float(entity obj, entity builder) CheckArea = -{ - local vector src; - local vector end; - local float pos; - pos = pointcontents(obj.origin); - if (pos == -2 || pos == -6) - { - return 0; - } - src_x = obj.origin_x + obj.maxs_x + 16; - src_y = obj.origin_y + obj.maxs_y + 16; - src_z = obj.origin_z + obj.maxs_z + 16; - pos = pointcontents(src); - if (pos == -2 || pos == -6) - { - return 0; - } - end_x = obj.origin_x + obj.mins_x - 16; - end_y = obj.origin_y + obj.mins_y - 16; - end_z = obj.origin_z + obj.mins_z - 16; - traceline(src, end, 1, obj); - if (trace_fraction != 1) - { - return 0; - } - pos = pointcontents(end); - if (pos == -2 || pos == -6) - { - return 0; - } - src_x = obj.origin_x + obj.mins_x - 16; - src_y = obj.origin_y + obj.maxs_y + 16; - src_z = obj.origin_z + obj.maxs_z + 16; - pos = pointcontents(src); - if (pos == -2 || pos == -6) - { - return 0; - } - end_x = obj.origin_x + obj.maxs_x + 16; - end_y = obj.origin_y + obj.mins_y - 16; - end_z = obj.origin_z + obj.mins_z - 16; - traceline(src, end, 1, obj); - if (trace_fraction != 1) - { - return 0; - } - pos = pointcontents(end); - if (pos == -2 || pos == -6) - { - return 0; - } - traceline(builder.origin, obj.origin, 1, builder); - if (trace_fraction != 1) - { - return 0; - } - return 1; -}; - -void(float objtobuild) TeamFortress_Build = -{ - if (self.is_building == 1) { // double-checks incase someone uses code with TeamFortress_EngineerBuild(number) - TeamFortress_EngineerBuild(); - return; - } - if ((self.reload_time + .25) > time) { - sprint(self, "You cant build while reloading.\n"); - return; - } - - local float btime; - local vector tmp1; - local vector tmp2; - newmis = spawn(); - makevectors(self.v_angle); - v_forward_z = 0; - v_forward = normalize(v_forward) * 64; - newmis.origin = self.origin + v_forward; - if (objtobuild == 1) - { - if (self.has_dispenser) - { - sprint(self, "You can only have one dispenser.\nTry dismantling your old one.\n"); - return; - } - tmp1 = '-16 -16 0'; - tmp2 = '16 16 24'; - newmis.mdl = "progs/dispencr.mdl"; - newmis.netname = "dispenser"; - btime = time + 2; - } - else - { - if (objtobuild == 2) - { - if (self.has_sentry) - { - sprint(self, "You can only have one sentry gun.\nTry dismantling your old one.\n"); - return; - } - tmp1 = '-16 -16 0'; - tmp2 = '16 16 48'; -// newmis.mdl = "progs/turrbase.mdl"; - newmis.mdl = "models/sentry/turr1_base.md3"; -// newmis.scale = .75; - newmis.netname = "sentrygun"; -// btime = time + 5; - btime = .1; - } - if ((objtobuild == 3)) - { - if (self.has_tesla) - { - sprint (self, "You can only have one tesla gun\n"); - return; - } - tmp1 = '-16 -16 0'; - tmp2 = '16 16 48'; - newmis.mdl = "models/engineer/tesla/tesla.md3"; - newmis.scale = .70; //temp -- morphed's models too freaking huge :x - - newmis.netname = "tesla"; - btime = (time + 6); - } -// Begin telepad 1 - if (objtobuild == 5) - { - if (self.has_teleporter >= 2) - { - sprint(self, "You can only have 2 teleporters.\nTry dismantling an old one.\n"); - dremove(newmis); - return; - } - tmp1 = '-16 -16 0'; - tmp2 = '16 16 4'; - newmis.mdl = "progs/telepad.mdl"; - newmis.netname = "teleporter"; - - btime = time + 3; - } - if (objtobuild == 6) - { - if (self.has_extractor >= 3) - { - sprint(self, "You can only have 3 metal extractors.\nTry dismantling an old one.\n"); - dremove(newmis); - return; - } - //check if it's near another allied extractor unit - local entity isnearextractor; - isnearextractor = findradius (newmis.origin, BUILDING_EXTRACTOR_CHECKRADIUS); - while (isnearextractor) - { - if (isnearextractor.classname == "building_extractor" && isnearextractor.team_no == self.team_no) - { - sprint (self, "You cannot build so close to another extractor.\n"); - dremove(newmis); - return; - } - isnearextractor = isnearextractor.chain; - } - - tmp1 = '-16 -16 0'; - tmp2 = '16 16 48'; - newmis.mdl = "models/engineer/metal_extractor/power.md3"; - //newmis.mdl = "progs/extractor.md3"; - newmis.netname = "extractor"; - - btime = time + 5; - } -// End telepad 1 - } - if (CheckArea(newmis, self) == 0) - { - sprint(self, "Not enough room to build here\n"); - dremove(newmis); - return; - } - self.is_building = 1; - self.immune_to_check = time + 10; -// self.maxspeed = 0; // make sure player cant move - self.tfstate = self.tfstate | 65536; -/* self.weapon = self.current_weapon; // get rid of player's weapon model - self.current_weapon = 0; - self.weaponmodel = ""; - self.weaponframe = 0;*/ -// TeamFortress_SetSpeed(self); // hmm? player cant move? - newmis.owner = self; - newmis.classname = "timer"; - newmis.netname = "build_timer"; - newmis.nextthink = btime; - newmis.think = TeamFortress_FinishedBuilding; - newmis.colormap = self.colormap; - newmis.weapon = objtobuild; - newmis.angles_y = anglemod(self.angles_y + 180); - newmis.velocity = '0 0 8'; - newmis.movetype = 6; - newmis.solid = 2; - newmis.alpha = .1; // slightly invisible - self.effects = self.effects | EF_ADDITIVE; - setmodel(newmis, newmis.mdl); - setsize(newmis, tmp1, tmp2); - setorigin(newmis, newmis.origin); - newmis.flags = newmis.flags - (newmis.flags & 512); - - self.velocity = '0 0 0'; // stop player movement - DoReload (5, (btime - time)); // Engineer build function shared with reload one - // 5 is for building, btime minus time is for build time -}; - -void(entity bld) CheckBelowBuilding = -{ - local vector below; - below = bld.origin; - if (bld.classname == "detpack") - { - below_z = below_z - 8; - } - else - { - below_z = below_z - 24; - } - traceline(bld.origin, below, 1, bld); - if (trace_fraction == 1) - { - bld.movetype = 6; - bld.flags = bld.flags - (bld.flags & 512); - } -}; - -void () Tesla_Animate; -void() TeamFortress_FinishedBuilding = -{ - local entity oldself; - - if (self.owner.is_building != 1) - { - return; - } - oldself = self; - self = self.owner; - oldself.owner = world; - oldself.real_owner = self; - self.is_building = 0; - self.tfstate = self.tfstate - (self.tfstate & 65536); - self.current_weapon = self.weapon; - self.StatusRefreshTime = time + 0.1; - TeamFortress_SetSpeed(self); - oldself.alpha = 1; // un-do see-through effect -/* if (oldself.weapon == 1) - { - self.has_dispenser = 1; - sprint(self, "You finish building the dispenser.\n"); - teamsprint(self.team_no, self, self.netname); - teamsprint(self.team_no, self, " has built a Dispenser.\n"); - self.ammo_cells = self.ammo_cells - 100; - oldself.classname = "building_dispenser"; - oldself.netname = "dispenser"; - oldself.blocked = T_Dispenser; - oldself.touch = T_Dispenser; - oldself.max_health = 150; - oldself.health = 150; - oldself.think = DispenserThink; - oldself.nextthink = time + 5; - oldself.th_die = Dispenser_Die; - oldself.mdl = "progs/dispencr.mdl"; - oldself.team_no = self.team_no; - oldself.real_owner = self; - oldself.colormap = self.colormap; - oldself.takedamage = 2; - oldself.owner = world; - oldself.movetype = 6; - oldself.velocity = '0 0 8'; - oldself.flags = oldself.flags - (oldself.flags & 512); - oldself.ammo_shells = ceil(self.ammo_shells * 0.25); - oldself.ammo_nails = ceil(self.ammo_nails * 0.25); - oldself.ammo_rockets = ceil(self.ammo_rockets * 0.25); - oldself.ammo_cells = ceil(self.ammo_cells * 0.25); - oldself.armorvalue = ceil(self.armorvalue * 0.25); - self.ammo_shells = ceil(self.ammo_shells * 0.75); - self.ammo_nails = ceil(self.ammo_nails * 0.75); - self.ammo_rockets = ceil(self.ammo_rockets * 0.75); - self.ammo_cells = ceil(self.ammo_cells * 0.75); - self.armorvalue = ceil(self.armorvalue * 0.75); - oldself.solid = 2; - setmodel(oldself, oldself.mdl); - //setsize(oldself, '-8 -8 0', '8 8 24');gold. commented out.. plexi's idea :j - setorigin(oldself, oldself.origin); - } - else - {*/ - if (oldself.weapon == 2) - { - local entity barrel; - barrel = spawn(); -// barrel.mdl = "models/sentry/turr1_base.md3"; -// barrel.mdl = "models/sentry/turr1_barrel.md3"; -// barrel.scale = .75; - //barrel.solid = 2; - -// barrel.angles_x = barrel.angles_x - 70; - -// barrel.angles_z = barrel.angles_z - 90; -/* barrel.angles_x = 0; - barrel.angles_y = oldself.angles_y; - barrel.angles_z = 0;*/ -// barrel.movetype = 4; -// barrel.movetype = MOVETYPE_FOLL`OW; - barrel.yaw_speed = 10; -// barrel.angles_z = barrel.angles_z - 45; - setmodel(barrel, "models/sentry/turr1_barrel.md3"); -// setsize(barrel, '-16 -16 0', '16 16 48'); // temp //'d -// setorigin(barrel, oldself.origin + '0 0 8'); - setorigin(barrel, '0 0 0'); - - - self.has_sentry = 1; - sprint(self, "You finish building the sentry gun.\n"); - teamsprint(self.team_no, self, self.netname); - teamsprint(self.team_no, self, " has built a Sentry Gun.\n"); - oldself.classname = "building_sentrygun_base"; - oldself.netname = "sentry gun"; - oldself.takedamage = 0; - oldself.th_die = Sentry_Die; - self.ammo_cells = self.ammo_cells - 130; - setsize(oldself, '-16 -16 0', '16 16 4'); - newmis = spawn(); - newmis.classname = "building_sentrygun"; - newmis.health = 150; - newmis.max_health = newmis.health; - newmis.weapon = 1; - newmis.th_die = Sentry_Die; - newmis.th_pain = Sentry_Pain; -// newmis.mdl = "progs/turrgun.mdl"; - newmis.mdl = "models/sentry/turr1_body.md3"; -// newmis.scale = .75; - sound(oldself, 3, "weapons/tnkatck4.wav", 1, 1); - newmis.solid = 2; - setmodel(newmis, newmis.mdl); - setsize(newmis, '-16 -16 0', '16 16 48'); - setorigin(newmis, oldself.origin + '0 0 8'); - newmis.real_owner = oldself.real_owner; - newmis.trigger_field = oldself; - oldself.oldenemy = newmis; - newmis.movetype = 4; - oldself.colormap = self.colormap; - newmis.colormap = self.colormap; - newmis.takedamage = 2; - newmis.velocity = '0 0 -8'; - newmis.flags = newmis.flags - (newmis.flags & 512); - oldself.flags = oldself.flags - (oldself.flags & 512); - newmis.team_no = self.team_no; - newmis.think = lvl1_sentry_stand; - newmis.nextthink = time + 0.5; - newmis.yaw_speed = 10; - newmis.heat = 0; - newmis.angles_x = 0; -// newmis.angles_y = oldself.angles_y; - newmis.angles_y = oldself.angles_y; - newmis.angles_z = 0; - newmis.waitmin = anglemod(newmis.angles_y - 50); - newmis.waitmax = anglemod(newmis.angles_y + 50); - if (newmis.waitmin > newmis.waitmax) - { - newmis.waitmin = newmis.waitmax; - newmis.waitmax = anglemod(newmis.angles_y - 50); - } - newmis.ammo_shells = 25; - newmis.maxammo_shells = 100; - newmis.maxammo_rockets = 20; - - newmis.barrel_ent = barrel; - -// setattachment(newmis, oldself, "tag_base_body"); - setattachment(barrel, newmis, "tag_body_barrel"); - - - } - else - { -//tesla - if ((oldself.weapon == 3)) - { - self.has_tesla = 1; - sprint (self, "You finish building the tesla coil.\n"); - oldself.real_owner = self; - teamsprint (self.team_no, self, self.netname); - teamsprint (self.team_no, self, " has built a tesla.\n"); - sound (oldself, 3, "weapons/guerilla_set.wav", 1, 1); - oldself.classname = "building_tesla"; - oldself.netname = "tesla"; - oldself.takedamage = 2; - oldself.solid = 2; - oldself.th_die = Tesla_Die; - oldself.th_pain = Tesla_Pain; - self.ammo_cells = (self.ammo_cells - 150); - oldself.health = 200; - oldself.movetype = 6; - oldself.colormap = self.colormap; - oldself.velocity = '0 0 -8'; - oldself.avelocity = '0 0 0'; - oldself.flags = (oldself.flags - (oldself.flags & 512)); - oldself.team_no = self.team_no; - oldself.think = Tesla_Idle; - oldself.nextthink = (time + 2); - oldself.touch = Tesla_Touch; - oldself.enemy = world; - oldself.maxammo_shells = 0; - oldself.maxammo_nails = 0; - oldself.maxammo_rockets = 0; - oldself.max_health = 100; - oldself.ammo_cells = 50; - oldself.tf_items = 0; - /*if (!(self.weapons_carried & 8)) - { - oldself.ammo_shells = 2; - oldself.ammo_nails = 2; - oldself.ammo_rockets = 1; - oldself.currentammo = 5; - oldself.max_health = 200; - oldself.ammo_cells = 120; - }*/ - oldself.currentammo = 0; // 6 Upgrades. (6 minus this number is pgrade count) - oldself.health = oldself.max_health; - oldself.waitmin = ((oldself.ammo_shells + 2) * (oldself.ammo_nails + 2)); - oldself.waitmax = 0; - - // The tesla animator -- till I learn to be a better coder ;) - local entity tesanim; - tesanim = spawn(); - tesanim.owner = oldself; - tesanim.think = Tesla_Animate; - tesanim.nextthink = time; - } -// TELEPAD 2 BEGIN*/ - /*if (oldself.weapon == 5) - { - self.has_teleporter = (self.has_teleporter + 1); - sprint (self, "You finish building the Teleporter Pad.\n"); - -// teamprefixsprint(self.team_no,self); //- OfN - - teamsprint(self.team_no, self, self.netname); - teamsprint(self.team_no, self, " has built a Teleporter Pad.\n"); - sound (oldself, 3, "weapons/guerset.wav", 1, 1); - - self.ammo_cells = self.ammo_cells - 90; - - // Create the teleporter - oldself.classname = "building_teleporter"; - oldself.netname = "teleporter"; -// oldself.blocked = Teleporter_touch; // Actual touch function - oldself.touch = Teleporter_touch; - oldself.max_health = 300; - oldself.health = 300; - oldself.th_die = Teleporter_Die; // Death function - oldself.mdl = "progs/telepad.mdl"; // Actual mdl - oldself.team_no = self.team_no; - oldself.maxammo_cells = 200; //CH Max of 20 teleports - oldself.ammo_cells = 100; //CH start not at full - - oldself.real_owner = self; // The Engineer owns this item - oldself.colormap = self.colormap; // Set the Color - oldself.takedamage = 2; - oldself.owner = world; - oldself.movetype = 6; - oldself.velocity = '0 0 8'; - oldself.flags = oldself.flags - (oldself.flags & 512); - - oldself.solid = 2; - setmodel(oldself, oldself.mdl); - setsize (oldself, '-16 -16 0', '16 16 4'); - setorigin(oldself, oldself.origin + '0 0 8'); //CH does jump - - oldself.heat = 4; //dont come on for 4 seconds - oldself.think = Teleporter_heat_think; - oldself.nextthink = time + 1; - oldself.spawnflags = 4; //CH cause extensive checks for height - - oldself.is_malfunctioning = 0; - oldself.all_active=0; // OfN - reset HACKER improvements - } -// TELEPAD 2 END - }*/ - if (oldself.weapon == 6) // metal extractor - { - self.has_extractor = self.has_extractor + 1; - sprint (self, "You finish building the metal extractor.\n"); - oldself.real_owner = self; - teamsprint (self.team_no, self, self.netname); - teamsprint (self.team_no, self, " has built a metal extractor.\n"); - sound (oldself, 3, "weapons/guerilla_set.wav", 1, 1); - oldself.classname = "building_extractor"; - oldself.netname = "extractor"; - oldself.takedamage = 2; - oldself.solid = 2; - oldself.th_die = Extractor_Die; -// oldself.th_pain = Extractor_Pain; - self.ammo_cells = (self.ammo_cells - BUILDING_EXTRACTOR_NEEDCELLS); - oldself.health = 200; - oldself.movetype = 6; - oldself.colormap = self.colormap; - oldself.velocity = '0 0 -8'; - oldself.avelocity = '0 0 0'; - oldself.flags = (oldself.flags - (oldself.flags & 512)); - oldself.team_no = self.team_no; - oldself.think = Extractor_Idle; - oldself.nextthink = (time + 1); -// oldself.touch = Extractor_Touch; - oldself.enemy = world; - oldself.max_health = 100; - oldself.ammo_metal = 10; - oldself.th_use = Engineer_UseExtractor; - - oldself.currentammo = 0; // 6 Upgrades. (6 minus this number is pgrade count) - oldself.health = oldself.max_health; - oldself.waitmin = ((oldself.ammo_shells + 2) * (oldself.ammo_nails + 2)); - oldself.waitmax = 0; - - // The metal extractor animator(?) -// local entity tesanim; -// tesanim = spawn(); -// tesanim.owner = oldself; -// tesanim.think = Extractor_Animate; -// tesanim.nextthink = time; - } - } - W_SetCurrentAmmo(); -}; - - - - - -void () Drop_Magnetic_Mine = -{ - if (self.has_mine == 1) - { - sprint (self, "Hey, one mine at a time!\n"); - return; - } - - local entity item; - - item = spawn (); - item.team_no = self.team_no; - item.owner = self; - item.classname = "drop1"; - item.origin = (self.origin - '0 0 -10'); - -// item.angles_x = 360; - - item.angles_y = 45; - item.flags = 256; -// item.solid = 2; - item.solid = SOLID_TRIGGER; - item.movetype = 6; - - item.velocity = '0 0 1'; - setsize (item, '-1 -1 0', '1 1 6'); - - item.nextthink = (time + 180); - - item.touch = MagnetMineTouch; - setmodel (item, "models/magmine/magnetmine.md3"); - item.scale = .35; - - item.think = RemoveMagnetMine; - - item.pausetime = time + 2; - self.has_mine = 1; - sprint(self, "You set a Mag Mine!\n"); -} - -void EngineerGrenade(float req) -{ - if(req == WR_GRENADE1) - { - if(W_ThrowGrenade(W_ArmorGrenade)) - self.grenade_time = time + cvar("g_balance_grenade_armor_refire"); - } - else if(req == WR_GRENADE2) - { - Drop_Magnetic_Mine(); - self.grenade_time = time + 2; - } -} - -void EngineerPreThink() -{ -} - -void EngineerPostThink() -{ -} - -void BecomeEngineer(float portion) -{ - self.max_health = cvar("g_balance_class_engineer_health") * portion; - - self.max_armor = cvar("g_balance_class_engineer_armor") * portion; - - self.mass = cvar("g_balance_class_engineer_mass"); - - SetPlayerSpeed(self); - - self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4; - self.switchweapon = WEP2; - self.ammo_shells = floor(20 * portion); - self.ammo_nails = floor(20 * portion); - self.ammo_rockets = floor(1 * portion); - self.ammo_cells = floor(0 * portion); - self.playerclass = TF_CLASS_ENGINEER; // TF P.C. - SetMaxAmmoFor (32); -} - -// Magnetic Mine -void () RemoveMagnetMine = -{ - sprint (self.owner, "Your Mag Mine is gone...\n"); - self.owner.has_mine = 0; - dremove (self); - return; -}; - -void () MagTimer = -{ - local entity theowner; - local string st; - - theowner = self.owner; - theowner.option5 = (theowner.option5 - .5); - st = ftos (theowner.option5); -// sound (theowner, 0, "ambient/100hzhum.wav", 1, 1); // find new wav! :o - theowner.origin = self.origin; - CenterPrint2 (theowner, "You are stuck on a mag mine!\n", st); - if ((theowner.option5 < 2)) - { - theowner.option5 = 0; - sprint (theowner.enemy, "Your Mag Mine died...\n"); - theowner.enemy.has_mine = 0; - remove (self); - return; - } - self.nextthink = (time + .5); -}; - -void () MagMineActivate = -{ - if ((other.option == 0)) - { - self.owner.has_mine = 1; - newmis = spawn (); - newmis.classname = "timer"; - newmis.netname = " FlashTimer"; - newmis.team_no = self.owner.team_no; - newmis.owner = other; - other.enemy = self.owner; - newmis.think = MagTimer; - newmis.nextthink = (time + 1); - newmis.origin = other.origin; - } - other.option5 = (floor ((other.armorvalue * .25)) + 3); - if ((other.option5 > 15)) - { - other.option5 = 15; - } -}; - -void () RemoveDudMine = -{ - dremove(self); -} - -void () MagnetMineTouch = -{ - local float isgood; - local entity isnearplayer; - - isnearplayer = findradius (self.origin, 10); - while (isnearplayer) - { - if ((isnearplayer.classname == "player")) - { - isgood = 1; -// bprint (isnearplayer.classname); -// bprint ("\n"); -// return; - } - isnearplayer = isnearplayer.chain; - } - if (isgood != 1) - return; - - if ((self.pausetime > time)) - { - return; - } - if ((other.classname != "player")) - { - return; - } - if ((other.health <= 0)) - { - return; - } -// if ((other.is_undercover == 1)) //temp - add function!! -// { -// return; -// } - if ((other.team_no == self.owner.team_no)) - { - return; - } - if ((other.classname == "player")) - { - MagMineActivate (); - sprint (other, "You stepped on a Magnetic Mine! :(\n"); - sprint (self.owner, "Your Magnet Mine worked!\n"); - self.pausetime = (time + 5); - } - self.touch = SUB_NULL; - self.effects = EF_BRIGHTFIELD | EF_ADDITIVE; - self.think = RemoveDudMine; - self.nextthink = (time + 15); -// dremove (self); -}; - -// Checks the distance between the player and the object -void () CheckDistance = -{ - local vector dist; - - if (!(self.owner.building.classname == "building_tesla" && self.enemy.classname == "building_dispenser")) { - if (self.owner.building != self.enemy) - { - dremove (self); - return; - } } - dist = self.enemy.origin - self.owner.origin; -// if (vlen (dist) > 64) - if (vlen (dist) > 84) - { - CenterPrint (self.owner, "\n"); - self.owner.menu_count = 25; - self.owner.current_menu = 1; - self.owner.building = world; - dremove (self); - return; - } - self.nextthink = (time + 0.3); -}; - - -void (entity gun) Engineer_UseTesla = -{ - local entity dist_checker; - local string st; - - if ((gun.ammo_rockets == TF_FLARE_LIT)) - { - gun.maxammo_cells = 120; - } - else - { - if ((gun.ammo_rockets == TF_FLARE_OFF)) - { - gun.maxammo_cells = 120; - } - else - { - if ((gun.ammo_rockets == 2)) - { - gun.maxammo_cells = 200; - } - else - { - if ((gun.ammo_rockets == 3)) - { - gun.maxammo_cells = 300; - } - } - } - } - - sprint(self, "Èåáìôè:"); - st = ftos(gun.health); - sprint(self, st); - sprint(self, "¯"); - st = ftos(gun.max_health); - sprint(self, st); - sprint(self, " Ãåììó:"); - st = ftos(gun.ammo_cells); - sprint(self, st); - sprint(self, "¯"); - st = ftos(gun.maxammo_cells); - sprint(self, st); - st = ftos ((6 - gun.currentammo)); - sprint(self, " Õðçòáäåó Ìåæô:"); - sprint (self, st); - st = ftos ((6 - gun.currentammo)); - sprint (self, "\n"); - sprint(self, "Öïìôáçå:"); - st = ftos(gun.ammo_shells); - sprint(self, st); - sprint(self, " Áíðåòáçå:"); - st = ftos(gun.ammo_nails); - sprint(self, st); - sprint(self, " Ðï÷åò Óõððìù:"); - st = ftos(gun.ammo_rockets); - sprint(self, st); - sprint(self, "\n"); - if (gun.tf_items) - { - if ((gun.tf_items & 2)) - { - sprint (self, "TeslaTurret(tm) "); - } - if ((gun.tf_items & TF_FLARE_OFF)) - { - sprint (self, "Improved Targeter "); - } - if ((gun.tf_items & 1024)) - { - sprint (self, "Spy Detector"); - } - sprint (self, "\n"); - } - self.current_menu = 18; - self.menu_count = 25; - self.building = gun; - dist_checker = spawn (); - dist_checker.classname = "timer"; - dist_checker.owner = self; - dist_checker.enemy = gun; - dist_checker.think = CheckDistance; - dist_checker.nextthink = (time + 0.3); -}; - -void () button_fire; -// Engineer and Medic "USE" function -- called when user presses a key bound to +use -// replaces using wrench on sentry gun and buiaxe to heal. -void () Use_Function = -{ - if (self.impulse_wait > time) // So when the player holds down the use button it doesnt spam sprints - return; - self.impulse_wait = time + .5; // shared with gui menu .impulse_wait - - local vector source; - local vector org; - local entity te; - - makevectors (self.v_angle); - source = (self.origin + '0 0 16'); - traceline (source, (source + (v_forward * 64)), 0, self); - if ((trace_fraction == 1)) - { - return; - } - org = (trace_endpos - (v_forward * 4)); - if ((trace_ent.goal_activation & 8)) - { - if (Activated (trace_ent, self)) - { - DoResults (trace_ent, self, 1); - if ((trace_ent.classname == "func_button")) - { - trace_ent.enemy = self; - other = self; - self = trace_ent; - self.dont_do_triggerwork = 1; - button_fire (); - self = other; - } - } - else - { - if ((trace_ent.else_goal != 0)) - { - te = Findgoal (trace_ent.else_goal); - if (te) - { - DoResults (te, self, (trace_ent.goal_result & 2)); - } - } - else - { - sound (self, 1, "player/axhit2.wav", 1, 1); - WriteByte (4, 23); - WriteByte (4, 2); - WriteByte (4, 3); - WriteCoord (4, org_x); - WriteCoord (4, org_y); - WriteCoord (4, org_z); - } - } - return; - } -// if (trace_ent.takedamage) - if (trace_ent.th_use) - { - trace_ent.th_use(trace_ent); - return; - } - - if (trace_ent.classname != "player") - { - if ((trace_ent.classname == "building_dispenser")) - { - //Engineer_UseDispenser (trace_ent); - return; - } - else - { - if ((trace_ent.classname == "building_sentrygun")) - { - //Engineer_UseSentryGun (trace_ent); - return; - } - else - { - if ((trace_ent.classname == "building_sentrygun_base")) - { - if (trace_ent.oldenemy) - { - //Engineer_UseSentryGun (trace_ent.oldenemy); - } - return; - } - else - { - if ((trace_ent.classname == "building_tesla")) - { - Engineer_UseTesla (trace_ent); - return; - } - } - } - } - } -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/extensions.h b/attic/TeamNexuiz/game/gamec/extensions.h deleted file mode 100644 index 3aace7dcc..000000000 --- a/attic/TeamNexuiz/game/gamec/extensions.h +++ /dev/null @@ -1,976 +0,0 @@ - -//DarkPlaces supported extension list, draft version 1.04 - -//checkextension function -//idea: expected by almost everyone -//darkplaces implementation: LordHavoc -float(string s) checkextension = #99; -//description: -//check if (cvar("pr_checkextension")) before calling this, this is the only -//guarenteed extension to be present in the extension system, it allows you -//to check if an extension is available, by name, to check for an extension -//use code like this: -//// (it is recommended this code be placed in worldspawn or a worldspawn called function somewhere) -//if (cvar("pr_checkextension")) -//if (checkextension("DP_SV_SETCOLOR")) -// ext_setcolor = TRUE; -//from then on you can check ext_setcolor to know if that extension is available - -//DP_QC_CVAR_STRING -//idea: Paul Timofeyev -//DarkPlaces implementation: Paul Timofeyev, LordHavoc -//builtin definitions: -string(string s) cvar_string = #448; -//description: -//returns the value of a cvar, as a tempstring. - -//DP_QC_TRACE_MOVETYPES -//idea: LordHavoc -//darkplaces implementation: id Software -//constant definitions: -float MOVE_NORMAL = 0; // same as FALSE -float MOVE_NOMONSTERS = 1; // same as TRUE -float MOVE_MISSILE = 2; // save as movement with .movetype == MOVETYPE_FLYMISSILE -//description: -//this extension does nothing (do not check for it), it only documents existing MOVE_ values that were never defined in defs.qc, these are passed as the 'nomonsters' parameter to traceline/tracebox - -//DP_QC_TRACE_MOVETYPE_WORLDONLY -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//constant definitions: -float MOVE_WORLDONLY = 3; -//description: -//allows traces to hit only world (see DP_QC_TRACE_MOVETYPES for how to use this) - -//DP_QC_TRACE_MOVETYPE_HITMODEL -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//constant definitions: -float MOVE_HITMODEL = 4; -//description: -//allows traces to hit alias models (not sprites!) instead of entity boxes (see DP_QC_TRACE_MOVETYPES for how to use this) - -// LordHavoc: HIGHLY experimental, do not implement this in other engines -//DP_CGAME -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//SVC definitions: -float svc_cgame = 50; // [short] length [bytes] data -//description: -//contains network messages to client gamecode. - -//DP_CL_LOADSKY -//idea: Nehahra, LordHavoc -//darkplaces implementation: LordHavoc -//client console commands: -//"loadsky" (parameters: "basename", example: "mtnsun_" would load "mtnsun_up.tga" and "mtnsun_rt.tga" and similar names, use "" to revert to quake sky, note: this is the same as Quake2 skybox naming) -//description: -//sets global skybox for the map for this client (can be stuffed to a client by QC), does not hurt much to repeatedly execute this command, please don't use this in mods if it can be avoided (only if changing skybox is REALLY needed, otherwise please use DP_GFX_SKYBOX). - -//DP_EF_ADDITIVE -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//effects bit: -float EF_ADDITIVE = 32; -//description: -//additive blending when this object is rendered - -//DP_EF_BLUE -//idea: id Software -//darkplaces implementation: LordHavoc -//effects bit: -float EF_BLUE = 64; -//description: -//entity emits blue light (used for quad) - -//DP_EF_FLAME -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//effects bit: -float EF_FLAME = 1024; -//description: -//entity is on fire - -//DP_EF_FULLBRIGHT -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//effects bit: -float EF_FULLBRIGHT = 512; -//description: -//entity is always brightly lit - -//DP_EF_NODRAW -//idea: id Software -//darkplaces implementation: LordHavoc -//effects bit: -float EF_NODRAW = 16; -//description: -//prevents server from sending entity to client (forced invisible, even if it would have been a light source or other such things) - -//DP_EF_RED -//idea: id Software -//darkplaces implementation: LordHavoc -//effects bit: -float EF_RED = 128; -//description: -//entity emits red light (used for invulnerability) - -//DP_EF_STARDUST -//idea: MythWorks Inc -//darkplaces implementation: LordHavoc -//effects bit: -float EF_STARDUST = 2048; -//description: -//entity emits bouncing sparkles in every direction - -//entity attributes used for rendering/networking: -//idea: Nehahra -//darkplaces implementation: LordHavoc -//DP_ENT_ALPHA -//field definition: -.float alpha; -//description: -//controls opacity of the entity, 0.0 is forced to be 1.0 (otherwise everything would be invisible), use -1 if you want to make something invisible, 1.0 is solid (like normal). - -//DP_ENT_COLORMOD -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//field definition: -.vector colormod; -//description: -//controls color of the entity, '0 0 0', is forced to be '1 1 1' (otherwise everything would be black), used for tinting objects, for instance using '1 0.6 0.4' on an ogre would give you an orange ogre (order is red green blue), note the colors can go up to '8 8 8' (8x as bright as normal). - -//DP_ENT_CUSTOMCOLORMAP -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//description: -//if .colormap is set to 1024 + pants + shirt * 16, those colors will be used for colormapping the entity, rather than looking up a colormap by player number. - -/* -//NOTE: no longer supported by darkplaces because all entities are delta compressed now -//DP_ENT_DELTACOMPRESS // no longer supported -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//effects bit: -float EF_DELTA = 8388608; -//description: -//(obsolete) applies delta compression to the network updates of the entity, making updates smaller, this might cause some unreliable behavior in packet loss situations, so it should only be used on numerous (nails/plasma shots/etc) or unimportant objects (gibs/shell casings/bullet holes/etc). -*/ - -//DP_ENT_EXTERIORMODELTOCLIENT -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//fields: -.entity exteriormodeltoclient; -//description: -//the entity is visible to all clients with one exception: if the specified client is using first person view (not using chase_active) the entity will not be shown. - -//DP_ENT_GLOW -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//field definitions: -.float glow_color; -.float glow_size; -.float glow_trail; -//description: -//customizable glowing light effect on the entity, glow_color is a paletted (8bit) color in the range 0-255 (note: 0 and 254 are white), glow_size is 0 or higher (up to the engine what limit to cap it to, darkplaces imposes a 1020 limit), if glow_trail is true it will leave a trail of particles of the same color as the light. - -//DP_ENT_LOWPRECISION -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//effects bit: -float EF_LOWPRECISION = 4194304; -//description: -//uses low quality origin coordinates, reducing network traffic compared to the default high precision, intended for numerous objects (projectiles/gibs/bullet holes/etc). - -//DP_ENT_SCALE -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//field definitions: -.float scale; -//description: -//controls rendering scale of the object, 0 is forced to be 1, darkplaces uses 1/16th accuracy and a limit of 15.9375, can be used to make an object larger or smaller. - -//DP_ENT_VIEWMODEL -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//field definitions: -.entity viewmodelforclient; -//description: -//this is a very special capability, attachs the entity to the view of the client specified, origin and angles become relative to the view of that client, all effects can be used (multiple skins on a weapon model etc)... the entity is not visible to any other client. - -//DP_GFX_FOG -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//worldspawn fields: -//"fog" (parameters: "density red green blue", example: "0.1 0.3 0.3 0.3") -//description: -//global fog for the map, can not be changed by QC - -//DP_GFX_SKYBOX -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//worldspawn fields: -//"sky" (parameters: "basename", example: "mtnsun_" would load "mtnsun_up.tga" and "mtnsun_rt.tga" and similar names, note: "sky" is also used the same way by Quake2) -//description: -//global skybox for the map, can not be changed by QC - -//DP_GFX_EXTERNALTEXTURES -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//description: -//loads external textures found in various directories (tenebrae compatible)... -/* -in all examples .tga is merely the base texture, it can be any of these: -.tga (base texture) -_glow.tga (fullbrights or other glowing overlay stuff, NOTE: this is done using additive blend, not alpha) -_pants.tga (pants overlay for colormapping on models, this should be shades of grey (it is tinted by pants color) and black wherever the base texture is not black, as this is an additive blend) -_shirt.tga (same idea as pants, but for shirt color) -_diffuse.tga (this may be used instead of base texture for per pixel lighting) -_gloss.tga (specular texture for per pixel lighting, note this can be in color (tenebrae only supports greyscale)) -_norm.tga (normalmap texture for per pixel lighting) -_bump.tga (bumpmap, converted to normalmap at load time, supported only for reasons of tenebrae compatibility) -_luma.tga (same as _glow but supported only for reasons of tenebrae compatibility) - -due to glquake's incomplete Targa(r) loader, this section describes -required Targa(r) features support: -types: -type 1 (uncompressed 8bit paletted with 24bit/32bit palette) -type 2 (uncompressed 24bit/32bit true color, glquake supported this) -type 3 (uncompressed 8bit greyscale) -type 9 (RLE compressed 8bit paletted with 24bit/32bit palette) -type 10 (RLE compressed 24bit/32bit true color, glquake supported this) -type 11 (RLE compressed 8bit greyscale) -attribute bit 0x20 (Origin At Top Left, top to bottom, left to right) - -image formats guarenteed to be supported: tga, pcx, lmp -image formats that are optional: png, jpg - -mdl/spr/spr32 examples: -skins are named _A (A being a number) and skingroups are named like _A_B -these act as suffixes on the model name... -example names for skin _2_1 of model "progs/armor.mdl": -game/override/progs/armor.mdl_2_1.tga -game/textures/progs/armor.mdl_2_1.tga -game/progs/armor.mdl_2_1.tga -example names for skin _0 of the model "progs/armor.mdl": -game/override/progs/armor.mdl_0.tga -game/textures/progs/armor.mdl_0.tga -game/progs/armor.mdl_0.tga -note that there can be more skins files (of the _0 naming) than the mdl -contains, this is only useful to save space in the .mdl file if classic quake -compatibility is not a concern. - -bsp/md2/md3 examples: -example names for the texture "quake" of model "maps/start.bsp": -game/override/quake.tga -game/textures/quake.tga -game/progs/quake.tga - -sbar/menu/console textures: for example the texture "conchars" (console font) in gfx.wad -game/override/gfx/conchars.tga -game/textures/gfx/conchars.tga -game/gfx/conchars.tga -*/ - -//DP_GFX_QUAKE3MODELTAGS -//idea: id Software -//darkplaces implementation: LordHavoc -//field definitions: -.entity tag_entity; // entity this is attached to (call setattachment to set this) -.float tag_index; // which tag on that entity (0 is relative to the entity, > 0 is an index into the tags on the model if it has any) (call setattachment to set this) -//builtin definitions: -void(entity e, entity tagentity, string tagname) setattachment = #443; // attachs e to a tag on tagentity (note: use "" to attach to entity origin/angles instead of a tag) -//description: -//allows entities to be visually attached to model tags (which follow animations perfectly) on other entities, for example attaching a weapon to a player's hand, or upper body attached to lower body, allowing it to change angles and frame separately (note: origin and angles are relative to the tag, use '0 0 0' for both if you want it to follow exactly, this is similar to viewmodelforclient's behavior). -//note 2: if the tag is not found, it defaults to "" (attach to origin/angles of entity) -//note 3: attaching to world turns off attachment -//note 4: the entity that this is attached to must be visible for this to work - -//DP_GFX_SKINFILES -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//description: -//alias models (mdl, md2, md3) can have .skin files to replace conventional texture naming, these have a naming format such as: -//progs/test.md3_0.skin -//progs/test.md3_1.skin -//... -// -//these files contain replace commands (replace meshname shadername), example: -//replace "helmet" "progs/test/helmet1.tga" // this is a mesh shader replacement -//replace "teamstripes" "progs/test/redstripes.tga" -//replace "visor" "common/nodraw" // this makes the visor mesh invisible -////it is not possible to rename tags using this format -// -//Or the Quake3 syntax (100% compatible with Quake3's .skin files): -//helmet,progs/test/helmet1.tga // this is a mesh shader replacement -//teamstripes,progs/test/redstripes.tga -//visor,common/nodraw // this makes the visor mesh invisible -//tag_camera, // this defines that the first tag in the model is called tag_camera -//tag_test, // this defines that the second tag in the model is called tag_test -// -//any names that are not replaced are automatically show up as a grey checkerboard to indicate the error status, and "common/nodraw" is a special case that is invisible. -//this feature is intended to allow multiple skin sets on md3 models (which otherwise only have one skin set). -//other commands might be added someday but it is not expected. - -//DP_HALFLIFE_MAP -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//description: -//simply indicates that the engine supports HalfLife maps (BSP version 30, NOT the QER RGBA ones which are also version 30). - -//DP_HALFLIFE_MAP_CVAR -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//cvars: -//halflifebsp 0/1 -//description: -//engine sets this cvar when loading a map to indicate if it is halflife format or not. - -//DP_INPUTBUTTONS -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//field definitions: -.float button3; -.float button4; -.float button5; -.float button6; -.float button7; -.float button8; -//description: -//set to the state of the +button3, +button4, +button5, +button6, +button7, and +button8 buttons from the client, this does not involve protocol changes (the extra 6 button bits were simply not used). - -//DP_MONSTERWALK -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//description: -//MOVETYPE_WALK is permitted on non-clients, so bots can move smoothly, run off ledges, etc, just like a real player. - -//DP_MOVETYPEBOUNCEMISSILE -//idea: id Software -//darkplaces implementation: id Software -//movetype definitions: -float MOVETYPE_BOUNCEMISSILE = 11; -//description: -//MOVETYPE_BOUNCE but without gravity, and with full reflection (no speed loss like grenades have), in other words - bouncing laser bolts. - -//DP_MOVETYPEFOLLOW -//idea: id Software, LordHavoc (redesigned) -//darkplaces implementation: LordHavoc -//movetype definitions: -float MOVETYPE_FOLLOW = 12; -//description: -//MOVETYPE_FOLLOW implemented, this uses existing entity fields in unusual ways: -//aiment - the entity this is attached to. -//punchangle - the original angles when the follow began. -//view_ofs - the relative origin (note that this is un-rotated by punchangle, and that is actually the only purpose of punchangle). -//v_angle - the relative angles. -//here's an example of how you would set a bullet hole sprite to follow a bmodel it was created on, even if the bmodel rotates: -//hole.movetype = MOVETYPE_FOLLOW; // make the hole follow -//hole.solid = SOLID_NOT; // MOVETYPE_FOLLOW is always non-solid -//hole.aiment = bmodel; // make the hole follow bmodel -//hole.punchangle = bmodel.angles; // the original angles of bmodel -//hole.view_ofs = hole.origin - bmodel.origin; // relative origin -//hole.v_angle = hole.angles - bmodel.angles; // relative angles - -//DP_QC_CHANGEPITCH -//idea: id Software -//darkplaces implementation: id Software -//field definitions: -.float idealpitch; -.float pitch_speed; -//builtin definitions: -void(entity ent) changepitch = #63; -//description: -//equivilant to changeyaw, ent is normally self. (this was a Q2 builtin) - -//DP_QC_COPYENTITY -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(entity from, entity to) copyentity = #400; -//description: -//copies all data in the entity to another entity. - -//DP_QC_ETOS -//idea: id Software -//darkplaces implementation: id Software -//builtin definitions: -string(entity ent) etos = #65; -//description: -//lists all of the entity's fields into a string (similar to edict command in console). (this was a Q2 builtin) - -//DP_QC_FINDCHAIN -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -entity(.string fld, string match) findchain = #402; -//description: -//similar to find() but returns a chain of entities like findradius. - -//DP_QC_FINDCHAINFLOAT -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -entity(.entity fld, entity match) findchainentity = #403; -entity(.float fld, float match) findchainfloat = #403; -//description: -//similar to findentity()/findfloat() but returns a chain of entities like findradius. - -//DP_QC_FINDFLOAT -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -entity(entity start, .entity fld, entity match) findentity = #98; -entity(entity start, .float fld, float match) findfloat = #98; -//description: -//finds an entity or float field value, similar to find(), but for entity and float fields. - -//DP_QC_GETLIGHT -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -vector(vector org) getlight = #92; -//description: -//returns the lighting at the requested location (in color), 0-255 range (can exceed 255). - -//DP_QC_GETSURFACE -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -float(entity e, float s) getsurfacenumpoints = #434; -vector(entity e, float s, float n) getsurfacepoint = #435; -vector(entity e, float s) getsurfacenormal = #436; -string(entity e, float s) getsurfacetexture = #437; -float(entity e, vector p) getsurfacenearpoint = #438; -vector(entity e, float s, vector p) getsurfaceclippedpoint = #439; -//description: -//functions to query surface information. - -//DP_QC_MINMAXBOUND -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -float(float a, float b) min = #94; -float(float a, float b, float c) min3 = #94; -float(float a, float b, float c, float d) min4 = #94; -float(float a, float b, float c, float d, float e) min5 = #94; -float(float a, float b, float c, float d, float e, float f) min6 = #94; -float(float a, float b, float c, float d, float e, float f, float g) min7 = #94; -float(float a, float b, float c, float d, float e, float f, float g, float h) min8 = #94; -float(float a, float b) max = #95; -float(float a, float b, float c) max3 = #95; -float(float a, float b, float c, float d) max4 = #95; -float(float a, float b, float c, float d, float e) max5 = #95; -float(float a, float b, float c, float d, float e, float f) max6 = #95; -float(float a, float b, float c, float d, float e, float f, float g) max7 = #95; -float(float a, float b, float c, float d, float e, float f, float g, float h) max8 = #95; -float(float minimum, float val, float maximum) bound = #96; -//description: -//min returns the lowest of all the supplied numbers. -//max returns the highest of all the supplied numbers. -//bound clamps the value to the range and returns it. - -//DP_QC_RANDOMVEC -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -vector() randomvec = #91; -//description: -//returns a vector of length < 1, much quicker version of this QC: do {v_x = random();v_y = random();v_z = random();} while(vlen(v) > 1) - -//DP_QC_SINCOSSQRTPOW -//idea: id Software, LordHavoc -//darkplaces implementation: id Software, LordHavoc -//builtin definitions: -float(float val) sin = #60; -float(float val) cos = #61; -float(float val) sqrt = #62; -float(float a, float b) pow = #97; -//description: -//useful math functions, sine of val, cosine of val, square root of val, and raise a to power b, respectively. - -//DP_QC_TRACEBOX -//idea: id Software -//darkplaces implementation: id Software -//builtin definitions: -void(vector v1, vector min, vector max, vector v2, float nomonsters, entity forent) tracebox = #90; -//description: -//similar to traceline but much more useful, traces a box of the size specified (technical note: currently the hull size can only be one of the sizes used in the map for bmodel collisions, entity collisions will pay attention to the exact size specified however, this is a collision code limitation in quake itself, and will be fixed eventually). - -//DP_QC_TRACETOSS -//idea: id Software -//darkplaces implementation: id Software -//builtin definitions: -void(entity ent, entity ignore) tracetoss = #64; -//description: -//simulates movement of the entity as if it is MOVETYPE_TOSS and starting with it's current state (location, velocity, etc), returns relevant trace_ variables (trace_fraction is always 0, all other values are supported - trace_ent, trace_endpos, trace_plane_normal), does not actually alter the entity. - -//DP_QC_VECTORVECTORS -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector dir) vectorvectors = #432; -//description: -//creates v_forward, v_right, and v_up vectors given a forward vector, similar to makevectors except it takes a forward direction vector instead of angles. - -//DP_QUAKE2_MODEL -//idea: quake community -//darkplaces implementation: LordHavoc -//description: -//shows that the engine supports Quake2 .md2 files. - -//DP_QUAKE3_MODEL -//idea: quake community -//darkplaces implementation: LordHavoc -//description: -//shows that the engine supports Quake3 .md3 files. - -//DP_REGISTERCVAR -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -float(string name, string value) registercvar = #93; -//description: -//adds a new console cvar to the server console (in singleplayer this is the player's console), the cvar exists until the mod is unloaded or the game quits. - -//DP_SOLIDCORPSE -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//solid definitions: -float SOLID_CORPSE = 5; -//description: -//the entity will not collide with SOLID_CORPSE and SOLID_SLIDEBOX entities (and likewise they will not collide with it), this is useful if you want dead bodies that are shootable but do not obstruct movement by players and monsters, note that if you traceline with a SOLID_SLIDEBOX entity as the ignoreent, it will ignore SOLID_CORPSE entities, this is desirable for visibility and movement traces, but not for bullets, for the traceline to hit SOLID_CORPSE you must temporarily force the player (or whatever) to SOLID_BBOX and then restore to SOLID_SLIDEBOX after the traceline. - -//DP_SPRITE32 -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//description: -//the engine supports .spr32 sprites. - -//DP_SV_BOTCLIENT -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//constants: -float CLIENTTYPE_DISCONNECTED = 0; -float CLIENTTYPE_REAL = 1; -float CLIENTTYPE_BOT = 2; -float CLIENTTYPE_NOTACLIENT = 3; -//builtin definitions: -entity() spawnclient = #454; // like spawn but for client slots (also calls relevant connect/spawn functions), returns world if no clients available -float(entity clent) clienttype = #455; // returns one of the CLIENTTYPE_* constants -void(entity clent) dropclient = #453; -//description: -//spawns a client with no network connection, to allow bots to use client slots with no hacks. -//How to use: -/* - // to spawn a bot - local entity oldself; - oldself = self; - self = spawnclient(); - if (!self) - { - bprint("Can not add bot, server full.\n"); - self = oldself; - return; - } - self.netname = "Yoyobot"; - self.clientcolors = 12 * 16 + 4; // yellow (12) shirt and red (4) pants - ClientConnect(); - PutClientInServer(); - self = oldself; - - // to remove all bots - local entity head; - head = find(world, classname, "player"); - while (head) - { - if (clienttype(head) == CLIENTTYPE_BOT) - dropclient(head); - head = find(head, classname, "player"); - } - - // to identify if a client is a bot (for example in PlayerPreThink) - if (clienttype(self) == CLIENTTYPE_BOT) - botthink(); -*/ -//see also DP_SV_CLIENTCOLORS DP_SV_CLIENTNAME DP_SV_DROPCLIENT -//How it works: -//creates a new client, calls SetNewParms and stores the parms, and returns the client. -//this intentionally does not call SV_SendServerinfo to allow the QuakeC a chance to set the netname and clientcolors fields before actually spawning the bot by calling ClientConnect and PutClientInServer manually -//on level change ClientConnect and PutClientInServer are called by the engine to spawn in the bot (this is why clienttype() exists to tell you on the next level what type of client this is). -//parms work the same on bot clients as they do on real clients, and do carry from level to level - -//DP_SV_CLIENTCOLORS -//idea: LordHavoc -//darkplaces implementation: LordHavoc -.float clientcolors; // colors of the client (format: pants + shirt * 16) -//description: -//allows qc to read and modify the client colors associated with a client entity (not particularly useful on other entities), and automatically sends out any appropriate network updates if changed - -//DP_SV_CLIENTNAME -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//allows qc to modify the client's .netname, and automatically sends out any appropriate network updates if changed - -//DP_SV_DRAWONLYTOCLIENT -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//field definitions: -.entity drawonlytoclient; -//description: -//the entity is only visible to the specified client. - -//DP_SV_EFFECT -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector org, string modelname, float startframe, float endframe, float framerate) effect = #404; -//SVC definitions: -//float svc_effect = #52; // [vector] org [byte] modelindex [byte] startframe [byte] framecount [byte] framerate -//float svc_effect2 = #53; // [vector] org [short] modelindex [byte] startframe [byte] framecount [byte] framerate -//description: -//clientside playback of simple custom sprite effects (explosion sprites, etc). - -//DP_SV_NODRAWTOCLIENT -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//field definitions: -.entity nodrawtoclient; -//description: -//the entity is not visible to the specified client. - -//DP_SV_PLAYERPHYSICS -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//field definitions: -.vector movement; -//engine-called QC prototypes: -//void() SV_PlayerPhysics; -//description: -//.movement vector contains the movement input from the player, allowing QC to do as it wishs with the input, and SV_PlayerPhysics will completely replace the player physics if present (works for all MOVETYPE's), see darkplaces mod source for example of this function (in playermovement.qc, adds HalfLife ladders support, as well as acceleration/deceleration while airborn (rather than the quake sudden-stop while airborn), and simplifies the physics a bit) - -//DP_SV_SETCOLOR -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(entity ent, float colors) setcolor = #401; -//engine called QC functions (optional): -//void(float color) SV_ChangeTeam; -//description: -//setcolor sets the color on a client and updates internal color information accordingly (equivilant to stuffing a "color" command but immediate) -//SV_ChangeTeam is called by the engine whenever a "color" command is recieved, it may decide to do anything it pleases with the color passed by the client, including rejecting it (by doing nothing), or calling setcolor to apply it, preventing team changes is one use for this. -//the color format is pants + shirt * 16 (0-255 potentially) - -//DP_SV_SLOWMO -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//cvars: -//"slowmo" (0+, default 1) -//description: -//sets the time scale of the server, mainly intended for use in singleplayer by the player, however potentially useful for mods, so here's an extension for it. -//range is 0 to infinite, recommended values to try are 0.1 (very slow, 10% speed), 1 (normal speed), 5 (500% speed). - -//DP_TE_BLOOD -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector org, vector velocity, float howmany) te_blood = #405; -//temp entity definitions: -float TE_BLOOD = 50; -//protocol: -//vector origin -//byte xvelocity (-128 to +127) -//byte yvelocity (-128 to +127) -//byte zvelocity (-128 to +127) -//byte count (0 to 255, how much blood) -//description: -//creates a blood effect. - -//DP_TE_BLOODSHOWER -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector mincorner, vector maxcorner, float explosionspeed, float howmany) te_bloodshower = #406; -//temp entity definitions: -//float TE_BLOODSHOWER = 52; -//protocol: -//vector mins (minimum corner of the cube) -//vector maxs (maximum corner of the cube) -//coord explosionspeed (velocity of blood particles flying out of the center) -//short count (number of blood particles) -//description: -//creates an exploding shower of blood, for making gibbings more convincing. - -//DP_TE_CUSTOMFLASH -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector org, float radius, float lifetime, vector color) te_customflash = #417; -//temp entity definitions: -//float TE_CUSTOMFLASH = 73; -//protocol: -//vector origin -//byte radius ((MSG_ReadByte() + 1) * 8, meaning 8-2048 unit radius) -//byte lifetime ((MSG_ReadByte() + 1) / 256.0, meaning approximately 0-1 second lifetime) -//byte red (0.0 to 1.0 converted to 0-255) -//byte green (0.0 to 1.0 converted to 0-255) -//byte blue (0.0 to 1.0 converted to 0-255) -//description: -//creates a customized light flash. - -//DP_TE_EXPLOSIONRGB -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector org, vector color) te_explosionrgb = #407; -//temp entity definitions: -//float TE_EXPLOSIONRGB = 53; -//protocol: -//vector origin -//byte red (0.0 to 1.0 converted to 0 to 255) -//byte green (0.0 to 1.0 converted to 0 to 255) -//byte blue (0.0 to 1.0 converted to 0 to 255) -//description: -//creates a colored explosion effect. - -//DP_TE_FLAMEJET -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//temp entity definitions: -float TE_FLAMEJET = 74; -//protocol: -//vector origin -//vector velocity -//byte count (0 to 255, how many flame particles) -//description: -//creates a single puff of flame particles. (not very useful really) - -//DP_TE_PARTICLECUBE -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector mincorner, vector maxcorner, vector vel, float howmany, float color, float gravityflag, float randomveljitter) te_particlecube = #408; -//temp entity definitions: -//float TE_PARTICLECUBE = 54; -//protocol: -//vector mins (minimum corner of the cube) -//vector maxs (maximum corner of the cube) -//vector velocity -//short count -//byte color (palette color) -//byte gravity (TRUE or FALSE, FIXME should this be a scaler instead?) -//coord randomvel (how much to jitter the velocity) -//description: -//creates a cloud of particles, useful for forcefields but quite customizable. - -//DP_TE_PARTICLERAIN -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector mincorner, vector maxcorner, vector vel, float howmany, float color) te_particlerain = #409; -//temp entity definitions: -//float TE_PARTICLERAIN = 55; -//protocol: -//vector mins (minimum corner of the cube) -//vector maxs (maximum corner of the cube) -//vector velocity (velocity of particles) -//short count (number of particles) -//byte color (8bit palette color) -//description: -//creates a shower of rain, the rain will appear either at the top (if falling down) or bottom (if falling up) of the cube. - -//DP_TE_PARTICLESNOW -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector mincorner, vector maxcorner, vector vel, float howmany, float color) te_particlesnow = #410; -//temp entity definitions: -//float TE_PARTICLERAIN = 56; -//protocol: -//vector mins (minimum corner of the cube) -//vector maxs (maximum corner of the cube) -//vector velocity (velocity of particles) -//short count (number of particles) -//byte color (8bit palette color) -//description: -//creates a shower of snow, the snow will appear either at the top (if falling down) or bottom (if falling up) of the cube, low velocities are advisable for convincing snow. - -//DP_TE_QUADEFFECTS1 -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector org) te_gunshotquad = #412; -void(vector org) te_spikequad = #413; -void(vector org) te_superspikequad = #414; -void(vector org) te_explosionquad = #415; -//temp entity definitions: -//float TE_GUNSHOTQUAD = 57; // [vector] origin -//float TE_SPIKEQUAD = 58; // [vector] origin -//float TE_SUPERSPIKEQUAD = 59; // [vector] origin -//float TE_EXPLOSIONQUAD = 70; // [vector] origin -//protocol: -//vector origin -//description: -//all of these just take a location, and are equivilant in function (but not appearance :) to the original TE_GUNSHOT, etc. - -//DP_TE_SMALLFLASH -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector org) te_smallflash = #416; -//temp entity definitions: -//float TE_SMALLFLASH = 72; -//protocol: -//vector origin -//description: -//creates a small light flash (radius 200, time 0.2). - -//DP_TE_SPARK -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector org, vector vel, float howmany) te_spark = #411; -//temp entity definitions: -//float TE_SPARK = 51; -//protocol: -//vector origin -//byte xvelocity (-128 to 127) -//byte yvelocity (-128 to 127) -//byte zvelocity (-128 to 127) -//byte count (number of sparks) -//description: -//creates a shower of sparks and a smoke puff. - -//DP_TE_STANDARDEFFECTBUILTINS -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector org) te_gunshot = #418; -void(vector org) te_spike = #419; -void(vector org) te_superspike = #420; -void(vector org) te_explosion = #421; -void(vector org) te_tarexplosion = #422; -void(vector org) te_wizspike = #423; -void(vector org) te_knightspike = #424; -void(vector org) te_lavasplash = #425; -void(vector org) te_teleport = #426; -void(vector org, float color) te_explosion2 = #427; -void(entity own, vector start, vector end) te_lightning1 = #428; -void(entity own, vector start, vector end) te_lightning2 = #429; -void(entity own, vector start, vector end) te_lightning3 = #430; -void(entity own, vector start, vector end) te_beam = #431; -//description: -//to make life easier on mod coders. - -//DP_TE_PLASMABURN -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//builtin definitions: -void(vector org) te_plasmaburn = #433; -//temp entity definitions: -//float TE_PLASMABURN = 75; -//protocol: -//vector origin -//description: -//creates a small light flash (radius 200, time 0.2) and marks the walls. - -//DP_VIEWZOOM -//idea: LordHavoc -//darkplaces implementation: LordHavoc -//field definitions: -.float viewzoom; -//description: -//scales fov and sensitivity of player, valid range is 0 to 1 (intended for sniper rifle zooming, and such) - -//FRIK_FILE -//idea: FrikaC -//darkplaces implementation: LordHavoc -//builtin definitions: -float(string s) stof = #81; // get numerical value from a string -float(string filename, float mode) fopen = #110; // opens a file inside quake/gamedir/data/ (mode is FILE_READ, FILE_APPEND, or FILE_WRITE), returns fhandle >= 0 if successful, or fhandle < 0 if unable to open file for any reason -void(float fhandle) fclose = #111; // closes a file -string(float fhandle) fgets = #112; // reads a line of text from the file and returns as a tempstring -void(float fhandle, string s) fputs = #113; // writes a line of text to the end of the file -float(string s) strlen = #114; // returns how many characters are in a string -string(string s1, ...) strcat = #115; // concatenates two strings (for example "abc", "def" would return "abcdef") and returns as a tempstring -string(string s, float start, float length) substring = #116; // returns a section of a string as a tempstring -vector(string s) stov = #117; // returns vector value from a string -string(string s) strzone = #118; // makes a copy of a string into the string zone and returns it, this is often used to keep around a tempstring for longer periods of time (tempstrings are replaced often) -void(string s) strunzone = #119; // removes a copy of a string from the string zone (you can not use that string again or it may crash!!!) -//constants: -float FILE_READ = 0; -float FILE_APPEND = 1; -float FILE_WRITE = 2; -//cvars: -//pr_zone_min_strings : default 64 (64k), min 64 (64k), max 8192 (8mb) -//description: -//provides text file access functions and string manipulation functions, note that you may want to set pr_zone_min_strings in the worldspawn function if 64k is not enough string zone space. - -//KRIMZON_SV_PARSECLIENTCOMMAND -//idea: KrimZon -//darkplaces implementation: KrimZon, LordHavoc -//engine-called QC prototypes: -//void(string s) SV_ParseClientCommand; -//builtin definitions: -void(entity e, string s) clientcommand = #440; -float(string s) tokenize = #441; -string(float n) argv = #442; -//description: -//provides QC the ability to completely control server interpretation of client commands ("say" and "color" for example, clientcommand is necessary for this and substring (FRIK_FILE) is useful) as well as adding new commands (tokenize, argv, and stof (FRIK_FILE) are useful for this)), whenever a clc_stringcmd is received the QC function is called, and it is up to the QC to decide what (if anything) to do with it - -//NEH_RESTOREGAME -//idea: Nehahra -//darkplaces implementation: LordHavoc -//engine-called QC prototypes: -//void() RestoreGame; -//description: -//when a savegame is loaded, this function is called - -//NEH_CMD_PLAY2 -//idea: Nehahra -//darkplaces implementation: LordHavoc -//description: -//shows that the engine supports the "play2" console command (plays a sound without spatialization). - -//PRYDON_CLIENTCURSOR -//idea: FrikaC -//darkplaces implementation: LordHavoc -//effects bit: -float EF_SELECTABLE = 16384; // allows cursor to highlight entity (brighten) -//field definitions: -.float cursor_active; // true if cl_prydoncursor mode is on -.vector cursor_screen; // screen position of cursor as -1 to +1 in _x and _y (_z unused) -.vector cursor_trace_start; // position of camera -.vector cursor_trace_endpos; // position of cursor in world (as traced from camera) -.entity cursor_trace_ent; // entity the cursor is pointing at (server forces this to world if the entity is currently free at time of receipt) -//cvar definitions: -//cl_prydoncursor (0/1+, default 0, 1 and above use cursors named gfx/prydoncursor%03i.lmp - or .tga and such if DP_GFX_EXTERNALTEXTURES is implemented) -//description: -//shows that the engine supports the cl_prydoncursor cvar, this puts a clientside mouse pointer on the screen and feeds input to the server for the QuakeC to use as it sees fit. -//the mouse pointer triggers button4 if cursor is at left edge of screen, button5 if at right edge of screen, button6 if at top edge of screen, button7 if at bottom edge of screen. -//the clientside trace skips transparent entities (except those marked EF_SELECTABLE). -//the selected entity highlights only if EF_SELECTABLE is set, a typical selection method would be doubling the brightness of the entity by some means (such as colormod[] *= 2). -//intended to be used by Prydon Gate. - -//TW_SV_STEPCONTROL -//idea: Transfusion -//darkplaces implementation: LordHavoc -//cvars: -//sv_jumpstep (0/1, default 1) -//sv_stepheight (default 18) -//description: -//sv_jumpstep allows stepping up onto stairs while airborn, sv_stepheight controls how high a single step can be. - -// NEXUIZ_PLAYERMODEL -// NEXUIZ_PLAYERSKIN -//idea: -//darkplaces implementation: Black -.string playermodel; // contains the name of the model set by a client with playermodel -.string playerskin; // contains the name of the skin set by a client with playerskin - -//unassigned stuff: (need to write up specs but haven't yet) -.vector punchvector; // DP_SV_PUNCHVECTOR -.float ping; // DP_SV_PING - - diff --git a/attic/TeamNexuiz/game/gamec/g_casings.c b/attic/TeamNexuiz/game/gamec/g_casings.c deleted file mode 100644 index 7d7888eae..000000000 --- a/attic/TeamNexuiz/game/gamec/g_casings.c +++ /dev/null @@ -1,91 +0,0 @@ -void() casingtouch = -{ - if (other.solid == SOLID_BSP) - if (vlen(self.velocity) >= 50) - if (time >= self.attack_finished) - sound (self, CHAN_IMPACT, "weapons/tink1.wav", 0.5, ATTN_NORM); - self.attack_finished = time + 0.2; - //self.touch = SUB_Null; // one tink is enough - //self.dest = self.origin - self.groundentity.origin; -}; - -void() casingthink = -{ - local float p; - self.nextthink = time + 0.1; - if (self.flags & FL_ONGROUND) - { - // just keep the yaw angle - self.angles_x = 0; - self.angles_z = 0; - self.flags = self.flags - FL_ONGROUND; - self.nextthink = time + 0.5; - } - p = pointcontents(self.origin); - if (p == CONTENT_SOLID || p == CONTENT_LAVA || p == CONTENT_SKY) - { - removedecor(self); - return; - } - if (time > self.cnt) - { - self.nextthink = time; - self.alpha = self.alpha - frametime; - if (self.alpha < 0.0625) - removedecor(self); - } -}; - -// knock loose the casing when disturbed -void() casingknockedloosefunc = -{ - self.movetype = MOVETYPE_BOUNCE; - self.flags = self.flags - (self.flags & FL_ONGROUND); - self.avelocity = randomvec() * 300; - self.nextthink = time + 0.1; - self.touch = casingtouch; -}; - -void(vector org, vector vel, float randomvel, vector ang, vector avel, float randomavel, float casingtype) SpawnCasing = -{ - local entity e; - if (cvar("temp1") & 2048) - return; - - e = newdecor(); - //e.isdecor = TRUE; - e.alpha = 1; - //e.forcescale = 15; - e.movetype = MOVETYPE_BOUNCE; - e.solid = SOLID_TRIGGER; - e.velocity = vel + randomvec() * randomvel; - e.angles = ang; - e.avelocity = avel + randomvec() * randomavel; - e.nextthink = time; - e.think = casingthink; - e.touch = casingtouch; - //e.knockedloosefunc = casingknockedloosefunc; - //e.effects = EF_LOWPRECISION; - e.createdtime = time; - if (casingtype == 1) - { - setmodel (e, "models/casing_shell.mdl"); - e.cnt = time + 30; - // bias to make these be considered more important than other things - e.createdtime = time + 1; - } - else if (casingtype == 2) - { - setmodel (e, "models/casing_steel.mdl"); - e.cnt = time + 10; - } - else - { - setmodel (e, "models/casing_bronze.mdl"); - e.cnt = time + 10; - } - if (maxclients == 1) - e.cnt = time + 3000; - setsize (e, '0 0 -1', '0 0 -1'); - setorigin (e, org); -}; diff --git a/attic/TeamNexuiz/game/gamec/g_damage.c b/attic/TeamNexuiz/game/gamec/g_damage.c deleted file mode 100644 index e82a5cafd..000000000 --- a/attic/TeamNexuiz/game/gamec/g_damage.c +++ /dev/null @@ -1,394 +0,0 @@ - -float checkrules_firstblood; - -void Obituary (entity attacker, entity targ, float deathtypeN) // Renamed "deathtype" to "deathtypeN" -{ // b/c of conflict with item_tfgoal - string s; - - if (targ.classname == "player" || targ.classname == "corpse") - { - if (targ.classname == "corpse") - s = "A corpse"; - else - s = targ.netname; - - if (((attacker.classname == "info_tfgoal") || (attacker.classname == "item_tfgoal"))) - { - if ((attacker.deathtype != "")) - { - bprint (targ.netname); - bprint (attacker.deathtype); - } - return; - } - - if (targ == attacker) - { - if (deathtypeN == IT_GRENADE_LAUNCHER) - bprint ("^1",s, " detonated\n"); - else if (deathtypeN == IT_ELECTRO) - bprint ("^1",s, " played with plasma\n"); - else if (deathtypeN == IT_ROCKET_LAUNCHER) - bprint ("^1",s, " exploded\n"); - else if (deathtypeN == DEATH_KILL) - bprint ("^1",s, " couldn't take it anymore\n"); - else if (deathtypeN == 88) - bprint ("^1",s, " blew his own sorry ass up\n"); - else if (deathtypeN == 35) - bprint ("^1",s, " is still seeing stars from his flash grenade.\n"); - else if (deathtypeN == 99) - bprint ("^1",s, " nails himself to death.\n"); - else - bprint ("^1",s, " couldn't resist the urge to self immolate\n"); - targ.frags = targ.frags - 1; - if (targ.killcount > 2) - bprint ("^1",s," ended it all with a ",ftos(targ.killcount)," kill spree\n"); - } - else if (teamplay && attacker.team == targ.team) - { - bprint ("^1", attacker.netname, " mows down a teammate\n"); - attacker.frags = attacker.frags - 1; - if (targ.killcount > 2) - bprint ("^1",s,"'s ",ftos(targ.killcount)," kill spree was endeded by a teammate!\n"); - if (attacker.killcount > 2) - bprint ("^1",attacker.netname," ended a ",ftos(attacker.killcount)," kill spree by killing a teammate\n"); - attacker.killcount = 0; - } - else if (attacker.classname == "player") - { - if (!checkrules_firstblood) - { - checkrules_firstblood = TRUE; - //sound(world, CHAN_AUTO, "announcer/firstblood.wav", 1, ATTN_NONE); - bprint("^1",attacker.netname, " drew first blood", "\n"); - } - - if (deathtypeN == WEP_LASER) - bprint ("^1",s, " was blasted by ", attacker.netname, "\n"); - else if (deathtypeN == WEP_UZI) - bprint ("^1",s, " was riddled full of holes by ", attacker.netname, "\n"); - else if (deathtypeN == WEP_SHOTGUN) - bprint ("^1",s, " was gunned by ", attacker.netname, "\n"); - else if (deathtypeN == WEP_GRENADE_LAUNCHER) - bprint ("^1", s, " was blasted by ", attacker.netname, "\n"); - else if (deathtypeN == WEP_ELECTRO) - bprint ("^1",s, " was blasted by ", attacker.netname, "\n"); - else if (deathtypeN == WEP_CRYLINK) - bprint ("^1",s, " was blasted by ", attacker.netname, "\n"); - else if (deathtypeN == WEP_NEX) - bprint ("^1",s, " has been vaporized by ", attacker.netname, "\n"); - else if (deathtypeN == WEP_HAGAR) - bprint ("^1",s, " was pummeled by ", attacker.netname, "\n"); - else if (deathtypeN == WEP_ROCKET_LAUNCHER) - bprint ("^1",s, " was blasted by ", attacker.netname, "\n"); - else if (deathtypeN == WEP_GRENADE_MIRV) - bprint ("^1",s, " was blasted by ", attacker.netname, "'s mirv\n"); - else if (deathtypeN == WEP_GRENADE_FRAG) - bprint ("^1",s, " was fragged by ", attacker.netname, "'s grenade\n"); - else if (deathtypeN == DEATH_BURNING) - bprint ("^1",s, " was fried toasty by ", attacker.netname, "\n"); - else if (deathtypeN == DEATH_TELEFRAG) - bprint ("^1",s, " was telefragged by ", attacker.netname, "\n"); - else if (deathtypeN == 88) - bprint ("^1",s, " exploded from ", attacker.netname, "'s grenade\n"); - else if (deathtypeN == 35) - bprint ("^1",s, " sees the light of ", attacker.netname, "'s flash grenade\n"); - else if (deathtypeN == 9) - bprint ("^1",s, " gets nailed to the wall from ", attacker.netname, "'s nail grenade\n"); - else if (deathtypeN == 51) //tesla - bprint ("^1",s, " gets fried by ", attacker.netname, "'s tesla coil :D\n"); - else if (deathtypeN == RAILGUN_HEADSHOT) - bprint ("^1",s, "'s head gets blown away by ", attacker.netname, "'s railgun shot\n"); - else if (deathtypeN == RAILGUN_CHESTSHOT) - bprint ("^1",s, " gets shot in the chest by ", attacker.netname, "'s railgun shot\n"); - else if (deathtypeN == RAILGUN_BODYSHOT) - bprint ("^1",s, " is swiss-cheesed by ", attacker.netname, "'s railgun shot\n"); - else if (deathtypeN == RAILGUN_LEGSHOT) - bprint ("^1",s, "'s legs are blown off by ", attacker.netname, "'s railgun shot\n"); - else if (deathtypeN == PISTOL_LEGSHOT) - bprint ("^1",s, " is knee-capped by ", attacker.netname, "'s pistol\n"); - else if (deathtypeN == PISTOL_BODYSHOT) - bprint ("^1",s, " is shot up by ", attacker.netname, "'s pistol\n"); - else if (deathtypeN == PISTOL_HEADSHOT) - bprint ("^1",s, "'s head is popped by ", attacker.netname, "'s pistol\n"); - else - bprint ("^1",s, " was killed by ", attacker.netname, "\n"); - - attacker.frags = attacker.frags + 1; - if (targ.killcount > 2) - bprint ("^1",s,"'s ", ftos(targ.killcount), " kill spree was ended by ", attacker.netname, "\n"); - attacker.killcount = attacker.killcount + 1; - if (attacker.killcount > 2) - bprint ("^1",attacker.netname," has ",ftos(attacker.killcount)," kills in a row\n"); - } - else - { - if (deathtypeN == DEATH_CLASSCHANGE) - { - if (targ.killcount > 2) - bprint ("^1",s," changed with a ",ftos(targ.killcount)," kill spree\n"); - if (targ.killcount) - targ.killcount = 0; - return; // don't print anything more or lose frags - } - else if (deathtypeN == DEATH_HURTTRIGGER) - bprint ("^1",s, " ", attacker.message, "\n"); - else if (deathtypeN == DEATH_DROWN) - bprint ("^1",s, " drowned\n"); - else if (deathtypeN == DEATH_SLIME) - bprint ("^1",s, " was slimed\n"); - else if (deathtypeN == DEATH_LAVA) - bprint ("^1",s, " turned into hot slag\n"); - else if (deathtypeN == DEATH_FALL) - bprint ("^1",s, " hit the ground with a crunch\n"); - else if (deathtypeN == DEATH_LASERGATE) - bprint ("^1",s, " ", attacker.message, "\n"); - targ.frags = targ.frags - 1; - if (targ.killcount > 2) - bprint ("^1",s," died with a ",ftos(targ.killcount)," kill spree\n"); - } - // FIXME: this should go in PutClientInServer - if (targ.killcount) - targ.killcount = 0; - } -} - -void (entity targ, entity inflictor, entity attacker, float damage) T_Damage; - -void Damage (entity targ, entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - deathmsg = deathtype; - T_Damage (targ, inflictor, attacker, damage); - return; - - local entity oldself; - oldself = self; - self = targ; - // nullify damage if teamplay is on - if (teamplay) - if (attacker.team) - if (attacker.team == targ.team) - if (teamplay == 1 || (teamplay == 3 && attacker != targ)) - damage = 0; - // apply strength multiplier - if (attacker.items & IT_STRENGTH) - { - damage = damage * cvar("g_balance_powerup_strength_damage"); - force = force * cvar("g_balance_powerup_strength_force"); - } - // apply invincibility multiplier - if (targ.items & IT_INVINCIBLE) - damage = damage * cvar("g_balance_powerup_invincible_takedamage"); - // apply push - if (self.damageforcescale) - { - self.velocity = self.velocity + self.damageforcescale * force; - self.flags = self.flags - (self.flags & FL_ONGROUND); - } -/* - // apply damage - if (self.event_damage) - self.event_damage (inflictor, attacker, damage, deathtype, hitloc, force); - self = oldself; */ -} - -void (entity targ, entity inflictor, entity attacker, float damage) T_Damage; -void (entity inflictor, entity attacker, float damage, entity ignore) T_RadiusDamage; - -void RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity ignore, float forceintensity, float deathtype) -{ -// deathmsg = deathtype; -// T_RadiusDamage (inflictor, attacker, coredamage, ignore); -// return; - - entity targ; - float finaldmg; - float power; - vector blastorigin; - vector force; - vector m1; - vector m2; - vector nearest; - vector diff; - - blastorigin = (inflictor.origin + (inflictor.mins + inflictor.maxs) * 0.5); - - targ = findradius (blastorigin, rad); - while (targ) - { - if (targ != inflictor) - if (ignore != targ) - { - // LordHavoc: measure distance to nearest point on target (not origin) - // (this guarentees 100% damage on a touch impact) - nearest = blastorigin; - m1 = targ.origin + targ.mins; - m2 = targ.origin + targ.maxs; - if (nearest_x < m1_x) nearest_x = m1_x; - if (nearest_y < m1_y) nearest_y = m1_y; - if (nearest_z < m1_z) nearest_z = m1_z; - if (nearest_x > m2_x) nearest_x = m2_x; - if (nearest_y > m2_y) nearest_y = m2_y; - if (nearest_z > m2_z) nearest_z = m2_z; - diff = nearest - blastorigin; - // round up a little on the damage to ensure full damage on impacts - // and turn the distance into a fraction of the radius - power = 1 - ((vlen (diff) - 2) / rad); - //bprint(" "); - //bprint(ftos(power)); - if (power > 0) - { - if (power > 1) - power = 1; - finaldmg = coredamage * power + edgedamage * (1 - power); - if (finaldmg > 0) - { - force = normalize((m1 + m2) * 0.5 - blastorigin) * (finaldmg / coredamage) * forceintensity; - if (targ == attacker) - finaldmg = finaldmg * cvar("g_balance_selfdamagepercent"); // Partial damage if the attacker hits himself - Damage (targ, inflictor, attacker, finaldmg, deathtype, inflictor.origin, force); - } - } - } - targ = targ.chain; - } -} - - -entity multi_ent; -float multi_damage; -vector multi_force; - -void ClearMultiDamage (void) -{ - multi_ent = world; - multi_damage = 0; - multi_force = '0 0 0'; -} - -void ApplyMultiDamage (void) -{ - if (!multi_ent) - return; - -// Damage (self, multi_ent.origin, multi_ent, 0, multi_damage, multi_force); - TF_T_Damage (multi_ent, self, self, multi_damage, 2, 1); -} - -void AddMultiDamage (entity hit, float damage, vector force) -{ - if (!hit) - return; - - if (hit != multi_ent) - { - ApplyMultiDamage (); - ClearMultiDamage (); - multi_ent = hit; - } - multi_damage = multi_damage + damage; - multi_force = multi_force + force; -} - -/*void FireBullets (float shotcount, vector dir, vector spread, float deathtype) -{ - vector direction; - vector source; - vector vel; - vector org; - - makevectors (self.v_angle); - - source = self.origin + v_forward * 10; // FIXME - source_x = self.absmin_z + self.size_z * 0.7; // ??? whaddabout view_ofs - - // LordHavoc: better to use normal damage - //ClearMultiDamage (); - while (shotcount > 0) - { - direction = dir + crandom () * spread_x * v_right + crandom () * spread_y * v_up; - - traceline (source, source + direction * 2048, FALSE, self); - if (trace_fraction != 1.0) - { - vel = normalize (direction + v_up * crandom () + v_right * crandom ()); - vel = vel + 2 * trace_plane_normal; - vel = vel * 200; - - org = trace_endpos - direction * 4; - - if (!trace_ent.takedamage) - te_gunshot (org); - // LordHavoc: better to use normal damage - //AddMultiDamage (trace_ent, 4, direction * 4); - Damage (trace_ent, self, self, 4, deathtype, trace_endpos, direction * 4); - } - - shotcount = shotcount + 1; - } - - // LordHavoc: better to use normal damage - //ApplyMultiDamage (); -}*/ - -float puff_count; -vector puff_org; -float blood_count; -vector blood_org; -float (entity ent) tfvisible; - -void (float damage,vector dir) TraceAttack = -{ - local vector vel; - local vector org; - - vel = normalize (((dir + (v_up * crandom ())) + (v_right * crandom ()))); - vel = (vel + (2 * trace_plane_normal)); - vel = (vel * 200); - org = (trace_endpos - (dir * 4)); - - if (tfvisible(trace_ent)) - trace_ent.takedamage = 1; - - if (trace_ent.takedamage) - { - blood_count = (blood_count + 1); - blood_org = org; - AddMultiDamage (trace_ent, damage); - } - else - { - puff_count = (puff_count + 1); - } -}; - -void (float shotcount,vector dir,vector spread) FireBullets = -{ - local vector direction; - local vector src; - - makevectors (self.v_angle); - src = (self.origin + (v_forward * 10)); - src_z = (self.absmin_z + (self.size_z * 0.7)); - ClearMultiDamage (); - traceline (src, (src + (dir * 2048)), 0.000000, self); - puff_org = (trace_endpos - (dir * 4)); - while ((shotcount > 0.000000)) - { - direction = ((dir + ((crandom () * spread_x) * v_right)) + ((crandom () * spread_y) * v_up)); - traceline (src, (src + (direction * 2048)), 0.000000, self); - if ((trace_fraction != 1)) - { - if ((self.weapon != 32768)) - { - TraceAttack (4, direction); - } - else - { - TraceAttack (9, direction); - } - } - shotcount = (shotcount - 1); - } - ApplyMultiDamage (); -}; diff --git a/attic/TeamNexuiz/game/gamec/g_decors.c b/attic/TeamNexuiz/game/gamec/g_decors.c deleted file mode 100644 index 87bbcd472..000000000 --- a/attic/TeamNexuiz/game/gamec/g_decors.c +++ /dev/null @@ -1,246 +0,0 @@ - -float maxclients; // set by worldspawn code -float numdecors; -float maxdecors; -.float createdtime; - -//void(vector org, entity en, vector dir, float splattype, float importance) newbloodsplat; -//void(vector org, float bodydamage, float armordamage, vector vel, float damgtype) genericbleedfunc; - -// removes the oldest decors each frame to maintain a certain maximum decors -void() decorframe = -{ - local entity estart, e, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10; - local float bt1, bt2, bt3, bt4, bt5, bt6, bt7, bt8, bt9, bt10, iterations; - - // numdecors is allowed to be bogus as long as it is >= the real number of decors - // (but perfection is clearly preferable) - if (numdecors <= maxdecors) - return; - - // recount all the decors - numdecors = 0; - estart = e = findchain(classname, "decor"); - while(e) - { - numdecors = numdecors + 1; - e = e.chain; - } - if (numdecors <= maxdecors) - return; // nothing to do - - // limit it to considering 10000 entities per frame, - // otherwise it can cause a runaway loop error - iterations = 0; - while (numdecors > maxdecors && iterations < 10000) - { - iterations = iterations + 1; - // find and remove the oldest decors (upto 10 at once) - b1 = b2 = b3 = b4 = b5 = b6 = b7 = b8 = b9 = b10 = world; - bt1 = bt2 = bt3 = bt4 = bt5 = bt6 = bt7 = bt8 = bt9 = bt10 = time + 10000; - if (iterations > 0) - estart = findchain(classname, "decor"); - e = estart; - while(e) - { - iterations = iterations + 1; - if (e.createdtime < bt10) - { - if (e.createdtime < bt9) - { - if (e.createdtime < bt8) - { - if (e.createdtime < bt7) - { - if (e.createdtime < bt6) - { - if (e.createdtime < bt5) - { - if (e.createdtime < bt4) - { - if (e.createdtime < bt3) - { - if (e.createdtime < bt2) - { - if (e.createdtime < bt1) - { - b10=b9;bt10=bt9; - b9=b8;bt9=bt8; - b8=b7;bt8=bt7; - b7=b6;bt7=bt6; - b6=b5;bt6=bt5; - b5=b4;bt5=bt4; - b4=b3;bt4=bt3; - b3=b2;bt3=bt2; - b2=b1;bt2=bt1; - b1=e;bt1=e.createdtime; - } - else - { - b10=b9;bt10=bt9; - b9=b8;bt9=bt8; - b8=b7;bt8=bt7; - b7=b6;bt7=bt6; - b6=b5;bt6=bt5; - b5=b4;bt5=bt4; - b4=b3;bt4=bt3; - b3=b2;bt3=bt2; - b2=e;bt2=e.createdtime; - } - } - else - { - b10=b9;bt10=bt9; - b9=b8;bt9=bt8; - b8=b7;bt8=bt7; - b7=b6;bt7=bt6; - b6=b5;bt6=bt5; - b5=b4;bt5=bt4; - b4=b3;bt4=bt3; - b3=e;bt3=e.createdtime; - } - } - else - { - b10=b9;bt10=bt9; - b9=b8;bt9=bt8; - b8=b7;bt8=bt7; - b7=b6;bt7=bt6; - b6=b5;bt6=bt5; - b5=b4;bt5=bt4; - b4=e;bt4=e.createdtime; - } - } - else - { - b10=b9;bt10=bt9; - b9=b8;bt9=bt8; - b8=b7;bt8=bt7; - b7=b6;bt7=bt6; - b6=b5;bt6=bt5; - b5=e;bt5=e.createdtime; - } - } - else - { - b10=b9;bt10=bt9; - b9=b8;bt9=bt8; - b8=b7;bt8=bt7; - b7=b6;bt7=bt6; - b6=e;bt6=e.createdtime; - } - } - else - { - b10=b9;bt10=bt9; - b9=b8;bt9=bt8; - b8=b7;bt8=bt7; - b7=e;bt7=e.createdtime; - } - } - else - { - b10=b9;bt10=bt9; - b9=b8;bt9=bt8; - b8=e;bt8=e.createdtime; - } - } - else - { - b10=b9;bt10=bt9; - b9=e;bt9=e.createdtime; - } - } - else - { - b10=e;bt10=e.createdtime; - } - } - // failed all 10 slots - e = e.chain; - } - // remove the oldest decors - if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b1);} - if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b2);} - if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b3);} - if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b4);} - if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b5);} - if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b6);} - if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b7);} - if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b8);} - if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b9);} - if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b10);} - } -}; - -entity() newdecor = -{ - local entity e; - numdecors++; - e = spawn(); - e.classname = "decor"; - return e; -}; - -void(entity e) removedecor = -{ - numdecors--; - remove(e); -}; - - -void(vector org, vector vel, float amount) blood = -{ - te_blood(org, vel, amount); -}; - -void(vector org, vector vel, float amount) spark = -{ - te_spark(org, vel, amount); -}; - -void(vector m1, vector m2, float vel, float amount) bloodshower = -{ - te_bloodshower(m1, m2, vel, amount); -}; - -void(vector org, float quad) bulletpuff = -{ - if (quad) - te_gunshotquad(org); - else - te_gunshot(org); -}; - -void(vector org, float quad) nailpuff = -{ - if (quad) - te_superspikequad(org); - else - te_superspike(org); -}; - -// used for various little bouncing debris to avoid getting stuck in the air -void() DecorThink = -{ - self.nextthink = time; - self.flags = self.flags - (self.flags & FL_ONGROUND); - if (pointcontents(self.origin) == CONTENT_SOLID) - removedecor(self); -}; - -.float createdtime; - -void() InitDecors = -{ - // different number of decors in multi-player (to avoid lag on modems) - if (maxclients > 1) - maxdecors = 32; - else - maxdecors = 100; - // overridable by saved2 cvar on server console - if (cvar("decors")) - maxdecors = cvar("decors"); - if (maxdecors < 1) - maxdecors = 1; -}; diff --git a/attic/TeamNexuiz/game/gamec/g_lights.c b/attic/TeamNexuiz/game/gamec/g_lights.c deleted file mode 100644 index 7c17760cb..000000000 --- a/attic/TeamNexuiz/game/gamec/g_lights.c +++ /dev/null @@ -1,120 +0,0 @@ -float LOOP = 1; - -float DNOSHADOW = 2; -float DFOLLOW = 4; -.float light_lev; -.float lefty; -.vector color; -.string dtagname; - -/*QUAKED dynlight (0 1 0) (-8 -8 -8) (8 8 8) START_OFF NOSHADOW FOLLOW -Dynamic light. -Can do one of these things: sit still and be just a silly light, travel along a path, follow an entity around, attach to a tag on an entity. -It can spin around it's own axis in all the above cases. -If targeted, it will toggle between on or off. -keys: -"light_lev" light radius, default 200 -"color" light color in rgb and brightness, 1 1 1 produces bright white, up to 255 255 255 (nuclear blast), recommended values up to 1 1 1, default 1 1 1 -"style" lightstyle, same as for static lights -"angles" initial orientation -"avelocity" a vector value, the direction and speed it rotates in -"skin" cubemap number, must be 16 or above -"dtagname" will attach to this tag on the entity which "targetname" matches "target". If the "target" is either not an md3 model or is missing tags, it will attach to the targets origin. Note that the "target" must be visible to the light -"targetname" will toggle on and off when triggered -"target" if issued with a target, preferrably path_corner, it will move along the path. If also issued with the FOLLOW spawnflag, then this is the entity it will follow. If issued with the "tagname" key it will attach it to this targets tag called "tagname", does not work together with FOLLOW or path movement -"speed" the speed it will travel along the path, default 100 -flags: -"START_OFF" light will be in off state until targeted -"NOSHADOW" will not cast shadows in realtime lighting mode -"FOLLOW" will follow the entity which "targetname" matches "target" -*/ -void() dynlight_think = -{ - if(!self.owner) - remove(self); - - self.nextthink = 0.1; -}; -void() dynlight_find_aiment = -{ - local entity targ; - - targ = find(world, targetname, self.target); - self.movetype = MOVETYPE_FOLLOW; - self.aiment = targ; - self.owner = targ; - self.punchangle = targ.angles; - self.view_ofs = self.origin - targ.origin; - self.v_angle = self.angles - targ.angles; - self.nextthink = 0.1; - self.think = dynlight_think; -}; -void() dynlight_find_path = -{ - local entity targ; - - targ = find(world, targetname, self.target); - self.target = targ.target; - setorigin (self, targ.origin); - self.nextthink = self.ltime + 0.1; - self.think = train_next; -}; -void() dynlight_use = -{ - if (self.light_lev == 0) - self.light_lev = self.lefty; - else - self.light_lev = 0; -}; -void() dynlight = -{ - local entity targ; - - if (!self.light_lev) - self.light_lev = 200; - if (!self.color) - self.color = '1 1 1'; - self.lefty = self.light_lev; - self.use = dynlight_use; - setsize (self, '0 0 0', '0 0 0'); - setorigin (self, self.origin); - //self.pflags = PFLAGS_FULLDYNAMIC; - self.solid = SOLID_NOT; - //self.blocked = SUB_Null; - //if (self.spawnflags & DNOSHADOW) - // self.pflags = self.pflags + PFLAGS_NOSHADOW; - //if (self.spawnflags & START_OFF) - // self.light_lev = 0; - -//tag attaching - if (self.dtagname) - { - if (!self.target) - objerror ("dynlight: no target to follow"); - targ = find(world, targetname, self.target); - setattachment(self, targ, self.dtagname); - self.owner = targ; - self.think = dynlight_think; - return; - } - -// entity following - if (self.spawnflags & DFOLLOW) - { - if (!self.target) - objerror ("dynlight: no target to follow"); - self.nextthink = time + 0.1; - self.think = dynlight_find_aiment; - return; - } -// path following - if (self.target) -// if (!(self.spawnflags & DFOLLOW)) - { - self.movetype = MOVETYPE_PUSH; - if (!self.speed) - self.speed = 100; - self.nextthink = self.ltime + 0.1; - self.think = dynlight_find_path; - } -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/g_subs.c b/attic/TeamNexuiz/game/gamec/g_subs.c deleted file mode 100644 index a9ce56423..000000000 --- a/attic/TeamNexuiz/game/gamec/g_subs.c +++ /dev/null @@ -1,456 +0,0 @@ -void() SUB_Null = {}; - -void(vector destangle, float tspeed, void() func) SUB_CalcAngleMove; -void() SUB_CalcMoveDone; -void() SUB_CalcAngleMoveDone; -//void() SUB_UseTargets; -void() SUB_Remove; - -void info_null (void) -{ -} - -/* -================== -SUB_Remove - -Remove self -================== -*/ -void SUB_Remove (void) -{ - remove (self); -} - -/* -================== -SUB_VanishOrRemove - -Makes client invisible or removes non-client -================== -*/ -void SUB_VanishOrRemove (entity ent) -{ - if (ent.flags & FL_CLIENT) - { - // vanish - ent.effects = EF_NODRAW; - } - else - { - // remove - remove (ent); - } -} - -void ExtinguishFlame(entity targ); - -void SUB_SetFade_Think (void) -{ - if(self.onfire) - ExtinguishFlame(self); - self.think = SUB_SetFade_Think; - self.nextthink = self.fade_time; - self.alpha = 1 - (time - self.fade_time) * self.fade_rate; - if (self.alpha < 0.01) - SUB_VanishOrRemove(self); - self.alpha = bound(0.01, self.alpha, 1); -} - -/* -================== -SUB_SetFade - -Fade 'ent' out when time >= 'when' -================== -*/ -void SUB_SetFade (entity ent, float when, float fadetime) -{ - //if (ent.flags & FL_CLIENT) // && ent.deadflag != DEAD_NO) - // return; - //ent.alpha = 1; - ent.fade_rate = 1/fadetime; - ent.fade_time = when; - ent.think = SUB_SetFade_Think; - ent.nextthink = when; -} - -/* -============= -SUB_CalcMove - -calculate self.velocity and self.nextthink to reach dest from -self.origin traveling at speed -=============== -*/ -/* -void SUB_CalcMoveDone (void) -{ - // After moving, set origin to exact final destination - - setorigin (self, self.finaldest); - self.velocity = '0 0 0'; - self.nextthink = -1; - if (self.think1) - self.think1 (); -} -*/ -/*void SUB_CalcMove (vector tdest, float tspeed, void() func) -{ - vector delta; - float traveltime; - - if (!tspeed) - objerror ("No speed is defined!"); - - self.think1 = func; - self.finaldest = tdest; - self.think = SUB_CalcMoveDone; - - if (tdest == self.origin) - { - self.velocity = '0 0 0'; - self.nextthink = self.ltime + 0.1; - return; - } - - delta = tdest - self.origin; - traveltime = vlen (delta) / tspeed; - - if (traveltime < 0.1) - { - self.velocity = '0 0 0'; - self.nextthink = self.ltime + 0.1; - return; - } - - self.velocity = delta * (1/traveltime); // QuakeC doesn't allow vector/float division - - self.nextthink = self.ltime + traveltime; -}*/ - -void () SUB_CalcMoveDone = -{ - setorigin (self, self.finaldest); - self.velocity = '0 0 0'; - self.nextthink = -1; - if (self.think1) - { - self.think1 (); - } -}; - -void (vector tdest, float tspeed, void() func) SUB_CalcMove = -{ - local vector vdestdelta; - local float len; - local float traveltime; - - if (!tspeed) - { - objerror ("No speed is defined!"); - } - self.think1 = func; - self.finaldest = tdest; - self.think = SUB_CalcMoveDone; - if ((tdest == self.origin)) - { - self.velocity = '0 0 0'; - self.nextthink = (self.ltime + 0.1); - return; - } - vdestdelta = (tdest - self.origin); - len = vlen (vdestdelta); - traveltime = (len / tspeed); - if ((traveltime < 0.1)) - { - self.velocity = '0 0 0'; - self.nextthink = (self.ltime + 0.1); - return; - } - self.nextthink = (self.ltime + traveltime); - self.velocity = (vdestdelta * (1 / traveltime)); -}; - -void SUB_CalcMoveEnt (entity ent, vector tdest, float tspeed, void() func) -{ - entity oldself; - - oldself = self; - self = ent; - - SUB_CalcMove (tdest, tspeed, func); - - self = oldself; -} - -/* -============= -SUB_CalcAngleMove - -calculate self.avelocity and self.nextthink to reach destangle from -self.angles rotating - -The calling function should make sure self.think is valid -=============== -*/ -void SUB_CalcAngleMoveDone (void) -{ - // After rotating, set angle to exact final angle - self.angles = self.finalangle; - self.avelocity = '0 0 0'; - self.nextthink = -1; - if (self.think1) - self.think1 (); -} - -void SUB_CalcAngleMove (vector destangle, float tspeed, void() func) -{ - vector delta; - float traveltime; - - if (!tspeed) - objerror ("No speed is defined!"); - - delta = destangle = self.angles; - traveltime = vlen (delta) / tspeed; - - self.avelocity = delta * (1 / traveltime); - - self.think1 = func; - self.finalangle = destangle; - - self.think = SUB_CalcAngleMoveDone; - self.nextthink = self.ltime + traveltime; -} - -void SUB_CalcAngleMoveEnt (entity ent, vector destangle, float tspeed, void() func) -{ - entity oldself; - - oldself = self; - self = ent; - - SUB_CalcAngleMove (destangle, tspeed, func); - - self = oldself; -} - -/* -================== -main - -unused but required by the engine -================== -*/ -void main (void) -{ - -} - -// Sound functions - -/* -================== -PointSound - -Play a sound at the given location -================== -*/ -void PointSound (vector org, string snd, float vol, float attn) -{ - entity speaker; - - speaker = spawn (); - setorigin (speaker, org); - sound (speaker, CHAN_BODY, snd, vol, attn); - remove (speaker); -} - -// Misc - -/* -================== -traceline_hitcorpse - -A version of traceline that must be used by SOLID_SLIDEBOX things that want to hit SOLID_CORPSE things with a trace attack -================== -*/ -void traceline_hitcorpse (entity source, vector v1, vector v2, float nomonst, entity forent) -{ - float oldsolid; - - oldsolid = source.solid; - source.solid = SOLID_BBOX; - - traceline (v1, v2, nomonst, forent); - - source.solid = oldsolid; -} - -/* -================== -findbetterlocation - -Returns a point at least 12 units away from walls -(useful for explosion animations, although the blast is performed where it really happened) -Ripped from DPMod -================== -*/ -vector findbetterlocation (vector org) -{ - vector loc; - - traceline (org, org - '12 0 0', TRUE, world); - if (trace_fraction < 1) - { - loc = trace_endpos; - traceline (loc, loc + '12 0 0', TRUE, world); - if (trace_fraction >= 1) - org = loc + '12 0 0'; - } - - traceline (org, org - '-12 0 0', TRUE, world); - if (trace_fraction < 1) - { - loc = trace_endpos; - traceline (loc, loc + '-12 0 0', TRUE, world); - if (trace_fraction >= 1) - org = loc + '-12 0 0'; - } - - traceline (org, org - '0 12 0' , TRUE, world); - if (trace_fraction < 1) - { - loc = trace_endpos; - traceline (loc, loc + '0 12 0', TRUE, world); - if (trace_fraction >= 1) - org = loc + '0 12 0'; - } - - traceline (org, org - '0 -12 0', TRUE, world); - if (trace_fraction < 1) - { - loc = trace_endpos; - traceline (loc, loc + '0 -12 0', TRUE, world); - if (trace_fraction >= 1) - org = loc + '0 -12 0'; - } - - traceline (org, org - '0 0 12' , TRUE, world); - if (trace_fraction < 1) - { - loc = trace_endpos; - traceline (loc, loc + '0 0 12', TRUE, world); - if (trace_fraction >= 1) - org = loc + '0 0 12'; - } - - traceline (org, org - '0 0 -12', TRUE, world); - if (trace_fraction < 1) - { - loc = trace_endpos; - traceline (loc, loc + '0 0 -12', TRUE, world); - if (trace_fraction >= 1) - org = loc + '0 0 -12'; - } - - return org; -} - -/* -================== -crandom - -Returns a random number between -1.0 and 1.0 -================== -*/ -float crandom (void) -{ - return 2 * (random () - 0.5); -} - -/* -================== -Angc used for animations -================== -*/ - - -float angc (float a1, float a2) -{ - float a; - - while (a1 > 180) - a1 = a1 - 360; - while (a1 < -179) - a1 = a1 + 360; - - while (a2 > 180) - a2 = a2 - 360; - while (a2 < -179) - a2 = a2 + 360; - - a = a1 - a2; - while (a > 180) - a = a - 360; - while (a < -179) - a = a + 360; - - return a; -} - - -/* -================ -InitTrigger -================ -*/ - -void() SetMovedir = -{ - if (self.movedir != '0 0 0') - self.movedir = normalize(self.movedir); - else - { - if (self.angles == '0 -1 0') - self.movedir = '0 0 1'; - else if (self.angles == '0 -2 0') - self.movedir = '0 0 -1'; - else - { - makevectors (self.angles); - self.movedir = v_forward; - } - } - - self.angles = '0 0 0'; -}; - -void() InitTrigger = -{ -// trigger angles are used for one-way touches. An angle of 0 is assumed -// to mean no restrictions, so use a yaw of 360 instead. - if (self.movedir == '0 0 0') - if (self.angles != '0 0 0') - SetMovedir (); - self.solid = SOLID_TRIGGER; - setmodel (self, self.model); // set size and link into world - self.movetype = MOVETYPE_NONE; - self.modelindex = 0; - self.model = ""; -}; - -void() InitSolidBSPTrigger = -{ -// trigger angles are used for one-way touches. An angle of 0 is assumed -// to mean no restrictions, so use a yaw of 360 instead. - if (self.movedir == '0 0 0') - if (self.angles != '0 0 0') - SetMovedir (); - self.solid = SOLID_BSP; - setmodel (self, self.model); // set size and link into world - self.movetype = MOVETYPE_PUSH; -// self.modelindex = 0; - self.model = ""; -}; diff --git a/attic/TeamNexuiz/game/gamec/g_tetris.c b/attic/TeamNexuiz/game/gamec/g_tetris.c deleted file mode 100644 index f78aac272..000000000 --- a/attic/TeamNexuiz/game/gamec/g_tetris.c +++ /dev/null @@ -1,746 +0,0 @@ -/* - -Installation: - -in weapons.qc add TetrisImpulses(); to ImpulseCommands - -in progs.src add tetris.qc after subs.qc -in client.qc add if (TetrisPreFrame()) return; to PlayerPreThink -in client.qc add if (TetrisPostFrame()) return; to PlayerPostThink - -*/ - -.vector tet_org; - -.float tetris_on, tet_time, tet_autodown; -.vector piece_pos; -.float piece_type, next_piece, tet_score, tet_lines; - -var float tet_high_score = 0; - -float TET_LINES = 20; -float TET_WIDTH = 10; -//character values -float TET_BORDER = 132; -float TET_BLOCKS = 132; // +1 = first color, +2, +3; -float TET_SPACE = 32; // blankness - - - -float TETKEY_UP = 1; -float TETKEY_DOWN = 2; -float TETKEY_LEFT = 4; -float TETKEY_RIGHT = 8; -float TETKEY_ROTLEFT = 16; -float TETKEY_ROTRIGHT = 32; - -float PIECES = 7; - -.float line1, line2, line3, line4, line5, line6, line7, -line8, line9, line10, line11, line12, line13, line14, line15, -line16, line17, line18, line19, line20; - - -float SVC_CENTERPRINTa = 26; - - -/* -********************************* - -Library Functions - -********************************* -*/ -void (float ln, float vl) SetLine = -{ - if (ln == 1) - self.line1 = vl; - else if (ln == 2) - self.line2 = vl; - else if (ln == 3) - self.line3 = vl; - else if (ln == 4) - self.line4 = vl; - else if (ln == 5) - self.line5 = vl; - else if (ln == 6) - self.line6 = vl; - else if (ln == 7) - self.line7 = vl; - else if (ln == 8) - self.line8 = vl; - else if (ln == 9) - self.line9 = vl; - else if (ln == 10) - self.line10 = vl; - else if (ln == 11) - self.line11 = vl; - else if (ln == 12) - self.line12 = vl; - else if (ln == 13) - self.line13 = vl; - else if (ln == 14) - self.line14 = vl; - else if (ln == 15) - self.line15 = vl; - else if (ln == 16) - self.line16 = vl; - else if (ln == 17) - self.line17 = vl; - else if (ln == 18) - self.line18 = vl; - else if (ln == 19) - self.line19 = vl; - else if (ln == 20) - self.line20 = vl; -}; - -float (float ln) GetLine = -{ - if (ln == 1) - return self.line1; - else if (ln == 2) - return self.line2; - else if (ln == 3) - return self.line3; - else if (ln == 4) - return self.line4; - else if (ln == 5) - return self.line5; - else if (ln == 6) - return self.line6; - else if (ln == 7) - return self.line7; - else if (ln == 8) - return self.line8; - else if (ln == 9) - return self.line9; - else if (ln == 10) - return self.line10; - else if (ln == 11) - return self.line11; - else if (ln == 12) - return self.line12; - else if (ln == 13) - return self.line13; - else if (ln == 14) - return self.line14; - else if (ln == 15) - return self.line15; - else if (ln == 16) - return self.line16; - else if (ln == 17) - return self.line17; - else if (ln == 18) - return self.line18; - else if (ln == 19) - return self.line19; - else if (ln == 20) - return self.line20; - else - return 0; -}; - -float(float x, float dat) GetXBlock = -{ - if (x == 1) - return dat & 3; - else if (x == 2) - return (dat & 12) / 4; - else if (x == 3) - return (dat & 48) / 16; - else if (x == 4) - return (dat & 192) / 64; - else if (x == 5) - return (dat & 768) / 256; - else if (x == 6) - return (dat & 3072) / 1024; - else if (x == 7) - return (dat & 12288) / 4096; - else if (x == 8) - return (dat & 49152) / 16384; - else if (x == 9) - return (dat & 196608) / 65536; - else if (x == 10) - return (dat & 786432) / 262144; - else - return 0; -}; - -float(float x, float dat, float new) SetXBlock = -{ - if (x == 1) - return (dat - (dat & 3)) | new; - else if (x == 2) - return (dat - (dat & 12)) | (new*4); - else if (x == 3) - return (dat - (dat & 48)) | (new*16); - else if (x == 4) - return (dat - (dat & 192)) | (new*64); - else if (x == 5) - return (dat - (dat & 768)) | (new*256); - else if (x == 6) - return (dat - (dat & 3072)) | (new*1024); - else if (x == 7) - return (dat - (dat & 12288)) | (new*4096); - else if (x == 8) - return (dat - (dat & 49152)) | (new*16384); - else if (x == 9) - return (dat - (dat & 196608)) | (new*65536); - else if (x == 10) - return (dat - (dat & 786432)) | (new*262144); - else - return dat; -}; - - -float(float x, float y) GetSquare = -{ - return GetXBlock(x, GetLine(y)); -}; - -void (float x, float y, float val) SetSquare = -{ - float dat; - - dat = GetLine(y); - dat = SetXBlock(x, dat, val & 3); - SetLine(y, dat); -}; - - - -vector(float pc) PieceShape = -{ - -/* -1 = - ## - ## -*/ - if (pc == 1) - return '20 20 0'; // 1 * 4 + 1 * 16 -/* -2 = - -#### -*/ - else if (pc == 2) - return '85 0 0'; - -/* -3 = - -### -# -*/ - else if (pc == 3) - return '21 1 0'; -/* -4 = - -# -### -*/ - else if (pc == 4) - return '1 21 0'; -/* -5 = -## - ## -*/ - else if (pc == 5) - return '5 20 0'; - -/* -6 = - ## -## -*/ - else if (pc == 6) - return '20 5 0'; - -/* -7 = - # -### -*/ - else if (pc == 7) - return '4 21 0'; - - - else - return '0 0 0'; - -} - -// do x 1..4 and y 1..4 in case of rotation -float(float x, float y, float rot, float pc) PieceMetric = -{ - float t; - vector piece_dat; - - // return bits of a piece - if (rot == 1) // 90 degrees - { - t = y; - y = x; - x = 5 - t; - } - else if (rot == 2)//180 - { - x = 5 - x; - y = 3 - y; - } - else if (rot == 3) // 270 - { - t = y; - y = 5 - x; - x = t; - } - if (x < 1 || y < 1 || x > 4 || y > 2) - return 0; - piece_dat = PieceShape(pc); - if (y == 1) - return GetXBlock(x, piece_dat_x); // first row - else if (y == 2) - return GetXBlock(x, piece_dat_y); // second row - else if (y == 3) - return GetXBlock(x, piece_dat_z); // third row (doesn't exist) - else - return 0; // illegal parms -}; -/* -********************************* - -Draw - -********************************* -*/ - - -/* some prydon gate functions to make life easier.... - -somewhat modified because we don't need all the fanciness Prydon Gate is capable of - -*/ - -void(float c1, float c2, float c3, float c4, float c5, float c6) p6 = -{ - WriteChar(MSG_ONE, c1); - WriteChar(MSG_ONE, c2); - WriteChar(MSG_ONE, c3); - WriteChar(MSG_ONE, c4); - WriteChar(MSG_ONE, c5); - WriteChar(MSG_ONE, c6); -}; - -float(float num, float dig) pnum = -{ - local float f, i; - if (num < 0) - { - WriteChar(MSG_ONE, 45); - num = 0 - num; - } - f = floor(num / 10); - num = num - (f * 10); - if (f) - dig = pnum(f, dig+1); - else - { - // pad to 6 - for (i = 0; i < (5 - dig); i = i + 1) - WriteChar(MSG_ONE, TET_SPACE); - } - WriteChar(MSG_ONE, 48 + num); - return dig; -}; - -void (float ln) DrawLine = -{ - float x, d; - WriteChar(MSG_ONE, TET_BORDER); - - for (x = 1; x <= TET_WIDTH; x = x + 1) - { - d = GetSquare(x, ln); - if (d) - WriteChar(MSG_ONE, TET_BLOCKS + d); - else - WriteChar(MSG_ONE, TET_SPACE); - } - WriteChar(MSG_ONE, TET_BORDER); -} - -void (float pc, float ln) DrawPiece = -{ - float x, d, piece_ln, color; - vector piece_dat; - color = pc & 3; - if (color == 0) // 4 - color = 1; - WriteChar(MSG_ONE, TET_SPACE); // pad to 6 - - piece_dat = PieceShape(pc); - if (ln == 1) - piece_ln = piece_dat_x; - else - piece_ln = piece_dat_y; - for (x = 1; x <= 4; x = x + 1) - { - d = GetXBlock(x, piece_ln) * color; - if (d) - WriteChar(MSG_ONE, TET_BLOCKS + d); - else - WriteChar(MSG_ONE, TET_SPACE); - } - WriteChar(MSG_ONE, TET_SPACE); // pad to 6 -} -void() Draw_Tetris = -{ - float i; - msg_entity = self; - WriteChar(MSG_ONE, SVC_CENTERPRINTa); - // decoration - for (i = 1; i <= (TET_WIDTH + 2); i = i + 1) - WriteChar(MSG_ONE, TET_BORDER); - p6(' ', ' ', ' ', ' ', ' ', ' '); - WriteChar(MSG_ONE, 10); - for (i = 1; i <= TET_LINES; i = i + 1) - { - DrawLine(i); - if (i == 1) - p6(' ', 'N', 'E', 'X', 'T', ' '); - else if (i == 3) - DrawPiece(self.next_piece, 1); - else if (i == 4) - DrawPiece(self.next_piece, 2); - else if (i == 6) - p6(' ', 'L', 'I', 'N', 'E', 'S'); - else if (i == 7) - pnum(self.tet_lines, 0); - else if (i == 9) - p6(' ', 'S', 'C', 'O', 'R', 'E'); - else if (i == 10) - pnum(self.tet_score, 0); - else if (i == 12) - p6(' ', 'H', 'I', 'G', 'H', ' '); - else if (i == 13) - p6(' ', 'S', 'C', 'O', 'R', 'E'); - else if (i == 14) - pnum(tet_high_score, 0); - else if (i == 16) - p6(' ', 'L', 'E', 'V', 'E', 'L'); - else if (i == 17) - pnum(floor(self.tet_lines / 20)+ 1, 0); - else - p6(' ', ' ', ' ', ' ', ' ', ' '); - WriteChar(MSG_ONE, 10); - } - // decoration - - for (i = 1; i <= (TET_WIDTH + 2); i = i + 1) - WriteChar(MSG_ONE, TET_BORDER); - p6(' ', ' ', ' ', ' ', ' ', ' '); - WriteChar(MSG_ONE, 10); - WriteChar(MSG_ONE, 0); -} -/* -********************************* - -Game Functions - -********************************* -*/ - -// reset the game -void() ResetTetris = -{ - float i; - - for (i=1; i<=TET_LINES; i = i + 1) - SetLine(i, 0); - self.piece_pos = '0 0 0'; - self.piece_type = 0; - self.next_piece = self.tet_lines = self.tet_score = 0; - -}; - -void () Tet_GameOver = -{ - centerprint(self, "Game Over"); - self.tetris_on = 0; - ResetTetris(); - self.movetype = MOVETYPE_WALK; -}; - - - -/* -********************************* - -Game Mechanics - -********************************* -*/ -float() RandomPiece = -{ - return floor(random() * PIECES) + 1; -}; - -void(float n) TetAddScore = -{ - self.tet_score = self.tet_score + n; - if (self.tet_score > tet_high_score) - tet_high_score = self.tet_score; -}; -float CheckMetrics(float piece, float orgx, float orgy, float rot) = -{ - // check to see if the piece, if moved to the locations will overlap - - float x, y; - // why did I start counting from 1, damnit - orgx = orgx - 1; - orgy = orgy - 1; - - for (y = 1; y < 5; y = y + 1) - { - for (x = 1; x < 5; x = x + 1) - { - if (PieceMetric(x, y, rot, piece)) - { - if (GetSquare(x + orgx, y + orgy)) - return FALSE; // uhoh, gonna hit something. - if (x+orgx<1 || x+orgx > TET_WIDTH || y+orgy<1 || y+orgy> TET_LINES) - return FALSE; // ouside the level - } - } - } - return TRUE; -} - -void ClearPiece(float piece, float orgx, float orgy, float rot) = -{ - - float x, y; - // why did I start counting from 1, damnit - orgx = orgx - 1; - orgy = orgy - 1; - - for (y = 1; y < 5; y = y + 1) - { - for (x = 1; x < 5; x = x + 1) - { - if (PieceMetric(x, y, rot, piece)) - { - SetSquare(x + orgx, y + orgy, 0); - } - } - } -} -void CementPiece(float piece, float orgx, float orgy, float rot) = -{ - float color; - float x, y; - // why did I start counting from 1, damnit - orgx = orgx - 1; - orgy = orgy - 1; - - color = piece & 3; - if (color == 0) // 4 - color = 1; - - for (y = 1; y < 5; y = y + 1) - { - for (x = 1; x < 5; x = x + 1) - { - if (PieceMetric(x, y, rot, piece)) - { - SetSquare(x + orgx, y + orgy, color); - } - } - } -} - -float LINE_LOW = 349525; -float LINE_HIGH = 699050; // above number times 2 - -void() CompletedLines = -{ - float y, cleared, ln; - - cleared = 0; - y = TET_LINES; - while(y >= 1) - { - ln = GetLine(y); - if (((ln & LINE_LOW) | ((ln & LINE_HIGH)/2)) == LINE_LOW) - cleared = cleared + 1; - else - y = y - 1; - ln = GetLine(y - cleared); - SetLine(y, ln); - } - self.tet_lines = self.tet_lines + cleared; - TetAddScore(cleared * cleared * 10); -}; - -void(float keyss) HandleGame = -{ - - // first off, we need to see if we need a new piece - vector check_pos; - float brand_new; - brand_new = 0; - if (self.tet_time > time) - return; - self.tet_time = time + 0.1; - - - if (self.piece_type == 0) - { - self.piece_pos = '5 1 0'; // that's about middle top, we count from 1 ARGH - if (self.next_piece) - self.piece_type = self.next_piece; - else - self.piece_type = RandomPiece(); - self.next_piece = RandomPiece(); - keyss = 0; // no movement first frame - self.tet_autodown = time + 0.2; - brand_new = 1; - } - else - ClearPiece(self.piece_type, self.piece_pos_x, self.piece_pos_y, self.piece_pos_z); - - // next we need to check the piece metrics against what's on the level - // based on the key order - - check_pos = self.piece_pos; - - if (keyss & TETKEY_RIGHT) - check_pos_x = check_pos_x + 1; - else if (keyss & TETKEY_LEFT) - check_pos_x = check_pos_x - 1; - else if (keyss & TETKEY_ROTRIGHT) - check_pos_z = check_pos_z + 1; - else if (keyss & TETKEY_ROTLEFT) - check_pos_z = check_pos_z - 1; - // bounds check - if (check_pos_z > 3) - check_pos_z = 0; - else if (check_pos_z < 0) - check_pos_z = 3; - - // reality check - if (CheckMetrics(self.piece_type, check_pos_x, check_pos_y, check_pos_z)) - self.piece_pos = check_pos; - else if (brand_new) - Tet_GameOver(); - check_pos = self.piece_pos; - if (keyss & TETKEY_DOWN) - check_pos_y = check_pos_y + 1; - else if (self.tet_autodown < time) - { - check_pos_y = check_pos_y + 1; - self.tet_autodown = time + 1 / (floor(self.tet_lines / 20) + 1); - } - if (CheckMetrics(self.piece_type, check_pos_x, check_pos_y, check_pos_z)) - self.piece_pos = check_pos; - else - { - CementPiece(self.piece_type, self.piece_pos_x, self.piece_pos_y, self.piece_pos_z); - TetAddScore(1); - CompletedLines(); - self.piece_type = 0; - return; - } - CementPiece(self.piece_type, self.piece_pos_x, self.piece_pos_y, self.piece_pos_z); -}; - -/* -********************************* - -Important Linking Into Quake stuff - -********************************* -*/ - - -void() TetrisImpulses = -{ - if (self.impulse == 200) - { - self.tetris_on = 1; - ResetTetris(); - self.tet_org = self.origin; - self.movetype = MOVETYPE_NOCLIP; - stuffcmd(self, "cl_bob 0\ncl_rollangle 0\n"); - } -}; - - -float() TetrisPreFrame = -{ - if (!self.tetris_on) - return 0; - - self.tet_org = self.origin; - if (self.tet_time > time) - return 1; - Draw_Tetris(); - return 1; - -}; -float(float v) frik_anglemoda = -{ - return v - floor(v/360) * 360; -}; -float (float y1, float y2) angcompa = -{ - y1 = frik_anglemoda(y1); - y2 = frik_anglemoda(y2); - - local float answer; - answer = y1 - y2; - if (answer > 180) - answer = answer - 360; - else if (answer < -180) - answer = answer + 360; - return answer; -}; - - -float() TetrisPostFrame = -{ - vector mov; - float keysa, norm; - - keysa = 0; - - if (!self.tetris_on) - return 0; - if (self.origin != self.tet_org) - { - mov = vectoangles(self.origin - self.tet_org); - self.origin = self.tet_org; - - norm = angcompa(self.v_angle_y, mov_y); - - if (norm > -80 && norm < 80) - keysa = keysa | TETKEY_UP; - if (norm > 10 && norm < 170) - keysa = keysa | TETKEY_RIGHT; - if (norm > 100 || norm < -260) - keysa = keysa | TETKEY_DOWN; - if (norm > -170 && norm < -10) - keysa = keysa | TETKEY_LEFT; - } - if (self.button0) - keysa = keysa | TETKEY_ROTRIGHT; - if (self.button2) - keysa = keysa | TETKEY_ROTLEFT; - HandleGame(keysa); - return 1; -}; - diff --git a/attic/TeamNexuiz/game/gamec/g_triggers.c b/attic/TeamNexuiz/game/gamec/g_triggers.c deleted file mode 100644 index 27ea8dd39..000000000 --- a/attic/TeamNexuiz/game/gamec/g_triggers.c +++ /dev/null @@ -1,869 +0,0 @@ -// Move to tfdefs: -entity damage_attacker; // ADD FUNCTION FOR - -void() SUB_UseTargets; - -void() DelayThink = -{ - activator = self.enemy; - SUB_UseTargets (); - remove(self); -}; - -/* -============================== -SUB_UseTargets - -the global "activator" should be set to the entity that initiated the firing. - -If self.delay is set, a DelayedUse entity will be created that will actually -do the SUB_UseTargets after that many seconds have passed. - -Centerprints any self.message to the activator. - -Removes all entities with a targetname that match self.killtarget, -and removes them, so some events can remove other triggers. - -Search for (string)targetname in all entities that -match (string)self.target and call their .use function - -============================== -*/ -/*void() SUB_UseTargets = -{ - local entity t, stemp, otemp, act; - -// -// check for a delay -// - if (self.delay) - { - // create a temp object to fire at a later time - t = spawn(); - t.classname = "DelayedUse"; - t.nextthink = time + self.delay; - t.think = DelayThink; - t.enemy = activator; - t.message = self.message; - t.killtarget = self.killtarget; - t.target = self.target; - return; - } - - -// -// print the message -// - if (activator.classname == "player" && self.message != "") - { - centerprint (activator, self.message); - if (!self.noise) - sound (activator, CHAN_VOICE, "misc/talk.wav", 1, ATTN_NORM); - } - -// -// kill the killtagets -// - if (self.killtarget) - { - t = world; - do - { - t = find (t, targetname, self.killtarget); - if (!t) - return; - remove (t); - } while ( 1 ); - } - -// -// fire targets -// - if (self.target) - { - act = activator; - t = world; - do - { - t = find (t, targetname, self.target); - if (!t) - { - return; - } - stemp = self; - otemp = other; - self = t; - other = stemp; - if (self.use) - self.use (); - self = stemp; - other = otemp; - activator = act; - } while ( 1 ); - } - - -};*/ - - - -void() trigger_reactivate = -{ - self.solid = SOLID_TRIGGER; -}; - -//============================================================================= - -float SPAWNFLAG_NOMESSAGE = 1; -float SPAWNFLAG_NOTOUCH = 1; - -// the wait time has passed, so set back up for another activation -void() multi_wait = -{ - if (self.max_health) - { - self.health = self.max_health; - self.takedamage = DAMAGE_YES; - self.solid = SOLID_BBOX; - } -}; - - -// the trigger was just touched/killed/used -// self.enemy should be set to the activator so it can be held through a delay -// so wait for the delay time before firing -/*void() multi_trigger = -{ - if (self.nextthink > time) - { - return; // allready been triggered - } - - if (self.classname == "trigger_secret") - { - if (self.enemy.classname != "player") - return; - found_secrets = found_secrets + 1; - WriteByte (MSG_ALL, SVC_FOUNDSECRET); - } - - if (self.noise) - sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); - -// don't trigger again until reset - self.takedamage = DAMAGE_NO; - - activator = self.enemy; - - SUB_UseTargets(); - - if (self.wait > 0) - { - self.think = multi_wait; - self.nextthink = time + self.wait; - } - else - { // we can't just remove (self) here, because this is a touch function - // called wheil C code is looping through area links... - self.touch = SUB_Null; - - self.nextthink = time + 0.1; - self.think = SUB_Remove; - } -};*/ - -void() multi_trigger = -{ - if (self.nextthink > time) - { - return; - } - if (self.classname == "trigger_secret") - { - if (self.enemy.classname != "player") - { - return; - } - found_secrets = found_secrets + TF_FLARE_OFF; - WriteByte(2, 28); - } - if (self.noise) - { - sound(self, 2, self.noise, TF_FLARE_OFF, TF_FLARE_OFF); - } - self.takedamage = TF_FLARE_LIT; - activator = self.enemy; - SUB_UseTargets(); - if (self.wait > TF_FLARE_LIT) - { - self.think = multi_wait; - self.nextthink = time + self.wait; - } - else - { - self.touch = SUB_Null; - self.nextthink = time + 0.1; - self.think = SUB_Remove; - } -}; - -void() multi_killed = -{ - self.enemy = damage_attacker; - multi_trigger(); -}; - -void() multi_use = -{ - self.enemy = activator; - multi_trigger(); -}; - -void() multi_touch = -{ - local entity te; - if (other.classname != "player") - { - return; - } - if (other.is_dead == 1) - return; - if (!Activated(self, other)) - { - if (self.else_goal != TF_FLARE_LIT) - { - te = Findgoal(self.else_goal); - if (te) - { - DoResults(te, other, self.goal_result & 2); - } - } - return; - } -// if the trigger has an angles field, check player's facing direction - if (self.movedir != '0 0 0') - { - makevectors (other.angles); - if (v_forward * self.movedir < 0) - return; // not facing the right way - } - - self.enemy = other; - multi_trigger(); -}; - -void multi_eventdamage (vector hitloc, float damage, entity inflictor, entity attacker, float deathtype) -{ - if (!self.takedamage) - return; - self.health = self.health - damage; - if (self.health <= 0) - { - self.enemy = attacker; - multi_trigger(); - } -} - -/*QUAKED trigger_multiple (.5 .5 .5) ? notouch -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. -"wait" : Seconds between triggerings. (.2 default) -If notouch is set, the trigger is only fired by other entities, not by touching. -NOTOUCH has been obsoleted by trigger_relay! -sounds -1) secret -2) beep beep -3) large switch -4) -set "message" to text string -*/ -void (float tno) ConvertToGoal; -void () CheckIfQ3FTrigger; -void() trigger_multiple = -{ -/* if (CheckIfQ3FTrigger() == 1) - { - ConvertToGoal (1); - return; - } - if (CheckIfQ3FTrigger() == 2) - { - ConvertToGoal (2); - return; - }*/ - CheckIfQ3FTrigger (); - - if (self.sounds == 1) - { - precache_sound ("misc/secret.wav"); - self.noise = "misc/secret.wav"; - } - else if (self.sounds == 2) - { - precache_sound ("misc/talk.wav"); - self.noise = "misc/talk.wav"; - } - else if (self.sounds == 3) - { - precache_sound ("misc/trigger1.wav"); - self.noise = "misc/trigger1.wav"; - } - - if (!self.wait) - self.wait = 0.2; - self.use = multi_use; - - InitTrigger (); - - if (self.health) - { - if (self.spawnflags & SPAWNFLAG_NOTOUCH) - objerror ("health and notouch don't make sense\n"); - self.max_health = self.health; - self.th_die = multi_killed; // added by xavior - self.event_damage = multi_eventdamage; - self.takedamage = DAMAGE_YES; - self.solid = SOLID_BBOX; - setorigin (self, self.origin); // make sure it links into the world - } - else - { - if ( !(self.spawnflags & SPAWNFLAG_NOTOUCH) ) - { - self.touch = multi_touch; - } - } -}; - - -/*QUAKED trigger_once (.5 .5 .5) ? notouch -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 -"targetname". If "health" is set, the trigger must be killed to activate. -If notouch is set, the trigger is only fired by other entities, not by touching. -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. Use "360" for an angle of 0. -sounds -1) secret -2) beep beep -3) large switch -4) -set "message" to text string -*/ -/*void() trigger_once = -{ - self.wait = -1; - trigger_multiple(); -};*/ - -//============================================================================= - -/*QUAKED trigger_relay (.5 .5 .5) (-8 -8 -8) (8 8 8) -This fixed size trigger cannot be touched, it can only be fired by other events. It can contain killtargets, targets, delays, and messages. -*/ -void() trigger_relay = -{ - self.use = SUB_UseTargets; -}; - - -//============================================================================= - - -void() counter_use = -{ - self.count = self.count - 1; - if (self.count < 0) - return; - - if (self.count != 0) - { - if (activator.classname == "player" - && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0) - { - if (self.count >= 4) - centerprint (activator, "There are more to go..."); - else if (self.count == 3) - centerprint (activator, "Only 3 more to go..."); - else if (self.count == 2) - centerprint (activator, "Only 2 more to go..."); - else - centerprint (activator, "Only 1 more to go..."); - } - return; - } - - if (activator.classname == "player" - && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0) - centerprint(activator, "Sequence completed!"); - self.enemy = activator; - multi_trigger (); -}; - -/*QUAKED trigger_counter (.5 .5 .5) ? nomessage -Acts as an intermediary for an action that takes multiple inputs. - -If nomessage is not set, t will print "1 more.. " etc when triggered and "sequence complete" when finished. - -After the counter has been triggered "count" times (default 2), it will fire all of it's targets and remove itself. -*/ -void() trigger_counter = -{ - self.wait = -1; - if (!self.count) - self.count = 2; - - self.use = counter_use; -}; - -/*.float triggerhurttime; -void() hurt_touch = -{ - if (other.takedamage) - if (other.triggerhurttime < time) - { - other.triggerhurttime = time + 1; - Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER, other.origin, '0 0 0'); - } - - return; -};*/ - -/*QUAKED trigger_hurt (.5 .5 .5) ? -Any object touching this will be hurt -set dmg to damage amount -defalt dmg = 5 -*/ -/*void() trigger_hurt = -{ - InitTrigger (); - self.touch = hurt_touch; - if (!self.dmg) - self.dmg = 1000; - if (!self.message) - self.message = "was in the wrong place."; -};*/ - -//void() target_speaker_use = {sound(self, CHAN_VOICE, self.noise, 1, 1);} -//void() target_speaker = {self.use = target_speaker_use;} - -void() target_speaker = -{ -if(self.noise) { - precache_sound (self.noise); - ambientsound (self.origin, self.noise, 1, ATTN_STATIC); -} -//remove(self); -}; - - -/* -void() sparksthink = -{ - self.nextthink = time + 0.1; - - if(random() < self.wait) { - te_spark(self.origin,'0 0 -1',self.cnt); - } -} - - -void() func_sparks = -{ - self.think = sparksthink; - self.nextthink = time + 0.2; - - // self.cnt is the amount of sparks that one burst will spawn - if(self.cnt < 1) { - self.cnt = 25.0; // nice default value - } - - // self.wait is the probability that a sparkthink will spawn a spark shower - // range: 0 - 1, but 0 makes little sense, so... - if(self.wait < 0.05) { - self.wait = 0.25; // nice default value - } - - // sound - if(self.noise) { - precache_sound (self.noise); - ambientsound (self.origin, self.noise, 1, ATTN_STATIC); - } -} -*/ - - -/* -============================================================================= - -SECRET DOORS - -============================================================================= -*/ -// Doors are in TFDOORS.C -/*void() fd_secret_move1; -void() fd_secret_move2; -void() fd_secret_move3; -void() fd_secret_move4; -void() fd_secret_move5; -void() fd_secret_move6; -void() fd_secret_done; - -float SECRET_OPEN_ONCE = 1; // stays open -float SECRET_1ST_LEFT = 2; // 1st move is left of arrow -float SECRET_1ST_DOWN = 4; // 1st move is down from arrow -float SECRET_NO_SHOOT = 8; // only opened by trigger -float SECRET_YES_SHOOT = 16; // shootable even if targeted - - -void () fd_secret_use = -{ - local float temp; - - self.health = 10000; - //self.havocattack = TRUE; - - // exit if still moving around... - if (self.origin != self.oldorigin) - return; - - self.message = ""; // no more message - - SUB_UseTargets(); // fire all targets / killtargets - - self.velocity = '0 0 0'; - - // Make a sound, wait a little... - - if (self.noise1 != "") - sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); - self.nextthink = self.ltime + 0.1; - - temp = 1 - (self.spawnflags & SECRET_1ST_LEFT); // 1 or -1 - makevectors(self.mangle); - - if (!self.t_width) - { - if (self.spawnflags & SECRET_1ST_DOWN) - self.t_width = fabs(v_up * self.size); - else - self.t_width = fabs(v_right * self.size); - } - - if (!self.t_length) - self.t_length = fabs(v_forward * self.size); - - if (self.spawnflags & SECRET_1ST_DOWN) - self.dest1 = self.origin - v_up * self.t_width; - else - self.dest1 = self.origin + v_right * (self.t_width * temp); - - self.dest2 = self.dest1 + v_forward * self.t_length; - SUB_CalcMove(self.dest1, self.speed, fd_secret_move1); - if (self.noise2 != "") - sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM); -}; - -// Wait after first movement... -void () fd_secret_move1 = -{ - self.nextthink = self.ltime + 1.0; - self.think = fd_secret_move2; - if (self.noise3 != "") - sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); -}; - -// Start moving sideways w/sound... -void () fd_secret_move2 = -{ - if (self.noise2 != "") - sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM); - SUB_CalcMove(self.dest2, self.speed, fd_secret_move3); -}; - -// Wait here until time to go back... -void () fd_secret_move3 = -{ - if (self.noise3 != "") - sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); - if (!(self.spawnflags & SECRET_OPEN_ONCE)) - { - self.nextthink = self.ltime + self.wait; - self.think = fd_secret_move4; - } -}; - -// Move backward... -void () fd_secret_move4 = -{ - if (self.noise2 != "") - sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM); - SUB_CalcMove(self.dest1, self.speed, fd_secret_move5); -}; - -// Wait 1 second... -void () fd_secret_move5 = -{ - self.nextthink = self.ltime + 1.0; - self.think = fd_secret_move6; - if (self.noise3 != "") - sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); -}; - -void () fd_secret_move6 = -{ - if (self.noise2 != "") - sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM); - SUB_CalcMove(self.oldorigin, self.speed, fd_secret_done); -}; - -void () fd_secret_done = -{ - if (!self.targetname || self.spawnflags&SECRET_YES_SHOOT) - { - self.health = 10000; - self.takedamage = DAMAGE_YES; - //self.th_pain = fd_secret_use; - } - if (self.noise3 != "") - sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); -}; - -void () secret_blocked = -{ - if (time < self.attack_finished) - return; - self.attack_finished = time + 0.5; - //T_Damage (other, self, self, self.dmg, self.dmg, self.deathtype, DT_IMPACT, (self.absmin + self.absmax) * 0.5, '0 0 0', Obituary_Generic); -};*/ - -/* -============== -secret_touch - -Prints messages -================ -*/ // now in TFDOORS.C -/*void() secret_touch = -{ - if (activator.classname != "player") - return; - if (self.attack_finished > time) - return; - - self.attack_finished = time + 2; - - if (self.message) - { - if (other.flags & FL_CLIENT) - centerprint (other, self.message); - sound (other, CHAN_BODY, "misc/talk.wav", 1, ATTN_NORM); - } -};*/ - - -/*QUAKED func_door_secret (0 .5 .8) ? open_once 1st_left 1st_down no_shoot always_shoot -Basic secret door. Slides back, then to the side. Angle determines direction. -wait = # of seconds before coming back -1st_left = 1st move is left of arrow -1st_down = 1st move is down from arrow -always_shoot = even if targeted, keep shootable -t_width = override WIDTH to move back (or height if going down) -t_length = override LENGTH to move sideways -"dmg" damage to inflict when blocked (2 default) - -If a secret door has a targetname, it will only be opened by it's botton or trigger, not by damage. -"sounds" -1) medieval -2) metal -3) base -*/ - -/*void () func_door_secret = -{ - /*if (!self.deathtype) // map makers can override this - self.deathtype = " got in the way";*/ -/* - if (!self.dmg) - self.dmg = 2; - - // Magic formula... - self.mangle = self.angles; - self.angles = '0 0 0'; - self.solid = SOLID_BSP; - self.movetype = MOVETYPE_PUSH; - self.classname = "door"; - setmodel (self, self.model); - setorigin (self, self.origin); - - self.touch = secret_touch; - self.blocked = secret_blocked; - self.speed = 50; - self.use = fd_secret_use; - if ( !self.targetname || self.spawnflags&SECRET_YES_SHOOT) - { - self.health = 10000; - self.takedamage = DAMAGE_YES; - self.event_damage = fd_secret_use; - } - self.oldorigin = self.origin; - if (!self.wait) - self.wait = 5; // 5 seconds before closing -};*/ - - -// TF DOORS // MOVED THIS TO SEPERATE TF DOORS FILE - -// MOVE TO TFTRIGGERS -void() trigger_once = -{ - if (CheckExistence() == TF_FLARE_LIT) - { - dremove(self); - return; - } - self.wait = -1; - trigger_multiple(); -}; - -void() hurt_on = -{ - self.solid = TF_FLARE_OFF; - self.nextthink = -1; -}; - -void() hurt_touch = -{ - local entity te; - if (other.is_dead != 0) // added by xavior to stop killing of dead bodies - return; //// - if (other.takedamage) - { - if (!Activated(self, other)) - { - if (self.else_goal != TF_FLARE_LIT) - { - te = Findgoal(self.else_goal); - if (te) - { - DoResults(te, other, self.goal_result & 2); - } - } - return; - } - self.solid = TF_FLARE_LIT; - deathmsg = 36; - TF_T_Damage(other, self, self, self.dmg, TF_FLARE_OFF, TF_FLARE_LIT); - self.think = hurt_on; - self.nextthink = time + TF_FLARE_OFF; - } -}; - -void() trigger_hurt = -{ - if (self.allowteams == "red") // Converted to work with q3f/ETF entities - { - self.team_no = 2; - self.owned_by = 2; - } - if (self.allowteams == "blue") - { - self.owned_by = 1; - self.team_no = 1; - } - - if (CheckExistence() == TF_FLARE_LIT) - { - dremove(self); - return; - } - InitTrigger(); - self.touch = hurt_touch; - if (!(self.dmg)) - { - self.dmg = 5; - } -}; - - -// TF SUBS -void () SUB_UseTargets = -{ - local entity t; - local entity stemp; - local entity otemp; - local entity act; - - if (self.dont_do_triggerwork) - { - self.dont_do_triggerwork = 0; - return; - } - if (self.delay) - { - t = spawn (); - t.classname = "DelayedUse"; - t.nextthink = (time + self.delay); - t.think = DelayThink; - t.enemy = activator; - t.message = self.message; - t.killtarget = self.killtarget; - t.target = self.target; - return; - } - if (((activator.classname == "player") && (self.message != ""))) - { - CenterPrint (activator, self.message); - if (!self.noise) - { - sound (activator, 2, "misc/talk.wav", 1, 1); - } - } - if ((activator.classname == "player")) - { - DoGroupWork (self, activator); - DoGoalWork (self, activator); - } - if (self.killtarget) - { - t = world; - do - { - t = find (t, targetname, self.killtarget); - if (!t) - { - return; - } - remove (t); - - } while (1); - } - if (self.target) - { - act = activator; - t = world; - do - { - t = find (t, targetname, self.target); - if (!t) - { - return; - } - stemp = self; - otemp = other; - self = t; - other = stemp; - if ((self.use != SUB_Null)) - { - if (self.use) - { - self.use (); - } - } - self = stemp; - other = otemp; - activator = act; - - } while (1); - } -}; - diff --git a/attic/TeamNexuiz/game/gamec/g_violence.c b/attic/TeamNexuiz/game/gamec/g_violence.c deleted file mode 100644 index dfed7d5ae..000000000 --- a/attic/TeamNexuiz/game/gamec/g_violence.c +++ /dev/null @@ -1,58 +0,0 @@ -void GibDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - float r; - r = random (); - if (r < 0.60) - sound (self, CHAN_IMPACT, "misc/gib_splat01.wav", 1, ATTN_NORM); - else if (r < 0.65) - sound (self, CHAN_IMPACT, "misc/gib_splat02.wav", 1, ATTN_NORM); - else if (r < 0.70) - sound (self, CHAN_IMPACT, "misc/gib_splat03.wav", 1, ATTN_NORM); - else if (r < 0.75) - sound (self, CHAN_IMPACT, "misc/gib_splat04.wav", 1, ATTN_NORM); - te_blood (self.origin + '0 0 1', '0 0 30', 10); - self.health = self.health - damage; - if (self.health <= -12) - { - self.event_damage = SUB_Null; - SUB_VanishOrRemove (self); - } -} - - -void GibTouch () -{ - GibDamage (other, other, 11, 0, self.origin, '0 0 0'); -} - -// changes by LordHavoc on 03/30/04 -// TossGib now takes a gib entity so it can be used for tossing heads -// gib.velocity now uses randomvec() instead of a bunch of manual random calls -// merged Gib() into PlayerGib() -entity TossGib (entity gib, string mdlname, vector org, vector v, float destroyontouch) -{ - if (gib == world) - gib = spawn (); - gib.classname = "gib"; - gib.movetype = MOVETYPE_BOUNCE; - gib.solid = SOLID_CORPSE; - gib.skin = 0; - gib.effects = 0; - - setmodel (gib, mdlname); - setsize (gib, '-8 -8 -8', '8 8 8'); - setorigin (gib, org); - - gib.health = -1; - gib.takedamage = DAMAGE_YES; - gib.damageforcescale = 3.5; - gib.event_damage = GibDamage; - if (destroyontouch == 1) - gib.touch = GibTouch; - - gib.velocity = v + randomvec() * 450; - gib.avelocity = randomvec() * 300; - - SUB_SetFade (gib, time + 12 + random () * 4, 1); - return gib; -} diff --git a/attic/TeamNexuiz/game/gamec/g_world.c b/attic/TeamNexuiz/game/gamec/g_world.c deleted file mode 100644 index 6727a63d5..000000000 --- a/attic/TeamNexuiz/game/gamec/g_world.c +++ /dev/null @@ -1,724 +0,0 @@ -entity lastspawn; - -void() dom_init; - -void worldspawn (void) -{ - // Precache all player models - // Workaround for "invisible players" - precache_model("models/class/engineer_male.zym"); - precache_model("models/class/engineer_female.zym"); - precache_model("models/class/engineer_other.zym"); - precache_model("models/class/soldier_male.zym"); - precache_model("models/class/soldier_female.zym"); - precache_model("models/class/soldier_mechanical.zym"); - precache_model("models/class/scout_male.zym"); - precache_model("models/class/scout_female.zym"); - precache_model("models/class/scout_mechanical.zym"); - precache_model("models/class/medic_male.zym"); - precache_model("models/class/medic_female.zym"); - precache_model("models/class/medic_mechanical.zym"); - precache_model("models/class/pyro_male.zym"); - precache_model("models/class/pyro_female.zym"); - precache_model("models/class/pyro_mechanical.zym"); - precache_model("models/class/spy_male.zym"); - precache_model("models/class/spy_female.zym"); - precache_model("models/class/spy_mechanical.zym"); - - lastspawn = world; - - // the gravity set here can be overwritten by .cfg - if(world.gravity) - { - cvar_set("sv_gravity", ftos(world.gravity)); - } - else - cvar_set("sv_gravity", "800"); - - game = cvar ("gamecfg"); // load game options - - //precache_model ("progs/beam.mdl"); - precache_model ("progs/beam.mdl"); - precache_model ("models/bullet.mdl"); - precache_model ("models/casing_bronze.mdl"); - precache_model ("models/casing_shell.mdl"); - precache_model ("models/casing_steel.mdl"); - precache_model ("models/ebomb.mdl"); - precache_model ("models/elaser.mdl"); - precache_model ("models/flash.md3"); - precache_model ("models/gibs/bloodyskull.md3"); - precache_model ("models/gibs/chunk.mdl"); - precache_model ("models/gibs/eye.md3"); - precache_model ("models/gibs/gib1.md3"); - //precache_model ("models/gibs/gib2.md3"); - //precache_model ("models/gibs/gib3.md3"); - //precache_model ("models/gibs/gib4.md3"); - precache_model ("models/gibs/gib5.md3"); - //precache_model ("models/gibs/gib6.md3"); - precache_model ("models/gibs/gib1.mdl"); - precache_model ("models/gibs/gib2.mdl"); - precache_model ("models/gibs/gib3.mdl"); - precache_model ("models/grenademodel.md3"); - precache_model ("models/hagarmissile.mdl"); - precache_model ("models/items/a_bullets.mdl"); - precache_model ("models/items/a_cells.md3"); - precache_model ("models/items/a_rockets.md3"); - precache_model ("models/items/a_shells.md3"); - precache_model ("models/items/g_a1.md3"); - precache_model ("models/items/g_a25.md3"); - precache_model ("models/items/g_h1.md3"); - precache_model ("models/items/g_h25.md3"); - precache_model ("models/items/g_h100.md3"); - precache_model ("models/items/g_invincible.md3"); - precache_model ("models/items/g_strength.md3"); - precache_model ("models/laser.mdl"); - precache_model ("models/misc/chatbubble.spr"); - precache_model ("models/nexflash.md3"); - precache_model ("models/plasma.mdl"); - precache_model ("models/plasmatrail.mdl"); - precache_model ("models/rocket.md3"); - precache_model ("models/sprites/grenadeexplosion.spr32"); - precache_model ("models/sprites/hagarexplosion.spr32"); - precache_model ("models/sprites/muzzleflash.spr32"); - //precache_model ("models/sprites/plasmahitwall.spr32"); - //precache_model ("models/sprites/plasmashot.spr32"); - precache_model ("models/sprites/rocketexplosion.spr32"); - precache_model ("models/tracer.mdl"); - precache_model ("models/uziflash.md3"); - precache_model ("models/weapons/g_crylink.md3"); - precache_model ("models/weapons/g_electro.md3"); - precache_model ("models/weapons/g_gl.md3"); - precache_model ("models/weapons/g_hagar.md3"); - precache_model ("models/weapons/g_nex.md3"); - precache_model ("models/weapons/g_rl.md3"); - precache_model ("models/weapons/g_shotgun.md3"); - precache_model ("models/weapons/g_uzi.md3"); - precache_model ("models/weapons/v_crylink.md3"); - precache_model ("models/weapons/v_electro.md3"); - precache_model ("models/weapons/v_gl.md3"); - precache_model ("models/weapons/v_hagar.md3"); - precache_model ("models/weapons/v_laser.md3"); - precache_model ("models/weapons/v_nex.md3"); - precache_model ("models/weapons/v_rl.md3"); - precache_model ("models/weapons/v_shotgun.md3"); - precache_model ("models/weapons/v_uzi.md3"); - precache_model ("models/weapons/w_crylink.zym"); - precache_model ("models/weapons/w_electro.zym"); - precache_model ("models/weapons/w_gl.zym"); - precache_model ("models/weapons/w_hagar.zym"); - precache_model ("models/weapons/w_laser.zym"); - precache_model ("models/weapons/w_nex.zym"); - precache_model ("models/weapons/w_rl.zym"); - precache_model ("models/weapons/w_shotgun.zym"); - precache_model ("models/weapons/w_uzi.zym"); - - - - // new weapon models - precache_model ("models/weapons/v_rli.md3"); // incendiary rockets - precache_model ("models/weapons/v_flamer.md3"); // flamer - precache_model ("models/weapons/v_bombletts.md3"); // bombletts - precache_model ("models/weapons/v_hotbombs.md3"); // hot bombs - precache_model ("models/weapons/v_grapple.md3"); // grappling hook - precache_model ("models/weapons/v_namek.md3"); // namek - precache_model ("models/weapons/v_railgun.md3"); // railgun (engineer) - precache_model ("models/weapons/v_mac.md3"); // MAC10 (spy) - precache_model ("models/weapons/v_soldpistol.md3"); // Pistol - - precache_model ("models/weapons/w_rli.zym"); - precache_model ("models/weapons/w_flamer.zym"); - precache_model ("models/weapons/w_bombletts.zym"); - precache_model ("models/weapons/w_hotbombs.zym"); - precache_model ("models/weapons/w_grapple.zym"); - precache_model ("models/weapons/w_namek.zym"); - precache_model ("models/weapons/w_railgun.zym"); - precache_model ("models/weapons/w_mac.zym"); - precache_model ("models/weapons/w_soldpistol.zym"); - - - // other stuff - precache_model ("models/weapons/namekb.mdl"); - precache_sound ("weapons/namek_fire.wav"); - - precache_model ("models/misc/shield_s.mdl"); - - precache_model ("models/misc/ropebase.mdl"); - - // on fire sprites - precache_model ("models/sprites/fire_base.spr32"); - precache_model ("models/sprites/fire_top.spr32"); - - precache_model ("models/sprites/null.spr"); - - - precache_sound ("announcer/1fragleft.wav"); - precache_sound ("announcer/1minuteremains.wav"); - precache_sound ("announcer/2fragsleft.wav"); - precache_sound ("announcer/3fragsleft.wav"); - precache_sound ("announcer/welcometonexuiz.wav"); - precache_sound ("misc/armor1.wav"); - precache_sound ("misc/armor25.wav"); - precache_sound ("misc/armorimpact.wav"); - precache_sound ("misc/bodyimpact1.wav"); - precache_sound ("misc/bodyimpact2.wav"); - precache_sound ("misc/gib.wav"); - precache_sound ("misc/gib_splat01.wav"); - precache_sound ("misc/gib_splat02.wav"); - precache_sound ("misc/gib_splat03.wav"); - precache_sound ("misc/gib_splat04.wav"); - //precache_sound ("misc/h2ohit.wav"); - precache_sound ("misc/hit.wav"); - precache_sound ("misc/hitground1.wav"); - precache_sound ("misc/hitground2.wav"); - precache_sound ("misc/hitground3.wav"); - precache_sound ("misc/hitground4.wav"); - precache_sound ("misc/itempickup.wav"); - precache_sound ("misc/itemrespawn.wav"); - precache_sound ("misc/jumppad.wav"); - precache_sound ("misc/mediumhealth.wav"); - precache_sound ("misc/megahealth.wav"); - precache_sound ("misc/minihealth.wav"); - precache_sound ("misc/powerup.wav"); - precache_sound ("misc/talk.wav"); - precache_sound ("misc/teleport.wav"); - precache_sound ("plats/medplat1.wav"); - precache_sound ("plats/medplat2.wav"); - precache_sound ("player/lava.wav"); - precache_sound ("player/slime.wav"); - precache_sound ("weapons/crylink.wav"); - precache_sound ("weapons/crylink2.wav"); - precache_sound ("weapons/electro_fire.wav"); - precache_sound ("weapons/electro_fly.wav"); - precache_sound ("weapons/electro_impact.wav"); - precache_sound ("weapons/grenade_bounce.wav"); - precache_sound ("weapons/grenade_fire.wav"); - precache_sound ("weapons/grenade_impact.wav"); - precache_sound ("weapons/hagar_fire.wav"); - precache_sound ("weapons/hagexp1.wav"); - precache_sound ("weapons/hagexp2.wav"); - precache_sound ("weapons/hagexp3.wav"); - precache_sound ("weapons/lasergun_fire.wav"); - precache_sound ("weapons/laserimpact.wav"); - precache_sound ("weapons/nexfire.wav"); - precache_sound ("weapons/neximpact.wav"); - precache_sound ("weapons/ric1.wav"); - precache_sound ("weapons/ric2.wav"); - precache_sound ("weapons/ric3.wav"); - precache_sound ("weapons/rocket_fire.wav"); - precache_sound ("weapons/rocket_fly.wav"); - precache_sound ("weapons/rocket_impact.wav"); - precache_sound ("weapons/shotgun_fire.wav"); - precache_sound ("weapons/shotgun_reload.wav"); - precache_sound ("weapons/tink1.wav"); - precache_sound ("weapons/uzi_fire.wav"); - precache_sound ("weapons/weapon_switch.wav"); - precache_sound ("weapons/weaponpickup.wav"); - precache_sound ("weapons/flamer.wav"); - // Nex 1.5 Sound Precaches - precache_sound ("weapons/crylink_fire.ogg"); - precache_sound ("weapons/electro_bounce.ogg"); - precache_sound ("weapons/electro_fire.ogg"); - precache_sound ("weapons/electro_fire2.ogg"); - precache_sound ("weapons/electro_fly.wav"); - precache_sound ("weapons/electro_impact.ogg"); - precache_sound ("weapons/electro_impact_combo.ogg"); - precache_sound ("weapons/grenade_bounce.ogg"); - precache_sound ("weapons/grenade_fire.ogg"); - precache_sound ("weapons/grenade_impact.ogg"); - precache_sound ("weapons/hagar_fire.ogg"); - precache_sound ("weapons/hagexp1.ogg"); - precache_sound ("weapons/hagexp2.ogg"); - precache_sound ("weapons/hagexp3.ogg"); - precache_sound ("weapons/hook_fire.ogg"); - precache_sound ("weapons/hook_impact.ogg"); - precache_sound ("weapons/lasergun_fire.ogg"); - precache_sound ("weapons/laserimpact.ogg"); - precache_sound ("weapons/nexfire.ogg"); - precache_sound ("weapons/neximpact.ogg"); - precache_sound ("weapons/ric1.ogg"); - precache_sound ("weapons/ric2.ogg"); - precache_sound ("weapons/ric3.ogg"); - precache_sound ("weapons/rocket_fire.ogg"); - precache_sound ("weapons/rocket_fly.wav"); - precache_sound ("weapons/rocket_impact.ogg"); - precache_sound ("weapons/shotgun_fire.ogg"); - precache_sound ("weapons/tink1.ogg"); - precache_sound ("weapons/uzi_fire.ogg"); - precache_sound ("weapons/weapon_switch.ogg"); - precache_sound ("weapons/weaponpickup.ogg"); - precache_sound ("weapons/strength_fire.ogg"); - // Nex 1.5 Model/Sprite Precaches - precache_model ("models/sprites/rockexpl.spr"); - // TF SOUNDS & MODELS - precache_sound ("weapons/prime.wav"); - precache_sound ("weapons/gren.wav"); - precache_sound ("weapons/bounce.wav"); -// precache_sound ("player/step1l.wav"); - precache_sound ("weapons/throw.wav"); - precache_model ("progs/hgren2.mdl"); - precache_model ("models/ammo/grenade/grenade.md3"); - precache_model ("models/grenades/fragnade.md3"); - precache_model ("models/magmine/magnetmine.md3"); // mag mine - precache_model ("models/sentry/turr1_barrel.md3"); - precache_model ("models/proxi/proxymine2.md3"); - - // Misc TN Stuff - precache_model ("models/team/team.sp2"); - - - // plays music for the level if there is any - if (self.noise) - { - precache_sound (self.noise); - ambientsound ('0 0 0', self.noise, 1.00, ATTN_NONE); - } - - // 0 normal - lightstyle(0, "m"); - - // 1 FLICKER (first variety) - lightstyle(1, "mmnmmommommnonmmonqnmmo"); - - // 2 SLOW STRONG PULSE - lightstyle(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba"); - - // 3 CANDLE (first variety) - lightstyle(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg"); - - // 4 FAST STROBE - lightstyle(4, "mamamamamama"); - - // 5 GENTLE PULSE 1 - lightstyle(5,"jklmnopqrstuvwxyzyxwvutsrqponmlkj"); - - // 6 FLICKER (second variety) - lightstyle(6, "nmonqnmomnmomomno"); - - // 7 CANDLE (second variety) - lightstyle(7, "mmmaaaabcdefgmmmmaaaammmaamm"); - - // 8 CANDLE (third variety) - lightstyle(8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa"); - - // 9 SLOW STROBE (fourth variety) - lightstyle(9, "aaaaaaaazzzzzzzz"); - - // 10 FLUORESCENT FLICKER - lightstyle(10, "mmamammmmammamamaaamammma"); - - // 11 SLOW PULSE NOT FADE TO BLACK - lightstyle(11, "abcdefghijklmnopqrrqponmlkjihgfedcba"); - - // styles 32-62 are assigned by the light program for switchable lights - - // 63 testing - lightstyle(63, "a"); - - if (cvar("g_domination")) - dom_init(); -} - -/* // spawn redirect function; doesn't work! -entity spawn() -{ - entity e; - e = spawn_real(); - e.create_time = time; - return e; -}*/ - -void light (void) -{ - makestatic (self); -} - - -// reads and alters data/maplist.cfg (sliding it one line), and returns a -// strzoned string containing the next map -#define MAPLIST "maplist.cfg" -string() Nex_RotateMapList = -{ - local float lHandle; - local string lNextMap; - local string lCurrentMap; - local string lBuffer; - - lHandle = fopen( MAPLIST, FILE_READ ); - if( lHandle < 0 ) { - fclose( lHandle ); - // restart the current map if no other map is not found - return strzone( mapname ); - } - - // get the first line that will be moved to the end later - lCurrentMap = strzone( fgets( lHandle ) ); - if( !lCurrentMap ) { - fclose( lHandle ); - // restart the current map if no other map is not found - return strzone( mapname ); - } - - // now get the second line which is the map that should be loaded next - lBuffer = fgets( lHandle ); - // if there isnt a second line, nothing needs to be rotated - if( !lBuffer ) { - fclose( lHandle ); - strunzone( lCurrentMap ); - // restart the current map if no other map is not found - return strzone( mapname ); - } - - // since lBuffer holds the next map, it is assigned to nextmap - lNextMap = strzone( lBuffer ); - - // since fgets uses its own buffer we need to move lBuffer to a tempstring - // before reading the next line (or lBuffer will be lost) - lBuffer = strcat( lBuffer ); - - // read in the rest of the list - while( 1 ) { - local string lLine; - - lLine = fgets( lHandle ); - if( !lLine ) { - break; - } - - lBuffer = strcat( lBuffer, "\n", lLine ); - } - // rotate the list - lBuffer = strcat( lBuffer, "\n", lCurrentMap ); - - // dismiss lCurrentmap now - strunzone( lCurrentMap ); - - // and close the file handle - fclose( lHandle ); - - // open the maplist for output this one - lHandle = fopen( MAPLIST, FILE_WRITE ); - if( lHandle < 0 ) { - // this shouldnt happen! - // print a warning/error message - dprint( "Couldn't open ", MAPLIST, " for output!\n" ); - - strunzone( lNextMap ); - - // we return the currently running map - return strzone( mapname ); - } - - fputs( lHandle, lBuffer ); - - fclose( lHandle ); - - return lNextMap; -}; - -float gameover; -float intermission_running; -//float intermission_exittime; -float alreadychangedlevel; - - -void() GotoNextMap = -{ - local string nextmap; - //local float n, nummaps; - //local string s; - if (alreadychangedlevel) - return; - alreadychangedlevel = TRUE; - if (cvar("samelevel")) // if samelevel is set, stay on same level - changelevel (mapname); - else - { - // method 1 - - //local entity pos; - local float fh; - local string line; - - // restart current map if no cycle is found - nextmap = strzone(mapname); - fh = fopen("maplist.cfg", FILE_READ); - if (fh >= 0) - { - while (1) - { - line = fgets(fh); - if (nextmap == mapname) - { - strunzone(nextmap); - nextmap = strzone(line); - } - if (!line) - break; - if (line == mapname) - { - line = fgets(fh); - if (!line) - break; - strunzone(nextmap); - nextmap = strzone(line); - break; - } - } - fclose(fh); - } - changelevel (nextmap); - strunzone(nextmap); - - // method 2 - //nextmap = Nex_RotateMapList(); - //changelevel (nextmap); - //strunzone (nextmap); - // method 3 - /* - s = cvar_string("g_maplist"); - nummaps = tokenize(s); - // if no map list, restart current one - nextmap = mapname; - if (nummaps >= 1) - { - n = 0; - while (n < nummaps) - { - if (argv(n) == mapname) - break; - n = n + 1; - } - n = n + 1; - if (n >= nummaps) - n = 0; - nextmap = argv(n); - } - changelevel (nextmap); - */ - } -}; - - -/* -============ -IntermissionThink - -When the player presses attack or jump, change to the next level -============ -*/ -void() IntermissionThink = -{ - if (time < intermission_exittime) - return; - - if (time < intermission_exittime + 10 && !self.button0 && !self.button1 && !self.button2 && !self.button3) - return; - - GotoNextMap (); -}; - -/* -============ -FindIntermission - -Returns the entity to view from -============ -*/ -/* -entity() FindIntermission = -{ - local entity spot; - local float cyc; - -// look for info_intermission first - spot = find (world, classname, "info_intermission"); - if (spot) - { // pick a random one - cyc = random() * 4; - while (cyc > 1) - { - spot = find (spot, classname, "info_intermission"); - if (!spot) - spot = find (spot, classname, "info_intermission"); - cyc = cyc - 1; - } - return spot; - } - -// then look for the start position - spot = find (world, classname, "info_player_start"); - if (spot) - return spot; - -// testinfo_player_start is only found in regioned levels - spot = find (world, classname, "testplayerstart"); - if (spot) - return spot; - -// then look for the start position - spot = find (world, classname, "info_player_deathmatch"); - if (spot) - return spot; - - //objerror ("FindIntermission: no spot"); - return world; -}; -*/ - -/* -=============================================================================== - -RULES - -=============================================================================== -*/ - -/* -go to the next level for deathmatch -only called if a time or frag limit has expired -*/ -void() NextLevel = -{ - gameover = TRUE; - - intermission_running = 1; - -// enforce a wait time before allowing changelevel - intermission_exittime = time + 5; - - WriteByte (MSG_ALL, SVC_CDTRACK); - WriteByte (MSG_ALL, 3); - WriteByte (MSG_ALL, 3); - - //pos = FindIntermission (); - - other = find (world, classname, "player"); - while (other != world) - { - //other.nextthink = time + 0.5; - other.takedamage = DAMAGE_NO; - other.solid = SOLID_NOT; - other.movetype = MOVETYPE_NONE; - other.angles = other.v_angle; - other.angles_x = other.angles_x * -1; - /* - if (pos != world); - { - other.modelindex = 0; - other.weaponentity = world; // remove weapon model - other.view_ofs = '0 0 0'; - other.angles = other.v_angle = pos.mangle; - if (!other.angles) - { - other.angles = other.v_angle = pos.angles; - other.v_angle_x = other.v_angle_x * -1; - } - other.fixangle = TRUE; // turn this way immediately - setorigin (other, pos.origin); - } - */ - other = find (other, classname, "player"); - } - - WriteByte (MSG_ALL, SVC_INTERMISSION); -}; - -/* -============ -CheckRules_Player - -Exit deathmatch games upon conditions -============ -*/ -void() CheckRules_Player = -{ - local float fraglimit; - - if (gameover) // someone else quit the game already - return; - - fraglimit = cvar("fraglimit"); - if (fraglimit && self.frags >= fraglimit) - { - NextLevel (); - return; - } -}; - -float checkrules_oneminutewarning; -float checkrules_leaderfrags; -entity checkrules_leader; - -/* -============ -CheckRules_World - -Exit deathmatch games upon conditions -============ -*/ -void() CheckRules_World = -{ - local float timelimit; - local float fraglimit; - local float checkrules_oldleaderfrags; - local entity checkrules_oldleader; - local entity head; - - if (intermission_running) - if (time >= intermission_exittime + 60) - { - GotoNextMap(); - return; - } - - if (gameover) // someone else quit the game already - return; - - timelimit = cvar("timelimit") * 60; - fraglimit = cvar("fraglimit"); - - if (timelimit && time >= timelimit) - { - NextLevel (); - return; - } - - if (!checkrules_oneminutewarning && timelimit && time > timelimit - 60) - { - checkrules_oneminutewarning = TRUE; - sound(world, CHAN_AUTO, "announcer/1minuteremains.wav", 1, ATTN_NONE); - } - - checkrules_oldleader = checkrules_leader; - checkrules_oldleaderfrags = checkrules_leaderfrags; - checkrules_leaderfrags = 0; - checkrules_leader = world; - head = findchain(classname, "player"); - while (head) - { - if (checkrules_leaderfrags < head.frags) - { - checkrules_leaderfrags = head.frags; - checkrules_leader = head; - } - head = head.chain; - } - if (checkrules_leaderfrags <= 0) - { - checkrules_leader = world; - checkrules_leaderfrags = 0; - } - checkrules_leaderfrags = floor(checkrules_leaderfrags); - if (checkrules_leaderfrags != checkrules_oldleaderfrags) - { - if (checkrules_leaderfrags == fraglimit - 1) - sound(world, CHAN_AUTO, "announcer/1fragleft.wav", 1, ATTN_NONE); - else if (checkrules_leaderfrags == fraglimit - 2) - sound(world, CHAN_AUTO, "announcer/2fragsleft.wav", 1, ATTN_NONE); - else if (checkrules_leaderfrags == fraglimit - 3) - sound(world, CHAN_AUTO, "announcer/3fragsleft.wav", 1, ATTN_NONE); - } -// if (checkrules_leader != checkrules_oldleader)// && checkrules_leaderfrags > checkrules_oldleaderfrags) -// bprint("^1",checkrules_leader.netname, " has taken the lead with ", ftos(checkrules_leaderfrags), " frags\n"); -}; - diff --git a/attic/TeamNexuiz/game/gamec/mauvebot.c b/attic/TeamNexuiz/game/gamec/mauvebot.c deleted file mode 100644 index 681ae4736..000000000 --- a/attic/TeamNexuiz/game/gamec/mauvebot.c +++ /dev/null @@ -1,860 +0,0 @@ -/* - -MauveBot v1.0 for Nexuiz - -*/ - - - -//float intermission_running; - - - -.float skill_level; - - - -.float ai_time; - -.float threat; - -.entity dodgeent; - - - -float THREAT_UNFLAGGED = 0; - -float THREAT_IGNORE = -1; - - - -float DODGE_DIST = 500; - -float SEARCH_DIST = 1000; - - - -.float search_time; - - - -float bot_number; - - - -string(float r) BotName = -{ - string gender, name, cl; - - if(random() > 0.5) - { - gender = "female"; - } - else - { - gender = "male"; - } - - if (r == 1) - { - cl = "scout"; - self.playerskin = "0"; - } - else if (r == 2) - { - cl = "spy"; - self.playerskin = "0"; - } - else if (r == 3) - { - cl = "soldier"; - self.playerskin = "0"; - } - else if (r == 4) - { - cl = "pyro"; - self.playerskin = "0"; - } - else if (r == 5) - { - cl = "medic"; - self.playerskin = "0"; - } - else - { - cl = "engineer"; - self.playerskin = "0"; - } - - name = strzone(strcat("bot", ftos(ceil(random()*99)), "_", cl)); - - self.playermodel = strzone(strcat("models/class/", cl, "_", gender, ".zym")); - - return name; -}; - - - -string () PickARandomName = - -{ - - local float y, test; - - local string h; - - local entity t; - - - - t = find(world, classname, "player"); - - while(t) - - { - - if (clienttype(self) == CLIENTTYPE_BOT) - - y = y + 1; - - t = find(t, classname, "player"); - - } - - -/* - if (y > 25) - { - self.playermodel = "models/class/soldier_female.zym"; - self.playerskin = "0"; - return "EJP_Tank"; - } -*/ - - - y = TRUE; - - while(y) - { - test = ceil(random() * 6);//25); - h = BotName(test); - t = find(world, netname, h); - if (t == world) - y = FALSE; - } - - return h; - -}; - - - -// Adds a bot to the server - -void() add_MauveBot = - -{ - - local entity oldself; - - local float flo; - - local string str; - - - - oldself = self; - - self = spawnclient(); - - if (!self) - - { - - bprint("Can not add bot, server full.\n"); - - str = ftos(bot_number); - - cvar_set("bot_number", str); - - self = oldself; - - return; - - } - - - - flo = floor(random() * 5); - - if (flo == 0) - - self.clientcolors = 0; - - else if (flo == 1) - - self.clientcolors = 3; - - else if (flo == 2) - - self.clientcolors = 4; - - else if (flo == 3) - - self.clientcolors = 12; - - else if (flo == 4) - - self.clientcolors = 13; - - self.clientcolors = self.clientcolors + self.clientcolors * 16; - - - - self.netname = PickARandomName(); - - - - ClientConnect(); - - PutClientInServer(); - - self.skill_level = cvar("skill"); - - if (self.skill_level > 10) - - self.skill_level = 10; - - if (self.skill_level < 1) - - self.skill_level = 1; - - self = oldself; - - - - bot_number = bot_number + 1; - -}; - - - -void() remove_MauveBot = - -{ - - local float flo, i; - - local entity ent; - - - - flo = floor(random() * bot_number); - - - - ent = find(world, classname, "player"); - - - - while(ent) - - { - - if (clienttype(ent) == CLIENTTYPE_BOT) - - { - - if (flo == i) - - { - - dropclient(ent); - - if (bot_number > 0) - - bot_number = bot_number - 1; - - return; - - } - - i = i + 1; - - } - - ent = find(ent, classname, "player"); - - } - -}; - - - -float (entity targ) visible = - -{ - - local vector start, end, org; - - - -// if (self.skill_level < 3) - -// if (random() > self.skill_level / 10) - -// return FALSE; - - - - org = targ.origin; - - if (org == '0 0 0') - - org = (targ.absmin + targ.absmax) * 0.5; - - - - start = self.origin + self.view_ofs; - - end = org; - - traceline (start, end, TRUE, self); - - if (!(trace_inopen && trace_inwater)) - - if (trace_fraction == 1) - - return TRUE; - - return FALSE; - -}; - - - -void(entity ent) bot_set_angle = - -{ - - local vector view; - - local float flo; - - if (ent != world) - - { - - view = ent.origin; - - if (view == '0 0 0') - - view = (ent.absmin + ent.absmax) * 0.5; - - - - if (self.skill_level < 6) - - view = view - ent.velocity * (0.5 / self.skill_level); - - - - flo = vlen(ent.origin - self.origin) / (self.skill_level * 4); - - - - view_x = view_x + (random() * flo * 2) - flo; - - view_y = view_y + (random() * flo * 2) - flo; - - view_z = view_z + (random() * flo * 2) - flo; - - - - view = view - (self.origin + self.view_ofs); - - self.v_angle = vectoangles(view); - - self.v_angle_x = self.v_angle_x * -1; - - self.angles = self.v_angle; - - self.angles_x = self.angles_x * -1; - - if (self.angles_x > 180) - - self.angles_x = self.angles_x - 360; - - if (self.angles_x != 0) - - self.angles_x = self.angles_x / 6; - - } - - else - - self.angles_x = 0;// hack! - -}; - - - -void() MauveToGoal = - -{ - - local vector vec, en, diff, dir; - - - - vec = self.origin; - - movetogoal(20); - - en = self.origin; - - self.origin = vec; - - - - diff = en - self.origin; - - if (diff == '0 0 0') - - diff = self.goalentity.origin - self.origin; - - - - if (self.search_time < time) - - { - - self.goalentity.search_time = time + 20; - - self.goalentity = world; - - return; - - } - - - - dir = normalize(diff); - - dir = dir * cvar("cl_forwardspeed");// - (self.velocity - dir * (self.velocity * dir)); - - - - makevectors(self.v_angle); - - self.movement_x = dir * v_forward; - - self.movement_y = dir * v_right; - - self.movement_z = dir * v_up; - -}; - - - -void() look_for_stuff = - -{ - - local entity item, best, best2, best3; - - local float dist, tdist, dist2, topthreat; - - - - item = findradius(self.origin, 1000); - - - - if (self.search_time < time) - - self.enemy = world; - - - - if (self.enemy.health < 0) - - self.enemy = world; - - - - if (self.enemy.deadflag) - - self.enemy = world; - - - - dist = dist2 = SEARCH_DIST; - - topthreat = 0; - - - - while(item) - - { - - if (item.flags & FL_CLIENT) - - { - - if (item != self) - - { - - if ((item.health > 0) && (!item.deadflag)) - - { - - if (visible(item)) - - { - - tdist = vlen(item.origin - self.origin); - - if (tdist < dist) - - { - - best = item; - - dist = tdist; - - } - - } - - } - - } - - } - - else if (( (item.flags & FL_ITEM) && item.model != string_null) && (item.search_time < time)) - - { - - if (visible(item)) - - { - - tdist = vlen(item.origin - self.origin); - - if (tdist < dist2) - - { - - best2 = item; - - dist2 = tdist; - - } - - } - - } - - if (item.threat == THREAT_UNFLAGGED) - - { - - if (item.classname == "missile") - - item.threat = 100; - - else if (item.classname == "laserbolt") - - item.threat = 10; - - else if (item.classname == "grenade") - - item.threat = 50; - - else if (item.classname == "plasma") - - item.threat = 60; - - else if (item.classname == "spike") - - item.threat = 30; - - else - - item.threat = THREAT_IGNORE; - - } - - if (item.threat > 0) - - { - - if ((item.owner != self) || (item.velocity == '0 0 0')) - - { - - tdist = vlen(item.origin - self.origin); - - if (tdist < DODGE_DIST) - - { - - if (item.threat / tdist > topthreat) - - { - - topthreat = item.threat / tdist; - - best3 = item; - - } - - } - - } - - } - - item = item.chain; - - } - - if ((best != self.enemy) && (best != world)) - - self.enemy = best; - - if ((best2 != self.goalentity) && (best2 != world)) - - { - - self.goalentity = best2; - - self.search_time = time + 5; - - } - - self.dodgeent = best3; - -}; - - - -void() DodgeProjectile = - -{ - - local vector vec; - - - - vec = vectoangles(self.dodgeent.origin - self.origin); - - makevectors(vec); - - - - self.goalentity = spawn(); - - - - if (self.dodgeent.velocity != '0 0 0') - - setorigin(self.goalentity, self.origin + v_right * 50); - - else - - setorigin(self.goalentity, self.origin - v_forward * 50); - - - - MauveToGoal(); - - - - remove(self.goalentity); - - self.goalentity = world; - -}; - - - -void() MauveBot_AI = - -{ - - - - if (clienttype(self) != CLIENTTYPE_BOT) - - { - - //local entity ent; - - local float flo; - - - - if (time >= 3) - - { - - flo = cvar("bot_number"); - - - - if (flo > bot_number) - - add_MauveBot(); - - else if (flo < bot_number) - - remove_MauveBot(); - - } - - else - - remove_MauveBot(); - - return; - - } - - - - self.button0 = 0; - - self.button2 = 0; - - self.button3 = 0; - - - - self.movement = '0 0 0'; - - - - if (self.deadflag == DEAD_RESPAWNABLE) - - { - - self.button0 = 1; - - return; - - } - - else if (self.deadflag) - - return; - - - - if (self.goalentity.model == string_null) - - self.goalentity = world; - - - - if (time > self.ai_time) - - { - - self.ai_time = time + (0.5 / self.skill_level) + (random() * (1 / self.skill_level)); - - - - look_for_stuff(); - - - - if (self.enemy) - - { - - bot_set_angle(self.enemy); - - if (visible(self.enemy)) - - { - - self.button0 = 1; - - self.search_time = 100000; - - } - - else if (self.search_time == 100000) - - self.search_time = time + 5; - - if (self.goalentity == world) - - { - - if (self.enemy) - - { - - self.goalentity = self.enemy; - - if (vlen(self.enemy.origin - self.origin) < 300) - - self.dodgeent = self.enemy; - - } - - } - - } - - else if (self.goalentity) - - bot_set_angle(self.goalentity); - - - - if (random() < 0.03) - - self.button2 = 1; - - } - - else - - { - - if (self.skill_level > 3) - - { - - if (visible(self.enemy)) - - { - - self.button0 = 1; - - self.search_time = 100000; - - } - - } - - } - - - - if (self.dodgeent != world) - - DodgeProjectile(); - - else if (self.goalentity != world) - - MauveToGoal(); - -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/medic.c b/attic/TeamNexuiz/game/gamec/medic.c deleted file mode 100644 index 98155bfbd..000000000 --- a/attic/TeamNexuiz/game/gamec/medic.c +++ /dev/null @@ -1,124 +0,0 @@ -void MedicSpecial() -{ - sprint(self, "Not done yet\n"); -} - -void MedicGrenade(float req) -{ - float atk_delay; - atk_delay = cvar("g_balance_class_medic_grenade_delayattack"); - if(req == WR_GRENADE1) - { - if(W_ThrowGrenade(W_PoisonGrenade)) - { - self.grenade_time = time + cvar("g_balance_grenade_poison_refire"); - // special: medic can't shoot for a while - if(self.attack_finished < time + atk_delay) - self.attack_finished = time + atk_delay; - } - } - else if(req == WR_GRENADE2) - { - if(W_ThrowGrenade(W_ArmorGrenade)) - { - self.grenade_time = time + cvar("g_balance_grenade_armor_refire"); - // special: medic can't shoot for a while - if(self.attack_finished < time + atk_delay) - self.attack_finished = time + atk_delay; - } - } -} - -void player_clearpoison(entity targ); - -void MedicPreThink() -{ - entity head; - float maxhpratio, healamt, armoramt, reducestatus, didheal; - - if(self.special_time > time) - return; - self.special_time = time + cvar("g_balance_medic_heal_pingrate"); - - maxhpratio = cvar("g_balance_medic_heal_max"); - healamt = cvar("g_balance_medic_heal_pingheal"); - armoramt = cvar("g_balance_medic_heal_pingarmor"); - reducestatus = cvar("g_balance_medic_heal_reducestatus"); - - head = findradius(self.origin, cvar("g_balance_medic_heal_radius")); - while(head) - { - if(head.team == self.team && head.class != CLASS_MEDIC)// && head != self) - { - if(head.classname == "player") - { - didheal = 0; - if(head.health < head.max_health * maxhpratio) - { - //bprint(strcat("heal hp ", ftos(head.health))); - //bprint(strcat(" ", ftos(head.health + healamt))); - //bprint(strcat(" ", ftos(head.max_health * maxhpratio), "\n")); - head.health = bound(head.health, - head.health + healamt, - head.max_health * maxhpratio); - //head.health = head.health + healamt; - //if(head.health > head.max_health * maxhpratio) - // head.health = head.max_health * maxhpratio; - DelayHealthRot(head); - didheal = 1; - } - if(head.armorvalue < head.max_armor * maxhpratio) - { - //bprint("heal ar\n"); - head.armorvalue = bound(head.armorvalue, - head.armorvalue + armoramt, - head.max_armor * maxhpratio); - DelayArmorRot(head); - didheal = 1; - } - if(head.poison_damage) - { - //bprint("heal poison\n"); - player_clearpoison(head); - didheal = 1; - } - if(head.onfire) - { - //bprint("heal fire\n"); - head.onfire.wait = time + (head.onfire.wait - time)*reducestatus; - didheal = 1; - } - if(didheal) - { - // visual effect - te_teleport(head.origin); - } - } - } - head = head.chain; - } -} - -void MedicPostThink() -{ -} - -void BecomeMedic(float portion) -{ - self.max_health = cvar("g_balance_class_medic_health") * portion; - - self.max_armor = cvar("g_balance_class_medic_armor") * portion; - - self.mass = cvar("g_balance_class_medic_mass"); - - SetPlayerSpeed(self); - - self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4; - self.switchweapon = WEP2; - self.ammo_shells = floor(20 * portion); - self.ammo_nails = floor(50 * portion); - self.ammo_rockets = floor(0 * portion); - self.ammo_cells = floor(0 * portion); - self.playerclass = TF_CLASS_MEDIC; // TF P.C. - SetMaxAmmoFor (16); -} diff --git a/attic/TeamNexuiz/game/gamec/pyro.c b/attic/TeamNexuiz/game/gamec/pyro.c deleted file mode 100644 index 47e8c3998..000000000 --- a/attic/TeamNexuiz/game/gamec/pyro.c +++ /dev/null @@ -1,179 +0,0 @@ - - -void W_NapalmGlob_Think (void) -{ - if(self.wait < time) - { - remove(self); - return; - } - self.nextthink = time + cvar("g_balance_napalm_glob_damagerate"); - - RadiusDamage (self, self.owner, cvar("g_balance_napalm_glob_damage"), cvar("g_balance_napalm_glob_edgedamage"), cvar("g_balance_napalm_glob_radius"), world, cvar("g_balance_napalm_glob_force"), WEP_PYRO_SPECIAL); -} - -void W_NapalmGlob_Touch (void) -{ - if(self.count) - return; - - self.movetype = MOVETYPE_NONE; - - self.count = 1; -} - -void W_NapalmSpitGlob(vector org, vector vel) -{ - entity gren; - - gren = spawn (); - gren.owner = self.owner; - gren.classname = "napalm"; - gren.movetype = MOVETYPE_TOSS; - gren.solid = SOLID_BBOX; - setmodel(gren, "models/plasma.mdl"); - setsize(gren, '0 0 0', '0 0 0'); - setorigin(gren, org); - - gren.nextthink = time + 0.1; - gren.think = W_NapalmGlob_Think; - gren.touch = W_NapalmGlob_Touch; - gren.wait = time + cvar("g_balance_napalm_glob_duration"); - gren.gravity = cvar("g_balance_napalm_glob_gravity"); - gren.velocity = vel; - gren.avelocity = '100 150 100'; - gren.count = 0; - - gren.angles = vectoangles (gren.velocity); - - gren.scale = 5; - gren.colormod = '5 0 0'; - //gren.glow_size = cvar("g_balance_napalm_glob_radius"); // glow at damage radius - //gren.glow_color = 236;//250; // red -} - -void W_Napalm_Explode (void) -{ - vector org2, vel, vel2, vels, ang; - float num, angsize; - - setsize(self, '0 0 0', '0 0 0'); - - org2 = findbetterlocation (self.origin); - //te_explosion (org2); - //effect (org2, "models/sprites/grenadeexplosion.spr32", 0, 20, 30); - sound (self, CHAN_BODY, "misc/gib.wav", 1, ATTN_NORM); - -// RadiusDamage (self, self.owner, cvar("g_balance_napalm_damage"), cvar("g_balance_napalm_edgedamage"), cvar("g_balance_napalm_radius"), world, cvar("g_balance_napalm_force"), WEP_PYRO_SPECIAL); - - traceline(org2, org2 - '0 0 30', TRUE, self); - if(trace_fraction < 1) - vels = '0 0 1'; - else - vels = '0 0 -1'; - - num = cvar("g_balance_napalm_numglobs"); - angsize = 360 / (num - 1); - ang_y = self.angles_y; - while(num > 0) - { - if(num == 1) - { - vel = '0 0 0'; - } - else - { - ang_y = ang_y + angsize; - makevectors(ang); - vel_x = v_forward_x; - vel_y = v_forward_y; - //vel_x = vels_x + crandom()*0.8; - //vel_y = vels_y + crandom()*0.8; - } - vel2_z = vels_z + crandom()*0.8; - vel = normalize(vel); - vel2 = normalize(vel2); - W_NapalmSpitGlob(org2, vel*cvar("g_balance_napalm_glob_speedh") + vel2*cvar("g_balance_napalm_glob_speedv")); - num = num - 1; - } - - remove (self); -} - -void PyroSpecial() -{ - if(self.special_time > time) - return; - self.special_time = time + cvar("g_balance_napalm_firerate"); - - local entity gren; - local vector org; - - sound (self, CHAN_WEAPON, "weapons/grenade_fire.wav", 1, ATTN_NORM); - self.punchangle_x = -4; - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 5 + v_up * -12; - - gren = spawn (); - gren.owner = self; - gren.classname = "grenade"; - gren.movetype = MOVETYPE_BOUNCE; - gren.solid = SOLID_BBOX; - setmodel(gren, "models/plasma.mdl"); - setsize(gren, '-6 -6 -3', '6 6 3'); - setorigin(gren, org); - - gren.nextthink = time + 5; - gren.think = W_Napalm_Explode; - gren.touch = W_Napalm_Explode; - gren.velocity = v_forward * cvar("g_balance_napalm_speed") - + v_up * cvar("g_balance_napalm_speed_up"); - gren.avelocity = '100 150 100'; - - gren.angles = vectoangles (gren.velocity); - - gren.scale = 8; - gren.colormod = '5 0 0'; -} - - -void PyroGrenade(float req) -{ - if(req == WR_GRENADE1) - { - if(W_ThrowGrenade(W_ConcussionGrenade)) - self.grenade_time = time + cvar("g_balance_grenade_concussion_refire"); - } - else if(req == WR_GRENADE2) - { - if(W_ThrowGrenade(W_Firebomb)) - self.grenade_time = time + cvar("g_balance_grenade_firebomb_refire"); - } -} - -void PyroPreThink() -{ -} - -void PyroPostThink() -{ -} - -void BecomePyro(float portion) -{ - self.max_health = cvar("g_balance_class_pyro_health") * portion; - - self.max_armor = cvar("g_balance_class_pyro_armor") * portion; - - self.mass = cvar("g_balance_class_pyro_mass"); - - SetPlayerSpeed(self); - - self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4; - self.switchweapon = WEP2;//w_getbestweapon(self); - self.ammo_shells = floor(20 * portion); - self.ammo_nails = floor(150 * portion); - self.ammo_rockets = floor(14 * portion); - self.ammo_cells = floor(6 * portion); - self.playerclass = TF_CLASS_PYRO; // TF P.C. - SetMaxAmmoFor (8); -} diff --git a/attic/TeamNexuiz/game/gamec/scout.c b/attic/TeamNexuiz/game/gamec/scout.c deleted file mode 100644 index 54ccad2cf..000000000 --- a/attic/TeamNexuiz/game/gamec/scout.c +++ /dev/null @@ -1,207 +0,0 @@ -void SpecialShieldThink() -{ - if(!self.owner.special_active || self.owner.health <= 0) - { - remove(self.enemy); - remove(self); - return; - } - self.nextthink = time; - - // let tag attachment handle this - //setorigin(self, 0.5*(self.owner.absmin + self.owner.absmax)); - //self.velocity = self.owner.velocity; - - self.alpha = 0.3 + 0.3*((self.owner.special_time - time) / cvar("g_balance_shield_duration")); - if(self.alpha < 0.05) - self.alpha = 0.05; - - self.enemy.alpha = self.alpha; - self.enemy.effects = self.effects; -}; - -void ActivateSpecialShield(float emergency_shield) -{ - vector org; - entity e; - if(self.special_time > time) - { - return; // currently active or recharging - } - - sprint(self, "<==Shield activated!==>\n"); - - self.special_active = 1; - if(emergency_shield) - self.special_time = time + cvar("g_balance_shield_emergency_duration"); - else - self.special_time = time + cvar("g_balance_shield_duration"); - - e = spawn(); - e.owner = self; - e.think = SpecialShieldThink; - e.nextthink = time; - e.alpha = 1; - - e.colormod_x = 255; - e.colormod_y = 0; - e.colormod_z = 128; - e.colormod = e.colormod * (1/255) * 1.2; - - e.effects = EF_ADDITIVE; - - e.movetype = MOVETYPE_NONE; - e.solid = SOLID_NOT; - - org = 0.5*(self.absmin + self.absmax) - self.origin; - - setmodel(e, "models/misc/shield_s.mdl"); - setorigin(e, org + '0 0 16');//0.5*(self.absmin + self.absmax)); - - setattachment(e, self, ""); - - e.enemy = spawn(); - e.enemy.owner = e; - e.enemy.alpha = 1; - e.enemy.colormod = e.colormod; - setmodel(e.enemy, e.model); - - // use viewmodelforclient, since setattachment makes it invisible to the player - e.enemy.viewmodelforclient = self; - setorigin(e.enemy, e.origin);//'0 0 0');//0.5*(self.absmin + self.absmax)); - - //setattachment(e.enemy, e, ""); - //setorigin(e.enemy, e.origin);//0.5*(self.absmin + self.absmax)); -} - -float SpecialShieldProtect(float damage) -{ - // check for emergency activate - if(!self.special_active && self.special_time < time) // shield is off but ready - { - if(damage > self.health - 5) // this attack will be lethal or dang-well close - ActivateSpecialShield(TRUE); // emergency activate for less time, but save me - } - - if(!self.special_active || self.special_time < time) // shield is off - return damage; // don't alter damage - - - damage = damage - damage * (cvar("g_balance_shield_protection") / 100); - if(damage < 0) - damage = 0; - return damage; -} - -void ScoutSpecial() -{ - ActivateSpecialShield(FALSE); -} - -void () FireJetFlame = -{ - local entity missile; - local vector org; - local vector end; - - local vector trueaim; - org = self.origin + self.view_ofs; - end = self.origin + self.view_ofs + v_forward * 4096; - traceline(org,end,TRUE,self); - trueaim = trace_endpos; - - sound (self, CHAN_WEAPON, "weapons/flamer.wav", 1, ATTN_NORM); - self.ammo_nails = self.ammo_nails - 4; - org = self.origin + self.view_ofs/* + v_forward * 1 + v_right * 14 + v_up * -5*/; - - missile = spawn (); - missile.owner = self; - missile.classname = "flame"; - missile.think = W_Flamer_Dissipate; - missile.nextthink = time + 0.01; - //missile.touch = W_Flamer_Touch; - missile.solid = SOLID_BBOX; - setorigin (missile, org); - setmodel (missile, "models/sprites/hagarexplosion.spr32"); - setsize (missile, '0 0 0', '0 0 0'); - missile.effects = EF_LOWPRECISION | EF_ADDITIVE; - missile.alpha = 0.7;//0.3; - missile.scale = 0.005;//0.015;//0.15; - missile.colormod = '1 1 1'; // set full colors, then reduce later - missile.frame = random() * 4 + 2; - - missile.movetype = MOVETYPE_BOUNCE; - missile.gravity = -0.07; // fall lightly up -// missile.velocity = (v_forward + v_right * crandom() * 0.035 + v_up * crandom() * 0.015) * cvar("g_balance_flamer_speed"); - missile.velocity = normalize(trueaim - org) * 600; - - missile.angles = vectoangles (missile.velocity); -}; - -void ScoutGrenade(float req) -{ - if(req == WR_GRENADE1) - { - if (self.ammo_rockets < JETJUMP_NEEDROCKETS) - { - sprint(self, "You need more rockets to power the JetPack\n"); - return; - } - FireJetFlame(); - self.jump_pad = 1; - self.ammo_rockets = self.ammo_rockets - JETJUMP_NEEDROCKETS; - self.velocity = v_forward * 900 + '0 0 250' + v_up * 100; - self.flags = self.flags - (self.flags & FL_ONGROUND); - self.grenade_time = time + 2; - } - else if(req == WR_GRENADE2) - { - if(W_ThrowGrenade(W_ConcussionGrenade)) - self.grenade_time = time + cvar("g_balance_grenade_concussion_refire"); -// self.grenade_time = time + 2; - } -} - - -void ScoutPreThink() -{ - if(self.special_time != 0 && self.special_time < time) - { - // the timer has run out - - // shield was active, go into recharge mode - if(self.special_active) - { - self.special_active = 0; - self.special_time = time + cvar("g_balance_shield_recharge_time"); - } - else - { - self.special_time = 0; // finished recharging; ready to activate again - } - } -} - -void ScoutPostThink() -{ -} - -void BecomeScout(float portion) -{ - self.max_health = cvar("g_balance_class_scout_health") * portion; - - self.max_armor = cvar("g_balance_class_scout_armor") * portion; - - self.mass = cvar("g_balance_class_scout_mass"); - - SetPlayerSpeed(self); - - self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4; - self.switchweapon = WEP2; - self.ammo_shells = floor(20 * portion); - self.ammo_nails = floor(150 * portion); - self.ammo_rockets = floor(0 * portion); - self.ammo_cells = floor(0 * portion); - self.playerclass = TF_CLASS_SCOUT; // TF P.C. - SetMaxAmmoFor (1); -} diff --git a/attic/TeamNexuiz/game/gamec/soldier.c b/attic/TeamNexuiz/game/gamec/soldier.c deleted file mode 100644 index 4c9eb9754..000000000 --- a/attic/TeamNexuiz/game/gamec/soldier.c +++ /dev/null @@ -1,234 +0,0 @@ -void W_RicochetRocket_Explode (); - -void W_RicochetRocket_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - self.health = self.health - damage; - if (self.health <= 0) - { - other = self; - W_RicochetRocket_Explode(); - } -} - -entity W_Launch_RicochetRocket (vector org, vector vel, float rocket_grav, float num, float totalbounces) -{ - local entity gren; - - gren = spawn (); - gren.classname = "rocket"; - gren.solid = SOLID_BBOX; - gren.movetype = MOVETYPE_BOUNCEMISSILE; - gren.gravity = rocket_grav;//0.01; - setmodel(gren, "models/rocket.md3"); - if(self.classname == "player") - { - gren.owner = self; - setsize(gren, '-6 -6 -3', '6 6 3'); - } - else - { - gren.owner = self.owner; - setsize(gren, '0 0 0', '0 0 0'); - } - setorigin(gren, org); - - gren.cnt = num; // what # this one is - gren.count = totalbounces; // how many missiles this missile splits into - - gren.nextthink = time + 10; - gren.think = W_RicochetRocket_Explode; - gren.touch = W_RicochetRocket_Explode; - gren.velocity = vel; - gren.angles = vectoangles (gren.velocity); - - gren.colormod = 2 * '1 1 0'; - - return gren; -} - -// bounce off the wall, then become volatile -void W_RicochetRocket_NullTouch () -{ - self.delay = self.delay - 1; - if(self.delay <= 0) - self.touch = SUB_Null; - - //self.touch = W_RicochetRocket_Explode; - //self.think = self.touch; - //self.nextthink = time + 10; - //self.angles = vectoangles(self.velocity); -} - -void W_RicochetRocket_Update () -{ - self.angles = vectoangles(self.velocity); - if(self.wait < time && self.delay <= 0) - { - self.touch = W_RicochetRocket_Explode; - self.think = W_RicochetRocket_Explode; - self.nextthink = time + 10; - } - else - { - self.think = W_RicochetRocket_Update; - self.nextthink = time + 0.1; - } -} - -void W_RicochetRocket_Explode () -{ - vector org2, vel, dir; - float num, spread, bouncecount; - string rocketid; - entity e; - - if(other != self && other.classname == self.classname) - { - self.angles = vectoangles(self.velocity); - return; // don't touch other ricochet rockets - } - - if(self.cnt <= 1) - { - rocketid = ""; - } - else - rocketid = ftos(self.cnt); - - spread = cvar(strcat("g_balance_ricochet_spread",rocketid)); - - org2 = findbetterlocation (self.origin); - te_explosion (org2); - effect (org2, "models/sprites/rocketexplosion.spr32", 0, 20, 40); - sound (self, CHAN_BODY, "weapons/rocket_impact.wav", 1, ATTN_NORM); - - self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar(strcat("g_balance_ricochet_damage",rocketid)), cvar(strcat("g_balance_ricochet_edgedamage",rocketid)), cvar(strcat("g_balance_ricochet_radius",rocketid)), world, cvar(strcat("g_balance_ricochet_force",rocketid)), WEP_SOLDIER_SPECIAL); - - bouncecount = cvar("g_balance_ricochet_bouncecount"); - - if(self.cnt >= bouncecount) - { - // don't spawn more rockets - remove(self); - return; - } - - self.solid = SOLID_NOT; - - self.cnt = self.cnt + 1; - - if(self.cnt <= 1) - { - rocketid = ""; - } - else - rocketid = ftos(self.cnt); - - //bprint("Rocket", ftos(self.cnt-1)); - //bprint(" splits ", ftos(self.count), "times\n"); - - num = self.count; - dir = normalize(self.velocity); - while(num) - { - vel_x = dir_x + crandom()*spread; - vel_y = dir_y + crandom()*spread; - vel_z = dir_z + crandom()*spread; - vel = normalize(vel) * cvar(strcat("g_balance_ricochet_speed",rocketid)); - e = W_Launch_RicochetRocket(org2, vel, - cvar(strcat("g_balance_ricochet_gravity",rocketid)), - self.cnt, cvar(strcat("g_balance_ricochet_splitcount",rocketid)) ); - //if(other != self) // touched something else, not detonated by damage - { - // going to hit the same thing that detonated this rocket; - // avoid that by bouncing off before setting an explosion touch - e.touch = W_RicochetRocket_NullTouch; - e.delay = cvar("g_balance_ricochet_nulltouches"); - e.wait = time + cvar("g_balance_ricochet_nulltime"); - e.think = W_RicochetRocket_Update; - e.nextthink = time + 0.1;//4; - } - e.scale = 0.3 + 0.4*(1 - (self.cnt / bouncecount)); - num = num - 1; - } - - remove (self); -} - -void SoldierSpecial() -{ - entity e; - if(self.special_time > time) - return; - self.special_time = time + cvar("g_balance_ricochet_firerate"); - - if (self.next_nuke > time) - { - sprint(self, "You have to wait 2 minutes before you can use the Ricochet Rocket again\n"); - return; - } - if (self.no_grenades_2 < 2) - { - sprint(self, "You need more type 2 grenades to use the Ricochet Rocket\n"); - return; - } - self.next_nuke = time + 120; - - local vector org; - - sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", 1, ATTN_NORM); - self.punchangle_x = -4; - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 5 + v_up * -12; - e = W_Launch_RicochetRocket(org, v_forward * cvar("g_balance_ricochet_speed"), cvar("g_balance_ricochet_gravity"), 1, cvar("g_balance_ricochet_splitcount")); - // first rocket takes damage, others don't - e.takedamage = DAMAGE_YES; - e.damageforcescale = 4; - e.health = 30; - e.event_damage = W_RicochetRocket_Damage; -} - - -void () Prox; -void SoldierGrenade(float req) -{ - if(req == WR_GRENADE1) - { - Prox (); -// if(W_ThrowGrenade(W_MirvGrenade)) -// self.grenade_time = time + cvar("g_balance_grenade_mirv_refire"); - } - else if(req == WR_GRENADE2) - { -// if(W_ThrowGrenade(W_FragGrenade)) -// self.grenade_time = time + cvar("g_balance_grenade_frag_refire"); - } -} - -void SoldierPreThink() -{ -} - -void SoldierPostThink() -{ -} - -void BecomeSoldier(float portion) -{ - self.max_health = cvar("g_balance_class_soldier_health") * portion; - - self.max_armor = cvar("g_balance_class_soldier_armor") * portion; - - self.mass = cvar("g_balance_class_soldier_mass"); - - SetPlayerSpeed(self); - - self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4; - self.switchweapon = WEP4; // used to be WEP3 - self.ammo_shells = floor(20 * portion); - self.ammo_nails = floor(150 * portion); - self.ammo_rockets = floor(12 * portion); - self.ammo_cells = floor(0 * portion); - self.playerclass = TF_CLASS_SOLDIER; // TF P.C. - SetMaxAmmoFor (CLASS_SOLDIER); -} diff --git a/attic/TeamNexuiz/game/gamec/spy.c b/attic/TeamNexuiz/game/gamec/spy.c deleted file mode 100644 index 48bbe8398..000000000 --- a/attic/TeamNexuiz/game/gamec/spy.c +++ /dev/null @@ -1,365 +0,0 @@ - -void SpyDecloak() -{ - if(!self.special_active) - return; - self.special_active = 0; - ResetPlayerModel(self); - if(self.health < 2) - self.alpha = 0; - else - self.alpha = 0.1; -} - -void SpyCloak() -{ - if(self.health <= cvar("g_balance_spy_cloak_min_health")) - { - sprint(self, "not healthy enough\n"); - return; - } - - self.health = self.health - cvar("g_balance_spy_cloak_cost_start"); - - self.alpha = 1; - - self.special_active = 1; - self.special_time = time; -} - -// From TF2.5(tm) -float(vector veca, vector vecb) crossproduct = -{ - local float result; - result = veca_x * vecb_y - vecb_x * veca_y; - return result; -}; - -void SpyDisarm () -{ - local vector source; - local vector def; - -// self.currentammo = 0; - makevectors (self.v_angle); - source = (self.origin + '0 0 16'); - traceline (source, (source + (v_forward * 64)), 0, self); - if ((trace_fraction == 1)) - { - return; - } - makevectors (trace_ent.v_angle); - def = v_right; - makevectors (self.v_angle); - if (trace_ent.classname == "player" && trace_ent.health > 0) - { - if (crossproduct (def, v_forward) > 0) - { - other.currentammo = 0; - sprint(other, "You have been disarmed!\n"); - other.ammo_shells = 0; - other.ammo_cells = 0; - other.ammo_rockets = 0; - other.ammo_metal = 0; - other.ammo_nails = 0; - other.no_grenades_1 = 0; - other.no_grenades_2 = 0; - self.grenade_time = time + 10; - } - else - { - sprint(self, "You can only disarm someone from behind\n"); - } - } -}; - -void SpySpecial() -{ - if(self.special_active) - { - SpyDecloak(); - return; - } - SpyCloak(); -} - -void SpyGrenade(float req) -{ - SpyDecloak(); - if(req == WR_GRENADE1) - { -// if( W_ThrowGrenade(W_NailGrenade) ) -// self.grenade_time = time + cvar("g_balance_grenade_nail_refire"); - SpyDisarm(); - } - else if(req == WR_GRENADE2) - { - } -} - -void SpyCloakFlicker(entity pl) -{ - if(pl.class != CLASS_SPY) - return; - if(!pl.special_active) - return; - - pl.alpha = bound(0.001, pl.alpha + 0.3 + random()*0.2, 1); -} - -void SpyPreThink() -{ - local vector m1, m2; - local float desired_alpha, spd, min_health; - - if(self.special_active) // am I cloaked? - { - min_health = cvar("g_balance_spy_cloak_min_health"); - if(self.health < min_health || self.onfire != world || self.poison_damage) - {// out of health - SpyDecloak(); - return; - } - - spd = vlen(self.velocity); - spd = spd - self.speed*1.15; // spy can stay cloaked up to his max speed (plus some extra to keep from flickering on slopes), but any faster and he starts to show... - if(spd <= 0) - desired_alpha = 0; - else - { - desired_alpha = bound(0, - cvar("g_balance_spy_move_alpha")*spd / self.speed, - cvar("g_balance_spy_move_alpha_max")); - } - - - // adjust alpha to reflect new value - if(self.alpha < desired_alpha) - self.alpha = bound(0.001, self.alpha + 0.1, 1); - else if(self.alpha > desired_alpha) - self.alpha = bound(0.001, self.alpha - 0.1, 1); - - // take health/armor cost - self.health = bound(min_health, - self.health - cvar("g_balance_spy_cloak_cost_upkeeph") * frametime, - self.health); - // take health/armor cost - self.armorvalue = bound(0, - self.armorvalue - cvar("g_balance_spy_cloak_cost_upkeepa") * frametime, - self.armorvalue); - - if(self.health <= min_health) - {// out of health - SpyDecloak(); - return; - } - - - self.special_time = time + 0.1; - - // if I'm fully cloaked, set my model to nothing - if(self.alpha < 0.01 && self.model != "") - { - m1 = self.mins; - m2 = self.maxs; - setmodel (self, ""); - setsize (self, m1, m2); - } - else if(self.alpha > 0.01 && self.model == "") - { - ResetPlayerModel(self); - } - - self.alpha = bound(0.001, self.alpha, 1.0); - - // also cloak weapons - self.weaponentity.alpha = 1 - 0.5*(1 - self.alpha);//self.alpha + 0.1; - self.exteriorweaponentity.alpha = self.alpha; //self.weaponentity.alpha; - } - else - {// decloaked - if(self.alpha != 0)// && self.alpha != 1) - {// not fully visible yet, keep phasing back in - self.alpha = self.alpha + 0.1; - self.weaponentity.alpha = 1 - (1 - self.alpha)*0.5; - if(self.alpha > 1) - self.alpha = self.weaponentity.alpha = 0; - } - //else - // self.weaponentity.alpha = 0; - } - - - - /* if(self.special_active) // am I cloaked? - { - if(self.health < 10) - {// out of health - SpyDecloak(); - } - else if(self.model != "" && self.special_time <= time) - {// not fully cloaked yet, but working on it - self.alpha = self.alpha - 0.1; - self.weaponentity.alpha = 1 - (1 - self.alpha)*0.5;//self.alpha + 0.1; - self.special_time = time + 0.1; - if(self.alpha < 0.1) - { - m1 = self.mins; - m2 = self.maxs; - setmodel (self, ""); - setsize (self, m1, m2); - self.special_time = time + 1; - } - } - else if(self.special_time <= time) - {// fully cloaked, take health cost - self.alpha = self.weaponentity.alpha = 0.25; - self.special_time = time + 1; - - // reduce health & armor while cloaked - self.health = self.health - 2;//3; - if(self.armorvalue > 2)//3) - self.armorvalue = self.armorvalue - 2;//3; - } - } - else - {// decloaked - if(self.alpha != 0 && self.alpha != 1) - {// not fully visible yet, keep phasing back in - self.alpha = self.alpha + 0.1; - self.weaponentity.alpha = 1 - (1 - self.alpha)*0.5; - if(self.alpha > 1) - self.alpha = 0; - } - else - self.weaponentity.alpha = 0; - } - - self.exteriorweaponentity.alpha = self.weaponentity.alpha;*/ -} - -void SpyPostThink() -{ -} - -void BecomeSpy(float portion) -{ - self.max_health = cvar("g_balance_class_spy_health") * portion; - - self.max_armor = cvar("g_balance_class_spy_armor") * portion; - - self.mass = cvar("g_balance_class_spy_mass"); - - SetPlayerSpeed(self); - - self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4; - self.switchweapon = WEP2; - self.ammo_shells = floor(20 * portion); - self.ammo_nails = floor(50 * portion); - self.ammo_rockets = floor(3 * portion); - self.ammo_cells = floor(0 * portion); - self.playerclass = TF_CLASS_SPY; // TF P.C. - SetMaxAmmoFor (2); - // fixme: also have off-hand grenade, different for each class - // where to do that? -} - -/*void () Switch_View_Think = -{ - if (self.health < 1) - dremove(self); - self.owner.view_ofs = self.view_ofs * self.health; - - self.health = self.health - 1; - self.nextthink = time; - -}; - -void (vector vchange) Switch_View = -{ - local entity viewchanger; - local vector changevec; - - changevec = ((self.view_ofs - vchange) * .10); - - viewchanger = spawn(); - viewchanger.think = Switch_View_Think; - viewchanger.nextthink = time; - viewchanger.owner = self; - viewchanger.view_ofs = changevec; - viewchanger.health = 10; -};*/ - -void () Switch_View_Think = -{ - if (time > self.button1 + self.health) - dremove(self); - self.owner.view_ofs = self.owner.view_ofs - ((self.view_ofs * frametime) * (1 / self.health)); - self.nextthink = time; -}; -void (vector vchange, float change_spd) Switch_View = -{ - local entity viewchanger; - local vector changevec; - changevec = self.view_ofs - vchange; - viewchanger = spawn(); - viewchanger.think = Switch_View_Think; - viewchanger.nextthink = time; - viewchanger.owner = self; - viewchanger.view_ofs = changevec; - viewchanger.health = change_spd; - viewchanger.button1 = time; -} - -// Spy Feign -void () TeamNexuiz_Feign = -{ - if (self.playerclass != TF_CLASS_SPY) - return; - if ((self.reload_time + .25) > time) - return; - if (self.health <= 0) - return; - if (!(self.flags & FL_ONGROUND)) - { - sprint(self, "You cannot feign mid-air\n"); - return; - } - local entity at_spot; - local float intgr; - - self.velocity = '0 0 0'; - if (self.is_feigning == 1) - { - at_spot = findradius(self.origin, 64); // search for someone to make sure no-one is standing on - intgr = 1; //// the player when he tries to get up - while (at_spot != world) - { - if (at_spot.classname == "player" && at_spot.is_dead != 1 && at_spot != self) - { - intgr = 0; - } - at_spot = at_spot.chain; - } - if (intgr == 0) - { - sprint(self, "You can't get up while someone is standing on you.\n"); - return; - } - else - { - self.is_feigning = 0; - setsize(self, PL_MIN, PL_MAX); - Switch_View(PL_VIEW_OFS, .3); - TeamNexuiz_GunUp(); - } - } - else - { - self.is_feigning = 1; - TeamFortress_ThrowGrenade(); // Toss any primed grenades while feigning - setsize(self, '-16 -16 -24', '16 16 5'); - Switch_View(PL_FEIGN_VIEW_OFS, .3); - TeamNexuiz_GunDown(); - } -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/sv_main.c b/attic/TeamNexuiz/game/gamec/sv_main.c deleted file mode 100644 index c223e4c6f..000000000 --- a/attic/TeamNexuiz/game/gamec/sv_main.c +++ /dev/null @@ -1,18 +0,0 @@ -/* -============= -StartFrame - -Called before each frame by the server -============= -*/ -void StartFrame (void) -{ - sv_maxairspeed = cvar("sv_maxairspeed"); - sv_maxspeed = cvar ("sv_maxspeed"); - sv_friction = cvar ("sv_friction"); - sv_accelerate = cvar ("sv_accelerate"); - sv_stopspeed = cvar ("sv_stopspeed"); - teamplay = cvar ("teamplay"); - - CheckRules_World (); -} \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/sv_stats.c b/attic/TeamNexuiz/game/gamec/sv_stats.c deleted file mode 100644 index 1c5fe45da..000000000 --- a/attic/TeamNexuiz/game/gamec/sv_stats.c +++ /dev/null @@ -1,5 +0,0 @@ - -// Accuracy -//.float shots; -//.float hits; - diff --git a/attic/TeamNexuiz/game/gamec/sys.h b/attic/TeamNexuiz/game/gamec/sys.h deleted file mode 100644 index a5c2903ac..000000000 --- a/attic/TeamNexuiz/game/gamec/sys.h +++ /dev/null @@ -1,145 +0,0 @@ - -// DO NOT modify the contents of this file, or you will risk incompatibility with the game engine. - -entity self; -entity other; -entity world; - -float time; -float frametime; -float force_retouch; -string mapname; -float deathmatch; -float coop; -float teamplay; -float serverflags; -float total_secrets; -float total_monsters; -float found_secrets; -float killed_monsters; -float parm1, parm2, parm3, parm4, parm5, parm6, parm7, parm8, parm9, parm10, parm11, parm12, parm13, parm14, parm15, parm16; -vector v_forward, v_up, v_right; -float trace_allsolid; -float trace_startsolid; -float trace_fraction; -vector trace_endpos; -vector trace_plane_normal; -float trace_plane_dist; -entity trace_ent; -float trace_inopen; -float trace_inwater; - -entity msg_entity; - -void main (void); -void StartFrame (void); -void PlayerPreThink (void); -void PlayerPostThink (void); -void ClientKill (void); -void ClientConnect (void); -void PutClientInServer (void); -void ClientDisconnect (void); -void SetNewParms (void); -void SetChangeParms (void); - -///////////////////////////////////////////////////////// -void end_sys_globals; -///////////////////////////////////////////////////////// - -.float modelindex; - -.vector absmin, absmax; - -.float ltime; -.float movetype; -.float solid; - -.vector origin; -.vector oldorigin; -.vector velocity; -.vector angles; -.vector avelocity; -.vector punchangle; - -.string classname; -.string model; - -.float frame; -.float skin; -.float effects; - -.vector mins, maxs; -.vector size; - -.void() touch; -.void() use; -.void() think; -.void() blocked; - -.float nextthink; - -.entity groundentity; - -.float health; -.float frags; - -.float weapon; -.string weaponmodel; -.float weaponframe; - -.float currentammo; -.float ammo_shells, ammo_nails, ammo_rockets, ammo_cells; -.float items; - -.float takedamage; - -.entity chain; - -.float deadflag; - -.vector view_ofs; - -.float button0; -.float button1; -.float button2; -.float impulse; -.float fixangle; -.vector v_angle; -.float idealpitch; - -.string netname; -.entity enemy; - -.float flags; -.float colormap; -.float team; -.float max_health; -.float teleport_time; -.float armortype; -.float armorvalue; -.float waterlevel; -.float watertype; -.float ideal_yaw; -.float yaw_speed; - -.entity aiment; -.entity goalentity; - -.float spawnflags; - -.string target; -.string targetname; - -.float dmg_take; -.float dmg_save; -.entity dmg_inflictor; - -.entity owner; -.vector movedir; -.string message; -.float sounds; -.string noise, noise1, noise2, noise3; - -///////////////////////////////////////////////////////// -void end_sys_fields; -///////////////////////////////////////////////////////// diff --git a/attic/TeamNexuiz/game/gamec/t_fort.c b/attic/TeamNexuiz/game/gamec/t_fort.c deleted file mode 100644 index c4d74c0a2..000000000 --- a/attic/TeamNexuiz/game/gamec/t_fort.c +++ /dev/null @@ -1,195 +0,0 @@ -//*********************** -//NEX FORT ENTITIES -//*********************** - -float LGATE_START_OFF = 1; -float LGATE_TOGGLE = 2; -float LGATE_ADDITIVE_BLEND = 4; -float LGATE_INSTANT_KILL = 8; // fixme: not done yet -float LGATE_FULLBRIGHT = 16; - -//float STATE_ACTIVE; -//float STATE_INACTIVE; - -void PlayerLasergatePreThink () -{ - // player is starting his movement code. - // set owner of all friendly lasergates to player so he can pass through them. - - entity e; - e=world; - do - { - e = find(e, classname, "func_lasergate"); - if(e) - { - if(e.team_no && e.team_no == self.team_no) - { - //bprint("found a lasergate\n"); - e.owner = self; - } - } - }while(e); -} - -void PlayerLasergatePostThink () -{ - // player is starting his movement code. - // set owner of all friendly lasergates to player so he can pass through them. - - entity e; - e=world; - do - { - e = find(e, classname, "func_lasergate"); - if(e) - e.owner = world; - }while(e); -} - -void lasergate_touch() -{ - //if(self.state != STATE_ACTIVE) - // return; // lasergate is inactive - - //bprint("touch\n"); - if(other == self.owner) - return; // don't hurt the guy that's moving at the moment - - //bprint("not owner\n"); - if(self.team_no && other.team_no == self.team_no) - return; // don't hurt teammates if it does touch them somehow - - //bprint("not team\n"); - if(!self.dmg) - return; // no damage to deal - - //bprint("have damage\n"); - if(self.respawntime > time) - return; // don't damage every frame - - //bprint("hurt player!\n"); - self.respawntime = time + self.attack_finished; - - - Damage (other, self, self, self.dmg, DEATH_LASERGATE, 0.5*(self.absmin+self.absmax), '0 0 0'); -} - -void lasergate_activate() -{ -// if(self.state) -// return; -// bprint("lasergate_activate\n"); - self.state=1; - setorigin(self, self.origin); - setmodel(self, self.mdl); - setsize (self, self.mins , self.maxs); - self.touch = lasergate_touch; -} - -void lasergate_deactivate() -{ -// if(!self.state) -// return; -// bprint("lasergate_deactivate\n"); - self.state=0; - setmodel(self, ""); - self.touch = SUB_Null; -} - -void lasergate_use() -{ - if(self.spawnflags & LGATE_TOGGLE) - { - if(self.state) - lasergate_deactivate(); - else - lasergate_activate(); - return; - } - - if(self.spawnflags & LGATE_START_OFF) - { - lasergate_activate(); - self.think = lasergate_deactivate; - self.nextthink = self.ltime + self.wait; - } - else - { - lasergate_deactivate(); - self.think = lasergate_activate; - self.nextthink = self.ltime + self.wait; - } -} - -void func_lasergate() -{ - self.solid = SOLID_BSP; - self.movetype = MOVETYPE_PUSH; - - self.use = lasergate_use; - self.mdl = self.model; - - // testing - //self.dmg = 999; - - if(!self.attack_finished) - self.attack_finished = 1; - if(!self.wait) - self.wait = 5; - if(!self.message) - self.message = " tried to cross a lasergate"; - - if(self.spawnflags & LGATE_ADDITIVE_BLEND) - self.effects = self.effects | EF_ADDITIVE; - - if(self.spawnflags & LGATE_FULLBRIGHT) - self.effects = self.effects | EF_FULLBRIGHT; - - if(self.spawnflags & LGATE_START_OFF) - lasergate_deactivate(); - else - lasergate_activate(); -} - - - - - - - -void trigger_gravity_use() = -{ - if(activator.classname != "player") - return; - - if(self.gravity) - activator.gravity = self.gravity; - else if(self.speed) - { - activator.gravity = self.speed / cvar("sv_gravity"); - } -} - -void trigger_gravity_touch() = -{ - if (other.classname != "player") - return; - - activator = other; - self.use(); -} - - -void trigger_gravity() = -{ - if(!self.gravity && !self.speed) - self.gravity = 0.5; - - self.use = trigger_gravity_use; - self.touch = trigger_gravity_touch; - - InitTrigger (); - -} - diff --git a/attic/TeamNexuiz/game/gamec/t_halflife.c b/attic/TeamNexuiz/game/gamec/t_halflife.c deleted file mode 100644 index 342eb1b37..000000000 --- a/attic/TeamNexuiz/game/gamec/t_halflife.c +++ /dev/null @@ -1,58 +0,0 @@ - -.float roomtype; -.float radius; -.float pitch; -.float renderamt; -.float rendermode; -.vector rendercolor; - -void() weapon_crossbow = {}; -void() weapon_handgrenade = {}; -void() ammo_crossbow = {}; -void() ammo_9mmclip = {}; -void() ammo_gaussclip = {}; -void() weapon_rpg = {}; -void() weapon_357 = {}; -void() ammo_ARgrenades = {}; -void() item_battery = {}; -void() ammo_rpgclip = {}; -void() weapon_9mmAR = {}; -void() weapon_tripmine = {}; -void() weapon_snark = {}; -void() ammo_buckshot = {}; -void() ammo_9mmAR = {}; -void() ammo_357 = {}; -void() weapon_gauss = {}; -void() weapon_hornetgun = {}; -//void() weapon_shotgun = {}; -void() item_healthkit = {}; -void() item_longjump = {}; -void() item_antidote = {}; -void() func_recharge = {}; -void() info_node = {}; -void() env_sound = {}; -void() light_spot = {}; -void() func_healthcharger = {}; - - -void() func_ladder_touch = -{ - if (other.classname != "player") - return; - other.ladder_time = time + 0.1; - other.ladder_entity = self; -}; - -void() func_ladder = -{ - InitTrigger (); - self.touch = func_ladder_touch; -}; - -void() func_water = -{ - self.solid = SOLID_TRIGGER; - setmodel (self, self.model); // set size and link into world - self.touch = func_ladder_touch; -}; - diff --git a/attic/TeamNexuiz/game/gamec/t_items.c b/attic/TeamNexuiz/game/gamec/t_items.c deleted file mode 100644 index 3b45c7dba..000000000 --- a/attic/TeamNexuiz/game/gamec/t_items.c +++ /dev/null @@ -1,356 +0,0 @@ -void Item_ClearRespawnEffect (void) { - self.effects = 0; -} - -void Item_Respawn (void) -{ - self.model = self.mdl; // restore original model - self.solid = SOLID_TRIGGER; // allow it to be touched again - sound (self, CHAN_VOICE, "misc/itemrespawn.wav", 1, ATTN_NORM); // play respawn sound - setorigin (self, self.origin); - - // Savage: Add simple Respawn effect and make sure it gets removed - if(self.effects == 0) { - self.effects = EF_STARDUST; - self.think = Item_ClearRespawnEffect; - self.nextthink = time + 0.1; - } -} - -void Item_Touch (void) -{ - - local entity oldself; - local float _switchweapon; - - if (other.classname != "player") - return; - if (other.deadflag) - return; - if (self.solid != SOLID_TRIGGER) - return; - - if(self.buttonuse && !other.buttonuse) - return; // player must press "use" button to pick this up - - if (self.classname == "droppedweapon") - { - // don't allow my owner to accidentally pick me up again just after dropping me - if(self.enemy == other && self.delay > time) - return; - } - - // Savage: Remove the respawn effect if still present - if(self.effects == EF_STARDUST) - self.effects = 0; - - - sound (self, CHAN_BODY, self.noise, 1, ATTN_NORM); - - SpyCloakFlicker(other); - - // if the player is using their best weapon before items are given, they - // probably want to switch to an even better weapon after items are given - _switchweapon = other.switchweapon == w_getbestweapon(other); - - if (self.ammo_shells) - other.ammo_shells = min (other.ammo_shells + self.ammo_shells, 999); - if (self.ammo_nails) - other.ammo_nails = min (other.ammo_nails + self.ammo_nails, 999); - if (self.ammo_rockets) - other.ammo_rockets = min (other.ammo_rockets + self.ammo_rockets, 999); - if (self.ammo_cells) - other.ammo_cells = min (other.ammo_cells + self.ammo_cells, 999); - - if (self.weapon == WEP_UZI) W_GiveWeapon (other, WEP_UZI, "Machine gun", self.mass); - if (self.weapon == WEP_SHOTGUN) W_GiveWeapon (other, WEP_SHOTGUN, "Shotgun", self.mass); - if (self.weapon == WEP_GRENADE_LAUNCHER) W_GiveWeapon (other, WEP_GRENADE_LAUNCHER, "Mortar", self.mass); - if (self.weapon == WEP_ELECTRO) W_GiveWeapon (other, WEP_ELECTRO, "Electro", self.mass); - if (self.weapon == WEP_NEX) W_GiveWeapon (other, WEP_NEX, "Nex", self.mass); - if (self.weapon == WEP_HAGAR) W_GiveWeapon (other, WEP_HAGAR, "Hagar", self.mass); - if (self.weapon == WEP_ROCKET_LAUNCHER) W_GiveWeapon (other, WEP_ROCKET_LAUNCHER, "Rocket Launcher", self.mass); - if (self.weapon == WEP_CRYLINK) W_GiveWeapon (other, WEP_CRYLINK, "Crylink", self.mass); - - if (self.strength_finished) - other.strength_finished = max(other.strength_finished, time) + cvar("g_balance_powerup_strength_time"); - if (self.invincible_finished) - other.invincible_finished = max(other.invincible_finished, time) + cvar("g_balance_powerup_invincible_time"); - //if (self.speed_finished) - // other.speed_finished = max(other.speed_finished, time) + cvar("g_balance_powerup_speed_time"); - //if (self.slowmo_finished) - // other.slowmo_finished = max(other.slowmo_finished, time) + (cvar("g_balance_powerup_slowmo_time") * cvar("g_balance_powerup_slowmo_speed")); - - if (self.max_health) - { - other.health = other.health + self.max_health; - DelayHealthRot(other); - } - if (self.armorvalue) - { - other.armorvalue = other.armorvalue + self.armorvalue; - DelayArmorRot(other); - } - - oldself = self; - self = other; - - if (_switchweapon) - self.switchweapon = w_getbestweapon(self); - - //W_UpdateWeapon (); - //W_UpdateAmmo (); - weapon_action(self.weapon, WR_UPDATECOUNTS); - - self = oldself; - - if (self.classname == "droppedweapon") - remove (self); - else - { - self.solid = SOLID_NOT; - self.model = string_null; - self.nextthink = time + self.respawntime; - self.think = Item_Respawn; - setorigin (self, self.origin); - } -} - -// Savage: used for item garbage-collection -// TODO: perhaps nice special effect? -void RemoveItem(void) = { - remove(self); -} - - -void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, string itemname, float itemid, float itemflags) -{ - if ((cvar("g_instagib") == 1) | (cvar("g_rocketarena") == 1)) - { - remove (self); - return; - } - self.mdl = itemmodel; - self.noise = pickupsound; - // let mappers override respawntime - if (!self.respawntime) - self.respawntime = defaultrespawntime; - self.netname = itemname; - if(itemflags & FL_WEAPON) - self.weapon = itemid; - else - self.items = itemid; - self.flags = FL_ITEM | itemflags; - setmodel (self, self.mdl); - if (itemflags & FL_WEAPON) - { - setorigin (self, self.origin + '0 0 22'); - setsize (self, '-12 -12 -12', '12 12 12'); - } - else - { - setorigin (self, self.origin + '0 0 15'); - // setsize (self, '-8 -8 -5', '8 8 8'); - } - self.movetype = MOVETYPE_TOSS; - self.solid = SOLID_TRIGGER; - self.touch = Item_Touch; - - if (itemflags & FL_POWERUP) - self.effects = self.effects | EF_ADDITIVE; - - // Savage: remove thrown items after a certain period of time ("garbage collection") - if (self.classname == "droppedweapon") - { - self.think = RemoveItem; - self.nextthink = time + 60; - } - - if (cvar("g_fullbrightitems")) - self.effects = self.effects | EF_FULLBRIGHT; - -} - -void weapon_uzi (void) {self.buttonuse=1;self.mass=0.25;self.ammo_nails = 120;StartItem ("models/weapons/g_uzi.md3", "weapons/weaponpickup.wav", 15, "Uzi", WEP_UZI, FL_WEAPON);} -void weapon_shotgun (void) {self.buttonuse=1;self.mass=0.15;self.ammo_shells = 15;StartItem ("models/weapons/g_shotgun.md3", "weapons/weaponpickup.wav", 15, "Shotgun", WEP_SHOTGUN, FL_WEAPON);} -void weapon_grenadelauncher (void) {self.buttonuse=1;self.mass=2;self.ammo_rockets = 15;StartItem ("models/weapons/g_gl.md3", "weapons/weaponpickup.wav", 15, "Grenade Launcher", WEP_GRENADE_LAUNCHER, FL_WEAPON);} -void weapon_electro (void) {self.buttonuse=1;self.mass=1.8;self.ammo_cells = 25;StartItem ("models/weapons/g_electro.md3", "weapons/weaponpickup.wav", 15, "Electro", WEP_ELECTRO, FL_WEAPON);} -void weapon_crylink (void) {self.buttonuse=1;self.mass=0.6;self.ammo_cells = 25;StartItem ("models/weapons/g_crylink.md3", "weapons/weaponpickup.wav", 15, "Crylink", WEP_CRYLINK, FL_WEAPON);} -void weapon_nex (void) {self.buttonuse=1;self.mass=1.5;self.ammo_cells = 25;StartItem ("models/weapons/g_nex.md3", "weapons/weaponpickup.wav", 15, "Nex Gun", WEP_NEX, FL_WEAPON);} -void weapon_hagar (void) {self.buttonuse=1;self.mass=1;self.ammo_rockets = 15;StartItem ("models/weapons/g_hagar.md3", "weapons/weaponpickup.wav", 15, "Hagar", WEP_HAGAR, FL_WEAPON);} -void weapon_rocketlauncher (void) {self.buttonuse=1;self.mass=2.5;self.ammo_rockets = 15;StartItem ("models/weapons/g_rl.md3", "weapons/weaponpickup.wav", 15, "Rocket Launcher", WEP_ROCKET_LAUNCHER, FL_WEAPON);} - -void(entity pl, float typ) PrintGrenadeType = -{ - local string st; - if (typ == TF_FLARE_OFF) - { - st = "Normal"; - }/* - else - { - if (typ == 2) - { - st = "Concussion"; - } - else - { - if (typ == 3) - { - st = "Nail"; - } - else - { - if (typ == 4) - { - st = "Mirv"; - } - else - { - if (typ == 5) - { - st = "Napalm"; - } - else - { - if (typ == 6) - { - st = "Flare"; - } - else - { - if (typ == 7) - { - st = "Gas"; - } - else - { - if (typ == 8) - { - st = "EMP"; - } - else - { - if (typ == 9) - { - st = "Flash"; - } - } - } - } - } - } - } - } - }*/ - sprint(pl, st); -}; - -void() GetGrenadePossibility = -{ - if (random() < 0.5) - { - return TF_FLARE_LIT; - } - if (random() < 0.5) - { - if (other.tp_grenades_1 != TF_FLARE_LIT && other.no_grenades_1 < 4) - { - other.no_grenades_1 = other.no_grenades_1 + TF_FLARE_OFF; - sprint(other, "You found a "); - PrintGrenadeType(other, other.tp_grenades_1); - sprint(other, " grenade\n"); - return TF_FLARE_OFF; - } - }/* - else - { - if (other.tp_grenades_2 != TF_FLARE_LIT && other.no_grenades_2 < 4) - { - other.no_grenades_2 = other.no_grenades_2 + TF_FLARE_OFF; - sprint(other, 2, "You found a "); - PrintGrenadeType(other, other.tp_grenades_2); - sprint(other, 2, " grenade\n"); - return TF_FLARE_OFF; - } - }*/ - sprint(other, "WOOOO\n"); - return TF_FLARE_LIT; -}; - -void item_rockets (void) {GetGrenadePossibility();self.ammo_rockets = 15;StartItem ("models/items/a_rockets.md3", "misc/itempickup.wav", 15, "rockets", IT_ROCKETS, 0);} -void item_bullets (void) {self.ammo_nails = 120;StartItem ("models/items/a_bullets.mdl", "misc/itempickup.wav", 15, "bullets", IT_NAILS, 0);} -void item_cells (void) {self.ammo_cells = 25;StartItem ("models/items/a_cells.md3", "misc/itempickup.wav", 15, "cells", IT_CELLS, 0);} -void item_shells (void) {self.ammo_shells = 25;StartItem ("models/items/a_shells.md3", "misc/itempickup.wav", 15, "shells", IT_SHELLS, 0);} - -void item_armor1 (void) {self.armorvalue = 5;StartItem ("models/items/g_a1.md3", "misc/armor1.wav", 15, "Armor Shard", 0, 0);} -void item_armor25 (void) {self.armorvalue = 100;StartItem ("models/items/g_a25.md3", "misc/armor25.wav", 30, "Armor", 0, 0);} -void item_health1 (void) {self.max_health = 5;StartItem ("models/items/g_h1.md3", "misc/minihealth.wav", 15, "5 Health", 0, 0);} -void item_health25 (void) {self.max_health = 25;StartItem ("models/items/g_h25.md3", "misc/mediumhealth.wav", 15, "25 Health", 0, 0);} -void item_health100 (void) {self.max_health = 100;StartItem ("models/items/g_h100.md3", "misc/megahealth.wav", 30, "100 Health", 0, 0);} - -void item_strength (void) {self.strength_finished = 30;StartItem ("models/items/g_strength.md3", "misc/powerup.wav", 120, "Strength Powerup", IT_STRENGTH, FL_POWERUP);} -void item_invincible (void) {self.invincible_finished = 30;StartItem ("models/items/g_invincible.md3", "misc/powerup.wav", 120, "Invulnerability", IT_INVINCIBLE, FL_POWERUP);} -//void item_speed (void) {self.speed_finished = 30;StartItem ("models/items/g_speed.md3", "misc/powerup.wav", 120, "Speed Powerup", IT_SPEED, FL_POWERUP);} -//void item_slowmo (void) {self.slowmo_finished = 30;StartItem ("models/items/g_slowmo.md3", "misc/powerup.wav", 120, "Slow Motion", IT_SLOWMO, FL_POWERUP);} - -void misc_models (void) -{ - precache_model (self.model); - setmodel (self, self.model); - setsize (self, self.mins, self.maxs); -} - - -void SpawnThrownWeapon (vector org, float w) -{ - return; // Not in tf, eh? We need to add backpacks! :P - - local entity oldself; - - if (w == IT_LASER) - return; - - oldself = self; - self = spawn(); - // this will cause it to be removed later - self.classname = "droppedweapon"; - - setorigin(self, org); - if(oldself.health <= 2) - self.velocity = randomvec() * 100 + '0 0 200'; - else - { - makevectors(oldself.angles); // not v_angle; we don't care for up/down motion - self.velocity = v_forward*150 + '0 0 100'; - } - - SUB_SetFade(self, time + 10, 1); - - // delay re-pickup by owner, i.e. don't let my owner pick me up by accident - self.enemy = oldself; - self.delay = time + 2; - - if (w == WEP_UZI) - weapon_uzi (); - else if (w == WEP_SHOTGUN) - weapon_shotgun (); - else if (w == WEP_GRENADE_LAUNCHER) - weapon_grenadelauncher (); - else if (w == WEP_ELECTRO) - weapon_electro (); - else if (w == WEP_CRYLINK) - weapon_crylink (); - else if (w == WEP_NEX) - weapon_nex (); - else if (w == WEP_HAGAR) - weapon_hagar (); - else if (w == WEP_ROCKET_LAUNCHER) - weapon_rocketlauncher (); - else - { - remove(self); - } - - self = oldself; -} - diff --git a/attic/TeamNexuiz/game/gamec/t_jumppads.c b/attic/TeamNexuiz/game/gamec/t_jumppads.c deleted file mode 100644 index 1e816ba0c..000000000 --- a/attic/TeamNexuiz/game/gamec/t_jumppads.c +++ /dev/null @@ -1,96 +0,0 @@ -float PUSH_ONCE = 1; -float PUSH_SILENT = 2; - -void() trigger_push_touch = -{ - local float flighttime, dist, grav; - local vector org; - - if (other.classname != "player" && other.classname != "corpse" && other.classname != "body" && other.classname != "gib" && other.classname != "missile" && other.classname != "casing" && other.classname != "grenade" && other.classname != "plasma") - return; - - other.jump_pad = 1; - - if (!self.target) - { - other.velocity = self.movedir; - other.flags = other.flags - (other.flags & FL_ONGROUND); - return; - } - - org = other.origin; - - if (other.classname == "player") - sound (other, CHAN_ITEM, "misc/jumppad.wav", 1, ATTN_NORM); - - // figure out how long it will take to hit the point considering gravity - grav = cvar("sv_gravity"); - flighttime = sqrt((self.enemy.origin_z - org_z) / (0.5 * grav)); - if (!flighttime) - return; - - // how far in X and Y to move - self.movedir = (self.enemy.origin - org); - self.movedir_z = 0; - dist = vlen(self.movedir); - - // finally calculate the velocity - self.movedir = normalize(self.movedir) * (dist / flighttime); - self.movedir_z = flighttime * grav; - - other.velocity = self.movedir; - other.flags = other.flags - (other.flags & FL_ONGROUND); - - if (other.classname == "missile") - other.angles = vectoangles (other.velocity); - - if (self.spawnflags & PUSH_ONCE) - { - self.touch = SUB_Null; - self.think = SUB_Remove; - self.nextthink = time; - } -}; - -void() trigger_push_findtarget = -{ - // find the target - self.enemy = find(world, targetname, self.target); - if (!self.enemy) - { - objerror("trigger_push: target not found\n"); - remove(self); - } -}; - -void() trigger_push = -{ - if (self.angles != '0 0 0') - SetMovedir (); - - self.solid = SOLID_TRIGGER; - setmodel (self, self.model); - self.movetype = MOVETYPE_NONE; - self.modelindex = 0; - self.model = ""; - - self.touch = trigger_push_touch; - - // check if this is a jump pad - if (self.target) - { - self.think = trigger_push_findtarget; - self.nextthink = time + 0.2; - } - else - { - // normal push setup - if (!self.speed) - self.speed = 1000; - self.movedir = self.movedir * self.speed * 10; - } -}; - -void() target_push = {}; -//void() info_notnull = {}; // Moved to tfq3fitems.c! -void() target_position = {}; diff --git a/attic/TeamNexuiz/game/gamec/t_plats.c b/attic/TeamNexuiz/game/gamec/t_plats.c deleted file mode 100644 index 0182a3893..000000000 --- a/attic/TeamNexuiz/game/gamec/t_plats.c +++ /dev/null @@ -1,446 +0,0 @@ -/*void() plat_center_touch; -void() plat_outside_touch; -void() plat_trigger_use; -void() plat_go_up; -void() plat_go_down; -void() plat_crush; -float PLAT_LOW_TRIGGER = 1; - -void() plat_spawn_inside_trigger = -{ - local entity trigger; - local vector tmin, tmax; - - trigger = spawn(); - trigger.touch = plat_center_touch; - trigger.movetype = MOVETYPE_NONE; - trigger.solid = SOLID_TRIGGER; - trigger.enemy = self; - - tmin = self.mins + '25 25 0'; - tmax = self.maxs - '25 25 -8'; - tmin_z = tmax_z - (self.pos1_z - self.pos2_z + 8); - if (self.spawnflags & PLAT_LOW_TRIGGER) - tmax_z = tmin_z + 8; - - if (self.size_x <= 50) - { - tmin_x = (self.mins_x + self.maxs_x) / 2; - tmax_x = tmin_x + 1; - } - if (self.size_y <= 50) - { - tmin_y = (self.mins_y + self.maxs_y) / 2; - tmax_y = tmin_y + 1; - } - - setsize (trigger, tmin, tmax); -}; - -void() plat_hit_top = -{ - sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); - self.state = 1; - self.think = plat_go_down; - self.nextthink = self.ltime + 3; -}; - -void() plat_hit_bottom = -{ - sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); - self.state = 2; -}; - -void() plat_go_down = -{ - sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); - self.state = 3; - SUB_CalcMove (self.pos2, self.speed, plat_hit_bottom); -}; - -void() plat_go_up = -{ - sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); - self.state = 4; - SUB_CalcMove (self.pos1, self.speed, plat_hit_top); -}; - -void() plat_center_touch = -{ - if (other.classname != "player") - return; - - if (other.health <= 0) - return; - - self = self.enemy; - if (self.state == 2) - plat_go_up (); - else if (self.state == 1) - self.nextthink = self.ltime + 1; // delay going down -}; - -void() plat_outside_touch = -{ - if (other.classname != "player") - return; - - if (other.health <= 0) - return; - - self = self.enemy; - if (self.state == 1) - plat_go_down (); -}; - -void() plat_trigger_use = -{ - if (self.think) - return; // allready activated - plat_go_down(); -}; - - -void() plat_crush = -{ - if (self.state == 4) - plat_go_down (); - else if (self.state == 3) - plat_go_up (); - else - objerror ("plat_crush: bad self.state\n"); -}; - -void() plat_use = -{ - self.use = SUB_Null; - if (self.state != 4) - objerror ("plat_use: not in up state"); - plat_go_down(); -}; - - -.string sound1, sound2; - -void() func_plat = -{ - if (!self.t_length) - self.t_length = 80; - if (!self.t_width) - self.t_width = 10; - - if (self.sounds == 0) - self.sounds = 2; - - if (self.sounds == 1) - { - precache_sound ("plats/plat1.wav"); - precache_sound ("plats/plat2.wav"); - self.noise = "plats/plat1.wav"; - self.noise1 = "plats/plat2.wav"; - } - - if (self.sounds == 2) - { - precache_sound ("plats/medplat1.wav"); - precache_sound ("plats/medplat2.wav"); - self.noise = "plats/medplat1.wav"; - self.noise1 = "plats/medplat2.wav"; - } - - if (self.sound1) - { - precache_sound (self.sound1); - self.noise = self.sound1; - } - if (self.sound2) - { - precache_sound (self.sound2); - self.noise1 = self.sound2; - } - - self.mangle = self.angles; - self.angles = '0 0 0'; - - self.classname = "plat"; - self.solid = SOLID_BSP; - self.movetype = MOVETYPE_PUSH; - setorigin (self, self.origin); - setmodel (self, self.model); - setsize (self, self.mins , self.maxs); - - self.blocked = plat_crush; - if (!self.speed) - self.speed = 150; - self.pos1 = self.origin; - self.pos2 = self.origin; - self.pos2_z = self.origin_z - self.size_z + 8; - - self.use = plat_trigger_use; - - plat_spawn_inside_trigger (); // the "start moving" trigger - - if (self.targetname) - { - self.state = 4; - self.use = plat_use; - } - else - { - setorigin (self, self.pos2); - self.state = 2; - } -}; - - -/* -void() train_next; -void() func_train_find; - -void() train_blocked = -{ - if (time < self.attack_finished) - return; - self.attack_finished = time + 0.5; -}; -void() train_use = -{ - if (self.think != func_train_find) - return; - train_next(); -}; - -void() train_wait = -{ - if (self.wait) - { - self.nextthink = self.ltime + self.wait; - sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); - } - else - self.nextthink = self.ltime + 0.1; - - self.think = train_next; -}; - -void() train_next = -{ - local entity targ; - - targ = find (world, targetname, self.target); - self.target = targ.target; - if (!self.target) - objerror ("train_next: no next target"); - if (targ.wait) - self.wait = targ.wait; - else - self.wait = 0; - sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); - SUB_CalcMove (targ.origin - self.mins, self.speed, train_wait); -}; - -void() func_train_find = -{ - local entity targ; - - targ = find (world, targetname, self.target); - self.target = targ.target; - setorigin (self, targ.origin - self.mins); - if (!self.targetname) - { // not triggered, so start immediately - self.nextthink = self.ltime + 0.1; - self.think = train_next; - } -}; - - -void() func_train = -{ - if (!self.speed) - self.speed = 100; - if (!self.target) - objerror ("func_train without a target"); - - if (self.sounds == 0) - { - self.noise = ("misc/null.wav"); - precache_sound ("misc/null.wav"); - self.noise1 = ("misc/null.wav"); - precache_sound ("misc/null.wav"); - } - - if (self.sounds == 1) - { - self.noise = ("plats/train2.wav"); - precache_sound ("plats/train2.wav"); - self.noise1 = ("plats/train1.wav"); - precache_sound ("plats/train1.wav"); - } - - self.solid = SOLID_BSP; - self.movetype = MOVETYPE_PUSH; - self.blocked = train_blocked; - self.use = train_use; - self.classname = "train"; - - setmodel (self, self.model); - setsize (self, self.mins , self.maxs); - setorigin (self, self.origin); - self.nextthink = self.ltime + 0.1; - self.think = func_train_find; -}; -*/ - -void() train_next; // temp -/*void() train_wait = -{ - self.think = train_next; - self.nextthink = self.ltime + self.wait; -}; - -/*void() train_next = -{ - local entity targ; - targ = find(world, targetname, self.target); - self.target = targ.target; - if (!self.target) - objerror("train_next: no next target"); - self.wait = targ.wait; - if (!self.wait) - self.wait = 0.1; - if (targ.speed) - SUB_CalcMove(targ.origin - self.mins, targ.speed, train_wait); - else - SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait); -};*/ -/* //temp -void() func_train_find = -{ - local entity targ; - targ = find(world, targetname, self.target); - self.target = targ.target; - setorigin(self, targ.origin - self.mins); - self.nextthink = self.ltime + 1; - self.think = train_next; -}; - -/*QUAKED func_train (0 .5 .8) ? -Ridable platform, targets path_corner path to follow. -speed : speed the train moves (can be overridden by each path_corner) -target : targetname of first path_corner (starts here) -*/ -/*void() func_train = -{ - if (!self.target) - objerror("func_train without a target"); - if (!self.speed) - self.speed = 100; - - self.solid = SOLID_BSP; - self.movetype = MOVETYPE_PUSH; - - setmodel(self, self.model); - setsize(self, self.mins, self.maxs); - setorigin(self, self.origin); - - // wait for targets to spawn - self.nextthink = self.ltime + 0.1; - self.think = func_train_find; -}; - -/*QUAKED func_rotating (0 .5 .8) ? - - X_AXIS Y_AXIS -Brush model that spins in place on one axis (default Z). -speed : speed to rotate (in degrees per second) -noise : path/name of looping .wav file to play. -*/ -void() func_rotating = -{ - if (self.noise) - { - precache_sound(self.noise); - ambientsound(self.origin, self.noise, 1, ATTN_IDLE); - } - if (!self.speed) - self.speed = 100; - // FIXME: test if this turns the right way, then remove this comment (negate as needed) - if (self.spawnflags & 4) // X (untested) - self.avelocity = '0 0 1' * self.speed; - // FIXME: test if this turns the right way, then remove this comment (negate as needed) - else if (self.spawnflags & 8) // Y (untested) - self.avelocity = '1 0 0' * self.speed; - // FIXME: test if this turns the right way, then remove this comment (negate as needed) - else // Z - self.avelocity = '0 1 0' * self.speed; - - self.solid = SOLID_BSP; - self.movetype = MOVETYPE_PUSH; - - setmodel(self, self.model); - setsize(self, self.mins, self.maxs); - setorigin(self, self.origin); - - // wait for targets to spawn - self.nextthink = self.ltime + 999999999; - self.think = SUB_Null; -}; - -.float height; -.float phase; -void() func_bobbing_controller_think = -{ - local vector v; - self.nextthink = time + 0.1; - // calculate sinewave using makevectors - makevectors((time * self.owner.cnt + self.owner.phase) * '0 1 0'); - v = self.owner.destvec + self.owner.movedir * v_forward_y; - // * 10 so it will arrive in 0.1 sec - self.owner.velocity = (v - self.owner.origin) * 10; -}; - -/*QUAKED func_bobbing (0 .5 .8) ? X_AXIS Y_AXIS -Brush model that moves back and forth on one axis (default Z). -speed : how long one cycle takes in seconds (default 4) -height : how far the cycle moves (default 32) -phase : cycle timing adjustment (0-1 as a fraction of the cycle, default 0) -noise : path/name of looping .wav file to play. -*/ -void() func_bobbing = -{ - local entity controller; - if (self.noise) - { - precache_sound(self.noise); - ambientsound(self.origin, self.noise, 1, ATTN_IDLE); - } - if (!self.speed) - self.speed = 4; - if (!self.height) - self.height = 32; - // center of bobbing motion - self.destvec = self.origin; - // time scale to get degrees - self.cnt = 360 / self.speed; - // how far to bob - if (self.spawnflags & 1) // X - self.movedir = '1 0 0' * self.height; - else if (self.spawnflags & 2) // Y - self.movedir = '0 1 0' * self.height; - else // Z - self.movedir = '0 0 1' * self.height; - - self.solid = SOLID_BSP; - self.movetype = MOVETYPE_PUSH; - - setmodel(self, self.model); - setsize(self, self.mins, self.maxs); - setorigin(self, self.origin); - - // wait for targets to spawn - controller = spawn(); - controller.classname = "func_bobbing_controller"; - controller.owner = self; - controller.nextthink = time + 1; - controller.think = func_bobbing_controller_think; - self.nextthink = self.ltime + 999999999; - self.think = SUB_Null; -}; diff --git a/attic/TeamNexuiz/game/gamec/t_quake.c b/attic/TeamNexuiz/game/gamec/t_quake.c deleted file mode 100644 index 169cda743..000000000 --- a/attic/TeamNexuiz/game/gamec/t_quake.c +++ /dev/null @@ -1,48 +0,0 @@ -//*********************** -//QUAKE 1 ENTITIES - So people can play quake1 maps with the nexuiz weapons -//*********************** -void weapon_nailgun (void) {weapon_electro();} -void weapon_supernailgun (void) {weapon_hagar();} -void weapon_supershotgun (void) {weapon_uzi();} - -void item_spikes (void) {item_bullets();} -void item_armor2 (void) {item_armor25();} -void item_armorInv (void) {item_armor25();} -void item_health (void) {if (self.spawnflags & 2) item_health100();else item_health25();} - -//item_spikes -//item_health - - - - - - - -// garbage function to reduce warnings in compiling about unused variables -void junk_function () -{ - self.exteriormodeltoclient = world; - self.glow_trail = 0; - self.tag_entity = world; - self.button6 = 0; - self.button7 = 0; - self.button8 = 0; - self.pitch_speed = 0; - self.drawonlytoclient = world; - self.nodrawtoclient = world; - self.cursor_active = 0; - self.cursor_screen = '0 0 0'; - self.cursor_trace_start = '0 0 0'; - self.ping = 0; - self.roomtype = 0; - self.radius = 0; - self.pitch = 0; - self.renderamt = 0; - self.rendermode = 0; - self.rendercolor = '0 0 0'; - precache_model("progs/s_bubble.spr"); - precache_model("progs/s_light.spr"); - bprint(ftos(sv_maxairspeed), "\n"); -} - diff --git a/attic/TeamNexuiz/game/gamec/t_quake3.c b/attic/TeamNexuiz/game/gamec/t_quake3.c deleted file mode 100644 index 0a178bc2a..000000000 --- a/attic/TeamNexuiz/game/gamec/t_quake3.c +++ /dev/null @@ -1,18 +0,0 @@ -//*********************** -//QUAKE 3 ENTITIES - So people can play quake3 maps with the nexuiz weapons -//*********************** -void weapon_machinegun (void) {weapon_uzi();} -void weapon_plasmagun (void) {weapon_electro();} -void weapon_lightning (void) {weapon_crylink();} -void weapon_railgun (void) {weapon_nex();} -void weapon_bfg (void) {weapon_hagar();} -void item_slugs (void) {item_cells();} -void item_lightning (void) {item_cells();} -void item_armorshard (void) {item_armor1();} -void item_armorbody (void) {item_armor25();} -void item_armor_shard (void) {item_armor1();} -void item_armor_body (void) {item_armor25();} -void item_armor_combat (void) {item_armor25();} -void item_health_small (void) {item_health1();} -void item_health_large (void) {item_health25();} -void item_health_mega (void) {item_health100();} diff --git a/attic/TeamNexuiz/game/gamec/t_teleporters.c b/attic/TeamNexuiz/game/gamec/t_teleporters.c deleted file mode 100644 index ce109c5c9..000000000 --- a/attic/TeamNexuiz/game/gamec/t_teleporters.c +++ /dev/null @@ -1,308 +0,0 @@ -void Damage (entity targ, entity inflictor, entity attacker, float -damage, float deathtype, vector hitloc, vector force); - -void() tdeath_touch = -{ - if (other == self.owner) - return; - // so teleporting shots etc can't telefrag - if (!self.owner.takedamage) - return; - if (!other.takedamage) - return; - - if ((self.owner.classname == "player") && (self.owner.health >= 1)) - Damage (other, self, self.owner, 10000, DEATH_TELEFRAG, other.origin, '0 0 0'); - else if (other.health < 1) // corpses gib - Damage (other, self, self.owner, 10000, DEATH_TELEFRAG, other.origin, '0 0 0'); - else // dead bodies and monsters gib themselves instead of telefragging - Damage (self.owner, self, self.owner, 10000, DEATH_TELEFRAG, self.owner.origin, '0 0 0'); -}; - -// org2 is where they will return to if the teleport fails -void(vector org, entity death_owner, vector org2) spawn_tdeath = -{ - local entity death; - - death = spawn(); -// death.classname = "teledeath"; - death.movetype = MOVETYPE_NONE; - death.solid = SOLID_TRIGGER; - death.angles = '0 0 0'; - death.dest2 = org2; - setsize (death, death_owner.mins - '1 1 1', death_owner.maxs + '1 1 1'); - setorigin (death, org); - death.touch = tdeath_touch; - death.nextthink = time + 0.2; - death.think = SUB_Remove; - death.owner = death_owner; - - force_retouch = 2; // make sure even still objects get hit -}; - -/*void Teleport_Touch (void) -{ - if (other.health < 1) - return; - if (other.classname != "player") // FIXME: Make missiles firable through the teleport too - return; - - // Make teleport effect where the player left - sound (other, CHAN_ITEM, "misc/teleport.wav", 1, ATTN_NORM); - te_teleport (other.origin); - - dest = find (world, targetname, self.target); - if (!dest) - objerror ("Teleporter with nonexistant target"); - - // Make teleport effect where the player arrived - sound (other, CHAN_ITEM, "misc/teleport.wav", 1, ATTN_NORM); - makevectors (dest.mangle); - te_teleport (dest.origin + v_forward * 32); - - spawn_tdeath(dest.origin, other, other.origin); - - // Relocate the player - //setorigin (other, dest.origin); - setorigin (other, dest.origin + '0 0 1' * (1 - other.mins_z - 24)); - other.angles = dest.mangle; - other.fixangle = TRUE; - - other.velocity = '0 0 0'; - - other.flags = other.flags - (other.flags & FL_ONGROUND); -} - -void info_teleport_destination (void) -{ - self.mangle = self.angles; - self.angles = '0 0 0'; - - //setorigin (self, self.origin + '0 0 27'); // To fix a mappers' habit as old as Quake - setorigin (self, self.origin); - - if (!self.targetname) - objerror ("Teleport destination without a targetname"); -}*/ -/* -void misc_teleporter_dest (void) // Moved down -{ - info_teleport_destination(); -} -*/ -/* -void trigger_teleport (void) -{ - self.angles = '0 0 0'; - - self.solid = SOLID_TRIGGER; - self.movetype = MOVETYPE_NONE; - - setmodel (self, self.model); - - self.model = ""; - self.modelindex = 0; - - self.touch = Teleport_Touch; - - if (!self.target) - objerror ("Teleporter with no target"); -} -*/ - -// TF Teleporters -entity s; -void() SUB_UseTargets; - -void () play_teleport = -{ - local float v; - local string tmpstr; - - v = (random () * 5); - if ((v < 1)) - { - tmpstr = "misc/teleport.wav"; - } - else - { - if ((v < 2)) - { - tmpstr = "misc/teleport.wav"; - } - else - { - if ((v < 3)) - { - tmpstr = "misc/teleport.wav"; - } - else - { - if ((v < 4)) - { - tmpstr = "misc/teleport.wav"; - } - else - { - tmpstr = "misc/teleport.wav"; - } - } - } - } - sound (self, 2, tmpstr, 1, 1); - remove (self); -}; - -void (vector org) spawn_tfog = -{ - s = spawn (); - s.origin = org; - s.nextthink = (time + 0.2); - s.think = play_teleport; - WriteByte (0, 23); - WriteByte (0, 11); - WriteCoord (0, org_x); - WriteCoord (0, org_y); - WriteCoord (0, org_z); -}; - -void () teleport_touch = -{ - local entity t; - local entity te; - local vector org; - - if (self.targetname) - { - if ((self.nextthink < time)) - { - return; - } - } - if ((self.spawnflags & 1)) - { - if ((other.classname != "player")) - { - return; - } - } - if (!Activated (self, other)) - { - if ((self.else_goal != 0)) - { - te = Findgoal (self.else_goal); - if (te) - { - AttemptToActivate (te, other, self); - } - } - return; - } - if (((other.health <= 0) || (other.solid != 3))) - { - return; - } - SUB_UseTargets (); - spawn_tfog (other.origin); - t = find (world, targetname, self.target); - if (!t) - { - objerror ("couldn't find target"); - } - makevectors (t.mangle); - org = (t.origin + (32 * v_forward)); - spawn_tfog (org); - spawn_tdeath (t.origin, other); - if (!other.health) - { - other.origin = t.origin; - other.velocity = ((v_forward * other.velocity_x) + (v_forward * other.velocity_y)); - return; - } - setorigin (other, t.origin); - other.angles = t.mangle; - if ((other.classname == "player")) - { - if (((other.weapon == 1)/* && other.hook_out*/)) // Hook out code needs replacement - { - sound (other, 1, "weapons/bounce2.wav", 1, 1); -// other.on_hook = 0; -// other.hook_out = 0; -// other.fire_held_down = 0; - other.weaponframe = 0; - other.attack_finished = (time + 0.75); - } - other.fixangle = 1; - other.teleport_time = (time + 0.7); - if ((other.flags & 512)) - { - other.flags = (other.flags - 512); - } - other.velocity = (v_forward * 300); - } - other.flags = (other.flags - (other.flags & 512)); -}; - -void () teleport_use = -{ - self.nextthink = (time + 0.2); - force_retouch = 2; - self.think = SUB_Null; -}; - -void () info_teleport_destination = -{ - if ((CheckExistence () == 0)) - { - dremove (self); - return; - } - self.mangle = self.angles; - self.angles = '0 0 0'; - self.model = ""; - self.origin = (self.origin + '0 0 27'); - if (!self.targetname) - { - objerror ("no targetname"); - } -}; - -void () trigger_teleport = -{ - if (self.allowteams == "red") - { - self.team_no = 2; - self.owned_by = 2; - } - if (self.allowteams == "blue") - { - self.owned_by = 1; - self.team_no = 1; - } - - local vector o; - - if ((CheckExistence () == 0)) - { - dremove (self); - return; - } - InitTrigger (); - self.touch = teleport_touch; - if (!self.target) - { - objerror ("no target"); - } - self.use = teleport_use; - if (!(self.spawnflags & 2)) - { - precache_sound ("ambience/hum1.wav"); o = ((self.mins + self.maxs) * 0.5); - - ambientsound (o, "ambience/hum1.wav", 0.5, 3); - } -}; - -void misc_teleporter_dest (void) // Moved from above -{ - info_teleport_destination(); -} \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/tf_ball.c b/attic/TeamNexuiz/game/gamec/tf_ball.c deleted file mode 100644 index c647161ba..000000000 --- a/attic/TeamNexuiz/game/gamec/tf_ball.c +++ /dev/null @@ -1,1236 +0,0 @@ -// MegaTF Ball and Goal -// By: Ambush (and DyerMaker?) -// Implemented into Team:Nexuiz by avirox - -float () CheckExistence; -.float last_used; -.entity lastplayer; - -void() BallTouch = -{ - if (other.classname == "player" && self.last_used <= time) - { - sound(self, 3, "ball/bounce_fall.wav", 0.8, TRUE); - self.last_used = time + 0.3; - } - if (other.classname != "player") - { - sound(self, TRUE, "ball/bounce_hit.wav", TRUE, TRUE); - } - if (other.classname == "player") - { - makevectors(other.v_angle); - self.velocity = other.velocity + v_forward * 100 + v_up * 200; - //self.angles = -1 * (vectoangles (self.velocity)); -// v_forward_y = 0; -// v_forward_z = 0; - self.avelocity = -1 * ((v_forward * 250)/* + crandom() * v_right*/); - self.lastplayer = other; - } -}; - -void() BallCheck = -{ - self.movetype = 10; - self.nextthink = time + 15; - self.effects = FALSE; -// self.angles = vectoangles (self.velocity); -}; - -void() ballstart = -{ - if (CheckExistence() == FALSE) - { - dremove(self); - return; - } -}; - -void() BallStart = -{ - local entity te; - sound(self, 3, "ball/whistle.wav", TRUE, FALSE); - te = find(world, classname, "ballstart"); - while (te) - { - setorigin(self, te.origin); - te = find(te, classname, "ballstart"); - } - self.nextthink = time + 5; - self.think = BallCheck; - self.movetype = 10; - self.velocity_z = 40; -}; - -void() ball = -{ - if (CheckExistence() == FALSE) - { - dremove(self); - return; - } - precache_model("models/ball/ball.md3"); - setmodel(self, "models/ball/ball.md3"); - self.movetype = FALSE; - setsize(self, '-16 -16 -14', '16 16 10'); - self.solid = TRUE; - self.touch = BallTouch; - self.classname = "ball"; - self.think = BallCheck; - self.nextthink = time + 15; - self.oldorigin = self.origin; -// self.angles = vectoangles (self.velocity); -}; - -void() GoalTouch = -{ - local entity te; - if (other.classname != "ball") - { - return; - } - if (self.last_used > time) - { - return; - } - sound(self, 3, "ball/goal.wav", TRUE, FALSE); - self.last_used = time + 10; - te = find(world, classname, "player"); - while (te) - { - if (self.team_no == 2) - { - CenterPrint2(te, " ^3Score^7 for ^1Reds^7 by ", other.lastplayer.netname); - } - else - { - CenterPrint2(te, " ^3Score^7 for ^4Blues^7 by ", other.lastplayer.netname); - } - if (te.team_no == self.team_no && self.team_no != FALSE) - { - te.real_frags = te.real_frags + self.frags; - te.frags = te.frags + self.frags; - te.health = te.max_health; - } - te = find(te, classname, "player"); - } - other.nextthink = time + 10; - other.think = BallStart; - other.movetype = 9; - other.velocity_z = 40; - other.effects = self.team_no * 64; -}; - -void() sandball_goal = -{ - if (CheckExistence() == FALSE) - { - dremove(self); - return; - } - precache_model("progs/null.mdl"); - precache_sound("ball/goal.wav"); - precache_sound("ball/whistle.wav"); - precache_sound("ball/bounce_fall.wav"); - precache_sound("ball/bounce_hit.wav"); - setmodel(self, "progs/null.mdl"); - self.movetype = FALSE; - self.skin = self.team_no; - self.solid = TRUE; - setsize(self, '-35 -35 -14', '35 35 50'); - self.effects = FALSE; - self.touch = GoalTouch; -}; - -void() PuckTouch = -{ - if (other.classname == "player" && self.last_used <= time) - { - sound(self, 3, "ball/bounce_fall.wav", 0.8, TRUE); - self.last_used = time + 0.3; - } - if (other.classname != "player") - { - sound(self, TRUE, "ball/bounce_hit.wav", TRUE, TRUE); - } - if (other.classname == "player") - { - makevectors(other.v_angle); - self.velocity = other.velocity + v_forward * 100/* + v_up * 200*/; - //self.angles = -1 * (vectoangles (self.velocity)); - v_forward_y = 0; - v_forward_z = 0; - self.avelocity = -1 * ((v_forward * 250) + crandom() * v_right); - self.lastplayer = other; - } -}; - -void() PuckCheck = -{ - self.movetype = 10; - self.nextthink = time + 15; - self.effects = FALSE; -}; - -void() puck = -{ - if (CheckExistence() == FALSE) - { - dremove(self); - return; - } - precache_model("models/puck/puck.md3"); - setmodel(self, "models/puck/puck.md3"); - self.movetype = MOVETYPE_WALK; - setsize(self, '-16 -16 -14', '16 16 10'); - self.solid = TRUE; - self.touch = PuckTouch; - self.classname = "ball"; - self.think = PuckCheck; - self.nextthink = time + 15; - self.oldorigin = self.origin; -}; - - -vector(vector ang) SUB_NormalizeAngles = -{ - while (ang_x > 360) - { - ang_x = ang_x - 360; - } - while (ang_x < FALSE) - { - ang_x = ang_x + 360; - } - while (ang_y > 360) - { - ang_y = ang_y - 360; - } - while (ang_y < FALSE) - { - ang_y = ang_y + 360; - } - while (ang_z > 360) - { - ang_z = ang_z - 360; - } - while (ang_z < FALSE) - { - ang_z = ang_z + 360; - } - return ang; -}; - -/*======================================= - Rotate function for QuakeC - by Hipnotic Interactive - ===================================*/ - -.float rotate_type; -.float endtime; -.float duration; -.vector neworigin; -.vector rotate; -.string path; -.string event; -.string group; - -float START_ON = 1; // flag. abe thinks right. -float TOGGLE = 1; // flag. abe thinks right. - -float ROTATION = 1; -float ANGLES = 2; // flag. from abe. -float STOP = 4; -float NO_ROTATE = 8; - -float VISIBLE = 1; -float DAMAGE = 2; -float TOUCH = 2; // this one too. -float SET_DAMAGE = 4; // i made this one up. - -float NONBLOCKING = 4; - -float STAYOPEN = 4; - -float OBJECT_MOVEWALL = 2; -float OBJECT_ROTATE = 3; -float STATE_SPEEDINGUP = 4; -float STATE_ACTIVE = 5; -float OBJECT_SETORIGIN = 6; -float STATE_WAIT = 7; -float STATE_SLOWINGDOWN = 8; -float STATE_INACTIVE = 9; -float STATE_OPENING = 10; -float STATE_CLOSING = 11; -float STATE_MOVE = 12; -float STATE_STOP = 13; -float STATE_NEXT = 14; -float STATE_FIND = 15; -float STATE_OPEN = 16; -float STATE_CLOSED = 17; - -.vector dest; - -void() rotate_train_find; -void() rotate_door_group_reversedirection; -void() rotate_train_next; - -void() info_rotate = -{ - self.nextthink = time + 2; - self.think = SUB_Remove; -}; - -void() RotateTargets = -{ - local entity ent; - local vector vx; - local vector vy; - local vector vz; - local vector org; - makevectors(self.angles); - ent = find(world, targetname, self.target); - while (ent) - { - if (ent.rotate_type == OBJECT_SETORIGIN) - { - org = ent.oldorigin; - vx = v_forward * org_x; - vy = v_right * org_y; - vy = vy * -1; - vz = v_up * org_z; - ent.neworigin = vx + vy + vz; - setorigin(ent, ent.neworigin + self.origin); - } - else - { - if (ent.rotate_type == OBJECT_ROTATE) - { - ent.angles = self.angles; - org = ent.oldorigin; - vx = v_forward * org_x; - vy = v_right * org_y; - vy = vy * -1; - vz = v_up * org_z; - ent.neworigin = vx + vy + vz; - setorigin(ent, ent.neworigin + self.origin); - } - else - { - org = ent.oldorigin; - vx = v_forward * org_x; - vy = v_right * org_y; - vy = vy * -1; - vz = v_up * org_z; - ent.neworigin = vx + vy + vz; - ent.neworigin = self.origin - self.oldorigin + (ent.neworigin - ent.oldorigin); - ent.velocity = (ent.neworigin - ent.origin) * 25; - } - } - ent = find(ent, targetname, self.target); - } -}; - -void() RotateTargetsFinal = -{ - local entity ent; - ent = find(world, targetname, self.target); - while (ent) - { - ent.velocity = '0 0 0'; - if (ent.rotate_type == OBJECT_ROTATE) - { - ent.angles = self.angles; - } - ent = find(ent, targetname, self.target); - } -}; - -void() SetTargetOrigin = -{ - local entity ent; - ent = find(world, targetname, self.target); - while (ent) - { - if (ent.rotate_type == OBJECT_MOVEWALL) - { - setorigin(ent, self.origin - self.oldorigin + (ent.neworigin - ent.oldorigin)); - } - else - { - setorigin(ent, ent.neworigin + self.origin); - } - ent = find(ent, targetname, self.target); - } -}; - -void() LinkRotateTargets = -{ - local entity ent; - local vector tempvec; - self.oldorigin = self.origin; - ent = find(world, targetname, self.target); - while (ent) - { - if (ent.classname == "rotate_object") - { - ent.rotate_type = OBJECT_ROTATE; - ent.oldorigin = ent.origin - self.oldorigin; - ent.neworigin = ent.origin - self.oldorigin; - ent.owner = self; - } - else - { - if (ent.classname == "func_movewall") - { - ent.rotate_type = OBJECT_MOVEWALL; - tempvec = (ent.absmin + ent.absmax) * 0.5; - ent.oldorigin = tempvec - self.oldorigin; - ent.neworigin = ent.oldorigin; - ent.owner = self; - } - else - { - ent.rotate_type = OBJECT_SETORIGIN; - ent.oldorigin = ent.origin - self.oldorigin; - ent.neworigin = ent.origin - self.oldorigin; - } - } - ent = find(ent, targetname, self.target); - } -}; - -void(float amount) SetDamageOnTargets = -{ - local entity ent; - ent = find(world, targetname, self.target); - while (ent) - { - if (ent.classname == "func_movewall") - { - ent.dmg = amount; - } - ent = find(ent, targetname, self.target); - } -}; - -void() rotate_entity_think = -{ - local float t; - t = time - self.ltime; - self.ltime = time; - if (self.state == STATE_SPEEDINGUP) - { - self.count = self.count + self.cnt * t; - if (self.count > TRUE) - { - self.count = TRUE; - } - t = t * self.count; - } - else - { - if (self.state == STATE_SLOWINGDOWN) - { - self.count = self.count - self.cnt * t; - if (self.count < FALSE) - { - RotateTargetsFinal(); - self.state = STATE_INACTIVE; - self.think = SUB_Null; - return; - } - t = t * self.count; - } - } - self.angles = self.angles + self.rotate * t; - self.angles = SUB_NormalizeAngles(self.angles); - RotateTargets(); - self.nextthink = time + 0.020000; -}; - -void() rotate_entity_use = -{ - self.frame = TRUE - self.frame; - if (self.state == STATE_ACTIVE) - { - if (self.spawnflags & TOGGLE) - { - if (self.speed) - { - self.count = TRUE; - self.state = STATE_SLOWINGDOWN; - } - else - { - self.state = STATE_INACTIVE; - self.think = SUB_Null; - } - } - } - else - { - if (self.state == STATE_INACTIVE) - { - self.think = rotate_entity_think; - self.nextthink = time + 0.020000; - self.ltime = time; - if (self.speed) - { - self.count = FALSE; - self.state = STATE_SPEEDINGUP; - } - else - { - self.state = STATE_ACTIVE; - } - } - else - { - if (self.state == STATE_SPEEDINGUP) - { - if (self.spawnflags & TOGGLE) - { - self.state = STATE_SLOWINGDOWN; - } - } - else - { - self.state = STATE_SPEEDINGUP; - } - } - } -}; - -void() rotate_entity_firstthink = -{ - LinkRotateTargets(); - if (self.spawnflags & START_ON) - { - self.state = STATE_ACTIVE; - self.think = rotate_entity_think; - self.nextthink = time + 0.020000; - self.ltime = time; - } - else - { - self.state = STATE_INACTIVE; - self.think = SUB_Null; - } - self.use = rotate_entity_use; -}; - -/*QUAKED func_rotate_entity (0 .5 .8) (-8 -8 -8) (8 8 8) TOGGLE START_ON -Creates an entity that continually rotates. Can be toggled on and -off if targeted. - -TOGGLE = allows the rotation to be toggled on/off - -START_ON = wether the entity is spinning when spawned. If TOGGLE is 0, entity can be turned on, but not off. - -If "deathtype" is set with a string, this is the message that will appear when a player is killed by the train. - -"rotate" is the rate to rotate. -"target" is the center of rotation. -"speed" is how long the entity takes to go from standing still to full speed and vice-versa. -*/ - -void() func_rotate_entity = -{ - self.solid = FALSE; - self.movetype = FALSE; - setmodel(self, self.model); - setsize(self, self.mins, self.maxs); - if (self.speed != FALSE) - { - self.cnt = TRUE / self.speed; - } - self.think = rotate_entity_firstthink; - self.nextthink = time + 0.1; - self.ltime = time; -}; - -/*QUAKED path_rotate (0.5 0.3 0) (-8 -8 -8) (8 8 8) ROTATION ANGLES STOP NO_ROTATE DAMAGE MOVETIME SET_DAMAGE - Path for rotate_train. - - ROTATION tells train to rotate at rate specified by "rotate". Use '0 0 0' to stop rotation. - - ANGLES tells train to rotate to the angles specified by "angles" while traveling to this path_rotate. Use values < 0 or > 360 to guarantee that it turns in a certain direction. Having this flag set automatically clears any rotation. - - STOP tells the train to stop and wait to be retriggered. - - NO_ROTATE tells the train to stop rotating when waiting to be triggered. - - DAMAGE tells the train to cause damage based on "dmg". - - MOVETIME tells the train to interpret "speed" as the length of time to take moving from one corner to another. - - SET_DAMAGE tells the train to set all targets damage to "dmg" - - "noise" contains the name of the sound to play when train stops. - "noise1" contains the name of the sound to play when train moves. - "event" is a target to trigger when train arrives at path_rotate. -*/ - -void() path_rotate = -{ - if (self.noise) - { - precache_sound(self.noise); - } - if (self.noise1) - { - precache_sound(self.noise1); - } -}; - -void() rotate_train_think = -{ - local float t; - local float timeelapsed; - t = time - self.ltime; - self.ltime = time; - if (self.endtime && time >= self.endtime) - { - self.endtime = FALSE; - if (self.state == STATE_MOVE) - { - setorigin(self, self.finaldest); - self.velocity = '0 0 0'; - } - if (self.think1) - { - self.think1(); - } - } - else - { - timeelapsed = (time - self.cnt) * self.duration; - if (timeelapsed > TRUE) - { - timeelapsed = TRUE; - } - setorigin(self, self.dest1 + self.dest2 * timeelapsed); - } - self.angles = self.angles + self.rotate * t; - self.angles = SUB_NormalizeAngles(self.angles); - RotateTargets(); - self.nextthink = time + 0.020000; -}; - -void() rotate_train_use = -{ - if (self.think1 != rotate_train_find) - { - if (self.velocity != '0 0 0') - { - return; - } - if (self.think1) - { - self.think1(); - } - } -}; - -void() rotate_train_wait = -{ - self.state = STATE_WAIT; - if (self.goalentity.noise) - { - if (self.goalentity.noise == "ambience/chopper.wav") - { - sound(self, 2, self.goalentity.noise, TRUE, FALSE); - } - else - { - sound(self, 2, self.goalentity.noise, TRUE, TRUE); - } - } - else - { - sound(self, 2, self.noise, TRUE, TRUE); - } - if (self.goalentity.spawnflags & ANGLES) - { - self.rotate = '0 0 0'; - self.angles = self.finalangle; - } - if (self.goalentity.spawnflags & NO_ROTATE) - { - self.rotate = '0 0 0'; - } - self.endtime = self.ltime + self.goalentity.wait; - self.think1 = rotate_train_next; -}; - -void() rotate_train_stop = -{ - self.state = STATE_STOP; - if (self.goalentity.noise) - { - if (self.goalentity.noise == "ambience/chopper.wav") - { - sound(self, 2, self.goalentity.noise, TRUE, FALSE); - } - else - { - sound(self, 2, self.goalentity.noise, TRUE, TRUE); - } - } - else - { - sound(self, 2, self.noise, TRUE, TRUE); - } - if (self.goalentity.spawnflags & ANGLES) - { - self.rotate = '0 0 0'; - self.angles = self.finalangle; - } - if (self.goalentity.spawnflags & NO_ROTATE) - { - self.rotate = '0 0 0'; - } - self.dmg = FALSE; - self.think1 = rotate_train_next; -}; - -void() rotate_train_next = -{ - local entity targ; - local entity current; - local vector vdestdelta; - local float len; - local float traveltime; - local float div; - local string temp; - self.state = STATE_NEXT; - current = self.goalentity; - targ = find(world, targetname, self.path); - if (targ.classname != "path_rotate") - { - objerror("Next target is not path_rotate"); - } - if (self.goalentity.noise1) - { - self.noise1 = self.goalentity.noise1; - } - if (self.noise1 == "ambience/chopper.wav") - { - sound(self, 2, self.noise1, TRUE, FALSE); - } - else - { - sound(self, 2, self.noise1, TRUE, TRUE); - } - self.goalentity = targ; - self.path = targ.target; - if (!(self.path)) - { - objerror("rotate_train_next: no next target"); - } - if (targ.spawnflags & STOP) - { - self.think1 = rotate_train_stop; - } - else - { - if (targ.wait) - { - self.think1 = rotate_train_wait; - } - else - { - self.think1 = rotate_train_next; - } - } - if (current.event) - { - temp = self.target; - self.target = current.event; - self.message = current.message; - SUB_UseTargets(); - self.target = temp; - self.message = string_null; - } - if (current.spawnflags & ANGLES) - { - self.rotate = '0 0 0'; - self.angles = self.finalangle; - } - if (current.spawnflags & ROTATION) - { - self.rotate = current.rotate; - } - if (current.spawnflags & DAMAGE) - { - self.dmg = current.dmg; - } - if (current.spawnflags & SET_DAMAGE) - { - SetDamageOnTargets(current.dmg); - } - if (current.speed == -1) - { - setorigin(self, targ.origin); - self.endtime = self.ltime + 0.010000; - SetTargetOrigin(); - if (targ.spawnflags & ANGLES) - { - self.angles = targ.angles; - } - self.duration = TRUE; - self.cnt = time; - self.dest2 = '0 0 0'; - self.dest1 = self.origin; - self.finaldest = self.origin; - } - else - { - self.state = STATE_MOVE; - self.finaldest = targ.origin; - if (self.finaldest == self.origin) - { - self.velocity = '0 0 0'; - self.endtime = self.ltime + 0.1; - self.duration = TRUE; - self.cnt = time; - self.dest2 = '0 0 0'; - self.dest1 = self.origin; - self.finaldest = self.origin; - return; - } - vdestdelta = self.finaldest - self.origin; - len = vlen(vdestdelta); -// if (current.spawnflags & MOVETIME) -// { -// traveltime = current.speed; -// } -// else -// { - if (current.speed > FALSE) - { - self.speed = current.speed; - } - if (!(self.speed)) - { - objerror("No speed is defined!"); - } - traveltime = len / self.speed; -// } - if (traveltime < 0.1) - { - self.velocity = '0 0 0'; - self.endtime = self.ltime + 0.1; - if (targ.spawnflags & ANGLES) - { - self.angles = targ.angles; - } - return; - } - div = TRUE / traveltime; - if (targ.spawnflags & ANGLES) - { - self.finalangle = SUB_NormalizeAngles(targ.angles); - self.rotate = (targ.angles - self.angles) * div; - } - self.endtime = self.ltime + traveltime; - self.velocity = vdestdelta * div; - self.duration = div; - self.cnt = time; - self.dest2 = vdestdelta; - self.dest1 = self.origin; - } -}; - -void() rotate_train_find = -{ - local entity targ; - self.state = STATE_FIND; - LinkRotateTargets(); - targ = find(world, targetname, self.path); - if (targ.classname != "path_rotate") - { - objerror("Next target is not path_rotate"); - } - self.goalentity = targ; - if (targ.spawnflags & ANGLES) - { - self.angles = targ.angles; - self.finalangle = SUB_NormalizeAngles(targ.angles); - } - self.path = targ.target; - setorigin(self, targ.origin); - SetTargetOrigin(); - RotateTargetsFinal(); - self.think1 = rotate_train_next; - if (!(self.targetname)) - { - self.endtime = self.ltime + 0.1; - } - else - { - self.endtime = FALSE; - } - self.duration = TRUE; - self.cnt = time; - self.dest2 = '0 0 0'; - self.dest1 = self.origin; -}; - -void() func_rotate_train = -{ - if (!(self.speed)) - { - self.speed = 100; - } - if (!(self.target)) - { - objerror("rotate_train without a target"); - } - if (!(self.noise)) - { - if (self.sounds == FALSE) - { - self.noise = "misc/null.wav"; - } - if (self.sounds == TRUE) - { - self.noise = "plats/train2.wav"; - } - } - if (!(self.noise1)) - { - if (self.sounds == FALSE) - { - self.noise1 = "misc/null.wav"; - } - if (self.sounds == TRUE) - { - self.noise1 = "plats/train1.wav"; - } - } - precache_sound(self.noise); - precache_sound(self.noise1); - self.cnt = TRUE; - self.solid = FALSE; - self.movetype = 4; - self.use = rotate_train_use; - setmodel(self, self.model); - setsize(self, self.mins, self.maxs); - setorigin(self, self.origin); - self.ltime = time; - self.nextthink = self.ltime + 0.1; - self.endtime = self.ltime + 0.1; - self.think = rotate_train_think; - self.think1 = rotate_train_find; - self.state = STATE_FIND; - self.duration = TRUE; - self.cnt = 0.1; - self.dest2 = '0 0 0'; - self.dest1 = self.origin; - self.flags = self.flags | 512; -}; - -void() movewall_touch = -{ - if (time < self.owner.attack_finished) - { - return; - } - if (self.dmg) - { - T_Damage(other, self, self.owner, self.dmg); - self.owner.attack_finished = time + 0.5; - } - else - { - if (self.owner.dmg) - { - T_Damage(other, self, self.owner, self.owner.dmg); - self.owner.attack_finished = time + 0.5; - } - } -}; - -void() movewall_blocked = -{ - local entity temp; - if (time < self.owner.attack_finished) - { - return; - } - self.owner.attack_finished = time + 0.5; - if (self.owner.classname == "func_rotate_door") - { - temp = self; - self = self.owner; - rotate_door_group_reversedirection(); - self = temp; - } - if (self.dmg) - { - T_Damage(other, self, self.owner, self.dmg); - self.owner.attack_finished = time + 0.5; - } - else - { - if (self.owner.dmg) - { - T_Damage(other, self, self.owner, self.owner.dmg); - self.owner.attack_finished = time + 0.5; - } - } -}; - -void() movewall_think = -{ - self.ltime = time; - self.nextthink = time + 0.020000; -}; - -void() func_movewall = -{ - self.angles = '0 0 0'; - self.movetype = 7; - if (self.spawnflags & NONBLOCKING) - { - self.solid = FALSE; - } - else - { - self.solid = 4; - self.blocked = movewall_blocked; - } - if (self.spawnflags & TOUCH) - { - self.touch = movewall_touch; - } - setmodel(self, self.model); - if (!(self.spawnflags & VISIBLE)) - { - self.model = string_null; - } - self.think = movewall_think; - self.nextthink = time + 0.020000; - self.ltime = time; -}; - -void() rotate_object = -{ - self.classname = "rotate_object"; - self.solid = FALSE; - self.movetype = FALSE; - setmodel(self, self.model); - setsize(self, self.mins, self.maxs); - self.think = SUB_Null; -}; - -void() rotate_door_think2 = -{ - local float t; - t = time - self.ltime; - self.ltime = time; - self.frame = TRUE - self.frame; - self.angles = self.dest; - if (self.state == STATE_OPENING) - { - self.state = STATE_OPEN; - } - else - { - if (self.spawnflags & STAYOPEN) - { - rotate_door_group_reversedirection(); - return; - } - self.state = STATE_CLOSED; - } - sound(self, 2, self.noise3, TRUE, TRUE); - self.think = SUB_Null; - RotateTargetsFinal(); -}; - -void() rotate_door_think = -{ - local float t; - t = time - self.ltime; - self.ltime = time; - if (time < self.endtime) - { - self.angles = self.angles + self.rotate * t;//self.angles = self.angles + self.rotate * t; - RotateTargets(); - } - else - { - self.angles = self.dest; - RotateTargets(); - self.think = rotate_door_think2; - } - self.nextthink = time + 0.010000; -}; - -void() rotate_door_reversedirection = -{ - local vector start; - self.frame = TRUE - self.frame; - if (self.state == STATE_CLOSING) - { - start = self.dest1; - self.dest = self.dest2; - self.state = STATE_OPENING; - } - else - { - start = self.dest2; - self.dest = self.dest1; - self.state = STATE_CLOSING; - } - sound(self, 2, self.noise2, TRUE, TRUE); - self.rotate = (self.dest - start) * (TRUE / self.speed); - self.think = rotate_door_think; - self.nextthink = time + 0.020000; - self.endtime = time + self.speed - (self.endtime - time); - self.ltime = time; -}; - -void() rotate_door_group_reversedirection = -{ - local string name; - if (self.group) - { - name = self.group; - self = find(world, group, name); - while (self) - { - rotate_door_reversedirection(); - self = find(self, group, name); - } - } - else - { - rotate_door_reversedirection(); - } -}; - -void() rotate_door_use = -{ - local vector start; - if (self.state != STATE_OPEN && self.state != STATE_CLOSED) - { - return; - } - if (!(self.cnt)) - { - self.cnt = TRUE; - LinkRotateTargets(); - } - self.frame = TRUE - self.frame; - if (self.state == STATE_CLOSED) - { - start = self.dest1; - self.dest = self.dest2; - self.state = STATE_OPENING; - } - else - { - start = self.dest2; - self.dest = self.dest1; - self.state = STATE_CLOSING; - } - sound(self, 2, self.noise2, TRUE, TRUE); - self.rotate = (self.dest - start) * (TRUE / self.speed); - self.think = rotate_door_think; - self.nextthink = time + 0.010000; - self.endtime = time + self.speed; - self.ltime = time; -}; - -void() func_rotate_door = -{ - if (!(self.target)) - { - objerror("rotate_door without target."); - } - self.dest1 = '0 0 0'; - self.dest2 = self.angles; - self.angles = self.dest1; - if (!(self.speed)) - { - self.speed = 2; - } - self.cnt = FALSE; - if (!(self.dmg)) - { - self.dmg = 2; - } - else - { - if (self.dmg < FALSE) - { - self.dmg = FALSE; - } - } - if (self.sounds == FALSE) - { - precache_sound("misc/null.wav"); - if (self.noise1) - { - precache_sound(self.noise1); - } - else - { - self.noise1 = "misc/null.wav"; - } - if (self.noise2) - { - precache_sound(self.noise2); - } - else - { - self.noise2 = "misc/null.wav"; - } - if (self.noise3) - { - precache_sound(self.noise3); - } - else - { - self.noise3 = "misc/null.wav"; - } - } - if (self.sounds == TRUE) - { - precache_sound("doors/latch2.wav"); - precache_sound("doors/winch2.wav"); - precache_sound("doors/drclos4.wav"); - self.noise1 = "doors/latch2.wav"; - self.noise2 = "doors/winch2.wav"; - self.noise3 = "doors/drclos4.wav"; - } - if (self.sounds == 2) - { - precache_sound("doors/airdoor1.wav"); - precache_sound("doors/airdoor2.wav"); - self.noise2 = "doors/airdoor1.wav"; - self.noise1 = "doors/airdoor2.wav"; - self.noise3 = "doors/airdoor2.wav"; - } - if (self.sounds == 3) - { - precache_sound("doors/basesec1.wav"); - precache_sound("doors/basesec2.wav"); - self.noise2 = "doors/basesec1.wav"; - self.noise1 = "doors/basesec2.wav"; - self.noise3 = "doors/basesec2.wav"; - } - self.solid = FALSE; - self.movetype = FALSE; - setmodel(self, self.model); - setorigin(self, self.origin); - setsize(self, self.mins, self.maxs); - self.state = STATE_CLOSED; - self.use = rotate_door_use; - self.think = SUB_Null; -}; - diff --git a/attic/TeamNexuiz/game/gamec/tf_constants.c b/attic/TeamNexuiz/game/gamec/tf_constants.c deleted file mode 100644 index f348c7b36..000000000 --- a/attic/TeamNexuiz/game/gamec/tf_constants.c +++ /dev/null @@ -1,60 +0,0 @@ -// Death message, Impulse, and misc Team:Nexuiz constants stored here - -/***************** Impulse Defs **********************/ -/////////////////////////////////////////////////////// -/*****************************************************/ -float RELOAD_IMPULSE = 70; -float TELL_POSITION_IMPULSE = 205; -float DROP_FLAG_IMPULSE = 203; -float FEIGN_IMPULSE = 204; - - -/******************* Death Messages ********************/ -///////////////////////////////////////////////////////// -/*******************************************************/ -float RAILGUN_HEADSHOT = 300; -float RAILGUN_CHESTSHOT = 301; -float RAILGUN_BODYSHOT = 302; -float RAILGUN_LEGSHOT = 303; -//304? -float PISTOL_HEADSHOT = 305; -float PISTOL_BODYSHOT = 306; // no chest shot death msg for pistol -float PISTOL_LEGSHOT = 307; -//308? - -/******************** Menus *******************/ -//////////////////////////////////////////////// -/**********************************************/ -float MENU_ENGINEER_BUILD = 15; -float MENU_EXTRACTOR = 26; -float MENU_NEED_TN = 90; - -/****************** Buildings ********************/ -/////////////////////////////////////////////////// -/*************************************************/ -//costs -float BUILDING_EXTRACTOR_NEEDCELLS = 200; -float BUILDING_DISPENSER_NEEDCELLS = 100; -float BUILDING_SENTRY_NEEDCELLS = 50; -float BUILDING_SENTRY_NEEDMETAL = 150; -float BUILDING_TESLA_NEEDCELLS = 100; -float BUILDING_TESLA_NEEDMETAL = 175; -float BUILDING_TELEPAD_NEEDCELLS = 100; -float BUILDING_TELEPAD_NEEDMETAL = 75; -//stats -float BUILDING_EXTRACTOR_MAXMETAL = 150; -//misc -float BUILDING_EXTRACTOR_CHECKRADIUS = 1200; - -/***************** misc constants **********************/ -///////////////////////////////////////////////////////// -/*******************************************************/ -float BODYSHOT = 0; -float LEGSHOT = 1; -float CHESTSHOT = 2; -float HEADSHOT = 3; -float JETJUMP_NEEDROCKETS = 15; -vector PL_FEIGN_VIEW_OFS = '0 0 10'; // feign view offset -// T:N HUD Items -float NO_AMMO_WARNING = 1; -float HUD_PRIME_GREN = 2; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/tf_w_mac10.c b/attic/TeamNexuiz/game/gamec/tf_w_mac10.c deleted file mode 100644 index b3bdaa454..000000000 --- a/attic/TeamNexuiz/game/gamec/tf_w_mac10.c +++ /dev/null @@ -1,119 +0,0 @@ -void() mac_ready_01; -void() mac_fire1_01; -void() mac_deselect_01; -void() mac_select_01; -void() mac_fire2_01; - -float() mac_check = -{ - if (self.ammo_nails >= 1) - return TRUE; - return FALSE; -}; - -void(float req) w_mac = -{ - if (req == WR_IDLE) - mac_ready_01(); - else if (req == WR_FIRE1) - weapon_prepareattack(mac_check, mac_check, mac_fire1_01, cvar("g_balance_mac_refire")); - else if (req == WR_FIRE2) - weapon_prepareattack(mac_check, mac_check, mac_fire2_01, cvar("g_balance_mac_refire2")); - else if (req == WR_RAISE) - mac_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = self.ammo_nails; - else if (req == WR_DROP) - mac_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_MAC, "w_mac.zym", IT_NAILS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = mac_check(); -}; - -.float mac_bulletcounter; -void W_Mac_Attack (void) -{ - local vector org; - entity flash; - local vector end; - - local vector trueaim; - - org = self.origin + self.view_ofs; - end = self.origin + self.view_ofs + v_forward * 4096; - traceline(org,end,TRUE,self); - - trueaim = trace_endpos; - - sound (self, CHAN_WEAPON, "weapons/mac_fire.wav", 1, ATTN_NORM); - if (cvar("g_use_ammunition")) - self.ammo_nails = self.ammo_nails - 1; - self.punchangle_x = random () - 0.5; - self.punchangle_y = random () - 0.5; - org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 8) + (v_forward * 15); - - // this attack_finished just enforces a cooldown at the end of a burst - self.attack_finished = time + cvar("g_balance_mac_refire2"); - - if (self.mac_bulletcounter == 1) - fireBullet (org, normalize(trueaim - org), cvar("g_balance_mac_spread2"), cvar("g_balance_mac_damage2"), WEP_MAC, (self.mac_bulletcounter & 3) == 0); - else - fireBullet (org, normalize(trueaim - org), cvar("g_balance_mac_spread"), cvar("g_balance_mac_damage"), WEP_MAC, (self.mac_bulletcounter & 3) == 0); - - // casing code - if (cvar("g_casings") >= 2) - { - org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 8) + (v_forward * 10); - SpawnCasing (org, ((random () * 50 + 50) * v_right) - ((random () * 25 + 25) * v_forward) - ((random () * 5 + 10) * v_up), 2, v_forward,'0 250 0', 100, 2); - } - - flash = spawn (); - org = self.origin + self.view_ofs + (v_right * 12) - (v_up * 9) + (v_forward * 40); - setorigin (flash, org); - setmodel (flash, "models/uziflash.md3"); //temp use mac flash - flash.velocity = v_forward * 20; - flash.angles = vectoangles (flash.velocity); - flash.angles_z=flash.v_angle_z + random () * 180; - flash.scale = 0.75; - flash.alpha = 0.5; - SUB_SetFade (flash, time, 0.2); - flash.effects = flash.effects | EF_ADDITIVE | EF_FULLBRIGHT; -} - -// weapon frames -void() mac_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, mac_ready_01); self.weaponentity.state = WS_READY;}; -void() mac_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() mac_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() mac_fire1_01 = -{ - if (self.button0) - { - self.mac_bulletcounter = self.mac_bulletcounter + 1; - weapon_doattack(mac_check, mac_check, W_Mac_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_mac_refire"), mac_fire1_01); - } - else - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_mac_refire"), mac_ready_01); -}; - -void() mac_fire2_03 = -{ - self.mac_bulletcounter = 1; - weapon_doattack(mac_check, mac_check, W_Mac_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_mac_refire"), mac_fire1_01); -}; - -void() mac_fire2_02 = -{ - self.mac_bulletcounter = 1; - weapon_doattack(mac_check, mac_check, W_Mac_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_mac_refire"), mac_fire2_03); -}; - -void() mac_fire2_01 = -{ - self.mac_bulletcounter = 1; - weapon_doattack(mac_check, mac_check, W_Mac_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_mac_refire"), mac_fire2_02); -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/tf_w_pistol.c b/attic/TeamNexuiz/game/gamec/tf_w_pistol.c deleted file mode 100644 index beb5320ba..000000000 --- a/attic/TeamNexuiz/game/gamec/tf_w_pistol.c +++ /dev/null @@ -1,126 +0,0 @@ -void() pistol_ready_01; -void() pistol_fire1_01; -void() pistol_fire2_01; -void() pistol_deselect_01; -void() pistol_select_01; - -float() pistol_check = -{ - if (self.ammo_shells >= 1) - return TRUE; - return FALSE; -}; - -void(float req) w_pistol = -{ - if (self.next_pistol_fire > time) - return; - if (req == WR_IDLE) - pistol_ready_01(); - else if (req == WR_FIRE1) - weapon_prepareattack(pistol_check, pistol_check, pistol_fire1_01, cvar("g_balance_pistol_refire")); - else if (req == WR_FIRE2) - stuffcmd(self, "reload\n"); - else if (req == WR_RAISE) - pistol_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = self.ammo_shells; - else if (req == WR_DROP) - pistol_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_PISTOL, "w_soldpistol.zym", IT_SHELLS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = pistol_check(); -}; - -void W_Pistol_Attack (void) -{ - local vector org; - float sc; - float bullets; - float d; - float spread; - - local vector end; - local vector trueaim; - org = self.origin + self.view_ofs; - end = self.origin + self.view_ofs + v_forward * 4096; - traceline(org,end,TRUE,self); - - trueaim = trace_endpos; - - sound (self, CHAN_WEAPON, "weapons/pistol_fire.wav", 1, ATTN_NORM); - bullets = cvar("g_balance_pistol_bullets"); - - d = cvar("g_balance_pistol_damage"); - - org = self.origin + self.view_ofs + (v_right * 1) - (v_up * 1) + (v_forward * 25); - spread = cvar("g_balance_pistol_spread"); - for (sc = 0;sc < bullets;sc = sc + 1) -// fireBullet (org, v_forward, spread, d, IT_PISTOL, sc < 3); - fireBullet (org, normalize(trueaim - org), spread, d, WEP_PISTOL, sc < 3); - if (cvar("g_use_ammunition")) - self.ammo_shells = self.ammo_shells - 1; - -/* local entity e; - e = spawn(); - e.owner = self; - e.movetype = MOVETYPE_FLY; - e.solid = SOLID_NOT; - e.think = SUB_Remove; - e.nextthink = time + vlen(trace_endpos - self.origin) / 6000; - e.velocity = v_forward * 1000; - e.angles = vectoangles (v_forward); - e.scale = .3; -// soonmodel (e, "models/tracer.mdl", .1); - setmodel (e, "models/tracer.mdl"); - setsize (e, '0 0 0', '0 0 0'); - setorigin (e, org); - e.effects = e.effects | EF_ADDITIVE;*/ - - - // casing code - if (cvar("g_casings") >= 1) - { - org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 8) + (v_forward * 10); - SpawnCasing (org, ((random () * 50 + 50) * v_right) - ((random () * 25 + 25) * v_forward) - ((random () * 5 + 10) * v_up), 2, v_forward,'0 250 0', 100, 1); - } - - org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 8) + (v_forward * 20); - //W_Smoke(org, v_forward, 12); - //te_smallflash(org); - - self.punchangle_x = -1; - - self.clip_pistol = self.clip_pistol - 1; - if (self.clip_pistol <= 0) - { - DoReload (1, CLIP_MAX_PISTOL); // weapon type 1 is pistol - } -} -// weapon frames - -void() pistol_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, pistol_ready_01); self.weaponentity.state = WS_READY;}; -void() pistol_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() pistol_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() pistol_fire1_01 = -{ - self.pistol_fired = 1; - weapon_doattack(pistol_check, pistol_check, W_Pistol_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_pistol_refire2"), pistol_ready_01); -}; -void() pistol_fire2_03 = -{ - weapon_doattack(pistol_check, pistol_check, W_Pistol_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_pistol_refire2"), pistol_ready_01); -} -void() pistol_fire2_02 = -{ - weapon_doattack(pistol_check, pistol_check, W_Pistol_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_pistol_refire2"), pistol_fire2_03); -} -void() pistol_fire2_01 = -{ - weapon_doattack(pistol_check, pistol_check, W_Pistol_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_pistol_refire2"), pistol_fire2_02); -} \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/tf_w_proxi.c b/attic/TeamNexuiz/game/gamec/tf_w_proxi.c deleted file mode 100644 index 34aedf182..000000000 --- a/attic/TeamNexuiz/game/gamec/tf_w_proxi.c +++ /dev/null @@ -1,311 +0,0 @@ -/*-============================== - MegaTF Proxi Grenade -==============================-*/ - -void () s_explode1 = [ 0, s_explode2 ] -{ -}; - -void () s_explode2 = [ 1, s_explode3 ] -{ -}; - -void () s_explode3 = [ 2, s_explode4 ] -{ -}; - -void () s_explode4 = [ 3, s_explode5 ] -{ -}; - -void () s_explode5 = [ 4, s_explode6 ] -{ -}; - -void () s_explode6 = [ 5, SUB_Remove ] -{ -}; - -void () s2_explode1 = [ 0, s2_explode2 ] -{ -}; - -void () s2_explode2 = [ 1, s2_explode3 ] -{ -}; - -void () s2_explode3 = [ 2, s2_explode4 ] -{ -}; - -void () s2_explode4 = [ 3, s2_explode5 ] -{ -}; - -void () s2_explode5 = [ 4, s2_explode6 ] -{ -}; - -void () s2_explode6 = [ 5, s2_explode7 ] -{ -}; - -void () s2_explode7 = [ 6, s2_explode8 ] -{ -}; - -void () s2_explode8 = [ 7, SUB_Remove ] -{ -}; - -void () MushroomFlame = -{ - local entity t_ent; - - t_ent = spawn (); - t_ent.real_owner = self; - t_ent.movetype = 9; - t_ent.solid = 0; - t_ent.classname = "flamerflame"; -// t_ent.effects = 4; - if ((self.classname == "airstrike")) - { - t_ent.velocity_x = (random () * 1000); - } - vector org2; - org2 = findbetterlocation (t_ent.origin); - te_explosion (org2); - effect (org2, "models/sprites/rocketexplosion.spr32", 0, 20, 40); - - t_ent.velocity_y = (random () * 1000); - t_ent.velocity_z = 200; - t_ent.think = s_explode1; - t_ent.nextthink = (time + 0.300000); - setmodel (t_ent, "progs/s_explod.spr"); -// setmodel (t_ent, "models/sprites/rocketexplosion.spr32"); - - setsize (t_ent, '0 0 0', '0 0 0'); - setorigin (t_ent, (self.origin + '0 0 16')); - - -}; - -void () Prox_Disarm = -{ - if ((other.classname != "player")) - { - return; - } - if (((other.playerclass == 1) && (other.team_no != self.team_no))) - { - sprint (self.real_owner, "Your Proxi Mine Has Been Disarmed...\n"); - bprint (self.real_owner.netname); - bprint ("'s proxi was defused by "); - bprint (self.enemy.netname); - bprint ("\n"); - //logfrag (self.real_owner, self.enemy.real_owner); - self.enemy.real_frags = (self.enemy.real_frags + 1); - if (!(toggleflags & 128)) - { - self.enemy.frags = self.enemy.real_frags; - } - dremove (self); - } - return; -}; - -void () ProxiDie = -{ - vector org2; - org2 = findbetterlocation (self.origin); - te_explosion (org2); - effect (org2, "models/sprites/rocketexplosion.spr32", 0, 20, 40); - - self.effects = 4; - //make_explosion (); - self.takedamage = 0; - deathmsg = 45; - T_RadiusDamage (self, self.real_owner, 200, world); - sprint (self.real_owner, "Your Proxi Mine is gone...\n"); - dremove (self); -}; - -void () FoundBastard = -{ - local float dist; - - self.touch = Prox_Disarm; - sound (self, 3, "sound/proxi/beep.wav", 1, 1); - self.skin = (self.real_owner.team_no + 3); - dist = vlen ((self.enemy.origin - self.origin)); - if ((dist <= self.height)) - { - self.height = dist; - self.nextthink = (time + ((dist / 1000) * 1.5)); - self.think = FoundBastard; - } - else - { - self.effects = 4; - //make_explosion (); - MushroomFlame (); - WriteByte (4, 23); - WriteByte (4, 3); - WriteCoord (4, self.origin_x); - WriteCoord (4, self.origin_y); - WriteCoord (4, self.origin_z); - //multicast (self.origin, 1); - deathmsg = 45; - sprint (self.real_owner, "Proxi Mine is gone...\n"); - self.takedamage = 0; - T_RadiusDamage (self, self.real_owner, 200, world); - dremove (self); - } -}; - -void () ProxArmed = -{ - local entity te; - local vector dist; - - self.velocity = '0 0 0'; - self.nextthink = (time + 1); - self.think = ProxArmed; - sound (self, 3, "sound/proxi/beep.wav", 0.3, 1); - self.playerclass = (self.playerclass + 1); -/* if ((self.skin == self.real_owner.team_no)) - { - self.skin = 0; - } - else - { - self.skin = self.real_owner.team_no; - }*/ - //self.colormap = self.real_owner.colormap; - te = find (world, classname, "player"); - while (te) - { - if ((self.real_owner != te)) - { - if (((te.team_no != 0) && (te.team_no != self.team_no))) - { - if ((te.health > 1)) - { - if (visible (te)) - { - if ((te.undercover_team != self.team_no)) - { - dist = (te.origin - self.origin); - if ((vlen (dist) < 200)) - { - self.height = vlen (dist); - self.enemy = te; - self.nextthink = 0.2; - self.think = FoundBastard; - } - } - } - } - } - } - te = find (te, classname, "player"); - } - if (((self.playerclass > 300) || (self.real_owner.playerclass != 3))) - { - sprint (self.real_owner, "Your Proxi Mine Fizzled...\n"); - dremove (self); - } -}; - -void () ProxAttach = -{ - self.touch = SUB_Null; - self.think = ProxArmed; - self.nextthink = (time + 0.5); - sound (newmis, 0, "buttons/switch02.wav", 1, 1); -}; - -void () Prox = -{ - local vector org; - local vector stopspot; - local entity te; - local float proxicount; - - te = find (world, classname, "bot"); - while (te) - { - if ((te.real_owner == self)) - { - proxicount = (proxicount + 1); - } - if ((proxicount >= 2)) - { - sprint (self, "2 proximity grenades at a time!\n"); - return; - } - te = find (te, classname, "bot"); - } - if ((self.no_grenades_2 < 2)) - { - sprint (self, "Not enough type 2 grenades... get more\n"); - if ((self.weaponmodel == "progs/proxgren.mdl")) - { - self.weaponmodel = "progs/v_rock2.mdl"; - self.currentammo = self.ammo_rockets; - //Attack_Finished (0.7); - self.impulse = 0; - self.StatusRefreshTime = (time + 0.1); - self.tfstate = (self.real_owner.tfstate - (self.real_owner.tfstate & 2)); - } - return; - }/* - if ((self.weaponmodel != "progs/proxgren.mdl")) - { - self.tfstate = (self.tfstate | 2); - self.currentammo = 1; - self.weaponmodel = "progs/proxgren.mdl"; - self.weaponframe = 0; - return; - }*/ - makevectors (self.v_angle); - org = (self.origin + (v_forward * 10)); - org_z = (self.absmin_z + (self.size_z * 0.7)); - traceline (org, (org + (v_forward * 70)), 0, self); - stopspot = (trace_endpos - (v_forward * 8)); - if ((trace_fraction != 1)) - { - sound (self, 3, "buttons/switch02.wav", 1, 1); - sprint (self, "Proximity mine set!\n"); - self.no_grenades_2 = (self.no_grenades_2 - 2); - newmis = spawn (); - setsize(newmis, '-16 -16 0', '16 16 48'); -// newmis.owner = self; - newmis.real_owner = self; - newmis.weapon = 41; - newmis.movetype = 0;//0; - newmis.solid = SOLID_BBOX; - newmis.classname = "bot"; - newmis.netname = "proxi"; - newmis.team_no = self.team_no; - newmis.health = 30; - newmis.takedamage = 2; - newmis.th_die = ProxiDie; - setsize (newmis, '-2 -2 -2', '2 2 2'); - newmis.angles = '0 0 0'; - newmis.nextthink = (time + 0.5); - newmis.playerclass = 0; - newmis.think = ProxAttach; - newmis.skin = 0; - newmis.frame = 1; - newmis.colormap = self.colormap; - setmodel (newmis, "models/proxi/proxymine2.md3"); - setorigin (newmis, stopspot - '0 0 4'); - self.tfstate = (self.tfstate - (self.tfstate & 2)); - self.weaponmodel = "progs/v_rock2.mdl"; - self.currentammo = self.ammo_rockets; - //Attack_Finished (0.7); - self.impulse = 0; - self.StatusRefreshTime = (time + 0.1); - } -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/tf_w_railgun.c b/attic/TeamNexuiz/game/gamec/tf_w_railgun.c deleted file mode 100644 index 5c9388c23..000000000 --- a/attic/TeamNexuiz/game/gamec/tf_w_railgun.c +++ /dev/null @@ -1,116 +0,0 @@ -void() railgun_ready_01; -void() railgun_fire1_01; -void() railgun_deselect_01; -void() railgun_select_01; - -float() railgun_check = -{ - if (self.ammo_shells >= 5) - return TRUE; - return FALSE; -}; - -void(float req) w_railgun = -{ - if (req == WR_IDLE) - railgun_ready_01(); - else if (req == WR_FIRE1) - weapon_prepareattack(railgun_check, railgun_check, railgun_fire1_01, .5/*cvar("g_balance_nex_refire")*/); - else if (req == WR_RAISE) - railgun_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = floor(self.ammo_shells/* / 5*/); - else if (req == WR_DROP) - railgun_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_RAILGUN, "w_nex.zym", IT_SHELLS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = railgun_check(); -}; - - -void W_RailGun_Attack (void) -{ - local vector org; - local vector end; - local entity flash; - - local vector trueaim; - - sound (self, CHAN_WEAPON, "weapons/nexfire.ogg", 1, ATTN_NORM); - if (self.items & IT_STRENGTH) { - sound (self, CHAN_AUTO, "weapons/strength_fire.ogg", 1, ATTN_NORM); - } - - self.punchangle_x = -5; - org = self.origin + self.view_ofs; - end = self.origin + self.view_ofs + v_forward * 4096; - - traceline(org,end,TRUE,self); - - trueaim = trace_endpos; - - org = self.origin + self.view_ofs + v_forward * 5 + v_right * 14 + v_up * -7; - - FireRailgunBullet (org, trueaim, cvar("g_balance_railgun_damage"), IT_NEX); - - // trace as if shot started inside gun - traceline (org, trueaim, TRUE, self); - // show as if shot started outside of gun - org = self.origin + self.view_ofs + v_forward * 28 + v_right * 14 + v_up * -7; - // muzzleflash light - te_smallflash (org); - // beam effect - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte (MSG_BROADCAST, 76); - WriteCoord (MSG_BROADCAST, org_x); - WriteCoord (MSG_BROADCAST, org_y); - WriteCoord (MSG_BROADCAST, org_z); - WriteCoord (MSG_BROADCAST, trace_endpos_x); - WriteCoord (MSG_BROADCAST, trace_endpos_y); - WriteCoord (MSG_BROADCAST, trace_endpos_z); - WriteCoord (MSG_BROADCAST, 0); - WriteCoord (MSG_BROADCAST, 0); - WriteCoord (MSG_BROADCAST, 0); - // flash and burn the wall - te_plasmaburn (trace_endpos); - /* - // flame effect at impact - dir = trace_plane_normal * 100; - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte (MSG_BROADCAST, TE_FLAMEJET); - WriteCoord (MSG_BROADCAST, trace_endpos_x); - WriteCoord (MSG_BROADCAST, trace_endpos_y); - WriteCoord (MSG_BROADCAST, trace_endpos_z); - WriteCoord (MSG_BROADCAST, dir_x); - WriteCoord (MSG_BROADCAST, dir_y); - WriteCoord (MSG_BROADCAST, dir_z); - WriteByte (MSG_BROADCAST, 255); - */ - // play a sound - PointSound (trace_endpos, "weapons/RailGunimpact.wav", 1, ATTN_NORM); - - if (cvar("g_use_ammunition") && cvar("g_instagib") == 0) -// self.ammo_cells = self.ammo_cells - 5; - self.ammo_shells = self.ammo_shells - 5; - - flash = spawn (); - org = self.origin + self.view_ofs + v_forward * 33 + v_right * 14 + v_up * -7; - setorigin (flash, org); - setmodel (flash, "models/nexflash.md3"); - flash.velocity = v_forward * 20; - flash.angles = vectoangles (flash.velocity); - SUB_SetFade (flash, time, 0.4); - flash.effects = flash.effects | EF_ADDITIVE | EF_FULLBRIGHT; -} - -// weapon frames -void() railgun_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, railgun_ready_01); self.weaponentity.state = WS_READY;}; -void() railgun_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() railgun_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() railgun_fire1_01 = -{ - weapon_doattack(railgun_check, railgun_check, W_RailGun_Attack); -// weapon_thinkf(WFRAME_FIRE1, 0.3, railgun_ready_01); - weapon_thinkf(WFRAME_FIRE1, 0.9, railgun_ready_01); -}; diff --git a/attic/TeamNexuiz/game/gamec/tfai.c b/attic/TeamNexuiz/game/gamec/tfai.c deleted file mode 100644 index 8c0f20e06..000000000 --- a/attic/TeamNexuiz/game/gamec/tfai.c +++ /dev/null @@ -1,101 +0,0 @@ -void() ai_face = -{ - self.ideal_yaw = vectoyaw(self.enemy.origin - self.origin); - self.ideal_yaw = anglemod(self.ideal_yaw); - ChangeYaw(); -}; - -void(float normal) SUB_AttackFinished = -{ - self.cnt = TF_FLARE_LIT; -// if (skill < 3) -// { - self.attack_finished = time + normal; -// } -}; - -float(entity targ) range = -{ - local vector spot1; - local vector spot2; - local float r; - spot1 = self.origin + self.view_ofs; - spot2 = targ.origin + targ.view_ofs; - r = vlen(spot1 - spot2); - if (r < 120) - { - return TF_FLARE_LIT; - } - if (r < 500) - { - return TF_FLARE_OFF; - } - if (r < 1000) - { - return 2; - } - return 3; -}; - -float(entity targ) infront = -{ - local vector vec; - local float dot; - makevectors(self.angles); - vec = normalize(targ.origin - self.origin); - dot = vec * v_forward; - if (dot > 0.3) - { - return TF_FLARE_OFF; - } - return TF_FLARE_LIT; -}; - -void() t_movetarget = -{ - local entity temp; - if (other.movetarget != self) - { - return; - } - if (other.enemy) - { - return; - } - temp = self; - self = other; - other = temp; - if (self.classname == "monster_ogre") - { - sound(self, 2, "ogre/ogdrag.wav", TF_FLARE_OFF, 2); - } - self.goalentity = self.movetarget = find(world, targetname, other.target); - self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin); - if (!(self.movetarget)) - { - self.pausetime = time + 999999; - self.th_stand(); - return; - } -}; - -void() movetarget_f = -{ - if (!(self.targetname)) - { - objerror("monster_movetarget: no targetname"); - } - self.solid = TF_FLARE_OFF; - self.touch = t_movetarget; - setsize(self, '-8 -8 -8', '8 8 8'); -}; - -void() path_corner = -{ - if (CheckExistence() == TF_FLARE_LIT) - { - dremove(self); - return; - } - movetarget_f(); -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/tfbuttons.c b/attic/TeamNexuiz/game/gamec/tfbuttons.c deleted file mode 100644 index 0a84238a5..000000000 --- a/attic/TeamNexuiz/game/gamec/tfbuttons.c +++ /dev/null @@ -1,166 +0,0 @@ -void () button_return; - -void () button_wait = -{ - self.state = 0; - self.nextthink = (self.ltime + self.wait); - self.think = button_return; - activator = self.enemy; - SUB_UseTargets (); -// self.frame = 1; // causes crash :(( -}; - -void () button_done = -{ - self.state = 1; -}; - -void () button_return = -{ - self.goal_state = 2; - self.state = 3; - SUB_CalcMove (self.pos1, self.speed, button_done); - self.frame = 0; - if (self.health) - { - self.takedamage = 1; - } -}; - -void () button_blocked = -{ -}; - -void () button_fire = -{ - if (((self.state == 2) || (self.state == 0))) - { - return; - } - sound (self, 2, self.noise, 1, 1); - self.state = 2; - SUB_CalcMove (self.pos2, self.speed, button_wait); -}; - -void () button_use = -{ - self.enemy = activator; - button_fire (); -}; - -float () button_touch = -{ - local entity te; - - if ((cb_prematch_time > time)) - { - return 0; - } - if ((other.classname != "player")) - { - return 0; - } - if ((self.goal_activation & 8)) - { - return 0; - } - if ((other.playerclass == 0)) - { - return (0); - } - if (!Activated (self, other)) - { - if ((self.else_goal != 0)) - { - te = Findgoal (self.else_goal); - if (te) - { - AttemptToActivate (te, other, self); - } - } - return 0; - } - self.enemy = other; - button_fire (); -}; - -void () button_killed = -{ - if ((self.goal_activation & 8)) - { - return; - } - self.enemy = damage_attacker; - self.health = self.max_health; - self.takedamage = 0; - button_fire (); -}; - -void () func_button = -{ - if (self.activetarget != "") - { - self.target = self.activetarget; - } - - if ((CheckExistence () == 0)) - { - dremove (self); - return; - } - if ((self.sounds == 0)) - { - precache_sound ("buttons/airbut1.wav"); - self.noise = "buttons/airbut1.wav"; - } - if ((self.sounds == 1)) - { - precache_sound ("buttons/switch21.wav"); - self.noise = "buttons/switch21.wav"; - } - if ((self.sounds == 2)) - { - precache_sound ("buttons/switch02.wav"); - self.noise = "buttons/switch02.wav"; - } - if ((self.sounds == 3)) - { - precache_sound ("buttons/switch04.wav"); - self.noise = "buttons/switch04.wav"; - } - SetMovedir (); - self.movetype = 7; - self.solid = 4; - setmodel (self, self.model); - self.blocked = button_blocked; - self.use = button_use; - if (self.health) - { - self.max_health = self.health; - self.th_die = button_killed; - self.takedamage = 1; - } - else - { - self.touch = button_touch; - } - if (!self.speed) - { - self.speed = 40; - } - if (!self.wait) - { - self.wait = 1; - } - if (!self.lip) - { - self.lip = 4; - } - self.state = 1; - self.pos1 = self.origin; - self.pos2 = (self.pos1 + (self.movedir * (fabs ((self.movedir * self.size)) - self.lip))); - if ((self.spawnflags & 32)) - { - button_fire (); - } -}; diff --git a/attic/TeamNexuiz/game/gamec/tfclient.c b/attic/TeamNexuiz/game/gamec/tfclient.c deleted file mode 100644 index 59bcb1c6f..000000000 --- a/attic/TeamNexuiz/game/gamec/tfclient.c +++ /dev/null @@ -1,169 +0,0 @@ -float intermission_running; // This was moved here from mauvebot.c -float intermission_exittime; // This was moved here from g_world.c -void (entity AD) ParseTFDetect; - -entity () FindIntermission = -{ - local entity spot; - local float cyc; - - spot = find (world, classname, "info_intermission"); - if (spot) - { - cyc = (random () * 1); - return (spot); - } - spot = find (world, classname, "info_player_start"); - if (spot) - { - return (spot); - } - spot = find (world, classname, "info_player_deathmatch"); - if (spot) - { - cyc = (random () * 6); - while ((cyc > 1)) - { - spot = find (spot, classname, "info_player_deathmatch"); - if (!spot) - { - spot = find (spot, classname, "info_player_deathmatch"); - } - cyc = (cyc - 1); - } - return (spot); - } - objerror ("FindIntermission: no spot"); -}; - -// This sets all the settings for the level including teams allowed, and lives and legal classes etc. -// it is called only once, for the first player who joins -void () DecodeLevelParms = -{ - if (parems_decoded == 1) - return; - else { - // The following allows play on Nexuiz/NexCTF maps if there is no info_tfdetect on a map - if (team1maxplayers == 0) - team1maxplayers = 4; - if (team2maxplayers == 0) - team2maxplayers = 4; -// if (number_of_teams > 2) -// { - if (team3maxplayers == 0) - team3maxplayers = 4; - if (team4maxplayers == 0) - team4maxplayers = 4; - if (team3lives == 0) - team3lives = -1; - if (team4lives == 0) - team4lives = -1; -// } - if (team1lives == 0) - team1lives = -1; - if (team2lives == 0) - team2lives = -1; - - local entity decent; - decent = find (world, classname, "info_tfdetect"); - if ((decent != world)) - { -// teamplay = cvar ("teamplay"); -// if ((teamplay == 0)) -// { - cvar_set ("teamplay", "21?TeamFortress"); -// } - ParseTFDetect (decent); // This returns the map's team/class allowances - if (((number_of_teams <= 0.000000) || (number_of_teams >= 5.000000))) - { - number_of_teams = 4.000000; - } - } - } - parems_decoded = 1; -}; - -// Execute Change Level -void () execute_changelevel = -{ - local entity pos; - - intermission_running = 1; - if (deathmatch) - { - intermission_exittime = (time + 5); - } - else - { - intermission_exittime = (time + 2); - } - WriteByte (2, 32); - WriteByte (2, 3); - WriteByte (2, 3); - pos = FindIntermission (); - other = find (world, classname, "player"); - while ((other != world)) - { - other.view_ofs = '0 0 0'; - other.v_angle = pos.mangle; - other.angles = pos.mangle; - other.fixangle = 1; - other.nextthink = (time + 0.5); - other.takedamage = 0; - other.solid = 0; - other.movetype = 0; - other.modelindex = 0; - setorigin (other, pos.origin); - other = find (other, classname, "player"); - } - WriteByte (2, 30); -}; - -.entity teambubble_needhealth; // displays when player's health is below 30% -.entity teambubble_friendly; // displays that player is friendly teammate -//repeated defs: -.float buttonchat; -.entity exteriormodeltoclient; - -void() TeamBubbleThink = -{ - self.nextthink = time; - if (!self.owner.modelindex || self.owner.teambubble_friendly != self) - { - remove(self); - return; - } - //setorigin(self, self.owner.origin + '0 0 15' + self.owner.maxs_z * '0 0 1'); //bandwidth hax - if (self.owner.buttonchat || self.owner.deadflag) - self.model = ""; - else - self.model = self.mdl; - -}; - -.float() customizeentityforclient; // new DP extension used for the team bubble -float() ChatBubble_customizeentityforclient = {return (self.owner.team_no == other.team_no && other.killcount > -666);}; - - -void() UpdateTeamBubble = -{ - if (!self.modelindex || !cvar("teamplay")) - return; - // spawn a teambubble entity if needed - if (!self.teambubble_friendly && cvar("teamplay")) - { - self.teambubble_friendly = spawn(); - self.teambubble_friendly.owner = self; - self.teambubble_friendly.exteriormodeltoclient = self; - self.teambubble_friendly.think = TeamBubbleThink; - self.teambubble_friendly.nextthink = time; - setmodel(self.teambubble_friendly, "models/team/team.sp2"); -// setorigin(self.teambubble_friendly, self.origin + '0 0 15' + self.maxs_z * '0 0 1'); - setorigin(self.teambubble_friendly, self.teambubble_friendly.origin + '0 0 10' + self.maxs_z * '0 0 1'); - setattachment(self.teambubble_friendly, self, ""); - self.teambubble_friendly.scale = .07; - self.teambubble_friendly.mdl = self.teambubble_friendly.model; - self.teambubble_friendly.model = self.teambubble_friendly.mdl; - self.teambubble_friendly.customizeentityforclient = ChatBubble_customizeentityforclient; - } -} diff --git a/attic/TeamNexuiz/game/gamec/tfcombat.c b/attic/TeamNexuiz/game/gamec/tfcombat.c deleted file mode 100644 index e18d9059f..000000000 --- a/attic/TeamNexuiz/game/gamec/tfcombat.c +++ /dev/null @@ -1,709 +0,0 @@ -void () info_player_start; -void (entity targ, entity attacker) ClientObituary; -void (entity Goal, entity AP, float addb) DoResults; -float (entity Goal, entity AP) Activated; -float (entity targ, entity attacker, float damage) TeamEqualiseDamage; // TBA Add function for this - -// Death MSG Caller -float deathmsg; // Gonna have to make this work with NexTF's - -//compiler-satisfying vars (Add these to defs) -.void() th_die; // The function that gets executed when something "dies" -.void(entity attacker, float damage) th_pain; // Function that's executed when an entity gets hit(?) -float skill; // Skill level. Moot in NexTF (no SP, and bots use some other var) -.float super_damage_finished; //quad damage over <- convert this to work with nex! -entity damage_attacker; -.float immune_to_check; // as it says -float rj; // not sure, really.. - - -float is_ally (entity targ, entity attacker) { - if(targ.team_no == attacker.team_no) - return 1; - - // civilian class - //if(targ.class == CLASS_CIVILIAN) - // return 2; - - return 0; -} - - -// COMBAT -void () monster_death_use = -{ - if ((self.flags & 1)) - { - self.flags = (self.flags - 1); - } - if ((self.flags & 2)) - { - self.flags = (self.flags - 2); - } - if (!self.target) - { - return; - } - activator = self.enemy; - SUB_UseTargets (); -}; - -float (entity targ, entity inflictor) CanDamage = -{ - if ((targ.movetype == 7)) - { - traceline (inflictor.origin, (0.5 * (targ.absmin + targ.absmax)), 1, self); - if ((trace_fraction == 1)) - { - return (1); - } - if ((trace_ent == targ)) - { - return (1); - } - return (0); - } - traceline (inflictor.origin, targ.origin, 1, self); - if ((trace_fraction == 1)) - { - return (1); - } - traceline (inflictor.origin, (targ.origin + '15 15 0'), 1, self); - if ((trace_fraction == 1)) - { - return (1); - } - traceline (inflictor.origin, (targ.origin + '-15 -15 0'), 1, self); - if ((trace_fraction == 1)) - { - return (1); - } - traceline (inflictor.origin, (targ.origin + '-15 15 0'), 1, self); - if ((trace_fraction == 1)) - { - return (1); - } - traceline (inflictor.origin, (targ.origin + '15 -15 0'), 1, self); - if ((trace_fraction == 1)) - { - return (1); - } - return (0); -}; - -void (entity targ, entity attacker) Killed = -{ - local entity oself; - - oself = self; - self = targ; - if ((self.health < -99)) - { - self.health = -99; - } - if (((self.movetype == 7) || (self.movetype == 0))) - { - self.th_die (); - self = oself; - return; - } - if (self.classname == "building_tesla") - { - self.th_die (); - self = oself; - return; - } - if (self.th_die && self.classname != "player") // so objects and buildings use their proper death functions - { - self.th_die (); - self = oself; - return; - } - self.enemy = attacker; - if ((self.flags & 32)) - { - killed_monsters = (killed_monsters + 1); - WriteByte (2, 27); - } -// ClientObituary (self, attacker); // causing crash :/ -// Obituary (attacker, targ, deathmsg); - self.takedamage = 0; - self.touch = SUB_Null; - monster_death_use (); -// self.th_die (); -// (float unnatural_death, entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force - PlayerKilled (0, targ, attacker, 0, deathmsg); - self = oself; -}; - -void (entity targ, entity inflictor, entity attacker, float damage) T_Damage = -{ - local vector dir; - local entity oldself; - local entity te; - local float save; - local float take; - - local float damagearmor; - - if (targ.team_no < 1 && targ.classname != "func_button" && targ.classname != "door" && targ.classname != "building_tesla" && targ.netname != "proxi") // TEMP - { //// - return; //// - } //// - - /*if (targ.classname == "building_tesla") - { - targ.health = (targ.health - take); - if ((targ.health <= 0)) - { - Killed (targ, attacker); - } - return; - }*/ - if (targ.pain_finished < time) //Don't switch pain sequences like crazy - { - if (random() > 0.5) - targ.pain_frame = $pain1; - else - targ.pain_frame = $pain2; - targ.pain_finished = time + 0.5; //Supajoe - } - if(targ.class == CLASS_MEDIC) - { - if(deathmsg == DEATH_BURNING) - damage = 0; // being on fire or near burning targets does nothing to medics - // the flame thrower, flame rockets, and hotbombs also do minimal damage - else if(deathmsg == WEP_FLAMER || - deathmsg == WEP_ROCKET_INCENDIARY || - deathmsg == WEP_HOTBOMBS) - damage = damage * cvar("g_balance_class_medic_flame_takedamage"); - } - - - if (!targ.takedamage) - { - return; - } - if ((attacker.classname == "player")) - { - damage = (damage * 0.9); - } - if ((attacker.classname == "player")) - { - if ((attacker.strength_finished > time)) - { - damage = (damage * 4); - } - if (((targ.classname != "player") && (targ.classname != "bot") && (targ.classname != "building_tesla"))) - { - if (!Activated (targ, attacker)) - { - if ((targ.else_goal != 0)) - { - te = Findgoal (targ.else_goal); - if (te) - { - AttemptToActivate (te, attacker, targ); - } - } - return; - } - } - } - damage_attacker = attacker; - if ((teamplay & (64 | 32))) - { - damage = TeamEqualiseDamage (targ, attacker, damage); - } - save = ceil ((targ.armortype * damage)); - if ((save >= targ.armorvalue)) - { - save = targ.armorvalue; - targ.armortype = 0; - targ.armorclass = 0; - targ.items = (targ.items - (targ.items & ((8192 | 16384) | 32768))); - } - - targ.armorvalue = (targ.armorvalue - save); - take = ceil ((damage - save)); - if ((targ.flags & 8)) - { - targ.dmg_take = (targ.dmg_take + take); - targ.dmg_save = (targ.dmg_save + save); - targ.dmg_inflictor = inflictor; - } - if (((inflictor != world) && (targ.movetype == 3))) - { - targ.immune_to_check = (time + (damage / 20)); - dir = (targ.origin - ((inflictor.absmin + inflictor.absmax) * 0.5)); - dir = normalize (dir); - if ((((damage < 60) & ((attacker.classname == "player") & (targ.classname == "player"))) & (attacker.netname != targ.netname))) - { - targ.velocity = (targ.velocity + ((dir * damage) * 11)); - } - else - { - targ.velocity = (targ.velocity + ((dir * damage) * 8)); - } - if ((((rj > 1) & ((attacker.classname == "player") & (targ.classname == "player"))) & (attacker.netname == targ.netname))) - { - targ.velocity = (targ.velocity + ((dir * damage) * rj)); - } - } - if ((targ.flags & 64)) - { - return; - } - if ((targ.invincible_finished >= time)) - { - if ((self.invincible_sound < time)) - { - sound (targ, 3, "items/protect3.wav", 1, 1); - self.invincible_sound = (time + 2); - } - return; - } - if (((attacker.classname == "player") && ((targ.classname == "player") || (targ.classname == "building_sentrygun")))) - { - if ((((targ.team_no > 0) && (targ.team_no == attacker.team_no)) && (targ != attacker))) - { - if ((teamplay & 16)) - { - return; - } - else - { - if ((teamplay & 8)) - { - take = (take / 2); - } - } - } - } - - // MOVED HERE FROM PlayerDamage -- need to port the rest - // how much damage to deal to armor - damagearmor = bound(0, damage * 0.2 * (targ.armorvalue / 50) * cvar("g_balance_armor_takedamage"), targ.armorvalue); - // how much damage armor blocks - save = bound(0, damage * (targ.armorvalue / 100) * cvar("g_balance_armor_effectiveness"), damage); - // how much damage to deal to player - take = bound(0, damage - save, damage); - targ.armorvalue = targ.armorvalue - damagearmor; - DelayArmorRegen(targ); - - // if being telefragged or killed by a death trigger etc, don't block that -/* if(PlayerShouldDie(inflictor, attacker, damage, deathtype)) - { - if(take < damage) - take = damage; // deal full damage - } - else - {*/ - // keep the damage the armor allowed through, and further reduce it if the player is using the shield - if(targ.class == CLASS_SCOUT) - take = SpecialShieldProtect(take); -// } - - if (((take < 1) && (take != 0))) - { - take = 1; - } - - if (((attacker.classname == "player") && (((((((targ.classname == "player") || (targ.classname == "building_sentrygun")) || (targ.classname == "building_tesla")) || (targ.classname == "building_teleporter")) || (targ.classname == "building_camera")) || (targ.classname == "monster_helo")) || (targ.classname == "laser_drone")))) - { - if ((((targ.team_no > 0) && (targ.team_no == attacker.team_no)) && (targ != attacker))) - { - if ((teamplay & 16)) - { - return; - } - else - { - if ((teamplay & 8)) - { - take = take / 2; - } - } - } - } - - targ.health = (targ.health - take); - if ((targ.armorvalue < 1)) - { - targ.armorclass = 0; - targ.armorvalue = 0; - } - if ((targ.health <= 0)) - { - Killed (targ, attacker); - return; - } - oldself = self; - self = targ; - if (self.th_pain) - { - self.th_pain (attacker, take); - if ((skill >= 3)) - { - self.pain_finished = (time + 5); - } - } - self = oldself; -}; - -void (entity targ, entity inflictor, entity attacker, float damage, float T_flags, float T_AttackType) TF_T_Damage = -{ - local vector dir; - local entity oldself; - local entity te; - local float save; - local float take; - local float olddmsg; - local float no_damage; - local float moment; - - if (targ.team_no < 1 && targ.classname != "func_button" && targ.classname != "door" && targ.classname != "building_tesla" && targ.netname != "proxi") // TEMP - { //// - return; //// - } //// - if ((targ.takedamage == 0)) - { - return; - } - if ((T_AttackType & 256)) - { - targ.health = damage; - return; - } - /*if (cease_fire) // this aint needed - { - return; - }*/ - no_damage = 0; - if ((attacker.classname == "player")) - { - damage = (damage * 0.9); - if ((attacker.strength_finished > time)) - { - damage = (damage * 4); - } - if ((((((((((((targ.classname != "player") && (targ.classname != "bot")) && (targ.classname != "building_tesla")) && (targ.classname != "building_sentrygun")) && (targ.classname != "building_dispenser")) && (targ.classname != "trip_bomb")) && (targ.classname != "building_teleporter")) && (targ.classname != "building_camera")) && (targ.classname != "probe")) && (targ.classname != "monster_helo")) && (targ.classname != "laser_drone"))) - { - if (!Activated (targ, attacker)) - { - if ((targ.else_goal != 0)) - { - te = Findgoal (targ.else_goal); - if (te) - { - AttemptToActivate (te, attacker, targ); - } - } - return; - } - } - } - damage_attacker = attacker; - if ((teamplay & (64 | 32))) - { - damage = TeamEqualiseDamage (targ, attacker, damage); - } - if (((targ.armorclass != 0) && (T_AttackType != 0))) - { - if (((targ.armorclass & 1) && (T_AttackType & 1))) - { - damage = floor ((damage * 0.5)); - } - if (((targ.armorclass & 2) && (T_AttackType & 2))) - { - damage = floor ((damage * 0.5)); - } - if (((targ.armorclass & 4) && (T_AttackType & 4))) - { - damage = floor ((damage * 0.5)); - } - if (((targ.armorclass & 8) && (T_AttackType & 8))) - { - damage = floor ((damage * 0.5)); - } - if (((targ.armorclass & 16) && (T_AttackType & 16))) - { - damage = floor ((damage * 0.5)); - } - } - if ((T_flags & 1)) - { - take = damage; - save = 0; - } - else - { - save = ceil ((targ.armortype * damage)); - if ((((((attacker.classname == "player") && (targ.team_no > 0)) && (targ.team_no == attacker.team_no)) && (targ != attacker)) && (T_flags & 2))) - { - if ((T_AttackType & 4)) - { - if ((teamplay & 1024)) - { - save = 0; - } - else - { - if ((teamplay & 512)) - { - save = (save / 2); - } - } - } - else - { - if ((teamplay & 256)) - { - save = 0; - } - else - { - if ((teamplay & 128)) - { - save = (save / 2); - } - } - } - } - if ((save >= targ.armorvalue)) - { - save = targ.armorvalue; - targ.armortype = 0; - targ.armorclass = 0; - targ.items = (targ.items - (targ.items & ((8192 | 16384) | 32768))); - } - targ.armorvalue = (targ.armorvalue - save); - take = ceil ((damage - save)); - } - if ((targ.flags & 8)) - { - targ.dmg_take = (targ.dmg_take + take); - targ.dmg_save = (targ.dmg_save + save); - targ.dmg_inflictor = inflictor; - } - if ((((inflictor != world) && (targ.movetype == 3)) && !(targ.tfstate & 65536))) - { - if ((deathmsg != 9)) - { - targ.immune_to_check = (time + (damage / 20)); - dir = (targ.origin - ((inflictor.absmin + inflictor.absmax) * 0.5)); - dir = normalize (dir); - /*if ((targ.class == 6)) // moot function -- NexTF doesnt have an HWGuy - { - moment = (damage / 4); - if ((damage <= 50)) - { - moment = 0; - } - } - else*/ - { - moment = damage; - } - if ((((moment < 60) && ((attacker.classname == "player") && (targ.classname == "player"))) && (attacker.netname != targ.netname))) - { - targ.velocity = (targ.velocity + ((dir * moment) * 11)); - } - else - { - targ.velocity = (targ.velocity + ((dir * moment) * 8)); - } - if ((((rj > 1) && ((attacker.classname == "player") && (targ.classname == "player"))) && (attacker.netname == targ.netname))) - { - targ.velocity = (targ.velocity + ((dir * moment) * rj)); - } - } - } - if ((targ.flags & 64)) - { - return; - } - if ((targ.invincible_finished >= time)) - { - if ((self.invincible_sound < time)) - { - sound (targ, 3, "items/protect3.wav", 1, 1); - self.invincible_sound = (time + 2); - } - return; - } -// if (((attacker.classname == "player") && (((((targ.classname == "player") || (targ.classname == "building_sentrygun")) || (targ.classname == "building_dispenser")) || (targ.classname == "building_teleporter_entrance")) || (targ.classname == "building_teleporter_exit")))) - if (((attacker.classname == "player") && ((((((targ.classname == "player") || (targ.classname == "building_sentrygun")) || (targ.classname == "building_tesla")) || (targ.classname == "building_teleporter")) || (targ.classname == "building_camera")) || (targ.classname == "laser_drone")))) - { - if (((((targ.team_no > 0) && (targ.team_no == attacker.team_no)) && (targ != attacker)) && (T_flags & 2))) - { - if ((T_AttackType & 4)) - { - if ((teamplay & 16)) - { - no_damage = 1; - } - else - { - if ((teamplay & 8)) - { - take = (take / 2); - } - } - } - else - { - if ((teamplay & 4)) - { - no_damage = 1; - } - else - { - if ((teamplay & 2)) - { - take = (take / 2); - } - } - } - } - } - if ((T_flags & 4)) - { - if ((targ == attacker)) - { - return; - } - } - - local float damagearmor; - // MOVED HERE FROM PlayerDamage -- need to port the rest - // how much damage to deal to armor - damagearmor = bound(0, damage * 0.2 * (targ.armorvalue / 50) * cvar("g_balance_armor_takedamage"), targ.armorvalue); - // how much damage armor blocks - save = bound(0, damage * (targ.armorvalue / 100) * cvar("g_balance_armor_effectiveness"), damage); - // how much damage to deal to player - take = bound(0, damage - save, damage); - targ.armorvalue = targ.armorvalue - damagearmor; - DelayArmorRegen(targ); - - if ((take < 1)) - { - take = 1; - } - take = rint (take); - if ((no_damage == 0)) - { - targ.health = (targ.health - take); - } - if (((attacker.classname == "player") && (((((targ.classname == "player") || (targ.classname == "building_sentrygun")) || (targ.classname == "building_dispenser")) || (targ.classname == "building_teleporter_entrance")) || (targ.classname == "building_teleporter_exit")))) - { - if (((((targ.team_no > 0) && (targ.team_no == attacker.team_no)) && (targ != attacker)) && (T_flags & 2))) - { - olddmsg = deathmsg; - if ((T_AttackType & 4)) - { - deathmsg = 37; - if ((teamplay & 16384)) - { - TF_T_Damage (attacker, world, world, take, 1, 0); - } - else - { - if ((teamplay & 8192)) - { - TF_T_Damage (attacker, world, world, (take / 2), 1, 0); - } - } - } - else - { - deathmsg = 37; - if ((teamplay & 4096)) - { - TF_T_Damage (attacker, world, world, take, 1, 0); - } - else - { - if ((teamplay & 2048)) - { - TF_T_Damage (attacker, world, world, (take / 2), 1, 0); - } - } - } - deathmsg = olddmsg; - } - } - if ((no_damage == 1)) - { - return; - } - if ((targ.armorvalue < 1)) - { - targ.armorclass = 0; - targ.armorvalue = 0; - } - if ((targ.health <= 0)) - { - if ((((inflictor.classname == "detpack") && (inflictor.weaponmode == 1)) && (inflictor.enemy == targ))) - { - deathmsg = 16; - } - Killed (targ, attacker); - return; - } - oldself = self; - self = targ; - if (self.th_pain) - { - self.th_pain (attacker, take); - if ((skill >= 3)) - { - self.pain_finished = (time + 5); - } - } - self = oldself; -}; - -void (entity inflictor, entity attacker, float damage, entity ignore) T_RadiusDamage = -{ - local float points; - local entity head; - local vector org; //// - - head = findradius (inflictor.origin, (damage + 40)); - while (head) - { - if ((head != ignore)) - { - if (head.takedamage) - { - org = (head.origin + ((head.mins + head.maxs) * 0.5)); - points = (0.5 * vlen ((inflictor.origin - org))); - if ((points < 0)) - { - points = 0; - } - points = (damage - points); - if ((head == attacker)) - { - points = (points * 0.75); - } - if ((points > 0)) - { - if (CanDamage (head, inflictor)) - { - if ((head.classname == "monster_shambler")) - { - T_Damage (head, inflictor, attacker, (points * 0.5)); - } - else - { - TF_T_Damage (head, inflictor, attacker, points, 2, 4); - } - } - } - } - } - head = head.chain; - } -}; diff --git a/attic/TeamNexuiz/game/gamec/tfdefs.c b/attic/TeamNexuiz/game/gamec/tfdefs.c deleted file mode 100644 index fc8b55505..000000000 --- a/attic/TeamNexuiz/game/gamec/tfdefs.c +++ /dev/null @@ -1,330 +0,0 @@ -/************************************* - Team:Nexuiz (NexTF) Definitions -*************************************/ - -/********************* General ***************************/ -string TN_VERSION = "alpha .01"; - -float TF_FLARE_LIT = 0; // Woes of a decompiler, eh? -float TF_FLARE_OFF = 1; //// -float CTF_Map; -float (entity e, float healamount, float ignore) T_Heal; - -// Temporary Defs (till I implement real systems for these) -//float joinorder; // menu implemented :) -.float undercover_team; // is undercover as team number... Are we gonna use this one, wazat? -.float is_undercover; // is just undercover.. - -// Team Scores -float team1score; -float team2score; -float team3score; -float team4score; - -// Team Colors -float team1col; -float team2col; -float team3col; -float team4col; - -// Legal Classes -float illegalclasses/* = 0*/; -float illegalclasses1; -float illegalclasses2; -float illegalclasses3; -float illegalclasses4; -float civilianteams; - -//These are the "Map_Rules" entity's class restricts. -.float team1_scout, team1_soldier, team1_medic, team1_pyro, team1_spy, team1_engineer; -.float team2_scout, team2_soldier, team2_medic, team2_pyro, team2_spy, team2_engineer; -.float team3_scout, team3_soldier, team3_medic, team3_pyro, team3_spy, team3_engineer; -.float team4_scout, team4_soldier, team4_medic, team4_pyro, team4_spy, team4_engineer; -.float team1_civilian, team2_civilian, team3_civilian, team4_civilian; - -// Last Spawn Place of Team -entity lastspawn_team1; -entity lastspawn_team2; -entity lastspawn_team3; -entity lastspawn_team4; - -.float playerclass; // TF's recognition of players. This will be set in accordance to tf playerclasses - -// TF Class Numbers -float TF_CLASS_SCOUT = 1; -float TF_CLASS_SNIPER = 2; //not in NexTF -float TF_CLASS_SOLDIER = 3; -float TF_CLASS_DEMOMAN = 4; //not in NexTF -float TF_CLASS_MEDIC = 5; -float TF_CLASS_HWGUY = 6; //not in NexTF -float TF_CLASS_PYRO = 7; -float TF_CLASS_SPY = 8; -float TF_CLASS_ENGINEER = 9; -float TF_CLASS_RANDOM = 10; -float TF_CLASS_CIVILIAN = 11; -.float respawn_as_new_class; // what class the player will respawn as in accordance to tf's .playerclass - -// Death Message (we should incorporate this into Team:Nexuiz some time) -float deathmsg; - -// Hmm? -.float has_abbreviated; // for NetQuake's UpdateAbbreviation fucntion -.float hn_i_g; -.float hasnt_item_from_group; -float flagem_checked; -.float tp_grenades_1; -.float tp_grenades_2; -.float camdist; -.vector camangle; -.entity observer_list; -float cb_prematch_time; - -float civilianteams; // Are civilian teams allowed? - -float parems_decoded; // Have the parameters already been decoded - XavioR - -//Team Frags (old function -- possibly moot) -float team1frags; -float team2frags; -float team3frags; -float team4frags; - -//FlagExists floats so that a team flag isnt spawned twice by the Q3F conversion code -float redflagexists; -float blueflagexists; - -.void() th_die; // wtf is this again.. -.void() th_stand; -.void() th_walk; -.void() th_run; -.void() th_missile; -.void() th_melee; - -//switch teams function -.string no_switch_team; -.string switch_teams; - -// spy feign -.float is_feigning; - -// Weapon Clips -.float reload_time; -.float clip_pistol; -.float clip_crylink; -.float clip_rockets; -.float clip_pipegrenades; -float CLIP_MAX_PISTOL = 10; -float CLIP_MAX_CRYLINK = 8; -float CLIP_MAX_ROCKETS = 4; -float CLIP_MAX_PIPEGRENADES = 6; - -.vector head_shot_vector; // vector railgun_hitlocation -.float leg_damage; // amount of times a player has been hit in the legs - -.float is_dead; // temp // player is dead - -.float immune_to_check; // How long player is immune to cheat check? - //// Personally i think I'm jsut gonna implement krimzon's - //// ParseClientCommand to check color change cheats. - XavioR -.float axhitme; // Goal Item (I think) -- if ax hits then blah - // There's no axe in nexuiz tho.... :/ -.float armor_allowed; // -.float maxarmor; //// -.float ammo_medikit; -.float maxammo_medikit; -.float ammo_detpack; -.float maxammo_detpack; -.float maxammo_shells; -.float maxammo_nails; -.float maxammo_cells; -.float maxammo_rockets; -.float maxammo_metal; // maximum amoutn of metal that can be carried -.float last_impulse; -.float real_frags; -.float items_allowed; -.float super_time; // no idea(?) -.float super_sound; //// -.float invisible_finished; // Not a NexTF function(?) -.float invisible_time; //// -.float radsuit_finished; // BioSuit(?) -.float rad_time; //// -.float distance; // My guess is that this is whatever TF uses to store entity distances - // from each other? -.float volume; -.float option5; - -.float worldtype; // Not sure - -.float armorclass; // How will nexTF's armor class work? - // It's a good thing to have in anyways I guess. - -.float weaponmode; // I think only demoman and HWGuy use this, and since they're not in nextf.. poof - - // The TF State -.float tfstate; // State of the player according to quake TF. - // I will try to satisfy it for NexTF after the goal porting is done. -.float maxfbspeed; -.float maxstrafespeed; -.float StatusRefreshTime; // The Status Bar -.float StatusBarSize; //// -.float StatusBarRes; //// - -// MENU STUFF -.float current_menu; -.float menu_count; - -.float pistol_fired; // has the pistol been fired? 1 - yes, 2- no -.float next_pistol_fire; // pistol cannot be fired again until this value < time - //// check W_WeaponFrame for more detail on these 2 - -// WEAPON STUFF -.float next_nuke; -.float heat; // What tf uses for powering up weapons. Could be useful later? - -.float uses_bloom; // Does the client have bloom enabled? (used for flash bloom effect) - -entity otemp; -entity stemp; - -.entity trigger_field; - -.string noise4; // MTF fucntion -- possibly moot. -.string deathtype; // "You have the flag" - -.string team_str_home; -.string team_str_moved; -.string team_str_carried; - -void (entity targ, entity inflictor, entity attacker, float damage) T_Damage; -void (entity targ, entity inflictor, entity attacker, float damage, float T_flags, float T_AttackType) TF_T_Damage; -void (entity Viewer, float pc, float rpc) TeamFortress_PrintClassName; -void (float classnum) SetMaxAmmoFor; - -/*********************************************************/ -/////////////////////////////////////////////////////////// -/******************* Moved from:**************************/ -//tffunctions -.float nextpc; // for qued next player class -- we gonna use this? -.float DropFlagDelay; // next time player can drop a flag -void (string halias, float himpulse1, float himpulse2) TeamFortress_Alias; -string () ChooseRandomClass; - -// tfcombat: -.float invincible_time; //Pent effect time -.float invincible_sound; //Pent hit sound -void (entity inflictor, entity attacker, float damage, entity ignore) T_RadiusDamage; - -// tfmapitems: -.float tf_items; -.float tf_items_flags; -.float goal_no; -.float group_no; -.float goal_state; -.float goal_activation; -.float goal_effects; -.float goal_group; -.float activate_goal_no; -.float inactivate_goal_no; -.float if_goal_is_active; -.float if_goal_is_inactive; -.float if_goal_is_removed; -.float if_group_is_active; -.float if_group_is_inactive; -.float if_group_is_removed; -.float remove_goal_no; -.float restore_goal_no; -.float activate_group_no; -.float inactivate_group_no; -.float remove_group_no; -.float restore_group_no; -.float has_item_from_group; -.float remove_item_group; -.float return_item_no; -.entity tent; // player who touches flag (touch ent?) - -// tfplats -.float height; -.entity movetarget; -void () SUB_CalcMoveDone; -void (vector tdest, float tspeed, void() func) SUB_CalcMove; -void (entity ent, vector tdest, float tspeed, void() func) SUB_CalcMoveEnt; - -// tfq3fitems -.string is_converted_goal; // This is used to identify converted goals (helps me determine spawn in q3f maps) -.string groupname; // generally gets set to blueflag or redflag -float q3fdetect; -.vector orig_origin; -.string activetarget; -.string allowteams; -.string give; -void () i_p_t; -void (entity goal) ParseGive; - -// tfgrenades -void () TeamFortress_PrimeGrenade; -void () TeamFortress_ThrowGrenade; -void () NormalGrenadeTouch; -void () NormalGrenadeExplode; -float () crandom; - -// tfsubs -.float dont_do_triggerwork; -void (entity Goal, entity AP) DoGroupWork; -void (entity Goal, entity AP) DoGoalWork; -void () button_wait; -void () SUB_Remove; - -// tfhud -void (entity ownr, float selection) TeamNexuiz_HUD_ShowSign; // show sprite icon - -// tfsentry -.float super_damage_finished; // turrets can get super charged too! -//DP_QC_GETTAGINFO -//idea: VorteX, LordHavoc (somebody else?) -//DarkPlaces implementation: VorteX -//builtin definitions: -float(entity ent, string tagname) gettagindex = #451; -vector(entity ent, float tagindex) gettaginfo = #452; -//description: -//gettagindex returns the number of a tag on an entity, this number is the same as set by setattachment (in the .tag_index field), allowing the qc to save a little cpu time by keeping the number around if it wishes (this could already be done by calling setattachment and saving off the tag_index). -//gettaginfo returns the origin of the tag in worldspace and sets v_forward, v_right, and v_up to the current orientation of the tag in worldspace, this automatically resolves all dependencies (attachments, including viewmodelforclient), this means you could fire a shot from a tag on a gun entity attached to the view for example. - -//tftesla -float modelindex_null = 0; -.float has_turretized_tesla; // is the player's tesla turretized? -float modelindex_eyes = 0; - -// non-tf files -// cl_impulses -.float impulse_wait; // time when player can next use an impulse - -// classes -// engiener -.float is_building; // is the player in the middle of building something -.float has_dispenser; // player has dispenser -.float has_sentry; // player has sentry gun -.float has_tesla; // player has tesla coil -.float has_teleporter; // player has telepad (2 max) -.float has_extractor; // player has metal extractor (3 max) -.entity barrel_ent; // sentry gun's barrel entity -.entity animation_ent; // an object's entity that controls its animations (dirty, but effective) -.float weapons_carried; // used with tesla -void () TeamFortress_FinishedBuilding; -void () lvl1_sentry_stand; -void (float tno, entity ignore, string st) teamsprint; -.entity real_owner; // The building's real owner (the one who built it) -.entity oldenemy; -.float current_weapon; -.float waitmin; -.float waitmax; -.void(entity attacker, float damage) th_pain; // Function the building calls when it gets hurt - // fixme! XavioR - -/******************* End Moved From Section **************/ -/////////////////////////////////////////////////////////// -/*************** Defs that need functions ****************/ -.float lives; // Amount of lives -float toggleflags; -.float is_unabletospy; // picking up tfgoal makes the spy unable to go undercover -.float owned_by; // Item is owned by team # - diff --git a/attic/TeamNexuiz/game/gamec/tfdoors.c b/attic/TeamNexuiz/game/gamec/tfdoors.c deleted file mode 100644 index 8011796b2..000000000 --- a/attic/TeamNexuiz/game/gamec/tfdoors.c +++ /dev/null @@ -1,865 +0,0 @@ -// TF DOORS -void() door_go_down; -void() door_go_up; -float() DoorShouldOpen; - -void() fd_secret_move1; -void() fd_secret_move2; -void() fd_secret_move3; -void() fd_secret_move4; -void() fd_secret_move5; -void() fd_secret_move6; -void() fd_secret_done; - - -float() DoorShouldOpen = -{ - local entity ptr; - local float plyrcount; - local entity plyr1; - local entity plyr2; - if (coop != 2) - { - return TF_FLARE_OFF; - } - plyrcount = TF_FLARE_LIT; - ptr = find(world, classname, "player"); - while (ptr != world) - { - if (!(ptr.tf_items & self.items) && ptr.playerclass != TF_FLARE_LIT && ptr.solid != TF_FLARE_LIT && ptr.model != string_null) - { - plyrcount = plyrcount + TF_FLARE_OFF; - if (plyrcount == TF_FLARE_OFF) - { - plyr1 = ptr; - } - else - { - if (plyrcount == 2) - { - plyr2 = ptr; - } - } - } - ptr = find(ptr, classname, "player"); - } - if (plyrcount != TF_FLARE_LIT) - { - if (plyrcount == TF_FLARE_OFF) - { - bprint(plyr1.netname); - bprint(" needs"); - } - else - { - if (plyrcount == 2) - { - bprint(plyr1.netname); - bprint(" and "); - bprint(plyr2.netname); - bprint(" need"); - } - else - { - bprint("More players need"); - } - } - bprint(" to unlock the "); - if (self.items & 131072) - { - bprint("silver"); - } - else - { - bprint("gold"); - } - bprint(" door\n"); - return TF_FLARE_LIT; - } - bprint("The "); - if (self.items & 131072) - { - bprint("silver"); - } - else - { - bprint("gold"); - } - bprint(" door has been unlocked\n"); - return TF_FLARE_OFF; -}; - -void() door_blocked = -{ - T_Damage(other, self, self, self.dmg); - if (self.wait >= TF_FLARE_LIT) - { - if (self.state == 3) - { - door_go_up(); - } - else - { - door_go_down(); - } - } -}; - -void() door_hit_top = -{ - sound(self, 2, self.noise1, TF_FLARE_OFF, TF_FLARE_OFF); - self.state = TF_FLARE_LIT; - if (self.spawnflags & 32) - { - return; - } - self.think = door_go_down; - self.nextthink = self.ltime + self.wait; -}; - -void() door_hit_bottom = -{ - self.goal_state = 2; - sound(self, 2, self.noise1, TF_FLARE_OFF, TF_FLARE_OFF); - self.state = TF_FLARE_OFF; -}; - -void() door_go_down = -{ - sound(self, 2, self.noise2, TF_FLARE_OFF, TF_FLARE_OFF); - if (self.max_health) - { - self.takedamage = TF_FLARE_OFF; - self.health = self.max_health; - } - self.state = 3; - SUB_CalcMove(self.pos1, self.speed, door_hit_bottom); -}; - -void() door_go_up = -{ - if (self.state == 2) - { - return; - } - if (self.state == TF_FLARE_LIT) - { - self.nextthink = self.ltime + self.wait; - return; - } - sound(self, 2, self.noise2, TF_FLARE_OFF, TF_FLARE_OFF); - self.state = 2; - SUB_CalcMove(self.pos2, self.speed, door_hit_top); - SUB_UseTargets(); -}; - -void() door_fire = -{ - local entity oself; - local entity starte; - if (self.owner != self) - { - objerror("door_fire: self.owner != self"); - } - if (self.items) - { - sound(self, 2, self.noise4, TF_FLARE_OFF, TF_FLARE_OFF); - } - self.message = string_null; - oself = self; - if (self.spawnflags & 32) - { - if (self.state == 2 || self.state == TF_FLARE_LIT) - { - starte = self; - do - { - door_go_down(); - self = self.enemy; - } while (self != starte && self != world); - self = oself; - return; - } - } - starte = self; - do - { - door_go_up(); - self = self.enemy; - } while (self != starte && self != world); - self = oself; -}; - -void() door_use = -{ - local entity oself; - self.message = ""; - self.owner.message = ""; - self.enemy.message = ""; - oself = self; - self = self.owner; - door_fire(); - self = oself; -}; - -void() door_trigger_touch = -{ - local entity te; - if (other.health <= TF_FLARE_LIT) - { - return; - } - if (!Activated(self, other)) - { - if (self.else_goal != TF_FLARE_LIT) - { - te = Findgoal(self.else_goal); - if (te) - { - DoResults(te, other, self.goal_result & 2); - } - } - return; - } - if (time < self.attack_finished) - { - return; - } - self.attack_finished = time + TF_FLARE_OFF; - activator = other; - self = self.owner; - door_use(); -}; - -void() door_killed = -{ - local entity oself; - oself = self; - self = self.owner; - self.health = self.max_health; - self.takedamage = TF_FLARE_LIT; - door_use(); - self = oself; -}; - -void() door_touch = -{ - local entity te; - if (other.classname != "player") - { - return; - } - if (self.owner.attack_finished > time) - { - return; - } - if (!Activated(self, other)) - { - if (self.else_goal != TF_FLARE_LIT) - { - te = Findgoal(self.else_goal); - if (te) - { - DoResults(te, other, self.goal_result & 2); - } - } - return; - } - self.owner.attack_finished = time + 2; - if (self.owner.message != "") - { - CenterPrint(other, self.owner.message); - sound(other, 2, "misc/talk.wav", TF_FLARE_OFF, TF_FLARE_OFF); - } - if (!(self.items)) - { - return; - } - if ((self.items & other.items) != self.items) - { - if (self.owner.items == 131072) - { - if (world.worldtype == 2) - { - CenterPrint(other, "You need the silver keycard"); - sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF); - } - else - { - if (world.worldtype == TF_FLARE_OFF) - { - CenterPrint(other, "You need the silver runekey"); - sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF); - } - else - { - if (world.worldtype == TF_FLARE_LIT) - { - CenterPrint(other, "You need the silver key"); - sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF); - } - } - } - } - else - { - if (world.worldtype == 2) - { - CenterPrint(other, "You need the gold keycard\n"); - sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF); - } - else - { - if (world.worldtype == TF_FLARE_OFF) - { - CenterPrint(other, "You need the gold runekey"); - sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF); - } - else - { - if (world.worldtype == TF_FLARE_LIT) - { - CenterPrint(other, "You need the gold key"); - sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF); - } - } - } - } - return; - } - other.items = other.items - self.items; - other.tf_items = other.tf_items | self.items; - if (DoorShouldOpen()) - { - self.touch = SUB_Null; - if (self.enemy) - { - self.enemy.touch = SUB_Null; - } - door_use(); - } -}; - -entity(vector fmins, vector fmaxs) spawn_field = -{ - local entity trigger; - local vector t1; - local vector t2; - trigger = spawn(); - trigger.movetype = TF_FLARE_LIT; - trigger.solid = TF_FLARE_OFF; - trigger.owner = self; - trigger.touch = door_trigger_touch; - trigger.team_no = self.team_no; - trigger.playerclass = self.playerclass; - trigger.items_allowed = self.items_allowed; - trigger.activate_goal_no = self.activate_goal_no; - trigger.inactivate_goal_no = self.inactivate_goal_no; - trigger.remove_goal_no = self.remove_goal_no; - trigger.restore_goal_no = self.restore_goal_no; - trigger.activate_group_no = self.activate_group_no; - trigger.inactivate_group_no = self.inactivate_group_no; - trigger.remove_group_no = self.remove_group_no; - trigger.restore_group_no = self.restore_group_no; - trigger.goal_activation = self.goal_activation; - trigger.goal_effects = self.goal_effects; - trigger.goal_result = self.goal_result; - trigger.goal_group = self.goal_group; - t1 = fmins; - t2 = fmaxs; - setsize(trigger, t1 - '60 60 8', t2 + '60 60 8'); - return trigger; -}; - -float(entity e1, entity e2) EntitiesTouching = -{ - if (e1.mins_x > e2.maxs_x) - { - return TF_FLARE_LIT; - } - if (e1.mins_y > e2.maxs_y) - { - return TF_FLARE_LIT; - } - if (e1.mins_z > e2.maxs_z) - { - return TF_FLARE_LIT; - } - if (e1.maxs_x < e2.mins_x) - { - return TF_FLARE_LIT; - } - if (e1.maxs_y < e2.mins_y) - { - return TF_FLARE_LIT; - } - if (e1.maxs_z < e2.mins_z) - { - return TF_FLARE_LIT; - } - return TF_FLARE_OFF; -}; - -void() LinkDoors = -{ - local entity t; - local entity starte; - local vector cmins; - local vector cmaxs; - if (self.enemy) - { - return; - } - if (self.spawnflags & 4) - { - self.enemy = self; - self.owner = self; - return; - } - cmins = self.mins; - cmaxs = self.maxs; - starte = self; - t = self; - do - { - self.owner = starte; - if (self.health) - { - starte.health = self.health; - } - if (self.targetname) - { - starte.targetname = self.targetname; - } - if (self.message != "") - { - starte.message = self.message; - } - t = find(t, classname, self.classname); - if (!t) - { - self.enemy = starte; - self = self.owner; - if (self.health) - { - return; - } - if (self.targetname) - { - return; - } - if (self.items) - { - return; - } - self.owner.trigger_field = spawn_field(cmins, cmaxs); - return; - } - if (EntitiesTouching(self, t)) - { - if (t.enemy) - { - objerror("cross connected doors"); - } - self.enemy = t; - self = t; - if (t.mins_x < cmins_x) - { - cmins_x = t.mins_x; - } - if (t.mins_y < cmins_y) - { - cmins_y = t.mins_y; - } - if (t.mins_z < cmins_z) - { - cmins_z = t.mins_z; - } - if (t.maxs_x > cmaxs_x) - { - cmaxs_x = t.maxs_x; - } - if (t.maxs_y > cmaxs_y) - { - cmaxs_y = t.maxs_y; - } - if (t.maxs_z > cmaxs_z) - { - cmaxs_z = t.maxs_z; - } - } - } while (TF_FLARE_OFF); -}; - -void() func_door = -{ - // Q3F/ETF Map Support - if (self.allowteams == "red") - { - self.team_no = 2; - } - if (self.allowteams == "blue") - { - self.team_no = 1; - } - - if(self.noise2) precache_sound (self.noise2); //tz 05 11 10 - - if (CheckExistence() == TF_FLARE_LIT) - { - dremove(self); - return; - } - if (world.worldtype == TF_FLARE_LIT) - { - precache_sound("doors/medtry.wav"); - precache_sound("doors/meduse.wav"); - self.noise3 = "doors/medtry.wav"; - self.noise4 = "doors/meduse.wav"; - } - else - { - if (world.worldtype == TF_FLARE_OFF) - { - precache_sound("doors/runetry.wav"); - precache_sound("doors/runeuse.wav"); - self.noise3 = "doors/runetry.wav"; - self.noise4 = "doors/runeuse.wav"; - } - else - { - if (world.worldtype == 2) - { - precache_sound("doors/basetry.wav"); - precache_sound("doors/baseuse.wav"); - self.noise3 = "doors/basetry.wav"; - self.noise4 = "doors/baseuse.wav"; - } - else - { - dprint("no worldtype set!\n"); - } - } - } - if (self.sounds == TF_FLARE_LIT) - { - precache_sound("misc/null.wav"); - precache_sound("misc/null.wav"); - self.noise1 = "misc/null.wav"; - if (!self.noise2) - self.noise2 = "misc/null.wav"; - } - if (self.sounds == TF_FLARE_OFF) - { - precache_sound("doors/drclos4.wav"); - precache_sound("doors/doormv1.wav"); - self.noise1 = "doors/drclos4.wav"; - if (!self.noise2) - self.noise2 = "doors/doormv1.wav"; - } - if (self.sounds == 2) - { - precache_sound("doors/hydro1.wav"); - precache_sound("doors/hydro2.wav"); - self.noise2 = "doors/hydro1.wav"; - self.noise1 = "doors/hydro2.wav"; - } - if (self.sounds == 3) - { - precache_sound("doors/stndr1.wav"); - precache_sound("doors/stndr2.wav"); - self.noise2 = "doors/stndr1.wav"; - self.noise1 = "doors/stndr2.wav"; - } - if (self.sounds == 4) - { - precache_sound("doors/ddoor1.wav"); - precache_sound("doors/ddoor2.wav"); - self.noise1 = "doors/ddoor2.wav"; - self.noise2 = "doors/ddoor1.wav"; - } - if (self.armorclass == TF_FLARE_OFF) - { - precache_sound("doors/creekdr1.wav"); - precache_sound("doors/creekdr2.wav"); - self.noise2 = "doors/creekdr1.wav"; - self.noise1 = "doors/creekdr2.wav"; - } - if (self.armorclass == 2) - { - precache_sound("doors/metaldr1.wav"); - precache_sound("doors/metaldr2.wav"); - self.noise2 = "doors/metaldr1.wav"; - self.noise1 = "doors/metaldr2.wav"; - } - if (self.armorclass == 3) - { - precache_sound("doors/electdr1.wav"); - precache_sound("doors/electdr2.wav"); - self.noise2 = "doors/electdr1.wav"; - self.noise1 = "doors/electdr2.wav"; - } - if (self.armorclass == 4) - { - precache_sound("doors/track_st.wav"); - precache_sound("doors/track_e.wav"); - self.noise2 = "doors/track_st.wav"; - self.noise1 = "doors/track_e.wav"; - } - SetMovedir(); - self.max_health = self.health; - self.solid = 4; - self.movetype = 7; - setorigin(self, self.origin); - setmodel(self, self.model); - self.classname = "door"; - self.blocked = door_blocked; - self.use = door_use; - if (self.spawnflags & 16) - { - self.items = 131072; - } - if (self.spawnflags & 8) - { - self.items = 262144; - } - if (!(self.speed)) - { - self.speed = 100; - } - if (!(self.wait)) - { - self.wait = 3; - } - if (!(self.lip)) - { - self.lip = 8; - } - if (!(self.dmg)) - { - self.dmg = 2; - } - self.pos1 = self.origin; - self.pos2 = self.pos1 + self.movedir * (fabs(self.movedir * self.size) - self.lip); - if (self.spawnflags & TF_FLARE_OFF) - { - setorigin(self, self.pos2); - self.pos2 = self.pos1; - self.pos1 = self.origin; - } - self.state = TF_FLARE_OFF; - if (self.health) - { - self.takedamage = TF_FLARE_OFF; - self.th_die = door_killed; - } - if (self.items) - { - self.wait = -1; - } - self.touch = door_touch; - self.think = LinkDoors; - self.nextthink = self.ltime + 0.1; -}; - -void() fd_secret_use = -{ - local float temp; - self.health = 10000; - if (self.origin != self.oldorigin) - { - return; - } - if (self.spawnflags & 32) - { - return; - } - self.message = string_null; - SUB_UseTargets(); - if (!(self.spawnflags & 8)) - { - self.th_pain = SUB_Null; - self.takedamage = TF_FLARE_LIT; - } - self.velocity = '0 0 0'; - sound(self, 2, self.noise1, TF_FLARE_OFF, TF_FLARE_OFF); - self.nextthink = self.ltime + 0.1; - temp = TF_FLARE_OFF - (self.spawnflags & 2); - makevectors(self.mangle); - if (!(self.t_width)) - { - if (self.spawnflags & 4) - { - self.t_width = fabs(v_up * self.size); - } - else - { - self.t_width = fabs(v_right * self.size); - } - } - if (!(self.t_length)) - { - self.t_length = fabs(v_forward * self.size); - } - if (self.spawnflags & 4) - { - self.dest1 = self.origin - v_up * self.t_width; - } - else - { - self.dest1 = self.origin + v_right * (self.t_width * temp); - } - self.dest2 = self.dest1 + v_forward * self.t_length; - SUB_CalcMove(self.dest1, self.speed, fd_secret_move1); - sound(self, 2, self.noise2, TF_FLARE_OFF, TF_FLARE_OFF); -}; - -void() fd_secret_move1 = -{ - self.nextthink = self.ltime + TF_FLARE_OFF; - self.think = fd_secret_move2; - sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF); -}; - -void() fd_secret_move2 = -{ - sound(self, 2, self.noise2, TF_FLARE_OFF, TF_FLARE_OFF); - SUB_CalcMove(self.dest2, self.speed, fd_secret_move3); -}; - -void() fd_secret_move3 = -{ - sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF); - if (!(self.spawnflags & TF_FLARE_OFF)) - { - self.nextthink = self.ltime + self.wait; - self.think = fd_secret_move4; - } -}; - -void() fd_secret_move4 = -{ - sound(self, 2, self.noise2, TF_FLARE_OFF, TF_FLARE_OFF); - SUB_CalcMove(self.dest1, self.speed, fd_secret_move5); -}; - -void() fd_secret_move5 = -{ - self.nextthink = self.ltime + TF_FLARE_OFF; - self.think = fd_secret_move6; - sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF); -}; - -void() fd_secret_move6 = -{ - sound(self, 2, self.noise2, TF_FLARE_OFF, TF_FLARE_OFF); - SUB_CalcMove(self.oldorigin, self.speed, fd_secret_done); -}; - -void() fd_secret_done = -{ - if (!(self.targetname) || (self.spawnflags & 16)) - { - self.health = 10000; - self.takedamage = TF_FLARE_OFF; - self.th_pain = fd_secret_use; - self.th_die = fd_secret_use; - } - sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF); -}; - -void() secret_blocked = -{ - if (time < self.attack_finished) - { - return; - } - self.attack_finished = time + 0.5; - T_Damage(other, self, self, self.dmg); -}; - -void() secret_touch = -{ - if (other.classname != "player") - { - return; - } - if (self.attack_finished > time) - { - return; - } - if (self.spawnflags & 32) - { - return; - } - self.attack_finished = time + 2; - if (self.message) - { - CenterPrint(other, self.message); - sound(other, 4, "misc/talk.wav", TF_FLARE_OFF, TF_FLARE_OFF); - } -}; - -void() func_door_secret = -{ - if (CheckExistence() == TF_FLARE_LIT) - { - dremove(self); - return; - } - if (self.sounds == TF_FLARE_LIT) - { - self.sounds = 3; - } - if (self.sounds == TF_FLARE_OFF) - { - precache_sound("doors/latch2.wav"); - precache_sound("doors/winch2.wav"); - precache_sound("doors/drclos4.wav"); - self.noise1 = "doors/latch2.wav"; - self.noise2 = "doors/winch2.wav"; - self.noise3 = "doors/drclos4.wav"; - } - if (self.sounds == 2) - { - precache_sound("doors/airdoor1.wav"); - precache_sound("doors/airdoor2.wav"); - self.noise2 = "doors/airdoor1.wav"; - self.noise1 = "doors/airdoor2.wav"; - self.noise3 = "doors/airdoor2.wav"; - } - if (self.sounds == 3) - { - precache_sound("doors/basesec1.wav"); - precache_sound("doors/basesec2.wav"); - self.noise2 = "doors/basesec1.wav"; - self.noise1 = "doors/basesec2.wav"; - self.noise3 = "doors/basesec2.wav"; - } - if (!(self.dmg)) - { - self.dmg = 2; - } - self.mangle = self.angles; - self.angles = '0 0 0'; - self.solid = 4; - self.movetype = 7; - self.classname = "door"; - setmodel(self, self.model); - setorigin(self, self.origin); - self.touch = secret_touch; - self.blocked = secret_blocked; - self.speed = 50; - self.use = fd_secret_use; - if (!(self.targetname) || (self.spawnflags & 16)) - { - self.health = 10000; - self.takedamage = TF_FLARE_OFF; - self.th_pain = fd_secret_use; - } - self.oldorigin = self.origin; - if (!(self.wait)) - { - self.wait = 5; - } -}; diff --git a/attic/TeamNexuiz/game/gamec/tfextractor.c b/attic/TeamNexuiz/game/gamec/tfextractor.c deleted file mode 100644 index 2eaf32a6f..000000000 --- a/attic/TeamNexuiz/game/gamec/tfextractor.c +++ /dev/null @@ -1,60 +0,0 @@ -// Team:Nexuiz Metal Extractor -// -// Idea by: avirox/Wazat -// Implementation: avirox - -void () Extractor_Idle = -{ - // add some flashy effects/animations here or something - // - self.ammo_metal = self.ammo_metal + 5; - if (self.ammo_metal >= BUILDING_EXTRACTOR_MAXMETAL) - { - self.ammo_metal = BUILDING_EXTRACTOR_MAXMETAL; - if (self.ammo_shells != 1) - { - sprint(self.real_owner, "One of your metal extractors is full!\n"); - self.ammo_shells = 1; - } - } - - if (self.ammo_cells == 0) - self.nextthink = time + 8; - else if (self.ammo_cells == 1) - self.nextthink = time + 6; - else if (self.ammo_cells == 2) - self.nextthink = time + 4; -}; - -void () Extractor_Die = -{ - if (self.real_owner.has_extractor < 2) - sprint (self.real_owner, "Your extractor was destoyed.\n"); - else - sprint (self.real_owner, "One of your extractors was destoyed.\n"); - self.real_owner.has_extractor = self.real_owner.has_extractor - 1; -/* ThrowGib ("progs/tgib1.mdl", -70); // use other explosion method? - ThrowGib ("progs/tgib2.mdl", -70); - ThrowGib ("progs/tgib3.mdl", -70);*/ - WriteByte (2, 23); - WriteByte (2, 3); - WriteCoord (2, self.origin_x); - WriteCoord (2, self.origin_y); - WriteCoord (2, self.origin_z); - BecomeExplosion (); -}; - -void (entity gun) Engineer_UseExtractor = -{ - local entity dist_checker; - - self.current_menu = MENU_EXTRACTOR; - self.menu_count = 25; - self.building = gun; - dist_checker = spawn (); - dist_checker.classname = "timer"; - dist_checker.owner = self; - dist_checker.enemy = gun; - dist_checker.think = CheckDistance; - dist_checker.nextthink = (time + 0.3); -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/tffunctions.c b/attic/TeamNexuiz/game/gamec/tffunctions.c deleted file mode 100644 index c642d46c8..000000000 --- a/attic/TeamNexuiz/game/gamec/tffunctions.c +++ /dev/null @@ -1,2664 +0,0 @@ -// TF fucntions -.float goal_no; // goal number - pair with defs file -.float goal_result; // pair with defs -.float else_goal; // not sure -.float goal_result; -.float is_removed; // entity is removed? -float (entity _p_10934, entity _p_10935) Activated; -float (float tno) TeamFortress_TeamGetScore; -float (float tno) TeamFortress_TeamGetColor; -void (entity _p_10980, entity _p_10981, float _p_10982) DoResults; //< - score increase thing -void (entity Item, entity AP, float method) tfgoalitem_RemoveFromPlayer; -void(entity client, string s) CenterPrint = #73; - -// misc stuff (move to TFDefs file) -entity newmis; // This is what tf uses for spawning entities -.float has_disconnected; //has the player disconnected? -.float no_grenades_1; -.float no_grenades_2; -//.float no_grenades_3; //player has no gren3? Thought we should use this for the impulse 30/31 class specials -.float pausetime; // not sure -float team1lives; -float team2lives; -float team3lives; -float team4lives; -float team1maxplayers; -float team2maxplayers; -float team3maxplayers; -float team4maxplayers; -/*float team1advantage; // might implement this later -- this is used in the function that -float team2advantage; //// displays messages like: "Team blah has an advantage of X players" -float team3advantage; -float team4advantage;*/ - -// stuff that still needs a function -float number_of_teams; // Number of teams == IMPORTANT - -// Color/Teamchange cheat detection (using DP functions instead of tf) -void (entity ent, float colors) setcolor; - -// The following controls the team color of the player in-game, since DP can control color change -// Note: If anyone ever wants to add a spy color disguise fucntion, here's the places -void SV_ChangeTeam(float color) -{ - local float team_color; - - if (self.team_no == 1 && color != 13) - { -// setcolor(self, 13); // used to use this for teams, ignore. - team_color = TeamFortress_TeamGetColor(1) - 1; - } - if (self.team_no == 2 && color != 4) - { -// setcolor(self, 4,4); - team_color = TeamFortress_TeamGetColor(2) - 1; - } - if (self.team_no == 3 && color != 12) - { -// setcolor(self, 12,12); - team_color = TeamFortress_TeamGetColor(3) - 1; - } - if (self.team_no == 4 && color != 11) - { -// setcolor(self, 11,11); - team_color = TeamFortress_TeamGetColor(4) - 1; - } - setcolor(self, 16*team_color + team_color); -}; - - -void(entity targ, entity attacker) ClientObituary = -{ - ClientObituary(targ,attacker); // TEMP -- SOON I WILL ADD REAL DEATH MESSAGES -}; - -void () DoTFAliases = -{ - TeamFortress_Alias("primeone", 150, TF_FLARE_LIT); - TeamFortress_Alias("primetwo", 151, TF_FLARE_LIT); - TeamFortress_Alias("throwgren", 152, TF_FLARE_LIT); - TeamFortress_Alias("+gren1", 150, TF_FLARE_LIT); - TeamFortress_Alias("+gren2", 151, TF_FLARE_LIT); - TeamFortress_Alias("-gren1", 152, TF_FLARE_LIT); - TeamFortress_Alias("-gren2", 152, TF_FLARE_LIT); - TeamFortress_Alias("dropflag", DROP_FLAG_IMPULSE, TF_FLARE_LIT); - TeamFortress_Alias("reload", RELOAD_IMPULSE, TF_FLARE_LIT); -}; - -void (entity tempent) dremove = -{ - if ((tempent == world)) - { - dprint ("***BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG***\n"); - dprint ("WORLD has nearly been removed. Don't worry\n"); - dprint ("***BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG***\n"); - return; - } - if ((tempent.is_removed == 1.000000)) - { - return; - } - tempent.is_removed = 1.000000; - remove (tempent); -}; - -entity (float gno) Findgoal = -{ - local entity tg; - local string st; - - tg = find (world, classname, "info_tfgoal"); - while (tg) - { - if ((tg.goal_no == gno)) - { - return (tg); - } - tg = find (tg, classname, "info_tfgoal"); - } - dprint ("Could not find a goal with a goal_no of "); - st = ftos (gno); - dprint (st); - dprint (".\n"); - //return (tg); -}; - -void(entity Goal, entity AP, entity ActivatingGoal) AttemptToActivate = -{ - local entity te; - if (Activated(Goal, AP)) - { - if (ActivatingGoal == Goal) - { - DoResults(Goal, AP, TF_FLARE_OFF); - } - else - { - if (ActivatingGoal != world) - { - DoResults(Goal, AP, ActivatingGoal.goal_result & 2); - } - else - { - DoResults(Goal, AP, TF_FLARE_LIT); - } - } - } - else - { - if (Goal.else_goal != TF_FLARE_LIT) - { - te = Findgoal(Goal.else_goal); - if (te) - { - AttemptToActivate(te, AP, ActivatingGoal); - } - } - } -}; - -void (entity p) TeamFortress_SetSpeed = -{ - local string sp; - local float tf; - local entity te; - - stuffcmd (p, "cl_movespeedkey 1\n"); - if ((p.tfstate & 65536)) - { - if ((0 == 1)) - { - stuffcmd (p, "m_forward 0\n"); - stuffcmd (p, "m_side 0\n"); - } - p.velocity = '0 0 0'; - stuffcmd (p, "cl_backspeed 0\n"); - stuffcmd (p, "cl_forwardspeed 0\n"); - stuffcmd (p, "cl_sidespeed 0\n"); - return; - } - else - { - if ((0 == 1)) - { - stuffcmd (p, "m_forward 1\n"); - stuffcmd (p, "m_side 0.8\n"); - } - } - if ((p.class == 1)) //scout speed - { - p.maxfbspeed = 450; - p.maxstrafespeed = 450; - } - else - { - if ((p.class == 2.1)) // No sniper in nextf - { - p.maxfbspeed = 300; - p.maxstrafespeed = 300; - } - else - { - if ((p.class == 4)) //soldier speed - { - p.maxfbspeed = 240; - p.maxstrafespeed = 240; - } - else - { - if ((p.class == 4.1)) // No demoman in nextf - { - p.maxfbspeed = 280; - p.maxstrafespeed = 280; - } - else - { - if ((p.class == 16)) // Medic Speed - { - p.maxfbspeed = 320; - p.maxstrafespeed = 320; - } - else - { - if ((p.class == 6.1)) // No HWGuy in nextf - { - p.maxfbspeed = 230; - p.maxstrafespeed = 230; - } - else - { - if ((p.class == 8)) // Pyro Speed - { - p.maxfbspeed = 300; - p.maxstrafespeed = 300; - } - else - { - if ((p.class == 11)) // Wazat -- We need a Civ class - { - p.maxfbspeed = 240; - p.maxstrafespeed = 240; - } - else - { - if ((p.class == 2)) // Spy Speed - { - p.maxfbspeed = 300; - p.maxstrafespeed = 300; - } - else - { - if ((p.class == 32)) // Engineer Speed - { - p.maxfbspeed = 300; - p.maxstrafespeed = 300; - } - else - { - if ((p.class == 0)) // No class - { - p.maxfbspeed = 320; - p.maxstrafespeed = 320; - return; - } - } - } - } - } - } - } - } - } - } - } - tf = 0; - te = find (world, classname, "item_tfgoal"); - while (((te != world) && (tf == 0))) - { - if ((te.owner == p)) - { - if ((te.goal_activation & 2)) - { - tf = 1; - p.maxfbspeed = (p.maxfbspeed / 2); - p.maxstrafespeed = (p.maxstrafespeed / 2); - } - } - te = find (te, classname, "item_tfgoal"); - } - if ((p.tfstate & 32768)) - { - p.maxfbspeed = (p.maxfbspeed / 2); - p.maxstrafespeed = (p.maxstrafespeed / 2); - } -/* if (p.leg_damage) // Railgun does leg damage :D -- check cl_physics.c - { - if ((p.leg_damage > 6)) - { - p.leg_damage = 6; - } - p.maxfbspeed = (p.maxfbspeed * ((10 - p.leg_damage) / 10)); - p.maxstrafespeed = ((p.maxstrafespeed * (10 - p.leg_damage)) / 10); - }*/ - if ((p.tfstate & 2048)) - { - if ((p.maxfbspeed > 80)) - { - p.maxfbspeed = 80; - } - if ((p.maxstrafespeed > 80)) - { - p.maxstrafespeed = 80; - } - } - sp = ftos (p.maxfbspeed); - stuffcmd (p, "cl_backspeed "); - stuffcmd (p, sp); - stuffcmd (p, "\n"); - stuffcmd (p, "cl_forwardspeed "); - stuffcmd (p, sp); - stuffcmd (p, "\n"); - sp = ftos (p.maxstrafespeed); - stuffcmd (p, "cl_sidespeed "); - stuffcmd (p, sp); - stuffcmd (p, "\n"); -}; - -float (entity Retriever, float AmmoType) TeamFortress_GetMaxAmmo = -{ - if ((AmmoType == 256)) - { - return (Retriever.maxammo_shells); - } - else - { - if ((AmmoType == 512)) - { - return (Retriever.maxammo_nails); - } - else - { - if ((AmmoType == 2048)) - { - return (Retriever.maxammo_cells); - } - else - { - if ((AmmoType == 1024)) - { - return (Retriever.maxammo_rockets); - } - else - { - if ((AmmoType == 4)) - { - return (Retriever.maxammo_medikit); - } - else - { - if ((AmmoType == 131072)) - { - return (Retriever.maxammo_detpack); - } - } - } - } - } - } - dprint ("Error in TeamFortress_GetMaxAmmo()\n"); - dprint ("Invalid ammo type passed.\n"); - return (0); -}; - -void () TeamFortress_CheckClassStats = -{ -// Wazat - Implement your armor system here, eh? -/* if ((self.armortype > self.armor_allowed)) - { - self.armortype = self.armor_allowed; - }*/ - if ((self.armorvalue > self.max_armor)) - { - self.armorvalue = self.max_armor; - } - if ((self.armortype < 0)) - { - self.armortype = 0; - } - if ((self.armorvalue < 0)) - { - self.armorvalue = 0; - } - if ((self.ammo_shells > TeamFortress_GetMaxAmmo (self, 256))) - { - self.ammo_shells = TeamFortress_GetMaxAmmo (self, 256); - } - if ((self.ammo_shells < 0)) - { - self.ammo_shells = 0; - } - if ((self.ammo_nails > TeamFortress_GetMaxAmmo (self, 512))) - { - self.ammo_nails = TeamFortress_GetMaxAmmo (self, 512); - } - if ((self.ammo_nails < 0)) - { - self.ammo_nails = 0; - } - if ((self.ammo_rockets > (TeamFortress_GetMaxAmmo (self, 1024) * 3))) - { - self.ammo_rockets = (TeamFortress_GetMaxAmmo (self, 1024) * 3); - } - if ((self.ammo_rockets < 0)) - { - self.ammo_rockets = 0; - } - if ((self.ammo_cells > TeamFortress_GetMaxAmmo (self, 2048))) - { - self.ammo_cells = TeamFortress_GetMaxAmmo (self, 2048); - } - if ((self.ammo_cells < 0)) - { - self.ammo_cells = 0; - } - if ((self.ammo_medikit > TeamFortress_GetMaxAmmo (self, 4))) - { - self.ammo_medikit = TeamFortress_GetMaxAmmo (self, 4); - } - if ((self.ammo_medikit < 0)) - { - self.ammo_medikit = 0; - } - if ((self.ammo_detpack > TeamFortress_GetMaxAmmo (self, 131072))) - { - self.ammo_detpack = TeamFortress_GetMaxAmmo (self, 131072); - } - if ((self.ammo_detpack < 0)) - { - self.ammo_detpack = 0; - } - if ((self.no_grenades_1 < 0)) - { - self.no_grenades_1 = 0; - } - if ((self.no_grenades_2 < 0)) - { - self.no_grenades_2 = 0; - } -// NexTF uses auto-rot, so there's no need for this function. -// if (((self.health > self.max_health) && !(self.items & 65536))) -// { -// TF_T_Damage (self, world, world, (self.max_health - self.health), 0, 256); -// } - if ((self.health < 0)) - { - T_Heal (self, (self.health - self.health), 0); - } - self.items = (self.items - (self.items & ((8192 | 16384) | 32768))); - if ((self.armortype >= 0.8)) - { - self.items = (self.items | 32768); - } - else - { - if ((self.armortype >= 0.6)) - { - self.items = (self.items | 16384); - } - else - { - if ((self.armortype >= 0.3)) - { - self.items = (self.items | 8192); - } - } - } - weapon_action(self.weapon, WR_UPDATECOUNTS); // update ammo now -}; - -// TF Get Score Frags -float (float tno) TeamFortress_TeamGetScoreFrags = -{ - if (((toggleflags & 128) || (toggleflags & 2048))) - { - if ((tno == 1)) - { - return (team1score); - } - if ((tno == 2)) - { - return (team2score); - } - if ((tno == 3)) - { - return (team3score); - } - if ((tno == 4)) - { - return (team4score); - } - } - else - { - if ((tno == 1)) - { - return (team1frags); - } - if ((tno == 2)) - { - return (team2frags); - } - if ((tno == 3)) - { - return (team3frags); - } - if ((tno == 4)) - { - return (team4frags); - } - } - return (0); -}; - -// TF Get Team Winner -float () TeamFortress_TeamGetWinner = -{ - local float i; - local float j; - local float highest; - local float highestteam; - - i = 1; - highest = 0; - highestteam = 0; - while ((i < (number_of_teams + 1))) - { - j = TeamFortress_TeamGetScoreFrags (i); - if ((j > highest)) - { - highest = j; - highestteam = i; - } - i = (i + 1); - } - return (highestteam); -}; - -// TF Score Increaser -void (float tno, float scoretoadd) TeamFortress_TeamIncreaseScore = -{ - local entity e; - - if (((tno == 0) || (scoretoadd == 0))) - { - return; - } - if ((tno == 1)) - { - team1score = (team1score + scoretoadd); - } - if ((tno == 2)) - { - team2score = (team2score + scoretoadd); - } - if ((tno == 3)) - { - team3score = (team3score + scoretoadd); - } - if ((tno == 4)) - { - team4score = (team4score + scoretoadd); - } - if (((toggleflags & 128) || (toggleflags & 2048))) - { - e = find (world, classname, "player"); - while (e) - { - if ((e.team_no == tno)) - { - e.frags = TeamFortress_TeamGetScore (tno); - } - e = find (e, classname, "player"); - } - } -}; - -// Returns Team Color Name (String) -string (float tno) TeamFortress_TeamGetColorString = -{ - local float col; - - col = TeamFortress_TeamGetColor (tno); - if ((col == 1)) - { - return ("White"); - } - if ((col == 2)) - { - return ("Brown"); - } - if ((col == 3)) - { - return ("Blue"); - } - if ((col == 4)) - { - return ("Green"); - } - if ((col == 5)) - { - return ("Red"); - } - if ((col == 6)) - { - return ("Tan"); - } - if ((col == 7)) - { - return ("Pink"); - } - if ((col == 8)) - { - return ("Orange"); - } - if ((col == 9)) - { - return ("Purple"); - } - if ((col == 10)) - { - return ("DarkPurple"); - } - if ((col == 11)) - { - return ("Grey"); - } - if ((col == 12)) - { - return ("DarkGreen"); - } - if ((col == 13)) - { - return ("Yellow"); - } - return ("DarkBlue"); -}; - -// Is civilian? -float (float tno) TeamFortress_TeamIsCivilian = -{ - if ((tno == 1)) - { - if ((civilianteams & 1)) - { - return (1); - } - } - else - { - if ((tno == 2)) - { - if ((civilianteams & 2)) - { - return (1); - } - } - else - { - if ((tno == 3)) - { - if ((civilianteams & 4)) - { - return (1); - } - } - else - { - if ((civilianteams & 8)) - { - return (1); - } - } - } - } - return (0); -}; - -// Change Class -// You use a different method of handling this tho Wazat? -void () TeamFortress_ChangeClass; -/*void () TeamFortress_ChangeClass = -{ - local entity spot; - local entity te; - local float tc; - local string st; - - if ((self.playerclass != 0)) - { - if (((deathmatch != 3) && (cb_prematch_time < time))) - { - return; - } - if (TeamFortress_TeamIsCivilian (self.team_no)) - { - sprint (self, "You cannot change class.\n"); - return; - } - if (!IsLegalClass ((self.impulse - 100))) - { - sprint (self, "Your team cannot play that class.\n"); - TeamFortress_DisplayLegalClasses (); - return; - } - if (((spy_off == 1) && ((self.impulse - 100) == 8))) - { - sprint (self, "The spy class has been disabled on the server by the administrator.\n"); - return; - } - self.nextpc = (self.impulse - 100); - sprint (self, "After dying, you will return as a "); - TeamFortress_PrintClassName (self, self.nextpc, (self.tfstate & 8)); - self.immune_to_check = (time + 10); - return; - } - if ((teamplay && (self.team_no == 0))) - { - if ((toggleflags & 64)) - { - if ((TeamFortress_TeamPutPlayerInTeam () == 0)) - { - return; - } - } - else - { - sprint (self, "You must join a team first. \n"); - sprint (self, "use imin1, imin2, imin3, or imin4\n"); - return; - } - } - if ((self.lives == 0)) - { - sprint (self, "You have no lives left.\n"); - return; - } - if ((!IsLegalClass ((self.impulse - 100)) && (self.impulse != 1))) - { - sprint (self, "You cannot play that playerclass on this map. \n"); - TeamFortress_DisplayLegalClasses (); - return; - } - if (((spy_off == 1) && ((self.impulse - 100) == 8))) - { - sprint (self, "The spy class has been disabled on the server by the administrator.\n"); - return; - } - if ((self.impulse != 1)) - { - self.playerclass = (self.impulse - 100); - } - else - { - self.playerclass = 11; - } - self.nextpc = 0; - self.takedamage = 2; - self.movetype = 3; - self.flags = (8 | 512); - self.waterlevel = 0; - self.air_finished = (time + 12); - self.solid = 3; - self.pausetime = 0; - spot = SelectSpawnPoint (); - self.origin = (spot.origin + '0 0 1'); - self.angles = spot.angles; - self.fixangle = 1; - setmodel (self, string_null); - modelindex_null = self.modelindex; - setmodel (self, "progs/eyes.mdl"); - modelindex_eyes = self.modelindex; - setmodel (self, "progs/player.mdl"); - modelindex_player = self.modelindex; - setsize (self, '-16 -16 -24', '16 16 32'); - self.view_ofs = '0 0 22'; - player_stand1 (); - if ((deathmatch || coop)) - { - makevectors (self.angles); - spawn_tfog ((self.origin + (v_forward * 20))); - } - if ((self.playerclass == 10)) - { - sprint (self, "Random Playerclass.\n"); - self.tfstate = (self.tfstate | 8); - self.playerclass = (1 + floor ((random () * (10 - 1)))); - } - if (((spot.classname == "info_player_teamspawn") && (cb_prematch_time < time))) - { - if ((spot.items != 0)) - { - te = Finditem (spot.items); - if (te) - { - tfgoalitem_GiveToPlayer (te, self, self); - } - if (!(spot.goal_activation & 1)) - { - spot.items = 0; - } - } - if (spot.message) - { - CenterPrint (self, spot.message); - if (!(spot.goal_activation & 2)) - { - spot.message = string_null; - } - } - if ((spot.activate_goal_no != 0)) - { - te = Findgoal (spot.activate_goal_no); - if (te) - { - AttemptToActivate (te, self, spot); - } - } - if ((spot.goal_effects == 1)) - { - spot.classname = "deadpoint"; - spot.team_str_home = string_null; - spot.nextthink = (time + 1); - spot.think = SUB_Remove; - } - } - spot = find (world, classname, "player"); - while (spot) - { - if (((spot.team_no == self.team_no) && (spot != self))) - { - sprint (spot, 2, self.netname); - sprint (spot, 2, " is playing as a "); - TeamFortress_PrintClassName (spot, self.playerclass, (self.tfstate & 8)); - } - spot = find (spot, classname, "player"); - } - TeamFortress_PrintClassName (self, self.playerclass, (self.tfstate & 8)); - TeamFortress_SetEquipment (); - TeamFortress_SetHealth (); - TeamFortress_SetSpeed (self); - TeamFortress_SetSkin (self); - if (cease_fire) - { - sprint (self, "\n\nCEASE FIRE MODE\n"); - self.immune_to_check = (time + 10); - self.tfstate = (self.tfstate | 65536); - TeamFortress_SetSpeed (self); - } -};*/ - -// Show what class each member of the team is -- NEEDS AN IMPULSE CALL FUNCTION -void (entity Player) TeamFortress_TeamShowMemberClasses = -{ - local entity e; - local float found; - - found = 0; - e = find (world, classname, "player"); - while (e) - { - if ((((e.team_no == Player.team_no) || (e.team_no == 0)) && (e != Player))) - { - if ((e.model != string_null)) - { - if (!found) - { - found = 1; - sprint (self, "The other members of your team are:\n"); - } - sprint (Player, e.netname); - sprint (Player, " : "); -// TeamFortress_PrintClassName (Player, e.playerclass, (e.tfstate & 8)); - TeamFortress_PrintClassName (Player, e.class, (e.tfstate & 8)); - } - } - e = find (e, classname, "player"); - } - if (!found) - { - sprint (Player, "There are no other players on your team.\n"); - } -}; - -// Returns class name value -// We use another function for the TN classnames though.. -string (float pc) TeamFortress_GetClassName = -{ - if ((pc == 1)) // Scout is class 1 (normal) - { - return ("Scout"); - } - else - { - if ((pc == 2.1)) - { - return ("Sniper"); // Player Class 2 is Spy in NexTF -- no Snipers - } - else - { - if ((pc == 4)) // Player Class 4 is soldier in NexTF - { - return ("Soldier"); - } - else - { - if ((pc == 4.1)) // No DemoMan in NexTF - { - return ("Demolitions Man"); - } - else - { - if ((pc == 16)) - { - return ("Combat Medic"); // Medic is Class 16 in NexTF - } - else - { - if ((pc == 6.1)) - { - return ("Heavy Weapons Guy"); // No HWGuy in NexTF - } - else - { - if ((pc == 8)) - { - return ("Pyro"); // Pyro is class 8 in NexTF - } - else - { - if ((pc == 2)) - { - return ("Spy"); // Spy is class 2 in NexTF - } - else - { - if ((pc == 32)) - { - return ("Engineer"); // Engineer is class 32 in nextf - } - else - { - if ((pc == 11)) // Wazat- we need to make civ class - { - return ("Civilian"); - } - else - { - if ((pc == 0)) - { - return ("Observer"); - } - else - { - if ((pc == 10)) // Wazat- we need to add "random class" feature - { - return ("Random Playerclass"); - } - } - } - } - } - } - } - } - } - } - } - } -}; - -// Prints the classname using TeamFortress_GetClassName function -void (entity Viewer, float pc, float rpc) TeamFortress_PrintClassName = -{ - local string st; - - st = TeamFortress_GetClassName (pc); - sprint (Viewer, st); - if ((rpc != 0)) - { - sprint (Viewer, " (Random)"); - } - sprint (Viewer, "\n"); -}; - -// Returns Team Color Value -// note: this value is actually incorrect, the actual color values are the ones listed here -// minus one. -float (float tno) TeamFortress_TeamGetColor = -{ - if ((tno == 1)) - { - return (14); - } - if ((tno == 2)) - { - return (5); - } - if ((tno == 3)) - { - return (13); - } - if ((tno == 4)) - { - return (12); - } - return (0); -}; - -// Returns Team Score Value -float (float tno) TeamFortress_TeamGetScore = -{ - if ((tno == 1)) - { - return (team1score); - } - if ((tno == 2)) - { - return (team2score); - } - if ((tno == 3)) - { - return (team3score); - } - if ((tno == 4)) - { - return (team4score); - } - return (0); -}; - -// Get Team Lives -float (float tno) TeamFortress_TeamGetLives = -{ - if ((tno == 1)) - { - return (team1lives); - } - if ((tno == 2)) - { - return (team2lives); - } - if ((tno == 3)) - { - return (team3lives); - } - if ((tno == 4)) - { - return (team4lives); - } - return (0); -}; - -// Show Team Scores -void (float all) TeamFortress_TeamShowScores = -{ - local string st; - local float i; - local float j; - - i = 1; - if ((all == 2)) - { - while ((i <= number_of_teams)) - { - if ((TeamFortress_TeamGetColor (i) > 0)) - { - j = TeamFortress_TeamGetScore (i); - st = TeamFortress_TeamGetColorString (i); -// bprint (st); -// bprint (": "); - bprint (st); - bprint (": "); - st = ftos (j); - //bprint (st); - //bprint (" "); - bprint (st); - bprint (" "); - } - i = (i + 1); - } -// bprint ("\n"); - bprint ("\n"); - return; - } - while ((i <= number_of_teams)) - { - if ((TeamFortress_TeamGetColor (i) > 0)) - { - if (all) - { - bprint ("Team "); - } - else - { - sprint (self, "Team "); - } - st = ftos (i); - if (all) - { - bprint (st); - } - else - { - sprint (self, st); - } - if (all) - { - bprint (" ("); - } - else - { - sprint (self, " ("); - } - st = TeamFortress_TeamGetColorString (i); - if (all) - { - bprint (st); - } - else - { - sprint (self, st); - } - if (all) - { - bprint (") : "); - } - else - { - sprint (self, ") : "); - } - j = TeamFortress_TeamGetScore (i); - st = ftos (j); - if (all) - { - bprint (st); - } - else - { - sprint (self, st); - } - if (all) - { - bprint ("\n"); - } - else - { - sprint (self, "\n"); - } - } - i = (i + 1); - } -}; - -// Get Number Of Players On Team -float (float tno) TeamFortress_TeamGetNoPlayers = -{ - local float size_team; - local entity search; - - search = find (world, classname, "player"); - while ((search != world)) - { - if ((search.team_no == tno)) - { - size_team = (size_team + 1); - } - search = find (search, classname, "player"); - } - return (size_team); -}; - -// Get general number of players -float () TeamFortress_GetNoPlayers = -{ - local float nump; - local entity search; - - search = find (world, classname, "player"); - while ((search != world)) - { - if ((search.netname != string_null)) - { - nump = (nump + 1); - } - search = find (search, classname, "player"); - } - return (nump); -}; - -// Get max players for a team -float (float tno) TeamFortress_TeamGetMaxPlayers = -{ - if ((tno == 1)) - { - return (team1maxplayers); - } - if ((tno == 2)) - { - return (team2maxplayers); - } - if ((tno == 3)) - { - return (team3maxplayers); - } - if ((tno == 4)) - { - return (team4maxplayers); - } - return (0); -}; - -// Set The Team Color -void (float tno) TeamFortress_TeamSetColor = -{ - if ((tno == 1)) - { - team1col = 14; - return; - } - if ((tno == 2)) - { - team2col = 5; - return; - } - if ((tno == 3)) - { - team3col = 13; - return; - } - if ((tno == 4)) - { - team4col = 12; - return; - } -}; - -// Set The Team Number -float (float tno) TeamFortress_TeamSet = -{ - local string st; - local float tc; - - if ((teamplay < 1)) - { - sprint (self, "Teamplay is not On, so FortressTeams are inactive.\n"); - return (0); - } - if (((tno > number_of_teams) && (number_of_teams != 0))) - { - sprint (self, "There can be only "); - st = ftos (number_of_teams); - sprint (self, st); - sprint (self, " teams on this map.\nTry again\n"); - return (0); - } - if ((self.team_no > 0)) - { - sprint (self, "You're already in Team No "); - st = ftos (self.team_no); - sprint (self, st); - sprint (self, ".\n"); - return (0); - } - tc = TeamFortress_TeamGetNoPlayers (tno); - if ((tc >= TeamFortress_TeamGetMaxPlayers (tno))) - { - sprint (self, "That team is full. Pick another.\n"); - return (0); - } - if ((TeamFortress_TeamGetColor (tno) == 0)) - { - TeamFortress_TeamSetColor (tno); - if ((TeamFortress_TeamGetColor (tno) == 0)) - { - sprint (self, "You can't start a new team with your color, since another "); - sprint (self, "already using that color. Change your pants color, then try again.\n"); - return (0); - } - bprint (self.netname); - bprint (" has started Team No "); - st = ftos (tno); - bprint (st); - bprint (".\n"); - self.immune_to_check = (time + 10); - if (((toggleflags & 128) || (toggleflags & 2048))) - { - self.frags = TeamFortress_TeamGetScore (tno); - } - stuffcmd (self, "color "); - tc = (TeamFortress_TeamGetColor (tno) - 1); - st = ftos (tc); - stuffcmd (self, st); - stuffcmd (self, "\n"); - self.team_no = tno; - self.lives = TeamFortress_TeamGetLives (tno); - //if ((self.class == 0)) - if (self.playerclass == 0) - { - if (TeamFortress_TeamIsCivilian (self.team_no)) - { - self.impulse = 1; - TeamFortress_ChangeClass (); - } - } - return (1); - } - bprint (self.netname); - bprint (" has joined Team No "); - st = ftos (tno); - bprint (st); - bprint (".\n"); - stuffcmd (self, "color "); - tc = (TeamFortress_TeamGetColor (tno) - 1); - st = ftos (tc); - stuffcmd (self, st); - stuffcmd (self, "\n"); - self.team_no = tno; - self.immune_to_check = (time + 10); - self.lives = TeamFortress_TeamGetLives (tno); - if (((toggleflags & 128) || (toggleflags & 2048))) - { - self.frags = TeamFortress_TeamGetScore (tno); - } - TeamFortress_TeamShowMemberClasses (self); - //if ((self.playerclass == 0)) - if ((self.class == 0)) - { - if (TeamFortress_TeamIsCivilian (self.team_no)) - { - self.impulse = 1; - TeamFortress_ChangeClass (); - } - } - return (1); -}; - -// Get team score (used in conjunction with autoteam..) -float (float tno) TeamFortress_GetRealScore = -{ - local entity te; - local float total; - - te = find (world, classname, "player"); - while (te) - { - if (te.team_no == tno) - { - total = total + te.real_frags; - } - te = find (te, classname, "player"); - } - return total; -} - -// Find best team for player (autoteam?) -float() TeamFortress_TeamPutPlayerInTeam = -{ - local float i; - local float j; - local float score1; - local float score2; - - local float lowest; - local float likely_team; - - i = 1; - likely_team = random() * number_of_teams; - likely_team = ceil(likely_team); - if (likely_team == 0) - { - likely_team = number_of_teams; - } - - lowest = 33; - while (i < number_of_teams + 1) - { - j = TeamFortress_TeamGetNoPlayers(i); - - if (j < lowest) - { - if (TeamFortress_TeamGetMaxPlayers(i) > j) - { - lowest = j; - likely_team = i; - } - } - // pablo. fancier autoteam for even teams. - else if (j == lowest) - { - - if (TeamFortress_TeamGetMaxPlayers(i) > j) - { - score1 = TeamFortress_GetRealScore(i); - score2 = TeamFortress_GetRealScore(likely_team); - - if ( score1 < score2 ) - { - likely_team = i; - } - else if (score1 == score2) - { - if (random() > 0.5) - { - likely_team = i; - } - } - } - } - // - i = i + 1; - } - return TeamFortress_TeamSet(likely_team); -}; - -// Remove item_tfgoal timers -void() TeamFortress_RemoveTimers = -{ - local entity te; -// self.leg_damage = 0; // No Snipers -// self.is_undercover = 0; // I think this function is called in PlayerKill -// self.is_building = 0; // To Be Added ? -// self.building = world; // To Be Added ? - if (self.tfstate & 2048) - { - self.tfstate = self.tfstate - 2048; - TeamFortress_SetSpeed(self); - self.heat = 0; - } - te = find(world, classname, "timer"); - while (te != world) - { - if (te.owner == self) - { - dremove(te); - te = find(world, classname, "timer"); - } - else - { - te = find(te, classname, "timer"); - } - } - te = find(world, classname, "item_tfgoal"); - while (te) - { - if (te.owner == self) - { - if (!(te.goal_activation & 256)) - { - tfgoalitem_RemoveFromPlayer(te, self, 0); - } - if (CTF_Map == 1 && te.goal_no == 1) - { - bprint(self.netname); - bprint(" ÌÏÓÔ the ÂÌÕÅ flag!\n"); - } - else - { - if (CTF_Map == 1 && te.goal_no == 2) - { - bprint(self.netname); - bprint(" ÌÏÓÔ the ÒÅÄ flag!\n"); - } - } - } - te = find(te, classname, "item_tfgoal"); - } - te = find(world, classname, "detpack"); - while (te) - { - if (te.weaponmode == 1 && te.enemy == self) - { - te.weaponmode = 0; - } - te = find(te, classname, "detpack"); - } -// TeamFortress_DetonatePipebombs(); gold. this is the old code for removing pipebombs on quitting. new one written by pablo is below. - // NO PIPEBOMBS IN NEXTF -/* te = find(world, classname, "pipebomb"); - while (te != world) - { - if(te.owner == self) - { - decrement_team_pipebombs(self.team_no); - deathmsg = te.weapon; - te.weapon = 10; - T_RadiusDamage(te, self, 120, world); - WriteByte(4, 23); - WriteByte(4, 3); - WriteCoord(4, te.origin_x); - WriteCoord(4, te.origin_y); - WriteCoord(4, te.origin_z); - multicast(te.origin, TF_FLARE_OFF); - dremove(te); - } - te = find(te, classname, "pipebomb"); - }*/ -// stuffcmd(self, "v_idlescale 0\n"); -// stuffcmd(self, "v_cshift 0 0 0 0\n"); -// self.item_list = 0; // To Be Added? -// self.FlashTime = 0; - CenterPrint(self, "\n"); - self.menu_count = 25; // Menu Stuff - important - self.current_menu = 1; //// - self.impulse = 0; -}; - -// TF's Become Explosion -void() BecomeExplosion = -{ - dremove(self); -}; - -// TF Alias Maker -void(string halias, float himpulse1, float himpulse2) TeamFortress_Alias = -{ - local string imp; - stuffcmd(self, "alias "); - stuffcmd(self, halias); - stuffcmd(self, " \"impulse "); - imp = ftos(himpulse1); - stuffcmd(self, imp); - if (himpulse2 != 0) - { - stuffcmd(self, ";wait; impulse "); - imp = ftos(himpulse2); - stuffcmd(self, imp); - } - stuffcmd(self, "\"\n"); -}; - -float (float tno) TeamFortress_TeamGetIllegalClasses = -{ - if ((tno == 1)) - { - return (illegalclasses1); - } - if ((tno == 2)) - { - return (illegalclasses2); - } - if ((tno == 3)) - { - return (illegalclasses3); - } - if ((tno == 4)) - { - return (illegalclasses4); - } - return (0); -}; - -// Check if legal class -float (float tno, entity chkr, float NumOnTeam) Check_Class_Scout = -{ - if (tno == 1) - { - if (chkr.team1_scout == -1) - return (0); - if (chkr.team1_scout != 0 && chkr.team1_scout == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 2) - { - if (chkr.team2_scout == -1) - return (0); - if (chkr.team2_scout != 0 && chkr.team2_scout == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 3) - { - if (chkr.team3_scout == -1) - return (0); - if (chkr.team3_scout != 0 && chkr.team3_scout == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 4) - { - if (chkr.team4_scout == -1) - return (0); - if (chkr.team4_scout != 0 && chkr.team4_scout == NumOnTeam) - return (0); - else - return (1); - } -}; - -float (float tno, entity chkr, float NumOnTeam) Check_Class_Soldier = -{ - if (tno == 1) - { - if (chkr.team1_soldier == -1) - return (0); - if (chkr.team1_soldier != 0 && chkr.team1_soldier == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 2) - { - if (chkr.team2_soldier == -1) - return (0); - if (chkr.team2_soldier != 0 && chkr.team2_soldier == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 3) - { - if (chkr.team3_soldier == -1) - return (0); - if (chkr.team3_soldier != 0 && chkr.team3_soldier == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 4) - { - if (chkr.team4_soldier == -1) - return (0); - if (chkr.team4_soldier != 0 && chkr.team4_soldier == NumOnTeam) - return (0); - else - return (1); - } -}; - -float (float tno, entity chkr, float NumOnTeam) Check_Class_Medic = -{ - if (tno == 1) - { - if (chkr.team1_medic == -1) - return (0); - if (chkr.team1_medic != 0 && chkr.team1_medic == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 2) - { - if (chkr.team2_medic == -1) - return (0); - if (chkr.team2_medic != 0 && chkr.team2_medic == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 3) - { - if (chkr.team3_medic == -1) - return (0); - if (chkr.team3_medic != 0 && chkr.team3_medic == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 4) - { - if (chkr.team4_medic == -1) - return (0); - if (chkr.team4_medic != 0 && chkr.team4_medic == NumOnTeam) - return (0); - else - return (1); - } -}; - -float (float tno, entity chkr, float NumOnTeam) Check_Class_Pyro = -{ - if (tno == 1) - { - if (chkr.team1_pyro == -1) - return (0); - if (chkr.team1_pyro != 0 && chkr.team1_pyro == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 2) - { - if (chkr.team2_pyro == -1) - return (0); - if (chkr.team2_pyro != 0 && chkr.team2_pyro == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 3) - { - if (chkr.team3_pyro == -1) - return (0); - if (chkr.team3_pyro != 0 && chkr.team3_pyro == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 4) - { - if (chkr.team4_pyro == -1) - return (0); - if (chkr.team4_pyro != 0 && chkr.team4_pyro == NumOnTeam) - return (0); - else - return (1); - } -}; - -float (float tno, entity chkr, float NumOnTeam) Check_Class_Engineer = -{ - if (tno == 1) - { - if (chkr.team1_engineer == -1) - return (0); - if (chkr.team1_engineer != 0 && chkr.team1_engineer == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 2) - { - if (chkr.team2_engineer == -1) - return (0); - if (chkr.team2_engineer != 0 && chkr.team2_engineer == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 3) - { - if (chkr.team3_engineer == -1) - return (0); - if (chkr.team3_engineer != 0 && chkr.team3_engineer == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 4) - { - if (chkr.team4_engineer == -1) - return (0); - if (chkr.team4_engineer != 0 && chkr.team4_engineer == NumOnTeam) - return (0); - else - return (1); - } -}; - -float (float tno, entity chkr, float NumOnTeam) Check_Class_Spy = -{ - if (tno == 1) - { - if (chkr.team1_spy == -1) - return (0); - if (chkr.team1_spy != 0 && chkr.team1_spy == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 2) - { - if (chkr.team2_spy == -1) - return (0); - if (chkr.team2_spy != 0 && chkr.team2_spy == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 3) - { - if (chkr.team3_spy == -1) - return (0); - if (chkr.team3_spy != 0 && chkr.team3_spy == NumOnTeam) - return (0); - else - return (1); - } - if (tno == 4) - { - if (chkr.team4_spy == -1) - return (0); - if (chkr.team4_spy != 0 && chkr.team4_spy == NumOnTeam) - return (0); - else - return (1); - } -}; - -float (float pc) IsLegalClass = -{ - local float bit; - local float NumOnTeam; - local entity te; - -// Team:Nexuiz class check - local entity findme; - local float yesorno; - - findme = find (world,classname,"class_restrictions"); -// findme = find (world, classname, "info_tfdetect"); - if (findme) - { - // first, find the number of players of that class on a team - te = find (world, classname, "player"); - while (te) - { - if (te.playerclass == pc) - { - if (te.team_no == self.team_no) - { - NumOnTeam = NumOnTeam + 1; - } - } - te = find (te, classname, "player"); - } - - // next we check to see if the team is allowed to have that player class and the amount per team allowed for that class - if (pc == TF_CLASS_SCOUT) - yesorno = Check_Class_Scout(self.team_no, findme, NumOnTeam); - else if (pc == TF_CLASS_SOLDIER) - yesorno = Check_Class_Soldier(self.team_no, findme, NumOnTeam); - else if (pc == TF_CLASS_MEDIC) - yesorno = Check_Class_Medic(self.team_no, findme, NumOnTeam); - else if (pc == TF_CLASS_PYRO) - yesorno = Check_Class_Pyro(self.team_no, findme, NumOnTeam); - else if (pc == TF_CLASS_ENGINEER) - yesorno = Check_Class_Engineer(self.team_no, findme, NumOnTeam); - else if (pc == TF_CLASS_SPY) - yesorno = Check_Class_Spy(self.team_no, findme, NumOnTeam); - - return (yesorno); - } - -/* if (((spy_off == 1) && (pc == 8))) - { - return (0); - }*/ - if ((pc == 1)) - { - bit = 1; - } - else - { - if ((pc == 2)) - { - bit = 2; - } - else - { - if ((pc == 3)) - { - bit = 4; - } - else - { - if ((pc == 4)) - { - bit = 8; - } - else - { - if ((pc == 5)) - { - bit = 16; - } - else - { - if ((pc == 6)) - { - bit = 32; - } - else - { - if ((pc == 7)) - { - bit = 64; - } - else - { - if ((pc == 8)) - { - bit = 256; - } - else - { - if ((pc == 9)) - { - bit = 512; - } - else - { - if ((pc == 10)) - { - bit = 128; - } - } - } - } - } - } - } - } - } - } - if (((illegalclasses & bit) || (TeamFortress_TeamGetIllegalClasses (self.team_no) & bit))) - { - return (0); - } - return (1); -}; - -// Display legal classes for map -void () TeamFortress_DisplayLegalClasses = -{ - local float gotone; - local float ill; - - sprint (self, "Legal Classes for your team are:\n"); - gotone = 0; - ill = TeamFortress_TeamGetIllegalClasses (self.team_no); - if ((!(illegalclasses & 1) && !(ill & 1))) - { - if (gotone) - { - sprint (self, ", "); - } - gotone = 1; - sprint (self, "Scout"); - } -/* if ((!(illegalclasses & 2) && !(ill & 2))) - { - if (gotone) - { - sprint (self, ", "); - } - gotone = 1; - sprint (self, "Sniper"); - }*/ - if ((!(illegalclasses & 4) && !(ill & 4))) - { - if (gotone) - { - sprint (self, ", "); - } - gotone = 1; - sprint (self, "Soldier"); - } - if ((!(illegalclasses & 8) && !(ill & 8))) - { - if (gotone) - { - sprint (self, ", "); - } - gotone = 1; - sprint (self, "Demolitions Man"); - } - if ((!(illegalclasses & 16) && !(ill & 16))) - { - if (gotone) - { - sprint (self, ", "); - } - gotone = 1; - sprint (self, "Combat Medic"); - } - if ((!(illegalclasses & 32) && !(ill & 32))) - { - if (gotone) - { - sprint (self, ", "); - } - gotone = 1; - sprint (self, "Heavy Weapons Guy"); - } - if ((!(illegalclasses & 64) && !(ill & 64))) - { - if (gotone) - { - sprint (self, ", "); - } - gotone = 1; - sprint (self, "Pyro"); - } - if ((!(illegalclasses & 256) && !(ill & 256))) - { - if (gotone) - { - sprint (self, ", "); - } - gotone = 1; - sprint (self, "Spy"); - } - if ((!(illegalclasses & 512) && !(ill & 512))) - { - if (gotone) - { - sprint (self, ", "); - } - gotone = 1; - sprint (self, "Engineer"); - } - if ((!(illegalclasses & 128) && !(ill & 128))) - { - if (gotone) - { - sprint (self, ", "); - } - gotone = 1; - sprint (self, "RandomPC"); - } - sprint (self, "\n"); -}; - -// TF class change/select function -void() TeamFortress_ChangeClass = -{ -// local float tc; -// local string st; - - self.impulse += 100; //temp - - if (self.playerclass != 0) - { -// if (deathmatch != 3) -// { -// return; -// } - if (TeamFortress_TeamIsCivilian(self.team_no)) - { - sprint(self, "You cannot change class.\n"); - return; - } - if (!IsLegalClass(self.impulse - 100)) - { - sprint(self, "Your team cannot play that class.\n"); - TeamFortress_DisplayLegalClasses(); - return; - } -/* tc = IsRestrictedClass(self.impulse - 100); // TBA ADD THIS FUNCTION - if (tc != 0) // it's actually a megatf function - { // -- gonna need cvars for it - if (tc > 0) - { - sprint(self, "That class is restricted to "); - st = ftos(tc); - sprint(self, st); - sprint(self, " per team.\n"); - } - else - { - sprint(self, "That class is disabled.\n"); - } - return; - }*/ - self.nextpc = self.impulse - 100; - sprint(self, "After dying, you will return as a "); - TeamFortress_PrintClassName(self, self.nextpc, self.tfstate & 8); - self.immune_to_check = time + 10; - return; - } -/*if (teamplay && self.team_no == 0) //handled in cmd function - { - if (toggleflags & 64) - { - if (TeamFortress_TeamPutPlayerInTeam() == 0) - { - return; - } - } - else - { - sprint(self, "You must join a team first. \n"); - sprint(self, "use imin1, imin2, imin3, or imin4\n"); - return; - } - }*/ - if (self.lives == 0) - { - sprint(self, "You have no lives left.\n"); - return; - } - if (!IsLegalClass(self.impulse - 100) && self.impulse != 1) - { - sprint(self, "You cannot play that playerclass on this map. \n"); - TeamFortress_DisplayLegalClasses(); - return; - } - -/* tc = IsRestrictedClass(self.impulse - 100); // TBA - if (tc != 0) - { - if (tc > 0) - { - sprint(self, "That class is restricted to "); - st = ftos(tc); - sprint(self, st); - sprint(self, " per team.\n"); - } - else - { - sprint(self, "That class is disabled.\n"); - } - return; - }*/ - if (self.impulse != 1 && !TeamFortress_TeamIsCivilian(self.team_no)) - { - self.playerclass = self.impulse - 100; - } - else - { - self.playerclass = TF_CLASS_CIVILIAN; - } - if (self.playerclass == TF_CLASS_RANDOM) - { - sprint(self, "Random Playerclass.\n"); - self.tfstate = self.tfstate | 8; -/* tc = 1 + floor(random() * (10 - 1)); - while (IsRestrictedClass(tc) != 0) - { - tc = 1 + floor(random() * (10 - 1)); - }*/ -// self.playerclass = tc; - self.playerclass = 10; - ChooseRandomClass(); - } - //ftos(TeamFortress_TeamGetIllegalClasses (self.team_no) & bit) - - PutClientInServer (); //temp -}; - -// XavioR's new TF reload function -void (float o, float m, void () g) weapon_thinkf; -void () Reload_Restore_Weapon = -{ - if (self.owner.weaponentity.pos1 != '0 0 0') - { - self.owner.weaponentity.pos1 = '0 0 0'; - self.owner.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED; - } -}; - -void (float rweapon, float amount) DoReload = -{ - local float rtime; - - if (self.reload_time > time) - return; - if (amount == 0) - return; - - weapon_action(self.weapon, WR_UPDATECOUNTS); // update ammo now - if (rweapon != 5) - sprint(self, "Reloading...\n"); - - if (rweapon == 1) // Pistol - { - rtime = (amount * .35); - self.clip_pistol = CLIP_MAX_PISTOL; - } - if (rweapon == 2) // CryLink (flak cannon) - { - rtime = (amount * .80); - self.clip_crylink = CLIP_MAX_CRYLINK; - } - if (rweapon == 3) // Rocket launcher - { - rtime = (amount * 1.30); - self.clip_rockets = 4; - } - if (rweapon == 4) // Pipe Grenade Launcher - { - rtime = (amount * 1.05); - self.clip_pipegrenades = 6; - } - if (rweapon == 5) // Building something... (senrtry gun, tesla, etc.) - { - rtime = amount; - } - - self.weaponentity.pos1 = PLAYER_WEAPONSELECTION_RANGE; - self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED; - newmis = spawn(); - newmis.owner = self; - newmis.think = Reload_Restore_Weapon; - newmis.nextthink = time + rtime; - - self.reload_time = time + rtime; -}; - -// Xavior's self.playerclass to self.class conversion -string(string s1, ...) strcat; -void () Do_TFClass_Conversion = -{ - local float cl; - local string cst; - - if (self.respawn_as_new_class > 0) - { - self.playerclass = self.respawn_as_new_class; - self.respawn_as_new_class = 0; - return; - } - - if (self.playerclass == TF_CLASS_CIVILIAN) { - self.class = CLASS_CIVILIAN; - cst = "civilian"; } - if (self.playerclass == TF_CLASS_SCOUT) { - self.class = CLASS_SCOUT; - cst = "scout"; } - if (self.playerclass == TF_CLASS_SOLDIER) { - self.class = CLASS_SOLDIER; - cst = "soldier"; } - if (self.playerclass == TF_CLASS_MEDIC) { - self.class = CLASS_MEDIC; - cst = "medic"; } - if (self.playerclass == TF_CLASS_PYRO) { - self.class = CLASS_PYRO; - cst = "pyro"; } - if (self.playerclass == TF_CLASS_SPY) { - self.class = CLASS_SPY; - cst = "spy"; } - if (self.playerclass == TF_CLASS_ENGINEER) { - self.class = CLASS_ENGINEER; - cst = "engineer"; } - if (self.playerclass == TF_CLASS_RANDOM || self.tfstate == self.tfstate | 8) { - cst = ChooseRandomClass(); } - // Note to self: add Random and Civilian - - cl = GetPlayerClass(); - - if (!self.class == cl) - { - if (cst == "civilian") - { - self.playermodel = strcat("models/class/",cst,".zym"); - } - else if (cst == "engineer") - { - self.playermodel = strcat("models/class/",cst,"_other.zym"); - } - else - { - self.playermodel = strcat("models/class/",cst,"_mechanical.zym"); - } - } - SetPlayerSpeed(self); -}; - -// XavioR's Random Class select -string () ChooseRandomClass = -{ - local float choose; - local float good; - - while (good < 1) - { - choose = (1 + floor ((random () * (10 - 1)))); - if (IsLegalClass(choose) && choose != TF_CLASS_SNIPER && choose != TF_CLASS_DEMOMAN && choose != TF_CLASS_HWGUY) - { - good = 1; -// sprint (self, ftos(choose)); -// sprint (self, "\n"); - if (choose == TF_CLASS_SCOUT) { - self.class = CLASS_SCOUT; - return ("scout"); } - if (choose == TF_CLASS_SOLDIER) { - self.class = CLASS_SOLDIER; - return ("soldier"); } - if (choose == TF_CLASS_PYRO) { - self.class = CLASS_PYRO; - return ("pyro"); } - if (choose == TF_CLASS_ENGINEER) { - self.class = CLASS_ENGINEER; - return ("engineer"); } - if (choose == TF_CLASS_MEDIC) { - self.class = CLASS_MEDIC; - return ("medic"); } - if (choose == TF_CLASS_SPY) { - self.class = CLASS_SPY; - return ("spy"); } - } - } -}; - -// Nail projectile and blood -float current_yaw; -float (float fl) anglemod = -{ - while (fl >= 360) - { - fl = fl - 360; - } - while (fl < 0) - { - fl = fl + 360; - } - return (fl); -}; - -vector () wall_velocity = -{ - local vector vel; - - vel = normalize (self.velocity); - vel = normalize (((vel + (v_up * (random () - 0.5))) + (v_right * (random () - 0.5)))); - vel = (vel + (2 * trace_plane_normal)); - vel = (vel * 200); - return (vel); -}; - -void (vector org, float damage) SpawnBlood = -{ - particle (org, '0 0 0', 73, (damage * 2)); -}; - -void (float damage) spawn_touchblood = -{ - local vector vel; - - vel = (wall_velocity () * 0.2); - SpawnBlood ((self.origin + (vel * 0.01)), damage); -}; - -void () superspike_touch = -{ - local float ndmg; - -/* if (self.voided) // temp? - { - return; - } - self.voided = 1;*/ - if (other == self.owner) - { - return; - } - if (other.solid == 1) - { - return; - } - if (pointcontents (self.origin) == -6) - { - dremove (self); - return; - } - if (other.takedamage) - { - spawn_touchblood (18); - deathmsg = self.weapon; - if ((deathmsg == 9)) - { - ndmg = 13; - } - else - { - ndmg = 26; - } - if (self.owner.classname == "grenade") - { - TF_T_Damage (other, self, self.owner.owner, ndmg, 2, 2); - } - else - { - TF_T_Damage (other, self, self.owner, ndmg, 2, 2); - } - } - else - { - WriteByte (0, 23); - WriteByte (0, 1); - WriteCoord (0, self.origin_x); - WriteCoord (0, self.origin_y); - WriteCoord (0, self.origin_z); - } - dremove (self); -}; - -void () spike_touch = -{ - if (other.solid == 1) - { - return; - } - if (pointcontents (self.origin) == -6) - { - dremove (self); - return; - } - if (other.takedamage) - { - spawn_touchblood (9); - deathmsg = self.weapon; - if (self.owner.classname == "grenade") - { - TF_T_Damage (other, self, self.owner.owner, 9, 2, 2); - } - else - { - TF_T_Damage (other, self, self.owner, 9, 2, 2); - } - } - else - { - WriteByte (4, 23); - if ((self.classname == "wizspike")) - { - WriteByte (4, 7); - } - else - { - if ((self.classname == "knightspike")) - { - WriteByte (4, 8); - } - else - { - WriteByte (4, 0); - } - } - WriteCoord (4, self.origin_x); - WriteCoord (4, self.origin_y); - WriteCoord (4, self.origin_z); - } - dremove (self); -}; - -void(vector org) te_gunshot; -float EF_ADDITIVE/* = 32*/; -void () ChangeModelTime = -{ - if (self.owner) - setmodel (self.owner, self.classname); - dremove(self); -}; - -void (entity ent, string st, float wait_time) soonmodel = -{ - local entity x; - x = spawn (); - x.classname = st; - x.owner = ent; - x.nextthink = time + wait_time; - x.think = ChangeModelTime; -}; - -.float scale; - -void (vector vect_a, vector vect_b) launch_spike = -{ - local entity e; // bullet trail - - newmis = spawn (); - newmis.owner = self; - newmis.movetype = 9; - newmis.solid = 2; - newmis.angles = vectoangles (vect_b); - newmis.touch = spike_touch; - newmis.weapon = 3; - newmis.classname = "spike"; - newmis.think = SUB_Remove; - newmis.nextthink = (time + 3); - if (deathmsg != 9) - { - setmodel (newmis, "models/plasmatrail.mdl"); - } - setsize (newmis, '0 0 0', '0 0 0'); - setorigin (newmis, vect_a); - newmis.velocity = (vect_b * 2000); - - e = spawn(); - e.owner = self; - e.movetype = MOVETYPE_FLY; - e.solid = SOLID_NOT; - e.think = SUB_Remove; - e.nextthink = time + vlen(trace_endpos - self.origin) / 6000; - e.velocity = vect_b * 4000; - e.angles = vectoangles (vect_b); - e.scale = .3; -// soonmodel (e, "models/tracer.mdl", .1); - setmodel (e, "models/tracer.mdl"); - setsize (e, '0 0 0', '0 0 0'); - setorigin (e, vect_a); - e.effects = e.effects | EF_ADDITIVE; -}; - -// TF's Ammo-Updater -void () W_SetCurrentAmmo = -{ - weapon_action(self.weapon, WR_UPDATECOUNTS); -}; - -// TF Team Sprint -void (float tno, entity ignore, string st) teamsprint = -{ - local entity te; - - if ((tno == 0)) - { - return; - } - te = find (world, classname, "player"); - while (te) - { - if (((te.team_no == tno) && (te != ignore))) - { - sprint (te, st); - } - te = find (te, classname, "player"); - } -}; - -// CENTERPRINT -void (entity pl, string s1, string s2) CenterPrint2 = -{ - centerprint (pl, s1, s2); - pl.StatusRefreshTime = (time + 1.5); -}; - -// another ammo check caleld by the menu system. I dont know exactly what function this is for. - XavioR -void(entity p) bound_other_ammo = -{ - if (p.ammo_shells > TeamFortress_GetMaxAmmo(p, 256)) - { - p.ammo_shells = TeamFortress_GetMaxAmmo(p, 256); - } - if (p.ammo_nails > TeamFortress_GetMaxAmmo(p, 512)) - { - p.ammo_nails = TeamFortress_GetMaxAmmo(p, 512); - } - if (p.ammo_rockets > TeamFortress_GetMaxAmmo(p, 1024)) - { - p.ammo_rockets = TeamFortress_GetMaxAmmo(p, 1024); - } - if (p.ammo_cells > TeamFortress_GetMaxAmmo(p, 2048)) - { - p.ammo_cells = TeamFortress_GetMaxAmmo(p, 2048); - } -/* if (p.ammo_medikit > p.maxammo_medikit) // addme - { - p.ammo_medikit = p.maxammo_medikit; - }*/ - if (p.armorvalue > p.maxarmor) - { - p.armorvalue = p.max_armor; - } - if (p.no_grenades_1 > 4) - { - p.no_grenades_1 = 4; - } - if (p.no_grenades_2 > 4) - { - p.no_grenades_2 = 4; - } -}; - -// TF Drop Flag Function -void () tfgoalitem_dropthink; -void () item_tfgoal_touch; -void () DropFlag = -{ - local entity Item; - local entity te; - local float f; - local string st; - - te = find (world, classname, "item_tfgoal"); - while (te) - { - if (te.owner == self) - { - Item = te; - } - te = find (te, classname, "item_tfgoal"); - } - - if (Item == world) - { - sprint (self, "You don't have the flag.\n"); - return; - } - - // Delay - if (self.DropFlagDelay > time) - { - sprint (self, "Can't drop again for another "); - f = ceil(self.DropFlagDelay - time); - st = ftos(f); - sprint (self, st); - sprint (self, " seconds.\n"); - return; - } - self.DropFlagDelay = time + 10; - // - - // Flash of particles - WriteByte(4, 23); - WriteByte(4, 11); - WriteCoord(4, self.origin_x); - WriteCoord(4, self.origin_y); - WriteCoord(4, self.origin_z); - - tfgoalitem_RemoveFromPlayer(Item, self, 2); - - setorigin (Item, self.origin - '0 0 -24'); // - vf*(16));// - '0 0 15'); //Item.origin = self.origin + v_forward*56 + '0 0 8'; - Item.velocity = '0 0 1'; //((vf * 150) + '0 0 150'; - //gold. i didn't even have to change the origin, just the velocity. used to be '0 0 150' - Item.goal_state = 2; - Item.movetype = 6; - Item.solid = TF_FLARE_OFF; - setsize(Item, '-16 -16 0', '16 16 56'); - if (Item.mdl != string_null) - { - setmodel(Item, Item.mdl); - } - Item.option5 = time + 2; - Item.tent = self; - - Item.nextthink = time + 5; - Item.think = tfgoalitem_dropthink; - Item.touch = item_tfgoal_touch; -} - -void () TeamNexuiz_GunDown = //brings first-person gun model down -{ - self.weaponentity.pos1 = PLAYER_WEAPONSELECTION_RANGE; - self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED; -}; -void () TeamNexuiz_GunUp = //brings first-person gun model up -{ - if (self.weaponentity.pos1 != '0 0 0') - { - self.weaponentity.pos1 = '0 0 0'; - self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED; - } -}; - -void centerprint_multi_9 (entity print_to, string str1, string str2, string str3, string str4, string str5, string str6, string str7, string str8, string str9) -{ - local string tmsg; - - tmsg = strcat(str1, str2); - tmsg = strcat(tmsg, str3); - tmsg = strcat(tmsg, str4); - tmsg = strcat(tmsg, str5); - tmsg = strcat(tmsg, str6); - tmsg = strcat(tmsg, str7); - tmsg = strcat(tmsg, str8); - tmsg = strcat(tmsg, str9); - CenterPrint(print_to, tmsg); -}; - diff --git a/attic/TeamNexuiz/game/gamec/tfgrenades.c b/attic/TeamNexuiz/game/gamec/tfgrenades.c deleted file mode 100644 index 8b98ef01d..000000000 --- a/attic/TeamNexuiz/game/gamec/tfgrenades.c +++ /dev/null @@ -1,959 +0,0 @@ -entity msg_entity; -void () TeamFortress_GrenadePrimed; -.float grenade_timer; -.float FlashTime; -void () CP_Timer; - -/*======================= - General grenade explode - ======================*/ -void () GrenadeExplode = -{ -/* if (self.voided) - { - return; - } - self.voided = 1; - if ((self.classname == "pipebomb")) - { - num_world_pipebombs = (num_world_pipebombs - 1); - decrement_team_pipebombs (self.team_no); - if (!(self.flags & 512)) - { - self.weapon = 40; - } - }*/ - if ((self.owner.has_disconnected != 1)) - { - deathmsg = self.weapon; - T_RadiusDamage (self, self.owner, 120, world); - } -/* local entity te; - if ((self.no_active_nail_grens != 0)) - { - self.no_active_nail_grens = 0; - self.owner.no_active_nail_grens = (self.owner.no_active_nail_grens - 1); - te = find (world, classname, "grenade"); - while (te) - { - if (((te.owner == self.owner) && (te.no_active_nail_grens != 0))) - { - te.no_active_nail_grens = (te.no_active_nail_grens - 1); - } - te = find (te, classname, "grenade"); - } - }*/ - WriteByte (0, 23); - WriteByte (0, 3); - WriteCoord (0, self.origin_x); - WriteCoord (0, self.origin_y); - WriteCoord (0, self.origin_z); - BecomeExplosion (); -}; - -// TF Recoil? Anyhoo, this entity causes oddities :/ -void(float psize, entity p) KickPlayer = -{ - return; // temp - msg_entity = p; - if (psize > -3) - { - WriteByte(1, 34); - } - else - { - WriteByte(1, 35); - } -}; - -/* ================ - Flash grenade - ===============*/ -void () FlashGrenadeTouch = -{ - sound (self, 1, "weapons/bounce.wav", 1, 1); - if ((self.velocity == '0 0 0')) - { - self.avelocity = '0 0 0'; - } -}; - -void () FlashTimer = -{ - local entity te; - local string st; - - te = self.owner; - te.FlashTime = (te.FlashTime - 0.100000); - if ((te.FlashTime <= 0.000000)) - { - te.FlashTime = 0.000000; - stuffcmd (te, "v_cshift 0\n"); - if (te.uses_bloom) - { - stuffcmd (te, "r_bloom_power 2\n"); - stuffcmd (te, "r_bloom_intensity 1.5\n"); - } - remove (self); - return; - } - if ((te.FlashTime < 1.700000)) - { - st = ftos ((te.FlashTime * 150.000000)); - stuffcmd (te, "v_cshift "); - stuffcmd (te, st); - stuffcmd (te, " "); - stuffcmd (te, st); - stuffcmd (te, " "); - stuffcmd (te, st); - stuffcmd (te, " "); - stuffcmd (te, st); - stuffcmd (te, "\n"); - - // BLOOM!!! :D - if (te.uses_bloom) - { - stuffcmd (te, "r_bloom_power 1\n"); - st = ftos(2 + (te.FlashTime * 10)); - stuffcmd (te, "r_bloom_intensity "); - stuffcmd (te, st); - stuffcmd (te, "\n"); - } - - } - if ((te.FlashTime >= 1.700000)) - { - stuffcmd (te, "v_cshift 255 255 255 255\n"); - } - if ((te.FlashTime <= 0.000000)) - { - te.FlashTime = 0.000000; - stuffcmd (te, "v_cshift 0\n"); - stuffcmd (te, "r_bloom_power 2\n"); - stuffcmd (te, "r_bloom_intensity 1.5\n"); - remove (self); - return; - } - self.nextthink = (time + 0.100000); -}; - -void () FlashGrenadeExplode = -{ - local entity te; - - self.effects = (self.effects | 4); - WriteByte (0, 23); - WriteByte (0, 4); - WriteCoord (0, self.origin_x); - WriteCoord (0, self.origin_y); - WriteCoord (0, self.origin_z); - te = findradius (self.origin, 300); - while (te) - { - if ((te.classname == "player" && te.team_no != self.owner.team_no || te == self.owner)) - { - traceline (self.origin, te.origin, 1, self); - if ((trace_fraction == 1)) - { - if ((vlen ((self.origin - te.origin)) <= 200)) - { - deathmsg = 35; - TF_T_Damage (te, self, self.owner, 60, 2, (16 | 4)); - } - if (te.health > TF_FLARE_LIT) - { - if (te.FlashTime == TF_FLARE_LIT) - { - newmis = spawn (); - newmis.classname = "timer"; - newmis.netname = "flashtimer"; - newmis.team_no = self.owner.team_no; - newmis.owner = te; - newmis.think = FlashTimer; - newmis.nextthink = (time + 0.100000); - stuffcmd(te, "cmd check_val r_bloom $r_bloom\n"); // checks if the client has bloom enabled - } - te.FlashTime = 4.500000; - stuffcmd (te, "v_cshift 255 255 255 255\n"); - } - } - } - te = te.chain; - } - BecomeExplosion (); -}; - -/*============= - Nail Grenade - ============*/ -void() NailGrenadeTouch; -void() NailGrenadeExplode; -void() NailGrenadeNailEm; -void() NailGrenadeLaunchNail; -void() GrenadeExplode; - -void() NailGrenadeTouch = -{ - if (other == self.owner) - { - return; - } - sound(self, TF_FLARE_OFF, "weapons/bounce.wav", TF_FLARE_OFF, TF_FLARE_OFF); - if (self.velocity == '0 0 0') - { - self.avelocity = '0 0 0'; - } -}; - -void() NailGrenadeExplode = -{ - self.movetype = 5; - setorigin(self, self.origin + '0 0 32'); - self.avelocity = '0 500 0'; - self.nextthink = time + 0.7; - self.think = NailGrenadeNailEm; -}; - -void() NailGrenadeNailEm = -{ - self.velocity = '0 0 0'; - self.nextthink = time + 0.1; - self.think = NailGrenadeLaunchNail; - self.playerclass = TF_FLARE_LIT; -}; - -void() NailGrenadeLaunchNail = -{ - local float i; - local float j; - i = TF_FLARE_LIT; - while (i < TF_FLARE_OFF) - { - j = (random() + 2) * 5; - current_yaw = anglemod(self.angles_y + j); - self.angles_y = current_yaw; - self.angles_x = TF_FLARE_LIT; - self.angles_z = TF_FLARE_LIT; - makevectors(self.angles); - deathmsg = 99; //temp - launch_spike(self.origin, v_forward); - newmis.touch = superspike_touch; - newmis.weapon = 9; - i = i + TF_FLARE_OFF; - } - self.playerclass = self.playerclass + TF_FLARE_OFF; - self.nextthink = time + 0.1; - if (self.playerclass > 40) - { - self.weapon = 9; - self.think = GrenadeExplode; - } -}; - -/*===================== - TF Gren Prime Code - ===================*/ - -void() TeamFortress_ExplodePerson = -{ -// local entity te; - self.owner.tfstate = self.owner.tfstate - (self.owner.tfstate & 1); - KickPlayer(-2, self.owner); // Doesnt wanna work right - newmis = spawn(); - newmis.movetype = 10; - newmis.solid = 2; - newmis.classname = "grenade"; - newmis.team_no = self.owner.team_no; - newmis.owner = self.owner; - newmis.velocity = '0 0 0'; - newmis.angles = vectoangles(newmis.velocity); - newmis.think = SUB_Null; -// newmis.think = NormalGrenadeExplode; - newmis.nextthink = time + 0.1; - if (self.weapon == 1) - { - newmis.touch = NormalGrenadeTouch; - newmis.think = NormalGrenadeExplode; - newmis.skin = 0; - newmis.avelocity = '300 300 300'; - self.owner.velocity = (((v_forward * 900) + '0 0 250') + (v_up * 100)); // Shoot the player hehe -// setmodel(newmis, "progs/hgren2.mdl"); - setmodel(newmis, "models/grenades/fragnade.md3"); - - } - else -/* { - if (self.weapon == 2) - { - newmis.touch = ConcussionGrenadeTouch; - newmis.think = ConcussionGrenadeExplode; - newmis.skin = 1; - newmis.avelocity = '300 300 300'; - setmodel(newmis, "progs/hgren2.mdl"); - } - else - {*/ - if (self.weapon == 3) - { - newmis.touch = NailGrenadeTouch; - newmis.think = NailGrenadeExplode; - newmis.skin = 1; - newmis.avelocity = '0 300 0'; - setmodel(newmis, "progs/biggren.mdl"); - }/* - else - { - if (self.weapon == 4) - { - newmis.touch = MirvGrenadeTouch; - newmis.think = MirvGrenadeExplode; - newmis.skin = 0; - newmis.avelocity = '0 300 0'; - setmodel(newmis, "progs/biggren.mdl"); - } - else - { - if (self.weapon == 5) - { - newmis.touch = NapalmGrenadeTouch; - newmis.think = NapalmGrenadeExplode; - newmis.skin = 2; - newmis.avelocity = '0 300 0'; - setmodel(newmis, "progs/biggren.mdl"); - } - else - { - if (self.weapon == 6) - { - sprint(self.owner, "Flare lit.\n"); - te = spawn(); - te.touch = SUB_Null; - te.think = RemoveFlare; - te.nextthink = time + 25; - te.owner = self.owner; - te.solid = 0; - self.owner.effects = self.owner.effects | 4; - dremove(self); - dremove(newmis); - return; - } - else - { - if (self.weapon == 7) - { - newmis.touch = GasGrenadeTouch; - newmis.think = GasGrenadeExplode; - newmis.skin = 2; - newmis.avelocity = '300 300 300'; - setmodel(newmis, "progs/grenade2.mdl"); - } - else - { - if (self.weapon == 8) - { - newmis.touch = EMPGrenadeTouch; - newmis.think = EMPGrenadeExplode; - newmis.skin = 4; - newmis.avelocity = '300 300 300'; - setmodel(newmis, "progs/grenade2.mdl"); - } - else - {*/ - if (self.weapon == 9) - { - newmis.touch = FlashGrenadeTouch; - newmis.think = FlashGrenadeExplode; - newmis.skin = 1; - newmis.avelocity = '300 300 300'; - setmodel(newmis, "progs/grenade2.mdl"); - }/* - } - } - } - } - } - } - } - }*/ - setsize(newmis, '0 0 0', '0 0 0'); - setorigin(newmis, self.owner.origin); - bprint("No "); - bprint(self.owner.netname); - bprint(", throw the grenade, not the pin!\n"); - dremove(self); -}; - -void() NormalGrenadeTouch = -{ - if (other == self.owner) - { - return; - } - sound(self, 1, "weapons/bounce.wav", 1, 1); - if (self.velocity == '0 0 0') - { - self.avelocity = '0 0 0'; - } -}; - -void () NormalGrenadeExplode = -{ - deathmsg = 88; - T_RadiusDamage (self, self.owner, 180, world); - WriteByte (0, 23); - WriteByte (0, 3); - WriteCoord (0, self.origin_x); - WriteCoord (0, self.origin_y); - WriteCoord (0, self.origin_z); - BecomeExplosion (); -}; - -// TF Prime Grenade Function -void () TeamFortress_PrimeGrenade = -{ - local float gtype; - local string gs; - local string ptime; - local entity tGrenade; - - if (((self.tfstate & 1) || (self.tfstate & 1024) || self.is_feigning == 1)) - { - return; - } - if ((self.impulse == 150)) - { - gtype = self.tp_grenades_1; - - if ((self.tp_grenades_1 == 2)) - { - gs = "Concussion grenade"; - } - else - { - if ((self.tp_grenades_1 == 3)) - { - gs = "Nail grenade"; - } - else - { - if ((self.tp_grenades_1 == 4)) - { - gs = "Mirv grenade"; - } - else - { - if ((self.tp_grenades_1 == 5)) - { - gs = "Napalm grenade"; - } - else - { - if ((self.tp_grenades_1 == 6)) - { - gs = "Flare"; - } - else - { - if ((self.tp_grenades_1 == 7)) - { - gs = "Gas grenade"; - } - else - { - if ((self.tp_grenades_1 == 8)) - { - gs = "EMP grenade"; - } - else - { - if ((self.tp_grenades_1 == 10)) - { - gs = "Caltrop canister"; - } - else - { - if ((self.tp_grenades_1 == 9)) - { - gs = "Flash grenade"; - } - else - { - gs = "Grenade"; - } - } - } - } - } - } - } - } - } -// gs = "Grenade"; - - if ((self.no_grenades_1 > 0)) - { - self.no_grenades_1 = (self.no_grenades_1 - 1); - /*if ((gtype == 6)) - { - newmis = spawn (); - newmis.owner = self; - newmis.movetype = 6; - newmis.solid = 2; - newmis.classname = "grenade"; - makevectors (self.v_angle); - newmis.velocity = ((v_forward * 600) + (v_up * 25)); - newmis.velocity = (newmis.velocity * 700); - newmis.angles = vectoangles (newmis.velocity); - newmis.weapon = self.team_no; - newmis.think = FlareGrenadeExplode; - newmis.nextthink = (time + 0.8); - newmis.touch = FlareGrenadeTouch; - newmis.skin = 1; - newmis.mdl = "flare"; - setmodel (newmis, "progs/flare.mdl"); - setsize (newmis, '0 0 0', '0 0 0'); - setorigin (newmis, self.origin); - return; - }*/ - if ((gtype == 10)) - { - ptime = ftos (0.5); - sprint (self, "Opening "); - sprint (self, gs); - sprint (self, "...\n"); - } - else - { - sound (self, CHAN_WEAPON, "weapons/prime.wav", 1, ATTN_STATIC); - sound (self, CHAN_AUTO, "weapons/gren.wav", 1, ATTN_STATIC); - ptime = ftos (3); - sprint (self, gs); - sprint (self, " primed, "); - sprint (self, ptime); - sprint (self, " seconds...\n"); - TeamNexuiz_HUD_ShowSign(self, HUD_PRIME_GREN); - } - } - else - { - sprint (self, "No "); - sprint (self, gs); - sprint (self, "s left.\n"); - return; - } - } - if ((self.impulse == 151)) - { - if (self.tp_grenades_2 == 0) - return; - gtype = self.tp_grenades_2; -/* if ((self.tp_grenades_2 == 2)) - { - gs = "Concussion grenade"; - } - else - {*/ - if ((self.tp_grenades_2 == 3)) - { - gs = "Nail grenade"; - }/* - else - { - if ((self.tp_grenades_2 == 4)) - { - gs = "Mirv grenade"; - } - else - { - if ((self.tp_grenades_2 == 5)) - { - gs = "Napalm grenade"; - } - else - { - if ((self.tp_grenades_2 == 6)) - { - gs = "Flare"; - } - else - { - if ((self.tp_grenades_2 == 7)) - { - gs = "Gas grenade"; - } - else - { - if ((self.tp_grenades_2 == 8)) - { - gs = "EMP grenade"; - } - else - { - if ((self.tp_grenades_2 == 9)) - { - gs = "Flash grenade"; - }*/ - else - { - gs = "Grenade"; - }/* - } - } - } - } - } - } - }*/ - if ((self.no_grenades_2 > 0)) - { - self.no_grenades_2 = (self.no_grenades_2 - 1); -/* if ((gtype == 6)) - { - newmis = spawn (); - newmis.owner = self; - newmis.movetype = 6; - newmis.solid = 2; - newmis.classname = "grenade"; - makevectors (self.v_angle); - if (self.v_angle_x) - { - newmis.velocity = ((v_forward * 1200) + (v_up * 200)); - } - else - { - newmis.velocity = aim (self, 10000); - newmis.velocity = (newmis.velocity * 1200); - newmis.velocity_z = 75; - } - newmis.angles = vectoangles (newmis.velocity); - newmis.weapon = self.team_no; - newmis.think = FlareGrenadeExplode; - newmis.nextthink = (time + 0.8); - newmis.touch = FlareGrenadeTouch; - newmis.skin = 1; - newmis.mdl = "flare"; - setmodel (newmis, "progs/flare.mdl"); - setsize (newmis, '0 0 0', '0 0 0'); - setorigin (newmis, self.origin); - return; - }*/ - if ((gtype == 10)) - { - ptime = ftos (0.5); - sprint (self, "Opening "); - sprint (self, gs); - sprint (self, "...\n"); - } - else - { - ptime = ftos (3); - sprint (self, gs); - sprint (self, " primed, "); - sprint (self, ptime); - sprint (self, " seconds...\n"); - } - } - else - { - sprint (self, "No "); - sprint (self, gs); - sprint (self, "s left.\n"); - return; - } - } - self.tfstate = (self.tfstate | 1); - tGrenade = spawn (); - tGrenade.owner = self; - tGrenade.weapon = gtype; - tGrenade.classname = "primer"; - tGrenade.impulse = self.impulse; - tGrenade.nextthink = (time + 0.8); - tGrenade.heat = time + 4; - -/* // Make Centerprint timer // Taken out due to the fact that the function sucked - newmis = spawn (); - newmis.owner = self; - newmis.classname = "primedtimer"; - newmis.think = CP_Timer; - newmis.nextthink = (time); - self.grenade_timer = time; */ - /*if ((gtype == 10)) - { - tGrenade.heat = ((time + 0.5) + 0.5); - } - else - { - tGrenade.heat = ((time + 3) + 0.8); - }*/ - tGrenade.think = TeamFortress_GrenadePrimed; -}; - -void () TeamFortress_GrenadePrimed = -{ - local entity user; - local entity oldself; - - user = self.owner; - if ((!(user.tfstate & 1024) && !user.deadflag)) - { - self.nextthink = (time + 0.1); - if (!self.think) - { - dremove (self); - } - if ((time > self.heat)) - { - TeamFortress_ExplodePerson (); - } - return; - } - if (!(user.tfstate & 1)) - { - dprint ("GrenadePrimed logic error\n"); - } - user.tfstate = (user.tfstate - (user.tfstate & 1)); - user.tfstate = (user.tfstate - (user.tfstate & 1024)); -// sound (user, 1, "weapons/grenade.wav", 1, 1); - KickPlayer (-1, user); - newmis = spawn (); - newmis.owner = user; - newmis.movetype = 10; - newmis.solid = 2; - newmis.classname = "grenade"; - makevectors (user.v_angle); - if (user.deadflag) - { - newmis.velocity = '0 0 200'; - } - else - { - if (user.v_angle_x) - { - newmis.velocity = ((((v_forward * 600) + (v_up * 200)) + ((crandom () * v_right) * 10)) + ((crandom () * v_up) * 10)); - } - else - { - newmis.velocity = aim (user, 10000); - newmis.velocity = (newmis.velocity * 600); - newmis.velocity_z = 200; - } - } - newmis.angles = vectoangles (newmis.velocity); - newmis.think = SUB_Null; - newmis.nextthink = self.heat; - if ((self.weapon == 1)) - { - newmis.touch = NormalGrenadeTouch; - newmis.think = NormalGrenadeExplode; - newmis.skin = 0; - newmis.avelocity = '300 300 300'; -// setmodel (newmis, "progs/hgren2.mdl"); - setmodel(newmis, "models/grenades/fragnade.md3"); - } - else if ((self.weapon == 9)) - { - newmis.touch = FlashGrenadeTouch; - newmis.think = FlashGrenadeExplode; - newmis.skin = 2; - newmis.avelocity = '300 300 300'; - setmodel (newmis, "progs/hgren2.mdl"); - } -/* else - { - if ((self.weapon == 2)) - { - newmis.touch = ConcussionGrenadeTouch; - newmis.think = ConcussionGrenadeExplode; - newmis.skin = 1; - newmis.avelocity = '300 300 300'; - setmodel (newmis, "progs/hgren2.mdl"); - } - else - {*/ - if ((self.weapon == 3)) - { - newmis.touch = NailGrenadeTouch; - newmis.think = NailGrenadeExplode; - newmis.skin = 1; - newmis.avelocity = '0 300 0'; - setmodel (newmis, "progs/biggren.mdl"); - }/* - else - { - if ((self.weapon == 4)) - { - newmis.touch = MirvGrenadeTouch; - newmis.think = MirvGrenadeExplode; - newmis.skin = 0; - newmis.avelocity = '0 300 0'; - setmodel (newmis, "progs/biggren.mdl"); - } - else - { - if ((self.weapon == 5)) - { - newmis.touch = NapalmGrenadeTouch; - newmis.think = NapalmGrenadeExplode; - newmis.skin = 2; - newmis.avelocity = '0 300 0'; - setmodel (newmis, "progs/biggren.mdl"); - } - else - { - if ((self.weapon == 6)) - { - newmis.touch = FlareGrenadeTouch; - newmis.weapon = self.team_no; - newmis.think = FlareGrenadeExplode; - newmis.skin = 1; - newmis.avelocity = '300 300 300'; - newmis.mdl = "flare"; - setmodel (newmis, "progs/flare.mdl"); - } - else - { - if ((self.weapon == 7)) - { - newmis.touch = GasGrenadeTouch; - newmis.think = GasGrenadeExplode; - newmis.skin = 3; - newmis.avelocity = '300 300 300'; - setmodel (newmis, "progs/grenade2.mdl"); - } - else - { - if ((self.weapon == 8)) - { - newmis.touch = EMPGrenadeTouch; - newmis.think = EMPGrenadeExplode; - newmis.skin = 4; - newmis.avelocity = '300 300 300'; - setmodel (newmis, "progs/grenade2.mdl"); - } - else - { - if ((self.weapon == 10)) - { - newmis.touch = CanisterTouch; - newmis.think = ScatterCaltrops; - newmis.skin = 0; - newmis.avelocity = '0 0 0'; - } - else - { - if ((self.weapon == 9)) - { - newmis.touch = FlashGrenadeTouch; - newmis.think = FlashGrenadeExplode; - newmis.skin = 2; - newmis.avelocity = '300 300 300'; - setmodel (newmis, "progs/hgren2.mdl"); - } - } - } - } - } - } - } - } - } - }*/ - setsize (newmis, '0 0 0', '0 0 0'); - setorigin (newmis, user.origin); - oldself = self; - self = self.owner; - self = oldself; - dremove (self); -}; - -void () TeamFortress_ThrowGrenade = -{ - if (!(self.tfstate & 1)) - { - return; - } - sound(self, 3, "weapons/throw.wav", 1, 1); - self.tfstate = (self.tfstate | 1024); -}; - -// TF Grenade CenterPrint Timer - it sucks so I took it out:x -void () CP_Timer = -{ - local float countdown; - - countdown = (time - self.owner.grenade_timer); - - if (countdown > 0) - { - CenterPrint (self.owner, "^7€‚^1\n"); - } - if (countdown > .25) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > .5) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > .75) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > 1) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > 1.25) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > 1.5) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > 1.75) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > 2) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > 2.25) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > 2.5) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > 2.75) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > 3) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > 3.25) - { - CenterPrint (self.owner, "^1€^7‚\n"); - } - if (countdown > 3.5) - { - CenterPrint (self.owner, "^1€‚^7\n"); - } - if (countdown > 3.75) - { - CenterPrint (self.owner, "^3€‚^7\n"); - } - if (countdown > 4) - { - CenterPrint (self.owner, "\n"); - dremove(self); - } - else - { - self.nextthink = (time + .25); - } -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/tfhud.c b/attic/TeamNexuiz/game/gamec/tfhud.c deleted file mode 100644 index f001d2835..000000000 --- a/attic/TeamNexuiz/game/gamec/tfhud.c +++ /dev/null @@ -1,49 +0,0 @@ - /****************************/ - /*Team:Nexuiz HUD Items Code*/ - /****************************/ -.entity grenadeoneentity; -//.entity grenadetwoentity; - -void () TeamNexuiz_HUD_GrenThink = -{ - if (self.frame >= 10) - dremove(self); - self.frame = self.frame + 1; - self.nextthink = time + .4; -}; - -void () TeamNexuiz_HUD_SignThink = -{ - if (self.alpha <= 0) - dremove(self); - self.alpha = self.alpha - .2; - self.nextthink = time + .1; -}; - -// Displays "No Ammo" sign -// ok this was a dumb idea >.< lets just use csqc -void (entity ownr, float selection) TeamNexuiz_HUD_ShowSign = -{ - precache_model("models/hud_nobul.sp2"); - ownr.grenadeoneentity = spawn(); - ownr.grenadeoneentity.solid = SOLID_NOT; - ownr.grenadeoneentity.owner = ownr; - ownr.grenadeoneentity.grenadeoneentity = ownr.grenadeoneentity; - ownr.grenadeoneentity.think = TeamNexuiz_HUD_SignThink; - ownr.grenadeoneentity.nextthink = time + 1; - if (selection == NO_AMMO_WARNING) - setmodel(ownr.grenadeoneentity, "models/hud_nobul.sp2"); - else if (selection == HUD_PRIME_GREN) - { - setmodel(ownr.grenadeoneentity, "models/grentimer.sp2"); - ownr.grenadeoneentity.frame = 2; - ownr.grenadeoneentity.think = TeamNexuiz_HUD_GrenThink; - ownr.grenadeoneentity.nextthink = time + .4; - } - ownr.grenadeoneentity.scale = .1; - ownr.grenadeoneentity.alpha = 1; - ownr.grenadeoneentity.origin = '40 0 0'; - ownr.grenadeoneentity.angles = '0 0 0'; - ownr.grenadeoneentity.viewmodelforclient = ownr; - ownr.grenadeoneentity.flags = 0; -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/tfitems.c b/attic/TeamNexuiz/game/gamec/tfitems.c deleted file mode 100644 index 5be4b33a4..000000000 --- a/attic/TeamNexuiz/game/gamec/tfitems.c +++ /dev/null @@ -1,194 +0,0 @@ -float (entity e, float healamount, float ignore) T_Heal = -{ - if ((e.health <= 0)) - { - return (0); - } - if ((!ignore && (e.health >= e.max_health))) - { - return (0); - } - healamount = ceil (healamount); - e.health = (e.health + healamount); - if ((!ignore && (e.health >= e.max_health))) - { - e.health = e.max_health; - } - if ((e.health > 250)) - { - - e.health = 250; - } - /* // There are no snipers in NexTF - if (e.leg_damage) - { - if ((e.health > 95)) - { - e.leg_damage = 0; - } - else - { - e.leg_damage = (e.leg_damage - ceil ((e.health / 20))); - } - if ((e.leg_damage < 1)) - { - e.leg_damage = 0; - } - TeamFortress_SetSpeed (e); - }*/ - return (1); -}; - -// Pre-Packed TeamNexuiz items/entities :) -//backpack -.string cells; -.string shells; -.string rockets; -.string nails; -.string metal; -.string grenade1; -.string grenade2; -.string armor; - -// TF Map rules -.string team1limit; -.string team2limit; -.string team3limit; -.string team4limit; - -// Moved the below to tfdefs. These are the "Map_Rules" entity's class restricts. -/*.float team1_scout, team1_soldier, team1_medic, team1_pyro, team1_spy, team1_engineer; -.float team2_scout, team2_soldier, team2_medic, team2_pyro, team2_spy, team2_engineer; -.float team3_scout, team3_soldier, team3_medic, team3_pyro, team3_spy, team3_engineer; -.float team4_scout, team4_soldier, team4_medic, team4_pyro, team4_spy, team4_engineer;*/ -entity infoent; // our class restricts info entity - -void() maprules = -{ - // Amount of teams available on a map are determined by spawn points - - // Amount of players per team - if (self.team1limit) - self.ammo_medikit = stof(self.team1limit); - if (self.team2limit) - self.ammo_detpack = stof(self.team2limit); - if (self.team3limit) - self.maxammo_medikit = stof(self.team3limit); - if (self.team4limit) - self.maxammo_detpack = stof(self.team4limit); - - if (self.team1_civilian) - self.maxammo_shells = -1; - if (self.team2_civilian) - self.maxammo_nails = -1; - if (self.team3_civilian) - self.maxammo_rockets = -1; - if (self.team4_civilian) - self.maxammo_cells = -1; - - self.classname = "info_tfdetect"; - ParseTFDetect(self); - - infoent = spawn(); - copyentity (self, infoent); - infoent.classname = "class_restrictions"; -}; - -// older Team:Nexuiz maps use this, so i'm routing it to "maprules" -void () Map_Rules = -{ - self.classname = "maprules"; - maprules(); -}; - -// Team:Nexuiz backpack -void () item_backpack = -{ - if ((!self.mdl) && (!self.model)) - { - self.model = "models/objects/backpack/backpack.md3"; - } - if (self.cells) - self.ammo_cells = stof(self.cells); - if (self.shells) - self.ammo_shells = stof(self.shells); - if (self.rockets) - self.ammo_rockets = stof(self.rockets); - if (self.nails) - self.ammo_nails = stof(self.nails); - if (self.metal) - self.ammo_metal = stof(self.metal); - if (self.grenade1) - self.no_grenades_1 = stof(self.grenade1); - if (self.grenade2) - self.no_grenades_2 = stof(self.grenade2); - if (self.armor) - self.armorvalue = stof(self.armor); - if ((!self.delay) && (!self.wait)) - self.wait = 10; // next time item can be used - self.give = "converted"; - - ConvertToBackPack(); // finish conversion using q3f conversion func -}; - -// Team:Nexuiz ctf flag (needs to be capped at an item_ctf_goal -void () item_ctf_flag = -{ - if (!self.allowteams) - { - bprint("Fixme!! Object located at ",vtos(self.origin)," has no allowteams property set!\n"); - bprint("allowteams property must be set to either red blue yellow green or any\n"); - return; - } - if ((!self.delay) && (!self.wait)) - { - self.wait = 45; // next time item can be used - self.delay = 45; - } - if (!self.carried_message) - self.carried_message = "You have the flag! Go capture it in your base!\n"; - if (self.allowteams == "red") - { - self.mdl = "models/flags/b_flag.md3"; - self.groupname = "redflag"; - } - else if (self.allowteams == "blue") - { - self.groupname = "blueflag"; - self.mdl = "models/flags/r_flag.md3"; - } - else if (self.allowteams == "any") - { - self.groupname = "anyflag"; -// self.mdl = "models/flags/n_flag.md3"; - } - - func_goalitem (); -}; - -// where you cap item_ctf_flag or flags spawned by tfq3fitems.c -.string cap_message; -void () item_ctf_goal = -{ - if (!self.teamscore) // how many frags are gained by capturing - self.teamscore = 10; - if (!self.message) - self.message = "You ÃÁÐÔÕÒÅÄ the ÅÎÅÍÙ flag!\n"; - if (!self.cap_message) - self.netname = "Blue brings home the Flag"; - if (self.allowteams == "blue") - { - self.holding = "blueflag"; - ConvertToGoal(1); - } - else if (self.allowteams == "red") - { - self.holding = "redflag"; - ConvertToGoal(2); - } - else if (self.allowteams == "any") - { - self.holding = "anyflag"; - ConvertToGoal(0); - } -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/tfmapitems.c b/attic/TeamNexuiz/game/gamec/tfmapitems.c deleted file mode 100644 index 44f4eb01a..000000000 --- a/attic/TeamNexuiz/game/gamec/tfmapitems.c +++ /dev/null @@ -1,3186 +0,0 @@ -/**************** - XavioR's Team Fortress Map Entities conversion - ************/ -/* -// Things needed to be added (probably): -prematch -*/ - -// Goal stuff - - -.float if_item_has_moved; -.float if_item_hasnt_moved; -.float remove_spawnpoint; -.float restore_spawnpoint; -.float remove_spawngroup; -.float restore_spawngroup; -.float display_item_status1; -.float display_item_status2; -.float display_item_status3; -.float display_item_status4; -.string team_str_home; -.string team_str_moved; -.string team_str_carried; -.string non_team_str_home; -.string non_team_str_moved; -.string non_team_str_carried; -.float ex_skill_min; -.float ex_skill_max; -.float increase_team1; -.float increase_team2; -.float increase_team3; -.float increase_team4; - - -// Temp defs that need to be moved to TFDefs -.string broadcast; -.string team_broadcast; -.string non_team_broadcast; -.string owners_team_broadcast; -.string netname_broadcast; -.string netname_team_broadcast; -.string netname_non_team_broadcast; -.string netname_owners_team_broadcast; -.string team_drop; -.string non_team_drop; -.string netname_team_drop; -.string netname_non_team_drop; -string team_menu_string/* = ""*/; -.float all_active; -.float item_list; -float item_list_bit; -.float delay_time; -.float dont_do_triggerwork; -.float g_a; -.float g_e; -.string t_s_h; -.string t_s_m; -.string t_s_c; -.string n_s_h; -.string n_s_m; -.string n_s_c; -.string b_b; -.string b_t; -.string b_n; -.string b_o; -.string n_b; -.string n_t; -.string n_n; -.string n_o; -.string d_t; -.string d_n; -.string d_n_t; -.string d_n_n; - -// Temp defs that need functions -float prematch; - - -.float h_i_g, r_i_g, a_s, a_n, a_r, a_c, rv_s_h, rs_s_h, rv_gr, rs_gr, rs_g; -.float rv_g; -.vector goal_min, goal_max; - -// Prototypes -// Team Functions -void(float tno, float scoretoadd) TeamFortress_TeamIncreaseScore; -void(float all) TeamFortress_TeamShowScores; -float() TeamFortress_TeamGetWinner; - -// Functions to handle entity placement when spawned -void() TF_PlaceItem; -void() TF_StartItem; -void() TF_PlaceGoal; -void() TF_StartGoal; - -// Spawn functions for all Map Entities -float() CheckExistence; -void() info_tfdetect; -void() info_player_teamspawn; -void() info_tfgoal; -void() info_tfgoal_timer; -void() item_tfgoal; - -// AutoDetection Function -void(entity AD) ParseTFDetect; - -// Generic Functions -entity(float ino) Finditem; -entity(float gno) Findgoal; -entity(float gno) Findteamspawn; -void(entity Goal) InactivateGoal; -void(entity Goal) RestoreGoal; -void(entity Goal) RemoveGoal; -float(entity Goal, entity Player, entity AP) IsAffectedBy; -//void(entity Goal, entity Player, entity AP, float addb) Apply_Results; -//float(entity Goal, entity AP) APMeetsCriteria; -void(entity Goal) SetupRespawn; -void() DoRespawn; -void(entity Goal, entity AP) DoGoalWork; -void(entity Goal, entity AP) DoGroupWork; -void(entity Item, entity AP) DoItemGroupWork; -void(entity Goal, entity AP) DoTriggerWork; -void(entity Goal, entity AP, float addb) DoResults; -//void(entity Goal, entity Player) RemoveResults; - -// Goal Functions -void() tfgoal_touch; -void() info_tfgoal_use; - -// Timer Goal Functions -void() tfgoal_timer_tick; - -// Item Functions -void() item_tfgoal_touch; -void(entity Item, entity AP, entity Goal) tfgoalitem_GiveToPlayer; -void(entity Item, entity AP, float method) tfgoalitem_RemoveFromPlayer; -void() tfgoalitem_remove; -void(entity Item) tfgoalitem_drop; -void(entity Item) tfgoalitem_checkgoalreturn; -void() ReturnItem; -void(entity Goal, entity Player, entity Item) DisplayItemStatus; - -// CTF Support Functions -void() CTF_FlagCheck; - - -void () TF_PlaceItem; -void () TF_StartItem; -void () TF_PlaceGoal; -void () TF_StartGoal; -//void () TF_PlaceCamp; -//void () TF_StartCamp; -void () info_tfdetect; -//void () info_tfnocamp; -void () info_player_teamspawn; -void () info_tfgoal; -void () info_tfgoal_timer; -void () item_tfgoal; -entity (float gno) Findgoal; -entity (float gno) Findteamspawn; -void (entity Goal) InactivateGoal; -void (entity Goal) RestoreGoal; -void (entity Goal) RemoveGoal; -float (entity Goal,entity Player,entity AP) IsAffectedBy; -void (entity Goal,entity Player,entity AP,float addb) Apply_Results; -float (entity Goal,entity AP) APMeetsCriteria; -void (entity Goal) SetupRespawn; -void () DoRespawn; -void (entity Item,entity AP) DoItemGroupWork; -void (entity Goal,entity AP) DoTriggerWork; -void (entity Goal,entity Player) RemoveResults; -void () info_tfgoal_use; -void () tfgoal_timer_tick; -void () item_tfgoal_touch; -void () tfgoalitem_remove; -void (entity Item) tfgoalitem_drop; -void (entity Item) tfgoalitem_checkgoalreturn; -void () ReturnItem; - - -void() MoveFlag = -{ - if ( (prematch) )// && (self.owner.items & 131072) ) - { - T_Damage (self.owner, self.owner, self.owner, 500); - } - - makevectors(self.owner.v_angle); - setorigin(self, self.owner.origin - v_forward * 25 + '0 0 20'); - self.angles_x = self.owner.angles_z; - self.angles_y = self.owner.angles_y + 90; - self.angles_z = 0 - self.owner.angles_x; - self.nextthink = time + 0.010000; - self.think = MoveFlag; - if (self.owner.deadflag) - { - // pablo - //self.movetype = 10; - //self.velocity = '0 0 100'; - // - self.owner.effects = self.owner.effects - (self.owner.effects & 128); - self.owner.effects = self.owner.effects - (self.owner.effects & 64); - dremove(self); - } - if (!(self.owner.items & 131072) && !(self.owner.items & 262144)) - { - self.owner.effects = self.owner.effects - (self.owner.effects & 128); - self.owner.effects = self.owner.effects - (self.owner.effects & 64); - dremove(self); - } -}; - -void (entity Goal) UpdateAbbreviations = -{ - if ((Goal.has_abbreviated == 0)) - { - if (((Goal.g_a != 0) && (Goal.goal_activation == 0))) - { - Goal.goal_activation = Goal.g_a; - } - if (((Goal.g_e != 0) && (Goal.goal_effects == 0))) - { - Goal.goal_effects = Goal.g_e; - } - if (((Goal.g_e != 0) && (Goal.goal_effects == 0))) - { - Goal.goal_effects = Goal.g_e; - } - if (((Goal.h_i_g != 0) && (Goal.has_item_from_group == 0))) - { - Goal.has_item_from_group = Goal.h_i_g; - } - if (((Goal.hn_i_g != 0) && (Goal.hasnt_item_from_group == 0))) - { - Goal.hasnt_item_from_group = Goal.hn_i_g; - } - if (((Goal.r_i_g != 0) && (Goal.remove_item_group == 0))) - { - Goal.remove_item_group = Goal.r_i_g; - } - if (((Goal.a_s != 0) && (Goal.ammo_shells == 0))) - { - Goal.ammo_shells = Goal.a_s; - } - if (((Goal.a_n != 0) && (Goal.ammo_nails == 0))) - { - Goal.ammo_nails = Goal.a_n; - } - if (((Goal.a_r != 0) && (Goal.ammo_rockets == 0))) - { - Goal.ammo_rockets = Goal.a_r; - } - if (((Goal.a_c != 0) && (Goal.ammo_cells == 0))) - { - Goal.ammo_cells = Goal.a_c; - } - if (((Goal.rv_s_h != 0) && (Goal.remove_spawngroup == 0))) - { - Goal.remove_spawngroup = Goal.rv_s_h; - } - if (((Goal.rs_s_h != 0) && (Goal.restore_spawngroup == 0))) - { - Goal.restore_spawngroup = Goal.rs_s_h; - } - if (((Goal.rv_gr != 0) && (Goal.remove_group_no == 0))) - { - Goal.remove_group_no = Goal.rv_gr; - } - if (((Goal.rs_gr != 0) && (Goal.restore_group_no == 0))) - { - Goal.restore_group_no = Goal.rs_gr; - } - if (((Goal.rv_g != 0) && (Goal.remove_goal_no == 0))) - { - Goal.remove_goal_no = Goal.rv_g; - } - if (((Goal.rs_g != 0) && (Goal.restore_goal_no == 0))) - { - Goal.restore_goal_no = Goal.rs_g; - } - if ((Goal.t_s_h != string_null)) - { - Goal.team_str_home = Goal.t_s_h; - } - if ((Goal.t_s_m != string_null)) - { - Goal.team_str_moved = Goal.t_s_m; - } - if ((Goal.t_s_c != string_null)) - { - Goal.team_str_carried = Goal.t_s_c; - } - if ((Goal.n_s_h != string_null)) - { - Goal.non_team_str_home = Goal.n_s_h; - } - if ((Goal.n_s_m != string_null)) - { - Goal.non_team_str_moved = Goal.n_s_m; - } - if ((Goal.n_s_c != string_null)) - { - Goal.non_team_str_carried = Goal.n_s_c; - } - if ((Goal.b_b != string_null)) - { - Goal.broadcast = Goal.b_b; - } - if ((Goal.b_t != string_null)) - { - Goal.team_broadcast = Goal.b_t; - } - if ((Goal.b_n != string_null)) - { - Goal.non_team_broadcast = Goal.b_n; - } - if ((Goal.b_o != string_null)) - { - Goal.owners_team_broadcast = Goal.b_o; - } - if ((Goal.n_b != string_null)) - { - Goal.netname_broadcast = Goal.n_b; - } - if ((Goal.n_t != string_null)) - { - Goal.netname_team_broadcast = Goal.n_t; - } - if ((Goal.n_n != string_null)) - { - Goal.netname_non_team_broadcast = Goal.n_n; - } - if ((Goal.n_o != string_null)) - { - Goal.netname_owners_team_broadcast = Goal.n_o; - } - if ((Goal.d_t != string_null)) - { - Goal.team_drop = Goal.d_t; - } - if ((Goal.d_n != string_null)) - { - Goal.non_team_drop = Goal.d_n; - } - if ((Goal.d_n_t != string_null)) - { - Goal.netname_team_drop = Goal.d_n_t; - } - if ((Goal.d_n_n != string_null)) - { - Goal.netname_non_team_drop = Goal.d_n_n; - } - if ((flagem_checked == 0)) - { - if ((cvar ("temp1") & 4096)) - { - toggleflags = (toggleflags | 4096); - } - if ((cvar ("temp1") & 8192)) - { - toggleflags = (toggleflags | 8192); - } - flagem_checked = 1; - } - if (((toggleflags & 4096) && !(toggleflags & 8192))) - { - if ((((Goal.mdl == "progs/b_s_key.mdl") || (Goal.mdl == "progs/m_s_key.mdl")) || (Goal.mdl == "progs/w_s_key.mdl"))) - { - Goal.mdl = "progs/tf_flag.mdl"; - Goal.skin = 1; - } - else - { - if ((((Goal.mdl == "progs/b_g_key.mdl") || (Goal.mdl == "progs/m_g_key.mdl")) || (Goal.mdl == "progs/w_g_key.mdl"))) - { - Goal.mdl = "progs/tf_flag.mdl"; - Goal.skin = 2; - } - } - } - if ((toggleflags & 8192)) - { - if ((((Goal.mdl == "progs/b_s_key.mdl") || (Goal.mdl == "progs/m_s_key.mdl")) || (Goal.mdl == "progs/w_s_key.mdl"))) - { - Goal.mdl = "progs/tf_stan.mdl"; - Goal.skin = 1; - } - else - { - if ((((Goal.mdl == "progs/b_g_key.mdl") || (Goal.mdl == "progs/m_g_key.mdl")) || (Goal.mdl == "progs/w_g_key.mdl"))) - { - Goal.mdl = "progs/tf_stan.mdl"; - Goal.skin = 2; - } - else - { - if ((Goal.mdl == "progs/tf_flag.mdl")) - { - Goal.mdl = "progs/tf_stan.mdl"; - } - } - } - } - Goal.has_abbreviated = 1; - } -}; - -void () TF_PlaceItem = -{ - self.flags = 256.000000; - self.movetype = 0.000000; - self.velocity = '0.000000 0.000000 0.000000'; - self.oldorigin = self.origin; - if ((self.goal_activation & 512.000000)) - { - self.effects = (self.effects | 8.000000); - } - if ((item_list_bit == 0.000000)) - { - item_list_bit = 1.000000; - } - self.item_list = item_list_bit; - item_list_bit = item_list_bit * 2.000000; -}; - -void () TF_StartItem = -{ - - UpdateAbbreviations (self); - self.nextthink = (time + 0.200000); - self.think = TF_PlaceItem; - if ((self.goal_state == 3.000000)) - { - RemoveGoal (self); - } -}; - -void () TF_PlaceGoal = -{ - if ((self.classname != "info_tfgoal_timer")) - { - if ((self.goal_activation & 1.000000)) - { - self.touch = tfgoal_touch; - } - } - else - { - self.think = tfgoal_timer_tick; - self.nextthink = (time + self.search_time); - self.classname = "info_tfgoal"; - } - self.flags = 256.000000; - self.movetype = 0.000000; - self.velocity = '0.000000 0.000000 0.000000'; - self.oldorigin = self.origin; -}; - -void () TF_StartGoal = -{ - - UpdateAbbreviations (self); - self.nextthink = (time + 0.200000); - self.think = TF_PlaceGoal; - self.use = info_tfgoal_use; - if ((self.goal_state == 3.000000)) - { - RemoveGoal (self); - } -}; - -float() CheckExistence = -{ - - UpdateAbbreviations (self); - if ((self.ex_skill_min && (skill <= self.ex_skill_min))) - { - return (0.000000); - } - else - { - if ((self.ex_skill_max && (skill >= self.ex_skill_max))) - { - return (0.000000); - } - } - return (1.000000); -}; - -/* // ORIG NETQUAKETF INFO_TFDETECT -void () info_tfdetect = -{ - UpdateAbbreviations (self); -}; -*/ - -/*void () info_tfdetect = -{ - local entity te; - local string st; - - UpdateAbbreviations (self); - - //TIMELEFT TIMER - te = find (world,classname,"countdown"); - if (te != world) - { - return; - } - - st = infokey (world,"time"); // Unfortunately DP Engine doesnt support this (qw funct) - if (st == "off") - { - return; - } - newmis = spawn (); - newmis.classname = "countdown"; - newmis.no_grenades_1 = 0; - st = infokey (world,"timelimit"); - newmis.health = stof(st); - newmis.think = review_timeleft; - newmis.nextthink = (time + 1); - - -// MESSAGE DISP CODE - if (haltloop1 != 1) - { - local string msg1timer; - - msg1timer = infokey (world, "svmsg1"); - msg1time = stof(msg1timer); - - if (msg1time > 0) - { - display_message (); - } - haltloop1 = 1; - } - - if (haltloop2 != 1) - { - local string msg2timer; - - msg2timer = infokey (world, "svmsg2"); - msg2time = stof(msg2timer); - - if (msg2time > 0) - { - pre_messagetimer2 (); - } - haltloop2 = 1; - } - - if (haltloop3 != 1) - { - local string msg3timer; - - msg3timer = infokey (world, "svmsg3"); - msg3time = stof(msg3timer); - - if (msg3time > 0) - { - pre_messagetimer3 (); - } - haltloop3 = 1; - } - if (quotestart != 1) { - quotetimer (); - quotestart = 1; - } -// Auto Level-change fix -};*/ - -/* Gold. this is the old info_tfdetect... new one is above*/ -void() info_tfdetect = -{ - UpdateAbbreviations(self); - /*gold. next 6 lines are part of plexi's code for the "timeleft" command. - newmis = spawn (); - newmis.classname = "countdown"; - newmis.netname = "countdown"; - newmis.no_grenades_1 = 0; - newmis.think = review_timeleft; - newmis.nextthink = (time + 1);*/ -}; - -void() info_player_teamspawn = -{ - local entity te; - if (CheckExistence() == 0) - { - dremove(self); - return; - } - if (number_of_teams < self.team_no) - { - number_of_teams = self.team_no; - } - if (self.team_no <= 0) - { - dprint("no team_no associated with info_player_teamspawn\n"); - dremove(self); - } - if (self.items != 0) - { - te = Finditem(self.items); - if (!te) - { - dprint("info_player_teamspawn specifies a GoalItem that does not exist\n"); - dremove(self); - } - } - if (self.team_no == 1) - { - self.team_str_home = "ts1"; - } - else - { - if (self.team_no == 2) - { - self.team_str_home = "ts2"; - } - else - { - if (self.team_no == 3) - { - self.team_str_home = "ts3"; - } - else - { - if (self.team_no == 4) - { - self.team_str_home = "ts4"; - } - } - } - } -}; - -void() i_p_t = -{ - self.classname = "info_player_teamspawn"; - info_player_teamspawn(); -}; - -void() info_tfgoal = -{ - if (CheckExistence() == 0) - { - dremove(self); - return; - } - if (self.mdl) - { - precache_model(self.mdl); - precache_model2(self.mdl); - setmodel(self, self.mdl); - } - if (self.noise) - { - precache_sound(self.noise); - precache_sound2(self.noise); - } - else - { - if (self.mdl == "progs/backpack.mdl") - { - precache_sound("items/backpack.wav"); - precache_sound2("items/backpack.wav"); - self.noise = "items/backpack.wav"; - } - } - precache_sound("items/protect.wav"); - precache_sound("items/protect2.wav"); - precache_sound("items/protect3.wav"); - precache_sound("items/suit.wav"); - precache_sound("items/suit2.wav"); - precache_sound("items/inv1.wav"); - precache_sound("items/inv2.wav"); - precache_sound("items/inv3.wav"); - precache_sound("items/damage.wav"); - precache_sound("items/damage2.wav"); - precache_sound("items/damage3.wav"); - self.solid = 1; - if (self.goal_state == 0) - { - self.goal_state = 2; - } - if (self.goal_min != '0 0 0') - { - setsize(self, self.goal_min, self.goal_max); - } - else - { - setsize(self, '-16 -16 -24', '16 16 32'); - } - TF_StartGoal(); -}; - -void() i_t_g = -{ - self.classname = "info_tfgoal"; - info_tfgoal(); -}; - -void() info_tfgoal_timer = -{ - if (CheckExistence() == 0) - { - dremove(self); - return; - } - if (self.mdl) - { - precache_model(self.mdl); - precache_model2(self.mdl); - setmodel(self, self.mdl); - } - if (self.noise) - { - precache_sound(self.noise); - precache_sound2(self.noise); - } - if (self.search_time <= 0) - { - dprint("Timer Goal created with no specified time.\n"); - dremove(self); - } - self.solid = 0; - if (self.goal_state == 0) - { - self.goal_state = 2; - } - setsize(self, '-16 -16 -24', '16 16 32'); - TF_StartGoal(); -}; - -void() i_t_t = -{ - self.classname = "info_tfgoal_timer"; - info_tfgoal_timer(); -}; - -void() item_tfgoal = -{ - if (CheckExistence() == 0) - { - dremove(self); - return; - } - if (self.mdl) - { - precache_model(self.mdl); - precache_model2(self.mdl); - setmodel(self, self.mdl); - } - else - { - self.mdl = ""; - setmodel(self, ""); - } - precache_sound2("items/itembk2.wav"); - if (self.noise) - { - precache_sound(self.noise); - precache_sound2(self.noise); - } - self.touch = item_tfgoal_touch; - if (self.goal_state == 0) - { - self.goal_state = 2; - } - self.solid = 1; - setorigin(self, self.origin); - if (!(self.netname)) - { - self.netname = "goalitem"; - } - if (self.pausetime <= 0) - { - self.pausetime = 60; - } - if (self.delay != 0 && self.pausetime == 0) - { - self.pausetime = self.delay; - } - setsize(self, '-16 -16 -24', '16 16 32'); - TF_StartItem(); -}; - -void (entity AD) ParseTFDetect = -{ - if ((AD.team_broadcast != string_null)) - { - team_menu_string = AD.team_broadcast; - } - localcmd (AD.message); - cvar_set ("sv_maxspeed", "500"); - team1lives = AD.ammo_shells; - team2lives = AD.ammo_nails; - team3lives = AD.ammo_rockets; - team4lives = AD.ammo_cells; - if ((team1lives == 0)) - { - team1lives = -1; - } - if ((team2lives == 0)) - { - team2lives = -1; - } - if ((team3lives == 0)) - { - team3lives = -1; - } - if ((team4lives == 0)) - { - team4lives = -1; - } - /*if ((AD.hook_out == 1)) // Hook always allowed, right? - { - allow_hook = 0; - }*/ - team1maxplayers = AD.ammo_medikit; - team2maxplayers = AD.ammo_detpack; - team3maxplayers = AD.maxammo_medikit; - team4maxplayers = AD.maxammo_detpack; - if ((team1maxplayers == 0)) - { - team1maxplayers = 100; - } - if ((team2maxplayers == 0)) - { - team2maxplayers = 100; - } - if ((team3maxplayers == 0)) - { - team3maxplayers = 100; - } - if ((team4maxplayers == 0)) - { - team4maxplayers = 100; - } - illegalclasses = AD.playerclass; -// illegalclasses = AD.class; - illegalclasses1 = AD.maxammo_shells; - illegalclasses2 = AD.maxammo_nails; - illegalclasses3 = AD.maxammo_rockets; - illegalclasses4 = AD.maxammo_cells; - civilianteams = 0; - if ((illegalclasses1 == -1)) - { - illegalclasses1 = 0; - civilianteams = (civilianteams | 1); - } - if ((illegalclasses2 == -1)) - { - illegalclasses2 = 0; - civilianteams = (civilianteams | 2); - } - if ((illegalclasses3 == -1)) - { - illegalclasses3 = 0; - civilianteams = (civilianteams | 4); - } - if ((illegalclasses4 == -1)) - { - illegalclasses4 = 0; - civilianteams = (civilianteams | 8); - } -}; - -entity(float ino) Finditem = -{ - local entity tg; - local string st; - tg = find(world, classname, "item_tfgoal"); - while (tg) - { - if (tg.goal_no == ino) - { - return tg; - } - tg = find(tg, classname, "item_tfgoal"); - } - dprint("Could not find an item with a goal_no of "); - st = ftos(ino); - dprint(st); - dprint(".\n"); - return world; -}; - -/*entity(float gno) Findgoal = // moved to tffunctions -{ - local entity tg; - local string st; - tg = find(world, classname, "info_tfgoal"); - while (tg) - { - if (tg.goal_no == gno) - { - return tg; - } - tg = find(tg, classname, "info_tfgoal"); - } - dprint("Could not find a goal with a goal_no of "); - st = ftos(gno); - dprint(st); - dprint(".\n"); -};*/ - -entity(float gno) Findteamspawn = -{ - local entity tg; - local string st; - tg = find(world, classname, "info_player_teamspawn"); - while (tg) - { - if (tg.goal_no == gno) - { - return tg; - } - tg = find(tg, classname, "info_player_teamspawn"); - } - dprint("Could not find a Teamspawn with a goal_no of "); - st = ftos(gno); - dprint(st); - dprint(".\n"); -}; - -void(entity Goal) InactivateGoal = -{ - if (Goal.goal_state == 1) - { - if (Goal.search_time == 0) - { - Goal.solid = 1; - } - Goal.goal_state = 2; - if (Goal.mdl != string_null) - { - setmodel(Goal, Goal.mdl); - } - } -}; - -void(entity Goal) RestoreGoal = -{ - if (Goal.goal_state == 3) - { - if (Goal.search_time == 0) - { - Goal.solid = 1; - } - else - { - Goal.nextthink = time + Goal.search_time; - } - Goal.goal_state = 2; - if (Goal.mdl != string_null) - { - setmodel(Goal, Goal.mdl); - } - } -}; - -void(entity Goal) RemoveGoal = -{ - Goal.solid = 0; - Goal.goal_state = 3; - if (Goal.mdl != string_null) - { - setmodel(Goal, string_null); - } -}; - -float(entity Goal, entity Player, entity AP) IsAffectedBy = -{ - local float genv; - //if (Player.playerclass == 0) - if (Player.class == 0) - { - return 0; - } - if (Goal.goal_effects & 32) - { - genv = pointcontents(Goal.origin); - if (pointcontents(Player.origin) != genv) - { - return 0; - } - } - if (Goal.t_length != 0) - { - if (vlen(Goal.origin - Player.origin) <= Goal.t_length) - { - if (Goal.goal_effects & 16) - { - traceline(Goal.origin, Player.origin, 1, Goal); - if (trace_fraction == 1) - { - return 1; - } - } - else - { - return 1; - } - } - } - if (Goal.classname != "info_tfgoal_timer") - { - if (Goal.goal_effects & 1 && Player == AP) - { - return 1; - } - if (Goal.goal_effects & 2 && AP.team_no == Player.team_no) - { - return 1; - } - if (Goal.goal_effects & 4 && AP.team_no != Player.team_no) - { - return 1; - } - if (Goal.goal_effects & 8 && Player != AP) - { - return 1; - } - } - if (Goal.maxammo_shells != 0 && Player.team_no == Goal.maxammo_shells) - { - return 1; - } - if (Goal.maxammo_nails != 0 && Player.team_no != Goal.maxammo_shells) - { - return 1; - } - return 0; -}; - -void(entity Goal, entity Player, entity AP, float addb) Apply_Results = -{ - local entity oldself; - local entity te; - local entity oldte; - local float oa; - stuffcmd(Player, "bf\n"); - if (Goal.classname == "item_tfgoal") - { - Player.item_list = Player.item_list | Goal.item_list; - } - if (Player == AP) - { - if (Goal.count != 0) - { - if (Player.team_no > 0) - { - TeamFortress_TeamIncreaseScore(Player.team_no, Goal.count); - TeamFortress_TeamShowScores(2); - } - } - } - if (addb) - { - if (Player.health > 0) - { - if (Goal.health > 0) - { - T_Heal(Player, Goal.health, 0); - } - if (Goal.health < 0) - { - if (0 - Player.health > Goal.health) - { - Player.armorvalue = 0; - T_Damage(Player, Goal, Goal, Player.health + 1); - } - else - { - oa = Player.armorvalue; - Player.armorvalue = 0; - T_Damage(Player, Goal, Goal, 0 - Goal.health); - Player.armorvalue = oa; - } - } - } - if (Player.health > 0) - { - if (Goal.armortype) - { - // Temp (i hope) -// Player.armortype = Goal.armortype; // Armor type needs to be tweaked in this game - } - Player.armorvalue = Player.armorvalue + Goal.armorvalue; - if (Goal.armorclass) - { - Player.armorclass = Goal.armorclass; - } - if (Goal.gravity > 0) - { - Player.gravity = Goal.gravity; - } - Player.ammo_shells = Player.ammo_shells + Goal.ammo_shells; - Player.ammo_nails = Player.ammo_nails + Goal.ammo_nails; - Player.ammo_rockets = Player.ammo_rockets + Goal.ammo_rockets; - Player.ammo_cells = Player.ammo_cells + Goal.ammo_cells; - Player.ammo_metal = Player.ammo_metal + Goal.ammo_metal; // give metal - Player.ammo_medikit = Player.ammo_medikit + Goal.ammo_medikit; - Player.ammo_detpack = Player.ammo_detpack + Goal.ammo_detpack; - Player.no_grenades_1 = Player.no_grenades_1 + Goal.no_grenades_1; - Player.no_grenades_2 = Player.no_grenades_2 + Goal.no_grenades_2; - if (Player.no_grenades_1 > 4) - { - Player.no_grenades_1 = 4; - } - if (Player.no_grenades_2 > 4) - { - Player.no_grenades_2 = 4; - } - if (Player.ammo_detpack > Player.maxammo_detpack) - { - Player.ammo_detpack = Player.maxammo_detpack; - } - if (Goal.invincible_finished > 0) - { - Player.items = Player.items | 1048576; - Player.invincible_time = 1; - Player.invincible_finished = time + Goal.invincible_finished; - if (Goal.classname == "item_tfgoal") - { - Player.tfstate = Player.tfstate | 32; - Player.invincible_finished = time + 666; - } - } - /*if (Goal.invisible_finished > 0) // NexTF doesnt support invisibility? - { - Player.items = Player.items | 524288; - Player.invisible_time = 1; - Player.invisible_finished = time + Goal.invisible_finished; - if (Goal.classname == "item_tfgoal") - { - Player.tfstate = Player.tfstate | 64; - Player.invisible_finished = time + 666; - } - }*/ - if (Goal.super_damage_finished > 0) - { - Player.items = Player.items | 4194304; - Player.super_time = 1; - Player.super_damage_finished = time + Goal.super_damage_finished; - if (Goal.classname == "item_tfgoal") - { - Player.tfstate = Player.tfstate | 128; - Player.super_damage_finished = time + 666; - } - } - if (Goal.radsuit_finished > 0) - { - Player.items = Player.items | 2097152; - Player.rad_time = 1; - Player.radsuit_finished = time + Goal.radsuit_finished; - if (Goal.classname == "item_tfgoal") - { - Player.tfstate = Player.tfstate | 256; - Player.radsuit_finished = time + 666; - } - } - } - Player.lives = Player.lives + Goal.lives; - Player.real_frags = /*Player.real_frags + */Goal.frags + Player.frags; // Fixed? - if (!(toggleflags & 128)) - { - Player.frags = Player.real_frags; - } - - oldself = self; - self = Player; - TeamFortress_CheckClassStats(); - //W_SetCurrentAmmo(); // This is automatic in nexuiz right? - self = oldself; - } - //if (Player.playerclass == 8 && (Goal.goal_result & 16)) // In nextf, spy class is "2" - if (Player.class == CLASS_SPY && (Goal.goal_result & 16)) - { - self.immune_to_check = time + 4; - //Spy_RemoveDisguise(Player); // Wazat -- help [incomplete] - } - if (Goal.items != 0 && Goal.classname != "item_tfgoal") - { - te = Finditem(Goal.items); - if (te) - { - tfgoalitem_GiveToPlayer(te, Player, Goal); - } - } - if (Goal.axhitme != 0) - { - te = Finditem(Goal.axhitme); - if (te.owner == Player) - { - tfgoalitem_RemoveFromPlayer(te, Player, 1); - } - } - if (Goal.remove_item_group != 0) - { - te = find(world, classname, "item_tfgoal"); - while (te) - { - if (te.group_no == Goal.remove_item_group && te.owner == AP) - { - oldte = te; - te = find(te, classname, "item_tfgoal"); - tfgoalitem_RemoveFromPlayer(oldte, Player, 1); - } - else - { - te = find(te, classname, "item_tfgoal"); - } - } - } - if (Goal.display_item_status1 != 0) - { - te = Finditem(Goal.display_item_status1); - if (te) - { - DisplayItemStatus(Goal, Player, te); - } - else - { - sprint(Player,"Item is missing.\n"); - } - } - if (Goal.display_item_status2 != 0) - { - te = Finditem(Goal.display_item_status2); - if (te) - { - DisplayItemStatus(Goal, Player, te); - } - else - { - sprint(Player,"Item is missing.\n"); - } - } - if (Goal.display_item_status3 != 0) - { - te = Finditem(Goal.display_item_status3); - if (te) - { - DisplayItemStatus(Goal, Player, te); - } - else - { - sprint(Player,"Item is missing.\n"); - } - } - if (Goal.display_item_status4 != 0) - { - te = Finditem(Goal.display_item_status4); - if (te) - { - DisplayItemStatus(Goal, Player, te); - } - else - { - sprint(Player,"Item is missing.\n"); - } - } - // New Team:Nexuiz function: "switch_teams" property -- switches all team-related objects to the opposite - // team (ie self.team_no equal to "1" is now equal to "2" and vise verse). It will not switch team items - // which have a "no_switch_team" property set. - if (Goal.switch_teams) - { - local entity t_ent; - - t_ent = find (world,classname,"item_tfgoal"); - while (t_ent) - { - if (t_ent.team_no && !t_ent.no_switch_team) - { - if (t_ent.team_no == 1) - t_ent.team_no = 2; - if (t_ent.team_no == 2) - t_ent.team_no = 1; - } - t_ent = find (t_ent, classname, "item_tfgoal"); - } - t_ent = find (world,classname,"info_tfgoal"); - while (t_ent) - { - if (t_ent.team_no && !t_ent.no_switch_team) - { - if (t_ent.team_no == 1) - t_ent.team_no = 2; - if (t_ent.team_no == 2) - t_ent.team_no = 1; - } - t_ent = find (t_ent, classname, "info_tfgoal"); - } - t_ent = find (world,classname,"func_door"); - while (t_ent) - { - if (t_ent.team_no && !t_ent.no_switch_team) - { - if (t_ent.team_no == 1) - t_ent.team_no = 2; - if (t_ent.team_no == 2) - t_ent.team_no = 1; - } - t_ent = find (t_ent, classname, "func_door"); - } - t_ent = find (world,classname,"trigger_hurt"); - while (t_ent) - { - if (t_ent.team_no && !t_ent.no_switch_team) - { - if (t_ent.team_no == 1) - t_ent.team_no = 2; - if (t_ent.team_no == 2) - t_ent.team_no = 1; - } - t_ent = find (t_ent, classname, "trigger_hurt"); - } - t_ent = find (world,classname,"trigger_multiple"); - while (t_ent) - { - if (t_ent.team_no && !t_ent.no_switch_team) - { - if (t_ent.team_no == 1) - t_ent.team_no = 2;t_ent.owned_by = 2; - if (t_ent.team_no == 2) - t_ent.team_no = 1; - } - t_ent = find (t_ent, classname, "trigger_multiple"); - } - } - /*if (Player.autodiscard) //Not a function in NexTF - { - oldself = self; - self = Player; - TeamFortress_Discard (); - self = oldself; - }*/ -}; - -void(entity Goal, entity Player) RemoveResults = -{ - local entity oldself; - local entity te; - local float puinvin; - local float puinvis; - local float puquad; - local float purad; - if (Goal.classname == "item_tfgoal") - { - if (!(Player.item_list & Goal.item_list)) - { - return; - } - if (Goal.goal_activation & 1024) - { - return; - } - Player.item_list = Player.item_list - (Player.item_list & Goal.item_list); - } - if (Goal.health > 0) - { - TF_T_Damage(Player, Goal, Goal, Goal.health, 1, 0); - } - if (Goal.health < 0) - { - T_Heal(Player, 0 - Goal.health, 0); - } - Player.lives = Player.lives - Goal.lives; - Player.armortype = Player.armortype - Goal.armortype; - Player.armorvalue = Player.armorvalue - Goal.armorvalue; - Player.armorclass = Player.armorclass - (Player.armorclass & Goal.armorclass); - Player.real_frags = Player.real_frags - Goal.frags; - if (!(toggleflags & 128)) - { - Player.frags = Player.real_frags; - } - Player.ammo_shells = Player.ammo_shells - Goal.ammo_shells; - Player.ammo_nails = Player.ammo_nails - Goal.ammo_nails; - Player.ammo_rockets = Player.ammo_rockets - Goal.ammo_rockets; - Player.ammo_cells = Player.ammo_cells - Goal.ammo_cells; - Player.ammo_metal = Player.ammo_metal - Goal.ammo_metal; // take metal - Player.ammo_medikit = Player.ammo_medikit - Goal.ammo_medikit; - Player.ammo_detpack = Player.ammo_detpack - Goal.ammo_detpack; - Player.no_grenades_1 = Player.no_grenades_1 - Goal.no_grenades_1; - Player.no_grenades_2 = Player.no_grenades_2 - Goal.no_grenades_2; - puinvin = 0; - puinvis = 0; - puquad = 0; - purad = 0; - te = find(world, classname, "item_tfgoal"); - while (te) - { - if (te.owner == Player && te != Goal) - { - if (te.invincible_finished > 0) - { - puinvin = 1; - } - if (te.invisible_finished > 0) - { - puinvis = 1; - } - if (te.super_damage_finished > 0) - { - puquad = 1; - } - if (te.radsuit_finished > 0) - { - purad = 1; - } - } - te = find(te, classname, "item_tfgoal"); - } - if (Goal.invincible_finished > 0 && !puinvin) - { - Player.tfstate = Player.tfstate - (Player.tfstate & 32); - Player.items = Player.items | 1048576; - Player.invincible_time = 1; - Player.invincible_finished = time + Goal.invincible_finished; - } - if (Goal.invisible_finished > 0 && !puinvis) - { - Player.tfstate = Player.tfstate - (Player.tfstate & 64); - Player.items = Player.items | 524288; - Player.invisible_time = 1; - Player.invisible_finished = time + Goal.invisible_finished; - } - if (Goal.super_damage_finished > 0 && !puquad) - { - Player.tfstate = Player.tfstate - (Player.tfstate & 128); - Player.items = Player.items | 4194304; - Player.super_time = 1; - Player.super_damage_finished = time + Goal.super_damage_finished; - } - if (Goal.radsuit_finished > 0 && !purad) - { - Player.tfstate = Player.tfstate - (Player.tfstate & 256); - Player.items = Player.items | 2097152; - Player.rad_time = 1; - Player.radsuit_finished = time + Goal.radsuit_finished; - } - oldself = self; - self = Player; - TeamFortress_CheckClassStats(); - //W_SetCurrentAmmo(); // automatic in nexuiz? - self = oldself; -}; - -float(entity Goal, entity AP) APMeetsCriteria = -{ - local float gotone; - local entity te; - if (AP != world) - { - if (Goal.team_no) - { - if (Goal.team_no != AP.team_no) - { - return 0; - } - } - if (Goal.playerclass) - { - if (Goal.playerclass != AP.playerclass) - { - return 0; - } - } - if (Goal.class) - { - if (Goal.class != AP.class) - { - return 0; - } - } - if (Goal.items_allowed) - { - te = Finditem(Goal.items_allowed); - if (te.owner != AP) - { - return 0; - } - } - } - if (Goal.if_goal_is_active) - { - te = Findgoal(Goal.if_goal_is_active); - if (te.goal_state != 1) - { - return 0; - } - } - if (Goal.if_goal_is_inactive) - { - te = Findgoal(Goal.if_goal_is_inactive); - if (te.goal_state != 2) - { - return 0; - } - } - if (Goal.if_goal_is_removed) - { - te = Findgoal(Goal.if_goal_is_removed); - if (te.goal_state != 3) - { - return 0; - } - } - if (Goal.if_group_is_active) - { - te = find(world, classname, "info_tfgoal"); - while (te) - { - if (te.group_no == Goal.if_group_is_active) - { - if (te.goal_state != 1) - { - return 0; - } - } - te = find(te, classname, "info_tfgoal"); - } - } - if (Goal.if_group_is_inactive) - { - te = find(world, classname, "info_tfgoal"); - while (te) - { - if (te.group_no == Goal.if_group_is_inactive) - { - if (te.goal_state != 2) - { - return 0; - } - } - te = find(te, classname, "info_tfgoal"); - } - } - if (Goal.if_group_is_removed) - { - te = find(world, classname, "info_tfgoal"); - while (te) - { - if (te.group_no == Goal.if_group_is_removed) - { - if (te.goal_state != 3) - { - return 0; - } - } - te = find(te, classname, "info_tfgoal"); - } - } - if (Goal.if_item_has_moved) - { - te = Finditem(Goal.if_item_has_moved); - if (te) - { - if (te.goal_state != 1 && te.origin == te.oldorigin) - { - return 0; - } - } - } - if (Goal.if_item_hasnt_moved) - { - te = Finditem(Goal.if_item_hasnt_moved); - if (te) - { - if (te.goal_state == 1 || te.origin != te.oldorigin) - { - return 0; - } - } - } - if (AP != world) - { - gotone = 0; - if (Goal.has_item_from_group) - { - te = find(world, classname, "item_tfgoal"); - while (te != world && !gotone) - { - if (te.group_no == Goal.has_item_from_group && te.owner == AP) - { - gotone = 1; - } - te = find(te, classname, "item_tfgoal"); - } - if (!gotone) - { - return 0; - } - } - } - return 1; -}; - -void(entity Goal) SetupRespawn = -{ - if (Goal.search_time != 0) - { - InactivateGoal(Goal); - Goal.think = tfgoal_timer_tick; - Goal.nextthink = time + Goal.search_time; - return; - } - if (Goal.goal_result & 1) - { - RemoveGoal(Goal); - return; - } - if (Goal.wait > 0) - { - Goal.nextthink = time + Goal.wait; - Goal.think = DoRespawn; - return; - } - else - { - if (Goal.wait == -1) - { - return; - } - } - InactivateGoal(Goal); -}; - -void() DoRespawn = -{ - RestoreGoal(self); - InactivateGoal(self); -}; - -float(entity Goal, entity AP) Activated = -{ - local float APMet; - local float RevAct; - local float Act; - if (Goal.goal_state == 1) - { - return 0; - } - if (Goal.goal_state == 3) - { - return 0; - } - if (Goal.goal_state == 4) - { - return 0; - } - APMet = APMeetsCriteria(Goal, AP); - if (Goal.classname == "item_tfgoal") - { - RevAct = Goal.goal_activation & 64; - } - else - { - RevAct = Goal.goal_activation & 4; - } - Act = 0; - if (APMet) - { - if (!RevAct) - { - Act = 1; - } - } - else - { - if (RevAct) - { - Act = 1; - } - } - return Act; -}; - -void(entity Goal, entity AP) DoGoalWork = -{ - local entity te; - local entity RI; - if (Goal.activate_goal_no != 0) - { - te = Findgoal(Goal.activate_goal_no); - if (te) - { - AttemptToActivate(te, AP, Goal); - } - } - if (Goal.inactivate_goal_no != 0) - { - te = Findgoal(Goal.inactivate_goal_no); - if (te) - { - InactivateGoal(te); - } - } - if (Goal.restore_goal_no != 0) - { - te = Findgoal(Goal.restore_goal_no); - if (te) - { - RestoreGoal(te); - } - } - if (Goal.remove_goal_no != 0) - { - te = Findgoal(Goal.remove_goal_no); - if (te) - { - RemoveGoal(te); - } - } - if (Goal.return_item_no != 0) - { - te = Finditem(Goal.return_item_no); - if (te) - { - if (te.goal_state == 1) - { - tfgoalitem_RemoveFromPlayer(te, te.owner, 1); - } - RI = spawn(); - RI.enemy = te; - RI.think = ReturnItem; - RI.nextthink = time + 0.1; - te.solid = 0; - } - } - if (Goal.remove_spawnpoint != 0) - { - te = Findteamspawn(Goal.remove_spawnpoint); - if (te) - { - te.goal_state = 3; - te.team_str_home = string_null; - } - } - if (Goal.restore_spawnpoint != 0) - { - te = Findteamspawn(Goal.restore_spawnpoint); - if (te) - { - if (te.goal_state == 3) - { - te.goal_state = 2; - if (te.team_no == 1) - { - te.team_str_home = "ts1"; - } - else - { - if (te.team_no == 2) - { - te.team_str_home = "ts2"; - } - else - { - if (te.team_no == 3) - { - te.team_str_home = "ts3"; - } - else - { - if (te.team_no == 4) - { - te.team_str_home = "ts4"; - } - } - } - } - } - } - } -}; - -void(entity Goal, entity AP) DoGroupWork = -{ - local string st; - local entity tg; - local float allset; - if (Goal.all_active != 0) - { - if (Goal.last_impulse == 0) - { - dprint("Goal "); - st = ftos(Goal.goal_no); - dprint(st); - dprint(" has a .all_active specified, but no .last_impulse\n"); - } - else - { - allset = 1; - tg = find(world, classname, "info_tfgoal"); - while (tg) - { - if (tg.group_no == Goal.all_active) - { - if (tg.goal_state != 1) - { - allset = 0; - } - } - tg = find(tg, classname, "info_tfgoal"); - } - if (allset) - { - tg = Findgoal(Goal.last_impulse); - if (tg) - { - DoResults(tg, AP, Goal.goal_result & 2); - } - } - } - } - if (Goal.activate_group_no != 0) - { - tg = find(world, classname, "info_tfgoal"); - while (tg) - { - if (tg.group_no == Goal.activate_group_no) - { - DoResults(tg, AP, 0); - } - tg = find(tg, classname, "info_tfgoal"); - } - } - if (Goal.inactivate_group_no != 0) - { - tg = find(world, classname, "info_tfgoal"); - while (tg) - { - if (tg.group_no == Goal.inactivate_group_no) - { - InactivateGoal(tg); - } - tg = find(tg, classname, "info_tfgoal"); - } - } - if (Goal.remove_group_no != 0) - { - tg = find(world, classname, "info_tfgoal"); - while (tg) - { - if (tg.group_no == Goal.remove_group_no) - { - RemoveGoal(tg); - } - tg = find(tg, classname, "info_tfgoal"); - } - } - if (Goal.restore_group_no != 0) - { - tg = find(world, classname, "info_tfgoal"); - while (tg) - { - if (tg.group_no == Goal.restore_group_no) - { - RestoreGoal(tg); - } - tg = find(tg, classname, "info_tfgoal"); - } - } - if (Goal.remove_spawngroup != 0) - { - tg = find(world, classname, "info_player_teamspawn"); - while (tg) - { - if (tg.group_no == Goal.remove_spawngroup) - { - tg.goal_state = 3; - tg.team_str_home = string_null; - } - tg = find(tg, classname, "info_player_teamspawn"); - } - } - if (Goal.restore_spawngroup != 0) - { - tg = find(world, classname, "info_player_teamspawn"); - while (tg) - { - if (tg.group_no == Goal.restore_spawngroup) - { - tg.goal_state = 2; - if (tg.team_no == 1) - { - tg.team_str_home = "ts1"; - } - else - { - if (tg.team_no == 2) - { - tg.team_str_home = "ts2"; - } - else - { - if (tg.team_no == 3) - { - tg.team_str_home = "ts3"; - } - else - { - if (tg.team_no == 4) - { - tg.team_str_home = "ts4"; - } - } - } - } - } - tg = find(tg, classname, "info_player_teamspawn"); - } - } -}; - -void(entity Item, entity AP) DoItemGroupWork = -{ - local entity tg; - local entity carrier; - local float allcarried; - local string st; - allcarried = 1; - if (Item.distance != 0) - { - if (Item.pain_finished == 0) - { - dprint("GoalItem "); - st = ftos(Item.goal_no); - dprint(st); - dprint(" has a .distance specified, but no .pain_finished\n"); - } - tg = find(world, classname, "item_tfgoal"); - while (tg) - { - if (tg.group_no == Item.distance) - { - if (tg.goal_state != 1) - { - allcarried = 0; - } - } - tg = find(tg, classname, "item_tfgoal"); - } - if (allcarried == 1) - { - tg = Findgoal(Item.pain_finished); - if (tg) - { - DoResults(tg, AP, Item.goal_result & 2); - } - } - } - allcarried = 1; - if (Item.speed != 0) - { - if (Item.attack_finished == 0) - { - dprint("GoalItem "); - st = ftos(Item.goal_no); - dprint(st); - dprint(" has a .speed specified, but no .attack_finished\n"); - } - carrier = world; - tg = find(world, classname, "item_tfgoal"); - while (tg) - { - if (tg.group_no == Item.speed) - { - if (tg.goal_state != 1) - { - allcarried = 0; - } - else - { - if (carrier == world) - { - carrier = tg.owner; - } - else - { - if (carrier != tg.owner) - { - allcarried = 0; - } - } - } - } - tg = find(tg, classname, "item_tfgoal"); - } - if (allcarried == 1) - { - tg = Findgoal(Item.attack_finished); - if (tg) - { - DoResults(tg, AP, Item.goal_result & 2); - } - } - } -}; - -void(entity Goal, entity AP) DoTriggerWork = -{ - local entity t; - if (Goal.killtarget) - { - t = world; - do - { - t = find(t, targetname, Goal.killtarget); - if (t != world) - { - remove(t); - } - } while (t != world); - } - if (Goal.target) - { - t = world; - activator = AP; - do - { - t = find(t, targetname, Goal.target); - if (t == world) - { - return; - } - stemp = self; - otemp = other; - self = t; - other = stemp; - if (self.use != SUB_Null) - { - if (self.use) - { - self.use(); - } - } - self = stemp; - other = otemp; - activator = AP; - } while (t != world); - } -}; - -void() DelayedResult = -{ - if (self.enemy.goal_state == 4) - { - DoResults(self.enemy, self.owner, self.weapon); - } - dremove(self); -}; - -void(entity Goal, entity AP, float addb) DoResults = -{ - local entity te; - - local float winners; - - if (Goal.goal_state == 1) - { - return; - } - if (Goal.delay_time > 0 && Goal.goal_state != 4) - { - Goal.goal_state = 4; - te = spawn(); - te.think = DelayedResult; - te.nextthink = time + Goal.delay_time; - te.owner = AP; - te.enemy = Goal; - te.weapon = addb; - return; - } - UpdateAbbreviations(Goal); - Goal.goal_state = 2; - if (Goal.noise) - { - if (Goal.volume == 1) - { - sound(other, 3, Goal.noise, 1, 0); - } - else - { - sound(other, 3, Goal.noise, 1, 1); - } - } - winners = 0; - if (Goal.increase_team1 != 0) - { - TeamFortress_TeamIncreaseScore(1, Goal.increase_team1); - winners = 1; - } - if (Goal.increase_team2 != 0) - { - TeamFortress_TeamIncreaseScore(2, Goal.increase_team2); - winners = 1; - } - if (Goal.increase_team3 != 0) - { - TeamFortress_TeamIncreaseScore(3, Goal.increase_team3); - winners = 1; - } - if (Goal.increase_team4 != 0) - { - TeamFortress_TeamIncreaseScore(4, Goal.increase_team4); - winners = 1; - } - if (winners == 1) - { - TeamFortress_TeamShowScores(2); - } - te = find(world, classname, "player"); - while (te != world) - { - if (Goal.broadcast != string_null && CTF_Map == 0) - { - CenterPrint2(te, "\n\n\n", Goal.broadcast); - } - if (Goal.netname_broadcast != string_null && CTF_Map == 0) - { - sprint(te,AP.netname); - sprint(te,Goal.netname_broadcast); - } - if (AP == te) - { - if (Goal.message != string_null) - { - CenterPrint2(te, Goal.message, AP.netname); - } - } - else - { - if (AP.team_no == te.team_no) - { - if (Goal.owners_team_broadcast != string_null && te.team_no == Goal.owned_by) - { - CenterPrint2(te, Goal.owners_team_broadcast, AP.netname); - } - else - { - if (Goal.team_broadcast != string_null) - { - CenterPrint2(te, Goal.team_broadcast, AP.netname); - } - } - if (Goal.netname_owners_team_broadcast != string_null && te.team_no == Goal.owned_by) - { - sprint(te,AP.netname); - sprint(te,Goal.netname_owners_team_broadcast); - } - else - { - if (Goal.netname_team_broadcast != string_null) - { - sprint(te,AP.netname); - sprint(te,Goal.netname_team_broadcast); - } - } - } - else - { - if (Goal.owners_team_broadcast != string_null && te.team_no == Goal.owned_by) - { - CenterPrint2(te, Goal.owners_team_broadcast, AP.netname); - } - else - { - if (Goal.non_team_broadcast != string_null) - { - CenterPrint2(te, Goal.non_team_broadcast, AP.netname); - } - } - if (Goal.netname_owners_team_broadcast != string_null && te.team_no == Goal.owned_by) - { - sprint(te,AP.netname); - sprint(te,Goal.netname_owners_team_broadcast); - } - else - { - if (Goal.netname_non_team_broadcast != string_null) - { - sprint(te,AP.netname); - sprint(te,Goal.netname_non_team_broadcast); - } - } - } - } - if (IsAffectedBy(Goal, te, AP)) - { - if (Goal.search_time != 0 && (Goal.goal_effects & 64)) - { - if (APMeetsCriteria(Goal, te)) - { - Apply_Results(Goal, te, AP, addb); - } - } - else - { - Apply_Results(Goal, te, AP, addb); - } - } - te = find(te, classname, "player"); - } - if (Goal.classname != "item_tfgoal") - { - Goal.goal_state = 1; - } - if (Goal.goal_result & 4) - { - TeamFortress_TeamShowScores(1); - winners = TeamFortress_TeamGetWinner(); - te = find(world, classname, "player"); - while (te) - { - te.takedamage = 0; - te.movetype = 0; - te.velocity = '0 0 0'; - te.avelocity = '0 0 0'; - te = find(te, classname, "player"); - } - te = spawn(); - te.nextthink = time + 5; - te.think = execute_changelevel; -// te.think = changelevel; // Wazat -- may need fixing - dremove(Goal); - return; - } - - DoGroupWork(Goal, AP); - DoGoalWork(Goal, AP); - DoTriggerWork(Goal, AP); - if (Goal.classname == "info_tfgoal") - { - SetupRespawn(Goal); - } -}; - -void() tfgoal_touch = -{ - if (self.give != "") - ParseGive(self); - if (!(self.goal_activation & 1)) - { - return; - } - if (other.classname != "player") - { - return; - } - if (other.is_dead == 1) // TEMP - { - return; - } - if (self.goal_state == 1) - { - return; - } - AttemptToActivate(self, other, self); -}; - -void() info_tfgoal_use = -{ - AttemptToActivate(self, activator, self); -}; - -void() tfgoal_timer_tick = -{ - if (self.goal_state != 3) - { - if (APMeetsCriteria(self, world)) - { - DoResults(self, world, 1); - } - else - { - InactivateGoal(self); - self.think = tfgoal_timer_tick; - self.nextthink = time + self.search_time; - } - } -}; - -void() item_tfgoal_touch = -{ - local entity te; - if (other.is_dead == 1) // TEMP - { - return; - } - if (other.classname != "player") - { - return; - } - if (other.health <= 0) - { - return; - } - // for flag dropping - if ( (self.tent == other) && (time < self.option5) ) - { - return; - } - if (Activated(self, other)) - { - tfgoalitem_GiveToPlayer(self, other, self); - self.goal_state = 1; - } - else - { - if (self.else_goal != 0) - { - te = Findgoal(self.else_goal); - if (te) - { - AttemptToActivate(te, other, self); - } - } - } -}; - -void(entity Item, entity AP, entity Goal) tfgoalitem_GiveToPlayer = -{ - Item.owner = AP; - if (Item.mdl != string_null) - { - setmodel(Item, string_null); - } - Item.solid = 0; - if (Item.goal_activation & 1) - { - AP.effects = AP.effects | 8; - } - if (Item.goal_activation & 2) - { - TeamFortress_SetSpeed(AP); - } - if (Item.goal_activation & 512) - { - Item.effects = Item.effects - (Item.effects | 8); - } -// NexTF Flags - if (Item.items & 133701) - { - AP.items = AP.items | 262144; - if (Item.team_no == 1) - AP.effects = AP.effects | EF_BLUE; - else if (Item.team_no == 2) - AP.effects = AP.effects | EF_RED; - newmis = spawn(); - newmis.owner = AP; - newmis.movetype = 4; - newmis.solid = 0; - setsize(newmis, '0 0 0', '0 0 0'); - newmis.angles = AP.angles; - newmis.nextthink = time + 0.5; - newmis.think = MoveFlag; - newmis.skin = 2; - setmodel(newmis, Item.mdl); - setorigin(newmis, AP.origin); - //eprint(AP); - } - else - { - if (Item.items & 131072) - { - AP.items = AP.items | 131072; - AP.effects = AP.effects | 64; - newmis = spawn(); - newmis.owner = AP; - newmis.movetype = 4; - newmis.solid = 0; - setsize(newmis, '0 0 0', '0 0 0'); - newmis.angles = AP.angles; - newmis.nextthink = time + 0.5; - newmis.think = MoveFlag; - newmis.skin = 1; - setmodel(newmis, "progs/tf_flag.mdl"); - setorigin(newmis, AP.origin); - } - if (Item.items & 262144) - { - AP.items = AP.items | 262144; - AP.effects = AP.effects | 128; - newmis = spawn(); - newmis.owner = AP; - newmis.movetype = 4; - newmis.solid = 0; - setsize(newmis, '0 0 0', '0 0 0'); - newmis.angles = AP.angles; - newmis.nextthink = time + 0.5; - newmis.think = MoveFlag; - newmis.skin = 2; - setmodel(newmis, "progs/tf_flag.mdl"); - setorigin(newmis, AP.origin); - } - } - if (Goal != Item) - { - if (Goal.goal_result & 8) - { - Item.goal_state = 1; - return; - } - } -/* if (AP.playerclass == 8 && (Item.goal_result & 16)) - { - AP.is_unabletospy = 1; - }*/ - if (AP.class == CLASS_SPY && (Item.goal_result & 16)) - { - AP.is_unabletospy = 1; - } - DoResults(Item, AP, 1); - DoItemGroupWork(Item, AP); -}; - -void() ReturnItem = -{ - self.enemy.goal_state = 2; - self.enemy.solid = 1; - self.enemy.movetype = 0; - self.enemy.touch = item_tfgoal_touch; - self.enemy.origin = self.enemy.oldorigin; - if (self.enemy.mdl != string_null) - { - setmodel(self.enemy, self.enemy.mdl); - } - setorigin(self.enemy, self.enemy.origin); - //sound(self.enemy,"items/itembk2.wav", 1, 1); - sound (self.enemy, 2, "items/itembk2.wav", 1, 1); - tfgoalitem_checkgoalreturn(self.enemy); - dremove(self); -}; - -void (entity Item, entity AP, float method) tfgoalitem_RemoveFromPlayer = -{ - local entity te; - local float lighton; - local float slowon; - local float key1on; - local float key2on; - local float spyoff; - local entity DelayReturn; - - if ((Item == world)) - { - objerror ("error: tfgoalitem_RemoveFromPlayer(): Item == world"); - return; - } - lighton = 0; - slowon = 0; - key1on = 0; - key2on = 0; - spyoff = 0; - te = find (world, classname, "item_tfgoal"); - while (te) - { - if (((te.owner == AP) && (te != Item))) - { - if ((te.goal_activation & 1)) - { - lighton = 1; - } - if ((te.goal_activation & 2)) - { - slowon = 1; - } - if ((te.items & 131072)) - { - key1on = 1; - } - if ((te.items & 262144)) - { - key2on = 1; - } - if ((te.goal_result & 16)) - { - spyoff = 1; - } - } - te = find (te, classname, "item_tfgoal"); - } - if (!lighton) - { - if ((AP.invincible_finished > (time + 3))) - { - lighton = 1; - } - else - { - if ((AP.super_damage_finished > (time + 3))) - { - lighton = 1; - } - } - } - if (!lighton) - { - AP.effects = (AP.effects - (AP.effects & 8)); - AP.effects = (AP.effects - (AP.effects & 64)); - AP.effects = (AP.effects - (AP.effects & 128)); - } - if ((Item.goal_activation & 512)) - { - Item.effects = (Item.effects | 8); - } - if (!spyoff) - { - AP.is_unabletospy = 0; - } - if (!key1on) - { - AP.items = (AP.items - (AP.items & 131072)); - } - if (!key2on) - { - AP.items = (AP.items - (AP.items & 262144)); - } - te = find (world, classname, "player"); - while ((te != world)) - { - if (IsAffectedBy (Item, te, AP)) - { - RemoveResults (Item, te); - } - te = find (te, classname, "player"); - } - if (((method == 0) || (method == 2))) - { - te = find (world, classname, "player"); - while ((te != world)) - { - if ((te.team_no == Item.owned_by)) - { - if ((Item.team_drop != string_null)) - { - CenterPrint2 (te, "\n\n\n", Item.team_drop); - } - if ((Item.netname_team_drop != string_null)) - { - sprint (te, AP.netname); - sprint (te, Item.netname_team_drop); - } - } - else - { - if ((Item.non_team_drop != string_null)) - { - CenterPrint2 (te, "\n\n\n", Item.non_team_drop); - } - if ((Item.netname_non_team_drop != string_null)) - { - sprint (te, AP.netname); - sprint (te, Item.netname_non_team_drop); - } - } - te = find (te, classname, "player"); - } - if ((Item.goal_activation & 8)) - { - DelayReturn = spawn (); - DelayReturn.enemy = Item; - if ((method == 0)) - { - DelayReturn.weapon = 0; - } - else - { - DelayReturn.weapon = 1; - } - DelayReturn.think = ReturnItem; - DelayReturn.nextthink = (time + 0.5); - } - else - { - if ((Item.goal_activation & 4)) - { - if (((method == 2) && (Item.goal_activation & 4096))) - { - tfgoalitem_drop (Item/*, 1, AP*/); - } - else - { - tfgoalitem_drop (Item/*, 0, AP*/); - } - } - else - { - Item.owner = world; - dremove (Item); - TeamFortress_SetSpeed (AP); - return; - } - } - Item.owner = world; - Item.flags = (Item.flags - (Item.flags & 512)); - setsize (Item, Item.goal_min, Item.goal_max); - TeamFortress_SetSpeed (AP); - return; - } - else - { - if (method == 1) - { - if (Item.goal_activation & 16) - { - DelayReturn = spawn(); - DelayReturn.enemy = Item; - DelayReturn.think = ReturnItem; - DelayReturn.nextthink = time + 0.5; - Item.owner = world; - TeamFortress_SetSpeed(AP); - return; - } - Item.solid = 0; - Item.owner = world; - TeamFortress_SetSpeed(AP); - return; - } - } - objerror ("Invalid method passed into tfgoalitem_RemoveFromPlayer\n"); -}; - -// MTF's remove from player function -/*void(entity Item, entity AP, float method) tfgoalitem_RemoveFromPlayer = -{ - local entity te; - local float lighton; - local float slowon; - local float key1on; - local float key2on; - local float spyoff; - local string db1; - local entity DelayReturn; - if (Item == world) - { - dprint("error: tfgoalitem_RemoveFromPlayer(): Item == world"); - return; - } - lighton = 0; - slowon = 0; - key1on = 0; - key2on = 0; - spyoff = 0; - te = find(world, classname, "item_tfgoal"); - while (te) - { - if (te.owner == AP && te != Item) - { - if (te.goal_activation & 1) - { - lighton = 1; - } - if (te.goal_activation & 2) - { - slowon = 1; - } - if (te.items & 131072) - { - key1on = 1; - } - if (te.items & 262144) - { - key2on = 1; - } - if (te.goal_result & 16) - { - spyoff = 1; - } - } - te = find(te, classname, "item_tfgoal"); - } - if (!lighton) - { - if (AP.invincible_finished > time + 3) - { - lighton = 1; - } - } - if (!lighton) - { - AP.effects = AP.effects - (AP.effects & 8); - } - if (Item.goal_activation & 512) - { - Item.effects = Item.effects | 8; - } - if (!spyoff) - { - AP.is_unabletospy = 0; - } - if (!key1on) - { - AP.items = AP.items - (AP.items & 131072); - } - if (!key2on) - { - AP.items = AP.items - (AP.items & 262144); - } - te = find(world, classname, "player"); - while (te != world) - { - if (IsAffectedBy(Item, te, AP)) - { - RemoveResults(Item, te); - } - te = find(te, classname, "player"); - } - if ((method == 0) || (method == 2)) - { - te = find(world, classname, "player"); - while (te != world) - { - if (te.team_no == Item.owned_by) - { - if (Item.team_drop != string_null) - { - CenterPrint2(te, "\n\n\n", Item.team_drop); - } - if (Item.netname_team_drop != string_null) - { - sprint(te,AP.netname); - sprint(te,Item.netname_team_drop); - } - } - else - { - if (Item.non_team_drop != string_null) - { - CenterPrint2(te, "\n\n\n", Item.non_team_drop); - } - if (Item.netname_non_team_drop != string_null) - { - sprint(te,AP.netname); - sprint(te,Item.netname_non_team_drop); - } - } - te = find(te, classname, "player"); - } - if (Item.goal_activation & 8) - { - DelayReturn = spawn(); - DelayReturn.enemy = Item; - DelayReturn.think = ReturnItem; - DelayReturn.nextthink = time + 0.5; - } - else - { - if (Item.goal_activation & 4) - { - if (method == 0) - tfgoalitem_drop(Item); - } - else - { - Item.owner = world; - dremove(Item); - TeamFortress_SetSpeed(AP); - return; - } - } - Item.owner = world; - TeamFortress_SetSpeed(AP); - return; - } - if (method == 1) - { - if (Item.goal_activation & 16) - { - DelayReturn = spawn(); - DelayReturn.enemy = Item; - DelayReturn.think = ReturnItem; - DelayReturn.nextthink = time + 0.5; - Item.owner = world; - TeamFortress_SetSpeed(AP); - return; - } - Item.solid = 0; - Item.owner = world; - TeamFortress_SetSpeed(AP); - return; - } - - dprint("Invalid method passed into tfgoalitem_RemoveFromPlayer\n"); -};*/ - -void() tfgoalitem_dropthink = -{ - local float pos; - self.movetype = 10; //6; - if (self.pausetime != 0) - { - pos = pointcontents(self.origin); - if (pos == -4) - { - self.nextthink = time + self.pausetime / 4; - } - else - { - if (pos == -5) - { - self.nextthink = time + 5; - } - else - { - if (pos == -2 || pos == -6) - { - self.nextthink = time + 2; - } - else - { - self.nextthink = time + self.pausetime; - } - } - } - self.think = tfgoalitem_remove; - } -}; - -void(entity Item) tfgoalitem_drop = -{ - Item.origin = Item.owner.origin - '0 0 8'; - //Item.velocity_z = 400; - //Item.velocity_x = -50 + random() * 100; - //Item.velocity_y = -50 + random() * 100; - Item.velocity_z = 1; - Item.velocity_x = 0; - Item.velocity_y = 0; - Item.goal_state = 2; - Item.movetype = 6; - Item.solid = 1; - Item.touch = item_tfgoal_touch; - setorigin(Item, Item.origin - '0 0 16'); - setsize(Item, '-16 -16 0', '16 16 56'); - if (Item.mdl != string_null) - { - setmodel(Item, Item.mdl); - } - Item.nextthink = time + 5; - Item.think = tfgoalitem_dropthink; -}; - -void() tfgoalitem_remove = -{ - local entity te; - if (self.goal_state == 1) - { - return; - } - if (self.goal_activation & 32) - { - self.solid = 1; - self.touch = item_tfgoal_touch; - self.origin = self.oldorigin; - if (self.mdl != string_null) - { - setmodel(self, self.mdl); - } - setorigin(self, self.origin); - //sound(self,"items/itembk2.wav", 1, 1); - tfgoalitem_checkgoalreturn(self); - if (self.noise3 != string_null || self.noise4 != string_null) - { - te = find(world, classname, "player"); - while (te) - { - if (te.team_no == self.owned_by) - { - CenterPrint2(te, "\n\n\n", self.noise3); - } - else - { - CenterPrint2(te, "\n\n\n", self.noise4); - } - te = find(te, classname, "player"); - } - } - return; - } - dremove(self); -}; - -void(entity Item) tfgoalitem_checkgoalreturn = -{ - local entity te; - if (Item.impulse != 0) - { - te = Findgoal(Item.impulse); - if (te) - { - te = Findgoal(Item.impulse); - if (te) - { - AttemptToActivate(te, world, Item); - } - } - } -}; - -void(entity Goal, entity Player, entity Item) DisplayItemStatus = -{ - if (Item.goal_state == 1) - { - if (Player.team_no == Item.owned_by) - { - sprint(Player,Goal.team_str_carried); - } - else - { - sprint(Player,Goal.non_team_str_carried); - } - sprint(Player," "); - if (Player == Item.owner) - { - sprint(Player," You"); - } - else - { - sprint(Player,Item.owner.netname); - } - sprint(Player,"."); - } - else - { - if (Item.origin != Item.oldorigin) - { - if (Player.team_no == Item.owned_by) - { - sprint(Player,Goal.team_str_moved); - } - else - { - sprint(Player,Goal.non_team_str_moved); - } - } - else - { - if (Player.team_no == Item.owned_by) - { - sprint(Player,Goal.team_str_home); - } - else - { - sprint(Player,Goal.non_team_str_home); - } - } - } - sprint(Player,"\n"); -}; - -void() info_player_team1 = -{ - CTF_Map = 1; - self.classname = "info_player_teamspawn"; - self.team_no = 2; - self.goal_effects = 1; - self.team_str_home = "ts2"; -}; - -void() info_player_team2 = -{ - CTF_Map = 1; - self.classname = "info_player_teamspawn"; - self.team_no = 1; - self.goal_effects = 1; - self.team_str_home = "ts1"; -}; - -void() info_player_team3 = -{ - CTF_Map = 1; - self.classname = "info_player_teamspawn"; - self.team_no = 3; - self.goal_effects = 1; - self.team_str_home = "ts3"; -}; - -void() info_player_team4 = -{ - CTF_Map = 1; - self.classname = "info_player_teamspawn"; - self.team_no = 4; - self.goal_effects = 1; - self.team_str_home = "ts4"; -}; - -void () item_ctf_flag; // Team:Nexuiz CTF flag -void () item_ctf_goal; // Team:Nexuiz CTF goal -void() item_flag_team2 = -{ - team2maxplayers = 4; //TEMP - number_of_teams = 2; - - CTF_Map = 1; - - local entity egl; - egl = spawn(); - setorigin(egl, self.origin); - egl.allowteams = "red"; - egl.think = item_ctf_goal; - egl.nextthink = time + 0.2; - - self.allowteams = "red"; - self.model = "models/flags/b_flag.md3"; - item_ctf_flag(); -/* - local entity dp; - precache_model("progs/w_s_key.mdl"); - precache_sound("ogre/ogwake.wav"); - precache_sound("boss2/pop2.wav"); - self.classname = "item_tfgoal"; - self.netname = "Team 1 Flag"; - self.broadcast = " ÇÏÔ the enemy team's flag!\n"; - self.deathtype = "You've got the enemy flag!\n"; - self.noise = "ogre/ogwake.wav"; - self.mdl = "progs/tf_flag.mdl"; - self.skin = 0; - setmodel(self, self.mdl); - self.goal_no = 1; - self.goal_activation = 1 | 4 | 128 | 32 | 16 | 512; - self.goal_effects = 1; - self.pausetime = 128; - setsize(self, '-16 -16 -24', '16 16 32'); - self.touch = item_tfgoal_touch; - self.goal_state = 2; - self.solid = 1; - setorigin(self, self.origin); - self.nextthink = time + 0.2; - self.think = TF_PlaceItem; - dp = spawn(); - dp.origin = self.origin; - dp.classname = "info_tfgoal"; - dp.goal_activation = 1; - dp.team_no = 1; - dp.items_allowed = 2; - dp.goal_no = 3; - dp.goal_effects = 3; - dp.broadcast = " ÃÁÐÔÕÒÅÄ the enemy flag!\n"; - dp.message = "You ÃÁÐÔÕÒÅÄ the enemy flag!\n"; - dp.noise = "boss2/pop2.wav"; - dp.goal_result = 2; - dp.activate_goal_no = 5; - dp.axhitme = 2; - dp.count = 10; - dp.frags = 10; - dp.solid = 1; - dp.goal_state = 2; - setsize(dp, '-16 -16 -24', '16 16 32'); - dp.nextthink = time + 0.2; - dp.think = TF_PlaceGoal; - dp = spawn(); - dp.origin = dp.origin; - dp.classname = "info_tfgoal"; - dp.goal_effects = 1; - dp.frags = 5; - dp.goal_activation = 0; - dp.goal_no = 5; - dp.solid = 0; - dp.goal_state = 2; - setsize(dp, '-16 -16 -24', '16 16 32'); - dp.nextthink = time + 0.2; - dp.think = TF_PlaceGoal;*/ -}; - -void() item_flag_team1 = -{ - team1maxplayers = 4; //TEMP - CTF_Map = 1; - - local entity egl; - egl = spawn(); - setorigin(egl, self.origin); - egl.allowteams = "blue"; - egl.think = item_ctf_goal; - egl.nextthink = time + 0.2; - - self.model = "models/flags/r_flag.md3"; - self.allowteams = "blue"; - item_ctf_flag(); -/* - precache_model("progs/tf_flag.mdl"); - precache_sound("ogre/ogwake.wav"); - precache_sound("boss2/pop2.wav"); - self.classname = "item_tfgoal"; - self.netname = "Team 2 Flag"; - self.broadcast = " ÇÏÔ the enemy team's flag!\n"; - self.deathtype = "You've got the enemy flag!\n"; - self.noise = "ogre/ogwake.wav"; - self.mdl = "progs/tf_flag.mdl"; - setmodel(self, self.mdl); - self.skin = 1; - self.goal_no = 2; - self.goal_activation = 1 | 4 | 128 | 32 | 16 | 512; - self.goal_effects = 1; - self.pausetime = 128; - setsize(self, '-16 -16 -24', '16 16 32'); - self.touch = item_tfgoal_touch; - self.goal_state = 2; - self.solid = 1; - setorigin(self, self.origin); - self.nextthink = time + 0.2; - self.think = TF_PlaceItem; - dp = spawn(); - dp.origin = self.origin; - dp.classname = "info_tfgoal"; - dp.goal_activation = 1; - dp.team_no = 2; - dp.items_allowed = 1; - dp.goal_no = 4; - dp.goal_effects = 3; - dp.broadcast = " ÃÁÐÔÕÒÅÄ the enemy flag!\n"; - dp.message = "You ÃÁÐÔÕÒÅÄ the enemy flag!\n"; - dp.noise = "boss2/pop2.wav"; - dp.goal_result = 2; - dp.activate_goal_no = 6; - dp.axhitme = 1; - dp.count = 10; - dp.frags = 10; - dp.solid = 1; - dp.goal_state = 2; - setsize(dp, '-16 -16 -24', '16 16 32'); - dp.nextthink = time + 0.2; - dp.think = TF_PlaceGoal; - dp = spawn(); - dp.origin = dp.origin; - dp.classname = "info_tfgoal"; - dp.goal_effects = 1; - dp.frags = 5; - dp.goal_activation = 0; - dp.goal_no = 6; - dp.solid = 0; - dp.goal_state = 2; - setsize(dp, '-16 -16 -24', '16 16 32'); - dp.nextthink = time + 0.2; - dp.think = TF_PlaceGoal;*/ -}; - -void() CTF_FlagCheck = -{ - local entity te; - local float flagcount; - local float pos; - flagcount = 0; - te = find(world, classname, "item_tfgoal"); - while (te != world) - { - if (te.goal_no == 1) - { - pos = pointcontents(te.origin); - if (pos == -2 || pos == -6) - { - dprint("*****BUG*****\nFlag(s) outside world.\nPlease report this.\n"); - te.nextthink = time + 0.2; - te.think = tfgoalitem_remove; - } - flagcount = flagcount + 1; - } - else - { - if (te.goal_no == 2) - { - pos = pointcontents(te.origin); - if (pos == -2 || pos == -6) - { - dprint("*****BUG*****\nFlag(s) outside world.\nPlease report this.\n"); - te.nextthink = time + 0.2; - te.think = tfgoalitem_remove; - } - flagcount = flagcount + 1; - } - } - te = find(te, classname, "item_tfgoal"); - } - if (flagcount != 2) - { - dprint("*****BUG*****\nFlag(s) missing.\nPlease report this.\n"); - } - self.nextthink = time + 30; -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/tfmenus.c b/attic/TeamNexuiz/game/gamec/tfmenus.c deleted file mode 100644 index 00457e523..000000000 --- a/attic/TeamNexuiz/game/gamec/tfmenus.c +++ /dev/null @@ -1,606 +0,0 @@ -/* - - */ - -//move to tfdefs: -.entity building; -.float ammo_metal; - -// Menus/Menu Input references -void () Menu_EngineerFix_Tesla; -void (float inp) Menu_EngineerFix_Tesla_Input; -void () Menu_Need_TeamNexuiz; -void () Menu_Engineer; -void () Menu_EngineerFix_Extractor; -void (float inp) Menu_EngineerFix_Extractor_Input; - -// Resets the menu -void() ResetMenu = -{ - if (self.StatusBarSize == TF_FLARE_LIT) - { - CenterPrint(self, "\n"); - } - else - { - self.StatusRefreshTime = time + 0.1; - } - self.menu_count = 25; - self.current_menu = TF_FLARE_OFF; -}; - -// This calls the function which displays the menu -void () Player_Menu = -{ - if ((self.menu_count > 25.000000)) - { - self.menu_count = 0.000000; - } - else - { - self.menu_count = (self.menu_count + 1.000000); - return; - } - if (self.current_menu == 666) - { - //Menu_Blah() - return; - } - else if ((self.current_menu == 18)) - { - Menu_EngineerFix_Tesla (); - } - else if (self.current_menu == MENU_NEED_TN) - { - Menu_Need_TeamNexuiz (); - } - else if (self.current_menu == MENU_ENGINEER_BUILD) - { - Menu_Engineer (); - } - else if (self.current_menu == MENU_EXTRACTOR) - { - Menu_EngineerFix_Extractor (); - } - - else - { - self.current_menu = TF_FLARE_LIT; - } -}; - -void(float menu_no) DisplayMenu = -{ - self.current_menu = menu_no; - if (menu_no == 2) - { - //Menu_Team(); // menu team & menu class are now handled by GUIs (see cl_client.c) - } - else - { - if (menu_no == 3) - { - //Menu_Class(); - } - } -}; - -// Menu input (user can press 0 - 9) -void(float inp) Menu_Input = -{ - if (self.current_menu == 18) - { - Menu_EngineerFix_Tesla_Input (inp); - } - if (self.current_menu == MENU_EXTRACTOR) - { - Menu_EngineerFix_Extractor_Input (inp); - } -}; - -// Tesla Menu -void () Menu_EngineerFix_Tesla = -{ - CenterPrint (self, "Tesla Modification Lab: ^16^7 Upgrades Max\n[^11^7] Upgrade Voltage - 1u\n[^12^7] Upgrade Amperage - 1u\n[^13^7] Upgrade Power Supply - 1u\n[^14^7] Make TeslaTurret(tm) - 2u\n[^15^7] Improved Targeting System - 2u\n[^16^7] Add Spy Detector - 4u\n[^17^7] Repair and Recharge \n[^18^7] Dismantle \n[^19^7] Îïôèéîç "); -}; - -void () Menu_Need_TeamNexuiz = -{ - CenterPrint(self, "^7Hello, welcome to a Team:Nexuiz server version ",TN_VERSION,"\n\n^5If you see this message it means that\n you do not have the Team:Nexuiz mod installed.\n\n^3To get the mod, please follow the instructions at:\nhttp://avirox.devretro.com/temp/teamnexuiz/TN_how_to.txt\n"); -} - -// Tesla Menu Input -void (float inp) Menu_EngineerFix_Tesla_Input = -{ - local float cost; - local float maxcells; - - if (((self.classname != "player") || (self.building == world))) - { - return; - } - - if ((inp == 1)) - { - if ((self.building.ammo_shells >= 3)) - { - sprint (self, "You can only upgrade voltage 3 times\n"); - } - else - { - if ((self.building.currentammo >= 6)) - { - sprint (self, "You can only have ˜ upgrades on the gun\n"); - } - else - { - if ((self.ammo_cells >= 100)) - { - self.ammo_cells = (self.ammo_cells - 100); - self.building.ammo_shells = (self.building.ammo_shells + 1); - self.building.waitmin = ((self.building.ammo_shells + 2) * (self.building.ammo_nails + 2)); - self.building.currentammo = (self.building.currentammo + 1); - } - else - { - sprint (self, "You need more cells to upgrade the tesla\n"); - } - } - } - } - if ((inp == 2)) - { - if ((self.building.ammo_nails >= 3)) - { - sprint (self, "You can only upgrade amperage 3 times\n"); - } - else - { - if ((self.building.currentammo >= 6)) - { - sprint (self, "You can only have ˜ upgrades on the gun\n"); - } - else - { - if ((self.ammo_cells >= 100)) - { - self.ammo_cells = (self.ammo_cells - 100); - self.building.ammo_nails = (self.building.ammo_nails + 1); - self.building.waitmin = ((self.building.ammo_shells + 2) * (self.building.ammo_nails + 2)); - self.building.currentammo = (self.building.currentammo + 1); - } - else - { - sprint (self, "You need more cells to upgrade the tesla\n"); - } - } - } - } - if ((inp == 3)) - { - if ((self.building.ammo_rockets >= 3)) - { - sprint (self, "You can only upgrade the capacitor 3 times\n"); - } - else - { - if ((self.building.currentammo >= 6)) - { - sprint (self, "You can only have ˜ upgrades on the gun\n"); - } - else - { - if ((self.ammo_cells >= 100)) - { - self.ammo_cells = (self.ammo_cells - 100); - self.building.ammo_rockets = (self.building.ammo_rockets + 1); - self.building.currentammo = (self.building.currentammo + 1); - if ((self.building.ammo_rockets == 1)) - { - self.building.max_health = (self.building.max_health + 100); - self.building.health = (self.building.health + 100); - self.building.ammo_cells = 120; - } - else - { - if ((self.building.ammo_rockets == 2)) - { - self.building.max_health = (self.building.max_health + 150); - self.building.health = (self.building.health + 150); - self.building.ammo_cells = 200; - } - else - { - if ((self.building.ammo_rockets == 3)) - { - self.building.max_health = (self.building.max_health + 150); - self.building.health = (self.building.health + 150); - self.building.ammo_cells = 300; - } - } - } - } - else - { - sprint (self, "You need more cells to upgrade the tesla\n"); - } - } - } - } - if ((inp == 4)) - { - if ((self.building.tf_items & 2)) - { - sprint (self, "It is already a turret!\n"); - } - else - { - if ((self.building.currentammo > (6 - 2))) - { - sprint (self, "This requires two upgrades, sorry\n"); - } - else - { - if ((self.ammo_cells >= (2 * 100))) - { - self.ammo_cells = (self.ammo_cells - (2 * 100)); - if ((self.ammo_cells < 0)) - { - self.ammo_cells = 0; - } - self.building.currentammo = (self.building.currentammo + 2); - if ((self.building.tf_items & 2)) - { - sprint (self, "Gun is already deployed\n"); - } - else - { - self.building.origin_z = (self.building.origin_z + 15); - if (0) - { - sprint (self, "You need a clear area to launch\n"); - self.building.origin_z = (self.building.origin_z - 15); - } - else - { - self.building.origin_z = (self.building.origin_z + 25); - sprint (self, "You turretize your tesla\n"); - self.has_turretized_tesla = 1; - self.building.angles_z = 180; - self.building.flags = (self.building.flags - (self.building.flags & 512)); - self.building.movetype = 5; - self.building.velocity_z = 200; - setsize (self.building, '-16.000000 -16.000000 -40.000000', '16.000000 16.000000 -10.000000'); - self.building.tf_items = (self.building.tf_items | 2); - } - } - } - else - { - sprint (self, "You need more cells to upgrade the tesla\n"); - } - } - } - } - if ((inp == 5)) - { - if ((self.building.tf_items & 1)) - { - sprint (self, "It already has an improved targeter\n"); - } - else - { - if ((self.building.currentammo > (6 - 2))) - { - sprint (self, "This requires two upgrades, hence the '2u'...\n"); - } - else - { - if ((self.ammo_cells >= (2 * 100))) - { - self.ammo_cells = (self.ammo_cells - (2 * 100)); - if ((self.ammo_cells < 0)) - { - self.ammo_cells = 0; - } - self.building.currentammo = (self.building.currentammo + 2); - self.building.tf_items = (self.building.tf_items | 1); - } - else - { - sprint (self, "You need more cells to upgrade the tesla\n"); - } - } - } - } - if ((inp == 6)) - { - if ((self.building.tf_items & 1024)) - { - sprint (self, "You already built a spy detector\n"); - } - else - { - if ((self.building.currentammo > (6 - 4))) - { - sprint (self, "Spy detector takes 4 upgrades\n"); - } - else - { - if ((self.ammo_cells >= (2 * 100))) - { - self.ammo_cells = (self.ammo_cells - (4 * 100)); - if ((self.ammo_cells < 0)) - { - self.ammo_cells = 0; - } - self.building.currentammo = (self.building.currentammo + 4); - self.building.tf_items = (self.building.tf_items | 1024); - } - else - { - sprint (self, "You need more cells to upgrade the tesla\n"); - } - } - } - } - if ((inp == 7)) - { - if ((self.building.health < self.building.max_health)) - { - cost = (self.building.max_health - self.building.health) / 2; - if ((self.ammo_cells >= cost)) - { - self.ammo_cells = (self.ammo_cells - cost); - self.building.health = self.building.max_health; - } - } - if ((self.building.ammo_rockets == 0)) - { - maxcells = 120; - } - else - { - if ((self.building.ammo_rockets == 1)) - { - maxcells = 120; - } - else - { - if ((self.building.ammo_rockets == 2)) - { - maxcells = 200; - } - else - { - if ((self.building.ammo_rockets == 3)) - { - maxcells = 300; - } - } - } - } - cost = maxcells - self.building.ammo_cells; - if ((cost > self.ammo_cells)) - { - cost = self.ammo_cells; - } - self.ammo_cells = (self.ammo_cells - cost); - self.building.ammo_cells = (self.building.ammo_cells + cost); - } - if ((inp == 8)) - { - sprint (self, "You dismantle the Tesla Gun.\n"); - self.ammo_cells = (self.ammo_cells + (150 / 2)); - self.building.real_owner.has_tesla = 0; - self.building.real_owner.has_turretized_tesla = 0; - if ((self.building.real_owner.team_no != self.team_no)) - { - self.real_frags = (self.real_frags + 1); - if (!(toggleflags & 128)) - { - self.frags = self.real_frags; - } - } - if ((self.building.real_owner != self)) - { - sprint (self.building.real_owner, self.netname); - sprint (self.building.real_owner, " dismantled your Tesla Coil.\n"); - teamsprint (self.building.real_owner.team_no, self.building.real_owner, self.netname); - teamsprint (self.building.real_owner.team_no, self.building.real_owner, " dismantled "); - teamsprint (self.building.real_owner.team_no, self.building.real_owner, self.building.real_owner.netname); - teamsprint (self.building.real_owner.team_no, self.building.real_owner, "'s Tesla Coil.\n"); - } - dremove (self.building); - } - if (((inp >= 1) && (inp <= 9))) - { - ResetMenu (); - self.impulse = 0; - bound_other_ammo (self); - if ((self.armorvalue == 0)) - { - self.armortype = 0; - self.armorclass = 0; - self.items = (self.items - (self.items & ((8192 | 16384) | 32768))); - } - W_SetCurrentAmmo (); - } -}; - -// Engineer extractor -void () Menu_EngineerFix_Extractor = -{ - local string level; - local string hp; - local string obj_metal; - - level = ftos(self.building.ammo_cells + 1); - hp = ftos(self.building.health); - obj_metal = ftos(self.building.ammo_metal); - - CenterPrint (self, "^7[^6Metal Extractor^7]\n^1Level: ^3",level,"\n^1Health: ^3",hp,"\n^1Metal: ^3",obj_metal,"\n\n[^11^7] Extract Metal\n[^12^7] Repair Extractor\n[^13^7] Nothing\n"); -}; - -void (float inp) Menu_EngineerFix_Extractor_Input = -{ - if (inp == 1) - { - if (self.building.ammo_metal > 0) - { - local float tmp_flt; - tmp_flt = self.maxammo_metal - self.ammo_metal; - if (tmp_flt == 0) - sprint(self, "You have reached your carrying capacity for metal\n"); - else - { - if (tmp_flt > self.building.ammo_metal) - { - self.ammo_metal = self.ammo_metal + self.building.ammo_metal; - self.building.ammo_metal = 0; - } - else - { - if ((self.ammo_metal + self.building.ammo_metal) > self.maxammo_metal) - { - self.building.ammo_metal = self.building.ammo_metal - (self.maxammo_metal - self.ammo_metal); - self.ammo_metal = self.maxammo_metal; - } - else - { - self.ammo_metal = self.ammo_metal + self.building.ammo_metal; - self.building.ammo_metal = 0; - } - } - } - } - else - { - sprint(self, "There is no metal to extract from this unit\n"); - } - } - - if ((inp >= 1) && (inp <= 9)) - { - ResetMenu (); - self.impulse = 0; - W_SetCurrentAmmo(); - } -}; -// Engineer build menu -void () Menu_Engineer = -{ - local string line1; - local string line2; - local string line3; - local string line4; - local string line5; - local string costline; - local string cost1; - local string cost2; - -/* if (self.has_dispenser == 1) - { - line1 = "“.. Destroy Dispenser \n"; - } - else - { -// line1 = "“.. Build Ammo&Armor Dispenser \n"; - cost1 = "^3"; - if (self.ammo_cells < BUILDING_DISPENSER_NEEDCELLS) - cost1 = "^1"; - cost1 = strcat(cost1," cells^7: ",ftos(BUILDING_DISPENSER_NEEDCELLS), "\n"); - costline = cost1; - line1 = strcat("“.. Build Ammo&Armor Dispenser \n",costline,"\n"); - }*/ - if (self.has_sentry == 1) - { - line2 = "[^12^7] Destroy Sentry Gun \n"; - } - else - { - //if (self.ammo_cells >= BUILDING_SENTRY_NEEDCELLS && self.ammo_metal >= BUILDING_SENTRY_NEEDMETAL) - // { - cost1 = "^3"; - cost2 = "^3"; - if (self.ammo_cells < BUILDING_SENTRY_NEEDCELLS) - cost1 = "^1"; - cost1 = strcat(cost1," cells^7: ",ftos(BUILDING_SENTRY_NEEDCELLS)); - if (self.ammo_metal < BUILDING_SENTRY_NEEDMETAL) - cost2 = "^1"; - cost2 = strcat(cost2," metal^7: ",ftos(BUILDING_SENTRY_NEEDMETAL), "\n"); - costline = strcat(cost1," ",cost2); - line2 = strcat("[^12^7] Build Sentry Gun \n",costline); - - } - if (self.has_tesla == 1) - { - line3 = "[^13^7] Destroy Tesla Sentry Gun \n"; - } - else - { -// if (self.ammo_cells >= BUILDING_TESLA_NEEDCELLS && self.ammo_metal >= BUILDING_TESLA_NEEDMETAL) -// { - cost1 = "^3"; - cost2 = "^3"; - if (self.ammo_cells < BUILDING_TESLA_NEEDCELLS) - cost1 = "^1"; - cost1 = strcat(cost1," cells^7: ",ftos(BUILDING_TESLA_NEEDCELLS)); - if (self.ammo_metal < BUILDING_TESLA_NEEDMETAL) - cost2 = "^1"; - cost2 = strcat(cost2," metal^7: ",ftos(BUILDING_TESLA_NEEDMETAL), "\n"); - costline = strcat(cost1," ",cost2); - line3 = strcat("[^13^7] Build Tesla Sentry Gun \n",costline); - - } - if (self.has_teleporter != 0) //CH messy, yes - { - if (self.has_teleporter == 1 && self.ammo_cells >= BUILDING_TELEPAD_NEEDCELLS && self.ammo_metal >= BUILDING_TELEPAD_NEEDMETAL) - line4 = "... Build a Teleporter Pad \n.®® Destroy a Teleporter Pad \n"; - else if (self.has_teleporter == 1 && self.ammo_cells >= BUILDING_TELEPAD_NEEDCELLS && self.ammo_metal >= BUILDING_TELEPAD_NEEDMETAL) - line4 = ".®® Destroy a Teleporter Pad \n"; - if (self.has_teleporter == 2) - line4 = ".®® Destroy Both Teleporter Pads \n"; - } -// else if (self.ammo_cells >= 90 && self.tf_items & 131072) - else if (self.ammo_cells >= BUILDING_TELEPAD_NEEDCELLS && self.ammo_metal >= BUILDING_TELEPAD_NEEDMETAL) - line4 = "... Build a Teleporter Pad \n \n"; - else - line4 = " \n"; - -// if (self.ammo_cells >= BUILDING_EXTRACTOR_NEEDCELLS) -// if (self.has_extractor > 3) -// line5 = "^1... Build Metal Extractor \n"; - - cost1 = "^3"; - if (self.ammo_cells < BUILDING_EXTRACTOR_NEEDCELLS) - cost1 = "^1"; - cost1 = strcat(cost1," cells^7: ",ftos(BUILDING_EXTRACTOR_NEEDCELLS)," "); - costline = cost1; - if (self.has_extractor >= 3) - line5 = strcat("[^16^7] ^1Build Metal Extractor \n",costline,"\n\n"); - else - line5 = strcat("[^16^7] Build Metal Extractor \n",costline,"\n\n"); - - local string strn; - local string metalcnt; - metalcnt = ftos(self.ammo_metal); - - // Dispenser moved down here - if (self.has_dispenser == 1) - { - line1 = "[^11^7] Destroy Dispenser \n"; - } - else - { - cost1 = "^3"; - if (self.ammo_cells < BUILDING_DISPENSER_NEEDCELLS) - cost1 = "^1"; - cost1 = strcat(cost1," cells^7: ",ftos(BUILDING_DISPENSER_NEEDCELLS)," "); - costline = cost1; - line1 = strcat("^7[^11^7] Build Ammo&Armor Dispenser \n",costline,"\n"); - } - - strn = strcat("^7Engineer Build Menu\n ^3Metal: [",metalcnt,"]\n^3Cells: [",ftos(self.ammo_cells),"]\n\n", line1, strcat(line2, line3, line4), strcat(line5, "... Nothing \n\n")); - CenterPrint(self, strn); -}; diff --git a/attic/TeamNexuiz/game/gamec/tfplats.c b/attic/TeamNexuiz/game/gamec/tfplats.c deleted file mode 100644 index 85b21f578..000000000 --- a/attic/TeamNexuiz/game/gamec/tfplats.c +++ /dev/null @@ -1,496 +0,0 @@ - -void() SUB_Null; -float() CheckExistence; -void() train_next; -void() func_train_find; -void() plat_center_touch; -void() plat_outside_touch; -void() plat_trigger_use; -void() plat_go_up; -void() plat_go_down; -void() plat_crush; - - - -void() plat_spawn_inside_trigger = -{ - local entity trigger; - local vector tmin; - local vector tmax; - trigger = spawn(); - trigger.touch = plat_center_touch; - trigger.movetype = 0; - trigger.solid = 1; - trigger.enemy = self; - trigger.team_no = self.team_no; - trigger.playerclass = self.playerclass; - trigger.items_allowed = self.items_allowed; - trigger.activate_goal_no = self.activate_goal_no; - trigger.inactivate_goal_no = self.inactivate_goal_no; - trigger.remove_goal_no = self.remove_goal_no; - trigger.restore_goal_no = self.restore_goal_no; - trigger.activate_group_no = self.activate_group_no; - trigger.inactivate_group_no = self.inactivate_group_no; - trigger.remove_group_no = self.remove_group_no; - trigger.restore_group_no = self.restore_group_no; - trigger.goal_activation = self.goal_activation; - trigger.goal_effects = self.goal_effects; - trigger.goal_result = self.goal_result; - trigger.goal_group = self.goal_group; - tmin = self.mins + '25 25 0'; - tmax = self.maxs - '25 25 -8'; - tmin_z = tmax_z - (self.pos1_z - self.pos2_z + 8); - if (self.spawnflags & 1) - { - tmax_z = tmin_z + 8; - } - if (self.size_x <= 50) - { - tmin_x = (self.mins_x + self.maxs_x) / 2; - tmax_x = tmin_x + 1; - } - if (self.size_y <= 50) - { - tmin_y = (self.mins_y + self.maxs_y) / 2; - tmax_y = tmin_y + 1; - } - setsize(trigger, tmin, tmax); -}; - -void() plat_hit_top = -{ - sound(self, 2, self.noise1, 1, 1); - self.state = 0; - self.think = plat_go_down; - self.nextthink = self.ltime + 3; -}; - -void() plat_hit_bottom = -{ - sound(self, 2, self.noise1, 1, 1); - self.state = 1; -}; - -void() plat_go_down = -{ - sound(self, 2, self.noise, 1, 1); - self.state = 3; - SUB_CalcMove(self.pos2, self.speed, plat_hit_bottom); -}; - -void() plat_go_up = -{ - sound(self, 2, self.noise, 1, 1); - self.state = 2; - SUB_CalcMove(self.pos1, self.speed, plat_hit_top); -}; - -void() plat_center_touch = -{ - local entity te; - if (other.classname != "player") - { - return; - } - if (!Activated(self, other)) - { - if (self.else_goal != 0) - { - te = Findgoal(self.else_goal); - if (te) - { - DoResults(te, other, self.goal_result & 2); - } - } - return; - } - if (other.health <= 0) - { - return; - } - self = self.enemy; - if (self.state == 1) - { - plat_go_up(); - } - else - { - if (self.state == 0) - { - self.nextthink = self.ltime + 1; - } - } -}; - -void() plat_outside_touch = -{ - local entity te; - if (other.classname != "player") - { - return; - } - if (!Activated(self, other)) - { - if (self.else_goal != 0) - { - te = Findgoal(self.else_goal); - if (te) - { - DoResults(te, other, self.goal_result & 2); - } - } - return; - } - if (other.health <= 0) - { - return; - } - self = self.enemy; - if (self.state == 0) - { - plat_go_down(); - } -}; - -void() plat_trigger_use = -{ - if (self.think) - { - return; - } - plat_go_down(); -}; - -void() plat_crush = -{ - T_Damage(other, self, self, 1); - if (self.state == 2) - { - plat_go_down(); - } - else - { - if (self.state == 3) - { - plat_go_up(); - } - else - { - objerror("plat_crush: bad self.state\n"); - } - } -}; - -void() plat_use = -{ - self.use = SUB_Null; - if (self.state != 2) - { - objerror("plat_use: not in up state"); - } - plat_go_down(); -}; - -void() func_plat = -{ - // Q3F/ETF support - if (self.allowteams == "red") - { - self.team_no = 2; - } - if (self.allowteams == "blue") - { - self.team_no = 1; - } - - if (CheckExistence() == 0) - { - dremove(self); - return; - } - if (!(self.t_length)) - { - self.t_length = 80; - } - if (!(self.t_width)) - { - self.t_width = 10; - } - if (self.sounds == 0) - { - self.sounds = 2; - } - if (self.sounds == 1) - { - precache_sound("plats/plat1.wav"); - precache_sound("plats/plat2.wav"); - self.noise = "plats/plat1.wav"; - self.noise1 = "plats/plat2.wav"; - } - if (self.sounds == 2) - { - precache_sound("plats/medplat1.wav"); - precache_sound("plats/medplat2.wav"); - self.noise = "plats/medplat1.wav"; - self.noise1 = "plats/medplat2.wav"; - } - if (self.sounds == 4) - { - precache_sound("plats/track_st.wav"); - precache_sound("plats/track_e.wav"); - self.noise = "plats/track_st.wav"; - self.noise1 = "plats/track_e.wav"; - } - self.mangle = self.angles; - self.angles = '0 0 0'; - self.classname = "plat"; - self.solid = 4; - self.movetype = 7; - setorigin(self, self.origin); - setmodel(self, self.model); - setsize(self, self.mins, self.maxs); - self.blocked = plat_crush; - if (!(self.speed)) - { - self.speed = 150; - } - self.pos1 = self.origin; - self.pos2 = self.origin; - if (self.height) - { - self.pos2_z = self.origin_z - self.height; - } - else - { - self.pos2_z = self.origin_z - self.size_z + 8; - } - self.use = plat_trigger_use; - plat_spawn_inside_trigger(); - if (self.targetname) - { - self.state = 2; - self.use = plat_use; - } - else - { - setorigin(self, self.pos2); - self.state = 1; - } -}; - -void() train_blocked = -{ - if (time < self.attack_finished) - { - return; - } - self.attack_finished = time + 0.5; - T_Damage(other, self, self, self.dmg); -}; - -void() train_use = -{ - if (self.think != func_train_find) - { - return; - } - train_next(); -}; - -void() train_wait = -{ - if (self.wait) - { - self.nextthink = self.ltime + self.wait; - if (self.wait == -1) - { - self.think = func_train_find; - } - self.sounds = 4; - if (4) - { - sound(self, 2, self.noise, 1, 0); - } - else - { - sound(self, 2, self.noise, 1, 1); - } - } - else - { - self.nextthink = self.ltime + 0.1; - } - self.think = train_next; -}; - -void() train_next = -{ - local entity targ; - targ = find(world, targetname, self.target); - self.target = targ.target; - if (!(self.target)) - { - objerror("train_next: no next target"); - } - if (targ.wait) - { - self.wait = targ.wait; - } - else - { - self.wait = 0; - } - self.sounds = 4; -// if (4) -// { -// sound(self, 2, self.noise1, 1, 0); -// } -// else -// { - sound(self, 2, self.noise1, 1, 1); -// } - SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait); -}; - -void() func_train_find = -{ - local entity targ; - targ = find(world, targetname, self.target); - self.target = targ.target; - setorigin(self, targ.origin - self.mins); - if (!(self.targetname)) - { - self.nextthink = self.ltime + 0.1; - self.think = train_next; - } -}; - -void() followtrain = -{ - setorigin(self, self.owner.origin); - self.nextthink = time + 0.1; - self.think = followtrain; -}; - -void() func_train = -{ - if (CheckExistence() == 0) - { - dremove(self); - return; - } - if (!(self.speed)) - { - self.speed = 100; - } - if (!(self.target)) - { - objerror("func_train without a target"); - } - if (!(self.dmg)) - { - self.dmg = 2; - } - if (self.sounds == 0) - { - self.noise = "misc/null.wav"; - precache_sound("misc/null.wav"); - self.noise1 = "misc/null.wav"; - precache_sound("misc/null.wav"); - } - if (self.sounds == 1) - { - self.noise = "plats/train2.wav"; - precache_sound("plats/train2.wav"); - self.noise1 = "plats/train1.wav"; - precache_sound("plats/train1.wav"); - } - if (self.sounds == 4) - { - precache_sound("plats/track_st.wav"); - precache_sound("plats/track_e.wav"); - self.noise = "plats/track_e.wav"; - self.noise1 = "plats/track_st.wav"; - } - self.cnt = 1; - self.solid = 4; - self.movetype = 7; - self.blocked = train_blocked; - self.use = train_use; - self.classname = "train"; - setmodel(self, self.model); - setsize(self, self.mins, self.maxs); - setorigin(self, self.origin); - self.nextthink = self.ltime + 0.1; - self.think = func_train_find; -}; - -void() light_move = -{ - if (CheckExistence() == 0) - { - dremove(self); - return; - } - if (!(self.speed)) - { - self.speed = 100; - } - if (!(self.target)) - { - objerror("light_move without a target"); - } - self.noise = "misc/null.wav"; - precache_sound("misc/null.wav"); - self.noise1 = "misc/null.wav"; - precache_sound("misc/null.wav"); - self.cnt = 1; - if (!(self.effects)) - { - self.effects = 4; - } - self.solid = 4; - self.movetype = 7; - self.classname = "movelight"; - precache_model("progs/s_null.spr"); - setmodel(self, "progs/s_null.spr"); - setsize(self, '0 0 0', '0 0 0'); - setorigin(self, self.origin); - self.nextthink = self.ltime + 0.1; - self.think = func_train_find; -}; - -void() misc_teleporttrain = -{ - if (CheckExistence() == 0) - { - dremove(self); - return; - } - if (!(self.speed)) - { - self.speed = 100; - } - if (!(self.target)) - { - objerror("func_train without a target"); - } - self.cnt = 1; - self.solid = 0; - self.movetype = 7; - self.blocked = train_blocked; - self.use = train_use; - self.avelocity = '100 200 300'; - self.noise = "misc/null.wav"; - precache_sound("misc/null.wav"); - self.noise1 = "misc/null.wav"; - precache_sound("misc/null.wav"); - precache_model2("progs/teleport.mdl"); - setmodel(self, "progs/teleport.mdl"); - setsize(self, self.mins, self.maxs); - setorigin(self, self.origin); - self.nextthink = self.ltime + 0.1; - self.think = func_train_find; -}; - - diff --git a/attic/TeamNexuiz/game/gamec/tfq3fitems.c b/attic/TeamNexuiz/game/gamec/tfq3fitems.c deleted file mode 100644 index fc0b685c5..000000000 --- a/attic/TeamNexuiz/game/gamec/tfq3fitems.c +++ /dev/null @@ -1,434 +0,0 @@ -/* -============= - XavioR's Q3F/ETF Entity recognition - ============== -*/ -// q3f_forts seems to work almost perfectly -- -//any other map will probably need a small to large amount of entity editing; -//still, this code does do a lot of work for you so give it a look :) -.string groupname; -//.string allowteams; -.string give; -.string active_all_sound; -.string carried_message; -.string active_all_message; -.string carried_sound; -.string holding; -.string team_owner; -.float gameindex; -.float teamscore; -//.vector orig_origin; -float RED_GOAL = 200; -float BLUE_GOAL = 100; -float ANY_GOAL = 50; - -// Parse ETF/Q3F's "give" property (substrings ftw!) -.float ammo_charge; -.float stleng; -float (string give_string, float st_len1, float st_len2) grabval = -{ - local float posneg; -// local float maxstl; - local string st; - posneg = 1; - - st = substring(give_string, st_len1, 1); - if (st == "-") - posneg = -1; - - st = substring(give_string, st_len1 + st_len2 - 1, 1); - if (st == ",") -// self.stleng = 2; - self.stleng = st_len2 - 2; - - else -// self.stleng = 3; - self.stleng = st_len2 - 1; - - st = substring(give_string, st_len1 + 1, self.stleng); - return(stof(st) * posneg); -}; - -void (entity goal) ParseGive = -{ - if (goal.give == "converted") - return; - local string give_string; - local string st; - local string chargeorcell; - local float st_len; - local float en_len; - local entity oself; - st_len = 0; - en_len = 5; - give_string = self.give; - self = oself; - self = goal; - - st = substring(give_string, st_len, 6); - while (st != "") - { - if (st == "health" ) - { - st_len = st_len + 7; - self.health = grabval (give_string, st_len, 4); - } - else if (st == "armor=" ) - { - st_len = st_len + 6; - self.armorvalue = grabval (give_string, st_len, 4); - } - else if (st == "ammo_s" ) - { - st_len = st_len + 12; - self.ammo_shells = grabval (give_string, st_len, 4); - } - else if (st == "ammo_b" ) - { - st_len = st_len + 13; - self.ammo_shells = grabval (give_string, st_len, 4); - } - else if (st == "ammo_c" ) - { - chargeorcell = substring(give_string, st_len, 7); -// bprint(2,chargeorcell); -// bprint(2,"\n"); - if (chargeorcell == "ammo_ch" ) // if it's ammo_charge, we really dont care much - { - st_len = st_len + 12; - self.ammo_charge = self.ammo_charge = grabval (give_string, st_len, 3); - } - else - { - st_len = st_len + 11; - self.ammo_cells = grabval (give_string, st_len, 4); - } - } - else if (st == "ammo_r" ) - { - st_len = st_len + 13; - self.ammo_rockets = grabval (give_string, st_len, 4); - } - else if (st == "ammo_n" ) - { - st_len = st_len + 11; - self.ammo_nails = grabval (give_string, st_len, 4); - } - else if (st == "ammo_m" ) - { - st_len = st_len + 13; - self.ammo_medikit = grabval (give_string, st_len, 4); - } - else if (st == "score=" ) - { - st_len = st_len + 6; - self.frags = grabval (give_string, st_len, 3); - } - else if (st == "gren1=" ) - { - st_len = st_len + 6; - self.no_grenades_1 = grabval (give_string, st_len, 3); - } - else if (st == "gren2=" ) - { - st_len = st_len + 6; - self.no_grenades_2 = grabval (give_string, st_len, 3); - } - st_len = st_len + self.stleng + 2; - st = substring(give_string, st_len, 6); - } - self.give = ""; - oself = self; - -// bprint(2, self.classname); -// bprint(2, " "); -// bprint(2, "finishes\n"); -}; - -// Q3F/ETF Maps dont have info_tfdetects, so this calls it. -void () DoTFDetect = -{ - if (q3fdetect == 1) - return; -self.display_item_status1 = 1; -self.n_s_c = "ÅÎÅÍÙ flag: carried by"; -self.display_item_status2 = 2; -self.impulse = 64; -//self.classname = "info_tfdetect"; -self.b_n = "\n"; -self.t_s_h = "ÙÏÕÒ flag: base."; -//self.origin = '-80 -60 108'; -self.t_s_c = "ÙÏÕÒ flag: carried by"; -self.n_s_h = "ÅÎÅÍÙ flag: base."; -self.b_t = "Amnesia\nžŸ CHOOSE YOUR TEAM žŸ\n\n..… BLUE TEAM\n..… ÒÅÄ TEAM \n\n—.… AUTO TEAM\n"; -self.b_b = "TeamFortress"; -self.n_s_m = "ÅÎÅÍÙ flag: down."; -self.t_s_m = "ÙÏÕÒ flag: down."; -q3fdetect = 1; -info_tfdetect(); -}; - -void () PossiblyDoTFDetect = -{ - if (q3fdetect != 1) - { - newmis = spawn(); - newmis.classname = "info_tfdetect"; - newmis.nextthink = time; - newmis.think = DoTFDetect; - } -} - -// Converts item to FLAG -void (float tno) ConvertToFlag = -{ - PossiblyDoTFDetect(); - local string droppedmsg; - - if (self.allowteams == "red") - { -// if (redflagexists == 1) -// return; - self.team_no = 2; - self.owned_by = 1; - if (!self.n_b) - self.n_b = " took the Blue Æìáç!\n"; - droppedmsg = " Dropped the Blue flag\n"; - self.netname = "Red Flag"; - redflagexists = 1; - - if (!self.goal_no) - self.goal_no = RED_GOAL; // Temp Goal Number, can be overridden by a "goal" def in the entity - } - if (self.allowteams == "blue") - { -// if (blueflagexists == 1) -// return; - self.team_no = 1; - self.owned_by = 2; - if (!self.n_b) - self.n_b = " took the Red Æìáç!\n"; - droppedmsg = " Dropped the Red flag\n"; - self.netname = "Blue Flag"; - blueflagexists = 1; - - if (!self.goal_no) - self.goal_no = BLUE_GOAL; // Temp Goal Number, can be overridden by a "goal" def in the entity - } - if (self.allowteams == "all" || tno == 0) - { - self.owned_by = 0; - self.goal_no = ANY_GOAL; - } - - self.classname = "item_tfgoal"; - if (self.carried_message) - self.message = self.carried_message; - - self.d_t = "the ÅÎÅÍÙ ìïóô your flag!\n"; // The enemy stole your flag msg - self.b_o = "Your flag has been stolen!\n"; - - self.noise = self.carried_sound; -// self.noise3 = self.inactive_all_message; - self.noise3 = "Your flag has returned to base!\n"; -// self.noise4 = self.inactive_all_message; - self.noise4 = "The enemy flag has returned to base!\n"; - -// self.impulse = 9; - self.items = 133701; - - if (self.model) - self.mdl = self.model; - -// self.mdl = "models/flag.md3"; - - if (!self.delay) - self.delay = self.wait; - - self.d_n_n = droppedmsg; - self.d_n_t = droppedmsg; - - self.g_a = 2741; - self.g_e = 17; - - - item_tfgoal(); -}; - -// This is the function that will convert an item to a backpack -//(happens with any item that has a "give" value). -void () ConvertToBackPack = -{ - PossiblyDoTFDetect(); -// ParseGive(); - - if (self.give == "") - return; - -// self.classname = "i_t_g"; - if (self.allowteams == "red") - { - self.team_no = 2; - self.owned_by = 2; - } - if (self.allowteams == "blue") - { - self.team_no = 1; - self.owned_by = 1; - } - - self.message = "Resupplied!\n"; - if (self.carried_message != "") - self.message = self.carried_message; - if (self.active_all_message != "") - self.message = self.active_all_message; - - self.mdl = self.model; - self.noise = self.active_all_sound; - self.g_e = 1; - self.g_a = 1; - - self.flags = self.flags & FL_ITEM & FL_WEAPON; // makes it turn around -- much more bandwidth efficient - -/* self.orig_origin = self.origin; // old pack float code - newmis = spawn(); // thx savagex for making me aware of cl_itembobheight - newmis.floating = -17; - newmis.owner = self; - newmis.think = PackFloat; - newmis.nextthink = (time + 1.000000);*/ - - // If no ammo amount is specified in the entity, it will default to these values. - // The reason for this is because q3f/etf uses "give" commands to add ammo, and I can't - //convert those easily :( - if (!(self.ammo_nails || self.ammo_cells || self.ammo_rockets || self.health)) - { - self.health = 50; - self.ammo_shells = 20; - self.ammo_nails = 100; - self.ammo_rockets = 15; - self.a_c = 25; - self.armorvalue = 100; - self.no_grenades_1 = 2; - self.no_grenades_2 = 1; - } - i_t_g (); -}; - -// Converts Q3F/ETF Team Spawn points to tf-recognized ones. -/*void () info_player_start = -{ - if (self.allowteams == "blue") - self.team_no = 1; - if (self.allowteams == "red") - self.team_no = 2; - i_p_t(); -};*/ - -void() info_notnull = -{ - if (self.give != "") - { - ConvertToBackPack (); - } - if (self.groupname == "anyflag") - ConvertToFlag(0); - if (self.groupname == "blueflag") - ConvertToFlag(1); - if (self.groupname == "redflag") - ConvertToFlag(2); -}; - -void() func_goalinfo = -{ - if (self.give != "") - { - ConvertToBackPack (); - } - if (self.groupname == "anyflag") - ConvertToFlag(0); - if (self.groupname == "blueflag") - ConvertToFlag(1); - if (self.groupname == "redflag") - ConvertToFlag(2); -}; - -void() func_goalitem = -{ - if (self.give != "") - { - ConvertToBackPack (); - } - if (self.groupname == "anyflag" && self.gameindex != 3) { - ConvertToFlag(0); - } - if (self.groupname == "blueflag" && self.gameindex != 3) { - ConvertToFlag(1); - } - if (self.groupname == "redflag" && self.gameindex != 3) { - ConvertToFlag(2); - } -}; - -// Converts trigger_multiples to Flag Goals (the point(s) where the flag is capped). -//This works for q3f_forts and machse and a couple other ones. -void(float tno) ConvertToGoal = -{ - if (!self.holding) - return; - if (tno == 1) - { - self.team_no = 2; - self.axhitme = 200; - self.items_allowed = 200; - } - if (tno == 2) - { - self.team_no = 1; - self.axhitme = 100; - self.items_allowed = 100; - } - if (tno == 0) - { - self.axhitme = ANY_GOAL; - self.items_allowed = ANY_GOAL; - if (self.team_owner == "blue" || self.owned_by == 1) - self.team_no = 1; - else if (self.team_owner == "red" || self.owned_by == 2) - self.team_no = 2; - } - - self.is_converted_goal = "yes"; // used with spawn point finder, no connnection with the actual conversion - - self.goal_result = 2; - self.noise = self.active_all_sound; - self.frags = self.teamscore; - self.count = self.teamscore; - self.classname = "i_t_g"; - -// ParseGive(); - - self.g_a = 1; - self.g_e = 3; - - i_t_g(); -}; - -void() CheckIfQ3FTrigger = // Handles trigger_multiples from Q3F/ETF -- called from trigger_multiple -{ - if (self.holding == "blueflag") - ConvertToGoal (1); - if (self.holding == "redflag") - ConvertToGoal (2); - if (self.holding == "anyflag") - ConvertToGoal (0); - if (self.holding == "oneflag" && self.allowteams == "blue") - ConvertToGoal (1); - if (self.holding == "oneflag" && self.allowteams == "red") - ConvertToGoal (2); -}; - -// func_hud is not valid in Team:Nexuiz (dont know if it will ever be) -void () func_hud = -{ - dremove(self); -}; diff --git a/attic/TeamNexuiz/game/gamec/tfsentry.c b/attic/TeamNexuiz/game/gamec/tfsentry.c deleted file mode 100644 index fcb9a84b6..000000000 --- a/attic/TeamNexuiz/game/gamec/tfsentry.c +++ /dev/null @@ -1,549 +0,0 @@ -void (entity bld) CheckBelowBuilding; -void (entity gunhead) CheckSentry; -void () Sentry_Rotate; -float () Sentry_FindTarget; -void () Sentry_FoundTarget; -void () Sentry_HuntTarget; -void () Sentry_Pain; -void () Sentry_Die; -float () Sentry_Fire; -void () Sentry_MuzzleFlash; -void () lvl1_sentry_atk3; - -float(entity targ) tfvisible = -{ - local vector spot1; - local vector spot2; - spot1 = self.origin + '0 0 20' + self.view_ofs + '0 0 20'; - spot2 = targ.origin + targ.view_ofs; - traceline(spot1, spot2, TF_FLARE_OFF, self); - if (trace_inopen && trace_inwater) - { - return TF_FLARE_LIT; - } - if (trace_fraction == TF_FLARE_OFF) - { - return TF_FLARE_OFF; - } - return TF_FLARE_LIT; -}; - - -void () lvl1_sentry_stand = [ 0, lvl1_sentry_stand ] -{ - Sentry_Rotate (); -}; - -void () lvl1_sentry_atk1 = [ 1, lvl1_sentry_atk3 ] -{ - ai_face (); - - local vector temp; - temp = vectoangles(self.enemy.origin - self.origin); - self.barrel_ent.angles_x = -temp_x; - - if (((((self.enemy == world) || (self.enemy.health <= 0)) || !tfvisible (self.enemy)) || (self.enemy.has_disconnected == 1))) - { - lvl1_sentry_stand (); - } - else - { - if ((self.ammo_shells <= 0)) - { - lvl1_sentry_stand (); - } - else - { - if ((Sentry_Fire () == 0)) - { - lvl1_sentry_atk3 (); - } - } - } -}; - -void () lvl1_sentry_atk2 = [ 2, lvl1_sentry_atk3 ] -{ - ai_face (); - Sentry_Fire (); -}; - -void () lvl1_sentry_atk3 = [ 0, lvl1_sentry_atk1 ] -{ - ai_face (); -}; -void () lvl2_sentry_atk3; - -void () lvl2_sentry_stand = [ 3, lvl2_sentry_stand ] -{ - Sentry_Rotate (); -}; - -void () lvl2_sentry_atk1 = [ 4, lvl2_sentry_atk2 ] -{ - ai_face (); - if (((((self.enemy == world) || (self.enemy.health <= 0)) || !tfvisible (self.enemy)) || (self.enemy.has_disconnected == 1))) - { - lvl2_sentry_stand (); - } - else - { - if ((self.ammo_shells <= 0)) - { - lvl2_sentry_stand (); - } - else - { - if ((Sentry_Fire () == 0)) - { - lvl2_sentry_atk3 (); - } - } - } -}; - -void () lvl2_sentry_atk2 = [ 5, lvl2_sentry_atk3 ] -{ - ai_face (); - Sentry_Fire (); -}; - -void () lvl2_sentry_atk3 = [ 3, lvl2_sentry_atk1 ] -{ - ai_face (); - Sentry_Fire (); -}; -void () lvl3_sentry_atk3; - -void () lvl3_sentry_stand = [ 6, lvl3_sentry_stand ] -{ - Sentry_Rotate (); -}; - -void () lvl3_sentry_atk1 = [ 7, lvl3_sentry_atk2 ] -{ - ai_face (); - if (((((self.enemy == world) || (self.enemy.health <= 0)) || !tfvisible (self.enemy)) || (self.enemy.has_disconnected == 1))) - { - lvl3_sentry_stand (); - } - else - { - if (((self.ammo_shells <= 0) && (self.ammo_rockets <= 0))) - { - lvl3_sentry_stand (); - } - else - { - if ((Sentry_Fire () == 0)) - { - lvl3_sentry_atk3 (); - } - } - } -}; - -void () lvl3_sentry_atk2 = [ 8, lvl3_sentry_atk3 ] -{ - ai_face (); - Sentry_Fire (); -}; - -void () lvl3_sentry_atk3 = [ 6, lvl3_sentry_atk1 ] -{ - ai_face (); - Sentry_Fire (); -}; - -void () Sentry_Rotate = -{ - local float ay; - local entity gunhead; - - CheckSentry (self); - if (Sentry_FindTarget ()) - { - return; - } - if ((self.heat == 0)) - { - self.ideal_yaw = self.waitmin; - ChangeYaw (); - ay = anglemod (self.angles_y); - ay = rint (ay); - if ((ay == rint (self.waitmin))) - { - CheckBelowBuilding (self.trigger_field); - self.heat = 1; - if ((random () < 0.1)) - { - sound (self, 3, "weapons/turridle.wav", 1, 1); - } - } - } - else - { - self.ideal_yaw = self.waitmax; - ChangeYaw (); - ay = anglemod (self.angles_y); - ay = rint (ay); - if ((ay == rint (self.waitmax))) - { - CheckBelowBuilding (self.trigger_field); - self.heat = 0; - } - } - -/* local entity oldself; - oldself = self; -// self.barrel_ent.ideal_yaw = self.ideal_yaw; - self = self.barrel_ent; - self.ideal_yaw = anglemod(newmis.angles_z + 50); - ChangeYaw(); - self = oldself;*/ - -}; - -float () Sentry_FindTarget = -{ - local entity client; - local float r; - local float gotone; - local float loopc; - - r = 0; - loopc = 0; - gotone = 0; - client = findradius (self.origin + '20 0 0', 480); - while (((client != world) && (gotone != 1))) - { - gotone = 1; - if (!client) - { - gotone = 0; - } - if ((client == self)) - { - gotone = 0; - } - if ((client.has_disconnected == 1)) - { - gotone = 0; - } - if (!client.takedamage) - { - gotone = 0; - } -/* if (teamplay) - { - if (((client.team_no == self.team_no) && (self.team_no != 0))) - { - gotone = 0; - } - // replace this with undercover as cloaking code - if (((client.undercover_team == self.team_no) && (self.team_no != 0))) - { - gotone = 0; - } - }*/ -/* if ((client == self.real_owner)) - { - gotone = 0; - }*/ -/* if (client.is_feigning) // we gonna add feigning? - { - gotone = 0; - }*/ - if ((client.flags & 128)) - { - gotone = 0; - } - if ((client.items & 524288)) - { - gotone = 0; - } - if (!tfvisible (client)) - { - gotone = 0; - } - r = range (client); - if ((r == 3)) - { - gotone = 0; - } - else - { - if (((r == 2) && !infront (client))) - { - gotone = 0; - } - } - if (!gotone) - { - client = client.chain; - } - } - if (!gotone) - { - return (0); - } - self.enemy = client; - Sentry_FoundTarget (); - return (1); -}; - -void () Sentry_FoundTarget = -{ - if (((self.ammo_shells > 0) || ((self.ammo_rockets > 0) && (self.weapon == 3)))) - { - sound (self, 2, "weapons/turrspot.wav", 1, 1); - } - Sentry_HuntTarget (); - if ((self.super_damage_finished < time)) - { - self.super_damage_finished = (time + 0.5); - } -}; - -void () Sentry_HuntTarget = -{ - self.goalentity = self.enemy; - if ((self.weapon == 1)) - { - self.think = lvl1_sentry_atk1; - } - else - { - if ((self.weapon == 2)) - { - self.think = lvl2_sentry_atk1; - } - else - { - self.think = lvl3_sentry_atk1; - } - } - self.ideal_yaw = vectoyaw ((self.enemy.origin - self.origin)); - - local vector temp; - temp = vectoangles(self.enemy.origin - self.origin); - self.barrel_ent.angles_x = -temp_x; - -/* if (temp_x > 30) - temp_x = 30; - if (temp_x < -30) - temp_x = -30;*/ - - /*zchange = ((self.enemy.origin - self.barrel_ent.origin) * .1); - if (zchange > 30) - { - self.barrel_ent.angles_x = 30; - } - else if (zchange < 30) - { - self.barrel_ent.angles_x = -30; - } - else - { - self.barrel_ent.angles_x = zchange; - }*/ - - //self.barrel_ent.angles_z = self.barrel_ent.ideal_yaw_z; - -// self.ideal_yaw = vectoyaw(self.enemy.origin - self.origin); -// self.ideal_yaw = anglemod(self.ideal_yaw); - - self.nextthink = (time + 0.1); - SUB_AttackFinished (1); -}; - -void () Sentry_Pain = -{ - self.real_owner.StatusRefreshTime = (time + 0.2); -}; - -void () Sentry_Explode = -{ -/* ThrowGib ("progs/tgib1.mdl", -70); // reokace with throw metal chunks code. - ThrowGib ("progs/tgib2.mdl", -70); - ThrowGib ("progs/tgib3.mdl", -70);*/ - if ((self.real_owner.has_disconnected != 1)) - { - deathmsg = 38; - T_RadiusDamage (self, self.real_owner, (75 + (self.ammo_rockets * 8)), self); - } - if ((self.classname == "building_sentrygun_base")) - { - if (self.oldenemy) - { - dremove (self.oldenemy); - } - } - else - { - dremove (self.trigger_field); - } - WriteByte (0, 23); - WriteByte (0, 3); - WriteCoord (0, self.origin_x); - WriteCoord (0, self.origin_y); - WriteCoord (0, self.origin_z); - BecomeExplosion (); -}; - -void () Sentry_Die = -{ - sprint (self.real_owner, "Your sentry gun was destroyed.\n"); - self.real_owner.has_sentry = 0; - self.think = Sentry_Explode; - self.nextthink = (time + 0.1); -}; - -void W_Sentry_Fire(vector org, vector vel, float damage) -{ - entity spike; - spike = spawn (); - spike.enemy = self.owner; - spike.owner = self; - spike.classname = "spike"; - - spike.movetype = MOVETYPE_FLY; - spike.solid = SOLID_BBOX; - setmodel(spike, "models/plasmatrail.mdl"); - setsize(spike, '0 0 0', '0 0 0'); - setorigin(spike, org); - - spike.dmg = damage; - - spike.nextthink = time + 3 + random()*0.5; - spike.think = SUB_Remove; - spike.touch = W_NailGrenade_Spike_Poke; - spike.velocity = vel * 6; - spike.angles = vectoangles (spike.velocity); -// spike.scale = 0.75; - -// setattachment(spike, self.barrel_ent, "tag_body_barrel"); -} - -float () Sentry_Fire = -{ - self.ammo_shells = 50; //temp - - local vector dir; - - dir = (self.enemy.origin - self.origin); - if ((((self.ideal_yaw - anglemod (self.angles_y)) < -10) || ((self.ideal_yaw - anglemod (self.angles_y)) > 10))) - { - return (0); - } - if ((((self.weapon == 3) && (self.ammo_rockets > 0)) && (self.super_damage_finished < time))) - { - Sentry_MuzzleFlash (); - sound (self, 1, "weapons/rocket1i.wav", 1, 1); - newmis = spawn (); - newmis.owner = self; - newmis.movetype = 9; - newmis.solid = 2; - newmis.velocity = (normalize ((self.enemy.origin - self.origin)) * 800); - newmis.angles = vectoangles (newmis.velocity); - newmis.weapon = 34; -// newmis.touch = T_MissileTouch; - newmis.touch = W_Rocket_Touch; - newmis.nextthink = (time + 5); - newmis.think = SUB_Remove; - setmodel (newmis, "progs/missile.mdl"); - setsize (newmis, '0 0 0', '0 0 0'); - setorigin (newmis, ((self.origin + (v_forward * 8)) + '0 0 16')); - self.super_damage_finished = (time + 3); - self.ammo_rockets = (self.ammo_rockets - 1); - if ((self.ammo_rockets == 10)) - { - sprint (self.real_owner, "Sentry Gun is low on rockets.\n"); - } - } - self.ammo_shells = (self.ammo_shells - 1); - if ((self.ammo_shells < 0)) - { - self.ammo_shells = 0; - return (0); - } - Sentry_MuzzleFlash (); - sound (self, 1, "weapons/sniper.wav", 1, 1); - deathmsg = 27; - - local float barrel_tag; - local vector fire_from; - -// barrel_tag = gettagindex (self.barrel_ent, "tag_bullet"); - barrel_tag = gettagindex (self.barrel_ent, "tag_barrel_bullet1"); - fire_from = gettaginfo (self.barrel_ent, barrel_tag); - - -/* bprint (ftos(barrel_tag)); - bprint (" \n"); - bprint (vtos(fire_from)); - bprint ("\n");*/ - -//fire_from = fire_from + v_forward + v_up + v_right; -//void fireBullet (vector start, vector dir, float spread, float damage, float dtype, float tracer); - //(entity targ, entity inflictor, entity attacker, float damage) T_Damage -// fireBullet (fire_from, dir, .1, 2, 666, 1); -// T_Damage(self.enemy, self, self, 4); -//fire_from = fire_from + self.barrel_ent.view_ofs + v_forward + v_right + v_up; - -local entity testent; -local entity testent2; - -testent = spawn (); -testent.movetype = 0; -testent.solid = SOLID_BBOX; -setmodel(testent, "models/sentry/bullet.MD3"); -//setorigin(testent, fire_from); -setattachment(testent, self.barrel_ent, "tag_barrel_bullet1"); - -barrel_tag = gettagindex (testent, ""); -fire_from = gettaginfo (testent, barrel_tag); -dir = (self.enemy.origin - fire_from); - - -//barrel_tag = gettagindex (testent, "tag_bullet"); -//fire_from = gettaginfo (testent, testent.tag_index); -//dir = (self.enemy.origin - fire_from); - -/*testent2 = spawn (); -testent2.movetype = 0; -testent2.solid = SOLID_BBOX; -//testent2.scale = 5; -setmodel(testent2, "models/plasmatrail.mdl"); -setorigin(testent2, fire_from);*/ - dir = self.enemy.origin - self.origin; - makevectors(self.origin + dir); - - fire_from = self.origin + v_forward * 20; - - - W_Sentry_Fire(fire_from, dir, 4); - -// FireBullets (4, dir, '0.1 0.1 0'); - if (((self.ammo_shells == 0) && (random () < 0.1))) - { - sprint (self.real_owner, "Sentry Gun is out of shells.\n"); - } - else - { - if ((self.ammo_shells == 20)) - { - sprint (self.real_owner, "Sentry Gun is low on shells.\n"); - } - } - if ((((self.ammo_rockets == 0) && (self.weapon == 3)) && (random () < 0.1))) - { - sprint (self.real_owner, "Sentry Gun is out of rockets.\n"); - } - return (1); -}; - -void () Sentry_MuzzleFlash = -{ - self.effects = (self.effects | 2); -}; diff --git a/attic/TeamNexuiz/game/gamec/tftesla.c b/attic/TeamNexuiz/game/gamec/tftesla.c deleted file mode 100644 index cf4542e5b..000000000 --- a/attic/TeamNexuiz/game/gamec/tftesla.c +++ /dev/null @@ -1,463 +0,0 @@ -/*~ -======================================== - Custom TF/BeyondTF Tesla Coil -======================================== - Originally made for Custom TF - Borrowed from Catch22's BeyondTF - Modified by XavioR (aka avirox) for MegaTF United and Team:Nexuiz - ~*/ - -float () Tesla_Fire; -float () Tesla_FindTarget; -void () Tesla_FoundTarget; - -.float frame_loop; -void () Tesla_Animate = -{ - if (self.owner.health <= 0 || (!self.owner)) - dremove(self); - - if (self.owner.effects == (self.owner.effects | 8)) - { - if (self.owner.frame > 3) - self.owner.frame = 0; - else if (self.owner.frame == 0) - self.owner.frame = 1; - else if (self.owner.frame == 1) - self.owner.frame = 2; - else if (self.owner.frame == 2) - self.owner.frame = 3; - } - else - { - if (self.frame_loop == 0) - self.frame = 5; - else if (self.frame_loop == 1) - self.owner.frame = 6; - else if (self.frame_loop == 2) - self.owner.frame = 7; - else if (self.frame_loop == 3) - self.owner.frame = 8; - else if (self.frame_loop == 4) - self.owner.frame = 9; - else if (self.frame_loop == 5) - self.owner.frame = 8; - else if (self.frame_loop == 6) - self.owner.frame = 7; - else if (self.frame_loop == 7) - self.owner.frame = 6; - else if (self.frame_loop == 8) - self.owner.frame = 5; - else if (self.frame_loop == 9) { - self.owner.frame = 4; - self.frame_loop = -1; - } - self.frame_loop = self.frame_loop + 1; - } - - self.nextthink = time + .05; -}; - - -void () Tesla_Idle = -{ - if (self.waitmax) - { - self.waitmax = Tesla_Fire (); - } - if ((self.waitmax == 0)) - { - if (Tesla_FindTarget ()) - { - self.waitmax = 1; - } - else - { - self.effects = (self.effects - (self.effects & 8)); - self.nextthink = (time + 0.250000); - } - } - self.think = Tesla_Idle; -}; - -float () Tesla_FindTarget = -{ - local entity client; - local entity te; - local float r; - local float gotone; - local float loopc; - - if ((self.tf_items & 2)) - { - self.origin_z = (self.origin_z - 40); - } - else - { - self.origin_z = (self.origin_z + 24); - } - r = 0; - loopc = 0; - gotone = 0; - while (((loopc < 8) && (gotone == 0))) - { - client = checkclient (); - te = find (world, classname, "bot"); - if (te) - { - if (te.health) - { - if (visible (te)) - { - client = te; - } - } - } - gotone = 1; - if (!client) - { - gotone = 0; - } - if ((client.playerclass == 0)) - { - gotone = 0; - } - if ((client.health <= 0)) - { - gotone = 0; - } - if (client.has_disconnected) - { - gotone = 0; - } - if (teamplay) - { - if (((client.team_no == self.team_no) && (self.team_no != 0))) - { - gotone = 0; - } - if (((client.undercover_team == self.team_no) && (self.team_no != 0))) - { - if (!(self.tf_items & 1024)) - { - gotone = 0; - } - } - } - if ((client == self.real_owner)) - { - gotone = 0; - } -/* if (client.is_feigning) // no feigning in NTF (yet?) - { - if (!(self.tf_items & 1024)) - { - gotone = 0; - } - }*/ - if ((client.flags & 128)) - { - gotone = 0; - } - if ((client.items & 524288)) - { - gotone = 0; - } - if (!visible (client)) - { - gotone = 0; - } - r = vlen ((client.origin - self.origin)); - if (((self.ammo_shells == 0) && (r > 400))) - { - gotone = 0; - } - if (((self.ammo_shells == 1) && (r > 800))) - { - gotone = 0; - } - if (((self.ammo_shells == 2) && (r > 1200))) - { - gotone = 0; - } - loopc = loopc + 1; - if (gotone) - { - loopc = 1000; - } - } - if ((self.tf_items & 2)) - { - self.origin_z = (self.origin_z + 40); - } - else - { - self.origin_z = (self.origin_z - 24); - } - if (!gotone) - { - return (0); - } - if ((self.enemy == client)) - { - return (Tesla_Fire ()); - } - self.enemy = client; - if (((self.enemy.classname != "player") && (self.enemy.classname != "bot"))) - { - self.enemy = self.enemy.enemy; - if (((self.enemy.classname != "player") && (self.enemy.classname != "bot"))) - { - self.enemy = world; - return (0); - } - } - Tesla_FoundTarget (); - return (1); -}; - -void () Tesla_FoundTarget = -{ - if ((self.ammo_cells > self.waitmin)) - { - sound (self, 2, "weapons/guerilla_set.wav", 1, 1); - } - self.effects = (self.effects | 8); - self.goalentity = self.enemy; - if ((self.ammo_nails <= 1)) - { - self.nextthink = (time + 1); - } - else - { - if ((self.ammo_nails == 2)) - { - self.nextthink = (time + 0.500000); - } - else - { - self.nextthink = (time + 1.500000); - } - } - if ((self.enemy.modelindex == modelindex_null)) - { - self.nextthink = (self.nextthink + 2); - } - else - { - if ((self.enemy.modelindex == modelindex_eyes)) - { - self.nextthink = (self.nextthink + 1.500000); - } - } - if ((self.tf_items & 1)) - { - self.nextthink = (time + 0.500000); - } -}; - -void () Tesla_Pain = -{ - self.real_owner.StatusRefreshTime = (time + 0.200000); -}; - -void () Tesla_Die = -{ - sprint (self.real_owner, "Your tesla coil was destroyed.\n"); - self.real_owner.has_tesla = 0; - self.real_owner.has_turretized_tesla = 0; -/* ThrowGib ("progs/tgib1.mdl", -70); // use other explosion method? - ThrowGib ("progs/tgib2.mdl", -70); - ThrowGib ("progs/tgib3.mdl", -70);*/ - WriteByte (2, 23); - WriteByte (2, 3); - WriteCoord (4, self.origin_x); - WriteCoord (4, self.origin_y); - WriteCoord (4, self.origin_z); -// multicast (self.origin, 1); // where are my scriptable particles? :( - BecomeExplosion (); -}; - -float () Tesla_Fire = -{ - local vector dir; - local float damage; - - dir = self.enemy.origin - self.origin; - if ((self.enemy.classname == "bot")) - { - dir = (self.enemy.origin + '0 0 -35') - self.origin; - } - if (!self.enemy) - { - return (0); - } - if ((self.enemy == world)) - { - return (0); - } - if (self.enemy.has_disconnected) - { - self.enemy = world; - return (0); - } -/* if (self.enemy.is_feigning) // no feigning yet - { - if (!(self.tf_items & 1024)) - { - return (0); - } - }*/ - if ((self.tf_items & 2)) - { - self.origin_z = (self.origin_z - 40); - } - else - { - self.origin_z = (self.origin_z + 24); - } - if (!visible (self.enemy)) - { - if ((self.tf_items & 2)) - { - self.origin_z = (self.origin_z + 40); - } - else - { - self.origin_z = (self.origin_z - 24); - } - return (0); - } - self.ammo_cells = (self.ammo_cells - self.waitmin); - if ((self.ammo_cells < 0)) - { - self.ammo_cells = 0; - if ((self.tf_items & 2)) - { - self.origin_z = (self.origin_z + 40); - } - else - { - self.origin_z = (self.origin_z - 24); - } - self.enemy = world; - return (0); - } - self.effects = (self.effects | 8); - deathmsg = 51; - WriteByte (2, 23); - WriteByte (2, 6); - WriteEntity (4, self); - WriteCoord (4, self.origin_x); - WriteCoord (4, self.origin_y); - WriteCoord (4, (self.origin_z + 24)); - WriteCoord (4, self.enemy.origin_x); - WriteCoord (4, self.enemy.origin_y); - WriteCoord (4, self.enemy.origin_z); -// void(entity own, vector start, vector end) te_lightning2 = #429; -// te_lightning2(self, self.origin, self.enemy.origin); -// multicast (self.origin, 1); - sound (self, 1, "weapons/tesla.wav", 1, 1); - if ((self.ammo_nails == 0)) - { - damage = 40; - } - if ((self.ammo_nails == 1)) - { - damage = 100; - } - if ((self.ammo_nails == 2)) - { - damage = 200; - } - if ((self.ammo_nails == 3)) - { - damage = 400; - } - - TF_T_Damage (self.enemy, self, self.real_owner, damage, 2, 8); - if ((self.ammo_nails <= 1)) - { - self.nextthink = (time + 1.500000); - } - else - { - if ((self.ammo_nails == 2)) - { - self.nextthink = (time + 1); - } - else - { - self.nextthink = (time + 2); - } - } - if (((self.ammo_cells == 0) && (random () < 0.100000))) - { - sprint (self.real_owner, "Tesla is out of cells.\n"); - } - else - { - if ((self.ammo_cells <= self.waitmin)) - { - sprint (self.real_owner, "Tesla is low on cells.\n"); - } - } - if ((self.tf_items & 2)) - { - self.origin_z = (self.origin_z + 40); - } - else - { - self.origin_z = (self.origin_z - 24); - } - if ((self.enemy.health <= 0)) - { - self.enemy = world; - return (0); - } - return (1); -}; - -void () Tesla_Touch = -{ - if ((pointcontents (self.origin) == -6)) - { - sprint (self.real_owner, "Your sentry gun flew away.\n"); - Tesla_Die (); - return; - } - if ((other.takedamage && !(self.tf_items & 2))) - { - deathmsg = 52; - if ((((other.team_no > 0) && (other.team_no != self.real_owner.team_no)) && (other.is_undercover != 1))) - { - TF_T_Damage (other, self, self.real_owner, 400, 2, 8); - } - return; - } - if (((self.tf_items & 2) && (self.movetype == 5))) - { - if (((((((((pointcontents (self.origin) == -6) || (pointcontents ((self.origin - '0 0 10')) == -6)) || (pointcontents ((self.origin + '0 0 5')) == -6)) || (pointcontents ((self.origin + '0 0 10')) == -6)) || (pointcontents ((self.origin + '0 0 15')) == -6)) || (pointcontents ((self.origin + '0 0 20')) == -6)) || (pointcontents ((self.origin + '0 0 30')) == -6)) || (pointcontents ((self.origin + '0 0 40')) == -6))) - { - sprint (self.real_owner, "Your sentry gun flew away.\n"); - Tesla_Die (); - return; - } - if ((other == world)) - { - self.flags = (self.flags | 512); - self.movetype = 4; - self.origin_z = (self.origin_z + 40); - return; - } - else - { - if ((other.classname == "player")) - { - deathmsg = 52; - TF_T_Damage (other, self, self.real_owner, 400, 2, 8); - } - } - Tesla_Die (); - } -}; diff --git a/attic/TeamNexuiz/game/gamec/tn_clientcommands.c b/attic/TeamNexuiz/game/gamec/tn_clientcommands.c deleted file mode 100644 index 2eaf0933a..000000000 --- a/attic/TeamNexuiz/game/gamec/tn_clientcommands.c +++ /dev/null @@ -1,598 +0,0 @@ -// Team:Nexuiz Client Commands w/ Nexuiz 1.5 RCON/Vote system -.float adminstatus; -.float autoswitch; // need function for this!! -.float version; -.float ready; -// stahl's voting -float votecalled; -string votecalledvote; -float votecalledmaster; -entity votecaller; -float votefinished; -.float vote_master; -.float vote_next; -.float vote_vote; -void VoteThink(); -string VoteParse(); -float VoteAllowed(string vote); -void VoteReset(); -void VoteAccept(); -void VoteReject(); -void VoteTimeout(); -void VoteStop(entity stopper); -void VoteCount(); -void ReadyCount(); -// Parse team join, class etc. -void SV_ParseClientCommand (string s) -{ - local float index; - local float args; -// local float h; - local string c; - local string d; - local string f; - local string g; - local string i; - args = tokenize(s); - c = argv(0); - d = argv(1); - f = argv(2); - g = argv(3); - i = argv(4); - - if (c == "join") - { - return; - } - if (c == "changeclass") - { - stuffcmd(self, "set scmenu_directmenu ClassSelect; togglemenu\n"); - return; - } - if (c == "selectteam") - { - if (self.team_no > 0) - { - sprint(self, "You are already on a team!\n"); - return; - } - if (d == "auto" || d == "5") - { - TeamFortress_TeamPutPlayerInTeam(); - PutClientInServer (); - } - if (d == "blue" || d == "1") - { - TeamFortress_TeamSet (1); - PutClientInServer (); - } - if (d == "red" || d == "2") - { - TeamFortress_TeamSet (2); - PutClientInServer (); - } - if (d == "yellow" || d == "3") - { - TeamFortress_TeamSet (3); - PutClientInServer (); - } - if (d == "green" || d == "pink" || d == "4") // Morphed set it to Pink in the menus. I think - { // we should make it white instead. - TeamFortress_TeamSet (4); - PutClientInServer (); - } - return; - } - if (c == "selectclass") - { - if (self.team_no < 1) - { - sprint(self, "You must select a team to join first!\n"); - return; - } - if (TeamFortress_TeamIsCivilian (self.team_no)) - { - self.impulse = 1; - TeamFortress_ChangeClass (); - return; - } - if (self.playerclass > 0) // if a class is already chosen - { - self.tfstate = self.tfstate - (self.tfstate & 8); - local string cname; - if (d == ftos(TF_CLASS_SCOUT)) - { - cname = "scout"; - } - if (d == ftos(TF_CLASS_SOLDIER)) - { - cname = "soldier"; - } - if (d == ftos(TF_CLASS_MEDIC)) - { - cname = "medic"; - } - if (d == ftos(TF_CLASS_PYRO)) - { - cname = "pyro"; - } - if (d == ftos(TF_CLASS_ENGINEER)) - { - cname = "engineer"; - } - if (d == ftos(TF_CLASS_SPY)) - { - cname = "spy"; - } - if (d == ftos(TF_CLASS_RANDOM)) - { - self.tfstate = self.tfstate | 8; - sprint(self, "You will respawn as a random class.\n"); - } - if (cname != "") - { -// stuffcmd(self, "_cl_playermodel \"models/class/"); -// stuffcmd(self, cname); -// stuffcmd(self, "_mechanical.zym\"\n"); - if (cname == "engineer") - { - self.playermodel = strcat("models/class/",cname,"_other.zym"); - } - else - { - self.playermodel = strcat("models/class/",cname,"_mechanical.zym"); - } - if (self.is_dead == 1) // if player is dead, can change class - CheckForClassChange(); - } - } - else // if no class is chosen - { - if (d == ftos(TF_CLASS_SCOUT)) - { - self.impulse = TF_CLASS_SCOUT; - } - if (d == ftos(TF_CLASS_SOLDIER)) - { - self.impulse = TF_CLASS_SOLDIER; - } - if (d == ftos(TF_CLASS_MEDIC)) - { - self.impulse = TF_CLASS_MEDIC; - } - if (d == ftos(TF_CLASS_PYRO)) - { - self.impulse = TF_CLASS_PYRO; - } - if (d == ftos(TF_CLASS_ENGINEER)) - { - self.impulse = TF_CLASS_ENGINEER; - } - if (d == ftos(TF_CLASS_SPY)) - { - self.impulse = TF_CLASS_SPY; - } - if (d == ftos(TF_CLASS_RANDOM)) - { - self.impulse = TF_CLASS_RANDOM; - } - TeamFortress_ChangeClass(); - } - return; - } - else if (c == "check_val") - { - if (d == "r_bloom") - { - if (f == "1") - self.uses_bloom = 1; - else - self.uses_bloom = 0; - } - } - else if(argv(0) == "clogin") { - if(cvar("sv_clientcommands")) { - if(self.adminstatus < -5) { - sprint(self, "Too many unsuccessful tries.\n"); - } else if(argv(1) == cvar_string("sv_clientcommands_password")) { - self.adminstatus = 1; - sprint(self, "You now have remote admin status.\n"); - } else { - sprint(self, "Wrong password.\n"); - // use of -- produces compiler warning in the if() line??? - self.adminstatus = self.adminstatus - 1; - if(self.adminstatus == 0) - sprint(self, "You lost remote admin status.\n"); - } - } else { - sprint(self, "Clientside commands NOT allowed.\n"); - } - } else if(argv(0) == "ccmd") { - if(cvar("sv_clientcommands")) { - if(self.adminstatus > 0) { - local string command; - command = argv(1); - index = 2; - while(argv(index) != "") { - command = strcat(command, " ", argv(index)); - index++; - } - localcmd(command); - } else - sprint(self, "You don't have remote admin status.\n"); - } else { - sprint(self, "Clientside commands NOT allowed.\n"); - } - } else if(argv(0) == "vote") { - if(argv(1) == "help") { - local string vmasterdis; - if(!cvar("sv_vote_master")) { - vmasterdis = " ^1(disabled)"; - } - local string vcalldis; - if(!cvar("sv_vote_call")) { - vcalldis = " ^1(disabled)"; - } - sprint(self, "^7You can use voting with \"^2cmd vote help^7\" \"^2cmd vote status^7\" \"^2cmd vote call ^3COMMAND ARGUMENTS^7\" \"^2cmd vote stop^7\" \"^2cmd vote master^7\" \"^2cmd vote do ^3COMMAND ARGUMENTS^7\" \"^2cmd vote yes^7\" \"^2cmd vote no^7\".\n"); - sprint(self, "^7Or if your version is up to date you can use these aliases \"^2vhelp^7\" \"^2vstatus^7\" \"^2vcall ^3COMMAND ARGUMENTS^7\" \"^2vstop^7\" \"^2vmaster^7\" \"^2vdo ^3COMMAND ARGUMENTS^7\" \"^2vyes^7\" \"^2vno^7\".\n"); - sprint(self, "^7\"^2help^7\" shows this info.\n"); - sprint(self, "^7\"^2status^7\" shows if there is a vote called and who called it.\n"); - sprint(self, strcat("^7\"^2call^7\" is used to call a vote. See the list of allowed commands.", vcalldis, "^7\n")); - sprint(self, "^7\"^2stop^7\" can be used by the vote caller or an admin to stop a vote and maybe correct it.\n"); - sprint(self, strcat("^7\"^2master^7\" is used to call a vote to become a master.", vmasterdis, "^7\n")); - sprint(self, "^7\"^2do^7\" If you are a master you can execute a command without a vote. See the list of allowed commands.\n"); - sprint(self, "^7\"^2yes^7\" and \"^2no^7\" to make your vote.\n"); - sprint(self, "^7If more then 50% of the players vote yes the vote is accepted.\n"); - sprint(self, "^7If more then 50% of the players vote no the vote is rejected.\n"); - sprint(self, strcat("^7The vote will end after ", cvar_string("sv_vote_timeout"), "^7 seconds.\n")); - sprint(self, "^7You can call a vote for or execute these commands:\n"); - sprint(self, strcat("^3", cvar_string("sv_vote_commands"), "^7 and maybe further ^3arguments^7\n")); - } else if(argv(1) == "status") { - if(votecalled) { - sprint(self, strcat("^7Vote for \"^1", votecalledvote, "^7\" called by \"^7", votecaller.netname, "^7\".\n")); - } else { - sprint(self, "^1No vote called.\n"); - } - } else if(argv(1) == "call") { - if(cvar("sv_vote_call")) { - if(votecalled) { - sprint(self, "^1There is already a vote called.\n"); - } else { - local string vote; - vote = VoteParse(); - if(vote == "") { - sprint(self, "^1Your vote is empty. See help for more info.\n"); - } else if(time < self.vote_next) { - sprint(self, strcat("^1You have to wait ^2", ftos(self.vote_next - time), "^1 seconds before you can again call a vote.\n")); - } else if(VoteAllowed(strcat(argv(2)))) { // strcat seems to be necessary - votecalled = TRUE; - votecalledmaster = FALSE; - votecalledvote = strzone(vote); - votecaller = self; // remember who called the vote - votefinished = time + cvar("sv_vote_timeout"); - votecaller.vote_vote = 1; // of course you vote yes - votecaller.vote_next = time + cvar("sv_vote_wait"); - bprint(strcat("^3Vote for \"^1", votecalledvote, "^3\" called by \"^7", votecaller.netname, "^3\".\n")); - VoteCount(); // needed if you are the only one - } else { - sprint(self, "^1This vote is not ok. See help for more info.\n"); - } - } - } else { - sprint(self, "^1Vote calling is NOT allowed.\n"); - } - } else if(argv(1) == "stop") { - if(!votecalled) { - sprint(self, "^1No vote called.\n"); - } else if(self == votecaller - || self.adminstatus > 0) { // the votecaller and admins can stop a vote - VoteStop(self); - } else { - sprint(self, "^1You are not allowed to stop that Vote.\n"); - } - } else if(argv(1) == "master") { - if(cvar("sv_vote_master")) { - if(votecalled) { - sprint(self, "^1There is already a vote called.\n"); - } else { - votecalled = TRUE; - votecalledmaster = TRUE; - votecalledvote = strzone("^3master"); - votecaller = self; // remember who called the vote - votefinished = time + cvar("sv_vote_timeout"); - votecaller.vote_vote = 1; // of course you vote yes - votecaller.vote_next = time + cvar("sv_vote_wait"); - bprint(strcat("\"^3", votecaller.netname, "^3\" called a vote to become ^3master^3.\n")); - VoteCount(); // needed if you are the only one - } - } else { - sprint(self, "^1Vote to become master is NOT allowed.\n"); - } - } else if(argv(1) == "do") { - if(self.vote_master) { - local string dovote; - dovote = VoteParse(); - if(dovote == "") { - sprint(self, "^1Your command was empty. See help for more info.\n"); - } else if(VoteAllowed(strcat(argv(2)))) { // strcat seems to be necessary - bprint("\"^7", strcat(self.netname, "^2 used his ^3master^2 status to do \"^2", dovote, "^2\".\n")); - localcmd(dovote); - } else { - sprint(self, "^1This command is not ok. See help for more info.\n"); - } - } else { - sprint(self, "^1You are NOT a master.\n"); - } - } else if(argv(1) == "yes") { - if(!votecalled) { - sprint(self, "^1No vote called.\n"); - } else if(self.vote_vote == 0 - || cvar("sv_vote_change")) { - sprint(self, "^1You accepted the vote.\n"); - self.vote_vote = 1; - if(!cvar("sv_vote_singlecount")) { - VoteCount(); - } - } else { - sprint(self, "^1You have already voted.\n"); - } - } else if(argv(1) == "no") { - if(!votecalled) { - sprint(self, "^1No vote called.\n"); - } else if(self.vote_vote == 0 - || cvar("sv_vote_change")) { - sprint(self, "^1You rejected the vote.\n"); - self.vote_vote = -1; - if(!cvar("sv_vote_singlecount")) { - VoteCount(); - } - } else { - sprint(self, "^1You have already voted.\n"); - } - } else { - // ignore this? - sprint(self, "^1Unknown vote command.\n"); - } - } else if(argv(0) == "autoswitch") { - // be backwards compatible with older clients (enabled) - self.autoswitch = ("0" != argv(1)); - local string autoswitchmsg; - if (self.autoswitch) { - autoswitchmsg = "on"; - } else { - autoswitchmsg = "off"; - } - sprint(self, strcat("^1autoswitch turned ", autoswitchmsg, "\n")); - } else if(argv(0) == "clientversion") { - if (argv(1) == "$g_nexuizversion_major") { - //versionmsg = "^1client is too old to get versioninfo.\nUPDATE!!! (http://www.nexuiz.com)^8"; - // either that or someone wants to be funny - self.version = 1; - } else { - self.version = stof(argv(1)); - } - } else if(argv(0) == "spectate") { - if(cvar("g_lms")) - return; // don't allow spectating in lms, unless player runs out of lives - if(self.classname == "player" && cvar("sv_spectate") == 1) { - self.classname = "observer"; - PutClientInServer(); - } - } else if(argv(0) == "join") { - self.classname = "player"; - self.frags = 0; - // TODO: I have no idea whether this is needed or not - if(!cvar("g_lms")) { - bprint (strcat("^4", self.netname, "^4 is playing now\n")); - } - PutClientInServer(); - } else if(argv(0) == "ready") { - if(cvar("sv_ready_restart")) - { - self.ready = TRUE; - bprint(self.netname, "^2 is ready\n"); - ReadyCount(); - } - } - else - { - clientcommand(self, s); - } -}; - -void VoteThink() { - if(votefinished > 0 // a vote was called - && time > votefinished) // time is up - { - VoteCount(); - } -} - -string VoteParse() { - local float index; - index = 3; - local string vote; - vote = argv(2); - while(argv(index) != "") { - vote = strcat(vote, " ", argv(index)); - index++; - } - - // necessary for some of the string operations - vote = strzone(vote); - - // now we remove some things that could be misused - index = 0; - local float found; - found = FALSE; - local float votelength; - votelength = strlen(vote); - while(!found && index < votelength) - { - local string badchar; - badchar = substring(vote, index, 1); - if(badchar == ";" - || badchar == "\n") - { - found = TRUE; - } else { - index++; - } - } - return substring(vote, 0, index); -} - -float VoteAllowed(string votecommand) { - tokenize(cvar_string("sv_vote_commands")); - local float index; - index = 0; - while(argv(index) != "") { - local string allowed; - allowed = argv(index); - if(votecommand == allowed) { - return TRUE; - } - index++; - } - return FALSE; -} - -void VoteReset() { - local string searchclass; - searchclass = "player"; - - while (TRUE) - { - local entity player; - player = find(player, classname, searchclass); - while(player) - { - player.vote_vote = 0; - player = find(player, classname, searchclass); - } - - if("player" == searchclass) { - searchclass = "observer"; - } else if("observer" == searchclass) { - searchclass = "spectator"; - } else { - break; - } - } - - votecalled = FALSE; - votecalledmaster = FALSE; - votefinished = 0; -} - -void VoteAccept() { - bprint(strcat("^2The vote for \"^1", votecalledvote, "^2\" from \"^7", votecaller.netname, "^2\" was accepted.\n")); - if(votecalledmaster) - { - votecaller.vote_master = 1; - } else { - localcmd(votecalledvote); - } - votecaller.vote_next = 0; // people like your votes, no wait for next vote - VoteReset(); -} - -void VoteReject() { - bprint(strcat("^2The vote for \"^1", votecalledvote, "^2\" from \"^7", votecaller.netname, "^2\" was rejected.\n")); - VoteReset(); -} - -void VoteTimeout() { - bprint(strcat("^5The vote for \"^1", votecalledvote, "^5\" from \"^7", votecaller.netname, "^5\" did timeout.\n")); - VoteReset(); -} - -void VoteStop(entity stopper) { - bprint(strcat("^5The vote for \"^1", votecalledvote, "^5\" from \"^7", votecaller.netname, "^5\" was stopped by \"^5", stopper.netname, "^5\".\n")); - if(stopper == votecaller) { - // no wait for next vote so you can correct your vote - votecaller.vote_next = 0; - } - VoteReset(); -} - -void VoteCount() { - local float playercount; - playercount = 0; - local float yescount; - yescount = 0; - local float nocount; - nocount = 0; - local string searchclass; - searchclass = "player"; - - while (TRUE) - { - local entity player; - player = find(player, classname, searchclass); - - while(player) - { - if(clienttype(player) != CLIENTTYPE_BOT) { - if(player.vote_vote < 0) { - nocount++; - } else if(player.vote_vote > 0) { - yescount++; - } - playercount++; - } - player = find(player, classname, searchclass); - } - - if("player" == searchclass) { - searchclass = "observer"; - } else if("observer" == searchclass) { - searchclass = "specator"; - } else { - break; - } - } - - if((playercount == 1) && votecalledmaster) { - // if only one player is on the server becoming vote - // master is not allowed. This could be used for - // trolling or worse. 'self' is the user who has - // called the vote because this function is called - // by SV_ParseClientCommand. Maybe all voting should - // be disabled for a single player? - sprint(self, "^1You are the only player on this server so you can not become vote master.\n"); - votecaller.vote_next = 0; - VoteReset(); - } else if((playercount / 2) < yescount) { // vote accepted - VoteAccept(); - } else if((playercount / 2) < nocount) { // vote rejected - VoteReject(); - } else if(time > votefinished) { // vote timedout - VoteTimeout(); - } // else still running -} - - -void ReadyCount() -{ - local entity e; - local float r, p; - - e = find(world, classname, "player"); - - while(e) - { - if(clienttype(e) == CLIENTTYPE_REAL) - { - p += 1; - if(e.ready) r += 1; - } - e = find(e, classname, "player"); - } - - if(p && r == p) - { - bprint("^1Server is restarting...\n"); - localcmd("restart\n"); - } -} diff --git a/attic/TeamNexuiz/game/gamec/tn_misc.c b/attic/TeamNexuiz/game/gamec/tn_misc.c deleted file mode 100644 index 314ee9929..000000000 --- a/attic/TeamNexuiz/game/gamec/tn_misc.c +++ /dev/null @@ -1,112 +0,0 @@ -/*-----===================================------- - Team:Nexuiz Misc. Items/Functions - -=[ by avirox ]=- --------===================================-----*/ - -// Ice/Slippery ground -.vector area_min; -.vector area_max; -.float slip_time; -.float slip_amount; - -void () slippery_touch = -{ - other.slip_time = time + .2; // amount of time the player is slipping (this gets constantly updated) - other.slip_amount = self.slip_amount; // handled in cl_physics.c -}; - -void () func_slippery = -{ - if (self.area_min != '0 0 0') - { - setsize(self, self.area_min, self.area_max); - } - else - { - setsize(self, '-16 -16 -24', '16 16 32'); - } - self.solid = SOLID_TRIGGER; - self.touch = slippery_touch; -}; - -void () func_ice = -{ - self.classname = "func_slippery"; - func_slippery(); -}; - -// XavioR's QuakeC String Tools -// Copyright Team:Nexuiz (2006) -float(string s) strlen;/* = #114;*/ // returns how many characters are in a string -float (string st, string findme) SearchString = -{ - local float stleng; // string length - local float stpos; // start part of the string to check - local string srcstr; // search string - stleng = strlen(findme); - - stpos = 0; - srcstr = substring(st, stpos, stleng); - while (srcstr != "") - { - srcstr = substring(st, stpos, stleng); - if (srcstr == findme) - return (stpos); - else - stpos = stpos + 1; - } - return (-1); // -1 being "NOT FOUND" -}; - -// Returns the value of a string after the "=" of properties such as "health" or "ammo_cells" etc -float (string st, string valueof, float stpos) ValueString = -{ - local float posneg; // is it positive or negative - local float stleng; // string length - local float stpos2; - local string fdigit; // finds the digits - local string totalstring; // total value - stleng = strlen(valueof); - stpos2 = stpos + stleng + 1; // this puts us at "property=" - fdigit = substring(st, stpos2, 1); // now we look for a "+" or a "-" (IE health=+2 etc) - if (fdigit = "-") - posneg = -1; - else - posneg = 1; - - stpos2 = stpos2 + 1; // this puts us at "property=+" or "property=-" - fdigit = substring(st, stpos2, 1); // find the first digit.. - while (fdigit != "" || fdigit != ",") - { - totalstring = strcat(totalstring, fdigit); //combine the digits.. - stpos2 = stpos2 + 1; - fdigit = substring(st, stpos2, 1); - if (fdigit == "" || fdigit == ",") - return (stof(totalstring) * posneg); - } - return (stof(totalstring) * posneg); -}; - -// Replace String - Replaces a part of a string value -string (string st, string findme, string replacewith) ReplaceString = -{ - local float stleng; // string length - local float stpos; // starting position of the string to replace - local string st1; // first half of the string - local string st2; // last half of the string - local string resultstring; // result of the combination - - stleng = strlen(findme); // find the length of the string - stpos = SearchString(st, findme); // find where the string begins - if (stpos == -1) - { - bprint(strcat("Warning: Value not found in string: ",findme,"\n")); - return (st); - } - bprint(strcat(ftos(stpos),"\n")); - st1 = substring(st, 0, stpos); - st2 = substring(st, stpos + stleng, -1); - resultstring = strcat(st1, replacewith, st2); - bprint(strcat(resultstring,"\n")); - return(resultstring); -}; diff --git a/attic/TeamNexuiz/game/gamec/w_bombletts.c b/attic/TeamNexuiz/game/gamec/w_bombletts.c deleted file mode 100644 index e23e4d9c6..000000000 --- a/attic/TeamNexuiz/game/gamec/w_bombletts.c +++ /dev/null @@ -1,129 +0,0 @@ -void() bombletts_ready_01; -void() bombletts_fire1_01; -void() bombletts_deselect_01; -void() bombletts_select_01; - -float() bombletts_check = -{ - return TRUE; -} - -void(float req) w_bombletts = -{ - if (req == WR_IDLE) - bombletts_ready_01(); - else if (req == WR_FIRE1) - weapon_prepareattack(bombletts_check, bombletts_check, bombletts_fire1_01, cvar("g_balance_bombletts_refire")); - else if (req == WR_RAISE) - bombletts_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = 1; - else if (req == WR_DROP) - bombletts_deselect_01(); - else if (req == WR_SETUP) - { - weapon_setup(WEP_BOMBLETTS, "w_nadelauncher.zym", IT_ROCKETS); - //self.weaponentity.colormod = '0 4 0'; - //self.weaponentity.scale = 0.65; - } - else if (req == WR_CHECKAMMO) - weapon_hasammo = bombletts_check(); -} - -void W_Bombletts_Explode (void) -{ - vector org2; - org2 = findbetterlocation (self.origin); - te_explosion (org2); - effect (org2, "models/sprites/grenadeexplosion.spr32", 0, 20, 30); - sound (self, CHAN_BODY, "weapons/grenade_impact.wav", 1, ATTN_NORM); - - self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_bombletts_damage"), cvar("g_balance_bombletts_edgedamage"), cvar("g_balance_bombletts_radius"), world, cvar("g_balance_bombletts_force"), WEP_BOMBLETTS); - - remove (self); -} - -void W_Bombletts_Touch (void) -{ - sound (self, CHAN_IMPACT, "weapons/grenade_bounce.wav", 1, ATTN_NORM); - self.velocity = self.velocity * cvar("g_balance_bombletts_bounce_speed"); -} - -void W_Bombletts_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - self.health = self.health - damage; - if (self.health <= 0) - W_Bombletts_Explode(); -} - -void W_Bombletts_Think (void) -{ - self.nextthink = time; - if (time > self.cnt) - { - W_Bombletts_Explode (); - return; - } - if (self.owner) - { - if (self.owner.deadflag) - self.owner = self; - else if (self.owner.wpn == WEP_BOMBLETTS && self.owner.button3) - W_Bombletts_Explode (); - } -} - -void W_Bombletts_Attack (void) -{ - local entity gren; - local vector org; - - sound (self, CHAN_WEAPON, "weapons/grenade_fire.wav", 1, ATTN_NORM); - self.punchangle_x = -4; - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 5 + v_up * -12; - - gren = spawn (); - gren.owner = self; - gren.classname = "grenade"; - gren.movetype = MOVETYPE_BOUNCE; - gren.solid = SOLID_BBOX; - setmodel(gren, "models/grenademodel.md3"); - setsize(gren, '-6 -6 -3', '6 6 3'); - setorigin(gren, org); - - gren.cnt = time + 1.5 + random()*0.5; - gren.think = W_Bombletts_Think; - gren.nextthink = time + 0.1; - //gren.think = W_Bombletts_Explode; - gren.touch = W_Bombletts_Touch; - gren.takedamage = DAMAGE_YES; - gren.health = 2; - //gren.damageforcescale = 4; - gren.event_damage = W_Bombletts_Damage; - gren.velocity = v_forward * cvar("g_balance_bombletts_speed") - + v_up * cvar("g_balance_bombletts_speed_up"); - gren.avelocity = '100 150 100'; - - gren.angles = vectoangles (gren.velocity); - - gren.scale = 0.5; - gren.colormod = '1 .5 0'*4;//'0 0 1.9'; - - self.clip_pipegrenades = self.clip_pipegrenades - 1; - if (self.clip_pipegrenades <= 0) - { - DoReload (4, 6); // weapon type 4 is Pipe Grenade, and reload 6 Grenades. - } -} - -// weapon frames - -void() bombletts_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, bombletts_ready_01); self.weaponentity.state = WS_READY;}; -void() bombletts_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() bombletts_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() bombletts_fire1_01 = -{ - weapon_doattack(bombletts_check, bombletts_check, W_Bombletts_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.3, bombletts_ready_01); -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/w_common.c b/attic/TeamNexuiz/game/gamec/w_common.c deleted file mode 100644 index a0d7d9241..000000000 --- a/attic/TeamNexuiz/game/gamec/w_common.c +++ /dev/null @@ -1,1314 +0,0 @@ - -// increments sprite frame, loops when end is hit.. simple - -float TE_SMOKE =77; -void (vector vec) WriteVec = -{ - WriteCoord (MSG_BROADCAST, vec_x); - WriteCoord (MSG_BROADCAST, vec_y); - WriteCoord (MSG_BROADCAST, vec_z); -} -void (vector org, vector dir, float counts) W_Smoke = -{ - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte (MSG_BROADCAST, TE_SMOKE); - WriteVec (org); - WriteVec (dir); - WriteByte (MSG_BROADCAST, counts); -} - -// increments sprite frame, loops when end is hit.. simple -void animate_sprite (float startframe, float frame_count) -{ - if ((self.frame - startframe) >= (frame_count - 1 )) - self.frame = startframe; - else - self.frame = self.frame + 1; -} - -void W_UpdateAmmo (void) -{ - /* - self.items = self.items - (self.items & (IT_NAILS | IT_SHELLS | IT_ROCKETS | IT_CELLS)); - - if (self.weapon == IT_LASER) - self.currentammo = 1; - else if (self.weapon == IT_SHOTGUN) - { - self.currentammo = self.ammo_shells; - self.items = self.items | IT_SHELLS; - } - else if (self.weapon == IT_UZI) - { - self.currentammo = self.ammo_nails; - self.items = self.items | IT_NAILS; - } - else if (self.weapon == IT_GRENADE_LAUNCHER || self.weapon == IT_HAGAR || self.weapon == IT_ROCKET_LAUNCHER) - { - self.currentammo = self.ammo_rockets; - self.items = self.items | IT_ROCKETS; - } - else if (self.weapon == IT_ELECTRO || self.weapon == IT_NEX || self.weapon == IT_CRYLINK) - { - self.currentammo = self.ammo_cells; - self.items = self.items | IT_CELLS; - } - */ -} - -void W_UpdateWeapon (void) -{ - /* - if (self.weapon == IT_LASER) - self.weaponmodel = "models/weapons/w_laser.zym"; - else if (self.weapon == IT_SHOTGUN) - self.weaponmodel = "models/weapons/w_shotgun.zym"; - else if (self.weapon == IT_UZI) - self.weaponmodel = "models/weapons/w_uzi.zym"; - else if (self.weapon == IT_GRENADE_LAUNCHER) - self.weaponmodel = "models/weapons/w_gl.zym"; - else if (self.weapon == IT_ELECTRO) - self.weaponmodel = "models/weapons/w_electro.zym"; - else if (self.weapon == IT_CRYLINK) - self.weaponmodel = "models/weapons/w_crylink.zym"; - else if (self.weapon == IT_NEX) - self.weaponmodel = "models/weapons/w_nex.zym"; - else if (self.weapon == IT_HAGAR) - self.weaponmodel = "models/weapons/w_hagar.zym"; - else if (self.weapon == IT_ROCKET_LAUNCHER) - self.weaponmodel = "models/weapons/w_rl.zym"; - else - objerror ("Illegal weapon - please register your guns please!"); - */ -} - -float W_GetBestWeapon (entity e) -{ - /* - if ((e.items & IT_ROCKET_LAUNCHER) && e.ammo_rockets) - return IT_ROCKET_LAUNCHER; - else if ((e.items & IT_NEX) && e.ammo_cells) - return IT_NEX; - else if ((e.items & IT_HAGAR) && e.ammo_rockets) - return IT_HAGAR; - else if ((e.items & IT_GRENADE_LAUNCHER) && e.ammo_rockets) - return IT_GRENADE_LAUNCHER; - else if ((e.items & IT_ELECTRO) && e.ammo_cells) - return IT_ELECTRO; - else if ((e.items & IT_CRYLINK) && e.ammo_cells) - return IT_CRYLINK; - else if ((e.items & IT_UZI) && e.ammo_nails) - return IT_UZI; - else if ((e.items & IT_SHOTGUN) && e.ammo_shells) - return IT_SHOTGUN; - else - - */ - return IT_LASER; -} - -void ResetExtraWeapon() -{ - if(self.wpn5 == world) - { - self.wpn5 = spawn(); - } - - self.wpn5.weapon = 0; - self.wpn5.mass = 0; - self.items = self.items - (self.items & IT_WEP5); -} - -void W_GiveWeapon (entity e, float wep, string name, float wmass) -{ - entity oldself; - - if (!wep) - return; - - //e.items = e.items | wep; - - oldself = self; - self = e; - - self.wpn5.weapon = wep; - self.wpn5.mass = wmass; - - self.items = self.items | IT_WEP5; - - weapon_action(self.weapon, WR_UPDATECOUNTS); - if(self.weapon == WEP5) // if using carrying # 5 already - { - //bprint("reset wep5\n"); - self.wpn = self.wpn5.weapon; - self.switchweapon = WEP5; - weapon_action(self.weapon, WR_DROP); - self.weapon = 0; - //weapon_action(self.wpn, WR_SETUP); // update the weapon we're holding - //weapon_action(self.wpn, WR_RAISE); // update the weapon we're holding - } - - if (other.classname == "player") - { - sprint (other, "You got the ^2"); - sprint (other, name); - sprint (other, "\n"); - } - - -/* - W_UpdateWeapon (); - W_UpdateAmmo (); -*/ - self = oldself; -} - -/* -void W_SwitchWeapon (float wep) -{ - float nextwep; - var float noammo = FALSE; - - if (wep == 1) - nextwep = IT_LASER; - else if (wep == 2) - { - nextwep = IT_SHOTGUN; - if (!self.ammo_shells) - noammo = TRUE; - } - else if (wep == 3) - { - nextwep = IT_UZI; - if (!self.ammo_nails) - noammo = TRUE; - } - else if (wep == 4) - { - nextwep = IT_CRYLINK; - if (!self.ammo_cells) - noammo = TRUE; - } - else if (wep == 5) - { - nextwep = IT_ELECTRO; - if (!self.ammo_cells) - noammo = TRUE; - } - else if (wep == 6) - { - nextwep = IT_GRENADE_LAUNCHER; - if (!self.ammo_rockets) - noammo = TRUE; - } - else if (wep == 7) - { - nextwep = IT_HAGAR; - if (!self.ammo_rockets) - noammo = TRUE; - } - else if (wep == 8) - { - nextwep = IT_NEX; - if (!self.ammo_cells) - noammo = TRUE; - } - else if (wep == 9) - { - nextwep = IT_ROCKET_LAUNCHER; - if (!self.ammo_rockets) - noammo = TRUE; - } - - - if (!(self.items & nextwep)) - { - sprint (self, "You don't own that weapon\n"); - return; - } - else if (noammo) - { - sprint (self, "You don't have any ammo for that weapon\n"); - return; - } - - self.weapon = nextwep; - W_UpdateWeapon (); - W_UpdateAmmo (); - self.attack_finished = time + 0.2; - if (self.viewzoom != 1) - self.viewzoom = 1; -} - -void W_NextWeapon (void) -{ - float noammo; - - while (TRUE) - { - noammo = FALSE; - - if (self.weapon == IT_ROCKET_LAUNCHER) - self.weapon = IT_LASER; - else if (self.weapon == IT_LASER) - { - self.weapon = IT_SHOTGUN; - if (!self.ammo_shells) - noammo = TRUE; - } - else if (self.weapon == IT_SHOTGUN) - { - self.weapon = IT_UZI; - if (!self.ammo_nails) - noammo = TRUE; - } - else if (self.weapon == IT_UZI) - { - self.weapon = IT_CRYLINK; - if (!self.ammo_cells) - noammo = TRUE; - } - else if (self.weapon == IT_CRYLINK) - { - self.weapon = IT_ELECTRO; - if (!self.ammo_cells) - noammo = TRUE; - } - else if (self.weapon == IT_ELECTRO) - { - self.weapon = IT_GRENADE_LAUNCHER; - if (!self.ammo_cells) - noammo = TRUE; - } - else if (self.weapon == IT_GRENADE_LAUNCHER) - { - self.weapon = IT_HAGAR; - if (!self.ammo_rockets) - noammo = TRUE; - } - else if (self.weapon == IT_HAGAR) - { - self.weapon = IT_NEX; - if (!self.ammo_rockets) - noammo = TRUE; - } - else if (self.weapon == IT_NEX) - { - self.weapon = IT_ROCKET_LAUNCHER; - if (!self.ammo_cells) - noammo = TRUE; - } - - if ((self.items & self.weapon) && !noammo) - { - W_UpdateWeapon (); - W_UpdateAmmo (); - return; - } - } -} - -void W_PreviousWeapon (void) -{ - float noammo; - - while (TRUE) - { - noammo = FALSE; - - if (self.weapon == IT_SHOTGUN) - self.weapon = IT_LASER; - else if (self.weapon == IT_UZI) - { - self.weapon = IT_SHOTGUN; - if (!self.ammo_shells) - noammo = TRUE; - } - else if (self.weapon == IT_CRYLINK) - { - self.weapon = IT_UZI; - if (!self.ammo_nails) - noammo = TRUE; - } - else if (self.weapon == IT_ELECTRO) - { - self.weapon = IT_CRYLINK; - if (!self.ammo_cells) - noammo = TRUE; - } - else if (self.weapon == IT_GRENADE_LAUNCHER) - { - self.weapon = IT_ELECTRO; - if (!self.ammo_cells) - noammo = TRUE; - } - else if (self.weapon == IT_HAGAR) - { - self.weapon = IT_GRENADE_LAUNCHER; - if (!self.ammo_rockets) - noammo = TRUE; - } - else if (self.weapon == IT_NEX) - { - self.weapon = IT_HAGAR; - if (!self.ammo_rockets) - noammo = TRUE; - } - else if (self.weapon == IT_ROCKET_LAUNCHER) - { - self.weapon = IT_NEX; - if (!self.ammo_cells) - noammo = TRUE; - } - else if (self.weapon == IT_LASER) - { - self.weapon = IT_ROCKET_LAUNCHER; - if (!self.ammo_rockets) - noammo = TRUE; - } - - if ((self.items & self.weapon) && !noammo) - { - W_UpdateWeapon (); - W_UpdateAmmo (); - return; - } - } -} -*/ -float W_CheckAmmo (void) -{ - if ((cvar("g_instagib") == 1) | (cvar("g_rocketarena") == 1)) - return TRUE; - - W_UpdateAmmo (); - if (self.weapon == IT_LASER) - return TRUE; - else if (self.currentammo) - return TRUE; - - self.weapon = W_GetBestWeapon (self); - W_UpdateWeapon (); - - return FALSE; -} - -/* -void FireRailgunBullet (vector src, float bdamage, vector dir, float spread, float deathtype) -{ - vector v, lastpos; - entity saveself, last; - vector org; - org = self.origin + self.view_ofs; - if (bdamage < 1) - return; - - last = self; - lastpos = src; - - while (bdamage > 0) - { - traceline_hitcorpse (self, org, org + v_forward * 4096 + v_right * crandom () * spread + v_up * crandom () * spread, FALSE, self); - last = trace_ent; - lastpos = trace_endpos; - if (trace_fraction != 1.0) - { - if (pointcontents(trace_endpos - dir*4) == CONTENT_SKY) - return; - - if (trace_ent.takedamage || trace_ent.classname == "case") - { - if (trace_ent.classname == "player" || trace_ent.classname == "corpse" || trace_ent.classname == "gib") - te_blood (trace_endpos, dir * bdamage * 16, bdamage); - Damage (trace_ent, self, self, bdamage, deathtype, trace_endpos, dir * bdamage); - } - } - if (last.solid == SOLID_BSP) - bdamage = 0; - } -} -*/ - -void FireRailgunBullet (vector start, vector end, float bdamage, float deathtype) -{ - local vector hitloc, force; - local entity ent; - //local entity explosion; - - force = normalize(end - start) * 800; //(bdamage * 10); - - // find how far the beam can go until it hits a wall - traceline (start, end, MOVE_HITMODEL, self); // doing this enables checking against model - // geometry -- leaving it disabled for now since - // it's a cpu hog. - //traceline (start, end, TRUE, self); - // go a little bit into the wall because we need to hit this wall later - end = trace_endpos + normalize(end - start); - - local float dam_mult; - local float zdif; - local float x; - local vector f; - local vector g; - local vector h; - - traceline_hitcorpse (self, start, end, FALSE, self); - if (trace_ent/* && deathtype == WEP_RAILGUN*/) // Area damage! - { - if ((trace_ent.classname == "player")) - { - f = (trace_endpos - start); - g_x = trace_endpos_x; - g_y = trace_endpos_y; - g_z = 0; - h_x = trace_ent.origin_x; - h_y = trace_ent.origin_y; - h_z = 0; - x = vlen ((g - h)); - f = ((normalize (f) * x) + trace_endpos); - zdif = (f_z - trace_ent.origin_z); - bprint(ftos(zdif)); - bprint("\n"); - deathmsg = 18; - trace_ent.head_shot_vector = '0 0 0'; - if (trace_ent.crouch == 1) // Damage enemy that's crouching - { - if (zdif < -5) - { - dam_mult = 0.5; - if ((trace_ent.team_no != self.team_no)) - { - trace_ent.leg_damage = (trace_ent.leg_damage + 1); - TeamFortress_SetSpeed (trace_ent); - deathmsg = RAILGUN_LEGSHOT; - bdamage = bdamage * .8; - } - if ((trace_ent.health > 0)) - { - if ((trace_ent.team_no == self.team_no)) - { - sprint (self, "Stop shooting team mates!!!\n"); - } - else - { - sprint (trace_ent, "Leg injury!\n"); - sprint (self, "Leg shot - that'll slow him down!\n"); - } - } - } - else - { - if (zdif > 5) - { - dam_mult = 3; - stuffcmd (trace_ent, "bf\n"); - //deathmsg = 29; - if ((trace_ent.health > 0)) - { - if ((trace_ent.team_no == self.team_no)) - { - sprint (self, "Stop shooting team mates!!!\n"); - } - else - { - trace_ent.head_shot_vector = (trace_ent.origin - self.origin); - deathmsg = 29; - if (zdif > 9.1) - { - bdamage = floor(bdamage * 4.0); - deathmsg = RAILGUN_HEADSHOT; - } - else - { - bdamage = floor(bdamage * 2.5); - deathmsg = RAILGUN_CHESTSHOT; - } - sound (self, 0, "speech/excelent.wav", 1, 0); - } - } - else - { - deathmsg = RAILGUN_BODYSHOT; - } - } - } - } - else { // Damage standing enemy - if (zdif < 0) - { - dam_mult = 0.5; - if ((trace_ent.team_no != self.team_no)) - { - trace_ent.leg_damage = (trace_ent.leg_damage + 1); - TeamFortress_SetSpeed (trace_ent); - deathmsg = RAILGUN_LEGSHOT; - bdamage = bdamage * .8; - //T_Damage (trace_ent, self, self, (self.heat * dam_mult)); - } - if ((trace_ent.health > 0)) - { - if ((trace_ent.team_no == self.team_no)) - { - sprint (self, "Stop shooting team mates!!!\n"); - } - else - { - sprint (trace_ent, "Leg injury!\n"); - sprint (self, "Leg shot - that'll slow him down!\n"); - deathmsg = RAILGUN_LEGSHOT; - } - } - //return; - } - else - { - if (zdif > 20) - { - dam_mult = 3; - stuffcmd (trace_ent, "bf\n"); - //deathmsg = 29; - if ((trace_ent.health > 0)) - { - if ((trace_ent.team_no == self.team_no)) - { - sprint (self, "Stop shooting team mates!!!\n"); - } - else - { - trace_ent.head_shot_vector = (trace_ent.origin - self.origin); - deathmsg = 29; -// bdamage = floor(bdamage * 3.5); - if (zdif > 31) - { - bdamage = floor(bdamage * 15.5); - deathmsg = RAILGUN_HEADSHOT; - } - else - { - bdamage = floor(bdamage * 2.5); - deathmsg = RAILGUN_CHESTSHOT; - } -// T_Damage (trace_ent, self, self, (self.heat * dam_mult)); - sound (self, 0, "speech/excelent.wav", 1, 0); -// if ((trace_ent.health > 0)) -// { -// sprint (trace_ent, 0, "Head injury!\n"); -// sprint (self, 1, "Head shot - that's gotta hurt!\n"); -// } - } - //return; - } - else - { - deathmsg = RAILGUN_BODYSHOT; - } - } - } - } - } - } - - // trace multiple times until we hit a wall, each obstacle will be made - // non-solid so we can hit the next, while doing this we spawn effects and - // note down which entities were hit so we can damage them later - while (1) - { - traceline_hitcorpse (self, start, end, FALSE, self); - - // if it is world we can't hurt it so stop now - if (trace_ent == world || trace_fraction == 1) - break; - - // make the entity non-solid so we can hit the next one - trace_ent.railgunhit = TRUE; - trace_ent.railgunhitloc = trace_endpos; - trace_ent.railgunhitsolidbackup = trace_ent.solid; - - // stop if this is a wall - if (trace_ent.solid == SOLID_BSP) - break; - - // make the entity non-solid - trace_ent.solid = SOLID_NOT; - } - - // find all the entities the railgun hit and restore their solid state - ent = findfloat(world, railgunhit, TRUE); - while (ent) - { - // restore their solid type - ent.solid = ent.railgunhitsolidbackup; - ent = findfloat(ent, railgunhit, TRUE); - } - - // spawn a temporary explosion entity for RadiusDamage calls - //explosion = spawn(); - - // find all the entities the railgun hit and hurt them - ent = findfloat(world, railgunhit, TRUE); - while (ent) - { - // get the details we need to call the damage function - hitloc = ent.railgunhitloc; - ent.railgunhitloc = '0 0 0'; - ent.railgunhitsolidbackup = SOLID_NOT; - ent.railgunhit = FALSE; - - // apply the damage - if (ent.takedamage || ent.classname == "case") -// Damage (ent, self, self, bdamage, deathtype, hitloc, force); - Damage (ent, self, self, bdamage, deathmsg, hitloc, force); - - // create a small explosion to throw gibs around (if applicable) - //setorigin (explosion, hitloc); - //RadiusDamage (explosion, self, 10, 0, 50, world, 300, deathtype); - - // advance to the next entity - ent = findfloat(ent, railgunhit, TRUE); - } - - // we're done with the explosion entity, remove it - //remove(explosion); -} - -// Area damage function -- -// added this so I dont have to paste this into every function I want area damage in. -// Returns a value of LEGSHOT, BODYSHOT, CHESTSHOT, or HEADSHOT. -float (entity a, vector start, vector end, float flt, entity b) FindBodyDamage = -{ - local float dam_mult; - local float zdif; - local float x; - local vector f; - local vector g; - local vector h; - - traceline_hitcorpse (a, start, end, flt, b); - if (trace_ent) - { - if ((trace_ent.classname == "player")) - { - f = (trace_endpos - start); - g_x = trace_endpos_x; - g_y = trace_endpos_y; - g_z = 0; - h_x = trace_ent.origin_x; - h_y = trace_ent.origin_y; - h_z = 0; - x = vlen ((g - h)); - f = ((normalize (f) * x) + trace_endpos); - zdif = (f_z - trace_ent.origin_z); - bprint(ftos(x)); - bprint("\n"); - deathmsg = 18; - trace_ent.head_shot_vector = '0 0 0'; - if (trace_ent.crouch == 1) // Damage enemy that's crouching - { - if (zdif < -5) - { - dam_mult = 0.5; - if ((trace_ent.team_no != self.team_no)) - { - trace_ent.leg_damage = (trace_ent.leg_damage + 1); -// TeamFortress_SetSpeed (trace_ent); - return LEGSHOT; - } -/* if ((trace_ent.health > 0)) - { - if ((trace_ent.team_no == self.team_no)) - { - sprint (self, "Stop shooting team mates!!!\n"); - } - else - { - sprint (trace_ent, "Leg injury!\n"); - sprint (self, "Leg shot - that'll slow him down!\n"); - } - }*/ - } - else - { - if (zdif > 5) - { - dam_mult = 3; - stuffcmd (trace_ent, "bf\n"); - if ((trace_ent.health > 0)) - { - /*if ((trace_ent.team_no == self.team_no)) - { - sprint (self, "Stop shooting team mates!!!\n"); - } - else*/ - { - trace_ent.head_shot_vector = (trace_ent.origin - self.origin); - deathmsg = 29; - if (zdif > 9.1) - { - return HEADSHOT; - } - else - { - return CHESTSHOT; - } - } - } - else - { - return BODYSHOT; - } - } - } - } - else { // Damage standing enemy -// if (zdif < 0) - if (zdif < 3) - { - dam_mult = 0.5; - if ((trace_ent.team_no != self.team_no)) - { - //trace_ent.leg_damage = (trace_ent.leg_damage + 1); // no leg dmg? -// TeamFortress_SetSpeed (trace_ent); - return LEGSHOT; - } -/* if ((trace_ent.health > 0)) - { - if ((trace_ent.team_no == self.team_no)) - { - sprint (self, "Stop shooting team mates!!!\n"); - } - else - { - sprint (trace_ent, "Leg injury!\n"); - sprint (self, "Leg shot - that'll slow him down!\n"); - } - }*/ - } - else - { - if (zdif > 20) - { - dam_mult = 3; - stuffcmd (trace_ent, "bf\n"); - if ((trace_ent.health > 0)) - { - /*if ((trace_ent.team_no == self.team_no)) - { - sprint (self, "Stop shooting team mates!!!\n"); - } - else*/ - { - trace_ent.head_shot_vector = (trace_ent.origin - self.origin); - if (zdif > 31) - { - return HEADSHOT; - } - else - { - return CHESTSHOT; - } - } - } - else - { - return BODYSHOT; - } - } - } - } - } - } -}; - -void fireBullet2 (vector start, vector dir, float spread, float damage, float dtype, float tracer, float force) -{ - vector end; - float r; - local entity e; - local float bdamage; - - // use traceline_hitcorpse to make sure it can hit gibs and corpses too - dir = dir + randomvec() * spread; - end = start + dir * 4096; - traceline_hitcorpse (self, start, end, FALSE, self); - - if (dtype == WEP_PISTOL) // if pistol weapon, apply area damage - { - bdamage = FindBodyDamage (self, start, end, FALSE, self); - if (bdamage == HEADSHOT) - { - damage = damage * 2.5; - dtype = PISTOL_HEADSHOT; - } - else if (bdamage == LEGSHOT) - { - damage = damage * .75; - dtype = PISTOL_LEGSHOT; - } - else - { - dtype = PISTOL_BODYSHOT; - } - } - - if (tracer) - { - e = spawn(); - e.owner = self; - e.movetype = MOVETYPE_FLY; - e.solid = SOLID_NOT; - e.think = SUB_Remove; - e.nextthink = time + vlen(trace_endpos - start) / 6000; - if (dtype == WEP_PISTOL) // if pistol, show slower bullet - e.velocity = dir * 1750; - else - e.velocity = dir * 6000; - e.angles = vectoangles(e.velocity); - setmodel (e, "models/tracer.mdl"); - setsize (e, '0 0 0', '0 0 0'); - setorigin (e, start); - e.effects = e.effects | EF_ADDITIVE; - } - - // FIXME - causes excessive 'tinking'. Hopefully remove "tink1.wav" from the ricochets with csqc - if ((trace_fraction != 1.0) && (pointcontents (trace_endpos) != CONTENT_SKY)) - { - if (trace_ent.solid == SOLID_BSP) - { - pointcontents (self.origin); - te_gunshot (trace_endpos); - r = random (); - if (r < 0.10) - PointSound (trace_endpos, "weapons/ric1.wav", 1, ATTN_NORM); - else if (r < 0.20) - PointSound (trace_endpos, "weapons/ric2.wav", 1, ATTN_NORM); - else if (r < 0.30) - PointSound (trace_endpos, "weapons/ric3.wav", 1, ATTN_NORM); - } - else if (trace_ent.classname == "player" || trace_ent.classname == "corpse" || trace_ent.classname == "gib") - sound (self, CHAN_BODY, "misc/hit.wav", 1, ATTN_NORM); - Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * force); - } -} - -void fireBullet (vector start, vector dir, float spread, float damage, float dtype, float tracer) -{ - fireBullet2(start, dir, spread, damage, dtype, tracer, damage * 5); // default force value -} - -/* -void W_Attack (void) -{ - if (self.deadflag != DEAD_NO) - { - if (self.death_time < time) - PutClientInServer(); - - return; - } - - if (!W_CheckAmmo ()) - return; - - makevectors (self.v_angle); - //if (self.weapon == IT_LASER) - // W_Laser_Attack (); - //if (self.weapon == IT_SHOTGUN) - //W_Shotgun_Attack (); - //else if (self.weapon == IT_UZI) - //W_Uzi_Attack (); - if (self.weapon == IT_CRYLINK) - W_Crylink_Attack (); - else if (self.weapon == IT_ELECTRO) - { - W_Electro_Attack (self.electrocount); - self.electrocount = self.electrocount + 1; - if (self.electrocount == 3) - self.electrocount = 0; - } - else if (self.weapon == IT_GRENADE_LAUNCHER) - W_Grenade_Attack (); - else if (self.weapon == IT_HAGAR) - W_Hagar_Attack (); - else if (self.weapon == IT_NEX) - W_Nex_Attack (); - //else if (self.weapon == IT_ROCKET_LAUNCHER) - // W_Rocket_Attack (); - - W_UpdateAmmo (); -} - -void W_SecondaryAttack (void) -{ - if (self.deadflag != DEAD_NO) - { - if (self.death_time < time) - PutClientInServer(); - - return; - } - - if (!W_CheckAmmo ()) - return; - - makevectors (self.v_angle); - //if (self.weapon == IT_LASER) - //W_Laser_Attack2 (); - //if (self.weapon == IT_SHOTGUN) - //W_Shotgun_Attack2 (); - //else if (self.weapon == IT_UZI) - //W_Uzi_Attack2 (); - else if (self.weapon == IT_CRYLINK) - W_Crylink_Attack2 (); - else if (self.weapon == IT_ELECTRO) { - W_Electro_Attack2 (self.electrocount); - self.electrocount = self.electrocount + 1; - if (self.electrocount == 3) - self.electrocount = 0; - } - else if (self.weapon == IT_GRENADE_LAUNCHER) - W_Grenade_Attack2 (); - else if (self.weapon == IT_HAGAR) - W_Hagar_Attack2 (); - else if (self.weapon == IT_NEX) - W_Nex_Attack2 (); - //else if (self.weapon == IT_ROCKET_LAUNCHER) - //W_Rocket_Attack2 (); - - W_UpdateAmmo (); -} - -void W_ThirdAttack (void) -{ - if (self.deadflag != DEAD_NO) - { - if (self.death_time < time) - PutClientInServer(); - - return; - } - - if (!W_CheckAmmo ()) - return; - - makevectors (self.v_angle); - //if (self.weapon == IT_LASER) - //W_Laser_Attack2 (); - //if (self.weapon == IT_SHOTGUN) - //W_Shotgun_Attack2 (); - //else if (self.weapon == IT_UZI) - //W_Uzi_Attack3 (); - else if (self.weapon == IT_CRYLINK) - W_Crylink_Attack2 (); - else if (self.weapon == IT_ELECTRO) { - W_Electro_Attack3 (self.electrocount); - self.electrocount = self.electrocount + 1; - if (self.electrocount == 3) - self.electrocount = 0; - } - else if (self.weapon == IT_GRENADE_LAUNCHER) - W_Grenade_Attack3 (); - else if (self.weapon == IT_HAGAR) - W_Hagar_Attack3 (); - else if (self.weapon == IT_NEX) - W_Nex_Attack2 (); - //else if (self.weapon == IT_ROCKET_LAUNCHER) - //W_Rocket_Attack3 (); - - W_UpdateAmmo (); -} -*/ - -float RateFlameDamage(float flametime, float flamedmg, float flamerate) -{ - // return (how much longer flame will last) * (how much to damage per think / how often to think) - return (flametime - time) * (flamedmg / flamerate); -} - -/*void FlamePuffThink() -{ - self.nextthink = time + self.cnt; - self.frame = self.frame + 1; - if(self.frame >= self.count) - self.think = SUB_Remove; -} -*/ -void FlameBurnTarget(); - - -entity CreateFlame(entity targ, entity attacker) -{ - entity f; - f = targ.onfire = spawn(); - f.classname = "burning"; - f.owner = attacker; - f.enemy = targ; - f.dmg = 0; - f.ltime = 0; - f.wait = 0; - f.think = FlameBurnTarget; - f.onfire = spawn(); - - f.effects = f.onfire.effects = EF_ADDITIVE; - f.scale = f.onfire.scale = 2; - - setmodel(f, "models/sprites/fire_top.spr32"); - setattachment(f, f.enemy, ""); - setmodel(f.onfire, "models/sprites/fire_base.spr32"); - - setorigin(f.onfire, '0 0 -5' * f.scale); - setorigin(f, '0 0 2' * f.scale + '0 0 20'); - setattachment(f.onfire, f, ""); - - return f; -} - -entity IgniteTarget (entity targ, entity attacker, float flametime, float flamedmg, float flamerate, float rateflame) -{ - entity f; - - //bprint("ignite targets?\n"); - - if(targ.class == CLASS_PYRO) - { - //flametime = flametime / 5; // pyros don't stay on fire for long - return world; // don't set pyros on fire - } - - if(targ.class == CLASS_MEDIC) - { - //flametime = flametime / 3; // medics don't stay on fire for long - return world; // don't set medics on fire - } - - f = targ.onfire; - if(f == world) - { - f = CreateFlame(targ, attacker); - } - else - { - if(f.nextthink <= 0) - f.nextthink = time + flamerate; - } - - -// bprint(ftos(f.wait), ", ", ftos(f.dmg), ", ", ftos(f.ltime), "\n"); - //bprint(ftos(flametime), ", ", ftos(flamedmg), ", ", ftos(flamerate), "\n"); -// bprint(ftos(RateFlameDamage(f.wait, f.dmg, f.ltime)), ", ", ftos(RateFlameDamage(flametime, flamedmg, flamerate)), "\n"); - - if(rateflame && RateFlameDamage(f.wait, f.dmg, f.ltime) > RateFlameDamage(time + flametime, flamedmg, flamerate)) - { - f.owner = attacker; // give the new attacker ownership of the burn damage - return f; // current damage rating is larger, don't replace it - } - - //bprint("burning success: ", ftos(flametime), "\n"); - - f.dmg = flamedmg; - f.ltime = flamerate; - f.wait = time + flametime; - - if(!f.nextthink || f.nextthink > time + f.ltime) - f.nextthink = time + f.ltime; - - return f; -} - -void ExtinguishFlame(entity targ) -{ - entity f, b; - if(!targ.onfire)//targ.onfire.classname != "burning") - return; - //bprint(strcat("ExtinguishFlame(", targ.classname, ") ", targ.onfire.classname, "\n")); - - f = targ.onfire; - b = targ.onfire.onfire; - - // fixme: hiss sound - - if(b) - { - b.think = SUB_Null; - b.nextthink = -1; - setmodel(b, "models/sprites/null.spr"); - setattachment(b, world, ""); - remove(b); // remove base model - //targ.onfire.onfire.think = SUB_Remove; - //targ.onfire.onfire.nextthink = time + 0.1; - f.onfire = world; - } - f.think = SUB_Null; - f.nextthink = -1; - setmodel(f, "models/sprites/null.spr"); - setattachment(f, world, ""); - //targ.onfire.think = SUB_Remove; - //targ.onfire.nextthink = time + 0.1; - remove(f); - targ.onfire = world; -} - -void FlameBurnTarget() -{ - entity head; - float flametime, flametimemax, radius, flameratio, distratio, edgeratio, damage; - //bprint("flame burn target\n"); - - if(self.enemy == world || self.enemy.classname == "gib") - { - if(self.enemy != world) - { - //bprint("on a gib, remove flame\n"); - //self.enemy.onfire = world; - ExtinguishFlame(self.enemy); - return; - } - //bprint("enemy is world, remove flame\n"); - self.think = SUB_Null; - self.nextthink = -1; - setmodel(self, "models/sprites/null.spr"); - setattachment(self, world, ""); - if(self.onfire) - { - self.onfire.think = SUB_Null; - self.onfire.nextthink = -1; - setmodel(self.onfire, "models/sprites/null.spr"); - setattachment(self.onfire, world, ""); - remove(self.onfire); - self.onfire = world; - } - remove(self); - return; - } - - if(self.wait < time || self.enemy.waterlevel > 2 || (!self.enemy.takedamage && self.enemy.classname != "grenade")) - { - /*if(self.enemy != world) - { - self.enemy.effects = self.enemy.effects - (self.enemy.effects & EF_FLAME); - self.enemy.onfire = world; - } - remove(self);*/ - ExtinguishFlame(self.enemy); - return; - } - self.nextthink = time + self.ltime; - - Damage (self.enemy, self, self.owner, self.dmg, DEATH_BURNING, self.enemy.origin - '0 0 5', '0 0 0');//'0 0 -1' * self.dmg); - - // flames spread to other targets - - radius = cvar("g_balance_heat_radius"); - head = findradius(self.enemy.origin, radius); - while(head) - { - if((head.takedamage || head.classname == "grenade") && head != self.enemy) - { - //bprint(strcat("maybe burn ", head.classname, "\n")); - // don't harm or spread to allies or pyros - //if(!(head.classname == "player" && (head.team == self.owner.team || head.class == CLASS_PYRO)) ) - if(head.classname == "player") - { - if(head.class == CLASS_PYRO || head.class == CLASS_MEDIC) // pyros & medics are mostly immune to fire - { head = head.chain; continue;} - if(head.team == self.owner.team && teamplay) // don't hurt teammates - { head = head.chain; continue;} - } - - traceline(self.enemy.origin, head.origin, TRUE, self); - if(trace_fraction >= 1) - { - //bprint(strcat("burn ", head.classname, "\n")); - edgeratio = cvar("g_balance_heat_edgeratio"); - distratio = ( 1 - (vlen(self.enemy.origin - head.origin) / radius) ); - flameratio = edgeratio + distratio*(1 - edgeratio); - - // increase the player's heat; if it goes over the max it'll get capped automatically by the cooldown code - //head.flame_heat = cvar("g_balance_maxheat"); - head.flame_heat = head.flame_heat + flameratio * cvar("g_balance_heatup_rate") * self.ltime; - //head.flame_heat_time = time; - - // deal direct damage from the heat radiated by the fire - damage = flameratio * self.dmg*cvar("g_balance_heat_damage"); - Damage (head, self, self.owner, damage, DEATH_BURNING, self.enemy.origin, '0 0 0'); - - if(head.flame_heat >= 1.0 && head.takedamage == DAMAGE_AIM && head.health > 0) - { - flametimemax = cvar("g_balance_heat_timemax"); - flametime = (self.wait - time) * cvar("g_balance_heat_transfer"); - if(flametime > flametimemax) - flametime = flametimemax; - - - //bprint(ftos(time), " - flame transfer - ", ftos(flametime), "\n"); - - - IgniteTarget(head, self.owner, flametime, self.dmg, self.ltime, TRUE); - } - } - } - head = head.chain; - } -} - - -void PoisonTarget(entity targ, float poisonDamage, float poisonTime, float ratepoison) -{ - if(targ.class == CLASS_MEDIC) - { - return; // don't poison medics - } - - if(ratepoison && targ.poison_damage > poisonDamage) - return; // current damage rating is larger, don't replace it - - targ.poison_damage = poisonDamage; - targ.poison_rate = poisonDamage / poisonTime; -} - - - - - - - - - - - -float W_LimitNumEnts(string clname, float num_allowed, void() DeathFunc) -{ - float num, oldest; - local entity e, selected; - e = world; - oldest = time + 1; - num = 0; - do - { - e = find(e, classname, clname); - if(e != world && e.owner == self) - { - num = num + 1; - if(e.create_time < oldest) - { - selected = e; - oldest = e.create_time; - } - } - }while(e); - - if(num > num_allowed) - { - if(selected != world) - { - e = self; - self = selected; - DeathFunc(); - self = e; - return TRUE; - } - else - bprint("error (W_LimitNumEnts): cannot find oldest entity\n"); - } - return FALSE; -} - diff --git a/attic/TeamNexuiz/game/gamec/w_crylink.c b/attic/TeamNexuiz/game/gamec/w_crylink.c deleted file mode 100644 index 36c17fad4..000000000 --- a/attic/TeamNexuiz/game/gamec/w_crylink.c +++ /dev/null @@ -1,122 +0,0 @@ -void() crylink_ready_01; -void() crylink_fire1_01; -void() crylink_deselect_01; -void() crylink_select_01; - -.float gravity; - -float() crylink_check = -{ - if (self.ammo_cells >= 1) - return TRUE; - return FALSE; -}; - -void(float req) w_crylink = -{ - if (req == WR_IDLE) - crylink_ready_01(); - else if (req == WR_FIRE1 || req == WR_FIRE2) - weapon_prepareattack(crylink_check, crylink_check, crylink_fire1_01, cvar("g_balance_crylink_refire")); - else if (req == WR_RAISE) - crylink_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = self.ammo_cells; - else if (req == WR_DROP) - crylink_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_CRYLINK, "w_crylink.zym", IT_CELLS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = crylink_check(); -}; - - -void W_Crylink_Touch (void) -{ - self.event_damage = SUB_Null; - //te_smallflash(self.origin); - RadiusDamage (self, self.owner, cvar("g_balance_crylink_damage"), cvar("g_balance_crylink_edgedamage"), cvar("g_balance_crylink_radius"), world, cvar("g_balance_crylink_force"), WEP_CRYLINK); - self.touch = SUB_Null; - setmodel (self, "models/plasma.mdl"); - setsize (self, '0 0 0', '0 0 0'); - self.gravity = 1; - self.glow_size = 0; - self.glow_color = 0; - self.think = SUB_Remove; - //self.movetype = MOVETYPE_NONE; - self.effects = EF_LOWPRECISION; - SUB_SetFade(self, time, 1); - //remove (self); -} - -void W_Crylink_Attack (void) -{ - local float counter; - local vector org; - local entity proj; - local vector end; - - local vector trueaim; - org = self.origin + self.view_ofs; - end = self.origin + self.view_ofs + v_forward * 4096; - traceline(org,end,TRUE,self); - - trueaim = trace_endpos; - - sound (self, CHAN_WEAPON, "weapons/crylink.ogg", 1, ATTN_NORM); - if (cvar("g_use_ammunition")) - self.ammo_cells = self.ammo_cells - 1; - self.punchangle_x = -2; - org = self.origin + self.view_ofs + v_forward * 10 + v_right * 5 + v_up * -14; - te_smallflash(org); - - while (counter < 5) - { - proj = spawn (); - proj.owner = self; - proj.classname = "spike"; - - proj.movetype = MOVETYPE_BOUNCE; - proj.solid = SOLID_BBOX; - proj.gravity = 0.001; - - setmodel (proj, "models/plasmatrail.mdl"); - setsize (proj, '0 0 0', '0 0 0'); - setorigin (proj, org); - - if (self.button3) - proj.velocity = (normalize(trueaim - org) + (counter / 2 - 1) * v_right * cvar("g_balance_crylink_spread")) * cvar("g_balance_crylink_speed"); - else - proj.velocity = (normalize(trueaim - org) + (counter / 5) * randomvec() * cvar("g_balance_crylink_spread")) * cvar("g_balance_crylink_speed"); - proj.touch = W_Crylink_Touch; - proj.think = SUB_Remove; - proj.nextthink = time + 9; - - proj.angles = vectoangles (proj.velocity); - - //proj.glow_size = 20; - - proj.effects = proj.effects | EF_FULLBRIGHT; - //proj.effects = proj.effects | EF_ADDITIVE; - proj.effects = proj.effects | EF_LOWPRECISION; - counter = counter + 1; - } - - self.clip_crylink -= 1; - if (self.clip_crylink <= 0) - { - DoReload (2, CLIP_MAX_CRYLINK); // Crylink is weapon 2, reloads for max clip of weapon. - } -} - - -// weapon frames -void() crylink_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, crylink_ready_01); self.weaponentity.state = WS_READY;}; -void() crylink_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() crylink_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() crylink_fire1_01 = -{ - weapon_doattack(crylink_check, crylink_check, W_Crylink_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.15, crylink_ready_01); -}; - diff --git a/attic/TeamNexuiz/game/gamec/w_electro.c b/attic/TeamNexuiz/game/gamec/w_electro.c deleted file mode 100644 index 50f378add..000000000 --- a/attic/TeamNexuiz/game/gamec/w_electro.c +++ /dev/null @@ -1,146 +0,0 @@ -void() electro_ready_01; -void() electro_fire1_01; -void() electro_deselect_01; -void() electro_select_01; - -float() electro_check = -{ - if (self.ammo_cells > 2) - return TRUE; - return FALSE; -}; - -void(float req) w_electro = -{ - if (req == WR_IDLE) - electro_ready_01(); - else if (req == WR_FIRE1 || req == WR_FIRE2) - weapon_prepareattack(electro_check, electro_check, electro_fire1_01, cvar("g_balance_electro_refire")); - else if (req == WR_RAISE) - electro_select_01(); - else if (req == WR_UPDATECOUNTS) -// self.currentammo = floor(self.ammo_cells / 2); //why divide by 2? - self.currentammo = floor(self.ammo_cells); - else if (req == WR_DROP) - electro_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_ELECTRO, "w_electro.zym", IT_CELLS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = electro_check(); -}; - -void W_Plasma_Explode (void) -{ - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte (MSG_BROADCAST, 79); - WriteCoord (MSG_BROADCAST, self.origin_x); - WriteCoord (MSG_BROADCAST, self.origin_y); - WriteCoord (MSG_BROADCAST, self.origin_z); - WriteCoord (MSG_BROADCAST, 0); // SeienAbunae: groan... Useless clutter - WriteCoord (MSG_BROADCAST, 0); - WriteCoord (MSG_BROADCAST, 0); - WriteByte (MSG_BROADCAST, 155); - - self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_electro_damage"), cvar("g_balance_electro_edgedamage"), cvar("g_balance_electro_radius"), world, cvar("g_balance_electro_force"), WEP_ELECTRO); - sound (self, CHAN_BODY, "weapons/electro_impact.ogg", 1, ATTN_NORM); - - remove (self); -} - -void W_Plasma_Touch (void) -{ - if (other.classname == "player" || other.classname == "corpse") - W_Plasma_Explode (); - else - sound (self, CHAN_IMPACT, "weapons/grenade_bounce.ogg", 1, ATTN_NORM); -} - -void W_Plasma_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - self.health = self.health - damage; - if (self.health <= 0) - W_Plasma_Explode (); -} - -void() W_Electro_Attack -{ - local entity proj; - local vector org; - local float postion; - - local vector end; - local vector trueaim; - org = self.origin + self.view_ofs; - end = self.origin + self.view_ofs + v_forward * 4096; - traceline(org,end,TRUE,self); - trueaim = trace_endpos; - - postion = self.electrocount; - sound (self, CHAN_WEAPON, "weapons/electro_fire.ogg", 1, ATTN_NORM); - - self.punchangle_x = -2; - - if (cvar("g_use_ammunition")) - self.ammo_cells = self.ammo_cells - 2; - - if (self.electrocount == 0) - { - self.electrocount = 1; - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 5 + v_up * -14; - } - else if (self.electrocount == 1) - { - self.electrocount = 2; - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 10 + v_up * -12; - } - else - { - self.electrocount = 0; - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 15 + v_up * -14; - } - - proj = spawn (); - proj.classname = "plasma"; - proj.owner = self; - proj.effects = EF_BRIGHTFIELD | EF_ADDITIVE; - proj.think = W_Plasma_Explode; - proj.nextthink = time + 2; - proj.solid = SOLID_BBOX; - setorigin(proj, org); - - if (self.button3) - { - proj.movetype = MOVETYPE_BOUNCE; - proj.velocity = normalize(trueaim - org) * cvar("g_balance_electro_ballspeed") + v_up * cvar("g_balance_electro_ballspeed_up"); - proj.touch = W_Plasma_Touch; - setmodel(proj, "models/ebomb.mdl"); - setsize(proj, '-6 -6 -3', '6 6 3'); - proj.takedamage = DAMAGE_YES; - proj.damageforcescale = 4; - proj.health = 5; - proj.event_damage = W_Plasma_Damage; - } - else - { - proj.movetype = MOVETYPE_FLY; - proj.velocity = normalize(trueaim - org) * cvar("g_balance_electro_speed"); - proj.angles = vectoangles(proj.velocity); - proj.touch = W_Plasma_Explode; - setmodel(proj, "models/elaser.mdl"); - setsize(proj, '0 0 0', '0 0 0'); - } - sound (proj, CHAN_BODY, "weapons/electro_fly.ogg", 1, ATTN_NORM); -} - -// weapon frames - -void() electro_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, electro_ready_01); self.weaponentity.state = WS_READY;}; -void() electro_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() electro_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() electro_fire1_01 = -{ - weapon_doattack(electro_check, electro_check, W_Electro_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.3, electro_ready_01); -}; - diff --git a/attic/TeamNexuiz/game/gamec/w_flamer.c b/attic/TeamNexuiz/game/gamec/w_flamer.c deleted file mode 100644 index 7ed75659e..000000000 --- a/attic/TeamNexuiz/game/gamec/w_flamer.c +++ /dev/null @@ -1,165 +0,0 @@ -void() flamer_ready_01; -void() flamer_fire1_01; -void() flamer_deselect_01; -void() flamer_select_01; - -float() flamer_check = -{ - if (self.ammo_nails >= 4) - return TRUE; - return FALSE; -}; - -void(float req) w_flamer = -{ - if (req == WR_IDLE) - flamer_ready_01(); - else if (req == WR_FIRE1 || req == WR_FIRE2) - weapon_prepareattack(flamer_check, flamer_check, flamer_fire1_01, .09); - else if (req == WR_RAISE) - flamer_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = floor(self.ammo_nails/4); - else if (req == WR_DROP) - flamer_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_FLAMER, "w_flamethrower.zym", IT_ROCKETS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = flamer_check(); -}; - -void W_Flamer_Touch (void) -{ - float wasliving, burntime, minburntime, maxburntime; - if (other == self.owner) - return; - else if (pointcontents (self.origin) == CONTENT_SKY) - { - remove (self); - return; - } - -// dillute = 1 - 0.65*(1 - self.alpha); -// dillute = 1 - cvar("g_balance_flamer_dillute")*(self.frame / 20); - - wasliving = other.health; - if(!self.cnt) // direct damage only if haven't touched once before - { - RadiusDamage (self, self.owner, cvar("g_balance_flamer_damage"), cvar("g_balance_flamer_edgedamage"), cvar("g_balance_flamer_radius"), world, cvar("g_balance_flamer_force"), WEP_FLAMER); - - if(other.takedamage == DAMAGE_AIM)//health > 2) - { // ignite target or renew fire damage - burntime = other.onfire.wait - time; - minburntime = cvar("g_balance_flamer_burntime"); - maxburntime = cvar("g_balance_flamer_burntime_max"); - if(burntime < minburntime) - burntime = minburntime; - else - burntime = burntime + cvar("g_balance_flamer_burntime_inc"); - - if(burntime > maxburntime) - burntime = maxburntime; - - - IgniteTarget(other, self.owner, - burntime, - cvar("g_balance_flamer_burndamage"), - cvar("g_balance_flamer_burnrate"), - TRUE); - } - } - - if(wasliving > 2) - self.cnt = 1; // once it's touched something it can damage, it can't directly damage anymore, or set on fire or renew the flame damage (just for looks) - self.velocity_x = self.velocity_x * 0.5; - self.velocity_y = self.velocity_y * 0.5; -} - -// fade the flame off, the only way the fire can be destroyed -void W_Flamer_Dissipate () -{ - if (self.alpha < 0.01 || pointcontents (self.origin) == CONTENT_WATER)// || self.frame >= 20) - { - remove(self); - return; - } - self.scale = self.scale + 0.35;//0.2; - self.alpha = self.alpha - 0.08;//0.04; - self.frame = self.frame + 1; - if(self.frame > 20) - self.frame = 20; - self.think = W_Flamer_Dissipate; - self.nextthink = time + 0.1; - //if(self.colormod_y > 0) - self.colormod = self.colormod - '0 0.004 0.01' * 25;//'0 0.2 0.12'; // fade to red! -}; - -void W_Flamer_Attack (void) -{ - local entity missile; - local vector org; - local vector end; - - local vector trueaim; - org = self.origin + self.view_ofs; - end = self.origin + self.view_ofs + v_forward * 4096; - traceline(org,end,TRUE,self); - trueaim = trace_endpos; - - sound (self, CHAN_WEAPON, "weapons/flamer.wav", 1, ATTN_NORM); - self.ammo_nails = self.ammo_nails - 4; - org = self.origin + self.view_ofs + v_forward * 1 + v_right * 14 + v_up * -5; - - missile = spawn (); - missile.owner = self; - missile.classname = "flame"; - missile.think = W_Flamer_Dissipate; - missile.nextthink = time + 0.01; - missile.touch = W_Flamer_Touch; - missile.solid = SOLID_BBOX; - setorigin (missile, org); - setmodel (missile, "models/sprites/hagarexplosion.spr32"); - setsize (missile, '0 0 0', '0 0 0'); - missile.effects = EF_LOWPRECISION | EF_ADDITIVE; - missile.alpha = 0.7;//0.3; - missile.scale = 0.005;//0.015;//0.15; - missile.colormod = '1 1 1'; // set full colors, then reduce later - missile.frame = random() * 4 + 2; - - missile.movetype = MOVETYPE_BOUNCE; - missile.gravity = -0.07; // fall lightly up -// missile.velocity = (v_forward + v_right * crandom() * 0.035 + v_up * crandom() * 0.015) * cvar("g_balance_flamer_speed"); - missile.velocity = normalize(trueaim - org) * cvar("g_balance_flamer_speed"); - - missile.angles = vectoangles (missile.velocity); -} - -// weapon frames -void() flamer_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, flamer_ready_01); self.weaponentity.state = WS_READY;}; -void() flamer_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() flamer_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; - -void() flamer_fire1_02 = -{ - if (self.button0 || self.button3) - { - weapon_doattack(flamer_check, flamer_check, W_Flamer_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.09, flamer_fire1_02); - weapon_prepareattack(flamer_check, flamer_check, SUB_Null, .09); - } - else - weapon_thinkf(WFRAME_FIRE1, 0.09, flamer_ready_01); -}; -void() flamer_fire1_01 = -{ - weapon_doattack(flamer_check, flamer_check, W_Flamer_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.09, flamer_fire1_02); -}; -/* -void() flamer_fire1_01 = -{ - weapon_doattack(flamer_check, flamer_check, W_Flamer_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.003, flamer_ready_01); - //flamer_ready_01(); -};*/ - diff --git a/attic/TeamNexuiz/game/gamec/w_grenadelauncher.c b/attic/TeamNexuiz/game/gamec/w_grenadelauncher.c deleted file mode 100644 index 615e60c4e..000000000 --- a/attic/TeamNexuiz/game/gamec/w_grenadelauncher.c +++ /dev/null @@ -1,112 +0,0 @@ -void() glauncher_ready_01; -void() glauncher_fire1_01; -void() glauncher_deselect_01; -void() glauncher_select_01; - -float() glauncher_check = -{ - if (self.ammo_rockets >= 2) - return TRUE; - return FALSE; -}; - -void(float req) w_glauncher = -{ - if (req == WR_IDLE) - glauncher_ready_01(); - else if (req == WR_FIRE1 || req == WR_FIRE2) - weapon_prepareattack(glauncher_check, glauncher_check, glauncher_fire1_01, cvar("g_balance_grenadelauncher_refire")); - else if (req == WR_RAISE) - glauncher_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = floor(self.ammo_rockets / 2); - else if (req == WR_DROP) - glauncher_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_GRENADE_LAUNCHER, "w_gl.zym", IT_ROCKETS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = glauncher_check(); -}; - -void W_Grenade_Explode (void) -{ - vector org2; - org2 = findbetterlocation (self.origin); - te_explosion (org2); - effect (org2, "models/sprites/grenadeexplosion.spr32", 0, 20, 30); - sound (self, CHAN_BODY, "weapons/grenade_impact.wav", 1, ATTN_NORM); - - self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_damage"), cvar("g_balance_grenadelauncher_edgedamage"), cvar("g_balance_grenadelauncher_radius"), world, cvar("g_balance_grenadelauncher_force"), WEP_GRENADE_LAUNCHER); - - remove (self); -} - -void W_Grenade_Touch (void) -{ - if (other.classname == "player" || other.classname == "corpse") - W_Grenade_Explode (); - else - sound (self, CHAN_IMPACT, "weapons/grenade_bounce.wav", 1, ATTN_NORM); -} - -void W_Grenade_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - self.health = self.health - damage; - if (self.health <= 0) - W_Grenade_Explode(); -} - -void W_Grenade_Attack (void) -{ - local entity gren; - local vector org; - - sound (self, CHAN_WEAPON, "weapons/grenade_fire.wav", 1, ATTN_NORM); - self.punchangle_x = -4; - self.ammo_rockets = self.ammo_rockets - 2; - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 5 + v_up * -12; - - gren = spawn (); - gren.owner = self; - gren.classname = "grenade"; - gren.movetype = MOVETYPE_BOUNCE; - gren.solid = SOLID_BBOX; - setmodel(gren, "models/grenademodel.md3"); - setsize(gren, '-6 -6 -3', '6 6 3'); - setorigin(gren, org); - - if (self.button3) - { - gren.nextthink = time + 2.5; - gren.think = W_Grenade_Explode; - gren.touch = W_Grenade_Touch; - gren.takedamage = DAMAGE_YES; - gren.health = 10; - gren.damageforcescale = 4; - gren.event_damage = W_Grenade_Damage; - gren.velocity = v_forward * cvar("g_balance_grenadelauncher_speed2") + v_up * cvar("g_balance_grenadelauncher_speed2_up"); - gren.avelocity = '100 150 100'; - } - else - { - gren.nextthink = time + 30; - gren.think = W_Grenade_Explode; - gren.touch = W_Grenade_Explode; - gren.velocity = v_forward * cvar("g_balance_grenadelauncher_speed") + v_up * cvar("g_balance_grenadelauncher_speed_up"); - gren.avelocity_x = random () * -500 - 500; - } - - gren.angles = vectoangles (gren.velocity); -} - -// weapon frames - -void() glauncher_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, glauncher_ready_01); self.weaponentity.state = WS_READY;}; -void() glauncher_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() glauncher_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() glauncher_fire1_01 = -{ - weapon_doattack(glauncher_check, glauncher_check, W_Grenade_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.3, glauncher_ready_01); -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/w_grenades.c b/attic/TeamNexuiz/game/gamec/w_grenades.c deleted file mode 100644 index d18134dc1..000000000 --- a/attic/TeamNexuiz/game/gamec/w_grenades.c +++ /dev/null @@ -1,841 +0,0 @@ -void W_Grenade_DefaultTouch (void) -{ - if (!self.state & 1 && (other.classname == "player" || other.classname == "corpse")) - self.think(); // assume my think was an explosion function - else - sound (self, CHAN_IMPACT, "weapons/grenade_bounce.wav", 1, ATTN_NORM); -} - -void W_Grenade_DefaultDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - self.health = self.health - damage; - if (self.health <= 0) - self.think(); // assume my think was an explosion function -} - -float W_ThrowGrenade(void() GrenadeSpecial) -{ - local entity gren, oself; - local vector org; - - if(self.ammo_shells < 10) - { - sprint(self, "Not enough grenade ammo\n"); - self.grenade_time = time + 0.3; - return FALSE; - } - self.ammo_shells = self.ammo_shells - 10; - -// sound (self, CHAN_WEAPON, "weapons/grenade_fire.wav", 1, ATTN_NORM); - self.punchangle_x = -2; - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 5 + v_up * -12; - - gren = spawn (); - gren.owner = self; - gren.classname = "grenade"; - gren.movetype = MOVETYPE_BOUNCE; - gren.solid = SOLID_BBOX; - setorigin(gren, org); - - gren.takedamage = DAMAGE_YES; - gren.health = 10; - //gren.damageforcescale = 4; - gren.event_damage = W_Grenade_DefaultDamage; - - oself = self; - self = gren; - - GrenadeSpecial(); - - self = oself; - - return TRUE; -} - -//-------------------------------------------- - -void InflictStunStatus(entity targ, float stuntime) -{ - if(targ.classname != "player") - return; // only players can be stunned (fixme: turrets? vehicles?) - - // stun target by increasing attack_finished so he can't attack - if(targ.attack_finished < time + stuntime) - targ.attack_finished = time + stuntime; - - // also prevent use of grenades - // disabled, since the point of the grenades is being - // able to attack when weapon is busy or disabled - //if(targ.grenade_time < time + stuntime) - // targ.grenade_time = time + stuntime; -} - -//-------------------------------------------- - -void ExtinguishFirebomb(entity e) -{ - entity f, b; - if(e.enemy == world) - { - //bprint("ExtinguishFirebomb failed, no enemy!\n"); - return; - } - //bprint(strcat("ExtinguishFirebomb(", e.classname, ") ", e.enemy.classname, "\n")); - - f = e.enemy; - b = e.enemy.enemy; - - e.enemy = world; - f.enemy = world; - - f.think = SUB_Null; - f.nextthink = -1; - setmodel(f, "models/sprites/null.spr"); - setattachment(f, world, ""); - if(b) - { - b.think = SUB_Null; - b.nextthink = -1; - setmodel(b, "models/sprites/null.spr"); - setattachment(b, world, ""); - remove(b); - //b.think = SUB_Remove; - //b.nextthink = time + 2; - } - setmodel(e, ""); - //f.think = SUB_Remove; - //f.nextthink = time + 2; - //eprint(f); - remove(f); - //eprint(f); -} - -void Firebomb_Flame_Check() -{ - if(self.owner == world || self.owner.model == "") - { - if(self.owner != world && self.owner.enemy == self) - { - //bprint("Firebomb flame calls ExtinguishFirebomb on owner\n"); - - ExtinguishFirebomb(self.owner); - self.owner.enemy = world; - return; - } - //bprint("Firebomb flame resorts to deleting itself!\n"); - setattachment(self, world, ""); - setattachment(self.enemy, world, ""); - setmodel(self, ""); - setmodel(self.enemy, ""); - self.think = self.enemy.think = SUB_Remove; - self.nextthink = self.enemy.nextthink = time + 1; - } - - self.nextthink = time + 0.5; -} - -void W_Firebomb_Think () -{ - entity head; - float flametime, flamedmg, flamerate, flameedge, flameradius, distratio; - - self.nextthink = time + cvar("g_balance_grenade_firebomb_burnrate"); - - if(self.wait < time || self.enemy == world) - { - //bprint("Firebomb deletes its flame\n"); - ExtinguishFirebomb(self); - - setmodel(self, ""); - self.think = SUB_Remove; - self.nextthink = time + 2.2; - return; - } - - flameradius = cvar("g_balance_grenade_firebomb_burnradius"); - flamedmg = cvar("g_balance_grenade_firebomb_flamedmg"); - flamerate = cvar("g_balance_grenade_firebomb_flamerate"); - flametime = cvar("g_balance_grenade_firebomb_flametime"); - flameedge = cvar("g_balance_grenade_firebomb_edgeratio"); - - RadiusDamage (self, self.owner, - cvar("g_balance_grenade_firebomb_burndmg"), - cvar("g_balance_grenade_firebomb_burndmg")*flameedge, - cvar("g_balance_grenade_firebomb_burnradius"), world, - 0, DEATH_BURNING); - - head = findradius(self.origin, flameradius); - while(head) - { - if(head.takedamage == DAMAGE_AIM)//head.classname == "player" || head.classname == "turret") - { - traceline(self.origin, head.origin, TRUE, self); - if(trace_fraction >= 1) - { - distratio = 1 - (vlen(head.origin - self.origin) / flameradius); - IgniteTarget(head, self.owner, - (flametime*flameedge) + (flametime - flameedge)*distratio, - flamedmg, - flamerate, - TRUE); - } - } - head = head.chain; - } - - -/* radius = cvar("g_balance_grenade_firebomb_burnradius"); - head = findradius(self.origin, radius); - while(head) - { - //bprint("firebomb see target\n"); - if((head.takedamage || head.classname == "grenade") && head != self.enemy && head != self) - { - //bprint("firebomb try to burn target\n"); - // don't harm or spread to allies or pyros - if(!(head.classname == "player" && (head.team == self.team || head.class == CLASS_PYRO)) ) - { - //bprint("firebomb burn target\n"); - edgeratio = cvar("g_balance_heat_edgeratio"); - distratio = ( 1 - (vlen(self.enemy.origin - head.origin) / radius) ); - flameratio = edgeratio + distratio*(1 - edgeratio); - - // deal direct damage from the heat radiated by the fire - damage = flameratio * cvar("g_balance_grenade_firebomb_burndmg"); - Damage (head, self, self.owner, damage, DEATH_BURNING, self.enemy.origin, '0 0 0'); - - if(head.takedamage == DAMAGE_AIM) - { - IgniteTarget(head, self.owner, - cvar("g_balance_grenade_firebomb_flametime"), - cvar("g_balance_grenade_firebomb_flamedmg"), - cvar("g_balance_grenade_firebomb_flamerate"), TRUE); - } - } - } - head = head.chain; - } - */ -} - -void W_Firebomb_Activate (void) -{ - // set bomb on fire visually -/* CreateFlame(self, self.owner); - self.onfire.think = SUB_Null; - self.onfire.nextthink = -1; - self.onfire.colormod = self.onfire.onfire.colormod = '128 255 128'*(1/255)*1;//'255 128 64'*(1/255)*1;//3; -*/ - - entity f; - f = self.enemy = spawn(); - f.enemy = spawn(); - f.classname = f.enemy.classname = "firebomb_flame"; - f.owner = self; - f.dmg = 0; - f.ltime = 0; - f.wait = 0; - f.think = Firebomb_Flame_Check; - f.nextthink = time; - - f.colormod = f.enemy.colormod = - stov(cvar_string("g_balance_grenade_firebomb_flamecolor"))*(1/255) - *cvar("g_balance_grenade_firebomb_flamec_strength");//0.3;//'128 128 255'*(1/255)*3;//'255 128 64'*(1/255)*1;//3; - //f.alpha = f.enemy.alpha = 0.6; - f.effects = f.enemy.effects = EF_ADDITIVE; - f.scale = f.enemy.scale = 2; - - setmodel(f, "models/sprites/fire_top.spr32"); - setmodel(f.enemy, "models/sprites/fire_base.spr32"); - - setorigin(f.enemy, '0 0 -5' * f.scale); - setorigin(f, '0 0 2' * f.scale + '0 0 20'); - - setattachment(f, f.owner, ""); - setattachment(f.enemy, f, ""); - - // burn targets each frame - self.wait = time + cvar("g_balance_grenade_firebomb_burntime"); - self.event_damage = SUB_Null; - self.takedamage = 0; - self.movetype = MOVETYPE_TOSS; - self.angles = '0 0 0'; - self.touch = SUB_Null; - self.think = W_Firebomb_Think; - self.nextthink = time; -} - -void W_Firebomb() -{ - setmodel(self, "models/grenademodel.md3"); - setsize(self, '-6 -6 -3', '6 6 3'); - - self.classname = "firebomb"; // don't get bounced around like other grenades - - self.nextthink = time + 3; - self.think = W_Firebomb_Activate; - self.touch = W_Firebomb_Activate; - self.state = 1; // don't explode on contact with player - self.velocity = v_forward * cvar("g_balance_grenade_firebomb_speed") - + v_up * cvar("g_balance_grenade_frag_firebomb_up"); - self.avelocity = '-500 0 0'; - //self.event_damage = SUB_Null; - - self.colormod = '255 128 0'*(1/255)*2; - self.scale = 1.5; - - self.angles = vectoangles (self.velocity); -} - -//-------------------------------------------- - -void W_ConcussionGrenade_Explode (void) -{ - vector org2; - float radius, spd, spd_up, stuntime, sim_jump_pad; - entity head; - - org2 = findbetterlocation (self.origin); - te_explosionrgb (org2, (1/255)*'255 128 0'); - // fixme: need different sound - sound (self, CHAN_VOICE, "weapons/grenade_impact.wav", 1, ATTN_NORM); - - self.event_damage = SUB_Null; - - radius = cvar("g_balance_grenade_concussion_radius"); - spd = cvar("g_balance_grenade_concussion_force"); - spd_up = cvar("g_balance_grenade_concussion_force_up"); - stuntime = cvar("g_balance_grenade_concussion_stuntime"); - sim_jump_pad = !cvar("g_balance_grenade_concussion_restrictflight"); - - // extinguish flames in radius (even those not burning a player) - head = world; - do - { - head = find(head, classname, "burning"); - if(head != world && vlen(head.enemy.origin - self.origin) <= radius) - { - traceline(self.origin, head.enemy.origin, TRUE, self); - if(trace_fraction >= 1) - { - ExtinguishFlame(head.enemy); - } - } - }while(head); - - - - // extinguish firebombs - head = world; - do - { - head = find(head, classname, "firebomb"); - if(head != world && vlen(head.origin - self.origin) <= radius) - { - traceline(self.origin, head.origin, TRUE, self); - if(trace_fraction >= 1) - { - ExtinguishFirebomb(head); - } - } - }while(head); - - - - // also extinguish napalm - head = world; - do - { - head = find(head, classname, "napalm"); - if(head != world && vlen(head.origin - self.origin) <= radius) - { - traceline(self.origin, head.origin, TRUE, self); - if(trace_fraction >= 1) - { - head.think = SUB_Remove; - head.nextthink = time; - //remove(head); - //return; - } - } - }while(head); - - - - - // throw hapless players - head = world; - do - { - head = findfloat(head, movetype, MOVETYPE_WALK); - if(head != world && vlen(head.origin - self.origin) <= radius) - { - traceline(self.origin, head.origin, TRUE, self); - if(trace_fraction >= 1) - { - if(sim_jump_pad && head.classname == "player" && !head.jump_pad) - head.jump_pad = 1; - head.velocity = head.velocity + normalize(head.origin - self.origin) * spd + '0 0 1'*spd_up; - - // stun status - InflictStunStatus(head, stuntime); - } - } - }while(head); - - remove (self); -} - -void W_ConcussionGrenade() -{ - setmodel(self, "models/grenademodel.md3"); - setsize(self, '-6 -6 -3', '6 6 3'); - - self.nextthink = time + 1.5 + random()*0.5; - self.think = W_ConcussionGrenade_Explode; - self.touch = W_Grenade_DefaultTouch; - self.state = 1; // don't explode on contact with player - self.velocity = v_forward * cvar("g_balance_grenade_concussion_speed") - + v_up * cvar("g_balance_grenade_concussion_speed_up"); - self.avelocity = '100 150 100'; - - self.angles = vectoangles (self.velocity); -} - -//-------------------------------------------- - -// touch the player and go *poke* -void W_NailGrenade_Spike_Poke (void) -{ - if (other == self.owner) - return; - else if (pointcontents (self.origin) == CONTENT_SKY) - { - remove (self); - return; - } - - if(other.takedamage) - Damage (other, self, self.enemy, self.dmg, WEP_NAMEK, self.origin, normalize(self.velocity) * cvar("g_balance_grenade_nail_spikeforce")); - else - { - te_spark(self.origin, normalize(self.velocity) * -70 - '0 0 100', 30); - te_gunshot(self.origin); - } - - remove (self); -} - -void W_NailGrenade_Spike(vector org, vector vel, float damage) -{ - entity spike; - spike = spawn (); - spike.enemy = self.owner; - spike.owner = self; - spike.classname = "spike"; - - // some downward curving - spike.movetype = MOVETYPE_BOUNCE; - spike.gravity = cvar("g_balance_grenade_nail_spikegrav"); - spike.solid = SOLID_BBOX; - setmodel(spike, "models/plasmatrail.mdl"); - setsize(spike, '0 0 0', '0 0 0'); - setorigin(spike, org); - - spike.dmg = damage; - - spike.nextthink = time + 3 + random()*0.5; - spike.think = SUB_Remove; - spike.touch = W_NailGrenade_Spike_Poke; - spike.velocity = vel; - spike.angles = vectoangles (spike.velocity); - spike.scale = 0.75; -} - -void W_NailGrenade_Attack (void) -{ - float r, num, maxnum, is_odd, spread, starty, incy; - vector ang; - - r = ceil(random()*3); - if(r == 1) - sound (self, CHAN_IMPACT, "weapons/ric1.wav", 1, ATTN_NORM); - else if(r == 2) - sound (self, CHAN_IMPACT, "weapons/ric2.wav", 1, ATTN_NORM); - else - sound (self, CHAN_IMPACT, "weapons/ric3.wav", 1, ATTN_NORM); - - num = 0; - maxnum = cvar("g_balance_grenade_nail_numspikes"); - spread = cvar("g_balance_grenade_nail_spread"); - - is_odd = (floor(maxnum / 2) != maxnum / 2); //true if maxnum is an odd number - - if(is_odd) - { - incy = (1 / maxnum) * spread; - starty = self.mangle_y - (incy * maxnum/2) + incy*0.5; - } - else - { - incy = (1 / maxnum) * spread; - starty = self.mangle_y - (incy * maxnum/2) + incy*0.5; - } - - ang_z = self.mangle_z; - ang_x = self.mangle_x; - ang_y = starty; - - while(num < maxnum) - { - makevectors(ang); - W_NailGrenade_Spike(self.origin, v_forward*cvar("g_balance_grenade_nail_spikespeed") , cvar("g_balance_grenade_nail_spikedamage")); - W_NailGrenade_Spike(self.origin, v_forward*cvar("g_balance_grenade_nail_spikespeed") * -1, cvar("g_balance_grenade_nail_spikedamage")); - num = num + 1; - ang_y = ang_y + incy; - } - - self.count = self.count - 1; - - if(self.count > 0) - { - // change shooting angle and fire again - self.mangle_y = self.mangle_y + cvar("g_balance_grenade_nail_anglechange"); - self.think = W_NailGrenade_Attack; - self.nextthink = time + cvar("g_balance_grenade_nail_cluster_rate"); - } - else - { - // fall to ground & disappear - self.alpha = 0.5; - self.gravity = 0; - self.touch = SUB_Remove; - self.think = self.touch; - self.nextthink = time + 3; - self.movetype = MOVETYPE_TOSS; - self.solid = SOLID_BBOX; - self.velocity = '0 0 20'; - self.avelocity = '300 200 100'; - setorigin(self, self.origin); - } -} - -void W_NailGrenade_Activate (void) -{ - self.velocity = '0 0 0'; - self.think = W_NailGrenade_Attack; - self.nextthink = time + 0.3; -// self.origin = self.dest1; - - self.count = cvar("g_balance_grenade_nail_numclusters"); -} - -// lift into air -void W_NailGrenade_Deploy (void) -{ - float thtime, dheight, spd; - entity oldself; - - self.touch = SUB_Null; - - dheight = cvar("g_balance_grenade_nail_deployheight"); - thtime = cvar("g_balance_grenade_nail_deploytime"); - spd = dheight / thtime; - - // GRRR! Quake's floor fetish is driving me crazy. - // The ONLY way I've found to get the grenade off the floor once it's on - // is to delete it and spawn a new entity in its place. - - oldself = self; - self = spawn(); - self.owner = oldself.owner; - self.angles_y = oldself.angles_y; - self.angles_x = self.angles_z = 0; // point upright - self.mangle = oldself.mangle; - - setmodel(self, oldself.model); - setsize(self, '0 0 0', '0 0 0'); - setorigin(self, oldself.origin); - self.flags = self.flags - (self.flags & FL_ONGROUND); - self.oldorigin = self.origin; - - //self.flags = self.flags - (self.flags & FL_ONGROUND); - self.movetype = MOVETYPE_FLY; - self.solid = SOLID_NOT; - self.velocity = '0 0 1' * spd; - self.nextthink = time + thtime; - self.think = W_NailGrenade_Activate; - - self.dest1 = self.origin + '0 0 1'*dheight; - traceline(self.origin, self.dest1, TRUE, self); - self.dest1 = trace_endpos; - - remove(oldself); -} - -void W_NailGrenade_Touch (void) -{ - sound (self, CHAN_IMPACT, "weapons/grenade_bounce.wav", 1, ATTN_NORM); - traceline(self.origin, self.origin - '0 0 10', TRUE, self); - if(self.flags & FL_ONGROUND || trace_fraction < 1) - W_NailGrenade_Deploy(); -} - -void W_NailGrenade() -{ - setmodel(self, "models/grenademodel.md3"); - setsize(self, '-6 -6 -3', '6 6 3'); - - self.takedamage = DAMAGE_NO; - self.event_damage = SUB_Null; - - self.nextthink = time + 2.5; - self.think = W_NailGrenade_Activate; - self.touch = W_NailGrenade_Touch; - self.state = 1; // don't explode on contact with player - self.velocity = v_forward * cvar("g_balance_grenade_nail_speed") - + v_up * cvar("g_balance_grenade_nail_speed_up"); - self.avelocity = '100 150 100'; - - self.angles = vectoangles (self.velocity); - - // decide on a direction to fire in - self.mangle_y = self.angles_y;// + 45; - self.mangle_z = 0; - self.mangle_x = 0; -} - -//-------------------------------------------- - -void W_MirvGrenade_Explode (void) -{ - vector org2; - org2 = findbetterlocation (self.origin); - te_explosion (org2); - effect (org2, "models/sprites/grenadeexplosion.spr32", 0, 20, 30); - sound (self, CHAN_BODY, "weapons/grenade_impact.wav", 1, ATTN_NORM); - - self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_grenade_mirv_damage"), cvar("g_balance_grenade_mirv_edgedamage"), cvar("g_balance_grenade_mirv_radius"), world, cvar("g_balance_grenade_mirv_force"), WEP_GRENADE_MIRV); - - remove (self); -} - -void W_MirvBomb(vector org, vector vel) -{ - entity gren; - gren = spawn (); - gren.owner = self.owner; - gren.classname = "grenade"; - gren.movetype = MOVETYPE_BOUNCE; - gren.solid = SOLID_BBOX; - setmodel(gren, "models/grenademodel.md3"); - //setsize(self, '-6 -6 -3', '6 6 3'); - setsize(gren, '0 0 0', '0 0 0'); - setorigin(gren, org); - - gren.nextthink = time + 2 + crandom()*0.15; - gren.think = W_MirvGrenade_Explode; - gren.touch = W_Grenade_DefaultTouch; - gren.state = 1; // don't explode on contact - gren.takedamage = DAMAGE_YES; - gren.health = 20; - gren.damageforcescale = 4; - gren.event_damage = W_Grenade_DefaultDamage; - gren.velocity = vel; - gren.avelocity = '100 150 100' * (1 + crandom()*0.5); - gren.angles = vectoangles (gren.velocity); - gren.scale = 0.75; -} - -void W_MirvGrenade_Split (void) -{ - float num, maxnum, spread; - vector dir, vel; - sound (self, CHAN_IMPACT, "weapons/grenade_bounce.wav", 1, ATTN_NORM); - - if(self.flags & FL_ONGROUND) - { - //traceline(self.origin, self.origin - '0 0 5', TRUE, self); - //dir = normalize(self.velocity) + trace_plane_normal + '0 0 1'; - //dir = normalize(dir * (1/3)); - dir = normalize(self.velocity)*0.2 + normalize('0 0 1'); - dir = normalize(dir); - } - else - { - dir = normalize(self.velocity); - } - - spread = cvar("g_balance_grenade_mirv_spread"); - - maxnum = cvar("g_balance_grenade_mirv_count"); - for (num = 0; num < maxnum; num = num + 1) - { - vel_x = dir_x + crandom()*spread; - vel_y = dir_y + crandom()*spread; - vel_z = dir_z + crandom()*spread; - vel = normalize(vel) * cvar("g_balance_grenade_mirv_speed2"); - W_MirvBomb(self.origin, vel); - } - remove(self); -} - -void W_MirvGrenade() -{ - setmodel(self, "models/grenademodel.md3"); - setsize(self, '-6 -6 -3', '6 6 3'); - - self.nextthink = time + 2.5; - self.think = W_MirvGrenade_Split; - self.touch = W_MirvGrenade_Split; - self.velocity = v_forward * cvar("g_balance_grenade_mirv_speed") - + v_up * cvar("g_balance_grenade_mirv_speed_up"); - self.avelocity = '100 150 100'; - - self.angles = vectoangles (self.velocity); - self.scale = 2.5; -} - -//-------------------------------------------- - -void W_FragGrenade_Explode (void) -{ - vector org2; - org2 = findbetterlocation (self.origin); - te_explosion (org2); - effect (org2, "models/sprites/grenadeexplosion.spr32", 0, 20, 30); - sound (self, CHAN_BODY, "weapons/rocket_impact.wav", 1, ATTN_NORM); - sound (self, CHAN_VOICE, "weapons/grenade_impact.wav", 1, ATTN_NORM); - - self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_grenade_frag_damage"), cvar("g_balance_grenade_frag_edgedamage"), cvar("g_balance_grenade_frag_radius"), world, cvar("g_balance_grenade_frag_force"), WEP_GRENADE_FRAG); - - remove (self); -} - -void W_FragGrenade() -{ - setmodel(self, "models/grenademodel.md3"); - setsize(self, '-6 -6 -3', '6 6 3'); - - self.nextthink = time + 2;//1.5 + random()*0.5; - self.think = W_FragGrenade_Explode; - self.touch = W_Grenade_DefaultTouch; - self.state = 1; // don't explode on contact with player - self.velocity = v_forward * cvar("g_balance_grenade_frag_speed") - + v_up * cvar("g_balance_grenade_frag_speed_up"); - self.avelocity = '100 150 100'; - - self.angles = vectoangles (self.velocity); -} - -//-------------------------------------------- - -void PoisonGrenadeGib(entity gib, string mdlname, vector org, vector v, float destroyontouch) -{ - entity e; - e = TossGib(gib, mdlname, org, v, destroyontouch); - e.colormod = 5 * '0 1 0'; // bright green - e.scale = 0.2; - e.gravity = 0.8; - e.velocity = e.velocity * e.gravity;// * 0.8; -} - -void W_PoisonGrenade_Explode (void) -{ - vector org2, org1; - entity head; - - org2 = findbetterlocation (self.origin); - org1 = org2 + '0 0 5'; - te_explosionrgb (org2, (1/255)*'0 255 0'); - sound (trace_ent, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM); - PoisonGrenadeGib (world, "models/gibs/gib5.md3", org1, '-500 0 450',1); - PoisonGrenadeGib (world, "models/gibs/gib6.md3", org1, '0 500 450',1); - PoisonGrenadeGib (world, "models/gibs/gib6.md3", org1, '0 -500 450',1); - PoisonGrenadeGib (world, "models/gibs/gib6.md3", org1, '500 0 450',1); - PoisonGrenadeGib (world, "models/gibs/chunk.mdl", org1, '0 0 450',1); - - - head = findradius(self.origin, cvar("g_balance_grenade_poison_radius")); - while(head) - { - if(head.classname == "player") // only players can be poisoned - { - traceline(self.origin, head.origin, TRUE, self); - if(trace_fraction >= 1) - { - PoisonTarget(head, cvar("g_balance_grenade_poison_damage"), cvar("g_balance_grenade_poison_duration"), TRUE); - //bprint(strcat(head.netname, " is poisoned for ", ftos(head.poison_damage), " damage\n")); - } - } - head = head.chain; - } - - remove (self); -} - -void W_PoisonGrenade() -{ - setmodel(self, "models/grenademodel.md3"); - setsize(self, '-6 -6 -3', '6 6 3'); - - self.nextthink = time + 1.5 + random()*0.5; - self.think = W_PoisonGrenade_Explode; - self.touch = W_Grenade_DefaultTouch; - self.state = 1; // don't explode on contact with player - self.velocity = v_forward * cvar("g_balance_grenade_poison_speed") - + v_up * cvar("g_balance_grenade_poison_speed_up"); - self.avelocity = '100 150 100'; - - self.angles = vectoangles (self.velocity); -} - -//-------------------------------------------- - -void W_ArmorGrenade_Explode (void) -{ - entity head; - vector org2; - - org2 = findbetterlocation (self.origin); - te_explosion (org2); - effect (org2, "models/sprites/grenadeexplosion.spr32", 0, 20, 30); - sound (self, CHAN_BODY, "weapons/grenade_impact.wav", 1, ATTN_NORM); - - head = findradius(self.origin, cvar("g_balance_grenade_armor_radius")); - while(head) - { - if(head.classname == "player") // only players are affected - { - traceline(self.origin, head.origin, TRUE, self); - if(trace_fraction >= 1) - { - head.armorvalue = 0; // wipe out target's armor - } - } - head = head.chain; - } - - remove (self); -} - -void W_ArmorGrenade() -{ - setmodel(self, "models/grenademodel.md3"); - setsize(self, '-6 -6 -3', '6 6 3'); - - self.nextthink = time + 1.5 + random()*0.5; - self.think = W_ArmorGrenade_Explode; - self.touch = W_Grenade_DefaultTouch; - self.state = 1; // don't explode on contact with player - self.velocity = v_forward * cvar("g_balance_grenade_armor_speed") - + v_up * cvar("g_balance_grenade_armor_speed_up"); - self.avelocity = '100 150 100'; - - self.angles = vectoangles (self.velocity); -} - -//-------------------------------------------- - diff --git a/attic/TeamNexuiz/game/gamec/w_hagar.c b/attic/TeamNexuiz/game/gamec/w_hagar.c deleted file mode 100644 index 7d9c30aea..000000000 --- a/attic/TeamNexuiz/game/gamec/w_hagar.c +++ /dev/null @@ -1,122 +0,0 @@ -void() hagar_ready_01; -void() hagar_fire1_01; -void() hagar_deselect_01; -void() hagar_select_01; - -float() hagar_check = -{ - if (self.ammo_rockets >= 1) - return TRUE; - return FALSE; -}; - -void(float req) w_hagar = -{ - if (req == WR_IDLE) - hagar_ready_01(); - else if (req == WR_FIRE1 || req == WR_FIRE2) - weapon_prepareattack(hagar_check, hagar_check, hagar_fire1_01, cvar("g_balance_hagar_refire")); - else if (req == WR_RAISE) - hagar_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = self.ammo_rockets; - else if (req == WR_DROP) - hagar_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_HAGAR, "w_hagar.zym", IT_ROCKETS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = hagar_check(); -}; - -void W_Hagar_Explode (void) -{ - vector org2; - float b; - org2 = findbetterlocation (self.origin); - effect (org2, "models/sprites/hagarexplosion.spr32", 0, 20, 30); - b = crandom(); - if (b<-0.7) - sound (self, CHAN_BODY, "weapons/hagexp1.wav", 1, ATTN_NORM); - else if (b<0.4) - sound (self, CHAN_BODY, "weapons/hagexp2.wav", 1, ATTN_NORM); - else if (b<1) - sound (self, CHAN_BODY, "weapons/hagexp3.wav", 1, ATTN_NORM); - - self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_hagar_damage"), cvar("g_balance_hagar_edgedamage"), cvar("g_balance_hagar_radius"), world, cvar("g_balance_hagar_force"), WEP_HAGAR); - - remove (self); -} - -void W_Hagar_Touch (void) -{ - if (other == self.owner) - return; - else if (pointcontents (self.origin) == CONTENT_SKY) - { - remove (self); - return; - } - - W_Hagar_Explode (); -} - -void W_Hagar_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - self.health = self.health - damage; - if (self.health <= 0) - W_Hagar_Explode(); -} - -void W_Hagar_Attack (void) -{ - local entity missile; - local vector org; - - sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM); - self.ammo_rockets = self.ammo_rockets - 1; - self.punchangle_x = -2; - org = self.origin + self.view_ofs + v_forward * 25 + v_right * 5 + v_up * -8; - - missile = spawn (); - missile.owner = self; - missile.classname = "missile"; - missile.touch = W_Hagar_Touch; - missile.think = W_Hagar_Explode; - missile.nextthink = time + 10; - missile.solid = SOLID_BBOX; - missile.scale = 0.4; // BUG: the model is too big - setorigin (missile, org); - setmodel (missile, "models/hagarmissile.mdl"); - setsize (missile, '0 0 0', '0 0 0'); - //missile.takedamage = DAMAGE_YES; - //missile.damageforcescale = 4; - //missile.health = 10; - //missile.event_damage = W_Hagar_Damage; - missile.effects = EF_LOWPRECISION; - - if (self.button3) - { - missile.movetype = MOVETYPE_TOSS; - missile.velocity = v_forward * cvar("g_balance_hagar_speed2") + v_up * cvar("g_balance_hagar_speed2_up"); - missile.avelocity = '100 10 10'; - } - else - { - missile.movetype = MOVETYPE_FLY; - missile.velocity = (v_forward + v_right * crandom() * 0.035 + v_up * crandom() * 0.015) * cvar("g_balance_hagar_speed"); - } - - missile.angles = vectoangles (missile.velocity); -} - -// weapon frames -void() hagar_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, hagar_ready_01); self.weaponentity.state = WS_READY;}; -void() hagar_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() hagar_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() hagar_fire1_01 = -{ - weapon_doattack(hagar_check, hagar_check, W_Hagar_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.15, hagar_ready_01); -}; - diff --git a/attic/TeamNexuiz/game/gamec/w_healgun.c b/attic/TeamNexuiz/game/gamec/w_healgun.c deleted file mode 100644 index 0cad4d4f2..000000000 --- a/attic/TeamNexuiz/game/gamec/w_healgun.c +++ /dev/null @@ -1,111 +0,0 @@ -void() healgun_ready_01; -void() healgun_fire1_01; -void() healgun_deselect_01; -void() healgun_select_01; - - -float is_ally (entity targ, entity attacker); - - -float() healgun_check = -{ - return TRUE; -}; - -void(float req) w_healgun = -{ - if (req == WR_IDLE) - healgun_ready_01(); - else if (req == WR_FIRE1 || req == WR_FIRE2) - weapon_prepareattack(healgun_check, healgun_check, healgun_fire1_01, cvar("g_balance_healgun_refire")); - else if (req == WR_RAISE) - healgun_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = self.ammo_nails; - else if (req == WR_DROP) - healgun_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_HEALGUN, "w_uzi.zym", IT_NAILS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = healgun_check(); -}; - -void W_Healgun_Attack (void) -{ - local vector org; - float selfdrain, targheal, newhp; - sound (self, CHAN_WEAPON, "weapons/healgun_fire.wav", 1, ATTN_NORM); - org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 8) + (v_forward * 15); - - // this attack_finished just enforces a cooldown at the end of a burst - self.attack_finished = time + cvar("g_balance_healgun_refire2"); - - traceline(org, org + v_forward * cvar("g_balance_healgun_range"), FALSE, self); - // fixme: need a better visual effect - // instead, every .5 or 1 seconds send a transluscent glob toward ally or away from enemy (depending on heal/drain) - // It can use the biorifle glob model I made for now, until someone makes a better one. - te_beam(self, org, trace_endpos); - - - if(trace_ent.classname != "player" && trace_ent.classname != "body") - return; - if(is_ally(trace_ent, self)) { - // heal, drain self - if(floor(self.health) <= cvar("g_balance_healgun_selfhp_min")) - return; // can't drain anymore - if(ceil(trace_ent.health) >= self.max_health*cvar("g_balance_healgun_targhp_maxratio")) - return; // already fully healed - - targheal = cvar("g_balance_healgun_targheal"); // how much to heal - selfdrain = cvar("g_balance_healgun_selfdrain"); // how much it costs to heal them - } - else { - // drain, heal self - // can drain enemy's health even if your health won't increase - //if(self.health >= self.health * cvar("g_balance_healgun_selfhp_maxratio")) - // return; // already fully healed - - targheal = 0 - cvar("g_balance_healgun_targdrain"); // how much to drain from targ - selfdrain = 0 - cvar("g_balance_healgun_selfheal"); // how much to heal self - } - - // take health from user, or heal if stealing - newhp = bound(cvar("g_balance_healgun_selfhp_min"), - self.health - selfdrain, - self.max_health * cvar("g_balance_healgun_selfhp_maxratio")); - - self.health = newhp; - - - // heal or damage the target - newhp = bound(5, - trace_ent.health + targheal, - cvar("g_balance_healgun_targhp_maxratio")); - - if(newhp < trace_ent.health) - Damage (trace_ent, self, self, trace_ent.health - newhp, WEP_HEALGUN, trace_endpos, '0 0 0'); - else - trace_ent.health = newhp; - -} -// weapon frames - -void() healgun_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, healgun_ready_01); self.weaponentity.state = WS_READY;}; -void() healgun_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() healgun_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() healgun_fire1_02 = -{ - if (self.button0) - { - weapon_doattack(healgun_check, healgun_check, W_Healgun_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_healgun_refire"), healgun_fire1_02); - } - else - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_healgun_refire"), healgun_ready_01); -}; -void() healgun_fire1_01 = -{ - weapon_doattack(healgun_check, healgun_check, W_Healgun_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_healgun_refire"), healgun_fire1_02); -}; - diff --git a/attic/TeamNexuiz/game/gamec/w_hook.c b/attic/TeamNexuiz/game/gamec/w_hook.c deleted file mode 100644 index 6b88f7913..000000000 --- a/attic/TeamNexuiz/game/gamec/w_hook.c +++ /dev/null @@ -1,250 +0,0 @@ -void() grapple_ready_01; -void() grapple_fire1_01; -void() grapple_deselect_01; -void() grapple_select_01; - -float() grapple_check = -{ - return TRUE; -} - -void(float req) w_grapple = -{ - if (req == WR_IDLE) - grapple_ready_01(); - else if (req == WR_FIRE1) - weapon_prepareattack(grapple_check, grapple_check, grapple_fire1_01, cvar("g_balance_grapple_refire")); - else if (req == WR_RAISE) - grapple_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = 1; - else if (req == WR_DROP) - grapple_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_GRAPPLE, "w_grapple.zym", 0); - else if (req == WR_CHECKAMMO) - weapon_hasammo = grapple_check(); -} - -void RemoveGrapplingHook(entity pl) -{ - if(pl.hook == world) - return; - remove(pl.hook); - pl.hook = world; - if(pl.movetype == MOVETYPE_FLY) - pl.movetype = MOVETYPE_WALK; -} - -void GrapplingHookThink() -{ - float spd, dist, minlength, pullspeed, pullspeed2, totalmass, m1, m2, dropspd1, dropspd2; - vector dir, org, end; - - makevectors(self.owner.v_angle); - org = self.owner.origin + self.owner.view_ofs + v_forward * 15 - v_right * 5 + v_up * -12; - - traceline(self.origin, org, TRUE, self); - if(self.owner.health <= 2 // owner died - || self.owner.hook != self // owner fired a different hook - || !self.owner.button0 // owner let go of button - || trace_fraction < 1) // owner not visible - { - remove(self); - return; - } - - self.nextthink = time + 0.1; - dropspd1 = cvar("sv_gravity") * 0.1; // thinks this often - dropspd2 = dropspd1; - if(self.owner.gravity) - dropspd1 = dropspd1 * self.owner.gravity; - if(self.enemy.gravity) - dropspd2 = dropspd2 * self.enemy.gravity; - self.owner.attack_finished = max(self.owner.attack_finished, time + cvar("g_balance_grapple_refire")); - - - // testing - self.owner.jump_pad = 1; - - - if(self.state == 1) - { - pullspeed = cvar("g_balance_grapple_pullspeed"); - if(self.enemy != world) // pull both players toward each other at different speeds based on mass - { - m1 = self.owner.mass; - m2 = self.enemy.mass; - if(m1 <= 0) - m1 = 1; - if(m2 <= 0) - m2 = 1; - totalmass = m1 + m2; - pullspeed2 = (m1 / totalmass) * pullspeed; - pullspeed = (m2 / totalmass) * pullspeed; - } - minlength = 50; - dir = self.origin - org; - dist = vlen(dir); - dir = normalize(dir); - - end = self.origin - dir*minlength; - - dist = vlen(end - org); - - if(dist < 200 && self.enemy == world) - spd = dist * (pullspeed / 200); - else - spd = pullspeed; - if(spd < 50) - spd = 0; - - if(!(dist < 200 && !self.owner.flags & FL_ONGROUND && self.enemy != world)) - self.owner.velocity = dir*spd; - self.owner.movetype = MOVETYPE_FLY; - self.owner.flags = self.owner.flags - (self.owner.flags & FL_ONGROUND); - - org = org + dir*50; // get the beam out of the player's eyes - - if(self.enemy != world) - { - self.origin = 0.5*(self.enemy.absmin+self.enemy.absmax) + '0 0 10'; // follow enemy's body - - if(dist < 200) - spd = dist * (pullspeed2 / 200 + 150); - else - spd = pullspeed2; - if(spd < 50) - spd = 0; - - - if(dist < 200 && !self.owner.flags & FL_ONGROUND) - { - //self.enemy.velocity = self.enemy.velocity + '0 0 -1'*dropspd1; - self.owner.velocity = self.owner.velocity + '0 0 -1'*dropspd2; // fake effects of gravity, and don't pull enemy toward me - } - else - self.enemy.velocity = dir * spd * -1; - - if(self.attack_finished < time) - { - self.attack_finished = time + cvar("g_balance_grapple_hurtrate"); - Damage (self.enemy, self, self.owner, cvar("g_balance_grapple_damage2"), WEP_GRAPPLE, self.origin, '0 0 0'); - } - if(self.enemy.health <= 0) // gib the dead player - { - Damage (self.enemy, self, self.owner, 100, WEP_GRAPPLE, self.origin, '0 0 0'); - self.enemy = world; - self.owner.hook = world; - remove(self); - return; - } - } - } - - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte (MSG_BROADCAST, TE_BEAM); - WriteEntity (MSG_BROADCAST, self); - WriteCoord (MSG_BROADCAST, self.origin_x); - WriteCoord (MSG_BROADCAST, self.origin_y); - WriteCoord (MSG_BROADCAST, self.origin_z); - WriteCoord (MSG_BROADCAST, org_x); - WriteCoord (MSG_BROADCAST, org_y); - WriteCoord (MSG_BROADCAST, org_z); - //WriteCoord (MSG_BROADCAST, 0); - //WriteCoord (MSG_BROADCAST, 0); - //WriteCoord (MSG_BROADCAST, 0); -} - -void GrapplingHookTouch (void) -{ - if (other == self.owner) - return; - else if (pointcontents (self.origin) == CONTENT_SKY) - { - RemoveGrapplingHook(self.owner); - return; - } - - self.event_damage = SUB_Null; // fixme: ability to dislodge a player by damaging hook? - sound (self, CHAN_BODY, "weapons/laserimpact.wav", 1, ATTN_NORM); - - self.state = 1; - self.think = GrapplingHookThink; - self.nextthink = time + 0.1; - self.touch = SUB_Null; - self.velocity = '0 0 0'; - self.movetype = MOVETYPE_NONE; - - if((other.classname == "player" || other.classname == "body") && other.health > 0) - { - self.enemy = other; - } - - Damage (other, self, self.owner, cvar("g_balance_grapple_damage"), WEP_GRAPPLE, self.origin, normalize(self.velocity)*cvar("g_balance_grapple_force")); -} - -void FireGrapplingHook (void) -{ - - // fixme: drop the CTF flag - - - local entity missile; - local vector org; - - makevectors(self.v_angle); - - sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", 1, ATTN_NORM); - org = self.origin + self.view_ofs + v_forward * 15 - v_right * 5 + v_up * -12; - te_customflash(org, 160, 0.2, '1 0 0'); - - missile = spawn (); - missile.owner = self; - self.hook = missile; - missile.classname = "laserbolt"; - - missile.movetype = MOVETYPE_FLY; - missile.solid = SOLID_BBOX; - - setmodel (missile, "models/ebomb.mdl");//laser.mdl"); - setsize (missile, '0 0 0', '0 0 0'); - setorigin (missile, org); - - missile.state = 0; // not latched onto anything - - missile.velocity = v_forward * cvar("g_balance_grapple_speed"); - missile.angles = vectoangles (missile.velocity); - //missile.glow_color = 250; // 244, 250 - //missile.glow_size = 120; - missile.touch = GrapplingHookTouch; - missile.think = GrapplingHookThink; - missile.nextthink = time + 0.1; - - missile.effects = EF_FULLBRIGHT | EF_ADDITIVE | EF_LOWPRECISION; -} - -void GrapplingHookFrame() -{ - // if I have no hook or it's not pulling yet, make sure I'm not flying! - if((self.hook == world || !self.hook.state) && self.movetype == MOVETYPE_FLY && self.health > 2) - { - self.movetype = MOVETYPE_WALK; - } - if(!self.button0) - { - // remove hook, reset movement type - RemoveGrapplingHook(self); - return; - } - // note: The hook entity does the actual pulling -} - -void() grapple_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, grapple_ready_01); self.weaponentity.state = WS_READY;}; -void() grapple_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() grapple_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() grapple_fire1_01 = -{ - weapon_doattack(grapple_check, grapple_check, FireGrapplingHook); - weapon_thinkf(WFRAME_FIRE1, 0.3, grapple_ready_01); -} diff --git a/attic/TeamNexuiz/game/gamec/w_hotbombs.c b/attic/TeamNexuiz/game/gamec/w_hotbombs.c deleted file mode 100644 index e4323ae2b..000000000 --- a/attic/TeamNexuiz/game/gamec/w_hotbombs.c +++ /dev/null @@ -1,267 +0,0 @@ -void() hotbombs_ready_01; -void() hotbombs_fire1_01; -void() hotbombs_fire2_01; -void() hotbombs_deselect_01; -void() hotbombs_select_01; - -float AMMO_COST_HOTBOMBS = 5; - -float() hotbombs_check = -{ - return TRUE; -} - -float() hotbombs_check2 = -{ - if (self.ammo_cells >= AMMO_COST_HOTBOMBS) - return TRUE; - return FALSE; -} - -void(float req) w_hotbombs = -{ - if (req == WR_IDLE) - hotbombs_ready_01(); - else if (req == WR_FIRE1 || req == WR_FIRE2) - { - if(req == WR_FIRE2) - weapon_prepareattack(hotbombs_check, hotbombs_check, hotbombs_fire2_01, cvar("g_balance_hotbombs_refire")); - else - weapon_prepareattack(hotbombs_check, hotbombs_check, hotbombs_fire1_01, cvar("g_balance_hotbombs_refire2")); - } - else if (req == WR_RAISE) - hotbombs_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = floor(self.ammo_cells/AMMO_COST_HOTBOMBS); - else if (req == WR_DROP) - hotbombs_deselect_01(); - else if (req == WR_SETUP) - { - weapon_setup(WEP_BOMBLETTS, "w_hotbombs.zym", IT_ROCKETS); - //self.weaponentity.colormod = '0 4 0'; - //self.weaponentity.scale = 0.65; - } - else if (req == WR_CHECKAMMO) - weapon_hasammo = hotbombs_check(); -} - -void W_Hotbomb_Explode (void) -{ - vector org2; - entity head; - - float flametime, flamedmg, flamerate, flameedge, flameradius, distratio; - - flameradius = cvar("g_balance_hotbombs_burnradius"); - flamedmg = cvar("g_balance_hotbombs_burndamage"); - flamerate = cvar("g_balance_hotbombs_burnrate"); - flametime = cvar("g_balance_hotbombs_burntime"); - flameedge = cvar("g_balance_hotbombs_burnedge_ratio"); - - org2 = findbetterlocation (self.origin); - te_explosion (org2); - if(random() > 0.5) - { - effect (org2, "models/sprites/grenadeexplosion.spr32", 0, 20, 30); - sound (self, CHAN_BODY, "weapons/grenade_impact.wav", 1, ATTN_NORM); - } - else - { - effect (org2, "models/sprites/rocketexplosion.spr32", 0, 20, 40); - sound (self, CHAN_BODY, "weapons/rocket_impact.wav", 1, ATTN_NORM); - } - - - self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_hotbombs_damage"), cvar("g_balance_hotbombs_edgedamage"), cvar("g_balance_hotbombs_radius"), world, cvar("g_balance_hotbombs_force"), WEP_HOTBOMBS); - - // fixme: need better way to set on fire... - head = findradius(self.origin, flameradius); - while(head) - { - if(head.takedamage == DAMAGE_AIM)//head.classname == "player" || head.classname == "turret") - { - traceline(self.origin, head.origin, TRUE, self); - if(trace_fraction >= 1) - { - distratio = 1 - (vlen(head.origin - self.origin) / flameradius); - IgniteTarget(head, self.owner, - (flametime*flameedge) + (flametime - flameedge)*distratio, - flamedmg, - flamerate, - TRUE); - } - } - head = head.chain; - } - - - remove (self); -} - -void W_Hotbomb_Detonate (entity gren) -{ - gren.classname = "hotbombdet"; - gren.takedamage = 0; - gren.think = W_Hotbomb_Explode; - gren.nextthink = time + random()*0.1; - gren.movetype = MOVETYPE_TOSS; -} - -void W_HotbombThink () -{ - self.nextthink = time + 1; - if(self.owner.class != CLASS_PYRO) - { - remove(self); - return; - } - if(self.movetype == MOVETYPE_WALK) - { - if(!self.flags & FL_ONGROUND) - { - self.movetype = MOVETYPE_TOSS; - //self.think = SUB_Null; - //self.nextthink = -1; - } - - self.velocity = self.velocity*0.9; - - if(vlen(self.velocity) < 25) - { - self.velocity = '0 0 0'; - self.movetype = MOVETYPE_TOSS; - self.ltime = time + 0.5; // don't bounce or start over on accident - } - else - self.nextthink = time + 0.1; - } -} - -void W_Hotbombs_Touch (void) -{ - if(self.think != W_HotbombThink) - { - if(self.ltime > time) - return; - sound (self, CHAN_IMPACT, "weapons/grenade_bounce.wav", 1, ATTN_NORM); - if(self.flags & FL_ONGROUND) - { - self.movetype = MOVETYPE_WALK; - self.think = W_HotbombThink; - self.nextthink = time + 0.1; - } - } -} - -void W_Hotbombs_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - self.health = self.health - damage; - if (self.health <= 0 || deathtype == DEATH_BURNING) - { - W_Hotbomb_Detonate(self); - //self.think = W_Hotbombs_Explode; - //self.nextthink = time + random()*0.1; - //self.takedamage = 0; - //self.classname = "hotbombdet"; - //self.movetype = MOVETYPE_TOSS; - } -} - -void W_Hotbombs_Attack (void) -{ - local entity gren; - local vector org; - - // only allow a limited number of hotbombs - W_LimitNumEnts("hotbomb", cvar("g_balance_hotbombs_allowed") - 1, SUB_Remove); - - - //sound (self, CHAN_WEAPON, "weapons/grenade_fire.wav", 1, ATTN_NORM); - self.punchangle_x = -4; - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 5 + v_up * -12; - self.ammo_cells = self.ammo_cells - AMMO_COST_HOTBOMBS; - - gren = spawn (); - gren.create_time = time; // for W_LimitNumEnts - gren.owner = self; - gren.classname = "hotbomb"; - gren.movetype = MOVETYPE_WALK; - gren.solid = SOLID_BBOX; - setmodel(gren, "models/grenademodel.md3"); - setsize(gren, '-6 -6 -3', '6 6 3'); - setorigin(gren, org); - - gren.nextthink = time + 100; - gren.think = W_Hotbomb_Explode; - gren.touch = W_Hotbombs_Touch; - gren.takedamage = DAMAGE_YES; - gren.health = 40; // a bit harder to destroy - gren.damageforcescale = 4; - gren.event_damage = W_Hotbombs_Damage; - gren.velocity = v_forward * cvar("g_balance_hotbombs_speed"); - - gren.angles = vectoangles (gren.velocity); - gren.angles_x = -90; - - gren.scale = 2; - //gren.colormod = '0.5 0.5 0.5'; -} - -void W_Hotbombs_Attack2 (void) -{ - local entity gren; - gren = world; - do - { - gren = find(gren, classname, "hotbomb"); - if(gren.owner == self) - { - W_Hotbomb_Detonate(gren); - } - }while(gren); -} - -float W_Hotbombs_CheckEmpty () -{ - local entity gren; - - if(hotbombs_check2()) - return FALSE; // I still have ammo, don't auto switch - - gren = world; - do - { - gren = find(gren, classname, "hotbomb"); - if(gren.owner == self) - { - return FALSE; // I still have a grenade I can explode, don't auto switch - } - }while(gren); - - self.switchweapon = w_getbestweapon(self); - return TRUE; -} - -// weapon frames - -void() hotbombs_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, hotbombs_ready_01); self.weaponentity.state = WS_READY;}; -void() hotbombs_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() hotbombs_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() hotbombs_fire1_01 = -{ - if(W_Hotbombs_CheckEmpty()) - return; // auto-switch weapons and leave - if(!hotbombs_check2()) - return; // can't use primary, but alt-fire will still work - weapon_doattack(hotbombs_check, hotbombs_check, W_Hotbombs_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.3, hotbombs_ready_01); -}; - -void() hotbombs_fire2_01 = -{ - if(W_Hotbombs_CheckEmpty()) - return; // out of ammo and no bombs to detonate - weapon_doattack(hotbombs_check, hotbombs_check, W_Hotbombs_Attack2); - weapon_thinkf(WFRAME_IDLE, 0.1, hotbombs_ready_01); -}; diff --git a/attic/TeamNexuiz/game/gamec/w_incendiary_r.c b/attic/TeamNexuiz/game/gamec/w_incendiary_r.c deleted file mode 100644 index 6f1cb7e4d..000000000 --- a/attic/TeamNexuiz/game/gamec/w_incendiary_r.c +++ /dev/null @@ -1,174 +0,0 @@ -void() rincendiary_ready_01; -void() rincendiary_fire1_01; -void() rincendiary_deselect_01; -void() rincendiary_select_01; - -float() rincendiary_check = -{ - if (self.ammo_rockets >= 5) - return TRUE; - return FALSE; -}; - -void(float req) w_rincendiary = -{ - if (req == WR_IDLE) - rincendiary_ready_01(); - else if (req == WR_FIRE1) - weapon_prepareattack(rincendiary_check, rincendiary_check, rincendiary_fire1_01, cvar("g_balance_incendiaryrocket_refire")); - else if (req == WR_RAISE) - rincendiary_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = floor(self.ammo_rockets / 5); - else if (req == WR_DROP) - rincendiary_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_ROCKET_INCENDIARY, "w_rli.zym", IT_ROCKETS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = rincendiary_check(); -}; - - -void W_IncendiaryRocket_Explode (void) -{ - vector org2; - entity head; - - float flametime, flamedmg, flamerate, flameedge, flameradius, distratio; - - flameradius = cvar("g_balance_incendiaryrocket_burnradius"); - flamedmg = cvar("g_balance_incendiaryrocket_burndamage"); - flamerate = cvar("g_balance_incendiaryrocket_burnrate"); - flametime = cvar("g_balance_incendiaryrocket_burntime"); - flameedge = cvar("g_balance_incendiaryrocket_burnedge_ratio"); - - org2 = findbetterlocation (self.origin); - te_explosion (org2); - effect (org2, "models/sprites/rocketexplosion.spr32", 0, 20, 40); - sound (self, CHAN_BODY, "weapons/rocket_impact.wav", 1, ATTN_NORM); - - self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_incendiaryrocket_damage"), cvar("g_balance_incendiaryrocket_edgedamage"), cvar("g_balance_incendiaryrocket_radius"), world, cvar("g_balance_incendiaryrocket_force"), WEP_ROCKET_INCENDIARY); - - // fixme: need better way to set on fire... - head = findradius(self.origin, flameradius); - while(head) - { - if(head.takedamage == DAMAGE_AIM)//head.classname == "player" || head.classname == "turret") - { - traceline(self.origin, head.origin, TRUE, self); - if(trace_fraction >= 1) - { - distratio = 1 - (vlen(head.origin - self.origin) / flameradius); - IgniteTarget(head, self.owner, - (flametime*flameedge) + (flametime - flameedge)*distratio, - flamedmg, - flamerate, - TRUE); - } - } - head = head.chain; - } - - remove (self); -} - -void W_IncendiaryRocket_Think (void) -{ - self.nextthink = time; - if (time > self.cnt) - { - W_IncendiaryRocket_Explode (); - return; - } - if (self.owner) - { - if (self.owner.deadflag) - self.owner = self; - else if (self.owner.wpn == WEP_ROCKET_INCENDIARY && self.owner.button3) - W_IncendiaryRocket_Explode (); - } -} - -void W_IncendiaryRocket_Touch (void) -{ - if (pointcontents (self.origin) == CONTENT_SKY) - { - remove (self); - return; - } - else - W_IncendiaryRocket_Explode (); -} - -void W_IncendiaryRocket_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - self.health = self.health - damage; - if (self.health <= 0) - W_IncendiaryRocket_Explode(); -} - -void W_IncendiaryRocket_Attack (void) -{ - local entity missile; - local entity flash; - local vector org; - local vector end; - - local vector trueaim; - org = self.origin + self.view_ofs; - end = self.origin + self.view_ofs + v_forward * 4096; - traceline(org,end,TRUE,self); - trueaim = trace_endpos; - - sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", 1, ATTN_NORM); - if (cvar("g_rocketarena") == 0 && cvar("g_use_ammunition") == 1) - self.ammo_rockets = self.ammo_rockets - 5; - self.punchangle_x = -4; - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 3 + v_up * -11; - te_smallflash(org); - - missile = spawn (); - missile.owner = self; - missile.classname = "missile"; - - missile.takedamage = DAMAGE_YES; - //missile.damageforcescale = 4; - missile.health = 30; - missile.event_damage = W_IncendiaryRocket_Damage; - - missile.movetype = MOVETYPE_FLY; - missile.solid = SOLID_BBOX; - setmodel (missile, "models/rocket.md3"); - setsize (missile, '0 0 0', '0 0 0'); - - setorigin (missile, org); - missile.velocity = normalize(trueaim - org) * cvar("g_balance_incendiaryrocket_speed"); - missile.angles = vectoangles (missile.velocity); - - missile.touch = W_IncendiaryRocket_Touch; - missile.think = W_IncendiaryRocket_Think; - missile.nextthink = time; - missile.cnt = time + 9; - sound (missile, CHAN_BODY, "weapons/rocket_fly.wav", 0.4, ATTN_NORM); - - flash = spawn (); - setorigin (flash, org); - setmodel (flash, "models/flash.md3"); - flash.velocity = v_forward * 20; - flash.angles = vectoangles (flash.velocity); - SUB_SetFade (flash, time, 0.4); - flash.effects = flash.effects | EF_ADDITIVE | EF_FULLBRIGHT; -} - -// weapon frames - -void() rincendiary_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, rincendiary_ready_01); self.weaponentity.state = WS_READY;}; -void() rincendiary_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() rincendiary_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() rincendiary_fire1_01 = -{ - weapon_doattack(rincendiary_check, rincendiary_check, W_IncendiaryRocket_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.3, rincendiary_ready_01); -}; - diff --git a/attic/TeamNexuiz/game/gamec/w_laser.c b/attic/TeamNexuiz/game/gamec/w_laser.c deleted file mode 100644 index f9253525c..000000000 --- a/attic/TeamNexuiz/game/gamec/w_laser.c +++ /dev/null @@ -1,112 +0,0 @@ -void() laser_ready_01; -void() laser_fire1_01; -void() laser_deselect_01; -void() laser_select_01; - -float() laser_check = {return TRUE;}; - -void(float req) w_laser = -{ - if (req == WR_IDLE) - laser_ready_01(); - else if (req == WR_FIRE1) - weapon_prepareattack(laser_check, laser_check, laser_fire1_01, cvar("g_balance_laser_refire")); - else if (req == WR_RAISE) - laser_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = 1; - else if (req == WR_DROP) - laser_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_LASER, "w_laser.zym", 0); - else if (req == WR_CHECKAMMO) - weapon_hasammo = laser_check(); -}; - -void W_Laser_Touch (void) -{ - vector dir; - - if (other == self.owner) - return; - else if (pointcontents (self.origin) == CONTENT_SKY) - { - remove (self); - return; - } - - dir = normalize (self.owner.origin - self.origin); - - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte (MSG_BROADCAST, TE_FLAMEJET); - WriteCoord (MSG_BROADCAST, self.origin_x); - WriteCoord (MSG_BROADCAST, self.origin_y); - WriteCoord (MSG_BROADCAST, self.origin_z); - WriteCoord (MSG_BROADCAST, 0); // SeienAbunae: groan... Useless clutter - WriteCoord (MSG_BROADCAST, 0); - WriteCoord (MSG_BROADCAST, 0); - WriteByte (MSG_BROADCAST, 155); - - te_customflash(self.origin, 160, 0.2, '1 0 0'); - - - self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_laser_damage"), cvar("g_balance_laser_edgedamage"), cvar("g_balance_laser_radius"), world, cvar("g_balance_laser_force"), IT_LASER); - sound (self, CHAN_BODY, "weapons/laserimpact.ogg", 1, ATTN_NORM); - - remove (self); -} - -void W_Laser_Attack (void) -{ - local entity missile; - local vector org; - local vector end; - - local vector trueaim; - org = self.origin + self.view_ofs; - end = self.origin + self.view_ofs + v_forward * 4096; - traceline(org,end,TRUE,self); - - trueaim = trace_endpos; - - sound (self, CHAN_WEAPON, "weapons/lasergun_fire.ogg", 1, ATTN_NORM); - if (self.items & IT_STRENGTH) { - sound (self, CHAN_AUTO, "weapons/strength_fire.ogg", 1, ATTN_NORM); - } - - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 5 + v_up * -12; - //te_customflash(org, 160, 0.2, '1 0 0'); - - missile = spawn (); - missile.owner = self; - missile.classname = "laserbolt"; - - missile.movetype = MOVETYPE_FLY; - missile.solid = SOLID_BBOX; - - setmodel (missile, "models/laser.mdl"); - setsize (missile, '0 0 0', '0 0 0'); - setorigin (missile, org); - - missile.velocity = normalize(trueaim - org) * cvar("g_balance_laser_speed"); - missile.angles = vectoangles (missile.velocity); - //missile.glow_color = 250; // 244, 250 - //missile.glow_size = 120; - missile.touch = W_Laser_Touch; - missile.think = SUB_Remove; - missile.nextthink = time + 9; - - missile.effects = EF_FULLBRIGHT | EF_FULLBRIGHT | EF_LOWPRECISION; -} - -// weapon frames - -void() laser_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, laser_ready_01); self.weaponentity.state = WS_READY;}; -void() laser_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() laser_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() laser_fire1_01 = -{ - weapon_doattack(laser_check, laser_check, W_Laser_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.3, laser_ready_01); -}; diff --git a/attic/TeamNexuiz/game/gamec/w_namek.c b/attic/TeamNexuiz/game/gamec/w_namek.c deleted file mode 100644 index aa401cb6d..000000000 --- a/attic/TeamNexuiz/game/gamec/w_namek.c +++ /dev/null @@ -1,138 +0,0 @@ -void() namek_ready_01; -void() namek_fire1_01; -void() namek_fire2_01; -void() namek_deselect_01; -void() namek_select_01; - -float() namek_check = -{ - if (self.ammo_nails > 2) - return TRUE; - return FALSE; -}; - -void(float req) w_namek = -{ - if (req == WR_IDLE) - namek_ready_01(); - else if (req == WR_FIRE1) - weapon_prepareattack(namek_check, namek_check, namek_fire1_01, cvar("g_balance_namek_refire")); - else if (req == WR_FIRE2) - weapon_prepareattack(namek_check, namek_check, namek_fire2_01, cvar("g_balance_namek_refire2")); - else if (req == WR_RAISE) - namek_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = floor(self.ammo_nails / 2); - else if (req == WR_DROP) - namek_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_NAMEK, "w_namek.zym", IT_CELLS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = namek_check(); -}; - -void W_Namek_Touch (void) -{ - if (other == self.owner) - return; - else if (pointcontents (self.origin) == CONTENT_SKY) - { - remove (self); - return; - } - - te_spark(self.origin, normalize(self.velocity) * -70 - '0 0 100', 30); - - if(other.takedamage) - Damage (other, self, self.owner, self.dmg, WEP_NAMEK, self.origin, normalize(self.velocity) * cvar("g_balance_namek_force")); - - remove (self); -} - -void FireNamekBullet(vector org, vector vel, float damage, float brange) -{ - entity proj; - float livetime; - - livetime = brange / vlen(vel); - - //bprint(ftos(livetime), ": ", ftos(brange), ", ", ftos(vlen(vel)), "\n"); - - proj = spawn (); - proj.classname = "spike"; - proj.owner = self; - proj.effects = EF_ADDITIVE | EF_FULLBRIGHT; - proj.think = SUB_Remove; - proj.nextthink = time + livetime; - proj.solid = SOLID_BBOX; - proj.movetype = MOVETYPE_FLY; - proj.dmg = damage; - setorigin(proj, org); - - proj.velocity = vel; - proj.angles = vectoangles(proj.velocity); - proj.touch = W_Namek_Touch; - setmodel(proj, "models/weapons/namekb.mdl"); - setsize(proj, '0 0 0', '0 0 0'); -} - -void W_Namek_Attack() -{ - vector org, dir; - float spread, brange, brange2; - - sound (self, CHAN_WEAPON, "weapons/namek_fire.wav", 1, ATTN_NORM); - - self.punchangle_x = -2; - - self.ammo_nails = self.ammo_nails - 2; - - org = self.origin + self.view_ofs + v_forward * 10 + v_right * 15 + v_up * -14; - - spread = cvar("g_balance_namek_spread"); - dir_x = v_forward_x + crandom()*spread; - dir_y = v_forward_y + crandom()*spread; - dir_z = v_forward_z + crandom()*spread; - dir = normalize(dir); - - brange = cvar("g_balance_namek_range_min"); - brange2 = cvar("g_balance_namek_range_max") - brange; - brange = brange + random()*brange2; - - FireNamekBullet(org, dir * cvar("g_balance_namek_speed"), cvar("g_balance_namek_damage"), brange); -} - -void W_Namek_Attack2() -{ - vector org; - float brange; - - sound (self, CHAN_WEAPON, "weapons/namek_fire.wav", 1, ATTN_NORM); - - self.punchangle_x = -2; - - self.ammo_nails = self.ammo_nails - 2; - - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 10 + v_up * -14; - brange = cvar("g_balance_namek_range2"); - - FireNamekBullet(org + '0 0 1', v_forward * cvar("g_balance_namek_speed2") + v_up * 16 + v_right * -5, cvar("g_balance_namek_damage2"), brange); - FireNamekBullet(org - '0 0 2', v_forward * cvar("g_balance_namek_speed2") + v_up * 16 + v_right * -5, cvar("g_balance_namek_damage2"), brange); -} - -// weapon frames - -void() namek_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, namek_ready_01); self.weaponentity.state = WS_READY;}; -void() namek_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() namek_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() namek_fire1_01 = -{ - weapon_doattack(namek_check, namek_check, W_Namek_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_namek_refire") - 0.05, namek_ready_01); -}; -void() namek_fire2_01 = -{ - weapon_doattack(namek_check, namek_check, W_Namek_Attack2); - weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_namek_refire2") - 0.05, namek_ready_01); -}; - diff --git a/attic/TeamNexuiz/game/gamec/w_nex.c b/attic/TeamNexuiz/game/gamec/w_nex.c deleted file mode 100644 index 3e99328c3..000000000 --- a/attic/TeamNexuiz/game/gamec/w_nex.c +++ /dev/null @@ -1,103 +0,0 @@ -void() nex_ready_01; -void() nex_fire1_01; -void() nex_deselect_01; -void() nex_select_01; - -float() nex_check = -{ - if (self.ammo_cells >= 5) - return TRUE; - return FALSE; -}; - -void(float req) w_nex = -{ - if (req == WR_IDLE) - nex_ready_01(); - else if (req == WR_FIRE1) - weapon_prepareattack(nex_check, nex_check, nex_fire1_01, cvar("g_balance_nex_refire")); - else if (req == WR_RAISE) - nex_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = floor(self.ammo_cells / 5); - else if (req == WR_DROP) - nex_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_NEX, "w_nex.zym", IT_CELLS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = nex_check(); -}; - - -void W_Nex_Attack (void) -{ - local vector org; - local vector end; - local entity flash; - - sound (self, CHAN_WEAPON, "weapons/nexfire.wav", 1, ATTN_NORM); - self.punchangle_x = -5; - org = self.origin + self.view_ofs + v_forward * 5 + v_right * 14 + v_up * -7; - end = self.origin + self.view_ofs + v_forward * 4096; - - FireRailgunBullet (org, end, cvar("g_balance_nex_damage"), WEP_NEX); - - // trace as if shot started inside gun - traceline (org, end, TRUE, self); - // show as if shot started outside of gun - org = self.origin + self.view_ofs + v_forward * 28 + v_right * 14 + v_up * -7; - // muzzleflash light - te_smallflash (org); - // beam effect - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte (MSG_BROADCAST, 76); - WriteCoord (MSG_BROADCAST, org_x); - WriteCoord (MSG_BROADCAST, org_y); - WriteCoord (MSG_BROADCAST, org_z); - WriteCoord (MSG_BROADCAST, trace_endpos_x); - WriteCoord (MSG_BROADCAST, trace_endpos_y); - WriteCoord (MSG_BROADCAST, trace_endpos_z); - WriteCoord (MSG_BROADCAST, 0); - WriteCoord (MSG_BROADCAST, 0); - WriteCoord (MSG_BROADCAST, 0); - // flash and burn the wall - te_plasmaburn (trace_endpos); - /* - // flame effect at impact - dir = trace_plane_normal * 100; - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte (MSG_BROADCAST, TE_FLAMEJET); - WriteCoord (MSG_BROADCAST, trace_endpos_x); - WriteCoord (MSG_BROADCAST, trace_endpos_y); - WriteCoord (MSG_BROADCAST, trace_endpos_z); - WriteCoord (MSG_BROADCAST, dir_x); - WriteCoord (MSG_BROADCAST, dir_y); - WriteCoord (MSG_BROADCAST, dir_z); - WriteByte (MSG_BROADCAST, 255); - */ - // play a sound - PointSound (trace_endpos, "weapons/neximpact.wav", 1, ATTN_NORM); - - if (cvar("g_instagib") == 0) - self.ammo_cells = self.ammo_cells - 5; - - flash = spawn (); - org = self.origin + self.view_ofs + v_forward * 33 + v_right * 14 + v_up * -7; - setorigin (flash, org); - setmodel (flash, "models/nexflash.md3"); - flash.velocity = v_forward * 20; - flash.angles = vectoangles (flash.velocity); - SUB_SetFade (flash, time, 0.4); - flash.effects = flash.effects | EF_ADDITIVE | EF_FULLBRIGHT; -} - -// weapon frames -void() nex_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, nex_ready_01); self.weaponentity.state = WS_READY;}; -void() nex_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() nex_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() nex_fire1_01 = -{ - weapon_doattack(nex_check, nex_check, W_Nex_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.3, nex_ready_01); -}; - diff --git a/attic/TeamNexuiz/game/gamec/w_rocketlauncher.c b/attic/TeamNexuiz/game/gamec/w_rocketlauncher.c deleted file mode 100644 index 608064291..000000000 --- a/attic/TeamNexuiz/game/gamec/w_rocketlauncher.c +++ /dev/null @@ -1,157 +0,0 @@ -void() rlauncher_ready_01; -void() rlauncher_fire1_01; -void() rlauncher_deselect_01; -void() rlauncher_select_01; - -float() rlauncher_check = -{ - if (self.ammo_rockets >= 3) - return TRUE; - return FALSE; -}; - -void(float req) w_rlauncher = -{ - if (req == WR_IDLE) - rlauncher_ready_01(); - else if (req == WR_FIRE1) - weapon_prepareattack(rlauncher_check, rlauncher_check, rlauncher_fire1_01, cvar("g_balance_rocketlauncher_refire")); - else if (req == WR_RAISE) - rlauncher_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = floor(self.ammo_rockets / 3); - else if (req == WR_DROP) - rlauncher_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_ROCKET_LAUNCHER, "w_rl.zym", IT_ROCKETS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = rlauncher_check(); -}; - - -void W_Rocket_Explode (void) -{ - vector org2; - sound (self, CHAN_BODY, "weapons/rocket_impact.ogg", 1, ATTN_NORM); - org2 = findbetterlocation (self.origin); - te_explosion (org2); - effect (org2, "models/sprites/rockexpl.spr", 0, 12, 35); - self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_rocketlauncher_damage"), cvar("g_balance_rocketlauncher_edgedamage"), cvar("g_balance_rocketlauncher_radius"), world, cvar("g_balance_rocketlauncher_force"), IT_ROCKET_LAUNCHER); - - if (self.owner.weapon == WEP_ROCKET_LAUNCHER) - { - if(cvar("g_homing_missile")) - self.owner.attack_finished = time + cvar("g_balance_rocketlauncher_refire"); - } - remove (self); -} - -void W_Rocket_Think (void) -{ - self.nextthink = time; - if (time > self.cnt) - { - W_Rocket_Explode (); - return; - } - if (self.owner) - { - if (self.owner.deadflag) - self.owner = self; - else if (self.owner.wpn == WEP_ROCKET_LAUNCHER && self.owner.button3) - W_Rocket_Explode (); - } -} - -void W_Rocket_Touch (void) -{ - if (pointcontents (self.origin) == CONTENT_SKY) - { - remove (self); - return; - } - else - W_Rocket_Explode (); -} - -void W_Rocket_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -{ - self.health = self.health - damage; - if (self.health <= 0) - W_Rocket_Explode(); -} - -void W_Rocket_Attack (void) -{ - local entity missile; - local entity flash; - local vector org; - local vector end; - - local vector trueaim; - org = self.origin + self.view_ofs; - end = self.origin + self.view_ofs + v_forward * 4096; - traceline(org,end,TRUE,self); - trueaim = trace_endpos; - - sound (self, CHAN_WEAPON, "weapons/rocket_fire.ogg", 1, ATTN_NORM); - if (self.items & IT_STRENGTH) { - sound (self, CHAN_AUTO, "weapons/strength_fire.ogg", 1, ATTN_NORM); - } - - if (cvar("g_use_ammunition") && !cvar("g_rocketarena")) - self.ammo_rockets = self.ammo_rockets - 3; - self.punchangle_x = -4; - org = self.origin + self.view_ofs + v_forward * 15 + v_right * 3 + v_up * -11; - te_smallflash(org); - - missile = spawn (); - missile.owner = self; - missile.classname = "missile"; - - missile.takedamage = DAMAGE_YES; - missile.damageforcescale = 4; - missile.health = 30; - missile.event_damage = W_Rocket_Damage; - - missile.movetype = MOVETYPE_FLY; - missile.solid = SOLID_BBOX; - setmodel (missile, "models/rocket.md3"); - setsize (missile, '0 0 0', '0 0 0'); - - setorigin (missile, org); - missile.velocity = normalize(trueaim - org) * cvar("g_balance_rocketlauncher_speed"); - missile.angles = vectoangles (missile.velocity); - - missile.touch = W_Rocket_Touch; - missile.think = W_Rocket_Think; - missile.nextthink = time; - missile.cnt = time + 9; - sound (missile, CHAN_BODY, "weapons/rocket_fly.ogg", 0.4, ATTN_NORM); - - flash = spawn (); - setorigin (flash, org); - setmodel (flash, "models/flash.md3"); - flash.velocity = v_forward * 20; - flash.angles = vectoangles (flash.velocity); - SUB_SetFade (flash, time, 0.4); - flash.effects = flash.effects | EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; - self.clip_rockets = self.clip_rockets - 1; - if (self.clip_rockets == 0) - { - DoReload (3, 4); // weapon type 3 is RL, and reload 4 rockets. - } -} - -// weapon frames - -void() rlauncher_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, rlauncher_ready_01); self.weaponentity.state = WS_READY;}; -void() rlauncher_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() rlauncher_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() rlauncher_fire1_01 = -{ - weapon_doattack(rlauncher_check, rlauncher_check, W_Rocket_Attack); - weapon_thinkf(WFRAME_FIRE1, 0.3, rlauncher_ready_01); -}; - diff --git a/attic/TeamNexuiz/game/gamec/w_setrope.c b/attic/TeamNexuiz/game/gamec/w_setrope.c deleted file mode 100644 index e7da110ff..000000000 --- a/attic/TeamNexuiz/game/gamec/w_setrope.c +++ /dev/null @@ -1,84 +0,0 @@ -void() setrope_ready_01; -void() setrope_fire1_01; -void() setrope_deselect_01; -void() setrope_select_01; - -float() setrope_check = -{ - return TRUE; -} - -void(float req) w_setrope = -{ - if (req == WR_IDLE) - setrope_ready_01(); - else if (req == WR_FIRE1) - weapon_prepareattack(setrope_check, setrope_check, setrope_fire1_01, cvar("g_balance_setrope_refire")); - else if (req == WR_RAISE) - setrope_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = 1; - else if (req == WR_DROP) - setrope_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_SETROPE, "w_setrope.zym", 0); - else if (req == WR_CHECKAMMO) - weapon_hasammo = setrope_check(); -} - -void RemoveRope() -{ -} - -void RopeThink() -{ -} - -void RopeTouch (void) -{ - if (other.classname != "player" || other.health < 1) - return; - other.ladder_time = time + 0.1; - other.ladder_entity = self; -} - -void W_SetRope (void) -{ - local entity ropestand, oself; - local vector org; - - makevectors(self.v_angle); - org = self.origin + self.view_ofs + v_forward * 15 - v_right * 5 + v_up * -12; - - ropestand = spawn (); - ropestand.owner = self; - ropestand.classname = "ropestand"; - - ropestand.movetype = MOVETYPE_NONE; - ropestand.solid = SOLID_BBOX; - - setmodel (ropestand, "models/ropebase.mdl"); - setsize (ropestand, '0 0 0', '0 0 0'); - setorigin (ropestand, org); - - oself = self; - self = ropestand; - droptofloor(); - self = oself; - - ropestand.angles = self.angles; - ropestand.angles_x = ropestand.angles_z = 0; - - //ropestand.touch = RopeStandTouch; - ropestand.think = RopeExtend; - ropestand.nextthink = time + 0.1; -} - -void() setrope_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, setrope_ready_01); self.weaponentity.state = WS_READY;}; -void() setrope_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() setrope_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() setrope_fire1_01 = -{ - weapon_doattack(setrope_check, setrope_check, W_SetRope); - weapon_thinkf(WFRAME_FIRE1, 0.3, setrope_ready_01); -} diff --git a/attic/TeamNexuiz/game/gamec/w_shotgun.c b/attic/TeamNexuiz/game/gamec/w_shotgun.c deleted file mode 100644 index 958495859..000000000 --- a/attic/TeamNexuiz/game/gamec/w_shotgun.c +++ /dev/null @@ -1,127 +0,0 @@ -void() shotgun_ready_01; -void() shotgun_fire1_01; -void() shotgun_fire2_01; -void() shotgun_deselect_01; -void() shotgun_select_01; - -float() shotgun_check = -{ -// if (self.ammo_shells >= 1) - return TRUE; -// return FALSE; -}; - -void(float req) w_shotgun = -{ - if (req == WR_IDLE) - shotgun_ready_01(); - else if (req == WR_FIRE1) - weapon_prepareattack(shotgun_check, shotgun_check, shotgun_fire1_01, cvar("g_balance_shotgun_refire")); - else if (req == WR_FIRE2) - weapon_prepareattack(shotgun_check, shotgun_check, shotgun_fire2_01, cvar("g_balance_shotgun_loadclip")); - else if (req == WR_RAISE) - shotgun_select_01(); - else if (req == WR_UPDATECOUNTS) - return;//self.currentammo = self.ammo_shells; - else if (req == WR_DROP) - shotgun_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_SHOTGUN, "w_shotgun.zym", IT_SHELLS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = shotgun_check(); -}; - -void W_Shotgun_Attack (void) -{ - local vector org; - float sc; - float bullets; - float d; - float spread; - - local vector end; - local vector trueaim; - org = self.origin + self.view_ofs; - end = self.origin + self.view_ofs + v_forward * 4096; - traceline(org,end,TRUE,self); - - trueaim = trace_endpos; - - sound (self, CHAN_WEAPON, "weapons/shotgun_fire.ogg", 1, ATTN_NORM); - bullets = cvar("g_balance_shotgun_bullets"); - d = cvar("g_balance_shotgun_damage"); - - org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 8) + (v_forward * 5); - spread = cvar("g_balance_shotgun_spread"); - for (sc = 0;sc < bullets;sc = sc + 1) - fireBullet2 (org, normalize(trueaim - org), spread, d, WEP_SHOTGUN, sc < 3, cvar("g_balance_shotgun_force")); - self.currentammo = self.currentammo - 1; - - // casing code - if (cvar("g_casings") >= 1) - { - org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 8) + (v_forward * 10); - SpawnCasing (org, ((random () * 50 + 50) * v_right) - ((random () * 25 + 25) * v_forward) - ((random () * 5 + 10) * v_up), 2, v_forward,'0 250 0', 100, 1); - } - - org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 8) + (v_forward * 20); - W_Smoke(org, v_forward, 12); - //te_smallflash(org); - - self.punchangle_x = -5; -} - -// weapon frames - -void() shotgun_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, shotgun_ready_01); self.weaponentity.state = WS_READY;}; -void() shotgun_select_01 = { - self.currentammo = cvar("g_balance_shotgun_clipsize"); - weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0'); -} -void() shotgun_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; - -void() shotgun_reload_02 = -{ - self.currentammo = self.currentammo + 1; - shotgun_ready_01(); // return to ready state if not already there -} - -void() shotgun_reload_01 = -{ - if(self.currentammo >= cvar("g_balance_shotgun_clipsize")) - { // already full - if(self.weaponentity.state != WS_READY) - shotgun_ready_01(); // return to ready state if not already there - return; - } - // if we somehow reached negative, fix that first - if(self.currentammo < 0) - self.currentammo = 0; - - sound (self, CHAN_WEAPON, "weapons/shotgun_reload.wav", 1, ATTN_NORM); - - // load a shell - weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_shotgun_loadclip2"), shotgun_reload_02); -} - -// after firing, call this funtion to check if the shotgun is empty -void() shotgun_checkempty_01 = -{ - if(self.currentammo >= 1) - { // we don't need to force a reload - shotgun_ready_01(); - return; - } - // load a shell - shotgun_reload_01(); -} - -void() shotgun_fire1_01 = -{ - weapon_doattack(shotgun_check, shotgun_check, W_Shotgun_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_shotgun_refire"), shotgun_checkempty_01); -} -void() shotgun_fire2_01 = -{ - shotgun_reload_01(); -} \ No newline at end of file diff --git a/attic/TeamNexuiz/game/gamec/w_uzi.c b/attic/TeamNexuiz/game/gamec/w_uzi.c deleted file mode 100644 index 22fd402ac..000000000 --- a/attic/TeamNexuiz/game/gamec/w_uzi.c +++ /dev/null @@ -1,106 +0,0 @@ -void() uzi_ready_01; -void() uzi_fire1_01; -void() uzi_deselect_01; -void() uzi_select_01; - -float() uzi_check = -{ - if (self.ammo_nails >= 1) - return TRUE; - return FALSE; -}; - -void(float req) w_uzi = -{ - if (req == WR_IDLE) - uzi_ready_01(); - else if (req == WR_FIRE1 || req == WR_FIRE2) - weapon_prepareattack(uzi_check, uzi_check, uzi_fire1_01, cvar("g_balance_uzi_refire")); - else if (req == WR_RAISE) - uzi_select_01(); - else if (req == WR_UPDATECOUNTS) - self.currentammo = self.ammo_nails; - else if (req == WR_DROP) - uzi_deselect_01(); - else if (req == WR_SETUP) - weapon_setup(WEP_UZI, "w_uzi.zym", IT_NAILS); - else if (req == WR_CHECKAMMO) - weapon_hasammo = uzi_check(); -}; - -.float uzi_bulletcounter; -void W_Uzi_Attack (void) -{ - local vector org; - local vector end; - local vector trueaim; - - org = self.origin + self.view_ofs; - end = self.origin + self.view_ofs + v_forward * 4096; - traceline(org,end,TRUE,self); - - trueaim = trace_endpos; - - entity flash; - sound (self, CHAN_WEAPON, "weapons/uzi_fire.ogg", 1, ATTN_NORM); - if (self.items & IT_STRENGTH) { - sound (self, CHAN_AUTO, "weapons/strength_fire.ogg", 1, ATTN_NORM); - } - - if (cvar("g_use_ammunition")) - self.ammo_nails = self.ammo_nails - 1; - self.punchangle_x = random () - 0.5; - self.punchangle_y = random () - 0.5; - org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 8) + (v_forward * 15); - - // this attack_finished just enforces a cooldown at the end of a burst - self.attack_finished = time + cvar("g_balance_uzi_refire2"); - - if (self.uzi_bulletcounter == 1) - fireBullet (org, normalize(trueaim - org), cvar("g_balance_uzi_spread2"), cvar("g_balance_uzi_damage2"), IT_UZI, (self.uzi_bulletcounter & 3) == 0); - else - fireBullet (org, normalize(trueaim - org), cvar("g_balance_uzi_spread"), cvar("g_balance_uzi_damage"), IT_UZI, (self.uzi_bulletcounter & 3) == 0); - - // casing code - if (cvar("g_casings") >= 2) - { - org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 8) + (v_forward * 10); - SpawnCasing (org, ((random () * 50 + 50) * v_right) - ((random () * 25 + 25) * v_forward) - ((random () * 5 + 10) * v_up), 2, v_forward,'0 250 0', 100, 2); - } - - flash = spawn (); - org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 10) + (v_forward * 40); - setorigin (flash, org); - setmodel (flash, "models/uziflash.md3"); - flash.velocity = v_forward * 20; - flash.angles = vectoangles (flash.velocity); - flash.angles_z=flash.v_angle_z + random () * 180; - flash.scale = 0.75; - flash.alpha = 0.5; - SUB_SetFade (flash, time, 0.2); - flash.effects = flash.effects | EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; - -} -// weapon frames - -void() uzi_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, uzi_ready_01); self.weaponentity.state = WS_READY;}; -void() uzi_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');}; -void() uzi_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);}; -void() uzi_fire1_02 = -{ - if (self.button0) - { - self.uzi_bulletcounter = self.uzi_bulletcounter + 1; - weapon_doattack(uzi_check, uzi_check, W_Uzi_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_refire"), uzi_fire1_02); - } - else - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_refire"), uzi_ready_01); -}; -void() uzi_fire1_01 = -{ - self.uzi_bulletcounter = 1; - weapon_doattack(uzi_check, uzi_check, W_Uzi_Attack); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_refire"), uzi_fire1_02); -}; - diff --git a/attic/TeamNexuiz/game/progs.dat b/attic/TeamNexuiz/game/progs.dat deleted file mode 100644 index e6fa9999de335464d34f4610e981241430c04821..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442038 zcmeFa$#3LYw%_-Y4QY{vRyN>m^xM3_t;!;^s=Hsytp_HDOukMIBALZkhS7nTNJeE$ z6$6>fl_bD>uWZ18?f=8@Mz)^4ktIWx7Fv2^Zv=Q@{{jAd&$-ht;up-U;gw{$vx@P% z_uP3p_uO;NJ@;=^RrQDeVO8Ca|5|nMp{oAQKm6;}?Z1!zKm8lkzxVG{)qnA4f4%yz z{@tqj?}+!`kN#TqPey;E`tToA)&KF=0DR=%-+Xp;H(a!ChND62p|fc9=7Y|1&~H5q zmv^nB>3nc?H(lM{E&p)Q8c+Mfn;~I;chz|}*l+cw;~B~3a(c6T z=*$Pz-+cBrpH;V=@u2s7@woWxF1Wj^;b=LW2rwp_`$2CxoiD1zfY0!DIFXBz1|vBZ z!w-Y1H}5R&s(EM9pN^}=bT#Q$lj(fi87XiupHJu2wEK-a?ni@3WqCe!9;(Hx^DwFA zgYoo!P%Y=3-e5GGkm22+_pUb@4kpX$W=M9k`JmSU+V7u&VPmhl4uf{VkbUF#&o11FjQ6D;^cUG(Zd^%fBZ$?vEF&fg* zi{;~JP+9H{?G1(_uX1;~T+#)zDMk0DlO^?ER5zXOqUsFCRqwt-7Smp5q`FQ9?-gFn zI`ieQM~?dp((T}Ddd0d2&uFlyuIIz$;N|0T;4UJ~-F104oiE+_W;(eI!PK(v&ON0M zQJ2&<#5kNRhs(!GOOQ`f5d!NU7uaNIcVLniYJ54eDv7r z4hEB!PyhaBt%K?050|Zn>3sh9tm=nVF`V2?+shjps{QF|)Nf6uOVGij-|Dmkbxh#y z_GH?c-n6REo>fQ0uta;y-tUda(?9y-XVvlK9yCN(;cqP;XM@(PvseuJ zbkLSmb@;w8(f)`umn@1!Jy1DN+@+Ao(Y$lp9DF^TOa}96HtIa`sg)|v@kAJXF|b^! z>pQxsddWPTR4+%XLG^0R6say~?p0?}oewAPsxvU{?Vvhe&1WpwgUp;r)=QKB=zm2CeDxZZL0+2jlKwzR)y#oUZ1r zC2eT2o&5S))%tZy5$6N>nWiCyx11D{oMOHIRW=yy;ly&c4rh7MC#z+3IT_CAxy$LO zKjeGBZZR6#a&Mhbwf*V1+gY|w27PeW>p|!Kv2{J@%)kb%SF6YB{Bb_5E@zL`;RFOS zAcNGXv+iOrzXx(*TUYDchN!2}u8)&CO3+g_%c}K99{rE&aSY?+SR0)gJG-7r(c%

    $UgEtz&@f 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 Cq0&D9 diff --git a/attic/TeamNexuiz/menu/constants.menu b/attic/TeamNexuiz/menu/constants.menu deleted file mode 100644 index 0ffadf728..000000000 --- a/attic/TeamNexuiz/menu/constants.menu +++ /dev/null @@ -1,94 +0,0 @@ -// Property of Alientrap -// -// Constants - -// Item flags -// TODO: keep this always in sync with its control/items.qh counterpart -#define FlagTemplate "1" // this is a template do not touch, do not draw - actually dont do anything with it -#define FlagEmbedded "2" // the item cant be selected and all its children are embedded into its parent -#define FlagHidden "4" // events wont be called and it wont be drawn, etc. -#define FlagNoSelect "8" // cant be selected (but events will be called) -#define FlagConnected "16" // only if connected (i.e. playing) -#define FlagServer "32" // only displayed if server -#define FlagDeveloper "64" // only displayed if developer -#define FlagDraw "128" // only the draw event will be called -#define FlagChildDraw "256" // used to make the children only drawable -#define FlagDrawUpdate "512" // only the draw and update event get called -#define FlagChildDrawUpdate "1024" // only the draw and refresh events are called for children -#define FlagSealOffMouse "2048" // used to seal all items under the item with this flag off from mouse events - -#define InfiniteFloat "10000000.0" -#define InfiniteVector "10000000.0 10000000.0 10000000.0" - -// Alignment constants -#define AlignLeft "0" -#define AlignCenter "1" -#define AlignRight "2" -#define AlignFixLeft "4" // |text - actually this isnt necessary -#define AlignFixCenter "8" // te|xt -#define AlignFixRight "16" // text| -#define AlignFirst "32" // for layouts: item| ... | being the origin - -// DrawFlag constants -#define DrawFlagNormal "0" -#define DrawFlagAdditive "1" -#define DrawFlagModulate "2" -#define DrawFlag2xModulate "3" - -// Item constants -#define DefaultFontSize "11 11 0" - -// Text constants -#define DefaultTextColor "0 0 0" -#define DefaultTextAlpha "1" -#define DefaultTextDrawFlag [DrawFlagNormal] - -#define DefaultSelTextColor "0 0 1" -#define DefaultSelTextAlpha "1" -#define DefaultSelTextDrawFlag [DrawFlagNormal] - -#define DefaultPreTextColor "1 0 0" -#define DefaultPreTextAlpha "1" -#define DefaultPreTextDrawFlag [DrawFlagNormal] - -#define DefaultInaTextColor "0.1 0.1 0.5" -#define DefaultInaTextAlpha "1" -#define DefaultInaTextDrawFlag [DrawFlagNormal] - -// Picture constants -#define DefaultPicColor "1 1 1" -#define DefaultPicAlpha "1" -#define DefaultPicDrawFlag [DrawFlagNormal] - -#define DefaultSelPicColor "0.2 0.2 1" -#define DefaultSelPicAlpha "1" -#define DefaultSelPicDrawFlag [DrawFlagNormal] - -#define DefaultPrePicColor "1 0.2 0.2" -#define DefaultPrePicAlpha "1" -#define DefaultPrePicDrawFlag [DrawFlagNormal] - -// Sound constants -#define DefaultSelectSound "misc/menu1.wav" -#define DefaultPressSound "misc/mouseclick.wav" - -#define DefaultIncreaseSound "misc/increasevalue.wav" -#define DefaultDecreaseSound "misc/decreasevalue.wav" - -#define DefaultStartSound "misc/startgame.wav" -#define DefaultEndSound "misc/endgame.wav" - -// Slider -#define DefaultSliderBar "gfx/m_sliderbar" -#define DefaultSlider "gfx/m_slider" -#define DefaultSliderBarSize "144 12" -#define DefaultSliderSize "12 12" -#define DefaultProportions "0.073107 0.853785 0.073107" -#define DefaultDirection "0.5 0.5" - -// EditBoxs -#define DefaultCursorSize "1.375 12 0" -#define DefaultCursorFlashSize "1.375 12 0" -#define DefaultCursorColor "0 0 0" -#define DefaultCursorFlashColor "0 0 0" - diff --git a/attic/TeamNexuiz/menu/creategame.menu b/attic/TeamNexuiz/menu/creategame.menu deleted file mode 100644 index 84ccce4ea..000000000 --- a/attic/TeamNexuiz/menu/creategame.menu +++ /dev/null @@ -1,63 +0,0 @@ -// Property of Alientrap/AK -// -// creategame.menu -Item Layout CreateGame -{ - size '900 630' - alignment [AlignLeft] - direction [Nex_DefaultVertDirection] - - Item Layout Bar - { - size '900 20' - alignment [AlignLeft] - direction '32 0 0' - - Derive TextButton BasicOptions - { - normal "Basic Options" - - init Nex_Action_JumpToPage - target "Panel::Basic" - } - Derive TextButton MapList - { - normal "Map List" - - init Nex_Action_JumpToPage - target "Panel::MapList" - } - Derive TextButton GameSettings - { - normal "Game Settings" - - init Nex_Action_JumpToPage - target "Panel::Game" - } - Derive TextButton WeaponSettings - { - normal "Weapon Settings" - - init Nex_Action_JumpToPage - target "Panel::Weapon" - } - Derive TextButton Management - { - normal "Management" - - init Nex_Action_JumpToPage - target "Panel::Management" - } - } - Item EventWindow Panel - { - size '900 585' - reinit Nex_Action_MakeFirstVisible - - #include "menu/creategame/basic.menu" - #include "menu/creategame/maplist.menu" - #include "menu/creategame/game.menu" - #include "menu/creategame/weapon.menu" - #include "menu/creategame/management.menu" - } -} diff --git a/attic/TeamNexuiz/menu/credits.menu b/attic/TeamNexuiz/menu/credits.menu deleted file mode 100644 index 45fca09bd..000000000 --- a/attic/TeamNexuiz/menu/credits.menu +++ /dev/null @@ -1,85 +0,0 @@ -// Property of Alientrap/AK -// -// credits.menu -Item Window CreditsWnd -{ - pos '300 300' - size '400 400' - flag [FlagHidden] - - Derive Rect Background - { - flag [FlagSealOffMouse] - color '0.0 0.0 0.0' - alpha 0.8 - Ignore - { - color '0.1 0.1 0.1' - drawFlag [DrawFlagModulate] - - Derive Rect Layer - { - color '0.3 0.3 0.3' - drawFlag [DrawFlagAdditive] - } - } - } - Item Layout Layout - { - origin '200 0' - direction [Nex_DefaultVertDirection] - flag [FlagEmbedded] - alignment [AlignCenter] - - Item FloatingArea Title - { - size '400 13' - target "##up up" - Derive Rect Background - { - //color '0.5 0.5 0.5' - color '0.05 0.05 0.05' - } - Derive TextButton Caption - { - color '1.0 1.0 1.0' - size '400 11' - alignment [AlignCenter] - normal "Credits" - link "##up" - } - } - Item Arrangement Items - { - direction [Nex_DefaultVertDirection] - key Nex_Credits_Key - alignment [AlignCenter] - - Item Window Scroller - { - size '400 350' - - Item Task_Job Job - { - direction '0 50' - reinit Nex_Credits_SetSizeX - update Nex_Credits_Scroll - } - - Derive Nex_Credits Credits - { - color '1.0 1.0 1.0' - alignment [AlignCenter] - target "betacredits.txt" - } - } - - Derive TextButton Close - { - color '1.0 1.0 1.0' - normal "Close" - action Nex_Credits_Toggle - } - } - } -} diff --git a/attic/TeamNexuiz/menu/data.menu b/attic/TeamNexuiz/menu/data.menu deleted file mode 100644 index 37ae06a66..000000000 --- a/attic/TeamNexuiz/menu/data.menu +++ /dev/null @@ -1,25 +0,0 @@ -// Property of Alientrap -// -// Cvar Definitions -Item DataContainer Data -{ -#define DataLink_ZeroOneValue Derive "::DataLink_ZeroOneValue" Value {} -#define DataLink_OnOffSwitch Derive "::DataLink_OnOffSwitch" Switch {} -#define DataLink_Setting Derive "::DataLink_SettingValue" Value {} \ - Derive "::DataLink_SettingText" Text {} - - #include "menu/data/player.menu" - #include "menu/data/color.menu" - #include "menu/data/video.menu" - #include "menu/data/effects.menu" - #include "menu/data/input.menu" - #include "menu/data/key.menu" - #include "menu/data/sound.menu" - - #include "menu/data/serverlist.menu" - - #include "menu/data/server.menu" - #include "menu/data/game.menu" - #include "menu/data/weapon.menu" - #include "menu/data/management.menu" -} diff --git a/attic/TeamNexuiz/menu/ingame.menu b/attic/TeamNexuiz/menu/ingame.menu deleted file mode 100644 index 46e8fc197..000000000 --- a/attic/TeamNexuiz/menu/ingame.menu +++ /dev/null @@ -1,4 +0,0 @@ -// Property of Alientrap -// -// Ingame main menu - diff --git a/attic/TeamNexuiz/menu/joingame.menu b/attic/TeamNexuiz/menu/joingame.menu deleted file mode 100644 index 75b0ab2e2..000000000 --- a/attic/TeamNexuiz/menu/joingame.menu +++ /dev/null @@ -1,200 +0,0 @@ -// Property of Alientrap/AK -// -// joingame.menu - -Item Window JoinGame -{ - Derive Picture Table3 - { - picture "gfx/table3" - pos '0 0' - size '900 555' - } - Item Layout JoinGame - { - size '900 650' - direction '0 10' - alignment [AlignCenter] - origin '450 0' -#define SList_Ping '50 15' -#define SList_Name '492 15' -#define SList_Map '120 15' -#define SList_Players '60 15' -#define SList_Mod '120 15' -#define SList_Direction '2 0' - - Derive Nex_Composition Query - { - Derive TextButton Description - { - normal "Query String:" - - link "##next" - } - Derive EditBox EditBox - { - size '700 12' - target "::Data::ServerList::QueryString::Text" - - action Nex_Action_ExecuteQuery - } - } - - Item Layout TableDesc - { - direction [SList_Direction] - flag [FlagEmbedded] - size '900 15' - - DeriveTemplate Rect Theme - { - color '0.5 0.5 0.5' - alpha 0.5 - flag [FlagEmbedded] - } - Derive Theme Ping - { - size [SList_Ping] - Derive TextButton Text - { - normal "Ping" - - init Nex_Action_JoinGame_SortBy - target "ping" - } - } - Derive Theme Name - { - size [SList_Name] - Derive TextButton Text - { - normal "Server Name" - - init Nex_Action_JoinGame_SortBy - target "name" - } - } - Derive Theme Map - { - size [SList_Map] - Derive TextButton Text - { - normal "Map Name" - - init Nex_Action_JoinGame_SortBy - target "map" - } - } - Derive Theme Players - { - size [SList_Players] - Item Arrangement Glue - { - direction '0.001 0 0' - flag [FlagEmbedded] - - Derive TextButton NumPlayers - { - normal "NP" - - init Nex_Action_JoinGame_SortBy - target "numplayers" - } - Derive Label Slash - { - text "/" - } - Derive TextButton MaxPlayers - { - normal "MP" - - init Nex_Action_JoinGame_SortBy - target "maxplayers" - } - } - } - Derive Theme Mod - { - size [SList_Mod] - Derive TextButton Text - { - normal "Mod Name" - - init Nex_Action_JoinGame_SortBy - target "mod" - } - } - } - Item Window Scroll - { - flag [FlagEmbedded] - size '900 500' - - Item ScrollWindow ScrollArea - { - flag [FlagEmbedded] - size '870 500' - - Item Arrangement Slist - { - direction '0 1 0' - flag [FlagEmbedded] - - DeriveTemplate Nex_HostCache_Entry Entry - { - size '852 15' - action Nex_Action_EntryConnect - - DeriveTemplate Nex_HostCache_ValueField Ping - { - pos '0 0' - size [SList_Ping] - target "ping" - alignment [AlignRight] - } - DeriveTemplate Nex_HostCache_StringField Name - { - pos '52 0' - size [SList_Name] - target "name" - } - DeriveTemplate Nex_HostCache_StringField Map - { - pos '546 0' - size [SList_Map] - target "map" - } - DeriveTemplate Nex_HostCache_Players Players - { - pos '668 0' - size [SList_Players] - alignment [AlignRight] - } - DeriveTemplate Nex_HostCache_StringField Mod - { - pos '730 0' - size [SList_Mod] - target "mod" - } - } - Item Automation_Job Generator - { - action Nex_Automation_CreateEntries - } - } - } - Item VScrollBar Scroller - { - pos '870 0' - size '20 100' - target "##prev" - } - } - Derive PictureButton Refresh - { - normal "$gfx/m_refresh" - - action Nex_Action_RefreshSlist - } - } -} \ No newline at end of file diff --git a/attic/TeamNexuiz/menu/main.menu b/attic/TeamNexuiz/menu/main.menu deleted file mode 100644 index 9ee7ca9b4..000000000 --- a/attic/TeamNexuiz/menu/main.menu +++ /dev/null @@ -1,57 +0,0 @@ -// Property of Alientrap -// -// Main menu -Item Arrangement Main -{ - pos '29 30' - direction '10 0' - - DeriveTemplate PictureButton MainButton - { - soundPressed "misc/menu2.wav" - } - - Derive MainButton Join - { - //normal "Join Game" - normal "$gfx/m_top_joingame" - selected "$gfx/m_top_joingame" - - target "JoinGame" - action Nex_Action_JumpToJoinGame - } - Derive MainButton Create - { - //normal "Create Game" - normal "$gfx/m_top_creategame" - selected "$gfx/m_top_creategame" - - target "CreateGame" - init Nex_Action_SetNormalPanelLink - } - Derive MainButton Options - { - //normal "Options" - normal "$gfx/m_top_options" - selected "$gfx/m_top_options" - - target "Options" - init Nex_Action_SetNormalPanelLink - } - Derive MainButton Credits - { - //normal "Credits" - normal "$gfx/m_top_credits" - selected "$gfx/m_top_credits" - - action Nex_Credits_Action - } - Derive MainButton Quit - { - //normal "Quit" - normal "$gfx/m_top_quit" - selected "$gfx/m_top_quit" - - action Nex_Quit_Action - } -} diff --git a/attic/TeamNexuiz/menu/menu b/attic/TeamNexuiz/menu/menu deleted file mode 100644 index 3831967c8..000000000 --- a/attic/TeamNexuiz/menu/menu +++ /dev/null @@ -1,18 +0,0 @@ -// Property of Alientrap -// -// Menu -#include "menu/constants.menu" -#include "menu/templates.menu" -//#include "menu/test.menu" -//Ignore { -#include "menu/data.menu" - -#include "menu/creategame.menu" -#include "menu/options.menu" -#include "menu/joingame.menu" -#include "menu/normal.menu" - -#include "menu/ingame.menu" - -#include "menu/teamselect.menu" -//} diff --git a/attic/TeamNexuiz/menu/messagebox.menu b/attic/TeamNexuiz/menu/messagebox.menu deleted file mode 100644 index 748233b40..000000000 --- a/attic/TeamNexuiz/menu/messagebox.menu +++ /dev/null @@ -1,82 +0,0 @@ -// Property of Alientrap -// -// message box window -// messagebox.menu - -// MessageBoxWnd::Layout::Title::Caption -// MessageBoxWnd::Layout::Text -// MessageBoxWnd::Layout::Buttons::Left -// MessageBoxWnd::Layout::Buttons::Right -Item Window MessageBoxWnd -{ - pos '300 300' - size '400 80' - flag [FlagHidden] - - Derive Rect Background - { - flag [FlagSealOffMouse] - color '0 0 0' - alpha 0.8 - Ignore { - color '0.1 0.1 0.1' - drawFlag [DrawFlagModulate] - - - Derive Rect Layer - { - color '0.3 0.3 0.3' - drawFlag [DrawFlagAdditive] - } - } - } - Item Layout Layout - { - origin '200 0' - direction '0.0 10' - flag [FlagEmbedded] - alignment [AlignCenter] - - Item FloatingArea Title - { - size '400 13' - target "##up up" - Derive Rect Background - { - //color '0.5 0.5 0.5' - color '0.05 0.05 0.05' - } - Derive TextButton Caption - { - color '1.0 1.0 1.0' - size '400 11' - alignment [AlignCenter] - //normal "Message Box Window" - link "##up" - } - } - Derive Label Text - { - color '1.0 1.0 1.0' - //text "MessageBox Text" - } - Item Arrangement Buttons - { - direction '40 0' - key Nex_MessageBox_Key - - Derive TextButton Left - { - color '1.0 1.0 1.0' - //normal "Left" - action Nex_MessageBox_LeftButton - } - Derive TextButton Right - { - color '1.0 1.0 1.0' - //normal "Right" - action Nex_MessageBox_RightButton - } - } - } -} diff --git a/attic/TeamNexuiz/menu/normal.menu b/attic/TeamNexuiz/menu/normal.menu deleted file mode 100644 index 2267ba8ea..000000000 --- a/attic/TeamNexuiz/menu/normal.menu +++ /dev/null @@ -1,85 +0,0 @@ -// Property of Alientrap -// -// Normal main menu -Item Task_Job WelcomeSound -{ - target "announcer/welcometonexuiz.wav" - reinit Nex_Action_PlaySoundOnce -} -Item Window Normal -{ - key Nex_Global_Key - size '1024 768' - - Derive Rect Modulate - { - color '0.6 0.6 0.7' - drawFlag [DrawFlagModulate] - } - Derive Rect AddLevel - { - color '0.3 0.3 0.3' - drawFlag [DrawFlagAdditive] - } - Derive Picture NexuizLogo - { - picture "gfx/m_background" - pos '0 0' - size '1024 768' - alpha 0.5 - -Ignore -{ - Item Effect_Float AlphaPulse - { - targetFloat alpha - startFloat 0.8 - endFloat 0.4 - time '2 2 -1' - interpolForward FX_SquareInterpolation - interpolBackward FX_SquareInterpolation - } - Item Effect_Vector ColorPulse - { - targetVector color - startVector "0 0 0" - endVector "0.1 0 0.05" - time '2 2 -1' - interpolForward FX_SquareInterpolation - interpolBackward FX_SquareInterpolation - } -} - } - - // Include the main menu as first sub window - #include "menu/main.menu" - - Item Task_Job PanelReinit - { - // this is a automation init function (dont change this to reinit!) - init Nex_Action_SetLinkOnReinit - target "Panel::NexuizLogo" - } - Item Reference Panel - { - pos '62 127' - size '938 650' - - // The first thing you should see is our cool logo! - Derive Picture NexuizLogo - { - picture "gfx/m_strength" - pos '100 30' - size '700 600' - } - } - -// global floating windows -#include "menu/credits.menu" -#include "menu/messagebox.menu" -#include "menu/quit.menu" -} - - - - diff --git a/attic/TeamNexuiz/menu/options.menu b/attic/TeamNexuiz/menu/options.menu deleted file mode 100644 index 47826a4e2..000000000 --- a/attic/TeamNexuiz/menu/options.menu +++ /dev/null @@ -1,75 +0,0 @@ -// Property of Alientrap/AK -// Options menu - -Item Layout Options -{ - direction '20 0' - - Item Arrangement Menu - { - direction '0 10' - - Derive TextButton Player - { - normal "Player" - - init Nex_Action_JumpToPage - target "Panel::Player" - } - Derive TextButton Controls - { - normal "Controls" - - init Nex_Action_JumpToPage - target "Panel::KeyControl" - } - Derive TextButton Audio - { - normal "Audio" - - init Nex_Action_JumpToPage - target "Panel::Sound" - } - Derive TextButton Video - { - normal "Video" - - init Nex_Action_JumpToPage - target "Panel::Video" - } - Derive TextButton ColorControl - { - normal "Color Control" - - init Nex_Action_JumpToPage - target "Panel::ColorControl" - } - Derive TextButton Effects - { - normal "Effects" - - init Nex_Action_JumpToPage - target "Panel::Effects" - } - Derive TextButton Input - { - normal "Input" - - init Nex_Action_JumpToPage - target "Panel::Input" - } - } - Item EventWindow Panel - { - size '760 800' - reinit Nex_Action_MakeFirstVisible - - #include "menu/options/sound.menu" - #include "menu/options/video.menu" - #include "menu/options/key.menu" - #include "menu/options/player.menu" - #include "menu/options/color.menu" - #include "menu/options/effects.menu" - #include "menu/options/input.menu" - } -} \ No newline at end of file diff --git a/attic/TeamNexuiz/menu/qcc.exe b/attic/TeamNexuiz/menu/qcc.exe deleted file mode 100644 index 52171f209dcb2fe7223be233a0a4d09ac599008d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208896 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 diff --git a/attic/TeamNexuiz/menu/quit.menu b/attic/TeamNexuiz/menu/quit.menu deleted file mode 100644 index 44220003f..000000000 --- a/attic/TeamNexuiz/menu/quit.menu +++ /dev/null @@ -1,76 +0,0 @@ -// Property of Alientrap -// -// Quit window -Item Window QuitWnd -{ - pos '300 300' - size '400 80' - flag [FlagHidden] - - Derive Rect Background - { - flag [FlagSealOffMouse] - color '0 0 0' - alpha 0.8 - Ignore { - color '0.1 0.1 0.1' - drawFlag [DrawFlagModulate] - - - Derive Rect Layer - { - color '0.3 0.3 0.3' - drawFlag [DrawFlagAdditive] - } - } - } - Item Layout Layout - { - origin '200 0' - direction '0.0 10' - flag [FlagEmbedded] - alignment [AlignCenter] - - Item FloatingArea Title - { - size '400 13' - target "##up up" - Derive Rect Background - { - //color '0.5 0.5 0.5' - color '0.05 0.05 0.05' - } - Derive TextButton Caption - { - color '1.0 1.0 1.0' - size '400 11' - alignment [AlignCenter] - normal "Quit Window" - link "##up" - } - } - Derive Label Text - { - color '1.0 1.0 1.0' - text "Do you really want to quit?" - } - Item Arrangement Buttons - { - direction '40 0' - key Nex_Quit_Key - - Derive TextButton Yes - { - color '1.0 1.0 1.0' - normal "Yes" - action Nex_Quit_Yes - } - Derive TextButton No - { - color '1.0 1.0 1.0' - normal "No" - action Nex_Quit_No - } - } - } -} diff --git a/attic/TeamNexuiz/menu/teamselect.menu b/attic/TeamNexuiz/menu/teamselect.menu deleted file mode 100644 index 7027ad099..000000000 --- a/attic/TeamNexuiz/menu/teamselect.menu +++ /dev/null @@ -1,72 +0,0 @@ -// Property of Alientrap -// -// teamselect.menu -Item Window TeamSelect -{ - key Nex_Global_Key - pos '256 256' - size '512 216' - - Derive Picture Background - { - size '512 216' - picture "gfx/tbackground" - } - - DeriveTemplate PictureButton TeamSelectButton - { - color '0.5 0.5 0.5' - colorSelected '0.8 0.8 0.8' - colorPressed '1.0 1.0 1.0' - - init Nex_Action_ConsoleCmd - } - Derive TeamSelectButton RedTeam - { - pos '15 54' - size '186 66' - normal "$gfx/tred" - - syncCmd "cmd selectteam red; cmd join; togglemenu\n" - } - Derive TeamSelectButton AutoSelect - { - pos '204 54' - size '104 68' - normal "$gfx/tauto" - - syncCmd "cmd selectteam auto; cmd join; togglemenu\n" - } - Derive TeamSelectButton BlueTeam - { - pos '311 54' - size '186 66' - normal "$gfx/tblue" - - syncCmd "cmd selectteam blue; cmd join; togglemenu\n" - } - Derive TeamSelectButton YellowTeam - { - pos '15 127' - size '186 66' - normal "$gfx/tyellow" - - syncCmd "cmd selectteam yellow; cmd join; togglemenu\n" - } - Derive TeamSelectButton Spectator - { - pos '204 116' - size '104 76' - normal "$gfx/tspec" - - syncCmd "cmd spectate; togglemenu\n" - } - Derive TeamSelectButton PinkTeam - { - pos '311 127' - size '186 66' - normal "$gfx/tpink" - - syncCmd "cmd selectteam green; cmd join; togglemenu\n" - } -} diff --git a/attic/TeamNexuiz/menu/templates.menu b/attic/TeamNexuiz/menu/templates.menu deleted file mode 100644 index fb2e7c22d..000000000 --- a/attic/TeamNexuiz/menu/templates.menu +++ /dev/null @@ -1,256 +0,0 @@ -// Property of Alientrap -// -// Templates - -////////////////////////////////////////////////////////////////////////////////// -// Basic default templates (setting default properties) -////////////////////////////////////////////////////////////////////////////////// -Template Rect Rect -{ - size [InfiniteVector] - alpha 1.0 - drawFlag [DrawFlagNormal] - color '1.0 1.0 1.0' -} -Template Label Label -{ - color [DefaultTextColor] - alpha [DefaultTextAlpha] - drawFlag [DefaultTextDrawFlag] - fontSize [DefaultFontSize] -} -Template Picture Picture -{ - color [DefaultPicColor] - alpha [DefaultPicAlpha] - drawFlag [DefaultPicDrawFlag] -} -Template Button TextButton -{ - fontSize [DefaultFontSize] - color [DefaultTextColor] - colorSelected [DefaultSelTextColor] - colorPressed [DefaultPreTextColor] - alphas_x [DefaultTextAlpha] - alphas_y [DefaultSelTextAlpha] - alphas_z [DefaultPreTextAlpha] - drawFlags_x [DefaultTextDrawFlag] - drawFlags_y [DefaultSelTextDrawFlag] - drawFlags_z [DefaultPreTextDrawFlag] - soundSelected [DefaultSelectSound] - soundPressed [DefaultPressSound] -} -Template Button PictureButton -{ - color [DefaultPicColor] - colorSelected [DefaultSelPicColor] - colorPressed [DefaultPrePicColor] - alphas_x [DefaultPicAlpha] - alphas_y [DefaultSelPicAlpha] - alphas_z [DefaultPrePicAlpha] - drawFlags_x [DefaultPicDrawFlag] - drawFlags_y [DefaultSelPicDrawFlag] - drawFlags_z [DefaultPrePicDrawFlag] - soundSelected [DefaultSelectSound] - soundPressed [DefaultPressSound] -} -Template Slider Slider -{ - color [DefaultPicColor] - //colorSelected [DefaultSelPicColor] - colorSelected "0.9 0.9 1.0" - alphas_x [DefaultPicAlpha] - alphas_y [DefaultSelPicAlpha] - drawFlags_x [DefaultPicDrawFlag] - drawFlags_y [DefaultSelPicDrawFlag] - soundSelected [DefaultSelectSound] - soundIncrease [DefaultIncreaseSound] - soundDecrease [DefaultDecreaseSound] - picture [DefaultSliderBar] - pictureSlider [DefaultSlider] - proportions [DefaultProportions] - direction [DefaultDirection] - size [DefaultSliderBarSize] - sizeSlider [DefaultSliderSize] -} -Template EditBox EditBox -{ - fontSize [DefaultFontSize] - color [DefaultTextColor] - colorSelected [DefaultTextColor] - colorPressed [DefaultPreTextColor] - alphas_x [DefaultTextAlpha] - alphas_y [DefaultSelTextAlpha] - alphas_z [DefaultPreTextAlpha] - drawFlags_x [DefaultTextDrawFlag] - drawFlags_y [DefaultSelTextDrawFlag] - drawFlags_z [DefaultPreTextDrawFlag] - colorCursor [DefaultCursorColor] - colorCursorFlash [DefaultCursorFlashColor] - alphasCursor_x [DefaultTextAlpha] - alphasCursor_y [DefaultSelTextAlpha] - drawFlagsCursor_x [DefaultTextDrawFlag] - drawFlagsCursor_y [DefaultSelTextDrawFlag] - sizeCursor [DefaultCursorSize] - sizeCursorFlash [DefaultCursorFlashSize] - soundSelected [DefaultSelectSound] - soundMove [DefaultIncreaseSound] - soundKey [DefaultDecreaseSound] -} -Template List List -{ - fontSize [DefaultFontSize] - color [DefaultTextColor] - colorSelected [DefaultSelTextColor] - colorPressed [DefaultPreTextColor] - colorInactive [DefaultInaTextColor] - alphas_x [DefaultTextAlpha] - alphas_y [DefaultSelTextAlpha] - alphas_z [DefaultPreTextAlpha] - alphaInactive [DefaultInaTextAlpha] - drawFlags_x [DefaultTextDrawFlag] - drawFlags_y [DefaultSelTextDrawFlag] - drawFlags_z [DefaultPreTextDrawFlag] - drawFlagInactive [DefaultInaTextDrawFlag] - soundSelected [DefaultSelectSound] - soundPressed [DefaultPressSound] -} -DeriveTemplate TextButton ValueButton -{ - type "Item_ValueButton" -} -DeriveTemplate PictureButton PictureValueButton -{ - type "Item_ValueButton" -} -DeriveTemplate Label MultiLabel -{ - type "Item_MultiLabel" -} -DeriveTemplate TextButton SwitchButton -{ - type "Item_SwitchButton" -} -////////////////////////////////////////////////////////////////////////////////// -// Derived items -////////////////////////////////////////////////////////////////////////////////// -Template Arrangement Composition -{ - flag [FlagEmbedded] -} -////////////////////////////////////////////////////////////////////////////////// -// Specialized items -////////////////////////////////////////////////////////////////////////////////// -Template DataLink_ValueSwitch DataLink_OnOffSwitch -{ - minValue 0.0 - maxValue 1.0 - descList "'Off' 'On'" - link "##up" -} -Template DataLink_Value DataLink_ZeroOneValue -{ - minValue 0.0 - maxValue 1.0 - stepValue 0.05 - link "##up" -} -Template DataLink_Value DataLink_SettingValue -{ - minValue 0.0 - maxValue 9999.0 - stepValue 0.01 - link "##up" -} -Template DataLink_Text DataLink_SettingText -{ - maxValue 9 - link "##down" - - Template DataLink_TextValue DataLink_TextValue - { - link "##up prev" - } -} -////////////////////////////////////////////////////////////////////////////////// -// Nexuiz specialized items -////////////////////////////////////////////////////////////////////////////////// -#define Nex_DefaultHorzDirection '20 0 0' -#define Nex_DefaultVertDirection '0 10 0' -Template Automation_Job Nex_Automation_Option_Slider -{ - action Nex_Automation_Option_Slider -} -Template Automation_Job Nex_Automation_Option_EditBox -{ - action Nex_Automation_Option_EditBox -} -Template Automation_Job Nex_Automation_Option_Switch -{ - action Nex_Automation_Option_Switch -} -DeriveTemplate Composition Nex_Composition -{ - direction [Nex_DefaultHorzDirection] -} -DeriveTemplate Picture Nex_Line -{ - picture "gfx/m_dot" - size "200 10" -} -Item Custom Nex_Void -{ - size "200 12" - flag [FlagNoSelect] -} - -DeriveTemplate TextButton Nex_KeyButton -{ - type "Item_Nex_KeyButton" -} -DeriveTemplate MultiLabel Nex_Credits -{ - type "Item_Nex_Credits" -} -DeriveTemplate Label Nex_HostCache_StringField -{ - type "Item_Nex_HostCache_StringField" -} -DeriveTemplate Label Nex_HostCache_ValueField -{ - type "Item_Nex_HostCache_ValueField" -} -DeriveTemplate Label Nex_HostCache_Players -{ - type "Item_Nex_HostCache_Players" -} -DeriveTemplate PictureButton Nex_HostCache_Entry -{ - normal "$gfx/white" - drawFlags [DrawFlagModulate] - type "Item_Nex_HostCache_Entry" -} -DeriveTemplate Nex_Composition Nex_Option_Slider -{ - DeriveTemplate Nex_Automation_Option_Slider Automation - {} - DeriveTemplate TextButton Description - {} - DeriveTemplate Slider Slider - { - action Nex_Action_TestOnChange - } - DeriveTemplate ValueButton Value - {} -} -DeriveTemplate Nex_Composition Nex_Option_Switch -{ - DeriveTemplate Nex_Automation_Option_Switch Automation - {} - DeriveTemplate TextButton Description - {} - DeriveTemplate SwitchButton Switch - { - action Nex_Action_TestOnChange - } -} diff --git a/attic/TeamNexuiz/menu/test.menu b/attic/TeamNexuiz/menu/test.menu deleted file mode 100644 index de1535640..000000000 --- a/attic/TeamNexuiz/menu/test.menu +++ /dev/null @@ -1,21 +0,0 @@ -// DP/Nex Menu -// Test Menu -Item Window Normal -{ - pos '100 100' - size '800 500' - - Item Window Test1 - { - pos '10 10' - origin '20 20' - size '100 100' - } - Item Window Test2 - { - pos '200 200' - origin '100 100' - size '300 300' - } -} - diff --git a/attic/TeamNexuiz/menuqc/dotmenu.txt b/attic/TeamNexuiz/menuqc/dotmenu.txt deleted file mode 100644 index 10375887d..000000000 --- a/attic/TeamNexuiz/menuqc/dotmenu.txt +++ /dev/null @@ -1,51 +0,0 @@ -Parser documentation/.menu docs: -================================== - -A token is a sequence of letters that are not whitespaces. -If the parser expects something, it will error out if it doesnt find the expected token/type. - -The parser supports the following token types which refer to the keyword: - -Type Keyword ------ ------- -ITEM Item -TEMPLATE Template -DERIVE Derive -DERIVETEMPLATE DeriveTemplate -NAMESPACE Namespace -IGNORE Ignore -DEFINE #define -UNDEF #undef -INCLUDE #include -BRACEOPEN { -BRACECLOSE } -BRACKETOPEN [ -BRACKETCLOSE ] -TOKEN any other token - -You can use either the " or the ' to start a string - mind to use the same char to finish it! -DP only supports the \n and \\ escape chars currently. - -Now Im going to explain the behavior of the parser after it encounters a specific token: - -Ignore - - The parser expects a { next and reads over everything until it encounters the corresponding }. - Mind that corresponding means you can comment out/make it ignore bigger parts of the .menu files, - since it keeps the number { while parsing and only exits from the ignore loop if it has found the - same count of }. - - Example: - - Ignore { - blabla { - { blub } - { } } - } - -Item - - The parser expects an item type/control name next, eg. Rect or Window and afterwards the name - of the item that should be defined. Next expects a { and then a number of key value pairs that - define the entity or one of the other keywords. You can nest everything in everything - diff --git a/attic/TeamNexuiz/menuqc/fteqccgui.exe b/attic/TeamNexuiz/menuqc/fteqccgui.exe deleted file mode 100644 index 9bace9fcd48128fcb61f3a28c22a6d89dbd44d7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233472 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≶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 diff --git a/attic/TeamNexuiz/menuqc/mbuiltin.qc b/attic/TeamNexuiz/menuqc/mbuiltin.qc deleted file mode 100644 index b1dc3bafa..000000000 --- a/attic/TeamNexuiz/menuqc/mbuiltin.qc +++ /dev/null @@ -1,250 +0,0 @@ -////////////////////////////////////////////////// -// common cmd -////////////////////////////////////////////////// -// AK FIXME: Create perhaps a special builtin file for the common cmds - -//#define PROFILESTRZONE -#define FIXEDFOPEN - -void checkextension(string ext) = #1; - -// error cmds -void error(string err,...) = #2; -void objerror(string err,...) = #3; - -// print - -void print(string text,...) = #4; -void bprint(string text,...) = #5; -void sprint(float clientnum, string text,...) = #6; -void centerprint(string text,...) = #7; - -// vector stuff - -vector normalize(vector v) = #8; -float vlen(vector v) = #9; -float vectoyaw(vector v) = #10; -vector vectoangles(vector v) = #11; - -float random(void) = #12; - -void cmd(string command) = #13; - -// cvar cmds - -float cvar(string name) = #14; -const string cvar_string(string name) = #71; -const string cvar_defstring(string name) = #89; -void cvar_set(string name, string value) = #15; - -void dprint(string text,...) = #16; - -// conversion functions - -string ftos(float f) = #17; -float fabs(float f) = #18; -string vtos(vector v) = #19; -string etos(entity e) = #20; - -float stof(string val,...) = #21; - -entity spawn(void) = #22; -void remove(entity e) = #23; - -entity findstring(entity start, .string _field, string match) = #24; -entity findfloat(entity start, .float _field, float match) = #25; -entity findentity(entity start, .entity _field, entity match) = #25; - -entity findchainstring(.string _field, string match) = #26; -entity findchainfloat(.float _field, float match) = #27; -entity findchainentity(.entity _field, entity match) = #27; - -entity findflags(entity start, .float field, float match) = #87; -entity findchainflags(.float field, float match) = #88; - -string precache_file(string file) = #28; -string precache_sound(string sample) = #29; - -void crash(void) = #72; -void coredump(void) = #30; -void stackdump(void) = #73; -void traceon(void) = #31; -void traceoff(void) = #32; - -void eprint(entity e) = #33; -float rint(float f) = #34; -float floor(float f) = #35; -float ceil(float f) = #36; -entity nextent(entity e) = #37; -float sin(float f) = #38; -float cos(float f) = #39; -float sqrt(float f) = #40; -vector randomvec(void) = #41; - -float registercvar(string name, string value, float flags) = #42; // returns 1 if success -float min(float f,...) = #43; -float max(float f,...) = #44; -float bound(float min,float value, float max) = #45; -float pow(float a, float b) = #46; -void copyentity(entity src, entity dst) = #47; - -#ifdef FIXEDFOPEN -float _fopen( string filename, float mode ) = #48; -#else -float fopen(string filename, float mode) = #48; -#endif -void fclose(float fhandle) = #49; -string fgets(float fhandle) = #50; -void fputs(float fhandle, string s) = #51; - -float strlen(string s) = #52; -//string strcat(string s1,string s2,...) = #53; -string strcat(string s1, ...) = #53; -string substring(string s, float start, float length) = #54; - -vector stov(string s) = #55; - -#ifdef PROFILESTRZONE -string _strzone(string s) = #56; -void _strunzone(string s) = #57; - -string( string s ) strzone = -{ - return _strzone( s ); -}; - -void( string s ) strunzone = -{ - return _strunzone( s ); -}; -#else -string strzone(string s) = #56; -void strunzone(string s) = #57; -#endif - -float tokenize(string s) = #58 -string argv(float n) = #59; - -float isserver(void) = #60; -float clientcount(void) = #61; -float clientstate(void) = #62; -void clientcommand(float client, string s) = #63; -void changelevel(string map) = #64; -void localsound(string sample) = #65; -vector getmousepos(void) = #66; -float gettime(void) = #67; -void loadfromdata(string data) = #68; -void loadfromfile(string file) = #69; - -float mod(float val, float m) = #70; - -float search_begin(string pattern, float caseinsensitive, float quiet) = #74; -void search_end(float handle) = #75; -float search_getsize(float handle) = #76; -string search_getfilename(float handle, float num) = #77; - -string chr(float ascii) = #78; - -float etof(entity ent) = #79; -entity ftoe(float num) = #80; - -float validstring(string str) = #81; - -float altstr_count(string str) = #82; -string altstr_prepare(string str) = #83; -string altstr_get(string str, float num) = #84; -string altstr_set(string str, float num, string set) = #85; -string altstr_ins(string str, float num, string set) = #86; - -///////////////////////////////////////////////// -// Write* Functions -///////////////////////////////////////////////// -void WriteByte(float data, float dest, float desto) = #401; -void WriteChar(float data, float dest, float desto) = #402; -void WriteShort(float data, float dest, float desto) = #403; -void WriteLong(float data, float dest, float desto) = #404; -void WriteAngle(float data, float dest, float desto) = #405; -void WriteCoord(float data, float dest, float desto) = #406; -void WriteString(string data, float dest, float desto)= #407; -void WriteEntity(entity data, float dest, float desto) = #408; - -////////////////////////////////////////////////// -// Draw funtions -////////////////////////////////////////////////// - -float iscachedpic(string name) = #451; -string precache_pic(string name) = #452; -void freepic(string name) = #453; - -float drawcharacter(vector position, float character, vector scale, vector rgb, float alpha, float flag) = #454; - -float drawstring(vector position, string text, vector scale, vector rgb, float alpha, float flag) = #455; - -float drawpic(vector position, string pic, vector size, vector rgb, float alpha, float flag) = #456; - -float drawfill(vector position, vector size, vector rgb, float alpha, float flag) = #457; - -void drawsetcliparea(float x, float y, float width, float height) = #458; - -void drawresetcliparea(void) = #459; - -vector drawgetimagesize(string pic) = #460; - -float cin_open(string file, string name) = #461; -void cin_close(string name) = #462; -void cin_setstate(string name, float type) = #463; -float cin_getstate(string name) = #464; - -//////////////////////////////////////////////// -// Menu functions -//////////////////////////////////////////////// - -void setkeydest(float dest) = #601; -float getkeydest(void) = #602; - -void setmousetarget(float trg) = #603; -float getmousetarget(void) = #604; - -float isfunction(string function_name) = #607; -void callfunction(...) = #605; -void writetofile(float fhandle, entity ent) = #606; -vector getresolution(float number) = #608; -string keynumtostring(float keynum) = #609; -string findkeysforcommand(string command) = #610; - -float gethostcachevalue(float type) = #611; -string gethostcachestring(float type, float hostnr) = #612; - -void parseentitydata(entity ent, string data) = #613; - -float stringtokeynum(string key) = #614; - -void resethostcachemasks(void) = #615; -void sethostcachemaskstring(float mask, float fld, string str, float op) = #616; -void sethostcachemasknumber(float mask, float fld, float num, float op) = #617; -void resorthostcache(void) = #618; -void sethostcachesort(float fld, float descending) = #619; -void refreshhostcache(void) = #620; -float gethostcachenumber(float fld, float hostnr) = #621; -float gethostcacheindexforkey(string key) = #622; -void addwantedhostcachekey(string key) = #623; - -#ifdef FIXEDFOPEN -float fopen( string filename, float mode ) = -{ - local float handle; - if( mode == FILE_READ ) { - return _fopen( filename, mode ); - } - - // check for data/ - filename = strzone( filename ); - if( substring( filename, 0, 5 ) != "data/" ) { - print( "menu: fopen: all output must go into data/!\n" ); - return -1; - } - handle = _fopen( substring( filename, 5, 10000 ), mode ); - strunzone( filename ); - return handle; -}; -#endif diff --git a/attic/TeamNexuiz/menuqc/menu.qc b/attic/TeamNexuiz/menuqc/menu.qc deleted file mode 100644 index c753030fa..000000000 --- a/attic/TeamNexuiz/menuqc/menu.qc +++ /dev/null @@ -1,151 +0,0 @@ -/////////////////////////////////////////////// -// Menu Source File -/////////////////////// -// This file belongs to dpmod/darkplaces -// AK contains all menu functions (especially the required ones) -/////////////////////////////////////////////// - -void() m_updategamestate = -{ - // update isserver and clientstate - gamestatus = 0; - if( isserver() ) - gamestatus = gamestatus | GAME_ISSERVER; - if( clientstate() == CS_CONNECTED ) - gamestatus = gamestatus | GAME_CONNECTED; - if( cvar("developer") ) - gamestatus = gamestatus | GAME_DEVELOPER; -}; - -void() m_init = -{ - // init graphic - Gfx_Init(); - - // init cursor - Cursor_Init(); - - Key_Init(); - - HostCache_Init(); - - // init menu - Menu_Init(); -}; - -// required menu functions -void( float pKey, float pAscii ) m_keydown = -{ - if( !Menu_Active ) - return; - - // actually the menu is the only system that needs to react on key events - Menu_Key( pKey, pAscii ); -}; - -void() m_frame = -{ - Timer_Update(); - - HostCache_Update(); - - Key_Update(); - - // graphic frame - Gfx_Update(); - - // cursor frame - Cursor_Update(); - - // menu frame - Menu_Frame(); -}; - -void() m_draw = -{ - m_updategamestate(); - - - if( !Menu_Active ) { - // test whether we want to force it to be displayed - if( !(gamestatus & GAME_CONNECTED) && !(gamestatus & GAME_DEVELOPER) && cvar_string( "menu_directmenu" ) != "" ) { - m_display(); - } - else { - return; - } - } - - // call m_frame cause draw is the only menu function called once per frame - m_frame(); - - // now the drawing code - Menu_Draw(); - - // draw the cursor on top of the menu - Cursor_Draw(); - - // and now the gfx drawing code (for special fx) - Gfx_Draw(); -}; - -void() m_display = -{ - Menu_Active = true; - - m_updategamestate(); - - // let also the snd and gfx know (perhaps for sfx) - Gfx_Display(); - Cursor_Display(); - Key_Display(); - - // let the menu manager know - Menu_PerformReinit(); -}; - -void() m_hide = -{ - Gfx_Hide(); - Cursor_Hide(); - Key_Hide(); - - // let the menu manager know - Menu_Hide(); - - Menu_Active = false; -}; - -void() m_toggle = -{ - Timer_Update(); - - if( Menu_Active ) - m_hide(); - else - m_display(); -}; - -void() m_shutdown = -{ - Timer_Update(); - - // shutdown menu - Menu_Shutdown(); - - // shutdown timer - Timer_Quit(); - - // shutdown key system - Key_Quit(); - - // shutdown cursor - Cursor_Quit(); - - // shutdown graphic - Gfx_Quit(); - - // make sure everything is reset - setkeydest( KEY_GAME ); - setmousetarget( MT_CLIENT ); -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/menuqc/menu.qh b/attic/TeamNexuiz/menuqc/menu.qh deleted file mode 100644 index 8be912770..000000000 --- a/attic/TeamNexuiz/menuqc/menu.qh +++ /dev/null @@ -1,35 +0,0 @@ -/////////////////////////////////////////////// -// Menu Header File -/////////////////////// -// This file belongs to dpmod/darkplaces -// AK contains all common constants, etc. -/////////////////////////////////////////////// -// constants - -const float GAME_ISSERVER = 1; -const float GAME_CONNECTED = 2; -const float GAME_DEVELOPER = 4; - -const float INFINITY = 10000000.0; - -// prototypes - -typedef float bool; - -// global vars - -//float time; // important for animations, etc. -bool Menu_Active; // is set when the menu is active - -// updated every time toggle is called -float gamestatus; - -//#define USEFUNCTIONS -//#define UTILALTSTRING - -#define AVOIDSTRZONES - -// get rid of __NULL__ sets again! - -#pragma keyword enable ifstring -#pragma keyword enable lo diff --git a/attic/TeamNexuiz/menuqc/menu1.qc b/attic/TeamNexuiz/menuqc/menu1.qc deleted file mode 100644 index f0c92fe6e..000000000 --- a/attic/TeamNexuiz/menuqc/menu1.qc +++ /dev/null @@ -1,151 +0,0 @@ -/////////////////////////////////////////////// -// Menu Source File -/////////////////////// -// This file belongs to dpmod/darkplaces -// AK contains all menu functions (especially the required ones) -/////////////////////////////////////////////// - -void() m_updategamestate = -{ - // update isserver and clientstate - gamestatus = 0; - if( isserver() ) - gamestatus = gamestatus | GAME_ISSERVER; - if( clientstate() == CS_CONNECTED ) - gamestatus = gamestatus | GAME_CONNECTED; - if( cvar("developer") ) - gamestatus = gamestatus | GAME_DEVELOPER; -}; - -void() m_init = -{ - // init graphic - Gfx_Init(); - - // init cursor - Cursor_Init(); - - Key_Init(); - - HostCache_Init(); - - // init menu - Menu_Init(); -}; - -// required menu functions -void( float pKey, float pAscii ) m_keydown = -{ - if( !Menu_Active ) - return; - - // actually the menu is the only system that needs to react on key events - Menu_Key( pKey, pAscii ); -}; - -void() m_frame = -{ - Timer_Update(); - - HostCache_Update(); - - Key_Update(); - - // graphic frame - Gfx_Update(); - - // cursor frame - Cursor_Update(); - - // menu frame - Menu_Frame(); -}; - -void() m_draw = -{ - m_updategamestate(); - - - if( !Menu_Active ) { - // test whether we want to force it to be displayed - if( !(gamestatus & GAME_CONNECTED) && !(gamestatus & GAME_DEVELOPER) ) { - m_display(); - } - else { - return; - } - } - - // call m_frame cause draw is the only menu function called once per frame - m_frame(); - - // now the drawing code - Menu_Draw(); - - // draw the cursor on top of the menu - Cursor_Draw(); - - // and now the gfx drawing code (for special fx) - Gfx_Draw(); -}; - -void() m_display = -{ - Menu_Active = true; - - m_updategamestate(); - - // let also the snd and gfx know (perhaps for sfx) - Gfx_Display(); - Cursor_Display(); - Key_Display(); - - // let the menu manager know - Menu_PerformReinit(); -}; - -void() m_hide = -{ - Gfx_Hide(); - Cursor_Hide(); - Key_Hide(); - - // let the menu manager know - Menu_Hide(); - - Menu_Active = false; -}; - -void() m_toggle = -{ - Timer_Update(); - - if( Menu_Active ) - m_hide(); - else - m_display(); -}; - -void() m_shutdown = -{ - Timer_Update(); - - // shutdown menu - Menu_Shutdown(); - - // shutdown timer - Timer_Quit(); - - // shutdown key system - Key_Quit(); - - // shutdown cursor - Cursor_Quit(); - - // shutdown graphic - Gfx_Quit(); - - // make sure everything is reset - setkeydest( KEY_GAME ); - setmousetarget( MT_CLIENT ); -}; \ No newline at end of file diff --git a/attic/TeamNexuiz/menuqc/msys.qc b/attic/TeamNexuiz/menuqc/msys.qc deleted file mode 100644 index 0b4853d2a..000000000 --- a/attic/TeamNexuiz/menuqc/msys.qc +++ /dev/null @@ -1,278 +0,0 @@ -////////////////////////////////////////////////////////// -// sys globals - -entity self; - -///////////////////////////////////////////////////////// -void end_sys_globals; -///////////////////////////////////////////////////////// -// sys fields - -///////////////////////////////////////////////////////// -void end_sys_fields; -///////////////////////////////////////////////////////// -// sys functions - -void() m_init; -void(float keynr, float ascii) m_keydown; -void() m_draw; -void() m_display; // old NG Menu -void() m_toggle; -void() m_hide; // old NG Menu -void() m_shutdown; - -///////////////////////////////////////////////////////// -// sys constants -/////////////////////////// -// key constants - -// -// these are the key numbers that should be passed to Key_Event -// -float K_TAB = 9; -float K_ENTER = 13; -float K_ESCAPE = 27; -float K_SPACE = 32; - -// normal keys should be passed as lowercased ascii - -float K_BACKSPACE = 127; -float K_UPARROW = 128; -float K_DOWNARROW = 129; -float K_LEFTARROW = 130; -float K_RIGHTARROW = 131; - -float K_ALT = 132; -float K_CTRL = 133; -float K_SHIFT = 134; -float K_F1 = 135; -float K_F2 = 136; -float K_F3 = 137; -float K_F4 = 138; -float K_F5 = 139; -float K_F6 = 140; -float K_F7 = 141; -float K_F8 = 142; -float K_F9 = 143; -float K_F10 = 144; -float K_F11 = 145; -float K_F12 = 146; -float K_INS = 147; -float K_DEL = 148; -float K_PGDN = 149; -float K_PGUP = 150; -float K_HOME = 151; -float K_END = 152; - -float K_KP_HOME = 160; -float K_KP_UPARROW = 161; -float K_KP_PGUP = 162; -float K_KP_LEFTARROW = 163; -float K_KP_5 = 164; -float K_KP_RIGHTARROW = 165; -float K_KP_END = 166; -float K_KP_DOWNARROW = 167; -float K_KP_PGDN = 168; -float K_KP_ENTER = 169; -float K_KP_INS = 170; -float K_KP_DEL = 171; -float K_KP_SLASH = 172; -float K_KP_MINUS = 173; -float K_KP_PLUS = 174; - -float K_PAUSE = 255; - -// -// joystick buttons -// -float K_JOY1 = 768; -float K_JOY2 = 769; -float K_JOY3 = 770; -float K_JOY4 = 771; - -// -// aux keys are for multi-buttoned joysticks to generate so they can use -// the normal binding process -// -float K_AUX1 = 772; -float K_AUX2 = 773; -float K_AUX3 = 774; -float K_AUX4 = 775; -float K_AUX5 = 776; -float K_AUX6 = 777; -float K_AUX7 = 778; -float K_AUX8 = 779; -float K_AUX9 = 780; -float K_AUX10 = 781; -float K_AUX11 = 782; -float K_AUX12 = 783; -float K_AUX13 = 784; -float K_AUX14 = 785; -float K_AUX15 = 786; -float K_AUX16 = 787; -float K_AUX17 = 788; -float K_AUX18 = 789; -float K_AUX19 = 790; -float K_AUX20 = 791; -float K_AUX21 = 792; -float K_AUX22 = 793; -float K_AUX23 = 794; -float K_AUX24 = 795; -float K_AUX25 = 796; -float K_AUX26 = 797; -float K_AUX27 = 798; -float K_AUX28 = 799; -float K_AUX29 = 800; -float K_AUX30 = 801; -float K_AUX31 = 802; -float K_AUX32 = 803; - -// -// mouse buttons generate virtual keys -// -float K_MOUSE1 = 512; -float K_MOUSE2 = 513; -float K_MOUSE3 = 514; -float K_MOUSE4 = 515; -float K_MOUSE5 = 516; -float K_MOUSE6 = 517; -float K_MOUSE7 = 518; -float K_MOUSE8 = 519; -float K_MOUSE9 = 520; -float K_MOUSE10 = 521; - -float K_MWHEELDOWN = K_MOUSE4; -float K_MWHEELUP = K_MOUSE5; - -/////////////////////////// -// key dest constants - -float KEY_GAME = 0; -float KEY_MENU = 2; -float KEY_UNKNOWN = 3; - -/////////////////////////// -// file constants - -float FILE_READ = 0; -float FILE_APPEND = 1; -float FILE_WRITE = 2; - -/////////////////////////// -// logical constants (just for completeness) - -float TRUE = 1; -float FALSE = 0; - -/////////////////////////// -// boolean constants - -float true = 1; -float false = 0; - -/////////////////////////// -// msg constants - -float MSG_BROADCAST = 0; // unreliable to all -float MSG_ONE = 1; // reliable to one (msg_entity) -float MSG_ALL = 2; // reliable to all -float MSG_INIT = 3; // write to the init string - -///////////////////////////// -// mouse target constants - -float MT_MENU = 1; -float MT_CLIENT = 2; - -///////////////////////// -// client state constants - -float CS_DEDICATED = 0; -float CS_DISCONNECTED = 1; -float CS_CONNECTED = 2; - -/////////////////////////// -// blend flags - -float DRAWFLAG_NORMAL = 0; -float DRAWFLAG_ADDITIVE = 1; -float DRAWFLAG_MODULATE = 2; -float DRAWFLAG_2XMODULATE = 3; - - -/////////////////////////// -// cvar constants - -float CVAR_SAVE = 1; -float CVAR_NOTIFY = 2; -float CVAR_READONLY = 4; - -/////////////////////////// -// server list constants - -float SLIST_HOSTCACHEVIEWCOUNT = 0; -float SLIST_HOSTCACHETOTALCOUNT = 1; -float SLIST_MASTERQUERYCOUNT = 2; -float SLIST_MASTERREPLYCOUNT = 3; -float SLIST_SERVERQUERYCOUNT = 4; -float SLIST_SERVERREPLYCOUNT = 5; -float SLIST_SORTFIELD = 6; -float SLIST_SORTDESCENDING = 7; - -float SLIST_LEGACY_LINE1 = 1024; -float SLIST_LEGACY_LINE2 = 1025; - -float SLIST_TEST_CONTAINS = 0; -float SLIST_TEST_NOTCONTAIN = 1; -float SLIST_TEST_LESSEQUAL = 2; -float SLIST_TEST_LESS = 3; -float SLIST_TEST_EQUAL = 4; -float SLIST_TEST_GREATER = 5; -float SLIST_TEST_GREATEREQUAL = 6; -float SLIST_TEST_NOTEQUAL = 7; - -float SLIST_MASK_AND = 0; -float SLIST_MASK_OR = 512; - -float NET_CURRENTPROTOCOL = 3; - -//////////////////////////////// -// cinematic action constants - -float CINE_PLAY = 1; -float CINE_LOOP = 2; -float CINE_PAUSE = 3; -float CINE_FIRSTFRAME = 4; -float CINE_RESETONWAKEUP= 5; - -/////////////////////////// -// null entity (actually it is the same like the world entity) - -entity null_entity; - -/////////////////////////// -// error constants - -// file handling -float ERR_CANNOTOPEN = -1; // fopen -float ERR_NOTENOUGHFILEHANDLES = -2; // fopen -float ERR_INVALIDMODE = -3; // fopen -float ERR_BADFILENAME = -4; // fopen - -// drawing functions - -float ERR_NULLSTRING = -1; -float ERR_BADDRAWFLAG = -2; -float ERR_BADSCALE = -3; -float ERR_BADSIZE = ERR_BADSCALE; -float ERR_NOTCACHED = -4; - -/* not supported at the moment -/////////////////////////// -// os constants - -float OS_WINDOWS = 0; -float OS_LINUX = 1; -float OS_MAC = 2; -*/ - diff --git a/attic/TeamNexuiz/menuqc/progdefs.h b/attic/TeamNexuiz/menuqc/progdefs.h deleted file mode 100644 index 3f3064cc3..000000000 --- a/attic/TeamNexuiz/menuqc/progdefs.h +++ /dev/null @@ -1,13 +0,0 @@ - -/* file generated by qcc, do not modify */ - -typedef struct -{ int pad[28]; - int self; -} globalvars_t; - -typedef struct -{ -} entvars_t; - -#define PROGHEADER_CRC 10020 diff --git a/attic/TeamNexuiz/menuqc/progs.src b/attic/TeamNexuiz/menuqc/progs.src deleted file mode 100644 index 30f202999..000000000 --- a/attic/TeamNexuiz/menuqc/progs.src +++ /dev/null @@ -1,180 +0,0 @@ -/////////////////////////////////////////////// -// Progs file -/////////////////////// -// This file belongs to dpmod/darkplaces -// AK contains all file names which should be included into menu.dat -// this is absolutly beta -/////////////////////////////////////////////// -// menu.dat destination path -../../menu.dat - -// these are the default qc header files -msys.qc -mbuiltin.qc - -//////////////////////////// -// dpmod-specific menu files -/// - -// Header Files - -menu.qh - -// util functions -util/util.qh -util/altstring.qh -util/rect.qh -util/string.qh -util/text.qh -util/uid.qh -util/property.qh - -// base system -base/timer.qh -base/gfx.qh -base/snd.qh -base/cursor.qh -base/key.qh -base/hostcache.qh - -// main system -system/parser.qh -system/debug.qh -system/isframe.qh -system/mgfx.qh -system/item.qh -system/structure.qh -system/events.qh -system/history.qh -system/gc.qh - -// controls -control/items.qh -control/constants.qh -control/data/data.qh -control/window/windows.qh -control/visual/visual.qh -control/automation/automation.qh -//control/fx/fx.qh - -// custom (game specific) -custom/custom.qh -custom/player/player.qh -custom/creategame/creategame.qh -custom/joingame.qh -custom/key.qh -custom/video.qh -custom/credits.qh -custom/messagebox.qh - -// Source Files - -// custom (game specific) -custom/quit.qm -custom/option.qm -custom/globalkey.qm -custom/stresstest.qm -custom/visible.qm -custom/color.qm -custom/player.qm -custom/util.qm -custom/creategame.qm -custom/key.qm -custom/video.qm -custom/joingame.qm -custom/credits.qm - -custom/player/avatar.qc -custom/player/name.qc -custom/player/color.qc - -custom/creategame/maps.qc -custom/creategame/mods.qc -custom/creategame/filelist.qc - -custom/visible.qc -custom/key.qc -custom/video.qc -custom/joingame.qc -custom/credits.qc -custom/messagebox.qc - -// controls -control/automation/automation.qc -control/automation/foreach.qc -control/automation/job.qc - -control/data/base.qc -control/data/container.qc -control/data/cvar.qc -control/data/text.qc -control/data/value.qc -control/data/textswitch.qc -control/data/valueswitch.qc -control/data/fastresync.qc -control/data/textvalue.qc -control/data/texttime.qc -control/data/altstring.qc -control/data/router.qc - -control/window/window.qc -control/window/reference.qc -control/window/layout.qc -control/window/arrangement.qc -control/window/scroll.qc -control/window/eventwindow.qc -control/window/frame.qc - -control/visual/list.qc -control/visual/button.qc -control/visual/editbox.qc -control/visual/label.qc -control/visual/multilabel.qc -control/visual/picture.qc -control/visual/rect.qc -control/visual/slider.qc -control/visual/valuebutton.qc -control/visual/floating.qc -control/visual/switchbutton.qc -control/visual/scrollbar.qc - -//control/fx/vector.qc -//control/fx/float.qc -//control/fx/interpol.qc - -control/cinematic.qc -control/container.qc -control/custom.qc -control/link.qc - -// main system -system/history.qc -system/events.qc -//system/events_.qc -system/event_helper.qc -system/structure.qc -system/mgfx.qc -system/isframe.qc -system/debug.qc -system/parser.qc -system/gc.qc - -// base systems -base/key.qc -base/cursor.qc -base/snd.qc -base/gfx.qc -base/timer.qc -base/hostcache.qc - -// util functions -util/property.qc -util/text.qc -util/uid.qc -util/string.qc -util/rect.qc -util/altstring.qc -util/nfunction.qc - -menu.qc - diff --git a/attic/TeamNexuiz/menuqc/qc.asm b/attic/TeamNexuiz/menuqc/qc.asm deleted file mode 100644 index 2953bdf84..000000000 --- a/attic/TeamNexuiz/menuqc/qc.asm +++ /dev/null @@ -1,17163 +0,0 @@ -entity self; -void end_sys_globals; -void end_sys_fields; -void () m_init; -void (float, float) m_keydown; -void () m_draw; -void () m_display; -void () m_toggle; -void () m_hide; -void () m_shutdown; -float K_TAB; -float K_ENTER; -float K_ESCAPE; -float K_SPACE; -float K_BACKSPACE; -float K_UPARROW; -float K_DOWNARROW; -float K_LEFTARROW; -float K_RIGHTARROW; -float K_ALT; -float K_CTRL; -float K_SHIFT; -float K_F1; -float K_F2; -float K_F3; -float K_F4; -float K_F5; -float K_F6; -float K_F7; -float K_F8; -float K_F9; -float K_F10; -float K_F11; -float K_F12; -float K_INS; -float K_DEL; -float K_PGDN; -float K_PGUP; -float K_HOME; -float K_END; -float K_KP_HOME; -float K_KP_UPARROW; -float K_KP_PGUP; -float K_KP_LEFTARROW; -float K_KP_5; -float K_KP_RIGHTARROW; -float K_KP_END; -float K_KP_DOWNARROW; -float K_KP_PGDN; -float K_KP_ENTER; -float K_KP_INS; -float K_KP_DEL; -float K_KP_SLASH; -float K_KP_MINUS; -float K_KP_PLUS; -float K_PAUSE; -float K_JOY1; -float K_JOY2; -float K_JOY3; -float K_JOY4; -float K_AUX1; -float K_AUX2; -float K_AUX3; -float K_AUX4; -float K_AUX5; -float K_AUX6; -float K_AUX7; -float K_AUX8; -float K_AUX9; -float K_AUX10; -float K_AUX11; -float K_AUX12; -float K_AUX13; -float K_AUX14; -float K_AUX15; -float K_AUX16; -float K_AUX17; -float K_AUX18; -float K_AUX19; -float K_AUX20; -float K_AUX21; -float K_AUX22; -float K_AUX23; -float K_AUX24; -float K_AUX25; -float K_AUX26; -float K_AUX27; -float K_AUX28; -float K_AUX29; -float K_AUX30; -float K_AUX31; -float K_AUX32; -float K_MOUSE1; -float K_MOUSE2; -float K_MOUSE3; -float K_MOUSE4; -float K_MOUSE5; -float K_MOUSE6; -float K_MOUSE7; -float K_MOUSE8; -float K_MOUSE9; -float K_MOUSE10; -float K_MWHEELDOWN; -float K_MWHEELUP; -float KEY_GAME; -float KEY_MENU; -float KEY_UNKNOWN; -float FILE_READ; -float FILE_APPEND; -float FILE_WRITE; -float TRUE; -float FALSE; -float true; -float false; -float MSG_BROADCAST; -float MSG_ONE; -float MSG_ALL; -float MSG_INIT; -float MT_MENU; -float MT_CLIENT; -float CS_DEDICATED; -float CS_DISCONNECTED; -float CS_CONNECTED; -float DRAWFLAG_NORMAL; -float DRAWFLAG_ADDITIVE; -float DRAWFLAG_MODULATE; -float DRAWFLAG_2XMODULATE; -float CVAR_SAVE; -float CVAR_NOTIFY; -float CVAR_READONLY; -float SLIST_HOSTCACHEVIEWCOUNT; -float SLIST_HOSTCACHETOTALCOUNT; -float SLIST_MASTERQUERYCOUNT; -float SLIST_MASTERREPLYCOUNT; -float SLIST_SERVERQUERYCOUNT; -float SLIST_SERVERREPLYCOUNT; -float SLIST_SORTFIELD; -float SLIST_SORTDESCENDING; -float SLIST_LEGACY_LINE1; -float SLIST_LEGACY_LINE2; -float SLIST_TEST_CONTAINS; -float SLIST_TEST_NOTCONTAIN; -float SLIST_TEST_LESSEQUAL; -float SLIST_TEST_LESS; -float SLIST_TEST_EQUAL; -float SLIST_TEST_GREATER; -float SLIST_TEST_GREATEREQUAL; -float SLIST_TEST_NOTEQUAL; -float SLIST_MASK_AND; -float SLIST_MASK_OR; -float NET_CURRENTPROTOCOL; -float CINE_PLAY; -float CINE_LOOP; -float CINE_PAUSE; -float CINE_FIRSTFRAME; -float CINE_RESETONWAKEUP; -entity null_entity; -float ERR_CANNOTOPEN; -float ERR_NOTENOUGHFILEHANDLES; -float ERR_INVALIDMODE; -float ERR_BADFILENAME; -float ERR_NULLSTRING; -float ERR_BADDRAWFLAG; -float ERR_BADSCALE; -float ERR_BADSIZE; -float ERR_NOTCACHED; -void (string) checkextension; -void (string) error; -void (string) objerror; -void (string) print; -void (string) bprint; -void (float, string) sprint; -void (string) centerprint; -vector (vector) normalize; -float (vector) vlen; -float (vector) vectoyaw; -vector (vector) vectoangles; -float () random; -void (string) cmd; -float (string) cvar; -string (string) str_cvar; -void (string, string) cvar_set; -void (string) dprint; -string (float) ftos; -float (float) fabs; -string (vector) vtos; -string (entity) etos; -float (string) stof; -entity () spawn; -void (entity) remove; -entity (entity, FIELD TYPE, string) findstring; -entity (entity, FIELD TYPE, float) findfloat; -entity (entity, FIELD TYPE, entity) findentity; -entity (FIELD TYPE, string) findchainstring; -entity (FIELD TYPE, float) findchainfloat; -entity (FIELD TYPE, entity) findchainentity; -string (string) precache_file; -string (string) precache_sound; -void () crash; -void () coredump; -void () stackdump; -void () traceon; -void () traceoff; -void (entity) eprint; -float (float) rint; -float (float) floor; -float (float) ceil; -entity (entity) nextent; -float (float) sin; -float (float) cos; -float (float) sqrt; -vector () randomvec; -float (string, string, float) registercvar; -float (float) min; -float (float) max; -float (float, float, float) bound; -float (float, float) pow; -void (entity, entity) copyentity; -float (string, float) _fopen; -void (float) fclose; -string (float) fgets; -void (float, string) fputs; -float (string) strlen; -string (string) strcat; -string (string, float, float) substring; -vector (string) stov; -string (string) strzone; -void (string) strunzone; -float (string) tokenize; -string (float) argv; -float () isserver; -float () clientcount; -float () clientstate; -void (float, string) clientcommand; -void (string) changelevel; -void (string) localsound; -vector () getmousepos; -float () gettime; -void (string) loadfromdata; -void (string) loadfromfile; -float (float, float) mod; -float (string, float, float) search_begin; -void (float) search_end; -float (float) search_getsize; -string (float, float) search_getfilename; -string (float) chr; -float (entity) etof; -entity (float) ftoe; -float (string) validstring; -float (string) altstr_count; -string (string) altstr_prepare; -string (string, float) altstr_get; -string (string, float, string) altstr_set; -string (string, float, string) altstr_ins; -void (float, float, float) WriteByte; -void (float, float, float) WriteChar; -void (float, float, float) WriteShort; -void (float, float, float) WriteLong; -void (float, float, float) WriteAngle; -void (float, float, float) WriteCoord; -void (string, float, float) WriteString; -void (entity, float, float) WriteEntity; -float (string) iscachedpic; -string (string) precache_pic; -void (string) freepic; -float (vector, float, vector, vector, float, float) drawcharacter; -float (vector, string, vector, vector, float, float) drawstring; -float (vector, string, vector, vector, float, float) drawpic; -float (vector, vector, vector, float, float) drawfill; -void (float, float, float, float) drawsetcliparea; -void () drawresetcliparea; -vector (string) drawgetimagesize; -float (string, string) cin_open; -void (string) cin_close; -void (string, float) cin_setstate; -float (string) cin_getstate; -void (float) setkeydest; -float () getkeydest; -void (float) setmousetarget; -float () getmousetarget; -float (string) isfunction; -void () callfunction; -void (float, entity) writetofile; -vector (float) getresolution; -string (float) keynumtostring; -string (string) findkeysforcommand; -float (float) gethostcachevalue; -string (float, float) gethostcachestring; -void (entity, string) parseentitydata; -float (string) stringtokeynum; -void () resethostcachemasks; -void (float, float, string, float) sethostcachemaskstring; -void (float, float, float, float) sethostcachemasknumber; -void () resorthostcache; -void (float, float) sethostcachesort; -void () refreshhostcache; -float (float, float) gethostcachenumber; -float (string) gethostcacheindexforkey; -void (string) addwantedhostcachekey; -float (string, float) fopen; -float(string filename, float mode) fopen = asm -{ -local float handle; -local float temp_0; - EQ_F mode, KEY_GAME, temp_0; - IFNOT temp_0, 5; - STORE_F filename, parm0_x; - STORE_F mode, parm1_x; - CALL2 _fopen; - RETURN return_x; - STORE_F filename, parm0_x; - CALL1 strzone; - STORE_S return_x, filename; - STORE_F filename, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F SLIST_SERVERREPLYCOUNT, parm2_x; - CALL3 substring; - NE_S return_x, "data/", temp_0; - IFNOT temp_0, 4; - STORE_F "menu: fopen: all output must go into data/! -", parm0_x; - CALL1 print; - RETURN ERR_CANNOTOPEN; - STORE_F filename, parm0_x; - STORE_F SLIST_SERVERREPLYCOUNT, parm1_x; - STORE_F 10000.000000, parm2_x; - CALL3 substring; - STORE_F return_x, parm0_x; - STORE_F mode, parm1_x; - CALL2 _fopen; - STORE_F return_x, handle; - STORE_F filename, parm0_x; - CALL1 strunzone; - RETURN handle; - DONE; -} - -float GAME_ISSERVER; -float GAME_CONNECTED; -float GAME_DEVELOPER; -float INFINITY; -bool Menu_Active; -float gamestatus; -void () Util_NullFunction; -float () Util_TrueFunction; -float () Util_FalseFunction; -string () Util_StringFuntion; -vector () Util_VectorFunction; -entity () Util_EntityFunction; -float (string) Util_GetAltStringCount; -string (string, float) Util_GetAltStringItem; -string (string, float, string) Util_SetAltStringItem; -string (string, float) Util_DelAltStringItem; -string (string, float, string) Util_InsAltStringItem; -string (string) Util_AltStringPrepare; -string (string, string) Util_AltStringPush; -string (string, string) Util_AltStringPushBack; -string (string) Util_GetAltStringTop; -string (string) Util_AltStringPop; -bool (vector, vector, vector) Util_InRect; -vector (vector, vector, vector) Util_GetClipDelta; -vector (vector, vector, vector, vector) Util_ClipRect; -bool (vector, vector, vector, vector) Util_RectInRect; -string (string) Util_ClipStack_Reset; -string (string, vector, vector) Util_ClipStack_Push; -string (string) Util_ClipStack_Pop; -vector (string) Util_ClipStack_GetPosition; -vector (string) Util_ClipStack_GetSize; -string (string) Util_OriginStack_Reset; -string (string, vector) Util_OriginStack_Push; -string (string) Util_OriginStack_Pop; -vector (string) Util_OriginStack_Get; -string () String_Create; -string (string) String_Zone; -string (string) String_Normal; -string (string, string) String_Set; -string (string) String_Free; -string (string, string) String_Append; -string (string, float, float) String_Substring; -void (entity, FIELD TYPE) String_EntityCreate; -void (entity, FIELD TYPE) String_EntityZone; -void (entity, FIELD TYPE, string) String_EntitySet; -void (entity, FIELD TYPE) String_EntityFree; -vector (string, vector) Util_GetEndOfLine; -vector (string, vector, float) Util_GetEndOfWrappedLine; -string () Util_CreateUID; -string (float) Util_GetUIDName; -float (string) Util_GetUIDNum; -string () Property_Create; -string (string) Property_Zone; -string (string) Propery_Free; -float (string) Property_Validate; -float (string, string) Property_Exists; -string (string, string, string) Property_Register; -string (string, string, string) Property_Set; -string (string, string, string) Property_Rename; -string (string, string) Property_Delete; -string (string, string) Property_Get; -string (string, string) Property_GetString; -float (string, string) Property_GetFloat; -vector (string, string) Property_GetVector; -entity (string, string) Property_GetEntity; -float Timer_Time; -float Timer_Delta; -void () Timer_Init; -void () Timer_Update; -void () Timer_Quit; -float GFX_MENU_DEFAULT_WIDTH; -float GFX_MENU_DEFAULT_HEIGHT; -string CVAR_SCMENU_MENU_WIDTH; -string CVAR_SCMENU_MENU_HEIGHT; -float GFX_SHOWFPS_DURATION; -float GFX_SHOWFPS_DEFAULT; -string CVAR_SCMENU_SHOWFPS; -float Gfx_Menu_Width; -float Gfx_Menu_Height; -float Gfx_Real_Width; -float Gfx_Real_Height; -void () Gfx_Init; -void () Gfx_Quit; -void () Gfx_Display; -void () Gfx_Hide; -void () Gfx_Update; -void () Gfx_Draw; -float (string) Gfx_IsCached; -float (string) Gfx_Precache; -void (string) Gfx_Free; -vector (string) Gfx_GetImageSize; -vector (vector) Gfx_ConToMen; -vector (vector) Gfx_MenToCon; -void () Gfx_ResetClipArea; -float (vector, float, vector, vector, float, float) Gfx_DrawCharacter; -float (vector, string, vector, vector, float, float) Gfx_DrawString; -float (vector, string, vector, vector, float, float) Gfx_DrawPic; -float (vector, vector, vector, float, float) Gfx_Fill; -void (float, float, float, float) Gfx_SetClipArea; -float (string) Sound_Precache; -void (string) Sound_Free; -void (string) Sound_Play; -string CURSOR_PATH; -string Cursor_Current; -void () Cursor_Animation; -float Cursor_Relative_x; -float Cursor_Relative_y; -float Cursor_Relative_z; -vector Cursor_Relative; -float Cursor_Position_x; -float Cursor_Position_y; -float Cursor_Position_z; -vector Cursor_Position; -float Cursor_Speed_x; -float Cursor_Speed_y; -float Cursor_Speed_z; -vector Cursor_Speed; -float Cursor_Transparency; -float Cursor_Color_x; -float Cursor_Color_y; -float Cursor_Color_z; -vector Cursor_Color; -float Cursor_Scale; -float Cursor_Flag; -float Cursor_Offset_x; -float Cursor_Offset_y; -float Cursor_Offset_z; -vector Cursor_Offset; -void () Cursor_Init; -void () Cursor_Quit; -void () Cursor_Display; -void () Cursor_Hide; -void () Cursor_Draw; -void () Cursor_Update; -void () Cursor_DefaultAnimation; -void (vector, string, vector, vector, float, float) Cursor_PrintInfo; -void () Key_Init; -void () Key_Quit; -void () Key_Update; -void () Key_Display; -void () Key_Hide; -void (string) Key_Unbind; -string (float) Key_GetName; -float (string) Key_GetNum; -string (string) Key_GetBindList; -void (float, string) Key_LimitBinds; -void (string, string) Key_Bind; -float SLIST_FIELD_CNAME; -float SLIST_FIELD_PING; -float SLIST_FIELD_GAME; -float SLIST_FIELD_MOD; -float SLIST_FIELD_MAP; -float SLIST_FIELD_NAME; -float SLIST_FIELD_MAXPLAYERS; -float SLIST_FIELD_NUMPLAYERS; -float SLIST_FIELD_PROTOCOL; -float HostCache_ViewCount; -float HostCache_TotalCount; -float HostCache_MasterQueryCount; -float HostCache_MasterReplyCount; -float HostCache_ServerQueryCount; -float HostCache_ServerReplyCount; -float HostCache_SortField; -float HostCache_SortDescending; -void () HostCache_Init; -void () HostCache_Update; -void () HostCache_ResortViewSet; -void () HostCache_RefreshHostCache; -float PARSER_TT_ITEM; -float PARSER_TT_TEMPLATE; -float PARSER_TT_DERIVE; -float PARSER_TT_DERIVETEMPLATE; -float PARSER_TT_DEFINE; -float PARSER_TT_UNDEF; -float PARSER_TT_IGNORE; -float PARSER_TT_NAMESPACE; -float PARSER_TT_INCLUDE; -float PARSER_TT_BRACEOPEN; -float PARSER_TT_BRACECLOSE; -float PARSER_TT_BRACKETOPEN; -float PARSER_TT_BRACKETCLOSE; -float PARSER_TT_TOKEN; -float PARSER_TT_SIZE; -string PARSER_TT_TEXT; -float PARSER_NORMAL; -float PARSER_INFO; -float PARSER_HIGH; -float PARSER_LOW; -float Parser_MaxIncludeDepth; -string Parser_FileList; -float Parser_IncludeDepth; -entity Parser_DefineChain; -string Parser_Filename; -float Parser_LineNumber; -float Parser_File; -string Parser_Line; -float Parser_NumTokens; -float Parser_TokenNum; -string Parser_Token; -float Parser_TokenType; -float () Parser_GetToken; -float () Parser_GetTokenType; -void () Parser_ParseDefine; -void () Parser_ProcessDefine; -void () Parser_ParseUndef; -void (float) Parser_Expect; -void (string) Parser_Error; -void (float, string) Parser_Print; -entity (string) Parser_ParseItem; -entity (string) Parser_DeriveItem; -string (string, string) Parser_ParseEntity; -void (string) Parser_ParseDefinition; -void (string) Parser_ParseNamespace; -void () Parser_ParseIgnore; -void (entity, entity) Parser_CloneChildren; -void (string) Parser_IncludeFile; -void (string, string) Parser_ParseFile; -void (string) Parser_ParseMenu; -void () Parser_Init; -void () Parser_Quit; -string SYSTEM_CVAR_VERSION_BUILDDATE; -string SYSTEM_CVAR_VERSION_BUILDTIME; -string SYSTEM_CVAR_VERSION; -string SYSTEM_CVAR_VERSION_BUILDDATE_VALUE; -string SYSTEM_CVAR_VERSION_BUILDTIME_VALUE; -string SYSTEM_CVAR_VERSION_VALUE; -string SYSTEM_CVAR_DEBUG; -string SYSTEM_CVAR_DEBUG_REF; -string SYSTEM_CVAR_DEBUG_SOUND; -string SYSTEM_CVAR_DEBUG_AREA; -string SYSTEM_CVAR_DEBUG_STEP; -string SYSTEM_CVAR_DEBUG_MOUSE; -string SYSTEM_CVAR_DEBUG_STRUCTURE; -string SYSTEM_CVAR_DEBUG_RUNFLAG; -string SYSTEM_CVAR_DEBUG_PROCESS; -string SYSTEM_CVAR_DEBUG_MGFX; -string SYSTEM_CVAR_DEBUG_PARSER; -string SYSTEM_CVAR_DEBUG_PROCESS_FILTER; -string SYSTEM_CVAR_DEBUG_DUMP_NAMES; -float SYSTEM_CVAR_DEBUG_DEFAULT; -float SYSTEM_CVAR_DEBUG_REF_DEFAULT; -float SYSTEM_CVAR_DEBUG_RUNFLAG_DEFAULT; -float SYSTEM_CVAR_DEBUG_PROCESS_DEFAULT; -float SYSTEM_CVAR_DEBUG_MGFX_DEFAULT; -float SYSTEM_CVAR_DEBUG_STRUCTURE_DEFAULT; -string SYSTEM_CVAR_DEBUG_PARSER_DEFAULT; -string SYSTEM_CVAR_DEBUG_PROCESS_FILTER_DEFAULT; -float SYSTEM_CVAR_DEBUG_SOUND_DEFAULT; -float SYSTEM_CVAR_DEBUG_AREA_DEFAULT; -float SYSTEM_CVAR_DEBUG_STEP_DEFAULT; -float SYSTEM_CVAR_DEBUG_MOUSE_DEFAULT; -bool sys_debug; -bool sys_debug_sound; -bool sys_debug_ref; -bool sys_debug_area; -bool sys_debug_runflag; -bool sys_debug_process; -bool sys_debug_mgfx; -float sys_debug_mouse; -float sys_debug_structure; -float sys_debug_parser; -bool sys_debug_halt; -float sys_debug_process_filter; -float sys_debug_cursor_localpos_x; -float sys_debug_cursor_localpos_y; -float sys_debug_cursor_localpos_z; -vector sys_debug_cursor_localpos; -void () Sys_Debug_Init; -void () Sys_Debug_Frame; -void () Sys_Debug_Draw; -void () Sys_Debug_DumpNames; -string MENU_NORMAL_NAME; -string MENU_INGAME_NAME; -string MENU_NORMAL_DEFAULT; -string MENU_INGAME_DEFAULT; -string MENU_MAINFILE; -bool MENU_ALLOWINGAME; -void () Menu_Init; -void () Menu_Load; -void () Menu_PerformReinit; -void () Menu_Hide; -void () Menu_Shutdown; -void (entity) Menu_LinkItem; -void (entity) Menu_LinkWindow; -entity (string, string, string) Menu_CreateItem; -entity (entity, string, string, bool) Menu_DeriveItem; -void (entity, string) Menu_AddEntityData; -void (entity) Menu_LinkChildren; -void () Menu_LinkWindows; -float Menu_Clip_Position_x; -float Menu_Clip_Position_y; -float Menu_Clip_Position_z; -vector Menu_Clip_Position; -float Menu_Clip_Size_x; -float Menu_Clip_Size_y; -float Menu_Clip_Size_z; -vector Menu_Clip_Size; -float Menu_Origin_x; -float Menu_Origin_y; -float Menu_Origin_z; -vector Menu_Origin; -vector (vector) Menu_OrgToMen; -vector (vector) Menu_MenToOrg; -vector (vector) Menu_ConToOrg; -vector (vector) Menu_OrgToCon; -float (vector, float, vector, vector, float, float) Menu_DrawCharacter; -float (vector, string, vector, vector, float, float) Menu_DrawString; -float (vector, string, vector, vector, float, float) Menu_DrawPicture; -float (vector, vector, vector, float, float) Menu_Fill; -void (float, float, float, float) Menu_SetClipArea; -void () Menu_ResetClipArea; -bool _menu_process_filtered; -float RUNFLAG_TEMPLATE; -float RUNFLAG_HADMOUSE; -float RUNFLAG_MOUSEINAREA; -float RUNFLAG_CHILDDRAWONLY; -float RUNFLAG_CHILDDRAWUPDATEONLY; -float RUNFLAG_HIDDEN; -float RUNFLAG_CLIPPED; -float RUNFLAG_NOSELECT; -float RUNFLAG_USERSELECT; -float RUNFLAG_DELETEFRAME; -float RUNFLAG_DELETETOGGLE; -float RUNFLAG_SPAWNED; -.entity chain; -.string type; -.entity _parent; -.string parent; -.string name; -.entity _next; -.entity _prev; -.entity _child; -.float orderPos; -.float flag; -.float _runFlag; -.float pos_x; -.float pos_y; -.float pos_z; -.vector pos; -.float size_x; -.float size_y; -.float size_z; -.vector size; -.float origin_x; -.float origin_y; -.float origin_z; -.vector origin; -.float _cache_origin_x; -.float _cache_origin_y; -.float _cache_origin_z; -.vector _cache_origin; -.float _cache_clip_pos_x; -.float _cache_clip_pos_y; -.float _cache_clip_pos_z; -.vector _cache_clip_pos; -.float _cache_clip_size_x; -.float _cache_clip_size_y; -.float _cache_clip_size_z; -.vector _cache_clip_size; -.void () init; -.void () reinit; -.void () destroy; -.void () mouseEnter; -.void () mouseLeave; -.void () update; -.void (bool, bool) select; -.void () action; -.void () draw; -.bool (float, float) key; -.void () _reinit; -.void () _destroy; -.void () _mouseEnter; -.void () _mouseLeave; -.void () _update; -.void (bool, bool) _select; -.void () _draw; -.bool (float, float) _key; -void () DefCt_Reinit; -void () DefCt_Destroy; -float (float, float) DefCt_Key; -void () DefCt_Draw; -void () DefCt_MouseEnter; -void () DefCt_MouseLeave; -void () DefCt_Update; -void (float, float) DefCt_Select; -void (entity) Raise_Reinit; -void (entity) Raise_Destroy; -bool (entity, float, float) Raise_Key; -void (entity) Raise_Draw; -void (entity) Raise_MouseEnter; -void (entity) Raise_MouseLeave; -void (entity) Raise_Update; -void (entity, float, float) Raise_Select; -void () CtCall_Init; -void () CtCall_Reinit; -void () CtCall_Destroy; -float (float, float) CtCall_Key; -void () CtCall_Draw; -void () CtCall_MouseEnter; -void () CtCall_MouseLeave; -void () CtCall_Action; -void () CtCall_Update; -void (float, float) CtCall_Select; -entity Menu_ActiveWindow; -entity Menu_ActiveItem; -entity (entity) _Menu_GetParent; -entity (entity) _Menu_GetFirst; -entity (entity) _Menu_GetLast; -entity (entity) _Menu_GetNext; -entity (entity) _Menu_GetPrev; -bool (entity, entity) _Menu_IsEmbeddedParentOf; -void () _Menu_SelectNext; -void () _Menu_SelectPrev; -float () _Menu_SelectUp; -float () _Menu_SelectDown; -void () _Menu_Reselect; -void (float) Menu_SelectNext; -void (float) Menu_SelectPrev; -float (float) Menu_SelectUp; -float (float) Menu_SelectDown; -void (float) Menu_Reselect; -void (entity, bool) Menu_CorrectSelection; -void (entity, bool) Menu_Select; -void (entity, float, float) Menu_JumpToWindow; -float (entity) Menu_HasEvents; -void (entity) Menu_SetRunFlag; -void (entity, entity) Menu_InheritRunFlag; -void () Menu_UpdateRunFlags; -void (entity) Menu_EmptyWindow; -void (entity) Menu_RemoveItem; -entity (entity, string, bool) Menu_GetItemEx; -entity (entity, string, bool) Menu_GetChildEx; -entity (string) Menu_GetItem; -entity (string) Menu_GetChild; -float MENU_SELECT_SELECTABLE; -float MENU_SELECT_ALWAYS; -float MENU_SELECT_NEVER; -float MENU_EVENT_NORMAL; -float MENU_EVENT_CONTINUE; -float MENU_EVENT_RAISEPARENT; -float MENU_EVENT_PROCESSED; -float MENU_PROCESS_RUNFLAG; -float MENU_PROCESS_UPDATE; -float MENU_PROCESS_DRAW; -float MENU_PROCESS_MOUSE; -float MENU_PROCESS_KEY; -float Menu_Cursor_Position_x; -float Menu_Cursor_Position_y; -float Menu_Cursor_Position_z; -vector Menu_Cursor_Position; -entity Menu_KeyHook_Target; -void (float, float) Menu_KeyHook; -void () Menu_Frame; -void () Menu_Draw; -void (float, float) Menu_Key; -float () Menu_Toggle; -void () Menu_Process_Setup; -float (entity, float, float, float, float) Menu_Process; -entity Menu_History; -void (entity, Menu_History_PopFunction) Menu_History_Push; -void () Menu_History_Pop; -float (entity) Menu_History_Verify; -void () Menu_History_Clear; -float Menu_GarbageFrameCount; -float Menu_GarbageToggleCount; -void () Menu_InitGarbageStats; -void () Menu_ResetGarbageStats; -float (entity) Menu_CheckForGarbage; -void (float) Menu_CollectGarbage; -void (entity) Menu_DeleteAfterFrame; -void (entity) Menu_DeleteAfterToggle; -float ITEM_ALIGN_LEFT; -float ITEM_ALIGN_CENTER; -float ITEM_ALIGN_RIGHT; -float ITEM_ALIGN_FIX_RIGHT; -float ITEM_ALIGN_FIX_CENTER; -float ITEM_ALIGN_FIX_LEFT; -float ITEM_ALIGN_FIRST; -float FLAG_TEMPLATE; -float FLAG_EMBEDDED; -float FLAG_HIDDEN; -float FLAG_NOSELECT; -float FLAG_CONNECTEDONLY; -float FLAG_SERVERONLY; -float FLAG_DEVELOPERONLY; -float FLAG_DRAWONLY; -float FLAG_CHILDDRAWONLY; -float FLAG_DRAWUPDATEONLY; -float FLAG_CHILDDRAWUPDATEONLY; -float FLAG_SEALOFFMOUSE; -.entity _link; -void () Item_Link_Init; -void () Item_Link_Destroy; -void () Item_Link_Update; -float (float, float) Item_Link_Key; -void () Item_Link_MouseEnter; -float () Item_Link_IsSelected; -.string link; -.string normal; -void () Item_Cinematic_Destroy; -void () Item_Cinematic_Init; -void () Item_Cinematic_Loop_Spawn; -void () Item_Container_Spawn; -.string value; -string ITEM_SOUND_NOSELECT; -float ITEM_BUTTON_ACTIONTIME; -float ITEM_EDITBOX_CURSOR_FREQ; -float ITEM_EDITBOX_FLASHTIME; -float ITEM_EDITBOX_SCROLLDISTANCE; -float ITEM_DATA_SYNC; -float ITEM_DATA_SEND; -float ITEM_DATA_RESET; -float ITEM_DATA_TEST_START; -float ITEM_DATA_TEST_END; -float ITEM_DATA_SAVE_EXECSTRING; -float ITEM_DATALINK_SET; -float ITEM_DATALINK_GET; -void (entity, bool) Raise_DataEvent; -string Data_ExecString; -void () Data_ExecString_BeginUse; -void () Data_ExecString_EndUse; -.string defValue; -.string _syncValue; -.void (float) _dataEvent; -void () Item_Data_Init; -void () Item_Data_Destroy; -.string target; -.entity _target; -void () Item_DataUser_Update; -void () Item_DataUser_Init; -void () Item_DataUser_Destroy; -void () Item_DataLink_Init; -void () Item_DataLink_Destroy; -void () Item_DataLink_Update; -void (float) Item_DataContainer_DataEvent; -void () Item_DataContainer_Spawn; -void () Item_Data_Container_Reinit; -void (float) Item_Data_Container_DataEvent; -void () Item_Data_Container_Spawn; -.string cvarName; -void (float) Item_Data_Cvar_DataEvent; -void () Item_Data_Cvar_Spawn; -void () Item_Data_CvarCreateSave_Spawn; -.float maxValue; -.float minValue; -.float stepValue; -.float _realValue; -void () Item_DataLink_Value_Clamp; -void () Item_DataLink_Value_Spawn; -.string descList; -void () Item_DataLink_Switch_Init; -void () Item_DataLink_Switch_Destroy; -float (entity, float) DataLink_Switch_GetOrdinal; -void () Item_DataLink_ValueSwitch_Spawn; -.string valueList; -void (float) Item_DataLink_TextSwitch_DataEvent; -void () Item_DataLink_TextSwitch_Destroy; -void () Item_DataLink_TextSwitch_Spawn; -.float _presstime; -void () Item_DataLink_FastResync_Spawn; -void () Item_DataLink_TextValue_Spawn; -void () Item_DataLink_TextTime_Spawn; -void () Item_DataLink_AltString_Spawn; -void () Item_DataLink_Router_Spawn; -float (float, float) Item_Window_Key; -void () Item_Window_Draw; -void () Item_Window_Spawn; -void () Item_Frame_Spawn; -void () Item_EventWindow_Spawn; -void () Item_Reference_Update; -void () Item_Reference_Draw; -void () Item_Reference_Destroy; -void () Item_Reference_Spawn; -.float direction_x; -.float direction_y; -.float direction_z; -.vector direction; -.float alignment; -void () Item_Layout_Spawn; -void () Item_Layout_Update; -void () Item_Arrangement_CalculateSize; -void () Item_Arrangement_Update; -void () Item_Arrangement_Spawn; -void () Item_ScrollWindow_Update; -void () Item_ScrollWindow_Spawn; -float ITEM_STATE_NORMAL; -float ITEM_STATE_SELECTED; -float ITEM_STATE_PRESSED; -.string picture; -.float color_x; -.float color_y; -.float color_z; -.vector color; -.float alpha; -.float drawFlag; -void () Item_Picture_Draw; -void () Item_Picture_Destroy; -void () Item_Picture_Spawn; -void () Item_Rect_Draw; -void () Item_Rect_Spawn; -.string text; -.float fontSize_x; -.float fontSize_y; -.float fontSize_z; -.vector fontSize; -void () Item_Label_Draw; -void () Item_Label_Update; -void () Item_Label_Destroy; -void () Item_Label_Spawn; -.float wrap; -void () Item_MultiLabel_Update; -void () Item_MultiLabel_Draw; -void () Item_MultiLabel_Destroy; -void () Item_MultiLabel_Spawn; -.string selected; -.string pressed; -.float colorSelected_x; -.float colorSelected_y; -.float colorSelected_z; -.vector colorSelected; -.float colorPressed_x; -.float colorPressed_y; -.float colorPressed_z; -.vector colorPressed; -.float drawFlags_x; -.float drawFlags_y; -.float drawFlags_z; -.vector drawFlags; -.float alphas_x; -.float alphas_y; -.float alphas_z; -.vector alphas; -.string soundSelected; -.string soundPressed; -.float _state; -void () Item_Button_Draw; -void () Item_Button_Update; -void (float, float) Item_Button_Select; -float (float, float) Item_Button_Key; -void () Item_Button_Destroy; -void () Item_Button_Spawn; -.float proportions_x; -.float proportions_y; -.float proportions_z; -.vector proportions; -.string pictureSlider; -.string soundIncrease; -.string soundDecrease; -.float sizeSlider_x; -.float sizeSlider_y; -.float sizeSlider_z; -.vector sizeSlider; -void (float, float) Item_Slider_Select; -void () Item_Slider_Draw; -float (float, float) Item_Slider_Key; -void () Item_Slider_Destroy; -void () Item_Slider_Spawn; -.float colorCursor_x; -.float colorCursor_y; -.float colorCursor_z; -.vector colorCursor; -.float colorCursorFlash_x; -.float colorCursorFlash_y; -.float colorCursorFlash_z; -.vector colorCursorFlash; -.float sizeCursor_x; -.float sizeCursor_y; -.float sizeCursor_z; -.vector sizeCursor; -.float sizeCursorFlash_x; -.float sizeCursorFlash_y; -.float sizeCursorFlash_z; -.vector sizeCursorFlash; -.float alphasCursor_x; -.float alphasCursor_y; -.float alphasCursor_z; -.vector alphasCursor; -.float drawFlagsCursor_x; -.float drawFlagsCursor_y; -.float drawFlagsCursor_z; -.vector drawFlagsCursor; -.string soundKey; -.string soundMove; -.float _cursorPos; -void () Item_EditBox_Draw; -void () Item_EditBox_Update; -float (float, float) Item_EditBox_Key; -void (float, float) Item_EditBox_Select; -void () Item_EditBox_Destroy; -void () Item_EditBox_Reinit; -void () Item_EditBox_Spawn; -void () Item_ValueButton_Update; -void () Item_ValueButton_Destroy; -void () Item_ValueButton_Spawn; -float (float, float) Item_SwitchButton_Key; -void () Item_SwitchButton_Spawn; -.float colorInactive_x; -.float colorInactive_y; -.float colorInactive_z; -.vector colorInactive; -.float drawFlagInactive; -.float alphaInactive; -void () Item_List_Draw; -void () Item_List_Update; -void (float, float) Item_List_Select; -float (float, float) Item_List_Key; -void () Item_List_Destroy; -void () Item_List_Spawn; -float (float, float) Item_FloatingArea_Key; -void () Item_FloatingArea_Update; -void () Item_FloatingArea_Spawn; -void () Item_VScrollBar_Draw; -float (float, float) Item_VScrollBar_Key; -void () Item_VScrollBar_Update; -void () Item_VScrollBar_Spawn; -void () Item_Automation_Init; -.entity _current; -void () Item_Automation_ForEach_Spawn; -void () Item_Task_Init; -void () Item_Automation_Job_Spawn; -void () Item_Task_Job_Spawn; -void (entity) Nex_MakeOnlyVisible; -void () Item_Nex_Avatar_Info_Destroy; -void () Item_Nex_Avatar_Info_Spawn; -void (float) Item_Data_Nex_Avatar_DataEvent; -void () Item_Data_Nex_Avatar_Spawn; -void (float) Item_Data_Nex_Name_DataEvent; -void () Item_Data_Nex_Name_Spawn; -void (float) Item_Data_Nex_Color_DataEvent; -void () Item_Data_Nex_Color_Spawn; -void () Item_Nex_Map_Info_Destroy; -void () Item_Nex_Map_Info_Spawn; -void () Item_Nex_MapDB_EnumFiles; -void () Item_Nex_MapDB_Destroy; -void () Item_Nex_MapDB_Spawn; -entity (string) Nex_MapDB_GetByPath; -entity (float) Nex_MapDB_GetByIndex; -float (entity) Nex_MapDB_GetIndex; -string () Nex_MapDB_GetPathAltString; -string () Nex_MapDB_GetNameAltString; -void (float) Item_DataLink_Nex_MapList_DataEvent; -void () Item_DataLink_Nex_MapList_Spawn; -void () Item_DataLink_Nex_MapList_InitWithMapList; -void (entity) DataLink_Nex_MapList_UpdateRange; -void (entity, string, string) DataLink_Nex_MapList_InsertEntryAfter; -void (entity) DataLink_Nex_MapList_DeleteEntry; -void (entity) DataLink_Nex_MapList_MoveEntryUp; -void (entity) DataLink_Nex_MapList_MoveEntryDown; -void (entity, string, string) DataLink_Nex_MapList_SetFirst; -void (entity) DataLink_Nex_MapList_Clear; -string (entity) DataLink_Nex_MapList_GetCurrentName; -string (entity) DataLink_Nex_MapList_GetCurrentPath; -void () Item_DataLink_Nex_ModSwitch_Spawn; -void (float) Item_DataLink_Nex_FileList_DataEvent; -void () Item_DataLink_Nex_FileList_Destroy; -void () Item_DataLink_Nex_FileList_Spawn; -void () Item_Nex_HostCache_Entry_Update; -void () Item_Nex_HostCache_Entry_Spawn; -void () Item_Nex_HostCache_StringField_Update; -void () Item_Nex_HostCache_StringField_Spawn; -void () Item_Nex_HostCache_ValueField_Update; -void () Item_Nex_HostCache_ValueField_Spawn; -void () Item_Nex_HostCache_Players_Update; -void () Item_Nex_HostCache_Players_Spawn; -void (float) Item_Data_Nex_Key_DataEvent; -void () Item_Data_Nex_Key_Spawn; -void () Item_Nex_KeyButton_Spawn; -void () Item_Data_Nex_Resolution_Spawn; -void () Item_Nex_Credits_Spawn; -void (string, string, string, string, event, event) Nex_MessageBox; -void () Nex_Quit_Toggle; -void() Nex_Quit_Toggle = asm -{ -local entity lEntity; -local float temp_0; -local float temp_1; - STORE_F "QuitWnd", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lEntity; - INDIRECT_F lEntity, flag, temp_1; - BITAND temp_1, FLAG_HIDDEN, temp_1; - IFNOT temp_1, 11; - ADDRESS lEntity, flag, temp_1; - INDIRECT_F lEntity, flag, temp_0; - SUB_F temp_0, FLAG_HIDDEN, temp_0; - STOREP_F temp_0, temp_1; - STORE_F "QuitWnd::Layout::Buttons::No", parm0_x; - CALL1 Menu_GetItem; - STORE_F return_x, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 Menu_Select; - GOTO 7; - ADDRESS lEntity, flag, temp_0; - INDIRECT_F lEntity, flag, temp_1; - ADD_F temp_1, FLAG_HIDDEN, temp_1; - STOREP_F temp_1, temp_0; - STORE_F KEY_GAME, parm0_x; - CALL1 Menu_Reselect; - DONE; -} - -void () Nex_Quit_Action; -void() Nex_Quit_Action = asm -{ -local entity lEntity; -local float temp_0; -local float temp_1; - STORE_F "QuitWnd", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lEntity; - INDIRECT_F lEntity, flag, temp_0; - BITAND temp_0, FLAG_HIDDEN, temp_0; - IFNOT temp_0, 5; - ADDRESS lEntity, flag, temp_0; - INDIRECT_F lEntity, flag, temp_1; - SUB_F temp_1, FLAG_HIDDEN, temp_1; - STOREP_F temp_1, temp_0; - STORE_F "QuitWnd::Layout::Buttons::No", parm0_x; - CALL1 Menu_GetItem; - STORE_F return_x, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 Menu_Select; - DONE; -} - -float (float, float) Nex_Quit_Key; -float(float pKey, float pAscii) Nex_Quit_Key = asm -{ -local float temp_0; - EQ_F pKey, K_ESCAPE, temp_0; - IFNOT temp_0, 3; - CALL0 Nex_Quit_Toggle; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void () Nex_Quit_Yes; -void() Nex_Quit_Yes = asm -{ - STORE_F "quit -", parm0_x; - CALL1 cmd; - DONE; -} - -void () Nex_Quit_No; -void() Nex_Quit_No = asm -{ - CALL0 Nex_Quit_Toggle; - DONE; -} - -void () Nex_Action_ResetData_Destroy; -void() Nex_Action_ResetData_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void () Nex_Action_ResetData_Action; -void() Nex_Action_ResetData_Action = asm -{ -local float temp_0; - INDIRECT_S self, target, parm0_x; - CALL1 Menu_GetItem; - STORE_F return_x, parm0_x; - STORE_F ITEM_DATA_RESET, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Nex_Action_ResetData; -void() Nex_Action_ResetData = asm -{ -local float temp_0; - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityZone; - ADDRESS self, destroy, temp_0; - STOREP_FNC Nex_Action_ResetData_Destroy, temp_0; - ADDRESS self, action, temp_0; - STOREP_FNC Nex_Action_ResetData_Action, temp_0; - DONE; -} - -void () Nex_Automation_Option_Slider; -void() Nex_Automation_Option_Slider = asm -{ -local entity lValue; -local entity lSlider; -local entity lDescription; -local float temp_0; -local float temp_1; - INDIRECT_E self, _parent, temp_0; - INDIRECT_S temp_0, target, temp_0; - NOT_S temp_0, temp_0; - IFNOT temp_0, 8; - INDIRECT_E self, _parent, temp_0; - INDIRECT_S temp_0, target, temp_0; - STORE_F "Bad target '", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F "'", parm2_x; - CALL3 objerror; - RETURN offset_0; - STORE_F "Description", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lDescription; - STORE_F "Slider", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lSlider; - STORE_F "Value", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lValue; - ADDRESS lDescription, normal, temp_0; - INDIRECT_E self, _parent, temp_1; - INDIRECT_S temp_1, text, temp_1; - STOREP_S temp_1, temp_0; - ADDRESS lDescription, link, temp_0; - INDIRECT_S lSlider, name, temp_1; - STOREP_S temp_1, temp_0; - ADDRESS lSlider, target, temp_0; - INDIRECT_E self, _parent, temp_1; - INDIRECT_S temp_1, target, temp_1; - STOREP_S temp_1, temp_0; - ADDRESS lValue, target, temp_0; - INDIRECT_E self, _parent, temp_1; - INDIRECT_S temp_1, target, temp_1; - STOREP_S temp_1, temp_0; - ADDRESS lValue, link, temp_0; - INDIRECT_S lSlider, name, temp_1; - STOREP_S temp_1, temp_0; - DONE; -} - -void () Nex_Automation_Option_EditBox; -void() Nex_Automation_Option_EditBox = asm -{ -local entity lEditBox; -local entity lDescription; -local float temp_0; -local float temp_1; - INDIRECT_E self, _parent, temp_0; - INDIRECT_S temp_0, target, temp_0; - NOT_S temp_0, temp_0; - IFNOT temp_0, 8; - INDIRECT_E self, _parent, temp_0; - INDIRECT_S temp_0, target, temp_0; - STORE_F "Bad target '", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F "'", parm2_x; - CALL3 objerror; - RETURN offset_0; - STORE_F "Description", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lDescription; - STORE_F "EditBox", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lEditBox; - ADDRESS lDescription, normal, temp_0; - INDIRECT_E self, _parent, temp_1; - INDIRECT_S temp_1, text, temp_1; - STOREP_S temp_1, temp_0; - ADDRESS lDescription, link, temp_0; - INDIRECT_S lEditBox, name, temp_1; - STOREP_S temp_1, temp_0; - ADDRESS lEditBox, target, temp_0; - INDIRECT_E self, _parent, temp_1; - INDIRECT_S temp_1, target, temp_1; - STOREP_S temp_1, temp_0; - DONE; -} - -void () Nex_Automation_Option_Switch; -void() Nex_Automation_Option_Switch = asm -{ -local entity lSwitch; -local entity lDescription; -local float temp_0; -local float temp_1; - INDIRECT_E self, _parent, temp_0; - INDIRECT_S temp_0, target, temp_0; - NOT_S temp_0, temp_0; - IFNOT temp_0, 8; - INDIRECT_E self, _parent, temp_0; - INDIRECT_S temp_0, target, temp_0; - STORE_F "Bad target '", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F "'", parm2_x; - CALL3 objerror; - RETURN offset_0; - STORE_F "Description", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lDescription; - STORE_F "Switch", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lSwitch; - ADDRESS lDescription, normal, temp_0; - INDIRECT_E self, _parent, temp_1; - INDIRECT_S temp_1, text, temp_1; - STOREP_S temp_1, temp_0; - ADDRESS lDescription, link, temp_0; - INDIRECT_S lSwitch, name, temp_1; - STOREP_S temp_1, temp_0; - ADDRESS lSwitch, target, temp_0; - INDIRECT_E self, _parent, temp_1; - INDIRECT_S temp_1, target, temp_1; - STOREP_S temp_1, temp_0; - DONE; -} - -float (float, float) Nex_Global_Key; -float(float pKey, float pAscii) Nex_Global_Key = asm -{ -local float temp_0; - GOTO 17; - STORE_F FILE_APPEND, parm0_x; - CALL1 Menu_SelectPrev; - GOTO 37; - STORE_F FILE_APPEND, parm0_x; - CALL1 Menu_SelectNext; - GOTO 34; - STORE_F FILE_APPEND, parm0_x; - CALL1 Menu_SelectUp; - GOTO 31; - STORE_F FILE_APPEND, parm0_x; - CALL1 Menu_SelectDown; - IF return_x, 3; - STORE_F ITEM_SOUND_NOSELECT, parm0_x; - CALL1 Sound_Play; - GOTO 25; - GOTO 24; - EQ_F pKey, K_UPARROW, temp_0; - IF temp_0, -17; - EQ_F pKey, K_KP_UPARROW, temp_0; - IF temp_0, -19; - EQ_F pKey, K_LEFTARROW, temp_0; - IF temp_0, -21; - EQ_F pKey, K_KP_LEFTARROW, temp_0; - IF temp_0, -23; - EQ_F pKey, K_DOWNARROW, temp_0; - IF temp_0, -22; - EQ_F pKey, K_KP_DOWNARROW, temp_0; - IF temp_0, -24; - EQ_F pKey, K_RIGHTARROW, temp_0; - IF temp_0, -26; - EQ_F pKey, K_KP_RIGHTARROW, temp_0; - IF temp_0, -28; - EQ_F pKey, K_ESCAPE, temp_0; - IF temp_0, -27; - EQ_F pKey, K_MOUSE2, temp_0; - IF temp_0, -29; - EQ_F pKey, K_ENTER, temp_0; - IF temp_0, -28; - GOTO -23; - RETURN FILE_APPEND; - DONE; -} - -void () Item_Nex_StressRepeat_Spawn; -void() Item_Nex_StressRepeat_Spawn = asm -{ -local float locked_1020; -local float lCounter; -local entity lItem; -local float temp_1; - ADDRESS self, flag, locked_1020; - INDIRECT_F self, flag, temp_1; - BITOR temp_1, FLAG_EMBEDDED, temp_1; - STOREP_F temp_1, locked_1020; - STORE_F KEY_GAME, lCounter; - LT lCounter, 100.000000, locked_1020; - IFNOT locked_1020, 14; - INDIRECT_E self, _child, locked_1020; - STORE_F lCounter, parm0_x; - CALL1 ftos; - INDIRECT_E self, _parent, temp_1; - INDIRECT_S temp_1, name, temp_1; - STORE_F locked_1020, parm0_x; - STORE_F return_x, parm1_x; - STORE_F temp_1, parm2_x; - STORE_F FILE_APPEND, parm3_x; - CALL4 Menu_DeriveItem; - STORE_ENT return_x, lItem; - ADD_F lCounter, FILE_APPEND, lCounter; - GOTO -14; - DONE; -} - -void () Nex_Action_MakeOnlyVisible_Destroy; -void() Nex_Action_MakeOnlyVisible_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void () Nex_Action_MakeOnlyVisible_Action; -void() Nex_Action_MakeOnlyVisible_Action = asm -{ -local float temp_0; - INDIRECT_S self, target, parm0_x; - CALL1 Menu_GetItem; - STORE_F return_x, parm0_x; - CALL1 Nex_MakeOnlyVisible; - DONE; -} - -void () Nex_Action_MakeOnlyVisible; -void() Nex_Action_MakeOnlyVisible = asm -{ -local float temp_0; - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityZone; - ADDRESS self, destroy, temp_0; - STOREP_FNC Nex_Action_MakeOnlyVisible_Destroy, temp_0; - ADDRESS self, action, temp_0; - STOREP_FNC Nex_Action_MakeOnlyVisible_Action, temp_0; - DONE; -} - -void () Nex_Action_MakeFirstVisible; -void() Nex_Action_MakeFirstVisible = asm -{ -local float temp_0; - INDIRECT_E self, _child, parm0_x; - CALL1 Nex_MakeOnlyVisible; - DONE; -} - -void () Nex_Action_JumpToPage_Destroy; -void() Nex_Action_JumpToPage_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void () Nex_Action_JumpToPage_Action; -void() Nex_Action_JumpToPage_Action = asm -{ -local entity lItem; -local float temp_0; - INDIRECT_S self, target, parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F lItem, parm0_x; - CALL1 Nex_MakeOnlyVisible; - STORE_F lItem, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 Menu_JumpToWindow; - DONE; -} - -void () Nex_Action_JumpToPage; -void() Nex_Action_JumpToPage = asm -{ -local float temp_0; - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityZone; - ADDRESS self, action, temp_0; - STOREP_FNC Nex_Action_JumpToPage_Action, temp_0; - ADDRESS self, destroy, temp_0; - STOREP_FNC Nex_Action_JumpToPage_Destroy, temp_0; - DONE; -} - -void () Nex_Action_SetNormalPanelLink_Destroy; -void() Nex_Action_SetNormalPanelLink_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void () Nex_Action_SetNormalPanelLink_Action; -void() Nex_Action_SetNormalPanelLink_Action = asm -{ -local entity lItem; -local float temp_0; - STORE_F "Normal::Panel", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_S self, target, temp_0; - STORE_F lItem, parm0_x; - STORE_F link, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 String_EntitySet; - STORE_F lItem, parm0_x; - CALL1 Raise_Update; - CALL0 Menu_UpdateRunFlags; - INDIRECT_E lItem, _link, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 Menu_JumpToWindow; - DONE; -} - -void () Nex_Action_SetNormalPanelLink; -void() Nex_Action_SetNormalPanelLink = asm -{ -local float temp_0; - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityZone; - ADDRESS self, destroy, temp_0; - STOREP_FNC Nex_Action_SetNormalPanelLink_Destroy, temp_0; - ADDRESS self, action, temp_0; - STOREP_FNC Nex_Action_SetNormalPanelLink_Action, temp_0; - DONE; -} - -void () Nex_Action_SetLinkOnReinit_Destroy; -void() Nex_Action_SetLinkOnReinit_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void () Nex_Action_SetLinkOnReinitk_Reinit; -void() Nex_Action_SetLinkOnReinitk_Reinit = asm -{ -local float temp_0; - STORE_F "Normal::Panel", parm0_x; - CALL1 Menu_GetItem; - INDIRECT_S self, target, temp_0; - STORE_F return_x, parm0_x; - STORE_F link, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () Nex_Action_SetLinkOnReinit; -void() Nex_Action_SetLinkOnReinit = asm -{ -local float temp_0; - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityZone; - ADDRESS self, destroy, temp_0; - STOREP_FNC Nex_Action_SetLinkOnReinit_Destroy, temp_0; - ADDRESS self, reinit, temp_0; - STOREP_FNC Nex_Action_SetLinkOnReinitk_Reinit, temp_0; - DONE; -} - -void () Nex_Action_Color_Cancel; -void() Nex_Action_Color_Cancel = asm -{ - STORE_F "::Data::Color", parm0_x; - CALL1 Menu_GetItem; - STORE_F return_x, parm0_x; - STORE_F ITEM_DATA_TEST_END, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Nex_Action_Color_Reset; -void() Nex_Action_Color_Reset = asm -{ - STORE_F "::Data::Color", parm0_x; - CALL1 Menu_GetItem; - STORE_F return_x, parm0_x; - STORE_F ITEM_DATA_RESET, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Nex_Automation_UpdateAvatar_Update; -void() Nex_Automation_UpdateAvatar_Update = asm -{ -local float locked_1020; -local entity lTarget; -local entity lItem; - INDIRECT_E self, _target, locked_1020; - INDIRECT_S locked_1020, name, locked_1020; - NE_S locked_1020, "Data::Player::Avatar", locked_1020; - IFNOT locked_1020, 5; - ADDRESS self, _target, locked_1020; - STORE_F "Data::Player::Avatar", parm0_x; - CALL1 Menu_GetItem; - STOREP_ENT return_x, locked_1020; - INDIRECT_E self, _target, lTarget; - STORE_F "Picture", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_E lTarget, _link, locked_1020; - INDIRECT_S locked_1020, picture, locked_1020; - STORE_F lItem, parm0_x; - STORE_F picture, parm1_x; - STORE_F locked_1020, parm2_x; - CALL3 String_EntitySet; - STORE_F "Name", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_E lTarget, _link, locked_1020; - INDIRECT_S locked_1020, normal, locked_1020; - STORE_F lItem, parm0_x; - STORE_F text, parm1_x; - STORE_F locked_1020, parm2_x; - CALL3 String_EntitySet; - STORE_F "Description", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_E lTarget, _link, locked_1020; - INDIRECT_S locked_1020, text, locked_1020; - STORE_F lItem, parm0_x; - STORE_F text, parm1_x; - STORE_F locked_1020, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () Nex_Automation_UpdateAvatar_Destroy; -void() Nex_Automation_UpdateAvatar_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void () Nex_Automation_UpdateAvatar; -void() Nex_Automation_UpdateAvatar = asm -{ -local float temp_0; - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityZone; - ADDRESS self, _update, temp_0; - STOREP_FNC Nex_Automation_UpdateAvatar_Update, temp_0; - ADDRESS self, _destroy, temp_0; - STOREP_FNC Nex_Automation_UpdateAvatar_Destroy, temp_0; - DONE; -} - -void () Nex_Action_Avatar_Next; -void() Nex_Action_Avatar_Next = asm -{ -local entity lItem; -local float temp_0; -local float temp_1; - STORE_F "Data::Player::Avatar", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - ADDRESS lItem, _realValue, temp_0; - INDIRECT_F lItem, _realValue, temp_1; - ADD_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - STORE_F lItem, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Nex_Action_Avatar_Prev; -void() Nex_Action_Avatar_Prev = asm -{ -local entity lItem; -local float temp_0; -local float temp_1; - STORE_F "Data::Player::Avatar", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - ADDRESS lItem, _realValue, temp_0; - INDIRECT_F lItem, _realValue, temp_1; - SUB_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - STORE_F lItem, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Nex_Action_Player_Apply; -void() Nex_Action_Player_Apply = asm -{ -local entity lItem; - STORE_F "Data::Player", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F lItem, parm0_x; - STORE_F ITEM_DATA_SEND, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Nex_Action_TestOnChange; -void() Nex_Action_TestOnChange = asm -{ -local float temp_0; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATA_TEST_START, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void (float, float) Nex_Action_TestOnSelect; -void(float pSelect, float pUser) Nex_Action_TestOnSelect = asm -{ -local float temp_0; - NOT_F pSelect, temp_0; - IFNOT temp_0, 1; - AND temp_0, pUser, temp_0; - IFNOT temp_0, 4; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATA_TEST_START, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Nex_Action_PlaySound; -string string_null; -void() Nex_Action_PlaySound = asm -{ -local float temp_0; - INDIRECT_S self, target, temp_0; - NE_S temp_0, string_null, temp_0; - IFNOT temp_0, 3; - INDIRECT_S self, target, parm0_x; - CALL1 Sound_Play; - DONE; -} - -void () Nex_Action_PlaySoundOnce; -void() Nex_Action_PlaySoundOnce = asm -{ -local float temp_0; - INDIRECT_S self, target, temp_0; - NE_S temp_0, string_null, temp_0; - IFNOT temp_0, 3; - INDIRECT_S self, target, parm0_x; - CALL1 Sound_Play; - STORE_F self, parm0_x; - CALL1 Menu_DeleteAfterToggle; - DONE; -} - -void () Nex_MapSelector_UpdateMap; -void() Nex_MapSelector_UpdateMap = asm -{ -local float lIndex; -local entity lSelector; -local entity lItem; -local entity lInfo; -local float temp_0; -local float temp_1; - STORE_F "::Data::Server::Map::Selector", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lSelector; - STORE_F lSelector, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_F lSelector, _realValue, lIndex; - STORE_F lIndex, parm0_x; - CALL1 Nex_MapDB_GetByIndex; - STORE_ENT return_x, lInfo; - INDIRECT_F self, minValue, temp_0; - NE_F lIndex, temp_0, temp_0; - IFNOT temp_0, 27; - ADDRESS self, minValue, temp_0; - STOREP_F lIndex, temp_0; - STORE_F "Picture", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_S lInfo, picture, temp_0; - STORE_F lItem, parm0_x; - STORE_F picture, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 String_EntitySet; - STORE_F "Name", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_S lInfo, normal, temp_0; - STORE_F lItem, parm0_x; - STORE_F text, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 String_EntitySet; - STORE_F "Description", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_S lInfo, text, temp_0; - STORE_F lItem, parm0_x; - STORE_F text, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 String_EntitySet; - STORE_F "::Data::Server::Map::Cycle", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_S lInfo, normal, temp_0; - INDIRECT_S lInfo, link, temp_1; - STORE_F lItem, parm0_x; - STORE_F temp_0, parm1_x; - STORE_F temp_1, parm2_x; - CALL3 DataLink_Nex_MapList_SetFirst; - DONE; -} - -void () Nex_MapSelector_Synchronize; -void() Nex_MapSelector_Synchronize = asm -{ -local float locked_1020; -local entity lMapInfo; -local string lPath; -local entity lSelector; -local entity lCycle; - STORE_F "::Data::Server::Map::Cycle", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lCycle; - STORE_F "::Data::Server::Map::Selector", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lSelector; - INDIRECT_F lCycle, stepValue, locked_1020; - EQ_F locked_1020, KEY_GAME, locked_1020; - IFNOT locked_1020, 5; - STORE_F lCycle, parm0_x; - STORE_F ITEM_DATA_RESET, parm1_x; - CALL2 Raise_DataEvent; - GOTO 23; - INDIRECT_S lCycle, valueList, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_S return_x, lPath; - STORE_F lPath, parm0_x; - CALL1 Nex_MapDB_GetByPath; - STORE_ENT return_x, lMapInfo; - STORE_F lPath, parm0_x; - CALL1 String_Free; - EQ_E lMapInfo, null_entity, locked_1020; - IFNOT locked_1020, 5; - STORE_F lCycle, parm0_x; - STORE_F ITEM_DATA_RESET, parm1_x; - CALL2 Raise_DataEvent; - GOTO 8; - ADDRESS lSelector, _realValue, locked_1020; - STORE_F lMapInfo, parm0_x; - CALL1 Nex_MapDB_GetIndex; - STOREP_F return_x, locked_1020; - STORE_F lSelector, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Nex_Action_MapSelector_Next; -void() Nex_Action_MapSelector_Next = asm -{ -local entity lItem; -local float temp_0; -local float temp_1; - STORE_F "::Data::Server::Map::Selector", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F lItem, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS lItem, _realValue, temp_0; - INDIRECT_F lItem, _realValue, temp_1; - ADD_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - STORE_F lItem, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Nex_Action_MapSelector_Prev; -void() Nex_Action_MapSelector_Prev = asm -{ -local entity lItem; -local float temp_0; -local float temp_1; - STORE_F "::Data::Server::Map::Selector", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F lItem, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS lItem, _realValue, temp_0; - INDIRECT_F lItem, _realValue, temp_1; - SUB_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - STORE_F lItem, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Nex_Action_Map_Start; -void() Nex_Action_Map_Start = asm -{ -local float lSkill; -local float lNumBots; -local entity lItem; -local float temp_0; - STORE_F "::Data::Server::NumBots", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_S lItem, value, parm0_x; - CALL1 stof; - STORE_F return_x, lNumBots; - STORE_F "::Data::Server::BotSkill", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_S lItem, value, parm0_x; - CALL1 stof; - STORE_F return_x, lSkill; - STORE_F "saved1", parm0_x; - STORE_F "1", parm1_x; - CALL2 cvar_set; - STORE_F KEY_MENU, parm0_x; - STORE_F lNumBots, parm1_x; - CALL2 pow; - SUB_F return_x, FILE_APPEND, parm0_x; - CALL1 ftos; - STORE_F "scratch1", parm0_x; - STORE_F return_x, parm1_x; - CALL2 cvar_set; - STORE_F lNumBots, parm0_x; - STORE_F 8.000000, parm1_x; - CALL2 min; - STORE_F CVAR_READONLY, parm0_x; - STORE_F return_x, parm1_x; - CALL2 pow; - SUB_F return_x, FILE_APPEND, temp_0; - MUL_F lSkill, temp_0, temp_0; - DIV_F temp_0, KEY_UNKNOWN, parm0_x; - CALL1 ftos; - STORE_F "scratch2", parm0_x; - STORE_F return_x, parm1_x; - CALL2 cvar_set; - SUB_F lNumBots, 8.000000, parm0_x; - STORE_F 8.000000, parm1_x; - CALL2 min; - STORE_F CVAR_READONLY, parm0_x; - STORE_F return_x, parm1_x; - CALL2 pow; - SUB_F return_x, FILE_APPEND, temp_0; - MUL_F lSkill, temp_0, temp_0; - DIV_F temp_0, KEY_UNKNOWN, parm0_x; - CALL1 ftos; - STORE_F "scratch3", parm0_x; - STORE_F return_x, parm1_x; - CALL2 cvar_set; - STORE_F "::Data::Server::MaxPlayers", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F "maxplayers "", parm0_x; - CALL1 cmd; - INDIRECT_S lItem, value, parm0_x; - CALL1 cmd; - STORE_F "" -", parm0_x; - CALL1 cmd; - STORE_F "::Data::Server::Map::Cycle", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F "map "", parm0_x; - CALL1 cmd; - INDIRECT_S lItem, valueList, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F return_x, parm0_x; - CALL1 cmd; - STORE_F "" -", parm0_x; - CALL1 cmd; - STORE_F lItem, parm0_x; - STORE_F ITEM_DATA_SEND, parm1_x; - CALL2 Raise_DataEvent; - CALL0 m_hide; - DONE; -} - -void () Nex_Action_Cycle_Add; -void() Nex_Action_Cycle_Add = asm -{ -local string lName; -local string lPath; -local entity lCycle; -local entity lList; -local float temp_0; -local float temp_1; - STORE_F "::Data::Server::Map::List", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lList; - STORE_F "::Data::Server::Map::Cycle", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lCycle; - STORE_F lList, parm0_x; - CALL1 DataLink_Nex_MapList_GetCurrentName; - STORE_S return_x, lName; - STORE_F lList, parm0_x; - CALL1 DataLink_Nex_MapList_GetCurrentPath; - STORE_S return_x, lPath; - INDIRECT_F lCycle, stepValue, temp_0; - EQ_F temp_0, FILE_APPEND, temp_0; - IFNOT temp_0, 6; - STORE_F lCycle, parm0_x; - STORE_F lName, parm1_x; - STORE_F lPath, parm2_x; - CALL3 DataLink_Nex_MapList_InsertEntryAfter; - GOTO 5; - STORE_F lCycle, parm0_x; - STORE_F lName, parm1_x; - STORE_F lPath, parm2_x; - CALL3 DataLink_Nex_MapList_SetFirst; - STORE_F lName, parm0_x; - CALL1 String_Free; - STORE_F lPath, parm0_x; - CALL1 String_Free; - ADDRESS lCycle, _realValue, temp_0; - INDIRECT_F lCycle, _realValue, temp_1; - ADD_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - STORE_F lCycle, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - CALL0 Nex_MapSelector_Synchronize; - DONE; -} - -void () Nex_Action_Cycle_Remove; -void() Nex_Action_Cycle_Remove = asm -{ -local entity lCycle; - STORE_F "::Data::Server::Map::Cycle", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lCycle; - STORE_F lCycle, parm0_x; - CALL1 DataLink_Nex_MapList_DeleteEntry; - CALL0 Nex_MapSelector_Synchronize; - DONE; -} - -void () Nex_Action_Cycle_MoveUp; -void() Nex_Action_Cycle_MoveUp = asm -{ -local entity lCycle; -local float temp_0; -local float temp_1; - STORE_F "::Data::Server::Map::Cycle", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lCycle; - STORE_F lCycle, parm0_x; - CALL1 DataLink_Nex_MapList_MoveEntryUp; - ADDRESS lCycle, _realValue, temp_0; - INDIRECT_F lCycle, _realValue, temp_1; - SUB_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - STORE_F lCycle, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - CALL0 Nex_MapSelector_Synchronize; - DONE; -} - -void () Nex_Action_Cycle_MoveDown; -void() Nex_Action_Cycle_MoveDown = asm -{ -local entity lCycle; -local float temp_0; -local float temp_1; - STORE_F "::Data::Server::Map::Cycle", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lCycle; - STORE_F lCycle, parm0_x; - CALL1 DataLink_Nex_MapList_MoveEntryDown; - ADDRESS lCycle, _realValue, temp_0; - INDIRECT_F lCycle, _realValue, temp_1; - ADD_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - STORE_F lCycle, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - CALL0 Nex_MapSelector_Synchronize; - DONE; -} - -void () Nex_Action_Cycle_Clear; -void() Nex_Action_Cycle_Clear = asm -{ -local entity lCycle; - STORE_F "::Data::Server::Map::Cycle", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lCycle; - STORE_F lCycle, parm0_x; - CALL1 DataLink_Nex_MapList_Clear; - CALL0 Nex_MapSelector_Synchronize; - DONE; -} - -entity (float) Nex_Management_GetFileList; -entity(float pType) Nex_Management_GetFileList = asm -{ -local float temp_0; - GOTO 10; - STORE_F "::Data::Management::FileList::Weapon", parm0_x; - CALL1 Menu_GetItem; - RETURN return_x; - STORE_F "::Data::Management::FileList::Game", parm0_x; - CALL1 Menu_GetItem; - RETURN return_x; - STORE_F "::Data::Management::FileList::MapList", parm0_x; - CALL1 Menu_GetItem; - RETURN return_x; - IFNOT pType, -9; - EQ_F pType, FILE_APPEND, temp_0; - IF temp_0, -8; - EQ_F pType, KEY_MENU, temp_0; - IF temp_0, -7; - CALL0 crash; - RETURN null_entity; - DONE; -} - -entity (float) Nex_Management_GetContainer; -entity(float pType) Nex_Management_GetContainer = asm -{ -local float temp_0; - GOTO 10; - STORE_F "::Data::Weapon", parm0_x; - CALL1 Menu_GetItem; - RETURN return_x; - STORE_F "::Data::Game", parm0_x; - CALL1 Menu_GetItem; - RETURN return_x; - STORE_F "::Data::Server::Map::Cycle", parm0_x; - CALL1 Menu_GetItem; - RETURN return_x; - IFNOT pType, -9; - EQ_F pType, FILE_APPEND, temp_0; - IF temp_0, -8; - EQ_F pType, KEY_MENU, temp_0; - IF temp_0, -7; - CALL0 crash; - RETURN null_entity; - DONE; -} - -float () Nex_Management_GetType; -float() Nex_Management_GetType = asm -{ -local entity lTypeData; -local float temp_0; - STORE_F "::Data::Management::ConfigType", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lTypeData; - INDIRECT_S lTypeData, value, parm0_x; - CALL1 stof; - RETURN return_x; - DONE; -} - -void (float) Nex_Management_SetType; -void(float pType) Nex_Management_SetType = asm -{ -local entity lTypeData; -local entity lList; -local entity lItem; -local float temp_0; - STORE_F "::Data::Management::ConfigType", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lTypeData; - STORE_F pType, parm0_x; - CALL1 ftos; - STORE_F lTypeData, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - STORE_F "FileList", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F pType, parm0_x; - CALL1 Nex_Management_GetFileList; - STORE_ENT return_x, lList; - INDIRECT_S lList, name, temp_0; - STORE_F lItem, parm0_x; - STORE_F target, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () Nex_Update_Management_SyncData; -void() Nex_Update_Management_SyncData = asm -{ -local float temp_0; -local float temp_1; - INDIRECT_F self, _realValue, temp_0; - LT temp_0, Timer_Time, temp_0; - IFNOT temp_0, 3; - INDIRECT_F self, _realValue, temp_1; - GT temp_1, KEY_GAME, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 9; - CALL0 Nex_Management_GetType; - STORE_F return_x, parm0_x; - CALL1 Nex_Management_GetContainer; - STORE_F return_x, parm0_x; - STORE_F ITEM_DATA_SYNC, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS self, _realValue, temp_0; - STOREP_F KEY_GAME, temp_0; - DONE; -} - -void () Nex_Action_Management_LoadConfig; -void() Nex_Action_Management_LoadConfig = asm -{ -local entity lSyncItem; -local entity lFilenameData; -local entity lFileList; -local float temp_0; -local float temp_1; -local float temp_2; - CALL0 Nex_Management_GetType; - STORE_F return_x, parm0_x; - CALL1 Nex_Management_GetFileList; - STORE_ENT return_x, lFileList; - STORE_F "::Data::Management::Filename", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lFilenameData; - INDIRECT_S lFileList, selected, temp_1; - INDIRECT_S lFilenameData, value, temp_2; - INDIRECT_S lFileList, normal, temp_0; - STORE_F "exec "", parm0_x; - STORE_F temp_1, parm1_x; - STORE_F "/", parm2_x; - STORE_F temp_2, parm3_x; - STORE_F ".", parm4_x; - STORE_F temp_0, parm5_x; - STORE_F "" -", parm6_x; - CALL7 strcat; - STORE_F return_x, parm0_x; - CALL1 cmd; - STORE_F "::Data::Management::SyncCategory", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lSyncItem; - ADDRESS lSyncItem, _realValue, temp_0; - STOREP_F Timer_Time, temp_0; - DONE; -} - -void () Nex_Action_Management_Load; -void() Nex_Action_Management_Load = asm -{ -local string lQuestion; -local entity lItem; -local float temp_0; - STORE_F "::Data::Management::Filename", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_S lItem, value, temp_0; - EQ_S temp_0, "", temp_0; - IFNOT temp_0, 9; - STORE_F "Loading", parm0_x; - STORE_F "You must specify a filename!", parm1_x; - STORE_F "Ok", parm2_x; - STORE_F "", parm3_x; - STORE_F Util_NullFunction, parm4_x; - STORE_F Util_NullFunction, parm5_x; - CALL6 Nex_MessageBox; - RETURN offset_0; - INDIRECT_S lItem, value, temp_0; - STORE_F "Do you want to load '", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F "'?", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lQuestion; - STORE_F "Loading", parm0_x; - STORE_F lQuestion, parm1_x; - STORE_F "Yes", parm2_x; - STORE_F "No", parm3_x; - STORE_F Nex_Action_Management_LoadConfig, parm4_x; - STORE_F Util_NullFunction, parm5_x; - CALL6 Nex_MessageBox; - STORE_F lQuestion, parm0_x; - CALL1 String_Free; - DONE; -} - -void () Nex_Action_Management_SaveConfig; -void() Nex_Action_Management_SaveConfig = asm -{ -local float lHandle; -local entity lContainer; -local entity lFilename; -local entity lFileList; -local float lType; -local float temp_0; -local float temp_1; -local float temp_2; - CALL0 Nex_Management_GetType; - STORE_F return_x, lType; - STORE_F lType, parm0_x; - CALL1 Nex_Management_GetFileList; - STORE_ENT return_x, lFileList; - STORE_F lType, parm0_x; - CALL1 Nex_Management_GetContainer; - STORE_ENT return_x, lContainer; - STORE_F "::Data::Management::Filename", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lFilename; - INDIRECT_S lFilename, value, temp_0; - EQ_S temp_0, "", temp_0; - IFNOT temp_0, 9; - STORE_F "Loading", parm0_x; - STORE_F "You must specify a filename!", parm1_x; - STORE_F "Ok", parm2_x; - STORE_F "", parm3_x; - STORE_F Util_NullFunction, parm4_x; - STORE_F Util_NullFunction, parm5_x; - CALL6 Nex_MessageBox; - RETURN offset_0; - INDIRECT_S lFileList, selected, temp_0; - INDIRECT_S lFilename, value, temp_1; - INDIRECT_S lFileList, normal, temp_2; - STORE_F temp_0, parm0_x; - STORE_F "/", parm1_x; - STORE_F temp_1, parm2_x; - STORE_F ".", parm3_x; - STORE_F temp_2, parm4_x; - CALL5 strcat; - STORE_F return_x, parm0_x; - STORE_F KEY_MENU, parm1_x; - CALL2 fopen; - STORE_F return_x, lHandle; - LT lHandle, KEY_GAME, temp_0; - IFNOT temp_0, 2; - RETURN offset_0; - CALL0 Data_ExecString_BeginUse; - STORE_F lContainer, parm0_x; - STORE_F ITEM_DATA_SAVE_EXECSTRING, parm1_x; - CALL2 Raise_DataEvent; - STORE_F lHandle, parm0_x; - STORE_F Data_ExecString, parm1_x; - CALL2 fputs; - CALL0 Data_ExecString_EndUse; - STORE_F lHandle, parm0_x; - CALL1 fclose; - DONE; -} - -void () Nex_Action_Management_Save; -void() Nex_Action_Management_Save = asm -{ -local string lQuestion; -local float lHandle; -local entity lFilename; -local entity lFileList; -local float temp_0; -local float temp_1; -local float temp_2; - CALL0 Nex_Management_GetType; - STORE_F return_x, parm0_x; - CALL1 Nex_Management_GetFileList; - STORE_ENT return_x, lFileList; - STORE_F "::Data::Management::Filename", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lFilename; - INDIRECT_S lFileList, selected, temp_0; - INDIRECT_S lFilename, value, temp_1; - INDIRECT_S lFileList, normal, temp_2; - STORE_F temp_0, parm0_x; - STORE_F "/", parm1_x; - STORE_F temp_1, parm2_x; - STORE_F ".", parm3_x; - STORE_F temp_2, parm4_x; - CALL5 strcat; - STORE_F return_x, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 fopen; - STORE_F return_x, lHandle; - EQ_F lHandle, ERR_CANNOTOPEN, temp_0; - IFNOT temp_0, 5; - CALL0 Nex_Action_Management_SaveConfig; - STORE_F lHandle, parm0_x; - CALL1 fclose; - GOTO 20; - GT lHandle, KEY_GAME, temp_0; - IFNOT temp_0, 18; - INDIRECT_S lFilename, value, temp_0; - STORE_F "Do you want to overwrite '", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F "'?", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lQuestion; - STORE_F "Saving", parm0_x; - STORE_F lQuestion, parm1_x; - STORE_F "Yes", parm2_x; - STORE_F "No", parm3_x; - STORE_F Nex_Action_Management_SaveConfig, parm4_x; - STORE_F Util_NullFunction, parm5_x; - CALL6 Nex_MessageBox; - STORE_F lQuestion, parm0_x; - CALL1 String_Free; - DONE; -} - -void () Nex_Action_Management_Refresh; -void() Nex_Action_Management_Refresh = asm -{ -local entity lItem; - STORE_F "::Data::Management::FileList", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F lItem, parm0_x; - STORE_F ITEM_DATA_SYNC, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Nex_Action_Management_TypeWeapon; -void() Nex_Action_Management_TypeWeapon = asm -{ - STORE_F KEY_GAME, parm0_x; - CALL1 Nex_Management_SetType; - DONE; -} - -void () Nex_Action_Management_TypeGame; -void() Nex_Action_Management_TypeGame = asm -{ - STORE_F FILE_APPEND, parm0_x; - CALL1 Nex_Management_SetType; - DONE; -} - -void () Nex_Action_Management_TypeMapList; -void() Nex_Action_Management_TypeMapList = asm -{ - STORE_F KEY_MENU, parm0_x; - CALL1 Nex_Management_SetType; - DONE; -} - -void () Nex_Automation_Key; -void() Nex_Automation_Key = asm -{ -local entity lLink2; -local entity lLink1; -local entity lAction; -local float temp_0; -local float temp_1; - INDIRECT_E self, _parent, temp_0; - INDIRECT_S temp_0, target, temp_0; - NOT_S temp_0, temp_0; - IFNOT temp_0, 8; - INDIRECT_E self, _parent, temp_0; - INDIRECT_S temp_0, target, temp_0; - STORE_F "Bad target '", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F "'", parm2_x; - CALL3 objerror; - RETURN offset_0; - STORE_F "Action", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lAction; - STORE_F "Link1", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lLink1; - STORE_F "Link2", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lLink2; - ADDRESS lAction, text, temp_0; - INDIRECT_E self, _parent, temp_1; - INDIRECT_S temp_1, text, temp_1; - STOREP_S temp_1, temp_0; - ADDRESS lLink1, link, temp_0; - INDIRECT_E self, _parent, temp_1; - INDIRECT_S temp_1, target, temp_1; - STOREP_S temp_1, temp_0; - ADDRESS lLink2, link, temp_0; - INDIRECT_E self, _parent, temp_1; - INDIRECT_S temp_1, target, temp_1; - STOREP_S temp_1, temp_0; - DONE; -} - -void (float, float) Nex_Key_KeyHook; -void(float pKey, float pAscii) Nex_Key_KeyHook = asm -{ -local entity lItem; -local float temp_0; -local float temp_1; - NE_F pKey, K_ESCAPE, temp_0; - IFNOT temp_0, 13; - STORE_F pKey, parm0_x; - CALL1 ftos; - STORE_F Menu_KeyHook_Target, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - STORE_F Menu_KeyHook_Target, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - STORE_F Menu_KeyHook_Target, parm0_x; - STORE_F ITEM_DATA_TEST_START, parm1_x; - CALL2 Raise_DataEvent; - STORE_F Menu_KeyHook_Target, parm0_x; - STORE_F "InfoWindow", parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 Menu_GetItemEx; - STORE_ENT return_x, lItem; - ADDRESS lItem, flag, temp_0; - INDIRECT_F lItem, flag, temp_1; - BITOR temp_1, FLAG_HIDDEN, temp_1; - STOREP_F temp_1, temp_0; - STORE_FNC Util_NullFunction, Menu_KeyHook; - DONE; -} - -void () Nex_Action_KeyButton; -void() Nex_Action_KeyButton = asm -{ -local entity lItem; -local float temp_0; -local float temp_1; -local float temp_2; - INDIRECT_E self, _target, temp_0; - INDIRECT_E temp_0, _link, Menu_KeyHook_Target; - STORE_FNC Nex_Key_KeyHook, Menu_KeyHook; - STORE_F "InfoWindow", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - ADDRESS lItem, flag, temp_0; - INDIRECT_F lItem, flag, temp_1; - INDIRECT_F lItem, flag, temp_2; - BITAND temp_2, FLAG_HIDDEN, temp_2; - SUB_F temp_1, temp_2, temp_1; - STOREP_F temp_1, temp_0; - DONE; -} - -void () Nex_Action_Video_Apply; -void() Nex_Action_Video_Apply = asm -{ - STORE_F "::Data::Video::Fullscreen", parm0_x; - CALL1 Menu_GetItem; - STORE_F return_x, parm0_x; - STORE_F ITEM_DATA_SEND, parm1_x; - CALL2 Raise_DataEvent; - STORE_F "::Data::Video::Resolution", parm0_x; - CALL1 Menu_GetItem; - STORE_F return_x, parm0_x; - STORE_F ITEM_DATA_SEND, parm1_x; - CALL2 Raise_DataEvent; - STORE_F "::Data::Video::BPP", parm0_x; - CALL1 Menu_GetItem; - STORE_F return_x, parm0_x; - STORE_F ITEM_DATA_SEND, parm1_x; - CALL2 Raise_DataEvent; - STORE_F "vid_restart -", parm0_x; - CALL1 cmd; - DONE; -} - -void () Nex_Action_JoinGame_SortBy_Action; -void() Nex_Action_JoinGame_SortBy_Action = asm -{ -local float temp_0; -local float temp_1; - INDIRECT_F self, _realValue, temp_0; - EQ_F HostCache_SortField, temp_0, temp_0; - IFNOT temp_0, 7; - INDIRECT_F self, _realValue, temp_0; - NOT_F HostCache_SortDescending, temp_1; - STORE_F temp_0, parm0_x; - STORE_F temp_1, parm1_x; - CALL2 sethostcachesort; - GOTO 4; - INDIRECT_F self, _realValue, parm0_x; - STORE_F FILE_APPEND, parm1_x; - CALL2 sethostcachesort; - CALL0 HostCache_ResortViewSet; - DONE; -} - -void () Nex_Action_JoinGame_SortBy; -void() Nex_Action_JoinGame_SortBy = asm -{ -local float locked_1174; -local float temp_1; - ADDRESS self, _realValue, locked_1174; - INDIRECT_S self, target, parm0_x; - CALL1 gethostcacheindexforkey; - STOREP_F return_x, locked_1174; - ADDRESS self, action, locked_1174; - STOREP_FNC Nex_Action_JoinGame_SortBy_Action, locked_1174; - DONE; -} - -void () Nex_Automation_CreateEntries; -void() Nex_Automation_CreateEntries = asm -{ -local entity lEntry; -local float lCounter; -local entity lTemplate; -local float temp_0; - STORE_F "Entry", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lTemplate; - STORE_F KEY_GAME, lCounter; - LT lCounter, 64.000000, temp_0; - IFNOT temp_0, 17; - STORE_F lCounter, parm0_x; - CALL1 ftos; - STORE_F "Entry", parm0_x; - STORE_F return_x, parm1_x; - CALL2 strcat; - INDIRECT_S self, parent, temp_0; - STORE_F lTemplate, parm0_x; - STORE_F return_x, parm1_x; - STORE_F temp_0, parm2_x; - STORE_F FILE_APPEND, parm3_x; - CALL4 Menu_DeriveItem; - STORE_ENT return_x, lEntry; - ADDRESS lEntry, stepValue, temp_0; - STOREP_F lCounter, temp_0; - ADD_F lCounter, FILE_APPEND, lCounter; - GOTO -17; - INDIRECT_E self, _parent, parm0_x; - CALL1 Menu_LinkItem; - DONE; -} - -void () Nex_Action_EntryConnect; -void() Nex_Action_EntryConnect = asm -{ -local float temp_0; - STORE_F "connect "", parm0_x; - CALL1 cmd; - INDIRECT_F self, stepValue, temp_0; - STORE_F SLIST_FIELD_CNAME, parm0_x; - STORE_F temp_0, parm1_x; - CALL2 gethostcachestring; - STORE_F return_x, parm0_x; - CALL1 cmd; - STORE_F "" -", parm0_x; - CALL1 cmd; - CALL0 m_hide; - DONE; -} - -void () Nex_Action_RefreshSlist; -void() Nex_Action_RefreshSlist = asm -{ - CALL0 HostCache_RefreshHostCache; - DONE; -} - -void () Nex_Action_JumpToJoinGame; -void() Nex_Action_JumpToJoinGame = asm -{ -local entity lItem; -local float temp_0; - CALL0 resethostcachemasks; - STORE_F SLIST_FIELD_PING, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 sethostcachesort; - CALL0 HostCache_RefreshHostCache; - STORE_F "Normal::Panel", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F lItem, parm0_x; - STORE_F link, parm1_x; - STORE_F "JoinGame", parm2_x; - CALL3 String_EntitySet; - STORE_F lItem, parm0_x; - CALL1 Raise_Update; - CALL0 Menu_UpdateRunFlags; - INDIRECT_E lItem, _link, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 Menu_JumpToWindow; - DONE; -} - -void () Nex_Action_ExecuteQuery; -void() Nex_Action_ExecuteQuery = asm -{ -local bool lIsStringArg; -local float lOperator; -local float lField; -local bool lAndMask; -local string lToken; -local float lTokenCount; -local float lTokenNum; -local float lOrPos; -local float lAndPos; -local float temp_0; -local float temp_1; - CALL0 resethostcachemasks; - STORE_F KEY_GAME, lAndPos; - STORE_F K_MOUSE1, lOrPos; - INDIRECT_E self, _target, temp_0; - INDIRECT_S temp_0, value, parm0_x; - CALL1 tokenize; - STORE_F return_x, lTokenCount; - STORE_F KEY_GAME, lTokenNum; - LT lTokenNum, lTokenCount, temp_0; - IFNOT temp_0, 223; - STORE_F lTokenNum, parm0_x; - CALL1 argv; - STORE_S return_x, lToken; - EQ_S lToken, "notempty", temp_0; - IFNOT temp_0, 8; - STORE_F lAndPos, parm0_x; - STORE_F SLIST_FIELD_NUMPLAYERS, parm1_x; - STORE_F KEY_GAME, parm2_x; - STORE_F SLIST_SORTDESCENDING, parm3_x; - CALL4 sethostcachemasknumber; - ADD_F lAndPos, FILE_APPEND, lAndPos; - GOTO 209; - EQ_S lToken, "compatible", temp_0; - IFNOT temp_0, 8; - STORE_F lAndPos, parm0_x; - STORE_F SLIST_FIELD_PROTOCOL, parm1_x; - STORE_F KEY_UNKNOWN, parm2_x; - STORE_F CVAR_READONLY, parm3_x; - CALL4 sethostcachemasknumber; - ADD_F lAndPos, FILE_APPEND, lAndPos; - GOTO 200; - EQ_S lToken, "goodping", temp_0; - IFNOT temp_0, 8; - STORE_F lAndPos, parm0_x; - STORE_F SLIST_FIELD_PING, parm1_x; - STORE_F K_PGUP, parm2_x; - STORE_F KEY_MENU, parm3_x; - CALL4 sethostcachemasknumber; - ADD_F lAndPos, FILE_APPEND, lAndPos; - GOTO 191; - EQ_S lToken, "mediumping", temp_0; - IFNOT temp_0, 8; - STORE_F lAndPos, parm0_x; - STORE_F SLIST_FIELD_PROTOCOL, parm1_x; - STORE_F 250.000000, parm2_x; - STORE_F KEY_MENU, parm3_x; - CALL4 sethostcachemasknumber; - ADD_F lAndPos, FILE_APPEND, lAndPos; - GOTO 182; - EQ_S lToken, "mask", temp_0; - IFNOT temp_0, 168; - ADD_F lTokenNum, FILE_APPEND, lTokenNum; - GT lTokenNum, lTokenCount, temp_0; - IFNOT temp_0, 3; - GOTO 178; - GOTO 4; - STORE_F lTokenNum, parm0_x; - CALL1 argv; - STORE_S return_x, lToken; - EQ_S lToken, "or", temp_0; - IFNOT temp_0, 3; - STORE_F KEY_GAME, lAndMask; - GOTO 6; - EQ_S lToken, "and", temp_0; - IFNOT temp_0, 3; - STORE_F FILE_APPEND, lAndMask; - GOTO 2; - GOTO 165; - ADD_F lTokenNum, FILE_APPEND, lTokenNum; - GT lTokenNum, lTokenCount, temp_0; - IFNOT temp_0, 3; - GOTO 161; - GOTO 4; - STORE_F lTokenNum, parm0_x; - CALL1 argv; - STORE_S return_x, lToken; - EQ_S lToken, "cname", temp_0; - IFNOT temp_0, 4; - STORE_F SLIST_FIELD_CNAME, lField; - STORE_F FILE_APPEND, lIsStringArg; - GOTO 46; - EQ_S lToken, "ping", temp_0; - IFNOT temp_0, 4; - STORE_F SLIST_FIELD_PING, lField; - STORE_F KEY_GAME, lIsStringArg; - GOTO 41; - EQ_S lToken, "game", temp_0; - IFNOT temp_0, 4; - STORE_F SLIST_FIELD_GAME, lField; - STORE_F FILE_APPEND, lIsStringArg; - GOTO 36; - EQ_S lToken, "mod", temp_0; - IFNOT temp_0, 4; - STORE_F SLIST_FIELD_MOD, lField; - STORE_F FILE_APPEND, lIsStringArg; - GOTO 31; - EQ_S lToken, "map", temp_0; - IFNOT temp_0, 4; - STORE_F SLIST_FIELD_MAP, lField; - STORE_F FILE_APPEND, lIsStringArg; - GOTO 26; - EQ_S lToken, "name", temp_0; - IFNOT temp_0, 4; - STORE_F SLIST_FIELD_NAME, lField; - STORE_F FILE_APPEND, lIsStringArg; - GOTO 21; - EQ_S lToken, "maxplayers", temp_0; - IFNOT temp_0, 4; - STORE_F SLIST_FIELD_MAXPLAYERS, lField; - STORE_F KEY_GAME, lIsStringArg; - GOTO 16; - EQ_S lToken, "numplayers", temp_0; - IFNOT temp_0, 4; - STORE_F SLIST_FIELD_NUMPLAYERS, lField; - STORE_F KEY_GAME, lIsStringArg; - GOTO 11; - EQ_S lToken, "protocol", temp_0; - IFNOT temp_0, 4; - STORE_F SLIST_FIELD_PROTOCOL, lField; - STORE_F KEY_GAME, lIsStringArg; - GOTO 6; - IFNOT lAndMask, 3; - ADD_F lAndPos, FILE_APPEND, lAndPos; - GOTO 2; - ADD_F lOrPos, FILE_APPEND, lOrPos; - GOTO 91; - ADD_F lTokenNum, FILE_APPEND, lTokenNum; - GT lTokenNum, lTokenCount, temp_0; - IFNOT temp_0, 3; - GOTO 103; - GOTO 4; - STORE_F lTokenNum, parm0_x; - CALL1 argv; - STORE_S return_x, lToken; - EQ_S lToken, "$$", temp_0; - IFNOT temp_0, 3; - STORE_F KEY_GAME, lOperator; - GOTO 40; - EQ_S lToken, "!$", temp_0; - IFNOT temp_0, 3; - STORE_F FILE_APPEND, lOperator; - GOTO 36; - EQ_S lToken, "<", temp_0; - IFNOT temp_0, 3; - STORE_F KEY_UNKNOWN, lOperator; - GOTO 32; - EQ_S lToken, "<=", temp_0; - IFNOT temp_0, 3; - STORE_F KEY_MENU, lOperator; - GOTO 28; - EQ_S lToken, "==", temp_0; - IF temp_0, 2; - EQ_S lToken, "=", temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 3; - STORE_F CVAR_READONLY, lOperator; - GOTO 21; - EQ_S lToken, ">", temp_0; - IFNOT temp_0, 3; - STORE_F SLIST_SERVERREPLYCOUNT, lOperator; - GOTO 17; - EQ_S lToken, ">=", temp_0; - IFNOT temp_0, 3; - STORE_F SLIST_SORTFIELD, lOperator; - GOTO 13; - EQ_S lToken, "!=", temp_0; - IFNOT temp_0, 3; - STORE_F SLIST_SORTDESCENDING, lOperator; - GOTO 9; - EQ_S lToken, ":", temp_0; - IFNOT temp_0, 6; - IFNOT lIsStringArg, 3; - STORE_F KEY_GAME, lOperator; - GOTO 2; - STORE_F KEY_MENU, lOperator; - GOTO 2; - GOTO 56; - ADD_F lTokenNum, FILE_APPEND, lTokenNum; - GT lTokenNum, lTokenCount, temp_0; - IFNOT temp_0, 3; - GOTO 52; - GOTO 4; - STORE_F lTokenNum, parm0_x; - CALL1 argv; - STORE_S return_x, lToken; - IFNOT lIsStringArg, 14; - IFNOT lAndMask, 7; - STORE_F lAndPos, parm0_x; - STORE_F lField, parm1_x; - STORE_F lToken, parm2_x; - STORE_F lOperator, parm3_x; - CALL4 sethostcachemaskstring; - GOTO 6; - STORE_F lOrPos, parm0_x; - STORE_F lField, parm1_x; - STORE_F lToken, parm2_x; - STORE_F lOperator, parm3_x; - CALL4 sethostcachemaskstring; - GOTO 17; - IFNOT lAndMask, 9; - STORE_F lToken, parm0_x; - CALL1 stof; - STORE_F lAndPos, parm0_x; - STORE_F lField, parm1_x; - STORE_F return_x, parm2_x; - STORE_F lOperator, parm3_x; - CALL4 sethostcachemasknumber; - GOTO 8; - STORE_F lToken, parm0_x; - CALL1 stof; - STORE_F lOrPos, parm0_x; - STORE_F lField, parm1_x; - STORE_F return_x, parm2_x; - STORE_F lOperator, parm3_x; - CALL4 sethostcachemasknumber; - GOTO -147; - GOTO -157; - GOTO 13; - STORE_F lOrPos, parm0_x; - STORE_F SLIST_FIELD_MAP, parm1_x; - STORE_F lToken, parm2_x; - STORE_F KEY_GAME, parm3_x; - CALL4 sethostcachemaskstring; - ADD_F lOrPos, FILE_APPEND, lOrPos; - STORE_F lOrPos, parm0_x; - STORE_F SLIST_FIELD_NAME, parm1_x; - STORE_F lToken, parm2_x; - STORE_F KEY_GAME, parm3_x; - CALL4 sethostcachemaskstring; - ADD_F lOrPos, FILE_APPEND, lOrPos; - ADD_F lTokenNum, FILE_APPEND, lTokenNum; - GOTO -223; - CALL0 HostCache_ResortViewSet; - DONE; -} - -void () Nex_Credits_SetSizeX; -void() Nex_Credits_SetSizeX = asm -{ -local entity lItem; -local float temp_0; -local float temp_1; - STORE_F "Credits", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - ADDRESS lItem, size_x, temp_0; - INDIRECT_E self, _parent, temp_1; - INDIRECT_F temp_1, size_x, temp_1; - STOREP_F temp_1, temp_0; - DONE; -} - -void () Nex_Credits_Scroll; -void() Nex_Credits_Scroll = asm -{ -local entity lTarget; -local entity lItem; -local vector temp_0; -local vector temp_1; -local vector temp_2; -local float temp_3; -local float temp_4; - STORE_F "Credits", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_E self, _parent, lTarget; - ADDRESS lTarget, origin_x, temp_2_x; - INDIRECT_V lTarget, origin_x, temp_1; - INDIRECT_V self, direction_x, temp_0; - MUL_FV Timer_Delta, temp_0, temp_0; - SUB_V temp_1, temp_0, temp_0; - STOREP_V temp_0_x, temp_2; - INDIRECT_F self, direction_x, temp_3; - IFNOT temp_3, 17; - INDIRECT_F lTarget, origin_x, temp_3; - INDIRECT_F lItem, size_x, temp_4; - SUB_F KEY_GAME, temp_4, temp_4; - LT temp_3, temp_4, temp_3; - IFNOT temp_3, 4; - ADDRESS lTarget, origin_x, temp_3; - INDIRECT_F lTarget, size_x, temp_4; - STOREP_F temp_4, temp_3; - INDIRECT_F lTarget, origin_x, temp_3; - INDIRECT_F lItem, size_x, temp_4; - GT temp_3, temp_4, temp_3; - IFNOT temp_3, 5; - ADDRESS lTarget, origin_x, temp_3; - INDIRECT_F lItem, size_x, temp_4; - SUB_F KEY_GAME, temp_4, temp_4; - STOREP_F temp_4, temp_3; - INDIRECT_F self, direction_y, temp_3; - IFNOT temp_3, 17; - INDIRECT_F lTarget, origin_y, temp_3; - INDIRECT_F lItem, size_y, temp_4; - SUB_F KEY_GAME, temp_4, temp_4; - LT temp_3, temp_4, temp_3; - IFNOT temp_3, 4; - ADDRESS lTarget, origin_y, temp_3; - INDIRECT_F lTarget, size_y, temp_4; - STOREP_F temp_4, temp_3; - INDIRECT_F lTarget, origin_y, temp_3; - INDIRECT_F lItem, size_y, temp_4; - GT temp_3, temp_4, temp_3; - IFNOT temp_3, 5; - ADDRESS lTarget, origin_y, temp_3; - INDIRECT_F lItem, size_y, temp_4; - SUB_F KEY_GAME, temp_4, temp_4; - STOREP_F temp_4, temp_3; - DONE; -} - -void () Nex_Credits_Toggle; -void() Nex_Credits_Toggle = asm -{ -local entity lEntity; -local float temp_3; -local float temp_4; - STORE_F "CreditsWnd", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lEntity; - INDIRECT_F lEntity, flag, temp_3; - BITAND temp_3, FLAG_HIDDEN, temp_3; - IFNOT temp_3, 11; - ADDRESS lEntity, flag, temp_3; - INDIRECT_F lEntity, flag, temp_4; - SUB_F temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - STORE_F "CreditsWnd::Layout::Items::Close", parm0_x; - CALL1 Menu_GetItem; - STORE_F return_x, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 Menu_Select; - GOTO 7; - ADDRESS lEntity, flag, temp_3; - INDIRECT_F lEntity, flag, temp_4; - ADD_F temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - STORE_F KEY_GAME, parm0_x; - CALL1 Menu_Reselect; - DONE; -} - -float (float, float) Nex_Credits_Key; -float(float pKey, float pAscii) Nex_Credits_Key = asm -{ -local float temp_3; - EQ_F pKey, K_ESCAPE, temp_3; - IFNOT temp_3, 3; - CALL0 Nex_Credits_Toggle; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void () Nex_Credits_Action; -void() Nex_Credits_Action = asm -{ -local entity lEntity; -local float temp_3; -local float temp_4; - STORE_F "CreditsWnd", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lEntity; - INDIRECT_F lEntity, flag, temp_3; - BITAND temp_3, FLAG_HIDDEN, temp_3; - IFNOT temp_3, 5; - ADDRESS lEntity, flag, temp_3; - INDIRECT_F lEntity, flag, temp_4; - SUB_F temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - STORE_F "CreditsWnd::Layout::Items::Close", parm0_x; - CALL1 Menu_GetItem; - STORE_F return_x, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 Menu_Select; - STORE_F "CreditsWnd::Layout::Items::Scroller", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lEntity; - ADDRESS lEntity, origin_y, temp_3; - INDIRECT_F lEntity, size_y, temp_4; - STOREP_F temp_4, temp_3; - DONE; -} - -void() Item_Nex_Avatar_Info_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F link, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F picture, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F text, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_Nex_Avatar_Info_Spawn = asm -{ -local float temp_3; - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F link, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F picture, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F text, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - CALL2 String_EntityZone; - INDIRECT_S self, picture, parm0_x; - CALL1 Gfx_Precache; - ADDRESS self, _destroy, temp_3; - STOREP_FNC Item_Nex_Avatar_Info_Destroy, temp_3; - DONE; -} - -void () _IDNA_BuildList; -void() _IDNA_BuildList = asm -{ -local float locked_1174; -local string lLine; -local string lDescription; -local string lModel; -local string lSkin; -local string lPicture; -local string lName; -local float lHandle; -local string lFilename; -local entity lAvatar; -local float lSearchCounter; -local float lSearchSize; -local float lSearchHandle; -local float temp_4; - STORE_F self, parm0_x; - CALL1 Menu_EmptyWindow; - STORE_F "models/player/*.txt", parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 search_begin; - STORE_F return_x, lSearchHandle; - LT lSearchHandle, KEY_GAME, locked_1174; - IFNOT locked_1174, 2; - RETURN offset_0; - STORE_F lSearchHandle, parm0_x; - CALL1 search_getsize; - STORE_F return_x, lSearchSize; - STORE_F KEY_GAME, lSearchCounter; - LT lSearchCounter, lSearchSize, locked_1174; - IFNOT locked_1174, 116; - STORE_F lSearchHandle, parm0_x; - STORE_F lSearchCounter, parm1_x; - CALL2 search_getfilename; - STORE_S return_x, lFilename; - STORE_F lFilename, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 fopen; - STORE_F return_x, lHandle; - LT lHandle, KEY_GAME, locked_1174; - IFNOT locked_1174, 6; - STORE_F "Menu: Couldn't open model definition file '", parm0_x; - STORE_F lFilename, parm1_x; - STORE_F "' -", parm2_x; - CALL3 print; - GOTO 99; - STORE_F lHandle, parm0_x; - CALL1 fgets; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lName; - STORE_F lHandle, parm0_x; - CALL1 fgets; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lPicture; - STORE_F lHandle, parm0_x; - CALL1 fgets; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lSkin; - STORE_F lHandle, parm0_x; - CALL1 fgets; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lModel; - NOT_S lName, locked_1174; - IF locked_1174, 2; - NOT_S lPicture, temp_4; - OR locked_1174, temp_4, locked_1174; - IF locked_1174, 2; - NOT_S lSkin, temp_4; - OR locked_1174, temp_4, locked_1174; - IF locked_1174, 2; - NOT_S lModel, temp_4; - OR locked_1174, temp_4, locked_1174; - IFNOT locked_1174, 19; - STORE_F lName, parm0_x; - CALL1 String_Free; - STORE_F lPicture, parm0_x; - CALL1 String_Free; - STORE_F lSkin, parm0_x; - CALL1 String_Free; - STORE_F lModel, parm0_x; - CALL1 String_Free; - STORE_F lSearchHandle, parm0_x; - STORE_F lSearchCounter, parm1_x; - CALL2 search_getfilename; - STORE_F "Menu: Couldn't parse model definition file '", parm0_x; - STORE_F return_x, parm1_x; - STORE_F "' -", parm2_x; - CALL3 print; - STORE_F lHandle, parm0_x; - CALL1 fclose; - GOTO 50; - CALL0 String_Create; - STORE_S return_x, lDescription; - STORE_F lHandle, parm0_x; - CALL1 fgets; - STORE_S return_x, lLine; - STORE_F lLine, parm0_x; - STORE_F " -", parm1_x; - CALL2 strcat; - STORE_F lDescription, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Append; - STORE_S return_x, lDescription; - STORE_F lLine, parm0_x; - CALL1 validstring; - IF return_x, -12; - NE_S lDescription, string_null, locked_1174; - IFNOT locked_1174, 21; - STORE_F lSearchCounter, parm0_x; - CALL1 ftos; - INDIRECT_S self, name, locked_1174; - STORE_F "Item_Nex_Avatar_Info", parm0_x; - STORE_F return_x, parm1_x; - STORE_F locked_1174, parm2_x; - CALL3 Menu_CreateItem; - STORE_ENT return_x, lAvatar; - ADDRESS lAvatar, target, locked_1174; - STOREP_S lModel, locked_1174; - ADDRESS lAvatar, link, locked_1174; - STOREP_S lSkin, locked_1174; - ADDRESS lAvatar, picture, locked_1174; - STOREP_S lPicture, locked_1174; - ADDRESS lAvatar, normal, locked_1174; - STOREP_S lName, locked_1174; - ADDRESS lAvatar, text, locked_1174; - STOREP_S lDescription, locked_1174; - STORE_F lAvatar, parm0_x; - CALL1 Menu_LinkItem; - STORE_F lName, parm0_x; - CALL1 String_Free; - STORE_F lPicture, parm0_x; - CALL1 String_Free; - STORE_F lSkin, parm0_x; - CALL1 String_Free; - STORE_F lModel, parm0_x; - CALL1 String_Free; - STORE_F lDescription, parm0_x; - CALL1 String_Free; - STORE_F lHandle, parm0_x; - CALL1 fclose; - ADD_F lSearchCounter, FILE_APPEND, lSearchCounter; - GOTO -116; - STORE_F lSearchHandle, parm0_x; - CALL1 search_end; - STORE_F self, parm0_x; - CALL1 Menu_LinkChildren; - ADDRESS self, minValue, locked_1174; - STOREP_F FILE_APPEND, locked_1174; - ADDRESS self, stepValue, locked_1174; - STOREP_F FILE_APPEND, locked_1174; - ADDRESS self, maxValue, locked_1174; - INDIRECT_F lAvatar, orderPos, parm0_x; - CALL1 fabs; - STOREP_F return_x, locked_1174; - DONE; -} - -void () _IDNA_Sync; -void() _IDNA_Sync = asm -{ -local float locked_1174; -local entity lMatch; -local string lSkin; -local string lModel; -local float temp_4; - STORE_F "_cl_playermodel", parm0_x; - CALL1 str_cvar; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lModel; - STORE_F "_cl_playerskin", parm0_x; - CALL1 str_cvar; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lSkin; - INDIRECT_E self, _child, lMatch; - INDIRECT_E lMatch, _next, locked_1174; - IFNOT locked_1174, 11; - INDIRECT_S lMatch, target, locked_1174; - EQ_S locked_1174, lModel, locked_1174; - IFNOT locked_1174, 3; - INDIRECT_S lMatch, link, temp_4; - EQ_S temp_4, lSkin, temp_4; - AND locked_1174, temp_4, locked_1174; - IFNOT locked_1174, 2; - GOTO 3; - INDIRECT_E lMatch, _next, lMatch; - GOTO -11; - IFNOT lMatch, 18; - ADDRESS self, _link, locked_1174; - STOREP_ENT lMatch, locked_1174; - ADDRESS self, _realValue, locked_1174; - INDIRECT_F lMatch, orderPos, parm0_x; - CALL1 fabs; - STOREP_F return_x, locked_1174; - INDIRECT_F self, _realValue, parm0_x; - CALL1 ftos; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - INDIRECT_S self, value, locked_1174; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F locked_1174, parm2_x; - CALL3 String_EntitySet; - STORE_F lModel, parm0_x; - CALL1 String_Free; - STORE_F lSkin, parm0_x; - CALL1 String_Free; - DONE; -} - -void () _IDNA_UpdateLink; -void() _IDNA_UpdateLink = asm -{ -local float locked_1174; -local entity lMatch; -local float lTarget; -local float lCurrent; -local float temp_4; - INDIRECT_E self, _link, locked_1174; - INDIRECT_F locked_1174, orderPos, parm0_x; - CALL1 fabs; - STORE_F return_x, lCurrent; - INDIRECT_F self, _realValue, lTarget; - LT lCurrent, lTarget, locked_1174; - IFNOT locked_1174, 12; - INDIRECT_E self, _link, lMatch; - INDIRECT_E lMatch, _next, locked_1174; - IFNOT locked_1174, 4; - INDIRECT_F lMatch, orderPos, parm0_x; - CALL1 fabs; - NE_F return_x, lTarget, temp_4; - AND locked_1174, temp_4, locked_1174; - IFNOT locked_1174, 3; - INDIRECT_E lMatch, _next, lMatch; - GOTO -8; - GOTO 11; - INDIRECT_E self, _link, lMatch; - INDIRECT_E lMatch, _prev, locked_1174; - IFNOT locked_1174, 4; - INDIRECT_F lMatch, orderPos, parm0_x; - CALL1 fabs; - NE_F return_x, lTarget, temp_4; - AND locked_1174, temp_4, locked_1174; - IFNOT locked_1174, 3; - INDIRECT_E lMatch, _prev, lMatch; - GOTO -8; - ADDRESS self, _link, locked_1174; - STOREP_ENT lMatch, locked_1174; - ADDRESS self, _realValue, locked_1174; - INDIRECT_E self, _link, temp_4; - INDIRECT_F temp_4, orderPos, parm0_x; - CALL1 fabs; - STOREP_F return_x, locked_1174; - INDIRECT_F self, _realValue, parm0_x; - CALL1 ftos; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () _IDNA_RawSet; -void() _IDNA_RawSet = asm -{ -local float temp_3; - CALL0 _IDNA_UpdateLink; - INDIRECT_E self, _link, temp_3; - INDIRECT_S temp_3, target, temp_3; - STORE_F "playermodel "", parm0_x; - STORE_F temp_3, parm1_x; - STORE_F "";", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 cmd; - INDIRECT_E self, _link, temp_3; - INDIRECT_S temp_3, link, temp_3; - STORE_F "playerskin "", parm0_x; - STORE_F temp_3, parm1_x; - STORE_F "" -", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 cmd; - DONE; -} - -void () _IDNA_Send; -void() _IDNA_Send = asm -{ -local float temp_3; - CALL0 _IDNA_RawSet; - INDIRECT_S self, value, temp_3; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () _IDNA_Test_Start; -void() _IDNA_Test_Start = asm -{ - CALL0 _IDNA_RawSet; - DONE; -} - -void () _IDNA_Test_End; -void() _IDNA_Test_End = asm -{ -local float temp_3; - INDIRECT_S self, _syncValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - CALL0 _IDNA_RawSet; - DONE; -} - -void () _IDNA_Reset; -void() _IDNA_Reset = asm -{ -local float temp_3; - INDIRECT_S self, defValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - CALL0 _IDNA_Send; - DONE; -} - -void(float pEvent) Item_Data_Nex_Avatar_DataEvent = asm -{ -local float temp_3; - GOTO 13; - CALL0 _IDNA_Sync; - GOTO 22; - CALL0 _IDNA_Send; - GOTO 20; - CALL0 _IDNA_Reset; - GOTO 18; - CALL0 _IDNA_Test_Start; - GOTO 16; - CALL0 _IDNA_Test_End; - GOTO 14; - CALL0 _IDNA_UpdateLink; - GOTO 12; - IFNOT pEvent, -12; - EQ_F pEvent, ITEM_DATA_SEND, temp_3; - IF temp_3, -12; - EQ_F pEvent, ITEM_DATA_RESET, temp_3; - IF temp_3, -12; - EQ_F pEvent, ITEM_DATA_TEST_START, temp_3; - IF temp_3, -12; - EQ_F pEvent, ITEM_DATA_TEST_END, temp_3; - IF temp_3, -12; - EQ_F pEvent, ITEM_DATALINK_SET, temp_3; - IF temp_3, -12; - DONE; -} - -void() Item_Data_Nex_Avatar_Spawn = asm -{ -local float temp_3; -local float temp_4; - CALL0 Item_Data_Init; - ADDRESS self, flag, temp_3; - INDIRECT_F self, flag, temp_4; - BITOR temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - ADDRESS self, _reinit, temp_3; - STOREP_FNC _IDNA_Sync, temp_3; - ADDRESS self, _dataEvent, temp_3; - STOREP_FNC Item_Data_Nex_Avatar_DataEvent, temp_3; - CALL0 _IDNA_BuildList; - DONE; -} - -void () _IDNN_Sync; -void() _IDNN_Sync = asm -{ -local float temp_3; - STORE_F "_cl_name", parm0_x; - CALL1 str_cvar; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - INDIRECT_S self, value, temp_3; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () _IDNN_Send; -void() _IDNN_Send = asm -{ -local float temp_3; - INDIRECT_S self, value, temp_3; - STORE_F "name "", parm0_x; - STORE_F temp_3, parm1_x; - STORE_F "" -", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 cmd; - INDIRECT_S self, value, temp_3; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () _IDNN_Test_Start; -void() _IDNN_Test_Start = asm -{ -local float temp_3; - INDIRECT_S self, value, temp_3; - STORE_F "name "", parm0_x; - STORE_F temp_3, parm1_x; - STORE_F "" -", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 cmd; - DONE; -} - -void () _IDNN_Test_End; -void() _IDNN_Test_End = asm -{ -local float temp_3; - INDIRECT_S self, _syncValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - INDIRECT_S self, value, temp_3; - STORE_F "name "", parm0_x; - STORE_F temp_3, parm1_x; - STORE_F "" -", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 cmd; - DONE; -} - -void () _IDNN_Reset; -void() _IDNN_Reset = asm -{ -local float temp_3; - INDIRECT_S self, defValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - CALL0 _IDNN_Send; - DONE; -} - -void(float pEvent) Item_Data_Nex_Name_DataEvent = asm -{ -local float temp_3; - GOTO 11; - CALL0 _IDNN_Sync; - GOTO 18; - CALL0 _IDNN_Send; - GOTO 16; - CALL0 _IDNN_Reset; - GOTO 14; - CALL0 _IDNN_Test_Start; - GOTO 12; - CALL0 _IDNN_Test_End; - GOTO 10; - IFNOT pEvent, -10; - EQ_F pEvent, ITEM_DATA_SEND, temp_3; - IF temp_3, -10; - EQ_F pEvent, ITEM_DATA_RESET, temp_3; - IF temp_3, -10; - EQ_F pEvent, ITEM_DATA_TEST_START, temp_3; - IF temp_3, -10; - EQ_F pEvent, ITEM_DATA_TEST_END, temp_3; - IF temp_3, -10; - DONE; -} - -void() Item_Data_Nex_Name_Spawn = asm -{ -local float temp_3; - CALL0 Item_Data_Init; - ADDRESS self, _reinit, temp_3; - STOREP_FNC _IDNN_Sync, temp_3; - ADDRESS self, _dataEvent, temp_3; - STOREP_FNC Item_Data_Nex_Name_DataEvent, temp_3; - DONE; -} - -void () _IDNC_Sync; -void() _IDNC_Sync = asm -{ -local float lPants; -local float temp_3; - STORE_F "_cl_color", parm0_x; - CALL1 cvar; - BITAND return_x, 15.000000, lPants; - STORE_F lPants, parm0_x; - CALL1 ftos; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - INDIRECT_S self, value, temp_3; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () _IDNC_Send; -void() _IDNC_Send = asm -{ -local float temp_3; - INDIRECT_S self, value, temp_3; - STORE_F "color "", parm0_x; - STORE_F temp_3, parm1_x; - STORE_F "" -", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 cmd; - INDIRECT_S self, value, temp_3; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () _IDNC_Test_Start; -void() _IDNC_Test_Start = asm -{ -local float temp_3; - INDIRECT_S self, value, temp_3; - STORE_F "color "", parm0_x; - STORE_F temp_3, parm1_x; - STORE_F "" -", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 cmd; - DONE; -} - -void () _IDNC_Test_End; -void() _IDNC_Test_End = asm -{ -local float temp_3; - INDIRECT_S self, _syncValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - INDIRECT_S self, value, temp_3; - STORE_F "color "", parm0_x; - STORE_F temp_3, parm1_x; - STORE_F "" -", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 cmd; - DONE; -} - -void () _IDNC_Reset; -void() _IDNC_Reset = asm -{ -local float temp_3; - INDIRECT_S self, defValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - CALL0 _IDNN_Send; - DONE; -} - -void(float pEvent) Item_Data_Nex_Color_DataEvent = asm -{ -local float temp_3; - GOTO 11; - CALL0 _IDNC_Sync; - GOTO 18; - CALL0 _IDNC_Send; - GOTO 16; - CALL0 _IDNC_Reset; - GOTO 14; - CALL0 _IDNC_Test_Start; - GOTO 12; - CALL0 _IDNC_Test_End; - GOTO 10; - IFNOT pEvent, -10; - EQ_F pEvent, ITEM_DATA_SEND, temp_3; - IF temp_3, -10; - EQ_F pEvent, ITEM_DATA_RESET, temp_3; - IF temp_3, -10; - EQ_F pEvent, ITEM_DATA_TEST_START, temp_3; - IF temp_3, -10; - EQ_F pEvent, ITEM_DATA_TEST_END, temp_3; - IF temp_3, -10; - DONE; -} - -void() Item_Data_Nex_Color_Spawn = asm -{ -local float temp_3; - CALL0 Item_Data_Init; - ADDRESS self, _reinit, temp_3; - STOREP_FNC _IDNC_Sync, temp_3; - ADDRESS self, _dataEvent, temp_3; - STOREP_FNC Item_Data_Nex_Color_DataEvent, temp_3; - DONE; -} - -void() Item_Nex_Map_Info_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F link, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F picture, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F text, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_Nex_Map_Info_Spawn = asm -{ -local float temp_3; - STORE_F self, parm0_x; - STORE_F link, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F picture, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F text, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - CALL2 String_EntityZone; - INDIRECT_S self, picture, parm0_x; - CALL1 Gfx_Precache; - ADDRESS self, _destroy, temp_3; - STOREP_FNC Item_Nex_Map_Info_Destroy, temp_3; - DONE; -} - -string _Nex_MapList_FullPath; -string _Nex_MapList_Name; -entity _Nex_MapList_Root; -void() Item_Nex_MapDB_EnumFiles = asm -{ -local float locked_1174; -local string lLine; -local string lTitle; -local string lDescription; -local string lName; -local string lStripped; -local string lFilename; -local float lHandle; -local entity lMap; -local float lSearchCounter; -local float lSearchSize; -local float lSearchHandle; -local float temp_4; - STORE_F "maps/*.bsp", parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 search_begin; - STORE_F return_x, lSearchHandle; - LT lSearchHandle, KEY_GAME, locked_1174; - IFNOT locked_1174, 2; - RETURN offset_0; - STORE_F lSearchHandle, parm0_x; - CALL1 search_getsize; - STORE_F return_x, lSearchSize; - STORE_F KEY_GAME, lSearchCounter; - LT lSearchCounter, lSearchSize, locked_1174; - IFNOT locked_1174, 105; - STORE_F lSearchHandle, parm0_x; - STORE_F lSearchCounter, parm1_x; - CALL2 search_getfilename; - STORE_S return_x, lFilename; - STORE_F lFilename, parm0_x; - CALL1 strlen; - SUB_F return_x, CVAR_READONLY, locked_1174; - STORE_F lFilename, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F locked_1174, parm2_x; - CALL3 substring; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lStripped; - STORE_F lStripped, parm0_x; - STORE_F SLIST_SERVERREPLYCOUNT, parm1_x; - STORE_F 100000.000000, parm2_x; - CALL3 substring; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lName; - STORE_F lStripped, parm0_x; - STORE_F ".txt", parm1_x; - CALL2 strcat; - STORE_F return_x, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 fopen; - STORE_F return_x, lHandle; - LT lHandle, KEY_GAME, locked_1174; - IFNOT locked_1174, 11; - STORE_F lName, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lTitle; - STORE_F "--NO INFORMATION AVAILABLE-- -", parm0_x; - STORE_F lFilename, parm1_x; - CALL2 strcat; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lDescription; - GOTO 23; - STORE_F lHandle, parm0_x; - CALL1 fgets; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lTitle; - CALL0 String_Create; - STORE_S return_x, lDescription; - STORE_F lHandle, parm0_x; - CALL1 fgets; - STORE_S return_x, lLine; - STORE_F lLine, parm0_x; - STORE_F " -", parm1_x; - CALL2 strcat; - STORE_F lDescription, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Append; - STORE_S return_x, lDescription; - STORE_F lLine, parm0_x; - CALL1 validstring; - IF return_x, -12; - STORE_F lHandle, parm0_x; - CALL1 fclose; - STORE_F lSearchCounter, parm0_x; - CALL1 ftos; - INDIRECT_S self, name, locked_1174; - STORE_F "Item_Nex_Map_Info", parm0_x; - STORE_F return_x, parm1_x; - STORE_F locked_1174, parm2_x; - CALL3 Menu_CreateItem; - STORE_ENT return_x, lMap; - ADDRESS lMap, link, locked_1174; - STOREP_S lName, locked_1174; - STORE_F lStripped, parm0_x; - CALL1 Gfx_Precache; - IFNOT return_x, 4; - ADDRESS lMap, picture, locked_1174; - STOREP_S lStripped, locked_1174; - GOTO 3; - ADDRESS lMap, picture, locked_1174; - STOREP_S "gfx/m_nomap", locked_1174; - ADDRESS lMap, normal, locked_1174; - STOREP_S lTitle, locked_1174; - ADDRESS lMap, text, locked_1174; - STOREP_S lDescription, locked_1174; - STORE_F _Nex_MapList_FullPath, parm0_x; - STORE_F lName, parm1_x; - CALL2 Util_AltStringPushBack; - STORE_S return_x, _Nex_MapList_FullPath; - STORE_F _Nex_MapList_Name, parm0_x; - STORE_F lTitle, parm1_x; - CALL2 Util_AltStringPushBack; - STORE_S return_x, _Nex_MapList_Name; - STORE_F lMap, parm0_x; - CALL1 Menu_LinkItem; - STORE_F lTitle, parm0_x; - CALL1 String_Free; - STORE_F lName, parm0_x; - CALL1 String_Free; - STORE_F lStripped, parm0_x; - CALL1 String_Free; - STORE_F lDescription, parm0_x; - CALL1 String_Free; - ADD_F lSearchCounter, FILE_APPEND, lSearchCounter; - GOTO -105; - STORE_F lSearchHandle, parm0_x; - CALL1 search_end; - STORE_F self, parm0_x; - CALL1 Menu_LinkChildren; - ADDRESS self, minValue, locked_1174; - STOREP_F FILE_APPEND, locked_1174; - ADDRESS self, stepValue, locked_1174; - STOREP_F FILE_APPEND, locked_1174; - ADDRESS self, maxValue, locked_1174; - INDIRECT_F lMap, orderPos, parm0_x; - CALL1 fabs; - STOREP_F return_x, locked_1174; - DONE; -} - -void() Item_Nex_MapDB_Destroy = asm -{ - STORE_F _Nex_MapList_FullPath, parm0_x; - CALL1 String_Free; - STORE_F _Nex_MapList_Name, parm0_x; - CALL1 String_Free; - STORE_ENT null_entity, _Nex_MapList_Root; - DONE; -} - -void() Item_Nex_MapDB_Spawn = asm -{ -local float temp_3; - IFNOT _Nex_MapList_Root, 3; - STORE_F "There is already another Item_Nex_MapDB object!", parm0_x; - CALL1 error; - CALL0 String_Create; - STORE_S return_x, _Nex_MapList_FullPath; - CALL0 String_Create; - STORE_S return_x, _Nex_MapList_Name; - STORE_ENT self, _Nex_MapList_Root; - CALL0 Item_Nex_MapDB_EnumFiles; - ADDRESS self, _destroy, temp_3; - STOREP_FNC Item_Nex_MapDB_Destroy, temp_3; - DONE; -} - -entity(string pPath) Nex_MapDB_GetByPath = asm -{ -local entity lNode; -local float temp_3; - IF _Nex_MapList_Root, 3; - STORE_F "No Item_Nex_MapDB found!", parm0_x; - CALL1 error; - INDIRECT_E _Nex_MapList_Root, _child, lNode; - IFNOT lNode, 7; - INDIRECT_S lNode, link, temp_3; - EQ_S temp_3, pPath, temp_3; - IFNOT temp_3, 2; - RETURN lNode; - INDIRECT_E lNode, _next, lNode; - GOTO -6; - RETURN null_entity; - DONE; -} - -entity(float pIndex) Nex_MapDB_GetByIndex = asm -{ -local entity lNode; -local float temp_3; - IF _Nex_MapList_Root, 3; - STORE_F "No Item_Nex_MapDB found!", parm0_x; - CALL1 error; - STORE_F pIndex, parm0_x; - CALL1 fabs; - STORE_F return_x, pIndex; - INDIRECT_E _Nex_MapList_Root, _child, lNode; - IFNOT lNode, 8; - INDIRECT_F lNode, orderPos, parm0_x; - CALL1 fabs; - EQ_F return_x, pIndex, temp_3; - IFNOT temp_3, 2; - RETURN lNode; - INDIRECT_E lNode, _next, lNode; - GOTO -7; - RETURN null_entity; - DONE; -} - -string() Nex_MapDB_GetPathAltString = asm -{ - RETURN _Nex_MapList_FullPath; - DONE; -} - -string() Nex_MapDB_GetNameAltString = asm -{ - RETURN _Nex_MapList_Name; - DONE; -} - -float(entity pItem) Nex_MapDB_GetIndex = asm -{ -local float temp_3; - INDIRECT_F pItem, orderPos, parm0_x; - CALL1 fabs; - RETURN return_x; - DONE; -} - -void () Item_DataLink_Nex_MapList_Save; -void() Item_DataLink_Nex_MapList_Save = asm -{ -local string lOutput; -local float lIndex; -local float lCount; -local float temp_3; -local float temp_4; - STORE_F " -", parm0_x; - CALL1 String_Zone; - STORE_S return_x, lOutput; - INDIRECT_S self, valueList, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - STORE_F KEY_GAME, lIndex; - LT lIndex, lCount, temp_3; - IFNOT temp_3, 17; - INDIRECT_S self, valueList, parm0_x; - STORE_F lIndex, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F "'", parm0_x; - STORE_F return_x, parm1_x; - STORE_F "' -", parm2_x; - CALL3 strcat; - STORE_F lOutput, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Append; - STORE_S return_x, lOutput; - STORE_F lIndex, temp_4; - ADD_F lIndex, FILE_APPEND, lIndex; - GOTO -17; - INDIRECT_S self, cvarName, parm0_x; - STORE_F lOutput, parm1_x; - CALL2 cvar_set; - INDIRECT_S self, cvarName, parm0_x; - STORE_F "_index", parm1_x; - CALL2 strcat; - STORE_F return_x, parm0_x; - STORE_F "0", parm1_x; - CALL2 cvar_set; - STORE_F lOutput, parm0_x; - CALL1 String_Free; - DONE; -} - -void () Item_DataLink_Nex_MapList_Load; -void() Item_DataLink_Nex_MapList_Load = asm -{ -local float locked_1174; -local float lCount; -local float lCounter; -local entity lMapInfo; -local string lEntry; -local float temp_4; -local float temp_5; - STORE_F self, parm0_x; - CALL1 DataLink_Nex_MapList_Clear; - INDIRECT_S self, cvarName, parm0_x; - CALL1 str_cvar; - STORE_F return_x, parm0_x; - CALL1 tokenize; - STORE_F return_x, lCount; - CALL0 String_Create; - STORE_S return_x, lEntry; - STORE_F KEY_GAME, lCounter; - LT lCounter, lCount, locked_1174; - IFNOT locked_1174, 35; - STORE_F lCounter, parm0_x; - CALL1 argv; - STORE_F lEntry, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - STORE_S return_x, lEntry; - STORE_F lEntry, parm0_x; - CALL1 Nex_MapDB_GetByPath; - STORE_ENT return_x, lMapInfo; - EQ_E lMapInfo, null_entity, locked_1174; - IFNOT locked_1174, 7; - INDIRECT_S self, cvarName, parm0_x; - STORE_F ": Map '", parm1_x; - STORE_F lEntry, parm2_x; - STORE_F "' not found in database - ignored -", parm3_x; - CALL4 print; - GOTO 15; - ADDRESS self, descList, locked_1174; - INDIRECT_S self, descList, temp_4; - INDIRECT_S lMapInfo, normal, temp_5; - STORE_F temp_4, parm0_x; - STORE_F temp_5, parm1_x; - CALL2 Util_AltStringPushBack; - STOREP_S return_x, locked_1174; - ADDRESS self, valueList, locked_1174; - INDIRECT_S self, valueList, temp_4; - INDIRECT_S lMapInfo, link, temp_5; - STORE_F temp_4, parm0_x; - STORE_F temp_5, parm1_x; - CALL2 Util_AltStringPushBack; - STOREP_S return_x, locked_1174; - STORE_F lCounter, temp_4; - ADD_F lCounter, FILE_APPEND, lCounter; - GOTO -35; - STORE_F lEntry, parm0_x; - CALL1 String_Free; - STORE_F self, parm0_x; - CALL1 DataLink_Nex_MapList_UpdateRange; - CALL0 Nex_MapSelector_Synchronize; - DONE; -} - -void () Item_DataLink_Nex_MapList_ExecString; -void() Item_DataLink_Nex_MapList_ExecString = asm -{ -local float lIndex; -local float lCount; -local float temp_3; -local float temp_4; - INDIRECT_S self, cvarName, temp_3; - INDIRECT_S self, cvarName, temp_4; - STORE_F "set "", parm0_x; - STORE_F temp_3, parm1_x; - STORE_F "_index" "0" -set "", parm2_x; - STORE_F temp_4, parm3_x; - STORE_F "" -" -", parm4_x; - CALL5 strcat; - STORE_F Data_ExecString, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Append; - STORE_S return_x, Data_ExecString; - INDIRECT_S self, valueList, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - STORE_F KEY_GAME, lIndex; - LT lIndex, lCount, temp_3; - IFNOT temp_3, 17; - INDIRECT_S self, valueList, parm0_x; - STORE_F lIndex, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F "'", parm0_x; - STORE_F return_x, parm1_x; - STORE_F "' -", parm2_x; - CALL3 strcat; - STORE_F Data_ExecString, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Append; - STORE_S return_x, Data_ExecString; - STORE_F lIndex, temp_4; - ADD_F lIndex, FILE_APPEND, lIndex; - GOTO -17; - STORE_F Data_ExecString, parm0_x; - STORE_F "" -", parm1_x; - CALL2 String_Append; - STORE_S return_x, Data_ExecString; - DONE; -} - -void(float pEvent) Item_DataLink_Nex_MapList_DataEvent = asm -{ -local float locked_1174; -local float temp_4; - GOTO 39; - INDIRECT_S self, cvarName, locked_1174; - NE_S locked_1174, "", locked_1174; - IFNOT locked_1174, 2; - CALL0 Item_DataLink_Nex_MapList_Load; - GOTO 49; - INDIRECT_S self, cvarName, locked_1174; - NE_S locked_1174, "", locked_1174; - IFNOT locked_1174, 2; - CALL0 Item_DataLink_Nex_MapList_Save; - GOTO 44; - ADDRESS self, _realValue, locked_1174; - STOREP_F FILE_APPEND, locked_1174; - GOTO 41; - GOTO 40; - GOTO 39; - INDIRECT_S self, cvarName, locked_1174; - NE_S locked_1174, "", locked_1174; - IFNOT locked_1174, 2; - CALL0 Item_DataLink_Nex_MapList_ExecString; - GOTO 34; - ADDRESS self, _realValue, locked_1174; - INDIRECT_F self, _realValue, parm0_x; - CALL1 floor; - STOREP_F return_x, locked_1174; - INDIRECT_F self, _realValue, locked_1174; - LT locked_1174, FILE_APPEND, locked_1174; - IFNOT locked_1174, 4; - ADDRESS self, _realValue, locked_1174; - STOREP_F FILE_APPEND, locked_1174; - GOTO 8; - INDIRECT_F self, _realValue, locked_1174; - INDIRECT_F self, maxValue, temp_4; - GT locked_1174, temp_4, locked_1174; - IFNOT locked_1174, 4; - ADDRESS self, _realValue, locked_1174; - INDIRECT_F self, maxValue, temp_4; - STOREP_F temp_4, locked_1174; - GOTO 16; - IFNOT pEvent, -38; - EQ_F pEvent, ITEM_DATA_SEND, locked_1174; - IF locked_1174, -35; - EQ_F pEvent, ITEM_DATA_RESET, locked_1174; - IF locked_1174, -32; - EQ_F pEvent, ITEM_DATA_TEST_START, locked_1174; - IF locked_1174, -31; - EQ_F pEvent, ITEM_DATA_TEST_END, locked_1174; - IF locked_1174, -32; - EQ_F pEvent, ITEM_DATA_SAVE_EXECSTRING, locked_1174; - IF locked_1174, -33; - EQ_F pEvent, ITEM_DATALINK_SET, locked_1174; - IF locked_1174, -30; - EQ_F pEvent, ITEM_DATALINK_GET, locked_1174; - IF locked_1174, -32; - DONE; -} - -void () IDLNML_Reinit; -void() IDLNML_Reinit = asm -{ - STORE_F self, parm0_x; - STORE_F ITEM_DATA_SYNC, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Item_DataLink_Nex_MapList_Destroy; -void() Item_DataLink_Nex_MapList_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F valueList, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F cvarName, parm1_x; - CALL2 String_EntityFree; - CALL0 Item_DataLink_Switch_Destroy; - DONE; -} - -void() Item_DataLink_Nex_MapList_Spawn = asm -{ -local float temp_3; - CALL0 Item_DataLink_Switch_Init; - STORE_F self, parm0_x; - STORE_F valueList, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F cvarName, parm1_x; - CALL2 String_EntityZone; - INDIRECT_S self, cvarName, temp_3; - NE_S temp_3, "", temp_3; - IFNOT temp_3, 12; - INDIRECT_S self, cvarName, parm0_x; - STORE_F "", parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 registercvar; - INDIRECT_S self, cvarName, parm0_x; - STORE_F "_index", parm1_x; - CALL2 strcat; - STORE_F return_x, parm0_x; - STORE_F "", parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 registercvar; - ADDRESS self, minValue, temp_3; - STOREP_F FILE_APPEND, temp_3; - ADDRESS self, maxValue, temp_3; - STOREP_F FILE_APPEND, temp_3; - ADDRESS self, stepValue, temp_3; - STOREP_F KEY_GAME, temp_3; - ADDRESS self, _reinit, temp_3; - STOREP_FNC IDLNML_Reinit, temp_3; - ADDRESS self, _dataEvent, temp_3; - STOREP_FNC Item_DataLink_Nex_MapList_DataEvent, temp_3; - ADDRESS self, _destroy, temp_3; - STOREP_FNC Item_DataLink_Nex_MapList_Destroy, temp_3; - CALL0 CtCall_Init; - DONE; -} - -void() Item_DataLink_Nex_MapList_InitWithMapList = asm -{ - CALL0 Nex_MapDB_GetPathAltString; - STORE_F self, parm0_x; - STORE_F valueList, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - CALL0 Nex_MapDB_GetNameAltString; - STORE_F self, parm0_x; - STORE_F descList, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - STORE_F self, parm0_x; - CALL1 DataLink_Nex_MapList_UpdateRange; - DONE; -} - -void(entity pItem) DataLink_Nex_MapList_UpdateRange = asm -{ -local float locked_1174; -local float temp_4; - ADDRESS pItem, minValue, locked_1174; - STOREP_F FILE_APPEND, locked_1174; - ADDRESS pItem, maxValue, locked_1174; - INDIRECT_S pItem, descList, parm0_x; - CALL1 Util_GetAltStringCount; - STOREP_F return_x, locked_1174; - INDIRECT_F pItem, maxValue, locked_1174; - GE locked_1174, FILE_APPEND, locked_1174; - IFNOT locked_1174, 4; - ADDRESS pItem, stepValue, locked_1174; - STOREP_F FILE_APPEND, locked_1174; - GOTO 5; - ADDRESS pItem, maxValue, locked_1174; - STOREP_F FILE_APPEND, locked_1174; - ADDRESS pItem, stepValue, locked_1174; - STOREP_F KEY_GAME, locked_1174; - DONE; -} - -void(entity pItem, string pName, string pPath) DataLink_Nex_MapList_InsertEntryAfter = asm -{ -local float locked_1174; -local float lIndex; -local float temp_4; - STORE_F pItem, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_F pItem, _realValue, locked_1174; - SUB_F locked_1174, FILE_APPEND, lIndex; - ADDRESS pItem, descList, locked_1174; - INDIRECT_S pItem, descList, parm0_x; - STORE_F lIndex, parm1_x; - STORE_F pName, parm2_x; - CALL3 Util_InsAltStringItem; - STOREP_S return_x, locked_1174; - ADDRESS pItem, valueList, locked_1174; - INDIRECT_S pItem, valueList, parm0_x; - STORE_F lIndex, parm1_x; - STORE_F pPath, parm2_x; - CALL3 Util_InsAltStringItem; - STOREP_S return_x, locked_1174; - STORE_F pItem, parm0_x; - CALL1 DataLink_Nex_MapList_UpdateRange; - DONE; -} - -void(entity pItem) DataLink_Nex_MapList_DeleteEntry = asm -{ -local float locked_1174; -local float lIndex; -local float temp_4; - INDIRECT_F pItem, stepValue, locked_1174; - EQ_F locked_1174, KEY_GAME, locked_1174; - IFNOT locked_1174, 2; - RETURN offset_0; - STORE_F pItem, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_F pItem, _realValue, locked_1174; - SUB_F locked_1174, FILE_APPEND, lIndex; - ADDRESS pItem, descList, locked_1174; - INDIRECT_S pItem, descList, parm0_x; - STORE_F lIndex, parm1_x; - CALL2 Util_DelAltStringItem; - STOREP_S return_x, locked_1174; - ADDRESS pItem, valueList, locked_1174; - INDIRECT_S pItem, valueList, parm0_x; - STORE_F lIndex, parm1_x; - CALL2 Util_DelAltStringItem; - STOREP_S return_x, locked_1174; - STORE_F pItem, parm0_x; - CALL1 DataLink_Nex_MapList_UpdateRange; - DONE; -} - -void(entity pItem) DataLink_Nex_MapList_MoveEntryUp = asm -{ -local float locked_1020; -local float locked_1174; -local float lIndexOld; -local float lIndexNew; -local string lPath; -local string lName; - STORE_F pItem, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_F pItem, _realValue, locked_1174; - EQ_F locked_1174, FILE_APPEND, locked_1174; - IFNOT locked_1174, 2; - RETURN offset_0; - INDIRECT_F pItem, _realValue, locked_1174; - SUB_F locked_1174, FILE_APPEND, lIndexOld; - SUB_F lIndexOld, KEY_MENU, lIndexNew; - INDIRECT_S pItem, descList, parm0_x; - STORE_F lIndexOld, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_S return_x, lName; - INDIRECT_S pItem, valueList, parm0_x; - STORE_F lIndexOld, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_S return_x, lPath; - ADDRESS pItem, descList, locked_1174; - INDIRECT_S pItem, descList, locked_1020; - STORE_F lName, parm0_x; - CALL1 String_Normal; - STORE_F locked_1020, parm0_x; - STORE_F lIndexNew, parm1_x; - STORE_F return_x, parm2_x; - CALL3 Util_InsAltStringItem; - STOREP_S return_x, locked_1174; - ADDRESS pItem, valueList, locked_1174; - INDIRECT_S pItem, valueList, locked_1020; - STORE_F lPath, parm0_x; - CALL1 String_Normal; - STORE_F locked_1020, parm0_x; - STORE_F lIndexNew, parm1_x; - STORE_F return_x, parm2_x; - CALL3 Util_InsAltStringItem; - STOREP_S return_x, locked_1174; - ADD_F lIndexOld, FILE_APPEND, lIndexOld; - ADDRESS pItem, descList, locked_1174; - INDIRECT_S pItem, descList, parm0_x; - STORE_F lIndexOld, parm1_x; - CALL2 Util_DelAltStringItem; - STOREP_S return_x, locked_1174; - ADDRESS pItem, valueList, locked_1174; - INDIRECT_S pItem, valueList, parm0_x; - STORE_F lIndexOld, parm1_x; - CALL2 Util_DelAltStringItem; - STOREP_S return_x, locked_1174; - STORE_F pItem, parm0_x; - CALL1 DataLink_Nex_MapList_UpdateRange; - DONE; -} - -void(entity pItem) DataLink_Nex_MapList_MoveEntryDown = asm -{ -local float locked_1020; -local float locked_1174; -local float lIndexOld; -local float lIndexNew; -local string lPath; -local string lName; - STORE_F pItem, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_F pItem, _realValue, locked_1174; - INDIRECT_F pItem, maxValue, locked_1020; - EQ_F locked_1174, locked_1020, locked_1174; - IFNOT locked_1174, 2; - RETURN offset_0; - INDIRECT_F pItem, _realValue, locked_1174; - SUB_F locked_1174, FILE_APPEND, lIndexOld; - ADD_F lIndexOld, FILE_APPEND, lIndexNew; - INDIRECT_S pItem, descList, parm0_x; - STORE_F lIndexOld, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_S return_x, lName; - INDIRECT_S pItem, valueList, parm0_x; - STORE_F lIndexOld, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_S return_x, lPath; - ADDRESS pItem, descList, locked_1174; - INDIRECT_S pItem, descList, locked_1020; - STORE_F lName, parm0_x; - CALL1 String_Normal; - STORE_F locked_1020, parm0_x; - STORE_F lIndexNew, parm1_x; - STORE_F return_x, parm2_x; - CALL3 Util_InsAltStringItem; - STOREP_S return_x, locked_1174; - ADDRESS pItem, valueList, locked_1174; - INDIRECT_S pItem, valueList, locked_1020; - STORE_F lPath, parm0_x; - CALL1 String_Normal; - STORE_F locked_1020, parm0_x; - STORE_F lIndexNew, parm1_x; - STORE_F return_x, parm2_x; - CALL3 Util_InsAltStringItem; - STOREP_S return_x, locked_1174; - ADDRESS pItem, descList, locked_1174; - INDIRECT_S pItem, descList, parm0_x; - STORE_F lIndexOld, parm1_x; - CALL2 Util_DelAltStringItem; - STOREP_S return_x, locked_1174; - ADDRESS pItem, valueList, locked_1174; - INDIRECT_S pItem, valueList, parm0_x; - STORE_F lIndexOld, parm1_x; - CALL2 Util_DelAltStringItem; - STOREP_S return_x, locked_1174; - STORE_F pItem, parm0_x; - CALL1 DataLink_Nex_MapList_UpdateRange; - DONE; -} - -void(entity pItem, string pName, string pPath) DataLink_Nex_MapList_SetFirst = asm -{ -local float locked_1174; -local float temp_4; - INDIRECT_F pItem, stepValue, locked_1174; - EQ_F locked_1174, KEY_GAME, locked_1174; - IFNOT locked_1174, 12; - ADDRESS pItem, descList, locked_1174; - INDIRECT_S pItem, descList, parm0_x; - STORE_F pName, parm1_x; - CALL2 Util_AltStringPush; - STOREP_S return_x, locked_1174; - ADDRESS pItem, valueList, locked_1174; - INDIRECT_S pItem, valueList, parm0_x; - STORE_F pPath, parm1_x; - CALL2 Util_AltStringPush; - STOREP_S return_x, locked_1174; - GOTO 13; - ADDRESS pItem, descList, locked_1174; - INDIRECT_S pItem, descList, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F pName, parm2_x; - CALL3 Util_SetAltStringItem; - STOREP_S return_x, locked_1174; - ADDRESS pItem, valueList, locked_1174; - INDIRECT_S pItem, valueList, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F pPath, parm2_x; - CALL3 Util_SetAltStringItem; - STOREP_S return_x, locked_1174; - STORE_F pItem, parm0_x; - CALL1 DataLink_Nex_MapList_UpdateRange; - DONE; -} - -void(entity pItem) DataLink_Nex_MapList_Clear = asm -{ - STORE_F pItem, parm0_x; - STORE_F descList, parm1_x; - STORE_F "", parm2_x; - CALL3 String_EntitySet; - STORE_F pItem, parm0_x; - STORE_F valueList, parm1_x; - STORE_F "", parm2_x; - CALL3 String_EntitySet; - STORE_F pItem, parm0_x; - CALL1 DataLink_Nex_MapList_UpdateRange; - DONE; -} - -string(entity pItem) DataLink_Nex_MapList_GetCurrentName = asm -{ -local float temp_3; -local float temp_4; - STORE_F pItem, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_S pItem, descList, temp_3; - INDIRECT_F pItem, _realValue, temp_4; - SUB_F temp_4, FILE_APPEND, temp_4; - STORE_F temp_3, parm0_x; - STORE_F temp_4, parm1_x; - CALL2 Util_GetAltStringItem; - RETURN return_x; - DONE; -} - -string(entity pItem) DataLink_Nex_MapList_GetCurrentPath = asm -{ -local float temp_3; -local float temp_4; - STORE_F pItem, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_S pItem, valueList, temp_3; - INDIRECT_F pItem, _realValue, temp_4; - SUB_F temp_4, FILE_APPEND, temp_4; - STORE_F temp_3, parm0_x; - STORE_F temp_4, parm1_x; - CALL2 Util_GetAltStringItem; - RETURN return_x; - DONE; -} - -void () _IDLNMS_Build; -void() _IDLNMS_Build = asm -{ -local string lLine; -local string lModPath; -local string lModName; -local string lFilename; -local float lHandle; -local float lSearchCounter; -local float lSearchSize; -local float lSearchHandle; -local float temp_3; - STORE_F "/*.modinfo", parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 search_begin; - STORE_F return_x, lSearchHandle; - LT lSearchHandle, KEY_GAME, temp_3; - IFNOT temp_3, 10; - STORE_F self, parm0_x; - STORE_F valueList, parm1_x; - STORE_F "'progs.dat'", parm2_x; - CALL3 String_EntitySet; - STORE_F self, parm0_x; - STORE_F descList, parm1_x; - STORE_F "'Deathmatch'", parm2_x; - CALL3 String_EntitySet; - RETURN offset_0; - STORE_F lSearchHandle, parm0_x; - CALL1 search_getsize; - STORE_F return_x, lSearchSize; - STORE_F KEY_GAME, lSearchCounter; - LT lSearchCounter, lSearchSize, temp_3; - IFNOT temp_3, 71; - STORE_F lSearchHandle, parm0_x; - STORE_F lSearchCounter, parm1_x; - CALL2 search_getfilename; - STORE_S return_x, lFilename; - STORE_F lFilename, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F 100000.000000, parm2_x; - CALL3 substring; - STORE_F return_x, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 fopen; - STORE_F return_x, lHandle; - LT lHandle, KEY_GAME, temp_3; - IFNOT temp_3, 6; - STORE_F "Menu: Couldn't open modinfo file '", parm0_x; - STORE_F lFilename, parm1_x; - STORE_F "' -", parm2_x; - CALL3 print; - GOTO 50; - CALL0 String_Create; - STORE_S return_x, lModPath; - CALL0 String_Create; - STORE_S return_x, lModName; - STORE_F lHandle, parm0_x; - CALL1 fgets; - STORE_S return_x, lLine; - STORE_F lLine, parm0_x; - CALL1 validstring; - IF return_x, 2; - GOTO 33; - STORE_F lModPath, parm0_x; - STORE_F lLine, parm1_x; - CALL2 String_Set; - STORE_S return_x, lModPath; - STORE_F lHandle, parm0_x; - CALL1 fgets; - STORE_S return_x, lLine; - STORE_F lLine, parm0_x; - CALL1 validstring; - IF return_x, 2; - GOTO 22; - STORE_F lModName, parm0_x; - STORE_F lLine, parm1_x; - CALL2 String_Set; - STORE_S return_x, lModName; - INDIRECT_S self, valueList, parm0_x; - STORE_F lModPath, parm1_x; - STORE_F " ", parm2_x; - CALL3 strcat; - STORE_F self, parm0_x; - STORE_F valueList, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - INDIRECT_S self, descList, parm0_x; - STORE_F lModName, parm1_x; - STORE_F " ", parm2_x; - CALL3 strcat; - STORE_F self, parm0_x; - STORE_F descList, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - GOTO -38; - STORE_F lModPath, parm0_x; - CALL1 String_Free; - STORE_F lModName, parm0_x; - CALL1 String_Free; - STORE_F lHandle, parm0_x; - CALL1 fclose; - ADD_F lSearchCounter, FILE_APPEND, lSearchCounter; - GOTO -71; - STORE_F lSearchHandle, parm0_x; - CALL1 search_end; - DONE; -} - -void() Item_DataLink_Nex_ModSwitch_Spawn = asm -{ -local string lTemp2; -local string lTemp1; -local float temp_3; - STORE_F self, parm0_x; - STORE_F valueList, parm1_x; - CALL2 String_EntityCreate; - STORE_F self, parm0_x; - STORE_F descList, parm1_x; - CALL2 String_EntityCreate; - CALL0 _IDLNMS_Build; - INDIRECT_S self, descList, lTemp1; - INDIRECT_S self, valueList, lTemp2; - CALL0 Item_DataLink_TextSwitch_Spawn; - STORE_F lTemp1, parm0_x; - CALL1 String_Free; - STORE_F lTemp2, parm0_x; - CALL1 String_Free; - DONE; -} - -void () IDLNFL_Sync; -void() IDLNFL_Sync = asm -{ -local float locked_1020; -local float locked_1174; -local string lFilename; -local float lCounter; -local float lMaskedLength; -local float lMaskStart; -local float lHandle; -local float lCount; -local float temp_5; - INDIRECT_S self, selected, locked_1174; - INDIRECT_S self, normal, locked_1020; - STORE_F locked_1174, parm0_x; - STORE_F "/*.", parm1_x; - STORE_F locked_1020, parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 search_begin; - STORE_F return_x, lHandle; - LT lHandle, KEY_GAME, locked_1174; - IFNOT locked_1174, 2; - RETURN offset_0; - STORE_F lHandle, parm0_x; - CALL1 search_getsize; - STORE_F return_x, lCount; - STORE_F self, parm0_x; - STORE_F valueList, parm1_x; - STORE_F "", parm2_x; - CALL3 String_EntitySet; - STORE_F self, parm0_x; - STORE_F descList, parm1_x; - STORE_F "", parm2_x; - CALL3 String_EntitySet; - INDIRECT_S self, selected, parm0_x; - CALL1 strlen; - ADD_F return_x, FILE_APPEND, lMaskStart; - INDIRECT_S self, normal, parm0_x; - CALL1 strlen; - ADD_F lMaskStart, return_x, locked_1174; - ADD_F locked_1174, FILE_APPEND, lMaskedLength; - STORE_F KEY_GAME, lCounter; - LT lCounter, lCount, locked_1174; - IFNOT locked_1174, 26; - STORE_F lHandle, parm0_x; - STORE_F lCounter, parm1_x; - CALL2 search_getfilename; - STORE_S return_x, lFilename; - ADDRESS self, valueList, locked_1174; - INDIRECT_S self, valueList, parm0_x; - STORE_F lFilename, parm1_x; - CALL2 Util_AltStringPushBack; - STOREP_S return_x, locked_1174; - ADDRESS self, descList, locked_1174; - INDIRECT_S self, descList, locked_1020; - STORE_F lFilename, parm0_x; - CALL1 strlen; - SUB_F return_x, lMaskedLength, temp_5; - STORE_F lFilename, parm0_x; - STORE_F lMaskStart, parm1_x; - STORE_F temp_5, parm2_x; - CALL3 substring; - STORE_F locked_1020, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Util_AltStringPushBack; - STOREP_S return_x, locked_1174; - STORE_F lCounter, locked_1020; - ADD_F lCounter, FILE_APPEND, lCounter; - GOTO -26; - ADDRESS self, minValue, locked_1174; - STOREP_F KEY_GAME, locked_1174; - GT lCount, KEY_GAME, locked_1174; - IFNOT locked_1174, 7; - ADDRESS self, stepValue, locked_1174; - STOREP_F FILE_APPEND, locked_1174; - ADDRESS self, maxValue, locked_1174; - SUB_F lCount, FILE_APPEND, locked_1020; - STOREP_F locked_1020, locked_1174; - GOTO 5; - ADDRESS self, stepValue, locked_1174; - STOREP_F KEY_GAME, locked_1174; - ADDRESS self, maxValue, locked_1174; - STOREP_F KEY_GAME, locked_1174; - DONE; -} - -void() Item_DataLink_Nex_FileList_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F valueList, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F selected, parm1_x; - CALL2 String_EntityFree; - CALL0 Item_DataLink_Switch_Destroy; - DONE; -} - -void(float pEvent) Item_DataLink_Nex_FileList_DataEvent = asm -{ -local float temp_3; - GOTO 7; - CALL0 IDLNFL_Sync; - GOTO 8; - CALL0 IDLNFL_Sync; - ADDRESS self, _realValue, temp_3; - STOREP_F KEY_GAME, temp_3; - GOTO 4; - IFNOT pEvent, -6; - EQ_F pEvent, ITEM_DATA_RESET, temp_3; - IF temp_3, -6; - DONE; -} - -void() Item_DataLink_Nex_FileList_Spawn = asm -{ -local float temp_3; - CALL0 Item_DataLink_Switch_Init; - STORE_F self, parm0_x; - STORE_F valueList, parm1_x; - CALL2 String_EntityCreate; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F selected, parm1_x; - CALL2 String_EntityZone; - ADDRESS self, _reinit, temp_3; - STOREP_FNC IDLNFL_Sync, temp_3; - ADDRESS self, _destroy, temp_3; - STOREP_FNC Item_DataLink_Nex_FileList_Destroy, temp_3; - ADDRESS self, _dataEvent, temp_3; - STOREP_FNC Item_DataLink_Nex_FileList_DataEvent, temp_3; - DONE; -} - -void(entity pItem) Nex_MakeOnlyVisible = asm -{ -local entity lChild; -local float temp_3; -local float temp_4; - INDIRECT_E pItem, _parent, temp_3; - INDIRECT_E temp_3, _child, lChild; - IFNOT lChild, 7; - ADDRESS lChild, flag, temp_3; - INDIRECT_F lChild, flag, temp_4; - BITOR temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - INDIRECT_E lChild, _next, lChild; - GOTO -6; - ADDRESS pItem, flag, temp_3; - INDIRECT_F pItem, flag, temp_4; - SUB_F temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - CALL0 Menu_UpdateRunFlags; - DONE; -} - -void () _IDNK_Sync; -void() _IDNK_Sync = asm -{ -local float temp_3; - INDIRECT_S self, target, parm0_x; - CALL1 Key_GetBindList; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - INDIRECT_S self, value, temp_3; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () _IDNK_Set; -void() _IDNK_Set = asm -{ -local float lCounter; -local float lCount; -local float temp_3; - INDIRECT_S self, value, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - INDIRECT_S self, target, temp_3; - STORE_F KEY_GAME, parm0_x; - STORE_F temp_3, parm1_x; - CALL2 Key_LimitBinds; - STORE_F KEY_GAME, lCounter; - LT lCounter, lCount, temp_3; - IFNOT temp_3, 16; - INDIRECT_S self, value, parm0_x; - STORE_F lCounter, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F return_x, parm0_x; - CALL1 stof; - STORE_F return_x, parm0_x; - CALL1 Key_GetName; - INDIRECT_S self, target, temp_3; - STORE_F return_x, parm0_x; - STORE_F temp_3, parm1_x; - CALL2 Key_Bind; - ADD_F lCounter, FILE_APPEND, lCounter; - GOTO -16; - DONE; -} - -void () _IDNK_Send; -void() _IDNK_Send = asm -{ -local float temp_3; - CALL0 _IDNK_Set; - INDIRECT_S self, value, temp_3; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () _IDNK_Reset; -void() _IDNK_Reset = asm -{ -local float locked_1174; -local string lKey; -local float lCounter; -local float lCount; -local float temp_4; - INDIRECT_S self, defValue, locked_1174; - NOT_S locked_1174, locked_1174; - IFNOT locked_1174, 2; - RETURN offset_0; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F "", parm2_x; - CALL3 String_EntitySet; - INDIRECT_S self, defValue, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - INDIRECT_S self, target, locked_1174; - STORE_F KEY_GAME, parm0_x; - STORE_F locked_1174, parm1_x; - CALL2 Key_LimitBinds; - STORE_F KEY_GAME, lCounter; - LT lCounter, lCount, locked_1174; - IFNOT locked_1174, 26; - INDIRECT_S self, defValue, parm0_x; - STORE_F lCounter, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_S return_x, lKey; - INDIRECT_S self, target, locked_1174; - STORE_F lKey, parm0_x; - STORE_F locked_1174, parm1_x; - CALL2 Key_Bind; - INDIRECT_S self, value, locked_1174; - STORE_F lKey, parm0_x; - CALL1 Key_GetNum; - STORE_F locked_1174, parm0_x; - STORE_F " '", parm1_x; - STORE_F return_x, parm2_x; - STORE_F "'", parm3_x; - CALL4 strcat; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - STORE_F lKey, parm0_x; - CALL1 String_Free; - STORE_F lCounter, temp_4; - ADD_F lCounter, FILE_APPEND, lCounter; - GOTO -26; - INDIRECT_S self, value, locked_1174; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F locked_1174, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () _IDNK_Test_Start; -void() _IDNK_Test_Start = asm -{ - CALL0 _IDNK_Set; - DONE; -} - -void () _IDNK_Test_End; -void() _IDNK_Test_End = asm -{ -local float temp_3; - INDIRECT_S self, _syncValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - CALL0 _IDNK_Set; - DONE; -} - -void(float pEvent) Item_Data_Nex_Key_DataEvent = asm -{ -local float temp_3; - GOTO 11; - CALL0 _IDNK_Sync; - GOTO 18; - CALL0 _IDNK_Send; - GOTO 16; - CALL0 _IDNK_Reset; - GOTO 14; - CALL0 _IDNK_Test_Start; - GOTO 12; - CALL0 _IDNK_Test_End; - GOTO 10; - IFNOT pEvent, -10; - EQ_F pEvent, ITEM_DATA_SEND, temp_3; - IF temp_3, -10; - EQ_F pEvent, ITEM_DATA_RESET, temp_3; - IF temp_3, -10; - EQ_F pEvent, ITEM_DATA_TEST_START, temp_3; - IF temp_3, -10; - EQ_F pEvent, ITEM_DATA_TEST_END, temp_3; - IF temp_3, -10; - DONE; -} - -void () Item_Data_Nex_Key_Destroy; -void() Item_Data_Nex_Key_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityFree; - CALL0 Item_Data_Destroy; - DONE; -} - -void() Item_Data_Nex_Key_Spawn = asm -{ -local float temp_3; - CALL0 Item_Data_Init; - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityZone; - ADDRESS self, _destroy, temp_3; - STOREP_FNC Item_Data_Nex_Key_Destroy, temp_3; - ADDRESS self, _reinit, temp_3; - STOREP_FNC _IDNK_Sync, temp_3; - ADDRESS self, _dataEvent, temp_3; - STOREP_FNC Item_Data_Nex_Key_DataEvent, temp_3; - DONE; -} - -float (float, float) Item_Nex_KeyButton_Key; -float(float pKey, float pAscii) Item_Nex_KeyButton_Key = asm -{ -local float lNum; -local float temp_3; - EQ_F pKey, K_BACKSPACE, temp_3; - IFNOT temp_3, 19; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_E self, _target, temp_3; - INDIRECT_S temp_3, value, parm0_x; - CALL1 stof; - STORE_F return_x, lNum; - GE lNum, KEY_GAME, temp_3; - IFNOT temp_3, 8; - STORE_F lNum, parm0_x; - CALL1 Key_GetName; - STORE_F return_x, parm0_x; - CALL1 Key_Unbind; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - RETURN FILE_APPEND; - GOTO 21; - EQ_F pKey, K_UPARROW, temp_3; - IFNOT temp_3, 7; - STORE_F KEY_GAME, parm0_x; - CALL1 Menu_SelectPrev; - STORE_F FILE_APPEND, parm0_x; - CALL1 Menu_SelectPrev; - RETURN FILE_APPEND; - GOTO 13; - EQ_F pKey, K_DOWNARROW, temp_3; - IFNOT temp_3, 7; - STORE_F KEY_GAME, parm0_x; - CALL1 Menu_SelectNext; - STORE_F FILE_APPEND, parm0_x; - CALL1 Menu_SelectNext; - RETURN FILE_APPEND; - GOTO 5; - STORE_F pKey, parm0_x; - STORE_F pAscii, parm1_x; - CALL2 Item_Button_Key; - RETURN return_x; - DONE; -} - -void () Item_Nex_KeyButton_Update; -void() Item_Nex_KeyButton_Update = asm -{ -local float lNum; -local float temp_3; - CALL0 Item_DataUser_Update; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_E self, _target, temp_3; - INDIRECT_S temp_3, value, parm0_x; - CALL1 stof; - STORE_F return_x, lNum; - LT lNum, KEY_GAME, temp_3; - IFNOT temp_3, 6; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - STORE_F "-", parm2_x; - CALL3 String_EntitySet; - GOTO 7; - STORE_F lNum, parm0_x; - CALL1 Key_GetName; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - CALL0 Item_Button_Update; - DONE; -} - -void () Item_Nex_KeyButton_Destroy; -void() Item_Nex_KeyButton_Destroy = asm -{ - CALL0 Item_DataUser_Destroy; - CALL0 Item_Button_Destroy; - DONE; -} - -void() Item_Nex_KeyButton_Spawn = asm -{ -local float temp_3; - CALL0 Item_DataUser_Init; - CALL0 Item_Button_Spawn; - ADDRESS self, _destroy, temp_3; - STOREP_FNC Item_Nex_KeyButton_Destroy, temp_3; - ADDRESS self, _update, temp_3; - STOREP_FNC Item_Nex_KeyButton_Update, temp_3; - ADDRESS self, _key, temp_3; - STOREP_FNC Item_Nex_KeyButton_Key, temp_3; - DONE; -} - -void () _IDNR_Sync; -void() _IDNR_Sync = asm -{ -local float temp_3; -local float temp_4; - STORE_F "vid_width", parm0_x; - CALL1 str_cvar; - STORE_F "vid_height", parm0_x; - STORE_F return_x, temp_3; - CALL1 str_cvar; - STORE_F return_x, temp_4; - STORE_F temp_3, return_x; - STORE_F return_x, parm0_x; - STORE_F " ", parm1_x; - STORE_F temp_4, parm2_x; - CALL3 strcat; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - INDIRECT_S self, value, temp_3; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () _IDNR_Set; -void() _IDNR_Set = asm -{ -local float temp_3; - INDIRECT_S self, value, parm0_x; - CALL1 tokenize; - STORE_F KEY_GAME, parm0_x; - CALL1 argv; - STORE_F "vid_width", parm0_x; - STORE_F return_x, parm1_x; - CALL2 cvar_set; - STORE_F FILE_APPEND, parm0_x; - CALL1 argv; - STORE_F "vid_height", parm0_x; - STORE_F return_x, parm1_x; - CALL2 cvar_set; - DONE; -} - -void () _IDNR_Send; -void() _IDNR_Send = asm -{ - CALL0 _IDNR_Set; - CALL0 _IDNR_Sync; - DONE; -} - -void () _IDNR_Reset; -void() _IDNR_Reset = asm -{ -local float temp_3; - INDIRECT_S self, defValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - CALL0 _IDNR_Send; - DONE; -} - -void () _IDNR_Test_Start; -void() _IDNR_Test_Start = asm -{ - CALL0 _IDNR_Set; - DONE; -} - -void () _IDNR_Test_End; -void() _IDNR_Test_End = asm -{ -local float temp_3; - INDIRECT_S self, _syncValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - CALL0 _IDNR_Send; - DONE; -} - -void (float) Item_Data_Nex_Resolution_DataEvent; -void(float pEvent) Item_Data_Nex_Resolution_DataEvent = asm -{ -local float temp_3; - GOTO 11; - CALL0 _IDNR_Sync; - GOTO 18; - CALL0 _IDNR_Send; - GOTO 16; - CALL0 _IDNR_Reset; - GOTO 14; - CALL0 _IDNR_Test_Start; - GOTO 12; - CALL0 _IDNR_Test_End; - GOTO 10; - IFNOT pEvent, -10; - EQ_F pEvent, ITEM_DATA_SEND, temp_3; - IF temp_3, -10; - EQ_F pEvent, ITEM_DATA_RESET, temp_3; - IF temp_3, -10; - EQ_F pEvent, ITEM_DATA_TEST_START, temp_3; - IF temp_3, -10; - EQ_F pEvent, ITEM_DATA_TEST_END, temp_3; - IF temp_3, -10; - DONE; -} - -void() Item_Data_Nex_Resolution_Spawn = asm -{ -local float temp_3; - CALL0 Item_Data_Init; - ADDRESS self, _dataEvent, temp_3; - STOREP_FNC Item_Data_Nex_Resolution_DataEvent, temp_3; - ADDRESS self, _reinit, temp_3; - STOREP_FNC _IDNR_Sync, temp_3; - DONE; -} - -void() Item_Nex_HostCache_Entry_Update = asm -{ -local float temp_3; -local float temp_4; - INDIRECT_F self, stepValue, temp_3; - LE HostCache_ViewCount, temp_3, temp_3; - IFNOT temp_3, 7; - ADDRESS self, flag, temp_3; - INDIRECT_F self, flag, temp_4; - BITOR temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - RETURN offset_0; - GOTO 8; - INDIRECT_F self, flag, temp_3; - BITAND temp_3, FLAG_HIDDEN, temp_3; - IFNOT temp_3, 5; - ADDRESS self, flag, temp_3; - INDIRECT_F self, flag, temp_4; - SUB_F temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - INDIRECT_F self, _runFlag, temp_3; - BITAND temp_3, RUNFLAG_CLIPPED, temp_3; - IFNOT temp_3, 2; - RETURN offset_0; - CALL0 Item_Button_Update; - DONE; -} - -void () Item_Nex_HostCache_Entry_Draw; -void() Item_Nex_HostCache_Entry_Draw = asm -{ - CALL0 Item_Window_Draw; - CALL0 Item_Button_Draw; - DONE; -} - -void() Item_Nex_HostCache_Entry_Spawn = asm -{ -local float temp_3; -local float temp_4; - CALL0 Item_Window_Spawn; - CALL0 Item_Button_Spawn; - ADDRESS self, flag, temp_3; - INDIRECT_F self, flag, temp_4; - BITOR temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - INDIRECT_F self, flag, temp_3; - BITAND temp_3, FLAG_NOSELECT, temp_3; - IFNOT temp_3, 5; - ADDRESS self, flag, temp_3; - INDIRECT_F self, flag, temp_4; - SUB_F temp_4, FLAG_NOSELECT, temp_4; - STOREP_F temp_4, temp_3; - ADDRESS self, _draw, temp_3; - STOREP_FNC Item_Nex_HostCache_Entry_Draw, temp_3; - ADDRESS self, _update, temp_3; - STOREP_FNC Item_Nex_HostCache_Entry_Update, temp_3; - DONE; -} - -void() Item_Nex_HostCache_StringField_Update = asm -{ -local string lString; -local float lMaxLen; -local float temp_3; -local float temp_4; - INDIRECT_E self, _parent, temp_3; - INDIRECT_F temp_3, stepValue, temp_3; - LE HostCache_ViewCount, temp_3, temp_3; - IFNOT temp_3, 2; - RETURN offset_0; - INDIRECT_F self, size_x, temp_3; - INDIRECT_F self, fontSize_x, temp_4; - DIV_F temp_3, temp_4, parm0_x; - CALL1 floor; - STORE_F return_x, lMaxLen; - INDIRECT_F self, _realValue, temp_3; - INDIRECT_E self, _parent, temp_4; - INDIRECT_F temp_4, stepValue, temp_4; - STORE_F temp_3, parm0_x; - STORE_F temp_4, parm1_x; - CALL2 gethostcachestring; - STORE_S return_x, lString; - STORE_F lString, parm0_x; - CALL1 strlen; - LT lMaxLen, return_x, temp_3; - IFNOT temp_3, 10; - SUB_F lMaxLen, KEY_UNKNOWN, temp_3; - STORE_F lString, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 substring; - STORE_F return_x, parm0_x; - STORE_F "...", parm1_x; - CALL2 strcat; - STORE_S return_x, lString; - STORE_F self, parm0_x; - STORE_F text, parm1_x; - STORE_F lString, parm2_x; - CALL3 String_EntitySet; - CALL0 Item_Label_Update; - DONE; -} - -void() Item_Nex_HostCache_StringField_Spawn = asm -{ -local float locked_1174; -local float temp_4; - CALL0 Item_Label_Spawn; - ADDRESS self, _realValue, locked_1174; - INDIRECT_S self, target, parm0_x; - CALL1 gethostcacheindexforkey; - STOREP_F return_x, locked_1174; - ADDRESS self, _update, locked_1174; - STOREP_FNC Item_Nex_HostCache_StringField_Update, locked_1174; - DONE; -} - -void() Item_Nex_HostCache_ValueField_Update = asm -{ -local float temp_3; -local float temp_4; - INDIRECT_E self, _parent, temp_3; - INDIRECT_F temp_3, stepValue, temp_3; - LE HostCache_ViewCount, temp_3, temp_3; - IFNOT temp_3, 2; - RETURN offset_0; - INDIRECT_F self, _realValue, temp_3; - INDIRECT_E self, _parent, temp_4; - INDIRECT_F temp_4, stepValue, temp_4; - STORE_F temp_3, parm0_x; - STORE_F temp_4, parm1_x; - CALL2 gethostcachenumber; - STORE_F return_x, parm0_x; - CALL1 ftos; - STORE_F self, parm0_x; - STORE_F text, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - CALL0 Item_Label_Update; - DONE; -} - -void() Item_Nex_HostCache_ValueField_Spawn = asm -{ -local float locked_1174; -local float temp_4; - CALL0 Item_Label_Spawn; - ADDRESS self, _realValue, locked_1174; - INDIRECT_S self, target, parm0_x; - CALL1 gethostcacheindexforkey; - STOREP_F return_x, locked_1174; - ADDRESS self, _update, locked_1174; - STOREP_FNC Item_Nex_HostCache_ValueField_Update, locked_1174; - DONE; -} - -void() Item_Nex_HostCache_Players_Update = asm -{ -local string lMax; -local string lNum; -local float temp_3; - INDIRECT_E self, _parent, temp_3; - INDIRECT_F temp_3, stepValue, temp_3; - LE HostCache_ViewCount, temp_3, temp_3; - IFNOT temp_3, 2; - RETURN offset_0; - INDIRECT_E self, _parent, temp_3; - INDIRECT_F temp_3, stepValue, temp_3; - STORE_F SLIST_FIELD_NUMPLAYERS, parm0_x; - STORE_F temp_3, parm1_x; - CALL2 gethostcachenumber; - STORE_F return_x, parm0_x; - CALL1 ftos; - STORE_S return_x, lNum; - INDIRECT_E self, _parent, temp_3; - INDIRECT_F temp_3, stepValue, temp_3; - STORE_F SLIST_FIELD_MAXPLAYERS, parm0_x; - STORE_F temp_3, parm1_x; - CALL2 gethostcachenumber; - STORE_F return_x, parm0_x; - CALL1 ftos; - STORE_S return_x, lMax; - STORE_F lNum, parm0_x; - STORE_F "/", parm1_x; - STORE_F lMax, parm2_x; - CALL3 strcat; - STORE_F self, parm0_x; - STORE_F text, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - CALL0 Item_Label_Update; - DONE; -} - -void() Item_Nex_HostCache_Players_Spawn = asm -{ -local float temp_3; - CALL0 Item_Label_Spawn; - ADDRESS self, _update, temp_3; - STOREP_FNC Item_Nex_HostCache_Players_Update, temp_3; - DONE; -} - -void() Item_Nex_Credits_Spawn = asm -{ -local string lLine; -local string lText; -local float lFile; -local float temp_3; - INDIRECT_S self, target, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 fopen; - STORE_F return_x, lFile; - LT lFile, KEY_GAME, temp_3; - IFNOT temp_3, 4; - STORE_F self, parm0_x; - CALL1 Menu_DeleteAfterToggle; - RETURN offset_0; - CALL0 String_Create; - STORE_S return_x, lText; - STORE_F lFile, parm0_x; - CALL1 fgets; - STORE_S return_x, lLine; - STORE_F lLine, parm0_x; - STORE_F " -", parm1_x; - CALL2 strcat; - STORE_F lText, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Append; - STORE_S return_x, lText; - STORE_F lLine, parm0_x; - CALL1 validstring; - IF return_x, -12; - ADDRESS self, text, temp_3; - STOREP_S lText, temp_3; - STORE_F lFile, parm0_x; - CALL1 fclose; - CALL0 Item_MultiLabel_Spawn; - STORE_F lText, parm0_x; - CALL1 String_Free; - DONE; -} - -void () Nex_MessageBox_LeftEvent; -void () Nex_MessageBox_RightEvent; -void(string pTitle, string pText, string pLeftButton, string pRightButton, void () pLeftEvent, void () pRightEvent) Nex_MessageBox = asm -{ -local entity lItem; -local vector temp_0; -local float temp_3; -local float temp_4; - STORE_F "MessageBoxWnd::Layout::Title::Caption", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F lItem, parm0_x; - STORE_F normal, parm1_x; - STORE_F pTitle, parm2_x; - CALL3 String_EntitySet; - ADDRESS lItem, size_x, temp_0_x; - STOREP_V '0.000000 0.000000 0.000000', temp_0; - STORE_F "MessageBoxWnd::Layout::Text", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F lItem, parm0_x; - STORE_F text, parm1_x; - STORE_F pText, parm2_x; - CALL3 String_EntitySet; - ADDRESS lItem, size_x, temp_0_x; - STOREP_V '0.000000 0.000000 0.000000', temp_0; - STORE_F "MessageBoxWnd::Layout::Buttons::Left", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F lItem, parm0_x; - STORE_F normal, parm1_x; - STORE_F pLeftButton, parm2_x; - CALL3 String_EntitySet; - ADDRESS lItem, size_x, temp_0_x; - STOREP_V '0.000000 0.000000 0.000000', temp_0; - STORE_F "MessageBoxWnd::Layout::Buttons::Right", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - STORE_F lItem, parm0_x; - STORE_F normal, parm1_x; - STORE_F pRightButton, parm2_x; - CALL3 String_EntitySet; - ADDRESS lItem, size_x, temp_0_x; - STOREP_V '0.000000 0.000000 0.000000', temp_0; - STORE_F pRightButton, parm0_x; - CALL1 strlen; - EQ_F return_x, KEY_GAME, temp_3; - IFNOT temp_3, 6; - ADDRESS lItem, flag, temp_3; - INDIRECT_F lItem, flag, temp_4; - BITOR temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - GOTO 8; - INDIRECT_F lItem, flag, temp_3; - BITAND temp_3, FLAG_HIDDEN, temp_3; - IFNOT temp_3, 5; - ADDRESS lItem, flag, temp_3; - INDIRECT_F lItem, flag, temp_4; - SUB_F temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - STORE_FNC pLeftEvent, Nex_MessageBox_LeftEvent; - STORE_FNC pRightEvent, Nex_MessageBox_RightEvent; - STORE_F "MessageBoxWnd", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lItem; - INDIRECT_F lItem, flag, temp_3; - BITAND temp_3, FLAG_HIDDEN, temp_3; - IFNOT temp_3, 5; - ADDRESS lItem, flag, temp_3; - INDIRECT_F lItem, flag, temp_4; - SUB_F temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - STORE_F "MessageBoxWnd::Layout::Buttons::Right", parm0_x; - CALL1 Menu_GetItem; - STORE_F return_x, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 Menu_Select; - DONE; -} - -void () Nex_MessageBox_Hide; -void() Nex_MessageBox_Hide = asm -{ -local entity lEntity; -local float temp_3; -local float temp_4; - STORE_F "MessageBoxWnd", parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lEntity; - INDIRECT_F lEntity, flag, temp_3; - BITAND temp_3, FLAG_HIDDEN, temp_3; - IF temp_3, 7; - ADDRESS lEntity, flag, temp_3; - INDIRECT_F lEntity, flag, temp_4; - ADD_F temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - STORE_F KEY_GAME, parm0_x; - CALL1 Menu_Reselect; - DONE; -} - -void () Nex_MessageBox_LeftButton; -void() Nex_MessageBox_LeftButton = asm -{ - IFNOT Nex_MessageBox_LeftEvent, 2; - CALL0 Nex_MessageBox_LeftEvent; - CALL0 Nex_MessageBox_Hide; - DONE; -} - -void () Nex_MessageBox_RightButton; -void() Nex_MessageBox_RightButton = asm -{ - IFNOT Nex_MessageBox_RightEvent, 2; - CALL0 Nex_MessageBox_RightEvent; - CALL0 Nex_MessageBox_Hide; - DONE; -} - -float (float, float) Nex_MessageBox_Key; -float(float pKey, float pAscii) Nex_MessageBox_Key = asm -{ -local float temp_3; - EQ_F pKey, K_ESCAPE, temp_3; - IFNOT temp_3, 3; - CALL0 Nex_MessageBox_RightButton; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void() Item_Automation_Init = asm -{ -local float temp_3; - ADDRESS self, flag, temp_3; - STOREP_F FLAG_TEMPLATE, temp_3; - STORE_F self, parm0_x; - CALL1 Menu_DeleteAfterFrame; - DONE; -} - -void() Item_Task_Init = asm -{ -local float temp_3; - ADDRESS self, flag, temp_3; - STOREP_F FLAG_HIDDEN, temp_3; - DONE; -} - -void() Item_Automation_ForEach_Spawn = asm -{ -local float locked_1174; -local entity lLink; -local float temp_4; -local float temp_5; - CALL0 Item_Automation_Init; - INDIRECT_S self, link, locked_1174; - EQ_S locked_1174, "", locked_1174; - IFNOT locked_1174, 3; - INDIRECT_E self, _parent, lLink; - GOTO 4; - INDIRECT_S self, link, parm0_x; - CALL1 Menu_GetItem; - STORE_ENT return_x, lLink; - INDIRECT_S self, target, locked_1174; - NOT_S locked_1174, locked_1174; - IF locked_1174, 7; - INDIRECT_S self, target, parm0_x; - STORE_F "_Spawn", parm1_x; - CALL2 strcat; - STORE_F return_x, parm0_x; - CALL1 isfunction; - NOT_F return_x, temp_4; - OR locked_1174, temp_4, locked_1174; - IFNOT locked_1174, 4; - STORE_F "Bad target type!", parm0_x; - CALL1 objerror; - RETURN offset_0; - ADDRESS self, _current, locked_1174; - INDIRECT_E lLink, _child, temp_4; - STOREP_ENT temp_4, locked_1174; - INDIRECT_E self, _current, locked_1174; - IFNOT locked_1174, 12; - INDIRECT_E self, _current, locked_1174; - INDIRECT_S locked_1174, type, locked_1174; - INDIRECT_S self, target, temp_4; - EQ_S locked_1174, temp_4, locked_1174; - IFNOT locked_1174, 2; - CALL0 CtCall_Action; - ADDRESS self, _current, temp_4; - INDIRECT_E self, _current, temp_5; - INDIRECT_E temp_5, _next, temp_5; - STOREP_ENT temp_5, temp_4; - GOTO -12; - DONE; -} - -void() Item_Automation_Job_Spawn = asm -{ - CALL0 Item_Automation_Init; - CALL0 CtCall_Action; - DONE; -} - -void() Item_Task_Job_Spawn = asm -{ -local float temp_3; - CALL0 Item_Task_Init; - ADDRESS self, _reinit, temp_3; - STOREP_FNC CtCall_Reinit, temp_3; - ADDRESS self, _destroy, temp_3; - STOREP_FNC CtCall_Destroy, temp_3; - ADDRESS self, _update, temp_3; - STOREP_FNC CtCall_Update, temp_3; - CALL0 CtCall_Init; - DONE; -} - -void(entity pItem, bool pEvent) Raise_DataEvent = asm -{ -local float locked_1174; -local entity lOld; - INDIRECT_FU pItem, _dataEvent, locked_1174; - IF locked_1174, 2; - RETURN offset_0; - STORE_ENT self, lOld; - STORE_ENT pItem, self; - INDIRECT_FU self, _dataEvent, locked_1174; - STORE_F pEvent, parm0_x; - CALL1 locked_1174; - STORE_ENT lOld, self; - DONE; -} - -void() Data_ExecString_BeginUse = asm -{ - CALL0 String_Create; - STORE_S return_x, Data_ExecString; - DONE; -} - -void() Data_ExecString_EndUse = asm -{ - STORE_F Data_ExecString, parm0_x; - CALL1 String_Free; - DONE; -} - -void() Item_Data_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F value, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F defValue, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_Data_Init = asm -{ -local float temp_3; -local float temp_4; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F defValue, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - CALL2 String_EntityCreate; - ADDRESS self, flag, temp_3; - INDIRECT_F self, flag, temp_4; - BITOR temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - ADDRESS self, _destroy, temp_3; - STOREP_FNC Item_Data_Destroy, temp_3; - DONE; -} - -void() Item_DataLink_Update = asm -{ -local float locked_1174; -local float temp_4; - INDIRECT_S self, link, locked_1174; - EQ_S locked_1174, "", locked_1174; - IFNOT locked_1174, 4; - ADDRESS self, _link, locked_1174; - STOREP_ENT null_entity, locked_1174; - GOTO 10; - INDIRECT_S self, link, locked_1174; - INDIRECT_E self, _link, temp_4; - INDIRECT_S temp_4, name, temp_4; - NE_S locked_1174, temp_4, locked_1174; - IFNOT locked_1174, 5; - ADDRESS self, _link, locked_1174; - INDIRECT_S self, link, parm0_x; - CALL1 Menu_GetItem; - STOREP_ENT return_x, locked_1174; - DONE; -} - -void() Item_DataLink_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F link, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_DataLink_Init = asm -{ -local float temp_3; -local float temp_4; - ADDRESS self, flag, temp_3; - INDIRECT_F self, flag, temp_4; - BITOR temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - STORE_F self, parm0_x; - STORE_F link, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - CALL2 String_EntityZone; - CALL0 Item_DataLink_Update; - ADDRESS self, _destroy, temp_3; - STOREP_FNC Item_DataLink_Destroy, temp_3; - DONE; -} - -void() Item_DataLink_Switch_Destroy = asm -{ - CALL0 Item_DataLink_Destroy; - STORE_F self, parm0_x; - STORE_F descList, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_DataLink_Switch_Init = asm -{ -local float temp_3; - CALL0 Item_DataLink_Value_Spawn; - STORE_F self, parm0_x; - STORE_F descList, parm1_x; - CALL2 String_EntityZone; - ADDRESS self, _destroy, temp_3; - STOREP_FNC Item_DataLink_Switch_Destroy, temp_3; - DONE; -} - -float(entity pDataLink, float pValue) DataLink_Switch_GetOrdinal = asm -{ -local float temp_3; -local float temp_4; - INDIRECT_F pDataLink, stepValue, temp_3; - EQ_F temp_3, KEY_GAME, temp_3; - IFNOT temp_3, 2; - RETURN KEY_GAME; - INDIRECT_F pDataLink, minValue, temp_3; - SUB_F pValue, temp_3, temp_3; - INDIRECT_F pDataLink, stepValue, temp_4; - DIV_F temp_3, temp_4, temp_3; - RETURN temp_3; - DONE; -} - -void() Item_DataUser_Update = asm -{ -local float locked_1174; -local float temp_4; - INDIRECT_S self, target, locked_1174; - EQ_S locked_1174, "", locked_1174; - IFNOT locked_1174, 4; - ADDRESS self, _target, locked_1174; - STOREP_ENT null_entity, locked_1174; - GOTO 10; - INDIRECT_S self, target, locked_1174; - INDIRECT_E self, _target, temp_4; - INDIRECT_S temp_4, name, temp_4; - NE_S locked_1174, temp_4, locked_1174; - IFNOT locked_1174, 5; - ADDRESS self, _target, locked_1174; - INDIRECT_S self, target, parm0_x; - CALL1 Menu_GetItem; - STOREP_ENT return_x, locked_1174; - DONE; -} - -void() Item_DataUser_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_DataUser_Init = asm -{ -local float temp_3; - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityZone; - CALL0 Item_DataUser_Update; - ADDRESS self, _destroy, temp_3; - STOREP_FNC Item_DataUser_Destroy, temp_3; - DONE; -} - -void(float pEvent) Item_DataContainer_DataEvent = asm -{ -local entity lItem; -local float temp_3; -local float temp_4; - INDIRECT_E self, _child, lItem; - NE_E lItem, null_entity, temp_3; - IFNOT temp_3, 6; - STORE_F lItem, parm0_x; - STORE_F pEvent, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_E lItem, _next, lItem; - GOTO -6; - DONE; -} - -void() Item_DataContainer_Spawn = asm -{ -local float temp_3; - CALL0 Item_Container_Spawn; - ADDRESS self, _dataEvent, temp_3; - STOREP_FNC Item_DataContainer_DataEvent, temp_3; - DONE; -} - -void() Item_Data_Container_Reinit = asm -{ -local float temp_3; - INDIRECT_S self, _syncValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void(float pEvent) Item_Data_Container_DataEvent = asm -{ -local float temp_3; - GOTO 24; - INDIRECT_S self, _syncValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - GOTO 23; - INDIRECT_S self, value, temp_3; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - GOTO 17; - INDIRECT_S self, defValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - INDIRECT_S self, defValue, temp_3; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - GOTO 6; - IFNOT pEvent, -23; - EQ_F pEvent, ITEM_DATA_SEND, temp_3; - IF temp_3, -19; - EQ_F pEvent, ITEM_DATA_RESET, temp_3; - IF temp_3, -15; - DONE; -} - -void() Item_Data_Container_Spawn = asm -{ -local float temp_3; - CALL0 Item_Data_Init; - ADDRESS self, _reinit, temp_3; - STOREP_FNC Item_Data_Container_Reinit, temp_3; - ADDRESS self, _dataEvent, temp_3; - STOREP_FNC Item_Data_Container_DataEvent, temp_3; - INDIRECT_S self, defValue, temp_3; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () Item_Data_Cvar_Sync; -void() Item_Data_Cvar_Sync = asm -{ -local float temp_3; - INDIRECT_S self, cvarName, parm0_x; - CALL1 str_cvar; - STORE_F self, parm0_x; - STORE_F _syncValue, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - INDIRECT_S self, _syncValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void () Item_Data_Cvar_Send; -void() Item_Data_Cvar_Send = asm -{ -local float temp_3; -local float temp_4; - INDIRECT_S self, cvarName, temp_3; - INDIRECT_S self, value, temp_4; - STORE_F temp_3, parm0_x; - STORE_F temp_4, parm1_x; - CALL2 cvar_set; - CALL0 Item_Data_Cvar_Sync; - DONE; -} - -void () Item_Data_Cvar_Reset; -void() Item_Data_Cvar_Reset = asm -{ -local float temp_3; - INDIRECT_S self, defValue, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - CALL0 Item_Data_Cvar_Send; - DONE; -} - -void () Item_Data_Cvar_Test_Start; -void() Item_Data_Cvar_Test_Start = asm -{ -local float temp_3; -local float temp_4; - INDIRECT_S self, cvarName, temp_3; - INDIRECT_S self, value, temp_4; - STORE_F temp_3, parm0_x; - STORE_F temp_4, parm1_x; - CALL2 cvar_set; - DONE; -} - -void () Item_Data_Cvar_Test_End; -void() Item_Data_Cvar_Test_End = asm -{ -local float temp_3; -local float temp_4; - INDIRECT_S self, cvarName, temp_3; - INDIRECT_S self, _syncValue, temp_4; - STORE_F temp_3, parm0_x; - STORE_F temp_4, parm1_x; - CALL2 cvar_set; - DONE; -} - -void () Item_Data_Cvar_Save_ExecString; -void() Item_Data_Cvar_Save_ExecString = asm -{ -local float temp_3; -local float temp_4; - INDIRECT_S self, cvarName, temp_3; - INDIRECT_S self, value, temp_4; - STORE_F "set "", parm0_x; - STORE_F temp_3, parm1_x; - STORE_F "" "", parm2_x; - STORE_F temp_4, parm3_x; - STORE_F "" -", parm4_x; - CALL5 strcat; - STORE_F Data_ExecString, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Append; - STORE_S return_x, Data_ExecString; - DONE; -} - -void(float pEvent) Item_Data_Cvar_DataEvent = asm -{ -local float temp_3; - GOTO 13; - CALL0 Item_Data_Cvar_Sync; - GOTO 22; - CALL0 Item_Data_Cvar_Send; - GOTO 20; - CALL0 Item_Data_Cvar_Reset; - GOTO 18; - CALL0 Item_Data_Cvar_Test_Start; - GOTO 16; - CALL0 Item_Data_Cvar_Test_End; - GOTO 14; - CALL0 Item_Data_Cvar_Save_ExecString; - GOTO 12; - IFNOT pEvent, -12; - EQ_F pEvent, ITEM_DATA_SEND, temp_3; - IF temp_3, -12; - EQ_F pEvent, ITEM_DATA_RESET, temp_3; - IF temp_3, -12; - EQ_F pEvent, ITEM_DATA_TEST_START, temp_3; - IF temp_3, -12; - EQ_F pEvent, ITEM_DATA_TEST_END, temp_3; - IF temp_3, -12; - EQ_F pEvent, ITEM_DATA_SAVE_EXECSTRING, temp_3; - IF temp_3, -12; - DONE; -} - -void () Item_Data_Cvar_Destroy; -void() Item_Data_Cvar_Destroy = asm -{ - CALL0 Item_Data_Destroy; - STORE_F self, parm0_x; - STORE_F cvarName, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_Data_Cvar_Spawn = asm -{ -local float temp_3; -local float temp_4; - STORE_F self, parm0_x; - STORE_F cvarName, parm1_x; - CALL2 String_EntityZone; - CALL0 Item_Data_Init; - ADDRESS self, flag, temp_3; - INDIRECT_F self, flag, temp_4; - BITOR temp_4, FLAG_HIDDEN, temp_4; - STOREP_F temp_4, temp_3; - ADDRESS self, _dataEvent, temp_3; - STOREP_FNC Item_Data_Cvar_DataEvent, temp_3; - ADDRESS self, _reinit, temp_3; - STOREP_FNC Item_Data_Cvar_Sync, temp_3; - ADDRESS self, _destroy, temp_3; - STOREP_FNC Item_Data_Cvar_Destroy, temp_3; - DONE; -} - -void() Item_Data_CvarCreateSave_Spawn = asm -{ -local float temp_3; -local float temp_4; - CALL0 Item_Data_Cvar_Spawn; - INDIRECT_S self, cvarName, temp_3; - INDIRECT_S self, defValue, temp_4; - STORE_F temp_3, parm0_x; - STORE_F temp_4, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 registercvar; - DONE; -} - -void (float) Item_DataLink_Text_DataEvent; -void(float pEvent) Item_DataLink_Text_DataEvent = asm -{ -local float temp_3; -local float temp_4; - CALL0 Item_DataLink_Update; - EQ_F pEvent, ITEM_DATALINK_SET, temp_3; - IFNOT temp_3, 26; - INDIRECT_F self, maxValue, temp_3; - GE temp_3, KEY_GAME, temp_3; - IFNOT temp_3, 11; - INDIRECT_S self, value, temp_3; - INDIRECT_F self, maxValue, temp_4; - STORE_F temp_3, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F temp_4, parm2_x; - CALL3 substring; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - INDIRECT_E self, _link, temp_3; - IFNOT temp_3, 10; - INDIRECT_E self, _link, temp_3; - INDIRECT_S self, value, temp_4; - STORE_F temp_3, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_4, parm2_x; - CALL3 String_EntitySet; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - GOTO 33; - INDIRECT_E self, _link, temp_3; - IF temp_3, 3; - RETURN offset_0; - GOTO 29; - EQ_F pEvent, ITEM_DATALINK_GET, temp_3; - IFNOT temp_3, 24; - INDIRECT_E self, _link, temp_3; - INDIRECT_S temp_3, value, temp_3; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_3, parm2_x; - CALL3 String_EntitySet; - INDIRECT_F self, maxValue, temp_3; - GE temp_3, KEY_GAME, temp_3; - IFNOT temp_3, 14; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_S self, value, temp_3; - INDIRECT_F self, maxValue, temp_4; - STORE_F temp_3, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F temp_4, parm2_x; - CALL3 substring; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - GOTO 4; - INDIRECT_E self, _link, parm0_x; - STORE_F pEvent, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void () Item_DataLink_Text_Spawn; -void() Item_DataLink_Text_Spawn = asm -{ -local float temp_3; - CALL0 Item_DataLink_Init; - ADDRESS self, _dataEvent, temp_3; - STOREP_FNC Item_DataLink_Text_DataEvent, temp_3; - DONE; -} - -void() Item_DataLink_Value_Clamp = asm -{ -local float locked_285; -local float locked_1020; -local float locked_1174; -local float temp_0; -local float temp_1; - INDIRECT_F self, _realValue, locked_1174; - INDIRECT_F self, maxValue, locked_1020; - GT locked_1174, locked_1020, locked_1174; - IFNOT locked_1174, 4; - INDIRECT_F self, maxValue, locked_1020; - INDIRECT_F self, minValue, locked_285; - GT locked_1020, locked_285, locked_1020; - AND locked_1174, locked_1020, locked_1174; - IFNOT locked_1174, 5; - ADDRESS self, _realValue, locked_1174; - INDIRECT_F self, maxValue, locked_1020; - STOREP_F locked_1020, locked_1174; - GOTO 21; - INDIRECT_F self, _realValue, locked_1174; - INDIRECT_F self, minValue, locked_1020; - LT locked_1174, locked_1020, locked_1174; - IFNOT locked_1174, 5; - ADDRESS self, _realValue, locked_1174; - INDIRECT_F self, minValue, locked_1020; - STOREP_F locked_1020, locked_1174; - GOTO 13; - ADDRESS self, _realValue, locked_1174; - INDIRECT_F self, minValue, locked_1020; - INDIRECT_F self, stepValue, locked_285; - INDIRECT_F self, _realValue, temp_1; - INDIRECT_F self, minValue, temp_0; - SUB_F temp_1, temp_0, temp_0; - INDIRECT_F self, stepValue, temp_1; - DIV_F temp_0, temp_1, parm0_x; - CALL1 rint; - MUL_F locked_285, return_x, temp_0; - ADD_F locked_1020, temp_0, temp_0; - STOREP_F temp_0, locked_1174; - DONE; -} - -string () Item_DataLink_ClampedValue; -string() Item_DataLink_ClampedValue = asm -{ -local float locked_1586; -local float lClampedStep; -local float lLen; -local float temp_1; - INDIRECT_F self, stepValue, locked_1586; - INDIRECT_F self, stepValue, parm0_x; - CALL1 floor; - EQ_F locked_1586, return_x, locked_1586; - IFNOT locked_1586, 4; - INDIRECT_F self, _realValue, parm0_x; - CALL1 ftos; - RETURN return_x; - INDIRECT_F self, _realValue, parm0_x; - CALL1 rint; - STORE_F return_x, parm0_x; - CALL1 ftos; - STORE_F return_x, parm0_x; - CALL1 strlen; - STORE_F return_x, lLen; - INDIRECT_F self, stepValue, locked_1586; - INDIRECT_F self, stepValue, parm0_x; - CALL1 floor; - SUB_F locked_1586, return_x, locked_1586; - DIV_F FILE_APPEND, locked_1586, parm0_x; - CALL1 rint; - STORE_F return_x, lClampedStep; - STORE_F lClampedStep, parm0_x; - CALL1 ftos; - STORE_F return_x, parm0_x; - CALL1 strlen; - ADD_F lLen, return_x, lLen; - INDIRECT_F self, _realValue, parm0_x; - CALL1 ftos; - STORE_F return_x, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F lLen, parm2_x; - CALL3 substring; - RETURN return_x; - DONE; -} - -void (float) Item_DataLink_Value_DataEvent; -void(float pEvent) Item_DataLink_Value_DataEvent = asm -{ -local float locked_1586; -local float temp_1; - CALL0 Item_DataLink_Update; - EQ_F pEvent, ITEM_DATALINK_SET, locked_1586; - IFNOT locked_1586, 19; - CALL0 Item_DataLink_Value_Clamp; - INDIRECT_E self, _link, locked_1586; - IFNOT locked_1586, 15; - INDIRECT_E self, _link, locked_1586; - ADDRESS locked_1586, _realValue, locked_1586; - INDIRECT_F self, _realValue, temp_1; - STOREP_F temp_1, locked_1586; - INDIRECT_E self, _link, locked_1586; - INDIRECT_F self, _realValue, parm0_x; - CALL1 ftos; - STORE_F locked_1586, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - GOTO 25; - INDIRECT_E self, _link, locked_1586; - IF locked_1586, 3; - RETURN offset_0; - GOTO 21; - EQ_F pEvent, ITEM_DATALINK_GET, locked_1586; - IFNOT locked_1586, 16; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS self, _realValue, locked_1586; - INDIRECT_E self, _link, temp_1; - INDIRECT_S temp_1, value, parm0_x; - CALL1 stof; - STOREP_F return_x, locked_1586; - CALL0 Item_DataLink_ClampedValue; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - CALL0 Item_DataLink_Value_Clamp; - GOTO 4; - INDIRECT_E self, _link, parm0_x; - STORE_F pEvent, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void() Item_DataLink_Value_Spawn = asm -{ -local float temp_0; - CALL0 Item_DataLink_Init; - INDIRECT_F self, stepValue, temp_0; - EQ_F temp_0, KEY_GAME, temp_0; - IFNOT temp_0, 3; - ADDRESS self, stepValue, temp_0; - STOREP_F FILE_APPEND, temp_0; - ADDRESS self, _dataEvent, temp_0; - STOREP_FNC Item_DataLink_Value_DataEvent, temp_0; - DONE; -} - -void(float pEvent) Item_DataLink_TextSwitch_DataEvent = asm -{ -local float locked_1586; -local float lCount; -local float lPos; -local float temp_1; -local float temp_5; - CALL0 Item_DataLink_Update; - EQ_F pEvent, ITEM_DATALINK_SET, locked_1586; - IFNOT locked_1586, 20; - CALL0 Item_DataLink_Value_Clamp; - INDIRECT_E self, _link, locked_1586; - IFNOT locked_1586, 16; - INDIRECT_E self, _link, locked_1586; - INDIRECT_S self, valueList, temp_1; - INDIRECT_F self, _realValue, temp_5; - STORE_F temp_1, parm0_x; - STORE_F temp_5, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F locked_1586, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - GOTO 76; - INDIRECT_E self, _link, locked_1586; - IF locked_1586, 3; - RETURN offset_0; - GOTO 72; - EQ_F pEvent, ITEM_DATALINK_GET, locked_1586; - IFNOT locked_1586, 67; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_S self, valueList, locked_1586; - INDIRECT_F self, _realValue, temp_1; - STORE_F locked_1586, parm0_x; - STORE_F temp_1, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - INDIRECT_E self, _link, locked_1586; - INDIRECT_S locked_1586, value, locked_1586; - EQ_S return_x, locked_1586, locked_1586; - IFNOT locked_1586, 13; - INDIRECT_S self, descList, locked_1586; - INDIRECT_F self, _realValue, temp_1; - STORE_F locked_1586, parm0_x; - STORE_F temp_1, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - RETURN offset_0; - INDIRECT_S self, valueList, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - STORE_F KEY_GAME, lPos; - LT lPos, lCount, locked_1586; - IFNOT locked_1586, 13; - INDIRECT_S self, valueList, parm0_x; - STORE_F lPos, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - INDIRECT_E self, _link, locked_1586; - INDIRECT_S locked_1586, value, locked_1586; - EQ_S return_x, locked_1586, locked_1586; - IFNOT locked_1586, 2; - GOTO 3; - ADD_F lPos, FILE_APPEND, lPos; - GOTO -13; - GT lPos, lCount, locked_1586; - IFNOT locked_1586, 9; - INDIRECT_S self, descList, parm0_x; - CALL1 Util_GetAltStringCount; - GT return_x, lCount, locked_1586; - IFNOT locked_1586, 4; - STORE_F lPos, locked_1586; - ADD_F lPos, FILE_APPEND, lPos; - GOTO 2; - STORE_F KEY_GAME, lPos; - ADDRESS self, _realValue, locked_1586; - STOREP_F lPos, locked_1586; - INDIRECT_S self, descList, parm0_x; - STORE_F lPos, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - GOTO 4; - INDIRECT_E self, _link, parm0_x; - STORE_F pEvent, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void() Item_DataLink_TextSwitch_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F valueList, parm1_x; - CALL2 String_EntityFree; - CALL0 Item_DataLink_Switch_Destroy; - DONE; -} - -void() Item_DataLink_TextSwitch_Spawn = asm -{ -local float locked_1586; -local float temp_1; - CALL0 Item_DataLink_Switch_Init; - STORE_F self, parm0_x; - STORE_F valueList, parm1_x; - CALL2 String_EntityZone; - ADDRESS self, minValue, locked_1586; - STOREP_F KEY_GAME, locked_1586; - INDIRECT_F self, maxValue, locked_1586; - EQ_F locked_1586, KEY_GAME, locked_1586; - IFNOT locked_1586, 6; - ADDRESS self, maxValue, locked_1586; - INDIRECT_S self, valueList, parm0_x; - CALL1 Util_GetAltStringCount; - SUB_F return_x, FILE_APPEND, temp_1; - STOREP_F temp_1, locked_1586; - INDIRECT_F self, maxValue, locked_1586; - EQ_F locked_1586, KEY_GAME, locked_1586; - IFNOT locked_1586, 4; - ADDRESS self, stepValue, locked_1586; - STOREP_F KEY_GAME, locked_1586; - GOTO 3; - ADDRESS self, stepValue, locked_1586; - STOREP_F FILE_APPEND, locked_1586; - ADDRESS self, _destroy, locked_1586; - STOREP_FNC Item_DataLink_TextSwitch_Destroy, locked_1586; - ADDRESS self, _dataEvent, locked_1586; - STOREP_FNC Item_DataLink_TextSwitch_DataEvent, locked_1586; - DONE; -} - -void (float) Item_DataLink_ValueSwitch_DataEvent; -void(float pEvent) Item_DataLink_ValueSwitch_DataEvent = asm -{ -local float locked_1586; -local float lPos; -local float temp_1; - CALL0 Item_DataLink_Update; - EQ_F pEvent, ITEM_DATALINK_SET, locked_1586; - IFNOT locked_1586, 19; - CALL0 Item_DataLink_Value_Clamp; - INDIRECT_E self, _link, locked_1586; - IFNOT locked_1586, 15; - INDIRECT_E self, _link, locked_1586; - ADDRESS locked_1586, _realValue, locked_1586; - INDIRECT_F self, _realValue, temp_1; - STOREP_F temp_1, locked_1586; - INDIRECT_E self, _link, locked_1586; - INDIRECT_F self, _realValue, parm0_x; - CALL1 ftos; - STORE_F locked_1586, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - GOTO 36; - INDIRECT_E self, _link, locked_1586; - IF locked_1586, 3; - RETURN offset_0; - GOTO 32; - EQ_F pEvent, ITEM_DATALINK_GET, locked_1586; - IFNOT locked_1586, 27; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS self, _realValue, locked_1586; - INDIRECT_E self, _link, temp_1; - INDIRECT_S temp_1, value, parm0_x; - CALL1 stof; - STOREP_F return_x, locked_1586; - CALL0 Item_DataLink_Value_Clamp; - INDIRECT_F self, _realValue, locked_1586; - INDIRECT_F self, minValue, temp_1; - SUB_F locked_1586, temp_1, locked_1586; - INDIRECT_F self, stepValue, temp_1; - DIV_F locked_1586, temp_1, parm0_x; - CALL1 rint; - STORE_F return_x, lPos; - INDIRECT_S self, descList, parm0_x; - STORE_F lPos, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - GOTO 4; - INDIRECT_E self, _link, parm0_x; - STORE_F pEvent, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void() Item_DataLink_ValueSwitch_Spawn = asm -{ -local float locked_1585; -local float locked_1586; -local float lCount; -local float temp_5; -local float temp_6; - CALL0 Item_DataLink_Switch_Init; - INDIRECT_F self, maxValue, locked_1586; - EQ_F locked_1586, KEY_GAME, locked_1586; - IFNOT locked_1586, 11; - ADDRESS self, maxValue, locked_1586; - INDIRECT_F self, minValue, locked_1585; - INDIRECT_S self, descList, parm0_x; - CALL1 Util_GetAltStringCount; - SUB_F return_x, FILE_APPEND, temp_5; - INDIRECT_F self, stepValue, temp_6; - MUL_F temp_5, temp_6, temp_5; - ADD_F locked_1585, temp_5, locked_1585; - STOREP_F locked_1585, locked_1586; - GOTO 15; - INDIRECT_S self, descList, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - IFNOT lCount, 9; - ADDRESS self, stepValue, locked_1586; - INDIRECT_F self, maxValue, locked_1585; - INDIRECT_F self, minValue, temp_5; - SUB_F locked_1585, temp_5, locked_1585; - SUB_F lCount, FILE_APPEND, temp_5; - DIV_F locked_1585, temp_5, locked_1585; - STOREP_F locked_1585, locked_1586; - GOTO 3; - ADDRESS self, stepValue, locked_1586; - STOREP_F KEY_GAME, locked_1586; - ADDRESS self, _dataEvent, locked_1586; - STOREP_FNC Item_DataLink_ValueSwitch_DataEvent, locked_1586; - ADDRESS self, _destroy, locked_1586; - STOREP_FNC Item_DataLink_Switch_Destroy, locked_1586; - DONE; -} - -void (float) Item_DataLink_FastResync_DataEvent; -void(float pEvent) Item_DataLink_FastResync_DataEvent = asm -{ -local float temp_0; -local float temp_1; - EQ_F pEvent, ITEM_DATALINK_GET, temp_0; - IFNOT temp_0, 19; - INDIRECT_F self, _presstime, temp_0; - NE_F temp_0, Timer_Time, temp_0; - IFNOT temp_0, 6; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATA_SYNC, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS self, _presstime, temp_0; - STOREP_F Timer_Time, temp_0; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_E self, _link, temp_0; - INDIRECT_S temp_0, value, temp_0; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 String_EntitySet; - GOTO 18; - EQ_F pEvent, ITEM_DATALINK_SET, temp_0; - IFNOT temp_0, 13; - INDIRECT_E self, _link, temp_0; - IFNOT temp_0, 10; - INDIRECT_E self, _link, temp_0; - INDIRECT_S self, value, temp_1; - STORE_F temp_0, parm0_x; - STORE_F value, parm1_x; - STORE_F temp_1, parm2_x; - CALL3 String_EntitySet; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - GOTO 4; - INDIRECT_E self, _link, parm0_x; - STORE_F pEvent, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void() Item_DataLink_FastResync_Spawn = asm -{ -local float temp_0; -local float temp_1; - CALL0 Item_DataLink_Init; - ADDRESS self, _presstime, temp_0; - SUB_F Timer_Time, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - ADDRESS self, _dataEvent, temp_0; - STOREP_FNC Item_DataLink_FastResync_DataEvent, temp_0; - DONE; -} - -void (float) Item_DataLink_TextValue_DataEvent; -void(float pEvent) Item_DataLink_TextValue_DataEvent = asm -{ -local float locked_1586; -local float temp_1; - CALL0 Item_DataLink_Update; - EQ_F pEvent, ITEM_DATALINK_SET, locked_1586; - IFNOT locked_1586, 14; - INDIRECT_E self, _link, locked_1586; - ADDRESS locked_1586, _realValue, locked_1586; - INDIRECT_S self, value, parm0_x; - CALL1 stof; - STOREP_F return_x, locked_1586; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS self, _realValue, locked_1586; - INDIRECT_E self, _link, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - STOREP_F temp_1, locked_1586; - GOTO 39; - INDIRECT_E self, _link, locked_1586; - IF locked_1586, 3; - RETURN offset_0; - GOTO 35; - EQ_F pEvent, ITEM_DATALINK_GET, locked_1586; - IFNOT locked_1586, 20; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_E self, _link, locked_1586; - INDIRECT_F locked_1586, _realValue, locked_1586; - INDIRECT_F self, _realValue, temp_1; - NE_F locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 11; - ADDRESS self, _realValue, locked_1586; - INDIRECT_E self, _link, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - STOREP_F temp_1, locked_1586; - INDIRECT_E self, _link, locked_1586; - INDIRECT_S locked_1586, value, locked_1586; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F locked_1586, parm2_x; - CALL3 String_EntitySet; - GOTO 14; - INDIRECT_E self, _link, parm0_x; - STORE_F pEvent, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS self, _realValue, locked_1586; - INDIRECT_E self, _link, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - STOREP_F temp_1, locked_1586; - INDIRECT_E self, _link, locked_1586; - INDIRECT_S locked_1586, value, locked_1586; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F locked_1586, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void() Item_DataLink_TextValue_Spawn = asm -{ -local float temp_0; -local float temp_1; - CALL0 Item_DataLink_Init; - ADDRESS self, _dataEvent, temp_0; - STOREP_FNC Item_DataLink_TextValue_DataEvent, temp_0; - ADDRESS self, _realValue, temp_0; - INDIRECT_E self, _link, temp_1; - INDIRECT_F temp_1, minValue, temp_1; - SUB_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - DONE; -} - -float () _IDLTT_ConvertTime; -float() _IDLTT_ConvertTime = asm -{ -local float lCounter; -local float lCount; -local float lCurrent; -local float lTotal; -local float temp_0; - STORE_F KEY_GAME, lTotal; - INDIRECT_S self, value, parm0_x; - CALL1 tokenize; - STORE_F return_x, lCount; - STORE_F KEY_GAME, lCounter; - LT lCounter, lCount, temp_0; - IFNOT temp_0, 16; - STORE_F lCounter, parm0_x; - CALL1 argv; - STORE_F return_x, parm0_x; - CALL1 stof; - STORE_F return_x, lCurrent; - MUL_F lTotal, 60.000000, temp_0; - ADD_F temp_0, lCurrent, lTotal; - ADD_F lCounter, FILE_APPEND, lCounter; - STORE_F lCounter, parm0_x; - CALL1 argv; - NE_S return_x, ":", temp_0; - IFNOT temp_0, 2; - GOTO 3; - ADD_F lCounter, FILE_APPEND, lCounter; - GOTO -16; - STORE_F lTotal, parm0_x; - CALL1 rint; - RETURN return_x; - DONE; -} - -string () _IDLTT_MakeString; -string() _IDLTT_MakeString = asm -{ -local float lCurrent; -local float lTotal; -local string lString; -local float temp_0; - INDIRECT_F self, _realValue, parm0_x; - CALL1 rint; - STORE_F return_x, lTotal; - STORE_S "", lString; - STORE_F lTotal, parm0_x; - STORE_F 60.000000, parm1_x; - CALL2 mod; - STORE_F return_x, lCurrent; - EQ_S lString, "", temp_0; - IFNOT temp_0, 7; - STORE_F lCurrent, parm0_x; - CALL1 ftos; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lString; - GOTO 11; - STORE_F lCurrent, parm0_x; - CALL1 ftos; - STORE_F return_x, parm0_x; - STORE_F ":", parm1_x; - STORE_F lString, parm2_x; - CALL3 strcat; - STORE_F lString, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - STORE_S return_x, lString; - DIV_F lTotal, 60.000000, parm0_x; - CALL1 floor; - STORE_F return_x, lTotal; - IF lTotal, -25; - RETURN lString; - DONE; -} - -void (float) Item_DataLink_TextTime_DataEvent; -void(float pEvent) Item_DataLink_TextTime_DataEvent = asm -{ -local float locked_1586; -local float temp_1; - CALL0 Item_DataLink_Update; - EQ_F pEvent, ITEM_DATALINK_SET, locked_1586; - IFNOT locked_1586, 13; - INDIRECT_E self, _link, locked_1586; - ADDRESS locked_1586, _realValue, locked_1586; - CALL0 _IDLTT_ConvertTime; - STOREP_F return_x, locked_1586; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS self, _realValue, locked_1586; - INDIRECT_E self, _link, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - STOREP_F temp_1, locked_1586; - GOTO 41; - INDIRECT_E self, _link, locked_1586; - IF locked_1586, 3; - RETURN offset_0; - GOTO 37; - EQ_F pEvent, ITEM_DATALINK_GET, locked_1586; - IFNOT locked_1586, 21; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_E self, _link, locked_1586; - INDIRECT_F locked_1586, _realValue, locked_1586; - INDIRECT_F self, _realValue, temp_1; - NE_F locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 12; - ADDRESS self, _realValue, locked_1586; - INDIRECT_E self, _link, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - STOREP_F temp_1, locked_1586; - CALL0 _IDLTT_MakeString; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - GOTO 15; - INDIRECT_E self, _link, parm0_x; - STORE_F pEvent, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS self, _realValue, locked_1586; - INDIRECT_E self, _link, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - STOREP_F temp_1, locked_1586; - CALL0 _IDLTT_MakeString; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - DONE; -} - -void() Item_DataLink_TextTime_Spawn = asm -{ -local float temp_0; -local float temp_1; - CALL0 Item_DataLink_Init; - ADDRESS self, _dataEvent, temp_0; - STOREP_FNC Item_DataLink_TextTime_DataEvent, temp_0; - ADDRESS self, _realValue, temp_0; - INDIRECT_E self, _link, temp_1; - INDIRECT_F temp_1, minValue, temp_1; - SUB_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - DONE; -} - -void (float) Item_DataLink_AltString_DataEvent; -void(float pEvent) Item_DataLink_AltString_DataEvent = asm -{ -local float locked_1586; -local float temp_1; -local float temp_5; -local float temp_6; - CALL0 Item_DataLink_Update; - INDIRECT_E self, _link, locked_1586; - IF locked_1586, 2; - RETURN offset_0; - EQ_F pEvent, ITEM_DATALINK_SET, locked_1586; - IFNOT locked_1586, 16; - INDIRECT_E self, _link, locked_1586; - ADDRESS locked_1586, value, locked_1586; - INDIRECT_E self, _link, temp_1; - INDIRECT_S temp_1, value, temp_1; - INDIRECT_F self, stepValue, temp_5; - INDIRECT_S self, value, temp_6; - STORE_F temp_1, parm0_x; - STORE_F temp_5, parm1_x; - STORE_F temp_6, parm2_x; - CALL3 Util_SetAltStringItem; - STOREP_S return_x, locked_1586; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - GOTO 22; - EQ_F pEvent, ITEM_DATALINK_GET, locked_1586; - IFNOT locked_1586, 17; - INDIRECT_E self, _link, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_E self, _link, locked_1586; - INDIRECT_S locked_1586, value, locked_1586; - INDIRECT_F self, stepValue, temp_1; - STORE_F locked_1586, parm0_x; - STORE_F temp_1, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F self, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - GOTO 4; - INDIRECT_E self, _link, parm0_x; - STORE_F pEvent, parm1_x; - CALL2 Raise_DataEvent; - DONE; -} - -void() Item_DataLink_AltString_Spawn = asm -{ -local float temp_0; - CALL0 Item_DataLink_Init; - ADDRESS self, _dataEvent, temp_0; - STOREP_FNC Item_DataLink_AltString_DataEvent, temp_0; - DONE; -} - -void (float) Item_DataLink_Router_DataEvent; -void(float pEvent) Item_DataLink_Router_DataEvent = asm -{ -local entity lChild; -local float temp_0; -local float temp_1; - GOTO 29; - INDIRECT_E self, _child, lChild; - IFNOT lChild, 9; - ADDRESS lChild, _realValue, temp_0; - INDIRECT_F self, _realValue, temp_1; - STOREP_F temp_1, temp_0; - STORE_F lChild, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_E lChild, _next, lChild; - GOTO -8; - INDIRECT_E self, _child, temp_0; - IFNOT temp_0, 8; - INDIRECT_E self, _child, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS self, _realValue, temp_0; - INDIRECT_E self, _child, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - STOREP_F temp_1, temp_0; - GOTO 14; - INDIRECT_E self, _child, lChild; - IFNOT lChild, 6; - STORE_F lChild, parm0_x; - STORE_F pEvent, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_E lChild, _next, lChild; - GOTO -5; - GOTO 6; - EQ_F pEvent, ITEM_DATALINK_SET, temp_0; - IF temp_0, -29; - EQ_F pEvent, ITEM_DATALINK_GET, temp_0; - IF temp_0, -21; - GOTO -12; - DONE; -} - -void() Item_DataLink_Router_Spawn = asm -{ -local float temp_0; - CALL0 Item_DataLink_Init; - ADDRESS self, _dataEvent, temp_0; - STOREP_FNC Item_DataLink_Router_DataEvent, temp_0; - DONE; -} - -float(float pKey, float pAscii) Item_Window_Key = asm -{ - STORE_F pKey, parm0_x; - STORE_F pAscii, parm1_x; - CALL2 CtCall_Key; - IFNOT return_x, 2; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void() Item_Window_Draw = asm -{ -local vector lColor; -local entity lChild; -local float temp_0; -local vector temp_2; -local vector temp_3; - IF sys_debug, 2; - RETURN offset_0; - INDIRECT_F self, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_MOUSEINAREA, temp_0; - IFNOT temp_0, 56; - IFNOT sys_debug_area, 50; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_V self, size_x, temp_3; - STORE_V temp_2, parm0; - STORE_V temp_3, parm1; - STORE_V '0.200000 0.000000 0.000000', parm2; - STORE_F ITEM_BUTTON_ACTIONTIME, parm3_x; - STORE_F KEY_GAME, parm4_x; - CALL5 Menu_Fill; - INDIRECT_E self, _child, lChild; - IFNOT lChild, 40; - INDIRECT_F lChild, _runFlag, temp_0; - BITAND temp_0, 96.000000, temp_0; - NOT_F temp_0, temp_0; - IF temp_0, 2; - GOTO 33; - INDIRECT_F lChild, orderPos, parm0_x; - CALL1 fabs; - ADD_F return_x, SLIST_SERVERREPLYCOUNT, parm0_x; - STORE_F K_TAB, parm1_x; - CALL2 mod; - DIV_F return_x, 8.000000, lColor_x; - INDIRECT_F lChild, orderPos, temp_0; - MUL_F temp_0, 8.000000, parm0_x; - CALL1 fabs; - STORE_F return_x, parm0_x; - STORE_F K_TAB, parm1_x; - CALL2 mod; - DIV_F return_x, 8.000000, lColor_y; - INDIRECT_F lChild, orderPos, temp_0; - MUL_F temp_0, SLIST_SORTDESCENDING, parm0_x; - CALL1 fabs; - STORE_F return_x, parm0_x; - STORE_F K_TAB, parm1_x; - CALL2 mod; - DIV_F return_x, 8.000000, lColor_z; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_V self, origin_x, temp_3; - ADD_V temp_2, temp_3, temp_2; - INDIRECT_V lChild, pos_x, temp_3; - ADD_V temp_2, temp_3, temp_2; - INDIRECT_V lChild, size_x, temp_3; - STORE_V temp_2, parm0; - STORE_V temp_3, parm1; - STORE_V lColor, parm2; - STORE_F ITEM_BUTTON_ACTIONTIME, parm3_x; - STORE_F KEY_GAME, parm4_x; - CALL5 Menu_Fill; - INDIRECT_E lChild, _next, lChild; - GOTO -39; - IFNOT sys_debug_mouse, 5; - INDIRECT_V self, origin_x, temp_2; - SUB_V Menu_Cursor_Position, temp_2, temp_2; - INDIRECT_V self, pos_x, temp_3; - SUB_V temp_2, temp_3, sys_debug_cursor_localpos; - DONE; -} - -void() Item_Window_Spawn = asm -{ -local float temp_0; -local float temp_1; - ADDRESS self, flag, temp_0; - INDIRECT_F self, flag, temp_1; - BITOR temp_1, FLAG_NOSELECT, temp_1; - STOREP_F temp_1, temp_0; - ADDRESS self, _key, temp_0; - STOREP_FNC Item_Window_Key, temp_0; - ADDRESS self, _draw, temp_0; - STOREP_FNC Item_Window_Draw, temp_0; - DONE; -} - -void() Item_Reference_Update = asm -{ -local float locked_1586; -local float temp_1; - INDIRECT_S self, link, locked_1586; - EQ_S locked_1586, "", locked_1586; - IFNOT locked_1586, 4; - ADDRESS self, _child, locked_1586; - STOREP_ENT null_entity, locked_1586; - RETURN offset_0; - INDIRECT_S self, link, locked_1586; - INDIRECT_E self, _link, temp_1; - INDIRECT_S temp_1, name, temp_1; - NE_S locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 5; - ADDRESS self, _link, locked_1586; - INDIRECT_S self, link, parm0_x; - CALL1 Menu_GetItem; - STOREP_ENT return_x, locked_1586; - ADDRESS self, _child, locked_1586; - INDIRECT_E self, _link, temp_1; - STOREP_ENT temp_1, locked_1586; - INDIRECT_E self, _child, locked_1586; - ADDRESS locked_1586, _parent, locked_1586; - STOREP_ENT self, locked_1586; - DONE; -} - -void() Item_Reference_Draw = asm -{ -local vector temp_2; -local vector temp_3; - IFNOT sys_debug_ref, 9; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_V self, size_x, temp_3; - STORE_V temp_2, parm0; - STORE_V temp_3, parm1; - STORE_V '0.000000 0.000000 0.200000', parm2; - STORE_F FILE_APPEND, parm3_x; - STORE_F FILE_APPEND, parm4_x; - CALL5 Menu_Fill; - DONE; -} - -void() Item_Reference_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F link, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_Reference_Spawn = asm -{ -local float temp_0; -local float temp_1; - ADDRESS self, flag, temp_0; - INDIRECT_F self, flag, temp_1; - BITOR temp_1, FLAG_NOSELECT, temp_1; - BITOR temp_1, FLAG_EMBEDDED, temp_1; - STOREP_F temp_1, temp_0; - STORE_F self, parm0_x; - STORE_F link, parm1_x; - CALL2 String_EntityZone; - CALL0 Item_Reference_Update; - ADDRESS self, _destroy, temp_0; - STOREP_FNC Item_Reference_Destroy, temp_0; - ADDRESS self, _draw, temp_0; - STOREP_FNC Item_Reference_Draw, temp_0; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_Reference_Update, temp_0; - DONE; -} - -void() Item_Layout_Update = asm -{ -local vector lCurrent; -local entity lChild; -local float temp_0; -local float temp_1; - STORE_V '0.000000 0.000000 0.000000', lCurrent; - INDIRECT_E self, _child, lChild; - IFNOT lChild, 92; - INDIRECT_F lChild, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_HIDDEN, temp_0; - IFNOT temp_0, 2; - GOTO 86; - INDIRECT_F self, direction_y, temp_0; - IFNOT temp_0, 33; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, ITEM_ALIGN_FIRST, temp_0; - IFNOT temp_0, 2; - INDIRECT_E lChild, _child, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 7; - ADDRESS lChild, pos_x, temp_0; - INDIRECT_E lChild, _child, temp_1; - INDIRECT_F temp_1, size_x, temp_1; - SUB_F lCurrent_x, temp_1, temp_1; - STOREP_F temp_1, temp_0; - GOTO 20; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, KEY_GAME, temp_0; - IFNOT temp_0, 4; - ADDRESS lChild, pos_x, temp_0; - STOREP_F lCurrent_x, temp_0; - GOTO 14; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, ITEM_ALIGN_CENTER, temp_0; - IFNOT temp_0, 7; - ADDRESS lChild, pos_x, temp_0; - INDIRECT_F lChild, size_x, temp_1; - DIV_F temp_1, KEY_MENU, temp_1; - SUB_F lCurrent_x, temp_1, temp_1; - STOREP_F temp_1, temp_0; - GOTO 5; - ADDRESS lChild, pos_x, temp_0; - INDIRECT_F lChild, size_x, temp_1; - SUB_F lCurrent_x, temp_1, temp_1; - STOREP_F temp_1, temp_0; - GOTO 3; - ADDRESS lChild, pos_x, temp_0; - STOREP_F lCurrent_x, temp_0; - INDIRECT_F self, direction_x, temp_0; - IFNOT temp_0, 33; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, KEY_GAME, temp_0; - IFNOT temp_0, 4; - ADDRESS lChild, pos_y, temp_0; - STOREP_F lCurrent_y, temp_0; - GOTO 26; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, ITEM_ALIGN_CENTER, temp_0; - IFNOT temp_0, 7; - ADDRESS lChild, pos_y, temp_0; - INDIRECT_F lChild, size_y, temp_1; - DIV_F temp_1, KEY_MENU, temp_1; - SUB_F lCurrent_y, temp_1, temp_1; - STOREP_F temp_1, temp_0; - GOTO 17; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, ITEM_ALIGN_FIRST, temp_0; - IFNOT temp_0, 2; - INDIRECT_E lChild, _child, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 7; - ADDRESS lChild, pos_y, temp_0; - INDIRECT_E lChild, _child, temp_1; - INDIRECT_F temp_1, size_y, temp_1; - SUB_F lCurrent_y, temp_1, temp_1; - STOREP_F temp_1, temp_0; - GOTO 5; - ADDRESS lChild, pos_y, temp_0; - INDIRECT_F lChild, size_y, temp_1; - SUB_F lCurrent_y, temp_1, temp_1; - STOREP_F temp_1, temp_0; - GOTO 3; - ADDRESS lChild, pos_y, temp_0; - STOREP_F lCurrent_y, temp_0; - INDIRECT_F self, direction_x, temp_0; - IFNOT temp_0, 6; - INDIRECT_F lChild, size_x, temp_0; - INDIRECT_F self, direction_x, temp_1; - ADD_F temp_0, temp_1, temp_0; - ADD_F lCurrent_x, temp_0, lCurrent_x; - GOTO 7; - INDIRECT_F self, direction_y, temp_0; - IFNOT temp_0, 5; - INDIRECT_F lChild, size_y, temp_0; - INDIRECT_F self, direction_y, temp_1; - ADD_F temp_0, temp_1, temp_0; - ADD_F lCurrent_y, temp_0, lCurrent_y; - INDIRECT_E lChild, _next, lChild; - GOTO -91; - DONE; -} - -void() Item_Layout_Spawn = asm -{ -local float temp_0; - CALL0 Item_Window_Spawn; - CALL0 Item_Layout_Update; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_Layout_Update, temp_0; - DONE; -} - -void() Item_Arrangement_CalculateSize = asm -{ -local entity lChild; -local vector lMax; -local vector lMin; -local float temp_0; -local float temp_1; -local vector temp_2; -local vector temp_3; - STORE_V '0.000000 0.000000 0.000000', lMax; - STORE_F INFINITY, lMin_x; - STORE_F INFINITY, lMin_y; - INDIRECT_E self, _child, lChild; - IFNOT lChild, 31; - INDIRECT_F lChild, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_HIDDEN, temp_0; - IFNOT temp_0, 2; - GOTO 25; - INDIRECT_F lChild, pos_x, temp_0; - STORE_F lMin_x, parm0_x; - STORE_F temp_0, parm1_x; - CALL2 min; - STORE_F return_x, lMin_x; - INDIRECT_F lChild, pos_y, temp_0; - STORE_F lMin_y, parm0_x; - STORE_F temp_0, parm1_x; - CALL2 min; - STORE_F return_x, lMin_y; - INDIRECT_F lChild, pos_x, temp_0; - INDIRECT_F lChild, size_x, temp_1; - ADD_F temp_0, temp_1, temp_0; - STORE_F lMax_x, parm0_x; - STORE_F temp_0, parm1_x; - CALL2 max; - STORE_F return_x, lMax_x; - INDIRECT_F lChild, pos_y, temp_0; - INDIRECT_F lChild, size_y, temp_1; - ADD_F temp_0, temp_1, temp_0; - STORE_F lMax_y, parm0_x; - STORE_F temp_0, parm1_x; - CALL2 max; - STORE_F return_x, lMax_y; - INDIRECT_E lChild, _next, lChild; - GOTO -30; - ADDRESS self, size_x, temp_2_x; - SUB_V lMax, lMin, temp_3; - STOREP_V temp_3_x, temp_2; - DONE; -} - -void() Item_Arrangement_Update = asm -{ -local float temp_0; -local float temp_1; - CALL0 Item_Layout_Update; - CALL0 Item_Arrangement_CalculateSize; - INDIRECT_F self, direction_x, temp_0; - IFNOT temp_0, 23; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, KEY_GAME, temp_0; - IFNOT temp_0, 4; - ADDRESS self, origin_y, temp_0; - STOREP_F KEY_GAME, temp_0; - GOTO 16; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, ITEM_ALIGN_CENTER, temp_0; - IF temp_0, 3; - INDIRECT_F self, alignment, temp_1; - EQ_F temp_1, ITEM_ALIGN_FIRST, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 6; - ADDRESS self, origin_y, temp_0; - INDIRECT_F self, size_y, temp_1; - DIV_F temp_1, KEY_MENU, temp_1; - STOREP_F temp_1, temp_0; - GOTO 4; - ADDRESS self, origin_y, temp_0; - INDIRECT_F self, size_y, temp_1; - STOREP_F temp_1, temp_0; - GOTO 3; - ADDRESS self, origin_y, temp_0; - STOREP_F KEY_GAME, temp_0; - INDIRECT_F self, direction_y, temp_0; - IFNOT temp_0, 23; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, KEY_GAME, temp_0; - IFNOT temp_0, 4; - ADDRESS self, origin_x, temp_0; - STOREP_F KEY_GAME, temp_0; - GOTO 16; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, ITEM_ALIGN_CENTER, temp_0; - IF temp_0, 3; - INDIRECT_F self, alignment, temp_1; - EQ_F temp_1, ITEM_ALIGN_FIRST, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 6; - ADDRESS self, origin_x, temp_0; - INDIRECT_F self, size_x, temp_1; - DIV_F temp_1, KEY_MENU, temp_1; - STOREP_F temp_1, temp_0; - GOTO 4; - ADDRESS self, origin_x, temp_0; - INDIRECT_F self, size_x, temp_1; - STOREP_F temp_1, temp_0; - GOTO 3; - ADDRESS self, origin_x, temp_0; - STOREP_F KEY_GAME, temp_0; - DONE; -} - -void() Item_Arrangement_Spawn = asm -{ -local float temp_0; - CALL0 Item_Layout_Spawn; - CALL0 Item_Arrangement_Update; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_Arrangement_Update, temp_0; - DONE; -} - -void() Item_ScrollWindow_Update = asm -{ -local float locked_1586; -local entity lParent; -local float lOldLevel; -local float lLevel; -local float temp_1; -local float temp_5; -local float temp_6; - INDIRECT_F self, _runFlag, locked_1586; - BITAND locked_1586, 96.000000, locked_1586; - NOT_F locked_1586, locked_1586; - NOT_F locked_1586, locked_1586; - IF locked_1586, 6; - INDIRECT_E self, _child, temp_1; - STORE_F Menu_ActiveItem, parm0_x; - STORE_F temp_1, parm1_x; - CALL2 _Menu_IsEmbeddedParentOf; - NOT_F return_x, temp_1; - OR locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 4; - ADDRESS self, _link, locked_1586; - STOREP_ENT null_entity, locked_1586; - RETURN offset_0; - INDIRECT_E self, _link, locked_1586; - EQ_E locked_1586, Menu_ActiveItem, locked_1586; - IFNOT locked_1586, 3; - RETURN offset_0; - GOTO 3; - ADDRESS self, _link, locked_1586; - STOREP_ENT Menu_ActiveItem, locked_1586; - INDIRECT_F Menu_ActiveItem, pos_y, lLevel; - INDIRECT_E Menu_ActiveItem, _parent, lParent; - NE_E lParent, self, locked_1586; - IFNOT locked_1586, 7; - INDIRECT_F lParent, origin_y, locked_1586; - INDIRECT_F lParent, pos_y, temp_1; - ADD_F locked_1586, temp_1, locked_1586; - ADD_F lLevel, locked_1586, lLevel; - INDIRECT_E lParent, _parent, lParent; - GOTO -7; - INDIRECT_F self, origin_y, locked_1586; - SUB_F KEY_GAME, locked_1586, lOldLevel; - INDIRECT_F Menu_ActiveItem, size_y, locked_1586; - INDIRECT_F self, size_y, temp_1; - GT locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 4; - INDIRECT_F Menu_ActiveItem, size_y, temp_1; - ADD_F lLevel, temp_1, temp_1; - GT temp_1, lOldLevel, temp_1; - AND locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 4; - INDIRECT_F self, size_y, temp_1; - ADD_F temp_1, lOldLevel, temp_1; - LT lLevel, temp_1, temp_1; - AND locked_1586, temp_1, locked_1586; - IF locked_1586, 9; - GE lLevel, lOldLevel, temp_1; - IFNOT temp_1, 6; - INDIRECT_F Menu_ActiveItem, size_y, temp_5; - ADD_F lLevel, temp_5, temp_5; - INDIRECT_F self, size_y, temp_6; - ADD_F lOldLevel, temp_6, temp_6; - LT temp_5, temp_6, temp_5; - AND temp_1, temp_5, temp_1; - OR locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 2; - RETURN offset_0; - LT lOldLevel, lLevel, locked_1586; - IFNOT locked_1586, 6; - ADDRESS self, origin_y, locked_1586; - INDIRECT_F self, direction_x, temp_1; - SUB_F temp_1, lLevel, temp_1; - STOREP_F temp_1, locked_1586; - GOTO 7; - ADDRESS self, origin_y, locked_1586; - INDIRECT_F self, size_y, temp_1; - INDIRECT_F self, direction_x, temp_5; - SUB_F temp_1, temp_5, temp_1; - SUB_F temp_1, lLevel, temp_1; - STOREP_F temp_1, locked_1586; - ADDRESS self, origin_y, locked_1586; - INDIRECT_F self, size_y, temp_1; - INDIRECT_E self, _child, temp_5; - INDIRECT_F temp_5, size_y, temp_5; - SUB_F temp_1, temp_5, temp_1; - INDIRECT_F self, origin_y, temp_5; - STORE_F temp_1, parm0_x; - STORE_F temp_5, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 bound; - STOREP_F return_x, locked_1586; - DONE; -} - -void () Item_ScrollWindow_Reinit; -void() Item_ScrollWindow_Reinit = asm -{ -local float temp_0; - ADDRESS self, origin_y, temp_0; - STOREP_F KEY_GAME, temp_0; - DONE; -} - -void() Item_ScrollWindow_Spawn = asm -{ -local float temp_0; - CALL0 Item_Window_Spawn; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_ScrollWindow_Update, temp_0; - ADDRESS self, _reinit, temp_0; - STOREP_FNC Item_ScrollWindow_Reinit, temp_0; - DONE; -} - -void() Item_EventWindow_Spawn = asm -{ -local float temp_0; - CALL0 Item_Window_Spawn; - ADDRESS self, _destroy, temp_0; - STOREP_FNC CtCall_Destroy, temp_0; - ADDRESS self, _reinit, temp_0; - STOREP_FNC CtCall_Reinit, temp_0; - ADDRESS self, _update, temp_0; - STOREP_FNC CtCall_Update, temp_0; - CALL0 CtCall_Init; - DONE; -} - -void() Item_Frame_Spawn = asm -{ -local float temp_0; -local float temp_1; - CALL0 Item_Window_Spawn; - ADDRESS self, flag, temp_0; - INDIRECT_F self, flag, temp_1; - SUB_F temp_1, FLAG_NOSELECT, temp_1; - STOREP_F temp_1, temp_0; - DONE; -} - -float () _IL_GetItemUnderCursor; -float() _IL_GetItemUnderCursor = asm -{ -local float locked_1586; -local float lLines; -local float lStart; -local float lItem; -local float temp_1; -local float temp_5; - INDIRECT_F self, size_y, locked_1586; - INDIRECT_F self, fontSize_y, temp_1; - ADD_F temp_1, KEY_MENU, temp_1; - DIV_F locked_1586, temp_1, parm0_x; - CALL1 floor; - STORE_F return_x, lLines; - INDIRECT_E self, _target, locked_1586; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - STORE_F locked_1586, parm0_x; - STORE_F temp_1, parm1_x; - CALL2 DataLink_Switch_GetOrdinal; - DIV_F lLines, KEY_MENU, locked_1586; - SUB_F return_x, locked_1586, parm0_x; - CALL1 floor; - STORE_F KEY_GAME, parm0_x; - STORE_F return_x, parm1_x; - CALL2 max; - STORE_F return_x, lStart; - INDIRECT_F self, pos_y, locked_1586; - SUB_F Menu_Cursor_Position_y, locked_1586, locked_1586; - INDIRECT_F self, fontSize_y, temp_1; - ADD_F temp_1, KEY_MENU, temp_1; - DIV_F locked_1586, temp_1, parm0_x; - CALL1 floor; - STORE_F return_x, lItem; - ADD_F lStart, lItem, locked_1586; - INDIRECT_E self, _target, temp_1; - INDIRECT_E self, _target, temp_5; - INDIRECT_F temp_5, maxValue, temp_5; - STORE_F temp_1, parm0_x; - STORE_F temp_5, parm1_x; - CALL2 DataLink_Switch_GetOrdinal; - STORE_F locked_1586, parm0_x; - STORE_F return_x, parm1_x; - CALL2 min; - STORE_F return_x, lItem; - RETURN lItem; - DONE; -} - -void() Item_List_Draw = asm -{ -local float locked_1586; -local string lText; -local float lItemUnderCursor; -local vector lPos; -local float lEnd; -local float lLine; -local float lLines; -local float lStart; -local float temp_1; -local vector temp_2; -local vector temp_3; -local float temp_5; - INDIRECT_E self, _target, locked_1586; - IF locked_1586, 2; - RETURN offset_0; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_F self, size_y, locked_1586; - INDIRECT_F self, fontSize_y, temp_1; - ADD_F temp_1, KEY_MENU, temp_1; - DIV_F locked_1586, temp_1, parm0_x; - CALL1 floor; - STORE_F return_x, lLines; - INDIRECT_E self, _target, locked_1586; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - STORE_F locked_1586, parm0_x; - STORE_F temp_1, parm1_x; - CALL2 DataLink_Switch_GetOrdinal; - DIV_F lLines, KEY_MENU, locked_1586; - SUB_F return_x, locked_1586, parm0_x; - CALL1 floor; - STORE_F KEY_GAME, parm0_x; - STORE_F return_x, parm1_x; - CALL2 max; - STORE_F return_x, lStart; - ADD_F lStart, lLines, locked_1586; - INDIRECT_E self, _target, temp_1; - INDIRECT_E self, _target, temp_5; - INDIRECT_F temp_5, maxValue, temp_5; - STORE_F temp_1, parm0_x; - STORE_F temp_5, parm1_x; - CALL2 DataLink_Switch_GetOrdinal; - STORE_F locked_1586, parm0_x; - STORE_F return_x, parm1_x; - CALL2 min; - STORE_F return_x, lEnd; - INDIRECT_F self, _state, locked_1586; - EQ_F locked_1586, ITEM_STATE_NORMAL, locked_1586; - IFNOT locked_1586, 3; - STORE_F ERR_CANNOTOPEN, lItemUnderCursor; - GOTO 3; - CALL0 _IL_GetItemUnderCursor; - STORE_F return_x, lItemUnderCursor; - INDIRECT_V self, pos_x, temp_2; - ADD_V '0.000000 1.000000 0.000000', temp_2, lPos; - STORE_F lStart, lLine; - LE lLine, lEnd, locked_1586; - IFNOT locked_1586, 89; - INDIRECT_E self, _target, locked_1586; - INDIRECT_S locked_1586, descList, parm0_x; - STORE_F lLine, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_S return_x, lText; - INDIRECT_E self, _target, locked_1586; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - STORE_F locked_1586, parm0_x; - STORE_F temp_1, parm1_x; - CALL2 DataLink_Switch_GetOrdinal; - EQ_F lLine, return_x, locked_1586; - IFNOT locked_1586, 43; - INDIRECT_F self, _state, locked_1586; - EQ_F locked_1586, ITEM_STATE_SELECTED, locked_1586; - IFNOT locked_1586, 13; - INDIRECT_V self, fontSize_x, temp_2; - INDIRECT_V self, colorSelected_x, temp_3; - INDIRECT_F self, alphas_y, locked_1586; - INDIRECT_F self, drawFlags_y, temp_1; - STORE_V lPos, parm0; - STORE_F lText, parm1_x; - STORE_V temp_2, parm2; - STORE_V temp_3, parm3; - STORE_F locked_1586, parm4_x; - STORE_F temp_1, parm5_x; - CALL6 Menu_DrawString; - GOTO 27; - INDIRECT_F self, _state, locked_1586; - EQ_F locked_1586, ITEM_STATE_PRESSED, locked_1586; - IFNOT locked_1586, 13; - INDIRECT_V self, fontSize_x, temp_2; - INDIRECT_V self, colorPressed_x, temp_3; - INDIRECT_F self, alphas_z, locked_1586; - INDIRECT_F self, drawFlags_z, temp_1; - STORE_V lPos, parm0; - STORE_F lText, parm1_x; - STORE_V temp_2, parm2; - STORE_V temp_3, parm3; - STORE_F locked_1586, parm4_x; - STORE_F temp_1, parm5_x; - CALL6 Menu_DrawString; - GOTO 12; - INDIRECT_V self, fontSize_x, temp_2; - INDIRECT_V self, colorInactive_x, temp_3; - INDIRECT_F self, alphaInactive, locked_1586; - INDIRECT_F self, drawFlagInactive, temp_1; - STORE_V lPos, parm0; - STORE_F lText, parm1_x; - STORE_V temp_2, parm2; - STORE_V temp_3, parm3; - STORE_F locked_1586, parm4_x; - STORE_F temp_1, parm5_x; - CALL6 Menu_DrawString; - GOTO 26; - EQ_F lLine, lItemUnderCursor, locked_1586; - IFNOT locked_1586, 13; - INDIRECT_V self, fontSize_x, temp_2; - INDIRECT_V self, colorInactive_x, temp_3; - INDIRECT_F self, alphaInactive, locked_1586; - INDIRECT_F self, drawFlagInactive, temp_1; - STORE_V lPos, parm0; - STORE_F lText, parm1_x; - STORE_V temp_2, parm2; - STORE_V temp_3, parm3; - STORE_F locked_1586, parm4_x; - STORE_F temp_1, parm5_x; - CALL6 Menu_DrawString; - GOTO 12; - INDIRECT_V self, fontSize_x, temp_2; - INDIRECT_V self, color_x, temp_3; - INDIRECT_F self, alphas_x, locked_1586; - INDIRECT_F self, drawFlags_x, temp_1; - STORE_V lPos, parm0; - STORE_F lText, parm1_x; - STORE_V temp_2, parm2; - STORE_V temp_3, parm3; - STORE_F locked_1586, parm4_x; - STORE_F temp_1, parm5_x; - CALL6 Menu_DrawString; - INDIRECT_F self, fontSize_y, locked_1586; - ADD_F lPos_y, locked_1586, locked_1586; - ADD_F locked_1586, KEY_MENU, lPos_y; - STORE_F lText, parm0_x; - CALL1 String_Free; - STORE_F lLine, temp_1; - ADD_F lLine, FILE_APPEND, lLine; - GOTO -89; - DONE; -} - -void() Item_List_Update = asm -{ -local float temp_0; - CALL0 Item_DataUser_Update; - INDIRECT_F self, _presstime, temp_0; - ADD_F temp_0, ITEM_BUTTON_ACTIONTIME, temp_0; - GT temp_0, Timer_Time, temp_0; - IFNOT temp_0, 4; - ADDRESS self, _state, temp_0; - STOREP_F ITEM_STATE_PRESSED, temp_0; - GOTO 8; - EQ_E Menu_ActiveItem, self, temp_0; - IFNOT temp_0, 4; - ADDRESS self, _state, temp_0; - STOREP_F ITEM_STATE_SELECTED, temp_0; - GOTO 3; - ADDRESS self, _state, temp_0; - STOREP_F ITEM_STATE_NORMAL, temp_0; - DONE; -} - -void(float pSelect, float pUser) Item_List_Select = asm -{ -local float temp_0; - IFNOT pSelect, 1; - AND pSelect, pUser, temp_0; - IFNOT temp_0, 3; - INDIRECT_S self, soundSelected, parm0_x; - CALL1 Sound_Play; - DONE; -} - -float(float pKey, float pAscii) Item_List_Key = asm -{ -local float lSelected; -local float temp_0; -local float temp_1; - EQ_F pKey, K_DOWNARROW, temp_0; - IFNOT temp_0, 16; - INDIRECT_S self, soundPressed, parm0_x; - CALL1 Sound_Play; - ADDRESS self, _presstime, temp_0; - STOREP_F Timer_Time, temp_0; - INDIRECT_E self, _target, temp_0; - ADDRESS temp_0, _realValue, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - ADD_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - RETURN FILE_APPEND; - GOTO 49; - EQ_F pKey, K_UPARROW, temp_0; - IFNOT temp_0, 16; - INDIRECT_S self, soundPressed, parm0_x; - CALL1 Sound_Play; - ADDRESS self, _presstime, temp_0; - STOREP_F Timer_Time, temp_0; - INDIRECT_E self, _target, temp_0; - ADDRESS temp_0, _realValue, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - SUB_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - RETURN FILE_APPEND; - GOTO 32; - EQ_F pKey, K_MOUSE1, temp_0; - IFNOT temp_0, 30; - INDIRECT_S self, soundPressed, parm0_x; - CALL1 Sound_Play; - CALL0 _IL_GetItemUnderCursor; - INDIRECT_E self, _target, temp_0; - INDIRECT_F temp_0, stepValue, temp_0; - MUL_F return_x, temp_0, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, minValue, temp_1; - ADD_F temp_0, temp_1, lSelected; - INDIRECT_F self, _presstime, temp_0; - ADD_F temp_0, ITEM_BUTTON_ACTIONTIME, temp_0; - GT temp_0, Timer_Time, temp_0; - IFNOT temp_0, 4; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - EQ_F lSelected, temp_1, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 3; - CALL0 CtCall_Action; - GOTO 9; - ADDRESS self, _presstime, temp_0; - STOREP_F Timer_Time, temp_0; - INDIRECT_E self, _target, temp_0; - ADDRESS temp_0, _realValue, temp_0; - STOREP_F lSelected, temp_0; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void() Item_List_Destroy = asm -{ - CALL0 CtCall_Destroy; - STORE_F self, parm0_x; - STORE_F soundSelected, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F soundPressed, parm1_x; - CALL2 String_EntityFree; - CALL0 Item_DataUser_Destroy; - DONE; -} - -void() Item_List_Spawn = asm -{ -local float temp_0; - CALL0 Item_DataUser_Init; - STORE_F self, parm0_x; - STORE_F soundSelected, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F soundPressed, parm1_x; - CALL2 String_EntityZone; - INDIRECT_S self, soundSelected, parm0_x; - CALL1 Sound_Precache; - INDIRECT_S self, soundPressed, parm0_x; - CALL1 Sound_Precache; - ADDRESS self, _draw, temp_0; - STOREP_FNC Item_List_Draw, temp_0; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_List_Update, temp_0; - ADDRESS self, _select, temp_0; - STOREP_FNC Item_List_Select, temp_0; - ADDRESS self, _key, temp_0; - STOREP_FNC Item_List_Key, temp_0; - ADDRESS self, _reinit, temp_0; - STOREP_FNC CtCall_Reinit, temp_0; - CALL0 CtCall_Init; - DONE; -} - -float (string) _IB_IsPicture; -float(string pString) _IB_IsPicture = asm -{ -local float temp_0; - STORE_F pString, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 substring; - EQ_S return_x, "$", temp_0; - RETURN temp_0; - DONE; -} - -string (string) _IB_GetPath; -string(string pString) _IB_GetPath = asm -{ - STORE_F pString, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F 1000.000000, parm2_x; - CALL3 substring; - RETURN return_x; - DONE; -} - -vector (string) _IB_GetSize; -vector(string pString) _IB_GetSize = asm -{ -local vector lSize; -local float temp_0; - STORE_F pString, parm0_x; - CALL1 _IB_IsPicture; - IFNOT return_x, 6; - STORE_F pString, parm0_x; - CALL1 _IB_GetPath; - STORE_F return_x, parm0_x; - CALL1 Gfx_GetImageSize; - RETURN return_x; - STORE_F pString, parm0_x; - CALL1 strlen; - INDIRECT_F self, fontSize_x, temp_0; - MUL_F return_x, temp_0, lSize_x; - INDIRECT_F self, fontSize_y, lSize_y; - STORE_F KEY_GAME, lSize_z; - RETURN lSize_x; - DONE; -} - -vector () _IB_GetMaxSize; -vector() _IB_GetMaxSize = asm -{ -local vector lSize; -local vector lPressed; -local vector lSelected; -local vector lNormal; -local float temp_0; - INDIRECT_S self, normal, parm0_x; - CALL1 _IB_GetSize; - STORE_V return, lNormal; - INDIRECT_S self, selected, parm0_x; - CALL1 _IB_GetSize; - STORE_V return, lSelected; - INDIRECT_S self, pressed, parm0_x; - CALL1 _IB_GetSize; - STORE_V return, lPressed; - STORE_F lNormal_x, parm0_x; - STORE_F lSelected_x, parm1_x; - STORE_F lPressed_x, parm2_x; - CALL3 max; - STORE_F return_x, lSize_x; - STORE_F lNormal_y, parm0_x; - STORE_F lSelected_y, parm1_x; - STORE_F lPressed_y, parm2_x; - CALL3 max; - STORE_F return_x, lSize_y; - STORE_F KEY_GAME, lSize_z; - RETURN lSize_x; - DONE; -} - -void (string, vector, float, float) _IB_Draw; -void(string pName, vector pColor, float pAlpha, float pDrawFlag) _IB_Draw = asm -{ -local vector lMaxSize; -local vector lPos; -local vector lSize; -local float temp_0; -local float temp_1; -local vector temp_2; - STORE_F pName, parm0_x; - CALL1 _IB_GetSize; - STORE_V return, lSize; - CALL0 _IB_GetMaxSize; - STORE_V return, lMaxSize; - STORE_F pName, parm0_x; - CALL1 _IB_IsPicture; - IFNOT return_x, 7; - INDIRECT_F self, size_x, temp_0; - DIV_F temp_0, lMaxSize_x, temp_0; - MUL_F lSize_x, temp_0, lSize_x; - INDIRECT_F self, size_y, temp_0; - DIV_F temp_0, lMaxSize_y, temp_0; - MUL_F lSize_y, temp_0, lSize_y; - INDIRECT_F self, pos_y, lPos_y; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, KEY_GAME, temp_0; - IFNOT temp_0, 2; - INDIRECT_F self, pos_x, lPos_x; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, ITEM_ALIGN_CENTER, temp_0; - IFNOT temp_0, 7; - INDIRECT_F self, pos_x, temp_0; - INDIRECT_F self, size_x, temp_1; - SUB_F temp_1, lSize_x, temp_1; - DIV_F temp_1, KEY_MENU, temp_1; - ADD_F temp_0, temp_1, lPos_x; - GOTO 10; - INDIRECT_F self, alignment, temp_0; - EQ_F temp_0, ITEM_ALIGN_RIGHT, temp_0; - IFNOT temp_0, 6; - INDIRECT_F self, pos_x, temp_0; - INDIRECT_F self, size_x, temp_1; - ADD_F temp_0, temp_1, temp_0; - SUB_F temp_0, lSize_x, lPos_x; - GOTO 2; - INDIRECT_F self, pos_x, lPos_x; - STORE_F pName, parm0_x; - CALL1 _IB_IsPicture; - IFNOT return_x, 11; - STORE_F pName, parm0_x; - CALL1 _IB_GetPath; - STORE_V lPos, parm0; - STORE_F return_x, parm1_x; - STORE_V lSize, parm2; - STORE_V pColor, parm3; - STORE_F pAlpha, parm4_x; - STORE_F pDrawFlag, parm5_x; - CALL6 Menu_DrawPicture; - GOTO 9; - INDIRECT_V self, fontSize_x, temp_2; - STORE_V lPos, parm0; - STORE_F pName, parm1_x; - STORE_V temp_2, parm2; - STORE_V pColor, parm3; - STORE_F pAlpha, parm4_x; - STORE_F pDrawFlag, parm5_x; - CALL6 Menu_DrawString; - DONE; -} - -void() Item_Button_Draw = asm -{ -local string lText; -local float temp_0; -local float temp_1; -local vector temp_2; -local float temp_5; - INDIRECT_F self, _state, temp_0; - EQ_F temp_0, ITEM_STATE_NORMAL, temp_0; - IFNOT temp_0, 11; - INDIRECT_S self, normal, temp_0; - INDIRECT_V self, color_x, temp_2; - INDIRECT_F self, alphas_x, temp_1; - INDIRECT_F self, drawFlags_x, temp_5; - STORE_F temp_0, parm0_x; - STORE_V temp_2, parm1; - STORE_F temp_1, parm2_x; - STORE_F temp_5, parm3_x; - CALL4 _IB_Draw; - GOTO 41; - INDIRECT_F self, _state, temp_0; - EQ_F temp_0, ITEM_STATE_SELECTED, temp_0; - IFNOT temp_0, 16; - INDIRECT_S self, selected, temp_0; - NE_S temp_0, string_null, temp_0; - IFNOT temp_0, 3; - INDIRECT_S self, selected, lText; - GOTO 2; - INDIRECT_S self, normal, lText; - INDIRECT_V self, colorSelected_x, temp_2; - INDIRECT_F self, alphas_y, temp_0; - INDIRECT_F self, drawFlags_y, temp_1; - STORE_F lText, parm0_x; - STORE_V temp_2, parm1; - STORE_F temp_0, parm2_x; - STORE_F temp_1, parm3_x; - CALL4 _IB_Draw; - GOTO 23; - INDIRECT_F self, _state, temp_0; - EQ_F temp_0, ITEM_STATE_PRESSED, temp_0; - IFNOT temp_0, 20; - INDIRECT_S self, pressed, temp_0; - NE_S temp_0, string_null, temp_0; - IFNOT temp_0, 3; - INDIRECT_S self, pressed, lText; - GOTO 7; - INDIRECT_S self, selected, temp_0; - NE_S temp_0, string_null, temp_0; - IFNOT temp_0, 3; - INDIRECT_S self, selected, lText; - GOTO 2; - INDIRECT_S self, normal, lText; - INDIRECT_V self, colorPressed_x, temp_2; - INDIRECT_F self, alphas_z, temp_0; - INDIRECT_F self, drawFlags_z, temp_1; - STORE_F lText, parm0_x; - STORE_V temp_2, parm1; - STORE_F temp_0, parm2_x; - STORE_F temp_1, parm3_x; - CALL4 _IB_Draw; - DONE; -} - -void () _IB_Calc; -void() _IB_Calc = asm -{ -local float locked_1292; -local float temp_0; - INDIRECT_V self, size_x, locked_1292; - EQ_V locked_1292, '0.000000 0.000000 0.000000', temp_0; - IFNOT temp_0, 4; - ADDRESS self, size_x, locked_1292; - CALL0 _IB_GetMaxSize; - STOREP_V return_x, locked_1292; - DONE; -} - -void() Item_Button_Update = asm -{ -local float temp_0; - CALL0 Item_Link_Update; - CALL0 _IB_Calc; - INDIRECT_F self, _presstime, temp_0; - ADD_F temp_0, ITEM_BUTTON_ACTIONTIME, temp_0; - GT temp_0, Timer_Time, temp_0; - IFNOT temp_0, 4; - ADDRESS self, _state, temp_0; - STOREP_F ITEM_STATE_PRESSED, temp_0; - GOTO 8; - CALL0 Item_Link_IsSelected; - IFNOT return_x, 4; - ADDRESS self, _state, temp_0; - STOREP_F ITEM_STATE_SELECTED, temp_0; - GOTO 3; - ADDRESS self, _state, temp_0; - STOREP_F ITEM_STATE_NORMAL, temp_0; - DONE; -} - -void(float pSelect, float pUser) Item_Button_Select = asm -{ -local float temp_0; - IFNOT pSelect, 1; - AND pSelect, pUser, temp_0; - IFNOT temp_0, 3; - INDIRECT_S self, soundSelected, parm0_x; - CALL1 Sound_Play; - DONE; -} - -float(float pKey, float pAscii) Item_Button_Key = asm -{ -local float temp_0; -local float temp_1; - STORE_F pKey, parm0_x; - STORE_F pAscii, parm1_x; - CALL2 Item_Link_Key; - IFNOT return_x, 2; - RETURN FILE_APPEND; - EQ_F pKey, K_SPACE, temp_0; - IF temp_0, 2; - EQ_F pKey, K_ENTER, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 2; - EQ_F pKey, K_MOUSE1, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 7; - INDIRECT_S self, soundPressed, parm0_x; - CALL1 Sound_Play; - ADDRESS self, _presstime, temp_0; - STOREP_F Timer_Time, temp_0; - CALL0 CtCall_Action; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void() Item_Button_Destroy = asm -{ - CALL0 CtCall_Destroy; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F selected, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F pressed, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F soundSelected, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F soundPressed, parm1_x; - CALL2 String_EntityFree; - CALL0 Item_Link_Destroy; - DONE; -} - -void() Item_Button_Spawn = asm -{ -local float temp_0; -local float temp_1; - ADDRESS self, _presstime, temp_0; - SUB_F Timer_Time, FILE_APPEND, temp_1; - SUB_F temp_1, ITEM_BUTTON_ACTIONTIME, temp_1; - STOREP_F temp_1, temp_0; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F selected, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F pressed, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F soundSelected, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F soundPressed, parm1_x; - CALL2 String_EntityZone; - CALL0 Item_Link_Init; - INDIRECT_S self, normal, parm0_x; - CALL1 _IB_IsPicture; - IFNOT return_x, 5; - INDIRECT_S self, normal, parm0_x; - CALL1 _IB_GetPath; - STORE_F return_x, parm0_x; - CALL1 Gfx_Precache; - INDIRECT_S self, selected, parm0_x; - CALL1 _IB_IsPicture; - IFNOT return_x, 5; - INDIRECT_S self, selected, parm0_x; - CALL1 _IB_GetPath; - STORE_F return_x, parm0_x; - CALL1 Gfx_Precache; - INDIRECT_S self, pressed, parm0_x; - CALL1 _IB_IsPicture; - IFNOT return_x, 5; - INDIRECT_S self, pressed, parm0_x; - CALL1 _IB_GetPath; - STORE_F return_x, parm0_x; - CALL1 Gfx_Precache; - INDIRECT_S self, soundSelected, parm0_x; - CALL1 Sound_Precache; - INDIRECT_S self, soundPressed, parm0_x; - CALL1 Sound_Precache; - CALL0 _IB_Calc; - ADDRESS self, _reinit, temp_0; - STOREP_FNC CtCall_Reinit, temp_0; - ADDRESS self, _destroy, temp_0; - STOREP_FNC Item_Button_Destroy, temp_0; - ADDRESS self, _key, temp_0; - STOREP_FNC Item_Button_Key, temp_0; - ADDRESS self, _draw, temp_0; - STOREP_FNC Item_Button_Draw, temp_0; - ADDRESS self, _select, temp_0; - STOREP_FNC Item_Button_Select, temp_0; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_Button_Update, temp_0; - CALL0 CtCall_Init; - DONE; -} - -void() Item_EditBox_Draw = asm -{ -local float lAlpha; -local vector lCursor; -local float temp_0; -local float temp_1; -local vector temp_2; -local vector temp_3; -local vector temp_4; -local float temp_5; - INDIRECT_E self, _target, temp_0; - IF temp_0, 2; - RETURN offset_0; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_F self, _state, temp_0; - EQ_F temp_0, ITEM_STATE_NORMAL, temp_0; - IFNOT temp_0, 18; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_V self, origin_x, temp_3; - ADD_V temp_2, temp_3, temp_2; - INDIRECT_E self, _target, temp_0; - INDIRECT_S temp_0, value, temp_0; - INDIRECT_V self, fontSize_x, temp_3; - INDIRECT_V self, color_x, temp_4; - INDIRECT_F self, alphas_x, temp_1; - INDIRECT_F self, drawFlags_x, temp_5; - STORE_V temp_2, parm0; - STORE_F temp_0, parm1_x; - STORE_V temp_3, parm2; - STORE_V temp_4, parm3; - STORE_F temp_1, parm4_x; - STORE_F temp_5, parm5_x; - CALL6 Menu_DrawString; - RETURN offset_0; - INDIRECT_F self, _cursorPos, temp_0; - INDIRECT_F self, fontSize_x, temp_1; - MUL_F temp_0, temp_1, lCursor_x; - INDIRECT_F self, fontSize_y, lCursor_y; - MUL_F Timer_Time, 1000.000000, parm0_x; - STORE_F 500.000000, parm1_x; - CALL2 mod; - GT return_x, 250.000000, temp_0; - IFNOT temp_0, 3; - STORE_F FILE_APPEND, lAlpha; - GOTO 2; - STORE_F KEY_GAME, lAlpha; - INDIRECT_F self, _state, temp_0; - EQ_F temp_0, ITEM_STATE_SELECTED, temp_0; - IFNOT temp_0, 35; - INDIRECT_F self, sizeCursor_y, temp_0; - SUB_F lCursor_y, temp_0, lCursor_y; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_V self, origin_x, temp_3; - ADD_V temp_2, temp_3, temp_2; - INDIRECT_E self, _target, temp_0; - INDIRECT_S temp_0, value, temp_0; - INDIRECT_V self, fontSize_x, temp_3; - INDIRECT_V self, colorSelected_x, temp_4; - INDIRECT_F self, alphas_y, temp_1; - INDIRECT_F self, drawFlags_y, temp_5; - STORE_V temp_2, parm0; - STORE_F temp_0, parm1_x; - STORE_V temp_3, parm2; - STORE_V temp_4, parm3; - STORE_F temp_1, parm4_x; - STORE_F temp_5, parm5_x; - CALL6 Menu_DrawString; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_V self, origin_x, temp_3; - ADD_V temp_2, temp_3, temp_2; - ADD_V temp_2, lCursor, temp_2; - INDIRECT_V self, sizeCursor_x, temp_3; - INDIRECT_V self, colorCursor_x, temp_4; - INDIRECT_F self, alphasCursor_x, temp_0; - MUL_F temp_0, lAlpha, temp_0; - INDIRECT_F self, drawFlagsCursor_x, temp_1; - STORE_V temp_2, parm0; - STORE_V temp_3, parm1; - STORE_V temp_4, parm2; - STORE_F temp_0, parm3_x; - STORE_F temp_1, parm4_x; - CALL5 Menu_Fill; - GOTO 34; - INDIRECT_F self, sizeCursorFlash_y, temp_0; - SUB_F lCursor_y, temp_0, lCursor_y; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_V self, origin_x, temp_3; - ADD_V temp_2, temp_3, temp_2; - INDIRECT_E self, _target, temp_0; - INDIRECT_S temp_0, value, temp_0; - INDIRECT_V self, fontSize_x, temp_3; - INDIRECT_V self, colorPressed_x, temp_4; - INDIRECT_F self, alphas_z, temp_1; - INDIRECT_F self, drawFlags_z, temp_5; - STORE_V temp_2, parm0; - STORE_F temp_0, parm1_x; - STORE_V temp_3, parm2; - STORE_V temp_4, parm3; - STORE_F temp_1, parm4_x; - STORE_F temp_5, parm5_x; - CALL6 Menu_DrawString; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_V self, origin_x, temp_3; - ADD_V temp_2, temp_3, temp_2; - ADD_V temp_2, lCursor, temp_2; - INDIRECT_V self, sizeCursorFlash_x, temp_3; - INDIRECT_V self, colorCursorFlash_x, temp_4; - INDIRECT_F self, alphasCursor_y, temp_0; - MUL_F temp_0, lAlpha, temp_0; - INDIRECT_F self, drawFlagsCursor_y, temp_1; - STORE_V temp_2, parm0; - STORE_V temp_3, parm1; - STORE_V temp_4, parm2; - STORE_F temp_0, parm3_x; - STORE_F temp_1, parm4_x; - CALL5 Menu_Fill; - DONE; -} - -void() Item_EditBox_Update = asm -{ -local float locked_1585; -local float locked_1586; -local float temp_5; -local float temp_6; - CALL0 Item_DataUser_Update; - INDIRECT_F self, _presstime, locked_1586; - ADD_F locked_1586, ITEM_EDITBOX_FLASHTIME, locked_1586; - GT locked_1586, Timer_Time, locked_1586; - IFNOT locked_1586, 4; - ADDRESS self, _state, locked_1586; - STOREP_F ITEM_STATE_PRESSED, locked_1586; - GOTO 8; - EQ_E Menu_ActiveItem, self, locked_1586; - IFNOT locked_1586, 4; - ADDRESS self, _state, locked_1586; - STOREP_F ITEM_STATE_SELECTED, locked_1586; - GOTO 3; - ADDRESS self, _state, locked_1586; - STOREP_F ITEM_STATE_NORMAL, locked_1586; - INDIRECT_E self, _target, locked_1586; - IF locked_1586, 2; - RETURN offset_0; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS self, _cursorPos, locked_1586; - INDIRECT_F self, _cursorPos, locked_1585; - INDIRECT_E self, _target, temp_5; - INDIRECT_S temp_5, value, parm0_x; - CALL1 strlen; - STORE_F KEY_GAME, parm0_x; - STORE_F locked_1585, parm1_x; - STORE_F return_x, parm2_x; - CALL3 bound; - STOREP_F return_x, locked_1586; - ADDRESS self, origin_y, locked_1586; - STOREP_F KEY_GAME, locked_1586; - INDIRECT_F self, _cursorPos, locked_1586; - ADD_F locked_1586, ITEM_EDITBOX_SCROLLDISTANCE, locked_1586; - INDIRECT_F self, size_x, locked_1585; - INDIRECT_F self, fontSize_x, temp_5; - DIV_F locked_1585, temp_5, locked_1585; - GT locked_1586, locked_1585, locked_1586; - IFNOT locked_1586, 8; - INDIRECT_E self, _target, locked_1585; - INDIRECT_F locked_1585, maxValue, locked_1585; - SUB_F locked_1585, ITEM_EDITBOX_SCROLLDISTANCE, locked_1585; - INDIRECT_F self, size_x, temp_5; - INDIRECT_F self, fontSize_x, temp_6; - DIV_F temp_5, temp_6, temp_5; - GT locked_1585, temp_5, locked_1585; - AND locked_1586, locked_1585, locked_1586; - IFNOT locked_1586, 13; - ADDRESS self, origin_x, locked_1586; - INDIRECT_F self, fontSize_x, locked_1585; - INDIRECT_F self, size_x, temp_5; - INDIRECT_F self, fontSize_x, temp_6; - DIV_F temp_5, temp_6, parm0_x; - CALL1 floor; - INDIRECT_F self, _cursorPos, temp_5; - SUB_F return_x, temp_5, temp_5; - SUB_F temp_5, ITEM_EDITBOX_SCROLLDISTANCE, temp_5; - MUL_F locked_1585, temp_5, locked_1585; - STOREP_F locked_1585, locked_1586; - GOTO 3; - ADDRESS self, origin_x, locked_1586; - STOREP_F KEY_GAME, locked_1586; - DONE; -} - -void () _IEB_RemoveChar; -void() _IEB_RemoveChar = asm -{ -local string lValue; -local string lTemp; -local float temp_0; - INDIRECT_E self, _target, temp_0; - INDIRECT_S temp_0, value, lValue; - INDIRECT_F self, _cursorPos, temp_0; - STORE_F lValue, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 substring; - STORE_F return_x, parm0_x; - CALL1 strcat; - STORE_S return_x, lTemp; - INDIRECT_F self, _cursorPos, temp_0; - ADD_F temp_0, FILE_APPEND, temp_0; - STORE_F lValue, parm0_x; - STORE_F temp_0, parm1_x; - STORE_F 100000.000000, parm2_x; - CALL3 substring; - STORE_F lTemp, parm0_x; - STORE_F return_x, parm1_x; - CALL2 strcat; - STORE_S return_x, lTemp; - INDIRECT_E self, _target, parm0_x; - STORE_F value, parm1_x; - STORE_F lTemp, parm2_x; - CALL3 String_EntitySet; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS self, _presstime, temp_0; - STOREP_F Timer_Time, temp_0; - INDIRECT_S self, soundKey, parm0_x; - CALL1 Sound_Play; - DONE; -} - -void (float) _IEB_InsertChar; -void(float pAscii) _IEB_InsertChar = asm -{ -local string lTemp; -local string lValue; -local float temp_0; -local float temp_1; - INDIRECT_E self, _target, temp_0; - INDIRECT_S temp_0, value, lValue; - INDIRECT_F self, _cursorPos, temp_0; - STORE_F lValue, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 substring; - STORE_F pAscii, parm0_x; - STORE_F return_x, temp_0; - CALL1 chr; - STORE_F return_x, temp_1; - STORE_F temp_0, return_x; - STORE_F return_x, parm0_x; - STORE_F temp_1, parm1_x; - CALL2 strcat; - STORE_S return_x, lTemp; - INDIRECT_F self, _cursorPos, temp_0; - STORE_F lValue, parm0_x; - STORE_F temp_0, parm1_x; - STORE_F 100000.000000, parm2_x; - CALL3 substring; - STORE_F lTemp, parm0_x; - STORE_F return_x, parm1_x; - CALL2 strcat; - STORE_S return_x, lTemp; - INDIRECT_E self, _target, parm0_x; - STORE_F value, parm1_x; - STORE_F lTemp, parm2_x; - CALL3 String_EntitySet; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - ADDRESS self, _cursorPos, temp_0; - INDIRECT_F self, _cursorPos, temp_1; - ADD_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - ADDRESS self, _presstime, temp_0; - STOREP_F Timer_Time, temp_0; - INDIRECT_S self, soundKey, parm0_x; - CALL1 Sound_Play; - DONE; -} - -float(float pKey, float pAscii) Item_EditBox_Key = asm -{ -local float locked_1586; -local float temp_1; - INDIRECT_E self, _target, locked_1586; - IF locked_1586, 3; - RETURN KEY_GAME; - GOTO 67; - EQ_F pKey, K_ENTER, locked_1586; - IFNOT locked_1586, 6; - CALL0 CtCall_Action; - INDIRECT_S self, soundKey, parm0_x; - CALL1 Sound_Play; - RETURN FILE_APPEND; - GOTO 60; - EQ_F pKey, K_LEFTARROW, locked_1586; - IFNOT locked_1586, 11; - INDIRECT_F self, _cursorPos, locked_1586; - IFNOT locked_1586, 5; - ADDRESS self, _cursorPos, locked_1586; - INDIRECT_F self, _cursorPos, temp_1; - SUB_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, locked_1586; - INDIRECT_S self, soundMove, parm0_x; - CALL1 Sound_Play; - RETURN FILE_APPEND; - GOTO 48; - EQ_F pKey, K_RIGHTARROW, locked_1586; - IFNOT locked_1586, 15; - INDIRECT_F self, _cursorPos, locked_1586; - INDIRECT_E self, _target, temp_1; - INDIRECT_S temp_1, value, parm0_x; - CALL1 strlen; - LT locked_1586, return_x, locked_1586; - IFNOT locked_1586, 5; - ADDRESS self, _cursorPos, locked_1586; - INDIRECT_F self, _cursorPos, temp_1; - ADD_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, locked_1586; - INDIRECT_S self, soundMove, parm0_x; - CALL1 Sound_Play; - RETURN FILE_APPEND; - GOTO 32; - EQ_F pKey, K_BACKSPACE, locked_1586; - IFNOT locked_1586, 11; - INDIRECT_F self, _cursorPos, locked_1586; - GT locked_1586, KEY_GAME, locked_1586; - IFNOT locked_1586, 6; - ADDRESS self, _cursorPos, locked_1586; - INDIRECT_F self, _cursorPos, temp_1; - SUB_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, locked_1586; - CALL0 _IEB_RemoveChar; - RETURN FILE_APPEND; - GOTO 20; - EQ_F pKey, K_DEL, locked_1586; - IFNOT locked_1586, 10; - INDIRECT_F self, _cursorPos, locked_1586; - INDIRECT_E self, _target, temp_1; - INDIRECT_S temp_1, value, parm0_x; - CALL1 strlen; - LT locked_1586, return_x, locked_1586; - IFNOT locked_1586, 2; - CALL0 _IEB_RemoveChar; - RETURN FILE_APPEND; - GOTO 9; - LE 30.000000, pAscii, locked_1586; - IFNOT locked_1586, 2; - LE pAscii, 126.000000, temp_1; - AND locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 4; - STORE_F pAscii, parm0_x; - CALL1 _IEB_InsertChar; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void(float pSelect, float pUser) Item_EditBox_Select = asm -{ -local float temp_0; - STORE_F pSelect, parm0_x; - STORE_F pUser, parm1_x; - CALL2 CtCall_Select; - IFNOT pSelect, 1; - AND pSelect, pUser, temp_0; - IFNOT temp_0, 3; - INDIRECT_S self, soundSelected, parm0_x; - CALL1 Sound_Play; - DONE; -} - -void() Item_EditBox_Destroy = asm -{ - CALL0 CtCall_Destroy; - CALL0 Item_DataUser_Destroy; - STORE_F self, parm0_x; - STORE_F soundSelected, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F soundKey, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F soundMove, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_EditBox_Reinit = asm -{ -local float temp_0; - ADDRESS self, _cursorPos, temp_0; - STOREP_F KEY_GAME, temp_0; - CALL0 CtCall_Reinit; - DONE; -} - -void() Item_EditBox_Spawn = asm -{ -local float locked_1585; -local float locked_1586; -local vector temp_2; -local float temp_5; - CALL0 Item_DataUser_Init; - STORE_F self, parm0_x; - STORE_F soundSelected, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F soundKey, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F soundMove, parm1_x; - CALL2 String_EntityZone; - INDIRECT_S self, soundSelected, parm0_x; - CALL1 Sound_Precache; - INDIRECT_S self, soundKey, parm0_x; - CALL1 Sound_Precache; - INDIRECT_S self, soundMove, parm0_x; - CALL1 Sound_Precache; - INDIRECT_V self, size_x, temp_2; - EQ_V temp_2, '0.000000 0.000000 0.000000', locked_1586; - IFNOT locked_1586, 2; - INDIRECT_E self, _target, locked_1585; - AND locked_1586, locked_1585, locked_1586; - IFNOT locked_1586, 4; - INDIRECT_E self, _target, locked_1585; - INDIRECT_F locked_1585, maxValue, locked_1585; - GE locked_1585, KEY_GAME, locked_1585; - AND locked_1586, locked_1585, locked_1586; - IFNOT locked_1586, 16; - ADDRESS self, size_x, locked_1586; - INDIRECT_F self, fontSize_x, locked_1585; - INDIRECT_E self, _target, temp_5; - INDIRECT_F temp_5, maxValue, temp_5; - MUL_F locked_1585, temp_5, locked_1585; - INDIRECT_F self, sizeCursor_x, temp_5; - INDIRECT_V self, sizeCursorFlash_x, temp_2; - STORE_F temp_5, parm0_x; - STORE_V temp_2, parm1; - CALL2 max; - ADD_F locked_1585, return_x, locked_1585; - STOREP_F locked_1585, locked_1586; - ADDRESS self, size_y, locked_1586; - INDIRECT_F self, fontSize_y, locked_1585; - STOREP_F locked_1585, locked_1586; - ADDRESS self, _reinit, locked_1586; - STOREP_FNC Item_EditBox_Reinit, locked_1586; - ADDRESS self, _destroy, locked_1586; - STOREP_FNC Item_EditBox_Destroy, locked_1586; - ADDRESS self, _key, locked_1586; - STOREP_FNC Item_EditBox_Key, locked_1586; - ADDRESS self, _draw, locked_1586; - STOREP_FNC Item_EditBox_Draw, locked_1586; - ADDRESS self, _select, locked_1586; - STOREP_FNC Item_EditBox_Select, locked_1586; - ADDRESS self, _update, locked_1586; - STOREP_FNC Item_EditBox_Update, locked_1586; - CALL0 CtCall_Init; - DONE; -} - -void () _IL_Calc; -void() _IL_Calc = asm -{ -local float locked_1585; -local float locked_1586; -local vector temp_2; -local float temp_5; - INDIRECT_V self, size_x, temp_2; - EQ_V temp_2, '0.000000 0.000000 0.000000', locked_1586; - IFNOT locked_1586, 11; - ADDRESS self, size_x, locked_1586; - INDIRECT_F self, fontSize_x, locked_1585; - INDIRECT_S self, text, parm0_x; - CALL1 strlen; - MUL_F locked_1585, return_x, locked_1585; - STOREP_F locked_1585, locked_1586; - ADDRESS self, size_y, locked_1586; - INDIRECT_F self, fontSize_y, locked_1585; - STOREP_F locked_1585, locked_1586; - GOTO 13; - INDIRECT_V self, fontSize_x, temp_2; - EQ_V temp_2, '0.000000 0.000000 0.000000', locked_1586; - IFNOT locked_1586, 10; - ADDRESS self, fontSize_x, locked_1586; - INDIRECT_F self, size_x, locked_1585; - INDIRECT_S self, text, parm0_x; - CALL1 strlen; - DIV_F locked_1585, return_x, locked_1585; - STOREP_F locked_1585, locked_1586; - ADDRESS self, fontSize_y, locked_1586; - INDIRECT_F self, size_y, locked_1585; - STOREP_F locked_1585, locked_1586; - DONE; -} - -void() Item_Label_Update = asm -{ - CALL0 _IL_Calc; - DONE; -} - -void() Item_Label_Draw = asm -{ -local float locked_1585; -local float locked_1586; -local vector lAligned; -local vector temp_2; -local vector temp_3; -local float temp_5; - INDIRECT_F self, alignment, locked_1586; - EQ_F locked_1586, KEY_GAME, locked_1586; - IFNOT locked_1586, 3; - INDIRECT_F self, pos_x, lAligned_x; - GOTO 27; - INDIRECT_F self, alignment, locked_1586; - BITAND locked_1586, ITEM_ALIGN_CENTER, locked_1586; - IFNOT locked_1586, 11; - INDIRECT_F self, pos_x, locked_1586; - INDIRECT_F self, size_x, locked_1585; - INDIRECT_S self, text, parm0_x; - CALL1 strlen; - INDIRECT_F self, fontSize_x, temp_5; - MUL_F return_x, temp_5, temp_5; - SUB_F locked_1585, temp_5, locked_1585; - DIV_F locked_1585, KEY_MENU, locked_1585; - ADD_F locked_1586, locked_1585, lAligned_x; - GOTO 14; - INDIRECT_F self, alignment, locked_1586; - BITAND locked_1586, ITEM_ALIGN_RIGHT, locked_1586; - IFNOT locked_1586, 10; - INDIRECT_F self, pos_x, locked_1586; - INDIRECT_F self, size_x, locked_1585; - ADD_F locked_1586, locked_1585, locked_1586; - INDIRECT_S self, text, parm0_x; - CALL1 strlen; - INDIRECT_F self, fontSize_x, locked_1585; - MUL_F return_x, locked_1585, locked_1585; - SUB_F locked_1586, locked_1585, lAligned_x; - GOTO 2; - INDIRECT_F self, pos_x, lAligned_x; - INDIRECT_F self, pos_y, lAligned_y; - INDIRECT_S self, text, locked_1586; - INDIRECT_V self, fontSize_x, temp_2; - INDIRECT_V self, color_x, temp_3; - INDIRECT_F self, alpha, locked_1585; - INDIRECT_F self, drawFlag, temp_5; - STORE_V lAligned, parm0; - STORE_F locked_1586, parm1_x; - STORE_V temp_2, parm2; - STORE_V temp_3, parm3; - STORE_F locked_1585, parm4_x; - STORE_F temp_5, parm5_x; - CALL6 Menu_DrawString; - DONE; -} - -void() Item_Label_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F text, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_Label_Spawn = asm -{ -local float temp_0; -local float temp_1; -local float temp_5; - INDIRECT_F self, flag, temp_0; - EQ_F temp_0, KEY_GAME, temp_0; - IFNOT temp_0, 5; - ADDRESS self, flag, temp_0; - INDIRECT_F self, flag, temp_1; - BITOR temp_1, FLAG_DRAWUPDATEONLY, temp_1; - STOREP_F temp_1, temp_0; - STORE_F self, parm0_x; - STORE_F text, parm1_x; - CALL2 String_EntityZone; - CALL0 _IL_Calc; - INDIRECT_F self, alignment, temp_0; - BITAND temp_0, ITEM_ALIGN_FIX_CENTER, temp_0; - IFNOT temp_0, 8; - ADDRESS self, pos_x, temp_0; - INDIRECT_F self, pos_x, temp_1; - INDIRECT_F self, size_x, temp_5; - DIV_F temp_5, KEY_MENU, temp_5; - SUB_F temp_1, temp_5, temp_1; - STOREP_F temp_1, temp_0; - GOTO 9; - INDIRECT_F self, alignment, temp_0; - BITAND temp_0, ITEM_ALIGN_FIX_LEFT, temp_0; - IFNOT temp_0, 6; - ADDRESS self, pos_x, temp_0; - INDIRECT_F self, pos_x, temp_1; - INDIRECT_F self, size_x, temp_5; - SUB_F temp_1, temp_5, temp_1; - STOREP_F temp_1, temp_0; - ADDRESS self, _destroy, temp_0; - STOREP_FNC Item_Label_Destroy, temp_0; - ADDRESS self, _draw, temp_0; - STOREP_FNC Item_Label_Draw, temp_0; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_Label_Update, temp_0; - DONE; -} - -void () _IML_Calc; -void() _IML_Calc = asm -{ -local vector lLine; -local float lLineNumber; -local float lMaxWidth; -local float temp_0; -local float temp_1; - STORE_F KEY_GAME, lMaxWidth; - STORE_F KEY_GAME, lLineNumber; - STORE_V '0.000000 0.000000 0.000000', lLine; - INDIRECT_F self, wrap, temp_0; - IFNOT temp_0, 9; - INDIRECT_S self, text, temp_0; - INDIRECT_F self, wrap, temp_1; - STORE_F temp_0, parm0_x; - STORE_V lLine, parm1; - STORE_F temp_1, parm2_x; - CALL3 Util_GetEndOfWrappedLine; - STORE_V return, lLine; - GOTO 5; - INDIRECT_S self, text, parm0_x; - STORE_V lLine, parm1; - CALL2 Util_GetEndOfLine; - STORE_V return, lLine; - ADD_F lLineNumber, FILE_APPEND, lLineNumber; - STORE_F lMaxWidth, parm0_x; - STORE_F lLine_z, parm1_x; - CALL2 max; - STORE_F return_x, lMaxWidth; - NE_F lLine_x, lLine_y, temp_0; - IF temp_0, -20; - ADDRESS self, size_x, temp_0; - INDIRECT_F self, fontSize_x, temp_1; - MUL_F lMaxWidth, temp_1, temp_1; - STOREP_F temp_1, temp_0; - ADDRESS self, size_y, temp_0; - INDIRECT_F self, fontSize_y, temp_1; - MUL_F lLineNumber, temp_1, temp_1; - STOREP_F temp_1, temp_0; - DONE; -} - -void (vector, string) _IML_DrawLine; -void(vector pPosition, string pText) _IML_DrawLine = asm -{ -local float locked_1585; -local float locked_1586; -local vector temp_2; -local vector temp_3; -local float temp_5; - INDIRECT_F self, alignment, locked_1586; - EQ_F locked_1586, ITEM_ALIGN_CENTER, locked_1586; - IFNOT locked_1586, 11; - INDIRECT_F self, pos_x, locked_1586; - INDIRECT_F self, size_x, locked_1585; - STORE_F pText, parm0_x; - CALL1 strlen; - INDIRECT_F self, fontSize_x, temp_5; - MUL_F return_x, temp_5, temp_5; - SUB_F locked_1585, temp_5, locked_1585; - DIV_F locked_1585, KEY_MENU, locked_1585; - ADD_F locked_1586, locked_1585, pPosition_x; - GOTO 14; - INDIRECT_F self, alignment, locked_1586; - EQ_F locked_1586, ITEM_ALIGN_RIGHT, locked_1586; - IFNOT locked_1586, 10; - INDIRECT_F self, pos_x, locked_1586; - INDIRECT_F self, size_x, locked_1585; - ADD_F locked_1586, locked_1585, locked_1586; - STORE_F pText, parm0_x; - CALL1 strlen; - INDIRECT_F self, fontSize_x, locked_1585; - MUL_F return_x, locked_1585, locked_1585; - SUB_F locked_1586, locked_1585, pPosition_x; - GOTO 2; - INDIRECT_F self, pos_x, pPosition_x; - INDIRECT_V self, fontSize_x, temp_2; - INDIRECT_V self, color_x, temp_3; - INDIRECT_F self, alpha, locked_1586; - INDIRECT_F self, drawFlag, locked_1585; - STORE_V pPosition, parm0; - STORE_F pText, parm1_x; - STORE_V temp_2, parm2; - STORE_V temp_3, parm3; - STORE_F locked_1586, parm4_x; - STORE_F locked_1585, parm5_x; - CALL6 Menu_DrawString; - DONE; -} - -void() Item_MultiLabel_Draw = asm -{ -local vector lLine; -local vector lPosition; -local float temp_0; -local float temp_1; - INDIRECT_F self, pos_y, lPosition_y; - STORE_V '0.000000 0.000000 0.000000', lLine; - INDIRECT_F self, wrap, temp_0; - IFNOT temp_0, 9; - INDIRECT_S self, text, temp_0; - INDIRECT_F self, wrap, temp_1; - STORE_F temp_0, parm0_x; - STORE_V lLine, parm1; - STORE_F temp_1, parm2_x; - CALL3 Util_GetEndOfWrappedLine; - STORE_V return, lLine; - GOTO 5; - INDIRECT_S self, text, parm0_x; - STORE_V lLine, parm1; - CALL2 Util_GetEndOfLine; - STORE_V return, lLine; - INDIRECT_S self, text, temp_0; - SUB_F lLine_x, lLine_z, temp_1; - ADD_F temp_1, FILE_APPEND, temp_1; - STORE_F temp_0, parm0_x; - STORE_F temp_1, parm1_x; - STORE_F lLine_z, parm2_x; - CALL3 substring; - STORE_V lPosition, parm0; - STORE_F return_x, parm1_x; - CALL2 _IML_DrawLine; - INDIRECT_F self, fontSize_y, temp_0; - ADD_F lPosition_y, temp_0, lPosition_y; - NE_F lLine_x, lLine_y, temp_0; - IF temp_0, -27; - DONE; -} - -void() Item_MultiLabel_Update = asm -{ -local float temp_0; -local vector temp_2; - INDIRECT_V self, size_x, temp_2; - EQ_V temp_2, '0.000000 0.000000 0.000000', temp_0; - IFNOT temp_0, 2; - CALL0 _IML_Calc; - DONE; -} - -void() Item_MultiLabel_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F text, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_MultiLabel_Spawn = asm -{ -local float temp_0; -local float temp_1; - INDIRECT_F self, flag, temp_0; - EQ_F temp_0, KEY_GAME, temp_0; - IFNOT temp_0, 5; - ADDRESS self, flag, temp_0; - INDIRECT_F self, flag, temp_1; - BITOR temp_1, FLAG_DRAWUPDATEONLY, temp_1; - STOREP_F temp_1, temp_0; - STORE_F self, parm0_x; - STORE_F text, parm1_x; - CALL2 String_EntityZone; - CALL0 Item_MultiLabel_Update; - ADDRESS self, _destroy, temp_0; - STOREP_FNC Item_MultiLabel_Destroy, temp_0; - ADDRESS self, _draw, temp_0; - STOREP_FNC Item_MultiLabel_Draw, temp_0; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_MultiLabel_Update, temp_0; - DONE; -} - -void() Item_Picture_Draw = asm -{ -local float temp_0; -local float temp_1; -local vector temp_2; -local vector temp_3; -local vector temp_4; -local float temp_5; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_S self, picture, temp_0; - INDIRECT_V self, size_x, temp_3; - INDIRECT_V self, color_x, temp_4; - INDIRECT_F self, alpha, temp_1; - INDIRECT_F self, drawFlag, temp_5; - STORE_V temp_2, parm0; - STORE_F temp_0, parm1_x; - STORE_V temp_3, parm2; - STORE_V temp_4, parm3; - STORE_F temp_1, parm4_x; - STORE_F temp_5, parm5_x; - CALL6 Menu_DrawPicture; - DONE; -} - -void() Item_Picture_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F picture, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_Picture_Spawn = asm -{ -local float temp_0; -local float temp_1; - INDIRECT_S self, picture, temp_0; - NOT_S temp_0, temp_0; - IFNOT temp_0, 4; - STORE_F self, parm0_x; - CALL1 Menu_DeleteAfterFrame; - RETURN offset_0; - STORE_F self, parm0_x; - STORE_F picture, parm1_x; - CALL2 String_EntityZone; - INDIRECT_S self, picture, parm0_x; - CALL1 Gfx_Precache; - INDIRECT_F self, flag, temp_0; - EQ_F temp_0, KEY_GAME, temp_0; - IFNOT temp_0, 5; - ADDRESS self, flag, temp_0; - INDIRECT_F self, flag, temp_1; - BITOR temp_1, FLAG_NOSELECT, temp_1; - STOREP_F temp_1, temp_0; - ADDRESS self, _destroy, temp_0; - STOREP_FNC Item_Picture_Destroy, temp_0; - ADDRESS self, _draw, temp_0; - STOREP_FNC Item_Picture_Draw, temp_0; - DONE; -} - -void() Item_Rect_Draw = asm -{ -local float temp_0; -local float temp_1; -local vector temp_2; -local vector temp_3; -local vector temp_4; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_V self, size_x, temp_3; - INDIRECT_V self, color_x, temp_4; - INDIRECT_F self, alpha, temp_0; - INDIRECT_F self, drawFlag, temp_1; - STORE_V temp_2, parm0; - STORE_V temp_3, parm1; - STORE_V temp_4, parm2; - STORE_F temp_0, parm3_x; - STORE_F temp_1, parm4_x; - CALL5 Menu_Fill; - DONE; -} - -void() Item_Rect_Spawn = asm -{ -local float temp_0; -local float temp_1; - ADDRESS self, flag, temp_0; - INDIRECT_F self, flag, temp_1; - BITOR temp_1, FLAG_NOSELECT, temp_1; - STOREP_F temp_1, temp_0; - ADDRESS self, _draw, temp_0; - STOREP_FNC Item_Rect_Draw, temp_0; - DONE; -} - -float () _IS_GetValue; -float() _IS_GetValue = asm -{ -local entity lLink; -local float lValue; -local float temp_0; -local float temp_1; -local float temp_5; - INDIRECT_E self, _target, temp_0; - IF temp_0, 2; - RETURN KEY_GAME; - INDIRECT_E self, _target, lLink; - STORE_F lLink, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_F lLink, maxValue, temp_0; - INDIRECT_F lLink, minValue, temp_1; - LE temp_0, temp_1, temp_0; - IFNOT temp_0, 3; - STORE_F KEY_GAME, lValue; - GOTO 8; - INDIRECT_F lLink, _realValue, temp_0; - INDIRECT_F lLink, minValue, temp_1; - SUB_F temp_0, temp_1, temp_0; - INDIRECT_F lLink, maxValue, temp_1; - INDIRECT_F lLink, minValue, temp_5; - SUB_F temp_1, temp_5, temp_1; - DIV_F temp_0, temp_1, lValue; - RETURN lValue; - DONE; -} - -void(float pSelect, float pUser) Item_Slider_Select = asm -{ -local float temp_0; - BITAND pSelect, pUser, temp_0; - IFNOT temp_0, 3; - INDIRECT_S self, soundSelected, parm0_x; - CALL1 Sound_Play; - DONE; -} - -void() Item_Slider_Draw = asm -{ -local vector lSliderPos; -local float lValue; -local float temp_0; -local float temp_1; -local vector temp_2; -local vector temp_3; -local vector temp_4; -local float temp_5; -local float temp_6; - CALL0 _IS_GetValue; - STORE_F return_x, lValue; - INDIRECT_F self, pos_x, temp_0; - INDIRECT_F self, size_x, temp_1; - INDIRECT_F self, proportions_x, temp_5; - INDIRECT_F self, proportions_y, temp_6; - MUL_F lValue, temp_6, temp_6; - ADD_F temp_5, temp_6, temp_5; - MUL_F temp_1, temp_5, temp_1; - ADD_F temp_0, temp_1, temp_0; - INDIRECT_F self, sizeSlider_x, temp_1; - MUL_F lValue, temp_1, temp_1; - SUB_F temp_0, temp_1, lSliderPos_x; - INDIRECT_F self, pos_y, temp_0; - INDIRECT_F self, size_y, temp_1; - INDIRECT_F self, sizeSlider_y, temp_5; - SUB_F temp_1, temp_5, temp_1; - INDIRECT_F self, direction_y, temp_5; - INDIRECT_F self, direction_x, temp_6; - SUB_F temp_5, temp_6, temp_5; - MUL_F temp_5, lValue, temp_5; - SUB_F FILE_APPEND, temp_5, temp_5; - INDIRECT_F self, direction_x, temp_6; - SUB_F temp_5, temp_6, temp_5; - MUL_F temp_1, temp_5, temp_1; - ADD_F temp_0, temp_1, lSliderPos_y; - EQ_E Menu_ActiveItem, self, temp_0; - IFNOT temp_0, 27; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_S self, picture, temp_0; - INDIRECT_V self, size_x, temp_3; - INDIRECT_V self, colorSelected_x, temp_4; - INDIRECT_F self, alphas_y, temp_1; - INDIRECT_F self, drawFlags_y, temp_5; - STORE_V temp_2, parm0; - STORE_F temp_0, parm1_x; - STORE_V temp_3, parm2; - STORE_V temp_4, parm3; - STORE_F temp_1, parm4_x; - STORE_F temp_5, parm5_x; - CALL6 Menu_DrawPicture; - INDIRECT_S self, pictureSlider, temp_0; - INDIRECT_V self, sizeSlider_x, temp_2; - INDIRECT_V self, colorSelected_x, temp_3; - INDIRECT_F self, alphas_y, temp_1; - INDIRECT_F self, drawFlags_y, temp_5; - STORE_V lSliderPos, parm0; - STORE_F temp_0, parm1_x; - STORE_V temp_2, parm2; - STORE_V temp_3, parm3; - STORE_F temp_1, parm4_x; - STORE_F temp_5, parm5_x; - CALL6 Menu_DrawPicture; - GOTO 26; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_S self, picture, temp_0; - INDIRECT_V self, size_x, temp_3; - INDIRECT_V self, color_x, temp_4; - INDIRECT_F self, alphas_x, temp_1; - INDIRECT_F self, drawFlags_x, temp_5; - STORE_V temp_2, parm0; - STORE_F temp_0, parm1_x; - STORE_V temp_3, parm2; - STORE_V temp_4, parm3; - STORE_F temp_1, parm4_x; - STORE_F temp_5, parm5_x; - CALL6 Menu_DrawPicture; - INDIRECT_S self, pictureSlider, temp_0; - INDIRECT_V self, sizeSlider_x, temp_2; - INDIRECT_V self, color_x, temp_3; - INDIRECT_F self, alphas_x, temp_1; - INDIRECT_F self, drawFlags_x, temp_5; - STORE_V lSliderPos, parm0; - STORE_F temp_0, parm1_x; - STORE_V temp_2, parm2; - STORE_V temp_3, parm3; - STORE_F temp_1, parm4_x; - STORE_F temp_5, parm5_x; - CALL6 Menu_DrawPicture; - DONE; -} - -void (float) _IS_Change; -void(float pValue) _IS_Change = asm -{ -local float temp_0; -local float temp_1; - LT pValue, KEY_GAME, temp_0; - IFNOT temp_0, 4; - INDIRECT_S self, soundDecrease, parm0_x; - CALL1 Sound_Play; - GOTO 3; - INDIRECT_S self, soundIncrease, parm0_x; - CALL1 Sound_Play; - INDIRECT_E self, _target, temp_0; - ADDRESS temp_0, _realValue, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - ADD_F temp_1, pValue, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - CALL0 CtCall_Action; - DONE; -} - -float(float pKey, float pAscii) Item_Slider_Key = asm -{ -local float lValue; -local float lPos; -local float temp_0; -local float temp_1; -local vector temp_2; -local vector temp_3; -local float temp_5; - INDIRECT_E self, _target, temp_0; - IF temp_0, 2; - RETURN KEY_GAME; - GOTO 73; - INDIRECT_E self, _target, temp_0; - INDIRECT_F temp_0, stepValue, temp_0; - SUB_F KEY_GAME, temp_0, parm0_x; - CALL1 _IS_Change; - RETURN FILE_APPEND; - GOTO 73; - INDIRECT_E self, _target, temp_0; - INDIRECT_F temp_0, stepValue, parm0_x; - CALL1 _IS_Change; - RETURN FILE_APPEND; - GOTO 68; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_V self, size_x, temp_3; - STORE_V Menu_Cursor_Position, parm0; - STORE_V temp_2, parm1; - STORE_V temp_3, parm2; - CALL3 Util_InRect; - IF return_x, 2; - RETURN KEY_GAME; - INDIRECT_F self, pos_x, temp_0; - SUB_F Menu_Cursor_Position_x, temp_0, temp_0; - INDIRECT_F self, size_x, temp_1; - DIV_F temp_0, temp_1, lPos; - INDIRECT_F self, proportions_x, temp_0; - LE lPos, temp_0, temp_0; - IFNOT temp_0, 6; - INDIRECT_E self, _target, temp_0; - INDIRECT_F temp_0, stepValue, temp_0; - SUB_F KEY_GAME, temp_0, parm0_x; - CALL1 _IS_Change; - GOTO 41; - INDIRECT_F self, proportions_x, temp_0; - INDIRECT_F self, proportions_y, temp_1; - ADD_F temp_0, temp_1, temp_0; - LE lPos, temp_0, temp_0; - IFNOT temp_0, 2; - INDIRECT_F self, proportions_y, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 30; - INDIRECT_F self, pos_x, temp_0; - SUB_F Menu_Cursor_Position_x, temp_0, temp_0; - INDIRECT_F self, sizeSlider_x, temp_1; - DIV_F temp_1, KEY_MENU, temp_1; - SUB_F temp_0, temp_1, temp_0; - INDIRECT_F self, size_x, temp_1; - INDIRECT_F self, proportions_x, temp_5; - MUL_F temp_1, temp_5, temp_1; - SUB_F temp_0, temp_1, lValue; - INDIRECT_F self, size_x, temp_0; - INDIRECT_F self, proportions_y, temp_1; - MUL_F temp_0, temp_1, temp_0; - INDIRECT_F self, sizeSlider_x, temp_1; - SUB_F temp_0, temp_1, temp_0; - DIV_F lValue, temp_0, lValue; - INDIRECT_E self, _target, temp_0; - INDIRECT_F temp_0, maxValue, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, minValue, temp_1; - SUB_F temp_0, temp_1, temp_0; - MUL_F lValue, temp_0, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, minValue, temp_1; - ADD_F temp_0, temp_1, lValue; - INDIRECT_E self, _target, temp_0; - INDIRECT_F temp_0, _realValue, temp_0; - SUB_F lValue, temp_0, parm0_x; - CALL1 _IS_Change; - GOTO 4; - INDIRECT_E self, _target, temp_0; - INDIRECT_F temp_0, stepValue, parm0_x; - CALL1 _IS_Change; - RETURN FILE_APPEND; - EQ_F pKey, K_LEFTARROW, temp_0; - IF temp_0, -73; - EQ_F pKey, K_RIGHTARROW, temp_0; - IF temp_0, -69; - EQ_F pKey, K_MOUSE1, temp_0; - IF temp_0, -66; - RETURN KEY_GAME; - DONE; -} - -void() Item_Slider_Destroy = asm -{ - CALL0 CtCall_Destroy; - CALL0 Item_DataUser_Destroy; - STORE_F self, parm0_x; - STORE_F picture, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F pictureSlider, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F soundSelected, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F soundIncrease, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F soundDecrease, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_Slider_Spawn = asm -{ -local float locked_1292; -local float temp_0; - STORE_F self, parm0_x; - STORE_F picture, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F pictureSlider, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F soundSelected, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F soundIncrease, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F soundDecrease, parm1_x; - CALL2 String_EntityZone; - CALL0 Item_DataUser_Init; - INDIRECT_S self, picture, parm0_x; - CALL1 Gfx_Precache; - INDIRECT_S self, pictureSlider, parm0_x; - CALL1 Gfx_Precache; - INDIRECT_S self, soundSelected, parm0_x; - CALL1 Sound_Precache; - INDIRECT_S self, soundIncrease, parm0_x; - CALL1 Sound_Precache; - INDIRECT_S self, soundDecrease, parm0_x; - CALL1 Sound_Precache; - INDIRECT_V self, size_x, locked_1292; - EQ_V locked_1292, '0.000000 0.000000 0.000000', temp_0; - IFNOT temp_0, 5; - ADDRESS self, size_x, locked_1292; - INDIRECT_S self, picture, parm0_x; - CALL1 Gfx_GetImageSize; - STOREP_V return_x, locked_1292; - INDIRECT_V self, sizeSlider_x, locked_1292; - EQ_V locked_1292, '0.000000 0.000000 0.000000', temp_0; - IFNOT temp_0, 5; - ADDRESS self, sizeSlider_x, locked_1292; - INDIRECT_S self, pictureSlider, parm0_x; - CALL1 Gfx_GetImageSize; - STOREP_V return_x, locked_1292; - ADDRESS self, _reinit, temp_0; - STOREP_FNC CtCall_Reinit, temp_0; - ADDRESS self, _destroy, temp_0; - STOREP_FNC Item_Slider_Destroy, temp_0; - ADDRESS self, _key, temp_0; - STOREP_FNC Item_Slider_Key, temp_0; - ADDRESS self, _draw, temp_0; - STOREP_FNC Item_Slider_Draw, temp_0; - ADDRESS self, _select, temp_0; - STOREP_FNC Item_Slider_Select, temp_0; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_DataUser_Update, temp_0; - CALL0 CtCall_Init; - DONE; -} - -void() Item_ValueButton_Update = asm -{ -local float temp_0; -local vector temp_2; - CALL0 Item_DataUser_Update; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_GET, parm1_x; - CALL2 Raise_DataEvent; - INDIRECT_E self, _target, temp_0; - INDIRECT_S temp_0, value, temp_0; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 String_EntitySet; - ADDRESS self, size_x, temp_2_x; - STOREP_V '0.000000 0.000000 0.000000', temp_2; - CALL0 Item_Button_Update; - DONE; -} - -void() Item_ValueButton_Destroy = asm -{ - CALL0 Item_DataUser_Destroy; - CALL0 Item_Button_Destroy; - DONE; -} - -void() Item_ValueButton_Spawn = asm -{ -local float temp_0; - CALL0 Item_DataUser_Init; - CALL0 Item_Button_Spawn; - ADDRESS self, _destroy, temp_0; - STOREP_FNC Item_ValueButton_Destroy, temp_0; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_ValueButton_Update, temp_0; - DONE; -} - -float(float pKey, float pAscii) Item_FloatingArea_Key = asm -{ -local float temp_0; -local float temp_1; - EQ_F pKey, K_MOUSE1, temp_0; - IF temp_0, 2; - EQ_F pKey, K_ENTER, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 11; - INDIRECT_F self, _state, temp_0; - NE_F temp_0, ITEM_STATE_PRESSED, temp_0; - IFNOT temp_0, 4; - ADDRESS self, _state, temp_0; - STOREP_F ITEM_STATE_PRESSED, temp_0; - GOTO 3; - ADDRESS self, _state, temp_0; - STOREP_F ITEM_STATE_NORMAL, temp_0; - RETURN FILE_APPEND; - GOTO 5; - EQ_F pKey, K_ESCAPE, temp_0; - IFNOT temp_0, 3; - ADDRESS self, _state, temp_0; - STOREP_F ITEM_STATE_NORMAL, temp_0; - RETURN KEY_GAME; - DONE; -} - -void() Item_FloatingArea_Update = asm -{ -local float locked_1586; -local float temp_1; -local vector temp_2; -local vector temp_3; - INDIRECT_S self, target, locked_1586; - NOT_S locked_1586, locked_1586; - IFNOT locked_1586, 5; - ADDRESS self, _state, locked_1586; - STOREP_F ITEM_STATE_NORMAL, locked_1586; - RETURN offset_0; - GOTO 10; - INDIRECT_S self, target, locked_1586; - INDIRECT_E self, _target, temp_1; - INDIRECT_S temp_1, name, temp_1; - NE_S locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 5; - ADDRESS self, _target, locked_1586; - INDIRECT_S self, target, parm0_x; - CALL1 Menu_GetItem; - STOREP_ENT return_x, locked_1586; - INDIRECT_F self, _state, locked_1586; - EQ_F locked_1586, ITEM_STATE_PRESSED, locked_1586; - IFNOT locked_1586, 8; - INDIRECT_E self, _target, locked_1586; - ADDRESS locked_1586, pos_x, temp_2_x; - INDIRECT_E self, _target, locked_1586; - INDIRECT_V locked_1586, pos_x, temp_3; - ADD_V temp_3, Cursor_Relative, temp_3; - STOREP_V temp_3_x, temp_2; - GOTO 5; - EQ_E Menu_ActiveItem, self, locked_1586; - IFNOT locked_1586, 3; - ADDRESS self, _state, locked_1586; - STOREP_F ITEM_STATE_SELECTED, locked_1586; - DONE; -} - -void () Item_FloatingArea_Destroy; -void() Item_FloatingArea_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void (float, float) Item_FloatingArea_Select; -void(float pSelect, float pUser) Item_FloatingArea_Select = asm -{ -local float temp_0; -local float temp_1; - NOT_F pSelect, temp_0; - IFNOT temp_0, 3; - INDIRECT_F self, _state, temp_1; - EQ_F temp_1, ITEM_STATE_PRESSED, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 4; - STORE_F self, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 Menu_CorrectSelection; - DONE; -} - -void() Item_FloatingArea_Spawn = asm -{ -local float temp_0; -local float temp_1; - ADDRESS self, flag, temp_0; - INDIRECT_F self, flag, temp_1; - BITOR temp_1, FLAG_CHILDDRAWUPDATEONLY, temp_1; - STOREP_F temp_1, temp_0; - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityZone; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_FloatingArea_Update, temp_0; - ADDRESS self, _key, temp_0; - STOREP_FNC Item_FloatingArea_Key, temp_0; - ADDRESS self, _destroy, temp_0; - STOREP_FNC Item_FloatingArea_Destroy, temp_0; - ADDRESS self, _select, temp_0; - STOREP_FNC Item_FloatingArea_Select, temp_0; - DONE; -} - -float(float pKey, float pAscii) Item_SwitchButton_Key = asm -{ -local float temp_0; -local float temp_1; - INDIRECT_E self, _target, temp_0; - IF temp_0, 2; - RETURN KEY_GAME; - EQ_F pKey, K_SPACE, temp_0; - IF temp_0, 2; - EQ_F pKey, K_ENTER, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 2; - EQ_F pKey, K_MOUSE1, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 2; - EQ_F pKey, K_RIGHTARROW, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 28; - INDIRECT_S self, soundPressed, parm0_x; - CALL1 Sound_Play; - ADDRESS self, _presstime, temp_0; - STOREP_F Timer_Time, temp_0; - INDIRECT_E self, _target, temp_0; - ADDRESS temp_0, _realValue, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - ADD_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_E self, _target, temp_0; - INDIRECT_F temp_0, _realValue, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, maxValue, temp_1; - GT temp_0, temp_1, temp_0; - IFNOT temp_0, 6; - INDIRECT_E self, _target, temp_0; - ADDRESS temp_0, _realValue, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, minValue, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - CALL0 CtCall_Action; - RETURN FILE_APPEND; - GOTO 35; - EQ_F pKey, K_BACKSPACE, temp_0; - IF temp_0, 2; - EQ_F pKey, K_MOUSE2, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 2; - EQ_F pKey, K_LEFTARROW, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 27; - INDIRECT_S self, soundPressed, parm0_x; - CALL1 Sound_Play; - ADDRESS self, _presstime, temp_0; - STOREP_F Timer_Time, temp_0; - INDIRECT_E self, _target, temp_0; - ADDRESS temp_0, _realValue, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, _realValue, temp_1; - SUB_F temp_1, FILE_APPEND, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_E self, _target, temp_0; - INDIRECT_F temp_0, _realValue, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, minValue, temp_1; - LT temp_0, temp_1, temp_0; - IFNOT temp_0, 6; - INDIRECT_E self, _target, temp_0; - ADDRESS temp_0, _realValue, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, maxValue, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_E self, _target, parm0_x; - STORE_F ITEM_DATALINK_SET, parm1_x; - CALL2 Raise_DataEvent; - CALL0 CtCall_Action; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void() Item_SwitchButton_Spawn = asm -{ -local float temp_0; - CALL0 Item_ValueButton_Spawn; - ADDRESS self, _key, temp_0; - STOREP_FNC Item_SwitchButton_Key, temp_0; - DONE; -} - -float _VSB_UP_HEIGHT; -float _VSB_DOWN_HEIGHT; -float _VSB_PRECISION; -float _VSB_MINHEIGHT; -float _VSB_CLICKAREA_COLOR_x; -float _VSB_CLICKAREA_COLOR_y; -float _VSB_CLICKAREA_COLOR_z; -vector _VSB_CLICKAREA_COLOR; -float _VSB_SCOLLER_COLOR_x; -float _VSB_SCOLLER_COLOR_y; -float _VSB_SCOLLER_COLOR_z; -vector _VSB_SCOLLER_COLOR; -float _VSB_SCROLLAREA_COLOR_x; -float _VSB_SCROLLAREA_COLOR_y; -float _VSB_SCROLLAREA_COLOR_z; -vector _VSB_SCROLLAREA_COLOR; -float () _IVSB_GetSizeOfScroller; -float() _IVSB_GetSizeOfScroller = asm -{ -local float lScrollerSize; -local float lTotalSize; -local float lVisibleSize; -local float lScrollerRange; -local float temp_0; - INDIRECT_E self, _target, temp_0; - INDIRECT_E temp_0, _child, temp_0; - INDIRECT_F temp_0, size_y, lTotalSize; - INDIRECT_F self, size_y, lVisibleSize; - INDIRECT_F self, size_y, temp_0; - SUB_F temp_0, _VSB_UP_HEIGHT, temp_0; - SUB_F temp_0, _VSB_UP_HEIGHT, lScrollerRange; - MUL_F lVisibleSize, lScrollerRange, temp_0; - DIV_F temp_0, lTotalSize, lScrollerSize; - STORE_F _VSB_MINHEIGHT, parm0_x; - STORE_F lScrollerSize, parm1_x; - CALL2 max; - STORE_F return_x, lScrollerSize; - RETURN lScrollerSize; - DONE; -} - -void() Item_VScrollBar_Draw = asm -{ -local vector lSize; -local vector lPosition; -local float temp_0; -local float temp_1; -local vector temp_2; -local float temp_5; -local float temp_6; - INDIRECT_E self, _target, temp_0; - EQ_E temp_0, null_entity, temp_0; - IFNOT temp_0, 2; - RETURN offset_0; - INDIRECT_V self, pos_x, lPosition; - INDIRECT_V self, size_x, lSize; - STORE_F _VSB_UP_HEIGHT, lSize_y; - STORE_V lPosition, parm0; - STORE_V lSize, parm1; - STORE_V _VSB_CLICKAREA_COLOR, parm2; - STORE_F FILE_APPEND, parm3_x; - STORE_F KEY_GAME, parm4_x; - CALL5 Menu_Fill; - INDIRECT_F self, pos_y, temp_0; - ADD_F temp_0, _VSB_UP_HEIGHT, lPosition_y; - INDIRECT_F self, size_y, temp_0; - SUB_F temp_0, _VSB_UP_HEIGHT, temp_0; - SUB_F temp_0, _VSB_UP_HEIGHT, lSize_y; - STORE_V lPosition, parm0; - STORE_V lSize, parm1; - STORE_V _VSB_SCROLLAREA_COLOR, parm2; - STORE_F FILE_APPEND, parm3_x; - STORE_F KEY_GAME, parm4_x; - CALL5 Menu_Fill; - INDIRECT_F self, pos_y, temp_0; - INDIRECT_F self, size_y, temp_1; - ADD_F temp_0, temp_1, temp_0; - SUB_F temp_0, _VSB_UP_HEIGHT, lPosition_y; - STORE_F _VSB_UP_HEIGHT, lSize_y; - STORE_V lPosition, parm0; - STORE_V lSize, parm1; - STORE_V _VSB_CLICKAREA_COLOR, parm2; - STORE_F FILE_APPEND, parm3_x; - STORE_F KEY_GAME, parm4_x; - CALL5 Menu_Fill; - CALL0 _IVSB_GetSizeOfScroller; - STORE_F return_x, lSize_y; - INDIRECT_F self, pos_y, temp_0; - ADD_F temp_0, _VSB_UP_HEIGHT, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, origin_y, temp_1; - INDIRECT_F self, size_y, temp_5; - SUB_F temp_5, _VSB_UP_HEIGHT, temp_5; - SUB_F temp_5, _VSB_UP_HEIGHT, temp_5; - SUB_F temp_5, lSize_y, temp_5; - MUL_F temp_1, temp_5, temp_1; - INDIRECT_E self, _target, temp_5; - INDIRECT_E temp_5, _child, temp_5; - INDIRECT_F temp_5, size_y, temp_5; - INDIRECT_F self, size_y, temp_6; - SUB_F temp_5, temp_6, temp_5; - DIV_F temp_1, temp_5, temp_1; - SUB_F temp_0, temp_1, lPosition_y; - STORE_V lPosition, parm0; - STORE_V lSize, parm1; - STORE_V _VSB_SCOLLER_COLOR, parm2; - STORE_F FILE_APPEND, parm3_x; - STORE_F KEY_GAME, parm4_x; - CALL5 Menu_Fill; - DONE; -} - -void () _IVSB_RangeBound; -void() _IVSB_RangeBound = asm -{ -local float locked_1586; -local float temp_1; -local float temp_5; - INDIRECT_E self, _target, locked_1586; - ADDRESS locked_1586, origin_y, locked_1586; - INDIRECT_E self, _target, temp_1; - INDIRECT_E temp_1, _child, temp_1; - INDIRECT_F temp_1, size_y, temp_1; - INDIRECT_F self, size_y, temp_5; - SUB_F temp_1, temp_5, temp_1; - SUB_F KEY_GAME, temp_1, temp_1; - INDIRECT_E self, _target, temp_5; - INDIRECT_F temp_5, origin_y, temp_5; - STORE_F temp_1, parm0_x; - STORE_F temp_5, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 bound; - STOREP_F return_x, locked_1586; - DONE; -} - -void () _IVSB_ScrollUp; -void() _IVSB_ScrollUp = asm -{ -local float temp_0; -local float temp_1; - INDIRECT_E self, _target, temp_0; - ADDRESS temp_0, origin_y, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, origin_y, temp_1; - ADD_F temp_1, SLIST_SERVERREPLYCOUNT, temp_1; - STOREP_F temp_1, temp_0; - CALL0 _IVSB_RangeBound; - DONE; -} - -void () _IVSB_ScrollDown; -void() _IVSB_ScrollDown = asm -{ -local float temp_0; -local float temp_1; - INDIRECT_E self, _target, temp_0; - ADDRESS temp_0, origin_y, temp_0; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, origin_y, temp_1; - SUB_F temp_1, SLIST_SERVERREPLYCOUNT, temp_1; - STOREP_F temp_1, temp_0; - CALL0 _IVSB_RangeBound; - DONE; -} - -void (float) _IVSB_MouseSelect; -void(float lLevel) _IVSB_MouseSelect = asm -{ -local float lScrollerSize; -local float lTotalSize; -local float lVisibleSize; -local float lScrollerRange; -local float temp_0; -local float temp_1; -local float temp_5; - INDIRECT_E self, _target, temp_0; - INDIRECT_E temp_0, _child, temp_0; - INDIRECT_F temp_0, size_y, lTotalSize; - INDIRECT_F self, size_y, lVisibleSize; - INDIRECT_F self, size_y, temp_0; - SUB_F temp_0, _VSB_UP_HEIGHT, temp_0; - SUB_F temp_0, _VSB_UP_HEIGHT, lScrollerRange; - CALL0 _IVSB_GetSizeOfScroller; - STORE_F return_x, lScrollerSize; - SUB_F lLevel, _VSB_UP_HEIGHT, temp_0; - DIV_F lScrollerSize, KEY_MENU, temp_1; - SUB_F temp_0, temp_1, lLevel; - INDIRECT_E self, _target, temp_0; - ADDRESS temp_0, origin_y, temp_0; - SUB_F lTotalSize, lVisibleSize, temp_1; - MUL_F lLevel, temp_1, temp_1; - SUB_F lScrollerRange, lScrollerSize, temp_5; - DIV_F temp_1, temp_5, temp_1; - SUB_F KEY_GAME, temp_1, temp_1; - STOREP_F temp_1, temp_0; - CALL0 _IVSB_RangeBound; - DONE; -} - -float(float pKey, float Ascii) Item_VScrollBar_Key = asm -{ -local float lLevel; -local float temp_0; -local vector temp_2; -local vector temp_3; - INDIRECT_E self, _target, temp_0; - EQ_E temp_0, null_entity, temp_0; - IFNOT temp_0, 2; - RETURN KEY_GAME; - EQ_F pKey, K_UPARROW, temp_0; - IFNOT temp_0, 4; - CALL0 _IVSB_ScrollUp; - RETURN FILE_APPEND; - GOTO 41; - EQ_F pKey, K_DOWNARROW, temp_0; - IFNOT temp_0, 4; - CALL0 _IVSB_ScrollDown; - RETURN FILE_APPEND; - GOTO 36; - EQ_F pKey, K_MOUSE1, temp_0; - IFNOT temp_0, 25; - INDIRECT_V self, pos_x, temp_2; - INDIRECT_V self, size_x, temp_3; - STORE_V Menu_Cursor_Position, parm0; - STORE_V temp_2, parm1; - STORE_V temp_3, parm2; - CALL3 Util_InRect; - IF return_x, 2; - RETURN KEY_GAME; - INDIRECT_F self, pos_y, temp_0; - SUB_F Menu_Cursor_Position_y, temp_0, lLevel; - LT lLevel, _VSB_UP_HEIGHT, temp_0; - IFNOT temp_0, 3; - CALL0 _IVSB_ScrollUp; - GOTO 9; - INDIRECT_F self, size_y, temp_0; - SUB_F temp_0, _VSB_UP_HEIGHT, temp_0; - GE lLevel, temp_0, temp_0; - IFNOT temp_0, 3; - CALL0 _IVSB_ScrollDown; - GOTO 3; - STORE_F lLevel, parm0_x; - CALL1 _IVSB_MouseSelect; - RETURN FILE_APPEND; - GOTO 10; - EQ_F pKey, K_MWHEELUP, temp_0; - IFNOT temp_0, 4; - CALL0 _IVSB_ScrollUp; - RETURN FILE_APPEND; - GOTO 5; - EQ_F pKey, K_MWHEELDOWN, temp_0; - IFNOT temp_0, 3; - CALL0 _IVSB_ScrollDown; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void() Item_VScrollBar_Update = asm -{ -local float locked_1586; -local float temp_1; - INDIRECT_S self, target, locked_1586; - EQ_S locked_1586, "", locked_1586; - IFNOT locked_1586, 4; - ADDRESS self, _target, locked_1586; - STOREP_ENT null_entity, locked_1586; - GOTO 10; - INDIRECT_S self, target, locked_1586; - INDIRECT_E self, _target, temp_1; - INDIRECT_S temp_1, name, temp_1; - NE_S locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 5; - ADDRESS self, _target, locked_1586; - INDIRECT_S self, target, parm0_x; - CALL1 Menu_GetItem; - STOREP_ENT return_x, locked_1586; - INDIRECT_E self, _target, locked_1586; - EQ_E locked_1586, null_entity, locked_1586; - IFNOT locked_1586, 2; - RETURN offset_0; - ADDRESS self, size_y, locked_1586; - INDIRECT_E self, _target, temp_1; - INDIRECT_F temp_1, size_y, temp_1; - STOREP_F temp_1, locked_1586; - INDIRECT_F self, size_y, locked_1586; - INDIRECT_E self, _target, temp_1; - INDIRECT_E temp_1, _child, temp_1; - INDIRECT_F temp_1, size_y, temp_1; - GE locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 6; - ADDRESS self, flag, locked_1586; - INDIRECT_F self, flag, temp_1; - BITOR temp_1, FLAG_HIDDEN, temp_1; - STOREP_F temp_1, locked_1586; - GOTO 8; - INDIRECT_F self, flag, locked_1586; - BITAND locked_1586, FLAG_HIDDEN, locked_1586; - IFNOT locked_1586, 5; - ADDRESS self, flag, locked_1586; - INDIRECT_F self, flag, temp_1; - SUB_F temp_1, FLAG_HIDDEN, temp_1; - STOREP_F temp_1, locked_1586; - DONE; -} - -void () Item_VScrollBar_Destroy; -void() Item_VScrollBar_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_VScrollBar_Spawn = asm -{ -local float temp_0; - STORE_F self, parm0_x; - STORE_F target, parm1_x; - CALL2 String_EntityZone; - CALL0 Item_VScrollBar_Update; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_VScrollBar_Update, temp_0; - ADDRESS self, _key, temp_0; - STOREP_FNC Item_VScrollBar_Key, temp_0; - ADDRESS self, _draw, temp_0; - STOREP_FNC Item_VScrollBar_Draw, temp_0; - ADDRESS self, _destroy, temp_0; - STOREP_FNC Item_VScrollBar_Destroy, temp_0; - DONE; -} - -void() Item_Cinematic_Destroy = asm -{ -local float temp_0; - INDIRECT_S self, normal, parm0_x; - CALL1 cin_close; - STORE_F self, parm0_x; - STORE_F link, parm1_x; - CALL2 String_EntityFree; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_Cinematic_Init = asm -{ -local float temp_0; -local float temp_1; - ADDRESS self, flag, temp_0; - INDIRECT_F self, flag, temp_1; - BITOR temp_1, FLAG_HIDDEN, temp_1; - STOREP_F temp_1, temp_0; - STORE_F self, parm0_x; - STORE_F link, parm1_x; - CALL2 String_EntityZone; - STORE_F self, parm0_x; - STORE_F normal, parm1_x; - CALL2 String_EntityZone; - INDIRECT_S self, link, temp_0; - INDIRECT_S self, normal, temp_1; - STORE_F temp_0, parm0_x; - STORE_F temp_1, parm1_x; - CALL2 cin_open; - ADDRESS self, _destroy, temp_0; - STOREP_FNC Item_Cinematic_Destroy, temp_0; - DONE; -} - -void() Item_Cinematic_Loop_Spawn = asm -{ -local float temp_0; - CALL0 Item_Cinematic_Init; - INDIRECT_S self, normal, parm0_x; - STORE_F KEY_MENU, parm1_x; - CALL2 cin_setstate; - DONE; -} - -void() Item_Container_Spawn = asm -{ -local float temp_0; -local float temp_1; - ADDRESS self, flag, temp_0; - INDIRECT_F self, flag, temp_1; - BITOR temp_1, FLAG_HIDDEN, temp_1; - STOREP_F temp_1, temp_0; - DONE; -} - -void () Item_Custom_Spawn; -void() Item_Custom_Spawn = asm -{ -local float temp_0; - ADDRESS self, _reinit, temp_0; - STOREP_FNC CtCall_Reinit, temp_0; - ADDRESS self, _destroy, temp_0; - STOREP_FNC CtCall_Destroy, temp_0; - ADDRESS self, _key, temp_0; - STOREP_FNC CtCall_Key, temp_0; - ADDRESS self, _draw, temp_0; - STOREP_FNC CtCall_Draw, temp_0; - ADDRESS self, _mouseEnter, temp_0; - STOREP_FNC CtCall_MouseEnter, temp_0; - ADDRESS self, _mouseLeave, temp_0; - STOREP_FNC CtCall_MouseLeave, temp_0; - ADDRESS self, _select, temp_0; - STOREP_FNC CtCall_Select, temp_0; - ADDRESS self, _update, temp_0; - STOREP_FNC CtCall_Update, temp_0; - CALL0 CtCall_Init; - DONE; -} - -void() Item_Link_Update = asm -{ -local float locked_1586; -local float temp_1; - INDIRECT_S self, link, locked_1586; - EQ_S locked_1586, "", locked_1586; - IFNOT locked_1586, 4; - ADDRESS self, _link, locked_1586; - STOREP_ENT null_entity, locked_1586; - GOTO 14; - INDIRECT_S self, link, locked_1586; - INDIRECT_E self, _link, temp_1; - INDIRECT_S temp_1, name, temp_1; - NE_S locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 9; - ADDRESS self, _link, locked_1586; - INDIRECT_S self, link, parm0_x; - CALL1 Menu_GetItem; - STOREP_ENT return_x, locked_1586; - ADDRESS self, flag, locked_1586; - INDIRECT_F self, flag, temp_1; - BITOR temp_1, FLAG_NOSELECT, temp_1; - STOREP_F temp_1, locked_1586; - DONE; -} - -float(float pKey, float pAscii) Item_Link_Key = asm -{ -local float temp_0; - INDIRECT_E self, _link, temp_0; - IFNOT temp_0, 6; - INDIRECT_E self, _link, parm0_x; - STORE_F pKey, parm1_x; - STORE_F pAscii, parm2_x; - CALL3 Raise_Key; - RETURN return_x; - RETURN KEY_GAME; - DONE; -} - -void() Item_Link_MouseEnter = asm -{ -local float temp_0; -local float temp_1; - INDIRECT_E self, _link, temp_0; - IFNOT temp_0, 5; - INDIRECT_E self, _link, temp_1; - INDIRECT_F temp_1, _runFlag, temp_1; - BITAND temp_1, RUNFLAG_NOSELECT, temp_1; - NOT_F temp_1, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 4; - INDIRECT_E self, _link, parm0_x; - STORE_F FILE_APPEND, parm1_x; - CALL2 Menu_Select; - DONE; -} - -float() Item_Link_IsSelected = asm -{ -local float temp_0; - EQ_E Menu_ActiveItem, self, temp_0; - IFNOT temp_0, 2; - RETURN FILE_APPEND; - INDIRECT_E self, _link, temp_0; - IFNOT temp_0, 5; - INDIRECT_E self, _link, temp_0; - EQ_E Menu_ActiveItem, temp_0, temp_0; - RETURN temp_0; - GOTO 2; - RETURN KEY_GAME; - DONE; -} - -void() Item_Link_Destroy = asm -{ - STORE_F self, parm0_x; - STORE_F link, parm1_x; - CALL2 String_EntityFree; - DONE; -} - -void() Item_Link_Init = asm -{ -local float temp_0; - STORE_F self, parm0_x; - STORE_F link, parm1_x; - CALL2 String_EntityZone; - CALL0 Item_Link_Update; - ADDRESS self, _destroy, temp_0; - STOREP_FNC Item_Link_Destroy, temp_0; - ADDRESS self, _key, temp_0; - STOREP_FNC Item_Link_Key, temp_0; - ADDRESS self, _mouseEnter, temp_0; - STOREP_FNC Item_Link_MouseEnter, temp_0; - ADDRESS self, _update, temp_0; - STOREP_FNC Item_Link_MouseEnter, temp_0; - DONE; -} - -void(entity pEntity, void () pPopFunction) Menu_History_Push = asm -{ -local entity lHistory; -local float temp_0; - STORE_FNC Util_NullFunction, Menu_KeyHook; - CALL0 spawn; - STORE_ENT return_x, lHistory; - ADDRESS lHistory, type, temp_0; - STOREP_S "MMANAGER_HISTORY", temp_0; - ADDRESS lHistory, _prev, temp_0; - STOREP_ENT Menu_History, temp_0; - ADDRESS lHistory, _child, temp_0; - STOREP_ENT Menu_ActiveItem, temp_0; - ADDRESS lHistory, _parent, temp_0; - STOREP_ENT Menu_ActiveWindow, temp_0; - ADDRESS lHistory, _next, temp_0; - STOREP_ENT pEntity, temp_0; - ADDRESS lHistory, _destroy, temp_0; - STOREP_FNC pPopFunction, temp_0; - STORE_ENT lHistory, Menu_History; - DONE; -} - -void() Menu_History_Pop = asm -{ -local entity lTemp; -local float temp_0; - EQ_E Menu_History, null_entity, temp_0; - IFNOT temp_0, 2; - RETURN offset_0; - STORE_FNC Util_NullFunction, Menu_KeyHook; - INDIRECT_E Menu_History, _child, Menu_ActiveItem; - INDIRECT_E Menu_History, _parent, Menu_ActiveWindow; - STORE_ENT Menu_History, lTemp; - STORE_F lTemp, parm0_x; - CALL1 Raise_Destroy; - INDIRECT_E Menu_History, _prev, Menu_History; - STORE_F lTemp, parm0_x; - CALL1 remove; - DONE; -} - -float(entity pEntity) Menu_History_Verify = asm -{ -local float temp_0; - EQ_E Menu_History, null_entity, temp_0; - IFNOT temp_0, 2; - RETURN KEY_GAME; - INDIRECT_E Menu_History, _next, temp_0; - EQ_E temp_0, pEntity, temp_0; - IFNOT temp_0, 2; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void() Menu_History_Clear = asm -{ -local entity lEntity; -local float temp_0; - STORE_ENT null_entity, lEntity; - STORE_F lEntity, parm0_x; - STORE_F type, parm1_x; - STORE_F "MMANAGER_HISTORY", parm2_x; - CALL3 findstring; - STORE_ENT return_x, lEntity; - NE_E return_x, null_entity, temp_0; - IFNOT temp_0, 4; - STORE_F lEntity, parm0_x; - CALL1 remove; - GOTO -9; - STORE_ENT null_entity, Menu_History; - DONE; -} - -void (float, float) _Menu_Process_Debug_Filter; -void(float pMode, float pSelectState) _Menu_Process_Debug_Filter = asm -{ -local float temp_0; -local float temp_1; - IF sys_debug_process, 3; - STORE_F KEY_GAME, _menu_process_filtered; - GOTO 5; - IFNOT sys_debug_process_filter, 3; - BITAND pMode, sys_debug_process_filter, _menu_process_filtered; - GOTO 2; - STORE_F FILE_APPEND, _menu_process_filtered; - EQ_F _menu_process_filtered, MENU_PROCESS_MOUSE, temp_0; - IFNOT temp_0, 2; - EQ_F pSelectState, MENU_SELECT_NEVER, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 2; - STORE_F KEY_GAME, _menu_process_filtered; - DONE; -} - -void() Menu_Process_Setup = asm -{ - STORE_V '0.000000 0.000000 0.000000', Menu_Origin; - STORE_V '0.000000 0.000000 0.000000', Menu_Clip_Position; - STORE_V '0.000000 0.000000 0.000000', Menu_Clip_Size; - DONE; -} - -void (entity) _Menu_Env_LoadClipArea; -void(entity pItem) _Menu_Env_LoadClipArea = asm -{ -local float temp_0; -local float temp_1; -local vector temp_2; - INDIRECT_V pItem, _cache_clip_pos_x, Menu_Clip_Position; - INDIRECT_V pItem, _cache_clip_size_x, Menu_Clip_Size; - IFNOT sys_debug_mgfx, 1; - AND sys_debug_mgfx, _menu_process_filtered, temp_0; - IFNOT temp_0, 14; - STORE_V Menu_Clip_Position, parm0; - CALL1 vtos; - STORE_V Menu_Clip_Size, parm0; - STORE_F return_x, temp_0; - CALL1 vtos; - STORE_F return_x, temp_1; - STORE_F temp_0, return_x; - STORE_F "MGFX Loaded clip area = (", parm0_x; - STORE_F return_x, parm1_x; - STORE_F "; ", parm2_x; - STORE_F temp_1, parm3_x; - STORE_F ") -", parm4_x; - CALL5 print; - DONE; -} - -void (entity) _Menu_Env_LoadOrigin; -void(entity pItem) _Menu_Env_LoadOrigin = asm -{ -local float temp_0; -local vector temp_2; - INDIRECT_V pItem, _cache_origin_x, Menu_Origin; - SUB_V Cursor_Position, Menu_Origin, Menu_Cursor_Position; - IFNOT sys_debug_mgfx, 1; - AND sys_debug_mgfx, _menu_process_filtered, temp_0; - IFNOT temp_0, 7; - STORE_V Menu_Origin, parm0; - CALL1 vtos; - STORE_F "MGFX Loaded org = ", parm0_x; - STORE_F return_x, parm1_x; - STORE_F " -", parm2_x; - CALL3 print; - DONE; -} - -void (entity) _Menu_Env_Reload; -void(entity pItem) _Menu_Env_Reload = asm -{ -local float locked_1585; -local float temp_0; -local vector temp_2; -local float temp_5; - INDIRECT_V pItem, _cache_origin_x, Menu_Origin; - SUB_V Cursor_Position, Menu_Origin, Menu_Cursor_Position; - INDIRECT_V pItem, _cache_clip_pos_x, Menu_Clip_Position; - INDIRECT_V pItem, _cache_clip_size_x, Menu_Clip_Size; - IFNOT sys_debug_mgfx, 1; - AND sys_debug_mgfx, _menu_process_filtered, temp_0; - IFNOT temp_0, 21; - STORE_V Menu_Origin, parm0; - CALL1 vtos; - STORE_V Menu_Clip_Position, parm0; - STORE_F return_x, temp_0; - CALL1 vtos; - STORE_F return_x, locked_1585; - STORE_F temp_0, return_x; - STORE_V Menu_Clip_Size, parm0; - STORE_F return_x, temp_0; - CALL1 vtos; - STORE_F return_x, temp_5; - STORE_F temp_0, return_x; - STORE_F "MGFX Reloaded env for: org = ", parm0_x; - STORE_F return_x, parm1_x; - STORE_F "; clip area = (", parm2_x; - STORE_F locked_1585, parm3_x; - STORE_F "; ", parm4_x; - STORE_F temp_5, parm5_x; - STORE_F ") -", parm6_x; - CALL7 print; - DONE; -} - -void () _MGX_SetClipArea; -void() _MGX_SetClipArea = asm -{ -local float temp_0; -local float temp_1; - EQ_V Menu_Clip_Position, '0.000000 0.000000 0.000000', temp_0; - IFNOT temp_0, 2; - EQ_V Menu_Clip_Size, '0.000000 0.000000 0.000000', temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 3; - CALL0 Gfx_ResetClipArea; - GOTO 6; - STORE_F Menu_Clip_Position_x, parm0_x; - STORE_F Menu_Clip_Position_y, parm1_x; - STORE_F Menu_Clip_Size_x, parm2_x; - STORE_F Menu_Clip_Size_y, parm3_x; - CALL4 Gfx_SetClipArea; - DONE; -} - -void (entity) _Menu_Env_SetupClipArea; -void(entity pItem) _Menu_Env_SetupClipArea = asm -{ -local vector lSize; -local vector lPos; -local vector lDelta; -local float temp_0; -local float temp_1; -local vector temp_2; - INDIRECT_V pItem, pos_x, lPos; - INDIRECT_V pItem, size_x, lSize; - NE_V lPos, '0.000000 0.000000 0.000000', temp_0; - IF temp_0, 2; - NE_V lSize, '0.000000 0.000000 0.000000', temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 22; - NE_V Menu_Clip_Position, '0.000000 0.000000 0.000000', temp_0; - IF temp_0, 2; - NE_V Menu_Clip_Size, '0.000000 0.000000 0.000000', temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 15; - ADD_V Menu_Origin, lPos, lPos; - STORE_V lPos, parm0; - STORE_V Menu_Clip_Position, parm1; - STORE_V Menu_Clip_Size, parm2; - CALL3 Util_GetClipDelta; - STORE_V return, lDelta; - ADD_V lPos, lDelta, lPos; - SUB_V lSize, lDelta, temp_2; - STORE_V lPos, parm0; - STORE_V temp_2, parm1; - STORE_V Menu_Clip_Position, parm2; - STORE_V Menu_Clip_Size, parm3; - CALL4 Util_ClipRect; - STORE_V return, lSize; - STORE_V lPos, Menu_Clip_Position; - STORE_V lSize, Menu_Clip_Size; - ADDRESS pItem, _cache_clip_pos_x, temp_2_x; - STOREP_V Menu_Clip_Position_x, temp_2; - ADDRESS pItem, _cache_clip_size_x, temp_2_x; - STOREP_V Menu_Clip_Size_x, temp_2; - IFNOT sys_debug_mgfx, 1; - AND sys_debug_mgfx, _menu_process_filtered, temp_0; - IFNOT temp_0, 26; - INDIRECT_V pItem, pos_x, parm0; - CALL1 vtos; - INDIRECT_V pItem, size_x, parm0; - STORE_F return_x, temp_0; - CALL1 vtos; - STORE_F return_x, temp_1; - STORE_F temp_0, return_x; - STORE_F "MGFX Setup clip area: (", parm0_x; - STORE_F return_x, parm1_x; - STORE_F "; ", parm2_x; - STORE_F temp_1, parm3_x; - CALL4 print; - STORE_V Menu_Clip_Position, parm0; - CALL1 vtos; - STORE_V Menu_Clip_Size, parm0; - STORE_F return_x, temp_0; - CALL1 vtos; - STORE_F return_x, temp_1; - STORE_F temp_0, return_x; - STORE_F ") clipped to (", parm0_x; - STORE_F return_x, parm1_x; - STORE_F "; ", parm2_x; - STORE_F temp_1, parm3_x; - STORE_F ") -", parm4_x; - CALL5 print; - DONE; -} - -void (entity) _Menu_Env_SetupOrigin; -void(entity pItem) _Menu_Env_SetupOrigin = asm -{ -local float temp_0; -local vector temp_2; -local vector temp_3; - INDIRECT_V pItem, origin_x, temp_2; - ADD_V Menu_Origin, temp_2, temp_2; - INDIRECT_V pItem, pos_x, temp_3; - ADD_V temp_2, temp_3, Menu_Origin; - ADDRESS pItem, _cache_origin_x, temp_2_x; - STOREP_V Menu_Origin_x, temp_2; - IFNOT sys_debug_mgfx, 1; - AND sys_debug_mgfx, _menu_process_filtered, temp_0; - IFNOT temp_0, 7; - STORE_V Menu_Origin, parm0; - CALL1 vtos; - STORE_F "MGFX Setup org = ", parm0_x; - STORE_F return_x, parm1_x; - STORE_F " -", parm2_x; - CALL3 print; - DONE; -} - -void (entity) _Menu_ProcessRunFlag; -void(entity pItem) _Menu_ProcessRunFlag = asm -{ -local entity lChild; -local float temp_0; - IFNOT _menu_process_filtered, 8; - INDIRECT_S pItem, name, temp_0; - STORE_F "R ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " -", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 print; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_SetupClipArea; - STORE_F pItem, parm0_x; - CALL1 Menu_SetRunFlag; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_SetupOrigin; - INDIRECT_E pItem, _child, lChild; - IFNOT lChild, 10; - STORE_F pItem, parm0_x; - STORE_F lChild, parm1_x; - CALL2 Menu_InheritRunFlag; - STORE_F lChild, parm0_x; - CALL1 _Menu_ProcessRunFlag; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_Reload; - INDIRECT_E lChild, _next, lChild; - GOTO -9; - DONE; -} - -void (entity) _Menu_ProcessDraw; -void(entity pItem) _Menu_ProcessDraw = asm -{ -local entity lChild; -local float temp_0; - IFNOT _menu_process_filtered, 8; - INDIRECT_S pItem, name, temp_0; - STORE_F "D ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " ", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 print; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, 96.000000, temp_0; - NOT_F temp_0, temp_0; - IF temp_0, 5; - IFNOT _menu_process_filtered, 3; - STORE_F "Failed (Not visible) -", parm0_x; - CALL1 print; - RETURN offset_0; - IFNOT _menu_process_filtered, 3; - STORE_F " -", parm0_x; - CALL1 print; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_LoadClipArea; - CALL0 _MGX_SetClipArea; - STORE_F pItem, parm0_x; - CALL1 Raise_Draw; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_LoadOrigin; - INDIRECT_E pItem, _child, lChild; - IFNOT lChild, 8; - STORE_F lChild, parm0_x; - CALL1 _Menu_ProcessDraw; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_Reload; - CALL0 _MGX_SetClipArea; - INDIRECT_E lChild, _next, lChild; - GOTO -7; - DONE; -} - -void (entity) _Menu_ProcessUpdate; -void(entity pItem) _Menu_ProcessUpdate = asm -{ -local entity lChild; -local float temp_0; - IFNOT _menu_process_filtered, 8; - INDIRECT_S pItem, name, temp_0; - STORE_F "U ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " ", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 print; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_CHILDDRAWONLY, temp_0; - IFNOT temp_0, 5; - IFNOT _menu_process_filtered, 3; - STORE_F "Failed (RUNFLAG_CHILDDRAWONLY) -", parm0_x; - CALL1 print; - RETURN offset_0; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_LoadClipArea; - STORE_F pItem, parm0_x; - CALL1 Raise_Update; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_HIDDEN, temp_0; - IFNOT temp_0, 5; - IFNOT _menu_process_filtered, 3; - STORE_F "Aborted branching (RUNFLAG_HIDDEN) -", parm0_x; - CALL1 print; - RETURN offset_0; - IFNOT _menu_process_filtered, 3; - STORE_F " -", parm0_x; - CALL1 print; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_LoadOrigin; - INDIRECT_E pItem, _child, lChild; - IFNOT lChild, 7; - STORE_F lChild, parm0_x; - CALL1 _Menu_ProcessUpdate; - STORE_F lChild, parm0_x; - CALL1 _Menu_Env_Reload; - INDIRECT_E lChild, _next, lChild; - GOTO -6; - DONE; -} - -void (entity, bool) _Menu_ProcessMouse; -void(entity pItem, bool pSelectMode) _Menu_ProcessMouse = asm -{ -local float locked_1586; -local entity lChild; -local float temp_1; -local float temp_5; - IFNOT _menu_process_filtered, 21; - STORE_F "M ", parm0_x; - CALL1 print; - GOTO 10; - STORE_F "S ", parm0_x; - CALL1 print; - GOTO 12; - STORE_F "A ", parm0_x; - CALL1 print; - GOTO 9; - STORE_F "N ", parm0_x; - CALL1 print; - GOTO 6; - IFNOT pSelectMode, -9; - EQ_F pSelectMode, MENU_SELECT_ALWAYS, locked_1586; - IF locked_1586, -8; - EQ_F pSelectMode, MENU_SELECT_NEVER, locked_1586; - IF locked_1586, -7; - INDIRECT_S pItem, name, parm0_x; - STORE_F " ", parm1_x; - CALL2 print; - INDIRECT_F pItem, _runFlag, locked_1586; - BITAND locked_1586, 96.000000, locked_1586; - NOT_F locked_1586, locked_1586; - IF locked_1586, 5; - IFNOT _menu_process_filtered, 3; - STORE_F "Failed (Not visible) -", parm0_x; - CALL1 print; - RETURN offset_0; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_LoadClipArea; - STORE_V Cursor_Position, parm0; - STORE_V Menu_Clip_Position, parm1; - STORE_V Menu_Clip_Size, parm2; - CALL3 Util_InRect; - IF return_x, 5; - EQ_V Menu_Clip_Position, '0.000000 0.000000 0.000000', locked_1586; - IFNOT locked_1586, 2; - EQ_V Menu_Clip_Size, '0.000000 0.000000 0.000000', temp_1; - AND locked_1586, temp_1, locked_1586; - OR return_x, locked_1586, locked_1586; - IFNOT locked_1586, 34; - ADDRESS pItem, _runFlag, locked_1586; - INDIRECT_F pItem, _runFlag, temp_1; - BITOR temp_1, RUNFLAG_MOUSEINAREA, temp_1; - STOREP_F temp_1, locked_1586; - INDIRECT_F pItem, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_HADMOUSE, locked_1586; - NOT_F locked_1586, locked_1586; - IFNOT locked_1586, 3; - STORE_F pItem, parm0_x; - CALL1 Menu_HasEvents; - AND locked_1586, return_x, locked_1586; - IFNOT locked_1586, 3; - STORE_F pItem, parm0_x; - CALL1 Raise_MouseEnter; - NE_F pSelectMode, MENU_SELECT_NEVER, locked_1586; - IFNOT locked_1586, 3; - INDIRECT_F pItem, flag, temp_1; - BITAND temp_1, FLAG_SEALOFFMOUSE, temp_1; - AND locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 2; - STORE_ENT null_entity, Menu_ActiveItem; - EQ_F pSelectMode, MENU_SELECT_ALWAYS, locked_1586; - IF locked_1586, 7; - INDIRECT_F pItem, _runFlag, temp_1; - BITAND temp_1, RUNFLAG_NOSELECT, temp_1; - NOT_F temp_1, temp_1; - IFNOT temp_1, 2; - EQ_F pSelectMode, MENU_SELECT_SELECTABLE, temp_5; - AND temp_1, temp_5, temp_1; - OR locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 2; - STORE_ENT pItem, Menu_ActiveItem; - GOTO 14; - INDIRECT_F pItem, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_HADMOUSE, locked_1586; - IFNOT locked_1586, 3; - STORE_F pItem, parm0_x; - CALL1 Menu_HasEvents; - AND locked_1586, return_x, locked_1586; - IFNOT locked_1586, 3; - STORE_F pItem, parm0_x; - CALL1 Raise_MouseLeave; - IFNOT _menu_process_filtered, 3; - STORE_F "Aborted branching (Outside the clip area) -", parm0_x; - CALL1 print; - RETURN offset_0; - IFNOT _menu_process_filtered, 3; - STORE_F " -", parm0_x; - CALL1 print; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_LoadOrigin; - INDIRECT_E pItem, _child, lChild; - IFNOT lChild, 21; - INDIRECT_F pItem, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_CHILDDRAWUPDATEONLY, locked_1586; - NOT_F locked_1586, locked_1586; - IF locked_1586, 4; - INDIRECT_F pItem, _runFlag, temp_1; - BITAND temp_1, RUNFLAG_CHILDDRAWONLY, temp_1; - NOT_F temp_1, temp_1; - OR locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 5; - STORE_F lChild, parm0_x; - STORE_F pSelectMode, parm1_x; - CALL2 _Menu_ProcessMouse; - GOTO 4; - STORE_F lChild, parm0_x; - STORE_F MENU_SELECT_NEVER, parm1_x; - CALL2 _Menu_ProcessMouse; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_Reload; - INDIRECT_E lChild, _next, lChild; - GOTO -20; - DONE; -} - -float (float) _Menu_Process_Debug_Return; -float(float pRetValue) _Menu_Process_Debug_Return = asm -{ -local float temp_0; - IFNOT _menu_process_filtered, 17; - GOTO 10; - STORE_F "MENU_EVENT_CONTINUE -", parm0_x; - CALL1 print; - GOTO 13; - STORE_F "MENU_EVENT_RAISEPARENT -", parm0_x; - CALL1 print; - GOTO 10; - STORE_F "MENU_EVENT_PROCESSED -", parm0_x; - CALL1 print; - GOTO 7; - IFNOT pRetValue, -9; - IFNOT pRetValue, -10; - EQ_F pRetValue, MENU_EVENT_RAISEPARENT, temp_0; - IF temp_0, -9; - EQ_F pRetValue, MENU_EVENT_PROCESSED, temp_0; - IF temp_0, -8; - RETURN pRetValue; - DONE; -} - -bool (entity, float, float) _Menu_ProcessKey; -bool(entity pItem, float pKey, float pAscii) _Menu_ProcessKey = asm -{ -local float lResult; -local entity lChild; -local float temp_0; -local float temp_1; - IFNOT _menu_process_filtered, 12; - STORE_F pKey, parm0_x; - CALL1 ftos; - INDIRECT_S pItem, name, temp_0; - STORE_F "K ", parm0_x; - STORE_F return_x, parm1_x; - STORE_F " ", parm2_x; - STORE_F temp_0, parm3_x; - STORE_F " ", parm4_x; - CALL5 strcat; - STORE_F return_x, parm0_x; - CALL1 print; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_CHILDDRAWUPDATEONLY, temp_0; - IF temp_0, 3; - INDIRECT_F pItem, _runFlag, temp_1; - BITAND temp_1, RUNFLAG_CHILDDRAWONLY, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 4; - STORE_F MENU_EVENT_CONTINUE, parm0_x; - CALL1 _Menu_Process_Debug_Return; - RETURN return_x; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_LoadClipArea; - EQ_E Menu_ActiveItem, pItem, temp_0; - IFNOT temp_0, 12; - STORE_F pItem, parm0_x; - STORE_F pKey, parm1_x; - STORE_F pAscii, parm2_x; - CALL3 Raise_Key; - IFNOT return_x, 3; - STORE_F MENU_EVENT_PROCESSED, lResult; - GOTO 2; - STORE_F MENU_EVENT_RAISEPARENT, lResult; - STORE_F lResult, parm0_x; - CALL1 _Menu_Process_Debug_Return; - RETURN return_x; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_LoadOrigin; - INDIRECT_E pItem, _child, lChild; - IFNOT lChild, 30; - STORE_F lChild, parm0_x; - STORE_F pKey, parm1_x; - STORE_F pAscii, parm2_x; - CALL3 _Menu_ProcessKey; - STORE_F return_x, lResult; - STORE_F pItem, parm0_x; - CALL1 _Menu_Env_Reload; - EQ_F lResult, MENU_EVENT_PROCESSED, temp_0; - IFNOT temp_0, 5; - STORE_F MENU_EVENT_PROCESSED, parm0_x; - CALL1 _Menu_Process_Debug_Return; - RETURN return_x; - GOTO 15; - EQ_F lResult, MENU_EVENT_RAISEPARENT, temp_0; - IFNOT temp_0, 13; - STORE_F pItem, parm0_x; - STORE_F pKey, parm1_x; - STORE_F pAscii, parm2_x; - CALL3 Raise_Key; - IFNOT return_x, 5; - STORE_F MENU_EVENT_PROCESSED, parm0_x; - CALL1 _Menu_Process_Debug_Return; - RETURN return_x; - GOTO 4; - STORE_F MENU_EVENT_RAISEPARENT, parm0_x; - CALL1 _Menu_Process_Debug_Return; - RETURN return_x; - INDIRECT_E lChild, _next, lChild; - GOTO -29; - STORE_F MENU_EVENT_CONTINUE, parm0_x; - CALL1 _Menu_Process_Debug_Return; - RETURN return_x; - DONE; -} - -float(entity pItem, float pMode, float pSelectMode, float pKey, float pAscii) Menu_Process = asm -{ -local float lResult; -local vector lOrigin; -local vector lPos; -local vector lSize; -local float temp_0; -local vector temp_2; - STORE_V Menu_Clip_Size, lSize; - STORE_V Menu_Clip_Position, lPos; - STORE_V Menu_Origin, lOrigin; - STORE_F pMode, parm0_x; - STORE_F pSelectMode, parm1_x; - CALL2 _Menu_Process_Debug_Filter; - STORE_F KEY_GAME, lResult; - GOTO 20; - STORE_F pItem, parm0_x; - CALL1 _Menu_ProcessRunFlag; - GOTO 27; - STORE_F pItem, parm0_x; - CALL1 _Menu_ProcessUpdate; - GOTO 24; - STORE_F pItem, parm0_x; - CALL1 _Menu_ProcessDraw; - GOTO 21; - STORE_F pItem, parm0_x; - STORE_F pSelectMode, parm1_x; - CALL2 _Menu_ProcessMouse; - GOTO 17; - STORE_F pItem, parm0_x; - STORE_F pKey, parm1_x; - STORE_F pAscii, parm2_x; - CALL3 _Menu_ProcessKey; - STORE_F return_x, lResult; - GOTO 11; - EQ_F pMode, MENU_PROCESS_RUNFLAG, temp_0; - IF temp_0, -20; - EQ_F pMode, MENU_PROCESS_UPDATE, temp_0; - IF temp_0, -19; - EQ_F pMode, MENU_PROCESS_DRAW, temp_0; - IF temp_0, -18; - EQ_F pMode, MENU_PROCESS_MOUSE, temp_0; - IF temp_0, -17; - EQ_F pMode, MENU_PROCESS_KEY, temp_0; - IF temp_0, -15; - STORE_V lSize, Menu_Clip_Size; - STORE_V lPos, Menu_Clip_Position; - STORE_V lOrigin, Menu_Origin; - SUB_V Cursor_Position, Menu_Origin, Menu_Cursor_Position; - EQ_F pMode, MENU_PROCESS_DRAW, temp_0; - IFNOT temp_0, 2; - CALL0 _MGX_SetClipArea; - RETURN lResult; - DONE; -} - -void() Menu_Frame = asm -{ -local entity lOld; -local float temp_0; - CALL0 Sys_Debug_Frame; - IFNOT sys_debug_halt, 2; - RETURN offset_0; - CALL0 Menu_UpdateRunFlags; - CALL0 Menu_Process_Setup; - NE_V Cursor_Relative, '0.000000 0.000000 0.000000', temp_0; - IFNOT temp_0, 22; - STORE_ENT Menu_ActiveItem, lOld; - STORE_F Menu_ActiveWindow, parm0_x; - STORE_F MENU_PROCESS_MOUSE, parm1_x; - STORE_F MENU_SELECT_SELECTABLE, parm2_x; - STORE_F KEY_GAME, parm3_x; - STORE_F KEY_GAME, parm4_x; - CALL5 Menu_Process; - IF Menu_ActiveItem, 3; - STORE_ENT lOld, Menu_ActiveItem; - GOTO 11; - NE_E lOld, Menu_ActiveItem, temp_0; - IFNOT temp_0, 9; - STORE_F lOld, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 Raise_Select; - STORE_F Menu_ActiveItem, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 Raise_Select; - GOTO 7; - STORE_F Menu_ActiveWindow, parm0_x; - STORE_F MENU_PROCESS_MOUSE, parm1_x; - STORE_F MENU_SELECT_NEVER, parm2_x; - STORE_F KEY_GAME, parm3_x; - STORE_F KEY_GAME, parm4_x; - CALL5 Menu_Process; - CALL0 Menu_Process_Setup; - STORE_F Menu_ActiveWindow, parm0_x; - STORE_F MENU_PROCESS_UPDATE, parm1_x; - STORE_F KEY_GAME, parm2_x; - STORE_F KEY_GAME, parm3_x; - STORE_F KEY_GAME, parm4_x; - CALL5 Menu_Process; - STORE_F KEY_GAME, parm0_x; - CALL1 Menu_CollectGarbage; - DONE; -} - -void() Menu_Draw = asm -{ -local float temp_0; - IFNOT sys_debug_halt, 2; - RETURN offset_0; - INDIRECT_F Menu_ActiveWindow, _runFlag, temp_0; - BITAND temp_0, 96.000000, temp_0; - IF temp_0, 8; - CALL0 Menu_Process_Setup; - STORE_F Menu_ActiveWindow, parm0_x; - STORE_F MENU_PROCESS_DRAW, parm1_x; - STORE_F KEY_GAME, parm2_x; - STORE_F KEY_GAME, parm3_x; - STORE_F KEY_GAME, parm4_x; - CALL5 Menu_Process; - CALL0 Sys_Debug_Draw; - DONE; -} - -void(float pKey, float pAscii) Menu_Key = asm -{ -local float locked_1586; -local entity lOld; -local float temp_1; - IFNOT sys_debug_halt, 2; - RETURN offset_0; - NE_FNC Menu_KeyHook, Util_NullFunction, locked_1586; - IFNOT locked_1586, 5; - STORE_F pKey, parm0_x; - STORE_F pAscii, parm1_x; - CALL2 Menu_KeyHook; - RETURN offset_0; - LE K_MOUSE1, pKey, locked_1586; - IFNOT locked_1586, 2; - LE pKey, K_MOUSE10, temp_1; - AND locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 23; - STORE_ENT Menu_ActiveItem, lOld; - STORE_ENT null_entity, Menu_ActiveItem; - STORE_F Menu_ActiveWindow, parm0_x; - STORE_F MENU_PROCESS_MOUSE, parm1_x; - STORE_F MENU_SELECT_SELECTABLE, parm2_x; - STORE_F KEY_GAME, parm3_x; - STORE_F KEY_GAME, parm4_x; - CALL5 Menu_Process; - IF Menu_ActiveItem, 4; - STORE_ENT lOld, Menu_ActiveItem; - RETURN offset_0; - GOTO 11; - NE_E lOld, Menu_ActiveItem, locked_1586; - IFNOT locked_1586, 9; - STORE_F lOld, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 Raise_Select; - STORE_F Menu_ActiveItem, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 Raise_Select; - EQ_E Menu_ActiveItem, null_entity, locked_1586; - IFNOT locked_1586, 3; - STORE_F KEY_GAME, parm0_x; - CALL1 Menu_Reselect; - INDIRECT_F Menu_ActiveItem, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_NOSELECT, locked_1586; - NOT_F locked_1586, locked_1586; - NOT_F locked_1586, locked_1586; - IFNOT locked_1586, 2; - NE_E Menu_ActiveItem, Menu_ActiveWindow, temp_1; - AND locked_1586, temp_1, locked_1586; - IF locked_1586, 8; - STORE_F Menu_ActiveWindow, parm0_x; - STORE_F MENU_PROCESS_KEY, parm1_x; - STORE_F KEY_GAME, parm2_x; - STORE_F pKey, parm3_x; - STORE_F pAscii, parm4_x; - CALL5 Menu_Process; - NE_F return_x, MENU_EVENT_PROCESSED, temp_1; - OR locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 25; - EQ_F pKey, K_ESCAPE, locked_1586; - IFNOT locked_1586, 10; - BITAND gamestatus, CVAR_READONLY, locked_1586; - IFNOT locked_1586, 4; - STORE_F " K_ESCAPE wasnt processed! -", parm0_x; - CALL1 error; - GOTO 4; - CALL0 Menu_Toggle; - STORE_F "menu_restart -", parm0_x; - CALL1 cmd; - GOTO 14; - BITAND gamestatus, CVAR_READONLY, locked_1586; - IFNOT locked_1586, 12; - STORE_F pKey, parm0_x; - CALL1 ftos; - STORE_F " Key ", parm0_x; - STORE_F return_x, parm1_x; - STORE_F " ('", parm2_x; - CALL3 print; - STORE_F pAscii, parm0_x; - CALL1 chr; - STORE_F return_x, parm0_x; - STORE_F "') wasn't processed! -", parm1_x; - CALL2 print; - DONE; -} - -float() Menu_Toggle = asm -{ -local float temp_0; -local float temp_1; - BITAND gamestatus, KEY_MENU, temp_0; - IF temp_0, 2; - BITAND gamestatus, CVAR_READONLY, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 4; - CALL0 m_hide; - RETURN FILE_APPEND; - GOTO 2; - RETURN KEY_GAME; - DONE; -} - -void(entity pEntity) Raise_Reinit = asm -{ -local float locked_1586; -local entity lOld; - INDIRECT_FU pEntity, _reinit, locked_1586; - IF locked_1586, 2; - RETURN offset_0; - STORE_ENT self, lOld; - STORE_ENT pEntity, self; - INDIRECT_FU self, _reinit, locked_1586; - CALL0 locked_1586; - STORE_ENT lOld, self; - DONE; -} - -void(entity pEntity) Raise_Destroy = asm -{ -local float locked_1586; -local entity lOld; - INDIRECT_FU pEntity, _destroy, locked_1586; - IF locked_1586, 2; - RETURN offset_0; - STORE_ENT self, lOld; - STORE_ENT pEntity, self; - INDIRECT_FU self, _destroy, locked_1586; - CALL0 locked_1586; - STORE_ENT lOld, self; - DONE; -} - -bool(entity pEntity, float pKey, float pAscii) Raise_Key = asm -{ -local float locked_1586; -local bool lResult; -local entity lOld; - INDIRECT_FU pEntity, _key, locked_1586; - IF locked_1586, 2; - RETURN KEY_GAME; - STORE_ENT self, lOld; - STORE_ENT pEntity, self; - INDIRECT_FU self, _key, locked_1586; - STORE_F pKey, parm0_x; - STORE_F pAscii, parm1_x; - CALL2 locked_1586; - STORE_F return_x, lResult; - STORE_ENT lOld, self; - RETURN lResult; - DONE; -} - -void(entity pEntity) Raise_Draw = asm -{ -local float locked_1586; -local entity lOld; - INDIRECT_FU pEntity, _draw, locked_1586; - IF locked_1586, 2; - RETURN offset_0; - STORE_ENT self, lOld; - STORE_ENT pEntity, self; - INDIRECT_FU self, _draw, locked_1586; - CALL0 locked_1586; - STORE_ENT lOld, self; - DONE; -} - -void(entity pEntity) Raise_MouseEnter = asm -{ -local float locked_1586; -local entity lOld; - INDIRECT_FU pEntity, _mouseEnter, locked_1586; - IF locked_1586, 2; - RETURN offset_0; - STORE_ENT self, lOld; - STORE_ENT pEntity, self; - INDIRECT_FU self, _mouseEnter, locked_1586; - CALL0 locked_1586; - STORE_ENT lOld, self; - DONE; -} - -void(entity pEntity) Raise_MouseLeave = asm -{ -local float locked_1586; -local entity lOld; - INDIRECT_FU pEntity, _mouseLeave, locked_1586; - IF locked_1586, 2; - RETURN offset_0; - STORE_ENT self, lOld; - STORE_ENT pEntity, self; - INDIRECT_FU self, _mouseLeave, locked_1586; - CALL0 locked_1586; - STORE_ENT lOld, self; - DONE; -} - -void(entity pEntity) Raise_Update = asm -{ -local float locked_1586; -local entity lOld; - INDIRECT_FU pEntity, _update, locked_1586; - IF locked_1586, 2; - RETURN offset_0; - STORE_ENT self, lOld; - STORE_ENT pEntity, self; - INDIRECT_FU self, _update, locked_1586; - CALL0 locked_1586; - STORE_ENT lOld, self; - DONE; -} - -void(entity pEntity, float pSelect, float pUser) Raise_Select = asm -{ -local float locked_1586; -local entity lOld; - INDIRECT_FU pEntity, _select, locked_1586; - IF locked_1586, 2; - RETURN offset_0; - STORE_ENT self, lOld; - STORE_ENT pEntity, self; - INDIRECT_FU self, _select, locked_1586; - STORE_F pSelect, parm0_x; - STORE_F pUser, parm1_x; - CALL2 locked_1586; - STORE_ENT lOld, self; - DONE; -} - -void() CtCall_Init = asm -{ -local float locked_1586; - INDIRECT_FU self, init, locked_1586; - IFNOT locked_1586, 3; - INDIRECT_FU self, init, locked_1586; - CALL0 locked_1586; - DONE; -} - -void() CtCall_Reinit = asm -{ -local float locked_1586; - INDIRECT_FU self, reinit, locked_1586; - IFNOT locked_1586, 3; - INDIRECT_FU self, reinit, locked_1586; - CALL0 locked_1586; - DONE; -} - -void() CtCall_Destroy = asm -{ -local float locked_1586; - INDIRECT_FU self, destroy, locked_1586; - IFNOT locked_1586, 3; - INDIRECT_FU self, destroy, locked_1586; - CALL0 locked_1586; - DONE; -} - -float(float pKey, float pAscii) CtCall_Key = asm -{ -local float locked_1586; - INDIRECT_FU self, key, locked_1586; - IFNOT locked_1586, 6; - INDIRECT_FU self, key, locked_1586; - STORE_F pKey, parm0_x; - STORE_F pAscii, parm1_x; - CALL2 locked_1586; - RETURN return_x; - RETURN KEY_GAME; - DONE; -} - -void() CtCall_Draw = asm -{ -local float locked_1586; - INDIRECT_FU self, draw, locked_1586; - IFNOT locked_1586, 3; - INDIRECT_FU self, draw, locked_1586; - CALL0 locked_1586; - DONE; -} - -void() CtCall_MouseEnter = asm -{ -local float locked_1586; - INDIRECT_FU self, mouseEnter, locked_1586; - IFNOT locked_1586, 3; - INDIRECT_FU self, mouseEnter, locked_1586; - CALL0 locked_1586; - DONE; -} - -void() CtCall_MouseLeave = asm -{ -local float locked_1586; - INDIRECT_FU self, mouseLeave, locked_1586; - IFNOT locked_1586, 3; - INDIRECT_FU self, mouseLeave, locked_1586; - CALL0 locked_1586; - DONE; -} - -void() CtCall_Action = asm -{ -local float locked_1586; - INDIRECT_FU self, action, locked_1586; - IFNOT locked_1586, 3; - INDIRECT_FU self, action, locked_1586; - CALL0 locked_1586; - DONE; -} - -void() CtCall_Update = asm -{ -local float locked_1586; - INDIRECT_FU self, update, locked_1586; - IFNOT locked_1586, 3; - INDIRECT_FU self, update, locked_1586; - CALL0 locked_1586; - DONE; -} - -void(float pSelect, float pUser) CtCall_Select = asm -{ -local float locked_1586; - INDIRECT_FU self, select, locked_1586; - IFNOT locked_1586, 5; - INDIRECT_FU self, select, locked_1586; - STORE_F pSelect, parm0_x; - STORE_F pUser, parm1_x; - CALL2 locked_1586; - DONE; -} - -void() DefCt_Reinit = asm -{ - DONE; -} - -void() DefCt_Destroy = asm -{ - DONE; -} - -float(float pKey, float pAscii) DefCt_Key = asm -{ - RETURN KEY_GAME; - DONE; -} - -void() DefCt_Draw = asm -{ - DONE; -} - -void() DefCt_MouseEnter = asm -{ - DONE; -} - -void() DefCt_MouseLeave = asm -{ - DONE; -} - -void () DefCt_Action; -void() DefCt_Action = asm -{ - DONE; -} - -void(float pSelect, float pUser) DefCt_Select = asm -{ - DONE; -} - -void() DefCt_Update = asm -{ - DONE; -} - -void (float, string) _Menu_Structure_Debug; -void(float pLevel, string pText) _Menu_Structure_Debug = asm -{ -local float temp_0; - LE pLevel, sys_debug_structure, temp_0; - IFNOT temp_0, 3; - STORE_F pText, parm0_x; - CALL1 print; - DONE; -} - -void (float) _Menu_Select; -void(float pUser) _Menu_Select = asm -{ - STORE_F Menu_ActiveItem, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - DONE; -} - -entity(entity pItem) _Menu_GetParent = asm -{ -local float temp_0; - INDIRECT_E pItem, _parent, temp_0; - IF temp_0, 2; - RETURN null_entity; - INDIRECT_E pItem, _parent, temp_0; - INDIRECT_F temp_0, flag, temp_0; - BITAND temp_0, FLAG_EMBEDDED, temp_0; - IFNOT temp_0, 4; - INDIRECT_E pItem, _parent, parm0_x; - CALL1 _Menu_GetParent; - RETURN return_x; - INDIRECT_E pItem, _parent, temp_0; - RETURN temp_0; - DONE; -} - -bool(entity pItem, entity pParent) _Menu_IsEmbeddedParentOf = asm -{ -local float temp_0; - INDIRECT_E pItem, _parent, temp_0; - EQ_E temp_0, pParent, temp_0; - IFNOT temp_0, 2; - RETURN FILE_APPEND; - INDIRECT_E pItem, _parent, temp_0; - INDIRECT_F temp_0, flag, temp_0; - BITAND temp_0, FLAG_EMBEDDED, temp_0; - IFNOT temp_0, 5; - INDIRECT_E pItem, _parent, parm0_x; - STORE_F pParent, parm1_x; - CALL2 _Menu_IsEmbeddedParentOf; - RETURN return_x; - RETURN KEY_GAME; - DONE; -} - -entity(entity pItem) _Menu_GetFirst = asm -{ -local float temp_0; -local float temp_1; - INDIRECT_F pItem, flag, temp_0; - BITAND temp_0, FLAG_EMBEDDED, temp_0; - IFNOT temp_0, 2; - INDIRECT_E pItem, _child, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 4; - INDIRECT_E pItem, _child, parm0_x; - CALL1 _Menu_GetFirst; - RETURN return_x; - RETURN pItem; - DONE; -} - -entity(entity pItem) _Menu_GetLast = asm -{ -local entity lNode; -local float temp_0; -local float temp_1; - INDIRECT_F pItem, flag, temp_0; - BITAND temp_0, FLAG_EMBEDDED, temp_0; - IFNOT temp_0, 2; - INDIRECT_E pItem, _child, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 9; - INDIRECT_E pItem, _child, lNode; - INDIRECT_E lNode, _next, temp_0; - IFNOT temp_0, 3; - INDIRECT_E lNode, _next, lNode; - GOTO -3; - STORE_F lNode, parm0_x; - CALL1 _Menu_GetLast; - RETURN return_x; - RETURN pItem; - DONE; -} - -entity(entity pItem) _Menu_GetNext = asm -{ -local entity lNext; -local float temp_0; -local float temp_1; - INDIRECT_E pItem, _next, lNext; - IFNOT lNext, 4; - STORE_F lNext, parm0_x; - CALL1 _Menu_GetFirst; - RETURN return_x; - INDIRECT_E pItem, _parent, temp_0; - INDIRECT_F temp_0, flag, temp_0; - BITAND temp_0, FLAG_EMBEDDED, temp_0; - IFNOT temp_0, 3; - INDIRECT_E pItem, _parent, temp_1; - NE_E temp_1, Menu_ActiveWindow, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 5; - INDIRECT_E pItem, _parent, parm0_x; - CALL1 _Menu_GetNext; - RETURN return_x; - GOTO 2; - RETURN null_entity; - DONE; -} - -entity(entity pItem) _Menu_GetPrev = asm -{ -local entity lPrev; -local float temp_0; -local float temp_1; - INDIRECT_E pItem, _prev, lPrev; - IFNOT lPrev, 4; - STORE_F lPrev, parm0_x; - CALL1 _Menu_GetLast; - RETURN return_x; - INDIRECT_E pItem, _parent, temp_0; - INDIRECT_F temp_0, flag, temp_0; - BITAND temp_0, FLAG_EMBEDDED, temp_0; - IFNOT temp_0, 3; - INDIRECT_E pItem, _parent, temp_1; - NE_E temp_1, Menu_ActiveWindow, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 5; - INDIRECT_E pItem, _parent, parm0_x; - CALL1 _Menu_GetPrev; - RETURN return_x; - GOTO 2; - RETURN null_entity; - DONE; -} - -void() _Menu_SelectNext = asm -{ -local float locked_1586; -local entity lTemp; -local float temp_1; - IF Menu_ActiveItem, 5; - STORE_F FILE_APPEND, parm0_x; - STORE_F "_SelectNext: Bad Menu_ActiveItem! -", parm1_x; - CALL2 _Menu_Structure_Debug; - RETURN offset_0; - STORE_ENT Menu_ActiveItem, lTemp; - STORE_F lTemp, parm0_x; - CALL1 _Menu_GetNext; - STORE_ENT return_x, lTemp; - NE_E return_x, null_entity, locked_1586; - IFNOT locked_1586, 15; - INDIRECT_F lTemp, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_NOSELECT, locked_1586; - IF locked_1586, 11; - STORE_ENT lTemp, Menu_ActiveItem; - INDIRECT_S lTemp, name, locked_1586; - STORE_F "_SelectNext: ", parm0_x; - STORE_F locked_1586, parm1_x; - STORE_F " -", parm2_x; - CALL3 strcat; - STORE_F FILE_APPEND, parm0_x; - STORE_F return_x, parm1_x; - CALL2 _Menu_Structure_Debug; - RETURN offset_0; - GOTO -18; - STORE_ENT Menu_ActiveItem, lTemp; - STORE_F lTemp, parm0_x; - CALL1 _Menu_GetPrev; - IFNOT return_x, 8; - STORE_F lTemp, parm0_x; - STORE_F return_x, locked_1586; - CALL1 _Menu_GetPrev; - STORE_F return_x, temp_1; - STORE_F locked_1586, return_x; - STORE_ENT temp_1, lTemp; - GOTO -9; - NE_E lTemp, Menu_ActiveItem, locked_1586; - IFNOT locked_1586, 18; - INDIRECT_F lTemp, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_NOSELECT, locked_1586; - IF locked_1586, 11; - STORE_ENT lTemp, Menu_ActiveItem; - INDIRECT_S lTemp, name, locked_1586; - STORE_F "_SelectNext after loop: ", parm0_x; - STORE_F locked_1586, parm1_x; - STORE_F " -", parm2_x; - CALL3 strcat; - STORE_F FILE_APPEND, parm0_x; - STORE_F return_x, parm1_x; - CALL2 _Menu_Structure_Debug; - RETURN offset_0; - STORE_F lTemp, parm0_x; - CALL1 _Menu_GetNext; - STORE_ENT return_x, lTemp; - GOTO -18; - DONE; -} - -void() _Menu_SelectPrev = asm -{ -local float locked_1586; -local entity lTemp; -local float temp_1; - IF Menu_ActiveItem, 5; - STORE_F FILE_APPEND, parm0_x; - STORE_F "_SelectPrev: Bad Menu_ActiveItem! -", parm1_x; - CALL2 _Menu_Structure_Debug; - RETURN offset_0; - STORE_ENT Menu_ActiveItem, lTemp; - STORE_F lTemp, parm0_x; - CALL1 _Menu_GetPrev; - STORE_ENT return_x, lTemp; - NE_E return_x, null_entity, locked_1586; - IFNOT locked_1586, 15; - INDIRECT_F lTemp, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_NOSELECT, locked_1586; - IF locked_1586, 11; - STORE_ENT lTemp, Menu_ActiveItem; - INDIRECT_S lTemp, name, locked_1586; - STORE_F "_SelectPrev: ", parm0_x; - STORE_F locked_1586, parm1_x; - STORE_F " -", parm2_x; - CALL3 strcat; - STORE_F FILE_APPEND, parm0_x; - STORE_F return_x, parm1_x; - CALL2 _Menu_Structure_Debug; - RETURN offset_0; - GOTO -18; - STORE_ENT Menu_ActiveItem, lTemp; - STORE_F lTemp, parm0_x; - CALL1 _Menu_GetNext; - IFNOT return_x, 8; - STORE_F lTemp, parm0_x; - STORE_F return_x, locked_1586; - CALL1 _Menu_GetNext; - STORE_F return_x, temp_1; - STORE_F locked_1586, return_x; - STORE_ENT temp_1, lTemp; - GOTO -9; - NE_E lTemp, Menu_ActiveItem, locked_1586; - IFNOT locked_1586, 18; - INDIRECT_F lTemp, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_NOSELECT, locked_1586; - IF locked_1586, 11; - STORE_ENT lTemp, Menu_ActiveItem; - INDIRECT_S lTemp, name, locked_1586; - STORE_F "_SelectPrev after loop: ", parm0_x; - STORE_F locked_1586, parm1_x; - STORE_F " -", parm2_x; - CALL3 strcat; - STORE_F FILE_APPEND, parm0_x; - STORE_F return_x, parm1_x; - CALL2 _Menu_Structure_Debug; - RETURN offset_0; - STORE_F lTemp, parm0_x; - CALL1 _Menu_GetPrev; - STORE_ENT return_x, lTemp; - GOTO -18; - DONE; -} - -float() _Menu_SelectUp = asm -{ -local entity lNode; -local entity lParent; -local entity lSelected; -local float temp_0; - STORE_ENT Menu_ActiveItem, lSelected; - IF lSelected, 5; - STORE_F FILE_APPEND, parm0_x; - STORE_F "_SelectUp: Bad Menu_ActiveItem! -", parm1_x; - CALL2 _Menu_Structure_Debug; - RETURN KEY_GAME; - EQ_E lSelected, Menu_ActiveWindow, temp_0; - IFNOT temp_0, 18; - STORE_F KEY_MENU, parm0_x; - STORE_F "_SelectUp: Selecting up current active window.. -", parm1_x; - CALL2 _Menu_Structure_Debug; - EQ_E Menu_History, null_entity, temp_0; - IFNOT temp_0, 9; - STORE_F KEY_MENU, parm0_x; - STORE_F "_SelectUp: Empty history -> toggling menu.. -", parm1_x; - CALL2 _Menu_Structure_Debug; - CALL0 Menu_Toggle; - IF return_x, 3; - STORE_F KEY_GAME, parm0_x; - CALL1 Menu_Reselect; - RETURN FILE_APPEND; - STORE_F KEY_MENU, parm0_x; - STORE_F "_SelectUp: Popping history.. -", parm1_x; - CALL2 _Menu_Structure_Debug; - CALL0 Menu_History_Pop; - STORE_F lSelected, parm0_x; - CALL1 _Menu_GetParent; - STORE_ENT return_x, lParent; - IF lParent, 5; - STORE_F KEY_MENU, parm0_x; - STORE_F "_SelectUp: No parent and not active window! -", parm1_x; - CALL2 _Menu_Structure_Debug; - RETURN KEY_GAME; - INDIRECT_F lParent, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_NOSELECT, temp_0; - IF temp_0, 11; - STORE_ENT lParent, Menu_ActiveItem; - INDIRECT_S lParent, name, temp_0; - STORE_F "_SelectUp: first parent: ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " -", parm2_x; - CALL3 strcat; - STORE_F FILE_APPEND, parm0_x; - STORE_F return_x, parm1_x; - CALL2 _Menu_Structure_Debug; - RETURN FILE_APPEND; - EQ_E lParent, Menu_ActiveWindow, temp_0; - IFNOT temp_0, 16; - STORE_ENT Menu_ActiveWindow, Menu_ActiveItem; - INDIRECT_S Menu_ActiveItem, name, temp_0; - STORE_F "_SelectUp: select up parent: ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " -", parm2_x; - CALL3 strcat; - STORE_F KEY_MENU, parm0_x; - STORE_F return_x, parm1_x; - CALL2 _Menu_Structure_Debug; - CALL0 _Menu_SelectUp; - IFNOT return_x, 2; - RETURN FILE_APPEND; - STORE_ENT lSelected, Menu_ActiveItem; - RETURN KEY_GAME; - GOTO 7; - INDIRECT_E lParent, _parent, temp_0; - IF temp_0, 5; - STORE_F FILE_APPEND, parm0_x; - STORE_F "_SelectUp: No parent of parent and not active window! -", parm1_x; - CALL2 _Menu_Structure_Debug; - RETURN KEY_GAME; - STORE_F lParent, parm0_x; - CALL1 _Menu_GetParent; - STORE_ENT return_x, Menu_ActiveItem; - INDIRECT_S Menu_ActiveItem, name, temp_0; - STORE_F "_SelectUp: SelectDown on parent of parent '", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F "' -", parm2_x; - CALL3 strcat; - STORE_F KEY_MENU, parm0_x; - STORE_F return_x, parm1_x; - CALL2 _Menu_Structure_Debug; - CALL0 _Menu_SelectDown; - STORE_ENT Menu_ActiveItem, lNode; - IFNOT lNode, 14; - INDIRECT_E lNode, _parent, temp_0; - EQ_E temp_0, lParent, temp_0; - IFNOT temp_0, 9; - STORE_F lSelected, parm0_x; - CALL1 _Menu_GetParent; - STORE_ENT return_x, Menu_ActiveItem; - CALL0 _Menu_SelectUp; - IFNOT return_x, 2; - RETURN FILE_APPEND; - STORE_ENT lSelected, Menu_ActiveItem; - RETURN KEY_GAME; - INDIRECT_E lNode, _parent, lNode; - GOTO -13; - RETURN FILE_APPEND; - DONE; -} - -void (entity) _Menu_PrintRunFlag; -float() _Menu_SelectDown = asm -{ -local entity lChild; -local entity lParent; -local float temp_0; - STORE_ENT Menu_ActiveItem, lParent; - IF lParent, 5; - STORE_F FILE_APPEND, parm0_x; - STORE_F "_SelectDown: Bad Menu_ActiveItem! -", parm1_x; - CALL2 _Menu_Structure_Debug; - RETURN KEY_GAME; - INDIRECT_E lParent, _child, parm0_x; - CALL1 _Menu_GetFirst; - STORE_ENT return_x, lChild; - IFNOT lChild, 20; - INDIRECT_F lChild, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_NOSELECT, temp_0; - IF temp_0, 13; - STORE_ENT lChild, Menu_ActiveItem; - STORE_F lChild, parm0_x; - CALL1 _Menu_PrintRunFlag; - INDIRECT_S lChild, name, temp_0; - STORE_F "_SelectDown: ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " -", parm2_x; - CALL3 strcat; - STORE_F FILE_APPEND, parm0_x; - STORE_F return_x, parm1_x; - CALL2 _Menu_Structure_Debug; - RETURN FILE_APPEND; - STORE_F lChild, parm0_x; - CALL1 _Menu_GetNext; - STORE_ENT return_x, lChild; - GOTO -19; - INDIRECT_E lParent, _child, parm0_x; - CALL1 _Menu_GetFirst; - STORE_ENT return_x, lChild; - IFNOT lChild, 20; - INDIRECT_F lChild, flag, temp_0; - BITAND temp_0, FLAG_EMBEDDED, temp_0; - IF temp_0, 13; - STORE_ENT lChild, Menu_ActiveItem; - INDIRECT_S Menu_ActiveItem, name, temp_0; - STORE_F "_SelectDown: Try child: ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " -", parm2_x; - CALL3 strcat; - STORE_F KEY_MENU, parm0_x; - STORE_F return_x, parm1_x; - CALL2 _Menu_Structure_Debug; - CALL0 _Menu_SelectDown; - IFNOT return_x, 2; - RETURN FILE_APPEND; - STORE_F lChild, parm0_x; - CALL1 _Menu_GetNext; - STORE_ENT return_x, lChild; - GOTO -19; - STORE_ENT lParent, Menu_ActiveItem; - RETURN KEY_GAME; - DONE; -} - -void() _Menu_Reselect = asm -{ - STORE_ENT Menu_ActiveWindow, Menu_ActiveItem; - CALL0 _Menu_SelectDown; - DONE; -} - -void(float pUser) Menu_SelectNext = asm -{ - STORE_F Menu_ActiveItem, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - CALL0 _Menu_SelectNext; - STORE_F Menu_ActiveItem, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - DONE; -} - -void(float pUser) Menu_SelectPrev = asm -{ - STORE_F Menu_ActiveItem, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - CALL0 _Menu_SelectPrev; - STORE_F Menu_ActiveItem, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - DONE; -} - -float(float pUser) Menu_SelectUp = asm -{ -local entity lOld; - STORE_ENT Menu_ActiveItem, lOld; - CALL0 _Menu_SelectUp; - IFNOT return_x, 10; - STORE_F lOld, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - STORE_F Menu_ActiveItem, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -float(float pUser) Menu_SelectDown = asm -{ -local entity lOld; - STORE_ENT Menu_ActiveItem, lOld; - CALL0 _Menu_SelectDown; - IFNOT return_x, 10; - STORE_F lOld, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - STORE_F Menu_ActiveItem, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void(entity pItem, bool pUser) Menu_Select = asm -{ -local float temp_0; - STORE_F Menu_ActiveItem, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - INDIRECT_S pItem, name, temp_0; - STORE_F "Menu_Select: ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " -", parm2_x; - CALL3 strcat; - STORE_F FILE_APPEND, parm0_x; - STORE_F return_x, parm1_x; - CALL2 _Menu_Structure_Debug; - STORE_ENT pItem, Menu_ActiveItem; - STORE_F Menu_ActiveItem, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - DONE; -} - -void(entity pItem, bool pUser) Menu_CorrectSelection = asm -{ -local float temp_0; - NE_E Menu_ActiveItem, pItem, temp_0; - IFNOT temp_0, 4; - STORE_F pItem, parm0_x; - STORE_F pUser, parm1_x; - CALL2 Menu_Select; - DONE; -} - -void(float pUser) Menu_Reselect = asm -{ - STORE_F Menu_ActiveItem, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - CALL0 _Menu_Reselect; - STORE_F Menu_ActiveItem, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - DONE; -} - -void(entity pMenu, float pMakeActive, float pUser) Menu_JumpToWindow = asm -{ -local float temp_0; - STORE_F Menu_ActiveItem, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - INDIRECT_E pMenu, _child, temp_0; - IF temp_0, 6; - INDIRECT_S pMenu, name, temp_0; - STORE_F "Cant jump to ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " ! -", parm2_x; - CALL3 error; - IFNOT pMakeActive, 5; - STORE_F pMenu, parm0_x; - STORE_F Util_NullFunction, parm1_x; - CALL2 Menu_History_Push; - STORE_ENT pMenu, Menu_ActiveWindow; - STORE_ENT pMenu, Menu_ActiveItem; - CALL0 _Menu_SelectDown; - IF return_x, 6; - INDIRECT_S pMenu, name, temp_0; - STORE_F "Couldn't jump to ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " ! -", parm2_x; - CALL3 error; - STORE_F Menu_ActiveItem, parm0_x; - STORE_F FILE_APPEND, parm1_x; - STORE_F pUser, parm2_x; - CALL3 Raise_Select; - DONE; -} - -entity(entity pOrigin, string pName, bool pThrow) Menu_GetItemEx = asm -{ -local float lCounter; -local float lCount; -local string lToken; -local string lFirstTwo; -local entity lItem; -local float temp_0; -local float temp_1; - STORE_F pName, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F KEY_MENU, parm2_x; - CALL3 substring; - STORE_S return_x, lFirstTwo; - EQ_S lFirstTwo, "::", temp_0; - IFNOT temp_0, 11; - STORE_F pName, parm0_x; - STORE_F KEY_MENU, parm1_x; - STORE_F 100000.000000, parm2_x; - CALL3 substring; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F return_x, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lItem; - GOTO 65; - EQ_S lFirstTwo, "##", temp_0; - IFNOT temp_0, 40; - STORE_ENT pOrigin, lItem; - STORE_F pName, parm0_x; - STORE_F KEY_MENU, parm1_x; - STORE_F 100000.000000, parm2_x; - CALL3 substring; - STORE_F return_x, parm0_x; - CALL1 tokenize; - STORE_F return_x, lCount; - STORE_F KEY_GAME, lCounter; - LT lCounter, lCount, temp_0; - IFNOT temp_0, 1; - AND temp_0, lItem, temp_0; - IFNOT temp_0, 26; - STORE_F lCounter, parm0_x; - CALL1 argv; - STORE_S return_x, lToken; - EQ_S lToken, "up", temp_0; - IFNOT temp_0, 3; - INDIRECT_E lItem, _parent, lItem; - GOTO 17; - EQ_S lToken, "down", temp_0; - IFNOT temp_0, 3; - INDIRECT_E lItem, _child, lItem; - GOTO 13; - EQ_S lToken, "next", temp_0; - IFNOT temp_0, 3; - INDIRECT_E lItem, _next, lItem; - GOTO 9; - EQ_S lToken, "prev", temp_0; - IFNOT temp_0, 3; - INDIRECT_E lItem, _prev, lItem; - GOTO 5; - STORE_F "Bad direction link(bad token): '", parm0_x; - STORE_F pName, parm1_x; - STORE_F "'!", parm2_x; - CALL3 error; - ADD_F lCounter, FILE_APPEND, lCounter; - GOTO -28; - GOTO 24; - STORE_ENT null_entity, lItem; - NOT_ENT lItem, temp_0; - IFNOT temp_0, 3; - INDIRECT_E pOrigin, _parent, pOrigin; - NE_E pOrigin, null_entity, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 11; - INDIRECT_S pOrigin, name, parm0_x; - STORE_F "::", parm1_x; - STORE_F pName, parm2_x; - CALL3 strcat; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F return_x, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lItem; - GOTO -15; - IF lItem, 6; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F pName, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lItem; - EQ_E lItem, null_entity, temp_0; - IFNOT temp_0, 1; - AND temp_0, pThrow, temp_0; - IFNOT temp_0, 5; - STORE_F "Couldn't find item '", parm0_x; - STORE_F pName, parm1_x; - STORE_F "'!", parm2_x; - CALL3 error; - RETURN lItem; - DONE; -} - -entity(entity pOrigin, string pName, bool pThrow) Menu_GetChildEx = asm -{ -local entity lItem; -local float temp_0; - IFNOT pOrigin, 11; - INDIRECT_S pOrigin, name, parm0_x; - STORE_F "::", parm1_x; - STORE_F pName, parm2_x; - CALL3 strcat; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F return_x, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lItem; - GOTO 6; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F pName, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lItem; - EQ_E lItem, null_entity, temp_0; - IFNOT temp_0, 1; - AND temp_0, pThrow, temp_0; - IFNOT temp_0, 5; - STORE_F "Couldn't find item '", parm0_x; - STORE_F pName, parm1_x; - STORE_F "'!", parm2_x; - CALL3 error; - RETURN lItem; - DONE; -} - -entity(string pName) Menu_GetItem = asm -{ - STORE_F self, parm0_x; - STORE_F pName, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 Menu_GetItemEx; - RETURN return_x; - DONE; -} - -entity(string pName) Menu_GetChild = asm -{ - STORE_F self, parm0_x; - STORE_F pName, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 Menu_GetChildEx; - RETURN return_x; - DONE; -} - -void(entity pWindow) Menu_EmptyWindow = asm -{ -local entity lChild; -local float temp_0; - INDIRECT_E pWindow, _child, lChild; - IFNOT lChild, 9; - STORE_F lChild, parm0_x; - CALL1 Menu_EmptyWindow; - STORE_F lChild, parm0_x; - CALL1 Raise_Destroy; - STORE_F lChild, parm0_x; - CALL1 remove; - INDIRECT_E lChild, _next, lChild; - GOTO -8; - ADDRESS pWindow, _child, temp_0; - STOREP_ENT null_entity, temp_0; - DONE; -} - -void(entity pEntity) Menu_RemoveItem = asm -{ -local entity lParent; -local float temp_0; - INDIRECT_E pEntity, _parent, lParent; - STORE_F pEntity, parm0_x; - CALL1 Menu_EmptyWindow; - STORE_F pEntity, parm0_x; - CALL1 Raise_Destroy; - STORE_F pEntity, parm0_x; - CALL1 remove; - IFNOT lParent, 3; - STORE_F lParent, parm0_x; - CALL1 Menu_LinkChildren; - DONE; -} - -void(entity pItem) _Menu_PrintRunFlag = asm -{ -local float temp_0; - IFNOT sys_debug_runflag, 48; - INDIRECT_S pItem, name, temp_0; - STORE_F " ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " Runflags: ", parm2_x; - CALL3 print; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_TEMPLATE, temp_0; - IFNOT temp_0, 3; - STORE_F "TEMPLATE ", parm0_x; - CALL1 print; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_MOUSEINAREA, temp_0; - IFNOT temp_0, 3; - STORE_F "MOUSEINAREA ", parm0_x; - CALL1 print; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_HADMOUSE, temp_0; - IFNOT temp_0, 3; - STORE_F "HADMOUSE ", parm0_x; - CALL1 print; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_CHILDDRAWONLY, temp_0; - IFNOT temp_0, 3; - STORE_F "CHILDDRAWONLY ", parm0_x; - CALL1 print; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_CHILDDRAWUPDATEONLY, temp_0; - IFNOT temp_0, 3; - STORE_F "CHILDDRAWUPDATEONLY ", parm0_x; - CALL1 print; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_HIDDEN, temp_0; - IFNOT temp_0, 3; - STORE_F "HIDDEN ", parm0_x; - CALL1 print; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_CLIPPED, temp_0; - IFNOT temp_0, 3; - STORE_F "CLIPPED ", parm0_x; - CALL1 print; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_NOSELECT, temp_0; - IFNOT temp_0, 3; - STORE_F "NOSELECT ", parm0_x; - CALL1 print; - STORE_F " -", parm0_x; - CALL1 print; - DONE; -} - -void(entity pItem) Menu_SetRunFlag = asm -{ -local float lRunFlag; -local float lFlag; -local float temp_0; -local float temp_1; -local float temp_5; - INDIRECT_F pItem, flag, lFlag; - BITAND lFlag, FLAG_TEMPLATE, temp_0; - IFNOT temp_0, 5; - ADDRESS pItem, _runFlag, temp_0; - INDIRECT_F pItem, _runFlag, temp_1; - BITOR temp_1, RUNFLAG_TEMPLATE, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_F pItem, _runFlag, lRunFlag; - BITAND lRunFlag, RUNFLAG_MOUSEINAREA, temp_0; - IFNOT temp_0, 5; - ADDRESS pItem, _runFlag, temp_0; - SUB_F lRunFlag, RUNFLAG_MOUSEINAREA, temp_1; - BITOR temp_1, RUNFLAG_HADMOUSE, temp_1; - STOREP_F temp_1, temp_0; - EQ_V Menu_Clip_Size, '0.000000 0.000000 0.000000', temp_0; - IFNOT temp_0, 2; - NE_V Menu_Clip_Position, '0.000000 0.000000 0.000000', temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 5; - ADDRESS pItem, _runFlag, temp_0; - INDIRECT_F pItem, _runFlag, temp_1; - BITOR temp_1, RUNFLAG_CLIPPED, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_F pItem, _runFlag, lRunFlag; - BITAND lFlag, FLAG_HIDDEN, temp_0; - IF temp_0, 2; - BITAND lRunFlag, RUNFLAG_TEMPLATE, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 6; - BITAND lFlag, FLAG_SERVERONLY, temp_1; - IFNOT temp_1, 3; - BITAND gamestatus, FILE_APPEND, temp_5; - NOT_F temp_5, temp_5; - AND temp_1, temp_5, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 6; - BITAND lFlag, FLAG_CONNECTEDONLY, temp_1; - IFNOT temp_1, 3; - BITAND gamestatus, KEY_MENU, temp_5; - NOT_F temp_5, temp_5; - AND temp_1, temp_5, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 6; - BITAND lFlag, FLAG_DEVELOPERONLY, temp_1; - IFNOT temp_1, 3; - BITAND gamestatus, CVAR_READONLY, temp_5; - NOT_F temp_5, temp_5; - AND temp_1, temp_5, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 4; - ADDRESS pItem, _runFlag, temp_0; - BITOR lRunFlag, RUNFLAG_HIDDEN, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_F pItem, _runFlag, lRunFlag; - BITAND lFlag, FLAG_NOSELECT, temp_0; - IF temp_0, 2; - BITAND lFlag, FLAG_DRAWONLY, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 2; - BITAND lFlag, FLAG_DRAWUPDATEONLY, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 2; - BITAND lFlag, FLAG_EMBEDDED, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 2; - BITAND lRunFlag, RUNFLAG_TEMPLATE, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 2; - BITAND lRunFlag, RUNFLAG_HIDDEN, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 2; - BITAND lRunFlag, RUNFLAG_CHILDDRAWONLY, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 2; - BITAND lRunFlag, RUNFLAG_CHILDDRAWUPDATEONLY, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 4; - ADDRESS pItem, _runFlag, temp_0; - BITOR lRunFlag, RUNFLAG_NOSELECT, temp_1; - STOREP_F temp_1, temp_0; - STORE_F pItem, parm0_x; - CALL1 _Menu_PrintRunFlag; - DONE; -} - -void(entity pParent, entity pItem) Menu_InheritRunFlag = asm -{ -local float temp_0; -local float temp_1; - ADDRESS pItem, _runFlag, temp_0; - INDIRECT_F pItem, _runFlag, temp_1; - BITAND temp_1, 3588.000000, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_F pParent, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_TEMPLATE, temp_0; - IFNOT temp_0, 5; - ADDRESS pItem, _runFlag, temp_0; - INDIRECT_F pItem, _runFlag, temp_1; - BITOR temp_1, RUNFLAG_TEMPLATE, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_F pParent, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_CHILDDRAWONLY, temp_0; - IF temp_0, 3; - INDIRECT_F pParent, flag, temp_1; - BITAND temp_1, FLAG_CHILDDRAWONLY, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 5; - ADDRESS pItem, _runFlag, temp_0; - INDIRECT_F pItem, _runFlag, temp_1; - BITOR temp_1, RUNFLAG_CHILDDRAWONLY, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_F pParent, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_CHILDDRAWUPDATEONLY, temp_0; - IF temp_0, 3; - INDIRECT_F pParent, flag, temp_1; - BITAND temp_1, FLAG_CHILDDRAWUPDATEONLY, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 5; - ADDRESS pItem, _runFlag, temp_0; - INDIRECT_F pItem, _runFlag, temp_1; - BITOR temp_1, RUNFLAG_CHILDDRAWUPDATEONLY, temp_1; - STOREP_F temp_1, temp_0; - INDIRECT_F pParent, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_HIDDEN, temp_0; - IFNOT temp_0, 5; - ADDRESS pItem, _runFlag, temp_0; - INDIRECT_F pItem, _runFlag, temp_1; - BITOR temp_1, RUNFLAG_HIDDEN, temp_1; - STOREP_F temp_1, temp_0; - DONE; -} - -void() Menu_UpdateRunFlags = asm -{ -local vector lOrg; -local vector lSize; -local vector lPos; -local float temp_0; -local float temp_1; -local vector temp_2; - STORE_V Menu_Clip_Position, lPos; - STORE_V Menu_Clip_Size, lSize; - STORE_V Menu_Origin, lOrg; - CALL0 Menu_Process_Setup; - ADDRESS Menu_ActiveWindow, _runFlag, temp_0; - INDIRECT_F Menu_ActiveWindow, _runFlag, temp_1; - BITAND temp_1, RUNFLAG_MOUSEINAREA, temp_1; - STOREP_F temp_1, temp_0; - STORE_F Menu_ActiveWindow, parm0_x; - STORE_F MENU_PROCESS_RUNFLAG, parm1_x; - STORE_F KEY_GAME, parm2_x; - STORE_F KEY_GAME, parm3_x; - STORE_F KEY_GAME, parm4_x; - CALL5 Menu_Process; - STORE_V lSize, Menu_Clip_Size; - STORE_V lPos, Menu_Clip_Position; - STORE_V lOrg, Menu_Origin; - SUB_V Cursor_Position, Menu_Origin, Menu_Cursor_Position; - DONE; -} - -float(entity pEntity) Menu_HasEvents = asm -{ -local float temp_0; - INDIRECT_F pEntity, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_CHILDDRAWONLY, temp_0; - IFNOT temp_0, 2; - RETURN KEY_GAME; - INDIRECT_F pEntity, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_CHILDDRAWUPDATEONLY, temp_0; - IFNOT temp_0, 2; - RETURN KEY_GAME; - INDIRECT_F pEntity, flag, temp_0; - BITAND temp_0, FLAG_DRAWONLY, temp_0; - IFNOT temp_0, 2; - RETURN KEY_GAME; - INDIRECT_F pEntity, flag, temp_0; - BITAND temp_0, FLAG_DRAWUPDATEONLY, temp_0; - IFNOT temp_0, 2; - RETURN KEY_GAME; - RETURN FILE_APPEND; - DONE; -} - -void (vector, vector, vector, float, float, string) _Mgfx_Debug_Info; -void(vector pPos, vector pSize, vector pColor, float pAlpha, float pDrawFlag, string pText) _Mgfx_Debug_Info = asm -{ -local float locked_1585; -local float temp_0; -local float temp_5; - IF sys_debug_mgfx, 2; - RETURN offset_0; - STORE_F pText, parm0_x; - CALL1 String_Zone; - STORE_S return_x, pText; - STORE_V pPos, parm0; - CALL1 vtos; - STORE_V pSize, parm0; - STORE_F return_x, temp_0; - CALL1 vtos; - STORE_F return_x, locked_1585; - STORE_F temp_0, return_x; - STORE_V pColor, parm0; - STORE_F return_x, temp_0; - CALL1 vtos; - STORE_F return_x, temp_5; - STORE_F temp_0, return_x; - STORE_F "MGFX output: ", parm0_x; - STORE_F return_x, parm1_x; - STORE_F " - ", parm2_x; - STORE_F locked_1585, parm3_x; - STORE_F " C", parm4_x; - STORE_F temp_5, parm5_x; - CALL6 print; - STORE_F pAlpha, parm0_x; - CALL1 ftos; - STORE_F pDrawFlag, parm0_x; - STORE_F return_x, temp_0; - CALL1 ftos; - STORE_F return_x, locked_1585; - STORE_F temp_0, return_x; - STORE_F " A", parm0_x; - STORE_F return_x, parm1_x; - STORE_F " X", parm2_x; - STORE_F locked_1585, parm3_x; - STORE_F " ", parm4_x; - STORE_F pText, parm5_x; - STORE_F " -", parm6_x; - CALL7 print; - STORE_F pText, parm0_x; - CALL1 String_Free; - DONE; -} - -vector(vector pPos) Menu_MenToOrg = asm -{ -local vector temp_2; - SUB_V pPos, Menu_Origin, temp_2; - RETURN temp_2_x; - DONE; -} - -vector(vector pPos) Menu_OrgToMen = asm -{ -local vector temp_2; - ADD_V pPos, Menu_Origin, temp_2; - RETURN temp_2_x; - DONE; -} - -vector(vector pPos) Menu_ConToOrg = asm -{ - STORE_V pPos, parm0; - CALL1 Gfx_ConToMen; - STORE_V return, pPos; - STORE_V pPos, parm0; - CALL1 Menu_MenToOrg; - RETURN return_x; - DONE; -} - -vector(vector pPos) Menu_OrgToCon = asm -{ - STORE_V pPos, parm0; - CALL1 Menu_OrgToMen; - STORE_V return, pPos; - STORE_V pPos, parm0; - CALL1 Gfx_MenToCon; - RETURN return_x; - DONE; -} - -float(vector pPosition, float pCharacter, vector pScale, vector pRGB, float pAlpha, float pFlag) Menu_DrawCharacter = asm -{ - STORE_F pCharacter, parm0_x; - CALL1 ftos; - STORE_F "DrawChar: ", parm0_x; - STORE_F return_x, parm1_x; - CALL2 strcat; - STORE_V pPosition, parm0; - STORE_V pScale, parm1; - STORE_V pRGB, parm2; - STORE_F pAlpha, parm3_x; - STORE_F pFlag, parm4_x; - STORE_F return_x, parm5_x; - CALL6 _Mgfx_Debug_Info; - STORE_V pPosition, parm0; - CALL1 Menu_OrgToMen; - STORE_V return, pPosition; - STORE_V pPosition, parm0; - STORE_F pCharacter, parm1_x; - STORE_V pScale, parm2; - STORE_V pRGB, parm3; - STORE_F pAlpha, parm4_x; - STORE_F pFlag, parm5_x; - CALL6 Gfx_DrawCharacter; - RETURN return_x; - DONE; -} - -float(vector pPosition, string pText, vector pScale, vector pRGB, float pAlpha, float pFlag) Menu_DrawString = asm -{ -local float temp_0; - NOT_S pText, temp_0; - IFNOT temp_0, 2; - RETURN FILE_APPEND; - STORE_F "DrawString: ", parm0_x; - STORE_F pText, parm1_x; - CALL2 strcat; - STORE_V pPosition, parm0; - STORE_V pScale, parm1; - STORE_V pRGB, parm2; - STORE_F pAlpha, parm3_x; - STORE_F pFlag, parm4_x; - STORE_F return_x, parm5_x; - CALL6 _Mgfx_Debug_Info; - STORE_V pPosition, parm0; - CALL1 Menu_OrgToMen; - STORE_V return, pPosition; - STORE_V pPosition, parm0; - STORE_F pText, parm1_x; - STORE_V pScale, parm2; - STORE_V pRGB, parm3; - STORE_F pAlpha, parm4_x; - STORE_F pFlag, parm5_x; - CALL6 Gfx_DrawString; - RETURN return_x; - DONE; -} - -float(vector pPosition, string pPicture, vector pSize, vector pRGB, float pAlpha, float pFlag) Menu_DrawPicture = asm -{ - STORE_F "DrawPicture: ", parm0_x; - STORE_F pPicture, parm1_x; - CALL2 strcat; - STORE_V pPosition, parm0; - STORE_V pSize, parm1; - STORE_V pRGB, parm2; - STORE_F pAlpha, parm3_x; - STORE_F pFlag, parm4_x; - STORE_F return_x, parm5_x; - CALL6 _Mgfx_Debug_Info; - STORE_V pPosition, parm0; - CALL1 Menu_OrgToMen; - STORE_V return, pPosition; - STORE_V pPosition, parm0; - STORE_F pPicture, parm1_x; - STORE_V pSize, parm2; - STORE_V pRGB, parm3; - STORE_F pAlpha, parm4_x; - STORE_F pFlag, parm5_x; - CALL6 Gfx_DrawPic; - RETURN return_x; - DONE; -} - -float(vector pPosition, vector pSize, vector pRGB, float pAlpha, float pFlag) Menu_Fill = asm -{ - STORE_V pPosition, parm0; - STORE_V pSize, parm1; - STORE_V pRGB, parm2; - STORE_F pAlpha, parm3_x; - STORE_F pFlag, parm4_x; - STORE_F "Fill", parm5_x; - CALL6 _Mgfx_Debug_Info; - STORE_V pPosition, parm0; - CALL1 Menu_OrgToMen; - STORE_V return, pPosition; - STORE_V pPosition, parm0; - STORE_V pSize, parm1; - STORE_V pRGB, parm2; - STORE_F pAlpha, parm3_x; - STORE_F pFlag, parm4_x; - CALL5 Gfx_Fill; - RETURN return_x; - DONE; -} - -void(float pX, float pY, float pWidth, float pHeight) Menu_SetClipArea = asm -{ -local vector lSize; -local vector lDelta; -local vector lPosition; -local vector temp_2; - STORE_F pX, lPosition_x; - STORE_F pY, lPosition_y; - STORE_V lPosition, parm0; - CALL1 Menu_OrgToMen; - STORE_V return, lPosition; - STORE_F pWidth, lSize_x; - STORE_F pHeight, lSize_y; - STORE_V lPosition, parm0; - STORE_V Menu_Clip_Position, parm1; - STORE_V Menu_Clip_Size, parm2; - CALL3 Util_GetClipDelta; - STORE_V return, lDelta; - ADD_V lPosition, lDelta, lPosition; - SUB_V lSize, lDelta, temp_2; - STORE_V lPosition, parm0; - STORE_V temp_2, parm1; - STORE_V Menu_Clip_Position, parm2; - STORE_V Menu_Clip_Size, parm3; - CALL4 Util_ClipRect; - STORE_V return, lSize; - STORE_F lPosition_x, parm0_x; - STORE_F lPosition_y, parm1_x; - STORE_F pWidth, parm2_x; - STORE_F pHeight, parm3_x; - CALL4 Gfx_SetClipArea; - DONE; -} - -void() Menu_ResetClipArea = asm -{ -local float temp_0; -local float temp_1; - EQ_V Menu_Clip_Position, '0.000000 0.000000 0.000000', temp_0; - IFNOT temp_0, 2; - EQ_V Menu_Clip_Size, '0.000000 0.000000 0.000000', temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 3; - CALL0 Gfx_ResetClipArea; - GOTO 6; - STORE_F Menu_Clip_Position_x, parm0_x; - STORE_F Menu_Clip_Position_y, parm1_x; - STORE_F Menu_Clip_Size_x, parm2_x; - STORE_F Menu_Clip_Size_y, parm3_x; - CALL4 Gfx_SetClipArea; - DONE; -} - -void() Menu_Init = asm -{ - CALL0 Sys_Debug_Init; - CALL0 Sys_Debug_Frame; - CALL0 Menu_InitGarbageStats; - CALL0 Menu_Load; - DONE; -} - -void() Menu_Load = asm -{ - STORE_F MENU_MAINFILE, parm0_x; - CALL1 Parser_ParseMenu; - CALL0 Menu_LinkWindows; - DONE; -} - -entity (entity, FIELD TYPE, string, FIELD TYPE, float) finddef; -entity(entity pStart, .string pFind1, string pMatch, .float pFind2, float pMatch2) finddef = asm -{ -local float temp_0; - STORE_F pStart, parm0_x; - STORE_F pFind1, parm1_x; - STORE_F pMatch, parm2_x; - CALL3 findstring; - STORE_ENT return_x, pStart; - EQ_E pStart, null_entity, temp_0; - IFNOT temp_0, 2; - GOTO 6; - INDIRECT_F pStart, pFind2, temp_0; - EQ_F temp_0, pMatch2, temp_0; - IFNOT temp_0, 2; - GOTO 2; - GOTO -12; - RETURN pStart; - DONE; -} - -void(entity pParent) Menu_LinkChildren = asm -{ -local entity lOPrevious; -local entity lOverwrite; -local entity lNext; -local entity lPrevious; -local float lOrder; -local entity lChild; -local float temp_0; -local float temp_1; - INDIRECT_S pParent, name, temp_0; - STORE_F parent, parm0_x; - STORE_F temp_0, parm1_x; - CALL2 findchainstring; - STORE_ENT return_x, lChild; - EQ_E lChild, null_entity, temp_0; - IFNOT temp_0, 2; - RETURN offset_0; - STORE_ENT null_entity, lPrevious; - IFNOT lChild, 7; - INDIRECT_E lChild, chain, lNext; - ADDRESS lChild, chain, temp_0; - STOREP_ENT lPrevious, temp_0; - STORE_ENT lChild, lPrevious; - STORE_ENT lNext, lChild; - GOTO -6; - STORE_ENT lPrevious, lChild; - STORE_F FILE_APPEND, lOrder; - STORE_ENT null_entity, lPrevious; - IFNOT lChild, 45; - INDIRECT_S pParent, name, temp_0; - STORE_F null_entity, parm0_x; - STORE_F parent, parm1_x; - STORE_F temp_0, parm2_x; - STORE_F orderPos, parm3_x; - STORE_F lOrder, parm4_x; - CALL5 finddef; - STORE_ENT return_x, lOverwrite; - EQ_E lOverwrite, lChild, temp_0; - IFNOT temp_0, 4; - ADDRESS lChild, orderPos, temp_0; - STOREP_F lOrder, temp_0; - GOTO 17; - IFNOT lOverwrite, 13; - STORE_F null_entity, parm0_x; - STORE_F chain, parm1_x; - STORE_F lOverwrite, parm2_x; - CALL3 findentity; - STORE_ENT return_x, lOPrevious; - ADDRESS lOPrevious, chain, temp_0; - INDIRECT_E lOverwrite, chain, temp_1; - STOREP_ENT temp_1, temp_0; - ADDRESS lOverwrite, chain, temp_0; - STOREP_ENT lChild, temp_0; - STORE_ENT lOverwrite, lChild; - GOTO 4; - ADDRESS lChild, orderPos, temp_0; - SUB_F KEY_GAME, lOrder, temp_1; - STOREP_F temp_1, temp_0; - IFNOT lPrevious, 4; - ADDRESS lPrevious, _next, temp_0; - STOREP_ENT lChild, temp_0; - GOTO 3; - ADDRESS pParent, _child, temp_0; - STOREP_ENT lChild, temp_0; - ADDRESS lChild, _prev, temp_0; - STOREP_ENT lPrevious, temp_0; - ADDRESS lChild, _parent, temp_0; - STOREP_ENT pParent, temp_0; - STORE_ENT lChild, lPrevious; - INDIRECT_E lChild, chain, lChild; - STORE_F lOrder, temp_0; - ADD_F lOrder, FILE_APPEND, lOrder; - GOTO -44; - ADDRESS lPrevious, _next, temp_0; - STOREP_ENT null_entity, temp_0; - DONE; -} - -void() Menu_LinkWindows = asm -{ -local entity lEntity; -local float temp_0; -local float temp_1; - STORE_F "Loading defaults if necessary -", parm0_x; - CALL1 dprint; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F MENU_NORMAL_NAME, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lEntity; - EQ_E lEntity, null_entity, temp_0; - IFNOT temp_0, 3; - STORE_F MENU_NORMAL_DEFAULT, parm0_x; - CALL1 loadfromdata; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F MENU_NORMAL_NAME, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lEntity; - EQ_E lEntity, null_entity, temp_0; - IFNOT temp_0, 3; - STORE_F "Bad MENU_NORMAL_DEFAULT! -", parm0_x; - CALL1 error; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F MENU_INGAME_NAME, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lEntity; - EQ_E lEntity, null_entity, temp_0; - IFNOT temp_0, 3; - STORE_F MENU_INGAME_DEFAULT, parm0_x; - CALL1 loadfromdata; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F MENU_INGAME_NAME, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lEntity; - EQ_E lEntity, null_entity, temp_0; - IFNOT temp_0, 3; - STORE_F "Bad MENU_INGAME_DEFAULT! -", parm0_x; - CALL1 error; - STORE_F "Verifying that every name is used only once -", parm0_x; - CALL1 dprint; - STORE_ENT null_entity, lEntity; - STORE_F lEntity, parm0_x; - CALL1 nextent; - STORE_ENT return_x, lEntity; - NE_E return_x, null_entity, temp_0; - IFNOT temp_0, 19; - STORE_ENT lEntity, self; - INDIRECT_S lEntity, name, temp_0; - STORE_F self, parm0_x; - STORE_F name, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 findstring; - STORE_ENT return_x, self; - NE_E return_x, null_entity, temp_0; - IFNOT temp_0, 9; - NE_E self, null_entity, temp_0; - IFNOT temp_0, 6; - INDIRECT_S lEntity, name, temp_0; - STORE_F "Name ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " already used! -", parm2_x; - CALL3 objerror; - GOTO -15; - GOTO -22; - STORE_F "Verification of: name, type and parent fields -", parm0_x; - CALL1 dprint; - STORE_ENT null_entity, self; - STORE_F self, parm0_x; - CALL1 nextent; - STORE_ENT return_x, self; - NE_E return_x, null_entity, temp_0; - IFNOT temp_0, 46; - INDIRECT_S self, name, temp_0; - EQ_S temp_0, "", temp_0; - IFNOT temp_0, 4; - STORE_F "Name is missing! -", parm0_x; - CALL1 objerror; - GOTO -10; - INDIRECT_S self, type, temp_0; - EQ_S temp_0, "", temp_0; - IFNOT temp_0, 4; - STORE_F "Type is missing! -", parm0_x; - CALL1 objerror; - GOTO -16; - INDIRECT_S self, type, parm0_x; - STORE_F "_Spawn", parm1_x; - CALL2 strcat; - STORE_F return_x, parm0_x; - CALL1 isfunction; - IF return_x, 7; - INDIRECT_S self, type, temp_0; - STORE_F "Control ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " not found! -", parm2_x; - CALL3 objerror; - GOTO -28; - INDIRECT_S self, parent, temp_0; - NE_S temp_0, "", temp_0; - IFNOT temp_0, 16; - INDIRECT_S self, parent, temp_0; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lEntity; - EQ_E lEntity, null_entity, temp_0; - IFNOT temp_0, 7; - INDIRECT_S self, parent, temp_0; - STORE_F "Item ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F " not found! -", parm2_x; - CALL3 objerror; - GOTO -45; - GOTO 3; - ADDRESS self, _parent, temp_0; - STOREP_ENT null_entity, temp_0; - GOTO -49; - STORE_F "Building the child lists -", parm0_x; - CALL1 dprint; - STORE_ENT null_entity, lEntity; - STORE_F lEntity, parm0_x; - CALL1 nextent; - STORE_ENT return_x, lEntity; - NE_E return_x, null_entity, temp_0; - IFNOT temp_0, 4; - STORE_F lEntity, parm0_x; - CALL1 Menu_LinkChildren; - GOTO -7; - STORE_F "Calling the type functions -", parm0_x; - CALL1 dprint; - STORE_ENT null_entity, lEntity; - STORE_F lEntity, parm0_x; - CALL1 nextent; - STORE_ENT return_x, lEntity; - NE_E return_x, null_entity, temp_0; - IFNOT temp_0, 21; - STORE_ENT lEntity, self; - INDIRECT_F self, flag, temp_0; - BITAND temp_0, FLAG_TEMPLATE, temp_0; - NOT_F temp_0, temp_0; - IFNOT temp_0, 4; - INDIRECT_F self, _runFlag, temp_1; - BITAND temp_1, RUNFLAG_SPAWNED, temp_1; - NOT_F temp_1, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 10; - INDIRECT_S self, type, parm0_x; - STORE_F "_Spawn", parm1_x; - CALL2 strcat; - STORE_F return_x, parm0_x; - CALL1 callfunction; - ADDRESS self, _runFlag, temp_0; - INDIRECT_F self, _runFlag, temp_1; - BITOR temp_1, RUNFLAG_SPAWNED, temp_1; - STOREP_F temp_1, temp_0; - GOTO -24; - STORE_F "Linking windows finished. -", parm0_x; - CALL1 dprint; - DONE; -} - -void(entity pItem) Menu_LinkItem = asm -{ -local float locked_1586; -local entity lOldSelf; -local entity lEntity; -local float temp_1; -local float temp_5; - INDIRECT_F pItem, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_SPAWNED, locked_1586; - IFNOT locked_1586, 2; - RETURN offset_0; - INDIRECT_S pItem, type, locked_1586; - EQ_S locked_1586, "", locked_1586; - IFNOT locked_1586, 7; - STORE_F pItem, parm0_x; - CALL1 etos; - STORE_F "LinkItem: Type is missing (", parm0_x; - STORE_F return_x, parm1_x; - STORE_F ")! -", parm2_x; - CALL3 error; - INDIRECT_S pItem, type, parm0_x; - STORE_F "_Spawn", parm1_x; - CALL2 strcat; - STORE_F return_x, parm0_x; - CALL1 isfunction; - IF return_x, 10; - INDIRECT_S pItem, type, locked_1586; - STORE_F pItem, parm0_x; - CALL1 etos; - STORE_F "LinkItem: Control ", parm0_x; - STORE_F locked_1586, parm1_x; - STORE_F " not found (", parm2_x; - STORE_F return_x, parm3_x; - STORE_F ")! -", parm4_x; - CALL5 error; - STORE_ENT null_entity, lEntity; - INDIRECT_S pItem, name, locked_1586; - STORE_F lEntity, parm0_x; - STORE_F name, parm1_x; - STORE_F locked_1586, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lEntity; - NE_E return_x, null_entity, locked_1586; - IFNOT locked_1586, 20; - NE_E lEntity, pItem, locked_1586; - IFNOT locked_1586, 17; - INDIRECT_S pItem, name, locked_1586; - STORE_F pItem, parm0_x; - CALL1 etos; - STORE_F lEntity, parm0_x; - STORE_F return_x, temp_1; - CALL1 etos; - STORE_F return_x, temp_5; - STORE_F temp_1, return_x; - STORE_F "LinkItem: Name '", parm0_x; - STORE_F locked_1586, parm1_x; - STORE_F "' already in use (", parm2_x; - STORE_F return_x, parm3_x; - STORE_F ", ", parm4_x; - STORE_F temp_5, parm5_x; - STORE_F ")!", parm6_x; - CALL7 error; - GOTO -26; - INDIRECT_S pItem, parent, locked_1586; - NE_S locked_1586, "", locked_1586; - IFNOT locked_1586, 20; - ADDRESS pItem, _parent, locked_1586; - INDIRECT_S pItem, parent, temp_1; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F temp_1, parm2_x; - CALL3 findstring; - STOREP_ENT return_x, locked_1586; - INDIRECT_E pItem, _parent, locked_1586; - IF locked_1586, 10; - INDIRECT_S pItem, parent, locked_1586; - STORE_F pItem, parm0_x; - CALL1 etos; - STORE_F "LinkItem: Couldnt find parent '", parm0_x; - STORE_F locked_1586, parm1_x; - STORE_F "' (", parm2_x; - STORE_F return_x, parm3_x; - STORE_F ")!", parm4_x; - CALL5 error; - GOTO 3; - ADDRESS pItem, _parent, locked_1586; - STOREP_ENT null_entity, locked_1586; - STORE_F pItem, parm0_x; - CALL1 Menu_LinkChildren; - INDIRECT_E pItem, _child, lEntity; - IFNOT lEntity, 5; - STORE_F lEntity, parm0_x; - CALL1 Menu_LinkItem; - INDIRECT_E lEntity, _next, lEntity; - GOTO -4; - STORE_ENT self, lOldSelf; - STORE_ENT pItem, self; - INDIRECT_F self, flag, locked_1586; - BITAND locked_1586, FLAG_TEMPLATE, locked_1586; - IF locked_1586, 10; - INDIRECT_S self, type, parm0_x; - STORE_F "_Spawn", parm1_x; - CALL2 strcat; - STORE_F return_x, parm0_x; - CALL1 callfunction; - ADDRESS self, _runFlag, locked_1586; - INDIRECT_F self, _runFlag, temp_1; - BITOR temp_1, RUNFLAG_SPAWNED, temp_1; - STOREP_F temp_1, locked_1586; - STORE_ENT lOldSelf, self; - DONE; -} - -void() Menu_Hide = asm -{ - STORE_F Menu_ActiveItem, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 Raise_Select; - STORE_F FILE_APPEND, parm0_x; - CALL1 Menu_CollectGarbage; - CALL0 Menu_ResetGarbageStats; - DONE; -} - -void() Menu_PerformReinit = asm -{ -local float temp_0; -local float temp_1; -local float temp_5; - CALL0 Menu_History_Clear; - STORE_FNC Util_NullFunction, Menu_KeyHook; - STORE_ENT null_entity, self; - STORE_F self, parm0_x; - CALL1 nextent; - STORE_ENT return_x, self; - NE_E return_x, null_entity, temp_0; - IFNOT temp_0, 27; - INDIRECT_S self, parent, temp_0; - EQ_S temp_0, "", temp_0; - IFNOT temp_0, 4; - ADDRESS self, _parent, temp_0; - STOREP_ENT null_entity, temp_0; - GOTO 18; - INDIRECT_E self, _parent, temp_0; - INDIRECT_S temp_0, name, temp_0; - INDIRECT_S self, parent, temp_1; - NE_S temp_0, temp_1, temp_0; - IFNOT temp_0, 13; - INDIRECT_S self, parent, temp_0; - INDIRECT_S self, name, temp_1; - INDIRECT_E self, _parent, temp_5; - INDIRECT_S temp_5, name, temp_5; - STORE_F "Parent (should be ", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F ") of menu item ", parm2_x; - STORE_F temp_1, parm3_x; - STORE_F " changed to ", parm4_x; - STORE_F temp_5, parm5_x; - STORE_F " ! -", parm6_x; - CALL7 objerror; - STORE_F self, parm0_x; - CALL1 Raise_Reinit; - GOTO -30; - IFNOT MENU_ALLOWINGAME, 2; - BITAND gamestatus, KEY_MENU, temp_0; - AND MENU_ALLOWINGAME, temp_0, temp_0; - IFNOT temp_0, 7; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F MENU_INGAME_NAME, parm2_x; - CALL3 findstring; - STORE_ENT return_x, Menu_ActiveWindow; - GOTO 6; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F MENU_NORMAL_NAME, parm2_x; - CALL3 findstring; - STORE_ENT return_x, Menu_ActiveWindow; - CALL0 Menu_UpdateRunFlags; - STORE_F KEY_GAME, parm0_x; - CALL1 Menu_Reselect; - DONE; -} - -void() Menu_Shutdown = asm -{ -local float temp_0; - STORE_ENT null_entity, self; - STORE_F self, parm0_x; - CALL1 nextent; - STORE_ENT return_x, self; - NE_E return_x, null_entity, temp_0; - IFNOT temp_0, 4; - STORE_F self, parm0_x; - CALL1 Raise_Destroy; - GOTO -7; - DONE; -} - -entity(string pType, string pName, string pParent) Menu_CreateItem = asm -{ -local entity lItem; -local float temp_0; - NOT_S pType, temp_0; - IFNOT temp_0, 5; - STORE_F "Bad pType '", parm0_x; - STORE_F pType, parm1_x; - STORE_F "'!", parm2_x; - CALL3 error; - NOT_S pName, temp_0; - IFNOT temp_0, 5; - STORE_F "Bad pName '", parm0_x; - STORE_F pName, parm1_x; - STORE_F "'!", parm2_x; - CALL3 error; - CALL0 spawn; - STORE_ENT return_x, lItem; - STORE_F pParent, parm0_x; - STORE_F "::", parm1_x; - STORE_F pName, parm2_x; - CALL3 strcat; - STORE_F "{ type "", parm0_x; - STORE_F pType, parm1_x; - STORE_F "" name "", parm2_x; - STORE_F return_x, parm3_x; - STORE_F "" parent "", parm4_x; - STORE_F pParent, parm5_x; - STORE_F "" }", parm6_x; - CALL7 strcat; - STORE_F lItem, parm0_x; - STORE_F return_x, parm1_x; - CALL2 parseentitydata; - RETURN lItem; - DONE; -} - -entity(entity pTemplate, string pName, string pParent, bool pTree) Menu_DeriveItem = asm -{ -local float locked_1586; -local string lName; -local entity lChild; -local entity lItem; -local float temp_1; - IF pTemplate, 3; - STORE_F "Null pTemplate!", parm0_x; - CALL1 error; - NOT_S pName, locked_1586; - IFNOT locked_1586, 5; - STORE_F "Bad pName '", parm0_x; - STORE_F pName, parm1_x; - STORE_F "'!", parm2_x; - CALL3 error; - CALL0 spawn; - STORE_ENT return_x, lItem; - STORE_F pTemplate, parm0_x; - STORE_F lItem, parm1_x; - CALL2 copyentity; - INDIRECT_F lItem, flag, locked_1586; - BITAND locked_1586, FLAG_TEMPLATE, locked_1586; - IFNOT locked_1586, 5; - ADDRESS lItem, flag, locked_1586; - INDIRECT_F lItem, flag, temp_1; - SUB_F temp_1, FLAG_TEMPLATE, temp_1; - STOREP_F temp_1, locked_1586; - INDIRECT_F lItem, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_SPAWNED, locked_1586; - IFNOT locked_1586, 5; - ADDRESS lItem, _runFlag, locked_1586; - INDIRECT_F lItem, _runFlag, temp_1; - SUB_F temp_1, RUNFLAG_SPAWNED, temp_1; - STOREP_F temp_1, locked_1586; - STORE_F pParent, parm0_x; - STORE_F "::", parm1_x; - STORE_F pName, parm2_x; - CALL3 strcat; - STORE_F "{ name "", parm0_x; - STORE_F return_x, parm1_x; - STORE_F "" parent "", parm2_x; - STORE_F pParent, parm3_x; - STORE_F "" }", parm4_x; - CALL5 strcat; - STORE_F lItem, parm0_x; - STORE_F return_x, parm1_x; - CALL2 parseentitydata; - IFNOT pTree, 24; - INDIRECT_E pTemplate, _child, lChild; - IFNOT lChild, 22; - INDIRECT_S lChild, name, locked_1586; - INDIRECT_S lChild, parent, parm0_x; - CALL1 strlen; - ADD_F return_x, KEY_MENU, temp_1; - STORE_F locked_1586, parm0_x; - STORE_F temp_1, parm1_x; - STORE_F 100000.000000, parm2_x; - CALL3 substring; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lName; - INDIRECT_S lItem, name, locked_1586; - STORE_F lChild, parm0_x; - STORE_F lName, parm1_x; - STORE_F locked_1586, parm2_x; - STORE_F FILE_APPEND, parm3_x; - CALL4 Menu_DeriveItem; - STORE_F lName, parm0_x; - CALL1 String_Free; - INDIRECT_E lChild, _next, lChild; - GOTO -21; - RETURN lItem; - DONE; -} - -void(entity pItem, string pData) Menu_AddEntityData = asm -{ - STORE_F pItem, parm0_x; - STORE_F pData, parm1_x; - CALL2 parseentitydata; - DONE; -} - -void(entity pWindow) Menu_LinkWindow = asm -{ - STORE_F pWindow, parm0_x; - CALL1 Menu_LinkItem; - DONE; -} - -void() Sys_Debug_Init = asm -{ - STORE_F SYSTEM_CVAR_VERSION_BUILDDATE, parm0_x; - STORE_F "", parm1_x; - STORE_F CVAR_READONLY, parm2_x; - CALL3 registercvar; - STORE_F SYSTEM_CVAR_VERSION_BUILDDATE, parm0_x; - STORE_F SYSTEM_CVAR_VERSION_BUILDDATE_VALUE, parm1_x; - CALL2 cvar_set; - STORE_F SYSTEM_CVAR_VERSION_BUILDTIME, parm0_x; - STORE_F "", parm1_x; - STORE_F CVAR_READONLY, parm2_x; - CALL3 registercvar; - STORE_F SYSTEM_CVAR_VERSION_BUILDTIME, parm0_x; - STORE_F SYSTEM_CVAR_VERSION_BUILDTIME_VALUE, parm1_x; - CALL2 cvar_set; - STORE_F SYSTEM_CVAR_VERSION, parm0_x; - STORE_F "", parm1_x; - STORE_F CVAR_READONLY, parm2_x; - CALL3 registercvar; - STORE_F SYSTEM_CVAR_VERSION, parm0_x; - STORE_F SYSTEM_CVAR_VERSION_VALUE, parm1_x; - CALL2 cvar_set; - STORE_F KEY_GAME, parm0_x; - CALL1 ftos; - STORE_F SYSTEM_CVAR_DEBUG, parm0_x; - STORE_F return_x, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - STORE_F KEY_GAME, parm0_x; - CALL1 ftos; - STORE_F SYSTEM_CVAR_DEBUG_REF, parm0_x; - STORE_F return_x, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - STORE_F KEY_GAME, parm0_x; - CALL1 ftos; - STORE_F SYSTEM_CVAR_DEBUG_RUNFLAG, parm0_x; - STORE_F return_x, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - STORE_F KEY_GAME, parm0_x; - CALL1 ftos; - STORE_F SYSTEM_CVAR_DEBUG_PROCESS, parm0_x; - STORE_F return_x, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - STORE_F KEY_GAME, parm0_x; - CALL1 ftos; - STORE_F SYSTEM_CVAR_DEBUG_MGFX, parm0_x; - STORE_F return_x, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - STORE_F KEY_GAME, parm0_x; - CALL1 ftos; - STORE_F SYSTEM_CVAR_DEBUG_STRUCTURE, parm0_x; - STORE_F return_x, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - STORE_F SYSTEM_CVAR_DEBUG_PARSER, parm0_x; - STORE_F SYSTEM_CVAR_DEBUG_PARSER_DEFAULT, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - STORE_F SYSTEM_CVAR_DEBUG_PROCESS_FILTER, parm0_x; - STORE_F SYSTEM_CVAR_DEBUG_PROCESS_FILTER_DEFAULT, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - STORE_F KEY_GAME, parm0_x; - CALL1 ftos; - STORE_F SYSTEM_CVAR_DEBUG_SOUND, parm0_x; - STORE_F return_x, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - STORE_F SYSTEM_CVAR_DEBUG_DUMP_NAMES, parm0_x; - STORE_F "0", parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - STORE_F KEY_GAME, parm0_x; - CALL1 ftos; - STORE_F SYSTEM_CVAR_DEBUG_AREA, parm0_x; - STORE_F return_x, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - STORE_F KEY_GAME, parm0_x; - CALL1 ftos; - STORE_F SYSTEM_CVAR_DEBUG_STEP, parm0_x; - STORE_F return_x, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - STORE_F KEY_GAME, parm0_x; - CALL1 ftos; - STORE_F SYSTEM_CVAR_DEBUG_MOUSE, parm0_x; - STORE_F return_x, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - DONE; -} - -void() Sys_Debug_Frame = asm -{ -local float lStep; -local float lTemp2; -local float lTemp1; -local float temp_0; - STORE_F SYSTEM_CVAR_DEBUG, parm0_x; - CALL1 cvar; - STORE_F return_x, sys_debug; - IFNOT sys_debug, 155; - STORE_F SYSTEM_CVAR_DEBUG_REF, parm0_x; - CALL1 cvar; - STORE_F return_x, sys_debug_ref; - STORE_F SYSTEM_CVAR_DEBUG_AREA, parm0_x; - CALL1 cvar; - STORE_F return_x, sys_debug_area; - STORE_F SYSTEM_CVAR_DEBUG_SOUND, parm0_x; - CALL1 cvar; - STORE_F return_x, sys_debug_sound; - STORE_F SYSTEM_CVAR_DEBUG_STRUCTURE, parm0_x; - CALL1 cvar; - STORE_F return_x, sys_debug_structure; - STORE_F SYSTEM_CVAR_DEBUG_MOUSE, parm0_x; - CALL1 cvar; - STORE_F return_x, sys_debug_mouse; - STORE_F SYSTEM_CVAR_DEBUG_STEP, parm0_x; - CALL1 cvar; - STORE_F return_x, lStep; - EQ_F lStep, FILE_APPEND, temp_0; - IFNOT temp_0, 3; - STORE_F FILE_APPEND, sys_debug_halt; - GOTO 16; - EQ_F lStep, KEY_MENU, temp_0; - IFNOT temp_0, 13; - STORE_F KEY_GAME, sys_debug_halt; - STORE_F SYSTEM_CVAR_DEBUG_STEP, parm0_x; - STORE_F "1", parm1_x; - CALL2 cvar_set; - CALL0 gettime; - STORE_F return_x, parm0_x; - CALL1 ftos; - STORE_F "Menu: -- Step: Time:", parm0_x; - STORE_F return_x, parm1_x; - STORE_F " -", parm2_x; - CALL3 print; - GOTO 2; - STORE_F KEY_GAME, sys_debug_halt; - STORE_F SYSTEM_CVAR_DEBUG_RUNFLAG, parm0_x; - CALL1 cvar; - STORE_F return_x, sys_debug_runflag; - GOTO 8; - STORE_F KEY_GAME, sys_debug_runflag; - GOTO 11; - STORE_F SYSTEM_CVAR_DEBUG_RUNFLAG, parm0_x; - STORE_F "0", parm1_x; - CALL2 cvar_set; - STORE_F FILE_APPEND, sys_debug_runflag; - GOTO 6; - IFNOT sys_debug_runflag, -7; - EQ_F sys_debug_runflag, FILE_APPEND, temp_0; - IF temp_0, -7; - EQ_F sys_debug_runflag, KEY_MENU, temp_0; - IF temp_0, -6; - STORE_F SYSTEM_CVAR_DEBUG_PROCESS, parm0_x; - CALL1 cvar; - STORE_F return_x, sys_debug_process; - GOTO 8; - STORE_F KEY_GAME, sys_debug_process; - GOTO 11; - STORE_F SYSTEM_CVAR_DEBUG_PROCESS, parm0_x; - STORE_F "0", parm1_x; - CALL2 cvar_set; - STORE_F FILE_APPEND, sys_debug_process; - GOTO 6; - IFNOT sys_debug_process, -7; - EQ_F sys_debug_process, FILE_APPEND, temp_0; - IF temp_0, -7; - EQ_F sys_debug_process, KEY_MENU, temp_0; - IF temp_0, -6; - STORE_F SYSTEM_CVAR_DEBUG_MGFX, parm0_x; - CALL1 cvar; - STORE_F return_x, sys_debug_mgfx; - GOTO 8; - STORE_F KEY_GAME, sys_debug_mgfx; - GOTO 11; - STORE_F SYSTEM_CVAR_DEBUG_MGFX, parm0_x; - STORE_F "0", parm1_x; - CALL2 cvar_set; - STORE_F FILE_APPEND, sys_debug_mgfx; - GOTO 6; - IFNOT sys_debug_mgfx, -7; - EQ_F sys_debug_mgfx, FILE_APPEND, temp_0; - IF temp_0, -7; - EQ_F sys_debug_mgfx, KEY_MENU, temp_0; - IF temp_0, -6; - STORE_F SYSTEM_CVAR_DEBUG_PROCESS_FILTER, parm0_x; - CALL1 str_cvar; - STORE_F return_x, parm0_x; - CALL1 tokenize; - STORE_F return_x, lTemp1; - STORE_F KEY_GAME, sys_debug_process_filter; - STORE_F KEY_GAME, lTemp2; - LT lTemp2, lTemp1, temp_0; - IFNOT temp_0, 32; - STORE_F lTemp2, parm0_x; - CALL1 argv; - EQ_S return_x, "runflag", temp_0; - IFNOT temp_0, 3; - BITOR sys_debug_process_filter, MENU_PROCESS_RUNFLAG, sys_debug_process_filter; - GOTO 24; - STORE_F lTemp2, parm0_x; - CALL1 argv; - EQ_S return_x, "draw", temp_0; - IFNOT temp_0, 3; - BITOR sys_debug_process_filter, MENU_PROCESS_DRAW, sys_debug_process_filter; - GOTO 18; - STORE_F lTemp2, parm0_x; - CALL1 argv; - EQ_S return_x, "update", temp_0; - IFNOT temp_0, 3; - BITOR sys_debug_process_filter, MENU_PROCESS_UPDATE, sys_debug_process_filter; - GOTO 12; - STORE_F lTemp2, parm0_x; - CALL1 argv; - EQ_S return_x, "mouse", temp_0; - IFNOT temp_0, 3; - BITOR sys_debug_process_filter, MENU_PROCESS_MOUSE, sys_debug_process_filter; - GOTO 6; - STORE_F lTemp2, parm0_x; - CALL1 argv; - EQ_S return_x, "key", temp_0; - IFNOT temp_0, 2; - BITOR sys_debug_process_filter, MENU_PROCESS_KEY, sys_debug_process_filter; - ADD_F lTemp2, FILE_APPEND, lTemp2; - GOTO -32; - STORE_F SYSTEM_CVAR_DEBUG_PARSER, parm0_x; - CALL1 str_cvar; - STORE_F return_x, parm0_x; - CALL1 tokenize; - STORE_F return_x, lTemp1; - STORE_F KEY_GAME, sys_debug_parser; - STORE_F KEY_GAME, lTemp2; - LT lTemp2, lTemp1, temp_0; - IFNOT temp_0, 20; - STORE_F lTemp2, parm0_x; - CALL1 argv; - EQ_S return_x, "info", temp_0; - IFNOT temp_0, 3; - BITOR sys_debug_parser, PARSER_INFO, sys_debug_parser; - GOTO 12; - STORE_F lTemp2, parm0_x; - CALL1 argv; - EQ_S return_x, "high", temp_0; - IFNOT temp_0, 3; - BITOR sys_debug_parser, PARSER_HIGH, sys_debug_parser; - GOTO 6; - STORE_F lTemp2, parm0_x; - CALL1 argv; - EQ_S return_x, "low", temp_0; - IFNOT temp_0, 2; - BITOR sys_debug_parser, PARSER_LOW, sys_debug_parser; - ADD_F lTemp2, FILE_APPEND, lTemp2; - GOTO -20; - GOTO 12; - STORE_F KEY_GAME, sys_debug_halt; - STORE_F KEY_GAME, sys_debug_ref; - STORE_F KEY_GAME, sys_debug_area; - STORE_F KEY_GAME, sys_debug_sound; - STORE_F KEY_GAME, sys_debug_runflag; - STORE_F KEY_GAME, sys_debug_process; - STORE_F KEY_GAME, sys_debug_mgfx; - STORE_F KEY_GAME, sys_debug_structure; - STORE_F KEY_GAME, sys_debug_parser; - STORE_F KEY_GAME, sys_debug_process_filter; - STORE_F KEY_GAME, sys_debug_mouse; - STORE_F SYSTEM_CVAR_DEBUG_DUMP_NAMES, parm0_x; - CALL1 cvar; - IFNOT return_x, 5; - CALL0 Sys_Debug_DumpNames; - STORE_F SYSTEM_CVAR_DEBUG_DUMP_NAMES, parm0_x; - STORE_F "0", parm1_x; - CALL2 cvar_set; - STORE_V '-1.000000 -1.000000 -1.000000', sys_debug_cursor_localpos; - DONE; -} - -void() Sys_Debug_Draw = asm -{ -local float temp_0; -local float temp_1; - EQ_F sys_debug_mouse, FILE_APPEND, temp_0; - IFNOT temp_0, 27; - STORE_F sys_debug_cursor_localpos_x, parm0_x; - CALL1 floor; - STORE_F return_x, parm0_x; - CALL1 ftos; - STORE_F sys_debug_cursor_localpos_y, parm0_x; - STORE_F return_x, temp_0; - CALL1 floor; - STORE_F return_x, temp_1; - STORE_F temp_0, return_x; - STORE_F temp_1, parm0_x; - STORE_F return_x, temp_0; - CALL1 ftos; - STORE_F return_x, temp_1; - STORE_F temp_0, return_x; - STORE_F return_x, parm0_x; - STORE_F " ", parm1_x; - STORE_F temp_1, parm2_x; - CALL3 strcat; - STORE_V '1.000000 0.000000 0.000000', parm0; - STORE_F return_x, parm1_x; - STORE_V '9.000000 9.000000 0.000000', parm2; - STORE_V '0.800000 0.800000 0.800000', parm3; - STORE_F FILE_APPEND, parm4_x; - STORE_F FILE_APPEND, parm5_x; - CALL6 Cursor_PrintInfo; - GOTO 28; - EQ_F sys_debug_mouse, KEY_MENU, temp_0; - IFNOT temp_0, 26; - STORE_F Cursor_Position_x, parm0_x; - CALL1 floor; - STORE_F return_x, parm0_x; - CALL1 ftos; - STORE_F Cursor_Position_y, parm0_x; - STORE_F return_x, temp_0; - CALL1 floor; - STORE_F return_x, temp_1; - STORE_F temp_0, return_x; - STORE_F temp_1, parm0_x; - STORE_F return_x, temp_0; - CALL1 ftos; - STORE_F return_x, temp_1; - STORE_F temp_0, return_x; - STORE_F return_x, parm0_x; - STORE_F " ", parm1_x; - STORE_F temp_1, parm2_x; - CALL3 strcat; - STORE_V '1.000000 0.000000 0.000000', parm0; - STORE_F return_x, parm1_x; - STORE_V '9.000000 9.000000 0.000000', parm2; - STORE_V '0.800000 0.800000 0.800000', parm3; - STORE_F FILE_APPEND, parm4_x; - STORE_F FILE_APPEND, parm5_x; - CALL6 Cursor_PrintInfo; - DONE; -} - -void() Sys_Debug_DumpNames = asm -{ -local entity lNode; -local float temp_0; - STORE_F "Menu: Dumping names.. -", parm0_x; - CALL1 print; - STORE_ENT null_entity, lNode; - STORE_F lNode, parm0_x; - CALL1 nextent; - STORE_ENT return_x, lNode; - NE_E return_x, null_entity, temp_0; - IFNOT temp_0, 11; - STORE_F lNode, parm0_x; - CALL1 etos; - INDIRECT_S lNode, name, temp_0; - STORE_F "Menu: ", parm0_x; - STORE_F return_x, parm1_x; - STORE_F " <-> ", parm2_x; - STORE_F temp_0, parm3_x; - STORE_F " -", parm4_x; - CALL5 print; - GOTO -14; - STORE_F " -", parm0_x; - CALL1 print; - DONE; -} - -void () Parser_Define_Spawn; -void() Parser_Define_Spawn = asm -{ - DONE; -} - -void () Parser_TokenizeLine; -void() Parser_TokenizeLine = asm -{ - STORE_F Parser_Line, parm0_x; - CALL1 tokenize; - STORE_F return_x, Parser_NumTokens; - STORE_F KEY_GAME, Parser_TokenNum; - DONE; -} - -float() Parser_GetToken = asm -{ -local string lLine; -local float temp_0; - GE Parser_TokenNum, Parser_NumTokens, temp_0; - IFNOT temp_0, 22; - STORE_F Parser_File, parm0_x; - CALL1 fgets; - STORE_S return_x, lLine; - ADD_F Parser_LineNumber, FILE_APPEND, Parser_LineNumber; - NOT_S lLine, temp_0; - IFNOT temp_0, 8; - STORE_F lLine, parm0_x; - CALL1 validstring; - IF return_x, 3; - RETURN KEY_GAME; - GOTO 3; - CALL0 Parser_GetToken; - RETURN return_x; - STORE_F Parser_Line, parm0_x; - STORE_F lLine, parm1_x; - CALL2 String_Set; - STORE_S return_x, Parser_Line; - CALL0 Parser_TokenizeLine; - CALL0 Parser_GetToken; - RETURN return_x; - GOTO 9; - STORE_F Parser_TokenNum, parm0_x; - CALL1 argv; - STORE_F Parser_Token, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - STORE_S return_x, Parser_Token; - STORE_F Parser_TokenNum, temp_0; - ADD_F Parser_TokenNum, FILE_APPEND, Parser_TokenNum; - STORE_F "Read token '", parm0_x; - STORE_F Parser_Token, parm1_x; - STORE_F "'", parm2_x; - CALL3 strcat; - STORE_F PARSER_LOW, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - CALL0 Parser_GetTokenType; - STORE_F return_x, Parser_TokenType; - EQ_F Parser_TokenType, PARSER_TT_BRACKETOPEN, temp_0; - IFNOT temp_0, 4; - CALL0 Parser_ProcessDefine; - CALL0 Parser_GetToken; - RETURN return_x; - RETURN FILE_APPEND; - DONE; -} - -float() Parser_GetTokenType = asm -{ -local float temp_0; - EQ_S Parser_Token, "Item", temp_0; - IFNOT temp_0, 3; - RETURN PARSER_TT_ITEM; - GOTO 48; - EQ_S Parser_Token, "Template", temp_0; - IFNOT temp_0, 3; - RETURN PARSER_TT_TEMPLATE; - GOTO 44; - EQ_S Parser_Token, "Derive", temp_0; - IFNOT temp_0, 3; - RETURN PARSER_TT_DERIVE; - GOTO 40; - EQ_S Parser_Token, "DeriveTemplate", temp_0; - IFNOT temp_0, 3; - RETURN PARSER_TT_DERIVETEMPLATE; - GOTO 36; - EQ_S Parser_Token, "#define", temp_0; - IFNOT temp_0, 3; - RETURN PARSER_TT_DEFINE; - GOTO 32; - EQ_S Parser_Token, "Ignore", temp_0; - IFNOT temp_0, 3; - RETURN PARSER_TT_IGNORE; - GOTO 28; - EQ_S Parser_Token, "#undef", temp_0; - IFNOT temp_0, 3; - RETURN PARSER_TT_UNDEF; - GOTO 24; - EQ_S Parser_Token, "Namespace", temp_0; - IFNOT temp_0, 3; - RETURN PARSER_TT_NAMESPACE; - GOTO 20; - EQ_S Parser_Token, "#include", temp_0; - IFNOT temp_0, 3; - RETURN PARSER_TT_INCLUDE; - GOTO 16; - EQ_S Parser_Token, "}", temp_0; - IFNOT temp_0, 3; - RETURN PARSER_TT_BRACECLOSE; - GOTO 12; - EQ_S Parser_Token, "{", temp_0; - IFNOT temp_0, 3; - RETURN PARSER_TT_BRACEOPEN; - GOTO 8; - EQ_S Parser_Token, "[", temp_0; - IFNOT temp_0, 3; - RETURN PARSER_TT_BRACKETOPEN; - GOTO 4; - EQ_S Parser_Token, "]", temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_BRACKETCLOSE; - RETURN PARSER_TT_TOKEN; - DONE; -} - -void (float, string) _Parser_Print; -void(float pLevel, string pText) _Parser_Print = asm -{ -local float temp_0; -local float temp_1; - EQ_F pLevel, KEY_GAME, temp_0; - IF temp_0, 2; - BITAND sys_debug_parser, pLevel, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 5; - STORE_F "Parser: ", parm0_x; - STORE_F pText, parm1_x; - STORE_F " -", parm2_x; - CALL3 print; - DONE; -} - -void(float pLevel, string pInfo) Parser_Print = asm -{ -local float temp_0; -local float temp_1; - EQ_F pLevel, KEY_GAME, temp_0; - IF temp_0, 2; - BITAND sys_debug_parser, pLevel, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 11; - STORE_F Parser_LineNumber, parm0_x; - CALL1 ftos; - STORE_F "Parser: ", parm0_x; - STORE_F Parser_Filename, parm1_x; - STORE_F ":", parm2_x; - STORE_F return_x, parm3_x; - STORE_F ": ", parm4_x; - STORE_F pInfo, parm5_x; - STORE_F " -", parm6_x; - CALL7 print; - DONE; -} - -void(string pInfo) Parser_Error = asm -{ - STORE_F Parser_LineNumber, parm0_x; - CALL1 ftos; - STORE_F "Parser: ", parm0_x; - STORE_F Parser_Filename, parm1_x; - STORE_F ":", parm2_x; - STORE_F return_x, parm3_x; - STORE_F ": Error: '", parm4_x; - CALL5 print; - STORE_F Parser_Token, parm0_x; - STORE_F "' not expected (", parm1_x; - STORE_F pInfo, parm2_x; - STORE_F ")! -", parm3_x; - CALL4 print; - STORE_F Parser_File, parm0_x; - CALL1 fclose; - STORE_F "Error in the menu parser!", parm0_x; - CALL1 error; - DONE; -} - -void () ArrayGet*PARSER_TT_TEXT; -void(float pType) Parser_Expect = asm -{ -local float temp_0; -local float temp_1; -local float temp_5; - CALL0 Parser_GetToken; - NOT_F return_x, temp_0; - IF temp_0, 5; - NE_F Parser_TokenType, pType, temp_1; - IFNOT temp_1, 2; - NE_F Parser_TokenType, PARSER_TT_BRACKETOPEN, temp_5; - AND temp_1, temp_5, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 8; - SUB_F pType, PARSER_TT_ITEM, parm0_x; - CALL1 ArrayGet*PARSER_TT_TEXT; - STORE_F "expected ", parm0_x; - STORE_F return_x, parm1_x; - CALL2 strcat; - STORE_F return_x, parm0_x; - CALL1 Parser_Error; - DONE; -} - -void(string pNamespace) Parser_IncludeFile = asm -{ -local float lTokenNum; -local float lNumTokens; -local float lLineNumber; -local float lFile; -local string lLine; -local string lFilename; -local float temp_0; - STORE_F PARSER_TT_TOKEN, parm0_x; - CALL1 Parser_Expect; - STORE_F "#include: Including file '", parm0_x; - STORE_F Parser_Token, parm1_x; - STORE_F "'", parm2_x; - CALL3 strcat; - STORE_F PARSER_INFO, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - STORE_F Parser_Token, parm0_x; - CALL1 Util_AltStringPrepare; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F " {'", parm0_x; - STORE_F return_x, parm1_x; - STORE_F "'", parm2_x; - CALL3 strcat; - STORE_F Parser_FileList, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Append; - STORE_S return_x, Parser_FileList; - STORE_S Parser_Filename, lFilename; - STORE_S Parser_Line, lLine; - STORE_F Parser_File, lFile; - STORE_F Parser_LineNumber, lLineNumber; - STORE_F Parser_NumTokens, lNumTokens; - STORE_F Parser_TokenNum, lTokenNum; - SUB_F Parser_IncludeDepth, FILE_APPEND, Parser_IncludeDepth; - GT Parser_IncludeDepth, K_SPACE, temp_0; - IFNOT temp_0, 5; - STORE_F KEY_GAME, parm0_x; - STORE_F "#include: Maximum depth reached!", parm1_x; - CALL2 Parser_Print; - GOTO 4; - STORE_F Parser_Token, parm0_x; - STORE_F pNamespace, parm1_x; - CALL2 Parser_ParseFile; - SUB_F Parser_IncludeDepth, FILE_APPEND, Parser_IncludeDepth; - STORE_S lFilename, Parser_Filename; - STORE_S lLine, Parser_Line; - STORE_F lFile, Parser_File; - STORE_F lLineNumber, Parser_LineNumber; - CALL0 Parser_TokenizeLine; - STORE_F lNumTokens, Parser_NumTokens; - STORE_F lTokenNum, Parser_TokenNum; - STORE_F Parser_FileList, parm0_x; - STORE_F "}", parm1_x; - CALL2 String_Append; - STORE_S return_x, Parser_FileList; - DONE; -} - -void() Parser_ParseDefine = asm -{ -local float locked_1586; -local float lOldLine; -local entity lDefine; -local float temp_1; - STORE_F KEY_MENU, parm0_x; - STORE_F "Parsing #define...", parm1_x; - CALL2 Parser_Print; - STORE_F PARSER_TT_TOKEN, parm0_x; - CALL1 Parser_Expect; - STORE_ENT Parser_DefineChain, lDefine; - IFNOT lDefine, 16; - INDIRECT_S lDefine, name, locked_1586; - EQ_S Parser_Token, locked_1586, locked_1586; - IFNOT locked_1586, 11; - STORE_F "#define: [", parm0_x; - STORE_F Parser_Token, parm1_x; - STORE_F "] already defined!", parm2_x; - CALL3 strcat; - STORE_F PARSER_INFO, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - STORE_F PARSER_TT_TOKEN, parm0_x; - CALL1 Parser_Expect; - RETURN offset_0; - INDIRECT_E lDefine, chain, lDefine; - GOTO -15; - CALL0 spawn; - STORE_ENT return_x, lDefine; - ADDRESS lDefine, type, locked_1586; - STOREP_S "Parser_Define", locked_1586; - ADDRESS lDefine, name, locked_1586; - STORE_F Parser_Token, parm0_x; - CALL1 String_Zone; - STOREP_S return_x, locked_1586; - STORE_F lDefine, parm0_x; - STORE_F value, parm1_x; - CALL2 String_EntityZone; - STORE_F Parser_LineNumber, lOldLine; - CALL0 Parser_GetToken; - IF return_x, 3; - GOTO 21; - GOTO 19; - NE_F lOldLine, Parser_LineNumber, locked_1586; - IFNOT locked_1586, 4; - SUB_F Parser_TokenNum, FILE_APPEND, Parser_TokenNum; - GOTO 16; - GOTO 14; - EQ_S Parser_Token, "\", locked_1586; - IFNOT locked_1586, 3; - ADD_F lOldLine, FILE_APPEND, lOldLine; - GOTO 10; - INDIRECT_S lDefine, value, parm0_x; - STORE_F """, parm1_x; - STORE_F Parser_Token, parm2_x; - STORE_F "" ", parm3_x; - CALL4 strcat; - STORE_F lDefine, parm0_x; - STORE_F value, parm1_x; - STORE_F return_x, parm2_x; - CALL3 String_EntitySet; - GOTO -22; - INDIRECT_S lDefine, name, locked_1586; - INDIRECT_S lDefine, value, temp_1; - STORE_F " Name = '", parm0_x; - STORE_F locked_1586, parm1_x; - STORE_F "' Replacement = '", parm2_x; - STORE_F temp_1, parm3_x; - STORE_F "'", parm4_x; - CALL5 strcat; - STORE_F PARSER_HIGH, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - ADDRESS lDefine, chain, locked_1586; - STOREP_ENT Parser_DefineChain, locked_1586; - STORE_ENT lDefine, Parser_DefineChain; - STORE_F PARSER_HIGH, parm0_x; - STORE_F "Done parsing #define", parm1_x; - CALL2 Parser_Print; - DONE; -} - -void() Parser_ParseUndef = asm -{ -local entity lPrevious; -local entity lEntity; -local float temp_0; -local float temp_1; - STORE_F PARSER_HIGH, parm0_x; - STORE_F "Parsing #undef...", parm1_x; - CALL2 Parser_Print; - STORE_F PARSER_TT_TOKEN, parm0_x; - CALL1 Parser_Expect; - STORE_ENT null_entity, lPrevious; - STORE_ENT Parser_DefineChain, lEntity; - IFNOT lEntity, 27; - INDIRECT_S lEntity, name, temp_0; - EQ_S temp_0, Parser_Token, temp_0; - IFNOT temp_0, 21; - IFNOT lPrevious, 5; - ADDRESS lPrevious, chain, temp_0; - INDIRECT_E lEntity, chain, temp_1; - STOREP_ENT temp_1, temp_0; - GOTO 2; - INDIRECT_E lEntity, chain, Parser_DefineChain; - STORE_F "#undef: Removed [", parm0_x; - STORE_F Parser_Token, parm1_x; - STORE_F "]", parm2_x; - CALL3 strcat; - STORE_F PARSER_INFO, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - INDIRECT_S lEntity, name, parm0_x; - CALL1 String_Free; - INDIRECT_S lEntity, value, parm0_x; - CALL1 String_Free; - STORE_F lEntity, parm0_x; - CALL1 remove; - RETURN offset_0; - STORE_ENT lEntity, lPrevious; - INDIRECT_E lEntity, chain, lEntity; - GOTO -26; - STORE_F "#undef: [", parm0_x; - STORE_F Parser_Token, parm1_x; - STORE_F "] not found!", parm2_x; - CALL3 strcat; - STORE_F PARSER_INFO, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - DONE; -} - -void() Parser_ProcessDefine = asm -{ -local entity lDefine; -local string lConstant; -local float temp_0; -local float temp_1; - STORE_F PARSER_TT_TOKEN, parm0_x; - CALL1 Parser_Expect; - STORE_F Parser_Token, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lConstant; - STORE_F PARSER_TT_BRACKETCLOSE, parm0_x; - CALL1 Parser_Expect; - STORE_F "Processing [", parm0_x; - STORE_F lConstant, parm1_x; - STORE_F "]...", parm2_x; - CALL3 strcat; - STORE_F PARSER_HIGH, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - STORE_ENT Parser_DefineChain, lDefine; - IFNOT lDefine, 41; - INDIRECT_S lDefine, name, temp_0; - EQ_S temp_0, lConstant, temp_0; - IFNOT temp_0, 36; - INDIRECT_S lDefine, value, temp_0; - STORE_F " ", parm0_x; - STORE_F temp_0, parm1_x; - CALL2 strcat; - STORE_F Parser_Line, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - STORE_S return_x, Parser_Line; - STORE_F "Replacing with '", parm0_x; - STORE_F Parser_Line, parm1_x; - STORE_F "'", parm2_x; - CALL3 strcat; - STORE_F PARSER_HIGH, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - LT Parser_TokenNum, Parser_NumTokens, temp_0; - IFNOT temp_0, 15; - STORE_F Parser_TokenNum, parm0_x; - CALL1 argv; - STORE_F Parser_Line, parm0_x; - STORE_F " "", parm1_x; - STORE_F return_x, parm2_x; - STORE_F """, parm3_x; - CALL4 strcat; - STORE_F Parser_Line, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - STORE_S return_x, Parser_Line; - STORE_F Parser_TokenNum, temp_1; - ADD_F Parser_TokenNum, FILE_APPEND, Parser_TokenNum; - GOTO -15; - CALL0 Parser_TokenizeLine; - STORE_F lConstant, parm0_x; - CALL1 String_Free; - RETURN offset_0; - INDIRECT_E lDefine, chain, lDefine; - GOTO -40; - STORE_F lConstant, parm0_x; - CALL1 String_Normal; - STORE_F Parser_Token, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - STORE_S return_x, Parser_Token; - STORE_F "#define: Couldn't find constant '", parm0_x; - STORE_F Parser_Token, parm1_x; - STORE_F "'!", parm2_x; - CALL3 strcat; - STORE_F KEY_GAME, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - STORE_F "constant not found", parm0_x; - CALL1 Parser_Error; - DONE; -} - -void(string pNamespace) Parser_ParseDefinition = asm -{ -local entity lEntity; -local float temp_0; -local float temp_1; - EQ_F Parser_TokenType, PARSER_TT_ITEM, temp_0; - IFNOT temp_0, 4; - STORE_F pNamespace, parm0_x; - CALL1 Parser_ParseItem; - GOTO 50; - EQ_F Parser_TokenType, PARSER_TT_TEMPLATE, temp_0; - IFNOT temp_0, 9; - STORE_F pNamespace, parm0_x; - CALL1 Parser_ParseItem; - STORE_ENT return_x, lEntity; - ADDRESS lEntity, flag, temp_0; - INDIRECT_F lEntity, flag, temp_1; - BITOR temp_1, FLAG_TEMPLATE, temp_1; - STOREP_F temp_1, temp_0; - GOTO 40; - EQ_F Parser_TokenType, PARSER_TT_DEFINE, temp_0; - IFNOT temp_0, 3; - CALL0 Parser_ParseDefine; - GOTO 36; - EQ_F Parser_TokenType, PARSER_TT_DERIVE, temp_0; - IFNOT temp_0, 4; - STORE_F pNamespace, parm0_x; - CALL1 Parser_DeriveItem; - GOTO 31; - EQ_F Parser_TokenType, PARSER_TT_DERIVETEMPLATE, temp_0; - IFNOT temp_0, 9; - STORE_F pNamespace, parm0_x; - CALL1 Parser_DeriveItem; - STORE_ENT return_x, lEntity; - ADDRESS lEntity, flag, temp_0; - INDIRECT_F lEntity, flag, temp_1; - BITOR temp_1, FLAG_TEMPLATE, temp_1; - STOREP_F temp_1, temp_0; - GOTO 21; - EQ_F Parser_TokenType, PARSER_TT_UNDEF, temp_0; - IFNOT temp_0, 3; - CALL0 Parser_ParseUndef; - GOTO 17; - EQ_F Parser_TokenType, PARSER_TT_NAMESPACE, temp_0; - IFNOT temp_0, 4; - STORE_F pNamespace, parm0_x; - CALL1 Parser_ParseNamespace; - GOTO 12; - EQ_F Parser_TokenType, PARSER_TT_INCLUDE, temp_0; - IFNOT temp_0, 4; - STORE_F pNamespace, parm0_x; - CALL1 Parser_IncludeFile; - GOTO 7; - EQ_F Parser_TokenType, PARSER_TT_IGNORE, temp_0; - IFNOT temp_0, 3; - CALL0 Parser_ParseIgnore; - GOTO 3; - STORE_F "couldn't find type in Parser_ParseDef", parm0_x; - CALL1 Parser_Error; - DONE; -} - -void() Parser_ParseIgnore = asm -{ -local float lBraceCount; -local float temp_0; - STORE_F PARSER_TT_BRACEOPEN, parm0_x; - CALL1 Parser_Expect; - STORE_F FILE_APPEND, lBraceCount; - GT lBraceCount, KEY_GAME, temp_0; - IFNOT temp_0, 13; - CALL0 Parser_GetToken; - IF return_x, 3; - GOTO 10; - GOTO 8; - EQ_F Parser_TokenType, PARSER_TT_BRACEOPEN, temp_0; - IFNOT temp_0, 3; - ADD_F lBraceCount, FILE_APPEND, lBraceCount; - GOTO 4; - EQ_F Parser_TokenType, PARSER_TT_BRACECLOSE, temp_0; - IFNOT temp_0, 2; - SUB_F lBraceCount, FILE_APPEND, lBraceCount; - GOTO -13; - DONE; -} - -entity(string pNamespace) Parser_ParseItem = asm -{ -local entity lEntity; -local string lEntityText; -local string lNamespace; -local float temp_0; - STORE_F PARSER_HIGH, parm0_x; - STORE_F "Parsing item..", parm1_x; - CALL2 Parser_Print; - STORE_F PARSER_TT_TOKEN, parm0_x; - CALL1 Parser_Expect; - STORE_F "{ "type" "Item_", parm0_x; - STORE_F Parser_Token, parm1_x; - STORE_F "" ", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lEntityText; - STORE_F " Type = '", parm0_x; - STORE_F Parser_Token, parm1_x; - STORE_F "'", parm2_x; - CALL3 strcat; - STORE_F PARSER_HIGH, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - STORE_F PARSER_TT_TOKEN, parm0_x; - CALL1 Parser_Expect; - NE_S pNamespace, "", temp_0; - IFNOT temp_0, 9; - STORE_F pNamespace, parm0_x; - STORE_F "::", parm1_x; - STORE_F Parser_Token, parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lNamespace; - GOTO 4; - STORE_F Parser_Token, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lNamespace; - STORE_F lEntityText, parm0_x; - STORE_F ""name" "", parm1_x; - STORE_F lNamespace, parm2_x; - STORE_F "" ", parm3_x; - CALL4 strcat; - STORE_F lEntityText, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - STORE_S return_x, lEntityText; - STORE_F lEntityText, parm0_x; - STORE_F ""parent" "", parm1_x; - STORE_F pNamespace, parm2_x; - STORE_F "" ", parm3_x; - CALL4 strcat; - STORE_F lEntityText, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - STORE_S return_x, lEntityText; - STORE_F " Name = '", parm0_x; - STORE_F Parser_Token, parm1_x; - STORE_F "' Parent = '", parm2_x; - STORE_F pNamespace, parm3_x; - STORE_F "' Namespace = '", parm4_x; - STORE_F lNamespace, parm5_x; - STORE_F "'", parm6_x; - CALL7 strcat; - STORE_F PARSER_HIGH, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - STORE_F PARSER_TT_BRACEOPEN, parm0_x; - CALL1 Parser_Expect; - STORE_F lNamespace, parm0_x; - STORE_F lEntityText, parm1_x; - CALL2 Parser_ParseEntity; - STORE_S return_x, lEntityText; - CALL0 spawn; - STORE_ENT return_x, lEntity; - STORE_F lEntity, parm0_x; - STORE_F lEntityText, parm1_x; - CALL2 parseentitydata; - STORE_F lEntityText, parm0_x; - CALL1 String_Free; - STORE_F lNamespace, parm0_x; - CALL1 String_Free; - INDIRECT_S lEntity, name, temp_0; - STORE_F "Parsing '", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F "' finished", parm2_x; - CALL3 strcat; - STORE_F PARSER_HIGH, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - RETURN lEntity; - DONE; -} - -void(entity pSource, entity pTarget) Parser_CloneChildren = asm -{ -local float locked_1585; -local float locked_1586; -local string lModifierString; -local entity lClone; -local entity lNode; -local float temp_5; - STORE_ENT null_entity, lNode; - INDIRECT_S pSource, name, locked_1586; - STORE_F lNode, parm0_x; - STORE_F parent, parm1_x; - STORE_F locked_1586, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lNode; - NE_E return_x, null_entity, locked_1586; - IFNOT locked_1586, 37; - CALL0 spawn; - STORE_ENT return_x, lClone; - STORE_F lNode, parm0_x; - STORE_F lClone, parm1_x; - CALL2 copyentity; - INDIRECT_F lClone, flag, locked_1586; - BITAND locked_1586, FLAG_TEMPLATE, locked_1586; - IFNOT locked_1586, 5; - ADDRESS lClone, flag, locked_1586; - INDIRECT_F lClone, flag, locked_1585; - SUB_F locked_1585, FLAG_TEMPLATE, locked_1585; - STOREP_F locked_1585, locked_1586; - INDIRECT_S pTarget, name, locked_1586; - INDIRECT_S lNode, name, locked_1585; - INDIRECT_S pSource, name, parm0_x; - CALL1 strlen; - STORE_F locked_1585, parm0_x; - STORE_F return_x, parm1_x; - STORE_F 100000.000000, parm2_x; - CALL3 substring; - INDIRECT_S pTarget, name, locked_1585; - STORE_F "{ name "", parm0_x; - STORE_F locked_1586, parm1_x; - STORE_F return_x, parm2_x; - STORE_F "" parent "", parm3_x; - STORE_F locked_1585, parm4_x; - STORE_F "" }", parm5_x; - CALL6 strcat; - STORE_S return_x, lModifierString; - STORE_F lClone, parm0_x; - STORE_F lModifierString, parm1_x; - CALL2 parseentitydata; - STORE_F lNode, parm0_x; - STORE_F lClone, parm1_x; - CALL2 Parser_CloneChildren; - GOTO -43; - DONE; -} - -entity(string pNamespace) Parser_DeriveItem = asm -{ -local entity lEntity; -local string lBaseName; -local entity lBase; -local string lEntityText; -local string lNamespace; -local float temp_0; -local float temp_1; - STORE_F PARSER_HIGH, parm0_x; - STORE_F "Parsing derived item..", parm1_x; - CALL2 Parser_Print; - STORE_F PARSER_TT_TOKEN, parm0_x; - CALL1 Parser_Expect; - STORE_F Parser_Token, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F KEY_MENU, parm2_x; - CALL3 substring; - EQ_S return_x, "::", temp_0; - IFNOT temp_0, 12; - STORE_F Parser_Token, parm0_x; - CALL1 strlen; - SUB_F return_x, KEY_MENU, temp_0; - STORE_F Parser_Token, parm0_x; - STORE_F KEY_MENU, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 substring; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lBaseName; - GOTO 24; - EQ_S pNamespace, "", temp_0; - IFNOT temp_0, 5; - STORE_F Parser_Token, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lBaseName; - GOTO 18; - STORE_F pNamespace, parm0_x; - STORE_F "::", parm1_x; - STORE_F Parser_Token, parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lBaseName; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F lBaseName, parm2_x; - CALL3 findstring; - EQ_E return_x, null_entity, temp_0; - IFNOT temp_0, 5; - STORE_F lBaseName, parm0_x; - STORE_F Parser_Token, parm1_x; - CALL2 String_Set; - STORE_S return_x, lBaseName; - STORE_F " Base = '", parm0_x; - STORE_F lBaseName, parm1_x; - STORE_F "'", parm2_x; - CALL3 strcat; - STORE_F PARSER_HIGH, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - STORE_F null_entity, parm0_x; - STORE_F name, parm1_x; - STORE_F lBaseName, parm2_x; - CALL3 findstring; - STORE_ENT return_x, lBase; - EQ_E lBase, null_entity, temp_0; - IFNOT temp_0, 3; - STORE_F "couldnt find item", parm0_x; - CALL1 Parser_Error; - STORE_F PARSER_TT_TOKEN, parm0_x; - CALL1 Parser_Expect; - NE_S pNamespace, "", temp_0; - IFNOT temp_0, 9; - STORE_F pNamespace, parm0_x; - STORE_F "::", parm1_x; - STORE_F Parser_Token, parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lNamespace; - GOTO 4; - STORE_F Parser_Token, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lNamespace; - STORE_F "{ "name" "", parm0_x; - STORE_F lNamespace, parm1_x; - STORE_F "" ", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lEntityText; - STORE_F lEntityText, parm0_x; - STORE_F ""parent" "", parm1_x; - STORE_F pNamespace, parm2_x; - STORE_F "" ", parm3_x; - CALL4 strcat; - STORE_F lEntityText, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - STORE_S return_x, lEntityText; - STORE_F " Name = '", parm0_x; - STORE_F Parser_Token, parm1_x; - STORE_F "' Parent = '", parm2_x; - STORE_F pNamespace, parm3_x; - STORE_F "' Namespace = '", parm4_x; - STORE_F lNamespace, parm5_x; - STORE_F "'", parm6_x; - CALL7 strcat; - STORE_F PARSER_HIGH, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - STORE_F PARSER_TT_BRACEOPEN, parm0_x; - CALL1 Parser_Expect; - STORE_F lNamespace, parm0_x; - STORE_F lEntityText, parm1_x; - CALL2 Parser_ParseEntity; - STORE_S return_x, lEntityText; - CALL0 spawn; - STORE_ENT return_x, lEntity; - STORE_F lBase, parm0_x; - STORE_F lEntity, parm1_x; - CALL2 copyentity; - INDIRECT_F lEntity, flag, temp_0; - BITAND temp_0, FLAG_TEMPLATE, temp_0; - IFNOT temp_0, 5; - ADDRESS lEntity, flag, temp_0; - INDIRECT_F lEntity, flag, temp_1; - SUB_F temp_1, FLAG_TEMPLATE, temp_1; - STOREP_F temp_1, temp_0; - STORE_F lEntity, parm0_x; - STORE_F lEntityText, parm1_x; - CALL2 parseentitydata; - STORE_F lEntityText, parm0_x; - CALL1 String_Free; - STORE_F lNamespace, parm0_x; - CALL1 String_Free; - STORE_F lBaseName, parm0_x; - CALL1 String_Free; - STORE_F lBase, parm0_x; - STORE_F lEntity, parm1_x; - CALL2 Parser_CloneChildren; - INDIRECT_S lEntity, name, temp_0; - STORE_F "Parsing '", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F "' finished", parm2_x; - CALL3 strcat; - STORE_F PARSER_HIGH, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - RETURN lEntity; - DONE; -} - -string(string pNamespace, string pEntityText) Parser_ParseEntity = asm -{ -local float temp_0; - CALL0 Parser_GetToken; - IFNOT return_x, 31; - EQ_F Parser_TokenType, PARSER_TT_TOKEN, temp_0; - IFNOT temp_0, 22; - STORE_F pEntityText, parm0_x; - STORE_F """, parm1_x; - STORE_F Parser_Token, parm2_x; - STORE_F "" ", parm3_x; - CALL4 strcat; - STORE_F pEntityText, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - STORE_S return_x, pEntityText; - STORE_F PARSER_TT_TOKEN, parm0_x; - CALL1 Parser_Expect; - STORE_F pEntityText, parm0_x; - STORE_F """, parm1_x; - STORE_F Parser_Token, parm2_x; - STORE_F "" ", parm3_x; - CALL4 strcat; - STORE_F pEntityText, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - STORE_S return_x, pEntityText; - GOTO 7; - EQ_F Parser_TokenType, PARSER_TT_BRACECLOSE, temp_0; - IFNOT temp_0, 3; - GOTO 5; - GOTO 3; - STORE_F pNamespace, parm0_x; - CALL1 Parser_ParseDefinition; - GOTO -31; - STORE_F pEntityText, parm0_x; - STORE_F " }", parm1_x; - CALL2 String_Append; - RETURN return_x; - DONE; -} - -void(string pNamespace) Parser_ParseNamespace = asm -{ -local string lNamespace; -local float temp_0; - STORE_F PARSER_HIGH, parm0_x; - STORE_F "Parsing Namespace...", parm1_x; - CALL2 Parser_Print; - STORE_F PARSER_TT_TOKEN, parm0_x; - CALL1 Parser_Expect; - NE_S pNamespace, "", temp_0; - IFNOT temp_0, 9; - STORE_F pNamespace, parm0_x; - STORE_F "::", parm1_x; - STORE_F Parser_Token, parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lNamespace; - GOTO 4; - STORE_F Parser_Token, parm0_x; - CALL1 String_Zone; - STORE_S return_x, lNamespace; - STORE_F " Subnamespace = '", parm0_x; - STORE_F Parser_Token, parm1_x; - STORE_F "' New namespace = '", parm2_x; - STORE_F lNamespace, parm3_x; - STORE_F "'", parm4_x; - CALL5 strcat; - STORE_F PARSER_HIGH, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - STORE_F PARSER_TT_BRACEOPEN, parm0_x; - CALL1 Parser_Expect; - CALL0 Parser_GetToken; - IFNOT return_x, 7; - EQ_F Parser_TokenType, PARSER_TT_BRACECLOSE, temp_0; - IFNOT temp_0, 2; - GOTO 4; - STORE_F lNamespace, parm0_x; - CALL1 Parser_ParseDefinition; - GOTO -7; - STORE_F "Finished parsing Namespace. Namespace = '", parm0_x; - STORE_F pNamespace, parm1_x; - STORE_F "'", parm2_x; - CALL3 strcat; - STORE_F PARSER_HIGH, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Parser_Print; - STORE_F lNamespace, parm0_x; - CALL1 String_Free; - DONE; -} - -void(string pFilename, string pNamespace) Parser_ParseFile = asm -{ -local float temp_0; - STORE_F pFilename, parm0_x; - CALL1 String_Zone; - STORE_S return_x, Parser_Filename; - STORE_F Parser_Filename, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 fopen; - STORE_F return_x, Parser_File; - EQ_F Parser_File, ERR_CANNOTOPEN, temp_0; - IFNOT temp_0, 6; - STORE_F "Parser: Couldn't open ", parm0_x; - STORE_F Parser_Filename, parm1_x; - STORE_F " -", parm2_x; - CALL3 print; - RETURN offset_0; - CALL0 String_Create; - STORE_S return_x, Parser_Line; - STORE_F KEY_GAME, Parser_LineNumber; - STORE_F KEY_GAME, Parser_TokenNum; - STORE_F KEY_GAME, Parser_NumTokens; - CALL0 Parser_GetToken; - IFNOT return_x, 4; - STORE_F pNamespace, parm0_x; - CALL1 Parser_ParseDefinition; - GOTO -4; - STORE_F Parser_File, parm0_x; - CALL1 fclose; - STORE_F Parser_Filename, parm0_x; - CALL1 String_Free; - STORE_F Parser_Line, parm0_x; - CALL1 String_Free; - DONE; -} - -void() Parser_Init = asm -{ - CALL0 String_Create; - STORE_S return_x, Parser_Token; - STORE_ENT null_entity, Parser_DefineChain; - STORE_F KEY_GAME, Parser_IncludeDepth; - CALL0 String_Create; - STORE_S return_x, Parser_FileList; - DONE; -} - -void() Parser_Quit = asm -{ -local entity lNext; -local float temp_0; - STORE_F PARSER_HIGH, parm0_x; - STORE_F "Deleting #defines:", parm1_x; - CALL2 _Parser_Print; - IFNOT Parser_DefineChain, 18; - INDIRECT_E Parser_DefineChain, chain, lNext; - INDIRECT_S Parser_DefineChain, name, temp_0; - STORE_F " [", parm0_x; - STORE_F temp_0, parm1_x; - STORE_F "]", parm2_x; - CALL3 strcat; - STORE_F PARSER_HIGH, parm0_x; - STORE_F return_x, parm1_x; - CALL2 _Parser_Print; - INDIRECT_S Parser_DefineChain, name, parm0_x; - CALL1 String_Free; - INDIRECT_S Parser_DefineChain, value, parm0_x; - CALL1 String_Free; - STORE_F Parser_DefineChain, parm0_x; - CALL1 remove; - STORE_ENT lNext, Parser_DefineChain; - GOTO -17; - STORE_F Parser_Token, parm0_x; - CALL1 String_Free; - STORE_F Parser_FileList, parm0_x; - CALL1 String_Free; - DONE; -} - -void(string pMain) Parser_ParseMenu = asm -{ - CALL0 Parser_Init; - STORE_F pMain, parm0_x; - CALL1 String_Zone; - STORE_S return_x, pMain; - STORE_F Parser_FileList, parm0_x; - STORE_F pMain, parm1_x; - CALL2 Util_AltStringPush; - STORE_S return_x, Parser_FileList; - STORE_F pMain, parm0_x; - STORE_F "", parm1_x; - CALL2 Parser_ParseFile; - STORE_F "Files parsed: ", parm0_x; - STORE_F Parser_FileList, parm1_x; - CALL2 strcat; - STORE_F PARSER_INFO, parm0_x; - STORE_F return_x, parm1_x; - CALL2 _Parser_Print; - STORE_F pMain, parm0_x; - CALL1 String_Free; - CALL0 Parser_Quit; - DONE; -} - -void() Menu_InitGarbageStats = asm -{ - STORE_F KEY_GAME, Menu_GarbageFrameCount; - STORE_F KEY_GAME, Menu_GarbageToggleCount; - DONE; -} - -void() Menu_ResetGarbageStats = asm -{ - IFNOT Menu_GarbageFrameCount, 7; - STORE_F Menu_GarbageFrameCount, parm0_x; - CALL1 ftos; - STORE_F "Menu: GC: ", parm0_x; - STORE_F return_x, parm1_x; - STORE_F " items marked for frame deletion but couldnt be reached! -", parm2_x; - CALL3 print; - IFNOT Menu_GarbageToggleCount, 7; - STORE_F Menu_GarbageToggleCount, parm0_x; - CALL1 ftos; - STORE_F "Menu: GC: ", parm0_x; - STORE_F return_x, parm1_x; - STORE_F " items marked for toggle delition but couldnt be reached! -", parm2_x; - CALL3 print; - STORE_F KEY_GAME, Menu_GarbageFrameCount; - STORE_F KEY_GAME, Menu_GarbageToggleCount; - DONE; -} - -float(entity pItem) Menu_CheckForGarbage = asm -{ -local float temp_0; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_DELETEFRAME, temp_0; - IFNOT temp_0, 5; - STORE_F pItem, parm0_x; - CALL1 Menu_RemoveItem; - SUB_F Menu_GarbageFrameCount, FILE_APPEND, Menu_GarbageFrameCount; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void(float pToggle) Menu_CollectGarbage = asm -{ -local float locked_1586; -local entity lNode; -local float temp_1; - STORE_ENT null_entity, lNode; - IFNOT pToggle, 25; - IF Menu_GarbageFrameCount, 1; - OR Menu_GarbageFrameCount, Menu_GarbageToggleCount, locked_1586; - IFNOT locked_1586, 5; - STORE_F lNode, parm0_x; - CALL1 nextent; - STORE_ENT return_x, lNode; - NE_E return_x, null_entity, temp_1; - AND locked_1586, temp_1, locked_1586; - IFNOT locked_1586, 15; - INDIRECT_F lNode, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_DELETEFRAME, locked_1586; - IFNOT locked_1586, 5; - STORE_F lNode, parm0_x; - CALL1 Menu_RemoveItem; - SUB_F Menu_GarbageFrameCount, FILE_APPEND, Menu_GarbageFrameCount; - GOTO 7; - INDIRECT_F lNode, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_DELETETOGGLE, locked_1586; - IFNOT locked_1586, 4; - STORE_F lNode, parm0_x; - CALL1 Menu_RemoveItem; - SUB_F Menu_GarbageToggleCount, FILE_APPEND, Menu_GarbageToggleCount; - GOTO -22; - GOTO 15; - IFNOT Menu_GarbageFrameCount, 5; - STORE_F lNode, parm0_x; - CALL1 nextent; - STORE_ENT return_x, lNode; - NE_E return_x, null_entity, locked_1586; - AND Menu_GarbageFrameCount, locked_1586, locked_1586; - IFNOT locked_1586, 8; - INDIRECT_F lNode, _runFlag, locked_1586; - BITAND locked_1586, RUNFLAG_DELETEFRAME, locked_1586; - IFNOT locked_1586, 4; - STORE_F lNode, parm0_x; - CALL1 Menu_RemoveItem; - SUB_F Menu_GarbageFrameCount, FILE_APPEND, Menu_GarbageFrameCount; - GOTO -13; - DONE; -} - -void(entity pItem) Menu_DeleteAfterFrame = asm -{ -local float temp_0; -local float temp_1; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_DELETEFRAME, temp_0; - IF temp_0, 16; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_DELETETOGGLE, temp_0; - IFNOT temp_0, 8; - ADDRESS pItem, _runFlag, temp_0; - INDIRECT_F pItem, _runFlag, temp_1; - ADD_F temp_1, RUNFLAG_DELETEFRAME, temp_1; - SUB_F temp_1, RUNFLAG_DELETETOGGLE, temp_1; - STOREP_F temp_1, temp_0; - SUB_F Menu_GarbageToggleCount, FILE_APPEND, Menu_GarbageToggleCount; - GOTO 5; - ADDRESS pItem, _runFlag, temp_0; - INDIRECT_F pItem, _runFlag, temp_1; - ADD_F temp_1, RUNFLAG_DELETEFRAME, temp_1; - STOREP_F temp_1, temp_0; - ADD_F Menu_GarbageFrameCount, FILE_APPEND, Menu_GarbageFrameCount; - DONE; -} - -void(entity pItem) Menu_DeleteAfterToggle = asm -{ -local float temp_0; -local float temp_1; - INDIRECT_F pItem, _runFlag, temp_0; - BITAND temp_0, RUNFLAG_DELETEFRAME, temp_0; - IF temp_0, 3; - INDIRECT_F pItem, _runFlag, temp_1; - BITAND temp_1, RUNFLAG_DELETETOGGLE, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 2; - RETURN offset_0; - ADDRESS pItem, _runFlag, temp_0; - INDIRECT_F self, _runFlag, temp_1; - ADD_F temp_1, RUNFLAG_DELETETOGGLE, temp_1; - STOREP_F temp_1, temp_0; - ADD_F Menu_GarbageToggleCount, FILE_APPEND, Menu_GarbageToggleCount; - DONE; -} - -void() Key_Init = asm -{ - DONE; -} - -void() Key_Quit = asm -{ - DONE; -} - -void() Key_Display = asm -{ - STORE_F KEY_MENU, parm0_x; - CALL1 setkeydest; - DONE; -} - -void() Key_Update = asm -{ -local float temp_0; - CALL0 getkeydest; - NE_F return_x, KEY_MENU, temp_0; - IFNOT temp_0, 2; - CALL0 m_hide; - DONE; -} - -void() Key_Hide = asm -{ - STORE_F KEY_GAME, parm0_x; - CALL1 setkeydest; - DONE; -} - -void(string pKey) Key_Unbind = asm -{ - STORE_F "unbind ", parm0_x; - STORE_F pKey, parm1_x; - STORE_F " -", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 cmd; - DONE; -} - -string(float pKey) Key_GetName = asm -{ - STORE_F pKey, parm0_x; - CALL1 keynumtostring; - RETURN return_x; - DONE; -} - -float(string pKey) Key_GetNum = asm -{ - STORE_F pKey, parm0_x; - CALL1 stringtokeynum; - RETURN return_x; - DONE; -} - -string(string pCommand) Key_GetBindList = asm -{ - STORE_F pCommand, parm0_x; - CALL1 findkeysforcommand; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - RETURN return_x; - DONE; -} - -void(string pKey, string pCommand) Key_Bind = asm -{ - STORE_F "bind "", parm0_x; - STORE_F pKey, parm1_x; - STORE_F "" "", parm2_x; - STORE_F pCommand, parm3_x; - STORE_F "" -", parm4_x; - CALL5 strcat; - STORE_F return_x, parm0_x; - CALL1 cmd; - DONE; -} - -void(float pNum, string pCommand) Key_LimitBinds = asm -{ -local float lValue; -local float lMaxnum; -local float lCounter; -local string lAltlist; -local float temp_0; -local float temp_1; - STORE_F pCommand, parm0_x; - CALL1 Key_GetBindList; - STORE_S return_x, lAltlist; - STORE_F lAltlist, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lMaxnum; - STORE_F KEY_GAME, lCounter; - LT lCounter, lMaxnum, temp_0; - IFNOT temp_0, 20; - STORE_F lAltlist, parm0_x; - STORE_F lCounter, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F return_x, parm0_x; - CALL1 stof; - STORE_F return_x, lValue; - EQ_F lValue, ERR_CANNOTOPEN, temp_0; - IFNOT temp_0, 2; - GOTO 9; - GE lCounter, pNum, temp_0; - IFNOT temp_0, 5; - STORE_F lValue, parm0_x; - CALL1 Key_GetName; - STORE_F return_x, parm0_x; - CALL1 Key_Unbind; - ADD_F lCounter, FILE_APPEND, lCounter; - GOTO -20; - STORE_F lAltlist, parm0_x; - CALL1 String_Free; - DONE; -} - -void() Cursor_Init = asm -{ - STORE_F CURSOR_PATH, parm0_x; - CALL1 Gfx_Precache; - IFNOT return_x, 3; - STORE_S CURSOR_PATH, Cursor_Current; - GOTO 4; - STORE_S "ui/mousepointer.tga", Cursor_Current; - STORE_F Cursor_Current, parm0_x; - CALL1 Gfx_Precache; - STORE_V '0.000000 0.000000 0.000000', Cursor_Relative; - STORE_V '0.000000 0.000000 0.000000', Cursor_Position; - STORE_FNC Cursor_DefaultAnimation, Cursor_Animation; - DONE; -} - -void() Cursor_Quit = asm -{ - DONE; -} - -void() Cursor_Display = asm -{ - STORE_F FILE_APPEND, parm0_x; - CALL1 setmousetarget; - DONE; -} - -void() Cursor_Hide = asm -{ - STORE_F KEY_MENU, parm0_x; - CALL1 setmousetarget; - DONE; -} - -void() Cursor_Draw = asm -{ -local vector lSize; -local vector lPos; -local float temp_0; -local vector temp_2; - STORE_F Cursor_Current, parm0_x; - CALL1 Gfx_GetImageSize; - MUL_VF return, FILE_APPEND, lSize; - MUL_F lSize_x, Cursor_Offset_x, temp_0; - ADD_F Cursor_Position_x, temp_0, lPos_x; - MUL_F lSize_y, Cursor_Offset_y, temp_0; - ADD_F Cursor_Position_y, temp_0, lPos_y; - STORE_F KEY_GAME, lPos_z; - STORE_V lPos, parm0; - STORE_F Cursor_Current, parm1_x; - STORE_V lSize, parm2; - STORE_V Cursor_Color, parm3; - STORE_F FILE_APPEND, parm4_x; - STORE_F KEY_GAME, parm5_x; - CALL6 Gfx_DrawPic; - DONE; -} - -void() Cursor_Update = asm -{ -local vector lRelPos; -local float temp_0; - CALL0 getmousepos; - STORE_V return, lRelPos; - STORE_V lRelPos, parm0; - CALL1 Gfx_ConToMen; - STORE_V return, lRelPos; - MUL_F lRelPos_x, Cursor_Speed_x, Cursor_Relative_x; - MUL_F lRelPos_y, Cursor_Speed_y, Cursor_Relative_y; - ADD_F Cursor_Position_x, Cursor_Relative_x, temp_0; - STORE_F KEY_GAME, parm0_x; - STORE_F temp_0, parm1_x; - STORE_F Gfx_Menu_Width, parm2_x; - CALL3 bound; - SUB_F return_x, Cursor_Position_x, Cursor_Relative_x; - ADD_F Cursor_Position_y, Cursor_Relative_y, temp_0; - STORE_F KEY_GAME, parm0_x; - STORE_F temp_0, parm1_x; - STORE_F Gfx_Menu_Height, parm2_x; - CALL3 bound; - SUB_F return_x, Cursor_Position_y, Cursor_Relative_y; - ADD_F Cursor_Position_x, Cursor_Relative_x, Cursor_Position_x; - ADD_F Cursor_Position_y, Cursor_Relative_y, Cursor_Position_y; - STORE_F KEY_GAME, Cursor_Position_z; - CALL0 Cursor_Animation; - DONE; -} - -void() Cursor_DefaultAnimation = asm -{ - DONE; -} - -void(vector pRelPos, string pText, vector pScale, vector pColor, float pAlpha, float pDrawFlag) Cursor_PrintInfo = asm -{ -local float locked_1586; -local vector lSize; -local vector lPosition; -local float temp_1; -local vector temp_2; - STORE_F Cursor_Current, parm0_x; - CALL1 Gfx_GetImageSize; - MUL_VF return, FILE_APPEND, lSize; - NE_F pRelPos_x, KEY_GAME, locked_1586; - IFNOT locked_1586, 28; - GT pRelPos_x, KEY_GAME, locked_1586; - IFNOT locked_1586, 7; - ADD_F Cursor_Offset_x, 0.500000, locked_1586; - DIV_F pRelPos_x, KEY_MENU, temp_1; - ADD_F locked_1586, temp_1, locked_1586; - MUL_F lSize_x, locked_1586, locked_1586; - ADD_F Cursor_Position_x, locked_1586, lPosition_x; - GOTO 12; - LT pRelPos_x, KEY_GAME, locked_1586; - IFNOT locked_1586, 10; - ADD_F Cursor_Offset_x, 0.500000, locked_1586; - DIV_F pRelPos_x, KEY_MENU, temp_1; - ADD_F locked_1586, temp_1, locked_1586; - MUL_F lSize_x, locked_1586, locked_1586; - ADD_F Cursor_Position_x, locked_1586, locked_1586; - STORE_F pText, parm0_x; - CALL1 strlen; - MUL_F pScale_x, return_x, temp_1; - SUB_F locked_1586, temp_1, lPosition_x; - ADD_F Cursor_Offset_y, 0.500000, locked_1586; - DIV_F pRelPos_y, KEY_MENU, temp_1; - ADD_F locked_1586, temp_1, locked_1586; - MUL_F lSize_y, locked_1586, locked_1586; - ADD_F Cursor_Position_y, locked_1586, locked_1586; - DIV_F pScale_y, KEY_MENU, temp_1; - SUB_F locked_1586, temp_1, lPosition_y; - GOTO 9; - ADD_F Cursor_Offset_x, 0.500000, locked_1586; - MUL_F lSize_x, locked_1586, locked_1586; - ADD_F Cursor_Position_x, locked_1586, locked_1586; - STORE_F pText, parm0_x; - CALL1 strlen; - MUL_F pScale_x, return_x, temp_1; - DIV_F temp_1, KEY_MENU, temp_1; - SUB_F locked_1586, temp_1, lPosition_x; - NE_F pRelPos_y, KEY_GAME, locked_1586; - IFNOT locked_1586, 17; - GT pRelPos_y, KEY_GAME, locked_1586; - IFNOT locked_1586, 8; - ADD_F Cursor_Offset_y, 0.500000, locked_1586; - DIV_F pRelPos_y, KEY_MENU, temp_1; - SUB_F locked_1586, temp_1, locked_1586; - MUL_F lSize_y, locked_1586, locked_1586; - ADD_F Cursor_Position_y, locked_1586, locked_1586; - SUB_F locked_1586, pScale_y, lPosition_y; - GOTO 8; - LT pRelPos_y, KEY_GAME, locked_1586; - IFNOT locked_1586, 6; - ADD_F Cursor_Offset_y, 0.500000, locked_1586; - DIV_F pRelPos_y, KEY_MENU, temp_1; - SUB_F locked_1586, temp_1, locked_1586; - MUL_F lSize_y, locked_1586, locked_1586; - ADD_F Cursor_Position_y, locked_1586, lPosition_y; - STORE_V lPosition, parm0; - STORE_F pText, parm1_x; - STORE_V pScale, parm2; - STORE_V pColor, parm3; - STORE_F pAlpha, parm4_x; - STORE_F pDrawFlag, parm5_x; - CALL6 Gfx_DrawString; - DONE; -} - -void (string) _Sound_DPrint; -void(string pText) _Sound_DPrint = asm -{ - IFNOT sys_debug_sound, 3; - STORE_F pText, parm0_x; - CALL1 print; - DONE; -} - -float(string pSnd) Sound_Precache = asm -{ -local float temp_0; - STORE_F "Precaching sound '", parm0_x; - STORE_F pSnd, parm1_x; - STORE_F "' -", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 _Sound_DPrint; - EQ_S pSnd, "", temp_0; - IFNOT temp_0, 2; - RETURN KEY_GAME; - STORE_F pSnd, parm0_x; - CALL1 precache_sound; - NE_S pSnd, return_x, temp_0; - IFNOT temp_0, 3; - RETURN KEY_GAME; - GOTO 2; - RETURN FILE_APPEND; - DONE; -} - -void(string pSnd) Sound_Free = asm -{ - DONE; -} - -void(string pSnd) Sound_Play = asm -{ - STORE_F "Playing sound '", parm0_x; - STORE_F pSnd, parm1_x; - STORE_F "' -", parm2_x; - CALL3 strcat; - STORE_F return_x, parm0_x; - CALL1 _Sound_DPrint; - STORE_F pSnd, parm0_x; - CALL1 localsound; - DONE; -} - -float _Gfx_FPS; -float _Gfx_LastTime; -float _Gfx_FrameCount; -void () _Gfx_UpdateFPS; -void() _Gfx_UpdateFPS = asm -{ -local float lDeltaTime; -local float temp_0; - ADD_F _Gfx_FrameCount, FILE_APPEND, _Gfx_FrameCount; - SUB_F Timer_Time, _Gfx_LastTime, lDeltaTime; - LT FILE_APPEND, lDeltaTime, temp_0; - IFNOT temp_0, 4; - DIV_F _Gfx_FrameCount, lDeltaTime, _Gfx_FPS; - STORE_F Timer_Time, _Gfx_LastTime; - STORE_F KEY_GAME, _Gfx_FrameCount; - DONE; -} - -void () _Gfx_UpdateRes; -void() _Gfx_UpdateRes = asm -{ -local float temp_0; - STORE_F "vid_conwidth", parm0_x; - CALL1 cvar; - STORE_F return_x, Gfx_Real_Width; - STORE_F "vid_conheight", parm0_x; - CALL1 cvar; - STORE_F return_x, Gfx_Real_Height; - STORE_F CVAR_SCMENU_MENU_WIDTH, parm0_x; - CALL1 cvar; - STORE_F return_x, Gfx_Menu_Width; - STORE_F CVAR_SCMENU_MENU_HEIGHT, parm0_x; - CALL1 cvar; - STORE_F return_x, Gfx_Menu_Height; - EQ_F Gfx_Menu_Width, KEY_GAME, temp_0; - IFNOT temp_0, 2; - STORE_F SLIST_LEGACY_LINE1, Gfx_Menu_Width; - EQ_F Gfx_Menu_Height, KEY_GAME, temp_0; - IFNOT temp_0, 2; - STORE_F K_JOY1, Gfx_Menu_Height; - DONE; -} - -void() Gfx_Init = asm -{ -local string lHeight; -local string lWidth; - STORE_F SLIST_LEGACY_LINE1, parm0_x; - CALL1 ftos; - STORE_S return_x, lWidth; - STORE_F K_JOY1, parm0_x; - CALL1 ftos; - STORE_S return_x, lHeight; - STORE_F CVAR_SCMENU_MENU_WIDTH, parm0_x; - STORE_F lWidth, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 registercvar; - STORE_F CVAR_SCMENU_MENU_HEIGHT, parm0_x; - STORE_F lHeight, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 registercvar; - STORE_F KEY_GAME, parm0_x; - CALL1 ftos; - STORE_F CVAR_SCMENU_SHOWFPS, parm0_x; - STORE_F return_x, parm1_x; - STORE_F KEY_GAME, parm2_x; - CALL3 registercvar; - CALL0 _Gfx_UpdateRes; - DONE; -} - -void() Gfx_Quit = asm -{ - DONE; -} - -void() Gfx_Display = asm -{ - CALL0 Gfx_ResetClipArea; - DONE; -} - -void() Gfx_Hide = asm -{ - DONE; -} - -void() Gfx_Update = asm -{ - CALL0 _Gfx_UpdateRes; - CALL0 _Gfx_UpdateFPS; - DONE; -} - -void() Gfx_Draw = asm -{ -local vector lPosition; -local vector lScale; -local string lText; -local float temp_0; - STORE_F CVAR_SCMENU_SHOWFPS, parm0_x; - CALL1 cvar; - IFNOT return_x, 21; - STORE_F _Gfx_FPS, parm0_x; - CALL1 floor; - STORE_F return_x, parm0_x; - CALL1 ftos; - STORE_F "FPS: ", parm0_x; - STORE_F return_x, parm1_x; - CALL2 strcat; - STORE_S return_x, lText; - STORE_V '15.000000 15.000000 0.000000', lScale; - STORE_F KEY_GAME, lPosition_x; - SUB_F Gfx_Menu_Height, lScale_y, temp_0; - SUB_F temp_0, SLIST_SERVERREPLYCOUNT, lPosition_y; - STORE_F KEY_GAME, lPosition_z; - STORE_V lPosition, parm0; - STORE_F lText, parm1_x; - STORE_V lScale, parm2; - STORE_V Cursor_Color, parm3; - STORE_F FILE_APPEND, parm4_x; - STORE_F KEY_GAME, parm5_x; - CALL6 Gfx_DrawString; - DONE; -} - -float(string pPic) Gfx_IsCached = asm -{ - STORE_F pPic, parm0_x; - CALL1 iscachedpic; - RETURN return_x; - DONE; -} - -float(string pPic) Gfx_Precache = asm -{ -local float temp_0; - EQ_S pPic, "", temp_0; - IFNOT temp_0, 2; - RETURN KEY_GAME; - STORE_F pPic, parm0_x; - CALL1 iscachedpic; - IFNOT return_x, 2; - RETURN FILE_APPEND; - STORE_F pPic, parm0_x; - CALL1 precache_pic; - EQ_S return_x, pPic, temp_0; - IFNOT temp_0, 2; - RETURN FILE_APPEND; - RETURN KEY_GAME; - DONE; -} - -void(string pPic) Gfx_Free = asm -{ - DONE; -} - -vector(string pPic) Gfx_GetImageSize = asm -{ - STORE_F pPic, parm0_x; - CALL1 drawgetimagesize; - RETURN return_x; - DONE; -} - -vector(vector pPos) Gfx_ConToMen = asm -{ -local float temp_0; - MUL_F pPos_x, Gfx_Menu_Width, temp_0; - DIV_F temp_0, Gfx_Real_Width, pPos_x; - MUL_F pPos_y, Gfx_Menu_Height, temp_0; - DIV_F temp_0, Gfx_Real_Height, pPos_y; - STORE_F KEY_GAME, pPos_z; - RETURN pPos_x; - DONE; -} - -vector(vector pPos) Gfx_MenToCon = asm -{ -local float temp_0; - MUL_F pPos_x, Gfx_Real_Width, temp_0; - DIV_F temp_0, Gfx_Menu_Width, pPos_x; - MUL_F pPos_y, Gfx_Real_Height, temp_0; - DIV_F temp_0, Gfx_Menu_Height, pPos_y; - STORE_F KEY_GAME, pPos_z; - RETURN pPos_x; - DONE; -} - -void() Gfx_ResetClipArea = asm -{ - CALL0 drawresetcliparea; - DONE; -} - -vector (vector) _Gfx_FitCenter; -vector(vector pPosition) _Gfx_FitCenter = asm -{ -local vector temp_2; - ADD_V pPosition, '0.375000 0.375000 0.000000', temp_2; - RETURN temp_2_x; - DONE; -} - -float(vector pPosition, float pCharacter, vector pScale, vector pRGB, float pAlpha, float pFlag) Gfx_DrawCharacter = asm -{ - STORE_V pPosition, parm0; - CALL1 Gfx_MenToCon; - STORE_V return, parm0; - CALL1 _Gfx_FitCenter; - STORE_V return, pPosition; - STORE_V pScale, parm0; - CALL1 Gfx_MenToCon; - STORE_V return, pScale; - STORE_V pPosition, parm0; - STORE_F pCharacter, parm1_x; - STORE_V pScale, parm2; - STORE_V pRGB, parm3; - STORE_F pAlpha, parm4_x; - STORE_F pFlag, parm5_x; - CALL6 drawcharacter; - RETURN return_x; - DONE; -} - -float(vector pPosition, string pText, vector pScale, vector pRGB, float pAlpha, float pFlag) Gfx_DrawString = asm -{ - STORE_V pPosition, parm0; - CALL1 Gfx_MenToCon; - STORE_V return, parm0; - CALL1 _Gfx_FitCenter; - STORE_V return, pPosition; - STORE_V pScale, parm0; - CALL1 Gfx_MenToCon; - STORE_V return, pScale; - STORE_V pPosition, parm0; - STORE_F pText, parm1_x; - STORE_V pScale, parm2; - STORE_V pRGB, parm3; - STORE_F pAlpha, parm4_x; - STORE_F pFlag, parm5_x; - CALL6 drawstring; - RETURN return_x; - DONE; -} - -float(vector pPosition, string pPicture, vector pSize, vector pRGB, float pAlpha, float pFlag) Gfx_DrawPic = asm -{ - STORE_V pPosition, parm0; - CALL1 Gfx_MenToCon; - STORE_V return, parm0; - CALL1 _Gfx_FitCenter; - STORE_V return, pPosition; - STORE_V pSize, parm0; - CALL1 Gfx_MenToCon; - STORE_V return, pSize; - STORE_V pPosition, parm0; - STORE_F pPicture, parm1_x; - STORE_V pSize, parm2; - STORE_V pRGB, parm3; - STORE_F pAlpha, parm4_x; - STORE_F pFlag, parm5_x; - CALL6 drawpic; - RETURN return_x; - DONE; -} - -float(vector pPosition, vector pSize, vector pRGB, float pAlpha, float pFlag) Gfx_Fill = asm -{ - STORE_V pPosition, parm0; - CALL1 Gfx_MenToCon; - STORE_V return, parm0; - CALL1 _Gfx_FitCenter; - STORE_V return, pPosition; - STORE_V pSize, parm0; - CALL1 Gfx_MenToCon; - STORE_V return, pSize; - STORE_V pPosition, parm0; - STORE_V pSize, parm1; - STORE_V pRGB, parm2; - STORE_F pAlpha, parm3_x; - STORE_F pFlag, parm4_x; - CALL5 drawfill; - RETURN return_x; - DONE; -} - -void(float pX, float pY, float pWidth, float pHeight) Gfx_SetClipArea = asm -{ -local vector lSize; -local vector lPosition; -local vector temp_2; - STORE_F pX, lPosition_x; - STORE_F pY, lPosition_y; - STORE_F pWidth, lSize_x; - STORE_F pHeight, lSize_y; - STORE_V lPosition, parm0; - CALL1 Gfx_MenToCon; - STORE_V return, parm0; - CALL1 _Gfx_FitCenter; - STORE_V return, lPosition; - STORE_V lSize, parm0; - CALL1 Gfx_MenToCon; - ADD_V return, Cursor_Speed, lSize; - STORE_F lPosition_x, parm0_x; - STORE_F lPosition_y, parm1_x; - STORE_F lSize_x, parm2_x; - STORE_F lSize_y, parm3_x; - CALL4 drawsetcliparea; - DONE; -} - -float _Timer_LastTime; -void() Timer_Init = asm -{ - CALL0 gettime; - STORE_F return_x, Timer_Time; - STORE_F KEY_GAME, Timer_Delta; - DONE; -} - -void() Timer_Update = asm -{ -local float temp_0; - STORE_F Timer_Time, _Timer_LastTime; - CALL0 gettime; - STORE_F return_x, Timer_Time; - SUB_F Timer_Time, _Timer_LastTime, Timer_Delta; - DONE; -} - -void() Timer_Quit = asm -{ - DONE; -} - -void() HostCache_Init = asm -{ - STORE_F "cname", parm0_x; - CALL1 gethostcacheindexforkey; - STORE_F return_x, SLIST_FIELD_CNAME; - STORE_F "ping", parm0_x; - CALL1 gethostcacheindexforkey; - STORE_F return_x, SLIST_FIELD_PING; - STORE_F "game", parm0_x; - CALL1 gethostcacheindexforkey; - STORE_F return_x, SLIST_FIELD_GAME; - STORE_F "mod", parm0_x; - CALL1 gethostcacheindexforkey; - STORE_F return_x, SLIST_FIELD_MOD; - STORE_F "map", parm0_x; - CALL1 gethostcacheindexforkey; - STORE_F return_x, SLIST_FIELD_MAP; - STORE_F "name", parm0_x; - CALL1 gethostcacheindexforkey; - STORE_F return_x, SLIST_FIELD_NAME; - STORE_F "maxplayers", parm0_x; - CALL1 gethostcacheindexforkey; - STORE_F return_x, SLIST_FIELD_MAXPLAYERS; - STORE_F "numplayers", parm0_x; - CALL1 gethostcacheindexforkey; - STORE_F return_x, SLIST_FIELD_NUMPLAYERS; - STORE_F "protocol", parm0_x; - CALL1 gethostcacheindexforkey; - STORE_F return_x, SLIST_FIELD_PROTOCOL; - DONE; -} - -void() HostCache_Update = asm -{ - STORE_F KEY_GAME, parm0_x; - CALL1 gethostcachevalue; - STORE_F return_x, HostCache_ViewCount; - STORE_F FILE_APPEND, parm0_x; - CALL1 gethostcachevalue; - STORE_F return_x, HostCache_TotalCount; - STORE_F KEY_MENU, parm0_x; - CALL1 gethostcachevalue; - STORE_F return_x, HostCache_MasterQueryCount; - STORE_F KEY_UNKNOWN, parm0_x; - CALL1 gethostcachevalue; - STORE_F return_x, HostCache_MasterReplyCount; - STORE_F CVAR_READONLY, parm0_x; - CALL1 gethostcachevalue; - STORE_F return_x, HostCache_ServerQueryCount; - STORE_F SLIST_SERVERREPLYCOUNT, parm0_x; - CALL1 gethostcachevalue; - STORE_F return_x, HostCache_ServerReplyCount; - STORE_F SLIST_SORTFIELD, parm0_x; - CALL1 gethostcachevalue; - STORE_F return_x, HostCache_SortField; - STORE_F SLIST_SORTDESCENDING, parm0_x; - CALL1 gethostcachevalue; - STORE_F return_x, HostCache_SortDescending; - DONE; -} - -void() HostCache_ResortViewSet = asm -{ - CALL0 resorthostcache; - CALL0 HostCache_Update; - DONE; -} - -void() HostCache_RefreshHostCache = asm -{ - CALL0 refreshhostcache; - CALL0 HostCache_Update; - DONE; -} - -string() Property_Create = asm -{ - CALL0 String_Create; - RETURN return_x; - DONE; -} - -string(string pString) Property_Zone = asm -{ - STORE_F pString, parm0_x; - CALL1 String_Zone; - RETURN return_x; - DONE; -} - -string(string pString) Propery_Free = asm -{ - STORE_F pString, parm0_x; - CALL1 String_Free; - RETURN return_x; - DONE; -} - -float(string pString) Property_Validate = asm -{ -local float lCount; -local float temp_0; - STORE_F pString, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - DIV_F lCount, KEY_MENU, parm0_x; - CALL1 rint; - DIV_F lCount, KEY_MENU, temp_0; - NE_F return_x, temp_0, temp_0; - IFNOT temp_0, 7; - STORE_F "Property_Validate", parm0_x; - STORE_F "Invalid property string "", parm1_x; - STORE_F pString, parm2_x; - STORE_F ""! -", parm3_x; - CALL4 dprint; - RETURN KEY_GAME; - RETURN FILE_APPEND; - DONE; -} - -float(string pString, string pName) Property_Exists = asm -{ -local float lCounter; -local float lCount; -local float temp_0; - IF FILE_APPEND, 2; - RETURN KEY_GAME; - STORE_F pString, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - STORE_F KEY_GAME, lCounter; - LT lCounter, lCount, temp_0; - IFNOT temp_0, 11; - STORE_F pString, parm0_x; - STORE_F lCounter, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - EQ_S return_x, pName, temp_0; - IFNOT temp_0, 2; - RETURN FILE_APPEND; - ADD_F lCounter, KEY_MENU, lCounter; - GOTO -11; - RETURN KEY_GAME; - DONE; -} - -string(string pString, string pName, string pInitValue) Property_Register = asm -{ -local float lCounter; -local float lCount; -local float temp_0; - IF FILE_APPEND, 2; - RETURN pString; - STORE_F pString, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - STORE_F KEY_GAME, lCounter; - LT lCounter, lCount, temp_0; - IFNOT temp_0, 11; - STORE_F pString, parm0_x; - STORE_F lCounter, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - EQ_S return_x, pName, temp_0; - IFNOT temp_0, 2; - RETURN pString; - ADD_F lCounter, KEY_MENU, lCounter; - GOTO -11; - STORE_F pString, parm0_x; - STORE_F pInitValue, parm1_x; - CALL2 Util_AltStringPush; - STORE_S return_x, pString; - STORE_F pString, parm0_x; - STORE_F pName, parm1_x; - CALL2 Util_AltStringPush; - STORE_S return_x, pString; - RETURN pString; - DONE; -} - -string(string pString, string pName, string pValue) Property_Set = asm -{ -local float lCounter; -local float lCount; -local float temp_0; - IF FILE_APPEND, 2; - RETURN pString; - STORE_F pString, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - STORE_F KEY_GAME, lCounter; - LT lCounter, lCount, temp_0; - IFNOT temp_0, 16; - STORE_F pString, parm0_x; - STORE_F lCounter, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - EQ_S return_x, pName, temp_0; - IFNOT temp_0, 7; - ADD_F lCounter, FILE_APPEND, temp_0; - STORE_F pString, parm0_x; - STORE_F temp_0, parm1_x; - STORE_F pValue, parm2_x; - CALL3 Util_SetAltStringItem; - RETURN return_x; - ADD_F lCounter, KEY_MENU, lCounter; - GOTO -16; - STORE_F "Property_Set", parm0_x; - STORE_F "The property "", parm1_x; - STORE_F pName, parm2_x; - STORE_F "" hasn't been declared! -pString = "", parm3_x; - STORE_F pString, parm4_x; - STORE_F """, parm5_x; - CALL6 dprint; - RETURN pString; - DONE; -} - -string(string pString, string pOldName, string pNewName) Property_Rename = asm -{ -local float lCounter; -local float lCount; -local float temp_0; - IF FILE_APPEND, 2; - RETURN pString; - STORE_F pString, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - STORE_F KEY_GAME, lCounter; - LT lCounter, lCount, temp_0; - IFNOT temp_0, 15; - STORE_F pString, parm0_x; - STORE_F lCounter, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - EQ_S return_x, pOldName, temp_0; - IFNOT temp_0, 6; - STORE_F pString, parm0_x; - STORE_F lCounter, parm1_x; - STORE_F pNewName, parm2_x; - CALL3 Util_SetAltStringItem; - RETURN return_x; - ADD_F lCounter, KEY_MENU, lCounter; - GOTO -15; - STORE_F "Property_Rename", parm0_x; - STORE_F "The property "", parm1_x; - STORE_F pOldName, parm2_x; - STORE_F "" hasn't been declared! -pString = "", parm3_x; - STORE_F pString, parm4_x; - STORE_F """, parm5_x; - CALL6 dprint; - RETURN pString; - DONE; -} - -string(string pString, string pName) Property_Delete = asm -{ -local float lCounter; -local float lCount; -local float temp_0; - IF FILE_APPEND, 2; - RETURN pString; - STORE_F pString, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - STORE_F KEY_GAME, lCounter; - LT lCounter, lCount, temp_0; - IFNOT temp_0, 19; - STORE_F pString, parm0_x; - STORE_F lCounter, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - EQ_S return_x, pName, temp_0; - IFNOT temp_0, 10; - STORE_F pString, parm0_x; - STORE_F lCounter, parm1_x; - CALL2 Util_DelAltStringItem; - STORE_S return_x, pString; - STORE_F pString, parm0_x; - STORE_F lCounter, parm1_x; - CALL2 Util_DelAltStringItem; - STORE_S return_x, pString; - RETURN pString; - ADD_F lCounter, KEY_MENU, lCounter; - GOTO -19; - STORE_F "Property_Delete", parm0_x; - STORE_F "The property "", parm1_x; - STORE_F pName, parm2_x; - STORE_F "" hasn't been declared! -pString = "", parm3_x; - STORE_F pString, parm4_x; - STORE_F """, parm5_x; - CALL6 dprint; - RETURN pString; - DONE; -} - -string(string pString, string pName) Property_Get = asm -{ -local float lCounter; -local float lCount; -local float temp_0; - IF FILE_APPEND, 2; - RETURN pString; - STORE_F pString, parm0_x; - CALL1 Util_GetAltStringCount; - STORE_F return_x, lCount; - STORE_F KEY_GAME, lCounter; - LT lCounter, lCount, temp_0; - IFNOT temp_0, 15; - STORE_F pString, parm0_x; - STORE_F lCounter, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - EQ_S return_x, pName, temp_0; - IFNOT temp_0, 6; - ADD_F lCounter, FILE_APPEND, temp_0; - STORE_F pString, parm0_x; - STORE_F temp_0, parm1_x; - CALL2 Util_GetAltStringItem; - RETURN return_x; - ADD_F lCounter, KEY_MENU, lCounter; - GOTO -15; - STORE_F "The property "", parm0_x; - STORE_F pName, parm1_x; - STORE_F "" hasn't been declared! -pString = "", parm2_x; - STORE_F pString, parm3_x; - STORE_F """, parm4_x; - CALL5 dprint; - STORE_F "", parm0_x; - CALL1 String_Zone; - RETURN return_x; - DONE; -} - -string(string pString, string pName) Property_GetString = asm -{ - STORE_F pString, parm0_x; - STORE_F pName, parm1_x; - CALL2 Property_Get; - RETURN return_x; - DONE; -} - -float(string pString, string pName) Property_GetFloat = asm -{ - STORE_F pString, parm0_x; - STORE_F pName, parm1_x; - CALL2 Property_Get; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F return_x, parm0_x; - CALL1 stof; - RETURN return_x; - DONE; -} - -vector(string pString, string pName) Property_GetVector = asm -{ - STORE_F pString, parm0_x; - STORE_F pName, parm1_x; - CALL2 Property_Get; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F return_x, parm0_x; - CALL1 stov; - RETURN return_x; - DONE; -} - -entity(string pString, string pName) Property_GetEntity = asm -{ - STORE_F pString, parm0_x; - STORE_F pName, parm1_x; - CALL2 Property_GetFloat; - STORE_F return_x, parm0_x; - CALL1 ftoe; - RETURN return_x; - DONE; -} - -vector(string pText, vector pLast) Util_GetEndOfLine = asm -{ -local string lChar; -local float temp_0; - STORE_F pLast_y, pLast_x; - STORE_F KEY_GAME, pLast_z; - STORE_F pText, parm0_x; - STORE_F pLast_x, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 substring; - STORE_S return_x, lChar; - EQ_S lChar, " -", temp_0; - IFNOT temp_0, 5; - ADD_F pLast_x, FILE_APPEND, pLast_y; - SUB_F pLast_x, FILE_APPEND, pLast_x; - RETURN pLast_x; - GOTO 9; - EQ_S lChar, "", temp_0; - IFNOT temp_0, 5; - SUB_F pLast_x, FILE_APPEND, pLast_x; - STORE_F pLast_x, pLast_y; - RETURN pLast_x; - GOTO 3; - ADD_F pLast_x, FILE_APPEND, pLast_x; - ADD_F pLast_z, FILE_APPEND, pLast_z; - GOTO -19; - DONE; -} - -vector(string pText, vector pLast, float pWrapLength) Util_GetEndOfWrappedLine = asm -{ -local string lChar; -local float temp_0; - STORE_F pLast_y, pLast_x; - STORE_F KEY_GAME, pLast_z; - STORE_F pText, parm0_x; - STORE_F pLast_x, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 substring; - STORE_S return_x, lChar; - EQ_S lChar, " -", temp_0; - IFNOT temp_0, 5; - SUB_F pLast_x, FILE_APPEND, pLast_x; - ADD_F pLast_x, KEY_MENU, pLast_y; - RETURN pLast_x; - GOTO 14; - EQ_S lChar, "", temp_0; - IFNOT temp_0, 5; - SUB_F pLast_x, FILE_APPEND, pLast_x; - STORE_F pLast_x, pLast_y; - RETURN pLast_x; - GOTO 8; - ADD_F pLast_x, FILE_APPEND, pLast_x; - ADD_F pLast_z, FILE_APPEND, pLast_z; - SUB_F pWrapLength, FILE_APPEND, pWrapLength; - IF pWrapLength, 4; - STORE_F pLast_x, pLast_y; - SUB_F pLast_x, FILE_APPEND, pLast_x; - RETURN pLast_x; - GOTO -24; - DONE; -} - -float _m_uid_counter; -string() Util_CreateUID = asm -{ -local string lName; -local float temp_0; - STORE_F _m_uid_counter, parm0_x; - CALL1 ftos; - STORE_F "M_UID_", parm0_x; - STORE_F return_x, parm1_x; - CALL2 strcat; - STORE_F return_x, parm0_x; - CALL1 strzone; - STORE_S return_x, lName; - ADD_F _m_uid_counter, FILE_APPEND, _m_uid_counter; - RETURN lName; - DONE; -} - -string(float pNum) Util_GetUIDName = asm -{ -local string lName; - STORE_F pNum, parm0_x; - CALL1 ftos; - STORE_F "M_UID_", parm0_x; - STORE_F return_x, parm1_x; - CALL2 strcat; - STORE_F return_x, parm0_x; - CALL1 strzone; - STORE_S return_x, lName; - RETURN lName; - DONE; -} - -float(string pUid) Util_GetUIDNum = asm -{ -local string lNum; - STORE_F pUid, parm0_x; - STORE_F SLIST_SORTFIELD, parm1_x; - STORE_F 100000.000000, parm2_x; - CALL3 substring; - STORE_S return_x, lNum; - STORE_F lNum, parm0_x; - CALL1 stof; - RETURN return_x; - DONE; -} - -string() String_Create = asm -{ - STORE_F "", parm0_x; - CALL1 strzone; - RETURN return_x; - DONE; -} - -string(string pStr) String_Zone = asm -{ - STORE_F pStr, parm0_x; - CALL1 strzone; - RETURN return_x; - DONE; -} - -string(string pStr) String_Normal = asm -{ -local string lResult; - STORE_F pStr, parm0_x; - CALL1 strcat; - STORE_S return_x, lResult; - STORE_F pStr, parm0_x; - CALL1 strunzone; - RETURN lResult; - DONE; -} - -string(string pStr) String_Free = asm -{ - STORE_F pStr, parm0_x; - CALL1 strunzone; - RETURN ""; - DONE; -} - -void(entity pEntity, .string pField) String_EntityCreate = asm -{ -local float locked_1586; - ADDRESS pEntity, pField, locked_1586; - STORE_F "", parm0_x; - CALL1 strzone; - STOREP_S return_x, locked_1586; - DONE; -} - -void(entity pEntity, .string pField) String_EntityZone = asm -{ -local float locked_1586; -local float temp_1; - ADDRESS pEntity, pField, locked_1586; - INDIRECT_S pEntity, pField, parm0_x; - CALL1 strzone; - STOREP_S return_x, locked_1586; - DONE; -} - -void(entity pEntity, .string pField, string pSet) String_EntitySet = asm -{ -local float locked_1586; - INDIRECT_S pEntity, pField, parm0_x; - CALL1 strunzone; - ADDRESS pEntity, pField, locked_1586; - STORE_F pSet, parm0_x; - CALL1 strzone; - STOREP_S return_x, locked_1586; - DONE; -} - -void(entity pEntity, .string pField) String_EntityFree = asm -{ -local float temp_0; - INDIRECT_S pEntity, pField, parm0_x; - CALL1 strunzone; - ADDRESS pEntity, pField, temp_0; - STOREP_S "", temp_0; - DONE; -} - -string(string pStr, string pApp) String_Append = asm -{ - STORE_F pStr, parm0_x; - STORE_F pApp, parm1_x; - CALL2 strcat; - STORE_F pStr, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - RETURN return_x; - DONE; -} - -string(string pStr, float pStart, float pLength) String_Substring = asm -{ - STORE_F pStr, parm0_x; - STORE_F pStart, parm1_x; - STORE_F pLength, parm2_x; - CALL3 substring; - STORE_F return_x, parm0_x; - CALL1 strzone; - RETURN return_x; - DONE; -} - -string(string pStr, string pSet) String_Set = asm -{ - STORE_F pStr, parm0_x; - CALL1 strunzone; - STORE_F pSet, parm0_x; - CALL1 strzone; - RETURN return_x; - DONE; -} - -bool(vector pPoint, vector pPos, vector pSize) Util_InRect = asm -{ -local float temp_0; -local float temp_1; - LT pPoint_x, pPos_x, temp_0; - IF temp_0, 2; - LT pPoint_y, pPos_y, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 3; - ADD_F pPos_x, pSize_x, temp_1; - GT pPoint_x, temp_1, temp_1; - OR temp_0, temp_1, temp_0; - IF temp_0, 3; - ADD_F pPos_y, pSize_y, temp_1; - GT pPoint_y, temp_1, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 2; - RETURN KEY_GAME; - RETURN FILE_APPEND; - DONE; -} - -bool(vector pPos1, vector pSize1, vector pPos2, vector pSize2) Util_RectInRect = asm -{ -local vector lFPos2; -local vector lFPos1; -local float temp_0; -local float temp_1; -local vector temp_2; - ADD_V pPos1, pSize1, lFPos1; - ADD_V pPos2, pSize2, lFPos2; - LE pPos1_x, lFPos2_x, temp_0; - IFNOT temp_0, 2; - LE pPos2_x, lFPos1_x, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 2; - LE pPos1_y, lFPos2_y, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 2; - LE pPos2_y, lFPos1_y, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 2; - RETURN KEY_GAME; - RETURN FILE_APPEND; - DONE; -} - -vector(vector pPoint, vector pClipPos, vector pClipSize) Util_GetClipDelta = asm -{ -local vector lPoint; -local float temp_0; - ADD_F pClipPos_x, pClipSize_x, temp_0; - STORE_F pClipPos_x, parm0_x; - STORE_F pPoint_x, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 bound; - SUB_F return_x, pPoint_x, lPoint_x; - ADD_F pClipPos_y, pClipSize_y, temp_0; - STORE_F pClipPos_y, parm0_x; - STORE_F pPoint_y, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 bound; - SUB_F return_x, pPoint_y, lPoint_y; - STORE_F KEY_GAME, lPoint_z; - RETURN lPoint_x; - DONE; -} - -vector(vector pPos, vector pSize, vector pClipPos, vector pClipSize) Util_ClipRect = asm -{ -local vector lSize; -local float temp_0; -local float temp_1; - ADD_F pPos_x, pSize_x, temp_0; - ADD_F pClipPos_x, pClipSize_x, temp_1; - STORE_F temp_0, parm0_x; - STORE_F temp_1, parm1_x; - CALL2 min; - SUB_F return_x, pPos_x, lSize_x; - ADD_F pPos_y, pSize_y, temp_0; - ADD_F pClipPos_y, pClipSize_y, temp_1; - STORE_F temp_0, parm0_x; - STORE_F temp_1, parm1_x; - CALL2 min; - SUB_F return_x, pPos_y, lSize_y; - STORE_F KEY_GAME, lSize_z; - LE lSize_x, KEY_GAME, temp_0; - IF temp_0, 2; - LE lSize_y, KEY_GAME, temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 2; - RETURN '0.000000 0.000000 0.000000'; - RETURN lSize_x; - DONE; -} - -string(string pStack) Util_ClipStack_Reset = asm -{ - STORE_F pStack, parm0_x; - CALL1 String_Free; - CALL0 String_Create; - RETURN return_x; - DONE; -} - -string(string pStack, vector pPos, vector pSize) Util_ClipStack_Push = asm -{ -local vector lDelta; -local vector lOldSize; -local vector lOldPos; -local float temp_0; -local float temp_1; -local vector temp_2; - STORE_F pStack, parm0_x; - CALL1 Util_ClipStack_GetPosition; - STORE_V return, lOldPos; - STORE_F pStack, parm0_x; - CALL1 Util_ClipStack_GetSize; - STORE_V return, lOldSize; - EQ_V pPos, '0.000000 0.000000 0.000000', temp_0; - IFNOT temp_0, 2; - EQ_V pSize, '0.000000 0.000000 0.000000', temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 4; - STORE_V lOldPos, pPos; - STORE_V lOldSize, pSize; - GOTO 19; - NE_V lOldPos, '0.000000 0.000000 0.000000', temp_0; - IF temp_0, 2; - NE_V lOldSize, '0.000000 0.000000 0.000000', temp_1; - OR temp_0, temp_1, temp_0; - IFNOT temp_0, 14; - STORE_V pPos, parm0; - STORE_V lOldPos, parm1; - STORE_V lOldSize, parm2; - CALL3 Util_GetClipDelta; - STORE_V return, lDelta; - ADD_V pPos, lDelta, pPos; - SUB_V pSize, lDelta, temp_2; - STORE_V pPos, parm0; - STORE_V temp_2, parm1; - STORE_V lOldPos, parm2; - STORE_V lOldSize, parm3; - CALL4 Util_ClipRect; - STORE_V return, pSize; - STORE_V pSize, parm0; - CALL1 vtos; - STORE_F pStack, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Util_AltStringPush; - STORE_S return_x, pStack; - STORE_V pPos, parm0; - CALL1 vtos; - STORE_F pStack, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Util_AltStringPush; - STORE_S return_x, pStack; - RETURN pStack; - DONE; -} - -string(string pStack) Util_ClipStack_Pop = asm -{ - STORE_F pStack, parm0_x; - CALL1 Util_AltStringPop; - STORE_S return_x, pStack; - STORE_F pStack, parm0_x; - CALL1 Util_AltStringPop; - STORE_S return_x, pStack; - RETURN pStack; - DONE; -} - -vector(string pStack) Util_ClipStack_GetPosition = asm -{ - STORE_F pStack, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F return_x, parm0_x; - CALL1 stov; - RETURN return_x; - DONE; -} - -vector(string pStack) Util_ClipStack_GetSize = asm -{ - STORE_F pStack, parm0_x; - STORE_F FILE_APPEND, parm1_x; - CALL2 Util_GetAltStringItem; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F return_x, parm0_x; - CALL1 stov; - RETURN return_x; - DONE; -} - -string(string pStack) Util_OriginStack_Reset = asm -{ - STORE_F pStack, parm0_x; - CALL1 String_Free; - CALL0 String_Create; - RETURN return_x; - DONE; -} - -string(string pStack, vector pOrigin) Util_OriginStack_Push = asm -{ - STORE_V pOrigin, parm0; - CALL1 vtos; - STORE_F pStack, parm0_x; - STORE_F return_x, parm1_x; - CALL2 Util_AltStringPush; - RETURN return_x; - DONE; -} - -string(string pStack) Util_OriginStack_Pop = asm -{ - STORE_F pStack, parm0_x; - CALL1 Util_AltStringPop; - RETURN return_x; - DONE; -} - -vector(string pStack) Util_OriginStack_Get = asm -{ - STORE_F pStack, parm0_x; - CALL1 Util_GetAltStringTop; - STORE_F return_x, parm0_x; - CALL1 String_Normal; - STORE_F return_x, parm0_x; - CALL1 stov; - RETURN return_x; - DONE; -} - -float(string pStr) Util_GetAltStringCount = asm -{ - STORE_F pStr, parm0_x; - CALL1 altstr_count; - RETURN return_x; - DONE; -} - -string(string pStr, float pCount) Util_GetAltStringItem = asm -{ - STORE_F pStr, parm0_x; - STORE_F pCount, parm1_x; - CALL2 altstr_get; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - RETURN return_x; - DONE; -} - -string(string pAlt, float pIndex, string pSet) Util_SetAltStringItem = asm -{ - STORE_F pAlt, parm0_x; - STORE_F pIndex, parm1_x; - STORE_F pSet, parm2_x; - CALL3 altstr_set; - STORE_F pAlt, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - RETURN return_x; - DONE; -} - -string(string pAlt, float pIndex) Util_DelAltStringItem = asm -{ -local string lOut; -local string lLetter; -local float lLength; -local float lStart; -local float lPosition; -local float lCount; -local float temp_0; -local float temp_1; - MUL_F pIndex, KEY_MENU, temp_0; - ADD_F temp_0, FILE_APPEND, pIndex; - STORE_F KEY_GAME, lPosition; - STORE_F KEY_GAME, lCount; - STORE_F pAlt, parm0_x; - CALL1 strlen; - STORE_F return_x, lLength; - LT lPosition, lLength, temp_0; - IFNOT temp_0, 2; - LT lCount, pIndex, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 15; - STORE_F pAlt, parm0_x; - STORE_F lPosition, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 substring; - STORE_S return_x, lLetter; - EQ_S lLetter, "'", temp_0; - IFNOT temp_0, 3; - ADD_F lCount, FILE_APPEND, lCount; - GOTO 4; - EQ_S lLetter, "\", temp_0; - IFNOT temp_0, 2; - ADD_F lPosition, FILE_APPEND, lPosition; - ADD_F lPosition, FILE_APPEND, lPosition; - GOTO -18; - NE_F lCount, pIndex, temp_0; - IFNOT temp_0, 2; - RETURN pAlt; - STORE_F lPosition, lStart; - LT lPosition, lLength, temp_0; - IFNOT temp_0, 16; - STORE_F pAlt, parm0_x; - STORE_F lPosition, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 substring; - STORE_S return_x, lLetter; - EQ_S lLetter, "'", temp_0; - IFNOT temp_0, 3; - GOTO 8; - GOTO 4; - EQ_S lLetter, "\", temp_0; - IFNOT temp_0, 2; - ADD_F lPosition, FILE_APPEND, lPosition; - STORE_F lPosition, temp_1; - ADD_F lPosition, FILE_APPEND, lPosition; - GOTO -16; - GT lStart, KEY_GAME, temp_0; - IFNOT temp_0, 7; - SUB_F lStart, FILE_APPEND, temp_0; - STORE_F pAlt, parm0_x; - STORE_F KEY_GAME, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 substring; - STORE_S return_x, lOut; - SUB_F lLength, FILE_APPEND, temp_0; - LT lPosition, temp_0, temp_0; - IFNOT temp_0, 12; - ADD_F lPosition, FILE_APPEND, temp_0; - SUB_F lLength, lPosition, temp_1; - SUB_F temp_1, FILE_APPEND, temp_1; - STORE_F pAlt, parm0_x; - STORE_F temp_0, parm1_x; - STORE_F temp_1, parm2_x; - CALL3 substring; - STORE_F lOut, parm0_x; - STORE_F return_x, parm1_x; - CALL2 strcat; - STORE_S return_x, lOut; - STORE_F pAlt, parm0_x; - STORE_F lOut, parm1_x; - CALL2 String_Set; - RETURN return_x; - DONE; -} - -string(string pAlt, float pIndex, string pSet) Util_InsAltStringItem = asm -{ - STORE_F pAlt, parm0_x; - STORE_F pIndex, parm1_x; - STORE_F pSet, parm2_x; - CALL3 altstr_ins; - STORE_F pAlt, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - RETURN return_x; - DONE; -} - -string(string pString) Util_AltStringPrepare = asm -{ - STORE_F pString, parm0_x; - CALL1 altstr_prepare; - STORE_F return_x, parm0_x; - CALL1 String_Zone; - RETURN return_x; - DONE; -} - -string(string pAlt, string pPush) Util_AltStringPush = asm -{ - STORE_F pPush, parm0_x; - CALL1 altstr_prepare; - STORE_F "'", parm0_x; - STORE_F return_x, parm1_x; - STORE_F "'", parm2_x; - STORE_F pAlt, parm3_x; - CALL4 strcat; - STORE_F pAlt, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - RETURN return_x; - DONE; -} - -string(string pAlt, string pPush) Util_AltStringPushBack = asm -{ - STORE_F pPush, parm0_x; - CALL1 altstr_prepare; - STORE_F pAlt, parm0_x; - STORE_F "'", parm1_x; - STORE_F return_x, parm2_x; - STORE_F "'", parm3_x; - CALL4 strcat; - STORE_F pAlt, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - RETURN return_x; - DONE; -} - -string(string pAlt) Util_GetAltStringTop = asm -{ - STORE_F pAlt, parm0_x; - STORE_F KEY_GAME, parm1_x; - CALL2 Util_GetAltStringItem; - RETURN return_x; - DONE; -} - -string(string pAlt) Util_AltStringPop = asm -{ -local string lChar; -local float lLength; -local float lCount; -local float lPos; -local float temp_0; -local float temp_1; - STORE_F KEY_GAME, lCount; - STORE_F pAlt, parm0_x; - CALL1 strlen; - STORE_F return_x, lLength; - STORE_F KEY_GAME, lPos; - LT lPos, lLength, temp_0; - IFNOT temp_0, 2; - LT lCount, KEY_MENU, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 18; - STORE_F pAlt, parm0_x; - STORE_F lPos, parm1_x; - STORE_F FILE_APPEND, parm2_x; - CALL3 substring; - STORE_S return_x, lChar; - EQ_S lChar, "\", temp_0; - IFNOT temp_0, 4; - STORE_F lPos, temp_0; - ADD_F lPos, FILE_APPEND, lPos; - GOTO 5; - EQ_S lChar, "'", temp_0; - IFNOT temp_0, 3; - STORE_F lCount, temp_0; - ADD_F lCount, FILE_APPEND, lCount; - STORE_F lPos, temp_1; - ADD_F lPos, FILE_APPEND, lPos; - GOTO -21; - SUB_F lLength, lPos, temp_0; - STORE_F pAlt, parm0_x; - STORE_F lPos, parm1_x; - STORE_F temp_0, parm2_x; - CALL3 substring; - STORE_F pAlt, parm0_x; - STORE_F return_x, parm1_x; - CALL2 String_Set; - RETURN return_x; - DONE; -} - -void() Util_NullFunction = asm -{ - DONE; -} - -float() Util_TrueFunction = asm -{ - RETURN FILE_APPEND; - DONE; -} - -float() Util_FalseFunction = asm -{ - RETURN KEY_GAME; - DONE; -} - -string() Util_StringFuntion = asm -{ - RETURN ""; - DONE; -} - -vector() Util_VectorFunction = asm -{ - RETURN '0.000000 0.000000 0.000000'; - DONE; -} - -entity() Util_EntityFunction = asm -{ - RETURN null_entity; - DONE; -} - -void () m_updategamestate; -void() m_updategamestate = asm -{ -local float temp_0; - STORE_F KEY_GAME, gamestatus; - CALL0 isserver; - IFNOT return_x, 2; - BITOR gamestatus, FILE_APPEND, gamestatus; - CALL0 clientstate; - EQ_F return_x, KEY_MENU, temp_0; - IFNOT temp_0, 2; - BITOR gamestatus, KEY_MENU, gamestatus; - STORE_F "developer", parm0_x; - CALL1 cvar; - IFNOT return_x, 2; - BITOR gamestatus, CVAR_READONLY, gamestatus; - DONE; -} - -void() m_init = asm -{ - CALL0 Gfx_Init; - CALL0 Cursor_Init; - CALL0 Key_Init; - CALL0 HostCache_Init; - CALL0 Menu_Init; - DONE; -} - -void(float pKey, float pAscii) m_keydown = asm -{ -local float temp_0; - IF Menu_Active, 2; - RETURN offset_0; - STORE_F pKey, parm0_x; - STORE_F pAscii, parm1_x; - CALL2 Menu_Key; - DONE; -} - -void () m_frame; -void() m_frame = asm -{ - CALL0 Timer_Update; - CALL0 HostCache_Update; - CALL0 Key_Update; - CALL0 Gfx_Update; - CALL0 Cursor_Update; - CALL0 Menu_Frame; - DONE; -} - -void() m_draw = asm -{ -local float temp_0; -local float temp_1; - CALL0 m_updategamestate; - IF Menu_Active, 11; - BITAND gamestatus, KEY_MENU, temp_0; - NOT_F temp_0, temp_0; - IFNOT temp_0, 3; - BITAND gamestatus, CVAR_READONLY, temp_1; - NOT_F temp_1, temp_1; - AND temp_0, temp_1, temp_0; - IFNOT temp_0, 3; - CALL0 m_display; - GOTO 2; - RETURN offset_0; - CALL0 m_frame; - CALL0 Menu_Draw; - CALL0 Cursor_Draw; - CALL0 Gfx_Draw; - DONE; -} - -void() m_display = asm -{ - STORE_F FILE_APPEND, Menu_Active; - CALL0 m_updategamestate; - CALL0 Gfx_Display; - CALL0 Cursor_Display; - CALL0 Key_Display; - CALL0 Menu_PerformReinit; - DONE; -} - -void() m_hide = asm -{ - CALL0 Gfx_Hide; - CALL0 Cursor_Hide; - CALL0 Key_Hide; - CALL0 Menu_Hide; - STORE_F KEY_GAME, Menu_Active; - DONE; -} - -void() m_toggle = asm -{ - CALL0 Timer_Update; - IFNOT Menu_Active, 3; - CALL0 m_hide; - GOTO 2; - CALL0 m_display; - DONE; -} - -void() m_shutdown = asm -{ - CALL0 Timer_Update; - CALL0 Menu_Shutdown; - CALL0 Timer_Quit; - CALL0 Key_Quit; - CALL0 Cursor_Quit; - CALL0 Gfx_Quit; - STORE_F KEY_GAME, parm0_x; - CALL1 setkeydest; - STORE_F KEY_MENU, parm0_x; - CALL1 setmousetarget; - DONE; -} - -void() ArrayGet*PARSER_TT_TEXT = asm -{ -local float indexg___; -local float temp_0; - BITAND offset_2806, offset_2806, offset_2806; - LT offset_2806, 7.500000, temp_0; - IFNOT temp_0, 24; - LT offset_2806, 3.500000, temp_0; - IFNOT temp_0, 10; - LT offset_2806, 0.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT; - LT offset_2806, ITEM_EDITBOX_SCROLLDISTANCE, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[1]; - LT offset_2806, 2.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[2]; - LT offset_2806, 3.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[3]; - LT offset_2806, 4.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[4]; - LT offset_2806, 5.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[5]; - LT offset_2806, 6.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[6]; - LT offset_2806, 10.500000, temp_0; - IFNOT temp_0, 10; - LT offset_2806, 7.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[7]; - LT offset_2806, 8.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[8]; - LT offset_2806, 9.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[9]; - LT offset_2806, 10.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[10]; - LT offset_2806, 11.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[11]; - LT offset_2806, 12.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[12]; - LT offset_2806, 13.500000, temp_0; - IFNOT temp_0, 2; - RETURN PARSER_TT_TEXT[13]; - RETURN KEY_GAME; - DONE; -} - diff --git a/attic/TeamNexuiz/menuqc/qcc.bat b/attic/TeamNexuiz/menuqc/qcc.bat deleted file mode 100644 index cc39c5d46..000000000 --- a/attic/TeamNexuiz/menuqc/qcc.bat +++ /dev/null @@ -1,2 +0,0 @@ -qcc.exe -pause diff --git a/attic/TeamNexuiz/menuqc/qcc.exe b/attic/TeamNexuiz/menuqc/qcc.exe deleted file mode 100644 index 256ca229845e548beb172518364f9accf2c6e03f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208896 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

    O>#~9=VeZ;G?<(X??%i_P_G`!0b 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%0Ak3B;PUG|SBlslwH39BbA+igc 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 whole plane -s-Add a color and alpha stack to mgfx -s-Add a current namespace global that builds the current namespace from the parent lists -s-Add the abstract Item Item_Selectable -s-Remove all ctcall, customizeable events - -*-Add ._runflags to system/item.qc - which will be used to determine visibility, etc. of items -*-Add MENU_PROCESS_KEY to Menu_ProcessEvent -*-Add MENU_PROCESS_RUNFLAG -*-Add RUNFLAG_CLIPPED, so we can select items that arent visible (but arent hidden intentionally as well -> scrollwindows) -*-Add a .userselect event (Toddd) -*-Add a multiline label item class -*-Add a real #include to the parser -*-Add a scmenu_debug_process_filter cvar (only displays information on a specific process run) -*-Add a select event instead of userselect -*-Add a system controlled destruction of items similar to the NG Menu's system -*-Add direction tokens to Menu_GetItem -*-Add layout classes -*-Add more output to the parser (perhaps also a debug mode) -*-Finish the goddamn design -*-Finish the structure debug output -*-Finish this darn #include support!! -*-Fix the _FLAG_MOUSEINAREA bug: if the flag is set and the item is hidden somehow, it wont be unset -*-Fix the init function calling the spawn function for templates, too -*-Fix this strange clipping bug (items plop out of the void instead of shifting slowly in) -*-Implement an embedded window perhaps -*-Make FLAG_DRAWONLY and FLAG_DRAWUPDATEONLY only affect the parent item -*-Merge as many of the debug functions (especially clientarea and parentarea) -*-Move as many constants as possible to constants.menu -*-Remove Item_Init - its poison to deriving classes -*-Rename .refresh to .update and change all constants, too -*-Rename Spawn_ to _Spawn perhaps?? -*-Rename link to target in the DataUser class -*-Rewrite _menu_* to use the normal stack instead of an altstring stack -*-Rewrite all controls -*-Rewrite all gfx functions to reuse the params for conversions, etc. -*-Update scmenu_debug_parser to also support tokens instead of pure floats diff --git a/attic/armour1skin.jpg b/attic/armour1skin.jpg deleted file mode 100644 index dc658acaf234fb6373fc1a3aff3d8dc123a72a38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12401 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 diff --git a/attic/armour1skin_glow.jpg b/attic/armour1skin_glow.jpg deleted file mode 100644 index aab380e66a54fb20a8510a631483be24f2d169a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1523 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

    cdHoay)ITiUqEK-?o-2$|8Q&^4-O!^-TMi2mG8! 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 diff --git a/attic/TeamNexuiz/game/progs.lno b/attic/TeamNexuiz/game/progs.lno deleted file mode 100644 index f9283992c3d9dcaa12fa06b4a3dbcc3fb836a111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125224 zcmdqq2eedG*7kb?f(nQT2#A54GXjDlS)zbQMlvEGNRVVeauN{}Vip5p#vI$6bIv*E z99r#e{r=C_bKZB3HTJG^?0&n)y|+jI#(d^n`+!ijSM54ghw9s}|3TYsv&}X~RM=*l zV=Hd6P3i5n*{0jE4ESH;3{9Cu&FNDunMJMX+XwrTJ0?2ON1f@TF7#1X`luUy)SW&$ zh`zV!OO=C7KdKDCA;BQ>U^9d&LoqtT7-r*wiR8mG9Kp;@Cc7zQnQEp{XD8;+%e=%f z^t#F9_#BIvFHWqWUm2_>yEWvsiS_gwgR{u)9I~7joKJQal4VnH5!qc#c9)Vb!xnP| z)m=$;*O1*-vRr3wq}~+VLY7<29n?F6yU234xsQ5(@E}c1T9REWvfG#JT9aKHa(i^`w$#P7N&bFzj?%SAaZVV>H|%xxjd6~R?xxhB|3 zmRo|`$a(HyEz6zE-CgA9Ui$lj2guRG^p6COk)x;R-P7b35--uqt9Z@4Nqx(_OMTCL zNc{w#nlGqdns2Dznjfe?n!i$iGbOfT&qGO+3U(s9oyk%LWl;|0v74z%jrOG9%j`p~ zVQNw9n0nL(rV+JCq8WXvIkT3*zT~J4eQG~u?a(RcOqOowZhBICnZDG6%>e2lW)O9- z8Acs$4x^4TW2xiJMC##YGIffXMxAbEQfHYt)OlthRTi10)D>81R#RmyPR4q3Dpk(F zMx15NrEW5Vx96HK!%$|!i(w?kxKZRW7#oZyM-%AX;p9A%SxZf2CewnW$VZ!b)CD-k z98Wy~i_B8$a;z|`sV8EsIhlG2PBmvx&%{P^4)r{oZ#Gdc#wF%5>gBk?Tur?eTg?sB zn{czajrt&-2%aRnr^xb5@EqAaPkzg5sLjBBqO_lHPz4?jyv-y?! zoB0Rz4^yH9*Gnjc9ZhL!8B>nBtEoV(WcH@+V`@;PR-z8Qt4nqb$kNa>qPnJJX=Ykb z_YK;R+nRRNXn*<+rW3Vu(3R}EkqcC(S*$pNSH6y4agHhx$W;}I5 za5&jbBD*8VQ_M8#^k4>gmYGAH8!R9nYnD<|%b3ZEU=?{yhPBL2GG|az8<@$);B4}_ z8O~>Rfw_b#mtl*!l6sZ7mb%s4K)uP_PL(@x7w$IqQt!tD<{|1Mc+@;jeG*UMCG!f^ zy+(dL@g}`{i|pPeyLZU$J@Wg(hh+B=*?mlQpOD>W4D*(p()-jyZ0 za%9;R6;a9TPL;|*6|z({dr)09vfGpF_9DBz$!;IAR1a#9qnh+lZThG#z0?mHl3io6 zG(ii~j+$!E?111vvUJMOg;`e|gaJ6j45Ye4$ubzjFgzGZcB9BLCNYkFJSGKG$kCDX zZW`GgMV6VE9n2xSdF119La>M|Yl5}p=p=esXVz0wr!bS#f-}gnA;VeB&dzWivn=N` zzc9Fn>@Fcko9Rn-wjruq9JM|B}a+YPx zR|KobtAi8CSx#bpa&QXy)Zlb-mJQ4|24|Dc3C<&Dxq$hm;9~M6!De!nEzGY7t|DI@ zTuaV!9rGK4o5(i@x018m&iu~cF7n;My<~SE`H93+^zH?+dx`8`A-|ezevh*O2TQk)xLM(h6;{ z9}Y}(q>nn$OK0>5dXZgUa&$1g^a}=%WgreUgQ+qU!^{Y(9EMS53{}QqVsJRwO(M$? zW-?W#1XIcGNb;Ou9@)(&%P}}EIG!vEaYC?&EQ_%uSW1>%Z1otuAoL&(ii1wj@fFiqssNT!Q4odn{cza zg(|n=Hgh{w?!cYqFI2e;cbj{taxWe*k5T0bJQX}ceh$x@SE=qba&f%Qaq_K+b$kCqk(O&e?KJ-!@b%O@vhKa`X(iF{13#zn4t3+%1qU^^p?TXNW^#g;B zWY?MOx{E%!iHzTO2k<8>Uj5Fh@GQmuwy2Hsb2}hY3 zRGDdJQDt`GXnL7r=2B&znNM{K$Z~9OJULoO?@l1Q#bjAxmQrPzSx%J|1*~Mvts+OO z>E*;=Ejc=g-mN1?C)1xEoIyUa z+pu+H+L?LjpbR-GOP{42b61}1Dw3tX(XXG<@8`d!evMr-=-1P)Qz^sl%&M5GRH>F> zPiA{(sLre=YN58NLv3IhQ>AH!X3S*Ypbc5tCfd<=z=7zFgU}Ow&=-3Djq6W#dQXn? z_vQ>_mO7M~r0>@m!fa?Tj4Z>05o8%@4x`E_GnyLdy*{aN%%bu1e*63FrrSy?oAh?m zZMR1dZ%5sJZZEQnx9L92U3IdnL3X;Woo;jIx4o)ve^;06>XDt_r~Q7?khN4JX08d@ z?=Pw?5-sVo?nk;WiSAFj4@K?ib$`m!ku~XLI#Z)A^tvDB>A{-leyaOuo`YEvzyGFH z_hr9-X4OHgi{E$CI)pX9Z>s9PI3_WU-c2C8iR4K+rZPV=IEp+2GlSXWxtJF$AV!Mm^-QNF0$N%d+|u{7+IbOo+8V$!SiH!5iglnsPdY5gDP(Y?~vua-~+OJXg;FK z$L3S2`E-f2WWBL7(M!=JJQx zc3ZCfv3*d2>~fQYb(}WYqGR8`%&8$(1EoB3+TdH*F<-E(fiQ)yvX#VeY1qvmD9XO(#c3(aTKC$uO6hn@5)UI6gRmEQ_(k zEThVbU=>-`n6*?{7py1CDaPNob{f5$5u8bujpi(>oNeO!(#~fl7Z`tE+9rCr*jz%D zOU-7gTxPaV)mA8U-$nu_fpDG_1 zy$4P{G9Odr6XWlV`;1;bH(yZY%it?=mamyd-_S?j(#v=7>shaRv%l|?qZxD8ob0l$ zBU`fWT9KoD>04uea{yHi3_6o_ZRom@`{an%gnr#OfMbVZSYkN68%dVKf>C5Qn(W4q zWgNx_6UmXT=iHHGH;wG3lbx>j+zhgtNp`cyZZ_HJn$XQBr{eYDF|4~|$!;OpEh4)m zWT$J%^m=jyGw0Wos;i8yDNhX6l6Bn}ZJ>8&lHEpfbQXPdHhpvseRMAU`G3NN9Ghno zYocq}ESEChTm-+?Rn_&byNWDVn`@|YZDK3ETxYJQx*N%IQ*ayk4s$2<(clU4lR2JZ z?w%pbb9l+TOijJQOkNFMBg^Y}+q^?{?~>&`^FCGA#h;lksP0R0^cB5)ZN8z(x8^(Q z_rVWj`O*AD{cDC_n7Loc?r&uIyZN13YTKgi$T87Q^s=)lO_egHEH&DN-jyTEu8H#W zQX!~FcDs|MvZ+Fqs%8&ro;_J}jmS|GdTDB!QKh+QL3Pu~ZU$LqnpsqtZH}h8h2+Su z*J547F`{cY=ht#enaMJ&3Qi=i&2bWQcQRQ{fv(>+lLhB8C*@iHn@(gYpbo2GZ%h{7&!bce{{Xd9uI9Kdlv5a}~+1 z64~uec9qGl3faY<70}NN>>cQ52V4!Zety8!Av^snfiw;DvjRh*_v!ol@l_`z^uBso z9;_fcf4{xzs^CPj-h1y(BD-~Dr}ySNe~-TE>Ck)h-3GEdlkD{V{c{p}FTb2;&Zo)+ z=0d9T_x!6~6x=|T8*vBjEZ{EI+}&ik*W6Ea50W3jqru~3c{0aS%(Fbh+&xQ{=gjj| zdBMC$m6y!RRC(3BL4DJ_P5rap<7?i}@By>vLwfln@hQE07JN>2Uy|i3^EFkzG2c<$ z59H`4dimM>l`6lOU#YIt_B_U#ov5<2DNU6!rYzOz=R2aY^wBta{k(^M#$%$<&v;A; zrje)TIEr~RgI+(^;q>zza%`ZV^YEYb(9e6wVxyn=aLdWEGSJU}_|JjpXF=p7b28QG z=R)MPKtCViKO>@_6OprwepbZkXGY|LU=vyN^CRw3vgqeXoPM4}t_-dw%eBFEWYN!< zIQ^`N+!EYImOFww$#OUD3GO5F@bQ0NWnUc)k@|H=Tm%PhdKENmV6rU&boaASe;11~5`F@Qbuk-zS-)m`(7hRKA zgI{CsO-@y3CXLZNhhJy6VtwBnt(i+3w9C<+xg3BFISynl9nmF6SLV_k2j%F&TzaBU zj=s#LANuDQz+4W&pd5pl%TNrPxW3kb5 zm8HQl@`_+3IX-t;O|R!KveukLT^IOsmQ$IXgY$y($Wl9Y`-7 zGjwL=x|2nZJ5G;3eN10!|KJd^9BKwp-C(i|3r3LLNU}SOoMklgEMu6<_&?!rj?FTO zxlAs?RMy>*WH*g0)8XHzRrT-9s?IXAsl_puTfV_lBN3Be+=TTGTEScEvhweRLLmmUEcP`587bE3S(;*6A80UZ-rPPx-Y=TCe0-cNN)P zOO~y;F1Ug0ZY0Z1#T2i3Zs%+6%<&iIa(5B#VO{Pm;C|M!Jit79h~7O+jvk?p{MyXx zBEADlrpXOS>xM)E>;7uDRV_qU#yIrl~@%YWAQ?HM1vG_A+}@ zWgk%h$=lyPpZW0tKRf|Okb)TZ2D29zZpQ4 zL(D*`9BKwpWw04Sm7!)BRfe0o)M^I(5nL?GR<|wMnFtey~ zw3$bh`Q{j^9B&p<>b23%dn^UNA zsyU4+r<*gVvca55m5t^ss+?`kp~|`DJgS^;E}+VVW)oE|G8a?j5_2h4Hk-?+vc+6Z zl`G7ZRJqDrO_giRwN%+^uA|EJ<_4U#5_io$8$W*+&xEjFOuCWWcNDRy+wBKlHCVn_c7UhMs{D4-8W?SBia2- zc7G*rzwJLCOZ9kK2I=ElMP`yd>>ZAH!nx? zH6-hC$@%w~RNDsok)<8u`+3=)@R$H;(KkkPpWZIrQ(OP0cZ#`B9jGnV6NB zO+P1?N1l&ka9psEd;%5+OUSY;SWeEef_bFZhqJ6=9<8R&auW01*uP|VQ<<8o!fX%d zT63?UCRu7F>d@CKrurOL91S>58YXo8*%(dHENDS?t;o)=FIC$H?Z|F_vg<&09m%dU z*>xpLH`ARe2bmsJ>1ldVrMF41Df=@YU=E?mKyxTn2ARQB8DfS~WtcgPI?9Zu$`~`2 zD&x#}s!T8wsWKT;%v7ozX{J$Sx;cs}GtAM{Ic6?Z=9&3aSzwN#%0irA7ExufSwfYi zW+io%SxuES=0vKTjP*v>gmS9cKt0oJq>8Tb{Q7Pa`H~!$GEe#ST&$OITxtum)aA@l zS1?Om$t>m9g|S}Eaj9#W$&KbFs@!aDrOKTqUhmz{EP8iZ_yhwE~ zkza#fzr9IzZ;{_OA5gP=$UORpUOvWG=40K?d)Imejh?=D_^QZ~E zYf6@8*f-IZ-nApk{^kIxbjWZZGx0q*)=tc&v*|*W?&ct>^bC5DT_3VLnC$wK-2k#X zlsqUHOm;)b;(M^_@WcpuH3vc6$GSP{F?S8f&hNWv&AY$qeyjVcYeANlrWI9MqkRE>Klb~t-)B4VHQfT; zFMF7HpH%kyWN)&h_e;MI4rEPqUvxvre!uhkoZrvVdKkx!##qGtE4?q4X5IPyrcf=% z@x>AEdxh?Q>HV?-zy6=4z18oVy6?%}W*@3lH-10NtA77f_5HFo*=g?-zt7eu>wbBx zIgTm|u^3CtGU`gKGHa+OVVzk|Jq@ShtQ==EmveA|xsWQGf{Vyo-yAt=%yZgxQe)5BfN9iBS@g(!7@U(e`n&nyM&zl#i@>1|J zSzZZVCClr<8{|B1vG#W29eVdJ*}YG8ACj|t%3MARz97q&!B=GW4LSOb-u*z%@+0$K zf?vtMnZHs02)5n!e|~nj1ljFCmXf9vHQJHh`Rht$nCW#R=dT_4_tN}(XR7IIME-p; z)qPA2YEAg}%W9KdU9!|S4XDmv+iA=!^6#O=+Kgjbp*42q@5T9Esahr|OLlSpEXUlH zCu?sjVRoQO$sDDayB*0{c4F@QzcH}GWRP_+ovS+8l* zy|oT=scY&{rM_uMb&beTV|v$=EX_=Fs&O}KMs1`hc#E79MzzAemi;f+e@`}!f(5H z`=z&Iye+eC)8gE=P56Ba@!LGDe%r_D_XDqfe^A}G2=V?B?Ypw@5PfyldFLIvVthqkqJbhVn2b1&kW6kv^=NZ77JA|BPAZzYW za-Kn~xxwT-Ls)Y|$$5sc=7y8=j9|@;B zcCV1#t7P{Y`OOUPFq8Mp`_vB-AJWUm1$@Gqd>VX4F3MLN^9{boFZdO|;UD+|+izQ# zo-gQmLFu3@c^8y}zo+a#a<3xvW?lNAuhDDH&VLrcUxPlBHN6HsI2cCO>(3)G-b|pn ziR9>T`bh;G!J14qdhNQ9BU#TgjWszc(9bEjqsj3#@%i+}7`+Z&lG~#cb~HOteUF?$ z_WderZ}L4!`_IoY{ukME7%l{;OK( zIdInVV1I9<*YtfP)%i6=&yD^0v7RIAd9j`ki$5n;_2o_XCOX$fB}UV`apXwnT|D1nj^~}9XYpL~b8ZU1hD*=Ac&<(7xJc*KZ0Nko zGKaaFOBTK7MCaX7vy3Xs%}T1Q!jdqO`_m+5Hj$_5&V-l;s&qUSVXOh-RtQAt3^(D=$#x*48X~bHV#>`s;Ey;OWvF2KnQ+h9s?1v74-g}cr@5#y1 ziFx3(%B5yA zHOm&}a=E#JDpv(pljRz7E%m+}_cM17lHJ4P$M86w!gB>Y&zigtyi9(@yh=^I#_TQg zHZ{*XtjW9huz-(PlTXa2RQEYqzR2+<^KXM6$Ug=@lT*Ji`?Y}ISd+iy_&f7|VEgU= z#|~sEW&GcA$g1(*b?|@BLA6|t^2{ru5_V5irmu=>*cP1FqF1^Db5dm(^m(Zx zFeVsJo{*SCe?%hw`xr;E=BAO4$}yX{fA*=@In1JY^r`vGvc%6#UC1$67BP>O(7R=1 zx15}36>I+QZlwSA##+|$oXpz#;8e0ZjhsjSCdb*qxn$@6Hb+*ykmEK57n9v3;J}w|N9>PZ+!fPV;(RMQsp7@FjXEgk5b)Z zWcN7PJwbL)lHF5e_cYl(Lw3)S-E(C3JlVZKb}y3MOJw&l*}X!36|d!ZgSotuc%S}* z#K-iXBtEDABJnl-H;M1*e@OgH|BLY#4!1ACb$d{fETzm&)SXcpWl$FWdAjAvqR-WJ zmB>;#s7iL#$Zjukmc5x*H#Mj=O&w}o(}3F0G@<(E?xwXlYb_G3=%ux3OO^f5F4&*k zA?Qf%9CRgj4|+9A44q z@6HTnljUfm&*YW4MxV)hOmG}ojyDUba)MbxU20ZR-D&bG8Ih87> znfO`0XEKwG<}9k5ZO)~-^T~37xsWQG%*9l9DOom~%c!!&TtRhLk>zT04OR46z;a!1 z16gh~{`tT+)61>F?PR&b+)0(cn7gU&Ub5V0?x)HF<{|3C!6Rhx&l!G<96e4SJwY!| zny0Apbnq-$o)2Cm%gg3fs`zIXze$$2&AU{2-+V}wkAqLhf5xXA?>;9-U(mZR$?j{i zd}F?&%J=3+s>IJE{)PTm57o@0&7q_-EaYDkZRkDM>Ab(xwbm^m)O%1r^E8 zKP%X471rDyWLJ&sp9P%O8m!ecwW#rPezS5Nj*+^7J_opQ(3C9AjDH5OYAdrZRoVvr z`M~=#I{+O_`nkYem>+EVQ$?Q#JkSiHiarNeh9rj4%P$l4Nqr%W{z3R=U}dxPd&yQM?D_?8N+E^%-S+6#|o^(Dy$ApB+E%= zJyoAGd@4@I29)7$EoBqs=%qY%OH`mwRb&=bqOWT9phkPr%ih@M-&BLIPt{}=)uNAT z)2He%E2J*#h16rckov3_(t!0s8nRwUBi0LP%z7bBSTCe0>xDF9y^!Xt7t(_DLRzw3 zNGsM;t(i$1vmZ6pj@f~x6SWJv2HnW6JJ}sXj(X6$o@CdH?0S=3AF}I9b_bJPf3h1u zc88Fof%NWBvKvHpgUN0P*$pKhW=2z^vGmb+`e-73G>QHQa};$(VitWgo8HYK&x77$ zu^`ZElgHwC=(R|_4!Ojvq`FmPx0)<#%v!2DiR{*q-Four!5L(?fqYJI9yxUZvpkzv z%X2Ynaw#?kTga&^nB}>OHMs`Y2G@~OH!#a{6Ki>HVJ**XtjQg?Gq{VKx`$bw`&i5K z0Bd<3Voe^wqrv0k)RWBeJk463XIabhJZthIUJCp@9kIT~dY(5}%kvg%dEQ}7-oyL& z(0oD7@+I@=YkK!BS-v+vQnUQT-2F;U-wR%H+y8lA_`i}%@%5=4nN=u4CDtW3tl}#0@)3su$ zU`MjsiR?;~%Le}6p_=};`0uY8e_#LoRpalk|AuHU`u#B&({L1K2D8a-F4^fZ&CMrg zIhOeeSZ0<}{c%loRj`H}t)+J-k)0mTqEqPQ)ZjF-Yz)pOyK~6yT(Y}_d>ps^!XhkY zU6usP$k9srl-?t8BCf}+!5!q(UzoWE$XOm{9z8<;xOsvqPX^DB-LvEu%q!F^uQGol zc$1v^fLWFgnSX*$&1Y2k+-0ex0z0BTJ*~g^s?NDDMs7X%MV&-a- zQ+1gYM?H?qQlEKI8goq3Vz`=Pwg%Uc@4&qYe?8t`dw+m+dC)vW6}=8GkC;cP?s0PJ z31%t1e(#;8JJKfa#-KK+Nmr{vG!ug8Byj`Ujmcft2$ zr`Oc~U3%?Ze#ds(|I_wVDG`(;7gCD#XlME|C}%2ArJ|`q-NRI)%AUbqI8MkQ3HBuX!Lq~s{&fH=Gu{Ee{?VhQl(?ii5zvNm##rKvg=NE2a%&5^wQJx zrb=J*`!@{XYh@UQCq~l$E5`73ZY()9j@g7FOlI9pC1*L3xlGG3ow>{`!YtM$zL#Jw zeV%!&xns#iIe}wRiXR5y$)ql#fP#}vmHjw_Dw92ZTXk0#RldA2KAbk6v> zq8gunr@7F1ROp=Y=gq3|IkR##>>22JbQI6SeOQy~i04ksdFPOyFNLa~N2<+D3+kVt zuS?H6^?vSo%{nL2*?xT8e}cYGQ52n*QAc{|Rt$bFdi8U%Q1$b*I5nQT$~t#-ejb{^ z&rz>BPlsVdFp?~J=j>S4vgmx86ig;h#Wc*oti){kEOVI8!vgsCu~c`49vh{c@pHC3 zeY6{Wo_HSX9Ih1XPIi^at_rzokagZxV_p3G)p@JO!Yp-|M|J6=di0S$W)`aPT=(3B zU&j?X*NeO6`@p|jTk+o&`94snw&8336a2BaJ->cY_U9NE_k#}1-GSuD_lmT3;yCfg z`}DEBD{HBq%!*Q+JwwOzE+*e!`g43VfIiZmlSS7Cd9)8{|B>N|xF^LtlH+y^{@eS) z|K|QslRt;6MV74nLbJGE#O(V-p}paMd#xe=J)*s(Sq|+HEep`OUg$BtxYxt!Ins?^ zwW+ z)9UAZdY<>=Yn(sc#q&Hb`+4s*J@5Ve&#F4l{V`9EcSXrN|NZM7psd2L$UEQsF)%&n{*%3*!>#!5^Yc@+Z4N&tbsp+5wG;d?(`#2|t{Yj8 zm+`SM=7U*_`q4{zu4eUq{`xt4C|@V(dF$t;YI5FnS#}vmLjw_D&92YI1kB*`LvwK6{exP}Updz_ausblS3!imY?HjoFXt{Jd_@tPq{|9nm@A=X-bN zI^U%?;<>Jzp6fb?bzWu}$~+oIANjdEf_YK=eAe}>j5hwb>W_zheotUs{5#q)X^YpLnXq8aou)6AkuJh$`C;kg_q^Md(gw}9+)Zbrw_N5|2pj%OAvq<4$R zZUwn0D>1_TJmpz)S$k2|epH#SaaGCDUi5Bn zveZDl_VE2B-A}x)$MIQwUunqte@kP2FKLDrIa)H$qJ5}sVn2G-@Ar#tPC^5sp5N+??I}EB}UP^G2|>`nTzjL zs_8y;I5RoIXrGFEQ&yhJF_P|6ey!pAldATmXg0lz*AH=D$;;_plh?=nr%+zRe@nEO zK3YP*W3V$>dxQ9%puND)dDYztsKA=b+6#7PJ@S1)wF=_ium^oqjo$4^7VRDJ+^R8PtJ1yYvTJzT064VDWSb3 zkM^2gL0@t|)1T@NA;;(ao+=BCpQAb-WvN+Cl@(?s)vY2&Yv|pHoL z*{r9^DZ#1aET=PXb2j-p7 z#boVk-B`=hlQr=@uQxgBLmz4XJEQ>Zi82^N5<}^uVf4{(dN+bBBh6t{H=3N%9y%$9 zUn_Z?%yC7T$}w`J@oT5)^m0_7eOG3hSyVTh?2aZ!zCX`pF7wQMsw~KGEHg>>UhTid zbpppmOX-WUjAM#pImZ=8-0PLK*PnX{<`(EVL_n)k){bxd;y~y{NDP&3a z6yIA^ry1=dzIUkl-r?2v4DA)#Biu1$cN|$3C(?7=&(jqgCo2P;kI_2%^}(rRcRD%G z8LYW8$+FR$MRn(s)9as2%u*LKldEuj0XMTIw-m#z924D6FL#(bsqzy_fXxv zFNS24p!&G_1JW7?v%;VJ5lgy&0=;ayn0`+CQmf>|~?oG11jrZ`8`IIVO zWcZSq`-c22zEAu}|4T9a$}z?98^;yLKR8bQ2)5n!pPvyL>vqhd?deOIov5junMI{_ z48KQdlr?(nDi_4Zu{4+GIJX;Fk8!RdStR$Wc{#w+C7F!ahL_va3m!_;^;E zUh1K7(1cuE%{VsIoSC!;T9REWa+cQ2r7hY8?a6L`@&Q2yvh&Bo^f9p$#}rpLj&<>| zuNQOIo9z0MPe(WOq8*ok5N^&_`#|M;qzgS!8!M*(JY}At z%CqKqs(XPPy-4p~Cd;cCUSk&N8bRJNx?XValH~(@{4e;FuaVEqS5)~1KNQ1{98(-W zaa?iy!g0~B^wHnxcM3|A%a~oMQXabn707uivgRt0^X$%=t4yvER3)eUIzY7=_6+tS zM|;z|eaKQBwS&6kEcKa7Lo_airW_;9{uj02*OGnFF6cm(15HP&bTXZ((k19hmTsmy zRSpVzlBHLoH@)-;`jVsm^n-E?VJ^cGBj}5A7{|C#WH*}Z#*p1uvh!;M)d|5wvYSLM zjwu{>RF0XrxNpV%%J(YmQ_lCRy_mVZ z$xz8>|2l%+O(u)>EjN`cM+Vc#GCeqoEHi?cWSJGr zCd<*m9J0&}=8@$XEDYj4vV^%?PF@kLCa=M1I6cD#W@iRxk)w0z-Ff6o%%xP>jLXax z>gBisS7x}H*)?V>RjxDFQ*SUgQg04!A>U>0rpi6I*W5?F9}nQc3=cDV#5_io$ITPe zC(TpTXM$(RFBRcs)?dl-I`imldU-c^pInp=IL3WM{&#)Mui-u+%NIrXlJ)2tdig%_ zH~Q#zdiMv}rQd7Q_uFKL4Enc}v&8SomEjnt&ncGj!ER)U|0eV9^sX}5`MT_IiH0HRdDSgz8KBdn+E=u}uLbu{;Qf--KY0q5$HuM33{yk{v zSU@M%QeBuy*8;k+7R7&0x(91fZ+e&YZ%OxMJvx{^>PPPmAx8u03ptea?YPg&4k#7u zNS2*)?94nWOYe3eOF6SE)m0?#5$s8Jdy}IY^jT^%kLuB9X~4X3(1a|_3uwujv`Oqo zFMjQlRdp>S`xkHkYZ9-I(tIH6(y@TftQDmT#}uV2#}uU-#}uVI#}wrtjwwnHjwwn{ zjwwoSjuF2WEKcpq@pAB=;Ma?T`I^)aW-`o-pr%GLlhGK1aTuSNMDHe(rv^uoWjfMp zyP3=)zrLHzJX%1n>o>oKTSP8o3G1>9%gqX^tTL;qvc{Z9m9=Ia)tyXs>&ek6^m1B; z^m_43j@g*u9AuIYl~wKjw_C899JCiGeHVvzjiIErq{K3eRcl(iX*)y&g*OO>lH_B zjw=pbKQ}aus8PITj=4F<#m_y_=bVVHX~nN;{dzXNrtQQrsd)X`jrAyAn|e;KPj#K@ z*Py!g>>msur`Mpm&UAyw>F1yfW#)#FhX*6bBZI@pqcO&er%u97oO(N>G|HeXc0oDp zit^YE6`*U-O4uF#{k^K>J+LSC!rs^i)lmaAQ495hhUBObz37^=Ia-*O)HWvlURu1a zEWt55n37Z}Wp<>B{+#}2^*^uwnf=f0e|G=#``>~8J^0^+{yy|~k@fo)_511fOzH1Z ze~i72Fvl&^xpWptf2NckWHP?+C z^`uYrVfJVB<7*BzgQ!v7we1j&i-yw62#hgfscsxuCc>|2RVSM%)FaJw>Wp9(dA2#4 znwrOKJ{Fi`sHug_7MaCVS!$M1-Da0)p(jozJ3jyBM{Gs$O} zi>Q|bmyz8Tvb&t@t|Vu13fwF+~m^VRntuiAIw-lP2|PYu>Ydr@)rqq-bd-)J9@My3f>=YMnP z+;5F`*gxnCnH9zN6tCJ>;(l^9eV%JrldU)Z$m?g=g=b7TKVfgD7Wti;}lp{yw z>7_#8&sQrk6MxQHnOxlGt9x>6+3_4=q@C@%4pP%$=Tl zxz=R2A6c&{r2P3nk*>b7}n(2KVc!qy2a$BW(9Rsu$mm5 zNS|dbb2-VZqsqxxUxZUwm(vnw(Vr8XN6vBqbJ>K8%_Y?TEt~nZE-QvD93xknYpB#6PrvfOBHp~|g^+vw%?;0|(hC%wCiEcfKNm$}?$?x)HFi3jQB5j>fAie8@1@eFhK zEIG^b%=5g++DpO9WcMmLdY%4F^Asv|Z~A9&)?rrH)T6ri`IiltM-AznJ_j>uLLa4{k=cy(EX|p_ zR%F@Nw5GZ?WY?A~?J~4ymS=y~q=V^1?UJJ_^Fq3@p6br5Cwd2c$kD;{($5T_xTvYK^R7A?8^gVJ?sU7d_7JB~Rg*;8}9?JiU8?EH9dusPZyi zDS|%dS6)xNL;rpOAF$>=B+EzUV`}O%W?u*2kiSiQN1x?;=2?DVp5;g8S$<-kLH4GY)^E6>inwgf=*1>+{_JKYZIr7g)PHXy^ z$({H*>5MK#=*qfuPxPVZ{{`*9y7>3acO>s*%2A7BSB`V#$xW8Gk5!wqYm^@M|#(Z z>^hTO7jo2@^YE+5mYfXBcqjjKj zFP?8r=$)T)vHE$Zs`IOD(2nd5ApaRUr@9$GFI0OJp%?3Yp!3D`BfI`&833I#gE92^L8%cxjUae zI)*;aajZ#tKF40?b{;?Hy{_QcmBDIqw1z&)JkBijB(vygdU@77 zN0sLjFVIIX(nl}RM=#UME9On=4vCWVZb!2Ald>ppcB4uKQ;{l_Ox!~%GjmnR;(LhK zy_jhqar=;?8uU)r0iu0I>IU`5Qr|S7O2b5Bde@BH68k1v)4MigIS`!^o$0gq}HYWXv{V9sZrdgvi7BA9KSqRL0%QCCc8CccOv;;aS~sbTF2~v%W3>ta(dzn`qTzy za%PZT1I7Mqjyo^V_0Gk?rQ|G^GtY7bbGfn@uHu+~*EReaa;@1)mFvvS)LYH%RCfnC z^%rLDZnC?FoO*!SBX|N&Wq5{JN{=IvKYqN#TwXS>P@`Arqu1!8*Xg4-=tYk)@(y+g zN|9wJ?3|$tv;UTI{9fga9?RVBWT^^0PUSsTRcB57ajGWS)gni=>0NOizZ!77Ye^vL4ek>z?Bv=F$VbOdqQ2OO}J7$2rlpvtK_CCJ(_- zGmJVMdR%j($!-kUjU^YyIF6eb96_EE97)bHlX;d|%w={l%;6ZBYvxg9zF9z(V}fJJ zksf2*Lb5x7EQ`!y>XITXWnGphR?^EVvzEHftf#tD$SFNGxHHIZ137gzv-5EgF3GT& zS!xTj=n8td%3MvAYZAUEd)>-Z z=IP3sbc6PsR4-=I+w`I4>C2iNjQ(aIRSv~qGmKh@_NtNa{b@W|d(9+F#k34ZF-y&4 z7R{!YIc6?ZeE;z3`-s;C923QTMcMZi-%qrE=`hCG`GiJ{34}SZ%W6gCU ziykvXw^e-X=t1v#lErVgv=+J@b=&m|29V_t41(W&vBukR1jmemZYy^ z(63CaqK{V7M{DR)Co+?DI5}8Pj!vULy?`@VlZ`mr=y63ZHhPS?G}ugzE~A&r&6QMl zHTfD`i>>B5s$7qoaI?9UDz^uBl65_Q7w$3lQsqAL0QDjB2vr^no*+Mor|`6SmMYKT zMe{P%y-Iekk>w5OTKp}%ZQh~Ed-y2BC(PWZWceIlm@ldBYjX4>z5HZ;rpjNC-o%kXz*@(=SnRsKk9vn_*QTXM7=eU=i;BfWRIG|B{ezjAr(hKd;~F%!KXS*qmN zgL#caZTdQ>i+V;s(veR4Dr3VYgw0*%sQ%^9K`qH>OHq|syU6C<#gs*&S35~kmbx^BU#QeXH(_ez~9e% zKC_hG)0?`GS#%M-yO^B1l$mTcmr><%a}_nJx*gZNs2S8IySn6trV-Wo`wp8hlk~lY zEtyFx)0!%6%zjj9m)M`)`FjKpWac`OrL*Zub=}C)J?Kg9ZTeE(!Q@nbX6_L3z+eb@ z1V&?QhVjf&6PZPm=w-5*LY1kB^gVpjSdXUDM@P}i40AMfZZMDR^!__J#w?~TNi3yz z%gJs9Ia*2Y^gcOR6P!qPdJmnf!^y#V^69|_vOAM3{@%H>$Z~e#9D0fGt2>Wg&JQji zyG`UQ7cqC2kYzKjFjrIky>MP{V5axMxm(D0;;!Ica`XWGgF*WKv?o}L?-TR<0`nJx zm&x(HVXxA=*U0V-vb<^DqRQLByX0~_yi56@0@+m}yUJu&mF%jK_e32uM~e)tn905w z+Ax#08QL+E_8AUfCLJ<#WG0<5_;cQVtQ~@ZMHs~T5DZU@pm&FnWwaSX9iNy$?+z!+ z5oR(q>v_*n%-syK%nJN@&KzcLE?MRW3&?V8a2#1qz@iLGm_^IzmuEr|)QvyBj zaA%OCGwIz~TE)SxRzE zu@iPiyq;Gso2W{!>u{HKz1@s;*PQHHlBJbtP3;hLB)d*z>5aaoA9X-5kUS_DLXOw+ zBj^tcbS*zN7*9StID+gZlf|$1{hEIoGw0X)sx!C98^AD=~oh*Nt zZMWll5@tK9lt3BwDk*Drp_W5=RD@r@sOlQV?L~Ig$u)vnWT}ICK|``@M0SnIt{K_2 zAiI`i*%z&YHsp9sr0XDQpWy&z(Sh{h*Fmv%W}c@jYtk)44`yyCS%wEA$RmSMWL*cj zapVcX;bdL+WSPobrseQ!BGnmx!c2~pS(u$Tn%>PJ%Ywu)^m1I{czU;xd_rOoy<1FP zQou6SWO;@a%v^firG9k*@%zRna$KI1Sd(?;WU8z;erzcKT}yUb$?iI`yOAuqj?-Qsl}u%7RqTmidUklb|WtH6y#`WaoQ~s_!$Zt%7~YlI}g)fAaRAcC1O( zUZmOnK?kzyNOqmbt}|J>B)Zf02zrvGm+4FGk3)h%r;$EeESTKehjiaAv zCQ*xW1jopf;7D?DOy{^PGnk9^t~|b{9nCR$=CCGn3z)~6%rC(AM(u}rj%7{K{WA8) zvo6{<^Z0(cm}A^ha^(AF*50{-V`WvahU|PVT+i&Z#2NI_2Kqc_vX*5d^C<3>%4a9e zp^wg`m-B)P$+F2@M3qZSx|bH}x9~N^btT6Zauw@&uK7Q$-3hqWbKCZDQE4zlL@G3) zGDMU_l9WiM5S2zz8AB>Vsm#fgDY>OcM4BT>0||*jlq9J%ka;Mj=X<{Ib=~*%{@(vu zdvia>@qCW+ysrO$dyeDTYqx%TuXU`4Yx(%U+qv>(zCIuS_dQqY-~3!Ab1j!CT+3xD z*K(Q0wR~RTdM?wsmSraUS;1`jn`Ryb|3$b3S|r{*(qnORQC z3bT^TvWmT|4%X7$H}v(vM!I}!z9)Y$Ka%n*elx$5@<*_lE?e=J*`Wv}j~%&|Pcg2S zGWr|HZrI(FA!QGtf)8*jc5W1^HcZbpCaMU(O zl5$i~hwkdp|E~IcO<^_Q-YgB-XKBPN3|e^~o#^*y}ud zVuq90ogAD(Z-(YL9W6{t@=TnAb2GGJC+BBq%}&~&ZK56X#ij$9r4xIdWxHm$j9vHO za{86H8a;8Xxt{EWKIog_Ms|{Qp6kb6baoq<7{q*=xr5B2Guu75H^Y7G9ta+yKa5B5 zIEI|P1<{67OTG1vI>uX0K7 zDcvolyD#YSW$+c{v5o8YbiY!Z%b@vPM?#D z6#2i;!$rv~#o3pDKNoxM!Y)21`*X9>pP&7CIp*G6*K=|C40>+X^YQ^14rJ%g%`x>H zeNYBHH`g@&oSg69@~+%_HLeSK(d7oyo0LALFDW-B^jbl5Gjntcv+GBf{^nLv2AEv$ z3A&x@a)-H-l)KE`qzp0lk#fIzfRqQ#P_iHob5Har^JBp~CyNttgJkn+A+NXiFh5&4n% zn3PY<5>l3$Wuz=OD@gYxT~?Z}NLgi8ld{IFBi#nN+eH69_<{ao;#X$*-TXni&2-sf z{v>6q*+$BCNNu?mMG2~?aUmNWR_B(xi{5~-A(9c`jgSE%rXdB@7ubIed-=|lD>Z{zLzWQdT*DzpDqsudf%77x69wd zr5qkSNq7FJ7ulUScIL1nd$$ukOZ@DwUAQO8^|@dE zSzm=oeg0SEpYOFFdsmU}^qF6Ubs+afRhi|Wpf)`^l3D7&KdVch(RDoZxm>wEi>ndW z+(~pfIcP$c_&HonnN!W!N%O>M%%acj%F=?pYe_!~=b7`#3(+Qrw(Q--^r$_v>qyVi ziM{JezclDZkGeCvE9mYjdUQ3j>q*aYEqiwZy?4-;9^J_7`qKyGFp&K}bsJxMM-F$g z|EKQeYX|3WFZ+M$KEC#W93EuWZYABVrmqRs(%m<7w~p>M(tpJkY{g&Lp(xK^K~Z`!6c0+!T}ir> zPVCBDklnaP$|Uw=&ZjKb%VA%$A1M`0B~tcJRAH`as*?pdhW$zxQXL*FZdz@a7Vcb)Y;oKu55+j+P#q*dLOrpEVbT@_W zrqbOsx_gx_Gw`~3gLJd$bIhBhn@4x^>F*@oV_txTi4U1&5k5+M!YoU$6wAzV(ygGo zmGrNIujyIVu#diBUZ2>={9WRE<{uM3Gyj_Soq2QOPv&ij?aa}?U$`sA^Ml!$l#)5@ z!hY8r_GDi+u{X2qlPJ$D6%v)0<$y$GW~rK}&MXHfYA{Q!#9_>G1dhVdI3}n^*WcOY zGSiLBr3csKa&sl=uA)cRFh@O^qwASd>EHGHa!+(4bC#RfNBx+i{>*YK?hO2I^11RJ z?#*&9`&@=_ZI~HO%9D9K#WfjWo+f3ad4_bO>CqTw_dGp%fjJt>9KFPxdYPT*bpn}~ z@YfE~^w$zRbG?Qzo&TPDjV?11dc8pOnn78Pb8auX>}|@CvX9x9jLI|1ex?HHD$=D= zpx54`1DK=A%vq|imujdU97L~a^cueSYxY@rIM<{2x_)i0iNCIY6kY0|o;j9`>NC6J z=+eL(Pc}A9NNEbaj(=)!8eR07{u!nv>Gb-(oE@A)cjwZjl{uf33ruTLF3Qk`owPOW zNT=8Ty9Rnq-}RtJS1`M)=uWTqOV8k1y7WSC^eMoNT$h`1s~JEJ#BI=P=+Se`1sTIV zPOraD3?|c~Y0S}d=IAx%Xa=*qp5YC4GRw>%qq)rayv6l`%;TQD{gvE)EnE$Cy_}c%*r+j_%8FOkWyU#N$XBU0JocfYoJ}bE{tAelTSyr=;)-cOD z{?s$4GCvdI3=|H-UbmbDF#cKta!S#Gz z=XyRfxt`A(T+e3~*L8--@;3W-a`=ROY6&}kE?r7bea`L+tTAgz`NpgxC4FAo$WFdB zdMtb^R=#U`{06N%Y313F(^Bo0;aMJDuLbv?SeG^s`MX@;sbx zE+qf1HhfKCT+DrPWd@zY)1Uob?0RRogPq(3|Jn5PpHHQJMpHxB$$fYb{_{JUuAd!w z0ppDS>?r-`Mya2fSCIZJ_+xt(*JMucCSB$Q^XU@LzzdjVVelbc7U!VHvRg)9junZO z%x)E3RtIb8vJT&36SgMe`Nq4>F7Yg)?&lCcXT)>GzFglA`)8=aPU_-Va~v5pWOj|{ zjWaZ1Cr!<1WDC=pl(x9obReTH%&sdv)ty}~{`at$S95==C%aTHc2RHUs4sJL6SKR8 z9`$E-1L)BpW_LS18qDm5(1&5T`4>6DJVVN8<9~tZBDNd$Ju#;V|8}=(C zf1jkXN``9e}Sz5DC zUBpfdLnBHbNGmukU5^jr?%nyXEBN71Eja4cOKqEXO< z?oOr4X{HtF^ggWCiHn%qg8#{>DA%H5%*9d4>`J=b>E(ib=x$%SD^Hh-sALW#E1PQM zLFQ0W4$E*jyCcj|5ixSIkyr0Bs9j!Xc9D~XE~L9LHsP7m8bFb(jqv6E@$E_ zvDHkPl7H%JOq)TUX!6n!u!=CJ1S$b+OcB1c_f4?fw{rjZvQ595$zDEb6 zW)8L3r?S3}h280Ut?#pbpK-^~kA;7~l?|ZZXX5wy6lQ%N^*z$}qb2EjvkF?mI-De=_b>& zyvlxh@EUza@H*Z3?@^w!xF)mB`{WXQiqEh#!!mZ!a^^4aCB8CWlm7d?@*Au-8_D?h z+ntL1zkie6nYm=3zrV)6yY9v;Wl$FJ@2Rnu@J7#Tgz z{C5oJ{(SF4@N4nC2qXBK=xJsdX-1LqjCq#KXEfKN=a}Vr^8)F{(#3y=RKAoL$DE75 zmm$8NVLbQCgdo0`VJiD*8nb(qF8-bcy+J?=Z{442#%h z`G~z+LjN>aN_YM{alTx^{q8HetVyh8uE@WYZhv}oAhXl?B&x>jbY3|GHBb{eL%Q1Z z!Z?!qFMQ!QraBP z2bn`isfi;{JJ8v;PH+sp-v5&N{CA=T%gmh4hzv2*9p zQ?1y!^XaM9?A%54R9klLVtT3rJJ*>mm!K=Up?jhS^FMI~Unf_YYsmQfzzxhd;bxVS63^dRXYKiX-9PazUsqTQxK|dM z4@sTXKQ=nAe~#s51^E?LnbqV5^DQagVP8QkmKX#-` z(L{0P{|zPh?-W)k?k#P0CG|R-l*ywk*Y+~y$b2ery&@`^1IS#eaILDTPUcgC>xY^n z$l8Iw-dBg6923-|7o(lv1zv+GXJas~S<^N6n@zQ%dy^#aV|x|>bUXAak+tTXhR+>?5X zozodRJ!k9hqy_OabH4n5|BmQfT^Jv6UqSplo-aS)zau)A$8)xysnh(5``p*`EPnp> zGq}#-srBsKMtYX-*t=Zk_;^mwI)`iLXYZ`@x1Yy#4tME!+~;lFFzwbyMXR4q`NkB*N*Pm(_Kfp>r8i-(A}kU>6Ylhd`03a=4)_mhU?iC z{!XIbHy#Qeri=d`q2Coono*=Y zW1c15Xu2Cik6vJw7ctJfOpeDCGnI7H=<-T1oh~ylCx~bCdF(}J>-Wq8GJ2m`J}^2@ z%ObOwbRW?_GfPRgj4q#><)qX3TUKI?SxctYv)hPoGknkPCv!UI3(@(fb>Qclw(NAS zaXR003_8;#>zw1~8)Y~2Fqe~ZRd5Ymbf&pJxPdNxabs{ZUHaqJU?5%Y#9(tTIRp;| zL+SDe9yO1XGR!`@F>8 z>!n<2z9Qvovzl~k>9Q`dp4s0Qwu!FKDf6q*+xb??8G_6>`1zz zbSY+bCZ&WaMM~*lSGw$O%8=0>%&sh5_73);OZglsuy>W{(f-T_plVQ^ez5WPm?>+Z zCTihO9A=Ink2H12V@y4=zG*<7gvK}-O>l~7Mm9I6lV_MS$+OM5|~bNA4r!OSjxhSUS>qX(Jgp~O&T_Xs_D zl-WH&PYq|6dXk+y6^x{h!ZR3+=W`g#-i@PY8PDELpifFnWp=O7oqslz^0mZFW;ctT zn$2!*9&d4NUWT{XMej1dmti5h4}wK>x0wEM;#20&g3syh3%XlDUzzxtd3Ep&-L0p) z4fJml`V6Tbf}iOwevZ^{?Egso$-FfvUW{{MpwD}X^f^!E0)4*IetA^nn%keA&w*Tb zRp?o&u}}HuL&ZFZ`%(w9%jFQRrLsO>%0F8w=HYy8N}oNIs?9ESB)gP8vno}GT}q#8 zmD1;2)rCIe>R8mza2&hiGc;u98qpgEP3TR7Q|YG#E$C-vIGbITbJ=HU#XdTZStiE=wEsQCntdmuSzN>c}ojC-zZiX6cgX%AC54U6yX_qwdVoBXI@umADGmpeOp6 z8%eo2(VuyM8AL{RFyCeFA)_J8_nQYv_YmDZLVw&mLAv2|_Z0nUGm3Q2(A{(N=gnBs zy-0U2(-B<|1Vkl{LCEf0HDP#5^qq59<1?A|nFUkiM=ut&x*&hd@a!`$akU5yFWez3fFdQA! zqaPbIpdTNcNNaxBcW={We((-m-Zk%& z3-LjQ57{kFe9Y{Y(3fWToSl3Tte~&VVGVot4L!Av-G;=s%+V(1)DP@_41T7keqr}p z;tyuol3^>mZNYYWYKNWqcPLSmS&C;U!LDRbnx5K)-EN68%(7>Oz1Zy?>_boO%Wl6! zMP{jF4j@yN*;NUu(Nopg9h|7aEH#5e>2d^W2S?H67}O1prAq@GA2g&(lMGGSHN%-W zD>#SlTG8da;C#AVU@jz67qM%bxR}{>pm)x22|ITw-CaiSp2L;wuL`cAyKCukU2r{J zdYRs2pA3E3-ITb6+4ZLn#2|A!c^B>u2GbwN@DMxqFx@>ue=LXL?4LHH$k91G$6lT{ zV@Y|*yiAVAq#P!*muYwfuVOl0!;D}iU1piNCqPEt-)XPXghO} z692IiJu1pvJSahrN-~!=yOOedhBEAA&kTF9OO<1n+Lv8ao;j+(ER})-=vk_=ua-E7 zIhRAYmZcW^LxaQVS&n3%OC7F7M>9wDn2!yPqel&xqejdp<#96CvNUDiEND*8(t>?1 zEx8t*$sC=-d~R?aJvyH`YQvmr$1Y2I_EAUX)Fte?X6VK))q`Dh1+!cgTtk$o%z&z1RB4u)78uRPHEc)!=P5N8GeEPdNyw84N;zQSs!eqN8d5K@9FYm@H0KjZ|vP4^k_44w1rvz zG+Rm8X8t0h?ac1q|Ifus@_b@;BxR>WQRb*P^Ugs@dQ^%zD$Ojrm|aQP&FoG_WtiO_ zbhjs6%9_1Mw>Lf7huM{sYJ^D<^VD}kl9tHyDD_4YO0a0Iz2jsS!xD{ z(&ca*okLyra%`eLvpbI7FgTI!8qwWJbk~@kI+CvOikDDjRCv$j;{nI&&VxM}3os7;fhMjwXo_dj8Y8<=N z%j{%AViL2PLQhR&=U$~p)0v~0%x?s<>8ZKw+*|Z$9&_{#bLu^I(fiD@(0oA3BJ(l% ziTRY2&w|hC%Yzm4)Jk^I*UYOE>zLP@4Ww)|-;v*&AIK~}vd{7pd-(;w;dir{bbr!i ztJy}%U%_^|_y>{gSc>N*QZZ>^R;!S4v zHhq3#0kbT`;tWgJ$*1NsQkI%!qeG))9M2pzWR6Z^Zk%Y! z+$_)Nx8~g zP0BTqxmi(TiDbFuh6XWBQWOjm&bBxtWw(68)H6f4bai29RzbT?U!kNV(nI zLCT%xE>i9`_mDE!+)K(3a~~=9n+HgF&^$y&Lz&&fba}))O1j7B^0*mB$`fWdDNmYz zk@8ex1hadZE+a7-WAMCrft0c4MN(ce<4Aegj3;G+nMg*Hm}Rn=LdsM#jg(gsuQJPY z^BO5L60bA6nRI!>%p%=vy38?iNqN(}Man$$HYxMXJEXj8-Xmp!d7qSp<^xhbG>gb+ zF|+%KE+3muNVkM8pPJ7|S!$M%^0`?~$`^?h%j5(E=6|Xypo|fJ6D1(rGnCQy_}!pCH)=vbMXJcuk}0V zsKo!O9dFvzLq-#%?4(N!>g6?#81>Idm zmut{7xQ;H@n;S^ihc121O{BYpF8$1{q#H<=LFRVy4s$0dcO~v-mV3-#QicTg(dB;g z5INL5LW+N8)-bvZH~%7Kgc(W7sNfm;-|;N>yXWZ7qr9m=x{7qEWcDZJKvS8Ns>UDt z)tTiWqsPAZ zokf?kjUL{#knD4+f*NHA&%%!As3;Z#EB|CRDUG(^uYt40} z=rP|Lx8%^Dy&FK6L4h9Q;*W2o9?x0)G46RU_c?!zKfuoEah_!;`^bL=l#d7gv+xAF zr!g`ZO^?Pfiyq4|Hh76H~6}CvZvXLl)X(kQp%eOq*M$l(cS)ZcK}@~n<}JKLv_>$ YYSN`va4204%i(bLazqZb*~^jmAHz+-82|tP diff --git a/attic/TeamNexuiz/game/progs.src b/attic/TeamNexuiz/game/progs.src deleted file mode 100644 index 23ee12890..000000000 --- a/attic/TeamNexuiz/game/progs.src +++ /dev/null @@ -1,105 +0,0 @@ -../../progs.dat - -gamec/sys.h -gamec/builtins.h -gamec/constants.h -gamec/defs.h // Should rename this, it has fields and globals -gamec/tfdefs.c // TF Defs File -gamec/tf_constants.c // TF Constants (impulses, death messages etc) -gamec/tffunctions.c // TF Functions -gamec/tfplats.c // TF Platforms -gamec/tfgrenades.c // TF Grenades -gamec/tfmenus.c // TF Text Menus - -gamec/extensions.h - -gamec/tfclient.c // TF Client-Side stuff -gamec/tfhud.c // TF HUD Items - -gamec/g_subs.c - -gamec/cl_physics.c - -gamec/g_world.c -gamec/g_decors.c -gamec/g_casings.c - -gamec/t_jumppads.c -gamec/t_teleporters.c - -gamec/sv_main.c -gamec/sv_stats.c - -gamec/g_violence.c -gamec/g_damage.c - -gamec/g_triggers.c - -gamec/cl_weaponsystem.c -gamec/cl_weaponanimations.c -gamec/w_common.c -gamec/w_laser.c -gamec/w_shotgun.c -gamec/w_uzi.c -gamec/w_grenadelauncher.c -gamec/w_electro.c -gamec/w_crylink.c -gamec/w_nex.c -gamec/w_hagar.c -gamec/w_rocketlauncher.c -gamec/w_bombletts.c -gamec/w_incendiary_r.c -gamec/w_flamer.c -gamec/w_hotbombs.c -gamec/w_hook.c -gamec/w_namek.c -gamec/w_healgun.c -gamec/cl_weapons.c - -gamec/t_items.c -gamec/t_halflife.c -gamec/t_quake3.c -gamec/t_quake.c -//gamec/g_tetris.c -gamec/t_fort.c - -gamec/w_grenades.c - -gamec/scout.c -gamec/spy.c -gamec/soldier.c -gamec/pyro.c -gamec/medic.c -gamec/engineer.c -gamec/civilian.c -gamec/class.c - -gamec/cl_impulse.c -gamec/cl_player.c -gamec/cl_client.c -gamec/t_plats.c - -gamec/ctf.c -gamec/domination.c - -gamec/mauvebot.c - -gamec/tn_clientcommands.c // TN Voting/Rcon/Team/Class-select etc. -gamec/tf_ball.c // MegaTF/TN Ball&Goal - -gamec/tf_w_pistol.c // (Every Class?) Pistol -gamec/tf_w_railgun.c // Engineer RailGun -gamec/tf_w_mac10.c // Spy MAC10 -gamec/tf_w_proxi.c // Soldier Proxi Nade - -gamec/tfdoors.c // TF Doors -gamec/tfai.c // TF AI -gamec/tfsentry.c // TF Sentry Gun -gamec/tftesla.c // TF Tesla Coil -gamec/tfextractor.c // TN Metal Extractor -gamec/tfcombat.c // TF Combat System -gamec/tfmapitems.c // TF Map Items -gamec/tfbuttons.c // TF Buttons -gamec/tfq3fitems.c // Q3F to TF entity converter (partial) -gamec/tfitems.c // TF/TN Items -gamec/tn_misc.c // Team:Nexuiz misc fucntions/items diff --git a/attic/TeamNexuiz/game/qcc2.exe b/attic/TeamNexuiz/game/qcc2.exe deleted file mode 100644 index ab6510288ce8da4723914deafff84a3bf0a1c857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184320 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