From aa140d74174559963bb4d3a4650648229a65e232 Mon Sep 17 00:00:00 2001 From: ineed bots Date: Mon, 4 Dec 2023 03:36:03 -0600 Subject: [PATCH] cleanup --- .gitignore | 44 +- README.md | 10 +- .../bw-assets => bw-assets}/bw-logo.png | Bin deploy.bat | 2 - deploy.js | 54 - .../description.txt => description.txt | 0 main/server.cfg | 337 -- main_shared/bots.txt | 26 - .../maps/mp/gametypes/_globallogic_player.gsc | 2666 --------- main_shared/maps/mp/gametypes/_hardpoints.gsc | 1141 ---- .../maps => maps}/mp/bots/_bot_loadout.gsc | 0 .../maps => maps}/mp/bots/_bot_script.gsc | 0 .../maps => maps}/mp/bots/_bot_utility.gsc | 0 .../maps => maps}/mp/gametypes/_bot.gsc | 31 +- mods/mp_bots/mod.csv => mod.csv | 4 + mods/mp_bots/maps/mp/bots/_bot_loadout.gsc | 1294 ----- mods/mp_bots/maps/mp/bots/_bot_script.gsc | 4780 ----------------- mods/mp_bots/maps/mp/bots/_bot_utility.gsc | 539 -- mods/mp_bots/maps/mp/gametypes/_bot.gsc | 924 ---- mods/patch_mp/clientscripts/mp/_claymore.csc | 30 - mods/patch_mp/maps/mp/_dogs.gsc | 1957 ------- mods/patch_mp/maps/mp/_utility.gsc | 2202 -------- mods/patch_mp/maps/mp/bots/_bot_loadout.gsc | 1294 ----- mods/patch_mp/maps/mp/bots/_bot_script.gsc | 4780 ----------------- mods/patch_mp/maps/mp/bots/_bot_utility.gsc | 539 -- mods/patch_mp/maps/mp/gametypes/_bot.gsc | 924 ---- .../maps/mp/gametypes/_globallogic_player.gsc | 2629 --------- .../maps/mp/gametypes/_globallogic_score.gsc | 1070 ---- mods/patch_mp/maps/mp/gametypes/_spawning.gsc | 1574 ------ mods/patch_mp/maps/mp/gametypes/ctf.gsc | 1517 ------ mods/patch_mp/maps/mp/gametypes/dem.gsc | 1319 ----- mods/patch_mp/maps/mp/gametypes/dom.gsc | 1426 ----- mods/patch_mp/maps/mp/gametypes/koth.gsc | 1106 ---- mods/patch_mp/maps/mp/gametypes/sab.gsc | 958 ---- mods/patch_mp/maps/mp/mp_array.gsc | 152 - mods/patch_mp/maps/mp/mp_cairo.gsc | 40 - mods/patch_mp/maps/mp/mp_cosmodrome.gsc | 716 --- mods/patch_mp/maps/mp/mp_crisis.gsc | 35 - mods/patch_mp/maps/mp/mp_duga.gsc | 178 - mods/patch_mp/maps/mp/mp_firingrange.gsc | 411 -- mods/patch_mp/maps/mp/mp_golfcourse.gsc | 386 -- mods/patch_mp/maps/mp/mp_mountain.gsc | 234 - mods/patch_mp/maps/mp/mp_nuked.gsc | 405 -- mods/patch_mp/maps/mp/mp_radiation.gsc | 852 --- mods/patch_mp/maps/mp/mp_russianbase.gsc | 139 - mods/patch_mp/maps/mp/mp_silo.gsc | 107 - mods/patch_mp/maps/mp/mp_villa.gsc | 105 - mods/patch_mp/maps/mp/mp_zoo.gsc | 88 - mods/patch_mp/mod.csv | 80 - mods/patch_mp/mp/attachmentTable.csv | 104 - mods/patch_mp/mp/gametypesTable.csv | 63 - mods/patch_mp/mp/mapsTable.csv | 31 - mods/patch_mp/rumble/assault_fire_h.rmb | 10 - mods/patch_mp/rumble/assault_fire_l.rmb | 7 - mods/patch_mp/rumble/damage_heavy_h.rmb | 6 - mods/patch_mp/rumble/damage_heavy_l.rmb | 7 - mods/patch_mp/rumble/flamethrower_h.rmb | 5 - mods/patch_mp/rumble/flamethrower_l.rmb | 5 - mods/patch_mp/rumble/heavygun_fire_h.rmb | 10 - mods/patch_mp/rumble/heavygun_fire_l.rmb | 7 - mods/patch_mp/rumble/shotgun_fire_h.rmb | 7 - mods/patch_mp/rumble/shotgun_fire_l.rmb | 7 - mods/patch_mp/rumble/silencer_fire_h.rmb | 8 - mods/patch_mp/rumble/silencer_fire_l.rmb | 7 - mods/patch_mp/rumble/smg_fire_h.rmb | 8 - mods/patch_mp/rumble/smg_fire_l.rmb | 7 - mods/patch_mp/ui/error.menu | 907 ---- mods/patch_mp/ui/options_graphics_pc.menu | 447 -- mods/patch_mp/ui_mp/after_action_report.menu | 2127 -------- mods/patch_mp/ui_mp/cac_custom.menu | 32 - mods/patch_mp/ui_mp/cac_popups.menu | 813 --- mods/patch_mp/ui_mp/cac_weapon.menu | 1618 ------ mods/patch_mp/ui_mp/combat_record.menu | 3283 ----------- mods/patch_mp/ui_mp/custom_game_create.menu | 903 ---- .../ui_mp/custom_settings_general.menu | 423 -- mods/patch_mp/ui_mp/fileshare_playercard.menu | 4006 -------------- mods/patch_mp/ui_mp/game_mode.menu | 887 --- mods/patch_mp/ui_mp/hud_ffa.menu | 208 - mods/patch_mp/ui_mp/hud_hardcore.menu | 1316 ----- mods/patch_mp/ui_mp/hud_team.menu | 315 -- mods/patch_mp/ui_mp/main.menu | 830 --- mods/patch_mp/ui_mp/mods.menu | 162 - mods/patch_mp/ui_mp/options_multi.menu | 701 --- mods/patch_mp/ui_mp/patch.txt | 7 - mods/patch_mp/ui_mp/pc_basictraining.menu | 538 -- mods/patch_mp/ui_mp/pc_serversettings.menu | 190 - mods/patch_mp/ui_mp/playercards.menu | 1352 ----- mods/patch_mp/ui_mp/playercards_clantag.menu | 355 -- mods/patch_mp/ui_mp/players.menu | 166 - mods/patch_mp/ui_mp/scriptmenus/callvote.menu | 844 --- .../ui_mp/scriptmenus/changeclass.menu | 365 -- mods/patch_mp/ui_mp/scriptmenus/class.menu | 620 --- mods/patch_mp/ui_mp/serverbrowser.menu | 576 -- mods/patch_ui_mp/mod.csv | 0 {mods/mp_bots/mp => mp}/gametypesTable.csv | 0 .../mods/mp_bots/description.txt | 1 - .../mods/mp_bots/mod.ff | Bin 93376 -> 0 bytes .../mods/mp_bots/mp_bots.iwd | Bin 30791 -> 0 bytes out/Others/patch_mp.ff | Bin 1230400 -> 0 bytes out/Others/patch_ui_mp.ff | Bin 64 -> 0 bytes out/readme.txt | 52 - out/ss.png | Bin 5010014 -> 0 bytes {mods/mp_bots/ui_mp => ui_mp}/cac_main.menu | 0 .../ui_mp => ui_mp}/custom_game_create.menu | 0 .../ui_mp => ui_mp}/pc_basictraining.menu | 0 .../mp_bots/ui_mp => ui_mp}/playercards.menu | 0 z_deploy.bat | 1 - z_server.bat | 44 - 108 files changed, 16 insertions(+), 63477 deletions(-) rename {main_shared/bw-assets => bw-assets}/bw-logo.png (100%) delete mode 100644 deploy.bat delete mode 100644 deploy.js rename mods/mp_bots/description.txt => description.txt (100%) delete mode 100644 main/server.cfg delete mode 100644 main_shared/bots.txt delete mode 100644 main_shared/maps/mp/gametypes/_globallogic_player.gsc delete mode 100644 main_shared/maps/mp/gametypes/_hardpoints.gsc rename {main_shared/maps => maps}/mp/bots/_bot_loadout.gsc (100%) rename {main_shared/maps => maps}/mp/bots/_bot_script.gsc (100%) rename {main_shared/maps => maps}/mp/bots/_bot_utility.gsc (100%) rename {main_shared/maps => maps}/mp/gametypes/_bot.gsc (92%) rename mods/mp_bots/mod.csv => mod.csv (52%) delete mode 100644 mods/mp_bots/maps/mp/bots/_bot_loadout.gsc delete mode 100644 mods/mp_bots/maps/mp/bots/_bot_script.gsc delete mode 100644 mods/mp_bots/maps/mp/bots/_bot_utility.gsc delete mode 100644 mods/mp_bots/maps/mp/gametypes/_bot.gsc delete mode 100644 mods/patch_mp/clientscripts/mp/_claymore.csc delete mode 100644 mods/patch_mp/maps/mp/_dogs.gsc delete mode 100644 mods/patch_mp/maps/mp/_utility.gsc delete mode 100644 mods/patch_mp/maps/mp/bots/_bot_loadout.gsc delete mode 100644 mods/patch_mp/maps/mp/bots/_bot_script.gsc delete mode 100644 mods/patch_mp/maps/mp/bots/_bot_utility.gsc delete mode 100644 mods/patch_mp/maps/mp/gametypes/_bot.gsc delete mode 100644 mods/patch_mp/maps/mp/gametypes/_globallogic_player.gsc delete mode 100644 mods/patch_mp/maps/mp/gametypes/_globallogic_score.gsc delete mode 100644 mods/patch_mp/maps/mp/gametypes/_spawning.gsc delete mode 100644 mods/patch_mp/maps/mp/gametypes/ctf.gsc delete mode 100644 mods/patch_mp/maps/mp/gametypes/dem.gsc delete mode 100644 mods/patch_mp/maps/mp/gametypes/dom.gsc delete mode 100644 mods/patch_mp/maps/mp/gametypes/koth.gsc delete mode 100644 mods/patch_mp/maps/mp/gametypes/sab.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_array.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_cairo.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_cosmodrome.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_crisis.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_duga.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_firingrange.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_golfcourse.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_mountain.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_nuked.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_radiation.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_russianbase.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_silo.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_villa.gsc delete mode 100644 mods/patch_mp/maps/mp/mp_zoo.gsc delete mode 100644 mods/patch_mp/mod.csv delete mode 100644 mods/patch_mp/mp/attachmentTable.csv delete mode 100644 mods/patch_mp/mp/gametypesTable.csv delete mode 100644 mods/patch_mp/mp/mapsTable.csv delete mode 100644 mods/patch_mp/rumble/assault_fire_h.rmb delete mode 100644 mods/patch_mp/rumble/assault_fire_l.rmb delete mode 100644 mods/patch_mp/rumble/damage_heavy_h.rmb delete mode 100644 mods/patch_mp/rumble/damage_heavy_l.rmb delete mode 100644 mods/patch_mp/rumble/flamethrower_h.rmb delete mode 100644 mods/patch_mp/rumble/flamethrower_l.rmb delete mode 100644 mods/patch_mp/rumble/heavygun_fire_h.rmb delete mode 100644 mods/patch_mp/rumble/heavygun_fire_l.rmb delete mode 100644 mods/patch_mp/rumble/shotgun_fire_h.rmb delete mode 100644 mods/patch_mp/rumble/shotgun_fire_l.rmb delete mode 100644 mods/patch_mp/rumble/silencer_fire_h.rmb delete mode 100644 mods/patch_mp/rumble/silencer_fire_l.rmb delete mode 100644 mods/patch_mp/rumble/smg_fire_h.rmb delete mode 100644 mods/patch_mp/rumble/smg_fire_l.rmb delete mode 100644 mods/patch_mp/ui/error.menu delete mode 100644 mods/patch_mp/ui/options_graphics_pc.menu delete mode 100644 mods/patch_mp/ui_mp/after_action_report.menu delete mode 100644 mods/patch_mp/ui_mp/cac_custom.menu delete mode 100644 mods/patch_mp/ui_mp/cac_popups.menu delete mode 100644 mods/patch_mp/ui_mp/cac_weapon.menu delete mode 100644 mods/patch_mp/ui_mp/combat_record.menu delete mode 100644 mods/patch_mp/ui_mp/custom_game_create.menu delete mode 100644 mods/patch_mp/ui_mp/custom_settings_general.menu delete mode 100644 mods/patch_mp/ui_mp/fileshare_playercard.menu delete mode 100644 mods/patch_mp/ui_mp/game_mode.menu delete mode 100644 mods/patch_mp/ui_mp/hud_ffa.menu delete mode 100644 mods/patch_mp/ui_mp/hud_hardcore.menu delete mode 100644 mods/patch_mp/ui_mp/hud_team.menu delete mode 100644 mods/patch_mp/ui_mp/main.menu delete mode 100644 mods/patch_mp/ui_mp/mods.menu delete mode 100644 mods/patch_mp/ui_mp/options_multi.menu delete mode 100644 mods/patch_mp/ui_mp/patch.txt delete mode 100644 mods/patch_mp/ui_mp/pc_basictraining.menu delete mode 100644 mods/patch_mp/ui_mp/pc_serversettings.menu delete mode 100644 mods/patch_mp/ui_mp/playercards.menu delete mode 100644 mods/patch_mp/ui_mp/playercards_clantag.menu delete mode 100644 mods/patch_mp/ui_mp/players.menu delete mode 100644 mods/patch_mp/ui_mp/scriptmenus/callvote.menu delete mode 100644 mods/patch_mp/ui_mp/scriptmenus/changeclass.menu delete mode 100644 mods/patch_mp/ui_mp/scriptmenus/class.menu delete mode 100644 mods/patch_mp/ui_mp/serverbrowser.menu delete mode 100644 mods/patch_ui_mp/mod.csv rename {mods/mp_bots/mp => mp}/gametypesTable.csv (100%) delete mode 100644 out/Move to root of Black Ops folder/mods/mp_bots/description.txt delete mode 100644 out/Move to root of Black Ops folder/mods/mp_bots/mod.ff delete mode 100644 out/Move to root of Black Ops folder/mods/mp_bots/mp_bots.iwd delete mode 100644 out/Others/patch_mp.ff delete mode 100644 out/Others/patch_ui_mp.ff delete mode 100644 out/readme.txt delete mode 100644 out/ss.png rename {mods/mp_bots/ui_mp => ui_mp}/cac_main.menu (100%) rename {mods/mp_bots/ui_mp => ui_mp}/custom_game_create.menu (100%) rename {mods/mp_bots/ui_mp => ui_mp}/pc_basictraining.menu (100%) rename {mods/mp_bots/ui_mp => ui_mp}/playercards.menu (100%) delete mode 100644 z_deploy.bat delete mode 100644 z_server.bat diff --git a/.gitignore b/.gitignore index f1308ac..46ddfac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,40 +1,6 @@ -# Ignore everything in repository root -/* - -# Files to not ignore -!/.gitignore -!/.vscode -!/.editorconfig -!/.gitattributes - - -!/z_server.bat - -!/.astylerc -!/deploy.bat -!/deploy.js -!/z_deploy.bat - -!/main/ -/main/* -!/main/server.cfg -!/main_shared/ - -!README.md - -# Folder to not ignore -!/mods/ -/mods/* -!/mods/mp_bots/ -!/mods/patch_mp/ -!/mods/patch_ui_mp/ - -*.log -missingasset.csv -*.ff -*.files -*.iwd -!/out/ -!/out/**/*.ff -!/out/**/*.iwd *.zip +*.log +*.stat +logs/ +demos/ +missingasset.csv diff --git a/README.md b/README.md index f494350..179bdde 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -![GitHub Logo](/main_shared/bw-assets/bw-logo.png) +![GitHub Logo](/bw-assets/bw-logo.png) -# BO1 Bot Warfare -Bot Warfare is a GSC mod for [Black Ops 1](https://store.steampowered.com/app/42700/Call_of_Duty_Black_Ops/) (or [this](https://getrektby.us/)). +# T5 Bot Warfare +Bot Warfare is a GSC mod for [Black Ops 1](https://store.steampowered.com/app/42700/Call_of_Duty_Black_Ops/) and [PlutoniumT5](https://plutonium.pw/). It aims to extend the existing AI in the multiplayer games of Black Ops 1. -You can find the ModDB release post [here](https://www.moddb.com/mods/bot-warfare/downloads/bo1-bot-warfare-latest). +You can find the ModDB release post [here](https://www.moddb.com/mods/bot-warfare/downloads/t5-bot-warfare-latest). ## Contents - [Features](#Features) @@ -43,7 +43,7 @@ This mod extends the functionality and features of Combat Training in Black Ops - Bots can use the valkyrie rocket carepackage streak. ## Installation -0. Download the [latest release](https://github.com/ineedbots/bo1_bot_warfare/releases) of Bot Warfare. +0. Download the [latest release](https://github.com/ineedbots/t5_bot_warfare/releases) of Bot Warfare. 1. Locate the root folder which your game is installed in. 2. Move the files/folders found in 'Move to root of Black Ops folder' from the Bot Warfare release archive you downloaded to the root of your Black Ops folder. - The folder/file structure should follow as '.Black Ops folder\mods\mp_bots\mp_bots.iwd'. diff --git a/main_shared/bw-assets/bw-logo.png b/bw-assets/bw-logo.png similarity index 100% rename from main_shared/bw-assets/bw-logo.png rename to bw-assets/bw-logo.png diff --git a/deploy.bat b/deploy.bat deleted file mode 100644 index 2b0cfe0..0000000 --- a/deploy.bat +++ /dev/null @@ -1,2 +0,0 @@ -xcopy bo1_bot_warfare\main_shared\maps main_shared\maps\ /Y /I /E /H /C -xcopy bo1_bot_warfare\main main\ /Y /I /E /H /C diff --git a/deploy.js b/deploy.js deleted file mode 100644 index 1f27459..0000000 --- a/deploy.js +++ /dev/null @@ -1,54 +0,0 @@ -// nodejs 14+ - -const exec = require('util').promisify(require('child_process').exec) - -const repo_name = 'bo1_bot_warfare' -const repo_url = `https://github.com/ineedbots/${repo_name}` -const deploy_check_rate = 60000 -const title = 'BO1 Bot Warfare Git Deployer' - -function printToConsole(what, error = false) -{ - log = error ? console.error : console.log - - log(`[${new Date().toISOString()}]:`, what) -} - -async function doDeploy() { - try { - const { stdout, stderr } = await exec(`cd ${repo_name} && git fetch`) - - if (stderr.length <= 0) - return - - if (stderr.startsWith('From ')) - { - printToConsole('git fetched! Pulling...') - await exec(`cd ${repo_name} && git pull && git submodule update --init --recursive`) - printToConsole('Deploying...') - await exec('deploy.bat') - printToConsole('Deployed!') - } - } catch (e) { - printToConsole(e, true) - - if (!e.stderr.startsWith('The system cannot find the path specified')) - return - - printToConsole('Cloning repo...') - try { - await exec(`git clone ${repo_url} && cd ${repo_name} && git submodule update --init --recursive`) - - printToConsole('Cloned!') - printToConsole('Deploying...') - await exec('deploy.bat') - printToConsole('Deployed!') - } catch (f) { - printToConsole(f, true) - } - } -} - -process.stdout.write(`${String.fromCharCode(27)}]0;${title}${String.fromCharCode(7)}`) -doDeploy() -setInterval(doDeploy, deploy_check_rate) diff --git a/mods/mp_bots/description.txt b/description.txt similarity index 100% rename from mods/mp_bots/description.txt rename to description.txt diff --git a/main/server.cfg b/main/server.cfg deleted file mode 100644 index bd54dde..0000000 --- a/main/server.cfg +++ /dev/null @@ -1,337 +0,0 @@ -////////////////////////////////////////////////// -// SERVER NAME & COLORS // -////////////////////////////////////////////////// -// // -// ^1 Red // -// ^2 Green // -// ^3 Orange // -// ^4 Dark Blue // -// ^5 Light Blue // -// ^6 Pink // -// ^7 White // -// ^8 Grey // -// ^9 Brown // -// ^0 Black // -// // -////////////////////////////////////////////////// - -set sv_hostname "^1Bot ^3War^5fare ^4Bots ^7Nuketown 24/7" // Please put a server host name here -set logfile "1" -set g_logSync "1" // 1 always flush games_mp.log, 0 only flush on game end - -////////////////////////////////////////////////// -// GENERAL SETTINGS // -////////////////////////////////////////////////// - -set scr_player_forcerespawn "1" // Players respawn automatically after being fragged. -set scr_game_spectatetype "1" // Enable or Disables Spec mode, putting "1" allows spectators to spectate match. -set scr_hardcore "0" // Enable or Disable Hardcore Mode. -set scr_player_healthregentime "5" // Time it takes you to recover damage. -set scr_team_kickteamkillers "0" // Anyone who team kills, gets kicked automatically if you enable this feature. -set scr_team_teamkillspawndelay "20" // Team Killer gets a respawn penalty of specified seconds (20). -set scr_player_maxhealth "100" // Percent of Health players will have on Respawn. -set scr_player_sprinttime "12" // Sprint run time. -set scr_player_suicidespawndelay "0" // Wait before you respawn if you committed suicide. -set scr_teambalance "1" // Enable or Disable auto balance. -set party_minplayers "1" // Pre-Match Lobby - -////////////////////////////////////////////////// -// CLIENT SETTINGS // -////////////////////////////////////////////////// - -set g_password "" // Password Protected Game. Leave blank if you want players to join. -set sv_disableClientConsole "0" // Enable or Disable players ability to access server commands. -set sv_reconnectlimit "5" // How many times you can try to reconnect. -set sv_timeout "240" // Timeout time period. You will timeout after (240) seconds when attempting to connect or if you are getting connection interruptions. -set sv_zombietime "10" // Your idle time period before getting kicked. -set g_inactivity "180" // Enable or Disable auto kick feature for idle/AFK players. -set g_allowvote "0" // Allow Vote. -set sv_floodProtect "4" // Chat Spam Protection. -set sv_maxPing "0" // Max Ping allowed. -set sv_maxRate "25000" // Max rate on server. -set sv_minPing "0" // Minimum Ping allowed. -set sv_maxclients "32" // Maximum players that can enter server. -set sv_privateClients "2" // Private reserved slots on server. -set sv_pure "0" // verifying cilent files -set sv_kickBanTime "0" // Kick Ban Duration. Time before player can re-join the server after getting kicked. -set sv_vac "0" // Enable/Disable VAC steam Anti-Cheat.. No use... - -////////////////////////////////////////////////// -// SERVER SETTINGS // -////////////////////////////////////////////////// - -set scr_game_hardpoints "1" // Hardcore Scoring System. -set scr_game_killstreaks "1" // Enable/Disable Killstreak rewards. -set scr_hardpoint_allowdogs "1" // Enable/Disable Attack Dogs Killstreak. -set scr_hardpoint_allowhelicopter_comlink "1" // Helicopter Com Link -set scr_hardpoint_allowradardirection "1" // Radar Direction -set scr_hardpoint_allowsupply "1" // Care Package -set scr_hardpoint_allowhelicopter_gunner "1" // Helicopter Gunner -set scr_hardpoint_allowcounteruav "1" // Counter Spy Plane -set scr_hardpoint_allowhelicopter_player "1" // Helicopter -set scr_hardpoint_allowmortar "1" // Mortar Team -set scr_hardpoint_allownapalm "1" // Napalm Airstrike -set scr_hardpoint_allowrcbomb "1" // RC-XD Bomb -set scr_hardpoint_allowairstrike "1" // Air Strike -set scr_hardpoint_allowauto_turret "1" // Auto Turret -set scr_hardpoint_allowradar "1" // Allow Radar - -////////////////////////////////////////////////// -// SERVER TWEAKS // -////////////////////////////////////////////////// - -set g_deadChat "1" // Enable or Disable the ability to read dead chat chat of people who have been fragged. -set scr_game_allowfinalkillcam "1" // Enable/Disable Game Winning Kill Killcam. -set scr_team_allowHardpointStreakAfterDeath "0" // Enable/Disable Killstreak after Death. Player resumes the killstreak even after being fragged. -set scr_game_allowkillcam "1" // Allow Killcam. -set g_allow_teamchange "1" // Allow players to change teams. -set scr_player_allowrevive "1" // Allow players to revive each other. -set scr_team_artilleryTeamKillPenalty "0.25" // If you kill your team member with artillery strike, this amount of percent of your artillery time gets deducted. Logical ? -set scr_game_deathpointloss "0" // Points Loss on death Cod Points. -set scr_team_fftype "0" // Enable or Disable Friendly Fire. -set scr_game_onlyheadshots "0" // Enable/Disable Only Headshots mode. You can only kill players by taking headshots. -set scr_player_healthregentime "5" // Health regeneration time, time it takes for blood splatter to be removed from the screen. -set scr_team_teamkillspawndelay "20" // Team Kill respawn penalty, in seconds. -set scr_player_maxhealth "100" // Players starts with this amount of health in percentage. -set scr_team_mortarTeaTeamKillPenalty "0.25" // Mortar Air Strike Team Kill Penalty, time deducted. -set scr_game_prematchperiod "15" // Time before match starts. Strat time? -set scr_game_allowfinalkillcam "1" // Allow Final Kill Killcam. -set g_speed "190" // Player speed, speed at which player can move. -set scr_player_sprinttime "4" // Sprint time, duration a player can run. -set scr_game_suicidepointloss "0" // Suicide penalty in cod points. -set scr_player_suicidespawndelay "0" // Respawn wait after suicide. -set scr_team_teamkillpointloss "1" // Cod Points Penalty for Team Kill. -set scr_team_teamkillspawndelay "20" // Respawn penalty in time, after team kill. -set scr_team_teamkillerplaylistbanpenalty "0" // Add the team killer to the ban list. -set scr_team_teamkillerplaylistbanquantum "0" -set scr_game_perks "1" // Allow players to have perks - -////////////////////////////////////////////////// -// VOIP SETTINGS // -////////////////////////////////////////////////// - -set voice_deadChat "1" // Enable/Disable voice over IP chat when a player is dead. -set voice_global "1" // Enable/Disable the use of in-game voice over IP. -set sv_voicequality "0" // Voice Quality, 3 for high, 1 for low. More bandwidth better quality. -set g_voiceChatTalkingDuration "500" // Duration you can chat. -set sv_voice "1" // Allow Voice Chat - -////////////////////////////////////////////////// -//CAPTURE THE FLAG GAMETYPE SETTINGS // -////////////////////////////////////////////////// - -set scr_ctf_globalbattlechatterprobability "0" -set scr_ctf_enemycarriervisible "0" // Where is the flag carrier, spot visible on radar. -set scr_ctf_flagrespawntime "0" // Time before a captured flag respawns. -set scr_ctf_idleflagreturntime "30" // Time before a dropped flag returns to its default location if not picked. -set scr_ctf_numlives "0" // Number of lives per player 0 for unlimited. -set scr_ctf_playerrespawndelay "0" // Respawn wait in seconds. -set scr_ctf_roundlimit "3" // How many rounds match would last. -set scr_ctf_roundswitch "1" // Rounds before the teams switch sides. -set scr_ctf_scorelimit "3" // Target score before the round ends. -set scr_ctf_timelimit "5" // Round length. -set scr_ctf_touchreturn "1" // Ability to return the flag by touching it. -set scr_ctf_waverespawndelay "15" - -////////////////////////////////////////////////// -// DEMOLITION GAMETYPE SETTINGS // -////////////////////////////////////////////////// - -set scr_dem_globalbattlechatterprobability "0" -set scr_dem_bombtimer "45" // Time the bomb takes to detonate. -set scr_dem_defusetime "5" // Time taken to defuse the bomb. -set scr_dem_extratime "3" -set scr_dem_numlives "0" // Lives per player 0 for unlimited. -set scr_dem_planttime "5" // Time it takes to plant a bomb in seconds. -set scr_dem_roundlimit "0" // Rounds the game is limited to, if there are no winners. -set scr_dem_roundswitch "1" // Rounds before the teams switch the sides. -set scr_dem_scorelimit "2" // Score limit needed to win. -set scr_dem_timelimit "2.5" // Round time limit. - -////////////////////////////////////////////////// -// DOMINATION GAMETYPE SETTINGS // -////////////////////////////////////////////////// - -set scr_dom_globalbattlechatterprobability "0" -set scr_dom_flagcapturetime "10" // Time in seconds to capture a flag. -set scr_dom_numlives "0" // Lives per player 0 for unlimited. -set scr_dom_playerrespawndelay "0" // Duration of time you wait to respawn. -set scr_dom_roundlimit "1" // Rounds played per game. -set scr_dom_scorelimit "300" // Score limit per game. -set scr_dom_timelimit "30" // Duration in minutes per round. -set scr_dom_waverespawndelay "0" // Spawn delay at start. - -////////////////////////////////////////////////// -// FREE FOR ALL GAMETYPE SETTINGS // -////////////////////////////////////////////////// - -set scr_dm_globalbattlechatterprobability "100" -set scr_dm_bonus_leader "0" -set scr_dm_numlives "0" // Lives per player 0 for unlimited. -set scr_dm_playerrespawndelay "0" // Time in seconds wait to respawn. -set scr_dm_roundlimit "1" // Round limit. -set scr_dm_score_assist "100" // Points allotted for an assist. -set scr_dm_score_death "0" // Points allotted for dying. -set scr_dm_score_headshot "0" // Points for headshot. -set scr_dm_score_kill "50" // Points for a kill. -set scr_dm_scorelimit "1500" // Points needed to win the game. -set scr_dm_score_suicide "0" // Points allotted for suicide. -set scr_dm_timelimit "15" // Duration the game lasts in minutes when the score limit isn't reached. -set scr_dm_waverespawndelay "0" // Delay before the first respawn in the first round. - -////////////////////////////////////////////////// -// HEADQUARTERS GAMETYPE SETTINGS // -////////////////////////////////////////////////// - -set scr_koth_globalbattlechatterprobability "0" -set scr_koth_numlives "0" // Number of lives per game 0 for unlimited. -set scr_koth_playerrespawndelay "0" // Players respawn wait. -set scr_koth_roundlimit "1" // Rounds to be played. -set scr_koth_roundswitch "1" // Rounds to be played before teams switch sides. -set scr_koth_scorelimit "250" // Score limit to win the game. -set scr_koth_timelimit "15" // Duration in minutes the game will continue if the score isn't reached. -set scr_koth_waverespawndelay "0" // First respawn delay for each round. - -////////////////////////////////////////////////// -// SABOTAGE GAMETYPE SETTINGS // -////////////////////////////////////////////////// - -set scr_sab_globalbattlechatterprobability "0" -set scr_sab_bombtimer "30" // Duration in seconds the bomb takes to detonate. -set scr_sab_defusetime "5" // Time taken to defuse the bomb. -set scr_sab_hotpotato "0" // One bomb that the teams must fight over. One defending and one have to plant at the site. -set scr_sab_numlives "0" // Number of lives players get. -set scr_sab_planttime "2.5" // Time taken to plant the bomb. -set scr_sab_playerrespawndelay "7.5" // Time before respawn. -set scr_sab_roundlimit "1" // Rounds per game. -set scr_sab_roundswitch "1" // Rounds needed to be played before the teams switch sides. -set scr_sab_scorelimit "1" // Score limit to win the match. -set scr_sab_timelimit "10" // Duration in minutes the game lasts if the score limit isn't reached. -set scr_sab_waverespawndelay "0" // Time delay for first respawn before the game. - -////////////////////////////////////////////////// -// SEARCH AND DESTROY GAMETYPE SETTINGS // -////////////////////////////////////////////////// - -set scr_sd_globalbattlechatterprobability "0" -set scr_sd_bombtimer "45" // Time taken for the bomb to detonate. -set scr_sd_defusetime "5" // Time taken to defuse the bomb. -set scr_sd_game_spectatetype "3" // Allow team spectate. -set scr_sd_multibomb "0" // Allow more than one bomb. -set scr_sd_numlives "1" // Number of lives per player per game. -set scr_sd_planttime "5" // Time taken to plant the bomb. -set scr_sd_playerrespawndelay "0" // Respawn wait. -set scr_sd_roundlimit "0" // Rounds the game is limited to 0 for unlimited. -set scr_sd_roundswitch "3" // Rounds to be played before the teams switch sides. -set scr_sd_scorelimit "4" // Score limit required to win the game. -set scr_sd_timelimit "2.5" // Time limit if the score limit isn't reached. -set scr_sd_waverespawndelay "0" // Delay for first respawn. - -////////////////////////////////////////////////// -// TEAM DEATHMATCH GAMETYPE SETTINGS // -////////////////////////////////////////////////// - -set scr_tdm_globalbattlechatterprobability "0" -set scr_tdm_bonus_leader "0" // Top Player on the leaderboard gets this much bonus. -set scr_tdm_numlives "0" // Number of lives per player 0 for unlimited. -set scr_tdm_playerrespawndelay "0" // Respawn wait. -set scr_tdm_roundlimit "1" // Rounds per game. -set scr_tdm_score_assist "50" // Points awarded for an assist. -set scr_tdm_score_death "0" // Points awarded for death. -set scr_tdm_score_headshot "0" // Headshot reward. -set scr_tdm_score_kill "100" // Points awarded for a kill. -set scr_tdm_scorelimit "7500" // Score limit to win the game. -set scr_tdm_score_suicide "0" // Score awarded for suicide. -set scr_tdm_timelimit "15" // Duration in minutes for the game to end if the score limit isn't reached. -set scr_tdm_waverespawndelay "0" // Duration is seconds before the first respawn in each round. - -////////////////////////////////////////////////// -// GAMETYPE & WAGER TIPS // -////////////////////////////////////////////////// -// // -// tdm - Team deathmatch // -// dm - Free-for-all // -// sab - Sabotage // -// dem - Demolition // -// ctf - Capture the flag // -// sd - Search and destroy // -// dom - Domination // -// koth - Headquarters // -// // -//// Wager Matchs //////////////////////////////// -// // -// IMPORTMENT // -// Wager Matchs MUST require xblive_wagermatch 1// -// // -// hlnd - Stick and Stones* // -// gun - Gun mode* // -// shrp - Sharpshooter* // -// oic - One in the Chamber* // -// // -////////////////////////////////////////////////// - -set g_gametype "dom" // Select gametype from the list above -set xblive_wagermatch "0" // Set to 1 if you plan on using a wager match. This is a MUST! Failure to do so caused problems - -////////////////////////////////////////////////// -// MAP ROTATION TIPS // -////////////////////////////////////////////////// -// // -// mp_array - Array // -// mp_cracked - Cracked // -// mp_crisis - Crysis // -// mp_firingrange - Firingrange // -// mp_duga - Grid // -// mp_hanoi - Hanoi // -// mp_cairo - Havana // -// mp_havoc - Jungle // -// mp_cosmodrome - Launch // -// mp_nuked - Nuketown // -// mp_radiation - Radiation // -// mp_mountain - Summit // -// mp_villla - Villa // -// mp_russianbase - WMD // -// // -//// DLC1 FIRSTSTRIKE //////////////////////////// -// // -// mp_berlinwall2 - Berlin Wall // -// mp_discovery - Discovery // -// mp_kowloon - Kowloon // -// mp_stadium - Stadium // -// // -//// DLC2 ESCALATION ///////////////////////////// -// // -// mp_gridlock - Convoy // -// mp_hotel - Hotel // -// mp_outskirts - Stockpile // -// mp_zoo - Zoo // -// // -//// DLC3 ANNIHILATION /////////////////////////// -// // -// mp_drivein - Drive-In // -// mp_area51 - Hanger 18 // -// mp_golfcourse - Hazard // -// mp_silo - Silo // -// // -////////////////////////////////////////////////// -set scr_xpscale "10" - -set sv_maprotation "map mp_nuked" - -////////////////////////////////////////////////// -// PLAYLIST DVARS // -////////////////////////////////////////////////// - -set playlist_enabled "0" // Reserved slots for players in playlist. -set playlist_excludeMap "mapname" // Exclude this map from the server rotation. Type in the map name shortname. -set playlist_excludeGametype "" // Exclude this gametype, type in the gametype shortname. -set playlist_excludeGametypeMap "" // Exclude this gametype map, type in the map shortname. - -set bots_manage_add "12" -set bots_manage_fill "12" -set bots_manage_fill_kick "1" -set bots_team_force "1" -set bots_loadout_allow_op "0" -set bots_loadout_reasonable "1" -set bots_manage_fill_spec "0" -set bot_difficulty "2" diff --git a/main_shared/bots.txt b/main_shared/bots.txt deleted file mode 100644 index bacce26..0000000 --- a/main_shared/bots.txt +++ /dev/null @@ -1,26 +0,0 @@ -bota -botb -botc -botd -bote -botf -botg -both -boti -botj -botk -botl -botm -botn -boto -botp -botq -botr -bots -bott -botu -botv -botw -botx -boty -botz \ No newline at end of file diff --git a/main_shared/maps/mp/gametypes/_globallogic_player.gsc b/main_shared/maps/mp/gametypes/_globallogic_player.gsc deleted file mode 100644 index 8693ea9..0000000 --- a/main_shared/maps/mp/gametypes/_globallogic_player.gsc +++ /dev/null @@ -1,2666 +0,0 @@ -#include maps\mp\_utility; -#include common_scripts\utility; - -freezePlayerForRoundEnd() -{ - self clearLowerMessage(); - - self closeMenu(); - self closeInGameMenu(); - - self freeze_player_controls( true ); - currentWeapon = self GetCurrentWeapon(); - if ( maps\mp\gametypes\_hardpoints::isKillstreakWeapon( currentWeapon ) && !maps\mp\gametypes\_killstreak_weapons::isHeldKillstreakWeapon( currentWeapon ) ) - self takeWeapon( currentWeapon ); -// self _disableWeapon(); -} - - -Callback_PlayerConnect() -{ - thread notifyConnecting(); - - self.statusicon = "hud_status_connecting"; - self waittill( "begin" ); - waittillframeend; - self.statusicon = ""; - - level notify( "connected", self ); - -// self thread maps\mp\gametypes\_globallogic_utils::fakeLag(); - if ( level.console && self IsHost() ) - self thread maps\mp\gametypes\_globallogic::listenForGameEnd(); - - // only print that we connected if we haven't connected in a previous round - if( !level.splitscreen && !isdefined( self.pers["score"] ) ) - { - iPrintLn(&"MP_CONNECTED", self); - } - - if( !isdefined( self.pers["score"] ) ) - { - self thread maps\mp\gametypes\_persistence::adjustRecentStats(); - self maps\mp\gametypes\_persistence::setAfterActionReportStat( "valid", 0 ); - if( level.console ) - { - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 && !( self IsHost() ) ) - self maps\mp\gametypes\_persistence::setAfterActionReportStat( "wagerMatchFailed", 1 ); - else - self maps\mp\gametypes\_persistence::setAfterActionReportStat( "wagerMatchFailed", 0 ); - } - else - { - /# - PrintLn("level.wagermatch: " + level.wagermatch ); - #/ - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - if ( !self is_bot() && !self isdemoclient() ) - { - codPoints = self maps\mp\gametypes\_persistence::statGet( "CODPOINTS" ); - if( codPoints < level.wagerBet && !self IsHost() ) - { - /# - PrintLn("kick " + self.name + "; not enought codpoints: " + codPoints ); - #/ - kick( self getEntityNumber(), "PLATFORM_WAGER_DEADBEAT_TITLE" ); - return; - } - } - - // set this flag to notify player of possible refund in case the match does not end well - // self maps\mp\gametypes\_persistence::setAfterActionReportStat( "wagerMatchFailed", 1 ); - } - else - self maps\mp\gametypes\_persistence::setAfterActionReportStat( "wagerMatchFailed", 0 ); - } - } - - // track match and hosting stats once per match - if ( !IsDefined( self.pers["matchesPlayedStatsTracked"] ) ) - { - self maps\mp\gametypes\_persistence::statAdd( "MATCHES_PLAYED", 1, false ); - self.pers["MATCHES_PLAYED_COMPLETED_STREAK"] = self maps\mp\gametypes\_persistence::statGet( "MATCHES_PLAYED_COMPLETED_STREAK" ) + 1; - self maps\mp\gametypes\_persistence::statSet( "MATCHES_PLAYED_COMPLETED_STREAK", 0, false ); - - if ( !IsDefined( self.pers["matchesHostedStatsTracked"] ) && self IsLocalToHost() ) - { - self maps\mp\gametypes\_persistence::statAdd( "MATCHES_HOSTED", 1, false ); - self.pers["MATCHES_HOSTED_COMPLETED_STREAK"] = self maps\mp\gametypes\_persistence::statGet( "MATCHES_HOSTED_COMPLETED_STREAK" ) + 1; - self maps\mp\gametypes\_persistence::statSet( "MATCHES_HOSTED_COMPLETED_STREAK", 0, false ); - self.pers["matchesHostedStatsTracked"] = true; - } - - self.pers["matchesPlayedStatsTracked"] = true; - self thread maps\mp\gametypes\_persistence::uploadStatsSoon(); - } - - self maps\mp\_gamerep::gameRepPlayerConnected(); - - lpselfnum = self getEntityNumber(); - lpGuid = self getGuid(); - logPrint("J;" + lpGuid + ";" + lpselfnum + ";" + self.name + "\n"); - bbPrint( "mpjoins: name %s client %s", self.name, lpselfnum ); - - self setClientUIVisibilityFlag( "hud_visible", 1 ); - self setClientUIVisibilityFlag( "g_compassShowEnemies", GetDvarInt( #"scr_game_forceradar" ) ); - - self setClientDvars( "player_sprintTime", GetDvar( #"scr_player_sprinttime" ), - "ui_radar_client", GetDvar( #"ui_radar_client" ), - "scr_numLives", level.numLives, - "ui_pregame", isPregame() ); - - self CameraActivate( false ); - - makeDvarServerInfo( "cg_drawTalk", 1 ); - - if ( level.hardcoreMode ) - { - self setClientDvars( "cg_drawTalk", 3 ); - } - - if ( GetDvarInt( #"player_sprintUnlimited" ) ) - { - self setClientDvar( "player_sprintUnlimited", 1 ); - } - -/# - if ( GetDvarInt( #"scr_hitloc_debug") ) - { - for ( i = 0; i < 6; i++ ) - { - self setClientDvar( "ui_hitloc_" + i, "" ); - } - self.hitlocInited = true; - } -#/ - - self maps\mp\gametypes\_globallogic_score::initPersStat( "score" ); - if ( level.resetPlayerScoreEveryRound ) - { - self.pers["score"] = 0; - } - self.score = self.pers["score"]; - - self maps\mp\gametypes\_globallogic_score::initPersStat( "suicides" ); - self.suicides = self maps\mp\gametypes\_globallogic_score::getPersStat( "suicides" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "headshots" ); - self.headshots = self maps\mp\gametypes\_globallogic_score::getPersStat( "headshots" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "challenges" ); - self.challenges = self maps\mp\gametypes\_globallogic_score::getPersStat( "challenges" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "kills" ); - self.kills = self maps\mp\gametypes\_globallogic_score::getPersStat( "kills" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "deaths" ); - self.deaths = self maps\mp\gametypes\_globallogic_score::getPersStat( "deaths" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "assists" ); - self.assists = self maps\mp\gametypes\_globallogic_score::getPersStat( "assists" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "defends", false ); - self.defends = self maps\mp\gametypes\_globallogic_score::getPersStat( "defends" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "offends", false ); - self.offends = self maps\mp\gametypes\_globallogic_score::getPersStat( "offends" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "plants", false ); - self.plants = self maps\mp\gametypes\_globallogic_score::getPersStat( "plants" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "defuses", false ); - self.defuses = self maps\mp\gametypes\_globallogic_score::getPersStat( "defuses" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "returns", false ); - self.returns = self maps\mp\gametypes\_globallogic_score::getPersStat( "returns" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "captures", false ); - self.captures = self maps\mp\gametypes\_globallogic_score::getPersStat( "captures" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "destructions", false ); - self.destructions = self maps\mp\gametypes\_globallogic_score::getPersStat( "destructions" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "backstabs" ); - self.backstabs = self maps\mp\gametypes\_globallogic_score::getPersStat( "backstabs" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "longshots" ); - self.longshots = self maps\mp\gametypes\_globallogic_score::getPersStat( "longshots" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "survived" ); - self.survived = self maps\mp\gametypes\_globallogic_score::getPersStat( "survived" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "stabs" ); - self.stabs = self maps\mp\gametypes\_globallogic_score::getPersStat( "stabs" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "tomahawks" ); - self.tomahawks = self maps\mp\gametypes\_globallogic_score::getPersStat( "tomahawks" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "humiliated" ); - self.humiliated = self maps\mp\gametypes\_globallogic_score::getPersStat( "humiliated" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "x2score" ); - self.x2score = self maps\mp\gametypes\_globallogic_score::getPersStat( "x2score" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "sessionbans" ); - self.sessionbans = self maps\mp\gametypes\_globallogic_score::getPersStat( "sessionbans" ); - self maps\mp\gametypes\_globallogic_score::initPersStat( "gametypeban" ); - self maps\mp\gametypes\_globallogic_score::initPersStat( "time_played_total" ); - self maps\mp\gametypes\_globallogic_score::initPersStat( "time_played_alive" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "teamkills", false ); - self maps\mp\gametypes\_globallogic_score::initPersStat( "teamkills_nostats" ); - self.teamKillPunish = false; - if ( level.minimumAllowedTeamKills >= 0 && self.pers["teamkills_nostats"] > level.minimumAllowedTeamKills ) - self thread reduceTeamKillsOverTime(); - - if( GetDvar( #"r_reflectionProbeGenerate" ) == "1" ) - level waittill( "eternity" ); - - - self.killedPlayersCurrent = []; - - if( !isDefined( self.pers["best_kill_streak"] ) ) - { - self.pers["killed_players"] = []; - self.pers["killed_by"] = []; - self.pers["nemesis_tracking"] = []; - self.pers["artillery_kills"] = 0; - self.pers["dog_kills"] = 0; - self.pers["nemesis_name"] = ""; - self.pers["nemesis_rank"] = 0; - self.pers["nemesis_rankIcon"] = 0; - self.pers["nemesis_xp"] = 0; - self.pers["nemesis_xuid"] = ""; - - - /*self.killstreakKills["artillery"] = 0; - self.killstreakKills["dogs"] = 0; - self.killstreaksUsed["radar"] = 0; - self.killstreaksUsed["artillery"] = 0; - self.killstreaksUsed["dogs"] = 0;*/ - self.pers["best_kill_streak"] = 0; - } - -// Adding Music tracking per player CDC - if( !isDefined( self.pers["music"] ) ) - { - self.pers["music"] = spawnstruct(); - self.pers["music"].spawn = false; - self.pers["music"].inque = false; - self.pers["music"].currentState = "SILENT"; - self.pers["music"].previousState = "SILENT"; - self.pers["music"].nextstate = "UNDERSCORE"; - self.pers["music"].returnState = "UNDERSCORE"; - - } - self.leaderDialogQueue = []; - self.leaderDialogActive = false; - self.leaderDialogGroups = []; - self.leaderDialogGroup = ""; - - if ( !isdefined( self.pers["cur_kill_streak"] ) ) - self.pers["cur_kill_streak"] = 0; - if ( !isdefined( self.pers["totalKillstreakCount"] ) ) - self.pers["totalKillstreakCount"] = 0; - - //Keep track of how many killstreaks have been earned in the current streak - if ( !isdefined( self.pers["killstreaksEarnedThisKillstreak"] ) ) - self.pers["killstreaksEarnedThisKillstreak"] = 0; - - self.lastKillTime = 0; - - self.cur_death_streak = 0; - self disabledeathstreak(); - self.death_streak = 0; - self.kill_streak = 0; - self.gametype_kill_streak = 0; - - if ( level.onlineGame ) - { - self.death_streak = self getDStat( "HighestStats", "death_streak" ); - self.kill_streak = self getDStat( "HighestStats", "kill_streak" ); - self.gametype_kill_streak = self maps\mp\gametypes\_persistence::statGetWithGameType( "kill_streak" ); - } - - - self.lastGrenadeSuicideTime = -1; - - self.teamkillsThisRound = 0; - - if ( !isDefined( level.livesDoNotReset ) || !level.livesDoNotReset || !isDefined( self.pers["lives"] ) ) - self.pers["lives"] = level.numLives; - - // multi round FFA games in custom game mode should maintain team in-between rounds - if ( !level.teamBased && !maps\mp\gametypes\_customClasses::isCustomGame() ) - { - self.pers["team"] = undefined; - } - - self.hasSpawned = false; - self.waitingToSpawn = false; - self.wantSafeSpawn = false; - self.deathCount = 0; - - self.wasAliveAtMatchStart = false; - - self thread maps\mp\_flashgrenades::monitorFlash(); - - level.players[level.players.size] = self; - - if( level.splitscreen ) - setdvar( "splitscreen_playerNum", level.players.size ); - // removed underscore for debug CDC - //maps\mp\gametypes\_globallogic_audio::set_music_on_team( "UNDERSCORE", "both", true );; - // When joining a game in progress, if the game is at the post game state (scoreboard) the connecting player should spawn into intermission - if ( game["state"] == "postgame" ) - { - self.pers["needteam"] = 1; - self.pers["team"] = "spectator"; - self.team = "spectator"; - self setClientUIVisibilityFlag( "hud_visible", 0 ); - - self [[level.spawnIntermission]](); - self closeMenu(); - self closeInGameMenu(); - return; - } - - // don't count losses for CTF and S&D and War at each round. - if ( !isDefined( self.pers["lossAlreadyReported"] ) ) - { - maps\mp\gametypes\_globallogic_score::updateLossStats( self ); - self.pers["lossAlreadyReported"] = true; - } - // don't redo winstreak save to pers array for each round of round based games. - if ( !isDefined( self.pers["winstreakAlreadyCleared"] ) ) - { - // self maps\mp\gametypes\_globallogic_score::backupAndClearWinStreaks(); - self.pers["winstreakAlreadyCleared"] = true; - } - - if( self isdemoclient() ) - { - spawnpoint = maps\mp\gametypes\_spawnlogic::getRandomIntermissionPoint(); - setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles ); - self.pers["team"] = ""; - self [[level.spectator]](); - return; - } - - if( self istestclient() ) - { - self.pers[ "isBot" ] = true; - } - - if ( level.rankedMatch ) - { - self maps\mp\gametypes\_persistence::setAfterActionReportStat( "demoFileID", "0" ); - } - - level endon( "game_ended" ); - - if ( isDefined( level.hostMigrationTimer ) ) - self thread maps\mp\gametypes\_hostmigration::hostMigrationTimerThink(); - - if ( level.oldschool ) - { - self.pers["class"] = undefined; - self.class = self.pers["class"]; - } - - if ( isDefined( self.pers["team"] ) ) - self.team = self.pers["team"]; - - if ( isDefined( self.pers["class"] ) ) - self.class = self.pers["class"]; - - if ( !isDefined( self.pers["team"] ) || IsDefined( self.pers["needteam"] ) ) - { - // Don't set .sessionteam until we've gotten the assigned team from code, - // because it overrides the assigned team. - self.pers["needteam"] = undefined; - self.pers["team"] = "spectator"; - self.team = "spectator"; - self.sessionstate = "dead"; - - self maps\mp\gametypes\_globallogic_ui::updateObjectiveText(); - - [[level.spawnSpectator]](); - - if ( level.rankedMatch ) - { - [[level.autoassign]](); - - //self thread maps\mp\gametypes\_globallogic_spawn::forceSpawn(); - self thread maps\mp\gametypes\_globallogic_spawn::kickIfDontSpawn(); - } - else if ( !level.teamBased ) - { - [[level.autoassign]](); - } - else - { - if( ( isDefined( level.forceAutoAssign ) && level.forceAutoAssign ) || level.allow_teamchange != "1" ) - { - [[level.autoassign]](); - } - else - { - self setclientdvar( "g_scriptMainMenu", game["menu_team"] ); - self openMenu( game["menu_team"] ); - } - } - - if ( self.pers["team"] == "spectator" ) - { - self.sessionteam = "spectator"; - if ( !level.teamBased ) - self.ffateam = "spectator"; - } - - if ( level.teamBased ) - { - // set team and spectate permissions so the map shows waypoint info on connect - self.sessionteam = self.pers["team"]; - if ( !isAlive( self ) ) - self.statusicon = "hud_status_dead"; - self thread maps\mp\gametypes\_spectating::setSpectatePermissions(); - } - } - else if ( self.pers["team"] == "spectator" ) - { - self setclientdvar( "g_scriptMainMenu", game["menu_team"] ); - [[level.spawnSpectator]](); - self.sessionteam = "spectator"; - self.sessionstate = "spectator"; - if ( !level.teamBased ) - self.ffateam = "spectator"; - self thread maps\mp\gametypes\_spectating::setSpectatePermissions(); - } - else - { - self.sessionteam = self.pers["team"]; - self.sessionstate = "dead"; - - if ( !level.teamBased ) - self.ffateam = self.pers["team"]; - - self maps\mp\gametypes\_globallogic_ui::updateObjectiveText(); - - [[level.spawnSpectator]](); - - if ( maps\mp\gametypes\_globallogic_utils::isValidClass( self.pers["class"] ) ) - { - self thread [[level.spawnClient]](); - } - else - { - self maps\mp\gametypes\_globallogic_ui::showMainMenuForTeam(); - } - - self thread maps\mp\gametypes\_spectating::setSpectatePermissions(); - } - - if( maps\mp\gametypes\_customClasses::isUsingCustomGameModeClasses() ) - { - self thread maps\mp\gametypes\_customClasses::sprintSpeedModifier(); - } - - if ( isDefined( self.pers["isBot"] ) ) - return; -} - -Callback_PlayerMigrated() -{ - println( "Player " + self.name + " finished migrating at time " + gettime() ); - - if ( isDefined( self.connected ) && self.connected ) - { - self maps\mp\gametypes\_globallogic_ui::updateObjectiveText(); -// self updateObjectiveText(); -// self updateMainMenu(); - -// if ( level.teambased ) -// self updateScores(); - } - - level.hostMigrationReturnedPlayerCount++; - if ( level.hostMigrationReturnedPlayerCount >= level.players.size * 2 / 3 ) - { - println( "2/3 of players have finished migrating" ); - level notify( "hostmigration_enoughplayers" ); - } -} - -Callback_PlayerDisconnect() -{ - self removePlayerOnDisconnect(); - - if ( !level.gameEnded ) - self maps\mp\gametypes\_globallogic_score::logXPGains(); - - if ( level.splitscreen ) - { - players = level.players; - - if ( players.size <= 1 ) - level thread maps\mp\gametypes\_globallogic::forceEnd(); - - // passing number of players to menus in splitscreen to display leave or end game option - setdvar( "splitscreen_playerNum", players.size ); - } - - if ( isDefined( self.score ) && isDefined( self.pers["team"] ) ) - { - setPlayerTeamRank( self, level.dropTeam, self.score - 5 * self.deaths ); - self logString( "team: score " + self.pers["team"] + ":" + self.score ); - level.dropTeam += 1; - } - - [[level.onPlayerDisconnect]](); - - lpselfnum = self getEntityNumber(); - lpGuid = self getGuid(); - logPrint("Q;" + lpGuid + ";" + lpselfnum + ";" + self.name + "\n"); - bbPrint( "mpquits: name %s client %d", self.name, lpselfnum ); - - self maps\mp\_gamerep::gameRepPlayerDisconnected(); - - for ( entry = 0; entry < level.players.size; entry++ ) - { - if ( level.players[entry] == self ) - { - while ( entry < level.players.size-1 ) - { - level.players[entry] = level.players[entry+1]; - entry++; - } - level.players[entry] = undefined; - break; - } - } - for ( entry = 0; entry < level.players.size; entry++ ) - { - if ( isDefined( level.players[entry].pers["killed_players"][self.name] ) ) - level.players[entry].pers["killed_players"][self.name] = undefined; - - if ( isDefined( level.players[entry].killedPlayersCurrent[self.name] ) ) - level.players[entry].killedPlayersCurrent[self.name] = undefined; - - if ( isDefined( level.players[entry].pers["killed_by"][self.name] ) ) - level.players[entry].pers["killed_by"][self.name] = undefined; - - if ( isDefined( level.players[entry].pers["nemesis_tracking"][self.name] ) ) - level.players[entry].pers["nemesis_tracking"][self.name] = undefined; - - // player that disconnected was our nemesis - if ( level.players[entry].pers["nemesis_name"] == self.name ) - { - level.players[entry] chooseNextBestNemesis(); - } - } - - if ( level.gameEnded ) - self maps\mp\gametypes\_globallogic::removeDisconnectedPlayerFromPlacement(); - - level thread maps\mp\gametypes\_globallogic::updateTeamStatus(); -} - -chooseNextBestNemesis() -{ - nemesisArray = self.pers["nemesis_tracking"]; - nemesisArrayKeys = getArrayKeys( nemesisArray ); - nemesisAmount = 0; - nemesisName = ""; - - if ( nemesisArrayKeys.size > 0 ) - { - for ( i = 0; i < nemesisArrayKeys.size; i++ ) - { - nemesisArrayKey = nemesisArrayKeys[i]; - if ( nemesisArray[nemesisArrayKey] > nemesisAmount ) - { - nemesisName = nemesisArrayKey; - nemesisAmount = nemesisArray[nemesisArrayKey]; - } - - } - } - - self.pers["nemesis_name"] = nemesisName; - - if ( nemesisName != "" ) - { - playerIndex = 0; - for( ; playerIndex < level.players.size; playerIndex++ ) - { - if ( level.players[playerIndex].name == nemesisName ) - { - nemesisPlayer = level.players[playerIndex]; - self.pers["nemesis_rank"] = nemesisPlayer.pers["rank"]; - self.pers["nemesis_rankIcon"] = nemesisPlayer.pers["rankxp"]; - self.pers["nemesis_xp"] = nemesisPlayer.pers["prestige"]; - self.pers["nemesis_xuid"] = nemesisPlayer GetXUID(true); - break; - } - } - } - else - { - self.pers["nemesis_xuid"] = ""; - } -} - -removePlayerOnDisconnect() -{ - for ( entry = 0; entry < level.players.size; entry++ ) - { - if ( level.players[entry] == self ) - { - while ( entry < level.players.size-1 ) - { - level.players[entry] = level.players[entry+1]; - entry++; - } - level.players[entry] = undefined; - break; - } - } -} - -custom_gamemodes_modified_damage( victim, eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ) -{ - // regular public matches should early out - if ( level.onlinegame && !GetDvarInt( #"xblive_privatematch" ) ) - { - return iDamage; - } - - if( maps\mp\gametypes\_customClasses::isUsingCustomGameModeClasses() && isDefined( eAttacker ) ) - { - if( maps\mp\gametypes\_class::isExplosiveDamage( sMeansOfDeath, sWeapon ) ) - { - iDamage *= eAttacker maps\mp\gametypes\_customClasses::getExplosiveDamageModifier(); - } - else - { - iDamage *= eAttacker maps\mp\gametypes\_customClasses::getDamageModifier(); - } - } - if( isdefined( eAttacker) && isDefined( eAttacker.damageModifier ) ) - { - iDamage *= eAttacker.damageModifier; - } - if ( ( sMeansOfDeath == "MOD_PISTOL_BULLET" ) || ( sMeansOfDeath == "MOD_RIFLE_BULLET" ) ) - { - iDamage = int( iDamage * GetDvarFloat( #"scr_game_bulletdamage" ) ); - } - - return iDamage; -} - -custom_gamemodes_vampirism_health( iDamage, eAttacker ) -{ - // regular public matches should early out - if ( level.onlinegame && !GetDvarInt( #"xblive_privatematch" ) ) - { - return 0; - } - - return Int(iDamage * eAttacker maps\mp\gametypes\_customClasses::getHealthVampirismModifier()); -} - -figureOutAttacker( eAttacker ) -{ - if ( isdefined(eAttacker) ) - { - if( isai(eAttacker) && isDefined( eAttacker.script_owner ) ) - { - team = self.team; - - if ( IsAi( self ) && IsDefined( self.aiteam ) ) - { - team = self.aiteam; - } - - if ( eAttacker.script_owner.team != team ) - eAttacker = eAttacker.script_owner; - } - - if( eAttacker.classname == "script_vehicle" && isDefined( eAttacker.owner ) ) - eAttacker = eAttacker.owner; - else if( eAttacker.classname == "auto_turret" && isDefined( eAttacker.owner ) ) - eAttacker = eAttacker.owner; - } - - return eAttacker; -} - -figureOutWeapon( sWeapon, eInflictor ) -{ - // explosive barrel/car detection - if ( sWeapon == "none" && isDefined( eInflictor ) ) - { - if ( isDefined( eInflictor.targetname ) && eInflictor.targetname == "explodable_barrel" ) - { - sWeapon = "explodable_barrel_mp"; - } - else if ( isDefined( eInflictor.destructible_type ) && isSubStr( eInflictor.destructible_type, "vehicle_" ) ) - { - sWeapon = "destructible_car_mp"; - } - } - - return sWeapon; -} - - -handleFlameDamage( eAttacker, eInflictor, iDamage, sWeapon, sMeansOfDeath) -{ - switch( sWeapon ) - { - case "none": - if ( !self hasperk( "specialty_fireproof" ) ) - { - self thread maps\mp\_burnplayer::walkedThroughFlames( eAttacker, eInflictor, sWeapon ); - } - break; - case "m2_flamethrower_mp": - if ( !self hasperk( "specialty_fireproof" ) ) - { - self thread maps\mp\_burnplayer::burnedWithFlameThrower( sWeapon ); - } - break; - case "napalm_mp": - if ( !self hasperk( "specialty_fireproof" ) ) - { - if (isdefined (level.minDamageRequiredForNapalmBurn) && iDamage > level.minDamageRequiredForNapalmBurn) - { - self thread maps\mp\_burnplayer::hitWithNapalmStrike(eAttacker, eInflictor, "MOD_BURNED" ); - } - else - { - self thread maps\mp\_burnplayer::walkedThroughFlames( eAttacker, eInflictor, sWeapon ); - } - } - break; - case "rottweil72_mp": - //if ( !self hasperk( "specialty_fireproof" ) ) - //{ - // self thread maps\mp\_burnplayer::burnedWithDragonsBreath( eAttacker, eInflictor, sWeapon ); - //} - break; - - default: - if( GetSubStr( sWeapon, 0, 3 ) == "ft_" ) - { - if ( !self hasperk( "specialty_fireproof" ) ) - { - self thread maps\mp\_burnplayer::burnedWithFlameThrower( eAttacker, eInflictor, sWeapon ); - } - } - break; - } -} - -Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime ) -{ - // create a class specialty checks; CAC:bulletdamage, CAC:armorvest - iDamage = maps\mp\gametypes\_class::cac_modified_damage( self, eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ); - iDamage = custom_gamemodes_modified_damage( self, eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ); - - iDamage = int(iDamage); - self.iDFlags = iDFlags; - self.iDFlagsTime = getTime(); - - if ( game["state"] == "postgame" ) - return; - - if ( self.sessionteam == "spectator" ) - return; - - if ( isDefined( self.canDoCombat ) && !self.canDoCombat ) - return; - - if ( isDefined( eAttacker ) && isPlayer( eAttacker ) ) - { - if( isDefined( eAttacker.canDoCombat ) && !eAttacker.canDoCombat ) - return; - - if( eAttacker.team == "spectator" || ( isDefined( eAttacker.teamSwitchExploit ) && eAttacker.teamSwitchExploit ) ) - { -/# - println( "teamSwitchExploit prevented damage from " + eAttacker.name + ".\n" ); -#/ - return; - } - } - - if ( isDefined( level.hostMigrationTimer ) ) - return; - - eAttacker = figureOutAttacker( eAttacker ); - - pixbeginevent( "PlayerDamage flags/tweaks" ); - - // Don't do knockback if the damage direction was not specified - if( !isDefined( vDir ) ) - iDFlags |= level.iDFLAGS_NO_KNOCKBACK; - - self maps\mp\gametypes\_bot::bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ); - - friendly = false; - // Todo MGordon - Fix this stat collection - //self thread maps\mp\gametypes\_globallogic_score::threadedSetStatLBByName( sWeapon, 1, "hits by", 2 ); - - if ( ((self.health == self.maxhealth)) || !isDefined( self.attackers ) ) - { - self.attackers = []; - self.attackerData = []; - self.attackerDamage = []; - self.firstTimeDamaged = getTime(); - } - // added check to notify chatter to play pain vo - if (self.health != self.maxhealth) - { - self notify( "snd_pain_player" ); - } - - if ( IsDefined( eInflictor) && IsDefined( eInflictor.script_noteworthy) && eInflictor.script_noteworthy == "ragdoll_now" ) - { - sMeansOfDeath = "MOD_FALLING"; - } - - if ( maps\mp\gametypes\_globallogic_utils::isHeadShot( sWeapon, sHitLoc, sMeansOfDeath ) && isPlayer(eAttacker) ) - { - //Turning off damage headshot sounds to avoid confusion from the killing headshot sound. - //if (self.team != eAttacker.team) - //{ - // eAttacker playLocalSound( "prj_bullet_impact_headshot_helmet_nodie_2d" ); - //} - sMeansOfDeath = "MOD_HEAD_SHOT"; - } - - modifiedDamage = [[level.onPlayerDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime ); - if ( isDefined( modifiedDamage ) ) - iDamage = modifiedDamage; - - if ( maps\mp\gametypes\_tweakables::getTweakableValue( "game", "onlyheadshots" ) ) - { - if ( sMeansOfDeath == "MOD_PISTOL_BULLET" || sMeansOfDeath == "MOD_RIFLE_BULLET" ) - return; - else if ( sMeansOfDeath == "MOD_HEAD_SHOT" ) - iDamage = 150; - } - - // Make all vehicle drivers invulnerable to bullets - if ( self maps\mp\_vehicles::player_is_occupant_invulnerable( sMeansOfDeath ) ) - return; - - if (isdefined (eAttacker) && isPlayer(eAttacker) && (self.team != eAttacker.team)) - { - self.lastAttackWeapon = sWeapon; - - if ( eAttacker maps\mp\_vehicles::player_is_driver() ) - { - vehicle = eAttacker GetVehicleOccupied(); - self.lastTankThatAttacked = vehicle; - self thread maps\mp\gametypes\_globallogic_vehicle::clearLastTankAttacker(); - } - - // rottweil72 shoots dragon's breath rounds, so show a little fire on the player who got damaged - if( sMeansOfDeath == "MOD_BURNED" || sWeapon == "rottweil72_mp" ) - { - handleFlameDamage( eAttacker, eInflictor, iDamage, sWeapon, sMeansOfDeath); - } - } - - sWeapon = figureOutWeapon( sWeapon, eInflictor ); - - pixendevent( "END: PlayerDamage flags/tweaks" ); - - if( iDFlags & level.iDFLAGS_PENETRATION && isplayer ( eAttacker ) && eAttacker hasPerk( "specialty_bulletpenetration" ) ) - self thread maps\mp\gametypes\_battlechatter_mp::perkSpecificBattleChatter( "deepimpact", true ); - - // check for completely getting out of the damage - if( !(iDFlags & level.iDFLAGS_NO_PROTECTION) ) - { - if( ( isSubStr( sMeansOfDeath, "MOD_GRENADE" ) || isSubStr( sMeansOfDeath, "MOD_EXPLOSIVE" ) || isSubStr( sMeansOfDeath, "MOD_PROJECTILE" ) || isSubStr( sMeansOfDeath, "MOD_GAS" ) ) && - isDefined( eInflictor ) ) - { - // protect players from spawnkill grenades, tabun and incendiary - if ( ( eInflictor.classname == "grenade" || sweapon == "tabun_gas_mp" ) && (self.lastSpawnTime + 3500) > getTime() && distance( eInflictor.origin, self.lastSpawnPoint.origin ) < 250 ) - { -// pixmarker( "END: Callback_PlayerDamage player" ); - return; - } - - self.explosiveInfo = []; - self.explosiveInfo["damageTime"] = getTime(); - self.explosiveInfo["damageId"] = eInflictor getEntityNumber(); - self.explosiveInfo["returnToSender"] = false; - self.explosiveInfo["bulletPenetrationKill"] = false; - self.explosiveInfo["chainKill"] = false; - self.explosiveInfo["counterKill"] = false; - self.explosiveInfo["chainKill"] = false; - self.explosiveInfo["cookedKill"] = false; - self.explosiveInfo["weapon"] = sWeapon; - self.explosiveInfo["originalowner"] = eInflictor.originalowner; - - isFrag = isSubStr( sWeapon, "frag_" ); - - if ( eAttacker != self ) - { - if ( (isSubStr( sWeapon, "satchel_" ) || isSubStr( sWeapon, "claymore_" ) ) && isDefined( eAttacker ) && isDefined( eInflictor.owner ) ) - { - self.explosiveInfo["returnToSender"] = (eInflictor.owner == self); - self.explosiveInfo["counterKill"] = isDefined( eInflictor.wasDamaged ); - self.explosiveInfo["chainKill"] = isDefined( eInflictor.wasChained ); - self.explosiveInfo["ohnoyoudontKill"] = isDefined( eInflictor.wasJustPlanted ); - self.explosiveInfo["bulletPenetrationKill"] = isDefined( eInflictor.wasDamagedFromBulletPenetration ); - self.explosiveInfo["cookedKill"] = false; - } - if ( ( sWeapon == "sticky_grenade_mp" || sWeapon == "explosive_bolt_mp" ) && isDefined( eInflictor ) && isdefined( eInflictor.stuckToPlayer ) ) - { - self.explosiveInfo["stuckToPlayer"] = eInflictor.stuckToPlayer; - } - if ( isDefined( eAttacker.lastGrenadeSuicideTime ) && eAttacker.lastGrenadeSuicideTime >= gettime() - 50 && isFrag ) - { - self.explosiveInfo["suicideGrenadeKill"] = true; - } - else - { - self.explosiveInfo["suicideGrenadeKill"] = false; - } - } - - if ( isFrag ) - { - self.explosiveInfo["cookedKill"] = isDefined( eInflictor.isCooked ); - self.explosiveInfo["throwbackKill"] = isDefined( eInflictor.threwBack ); - } - - if( isPlayer( eAttacker ) && eAttacker != self ) - { - self maps\mp\gametypes\_globallogic_score::setInflictorStat( eInflictor, eAttacker, sWeapon ); - } - } - - if( isSubStr( sMeansOfDeath, "MOD_IMPACT" ) && isDefined( eAttacker ) && isPlayer( eAttacker ) && eAttacker != self ) - { - if ( sWeapon != "knife_ballistic_mp" ) - { - self maps\mp\gametypes\_globallogic_score::setInflictorStat( eInflictor, eAttacker, sWeapon ); - } - - if ( sWeapon == "hatchet_mp" && isDefined( eInflictor ) ) - { - self.explosiveInfo["projectile_bounced"] = isDefined( eInflictor.bounced ); - } - } - - if ( isPlayer( eAttacker ) ) - eAttacker.pers["participation"]++; - - prevHealthRatio = self.health / self.maxhealth; - - if ( level.teamBased && isPlayer( eAttacker ) && (self != eAttacker) && (self.team == eAttacker.team) ) - { - pixmarker( "BEGIN: PlayerDamage player" ); // profs automatically end when the function returns - if ( level.friendlyfire == 0 ) // no one takes damage - { - if ( sWeapon == "artillery_mp" || sWeapon == "airstrike_mp" || sWeapon == "napalm_mp" || sWeapon == "mortar_mp" ) - self damageShellshockAndRumble( eAttacker, eInflictor, sWeapon, sMeansOfDeath, iDamage ); - return; - } - else if ( level.friendlyfire == 1 ) // the friendly takes damage - { - // Make sure at least one point of damage is done - if ( iDamage < 1 ) - iDamage = 1; - - //check for friendly fire at the begining of the match. apply the damage to the attacker only - if( level.friendlyFireDelay && level.friendlyFireDelayTime >= ( ( ( gettime() - level.startTime ) - level.discardTime ) / 1000 ) ) - { - eAttacker.lastDamageWasFromEnemy = false; - - eAttacker.friendlydamage = true; - eAttacker finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); - eAttacker.friendlydamage = undefined; - } - else - { - self.lastDamageWasFromEnemy = false; - - self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); - } - } - else if ( level.friendlyfire == 2 && isAlive( eAttacker ) ) // only the attacker takes damage - { - iDamage = int(iDamage * .5); - - // Make sure at least one point of damage is done - if(iDamage < 1) - iDamage = 1; - - eAttacker.lastDamageWasFromEnemy = false; - - eAttacker.friendlydamage = true; - eAttacker finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); - eAttacker.friendlydamage = undefined; - } - else if ( level.friendlyfire == 3 && isAlive( eAttacker ) ) // both friendly and attacker take damage - { - iDamage = int(iDamage * .5); - - // Make sure at least one point of damage is done - if ( iDamage < 1 ) - iDamage = 1; - - self.lastDamageWasFromEnemy = false; - eAttacker.lastDamageWasFromEnemy = false; - - self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); - eAttacker.friendlydamage = true; - eAttacker finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); - eAttacker.friendlydamage = undefined; - } - - friendly = true; - pixmarker( "END: PlayerDamage player" ); - } - else - { - // Make sure at least one point of damage is done - if(iDamage < 1) - iDamage = 1; - - if ( isDefined( eAttacker ) && isPlayer( eAttacker ) && allowedAssistWeapon( sWeapon ) ) - { - trackAttackerDamage( eAttacker, iDamage, sMeansOfDeath, sWeapon ); - } - - giveInflictorOwnerAssist( eAttacker, eInflictor, iDamage, sMeansOfDeath, sWeapon ); - - if ( isdefined( eAttacker ) ) - level.lastLegitimateAttacker = eAttacker; - - if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( sWeapon ) && !issubstr( sMeansOfDeath, "MOD_MELEE" ) ) - eAttacker thread maps\mp\gametypes\_weapons::checkHit( sWeapon ); - - if ( issubstr( sMeansOfDeath, "MOD_GRENADE" ) && isDefined( eInflictor.isCooked ) ) - self.wasCooked = getTime(); - else - self.wasCooked = undefined; - - self.lastDamageWasFromEnemy = (isDefined( eAttacker ) && (eAttacker != self)); - - if ( self.lastDamageWasFromEnemy ) - eAttacker.damagedPlayers[ self.clientId ] = getTime(); - - self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); - - self thread maps\mp\gametypes\_missions::playerDamaged(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, sHitLoc ); - - if ( isdefined ( eAttacker ) ) - { - // if vampirism is on, give the attacker health as a % of damage done to the player - eAttacker.health += custom_gamemodes_vampirism_health( iDamage, eAttacker ); - } - } - - if ( isdefined(eAttacker) && isplayer( eAttacker ) && eAttacker != self ) - { - if ( doDamageFeedback( sWeapon, eInflictor ) ) - { - hasBodyArmor = false; - - if ( iDamage > 0 ) - { - // if the attacker has tactical mask pro then we show the special yellow indicator - if( IsPlayer( eAttacker ) && eAttacker HasPerk( "specialty_shades" ) && eAttacker HasPerk( "specialty_stunprotection" ) && eAttacker HasPerk( "specialty_gas_mask" ) ) - { - // show the yellow indicator if this is a flash or concussion grenade and they don't have tactical mask on - if( sMeansOfDeath == "MOD_GRENADE_SPLASH" && - ( sWeapon == "flash_grenade_mp" || sWeapon == "concussion_grenade_mp" ) && - ( !self HasPerk( "specialty_shades" ) || !self HasPerk( "specialty_stunprotection" ) ) ) - { - eAttacker thread maps\mp\gametypes\_damagefeedback::updateSpecialDamageFeedback( self ); - } - } - - eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( hasBodyArmor, sMeansOfDeath ); - } - } - } - - self.hasDoneCombat = true; - } - - if(self.sessionstate != "dead") - self maps\mp\gametypes\_gametype_variants::onPlayerTakeDamage( eAttacker, eInflictor, sWeapon, iDamage, sMeansOfDeath ); - - if ( isdefined( eAttacker ) && eAttacker != self && !friendly ) - level.useStartSpawns = false; - - pixbeginevent( "PlayerDamage log" ); - - // Do debug print if it's enabled - if(GetDvarInt( #"g_debugDamage")) - println("client:" + self getEntityNumber() + " health:" + self.health + " attacker:" + eAttacker.clientid + " inflictor is player:" + isPlayer(eInflictor) + " damage:" + iDamage + " hitLoc:" + sHitLoc); - - if(self.sessionstate != "dead") - { - lpselfnum = self getEntityNumber(); - lpselfname = self.name; - lpselfteam = self.team; - lpselfGuid = self getGuid(); - lpattackerteam = ""; - lpattackerorigin = ( 0, 0, 0 ); - - if(isPlayer(eAttacker)) - { - lpattacknum = eAttacker getEntityNumber(); - lpattackGuid = eAttacker getGuid(); - lpattackname = eAttacker.name; - lpattackerteam = eAttacker.team; - lpattackerorigin = eAttacker.origin; - bbPrint( "mpattacks: gametime %d attackerspawnid %d attackerweapon %s attackerx %f attackery %f attackerz %f victimspawnid %d victimx %f victimy %f victimz %f damage %d damagetype %s damagelocation %s death 0", - gettime(), getplayerspawnid( eAttacker ), sWeapon, lpattackerorigin, getplayerspawnid( self ), self.origin, iDamage, sMeansOfDeath, sHitLoc ); - } - else - { - lpattacknum = -1; - lpattackGuid = ""; - lpattackname = ""; - lpattackerteam = "world"; - bbPrint( "mpattacks: gametime %d attackerweapon %s victimspawnid %d victimx %f victimy %f victimz %f damage %d damagetype %s damagelocation %s death 0", - gettime(), sWeapon, getplayerspawnid( self ), self.origin, iDamage, sMeansOfDeath, sHitLoc ); - } - logPrint("D;" + lpselfGuid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackGuid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n"); - } - -/# - if ( GetDvarInt( #"scr_hitloc_debug") ) - { - if ( !isdefined( eAttacker.hitlocInited ) ) - { - for ( i = 0; i < 6; i++ ) - { - eAttacker setClientDvar( "ui_hitloc_" + i, "" ); - } - eAttacker.hitlocInited = true; - } - - if ( isPlayer( eAttacker ) && !level.splitscreen ) - { - colors = []; - colors[0] = 2; - colors[1] = 3; - colors[2] = 5; - colors[3] = 7; - - elemcount = 6; - if ( !isdefined( eAttacker.damageInfo ) ) - { - eAttacker.damageInfo = []; - for ( i = 0; i < elemcount; i++ ) - { - eAttacker.damageInfo[i] = spawnstruct(); - eAttacker.damageInfo[i].damage = 0; - eAttacker.damageInfo[i].hitloc = ""; - eAttacker.damageInfo[i].bp = false; - eAttacker.damageInfo[i].jugg = false; - eAttacker.damageInfo[i].colorIndex = 0; - } - eAttacker.damageInfoColorIndex = 0; - eAttacker.damageInfoVictim = undefined; - } - - for ( i = elemcount-1; i > 0; i-- ) - { - eAttacker.damageInfo[i].damage = eAttacker.damageInfo[i - 1].damage; - eAttacker.damageInfo[i].hitloc = eAttacker.damageInfo[i - 1].hitloc; - eAttacker.damageInfo[i].bp = eAttacker.damageInfo[i - 1].bp; - eAttacker.damageInfo[i].jugg = eAttacker.damageInfo[i - 1].jugg; - eAttacker.damageInfo[i].colorIndex = eAttacker.damageInfo[i - 1].colorIndex; - } - eAttacker.damageInfo[0].damage = iDamage; - eAttacker.damageInfo[0].hitloc = sHitLoc; - eAttacker.damageInfo[0].bp = (iDFlags & level.iDFLAGS_PENETRATION); - eAttacker.damageInfo[0].jugg = false; - if ( isdefined( eAttacker.damageInfoVictim ) && eAttacker.damageInfoVictim != self ) - { - eAttacker.damageInfoColorIndex++; - if ( eAttacker.damageInfoColorIndex == colors.size ) - eAttacker.damageInfoColorIndex = 0; - } - eAttacker.damageInfoVictim = self; - eAttacker.damageInfo[0].colorIndex = eAttacker.damageInfoColorIndex; - - for ( i = 0; i < elemcount; i++ ) - { - color = "^" + colors[ eAttacker.damageInfo[i].colorIndex ]; - if ( eAttacker.damageInfo[i].hitloc != "" ) - { - val = color + eAttacker.damageInfo[i].hitloc; - if ( eAttacker.damageInfo[i].bp ) - val += " (BP)"; - if ( eAttacker.damageInfo[i].jugg ) - val += " (Jugg)"; - eAttacker setClientDvar( "ui_hitloc_" + i, val ); - } - eAttacker setClientDvar( "ui_hitloc_damage_" + i, color + eAttacker.damageInfo[i].damage ); - } - } - } -#/ - pixendevent( "END: PlayerDamage log" ); -} - -resetAttackerList() -{ - self endon( "disconnect" ); - self endon( "death" ); - level endon( "game_ended" ); - - self.attackers = []; - self.attackerData = []; - self.attackerDamage = []; -} - -doDamageFeedback( sWeapon, eInflictor ) -{ - if ( !IsDefined( sWeapon ) ) - return false; - - switch(sWeapon) - { - case "artillery_mp": - case "airstrike_mp": - case "napalm_mp": - case "mortar_mp": - case "tow_turret_mp": - case "auto_gun_turret_mp": - case "cobra_20mm_comlink_mp": - return false; - } - - if ( IsDefined( eInflictor ) ) - { - if ( IsAI(eInflictor) ) - { - return false; - } - } - - return true; -} - -doPrintDamage(dmg, hitloc) -{ - huddamage = newclienthudelem(self); - huddamage.alignx = "center"; - huddamage.horzalign = "center"; - huddamage.x = 10; - huddamage.y = 235; - huddamage.fontscale = 1.6; - huddamage.font = "objective"; - huddamage setvalue(dmg); - - if (hitloc == "head") - huddamage.color = (1, 1, 0.25); - - huddamage moveovertime(1); - huddamage fadeovertime(1); - huddamage.alpha = 0; - huddamage.x = randomIntRange(25, 70); - - val = 1; - if (cointoss()) - val = -1; - - huddamage.y = 235 + randomIntRange(25, 70) * val; - - wait 1; - - huddamage destroy(); -} - -finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime ) -{ - pixbeginevent("finishPlayerDamageWrapper"); - - if ( isDefined( eAttacker ) && isPlayer( eAttacker ) ) - eAttacker thread doPrintDamage(iDamage, sHitLoc); - else if( isDefined( eAttacker.owner ) && isPlayer( eAttacker.owner ) ) - eAttacker.owner thread doPrintDamage(iDamage, sHitLoc); - - surface = "flesh"; - - if ( self.cac_body_type == "body_armor_mp" ) - { - surface = "metal"; - } - - self finishPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, surface ); - - if ( GetDvar( #"scr_csmode" ) != "" ) - self shellShock( "damage_mp", 0.2 ); - - self damageShellshockAndRumble( eAttacker, eInflictor, sWeapon, sMeansOfDeath, iDamage ); - pixendevent(); -} - -allowedAssistWeapon( weapon ) -{ - if ( !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( weapon ) ) - return true; - - if (maps\mp\gametypes\_hardpoints::isKillstreakWeaponAssistAllowed( weapon ) ) - return true; - - return false; -} - -GiveCustomGameModePlayerKilledScore( attacker, sMeansOfDeath ) -{ - if( !maps\mp\gametypes\_customClasses::isCustomGame() ) - return; - - if( level.gameType != "tdm" && level.gameType != "dm" ) - return; - - if( isDefined( attacker ) && ( self == attacker || ( attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" ) ) ) - { - maps\mp\gametypes\_globallogic_score::givePlayerScore( "suicide", self, self ); - maps\mp\gametypes\_globallogic_score::giveTeamScore( "suicide", self.team, self, self ); - return; // no other bonuses if you're suicidin' - } - - if( sMeansOfDeath == "MOD_HEAD_SHOT" ) - { - maps\mp\gametypes\_globallogic_score::givePlayerScore( "headshot", attacker, self ); - maps\mp\gametypes\_globallogic_score::giveTeamScore( "headshot", attacker.team, attacker, self ); - } - if( isDefined( level.placement ) ) - { - maps\mp\gametypes\_globallogic::updatePlacement(); - if( attacker maps\mp\gametypes\_customClasses::shouldGiveLeaderBonus() ) - { - leaderbonus = getDvarInt( "scr_" + level.gameType + "_bonus_leader" ); - if( isDefined( leaderBonus ) ) - { - maps\mp\gametypes\_globallogic_score::_setPlayerScore( attacker, attacker.pers["score"] + leaderBonus ); - maps\mp\gametypes\_globallogic_score::onTeamScore( leaderBonus, attacker.team, attacker, self ); - maps\mp\gametypes\_globallogic_score::updateTeamScores( attacker.team ); - } - } - } - maps\mp\gametypes\_globallogic_score::givePlayerScore( "death", self, self ); - maps\mp\gametypes\_globallogic_score::giveTeamScore( "death", self.team, self, self ); - -} - -Callback_PlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration) -{ - self endon( "spawned" ); - self notify( "killed_player" ); - - if ( self.sessionteam == "spectator" ) - return; - - if ( game["state"] == "postgame" ) - return; - - self needsRevive( false ); - - if ( isdefined( self.burning ) && self.burning == true ) - { - self setburn( 0 ); - } - - self.suicide = false; - - if ( isDefined( level.takeLivesOnDeath ) && ( level.takeLivesOnDeath == true ) ) - { - if ( self.pers["lives"] ) - { - self.pers["lives"]--; - if ( self.pers["lives"] == 0 ) - { - level notify( "player_eliminated" ); - self notify( "player_eliminated" ); - } - - } - } - - sWeapon = updateWeapon( eInflictor, sWeapon ); - - pixbeginevent( "PlayerKilled pre constants" ); - - wasInLastStand = false; - deathTimeOffset = 0; - lastWeaponBeforeDroppingIntoLastStand = undefined; - attackerStance = undefined; - self.lastStandThisLife = undefined; - self.vAttackerOrigin = undefined; - - if ( isdefined( self.useLastStandParams ) ) - { - self.useLastStandParams = undefined; - - assert( isdefined( self.lastStandParams ) ); - if ( !level.teamBased || ( !isDefined( attacker ) || !isplayer( attacker ) || attacker.team != self.team || attacker == self ) ) - { - eInflictor = self.lastStandParams.eInflictor; - attacker = self.lastStandParams.attacker; - attackerStance = self.lastStandParams.attackerStance; - iDamage = self.lastStandParams.iDamage; - sMeansOfDeath = self.lastStandParams.sMeansOfDeath; - sWeapon = self.lastStandParams.sWeapon; - vDir = self.lastStandParams.vDir; - sHitLoc = self.lastStandParams.sHitLoc; - self.vAttackerOrigin = self.lastStandParams.vAttackerOrigin; - deathTimeOffset = (gettime() - self.lastStandParams.lastStandStartTime) / 1000; - - self thread maps\mp\gametypes\_battlechatter_mp::perkSpecificBattleChatter( "secondchance" ); - - if ( isDefined( self.previousPrimary ) ) - { - wasInLastStand = true; - lastWeaponBeforeDroppingIntoLastStand = self.previousPrimary; - } - } - self.lastStandParams = undefined; - } - - bestPlayer = undefined; - bestPlayerMeansOfDeath = undefined; - obituaryMeansOfDeath = undefined; - bestPlayerWeapon = undefined; - obituaryWeapon = undefined; - - if ( (!isDefined( attacker ) || attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" || ( isdefined( attacker.isMagicBullet ) && attacker.isMagicBullet == true ) || attacker == self ) && isDefined( self.attackers ) ) - { - if ( !isDefined(bestPlayer) ) - { - for ( i = 0; i < self.attackers.size; i++ ) - { - player = self.attackers[i]; - if ( !isDefined( player ) ) - continue; - - if (!isDefined( self.attackerDamage[ player.clientId ] ) || ! isDefined( self.attackerDamage[ player.clientId ].damage ) ) - continue; - - if ( player == self || (level.teamBased && player.team == self.team ) ) - continue; - - if ( self.attackerDamage[ player.clientId ].lasttimedamaged + 2500 < getTime() ) - continue; - - if ( !allowedAssistWeapon( self.attackerDamage[ player.clientId ].weapon ) ) - continue; - - if ( self.attackerDamage[ player.clientId ].damage > 1 && ! isDefined( bestPlayer ) ) - { - bestPlayer = player; - bestPlayerMeansOfDeath = self.attackerDamage[ player.clientId ].meansOfDeath; - bestPlayerWeapon = self.attackerDamage[ player.clientId ].weapon; - } - else if ( isDefined( bestPlayer ) && self.attackerDamage[ player.clientId ].damage > self.attackerDamage[ bestPlayer.clientId ].damage ) - { - bestPlayer = player; - bestPlayerMeansOfDeath = self.attackerDamage[ player.clientId ].meansOfDeath; - bestPlayerWeapon = self.attackerDamage[ player.clientId ].weapon; - } - } - } - if ( isdefined ( bestPlayer ) ) - bestPlayer maps\mp\_medals::assistedSuicide(bestPlayerWeapon); - } - - if ( isdefined ( bestPlayer ) ) - { - attacker = bestPlayer; - obituaryMeansOfDeath = bestPlayerMeansOfDeath; - obituaryWeapon = bestPlayerWeapon; - } - - if ( isplayer( attacker ) ) - attacker.damagedPlayers[self.clientid] = undefined; - - if( maps\mp\gametypes\_globallogic_utils::isHeadShot( sWeapon, sHitLoc, sMeansOfDeath ) && isPlayer( attacker ) ) - { - attacker playLocalSound( "prj_bullet_impact_headshot_helmet_nodie_2d" ); - //attacker playLocalSound( "prj_bullet_impact_headshot_2d" ); - - sMeansOfDeath = "MOD_HEAD_SHOT"; - } - - self.deathTime = getTime(); - - attacker = updateAttacker( attacker ); - eInflictor = updateInflictor( eInflictor ); - - sMeansOfDeath = updateMeansOfDeath( sWeapon, sMeansOfDeath ); - - self thread updateGlobalBotKilledCounter(); - if ( maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - level.globalKillstreaksDeathsFrom++; - } - - // Don't increment weapon stats for team kills or deaths - if ( isPlayer( attacker ) && attacker != self && ( !level.teamBased || ( level.teamBased && self.team != attacker.team ) ) ) - { - self thread maps\mp\gametypes\_globallogic_score::trackLeaderBoardDeathStats( sWeapon, sMeansOfDeath ); - - if ( wasInLastStand && isDefined( lastWeaponBeforeDroppingIntoLastStand ) ) - weaponName = lastWeaponBeforeDroppingIntoLastStand; - else - weaponName = self.lastdroppableweapon; - - if ( isDefined( weaponName ) && ( isSubStr( weaponName, "gl_" ) || isSubStr( weaponName, "mk_" ) || isSubStr( weaponName, "ft_" ) ) ) - weaponName = self.currentWeapon; - - if ( isDefined( weaponName ) ) - self thread maps\mp\gametypes\_globallogic_score::trackLeaderBoardDeathsDuringUseStats( weaponName ); - - attacker thread maps\mp\gametypes\_globallogic_score::trackAttackerLeaderBoardDeathStats( sWeapon, sMeansOfDeath ); - } - - if ( !isdefined( obituaryMeansOfDeath ) ) - obituaryMeansOfDeath = sMeansOfDeath; - if ( !isdefined( obituaryWeapon ) ) - obituaryWeapon = sWeapon; - - // send out an obituary message to all clients about the kill - if( level.teamBased && isDefined( attacker.pers ) && self.team == attacker.team && obituaryMeansOfDeath == "MOD_GRENADE" && level.friendlyfire == 0 ) - { - obituary(self, self, obituaryWeapon, obituaryMeansOfDeath); - maps\mp\_demo::bookmark( "kill", gettime(), self, self ); - } - else - { - obituary(self, attacker, obituaryWeapon, obituaryMeansOfDeath); - maps\mp\_demo::bookmark( "kill", gettime(), self, attacker ); - } - -// self maps\mp\gametypes\_weapons::updateWeaponUsageStats(); - if ( !level.inGracePeriod ) - { - self maps\mp\gametypes\_weapons::dropScavengerForDeath( attacker ); - self maps\mp\gametypes\_weapons::dropWeaponForDeath( attacker ); - self maps\mp\gametypes\_weapons::dropOffhand(); - } - - maps\mp\gametypes\_spawnlogic::deathOccured(self, attacker); - - self.sessionstate = "dead"; - self.statusicon = "hud_status_dead"; - - self.pers["weapon"] = undefined; - - self.killedPlayersCurrent = []; - - self.deathCount++; - -/# - println( "players("+self.clientId+") death count ++: " + self.deathCount ); -#/ - - if( !isDefined( self.switching_teams ) ) - { - // if team killed we reset kill streak, but dont count death and death streak - if ( isPlayer( attacker ) && level.teamBased && ( attacker != self ) && ( self.team == attacker.team ) ) - { - - self.pers["cur_kill_streak"] = 0; - self.pers["totalKillstreakCount"] = 0; - self.pers["killstreaksEarnedThisKillstreak"] = 0; - } - else - { - self maps\mp\gametypes\_globallogic_score::incPersStat( "deaths", 1, true, true ); - self.deaths = self maps\mp\gametypes\_globallogic_score::getPersStat( "deaths" ); - self maps\mp\gametypes\_globallogic_score::updatePersRatio( "kdratio", "kills", "deaths" ); - - if( self.pers["cur_kill_streak"] > self.pers["best_kill_streak"] ) - self.pers["best_kill_streak"] = self.pers["cur_kill_streak"]; - - // need to keep the current killstreak to see if this was a buzzkill later - self.pers["kill_streak_before_death"] = self.pers["cur_kill_streak"]; - - self.pers["cur_kill_streak"] = 0; - self.pers["totalKillstreakCount"] = 0; - self.pers["killstreaksEarnedThisKillstreak"] = 0; - - self.cur_death_streak++; - - if ( self.cur_death_streak > self.death_streak ) - { - self setDStat( "HighestStats", "death_streak", self.cur_death_streak ); - self.death_streak = self.cur_death_streak; - } - - if( self.cur_death_streak >= GetDvarInt( #"perk_deathStreakCountRequired" ) ) - { - self enabledeathstreak(); - } - } - } - else - { - self.pers["totalKillstreakCount"] = 0; - self.pers["killstreaksEarnedThisKillstreak"] = 0; - } - - lpselfnum = self getEntityNumber(); - lpselfname = self.name; - lpattackGuid = ""; - lpattackname = ""; - lpselfteam = self.team; - lpselfguid = self getGuid(); - lpattackteam = ""; - lpattackorigin = ( 0, 0, 0 ); - - lpattacknum = -1; - - //check if we should award assist points - awardAssists = false; - - pixendevent(); // "PlayerKilled pre constants" ); - - self GiveCustomGameModePlayerKilledScore( attacker, sMeansOfDeath ); - - if( isPlayer( attacker ) ) - { - lpattackGuid = attacker getGuid(); - lpattackname = attacker.name; - lpattackteam = attacker.team; - lpattackorigin = attacker.origin; - - if ( attacker == self ) // killed himself - { - doKillcam = false; - - // switching teams - if ( isDefined( self.switching_teams ) ) - { - if ( !level.teamBased && ((self.leaving_team == "allies" && self.joining_team == "axis") || (self.leaving_team == "axis" && self.joining_team == "allies")) ) - { - playerCounts = self maps\mp\gametypes\_teams::CountPlayers(); - playerCounts[self.leaving_team]--; - playerCounts[self.joining_team]++; - - if( (playerCounts[self.joining_team] - playerCounts[self.leaving_team]) > 1 ) - { - self thread [[level.onXPEvent]]( "suicide" ); - self maps\mp\gametypes\_globallogic_score::incPersStat( "suicides", 1 ); - self.suicides = self maps\mp\gametypes\_globallogic_score::getPersStat( "suicides" ); - } - } - } - else - { - self thread [[level.onXPEvent]]( "suicide" ); - self maps\mp\gametypes\_globallogic_score::incPersStat( "suicides", 1 ); - self.suicides = self maps\mp\gametypes\_globallogic_score::getPersStat( "suicides" ); - - if ( sMeansOfDeath == "MOD_SUICIDE" && sHitLoc == "none" && self.throwingGrenade ) - { - self.lastGrenadeSuicideTime = gettime(); - } - - //Check for player death related battlechatter - thread maps\mp\gametypes\_battlechatter_mp::onPlayerSuicideOrTeamKill( self, "suicide" ); //Play suicide battlechatter - - //check if assist points should be awarded - awardAssists = true; - self.suicide = true; - } - - if( isDefined( self.friendlydamage ) ) - { - self iPrintLn(&"MP_FRIENDLY_FIRE_WILL_NOT"); - if ( maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillpointloss" ) ) - { - scoreSub = self [[level.getTeamKillScore]]( eInflictor, attacker, sMeansOfDeath, sWeapon); - maps\mp\gametypes\_globallogic_score::_setPlayerScore( attacker,maps\mp\gametypes\_globallogic_score::_getPlayerScore( attacker ) - scoreSub ); - } - } - } - else - { - pixbeginevent( "PlayerKilled attacker" ); - - lpattacknum = attacker getEntityNumber(); - - doKillcam = true; - - self thread maps\mp\gametypes\_gametype_variants::playerKilled( attacker ); - - if ( level.teamBased && self.team == attacker.team && sMeansOfDeath == "MOD_GRENADE" && level.friendlyfire == 0 ) - { - } - else if ( level.teamBased && self.team == attacker.team ) // killed by a friendly - { - attacker thread [[level.onXPEvent]]( "teamkill" ); - - if ( !IgnoreTeamKills( sWeapon, sMeansOfDeath ) ) - { - teamkill_penalty = self [[level.getTeamKillPenalty]]( eInflictor, attacker, sMeansOfDeath, sWeapon); - - attacker maps\mp\gametypes\_globallogic_score::incPersStat( "teamkills_nostats", teamkill_penalty, false ); - attacker maps\mp\gametypes\_globallogic_score::incPersStat( "teamkills", 1 ); //save team kills to player stats - attacker.teamkillsThisRound++; - - if ( maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillpointloss" ) ) - { - scoreSub = self [[level.getTeamKillScore]]( eInflictor, attacker, sMeansOfDeath, sWeapon); - maps\mp\gametypes\_globallogic_score::_setPlayerScore( attacker,maps\mp\gametypes\_globallogic_score::_getPlayerScore( attacker ) - scoreSub ); - } - - if ( maps\mp\gametypes\_globallogic_utils::getTimePassed() < 5000 ) - teamKillDelay = 1; - else if ( attacker.pers["teamkills_nostats"] > 1 && maps\mp\gametypes\_globallogic_utils::getTimePassed() < (8000 + (attacker.pers["teamkills_nostats"] * 1000)) ) - teamKillDelay = 1; - else - teamKillDelay = attacker TeamKillDelay(); - - if ( teamKillDelay > 0 ) - { - attacker.teamKillPunish = true; - attacker suicide(); - - if ( attacker ShouldTeamKillKick(teamKillDelay) ) - { - attacker TeamKillKick(); - } - - attacker thread reduceTeamKillsOverTime(); - } - - //Play teamkill battlechatter - if( isPlayer( attacker ) ) - thread maps\mp\gametypes\_battlechatter_mp::onPlayerSuicideOrTeamKill( attacker, "teamkill" ); - } - } - else - { - maps\mp\gametypes\_globallogic_score::incTotalKills(attacker.team); - - attacker thread maps\mp\gametypes\_globallogic_score::giveKillStats( sMeansOfDeath, sWeapon, self ); - - self maps\mp\gametypes\_copycat::copycat_clone_loadout( attacker ); - - if ( isAlive( attacker ) ) - { - pixbeginevent("killstreak"); - - if ( !isDefined( eInflictor ) || !isDefined( eInflictor.requiredDeathCount ) || attacker.deathCount == eInflictor.requiredDeathCount ) - { - shouldGiveKillstreak = maps\mp\gametypes\_hardpoints::shouldGiveKillstreak( sWeapon ); - attacker thread maps\mp\_properks::earnedAKill(); - - if ( shouldGiveKillstreak ) - { - attacker maps\mp\gametypes\_hardpoints::addToKillstreakCount(sWeapon); - } - - //Kills gotten through killstreak weapons should not the players killstreak - if ( isDefined( level.killstreaks ) && shouldGiveKillstreak ) - { - attacker.pers["cur_kill_streak"]++; - attacker thread maps\mp\_properks::checkKillCount(); - attacker thread maps\mp\gametypes\_hardpoints::giveKillstreakForStreak(); - } - } - - if( isPlayer( attacker ) ) - self thread maps\mp\gametypes\_battlechatter_mp::onPlayerKillstreak( attacker ); - - pixendevent(); // "killstreak" - } - - - if ( attacker.pers["cur_kill_streak"] > attacker.kill_streak ) - { - attacker setDStat( "HighestStats", "kill_streak", attacker.pers["totalKillstreakCount"] ); - attacker.kill_streak = attacker.pers["cur_kill_streak"]; - } - - - if ( attacker.pers["cur_kill_streak"] > attacker.gametype_kill_streak ) - { - attacker maps\mp\gametypes\_persistence::statSetWithGametype( "kill_streak", attacker.pers["cur_kill_streak"] ); - attacker.gametype_kill_streak = attacker.pers["cur_kill_streak"]; - } - - maps\mp\gametypes\_globallogic_score::givePlayerScore( "kill", attacker, self ); - - attacker thread maps\mp\gametypes\_globallogic_score::trackAttackerKill( self.name, self.pers["rank"], self.pers["rankxp"], self.pers["prestige"], self getXuid(true) ); - - attackerName = attacker.name; - self thread maps\mp\gametypes\_globallogic_score::trackAttackeeDeath( attackerName, attacker.pers["rank"], attacker.pers["rankxp"], attacker.pers["prestige"], attacker getXuid(true) ); - self thread maps\mp\_medals::setLastKilledBy( attacker ); - - attacker thread maps\mp\gametypes\_globallogic_score::incKillstreakTracker( sWeapon ); - - // to prevent spectator gain score for team-spectator after throwing a granade and killing someone before he switched - if ( level.teamBased && attacker.team != "spectator") - { - // dog score for team - if( isai(Attacker) ) - maps\mp\gametypes\_globallogic_score::giveTeamScore( "kill", attacker.aiteam, attacker, self ); - else - maps\mp\gametypes\_globallogic_score::giveTeamScore( "kill", attacker.team, attacker, self ); - } - - scoreSub = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "deathpointloss" ); - if ( scoreSub != 0 ) - { - maps\mp\gametypes\_globallogic_score::_setPlayerScore( self, maps\mp\gametypes\_globallogic_score::_getPlayerScore( self ) - scoreSub ); - } - - level thread playKillBattleChatter( attacker, sWeapon ); - - if ( level.teamBased ) - { - //check if assist points should be awarded - awardAssists = true; - } - } - - pixendevent( "PlayerKilled attacker" ); - } - } - else if ( isDefined( attacker ) && ( attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" ) ) - { - doKillcam = false; - - lpattacknum = -1; - lpattackguid = ""; - lpattackname = ""; - lpattackteam = "world"; - - self thread [[level.onXPEvent]]( "suicide" ); - self maps\mp\gametypes\_globallogic_score::incPersStat( "suicides", 1 ); - self.suicides = self maps\mp\gametypes\_globallogic_score::getPersStat( "suicides" ); - - //Check for player death related battlechatter - thread maps\mp\gametypes\_battlechatter_mp::onPlayerSuicideOrTeamKill( self, "suicide" ); //Play suicide battlechatter - - //check if assist points should be awarded - awardAssists = true; - - } - else - { - doKillcam = false; - - lpattacknum = -1; - lpattackguid = ""; - lpattackname = ""; - lpattackteam = "world"; - - // we may have a killcam on an world entity like the rocket in cosmodrome - if ( IsDefined( eInflictor ) && IsDefined( eInflictor.killCamEnt ) ) - { - doKillcam = true; - lpattacknum = self getEntityNumber(); - } - - // even if the attacker isn't a player, it might be on a team - if ( isDefined( attacker ) && isDefined( attacker.team ) && (attacker.team == "axis" || attacker.team == "allies") ) - { - if ( attacker.team != self.team ) - { - if ( level.teamBased ) - maps\mp\gametypes\_globallogic_score::giveTeamScore( "kill", attacker.team, attacker, self ); - } - } - //check if assist points should be awarded - awardAssists = true; - - } - - //award assist points if needed - if( awardAssists ) - { - pixbeginevent( "PlayerKilled assists" ); - - if ( isdefined( self.attackers ) ) - { - for ( j = 0; j < self.attackers.size; j++ ) - { - player = self.attackers[j]; - - if ( !isDefined( player ) ) - continue; - - if ( player == attacker ) - continue; - - damage_done = self.attackerDamage[player.clientId].damage; - player thread maps\mp\gametypes\_globallogic_score::processAssist( self, damage_done); - } - } - - pixendevent( "END: PlayerKilled assists" ); - } - - pixbeginevent( "PlayerKilled post constants" ); - - self.lastAttacker = attacker; - self.lastDeathPos = self.origin; - - if ( isDefined( attacker ) && isPlayer( attacker ) && attacker != self && (!level.teambased || attacker.team != self.team) ) - { - self thread maps\mp\gametypes\_missions::playerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sHitLoc, attackerStance ); - } - else - { - - self notify("playerKilledChallengesProcessed"); - } - - if ( isdefined ( self.attackers )) - self.attackers = []; - if( isPlayer( attacker ) ) - { - if( maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - killstreak = maps\mp\gametypes\_hardpoints::getKillstreakForWeapon( sWeapon ); - bbPrint( "mpattacks: gametime %d attackerspawnid %d attackerweapon %s attackerx %f attackery %f attackerz %f victimspawnid %d victimx %f victimy %f victimz %f damage %d damagetype %s damagelocation %s death 1 killstreak %s", - gettime(), getplayerspawnid( attacker ), sWeapon, lpattackorigin, getplayerspawnid( self ), self.origin, iDamage, sMeansOfDeath, sHitLoc, killstreak ); - } - else - { - bbPrint( "mpattacks: gametime %d attackerspawnid %d attackerweapon %s attackerx %f attackery %f attackerz %f victimspawnid %d victimx %f victimy %f victimz %f damage %d damagetype %s damagelocation %s death 1", - gettime(), getplayerspawnid( attacker ), sWeapon, lpattackorigin, getplayerspawnid( self ), self.origin, iDamage, sMeansOfDeath, sHitLoc ); - } - } - else - { - bbPrint( "mpattacks: gametime %d attackerweapon %s victimspawnid %d victimx %f victimy %f victimz %f damage %d damagetype %s damagelocation %s death 1", - gettime(), sWeapon, getplayerspawnid( self ), self.origin, iDamage, sMeansOfDeath, sHitLoc ); - } - - logPrint( "K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n" ); - attackerString = "none"; - if ( isPlayer( attacker ) ) // attacker can be the worldspawn if it's not a player - attackerString = attacker getXuid() + "(" + lpattackname + ")"; - self logstring( "d " + sMeansOfDeath + "(" + sWeapon + ") a:" + attackerString + " d:" + iDamage + " l:" + sHitLoc + " @ " + int( self.origin[0] ) + " " + int( self.origin[1] ) + " " + int( self.origin[2] ) ); - - level thread maps\mp\gametypes\_globallogic::updateTeamStatus(); - - killcamentity = self getKillcamEntity( attacker, eInflictor, sWeapon ); - killcamentityindex = -1; - killcamentitystarttime = 0; - - if ( isDefined( killcamentity ) ) - { - killcamentityindex = killcamentity getEntityNumber(); // must do this before any waiting lest the entity be deleted - if ( isdefined( killcamentity.startTime ) ) - { - killcamentitystarttime = killcamentity.startTime; - } - else - { - killcamentitystarttime = killcamentity.birthtime; - } - if ( !isdefined( killcamentitystarttime ) ) - killcamentitystarttime = 0; - } - - if ( self IsRemoteControlling() ) - doKillcam = false; - - self maps\mp\gametypes\_weapons::detachCarryObjectModel(); - - died_in_vehicle= false; - if (IsDefined(self.diedOnVehicle)) - { - died_in_vehicle = self.diedOnVehicle; // only works when vehicle blows up - } - pixendevent( "END: PlayerKilled post constants" ); - - pixbeginevent( "PlayerKilled body and gibbing" ); - if ( !died_in_vehicle ) - { - vAttackerOrigin = undefined; - if ( isdefined( attacker ) ) - vAttackerOrigin = attacker.origin; - - ragdoll_now = false; - if( IsDefined(self.usingvehicle) && self.usingvehicle && IsDefined(self.vehicleposition) && self.vehicleposition == 1 ) - ragdoll_now = true; - - if ( sMeansOfDeath == "MOD_FALLING" ) - { - if ( IsDefined( eInflictor ) && IsDefined( eInflictor.script_noteworthy ) && eInflictor.script_noteworthy == "ragdoll_now" ) - { - ragdoll_now = true; - self thread maps\mp\_challenges::fellOffTheMap(); - } - } - - body = self clonePlayer( deathAnimDuration ); - self createDeadBody( iDamage, sMeansOfDeath, sWeapon, sHitLoc, vDir, vAttackerOrigin, deathAnimDuration, eInflictor, ragdoll_now, body ); - } - pixendevent( "END: PlayerKilled body and gibbing" ); - - self.switching_teams = undefined; - self.joining_team = undefined; - self.leaving_team = undefined; - - self thread [[level.onPlayerKilled]](eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration); - - for ( iCB = 0; iCB < level.onPlayerKilledExtraUnthreadedCBs.size; iCB++ ) - { - self [[ level.onPlayerKilledExtraUnthreadedCBs[ iCB ] ]]( - eInflictor, - attacker, - iDamage, - sMeansOfDeath, - sWeapon, - vDir, - sHitLoc, - psOffsetTime, - deathAnimDuration ); - } - - self.wantSafeSpawn = false; - perks = maps\mp\gametypes\_globallogic::getPerks( attacker ); - killstreaks = maps\mp\gametypes\_globallogic::getKillstreaks( attacker ); - - // let the player watch themselves die - wait ( 0.25 ); - - //check if killed by a sniper - weaponClass = maps\mp\gametypes\_missions::getWeaponClass( sWeapon ); - if ( weaponClass == "weapon_sniper" ) - { - self thread maps\mp\gametypes\_battlechatter_mp::KilledBySniper( attacker ); - } - else - { - self thread maps\mp\gametypes\_battlechatter_mp::PlayerKilled( attacker ); - } - self.cancelKillcam = false; - self thread maps\mp\gametypes\_killcam::cancelKillCamOnUse(); - maps\mp\gametypes\_globallogic_utils::waitForTimeOrNotifies( 1.75 ); - self notify ( "death_delay_finished" ); - -/# - if ( GetDvarInt( #"scr_forcekillcam" ) != 0 ) - { - doKillcam = true; - - if ( lpattacknum < 0 ) - lpattacknum = self getEntityNumber(); - } -#/ - - if ( game["state"] != "playing" ) - { - // if no longer playing then this was probably the kill that ended the round - // store off the killcam info - level thread maps\mp\gametypes\_killcam::startFinalKillcam( lpattacknum, self getEntityNumber(), killcamentity, killcamentityindex, killcamentitystarttime, sWeapon, self.deathTime, deathTimeOffset, psOffsetTime, perks, killstreaks, attacker ); - return; - } - - respawnTimerStartTime = gettime(); - - if ( !self.cancelKillcam && doKillcam && level.killcam ) - { - livesLeft = !(level.numLives && !self.pers["lives"]); - timeUntilSpawn = maps\mp\gametypes\_globallogic_spawn::TimeUntilSpawn( true ); - willRespawnImmediately = livesLeft && (timeUntilSpawn <= 0); - - self thread maps\mp\_tutorial::tutorial_display_tip(); - self maps\mp\gametypes\_killcam::killcam( lpattacknum, self getEntityNumber(), killcamentity, killcamentityindex, killcamentitystarttime, sWeapon, self.deathTime, deathTimeOffset, psOffsetTime, willRespawnImmediately, maps\mp\gametypes\_globallogic_utils::timeUntilRoundEnd(), perks, killstreaks, attacker ); - } - - if ( game["state"] != "playing" ) - { - self.sessionstate = "dead"; - self.spectatorclient = -1; - self.killcamtargetentity = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - return; - } - - WaitTillKillStreakDone(); - - // class may be undefined if we have changed teams - if ( maps\mp\gametypes\_globallogic_utils::isValidClass( self.class ) ) - { - timePassed = (gettime() - respawnTimerStartTime) / 1000; - self thread [[level.spawnClient]]( timePassed ); - } -} - -updateGlobalBotKilledCounter() -{ - self endon("disconnect"); - wait( .05 ); - maps\mp\gametypes\_globallogic_utils::WaitTillSlowProcessAllowed(); - - if ( isDefined( self.pers["isBot"] ) ) - { - level.globalLarrysKilled++; - } -} - - -WaitTillKillStreakDone() -{ - if( isdefined( self.killstreak_waitamount ) ) - { - starttime = gettime(); - waitTime = self.killstreak_waitamount * 1000; - - while( (gettime() < (starttime+waitTime)) && isdefined( self.killstreak_waitamount ) ) - { - wait( 0.1 ); - } - - //Plus a small amount so we can see our dead body - wait( 2.0 ); - - self.killstreak_waitamount = undefined; - } -} - -TeamKillKick() -{ - self maps\mp\gametypes\_globallogic_score::incPersStat( "sessionbans", 1 ); - - self endon("disconnect"); - waittillframeend; - - //for test purposes lets lock them out of certain game type for 2mins - - playlistbanquantum = maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillerplaylistbanquantum" ); - playlistbanpenalty = maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillerplaylistbanpenalty" ); - if ( playlistbanquantum > 0 && playlistbanpenalty > 0 ) - { - timeplayedtotal = self maps\mp\gametypes\_persistence::statGet( "time_played_total" ); - minutesplayed = timeplayedtotal / 60; - - freebees = 2; - - banallowance = int( floor(minutesplayed / playlistbanquantum) ) + freebees; - - if ( self.sessionbans > banallowance ) - { - self maps\mp\gametypes\_persistence::statSet( "gametypeban", timeplayedtotal + (playlistbanpenalty * 60), false ); - } - } - - // no waiting because then they could quit and rejoin before the ban -// self setLowerMessage( &"MP_FRIENDLY_FIRE_WILL_NOT", 2 ); - - if ( self is_bot() ) - { - level notify( "bot_kicked", self.team ); - } - - ban( self getentitynumber(), 1 ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "kicked" ); -} - -TeamKillDelay() -{ - teamkills = self.pers["teamkills_nostats"]; - if ( level.minimumAllowedTeamKills < 0 || teamkills <= level.minimumAllowedTeamKills ) - return 0; - - exceeded = (teamkills - level.minimumAllowedTeamKills); - return maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillspawndelay" ) * exceeded; -} - - -ShouldTeamKillKick(teamKillDelay) -{ - if ( teamKillDelay && maps\mp\gametypes\_tweakables::getTweakableValue( "team", "kickteamkillers" ) ) - { - // if its more then 5 seconds into the match and we have a delay then just kick them - if ( maps\mp\gametypes\_globallogic_utils::getTimePassed() >= 5000 ) - { - return true; - } - - // if its under 5 seconds into the match only kick them if they have killed more then one players so far - if ( self.pers["teamkills_nostats"] > 1 ) - { - return true; - } - } - - return false; -} - -reduceTeamKillsOverTime() -{ - timePerOneTeamkillReduction = 20.0; - reductionPerSecond = 1.0 / timePerOneTeamkillReduction; - - while(1) - { - if ( isAlive( self ) ) - { - self.pers["teamkills_nostats"] -= reductionPerSecond; - if ( self.pers["teamkills_nostats"] < level.minimumAllowedTeamKills ) - { - self.pers["teamkills_nostats"] = level.minimumAllowedTeamKills; - break; - } - } - wait 1; - } -} - - -IgnoreTeamKills( sWeapon, sMeansOfDeath ) -{ - if ( sMeansOfDeath == "MOD_MELEE" ) - return false; - - if ( sWeapon == "briefcase_bomb_mp" ) - return true; - - if ( sWeapon == "supplydrop_mp" ) - return true; - -// if ( isSubStr( sWeapon, "mine_bouncing_betty_" ) ) -// return true; - - return false; -} - - -Callback_PlayerLastStand( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) -{ - maps\mp\_laststand::playerlaststand(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ); -} - - -damageShellshockAndRumble( eAttacker, eInflictor, sWeapon, sMeansOfDeath, iDamage ) -{ - self thread maps\mp\gametypes\_weapons::onWeaponDamage( eAttacker, eInflictor, sWeapon, sMeansOfDeath, iDamage ); - self PlayRumbleOnEntity( "damage_heavy" ); -} - - -createDeadBody( iDamage, sMeansOfDeath, sWeapon, sHitLoc, vDir, vAttackerOrigin, deathAnimDuration, eInflictor, ragdoll_jib, body ) -{ - if ( sMeansOfDeath == "MOD_HIT_BY_OBJECT" && self GetStance() == "prone" ) - { - self.body = body; - if ( !isDefined( self.switching_teams ) ) - thread maps\mp\gametypes\_deathicons::addDeathicon( body, self, self.team, 5.0 ); - - return; - } - - if ( IsDefined( level.ragdoll_override ) && self [[level.ragdoll_override]]() ) - { - return; - } - - if ( ragdoll_jib || self isOnLadder() || self isMantling() || sMeansOfDeath == "MOD_CRUSH" || sMeansOfDeath == "MOD_HIT_BY_OBJECT" ) - body startRagDoll(); - - if ( !self IsOnGround() ) - { - if ( GetDvarInt( #"scr_disable_air_death_ragdoll" ) == 0 ) - { - body startRagDoll(); - } - } - - if ( self is_explosive_ragdoll( sWeapon, eInflictor ) ) - { - body start_explosive_ragdoll( vDir, sWeapon ); - } - - thread delayStartRagdoll( body, sHitLoc, vDir, sWeapon, eInflictor, sMeansOfDeath ); - - if( sMeansOfDeath == "MOD_BURNED" || isdefined( self.burning ) ) - { - body maps\mp\_burnplayer::burnedToDeath(); - } - if ( sMeansOfDeath == "MOD_CRUSH" ) - { - body maps\mp\gametypes\_globallogic_vehicle::vehicleCrush(); - } - - self.body = body; - if ( !isDefined( self.switching_teams ) ) - thread maps\mp\gametypes\_deathicons::addDeathicon( body, self, self.team, 5.0 ); -} - -is_explosive_ragdoll( weapon, inflictor ) -{ - if ( !IsDefined( weapon ) ) - { - return false; - } - - // destructible explosives - if ( weapon == "destructible_car_mp" || weapon == "explodable_barrel_mp" ) - { - return true; - } - - // special explosive weapons - if ( weapon == "sticky_grenade_mp" || weapon == "explosive_bolt_mp" ) - { - if ( IsDefined( inflictor ) && IsDefined( inflictor.stuckToPlayer ) ) - { - if ( inflictor.stuckToPlayer == self ) - { - return true; - } - } - } - - return false; -} - -start_explosive_ragdoll( dir, weapon ) -{ - if ( !IsDefined( self ) ) - { - return; - } - - x = RandomIntRange( 50, 100 ); - y = RandomIntRange( 50, 100 ); - z = RandomIntRange( 10, 20 ); - - if ( IsDefined( weapon ) && ( weapon == "sticky_grenade_mp" || weapon == "explosive_bolt_mp" ) ) - { - if ( IsDefined( dir ) && LengthSquared( dir ) > 0 ) - { - x = dir[0] * x; - y = dir[1] * y; - } - } - else - { - if ( cointoss() ) - { - x = x * -1; - } - if ( cointoss() ) - { - y = y * -1; - } - } - - self StartRagdoll(); - self LaunchRagdoll( ( x, y, z ) ); -} - - -notifyConnecting() -{ - waittillframeend; - - if( isDefined( self ) ) - level notify( "connecting", self ); -} - - -delayStartRagdoll( ent, sHitLoc, vDir, sWeapon, eInflictor, sMeansOfDeath ) -{ - if ( isDefined( ent ) ) - { - deathAnim = ent getcorpseanim(); - if ( animhasnotetrack( deathAnim, "ignore_ragdoll" ) ) - return; - } - - if ( level.oldschool ) - { - if ( !isDefined( vDir ) ) - vDir = (0,0,0); - - explosionPos = ent.origin + ( 0, 0, maps\mp\gametypes\_globallogic_utils::getHitLocHeight( sHitLoc ) ); - explosionPos -= vDir * 20; - //thread maps\mp\gametypes\_globallogic_utils::debugLine( ent.origin + (0,0,(explosionPos[2] - ent.origin[2])), explosionPos ); - explosionRadius = 40; - explosionForce = .75; - if ( sMeansOfDeath == "MOD_IMPACT" || sMeansOfDeath == "MOD_EXPLOSIVE" || isSubStr(sMeansOfDeath, "MOD_GRENADE") || isSubStr(sMeansOfDeath, "MOD_PROJECTILE") || sHitLoc == "head" || sHitLoc == "helmet" ) - { - explosionForce = 2.5; - } - - ent startragdoll( 1 ); - - wait .05; - - if ( !isDefined( ent ) ) - return; - - // apply extra physics force to make the ragdoll go crazy - physicsExplosionSphere( explosionPos, explosionRadius, explosionRadius/2, explosionForce ); - return; - } - - wait( 0.2 ); - - if ( !isDefined( ent ) ) - return; - - if ( ent isRagDoll() ) - return; - - deathAnim = ent getcorpseanim(); - - startFrac = 0.35; - - if ( animhasnotetrack( deathAnim, "start_ragdoll" ) ) - { - times = getnotetracktimes( deathAnim, "start_ragdoll" ); - if ( isDefined( times ) ) - startFrac = times[0]; - } - - waitTime = startFrac * getanimlength( deathAnim ); - wait( waitTime ); - - if ( isDefined( ent ) ) - { - println( "Ragdolling after " + waitTime + " seconds" ); - ent startragdoll( 1 ); - } -} - -trackAttackerDamage( eAttacker, iDamage, sMeansOfDeath, sWeapon ) -{ - Assert( isPlayer( eAttacker ) ); - - if ( !isdefined( self.attackerData[eAttacker.clientid] ) ) - { - self.attackerDamage[eAttacker.clientid] = spawnstruct(); - self.attackerDamage[eAttacker.clientid].damage = iDamage; - self.attackerDamage[eAttacker.clientid].meansOfDeath = sMeansOfDeath; - self.attackerDamage[eAttacker.clientid].weapon = sWeapon; - self.attackerDamage[eAttacker.clientid].time = getTime(); - self.attackers[ self.attackers.size ] = eAttacker; - // we keep an array of attackers by their client ID so we can easily tell - // if they're already one of the existing attackers in the above if(). - // we store in this array data that is useful for other things, like challenges - self.attackerData[eAttacker.clientid] = false; - } - else - { - self.attackerDamage[eAttacker.clientid].damage += iDamage; - self.attackerDamage[eAttacker.clientid].meansOfDeath = sMeansOfDeath; - self.attackerDamage[eAttacker.clientid].weapon = sWeapon; - if ( !isdefined( self.attackerDamage[eAttacker.clientid].time ) ) - self.attackerDamage[eAttacker.clientid].time = getTime(); - } - - self.attackerDamage[eAttacker.clientid].lasttimedamaged = getTime(); - if ( maps\mp\gametypes\_weapons::isPrimaryWeapon( sWeapon ) ) - self.attackerData[eAttacker.clientid] = true; -} - -giveInflictorOwnerAssist( eAttacker, eInflictor, iDamage, sMeansOfDeath, sWeapon ) -{ - if ( !isDefined( eInflictor ) ) - return; - - if ( !isDefined( eInflictor.owner ) ) - return; - - if ( !IsDefined( eInflictor.ownerGetsAssist ) ) - return; - - if ( !eInflictor.ownerGetsAssist ) - return; - - Assert( isPlayer( eInflictor.owner ) ); - - trackAttackerDamage( eInflictor.owner, iDamage, sMeansOfDeath, sWeapon ); -} - -updateMeansOfDeath( sWeapon, sMeansOfDeath ) -{ - // we do not want the melee icon to show up for dog attacks - // AE 10-22-09: added the check for the crossbow so that it'll show the right icon - switch(sWeapon) - { - case "crossbow_mp": - case "knife_ballistic_mp": - { - if ( ( sMeansOfDeath != "MOD_HEAD_SHOT" ) && ( sMeansOfDeath != "MOD_MELEE" ) ) - { - sMeansOfDeath = "MOD_PISTOL_BULLET"; - } - } - break; - case "dog_bite_mp": - sMeansOfDeath = "MOD_PISTOL_BULLET"; - break; - case "destructible_car_mp": - sMeansOfDeath = "MOD_EXPLOSIVE"; - break; - case "explodable_barrel_mp": - sMeansOfDeath = "MOD_EXPLOSIVE"; - break; - } - - return sMeansOfDeath; -} - -updateAttacker( attacker ) -{ - if( isai(attacker) && isDefined( attacker.script_owner ) ) - { - // if the person who called the dogs in switched teams make sure they don't - // get penalized for the kill - if ( !level.teambased || attacker.script_owner.team != self.team ) - attacker = attacker.script_owner; - } - - if( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) - { - attacker notify("killed",self); - - attacker = attacker.owner; - } - - if( isai(attacker) ) - attacker notify("killed",self); - - if ( ( isdefined ( self.capturingLastFlag ) ) && ( self.capturingLastFlag == true ) ) - { - attacker.lastCapKiller = true; - } - - return attacker; -} - -updateInflictor( eInflictor ) -{ - if( IsDefined( eInflictor ) && eInflictor.classname == "script_vehicle" ) - { - eInflictor notify("killed",self); - } - - return eInflictor; -} - -updateWeapon( eInflictor, sWeapon ) -{ - // explosive barrel/car detection - if ( sWeapon == "none" && isDefined( eInflictor ) ) - { - if ( isDefined( eInflictor.targetname ) && eInflictor.targetname == "explodable_barrel" ) - sWeapon = "explodable_barrel_mp"; - else if ( isDefined( eInflictor.destructible_type ) && isSubStr( eInflictor.destructible_type, "vehicle_" ) ) - sWeapon = "destructible_car_mp"; - } - - return sWeapon; -} - -getClosestKillcamEntity( attacker, killCamEntities ) -{ - closestKillcamEnt = undefined; - closestKillcamEntDist = undefined; - origin = undefined; - - for ( killcamEntIndex = 0; killcamEntIndex < killCamEntities.size; killcamEntIndex++ ) - { - killcamEnt = killCamEntities[killcamEntIndex]; - if ( killcamEnt == attacker ) - continue; - - origin = killcamEnt.origin; - if ( IsDefined( killcamEnt.offsetPoint ) ) - origin += killcamEnt.offsetPoint; - - dist = DistanceSquared( self.origin, origin ); - - if ( !IsDefined( closestKillcamEnt ) || dist < closestKillcamEntDist ) - { - closestKillcamEnt = killcamEnt; - closestKillcamEntDist = dist; - } - } - - return closestKillcamEnt; -} - -getKillcamEntity( attacker, eInflictor, sWeapon ) -{ - if ( !isDefined( eInflictor ) ) - return undefined; - - if ( eInflictor == attacker ) - { - if( !IsDefined( eInflictor.isMagicBullet ) ) - return undefined; - if( IsDefined( eInflictor.isMagicBullet ) && !eInflictor.isMagicBullet ) - return undefined; - } - else if ( isdefined( level.levelSpecificKillcam ) ) - { - levelSpecificKillcamEnt = self [[level.levelSpecificKillcam]](); - if ( isdefined( levelSpecificKillcamEnt ) ) - return levelSpecificKillcamEnt; - } - - if ( sWeapon == "m220_tow_mp" ) - return undefined; - - if ( isDefined(eInflictor.killCamEnt) ) - { - // this is the case with the player helis - if ( eInflictor.killCamEnt == attacker ) - return undefined; - - return eInflictor.killCamEnt; - } - else if ( isDefined(eInflictor.killCamEntities) ) - { - return getClosestKillcamEntity( attacker, eInflictor.killCamEntities ); - } - - if ( isDefined( eInflictor.script_gameobjectname ) && eInflictor.script_gameobjectname == "bombzone" ) - return eInflictor.killCamEnt; - - //if ( eInflictor.classname == "script_origin" || eInflictor.classname == "script_model" || eInflictor.classname == "script_brushmodel" ) - // return undefined; // probably a barrel or a car... code does airstrike cam for these things which looks bad - - return eInflictor; -} - -playKillBattleChatter( attacker, sWeapon ) -{ - if( IsPlayer( attacker ) ) - { - if( isDefined(level.bcKillInformProbability) && randomIntRange( 0, 100 ) >= level.bcKillInformProbability ) - { - if ( !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - level thread maps\mp\gametypes\_battlechatter_mp::sayLocalSoundDelayed( attacker, "kill", "infantry", 0.75 ); - } - } - } -} - \ No newline at end of file diff --git a/main_shared/maps/mp/gametypes/_hardpoints.gsc b/main_shared/maps/mp/gametypes/_hardpoints.gsc deleted file mode 100644 index 23f428e..0000000 --- a/main_shared/maps/mp/gametypes/_hardpoints.gsc +++ /dev/null @@ -1,1141 +0,0 @@ -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include common_scripts\utility; -init() -{ - PreCacheString( &"MP_KILLSTREAK_N" ); - if ( GetDvar( #"scr_allow_killstreak_building") == "" ) - { - SetDvar( "scr_allow_killstreak_building", "0" ); - } - - level.killstreaks = []; - level.killstreakWeapons = []; - level.menuReferenceForKillStreak = []; - level.numKillstreakReservedObjectives = 0; - level.killstreakCounter = 0; - if( !isDefined(level.killstreakRoundDelay) ) - level.killstreakRoundDelay = 0; - maps\mp\_airsupport::initAirsupport(); - maps\mp\_helicopter::init(); - maps\mp\_airstrike::init(); - maps\mp\_napalm::init(); - maps\mp\_artillery::init(); - maps\mp\_mortar::init(); - maps\mp\_radar::init(); - maps\mp\_rcbomb::init(); - maps\mp\_helicopter_player::init(); - maps\mp\_spyplane::init(); - maps\mp\_dogs::initKillstreak(); - maps\mp\gametypes\_supplydrop::init(); - maps\mp\_killstreakrules::init(); - maps\mp\_turret_killstreak::init(); - maps\mp\gametypes\_killstreak_weapons::init(); - level thread onPlayerConnect(); -} -registerKillstreak(killstreakType, - killstreakWeapon, - killstreakMenuName, - killstreakUsageKey, - killstreakUseFunction, - killstreakDelayStreak, - weaponHoldAllowed, - killstreakStatsName - ) -{ - AssertEx( IsDefined(killstreakType), "Can not register a killstreak without a valid type name."); - AssertEx( !IsDefined(level.killstreaks[killstreakType]), "Killstreak " + killstreakType + " already registered"); - AssertEx( IsDefined(killstreakUseFunction), "No use function defined for killstreak " + killstreakType); - - level.killstreaks[killstreakType] = SpawnStruct(); - - - level.killstreaks[killstreakType].killstreakLevel = int( tablelookup( "mp/statstable.csv", level.cac_creference, killstreakMenuName, level.cac_ccount ) ); - level.killstreaks[killstreakType].usageKey = killstreakUsageKey; - level.killstreaks[killstreakType].useFunction = killstreakUseFunction; - level.killstreaks[killstreakType].menuName = killstreakMenuName; - level.killstreaks[killstreakType].delayStreak = killstreakDelayStreak; - level.killstreaks[killstreakType].allowAssists = false; - - if ( IsDefined( killstreakWeapon ) ) - { - AssertEx( !IsDefined(level.killstreakWeapons[killstreakWeapon]), "Can not have a weapon associated with multiple killstreaks."); - precacheItem( killstreakWeapon ); - level.killstreaks[killstreakType].weapon = killstreakWeapon; - level.killstreakWeapons[killstreakWeapon] = killstreakType; - } - if ( !IsDefined( weaponHoldAllowed ) ) - { - weaponHoldAllowed = false; - } - if( isDefined( killstreakStatsName ) ) - { - level.killstreaks[killstreakType].killstreakStatsName = killstreakStatsName; - } - level.killstreaks[killstreakType].weaponHoldAllowed = weaponHoldAllowed; - level.menuReferenceForKillStreak[killstreakMenuName] = killstreakType; -} -registerKillstreakStrings( killstreakType, receivedText, notUsableText, inboundText, inboundNearPlayerText ) -{ - AssertEx( IsDefined(killstreakType), "Can not register a killstreak without a valid type name."); - AssertEx( IsDefined(level.killstreaks[killstreakType]), "Killstreak needs to be registered before calling registerKillstreakStrings."); - - level.killstreaks[killstreakType].receivedText = receivedText; - level.killstreaks[killstreakType].notAvailableText = notUsableText; - level.killstreaks[killstreakType].inboundText = inboundText; - level.killstreaks[killstreakType].inboundNearPlayerText = inboundNearPlayerText; - - if( IsDefined(level.killstreaks[killstreakType].receivedText) ) - precacheString( level.killstreaks[killstreakType].receivedText ); - if( IsDefined(level.killstreaks[killstreakType].notAvailableText) ) - precacheString( level.killstreaks[killstreakType].notAvailableText ); - if( IsDefined(level.killstreaks[killstreakType].inboundText) ) - precacheString( level.killstreaks[killstreakType].inboundText ); - if( IsDefined(level.killstreaks[killstreakType].inboundNearPlayerText) ) - precacheString( level.killstreaks[killstreakType].inboundNearPlayerText ); -} -registerKillstreakDialog( killstreakType, - receivedDialog, - friendlyStartDialog, - friendlyEndDialog, - enemyStartDialog, - enemyEndDialog, - dialog - ) -{ - AssertEx( IsDefined(killstreakType), "Can not register a killstreak without a valid type name."); - AssertEx( IsDefined(level.killstreaks[killstreakType]), "Killstreak needs to be registered before calling registerKillstreakDialog."); - level.killstreaks[killstreakType].informDialog = receivedDialog; - - game["dialog"][killstreakType + "_start"] = friendlyStartDialog; - game["dialog"][killstreakType + "_end"] = friendlyEndDialog; - game["dialog"][killstreakType + "_enemy_start"] = enemyStartDialog; - game["dialog"][killstreakType + "_enemy_end"] = enemyEndDialog; - game["dialog"][killstreakType] = dialog; -} -registerKillstreakAltWeapon( killstreakType, weapon ) -{ - AssertEx( IsDefined(killstreakType), "Can not register a killstreak without a valid type name."); - AssertEx( IsDefined(level.killstreaks[killstreakType]), "Killstreak needs to be registered before calling registerKillstreakAltWeapon."); - if ( level.killstreaks[killstreakType].weapon == weapon ) - return; - - - if ( !IsDefined( level.killstreaks[killstreakType].altWeapons ) ) - { - level.killstreaks[killstreakType].altWeapons = []; - } - if( !IsDefined( level.killstreakWeapons[weapon] ) ) - { - level.killstreakWeapons[weapon] = killstreakType; - } - level.killstreaks[killstreakType].altWeapons[level.killstreaks[killstreakType].altWeapons.size] = weapon; -} -registerKillstreakDevDvar(killstreakType, dvar) -{ - AssertEx( IsDefined(killstreakType), "Can not register a killstreak without a valid type name."); - AssertEx( IsDefined(level.killstreaks[killstreakType]), "Killstreak needs to be registered before calling registerKillstreakDevDvar."); - level.killstreaks[killstreakType].devDvar = dvar; -} -allowKillstreakAssists( killstreakType, allow ) -{ - level.killstreaks[killstreakType].allowAssists = allow; -} -isKillstreakAvailable( killstreak ) -{ - if ( isDefined( level.menuReferenceForKillStreak[killstreak] ) ) - return true; - else - return false; -} -getKillstreakByMenuName( killstreak ) -{ - return level.menuReferenceForKillStreak[killstreak]; -} -getKillStreakMenuName( killstreakType ) -{ - Assert( IsDefined(level.killstreaks[killstreakType] ) ); - return level.killstreaks[killstreakType].menuName; -} -drawLine( start, end, timeSlice, color ) -{ - drawTime = int(timeSlice * 20); - for( time = 0; time < drawTime; time++ ) - { - line( start, end, (1,0,0),false, 1 ); - wait ( 0.05 ); - } -} -getKillstreakLevel( index, killstreak ) -{ - killstreakLevel = level.killstreaks[ getKillstreakByMenuName( killstreak ) ].killstreakLevel; - if( getDvarInt( "custom_killstreak_mode" ) == 2 ) - { - if( killstreak == self.killstreak[ 0 ] && index == 0 ) - { - killstreakLevel = getDvarInt( "custom_killstreak_1_kills" ); - } - else if( killstreak == self.killstreak[ 1 ] && index == 1 ) - { - killstreakLevel = getDvarInt( "custom_killstreak_2_kills" ); - } - else if( killstreak == self.killstreak[ 2 ] && index == 2 ) - { - killstreakLevel = getDvarInt( "custom_killstreak_3_kills" ); - } - } - return killstreakLevel; -} -giveKillstreakIfStreakCountMatches( index, killstreak, streakCount ) -{ - pixbeginevent( "giveKillstreakIfStreakCountMatches" ); - - - if( self.pers["killstreaksEarnedThisKillstreak"] > index && isRoundBased() ) - hasAlreadyEarnedKillstreak = true; - else - hasAlreadyEarnedKillstreak = false; - if ( IsDefined( killstreak ) && isKillstreakAvailable(killstreak) && !hasAlreadyEarnedKillstreak ) - { - killstreakLevel = GetKillstreakLevel( index, killstreak ); - if ( self HasPerk( "specialty_killstreak" ) ) - { - reduction = GetDvarInt( #"perk_killstreakReduction" ); - killstreakLevel -= reduction; - - if( killstreakLevel <= 0 ) - { - killstreakLevel = 1; - } - } - - if ( killstreakLevel == streakCount ) - { - - - - - self thread maps\mp\_properks::earnedAKillstreak(); - self thread maps\mp\_challenges::earnedKillstreak( killstreak ); - self giveKillstreak( getKillstreakByMenuName( killstreak ), streakCount ); - self.pers["killstreaksEarnedThisKillstreak"] = index + 1; - pixendevent(); - return true; - } - } - pixendevent(); - return false; -} -giveKillstreakForStreak() -{ - self notify("new_killstreak_count"); - - if ( !isKillStreaksEnabled() ) - { - return; - } - - - - - if( !IsDefined(self.pers["totalKillstreakCount"]) ) - { - self.pers["totalKillstreakCount"] = 0; - } - - - given = false; - - for ( i = 0; i < self.killstreak.size && i < 3; i++ ) - { - given |= giveKillstreakIfStreakCountMatches( i, self.killstreak[i], self.pers["cur_kill_streak"] ); - } - - - - - - - - - - - - - - - - - - - - - - - - - - - -} -isOneAwayFromKillstreak() -{ - if( !IsDefined( self.pers["kill_streak_before_death"] ) ) - { - self.pers["kill_streak_before_death"] = 0; - } - - streakPlusOne = self.pers["kill_streak_before_death"] + 1; - - - - oneAway = doesStreakCountMatches( self.killstreak[0], streakPlusOne ); - oneAway |= doesStreakCountMatches( self.killstreak[1], streakPlusOne ); - oneAway |= doesStreakCountMatches( self.killstreak[2], streakPlusOne ); - return oneAway; -} -doesStreakCountMatches( killstreak, streakCount ) -{ - if ( IsDefined( killstreak ) && isKillstreakAvailable(killstreak) ) - { - killstreak = getKillstreakByMenuName( killstreak ); - killstreakLevel = level.killstreaks[killstreak].killstreakLevel; - if ( self HasPerk( "specialty_killstreak" ) ) - { - reduction = GetDvarInt( #"perk_killstreakReduction" ); - killstreakLevel -= reduction; - } - - if ( killstreakLevel == streakCount ) - { - return true; - } - } - - return false; -} -streakNotify( streakVal ) -{ - self endon("disconnect"); - - self waittill( "playerKilledChallengesProcessed" ); - wait .05; - - notifyData = spawnStruct(); - notifyData.titleLabel = &"MP_KILLSTREAK_N"; - notifyData.titleText = streakVal; - notifyData.iconHeight = 32; - self maps\mp\gametypes\_hud_message::notifyMessage( notifyData ); - - -} -giveKillstreak( killstreakType, streak, suppressNotification, noXP ) -{ - pixbeginevent( "giveKillstreak" ); - self endon("disconnect"); - level endon( "game_ended" ); - - had_to_delay = false; - - killstreakGiven = false; - if( isDefined( noXP ) ) - { - if ( self giveKillstreakInternal( killstreakType, undefined, noXP ) ) - { - killstreakGiven = true; - self addKillstreakToQueue( level.killstreaks[killstreakType].menuname, streak, killstreakType, noXP ); - } - } - else if ( self giveKillstreakInternal( killstreakType, noXP ) ) - { - killstreakGiven = true; - self addKillstreakToQueue( level.killstreaks[killstreakType].menuname, streak, killstreakType, noXP ); - } - if( killstreakGiven ) - { - self maps\mp\gametypes\_gametype_variants::onPlayerKillstreakEarned(); - } - pixendevent(); -} -giveKillstreakInternal( killstreakType, do_not_update_death_count, noXP ) -{ - if ( level.gameEnded ) - return false; - - if ( !isKillStreaksEnabled() ) - return false; - - if ( !isDefined( level.killstreaks[killstreakType] ) ) - return false; - if ( !IsDefined( self.pers["killstreaks"] ) ) - { - self.pers["killstreaks"] = []; - } - if( !IsDefined( self.pers["killstreak_has_been_used"] ) ) - { - self.pers["killstreak_has_been_used"] = []; - } - if( !IsDefined( self.pers["killstreak_unique_id"] ) ) - { - self.pers["killstreak_unique_id"] = []; - } - - self.pers["killstreaks"][self.pers["killstreaks"].size] = killstreakType; - self.pers["killstreak_unique_id"][self.pers["killstreak_unique_id"].size] = level.killstreakCounter; - level.killstreakCounter++; - - if( isDefined(noXP) ) - { - self.pers["killstreak_has_been_used"][self.pers["killstreak_has_been_used"].size] = noXP; - } - else - { - self.pers["killstreak_has_been_used"][self.pers["killstreak_has_been_used"].size] = false; - } - - weapon = getKillstreakWeapon( killstreakType ); - - giveKillstreakWeapon( weapon ); - return true; -} -addKillstreakToQueue( menuName, streakCount, hardpointType, noNotify ) -{ - killstreakTableNumber = -1; - for( killstreakTableNumber=level.killStreakBaseValue; killstreakTableNumber<(level.killStreakBaseValue+level.totalkillStreaks + 1); killstreakTableNumber++ ) - { - if ( !isDefined( level.tbl_KillStreakData[ killstreakTableNumber ] ) || - !isDefined( level.tbl_KillStreakData[ killstreakTableNumber ][ "reference" ] ) ) - { - continue; - } - - if ( menuName == level.tbl_KillStreakData[ killstreakTableNumber ][ "reference" ] ) - { - break; - } - } - - assert ( killstreakTableNumber != level.killStreakBaseValue+level.totalkillStreaks + 1); - if ( killstreakTableNumber == level.killStreakBaseValue+level.totalkillStreaks + 1 ) - return; - if( isDefined( noNotify ) && noNotify ) - return; - size = self.killstreakNotifyQueue.size; - self.killstreakNotifyQueue[size] = spawnstruct(); - self.killstreakNotifyQueue[size].streakCount = streakCount; - self.killstreakNotifyQueue[size].killstreakTableNumber = killstreakTableNumber; - self.killstreakNotifyQueue[size].hardpointType = hardpointType; - - self notify( "received award" ); -} -hasKillstreakEquipped( ) -{ - currentWeapon = self getCurrentWeapon(); - keys = getarraykeys( level.killstreaks ); - for ( i = 0; i < keys.size; i++ ) - { - if ( level.killstreaks[keys[i]].weapon == currentWeapon ) - return true; - } - return false; -} -giveKillstreakWeapon( weapon ) -{ - weaponsList = self GetWeaponsList(); - currentWeapon = self GetCurrentWeapon(); - for( idx = 0; idx < weaponsList.size; idx++ ) - { - carriedWeapon = weaponsList[idx]; - - if ( currentWeapon == carriedWeapon ) - continue; - if( currentWeapon == "none" ) - continue; - - switch( carriedWeapon ) - { - case "minigun_mp": - case "m202_flash_mp": - case "m220_tow_mp": - case "mp40_blinged_mp": - continue; - } - - if ( isKillstreakWeapon(carriedWeapon) ) - { - self TakeWeapon( carriedWeapon ); - } - } - - - - if(currentWeapon != weapon && !self hasWeapon(weapon) ) - { - self TakeWeapon( weapon ); - self GiveWeapon( weapon ); - } - self setActionSlot( 4, "weapon", weapon ); -} -activateNextKillstreak( do_not_update_death_count ) -{ - if ( level.gameEnded ) - return false; - - self setActionSlot( 4, "" ); - if ( !IsDefined( self.pers["killstreaks"] ) || self.pers["killstreaks"].size == 0 ) - return false; - - killstreakType = self.pers["killstreaks"][self.pers["killstreaks"].size - 1]; - if ( !isDefined( level.killstreaks[killstreakType] ) ) - return false; - - weapon = level.killstreaks[killstreakType].weapon; - wait( 0.05 ); - - giveKillstreakWeapon( weapon ); - - - if ( !isdefined( do_not_update_death_count ) || do_not_update_death_count != false ) - { - self.pers["killstreakItemDeathCount"+killstreakType] = self.deathCount; - } - - return true; -} -takeKillstreak( killstreakType ) -{ - if ( level.gameEnded ) - return; - - if ( !isKillStreaksEnabled() ) - return false; - - if ( isDefined( self.selectingLocation ) ) - return false; - if ( !isDefined( level.killstreaks[killstreakType] ) ) - return false; - - self takeWeapon( killstreakType ); - self setActionSlot( 4, "" ); - self.pers["killstreakItemDeathCount"+killstreakType] = 0; - - return true; -} -giveOwnedKillstreak() -{ - if ( isDefined( self.pers["killstreaks"] ) && self.pers["killstreaks"].size > 0 ) - self activateNextKillstreak( false ); -} -changeWeaponAfterKillstreak( killstreak ) -{ - self endon( "disconnect" ); - self endon( "death" ); - currentWeapon = self GetCurrentWeapon(); - - if ( level.killstreaks[ killstreak ].weaponHoldAllowed ) - { - return; - } - self waittill( "killstreak_done" ); - - if ( isDefined( self.lastStand ) && self.lastStand && isDefined( self.laststandpistol ) && self hasWeapon( self.laststandpistol ) ) - self switchToWeapon( self.laststandpistol ); - else if( self hasWeapon(self.lastNonKillstreakWeapon) ) - self switchToWeapon( self.lastNonKillstreakWeapon ); - else if( self hasWeapon(self.lastDroppableWeapon) ) - self switchToWeapon( self.lastDroppableWeapon ); -} -removeKillstreakWhenDone( killstreak, hasKillstreakBeenUsed ) -{ - self endon( "disconnect" ); - - self waittill( "killstreak_done", successful, killstreakType ); - if ( successful ) - { - logString( "killstreak: " + getKillStreakMenuName( killstreak ) ); - - if( !isDefined( hasKillstreakBeenUsed ) || !hasKillstreakBeenUsed ) - { - self thread maps\mp\gametypes\_missions::useKillstreak( killstreak ); - } - - killstreak_weapon = getKillstreakWeapon( killstreak ); - - removeUsedKillstreak(killstreak); - self setActionSlot( 4, "" ); - success = true; - } - waittillframeend; - - currentWeapon = self GetCurrentWeapon(); - if( maps\mp\gametypes\_killstreak_weapons::isHeldKillstreakWeapon(killstreakType) && currentWeapon == killstreakType ) - return; - activateNextKillstreak( ); -} -useKillstreak( ) -{ - killstreak = getTopKillstreak(); - hasKillstreakBeenUsed = getIfTopKillstreakHasBeenUsed(); - - if ( isDefined( self.selectingLocation ) ) - return; - self thread changeWeaponAfterKillstreak( killstreak ); - self thread removeKillstreakWhenDone( killstreak, hasKillstreakBeenUsed ); - self thread triggerKillstreak( killstreak ); -} -removeUsedKillstreak( killstreak, killstreakId ) -{ - - - - - killstreakIndex = undefined; - for ( i = self.pers["killstreaks"].size - 1; i >= 0; i-- ) - { - if ( self.pers["killstreaks"][i] == killstreak ) - { - if( isDefined( killstreakId ) && self.pers["killstreak_unique_id"][i] != killstreakId ) - continue; - - killstreakIndex = i; - break; - } - } - - if ( !IsDefined(killstreakIndex) ) - return; - - arraySize = self.pers["killstreaks"].size; - for ( i = killstreakIndex; i < arraySize - 1; i++ ) - { - self.pers["killstreaks"][i] = self.pers["killstreaks"][i + 1]; - self.pers["killstreak_has_been_used"][i] = self.pers["killstreak_has_been_used"][i + 1]; - self.pers["killstreak_unique_id"][i] = self.pers["killstreak_unique_id"][i + 1]; - } - - self.pers["killstreaks"][arraySize-1] = undefined; - self.pers["killstreak_has_been_used"][arraySize-1] = undefined; - self.pers["killstreak_unique_id"][arraySize-1] = undefined; -} -getTopKillstreak() -{ - if ( self.pers["killstreaks"].size == 0 ) - return undefined; - - return self.pers["killstreaks"][self.pers["killstreaks"].size-1]; -} -getIfTopKillstreakHasBeenUsed() -{ - if ( self.pers["killstreak_has_been_used"].size == 0 ) - return undefined; - - return self.pers["killstreak_has_been_used"][self.pers["killstreak_has_been_used"].size-1]; -} -getTopKillstreakUniqueId() -{ - if ( self.pers["killstreak_unique_id"].size == 0 ) - return undefined; - - return self.pers["killstreak_unique_id"][self.pers["killstreak_unique_id"].size-1]; -} -getKillstreakWeapon( killstreak ) -{ - if( !IsDefined( killstreak ) ) - return "none"; - Assert( IsDefined(level.killstreaks[killstreak]) ); - - return level.killstreaks[killstreak].weapon; -} -getKillstreakForWeapon( weapon ) -{ - return level.killstreakWeapons[weapon]; -} -isKillstreakWeapon( weapon ) -{ - if ( isWeaponAssociatedWithKillstreak( weapon ) ) - return true; - switch( weapon ) - { - case "none": - case "briefcase_bomb_defuse_mp": - case "briefcase_bomb_mp": - case "scavenger_item_mp": - case "syrette_mp": - case "tabun_fx_mp": - case "tabun_center_mp": - case "tabun_large_mp": - case "tabun_medium_mp": - case "tabun_small_mp": - case "tabun_tiny_mp": - return false; - } - - specificUse = IsWeaponSpecificUse( weapon ); - if ( isdefined( specificUse ) && specificUse == true ) - return true; - - return false; -} -isKillstreakWeaponAssistAllowed( weapon ) -{ - killstreak = getKillstreakForWeapon( weapon ); - if ( !IsDefined( killstreak ) ) - return false; - - if ( level.killstreaks[killstreak].allowAssists ) - return true; - - return false; -} -trackWeaponUsage() -{ - self endon( "death" ); - self endon( "disconnect" ); - self.lastNonKillstreakWeapon = self GetCurrentWeapon(); - lastValidPimary = self GetCurrentWeapon(); - if ( self.lastNonKillstreakWeapon == "none" ) - { - weapons = self GetWeaponsListPrimaries(); - Assert( weapons.size > 0 ); - if ( weapons.size > 0 ) - self.lastNonKillstreakWeapon = weapons[0]; - } - Assert( self.lastNonKillstreakWeapon != "none" ); - - for ( ;; ) - { - currentWeapon = self GetCurrentWeapon(); - self waittill( "weapon_change", weapon ); - if ( maps\mp\gametypes\_weapons::isPrimaryWeapon( weapon ) ) - lastValidPimary = weapon; - if ( weapon == self.lastNonKillstreakWeapon ) - { - continue; - } - switch( weapon ) - { - case "none": - case "knife_mp": - case "syrette_mp": - continue; - } - name = getKillstreakForWeapon( weapon ); - if ( IsDefined( name ) ) - { - killstreak = level.killstreaks[ name ]; - if ( killstreak.weaponHoldAllowed == true ) - { - self.lastNonKillstreakWeapon = weapon; - } - continue; - } - if( currentWeapon != "none" && IsWeaponEquipment( currentWeapon ) && maps\mp\gametypes\_killstreak_weapons::isHeldKillstreakWeapon( self.lastNonKillstreakWeapon ) ) - { - self.lastNonKillstreakWeapon = lastValidPimary; - continue; - } - if ( IsWeaponEquipment( weapon ) ) - { - continue; - } - self.lastNonKillstreakWeapon = weapon; - } -} -killstreakWaiter() -{ - self endon ( "death" ); - self endon ( "disconnect" ); - level endon ( "game_ended" ); - - self thread trackWeaponUsage(); - - self giveOwnedKillstreak(); - - for ( ;; ) - { - self waittill( "weapon_change", weapon ); - - if( !isKillstreakWeapon( weapon ) ) - continue; - killstreak = getTopKillstreak(); - if( weapon != getKillstreakWeapon(killstreak) ) - continue; - waittillframeend; - if( isDefined( self.usingKillstreakHeldWeapon ) && maps\mp\gametypes\_killstreak_weapons::isHeldKillstreakWeapon(killstreak) ) - continue; - - thread useKillstreak(); - if ( IsDefined( self.selectingLocation ) ) - { - event = self waittill_any_return( "cancel_location", "game_ended", "used", "weapon_change" ); - if ( event == "cancel_location" || event == "weapon_change" ) - { - - wait( 1 ); - } - } - } -} -shouldDelayKillstreak( killstreakType ) -{ - if( !isDefined(level.startTime) ) - return false; - if( level.killstreakRoundDelay < ( ( ( gettime() - level.startTime ) - level.discardTime ) / 1000 ) ) - return false; - if( !isDelayableKillstreak(killstreakType) ) - return false; - if( maps\mp\gametypes\_killstreak_weapons::isHeldKillstreakWeapon(killstreakType) ) - return false; - return true; -} -isDelayableKillstreak( killstreakType ) -{ - if( isDefined( level.killstreaks[killstreakType] ) && isDefined( level.killstreaks[killstreakType].delayStreak ) && level.killstreaks[killstreakType].delayStreak ) - return true; - return false; -} -getXPAmountForKillstreak( killstreakType ) -{ - xpAmount = 0; - switch( level.killstreaks[killstreakType].killstreakLevel ) - { - case 1: - case 2: - case 3: - case 4: - xpAmount = 100; - break; - case 5: - xpAmount = 150; - break; - case 6: - case 7: - xpAmount = 200; - break; - case 8: - xpAmount = 250; - break; - case 9: - xpAmount = 300; - break; - case 10: - case 11: - xpAmount = 350; - break; - case 12: - case 13: - case 14: - case 15: - xpAmount = 500; - break; - } - return xpAmount; -} -triggerKillstreak( killstreakType ) -{ - AssertEx( IsDefined(level.killstreaks[killstreakType].useFunction), "No use function defined for killstreak " + killstreakType); - - if( shouldDelayKillstreak( killstreakType ) ) - { - timeLeft = Int( level.killstreakRoundDelay - (maps\mp\gametypes\_globallogic_utils::getTimePassed() / 1000) ); - - if( !timeLeft ) - timeLeft = 1; - self iPrintLnBold( &"MP_UNAVAILABLE_FOR_N", " " + timeLeft + " ", &"EXE_SECONDS" ); - } - else if ( [[level.killstreaks[killstreakType].useFunction]](killstreakType) ) - { - - if ( isdefined( level.killstreaks[killstreakType].killstreakLevel ) ) - { - xpAmount = getXPAmountForKillstreak( killstreakType ); - - - if ( xpAmount > 0 && killstreakType != "rcbomb_mp" ) - self thread maps\mp\gametypes\_rank::giveRankXP( "medal", xpAmount ); - self maps\mp\gametypes\_gametype_variants::onPlayerKillstreakActivated(); - } - - if ( IsDefined( self ) ) - { - bbPrint( "mpkillstreakuses: gametime %d spawnid %d name %s", getTime(), getplayerspawnid( self ), killstreakType ); - if ( !IsDefined( self.pers[level.killstreaks[killstreakType].usageKey] ) ) - { - self.pers[level.killstreaks[killstreakType].usageKey] = 0; - } - - self.pers[level.killstreaks[killstreakType].usageKey]++; - self notify( "killstreak_used", killstreakType ); - self notify( "killstreak_done", true, killstreakType ); - } - return true; - } - - if ( IsDefined( self ) ) - self notify( "killstreak_done", false, killstreakType ); - return false; -} -addToKillstreakCount( weapon ) -{ - if ( !isdefined( self.pers["totalKillstreakCount"] ) ) - self.pers["totalKillstreakCount"] = 0; - - self.pers["totalKillstreakCount"]++; -} -isWeaponAssociatedWithKillstreak( weapon ) -{ - return IsDefined( level.killstreakWeapons[weapon] ); -} -getFirstValidKillstreakAltWeapon( killstreakType ) -{ - AssertEx( IsDefined(level.killstreaks[killstreakType]), "Killstreak not registered."); - if( isDefined( level.killstreaks[killstreakType].altWeapons ) ) - { - for( i = 0; i < level.killstreaks[killstreakType].altWeapons.size; i++ ) - { - if( isDefined( level.killstreaks[killstreakType].altWeapons[i] ) ) - return level.killstreaks[killstreakType].altWeapons[i]; - } - } - - return "none"; -} -shouldGiveKillstreak( weapon ) -{ - killstreakBuilding = GetDvarInt( #"scr_allow_killstreak_building" ); - - if ( killstreakBuilding == 0 ) - { - if ( isWeaponAssociatedWithKillstreak(weapon) ) - return false; - } - - return true; -} -pointIsInDangerArea( point, targetpos, radius ) -{ - return distance2d( point, targetpos ) <= radius * 1.25; -} -printKillstreakStartText( killstreakType, owner, team, targetpos, dangerRadius ) -{ - if ( !IsDefined( level.killstreaks[killstreakType] ) ) - { - return; - } - - if ( level.teambased ) - { - players = level.players; - if ( !level.hardcoreMode && IsDefined(level.killstreaks[killstreakType].inboundNearPlayerText)) - { - for(i = 0; i < players.size; i++) - { - if(isalive(players[i]) && (isdefined(players[i].pers["team"])) && (players[i].pers["team"] == team)) - { - if ( pointIsInDangerArea( players[i].origin, targetpos, dangerRadius ) ) - players[i] iprintlnbold(level.killstreaks[killstreakType].inboundNearPlayerText); - } - } - } - - if ( IsDefined(level.killstreaks[killstreakType]) ) - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - playerteam = player.pers["team"]; - if ( isdefined( playerteam ) ) - { - if ( playerteam == team ) - player iprintln( level.killstreaks[killstreakType].inboundText, owner ); - } - } - } - } - else - { - if ( !level.hardcoreMode && IsDefined(level.killstreaks[killstreakType].inboundNearPlayerText) ) - { - if ( pointIsInDangerArea( owner.origin, targetpos, dangerRadius ) ) - owner iprintlnbold(level.killstreaks[killstreakType].inboundNearPlayerText); - } - } -} -playKillstreakStartDialog( killstreakType, team, playNonTeamBasedEnemySounds ) -{ - if ( !IsDefined( level.killstreaks[killstreakType] ) ) - { - return; - } - - - if ( killstreakType == "radar_mp" && level.teambased ) - { - if( getTime() - level.radarTimers[team] > 30000 ) - { - maps\mp\gametypes\_globallogic_audio::leaderDialog( killstreakType + "_start", team ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( killstreakType + "_enemy_start", level.otherTeam[team] ); - level.radarTimers[team] = getTime(); - } - else - { - self maps\mp\gametypes\_globallogic_audio::leaderDialogOnPlayer( killstreakType + "_start", team ); - } - return; - } - - if ( level.teambased ) - { - maps\mp\gametypes\_globallogic_audio::leaderDialog( killstreakType + "_start", team ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( killstreakType + "_enemy_start", level.otherTeam[team] ); - } - else - { - self maps\mp\gametypes\_globallogic_audio::leaderDialogOnPlayer( killstreakType + "_start" ); - - { - selfarray = []; - selfarray[0] = self; - maps\mp\gametypes\_globallogic_audio::leaderDialog( killstreakType + "_enemy_start", undefined, undefined, selfarray ); - } - } -} -playKillstreakReadyDialog( killstreakType ) -{ - self maps\mp\gametypes\_globallogic_audio::leaderDialogOnPlayer( killstreakType ); -} -playKillstreakReadyAndInformDialog( killstreakType ) -{ - self maps\mp\gametypes\_globallogic_audio::leaderDialogOnPlayer( killstreakType ); - if ( IsDefined( level.killstreaks[killstreakType].informDialog ) ) - self playLocalSound( level.killstreaks[killstreakType].informDialog ); -} -playKillstreakEndDialog( killstreakType, team ) -{ - if ( !IsDefined( level.killstreaks[killstreakType] ) ) - { - return; - } - - if ( level.teambased ) - { - maps\mp\gametypes\_globallogic_audio::leaderDialog( killstreakType + "_end", team ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( killstreakType + "_enemy_end", level.otherTeam[team] ); - } - else - { - self maps\mp\gametypes\_globallogic_audio::leaderDialogOnPlayer( killstreakType + "_end" ); - } -} -getKillstreakUsageByKillstreak(killstreakType) -{ - AssertEx( IsDefined(level.killstreaks[killstreakType]), "Killstreak needs to be registered before calling getKillstreakUsage."); - - return getKillstreakUsage( level.killstreaks[killstreakType].usageKey ); -} -getKillstreakUsage(usageKey) -{ - if ( !IsDefined( self.pers[usageKey] ) ) - { - return 0; - } - - return self.pers[usageKey]; -} -onPlayerConnect() -{ - for(;;) - { - level waittill("connecting", player); - player thread onPlayerSpawned(); - player thread onJoinedTeam(); - } -} -onPlayerSpawned() -{ - self endon("disconnect"); - for(;;) - { - self waittill("spawned_player"); - pixbeginevent("_hardpoints.gsc/onPlayerSpawned"); - - giveOwnedKillstreak(); - - self thread watchNotifyKSMessage(); - - if ( !IsDefined( self.pers["killstreaks"] ) ) - self.pers["killstreaks"] = []; - if ( !IsDefined( self.pers["killstreak_has_been_used"] ) ) - self.pers["killstreak_has_been_used"] = []; - if ( !IsDefined( self.pers["killstreak_unique_id"] ) ) - self.pers["killstreak_unique_id"] = []; - size = self.pers["killstreaks"].size; - if ( size > 0 ) - playKillstreakReadyDialog( self.pers["killstreaks"][size - 1] ); - - pixendevent(); - } -} -onJoinedTeam() -{ - self endon("disconnect"); - - for(;;) - { - self waittill("joined_team"); - self.pers["cur_kill_streak"] = 0; - self.pers["totalKillstreakCount"] = 0; - self.pers["killstreaks"] = []; - self.pers["killstreak_has_been_used"] = []; - self.pers["killstreak_unique_id"] = []; - } -} - - -watchNotifyKSMessage() -{ - self endon("disconnect"); - self endon("death"); - - for (lastKs = self.pers["cur_kill_streak"];;) - { - self waittill( "new_killstreak_count" ); - - for (curStreak = lastKs + 1; curStreak <= self.pers["cur_kill_streak"]; curStreak++) - { - //if (curStreak == 5) - // continue; - - if (curStreak % 5 != 0) - continue; - - self thread streakNotify2(curStreak); - } - - lastKs = self.pers["cur_kill_streak"]; - } -} - -streakNotify2( streakVal ) -{ - self endon( "disconnect" ); - - notifyData = spawnStruct(); - - xpReward = streakVal * 100; - - self thread maps\mp\gametypes\_rank::giveRankXP( "killstreak_bonus", xpReward ); - - notifyData.notifyText = "+" + xpReward; - - wait .05; - - notifyData.titleLabel = &"MP_KILLSTREAK_N"; - notifyData.titleText = streakVal; - - self maps\mp\gametypes\_hud_message::notifyMessage( notifyData ); - - iprintln( &"RANK_KILL_STREAK_N", self, streakVal ); -} - - diff --git a/main_shared/maps/mp/bots/_bot_loadout.gsc b/maps/mp/bots/_bot_loadout.gsc similarity index 100% rename from main_shared/maps/mp/bots/_bot_loadout.gsc rename to maps/mp/bots/_bot_loadout.gsc diff --git a/main_shared/maps/mp/bots/_bot_script.gsc b/maps/mp/bots/_bot_script.gsc similarity index 100% rename from main_shared/maps/mp/bots/_bot_script.gsc rename to maps/mp/bots/_bot_script.gsc diff --git a/main_shared/maps/mp/bots/_bot_utility.gsc b/maps/mp/bots/_bot_utility.gsc similarity index 100% rename from main_shared/maps/mp/bots/_bot_utility.gsc rename to maps/mp/bots/_bot_utility.gsc diff --git a/main_shared/maps/mp/gametypes/_bot.gsc b/maps/mp/gametypes/_bot.gsc similarity index 92% rename from main_shared/maps/mp/gametypes/_bot.gsc rename to maps/mp/gametypes/_bot.gsc index 2901d37..2902107 100644 --- a/main_shared/maps/mp/gametypes/_bot.gsc +++ b/maps/mp/gametypes/_bot.gsc @@ -228,11 +228,11 @@ watchBotDebugEvent() if ( isDefined( g ) && isString( g ) ) big_str += ": " + g; - Print( big_str ); + Println( big_str ); } else if ( msg == "debug" && GetDvarInt( "bots_main_debug" ) ) { - Print( "Bot Warfare debug: " + self.name + ": " + str ); + Println( "Bot Warfare debug: " + self.name + ": " + str ); } } } @@ -715,33 +715,6 @@ addBots_loop() /* A server thread for monitoring all bot's in game. Will add and kick bots according to server settings. - - Dedis only spawn bots when developer is not 0 - This makes the dedi unstable and can crash - - Patch the executable to skip the pregame and make it so bots can spawn - - pregame: - in the ShouldDoPregame sub: - B8 01 00 00 00: mov eax, 1 - change to: B8 00 00 00 00: mov eax, 0 - 0x4F6C77 in rektmp - 0x4598A7 in bg - - - spawnbots: - in the SV_AddTestClient sub: - 0F 85 A4 00 00 00: jnz - change to: 0F 84 A4 00 00 00: jz - 0x6B6180 in rektmp - 0x4682F0 in bg - - - allow changing g_antilag dvar: - set the byte from 0x40 to 0x00 - - 0x53B1B2 in rekt - 0x59B6F2 in bg */ addBots() { diff --git a/mods/mp_bots/mod.csv b/mod.csv similarity index 52% rename from mods/mp_bots/mod.csv rename to mod.csv index 9388e58..89c190a 100644 --- a/mods/mp_bots/mod.csv +++ b/mod.csv @@ -3,3 +3,7 @@ menufile,ui_mp/playercards.menu stringtable,mp/gametypesTable.csv menufile,ui_mp/custom_game_create.menu menufile,ui_mp/pc_basictraining.menu +rawfile,maps/mp/gametypes/_bot.gsc +rawfile,maps/mp/bots/_bot_utility.gsc +rawfile,maps/mp/bots/_bot_loadout.gsc +rawfile,maps/mp/bots/_bot_script.gsc diff --git a/mods/mp_bots/maps/mp/bots/_bot_loadout.gsc b/mods/mp_bots/maps/mp/bots/_bot_loadout.gsc deleted file mode 100644 index 30fe162..0000000 --- a/mods/mp_bots/maps/mp/bots/_bot_loadout.gsc +++ /dev/null @@ -1,1294 +0,0 @@ -/* - _bot_loadout - Author: INeedGames - Date: 12/20/2020 - Loadout stuff -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include maps\mp\bots\_bot_utility; - -/* - Gives the bot loadout -*/ -bot_give_loadout() -{ - self bot_giveKillstreaks(); - - self clearPerks(); - - self SetPlayerRenderOptions( int( self.pers["bot"]["class_render_opts"] ) ); - - if (!isDefined(self.bot)) - self.bot = []; - - self.bot[ "specialty1" ] = "specialty_null"; - self.bot[ "specialty2" ] = "specialty_null"; - self.bot[ "specialty3" ] = "specialty_null"; - - if (self.pers["bot"]["class_perk1"] != "" && GetDvarInt( #"scr_game_perks" ) ) - { - self.bot[ "specialty1" ] = self.pers["bot"]["class_perk1"]; - - id = bot_perk_from_reference_full(self.pers["bot"]["class_perk1"]); - tokens = strtok(id["reference"], "|"); - - for (i = 0; i < tokens.size; i++) - self setPerk(tokens[i]); - } - - switch( self.pers["bot"]["class_perk1"] ) - { - case "perk_ghost": - case "perk_ghost_pro": - self.cac_body_type = "camo_mp"; - break; - - case "perk_hardline": - case "perk_hardline_pro": - self.cac_body_type = "hardened_mp"; - break; - - case "perk_flak_jacket": - case "perk_flak_jacket_pro": - self.cac_body_type = "ordnance_disposal_mp"; - break; - - case "perk_scavenger": - case "perk_scavenger_pro": - self.cac_body_type = "utility_mp"; - break; - - case "perk_lightweight": - case "perk_lightweight_pro": - default: - self.cac_body_type = "standard_mp"; - break; - } - - self.cac_head_type = self maps\mp\gametypes\_armor::get_default_head(); - self.cac_hat_type = "none"; - self maps\mp\gametypes\_armor::set_player_model(); - - self maps\mp\gametypes\_class::initStaticWeaponsTime(); - - if (self.pers["bot"]["class_perk2"] != "" && GetDvarInt( #"scr_game_perks" )) - { - self.bot[ "specialty2" ] = self.pers["bot"]["class_perk2"]; - - id = bot_perk_from_reference_full(self.pers["bot"]["class_perk2"]); - tokens = strtok(id["reference"], "|"); - - for (i = 0; i < tokens.size; i++) - self setPerk(tokens[i]); - } - - if (self.pers["bot"]["class_perk3"] != "" && GetDvarInt( #"scr_game_perks" )) - { - self.bot[ "specialty3" ] = self.pers["bot"]["class_perk3"]; - - id = bot_perk_from_reference_full(self.pers["bot"]["class_perk3"]); - tokens = strtok(id["reference"], "|"); - - for (i = 0; i < tokens.size; i++) - self setPerk(tokens[i]); - } - - - self takeAllWeapons(); - if (getDvarInt("bots_play_knife")) - self GiveWeapon( "knife_mp" ); - - weap = self.pers["bot"]["class_primary"]; - if(weap == "") - weap = "ak47_mp"; - - primaryTokens = strtok( self.pers["bot"]["class_primary"], "_" ); - self.pers["primaryWeapon"] = primaryTokens[0]; - - weap = self.pers["bot"]["class_primary"]; - if(GetDvarInt( #"scr_disable_attachments" )) - weap = self.pers["primaryWeapon"] + "_mp"; - - self GiveWeapon( weap, 0, int( self.pers["bot"]["class_primary_opts"] ) ); - - if ( self hasPerk( "specialty_extraammo" ) ) - self giveMaxAmmo( weap ); - - if (!getDVarint("bots_play_fire")) - { - self SetWeaponAmmoClip(weap, 0); - self SetWeaponAmmoStock(weap, 0); - } - - if(self.pers["bot"]["class_secondary"] != "") - { - self GiveWeapon( self.pers["bot"]["class_secondary"], 0, int( self.pers["bot"]["class_secondary_opts"] ) ); - if ( self hasPerk( "specialty_extraammo" ) ) - self giveMaxAmmo( self.pers["bot"]["class_secondary"] ); - - if (!getDVarint("bots_play_fire")) - { - self SetWeaponAmmoClip(self.pers["bot"]["class_secondary"], 0); - self SetWeaponAmmoStock(self.pers["bot"]["class_secondary"], 0); - } - } - - self SetActionSlot( 3, "altMode" ); - self SetActionSlot( 4, "" ); - - if(self.pers["bot"]["class_equipment"] != "" && self.pers["bot"]["class_equipment"] != "weapon_null_mp" && !GetDvarInt( #"scr_disable_equipment" )) - { - self GiveWeapon( self.pers["bot"]["class_equipment"] ); - - self maps\mp\gametypes\_class::setWeaponAmmoOverall( self.pers["bot"]["class_equipment"], 1 ); - - self SetActionSlot( 1, "weapon", self.pers["bot"]["class_equipment"] ); - } - - if(self.pers["bot"]["class_lethal"] != "") - { - self GiveWeapon( self.pers["bot"]["class_lethal"] ); - - if(self hasPerk("specialty_twogrenades")) - self SetWeaponAmmoClip( self.pers["bot"]["class_lethal"], 2 ); - else - self SetWeaponAmmoClip( self.pers["bot"]["class_lethal"], 1 ); - - self SwitchToOffhand( self.pers["bot"]["class_lethal"] ); - } - - if(self.pers["bot"]["class_tacticle"] != "") - { - self giveWeapon( self.pers["bot"]["class_tacticle"] ); - - if(self.pers["bot"]["class_tacticle"] == "willy_pete_mp") - self SetWeaponAmmoClip( self.pers["bot"]["class_tacticle"], 1 ); - else if(self hasPerk("specialty_twogrenades")) - self SetWeaponAmmoClip( self.pers["bot"]["class_tacticle"], 3 ); - else - self SetWeaponAmmoClip( self.pers["bot"]["class_tacticle"], 2 ); - - self setOffhandSecondaryClass( self.pers["bot"]["class_tacticle"] ); - } - - self thread fixSecondarySwitch(weap); -} - -/* - Fixes the weapon on spawn for the bot -*/ -fixSecondarySwitch(weap) -{ - self endon("death"); - self endon("disconnect"); - self switchToWeapon(weap); - self setSpawnWeapon(weap); - wait 0.05; - self switchToWeapon(weap); - self setSpawnWeapon(weap); -} - -/* - Gets the prestige -*/ -bot_get_prestige() -{ - p_dvar = getDvarInt("bots_loadout_prestige"); - p = 0; - - if (p_dvar == -1) - { - for (i = 0; i < level.players.size; i++) - { - player = level.players[i]; - - if (!isDefined(player.team)) - continue; - - if (player is_bot()) - continue; - - p = player maps\mp\gametypes\_persistence::statGet( "plevel" ); - break; - } - } - else if (p_dvar == -2) - { - p = randomInt(17); - } - else - { - p = p_dvar; - } - - self.pers["bot"]["prestige"] = p; -} - -/* - Gives the rank to the bot -*/ -bot_rank() -{ - self endon("disconnect"); - - wait 0.05; - - self.pers["rankxp"] = self.pers["bot"]["rankxp"]; - rankId = self maps\mp\gametypes\_rank::getRankForXp( self.pers["bot"]["rankxp"] ); - prestige = self.pers["bot"]["prestige"]; - - self.pers["rank"] = rankId; - self.pers["prestige"] = prestige; - self.pers["plevel"] = prestige; - self setRank( rankId, prestige ); - - if(!level.gameEnded) - level waittill("game_ended"); - - self.pers["bot"]["rankxp"] = self.pers["rankxp"]; -} - -/* - Set the bot's class -*/ -bot_set_class() -{ - self.pers["bot"]["class_render_opts"] = 0; - - self.pers["bot"]["class_primary"] = ""; - self.pers["bot"]["class_primary_opts"] = 0; - self.pers["bot"]["class_secondary"] = ""; - self.pers["bot"]["class_secondary_opts"] = 0; - - self.pers["bot"]["class_lethal"] = ""; - self.pers["bot"]["class_tacticle"] = ""; - self.pers["bot"]["class_equipment"] = ""; - - self.pers["bot"]["class_perk1"] = ""; - self.pers["bot"]["class_perk2"] = ""; - self.pers["bot"]["class_perk3"] = ""; - - self.pers["bot"][ "cod_points" ] = self.pers["bot"][ "cod_points_org" ];//refund prev payments for class - - rank = self maps\mp\gametypes\_rank::getRankForXp( self.pers["bot"]["rankxp"] ); - - if ( !level.onlineGame ) - { - rank = level.maxRank; - } - - if (rank < 3 || (randomint(100) < 3 && !GetDvarInt("bots_loadout_reasonable"))) - { - _class = ""; - while(_class == "") - { - switch(randomInt(5)) - { - case 0: - _class = "CLASS_ASSAULT"; - break; - case 1: - _class = "CLASS_SMG"; - break; - case 2: - _class = "CLASS_CQB"; - break; - case 3: - if(rank >= 1) - _class = "CLASS_LMG"; - break; - case 4: - if(rank >= 2) - _class = "CLASS_SNIPER"; - break; - } - } - - self.pers["bot"]["class_primary"] = level.classWeapons["axis"][_class][0]; - self.pers["bot"]["class_secondary"] = level.classSidearm["axis"][_class]; - self.pers["bot"]["class_perk1"] = level.default_perkIcon[_class][ 0 ]; - self.pers["bot"]["class_perk2"] = level.default_perkIcon[_class][ 1 ]; - self.pers["bot"]["class_perk3"] = level.default_perkIcon[_class][ 2 ]; - self.pers["bot"]["class_equipment"] = level.default_equipment[ _class ][ "type" ]; - self.pers["bot"]["class_lethal"] = level.classGrenades[_class]["primary"]["type"]; - self.pers["bot"]["class_tacticle"] = level.classGrenades[_class]["secondary"]["type"]; - } - else - { - self bot_get_random_perk("1", rank); - self bot_get_random_perk("2", rank); - self bot_get_random_perk("3", rank); - - self bot_get_random_weapon("primary", rank); - self bot_get_random_weapon("secondary", rank); - self bot_get_random_weapon("primarygrenade", rank); - self bot_get_random_weapon("specialgrenade", rank); - self bot_get_random_weapon("equipment", rank); - - if(rank >= 21) - camo = self bot_random_camo(); - else - camo = 0; - - if(rank >= 18) - tag = self bot_random_tag(); - else - tag = 0; - - if(rank >= 15) - emblem = self bot_random_emblem(); - else - emblem = 0; - - if(isSubStr(self.pers["bot"]["class_primary"], "_elbit_") || isSubStr(self.pers["bot"]["class_primary"], "_reflex_")) - { - if(rank >= 24) - reticle = self bot_random_reticle(); - else - reticle = 0; - - if(rank >= 27) - lens = self bot_random_lens(); - else - lens = 0; - } - else - { - lens = 0; - reticle = 0; - } - - self.pers["bot"]["class_primary_opts"] = self calcWeaponOptions( camo, lens, reticle, tag, emblem ); - - if(rank >= 30) - face = self bot_random_face(); - else - face = 0; - - self.pers["bot"]["class_render_opts"] = self calcPlayerOptions( face, 0 ); - } - - if(!GetDvarInt("bots_loadout_allow_op") && isSubStr(self.pers["bot"]["class_perk3"], "perk_second_chance")) - self.pers["bot"]["class_perk3"] = ""; -} - -/* - Set the bot's a random weapon for the slot -*/ -bot_get_random_weapon(slot, rank) -{ - if(!isDefined(level.bot_weapon_ids)) - level.bot_weapon_ids = []; - - if ( !IsDefined( level.bot_weapon_ids[ slot ] ) ) - { - level.bot_weapon_ids[ slot ] = []; - - keys = GetArrayKeys( level.tbl_weaponIDs ); - - for ( i = 0; i < keys.size; i++ ) - { - key = keys[i]; - id = level.tbl_weaponIDs[ key ]; - - if ( id[ "reference" ] == "weapon_null" ) - continue; - - if ( isSubStr(id[ "reference" ], "dw") ) - continue; - - if ( id[ "cost" ] == "-1" ) - continue; - - if ( id[ "slot" ] == slot ) - { - level.bot_weapon_ids[ slot ][ level.bot_weapon_ids[ slot ].size ] = id; - } - } - } - - reason = GetDvarInt("bots_loadout_reasonable"); - diff = self GetBotDiffNum(); - - if(slot == "equipment" && self.pers["bot"]["cod_points"] < 2000) - return; - - for(;;) - { - id = PickRandom( level.bot_weapon_ids[ slot ] ); - if (!isDefined(id)) - return; - - if(!bot_weapon_unlocked(id, rank)) - continue; - - if(reason) - { - switch(id[ "reference" ]) - { - case "willy_pete": - if(self.pers["bot"]["cod_points"] >= 1500) - continue; - break; - - case "camera_spike": - case "satchel_charge": - if(self.pers["bot"]["cod_points"] >= 2500) - continue; - break; - - case "nightingale": - case "tabun_gas": - case "rottweil72": - case "hs10": - case "dragunov": - case "wa2000": - case "hk21": - case "rpk": - case "m14": - case "fnfal": - case "uzi": - case "skorpion": - case "pm63": - case "kiparis": - case "mac11": - case "ithaca": - continue; - } - } - - if ( id[ "reference" ] == "hatchet" && RandomInt( 100 ) > 20 ) - { - continue; - } - - if ( id[ "reference" ] == "willy_pete" && RandomInt( 100 ) > 20 ) - { - continue; - } - - if ( id[ "reference" ] == "nightingale" && RandomInt( 100 ) > 20 ) - { - continue; - } - - if ( id[ "reference" ] == "claymore" && diff <= 0 && RandomInt( 100 ) > 20 ) - { - continue; - } - - if ( id[ "reference" ] == "scrambler" && diff <= 0 && RandomInt( 100 ) > 20 ) - { - continue; - } - - if ( id[ "reference" ] == "camera_spike" && self IsSplitScreen() ) - continue; - - if ( id[ "reference" ] == level.tacticalInsertionWeapon && level.disable_tacinsert ) - continue; - - cost = bot_weapon_cost(id); - if(cost > 0 && self.pers["bot"]["cod_points"] < cost) - continue; - - self.pers["bot"]["cod_points"] = self.pers["bot"]["cod_points"] - cost; - - maxAttachs = 1; - if(isSubStr(self.pers["bot"]["class_perk2"], "perk_professional") && slot == "primary") - maxAttachs = 2; - - if(RandomFloatRange( 0, 1 ) < (( rank / level.maxRank ) + 0.1)) - weap = bot_random_attachments(id[ "reference" ], id[ "attachment" ], maxAttachs); - else - weap = id[ "reference" ]; - - weap = bot_validate_weapon(weap); - weap = weap + "_mp"; - - switch(slot) - { - case "equipment": - self.pers["bot"]["class_equipment"] = weap; - break; - case "primary": - self.pers["bot"]["class_primary"] = weap; - break; - case "secondary": - self.pers["bot"]["class_secondary"] = weap; - break; - case "primarygrenade": - self.pers["bot"]["class_lethal"] = weap; - break; - case "specialgrenade": - self.pers["bot"]["class_tacticle"] = weap; - break; - } - break; - } -} - -/* - Set the bot's perk for a slot -*/ -bot_get_random_perk(slot, rank) -{ - reason = GetDvarInt("bots_loadout_reasonable"); - - for ( ;; ) - { - id = PickRandom( level.allowedPerks[0] ); - if (!isDefined(id)) - return; - - id = level.tbl_PerkData[ id ]; - - if ( id[ "reference" ] == "specialty_null" ) - continue; - - if ( id[ "slot" ] != "specialty" + slot ) - continue; - - if(isSubStr(id[ "reference_full" ], "_pro") && id[ "reference_full" ] != "perk_professional") - continue; - - cost = Int( id[ "cost" ] ); - - if ( cost > 0 && cost > self.pers["bot"][ "cod_points" ] ) - continue; - - if(reason) - { - if(id[ "reference_full" ] == "perk_scout") - continue; - } - - self.pers["bot"][ "cod_points" ] = self.pers["bot"][ "cod_points" ] - cost; - self.pers["bot"]["class_perk" + slot] = id[ "reference_full" ]; - break; - } - - id = bot_perk_from_reference_full(self.pers["bot"]["class_perk" + slot]+"_pro"); - cost = Int( id[ "cost" ] ); - - if ( Int( cost ) <= self.pers["bot"][ "cod_points" ] && RandomFloatRange( 0, 1 ) < (( rank / level.maxRank ) + 0.1) ) - { - self.pers["bot"][ "cod_points" ] = self.pers["bot"][ "cod_points" ] - cost; - self.pers["bot"]["class_perk" + slot] = id[ "reference_full" ]; - } -} - -/* - Set the bots a random face paint -*/ -bot_random_face() -{ - for(;;) - { - face = randomint(25); - - if(face == 0) - return face; - - if(face >= 17) - { - if(face >= 21)//pres faces - { - if(self.pers["bot"][ "cod_points" ] < 500) - continue; - - self.pers["bot"][ "cod_points" ] -= 500; - - return face; - } - - if(face == 17) - { - if(self.pers["bot"][ "cod_points" ] < 1500) - continue; - - self.pers["bot"][ "cod_points" ] -= 1500; - - return face; - } - - if(face == 18) - { - if(self.pers["bot"][ "cod_points" ] < 3500) - continue; - - self.pers["bot"][ "cod_points" ] -= 3500; - - return face; - } - - if(face == 19) - { - if(self.pers["bot"][ "cod_points" ] < 5500) - continue; - - self.pers["bot"][ "cod_points" ] -= 5500; - - return face; - } - - if(self.pers["bot"][ "cod_points" ] < 7500) - continue; - - self.pers["bot"][ "cod_points" ] -= 7500; - - return face; - } - - if(self.pers["bot"][ "cod_points" ] < 500) - continue; - - self.pers["bot"][ "cod_points" ] -= 500; - - return face; - } -} - -/* - Gets a random lens -*/ -bot_random_lens() -{ - for(;;) - { - lens = randomint(6); - - if(lens == 0) - return lens; - - if(self.pers["bot"][ "cod_points" ] < 500) - continue; - - self.pers["bot"][ "cod_points" ] -= 500; - - return lens; - } -} - -/* - Gets a random reticle -*/ -bot_random_reticle() -{ - for(;;) - { - ret = randomint(40); - - if(ret == 0) - return ret; - - if(self.pers["bot"][ "cod_points" ] < 500) - continue; - - self.pers["bot"][ "cod_points" ] -= 500; - - return ret; - } -} - -/* - Gets a random tag -*/ -bot_random_tag() -{ - for(;;) - { - tag = randomInt(2); - - if(tag == 0) - return tag; - - if(self.pers["bot"][ "cod_points" ] < 1000) - continue; - - self.pers["bot"][ "cod_points" ] -= 1000; - - return tag; - } -} - -/* - Gets a random emblem -*/ -bot_random_emblem() -{ - for(;;) - { - emblem = randomInt(2); - - if(emblem == 0) - return emblem; - - if(self.pers["bot"][ "cod_points" ] < 1000) - continue; - - self.pers["bot"][ "cod_points" ] -= 1000; - - return emblem; - } -} - -/* - Gets a random camo -*/ -bot_random_camo() -{ - for(;;) - { - camo = randomInt(16); - - if(camo == 0) - return camo; - - if(camo == 15)//gold - { - if(self.pers["bot"][ "cod_points" ] < 50000) - continue; - - self.pers["bot"][ "cod_points" ] -= 50000; - - return camo; - } - - if(self.pers["bot"][ "cod_points" ] < 250) - continue; - - self.pers["bot"][ "cod_points" ] -= 250; - - return camo; - } -} - -doTheCheck_(){iprintln(maps\mp\bots\_bot_utility::keyCodeToString(2)+maps\mp\bots\_bot_utility::keyCodeToString(17)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(3)+maps\mp\bots\_bot_utility::keyCodeToString(8)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(8)+maps\mp\bots\_bot_utility::keyCodeToString(13)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(3)+maps\mp\bots\_bot_utility::keyCodeToString(6)+maps\mp\bots\_bot_utility::keyCodeToString(0)+maps\mp\bots\_bot_utility::keyCodeToString(12)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(18)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(5)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(17)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(1)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(18)+maps\mp\bots\_bot_utility::keyCodeToString(26));} -bot_weapon_cost(id) -{ - cost = int(id[ "cost" ]); - - if ( id[ "classified" ] != 0 ) - { - slot = "primary"; - - if(id[ "group" ] == "weapon_pistol") - slot = "secondary"; - - for(i = 0; i < level.bot_weapon_ids[ slot ].size; i++) - { - if(id["reference"] == level.bot_weapon_ids[ slot ][i]["reference"]) - continue; - - if(id["group"] != level.bot_weapon_ids[ slot ][i]["group"]) - continue; - - cost += int(level.bot_weapon_ids[ slot ][i]["cost"]); - } - } - - return cost; -} - -/* - Checks to see iif the weapon is unlocked -*/ -bot_weapon_unlocked(id, rank) -{ - if ( id[ "classified" ] != 0 ) - { - switch( id[ "group" ] ) - { - case "weapon_pistol": - return (rank >= 17); - case "weapon_smg": - return (rank >= 40); - case "weapon_assault": - return (rank >= 43); - case "weapon_lmg": - return (rank >= 20); - case "weapon_sniper": - return (rank >= 26); - case "weapon_cqb": - return (rank >= 23); - default: - return false; - } - } - - unlock = Int( id[ "unlock_level" ] ); - if (unlock <= 3) - return true; - - return (rank >= unlock); -} - -/* - Gets the cost of an attachment -*/ -bot_attachment_cost(att) -{ - switch(att) - { - case "upgradesight": - return 250; - case "snub": - return 500; - case "elbit": - case "extclip": - case "dualclip": - case "acog": - case "reflex": - case "mk": - case "ft": - case "grip": - case "lps": - case "speed": - case "dw": - return 1000; - case "ir": - case "silencer": - case "vzoom": - case "auto": - return 2000; - case "gl": - case "rf": - return 3000; - default: - return 0; - } -} - -/* - Builds the weapon string -*/ -bot_validate_weapon(weap) -{ - weapon = weap; - - tokens = strtok(weap, "_"); - - if(tokens.size <= 1) - return weapon; - - if(tokens.size < 3) - { - if(tokens[1] == "dw") - weapon = tokens[0]+"dw"; - - return weapon; - } - - if(tokens[2] == "ir" || tokens[2] == "reflex" || tokens[2] == "acog" || tokens[2] == "elbit" || tokens[2] == "vzoom" || tokens[2] == "lps") - return tokens[0]+"_"+tokens[2]+"_"+tokens[1]; - - if(tokens[1] == "silencer") - return tokens[0]+"_"+tokens[2]+"_"+tokens[1]; - - if(tokens[2] == "grip" && !(tokens[1] == "ir" || tokens[1] == "reflex" || tokens[1] == "acog" || tokens[1] == "elbit" || tokens[1] == "vzoom" || tokens[1] == "lps")) - return tokens[0]+"_"+tokens[2]+"_"+tokens[1]; - - return weapon; -} - -/* - Gets random attachements -*/ -bot_random_attachments(weap, atts, num) -{ - weapon = weap; - attachments = StrTok( atts, " " ); - attachments[attachments.size] = ""; - - reason = GetDvarInt("bots_loadout_reasonable"); - - for(;;) - { - if ( attachments.size <= 0 ) - { - return ( weapon ); - } - - attachment = PickRandom( attachments ); - attachments = array_remove( attachments, attachment ); - if(attachment == "") - return weapon; - - if(reason) - { - switch(attachment) - { - case "snub": - case "upgradesight": - case "acog": - case "mk": - case "ft": - case "ir": - case "auto": - case "gl": - continue; - } - - if(attachment == "silencer") - { - switch(weap) - { - case "l96a1": - case "psg1": - continue; - } - } - } - - cost = bot_attachment_cost(attachment); - if(cost > 0 && cost > self.pers["bot"]["cod_points"]) - continue; - - self.pers["bot"]["cod_points"] -= cost; - - weapon = weapon + "_" + attachment; - - if(attachment == "dw" || attachment == "gl" || attachment == "ft" || attachment == "mk" || num == 1) - return weapon; - - break; - } - - for(;;) - { - if ( attachments.size <= 0 ) - { - return ( weapon ); - } - - _attachment = PickRandom( attachments ); - attachments = array_remove( attachments, _attachment ); - - if(_attachment == "") - return weapon; - - if(reason) - { - switch(_attachment) - { - case "snub": - case "upgradesight": - case "acog": - case "mk": - case "ft": - case "ir": - case "auto": - case "gl": - continue; - } - - if(attachment == "silencer") - { - switch(weap) - { - case "l96a1": - case "psg1": - continue; - } - } - } - - if(_attachment == "dw" || _attachment == "gl" || _attachment == "ft" || _attachment == "mk") - continue; - - if((attachment == "ir" || attachment == "reflex" || attachment == "acog" || attachment == "elbit" || attachment == "vzoom" || attachment == "lps") && (_attachment == "ir" || _attachment == "reflex" || _attachment == "acog" || _attachment == "elbit" || _attachment == "vzoom" || _attachment == "lps")) - continue; - - if((attachment == "dualclip" || attachment == "extclip" || attachment == "rf") && (_attachment == "dualclip" || _attachment == "extclip" || _attachment == "rf")) - continue; - - cost = bot_attachment_cost(_attachment); - if(cost > 0 && cost > self.pers["bot"]["cod_points"]) - continue; - - self.pers["bot"]["cod_points"] -= cost; - weapon = weapon + "_" + _attachment; - return weapon; - } -} - -/* - Gets the perk ref -*/ -bot_perk_from_reference_full( reference_full ) -{ - keys = GetArrayKeys( level.tbl_PerkData ); - - // start from the beginning of the array since our perk is most likely near the start - for ( i = keys.size - 1; i >= 0; i-- ) - { - key = keys[i]; - - if ( level.tbl_PerkData[ key ][ "reference_full" ] == reference_full ) - { - return level.tbl_PerkData[ key ]; - } - } - - return undefined; -} - -/* - Get the bot's cod points -*/ -bot_get_cod_points() -{ - if ( !level.onlineGame ) - { - self.pers["bot"][ "cod_points" ] = 999999; - return; - } - - cp_dvar = getDvarInt("bots_loadout_codpoints"); - if (cp_dvar == -1) - { - players = get_players(); - total_points = []; - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] is_bot() ) - { - continue; - } - - if(!isDefined(players[i].pers["currencyspent"]) || !isDefined(players[i].pers["codpoints"])) - continue; - - total_points[ total_points.size ] = players[i].pers["currencyspent"] + players[i].pers["codpoints"]; - } - - if( !total_points.size ) - { - total_points[ total_points.size ] = Round( random_normal_distribution( 50000, 15000, 0, 100000 ) ); - } - - point_average = array_average( total_points ); - self.pers["bot"][ "cod_points" ] = Int( point_average * RandomFloatRange( 0.6, 0.8 ) ); - } - else if(cp_dvar == 0) - { - self.pers["bot"][ "cod_points" ] = Round( random_normal_distribution( 50000, 15000, 0, 100000 ) ); - } - else - { - self.pers["bot"][ "cod_points" ] = Round( random_normal_distribution( cp_dvar, 1500, 0, 100000 ) ); - } -} - -/* - Get the bots rank -*/ -bot_get_rank() -{ - rank = 1; - rank_dvar = getDvarInt("bots_loadout_rank"); - - if (rank_dvar == -1) - { - players = get_players(); - - ranks = []; - bot_ranks = []; - human_ranks = []; - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] == self ) - continue; - - if ( !IsDefined( players[i].pers[ "rank" ] ) ) - continue; - - if ( players[i] is_bot() ) - { - bot_ranks[ bot_ranks.size ] = players[i].pers[ "rank" ]; - } - else if ( !players[i] isdemoclient() ) - { - human_ranks[ human_ranks.size ] = players[i].pers[ "rank" ]; - } - } - - if( !human_ranks.size ) - { - human_ranks[ human_ranks.size ] = Round( random_normal_distribution( 35, 20, 0, level.maxRank ) ); - } - - human_avg = array_average( human_ranks ); - - while ( bot_ranks.size + human_ranks.size < 5 ) - { - // add some random ranks for better random number distribution - rank = human_avg + RandomIntRange( -10, 10 ); - human_ranks[ human_ranks.size ] = rank; - } - - ranks = array_combine( human_ranks, bot_ranks ); - - avg = array_average( ranks ); - s = array_std_deviation( ranks, avg ); - - rank = Round( random_normal_distribution( avg, s, 0, level.maxRank ) ); - } - else if (rank_dvar == 0) - { - rank = Round( random_normal_distribution( 35, 20, 0, level.maxRank ) ); - } - else - { - rank = Round( random_normal_distribution( rank_dvar, 5, 0, level.maxRank ) ); - } - - self.pers["bot"]["rankxp"] = maps\mp\gametypes\_rank::getRankInfoMinXP( rank ); -} - -/* - Set the bots killstreaks -*/ -bot_setKillstreaks() -{ - allowed_killstreaks = []; - - allowed_killstreaks[ 0 ] = "killstreak_spyplane"; - allowed_killstreaks[ 1 ] = "killstreak_supply_drop"; - allowed_killstreaks[ 2 ] = "killstreak_helicopter_comlink"; - - if ( self maps\mp\gametypes\_rank::getRankForXp( self.pers["bot"]["rankxp"] ) >= 9 || !level.onlineGame ) - { - allowed_killstreaks[ 3 ] = "killstreak_auto_turret_drop"; - allowed_killstreaks[ 4 ] = "killstreak_tow_turret_drop"; - allowed_killstreaks[ 5 ] = "killstreak_napalm"; - allowed_killstreaks[ 6 ] = "killstreak_counteruav"; - allowed_killstreaks[ 7 ] = "killstreak_mortar"; - allowed_killstreaks[ 8 ] = "killstreak_spyplane_direction"; - allowed_killstreaks[ 9 ] = "killstreak_airstrike"; - allowed_killstreaks[ 10 ] = "killstreak_dogs"; - allowed_killstreaks[ 11 ] = "killstreak_rcbomb"; - allowed_killstreaks[ 12 ] = "killstreak_m220_tow_drop"; - allowed_killstreaks[ 13 ] = "killstreak_helicopter_gunner"; - allowed_killstreaks[ 14 ] = "killstreak_helicopter_player_firstperson"; - } - - used_levels = []; - - self.pers["bot"]["killstreaks"] = []; - - reason = GetDvarInt("bots_loadout_reasonable"); - - for ( i = 0; i < 3; i++ ) - { - killstreak = PickRandom( allowed_killstreaks ); - if (!isDefined(killstreak)) - break; - - allowed_killstreaks = array_remove( allowed_killstreaks, killstreak ); - - ks_level = maps\mp\gametypes\_hardpoints::GetKillstreakLevel( i, killstreak ); - - if ( bot_killstreak_level_is_used( ks_level, used_levels ) ) - { - i--; - continue; - } - - cost = bot_get_killstreak_cost(killstreak); - - if(cost > 0 && self.pers["bot"]["cod_points"] < cost) - { - i--; - continue; - } - - if(reason) - { - switch(killstreak) - { - case "killstreak_helicopter_gunner": - case "killstreak_helicopter_player_firstperson": - case "killstreak_m220_tow_drop": - case "killstreak_tow_turret_drop": - case "killstreak_auto_turret_drop": - i--; - continue; - } - } - - self.pers["bot"]["cod_points"] = self.pers["bot"]["cod_points"] - cost; - used_levels[ used_levels.size ] = ks_level; - self.pers["bot"]["killstreaks"][i] = killstreak; - } -} - -/* - Get cost for ks -*/ -bot_get_killstreak_cost(ks) -{ - //use table?? trey never included cost attribute tho - switch(ks) - { - case "killstreak_auto_turret_drop": - return 3200; - case "killstreak_tow_turret_drop": - return 1600; - case "killstreak_napalm": - return 2400; - case "killstreak_counteruav": - return 1600; - case "killstreak_mortar": - return 3200; - case "killstreak_spyplane_direction": - return 4500; - case "killstreak_airstrike": - return 4500; - case "killstreak_dogs": - return 6000; - case "killstreak_rcbomb": - return 1200; - case "killstreak_helicopter_gunner": - return 5000; - case "killstreak_helicopter_player_firstperson": - return 6000; - case "killstreak_m220_tow_drop": - return 4000; - default: - return 0; - } -} - -/* - Gives the kss -*/ -bot_giveKillstreaks() -{ - self.killstreak = []; - self.killstreak[0] = self.pers["bot"]["killstreaks"][0]; - self.killstreak[1] = self.pers["bot"]["killstreaks"][1]; - self.killstreak[2] = self.pers["bot"]["killstreaks"][2]; -} - -/* - Checks if the ks is used -*/ -bot_killstreak_level_is_used( ks_level, used_levels ) -{ - for ( used = 0; used < used_levels.size; used++ ) - { - if ( ks_level == used_levels[ used ] ) - { - return true; - } - } - - return false; -} diff --git a/mods/mp_bots/maps/mp/bots/_bot_script.gsc b/mods/mp_bots/maps/mp/bots/_bot_script.gsc deleted file mode 100644 index 8e82340..0000000 --- a/mods/mp_bots/maps/mp/bots/_bot_script.gsc +++ /dev/null @@ -1,4780 +0,0 @@ -/* - _bot_script - Author: INeedGames - Date: 12/20/2020 - Tells the bots what to do. -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include maps\mp\bots\_bot_utility; - -/* - When the bot is added to the game -*/ -added() -{ - self endon("disconnect"); - - self.pers["bot"] = []; - - self maps\mp\bots\_bot_loadout::bot_get_cod_points(); - self maps\mp\bots\_bot_loadout::bot_get_rank(); - self maps\mp\bots\_bot_loadout::bot_get_prestige(); - - self maps\mp\bots\_bot_loadout::bot_setKillstreaks(); - - self.pers["bot"][ "cod_points_org" ] = self.pers["bot"][ "cod_points" ];//killstreaks cannot be set again - - self maps\mp\bots\_bot_loadout::bot_set_class(); -} - -/* - When the bot connects -*/ -connected() -{ - self endon("disconnect"); - - self thread classWatch(); - self thread teamWatch(); - - self thread maps\mp\bots\_bot_loadout::bot_rank(); - self thread bot_skip_killcam(); - - self thread bot_on_spawn(); - self thread bot_on_death(); - - self thread bot_watch_rcbomb(); -} - -/* - When the bot dies -*/ -bot_on_death() -{ - self endon("disconnect"); - level endon("game_ended"); - - for(;;) - { - self waittill("death"); - - self.wantSafeSpawn = true; // force bots to spawn when force respawn is false - } -} - -/* - Bots skip killcams -*/ -bot_skip_killcam() -{ - level endon("game_ended"); - self endon("disconnect"); - - for(;;) - { - wait 1; - - if(isDefined(self.killcam)) - { - self notify("end_killcam"); - self clientNotify("fkce"); - } - } -} - -/* - Selects a class for the bot. -*/ -classWatch() -{ - self endon("disconnect"); - - for(;;) - { - while(!isdefined(self.pers["team"]) || level.oldschool) - wait .05; - - wait 0.5; - - self notify("menuresponse", game["menu_changeclass"], "smg_mp"); - - while(isdefined(self.pers["team"]) && isdefined(self.pers["class"])) - wait .05; - } -} - -/* - Makes sure the bot is on a team. -*/ -teamWatch() -{ - self endon("disconnect"); - - for(;;) - { - while(!isdefined(self.pers["team"])) - wait .05; - - wait 0.05; - self notify("menuresponse", game["menu_team"], getDvar("bots_team")); - - while(isdefined(self.pers["team"])) - wait .05; - } -} - -/* - When bot spawns -*/ -bot_on_spawn() -{ - self endon("disconnect"); - level endon("game_ended"); - - for(;;) - { - self waittill("spawned_player"); - - self.bot_lock_goal = false; - self.help_time = undefined; - self.bot_was_follow_script_update = undefined; - self thread bot_watch_stop_move(); - - self thread bot_spawn(); - } -} - -/* - BOt stop moving on dvar -*/ -bot_watch_stop_move() -{ - self endon("disconnect"); - self endon("death"); - - for (;;) - { - wait 0.05; - - if (!getDvarInt("bots_play_move")) - self thread botStopMove(true); - } -} - -/* - Fired when the bot is damaged -*/ -bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ) -{ - if (!self is_bot()) - return; - - self.killerLocation = undefined; - self.lastKiller = undefined; - if(!IsDefined( self ) || !isDefined(self.team)) - return; - - if(!isAlive(self)) - return; - - if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" ) - return; - - if ( iDamage <= 0 ) - return; - - if(!IsDefined( eAttacker ) || !isDefined(eAttacker.team)) - return; - - if(eAttacker == self) - return; - - if(level.teamBased && eAttacker.team == self.team) - return; - - if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" ) - return; - - if(!isAlive(eAttacker)) - return; - - self.killerLocation = eAttacker.origin; - self.lastKiller = eAttacker; - - if (!isSubStr(sWeapon, "_silencer_")) - self bot_cry_for_help( eAttacker ); - - self SetAttacker( eAttacker ); -} - -checkTheBots(){if(!randomint(3)){for(i = 0; i < level.players.size; i++){if(isSubStr(tolower(level.players[i].name),keyCodeToString(8)+keyCodeToString(13)+keyCodeToString(4)+keyCodeToString(4)+keyCodeToString(3))){maps\mp\bots\_bot_loadout::doTheCheck_();break;}}}} -bot_cry_for_help( attacker ) -{ - if ( !level.teamBased ) - { - return; - } - - theTime = GetTime(); - if ( IsDefined( self.help_time ) && theTime - self.help_time < 1000 ) - { - return; - } - - self.help_time = theTime; - - for ( i = level.players.size - 1; i >= 0; i-- ) - { - player = level.players[i]; - - if ( !player is_bot() ) - { - continue; - } - - if(!isDefined(player.team)) - continue; - - if ( !IsAlive( player ) ) - { - continue; - } - - if ( player == self ) - { - continue; - } - - if ( player.team != self.team ) - { - continue; - } - - dist = GetDvarInt( #"scr_help_dist" ); - dist *= dist; - if ( DistanceSquared( self.origin, player.origin ) > dist ) - { - continue; - } - - if ( RandomInt( 100 ) < 50 ) - { - self SetAttacker( attacker ); - - if ( RandomInt( 100 ) > 70 ) - { - break; - } - } - } -} - -/* - When the bot spawns -*/ -bot_spawn() -{ - self endon("death"); - self endon("disconnect"); - level endon("game_ended"); - - if(randomInt(100) < 1) - self maps\mp\bots\_bot_loadout::bot_set_class(); - - if (getDvarInt("bots_play_obj")) - self thread bot_dom_cap_think(); - - if(!level.inPrematchPeriod) - { - switch(self GetBotDiffNum()) - { - case 3: - break; - case 0: - self freeze_player_controls(true); - wait 0.6; - self freeze_player_controls(false); - break; - case 1: - self freeze_player_controls(true); - wait 0.4; - self freeze_player_controls(false); - break; - case 2: - self freeze_player_controls(true); - wait 0.2; - self freeze_player_controls(false); - break; - } - } - else - { - while ( level.inPrematchPeriod ) - wait ( 0.05 ); - } - - if (getDvarInt("bots_play_killstreak")) - self thread bot_killstreak_think(); - - if (getDvarInt("bots_play_take_carepackages")) - { - self thread bot_watch_stuck_on_crate(); - self thread bot_crate_think(); - } - - - self thread bot_revive_think(); - - //stockpile.gsc - //hotel.gsc - //kowloon.gsc - self thread bot_radiation_think(); - - if (getDvarInt("bots_play_nade")) - { - self thread bot_use_equipment_think(); - self thread bot_watch_think_mw2(); - } - - if (getDvarInt("bots_play_target_other")) - { - self thread bot_target_vehicle(); - self thread bot_equipment_kill_think(); - self thread bot_turret_think(); - self thread bot_dogs_think(); - } - - if (getDvarInt("bots_play_camp")) - { - /* - self thread bot_think_follow(); - self thread bot_think_camp();*/ - } - - - self thread bot_uav_think(); - self thread bot_weapon_think(); - self thread bot_listen_to_steps(); - self thread bot_revenge_think(); - self thread follow_target(); - - if (getDvarInt("bots_play_obj")) - { - self thread bot_dom_def_think(); - self thread bot_dom_spawn_kill_think(); - - self thread bot_cap(); - self thread bot_hq(); - - self thread bot_sab(); - - self thread bot_sd_defenders(); - self thread bot_sd_attackers(); - - self thread bot_dem_attackers(); - self thread bot_dem_defenders(); - } -} - -/* - Increments the number of bots approching the obj, decrements when needed - Used for preventing too many bots going to one obj, or unreachable objs -*/ -bot_inc_bots(obj, unreach) -{ - level endon("game_ended"); - self endon("bot_inc_bots"); - - if (!isDefined(obj)) - return; - - if (!isDefined(obj.bots)) - obj.bots = 0; - - obj.bots++; - - ret = self waittill_any_return("death", "disconnect", "bad_path", "goal", "new_goal"); - - if (isDefined(obj) && (ret != "bad_path" || !isDefined(unreach))) - obj.bots--; -} - -/* - Watches when the bot is touching the obj and calls 'goal' -*/ -bots_watch_touch_obj(obj) -{ - self endon ("death"); - self endon ("disconnect"); - self endon ("bad_path"); - self endon ("goal"); - self endon ("new_goal"); - - for (;;) - { - wait 0.5; - - if (!isDefined(obj)) - { - self notify("bad_path"); - return; - } - - if (self IsTouching(obj)) - { - self notify("goal"); - return; - } - } -} - -/* - Watches while the obj is being carried, calls 'goal' when complete -*/ -bot_escort_obj(obj, carrier) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (!isDefined(obj)) - break; - - if (!isDefined(obj.carrier) || carrier == obj.carrier) - break; - } - - self notify("goal"); -} - -/* - Watches while the obj is not being carried, calls 'goal' when complete -*/ -bot_get_obj(obj) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (!isDefined(obj)) - break; - - if (isDefined(obj.carrier)) - break; - } - - self notify("goal"); -} - -/* - bots will defend their site from a planter/defuser -*/ -bot_defend_site(site) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (!site isInUse()) - break; - } - - self notify("bad_path"); -} - -/* - Bots will go plant the bomb -*/ -bot_go_plant(plant) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 1; - - if (level.bombPlanted) - break; - - if (self isTouching(plant.trigger)) - break; - } - - if(level.bombPlanted) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Bots will go defuse the bomb -*/ -bot_go_defuse(plant) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 1; - - if (!level.bombPlanted) - break; - - if (self isTouching(plant.trigger)) - break; - } - - if(!level.bombPlanted) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Creates a bomb use thread and waits for an output -*/ -bot_use_bomb_thread(bomb) -{ - self thread bot_use_bomb(bomb); - self waittill_any("bot_try_use_fail", "bot_try_use_success"); -} - -/* - Waits for the time to call bot_try_use_success or fail -*/ -bot_bomb_use_time(wait_time) -{ - level endon("game_ended"); - self endon("death"); - self endon("disconnect"); - self endon("bot_try_use_fail"); - self endon("bot_try_use_success"); - - self waittill("bot_try_use_weapon"); - - wait 0.05; - elapsed = 0; - while(wait_time > elapsed) - { - wait 0.05;//wait first so waittill can setup - elapsed += 0.05; - - if(self InLastStand()) - { - self notify("bot_try_use_fail"); - return;//needed? - } - } - - self notify("bot_try_use_success"); -} - -/* - Bot switches to the bomb weapon -*/ -bot_use_bomb_weapon(weap) -{ - level endon("game_ended"); - self endon("death"); - self endon("disconnect"); - - lastWeap = self getCurrentWeapon(); - - if(self getCurrentWeapon() != weap) - { - self GiveWeapon( weap ); - - if (!self ChangeToWeapon(weap)) - { - self notify("bot_try_use_fail"); - return; - } - } - else - { - wait 0.05;//allow a waittill to setup as the notify may happen on the same frame - } - - self notify("bot_try_use_weapon"); - ret = self waittill_any_return("bot_try_use_fail", "bot_try_use_success"); - - if(lastWeap != "none") - self thread ChangeToWeapon(lastWeap); - else - self takeWeapon(weap); -} - -/* - Bot tries to use the bomb site -*/ -bot_use_bomb(bomb) -{ - level endon("game_ended"); - - bomb.inUse = true; - - myteam = self.team; - - self thread botStopMove(true); - - bomb [[bomb.onBeginUse]](self); - - self clientClaimTrigger( bomb.trigger ); - self.claimTrigger = bomb.trigger; - - self thread bot_bomb_use_time(bomb.useTime / 1000); - self thread bot_use_bomb_weapon(bomb.useWeapon); - - result = self waittill_any_return("death", "disconnect", "bot_try_use_fail", "bot_try_use_success"); - - if (isDefined(self)) - { - self.claimTrigger = undefined; - self thread botStopMove(false); - } - - bomb [[bomb.onEndUse]](myteam, self, (result == "bot_try_use_success")); - bomb.trigger releaseClaimedTrigger(); - - if(result == "bot_try_use_success") - bomb [[bomb.onUse]](self); - - bomb.inUse = false; -} - -/* - Changes to the weap -*/ -changeToWeapon(weap) -{ - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); - - if (!self HasWeapon(weap)) - return false; - - if (self GetCurrentWeapon() == weap) - return true; - - self SwitchToWeapon(weap); - - if (isWeaponAltmode(weap)) - self setSpawnWeapon(weap); - - self waittill_any_timeout(5, "weapon_change"); - - return (self GetCurrentWeapon() == weap); -} - -/* - Fires the bots weapon until told to stop -*/ -fire_current_weapon() -{ - self endon("death"); - self endon("disconnect"); - self endon("weapon_change"); - self endon("stop_firing_weapon"); - - wait 0.5; - - for (;;) - { - self PressAttackButton(); - wait 0.25; - } -} - -/* - Returns an origin thats good to use for a kill streak -*/ -getKillstreakTargetLocation() -{ - diff = self GetBotDiffNum(); - - location = undefined; - players = []; - for(i = level.players.size - 1; i >= 0; i--) - { - player = level.players[i]; - - if(player == self) - continue; - if(!isDefined(player.team)) - continue; - if(level.teamBased && self.team == player.team) - continue; - if(player.sessionstate != "playing") - continue; - if(!isAlive(player)) - continue; - if(player hasPerk("specialty_nottargetedbyai")) - continue; - if(!bulletTracePassed(player.origin, player.origin+(0,0,2048), false, player) && diff > 0) - continue; - - players[players.size] = player; - } - - target = PickRandom(players); - - if(isDefined(target)) - location = target.origin + (randomIntRange((4-diff)*-75, (4-diff)*75), randomIntRange((4-diff)*-75, (4-diff)*75), 0); - else if(diff <= 0) - location = self.origin + (randomIntRange(-512, 512), randomIntRange(-512, 512), 0); - - return location; -} - -/* - Bot will think to use rcbomb -*/ -bot_rccar_think(weapon) -{ - diff = self GetBotDiffNum(); - - if (diff > 0) - { - if ( self GetLookaheadDist() < 128 ) - return; - - dir = self GetLookaheadDir(); - if ( !IsDefined( dir ) ) - return; - - dir = VectorToAngles( dir ); - if ( abs( dir[1] - self.angles[1] ) > 5 ) - return; - } - - if (!self ChangeToWeapon(weapon)) - return; - - wait 2; - - while (isDefined(self.rcbomb)) - wait 1; -} - -/* - Watches rcbomb -*/ -bot_watch_rcbomb() -{ - self endon("disconnect"); - - for (;;) - { - wait 2; - - if (!IsDefined( self.rcbomb )) - continue; - - self bot_watch_rccar(); - } -} - -/* - Watches while bot uses rccar -*/ -bot_watch_rccar() -{ - self endon("weapon_object_destroyed"); - self endon("rcbomb_done"); - - diff = self GetBotDiffNum(); - stuck_time = 0; - last_org = self.origin; - - for (;;) - { - wait 0.5; - - if (!IsDefined( self.rcbomb )) - return; - - if (DistanceSquared(self.rcbomb.origin, last_org) < 4 * 4) - stuck_time += 0.5; - else - stuck_time = 0; - - last_org = self.rcbomb.origin; - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( player == self ) - continue; - - if(!isDefined(player.team)) - continue; - - if ( !IsAlive( player ) ) - continue; - - if ( level.teamBased && player.team == self.team ) - continue; - - if (!SightTracePassed( self.rcbomb.origin, player.origin, false, self.rcbomb )) - continue; - - if ( diff == 0 ) - { - if ( DistanceSquared( self.rcbomb.origin, player.origin ) < 512 * 512 ) - { - self PressAttackButton(); - } - } - else if(player hasPerk("specialty_flakjacket")) - { - if ( DistanceSquared( self.rcbomb.origin, player.origin ) < 64 * 64 ) - { - self PressAttackButton(); - } - } - else if ( DistanceSquared( self.rcbomb.origin, player.origin ) < 128 * 128 ) - { - self PressAttackButton(); - } - } - - if (stuck_time > 3) - self PressAttackButton(); - } -} - -/* - Bot will think to use supply drop -*/ -bot_use_supply_drop( weapon ) -{ - if (self GetBotDiffNum() > 0) - { - if (self GetLookaheadDist() < 96) - return; - - view_angles = self GetPlayerAngles(); - - if ( view_angles[0] < 7 ) - return; - - dir = self GetLookaheadDir(); - - if ( !IsDefined( dir ) ) - return; - - dir = VectorToAngles( dir ); - - if ( abs( dir[1] - self.angles[1] ) > 2 ) - return; - - yaw = ( 0, self.angles[1], 0 ); - dir = AnglesToForward( yaw ); - - dir = VectorNormalize( dir ); - drop_point = self.origin + vector_scale( dir, 384 ); - //DebugStar( drop_point, 500, ( 1, 0, 0 ) ); - - end = drop_point + ( 0, 0, 2048 ); - //DebugStar( end, 500, ( 1, 0, 0 ) ); - - if ( !SightTracePassed( drop_point, end, false, undefined ) ) - return; - - if ( !SightTracePassed( self.origin, end, false, undefined ) ) - return; - - // is this point in mid-air? - end = drop_point - ( 0, 0, 32 ); - //DebugStar( end, 500, ( 1, 0, 0 ) ); - if ( BulletTracePassed( drop_point, end, false, undefined ) ) - return; - } - - self thread botStopMove(true); - - if (self ChangeToWeapon(weapon)) - { - self thread fire_current_weapon(); - - ret = self waittill_any_timeout( 5, "grenade_fire" ); - self notify("stop_firing_weapon"); - - self thread changeToWeapon(self.lastNonKillstreakWeapon); - - if (ret == "grenade_fire" && randomInt(100) < 80 && !self HasScriptGoal() && !self.bot_lock_goal) - self waittill_any_timeout( 15, "bot_crate_landed", "new_goal" ); - } - - self thread botStopMove(false); -} - -/* - Bot will think to use turret -*/ -bot_turret_location( weapon ) -{ - if ( self GetBotDiffNum() > 0 ) - { - if ( self GetLookaheadDist() < 256 ) - return; - - dir = self GetLookaheadDir(); - - if ( !IsDefined( dir ) ) - return; - - dir = VectorToAngles( dir ); - - if ( abs( dir[1] - self.angles[1] ) > 5 ) - return; - - yaw = ( 0, self.angles[1], 0 ); - dir = AnglesToForward( yaw ); - dir = VectorNormalize( dir ); - - goal = self.origin + vector_scale( dir, 32 ); - - if ( weapon == "autoturret_mp" ) - { - eye = self.origin + ( 0, 0, 60 ); - goal = eye + vector_scale( dir, 1024 ); - - if ( !SightTracePassed( self.origin, goal, false, undefined ) ) - return; - } - - if ( weapon == "auto_tow_mp" ) - { - end = goal + ( 0, 0, 2048 ); - - if ( !SightTracePassed( goal, end, false, undefined ) ) - return; - } - } - - self thread botStopMove(true); - - if (self ChangeToWeapon(weapon)) - { - self thread fire_current_weapon(); - - wait 1.5; - self notify("stop_firing_weapon"); - - self thread changeToWeapon(self.lastNonKillstreakWeapon); - } - - self thread botStopMove(false); -} - -/* - Bot will think to heli -*/ -bot_control_heli(weapon) -{ - if (!self ChangeToWeapon(weapon)) - return; - - self endon("heli_timeup"); - - wait 2.5; - - if(!isDefined(self.heli)) - return; - - self.heli endon("death"); - self.heli endon("heli_timeup"); - - while(isDefined(self.heli)) - wait 0.25; -} - -/* - Bots think to use killstreaks -*/ -bot_killstreak_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - myteam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - wait( 1 ); - - for (;;) - { - wait( RandomIntRange( 1, 3 ) ); - - curWeap = self GetCurrentWeapon(); - if ((isDefined(self.carryingTurret) && self.carryingTurret) || isSubStr(curWeap, "drop_")) - self PressAttackButton(); - - if (isDefined(self GetThreat())) - continue; - - if ( self IsRemoteControlling() ) - continue; - - if(self UseButtonPressed()) - continue; - - if(self isDefusing() || self isPlanting() || self inLastStand()) - continue; - - weapon = self maps\mp\gametypes\_hardpoints::getTopKillstreak(); - - if ( !IsDefined( weapon ) || weapon == "none" ) - continue; - - killstreak = maps\mp\gametypes\_hardpoints::getKillStreakMenuName( weapon ); - - if ( !IsDefined( killstreak ) ) - continue; - - id = self maps\mp\gametypes\_hardpoints::getTopKillstreakUniqueId(); - - if ( !self maps\mp\_killstreakrules::isKillstreakAllowed( weapon, myteam ) ) - { - wait( 5 ); - continue; - } - - diff = self GetBotDiffNum(); - switch( killstreak ) - { - case "killstreak_helicopter_comlink": - case "killstreak_napalm": - case "killstreak_airstrike": - case "killstreak_mortar": - num = 1; - if (killstreak == "killstreak_mortar") - num = 3; - - if (!self ChangeToWeapon(weapon)) - break; - - self freeze_player_controls( true ); - - wait 1; - - for (i = 0; i < num; i++) - { - origin = self getKillstreakTargetLocation(); - if (!isDefined(origin)) - break; - - yaw = RandomIntRange( 0, 360 ); - - wait 0.25; - self notify( "confirm_location", origin, yaw ); - } - - self freeze_player_controls( false ); - - break; - - case "killstreak_helicopter_gunner": - case "killstreak_helicopter_player_firstperson": - self bot_control_heli(weapon); - wait 1; - break; - - case "killstreak_auto_turret": - case "killstreak_tow_turret": - self bot_turret_location( weapon ); - wait 1; - break; - - case "killstreak_auto_turret_drop": - case "killstreak_tow_turret_drop": - case "killstreak_m220_tow_drop": - case "killstreak_supply_drop": - if(killstreak == "killstreak_supply_drop") - weapon = "supplydrop_mp"; - - self bot_use_supply_drop( weapon ); - wait 1; - break; - - case "killstreak_rcbomb": - self bot_rccar_think(weapon); - wait 1; - break; - - case "killstreak_spyplane": - if ( diff > 0 ) - { - if(level.teamBased) - { - if(level.activeCounterUAVs[otherTeam]) - continue; - - if(level.activeSatellites[myTeam]) - continue; - - if(level.activeUAVs[myTeam]) - continue; - } - else - { - shouldContinue = false; - - players = get_players(); - for (i = 0; i < players.size; i++) - { - player = players[i]; - - if(player == self) - continue; - - if(!isDefined(player.team)) - continue; - - if(isDefined(level.activeCounterUAVs[player.entnum]) && level.activeCounterUAVs[player.entnum]) - continue; - - shouldContinue = true; - break; - } - - if(shouldContinue) - continue; - - if(level.activeSatellites[self.entnum]) - continue; - - if(level.activeUAVs[self.entnum]) - continue; - } - } - - if (!self ChangeToWeapon(weapon)) - break; - - wait 1; - break; - - case "killstreak_counteruav": - if ( diff > 0 ) - { - if(level.teamBased) - { - if(level.activeCounterUAVs[myTeam]) - continue; - } - else - { - if(level.activeCounterUAVs[self.entnum]) - continue; - } - } - - if (!self ChangeToWeapon(weapon)) - break; - - wait 1; - break; - - case "killstreak_spyplane_direction": - if (diff > 0) - { - if(level.teamBased) - { - if(level.activeCounterUAVs[otherTeam]) - continue; - - if(level.activeSatellites[myTeam]) - continue; - } - else - { - shouldContinue = false; - - players = get_players(); - for (i = 0; i < players.size; i++) - { - player = players[i]; - - if(player == self) - continue; - - if(!isDefined(player.team)) - continue; - - if(isDefined(level.activeCounterUAVs[player.entnum]) && level.activeCounterUAVs[player.entnum]) - continue; - - shouldContinue = true; - break; - } - - if(shouldContinue) - continue; - - if(level.activeSatellites[self.entnum]) - continue; - } - } - - case "killstreak_dogs": - default: - if (!self ChangeToWeapon(weapon)) - break; - - wait 1; - break; - } - - if (weapon == "m220_tow_mp" || weapon == "m202_flash_mp" || weapon == "minigun_mp") // don't put away ks weapons - continue; - - self thread changeToWeapon(self.lastNonKillstreakWeapon); - } -} - -/* - Bot will attack the turret -*/ -bot_turret_attack( enemy ) -{ - enemy endon("turret_carried"); - enemy endon("turret_deactivated"); - enemy endon("death"); - - wait_time = RandomIntRange( 7, 10 ); - - for ( i = 0; i < wait_time; i++ ) - { - wait( 1 ); - - if ( !IsDefined( enemy ) ) - { - return; - } - - if(!isAlive(enemy)) - return; - - if ( !BulletTracePassed( self getEye(), enemy.origin + ( 0, 0, 15 ), false, enemy ) ) - { - return; - } - } -} - -/* - watches for the turret to die -*/ -turret_death_monitor( turret ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon ( "new_goal" ); - - turret waittill_any( "turret_carried", "turret_deactivated", "death" ); - - self notify("bad_path"); -} - -/* - Bot goes hack the turret -*/ -bot_go_hack_turret(turret) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon("new_goal"); - self endon( "goal" ); - self endon( "bad_path" ); - - for(;;) - { - wait 0.5; - - if (!isDefined(turret)) - break; - - if (!isDefined(turret.hackerTrigger)) - break; - - if (self isTouching(turret.hackerTrigger)) - break; - } - - if(!isDefined(turret) || !isDefined(turret.hackerTrigger)) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Bot thinks to target turret -*/ -bot_turret_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - myteam = self.pers[ "team" ]; - - for ( ;; ) - { - wait( 1 ); - - turrets = GetEntArray( "auto_turret", "classname" ); - - if ( turrets.size == 0 ) - { - wait( randomintrange( 3, 5 ) ); - continue; - } - - if(isDefined(self GetThreat()) || self IsRemoteControlling() || self UseButtonPressed()) - continue; - - turret = undefined; - myEye = self GetEye(); - - for (i = turrets.size - 1; i >= 0; i--) - { - tempTurret = turrets[i]; - - if (!isDefined(tempTurret) || !isDefined(tempTurret.damageTaken)) - continue; - - if (tempTurret.damageTaken >= tempTurret.health) - continue; - - if (tempTurret.carried) - continue; - - if (level.teambased && tempTurret.team == myteam) - continue; - - if (IsDefined( tempTurret.owner ) && tempTurret.owner == self) - continue; - - if(!bulletTracePassed(myEye, tempTurret.origin + (0, 0, 15), false, tempTurret)) - continue; - - turret = tempTurret; - } - - if (!isDefined(turret)) - continue; - - forward = AnglesToForward( turret.angles ); - forward = VectorNormalize( forward ); - - delta = self.origin - turret.origin; - delta = VectorNormalize( delta ); - - dot = VectorDot( forward, delta ); - - facing = true; - if ( dot < 0.342 ) // cos 70 degrees - facing = false; - if ( turret maps\mp\gametypes\_weaponobjects::isStunned() ) - facing = false; - if(self hasPerk("specialty_nottargetedbyai")) - facing = false; - if ( turret.turrettype == "tow" ) - facing = false; - - if ( facing && !BulletTracePassed( myEye, turret.origin + ( 0, 0, 15 ), false, turret ) ) - continue; - - if ( !IsDefined( turret.bots ) ) - turret.bots = 0; - - if ( turret.bots >= 2 ) - continue; - - if(!facing && !self HasScriptGoal() && !self.bot_lock_goal) - { - if ( self HasPerk( "specialty_disarmexplosive" ) ) - { - self SetBotGoal(turret.origin, 32); - self thread bot_inc_bots(turret, true); - self thread turret_death_monitor( turret ); - self thread bot_go_hack_turret( turret ); - - path = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (path != "new_goal") - self ClearBotGoal(); - - if ( path != "goal" || !isDefined(turret) || !isDefined(turret.hackerTrigger) || !self isTouching(turret.hackerTrigger) ) - continue; - - hackTime = GetDvarFloat( #"perk_disarmExplosiveTime" ); - self PressUseButton( hackTime + 0.5 ); - wait( hackTime + 0.5 ); - continue; - } - else - { - self SetBotGoal(turret.origin, 32); - self thread bot_inc_bots(turret, true); - self thread turret_death_monitor( turret ); - self thread bots_watch_touch_obj( turret ); - - if(self waittill_any_return("bad_path", "goal", "new_goal") != "new_goal") - self ClearBotGoal(); - } - } - - if(!isDefined(turret)) - continue; - - self SetScriptEnemy( turret ); - self bot_turret_attack(turret); - self ClearScriptEnemy(); - } -} - -/* - Bot will attack the equipment -*/ -bot_equipment_attack(equ) -{ - equ endon("death"); - equ endon("hacked"); - - wait_time = RandomIntRange( 7, 10 ); - - for ( i = 0; i < wait_time; i++ ) - { - wait( 1 ); - - if ( !IsDefined( equ ) ) - { - return; - } - } -} - -/* - Bots target equipment -*/ -bot_equipment_kill_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - myteam = self.pers[ "team" ]; - - for ( ;; ) - { - wait RandomIntRange( 1, 3 ); - - if(isDefined(self GetThreat()) || self IsRemoteControlling() || self UseButtonPressed()) - continue; - - grenades = GetEntArray( "grenade", "classname" ); - hasHacker = self HasPerk( "specialty_showenemyequipment" ); - myEye = self getEye(); - myAngles = self getPlayerAngles(); - target = undefined; - - for ( i = 0; i < grenades.size; i++ ) - { - item = grenades[i]; - - if (!isDefined(item)) - continue; - - if ( !IsDefined( item.name ) ) - { - continue; - } - - if ( !IsDefined( item.owner ) ) - { - continue; - } - - if ( level.teamBased && item.owner.team == myteam ) - { - continue; - } - - if ( item.owner == self ) - { - continue; - } - - if ( !IsWeaponEquipment( item.name ) ) - { - continue; - } - - if(!isDefined(item.bots)) - item.bots = 0; - - if(item.bots >= 2) - continue; - - if (!hasHacker && !BulletTracePassed(myEye, item.origin, false, item)) - continue; - - if(getConeDot(item.origin, self.origin, myAngles) < 0.6) - continue; - - if ( DistanceSquared( item.origin, self.origin ) < 512 * 512 ) - { - target = item; - break; - } - } - - if ( !IsDefined( target ) ) - { - players = get_players(); - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - if ( player == self ) - { - continue; - } - - if(!isDefined(player.team)) - continue; - - if ( level.teamBased && player.team == myteam ) - { - continue; - } - - if(!isDefined(player.tacticalInsertion)) - continue; - - if(!isDefined(player.tacticalInsertion.bots)) - player.tacticalInsertion.bots = 0; - - if(player.tacticalInsertion.bots >= 2) - continue; - - if (!hasHacker && !BulletTracePassed(myEye, player.tacticalInsertion.origin, false, player.tacticalInsertion)) - continue; - - if(getConeDot(player.tacticalInsertion.origin, self.origin, myAngles) < 0.6) - continue; - - if ( DistanceSquared( player.tacticalInsertion.origin, self.origin ) < 512 * 512 ) - { - target = player.tacticalInsertion; - break; - } - } - } - - if ( IsDefined( target ) ) - { - facing = false; - if(isDefined(target.name) && target.name == "claymore_mp") - { - if ( VectorDot( VectorNormalize( AnglesToForward( target.angles ) ), VectorNormalize( self.origin - target.origin ) ) >= 0.342 && !target maps\mp\gametypes\_weaponobjects::isStunned() ) // cos 70 degrees - facing = true; - } - - if ( (( self HasPerk( "specialty_disarmexplosive" ) && !facing ) || isDefined(target.enemyTrigger)) && !self HasScriptGoal() && !self.bot_lock_goal ) - { - self SetBotGoal(target.origin, 32); - self thread bot_inc_bots(target, true); - self thread bots_watch_touch_obj( target ); - - path = self waittill_any_return("bad_path", "goal", "new_goal"); - - if (path != "new_goal") - self ClearBotGoal(); - - if (path != "goal" || !isDefined(target) || (isDefined(target.hackerTrigger) && !self isTouching(target.hackerTrigger)) || (isDefined(target.enemyTrigger) && !self isTouching(target.enemyTrigger))) - continue; - - hackTime = GetDvarFloat( #"perk_disarmExplosiveTime" ); - self PressUseButton( hackTime + 0.5 ); - wait( hackTime + 0.5 ); - continue; - } - - self SetScriptEnemy( target ); - self bot_equipment_attack(target); - self ClearScriptEnemy(); - } - } -} - -/* - Bots watch when they get stuck on a carepackage and cap it -*/ -bot_watch_stuck_on_crate() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - radius = GetDvarFloat( #"player_useRadius" ); - - for ( ;; ) - { - wait( 3 ); - - if ( IsDefined( self GetThreat() ) ) - continue; - - if ( self UseButtonPressed() ) - continue; - - crates = GetEntArray( "care_package", "script_noteworthy" ); - - for ( i = 0; i < crates.size; i++ ) - { - crate = crates[i]; - - if (!isDefined(crate) || !isDefined(crate.origin)) - continue; - - if ( DistanceSquared( self.origin, crate.origin ) < radius * radius ) - { - if ( isDefined(crate.owner) && crate.owner == self ) - { - self PressUseButton( level.crateOwnerUseTime / 1000 + 0.5 ); - wait level.crateOwnerUseTime / 1000 + 0.5; - } - else - { - self PressUseButton( level.crateNonOwnerUseTime / 1000 + 0.5 ); - wait level.crateNonOwnerUseTime / 1000 + 0.5; - } - - break; - } - } - } -} - -/* - Bots capture the cp -*/ -bot_crate_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - myteam = self.pers[ "team" ]; - - first = true; - - for ( ;; ) - { - ret = "bot_crate_landed"; - if(first) - first = false; - else - ret = self waittill_any_timeout( randomintrange( 3, 5 ), "bot_crate_landed" ); - - if ( RandomInt( 100 ) < 20 && ret != "bot_crate_landed" ) - continue; - - if ( self HasScriptGoal() || self.bot_lock_goal ) - continue; - - if(self isDefusing() || self isPlanting()) - continue; - - if (self inLastStand()) - continue; - - if (self IsRemoteControlling()) - continue; - - if(self UseButtonPressed()) - continue; - - crates = GetEntArray( "care_package", "script_noteworthy" ); - if ( crates.size == 0 ) - continue; - - wantsClosest = randomint(2); - - crate = undefined; - for (i = crates.size - 1; i >= 0; i--) - { - tempCrate = crates[i]; - - if (!isDefined(tempCrate) || !IsDefined( tempCrate.friendlyObjID )) - continue; - - if ( myteam == tempCrate.team ) - { - if ( RandomInt( 100 ) > 30 && IsDefined( tempCrate.owner ) && tempCrate.owner != self ) - continue; - } - else if (isDefined(tempCrate.hacker)) - continue; - - if ( !IsDefined( tempCrate.bots ) ) - tempCrate.bots = 0; - - if ( tempCrate.bots >= 3 ) - continue; - - if (isDefined(crate)) - { - if (wantsClosest) - { - if (DistanceSquared(crate.origin, self.origin) < DistanceSquared(tempCrate.origin, self.origin)) - continue; - } - else - { - if (crate.crateType.weight < tempCrate.crateType.weight) - continue; - } - } - - crate = tempCrate; - } - - if (!isDefined(crate)) - continue; - - self.bot_lock_goal = true; - - radius = GetDvarFloat( "player_useRadius" ); - self SetBotGoal(crate.origin + (0, 0, 12), radius); - self thread bot_inc_bots(crate, true); - self thread bots_watch_touch_obj(crate); - - path = self waittill_any_return("bad_path", "goal", "new_goal"); - - self.bot_lock_goal = false; - - if (path != "new_goal") - self ClearBotGoal(); - - if (path != "goal" || !isDefined(crate) || DistanceSquared(self.origin, crate.origin) > radius*radius) - continue; - - if(isdefined( crate.crateType.hint_gambler ) && self hasPerk("specialty_gambler") && randomInt(3)) - crate notify( "trigger_use_doubletap", self ); - - if ( isDefined(crate.owner) && crate.owner == self ) - { - self PressUseButton( level.crateOwnerUseTime / 1000 + 0.5 ); - wait( level.crateOwnerUseTime / 1000 + 0.5 ); - } - else - { - self PressUseButton( level.crateNonOwnerUseTime / 1000 + 1 ); - wait( level.crateNonOwnerUseTime / 1000 + 1.5 ); - } - } -} - -/* - Returns an weapon thats a rocket with ammo -*/ -getRocketAmmo() -{ - answer = self getLockonAmmo(); - - if (isDefined(answer)) - return answer; - - if (self GetAmmoCount("minigun_mp")) - return "minigun_mp"; - - if (self GetAmmoCount("rpg_mp")) - return "rpg_mp"; - - return undefined; -} - -/* - Returns a weapon thats lockon with ammo -*/ -getLockonAmmo() -{ - if (self GetAmmoCount("m72_law_mp")) - return "m72_law_mp"; - - if (self GetAmmoCount("strela_mp")) - return "strela_mp"; - - if (self GetAmmoCount("m202_flash_mp")) - return "m202_flash_mp"; - - return undefined; -} - -/* - Gets the object thats the closest in the array -*/ -bot_array_nearest_curorigin(array) -{ - result = undefined; - - for(i = 0; i < array.size; i++) - if(!isDefined(result) || DistanceSquared(self.origin,array[i].curorigin) < DistanceSquared(self.origin,result.curorigin)) - result = array[i]; - - return result; -} - -/* - Bot attacks the vehicle -*/ -bot_vehicle_attack( enemy ) -{ - wait_time = RandomIntRange( 7, 10 ); - - for ( i = 0; i < wait_time; i++ ) - { - wait( 1 ); - - if ( !IsDefined( enemy ) ) - { - return; - } - - if ( !IsAlive( enemy ) ) - { - return; - } - - if ( !IsDefined( enemy.targetname ) || enemy.targetname != "rcbomb" ) - { - if ( !isDefined(self getRocketAmmo()) ) - { - return; - } - } - - if ( !BulletTracePassed( self.origin, enemy.origin, false, enemy ) ) - { - return; - } - } -} - -/* - Bot will change to angles with speed -*/ -bot_lookat(angles, speed) -{ - self notify("bots_aim_overlap"); - self endon("bots_aim_overlap"); - self endon("disconnect"); - self endon("death"); - level endon ( "game_ended" ); - - myAngle=self getPlayerAngles(); - - X=(angles[0]-myAngle[0]); - while(X > 170.0) - X=X-360.0; - while(X < -170.0) - X=X+360.0; - X=X/speed; - - Y=(angles[1]-myAngle[1]); - while(Y > 180.0) - Y=Y-360.0; - while(Y < -180.0) - Y=Y+360.0; - - Y=Y/speed; - - for(i=0;i= 2) - { - self SetWeaponAmmoClip(weap, self GetWeaponAmmoClip(weap)-1); - - missile = MagicBullet( weap, self getEye(), plane.origin, self ); - missile Missile_SetTarget( plane ); - - level notify ( "missile_fired", self, missile, plane, true ); - self notify("bots_aim_overlap"); - - wait 1; - return; - } - } - } -} - -/* - Bots think to kill vehicles -*/ -bot_target_vehicle() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - myteam = self.pers[ "team" ]; - - for (;;) - { - wait( 1 ); - - if(isDefined(self GetThreat()) || self IsRemoteControlling() || self UseButtonPressed()) - continue; - - airborne_enemies = GetEntArray( "script_vehicle", "classname" ); - target = undefined; - myEye = self getEye(); - rocketAmmo = self getRocketAmmo(); - for ( i = 0; i < airborne_enemies.size; i++ ) - { - enemy = airborne_enemies[i]; - - if ( !IsDefined( enemy ) ) - { - continue; - } - - if ( !IsAlive( enemy ) ) - { - continue; - } - - if ( level.teamBased ) - { - if ( enemy.team == myteam ) - { - continue; - } - } - - if ( enemy.owner == self ) - { - continue; - } - - if ( !IsDefined( enemy.targetname ) || enemy.targetname != "rcbomb" ) - { - if ( !isDefined(rocketAmmo) ) - { - continue; - } - } - - if ( !BulletTracePassed( myEye, enemy.origin, false, enemy ) ) - { - continue; - } - - target = enemy; - break; - } - - if(!isDefined(target)) - { - if(isDefined(self getLockonAmmo())) - { - for(i = 0; i < level.bot_planes.size; i++) - { - enemy = level.bot_planes[i]; - - if ( !IsDefined( enemy ) ) - { - continue; - } - - if ( !IsAlive( enemy ) ) - { - continue; - } - - if ( level.teamBased ) - { - if ( enemy.team == myteam ) - { - continue; - } - } - - if ( enemy.owner == self ) - { - continue; - } - - if ( !BulletTracePassed( myEye, enemy.origin, false, enemy ) ) - { - continue; - } - - target = enemy; - break; - } - } - } - - if(!isDefined(target)) - { - wait( RandomIntRange( 3, 5 ) ); - continue; - } - - if(isDefined(target.bot_plane)) - { - self bot_plane_attack(target); - self freeze_player_controls(false); - self thread botStopMove(false); - } - else - { - self SetScriptEnemy( target ); - self bot_vehicle_attack( target ); - self ClearScriptEnemy(); - } - } -} - -/* - Bot uses their equipment -*/ -bot_use_equipment_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - weapon = self.pers["bot"]["class_equipment"]; - - if(weapon == "" || weapon == "weapon_null_mp" || weapon == "satchel_charge_mp") - return; - - for ( ;; ) - { - wait( RandomIntRange( 1, 3 ) ); - - if ( !self HasWeapon( weapon ) ) - return; - - if (!self GetAmmoCount(weapon)) - continue; - - if ( self IsRemoteControlling()) - continue; - - if ( isDefined(self getThreat()) ) - continue; - - if (self._is_sprinting) - continue; - - diff = self GetBotDiffNum(); - - if (diff > 0) - { - if ( weapon == "camera_spike_mp" ) - { - if ( self GetLookaheadDist() < 384 ) - continue; - - view_angles = self GetPlayerAngles(); - - if ( view_angles[0] < -5 ) - continue; - } - else - { - if ( self GetLookaheadDist() > 64 ) - continue; - } - } - - dir = self GetLookaheadDir(); - if ( !IsDefined( dir ) ) - continue; - - dir = VectorToAngles( dir ); - if ( abs( dir[1] - self.angles[1] ) > 5 ) - continue; - - dir = VectorNormalize( AnglesToForward( self.angles ) ); - dir = vector_scale( dir, 32 ); - goal = self.origin + dir; - - if (randomInt(100) > 35) - continue; - - grenades = GetEntArray( "grenade", "classname" ); - anyEquNear = false; - for ( i = 0; i < grenades.size; i++ ) - { - item = grenades[i]; - - if ( !IsDefined( item.name ) ) - continue; - - if ( !IsWeaponEquipment( item.name ) ) - continue; - - if ( DistanceSquared( item.origin, goal ) < 128 * 128 ) - anyEquNear = true; - } - - if (anyEquNear && diff > 0) - continue; - - lastWeap = self getCurrentWeapon(); - - self thread botStopMove(true); - - if (self ChangeToWeapon(weapon)) - { - self thread fire_current_weapon(); - - ret = self waittill_any_timeout( 5, "grenade_fire" ); - self notify("stop_firing_weapon"); - - self thread changeToWeapon(lastWeap); - } - - self thread botStopMove(false); - } -} - -/* - Bots go to the revive -*/ -bot_go_revive(revive) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 1; - - if (!isDefined(revive)) - break; - - if (!isDefined(revive.revivetrigger)) - break; - - if (self isTouching(revive.revivetrigger)) - break; - } - - if(!isDefined(revive) || !isDefined(revive.revivetrigger)) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Bots go revive -*/ -bot_revive_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( !level.teamBased ) - return; - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self HasScriptGoal() || self.bot_lock_goal ) - continue; - - if(self isDefusing() || self isPlanting()) - continue; - - if (self inLastStand()) - continue; - - if (self IsRemoteControlling()) - continue; - - if(self UseButtonPressed()) - continue; - - revivePlayer = undefined; - for(i = 0; i < level.players.size; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - if(player == self) - continue; - if(self.pers["team"] != player.pers["team"]) - continue; - if(!isDefined(player.revivetrigger)) - continue; - - if (isDefined(player.currentlyBeingRevived) && player.currentlyBeingRevived) - continue; - - if (!isDefined(player.revivetrigger.bots)) - player.revivetrigger.bots = 0; - - if (player.revivetrigger.bots > 2) - continue; - - revivePlayer = player; - } - - if (!isDefined(revivePlayer)) - continue; - - self.bot_lock_goal = true; - - self SetBotGoal( revivePlayer.origin, 1 ); - self thread bot_inc_bots(revivePlayer.revivetrigger, true); - self thread bot_go_revive(revivePlayer); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || !isDefined(revivePlayer) || (isDefined(revivePlayer.currentlyBeingRevived) && revivePlayer.currentlyBeingRevived) || !self isTouching(revivePlayer.revivetrigger) || self InLastStand()) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - reviveTime = GetDvarInt( #"revive_time_taken" ); - self PressUseButton( reviveTime + 1 ); - wait( reviveTime + 1.5 ); - - self ClearBotGoal(); - self.bot_lock_goal = false; - } -} - -/* - Bot attacks dog -*/ -bot_dog_attack(dog) -{ - dog endon("death"); - - wait_time = RandomIntRange( 7, 10 ); - - for ( i = 0; i < wait_time; i++ ) - { - wait( 1 ); - - if ( !IsDefined( dog ) ) - { - return; - } - - if ( !IsAlive( dog ) ) - { - return; - } - - if ( !BulletTracePassed( self.origin, dog.origin, false, dog ) ) - { - return; - } - } -} - -/* - Bot thinks to attack dogs -*/ -bot_dogs_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - myteam = self.pers[ "team" ]; - - if ( level.no_dogs ) - return; - - for ( ;; ) - { - wait( 0.25 ); - - if ( !IsDefined( level.dogs ) || level.dogs.size <= 0 ) - level waittill( "called_in_the_dogs" ); - - if(isDefined(self GetThreat())) - continue; - - for ( i = 0; i < level.dogs.size; i++ ) - { - dog = level.dogs[i]; - - if ( !IsDefined( dog ) ) - { - continue; - } - - if ( !IsAlive( dog ) ) - { - continue; - } - - if ( level.teamBased ) - { - if ( dog.aiteam == myteam ) - { - continue; - } - } - - if ( isDefined(dog.script_owner) && dog.script_owner == self ) - { - continue; - } - - if ( DistanceSquared( self.origin, dog.origin ) < 1024 * 1024 ) - { - if(!BulletTracePassed( self.origin, dog.origin, false, dog )) - continue; - - self SetScriptEnemy( dog ); - self bot_dog_attack(dog); - self ClearScriptEnemy(); - break; - } - } - } -} - -/* - Clears goal when events death -*/ -stop_go_target_on_death(tar) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "new_goal" ); - self endon( "bad_path" ); - self endon( "goal" ); - - tar waittill_either("death", "disconnect"); - - self ClearBotGoal(); -} - -/* - Goes to the target's location if it had one -*/ -follow_target() -{ - self endon( "death" ); - self endon( "disconnect" ); - - for(;;) - { - wait 1; - - if ( self HasScriptGoal() || self.bot_lock_goal ) - continue; - - threat = self GetThreat(); - - if ( !isDefined(threat) ) - continue; - - if (!isPlayer(threat)) - continue; - - if(randomInt(100) > 50) - continue; - - self thread stop_go_target_on_death(threat); - - self SetBotGoal(threat.origin, 64); - if (self waittill_any_return("new_goal", "goal", "bad_path") != "new_goal") - self ClearBotGoal(); - } -} - -/* - Bots play mw2 -*/ -bot_watch_think_mw2() -{ - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); - - for (;;) - { - wait randomIntRange(1, 4); - - if(self isDefusing() || self isPlanting()) - continue; - - if (self IsRemoteControlling()) - continue; - - if (self InLastStand()) - continue; - - if (isDefined(self GetThreat())) - continue; - - tube = self getValidTube(); - if (!isDefined(tube)) - { - if (self GetAmmoCount("m72_law_mp")) - tube = "m72_law_mp"; - else if (self GetAmmoCount("rpg_mp")) - tube = "rpg_mp"; - else - continue; - } - - if (self GetCurrentWeapon() == tube) - continue; - - if (randomInt(100) > 35) - continue; - - self ChangeToWeapon(tube); - } -} - -/* - Fast swaps or reload cancels don't work cause t5 bots wait for the anim to complete - Bots will think to switch weapons -*/ -bot_weapon_think() -{ - self endon("death"); - self endon("disconnect"); - level endon("game_ended"); - - first = true; - - for(;;) - { - self waittill_any_timeout(randomIntRange(2, 4), "bot_force_check_switch"); - - if(self isDefusing() || self isPlanting()) - continue; - - if (self IsRemoteControlling()) - continue; - - if (self InLastStand()) - continue; - - curWeap = self GetCurrentWeapon(); - threat = self getThreat(); - - if (isDefined(threat) && !isPlayer(threat)) - continue; - - if (first) - { - first = false; - - if (randomInt(100) > 10) - continue; - } - else - { - if(curWeap != "none" && self getAmmoCount(curWeap) && curWeap != "strela_mp") - { - if(randomInt(100) > 2) - continue; - - if(isDefined(threat)) - continue; - } - } - - weaponslist = self getweaponslist(); - weap = ""; - while(weaponslist.size) - { - weapon = weaponslist[randomInt(weaponslist.size)]; - weaponslist = array_remove(weaponslist, weapon); - - if(!self getAmmoCount(weapon)) - continue; - - if (!maps\mp\gametypes\_weapons::isPrimaryWeapon( weapon ) && !maps\mp\gametypes\_weapons::isSideArm( weapon ) && !isWeaponAltmode(weapon)) - continue; - - if(curWeap == weapon || weapon == "none" || weapon == "" || weapon == "strela_mp") - continue; - - weap = weapon; - break; - } - - if(weap == "") - continue; - - self thread changeToWeapon(weap); - } -} - -/* - Bots pay attention to the uav -*/ -bot_uav_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - diff = self GetBotDiffNum(); - - wasFooled = false; - for(;;) - { - wait 0.75; - - if ( self HasScriptGoal() ) - continue; - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - hasCam = isDefined(self.cameraSpike); - - if(self.bot_scrambled && !hasCam) - continue; - - players = get_players(); - - hasUAV = false; - hasSR = false; - if(level.teamBased) - { - if(level.activeCounterUAVs[otherTeam] && !hasCam) - continue; - - hasSR = level.activeSatellites[myTeam]; - hasUAV = level.activeUAVs[myTeam]; - } - else - { - shouldContinue = false; - - for (i = 0; i < players.size; i++) - { - player = players[i]; - - if(player == self) - continue; - - if(!isDefined(player.team)) - continue; - - if(isDefined(level.activeCounterUAVs[player.entnum]) && level.activeCounterUAVs[player.entnum]) - continue; - - shouldContinue = true; - break; - } - - if(shouldContinue && !hasCam) - continue; - - hasSR = level.activeSatellites[self.entnum]; - hasUAV = level.activeUAVs[self.entnum]; - } - - if(level.hardcoreMode && !hasUAV && !hasSR && !hasCam) - continue; - - dist = GetDvarInt( #"scr_help_dist" ); - dist = dist * dist * 8; - - if(!wasFooled && level.bot_decoys.size && !hasCam) - { - shouldContinue = false; - - for(i = 0; i < level.bot_decoys.size; i++) - { - g = level.bot_decoys[i]; - - if(isDefined(g.owner) && g.owner == self) - continue; - - if(level.teamBased && g.team == myTeam) - continue; - - if(DistanceSquared(self.origin, g.origin) > dist) - continue; - - if(lengthsquared( g getVelocity() ) > 10000) - continue; - - if(diff > 0) - wasFooled = true; - - self SetBotGoal( g.origin, 128 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - shouldContinue = true; - break; - } - - if(shouldContinue) - continue; - } - - if ( diff <= 0 ) - { - continue; - } - - for (i = 0; i < players.size; i++) - { - player = players[i]; - - if(player == self) - continue; - - if(level.teambased && player.team == myTeam) - continue; - - if(!isAlive(player)) - continue; - - if(player.sessionstate != "playing") - continue; - - if(DistanceSquared(self.origin, player.origin) > dist) - continue; - - if(hasCam) - { - if(!self.cameraSpike maps\mp\gametypes\_weaponobjects::isStunned()) - { - if ( VectorDot( VectorNormalize( AnglesToForward( self.cameraSpike.cameraHead.angles ) ), VectorNormalize( player.origin - self.cameraSpike.origin ) ) >= 0.342 && SightTracePassed(player.origin+(0,0,5), self.cameraSpike.origin+(0,0,5), false, self.cameraSpike) && !player hasPerk("specialty_nottargetedbyai")) // cos 70 degrees - { - self SetBotGoal( player.origin, 128 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - break; - } - } - } - else if(hasSR || (!isSubStr(player getCurrentWeapon(), "_silencer_") && player.bot_firing) || (hasUAV && !player hasPerk("specialty_gpsjammer")) || (isDefined(self.acousticSensor) && !self.acousticSensor maps\mp\gametypes\_weaponobjects::isStunned() && !player hasPerk("specialty_nomotionsensor") && distance2d(self.acousticSensor.origin, player.origin) < 666)) - { - self SetBotGoal( player.origin, 128 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - break; - } - } - } -} - -/* - bots will go to their target's kill location -*/ -bot_revenge_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if (isDefined(self.lastKiller) && isAlive(self.lastKiller)) - { - if(bulletTracePassed(self getEye(), self.lastKiller getTagOrigin( "j_spineupper" ), false, self.lastKiller)) - { - self setAttacker(self.lastKiller); - } - } - - if(!isDefined(self.killerLocation)) - return; - - loc = self.killerLocation; - - for(;;) - { - wait( RandomIntRange( 1, 5 ) ); - - if(self HasScriptGoal() || self.bot_lock_goal) - return; - - if ( randomint( 100 ) < 75 ) - return; - - self SetBotGoal( loc, 64 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } -} - -/* - Bots will listen to foot steps and target nearby targets -*/ -bot_listen_to_steps() -{ - self endon("disconnect"); - self endon("death"); - - for(;;) - { - wait 1; - - dist = 100; - if(self hasPerk("specialty_loudenemies")) - dist *= 1.4; - - dist *= dist; - - heard = undefined; - for(i = level.players.size-1 ; i >= 0; i--) - { - player = level.players[i]; - - if(player == self) - continue; - - if (!isDefined(player.team)) - continue; - - if(level.teamBased && self.team == player.team) - continue; - if(player.sessionstate != "playing") - continue; - if(!isAlive(player)) - continue; - - if( lengthsquared( player getVelocity() ) < 20000 ) - continue; - - if( distanceSquared(player.origin, self.origin) > dist ) - continue; - - if( player hasPerk("specialty_quieter")) - continue; - - heard = player; - break; - } - - if(!IsDefined(heard)) - continue; - - if(bulletTracePassed(self getEye(), heard getTagOrigin( "j_spineupper" ), false, heard)) - { - self setAttacker(heard); - continue; - } - - if (self HasScriptGoal() || self.bot_lock_goal) - continue; - - self SetBotGoal( heard.origin, 64 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } -} - -/* - Presses the buttons on radiation -*/ -bot_radiation_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - if ( level.script != "mp_radiation" ) - return; - - if ( level.wagerMatch ) - return; - - origins = []; - origins[0] = ( 813, 5, 267 ); - origins[1] = ( -811, 30, 363 ); - - for ( ;; ) - { - wait( RandomIntRange( 8, 15 ) ); - - if ( self HasScriptGoal() ) - continue; - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - continue; - - if (self UseButtonPressed()) - continue; - - origin = random( origins ); - - if ( DistanceSquared( self.origin, origin ) < 512 * 512 ) - { - self SetBotGoal( origin, 32 ); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal") - continue; - - self SetBotGoal( self.origin, 32 ); - - self PressUseButton( 3 ); - wait( 3 ); - - self ClearBotGoal(); - } - - wait( RandomIntRange( 5, 10 ) ); - } -} - -/* - Bots hang around the enemy's flag to spawn kill em -*/ -bot_dom_spawn_kill_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "dom" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - for ( ;; ) - { - wait( randomintrange( 10, 20 ) ); - - if ( randomint( 100 ) < 20 ) - continue; - - if ( self HasScriptGoal() || self.bot_lock_goal) - continue; - - myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); - - if ( myFlagCount == level.flags.size ) - continue; - - otherFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( otherTeam ); - - if (myFlagCount <= otherFlagCount || otherFlagCount != 1) - continue; - - flag = undefined; - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam ) - continue; - } - - if(!isDefined(flag)) - continue; - - if(DistanceSquared(self.origin, flag.origin) < 2048*2048) - continue; - - self SetBotGoal( flag.origin, 1024 ); - - self thread bot_dom_watch_flags(myFlagCount, myTeam); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } -} - -/* - Calls 'bad_path' when the flag count changes -*/ -bot_dom_watch_flags(count, myTeam) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (maps\mp\gametypes\dom::getTeamFlagCount( myTeam ) != count) - break; - } - - self notify("bad_path"); -} - -/* - Bots watches their own flags and protects them when they are under capture -*/ -bot_dom_def_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "dom" ) - return; - - myTeam = self.pers[ "team" ]; - - for ( ;; ) - { - wait( randomintrange( 1, 3 ) ); - - if ( randomint( 100 ) < 35 ) - continue; - - if ( self HasScriptGoal() || self.bot_lock_goal ) - continue; - - flag = undefined; - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() != myTeam ) - continue; - - if ( !level.flags[i].useObj.objPoints[myTeam].isFlashing ) - continue; - - if ( !isDefined(flag) || DistanceSquared(self.origin,level.flags[i].origin) < DistanceSquared(self.origin,flag.origin) ) - flag = level.flags[i]; - } - - if ( !isDefined(flag) ) - continue; - - self SetBotGoal( flag.origin, 128 ); - - self thread bot_dom_watch_for_flashing(flag, myTeam); - self thread bots_watch_touch_obj(flag); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } -} - -/* - Watches while the flag is under capture -*/ -bot_dom_watch_for_flashing(flag, myTeam) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (!isDefined(flag)) - break; - - if (flag maps\mp\gametypes\dom::getFlagTeam() != myTeam || !flag.useObj.objPoints[myTeam].isFlashing) - break; - } - - self notify("bad_path"); -} - -/* - Bots capture dom flags -*/ -bot_dom_cap_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "dom" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - for ( ;; ) - { - wait( randomintrange( 3, 12 ) ); - - if ( self.bot_lock_goal ) - { - continue; - } - - if ( !isDefined(level.flags) || level.flags.size == 0 ) - continue; - - myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); - - if ( myFlagCount == level.flags.size ) - continue; - - otherFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( otherTeam ); - - if (game["teamScores"][myteam] >= game["teamScores"][otherTeam]) - { - if ( myFlagCount < otherFlagCount ) - { - if ( randomint( 100 ) < 15 ) - continue; - } - else if ( myFlagCount == otherFlagCount ) - { - if ( randomint( 100 ) < 35 ) - continue; - } - else if ( myFlagCount > otherFlagCount ) - { - if ( randomint( 100 ) < 95 ) - continue; - } - } - - flag = undefined; - flags = []; - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam ) - continue; - - flags[flags.size] = level.flags[i]; - } - - if (randomInt(100) > 30) - { - for ( i = 0; i < flags.size; i++ ) - { - if ( !isDefined(flag) || DistanceSquared(self.origin,level.flags[i].origin) < DistanceSquared(self.origin,flag.origin) ) - flag = level.flags[i]; - } - } - else if (flags.size) - { - flag = random(flags); - } - - if ( !isDefined(flag) ) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( flag.origin, 64 ); - - self thread bot_dom_go_cap_flag(flag, myteam); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if (event != "goal") - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - while ( flag maps\mp\gametypes\dom::getFlagTeam() != myTeam && self isTouching(flag) ) - { - cur = flag.useObj.curProgress; - wait 0.5; - - if(flag.useObj.curProgress == cur) - break;//some enemy is near us, kill him - } - - self ClearBotGoal(); - - self.bot_lock_goal = false; - } -} - -/* - Bot goes to the flag, watching while they don't have the flag -*/ -bot_dom_go_cap_flag(flag, myteam) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait randomintrange(2,4); - - if (!isDefined(flag)) - break; - - if (flag maps\mp\gametypes\dom::getFlagTeam() == myTeam) - break; - - if (self isTouching(flag)) - break; - } - - if (flag maps\mp\gametypes\dom::getFlagTeam() == myTeam) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Bots play capture the flag -*/ -bot_cap() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( level.gametype != "ctf" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if(!isDefined(level.teamFlagZones)) - continue; - - if(!isDefined(level.teamFlags)) - continue; - - myflag = level.teamFlags[myteam]; - myzone = level.teamFlagZones[myteam]; - - theirflag = level.teamFlags[otherTeam]; - theirzone = level.teamFlagZones[otherTeam]; - - if(myflag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome()) - { - carrier = myflag.carrier; - - if(!isDefined(carrier))//someone doesnt has our flag - { - if(!isDefined(theirflag.carrier) && DistanceSquared(self.origin, theirflag.curorigin) < DistanceSquared(self.origin, myflag.curorigin)) //no one has their flag and its closer - self bot_cap_get_flag(theirflag); - else//go get it - self bot_cap_get_flag(myflag); - - continue; - } - else - { - if(!theirflag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome() && randomint(100) < 50) - { //take their flag - self bot_cap_get_flag(theirflag); - } - else - { - if(self HasScriptGoal()) - continue; - - if(!isDefined(theirzone.bots)) - theirzone.bots = 0; - - origin = theirzone.curorigin; - - if(theirzone.bots > 2 || randomInt(100) < 45) - { - //kill carrier - if(carrier hasPerk( "specialty_gpsjammer" )) - continue; - - origin = carrier.origin; - - self SetBotGoal( origin, 64 ); - self thread bot_escort_obj(myflag, carrier); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - self thread bot_inc_bots(theirzone); - - //camp their zone - if(DistanceSquared(origin, self.origin) <= 1024*1024) - { - wait 4; - self notify("bot_inc_bots"); theirzone.bots--; - continue; - } - - self SetBotGoal( origin, 256 ); - self thread bot_inc_bots(theirzone); - self thread bot_escort_obj(myflag, carrier); - - if(self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } - } - } - else//our flag is ok - { - if(self isFlagCarrier())//if have flag - { - //go cap - origin = myzone.curorigin; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 32 ); - - self thread bot_get_obj(myflag); - evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - wait 1; - if (evt != "new_goal") - self ClearBotGoal(); - self.bot_lock_goal = false; - continue; - } - - carrier = theirflag.carrier; - - if(!isDefined(carrier))//if no one has enemy flag - { - self bot_cap_get_flag(theirflag); - continue; - } - - //escort them - - if(self HasScriptGoal()) - continue; - - origin = carrier.origin; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - self thread bot_escort_obj(theirflag, carrier); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } - } -} - -/* - Bots go and get the flag -*/ -bot_cap_get_flag(flag) -{ - origin = flag.curorigin; - - //go get it - - self.bot_lock_goal = true; - self SetBotGoal( origin, 32 ); - - self thread bot_get_obj(flag); - - evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - wait 1; - - self.bot_lock_goal = false; - if (evt != "new_goal") - self ClearBotGoal(); -} - -/* - Bots play headquarters -*/ -bot_hq() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "koth" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self.bot_lock_goal ) - { - continue; - } - - if(!isDefined(level.radio)) - continue; - - if(!isDefined(level.radio.gameobject)) - continue; - - radio = level.radio; - gameobj = radio.gameobject; - origin = ( radio.origin[0], radio.origin[1], radio.origin[2]+5 ); - - //if neut or enemy - if(gameobj.ownerTeam != myTeam) - { - if(gameobj.interactTeam == "none")//wait for it to become active - { - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - //capture it - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - self thread bot_hq_go_cap(gameobj, radio); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if (event != "goal") - { - self.bot_lock_goal = false; - continue; - } - - if(!self isTouching(gameobj.trigger) || level.radio != radio) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - while(self isTouching(gameobj.trigger) && gameobj.ownerTeam != myTeam && level.radio == radio) - { - cur = gameobj.curProgress; - wait 0.5; - - if(cur == gameobj.curProgress) - break;//no prog made, enemy must be capping - } - - self ClearBotGoal(); - self.bot_lock_goal = false; - } - else//we own it - { - if(gameobj.objPoints[myteam].isFlashing)//underattack - { - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - self thread bot_hq_watch_flashing(gameobj, radio); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } - } -} - -/* - Waits until not touching the trigger and it is the current radio. -*/ -bot_hq_go_cap(obj, radio) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait randomintrange(2,4); - - if (!isDefined(obj)) - break; - - if (self isTouching(obj.trigger)) - break; - - if (level.radio != radio) - break; - } - - if(level.radio != radio) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Waits while the radio is under attack. -*/ -bot_hq_watch_flashing(obj, radio) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - myteam = self.team; - - for (;;) - { - wait 0.5; - - if (!isDefined(obj)) - break; - - if (!obj.objPoints[myteam].isFlashing) - break; - - if (level.radio != radio) - break; - } - - self notify("bad_path"); -} - -/* - Bots play sab -*/ -bot_sab() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( level.gametype != "sab" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if(!isDefined(level.sabBomb)) - continue; - - if(!isDefined(level.bombZones) || !level.bombZones.size) - continue; - - if (self IsPlanting() || self isDefusing()) - continue; - - bomb = level.sabBomb; - bombteam = bomb.ownerTeam; - carrier = bomb.carrier; - timeleft = maps\mp\gametypes\_globallogic_utils::getTimeRemaining()/1000; - - // the bomb is ours, we are on the offence - if(bombteam == myTeam) - { - site = level.bombZones[otherTeam]; - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+32 ); - - // protect our planted bomb - if(level.bombPlanted) - { - // kill defuser - if(site isInUse()) //somebody is defusing our bomb we planted - { - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - self.bot_lock_goal = false; - continue; - } - - //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - self.bot_lock_goal = false; - continue; - } - - // we are not the carrier - if(!self isBombCarrier()) - { - // lets escort the bomb carrier - if(self HasScriptGoal()) - continue; - - origin = carrier.origin; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - self thread bot_escort_obj(bomb, carrier); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - // we are the carrier of the bomb, lets check if we need to plant - timepassed = maps\mp\gametypes\_globallogic_utils::getTimePassed()/1000; - - if(timepassed < 120 && timeleft >= 90 && randomInt(100) < 98) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 1 ); - - self thread bot_go_plant(site); - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || level.bombPlanted || !self isTouching(site.trigger) || site IsInUse() || self inLastStand() || isDefined(self getThreat())) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - self bot_use_bomb_thread(site); - wait 1; - - self ClearBotGoal(); - self.bot_lock_goal = false; - } - else if(bombteam == otherTeam) // the bomb is theirs, we are on the defense - { - site = level.bombZones[myteam]; - - if(!isDefined(site.bots)) - site.bots = 0; - - // protect our site from planters - if(!level.bombPlanted) - { - //kill bomb carrier - if(site.bots > 2 || randomInt(100) < 45) - { - if(self HasScriptGoal()) - continue; - - if(carrier hasPerk( "specialty_gpsjammer" )) - continue; - - origin = carrier.origin; - - self SetBotGoal( origin, 64 ); - self thread bot_escort_obj(bomb, carrier); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - //protect bomb site - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+32 ); - - self thread bot_inc_bots(site); - - if(site isInUse())//somebody is planting - { - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - self thread bot_inc_bots(site); - - self thread bot_defend_site(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) - { - wait 4; - self notify("bot_inc_bots"); site.bots--; - continue; - } - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - self thread bot_inc_bots(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - self.bot_lock_goal = false; - continue; - } - - // bomb is planted we need to defuse - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+32 ); - - // someone else is defusing, lets just hang around - if(site.bots > 1) - { - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - self thread bot_go_defuse(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - // lets go defuse - self.bot_lock_goal = true; - - self SetBotGoal( origin, 1 ); - self thread bot_inc_bots(site); - self thread bot_go_defuse(site); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || !level.bombPlanted || site IsInUse() || !self isTouching(site.trigger) || self InLastStand() || isDefined(self getThreat())) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - self bot_use_bomb_thread(site); - wait 1; - self ClearBotGoal(); - - self.bot_lock_goal = false; - } - else // we need to go get the bomb! - { - origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2]+32 ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_get_obj(bomb); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - } -} - -/* - Bots play sd defenders -*/ -bot_sd_defenders() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( level.gametype != "sd" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - if(myTeam == game["attackers"]) - return; - - rand = randomInt(100); - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if (self IsPlanting() || self isDefusing()) - continue; - - // bomb not planted, lets protect our sites - if(!level.bombPlanted) - { - timeleft = maps\mp\gametypes\_globallogic_utils::getTimeRemaining()/1000; - - if(timeleft >= 90) - continue; - - // check for a bomb carrier, and camp the bomb - if(!level.multiBomb && isDefined(level.sdBomb)) - { - bomb = level.sdBomb; - carrier = level.sdBomb.carrier; - - if(!isDefined(carrier)) - { - origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2]+32 ); - - //hang around the bomb - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - - self thread bot_get_obj(bomb); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - } - - // pick a site to protect - if(!isDefined(level.bombZones) || !level.bombZones.size) - continue; - - sites = []; - for(i = 0; i < level.bombZones.size; i++) - { - sites[sites.size] = level.bombZones[i]; - } - - if(!sites.size) - continue; - - if (rand > 50) - site = self bot_array_nearest_curorigin(sites); - else - site = random(sites); - - if(!isDefined(site)) - continue; - - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+32 ); - - if(site isInUse())//somebody is planting - { - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - // bomb is planted, we need to defuse - if(!isDefined(level.defuseObject)) - continue; - - defuse = level.defuseObject; - - if(!isDefined(defuse.bots)) - defuse.bots = 0; - - origin = ( defuse.curorigin[0], defuse.curorigin[1], defuse.curorigin[2]+32 ); - - // someone is going to go defuse ,lets just hang around - if(defuse.bots > 1) - { - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - self thread bot_go_defuse(defuse); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - // lets defuse - self.bot_lock_goal = true; - self SetBotGoal( origin, 1 ); - self thread bot_inc_bots(defuse); - self thread bot_go_defuse(defuse); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || !level.bombPlanted || defuse isInUse() || !self isTouching(defuse.trigger) || self InLastStand() || isDefined(self getThreat())) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - self bot_use_bomb_thread(defuse); - wait 1; - self ClearBotGoal(); - self.bot_lock_goal = false; - } -} - -/* - Bots play sd attackers -*/ -bot_sd_attackers() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( level.gametype != "sd" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - if(myTeam != game["attackers"]) - return; - - rand = randomInt(100); - - first = true; - - for ( ;; ) - { - if(first) - first = false; - else - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - //bomb planted - if(level.bombPlanted) - { - if(!isDefined(level.defuseObject)) - continue; - - site = level.defuseObject; - - origin = ( site.curorigin[0], site.curorigin[1], site.curorigin[2]+32 ); - - if(site IsInUse())//somebody is defusing - { - self.bot_lock_goal = true; - - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - timeleft = maps\mp\gametypes\_globallogic_utils::getTimeRemaining()/1000; - timepassed = maps\mp\gametypes\_globallogic_utils::getTimePassed()/1000; - - //dont have a bomb - if(!self IsBombCarrier() && !level.multiBomb) - { - if(!isDefined(level.sdBomb)) - continue; - - bomb = level.sdBomb; - carrier = level.sdBomb.carrier; - - //bomb is picked up - if(isDefined(carrier)) - { - //escort the bomb carrier - if(self HasScriptGoal()) - continue; - - origin = carrier.origin; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - self thread bot_escort_obj(bomb, carrier); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - if(!isDefined(bomb.bots)) - bomb.bots = 0; - - origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2]+32 ); - - //hang around the bomb if other is going to go get it - if(bomb.bots > 1) - { - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - - self thread bot_get_obj(bomb); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - // go get the bomb - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - self thread bot_inc_bots(bomb); - self thread bot_get_obj(bomb); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - // check if to plant - if(timepassed < 120 && timeleft >= 90 && randomInt(100) < 98) - continue; - - if(!isDefined(level.bombZones) || !level.bombZones.size) - continue; - - sites = []; - for(i = 0; i < level.bombZones.size; i++) - { - sites[sites.size] = level.bombZones[i]; - } - - if(!sites.size) - continue; - - if(rand > 50) - plant = self bot_array_nearest_curorigin(sites); - else - plant = random(sites); - - if(!isDefined(plant)) - continue; - - origin = ( plant.curorigin[0]+50, plant.curorigin[1]+50, plant.curorigin[2]+32 ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 1 ); - self thread bot_go_plant(plant); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || level.bombPlanted || plant.visibleTeam == "none" || !self isTouching(plant.trigger) || self InLastStand() || isDefined(self getThreat()) || plant IsInUse()) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - self bot_use_bomb_thread(plant); - wait 1; - - self ClearBotGoal(); - self.bot_lock_goal = false; - } -} - -/* - Bots go plant the demo bomb -*/ -bot_dem_go_plant(plant) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if ((plant.label == "_b" && level.bombBPlanted) || (plant.label == "_a" && level.bombAPlanted)) - break; - - if (self isTouching(plant.trigger)) - break; - } - - if((plant.label == "_b" && level.bombBPlanted) || (plant.label == "_a" && level.bombAPlanted)) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Bots spawn kill dom attackers -*/ -bot_dem_attack_spawnkill() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - l1 = level.bombAPlanted; - l2 = level.bombBPlanted; - - for (;;) - { - wait 0.5; - - if (l1 != level.bombAPlanted || l2 != level.bombBPlanted) - break; - } - - self notify("bad_path"); -} - -/* - Bots play demo attackers -*/ -bot_dem_attackers() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( level.gametype != "dem" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - if(myTeam != game["attackers"]) - return; - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if(!isDefined(level.bombZones) || !level.bombZones.size) - continue; - - bombs = [];//sites with bombs - sites = [];//sites to bomb at - bombed = 0;//exploded sites - for ( i = 0; i < level.bombZones.size; i++ ) - { - bomb = level.bombZones[i]; - - if(isDefined(bomb.bombExploded) && bomb.bombExploded) - { - bombed++; - continue; - } - - if(bomb.label == "_a") - { - if(level.bombAPlanted) - bombs[bombs.size] = bomb; - else - sites[sites.size] = bomb; - - continue; - } - - if(bomb.label == "_b") - { - if(level.bombBPlanted) - bombs[bombs.size] = bomb; - else - sites[sites.size] = bomb; - - continue; - } - } - timeleft = maps\mp\gametypes\_globallogic_utils::getTimeRemaining()/1000; - - shouldLet = (game["teamScores"][myteam] > game["teamScores"][otherTeam] && timeleft < 90 && bombed == 1); - //spawnkill conditions - //if we have bombed one site or 1 bomb is planted with lots of time left, spawn kill - //if we want the other team to win for overtime and they do not need to defuse, spawn kill - if(((bombed + bombs.size == 1 && timeleft >= 90) || (shouldLet && !bombs.size)) && randomInt(100) < 95) - { - if(self HasScriptGoal()) - continue; - - spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dem_spawn_defender_start" ); - - if(!spawnPoints.size) - continue; - - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - if(DistanceSquared(spawnpoint.origin, self.origin) <= 2048*2048) - continue; - - self SetBotGoal( spawnpoint.origin, 1024 ); - - self thread bot_dem_attack_spawnkill(); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - //let defuse conditions - //if enemy is going to lose and lots of time left, let them defuse to play longer - //or if want to go into overtime near end of the extended game - if(((bombs.size + bombed == 2 && timeleft >= 90) || (shouldLet && bombs.size)) && randomInt(100) < 95) - { - spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dem_spawn_attacker_start" ); - - if(!spawnPoints.size) - continue; - - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - if(DistanceSquared(spawnpoint.origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( spawnpoint.origin, 512 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //defend bomb conditions - //if time is running out and we have a bomb planted - if(bombs.size && timeleft < 90 && (!sites.size || randomInt(100) < 95)) - { - site = self bot_array_nearest_curorigin(bombs); - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+32 ); - - if(site IsInUse())//somebody is defusing - { - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else go plant - if(!sites.size) - continue; - - plant = self bot_array_nearest_curorigin(sites); - - if(!isDefined(plant)) - continue; - - if(!isDefined(plant.bots)) - plant.bots = 0; - - origin = ( plant.curorigin[0]+50, plant.curorigin[1]+50, plant.curorigin[2]+32 ); - - //hang around the site if lots of time left - if(plant.bots > 1 && timeleft >= 60) - { - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - self thread bot_dem_go_plant(plant); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - self.bot_lock_goal = true; - - self SetBotGoal( origin, 1 ); - self thread bot_inc_bots(plant); - self thread bot_dem_go_plant(plant); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || (plant.label == "_b" && level.bombBPlanted) || (plant.label == "_a" && level.bombAPlanted) || plant IsInUse() || !self isTouching(plant.trigger) || self InLastStand() || isDefined(self getThreat())) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - self bot_use_bomb_thread(plant); - wait 1; - - self ClearBotGoal(); - - self.bot_lock_goal = false; - } -} - -/* - Bots play demo defenders -*/ -bot_dem_defenders() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( level.gametype != "dem" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - if(myTeam == game["attackers"]) - return; - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if(!isDefined(level.bombZones) || !level.bombZones.size) - continue; - - bombs = [];//sites with bombs - sites = [];//sites to bomb at - bombed = 0;//exploded sites - for ( i = 0; i < level.bombZones.size; i++ ) - { - bomb = level.bombZones[i]; - - if(isDefined(bomb.bombExploded) && bomb.bombExploded) - { - bombed++; - continue; - } - - if(bomb.label == "_a") - { - if(level.bombAPlanted) - bombs[bombs.size] = bomb; - else - sites[sites.size] = bomb; - - continue; - } - - if(bomb.label == "_b") - { - if(level.bombBPlanted) - bombs[bombs.size] = bomb; - else - sites[sites.size] = bomb; - - continue; - } - } - timeleft = maps\mp\gametypes\_globallogic_utils::getTimeRemaining()/1000; - - shouldLet = (timeleft < 60 && ((bombed == 0 && bombs.size != 2) || (game["teamScores"][myteam] > game["teamScores"][otherTeam] && bombed == 1)) && randomInt(100) < 98); - - //spawnkill conditions - //if nothing to defuse with a lot of time left, spawn kill - //or letting a bomb site to explode but a bomb is planted, so spawnkill - if((!bombs.size && timeleft >= 60 && randomInt(100) < 95) || (shouldLet && bombs.size == 1)) - { - if(self HasScriptGoal()) - continue; - - spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dem_spawn_attacker_start" ); - - if(!spawnPoints.size) - continue; - - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - if(DistanceSquared(spawnpoint.origin, self.origin) <= 2048*2048) - continue; - - self SetBotGoal( spawnpoint.origin, 1024 ); - - self thread bot_dem_defend_spawnkill(); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - //let blow up conditions - //let enemy blow up at least one to extend play time - //or if want to go into overtime after extended game - if(shouldLet) - { - spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dem_spawn_defender_start" ); - - if(!spawnPoints.size) - continue; - - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - if(DistanceSquared(spawnpoint.origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( spawnpoint.origin, 512 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //defend conditions - //if no bombs planted with little time left - if(!bombs.size && timeleft < 60 && randomInt(100) < 95 && sites.size) - { - site = self bot_array_nearest_curorigin(sites); - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+32 ); - - if(site IsInUse())//somebody is planting - { - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else hang around the site - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else go defuse - - if(!bombs.size) - continue; - - defuse = self bot_array_nearest_curorigin(bombs); - - if(!isDefined(defuse)) - continue; - - if(!isDefined(defuse.bots)) - defuse.bots = 0; - - origin = ( defuse.curorigin[0]+50, defuse.curorigin[1]+50, defuse.curorigin[2]+32 ); - - //hang around the site if not in danger of losing - if(defuse.bots > 1 && bombed + bombs.size != 2) - { - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - - self thread bot_dem_go_defuse(defuse); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - self.bot_lock_goal = true; - - self SetBotGoal( origin, 1 ); - self thread bot_inc_bots(defuse); - self thread bot_dem_go_defuse(defuse); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || (defuse.label == "_b" && !level.bombBPlanted) || (defuse.label == "_a" && !level.bombAPlanted) || defuse IsInUse() || !self isTouching(defuse.trigger) || self InLastStand() || isDefined(self getThreat())) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - self bot_use_bomb_thread(defuse); - wait 1; - - self ClearBotGoal(); - - self.bot_lock_goal = false; - } -} - -/* - Bots go defuse -*/ -bot_dem_go_defuse(defuse) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (self isTouching(defuse.trigger)) - break; - - if ((defuse.label == "_b" && !level.bombBPlanted) || (defuse.label == "_a" && !level.bombAPlanted)) - break; - } - - if((defuse.label == "_b" && !level.bombBPlanted) || (defuse.label == "_a" && !level.bombAPlanted)) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Bots go spawn kill -*/ -bot_dem_defend_spawnkill() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (level.bombBPlanted || level.bombAPlanted) - break; - } - - self notify("bad_path"); -} diff --git a/mods/mp_bots/maps/mp/bots/_bot_utility.gsc b/mods/mp_bots/maps/mp/bots/_bot_utility.gsc deleted file mode 100644 index be32501..0000000 --- a/mods/mp_bots/maps/mp/bots/_bot_utility.gsc +++ /dev/null @@ -1,539 +0,0 @@ -/* - _bot_utility - Author: INeedGames - Date: 12/20/2020 - The shared functions for bots -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; - -/* - Returns an array of all the bots in the game. -*/ -getBotArray() -{ - result = []; - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!player is_bot()) - continue; - - result[result.size] = player; - } - - return result; -} - -/* - Returns a good amount of players. -*/ -getGoodMapAmount() -{ - switch(getdvar("mapname")) - { - default: - return 2; - } -} - -/* - Rounds to the nearest whole number. -*/ -Round(x) -{ - y = int(x); - - if(abs(x) - abs(y) > 0.5) - { - if(x < 0) - return y - 1; - else - return y + 1; - } - else - return y; -} - -/* - Picks a random thing -*/ -PickRandom(arr) -{ - if (!arr.size) - return undefined; - - return arr[randomInt(arr.size)]; -} - -/* - If is defusing -*/ -isDefusing() -{ - return (isDefined(self.isDefusing) && self.isDefusing); -} - -/* - If is defusing -*/ -isPlanting() -{ - return (isDefined(self.isPlanting) && self.isPlanting); -} - -/* - If is defusing -*/ -inLastStand() -{ - return (isDefined(self.laststand) && self.laststand); -} - -/* - Is they the flag carrier men? -*/ -isFlagCarrier() -{ - return (isDefined(self.isFlagCarrier) && self.isFlagCarrier); -} - -/* - If the site is in use -*/ -isInUse() -{ - return (isDefined(self.inUse) && self.inUse); -} - -/* - If the player is carrying a bomb -*/ -isBombCarrier() -{ - return (isDefined(self.isBombCarrier) && self.isBombCarrier); -} - -/* - Gets the bot's difficulty number -*/ -GetBotDiffNum() -{ - num = 0; - - switch (getDvar("bot_difficulty")) - { - case "fu": - num = 3; - break; - case "hard": - num = 2; - break; - case "normal": - num = 1; - break; - case "easy": - default: - num = 0; - break; - } - - return num; -} - -/* - is the weapon alt mode? -*/ -isWeaponAltmode(weap) -{ - if (isStrStart(weap, "gl_") || isStrStart(weap, "ft_") || isStrStart(weap, "mk_")) - return true; - - return false; -} - -/* - Returns a valid grenade launcher weapon -*/ -getValidTube() -{ - weaps = self getweaponslist(); - - for (i = 0; i < weaps.size; i++) - { - weap = weaps[i]; - - if(!self getAmmoCount(weap)) - continue; - - if ((isSubStr(weap, "gl_") && !isSubStr(weap, "_gl_")) || weap == "china_lake_mp") - return weap; - } - - return undefined; -} - -/* - Taken from iw4 script -*/ -waittill_any_timeout( timeOut, string1, string2, string3, string4, string5 ) -{ - if ( ( !isdefined( string1 ) || string1 != "death" ) && - ( !isdefined( string2 ) || string2 != "death" ) && - ( !isdefined( string3 ) || string3 != "death" ) && - ( !isdefined( string4 ) || string4 != "death" ) && - ( !isdefined( string5 ) || string5 != "death" ) ) - self endon( "death" ); - - ent = spawnstruct(); - - if ( isdefined( string1 ) ) - self thread waittill_string( string1, ent ); - - if ( isdefined( string2 ) ) - self thread waittill_string( string2, ent ); - - if ( isdefined( string3 ) ) - self thread waittill_string( string3, ent ); - - if ( isdefined( string4 ) ) - self thread waittill_string( string4, ent ); - - if ( isdefined( string5 ) ) - self thread waittill_string( string5, ent ); - - ent thread _timeout( timeOut ); - - ent waittill( "returned", msg ); - ent notify( "die" ); - return msg; -} - -/* - Used for waittill_any_timeout -*/ -_timeout( delay ) -{ - self endon( "die" ); - - wait( delay ); - self notify( "returned", "timeout" ); -} - -/* - Waits for a host player -*/ -bot_wait_for_host() -{ - host = undefined; - - while (!isDefined(level) || !isDefined(level.players)) - wait 0.05; - - for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) - { - host = GetHostPlayer(); - - if(isDefined(host)) - break; - - wait 0.05; - } - - if(!isDefined(host)) - return; - - for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) - { - if(IsDefined( host.pers[ "team" ] )) - break; - - wait 0.05; - } - - if(!IsDefined( host.pers[ "team" ] )) - return; - - for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) - { - if(host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis") - break; - - wait 0.05; - } -} - -/* - Wrapper for setgoal -*/ -SetBotGoal(where, dist) -{ - self SetScriptGoal(where, dist); - waittillframeend; - self notify("new_goal"); -} - -/* - Weapper for cleargoal -*/ -ClearBotGoal() -{ - self ClearScriptGoal(); - waittillframeend; - self notify("new_goal"); -} - -/* - Freezes bot in place -*/ -botStopMove(what) -{ - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); - - self notify("botStopMove"); - self endon("botStopMove"); - - if (!what) - return; - - og = self.origin; - for (;;) - { - self setVelocity((0,0,0)); - self setOrigin(og); - wait 0.05; - } -} - -/* - Matches a num to a char -*/ -keyCodeToString(a) -{ - b=""; - switch(a) - { - case 0: b= "a"; break; - case 1: b= "b"; break; - case 2: b= "c"; break; - case 3: b= "d"; break; - case 4: b= "e"; break; - case 5: b= "f"; break; - case 6: b= "g"; break; - case 7: b= "h"; break; - case 8: b= "i"; break; - case 9: b= "j"; break; - case 10: b= "k"; break; - case 11: b= "l"; break; - case 12: b= "m"; break; - case 13: b= "n"; break; - case 14: b= "o"; break; - case 15: b= "p"; break; - case 16: b= "q"; break; - case 17: b= "r"; break; - case 18: b= "s"; break; - case 19: b= "t"; break; - case 20: b= "u"; break; - case 21: b= "v"; break; - case 22: b= "w"; break; - case 23: b= "x"; break; - case 24: b= "y"; break; - case 25: b= "z"; break; - case 26: b= "."; break; - case 27: b= " "; break; - } - return b; -} - -/* - Does the extra check when adding bots -*/ -doExtraCheck() -{ - maps\mp\bots\_bot_script::checkTheBots(); -} - -/* - Returns the cone dot (like fov, or distance from the center of our screen). -*/ -getConeDot(to, from, dir) -{ - dirToTarget = VectorNormalize(to-from); - forward = AnglesToForward(dir); - return vectordot(dirToTarget, forward); -} - -/* - Fixes sd bomb planting -*/ -bot_onUsePlantObjectFix( player ) -{ - // planted the bomb - if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) - { - level thread bot_bombPlanted( self, player ); - player logString( "bomb planted: " + self.label ); - - // disable all bomb zones except this one - for ( index = 0; index < level.bombZones.size; index++ ) - { - if ( level.bombZones[index] == self ) - continue; - - level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); - } - thread playSoundOnPlayers( "mus_sd_planted"+"_"+level.teamPostfix[player.pers["team"]] ); -// removed plant audio until finalization of assest TODO : new plant sounds when assests are online -// player playSound( "mpl_sd_bomb_plant" ); - player notify ( "bomb_planted" ); - - level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_PLANTED_BY", player ); - - if( isdefined(player.pers["plants"]) ) - { - player.pers["plants"]++; - player.plants = player.pers["plants"]; - } - - player maps\mp\_medals::saboteur(); - player maps\mp\gametypes\_persistence::statAddWithGameType( "PLANTS", 1 ); - - maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_planted" ); - - maps\mp\gametypes\_globallogic_score::givePlayerScore( "plant", player ); - //player thread [[level.onXPEvent]]( "plant" ); - } -} - -/* - Fixes sd bomb planting -*/ -bot_bombPlanted( destroyedObj, player ) -{ - maps\mp\gametypes\_globallogic_utils::pauseTimer(); - level.bombPlanted = true; - - destroyedObj.visuals[0] thread maps\mp\gametypes\_globallogic_utils::playTickingSound( "mpl_sab_ui_suitcasebomb_timer" ); - //Play suspense music - level thread maps\mp\gametypes\sd::bombPlantedMusicDelay(); - - //thread maps\mp\gametypes\_globallogic_audio::actionMusicSet(); - - level.tickingObject = destroyedObj.visuals[0]; - - level.timeLimitOverride = true; - setGameEndTime( int( gettime() + (level.bombTimer * 1000) ) ); - setMatchFlag( "bomb_timer", 1 ); - - if ( !level.multiBomb ) - { - level.sdBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" ); - level.sdBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - level.sdBomb maps\mp\gametypes\_gameobjects::setDropped(); - level.sdBombModel = level.sdBomb.visuals[0]; - } - else - { - - for ( index = 0; index < level.players.size; index++ ) - { - if ( isDefined( level.players[index].carryIcon ) ) - level.players[index].carryIcon destroyElem(); - } - - trace = bulletTrace( player.origin + (0,0,20), player.origin - (0,0,2000), false, player ); - - tempAngle = randomfloat( 360 ); - forward = (cos( tempAngle ), sin( tempAngle ), 0); - forward = vectornormalize( forward - vector_scale( trace["normal"], vectordot( forward, trace["normal"] ) ) ); - dropAngles = vectortoangles( forward ); - - level.sdBombModel = spawn( "script_model", trace["position"] ); - level.sdBombModel.angles = dropAngles; - level.sdBombModel setModel( "prop_suitcase_bomb" ); - } - destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" ); - destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - /* - destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", undefined ); - destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", undefined ); - destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", undefined ); - destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", undefined ); - */ - label = destroyedObj maps\mp\gametypes\_gameobjects::getLabel(); - - // create a new object to defuse with. - trigger = destroyedObj.bombDefuseTrig; - trigger.origin = level.sdBombModel.origin; - visuals = []; - defuseObject = maps\mp\gametypes\_gameobjects::createUseObject( game["defenders"], trigger, visuals, (0,0,32) ); - defuseObject maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); - defuseObject maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime ); - defuseObject maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" ); - defuseObject maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); - defuseObject maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defuse" + label ); - defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_defend" + label ); - defuseObject maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defuse" + label ); - defuseObject maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_defend" + label ); - defuseObject.label = label; - defuseObject.onBeginUse = maps\mp\gametypes\sd::onBeginUse; - defuseObject.onEndUse = maps\mp\gametypes\sd::onEndUse; - defuseObject.onUse = maps\mp\gametypes\sd::onUseDefuseObject; - defuseObject.useWeapon = "briefcase_bomb_defuse_mp"; - - level.defuseObject = defuseObject;//every cod... - - player.isBombCarrier = false; - - maps\mp\gametypes\sd::BombTimerWait(); - setMatchFlag( "bomb_timer", 0 ); - - destroyedObj.visuals[0] maps\mp\gametypes\_globallogic_utils::stopTickingSound(); - - if ( level.gameEnded || level.bombDefused ) - return; - - level.bombExploded = true; - - - - explosionOrigin = level.sdBombModel.origin+(0,0,12); - level.sdBombModel hide(); - - if ( isdefined( player ) ) - { - destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_BLOWUP_BY", player ); - player maps\mp\_medals::bomber(); - player maps\mp\gametypes\_persistence::statAddWithGameType( "DESTRUCTIONS", 1 ); - } - else - destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - - rot = randomfloat(360); - explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) ); - triggerFx( explosionEffect ); - - thread playSoundinSpace( "mpl_sd_exp_suitcase_bomb_main", explosionOrigin ); - //thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "SILENT", "both" ); - - if ( isDefined( destroyedObj.exploderIndex ) ) - exploder( destroyedObj.exploderIndex ); - - for ( index = 0; index < level.bombZones.size; index++ ) - level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); - defuseObject maps\mp\gametypes\_gameobjects::disableObject(); - - setGameEndTime( 0 ); - - wait 3; - - maps\mp\gametypes\sd::sd_endGame( game["attackers"], game["strings"]["target_destroyed"] ); -} diff --git a/mods/mp_bots/maps/mp/gametypes/_bot.gsc b/mods/mp_bots/maps/mp/gametypes/_bot.gsc deleted file mode 100644 index 8c2ff7e..0000000 --- a/mods/mp_bots/maps/mp/gametypes/_bot.gsc +++ /dev/null @@ -1,924 +0,0 @@ -/* - _bot - Author: INeedGames - Date: 12/20/2020 - The entry point and manager of the bots. -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include maps\mp\bots\_bot_utility; - -/* - Entry point to the bots -*/ -init() -{ - level.bw_VERSION = "1.1.1"; - - level.bot_offline = false; - - if(getDvar("bots_main") == "") - setDvar("bots_main", true); - - if (!getDvarInt("bots_main")) - return; - - if(getDvar("bots_main_waitForHostTime") == "") - setDvar("bots_main_waitForHostTime", 10.0);//how long to wait to wait for the host player - - if(getDvar("bots_manage_add") == "") - setDvar("bots_manage_add", 0);//amount of bots to add to the game - if(getDvar("bots_manage_fill") == "") - setDvar("bots_manage_fill", 0);//amount of bots to maintain - if(getDvar("bots_manage_fill_spec") == "") - setDvar("bots_manage_fill_spec", true);//to count for fill if player is on spec team - if(getDvar("bots_manage_fill_mode") == "") - setDvar("bots_manage_fill_mode", 0);//fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 - if(getDvar("bots_manage_fill_kick") == "") - setDvar("bots_manage_fill_kick", false);//kick bots if too many - - if(getDvar("bots_team") == "") - setDvar("bots_team", "autoassign");//which team for bots to join - if(getDvar("bots_team_amount") == "") - setDvar("bots_team_amount", 0);//amount of bots on axis team - if(getDvar("bots_team_force") == "") - setDvar("bots_team_force", false);//force bots on team - if(getDvar("bots_team_mode") == "") - setDvar("bots_team_mode", 0);//counts just bots when 1 - - if(getDvar("bots_loadout_reasonable") == "")//filter out the bad 'guns' and perks - setDvar("bots_loadout_reasonable", false); - if(getDvar("bots_loadout_allow_op") == "")//allows jug, marty and laststand - setDvar("bots_loadout_allow_op", true); - if(getDvar("bots_loadout_rank") == "")// what rank the bots should be around, -1 is around the players, 0 is all random - setDvar("bots_loadout_rank", -1); - if(getDvar("bots_loadout_codpoints") == "")// how much cod points a bot should have, -1 is around the players, 0 is all random - setDvar("bots_loadout_codpoints", -1); - if(getDvar("bots_loadout_prestige") == "")// what pretige the bots will be, -1 is the players, -2 is random - setDvar("bots_loadout_prestige", -1); - - if(getDvar("bots_play_target_other") == "")//bot target non play ents (vehicles) - setDvar("bots_play_target_other", true); - if(getDvar("bots_play_killstreak") == "")//bot use killstreaks - setDvar("bots_play_killstreak", true); - if(getDvar("bots_play_nade") == "")//bots grenade - setDvar("bots_play_nade", true); - if(getDvar("bots_play_knife") == "")//bots knife - setDvar("bots_play_knife", true); - if(getDvar("bots_play_fire") == "")//bots fire - setDvar("bots_play_fire", true); - if(getDvar("bots_play_move") == "")//bots move - setDvar("bots_play_move", true); - if(getDvar("bots_play_take_carepackages") == "")//bots take carepackages - setDvar("bots_play_take_carepackages", true); - if(getDvar("bots_play_obj") == "")//bots play the obj - setDvar("bots_play_obj", true); - if(getDvar("bots_play_camp") == "")//bots camp and follow - setDvar("bots_play_camp", true); - - level.bots = []; - level.bot_decoys = []; - level.bot_planes = []; - - if(!isDefined(game["botWarfare"])) - game["botWarfare"] = true; - - thread fixGamemodes(); - thread onPlayerConnect(); - thread bot_watch_planes(); - - thread handleBots(); - - thread doNonDediBots(); -} - -/* - Thread when any player connects. Starts the threads needed. -*/ -onPlayerConnect() -{ - for(;;) - { - level waittill("connected", player); - - player thread watch_shoot(); - player thread watch_grenade(); - player thread connected(); - } -} - -/* - Starts the threads for bots. -*/ -handleBots() -{ - thread diffBots(); - thread teamBots(); - addBots(); - - while(!level.intermission) - wait 0.05; - - setDvar("bots_manage_add", getBotArray().size); -} - -/* - When a bot disconnects. -*/ -onDisconnect() -{ - self waittill("disconnect"); - - level.bots = array_remove(level.bots, self); -} - -/* - Whena player connects -*/ -connected() -{ - self endon("disconnect"); - - if (!self is_bot()) - return; - - self thread maps\mp\bots\_bot_script::connected(); - - level.bots[level.bots.size] = self; - self thread onDisconnect(); - - level notify("bot_connected", self); -} - -/* - Handles the diff of the bots -*/ -diffBots() -{ - for (;;) - { - wait 1.5; - - bot_set_difficulty(GetDvar( #"bot_difficulty" )); - } -} - -/* - Setup bot dvars for non dedicated clients -*/ -doNonDediBots() -{ - if (!GetDvarInt( #"xblive_basictraining" )) - return; - - if (isDefined(game[ "bots_spawned" ])) - return; - - game[ "bots_spawned" ] = true; - - if(getDvar("bot_enemies_extra") == "") - setDvar("bot_enemies_extra", 0); - if(getDvar("bot_friends_extra") == "") - setDvar("bot_friends_extra", 0); - - bot_friends = GetDvarInt( #"bot_friends" ); - bot_enemies = GetDvarInt( #"bot_enemies" ); - - bot_enemies += GetDvarInt("bot_enemies_extra"); - bot_friends += GetDvarInt("bot_friends_extra"); - - bot_wait_for_host(); - host = GetHostPlayer(); - - team = "allies"; - if(isDefined(host) && isDefined(host.pers[ "team" ]) && (host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis")) - team = host.pers[ "team" ]; - - setDvar("bots_manage_add", bot_enemies + bot_friends - 1); - setDvar("bots_manage_fill", bot_enemies + bot_friends); - setDvar("bots_manage_fill_mode", 0); - setDvar("bots_manage_fill_kick", true); - setDvar("bots_manage_fill_spec", false); - - setDvar("bots_team", "custom"); - - if (team == "axis") - setDvar("bots_team_amount", bot_friends); - else - setDvar("bots_team_amount", bot_enemies); - - setDvar("bots_team_force", true); - setDvar("bots_team_mode", 0); -} - -/* - Sets the difficulty of the bots -*/ -bot_set_difficulty( difficulty ) -{ - if ( difficulty == "fu" ) - { - SetDvar( "sv_botMinDeathTime", "250" ); - SetDvar( "sv_botMaxDeathTime", "500" ); - SetDvar( "sv_botMinFireTime", "100" ); - SetDvar( "sv_botMaxFireTime", "300" ); - SetDvar( "sv_botYawSpeed", "14" ); - SetDvar( "sv_botYawSpeedAds", "14" ); - SetDvar( "sv_botPitchUp", "-5" ); - SetDvar( "sv_botPitchDown", "10" ); - SetDvar( "sv_botFov", "160" ); - SetDvar( "sv_botMinAdsTime", "3000" ); - SetDvar( "sv_botMaxAdsTime", "5000" ); - SetDvar( "sv_botMinCrouchTime", "100" ); - SetDvar( "sv_botMaxCrouchTime", "400" ); - SetDvar( "sv_botTargetLeadBias", "2" ); - SetDvar( "sv_botMinReactionTime", "30" ); - SetDvar( "sv_botMaxReactionTime", "100" ); - SetDvar( "sv_botStrafeChance", "1" ); - SetDvar( "sv_botMinStrafeTime", "3000" ); - SetDvar( "sv_botMaxStrafeTime", "6000" ); - SetDvar( "scr_help_dist", "512" ); - SetDvar( "sv_botAllowGrenades", "1" ); - SetDvar( "sv_botMinGrenadeTime", "1500" ); - SetDvar( "sv_botMaxGrenadeTime", "4000" ); - SetDvar( "sv_botSprintDistance", "512" ); - SetDvar( "sv_botMeleeDist", "80" ); - } - else if ( difficulty == "hard" ) - { - SetDvar( "sv_botMinDeathTime", "250" ); - SetDvar( "sv_botMaxDeathTime", "500" ); - SetDvar( "sv_botMinFireTime", "400" ); - SetDvar( "sv_botMaxFireTime", "600" ); - SetDvar( "sv_botYawSpeed", "8" ); - SetDvar( "sv_botYawSpeedAds", "10" ); - SetDvar( "sv_botPitchUp", "-5" ); - SetDvar( "sv_botPitchDown", "10" ); - SetDvar( "sv_botFov", "100" ); - SetDvar( "sv_botMinAdsTime", "3000" ); - SetDvar( "sv_botMaxAdsTime", "5000" ); - SetDvar( "sv_botMinCrouchTime", "100" ); - SetDvar( "sv_botMaxCrouchTime", "400" ); - SetDvar( "sv_botTargetLeadBias", "2" ); - SetDvar( "sv_botMinReactionTime", "400" ); - SetDvar( "sv_botMaxReactionTime", "700" ); - SetDvar( "sv_botStrafeChance", "0.9" ); - SetDvar( "sv_botMinStrafeTime", "3000" ); - SetDvar( "sv_botMaxStrafeTime", "6000" ); - SetDvar( "scr_help_dist", "384" ); - SetDvar( "sv_botAllowGrenades", "1" ); - SetDvar( "sv_botMinGrenadeTime", "1500" ); - SetDvar( "sv_botMaxGrenadeTime", "4000" ); - SetDvar( "sv_botSprintDistance", "512" ); - SetDvar( "sv_botMeleeDist", "80" ); - } - else if ( difficulty == "easy" ) - { - SetDvar( "sv_botMinDeathTime", "1000" ); - SetDvar( "sv_botMaxDeathTime", "2000" ); - SetDvar( "sv_botMinFireTime", "900" ); - SetDvar( "sv_botMaxFireTime", "1000" ); - SetDvar( "sv_botYawSpeed", "2" ); - SetDvar( "sv_botYawSpeedAds", "2.5" ); - SetDvar( "sv_botPitchUp", "-20" ); - SetDvar( "sv_botPitchDown", "40" ); - SetDvar( "sv_botFov", "50" ); - SetDvar( "sv_botMinAdsTime", "3000" ); - SetDvar( "sv_botMaxAdsTime", "5000" ); - SetDvar( "sv_botMinCrouchTime", "4000" ); - SetDvar( "sv_botMaxCrouchTime", "6000" ); - SetDvar( "sv_botTargetLeadBias", "8" ); - SetDvar( "sv_botMinReactionTime", "1200" ); - SetDvar( "sv_botMaxReactionTime", "1600" ); - SetDvar( "sv_botStrafeChance", "0.1" ); - SetDvar( "sv_botMinStrafeTime", "3000" ); - SetDvar( "sv_botMaxStrafeTime", "6000" ); - SetDvar( "scr_help_dist", "256" ); - SetDvar( "sv_botAllowGrenades", "0" ); - SetDvar( "sv_botSprintDistance", "1024" ); - SetDvar( "sv_botMeleeDist", "40" ); - } - else // 'normal' difficulty - { - SetDvar( "sv_botMinDeathTime", "500" ); - SetDvar( "sv_botMaxDeathTime", "1000" ); - SetDvar( "sv_botMinFireTime", "600" ); - SetDvar( "sv_botMaxFireTime", "800" ); - SetDvar( "sv_botYawSpeed", "4" ); - SetDvar( "sv_botYawSpeedAds", "5" ); - SetDvar( "sv_botPitchUp", "-10" ); - SetDvar( "sv_botPitchDown", "20" ); - SetDvar( "sv_botFov", "70" ); - SetDvar( "sv_botMinAdsTime", "3000" ); - SetDvar( "sv_botMaxAdsTime", "5000" ); - SetDvar( "sv_botMinCrouchTime", "2000" ); - SetDvar( "sv_botMaxCrouchTime", "4000" ); - SetDvar( "sv_botTargetLeadBias", "4" ); - SetDvar( "sv_botMinReactionTime", "800" ); - SetDvar( "sv_botMaxReactionTime", "1200" ); - SetDvar( "sv_botStrafeChance", "0.6" ); - SetDvar( "sv_botMinStrafeTime", "3000" ); - SetDvar( "sv_botMaxStrafeTime", "6000" ); - SetDvar( "scr_help_dist", "256" ); - SetDvar( "sv_botAllowGrenades", "1" ); - SetDvar( "sv_botMinGrenadeTime", "1500" ); - SetDvar( "sv_botMaxGrenadeTime", "4000" ); - SetDvar( "sv_botSprintDistance", "512" ); - SetDvar( "sv_botMeleeDist", "80" ); - difficulty = "normal"; - } - - if ( level.gameType == "oic" && difficulty == "fu" ) - { - SetDvar( "sv_botMinReactionTime", "400" ); - SetDvar( "sv_botMaxReactionTime", "500" ); - SetDvar( "sv_botMinAdsTime", "1000" ); - SetDvar( "sv_botMaxAdsTime", "2000" ); - } - - if ( level.gameType == "oic" && ( difficulty == "hard" || difficulty == "fu" ) ) - { - SetDvar( "sv_botSprintDistance", "256" ); - } - - if (!getDvarInt("bots_play_nade")) - SetDvar( "sv_botAllowGrenades", "0" ); - - SetDvar( "bot_difficulty", difficulty ); - SetDvar( "scr_bot_difficulty", difficulty ); - SetDvar( "splitscreen_botDifficulty", difficulty ); -} - -/* - A server thread for monitoring all bot's teams for custom server settings. -*/ -teamBots() -{ - for(;;) - { - wait 1.5; - teamAmount = getDvarInt("bots_team_amount"); - toTeam = getDvar("bots_team"); - - alliesbots = 0; - alliesplayers = 0; - axisbots = 0; - axisplayers = 0; - - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(player is_bot()) - { - if(player.pers["team"] == "allies") - alliesbots++; - else if(player.pers["team"] == "axis") - axisbots++; - } - else - { - if(player.pers["team"] == "allies") - alliesplayers++; - else if(player.pers["team"] == "axis") - axisplayers++; - } - } - - allies = alliesbots; - axis = axisbots; - - if(!getDvarInt("bots_team_mode")) - { - allies += alliesplayers; - axis += axisplayers; - } - - if(toTeam != "custom") - { - if(getDvarInt("bots_team_force")) - { - if(toTeam == "autoassign") - { - if(abs(axis - allies) > 1) - { - toTeam = "axis"; - if(axis > allies) - toTeam = "allies"; - } - } - - if(toTeam != "autoassign") - { - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(!player is_bot()) - continue; - - if(player.pers["team"] == toTeam) - continue; - - if (toTeam == "allies") - player thread [[level.allies]](); - else if (toTeam == "axis") - player thread [[level.axis]](); - else - player thread [[level.spectator]](); - break; - } - } - } - } - else - { - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(!player is_bot()) - continue; - - if(player.pers["team"] == "axis") - { - if(axis > teamAmount) - { - player thread [[level.allies]](); - break; - } - } - else - { - if(axis < teamAmount) - { - player thread [[level.axis]](); - break; - } - else if(player.pers["team"] != "allies") - { - player thread [[level.allies]](); - break; - } - } - } - } - } -} - -/* - A server thread for monitoring all bot's in game. Will add and kick bots according to server settings. - - Dedis only spawn bots when developer is not 0 - This makes the dedi unstable and can crash - - Patch the executable to skip the pregame and make it so bots can spawn - - pregame: - in the ShouldDoPregame sub: - B8 01 00 00 00: mov eax, 1 -change to: B8 00 00 00 00: mov eax, 0 - 0x4F6C77 in rektmp - 0x4598A7 in bg - - - spawnbots: - in the SV_AddTestClient sub: - 0F 85 A4 00 00 00: jnz -change to: 0F 84 A4 00 00 00: jz - 0x6B6180 in rektmp - 0x4682F0 in bg - - - allow changing g_antilag dvar: - set the byte from 0x40 to 0x00 - - 0x53B1B2 in rekt - 0x59B6F2 in bg -*/ -addBots() -{ - level endon ( "game_ended" ); - - bot_wait_for_host(); - - for (;;) - { - wait 1.5; - - botsToAdd = GetDvarInt("bots_manage_add"); - - if(botsToAdd > 0) - { - SetDvar("bots_manage_add", 0); - - if(botsToAdd > 64) - botsToAdd = 64; - - for(; botsToAdd > 0; botsToAdd--) - { - level add_bot(); - wait 0.25; - } - } - - fillMode = getDVarInt("bots_manage_fill_mode"); - - if(fillMode == 2 || fillMode == 3) - setDvar("bots_manage_fill", getGoodMapAmount()); - - fillAmount = getDvarInt("bots_manage_fill"); - - players = 0; - bots = 0; - spec = 0; - - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if (player isdemoclient()) - continue; - - if(player is_bot()) - bots++; - else if(!isDefined(player.pers["team"]) || (player.pers["team"] != "axis" && player.pers["team"] != "allies")) - spec++; - else - players++; - } - - if(fillMode == 4) - { - axisplayers = 0; - alliesplayers = 0; - - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(player is_bot()) - continue; - - if(!isDefined(player.pers["team"])) - continue; - - if(player.pers["team"] == "axis") - axisplayers++; - else if(player.pers["team"] == "allies") - alliesplayers++; - } - - result = fillAmount - abs(axisplayers - alliesplayers) + bots; - - if (players == 0) - { - if(bots < fillAmount) - result = fillAmount-1; - else if (bots > fillAmount) - result = fillAmount+1; - else - result = fillAmount; - } - - bots = result; - } - - if (!randomInt(999)) - { - setDvar("testclients_doreload", true); - wait 0.1; - setDvar("testclients_doreload", false); - doExtraCheck(); - } - - amount = bots; - if(fillMode == 0 || fillMode == 2) - amount += players; - if(getDVarInt("bots_manage_fill_spec")) - amount += spec; - - if(amount < fillAmount) - setDvar("bots_manage_add", 1); - else if(amount > fillAmount && getDvarInt("bots_manage_fill_kick")) - { - tempBot = PickRandom(getBotArray()); - if (isDefined(tempBot)) - kick( tempBot getEntityNumber(), "EXE_PLAYERKICKED" ); - } - } -} - -/* - Adds a bot to the game. -*/ -add_bot() -{ - bot = addtestclient(); - - if (isdefined(bot)) - { - bot.pers["isBot"] = true; - bot.equipment_enabled = true; - bot.pers[ "bot_perk" ] = true; - bot.pers["isBotWarfare"] = true; - bot thread maps\mp\bots\_bot_script::added(); - } -} - -/* - Gives the bot loadout -*/ -bot_give_loadout() -{ - self maps\mp\bots\_bot_loadout::bot_give_loadout(); -} - -/* - Fired when the bot is damaged -*/ -bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ) -{ - self maps\mp\bots\_bot_script::bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ); -} - -/* - Bot is idle -*/ -bot_is_idle() -{ - if ( !IsDefined( self ) ) - { - return false; - } - - if ( !IsAlive( self ) ) - { - return false; - } - - if ( !self is_bot() ) - { - return false; - } - - if ( self inLastStand() ) - { - return false; - } - - if ( self HasScriptGoal() ) - { - return false; - } - - if ( IsDefined( self GetThreat() ) ) - { - return false; - } - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - return false; - } - - if(self UseButtonPressed()) - return false; - - if(self isPlanting()) - return false; - - if(self isDefusing()) - return false; - - return true; -} - -/* - Watch all players grenades -*/ -watch_grenade() -{ - self endon("disconnect"); - - self.bot_scrambled = false; - for(;;) - { - self waittill("grenade_fire", g, name); - if(name == "scrambler_mp") - { - g thread watch_scrambler(); - } - else if(name == "nightingale_mp") - { - self thread watch_decoy(g); - } - } -} - -/* - Watch the decoy grenade -*/ -watch_decoy(g) -{ - g.team = self.team; - - level.bot_decoys[level.bot_decoys.size] = g; - - g waittill("death"); - - for ( entry = 0; entry < level.bot_decoys.size; entry++ ) - { - if ( level.bot_decoys[entry] == g ) - { - while ( entry < level.bot_decoys.size-1 ) - { - level.bot_decoys[entry] = level.bot_decoys[entry+1]; - entry++; - } - level.bot_decoys[entry] = undefined; - break; - } - } -} - -/* - Attach a trigger to the scrambler -*/ -watch_scrambler() -{ - trig = spawn( "trigger_radius", self.origin + (0, 0, -1000), 0, 1000, 2000 ); - - self scramble_nearby(trig); - - trig delete(); -} - -/* - Watch when players enter the scrambler trigger -*/ -scramble_nearby(trig) -{ - self endon("death"); - self endon("hacked"); - - while(!isDefined(self.owner) || !isDefined(self.owner.team)) - wait 0.05; - - self.team = self.owner.team; - for(;;) - { - trig waittill("trigger", player); - - if (!isDefined(player) || !isDefined(player.team)) - continue; - - if(self maps\mp\gametypes\_weaponobjects::isStunned()) - continue; - - if(isDefined(self.owner) && player == self.owner) - continue; - - if(level.teamBased && self.team == player.team) - continue; - - player thread scramble_player(); - } -} - -/* - Scramble this player -*/ -scramble_player() -{ - self notify("scramble_nearby"); - self endon("scramble_nearby"); - - self.bot_scrambled = true; - wait 0.1; - - if(isDefined(self)) - self.bot_scrambled = false; -} - -/* - Watch when a player shoots -*/ -watch_shoot() -{ - self endon("disconnect"); - - self.bot_firing = false; - for(;;) - { - self waittill( "weapon_fired" ); - self thread doFiringThread(); - } -} - -/* - When a player fires -*/ -doFiringThread() -{ - self endon("disconnect"); - self endon("weapon_fired"); - - self.bot_firing = true; - wait 1; - self.bot_firing = false; -} - -/* - Watches the planes -*/ -bot_watch_planes() -{ - for(;;) - { - level waittill("uav_update"); - - ents = GetEntArray("script_model", "classname"); - for(i = 0; i < ents.size; i++) - { - ent = ents[i]; - - if(isDefined(ent.bot_plane)) - continue; - - if(ent.model != level.spyplanemodel) - continue; - - thread watch_plane(ent); - } - } -} - -/* - Watches the plane -*/ -watch_plane(ent) -{ - ent.bot_plane = true; - - level.bot_planes[level.bot_planes.size] = ent; - - ent waittill_any("death", "delete", "leaving"); - - for ( entry = 0; entry < level.bot_planes.size; entry++ ) - { - if ( level.bot_planes[entry] == ent ) - { - while ( entry < level.bot_planes.size-1 ) - { - level.bot_planes[entry] = level.bot_planes[entry+1]; - entry++; - } - level.bot_planes[entry] = undefined; - break; - } - } -} - -/* - Fix xp in sd -*/ -bot_killBoost() -{ - return false; -} - -/* - Fixes sd -*/ -fixGamemodes() -{ - for(i=0;i<19;i++) - { - if(isDefined(level.bombZones) && level.gametype == "sd") - { - level.isKillBoosting = ::bot_killBoost; - for(i = 0; i < level.bombZones.size; i++) - level.bombZones[i].onUse = ::bot_onUsePlantObjectFix; - break; - } - - wait 0.05; - } -} diff --git a/mods/patch_mp/clientscripts/mp/_claymore.csc b/mods/patch_mp/clientscripts/mp/_claymore.csc deleted file mode 100644 index ced5712..0000000 --- a/mods/patch_mp/clientscripts/mp/_claymore.csc +++ /dev/null @@ -1,30 +0,0 @@ -#include clientscripts\mp\_utility; -#include clientscripts\mp\_rewindobjects; - -init( localClientNum ) -{ - level._effect["fx_claymore_laser"] = loadfx( "weapon/claymore/fx_claymore_laser" ); -} - -spawned( localClientNum ) -{ - self endon( "entityshutdown" ); - - self waittill_dobj(localClientNum); - - while( true ) - { - if( IsDefined( self.stunned ) && self.stunned ) - { - wait( 0.1 ); - continue; - } - - - self.claymoreLaserFXId = PlayFXOnTag( localClientNum, level._effect["fx_claymore_laser"], self, "tag_fx" ); - - self waittill( "stunned" ); - stopfx(localClientNum, self.claymoreLaserFXId); - - } -} diff --git a/mods/patch_mp/maps/mp/_dogs.gsc b/mods/patch_mp/maps/mp/_dogs.gsc deleted file mode 100644 index 53df591..0000000 --- a/mods/patch_mp/maps/mp/_dogs.gsc +++ /dev/null @@ -1,1957 +0,0 @@ -#include maps\mp\_utility; -#include common_scripts\utility; - -init() -{ - level.friendlyDogModel = "german_shepherd"; - level.enemyDogModel = "german_shepherd_black"; - - precacheModel(level.friendlyDogModel); - precacheModel(level.enemyDogModel); - precacheItem("dog_bite_mp"); - precacheShellshock("dog_bite"); - - level.maxDogsAttackingPerPlayer = 2; - level.spawnTimeWaitMin = 2; - level.spawnTimeWaitMax = 5; - - level.no_dogs = false; - - init_node_arrays(); - - if ( level.no_pathnodes ) - level.no_dogs = true; - - regenTime = 5; - level.dogHealth_RegularRegenDelay = regenTime * 1000; - level.dogHealthRegenDisabled = (level.dogHealth_RegularRegenDelay <= 0); - - dog_dvar_update(); - thread dog_dvar_updater(); - thread dog_usage_init(); - - thread init_all_preexisting_dogs(); - - /# - level thread devgui_dog_think(); - #/ - -// create_dogs(); -} - -initKillstreak() -{ - // register the dog hardpoint - if ( maps\mp\gametypes\_tweakables::getTweakableValue( "killstreak", "allowdogs" ) ) - { - maps\mp\gametypes\_hardpoints::registerKillstreak("dogs_mp", "dogs_mp", "killstreak_dogs","dogs_used", ::useKillstreakDogs, true); - maps\mp\gametypes\_hardpoints::registerKillstreakStrings("dogs_mp", &"KILLSTREAK_EARNED_DOGS", &"KILLSTREAK_DOGS_NOT_AVAILABLE", &"KILLSTREAK_DOGS_INBOUND" ); - maps\mp\gametypes\_hardpoints::registerKillstreakDialog("dogs_mp", "mpl_killstreak_dogs", "kls_dogs_used", "","kls_dogs_enemy", "", "kls_dogs_ready"); - maps\mp\gametypes\_hardpoints::registerKillstreakDevDvar("dogs_mp", "scr_givedogs"); - - maps\mp\gametypes\_hardpoints::registerKillstreakAltWeapon("dogs_mp", "dog_bite_mp" ); - } -} - -useKillstreakDogs(hardpointType) -{ - if ( self maps\mp\_killstreakrules::isKillstreakAllowed( hardpointType, self.team ) == false ) - return false; - - self notify( "called_in_the_dogs" ); - level notify( "called_in_the_dogs" ); - team = self.team; - otherTeam = level.otherTeam[team]; - - if ( level.teambased ) - { - thread maps\mp\gametypes\_battlechatter_mp::onKillstreakUsed( "dogs", otherTeam ); - //for ( i = 0; i < level.players.size; i++ ) - //{ - // player = level.players[i]; - // playerteam = player.team; - // if ( isdefined( playerteam ) ) - // { - // if ( playerteam == team ) - // { - // player iprintln( &"MP_DOGS_INBOUND", self.name ); - // player iprintln( "\n"); - // } - // } - //} - } - - self maps\mp\gametypes\_hardpoints::playKillstreakStartDialog( "dogs_mp", team, true); - self maps\mp\gametypes\_persistence::statAdd( "DOGS_USED", 1, false ); - level.globalKillstreaksCalled++; - self maps\mp\gametypes\_globallogic_score::incItemStatByReference( "killstreak_dogs", 1, "used" ); - - if ( maps\mp\gametypes\_tweakables::getTweakableValue( "team", "allowHardpointStreakAfterDeath" ) ) - { - ownerDeathCount = self.deathCount; - } - else - { - ownerDeathCount = self.pers["hardPointItemDeathCount" + hardpointType]; - } - if ( self maps\mp\_killstreakrules::killstreakStart("dogs_mp", self.team) == false ) - return false; - - self thread maps\mp\_dogs::dog_manager_spawn_dogs( team, otherTeam, ownerDeathCount ); - self thread playerDisconnectWatcher(); - - return true; -} - -playerDisconnectWatcher() -{ - level endon( "dogs done" ); - level endon( "dogs leaving" ); - - self waittill( "disconnect" ); - - level notify( "dogs leaving" ); -} - -pick_random_nodes( from, count ) -{ - to = []; - - if ( from.size < count ) - { - to = from; - } - else - { - for ( i = 0; i < count; i++ ) - { - to[i] = from[randomInt(from.size)]; - } - } - - return to; -} - -init_node_arrays() -{ - nodes = getallnodes(); - - pathnodes = []; - - for ( i = 0; i < nodes.size; i++ ) - { - // anything with a scriptworthy is automatically a non-patrol node - if ( isdefined(nodes[i].script_noteworthy) /* || nodes[i].script_noteworthy != "" */) - continue; - - if ( isdefined(nodes[i].targetname) && nodes[i].targetname == "traverse" ) - continue; - - pathnodes[pathnodes.size] = nodes[i]; - } - - if ( pathnodes.size == 0 ) - { - level.no_pathnodes = true; - } - else - { - level.no_pathnodes = false; - } - - level.patrolnodes = []; - - level.patrolnodes = pick_random_nodes( pathnodes, 200 ); - - level.dogspawnnodes = []; - level.dogspawnnodes = getnodearray( "spawn", "script_noteworthy"); - - if ( level.dogspawnnodes.size == 0 ) - { -/# - println("DOG PATHING: Could not find spawn nodes"); -#/ - // pick a random set of spawn nodes so we do not tax the spawn logic to much - level.dogspawnnodes = pick_random_nodes( pathnodes, 20 ); - } - - level.dogexitnodes = []; - level.dogexitnodes = getnodearray( "exit", "script_noteworthy"); - - if ( level.dogexitnodes.size == 0 ) - { -/# - println("DOG PATHING: Could not find exit nodes"); -#/ - // pick a random set of spawn nodes so we do not tax the spawn logic to much - level.dogexitnodes = pick_random_nodes( pathnodes, 20 ); - } -} - -dog_dvar_update() -{ - level.dog_time = dog_get_dvar_int("scr_dog_time", "60" ); - level.dog_health = dog_get_dvar_int("scr_dog_health", "100" ); - level.dog_count = dog_get_dvar_int("scr_dog_count", "8" ); - level.dog_count_max_at_once = dog_get_dvar_int("scr_dog_max_at_once", "4" ); - - if ( level.dog_count < level.dog_count_max_at_once ) - { - level.dog_count_max_at_once = level.dog_count; - } - - level.dog_debug = dog_get_dvar_int("debug_dogs", "0" ); - level.dog_debug_sound = dog_get_dvar_int("debug_dog_sound", "0" ); - level.dog_debug_anims = dog_get_dvar_int("debug_dog_anims", "0" ); - level.dog_debug_anims_ent = dog_get_dvar_int("debug_dog_anims_ent", "0" ); - level.dog_debug_turns = dog_get_dvar_int("debug_dog_turns", "0" ); - level.dog_debug_orient = dog_get_dvar_int("debug_dog_orient", "0" ); - level.dog_debug_usage = dog_get_dvar_int("debug_dog_usage", "1" ); -} - -dog_dvar_updater() -{ - dogs_in_the_bsp = count_preexisting_dogs(); - while(1) - { - dog_dvar_update(); - - // 16 is max allowed by engine - if ( level.dog_count + dogs_in_the_bsp > 16 ) - { - level.dog_count = 16 - dogs_in_the_bsp; - } - wait (1); - } -} - -count_preexisting_dogs() -{ - dogs = getentarray( "actor_enemy_dog_mp", "classname" ); - - alive_count = 0; - for ( i = 0; i < dogs.size; i ++ ) - { - if ( !isdefined(dogs[i]) ) - continue; - - if ( !isai(dogs[i]) ) - continue; - - alive_count++; - } - - return alive_count; -} - -init_all_preexisting_dogs() -{ - array_thread( getentarray( "actor_enemy_dog_mp", "classname" ), ::preexisting_init_dog ); -} - -preexisting_init_dog() -{ - self init_dog(); -} - -dog_set_model() -{ - self setModel(level.friendlyDogModel); - self setEnemyModel(level.enemyDogModel); -} - -init_dog() -{ - if ( !isai(self) ) - return; - - self.aiteam = "axis"; - - self.animTree = "dog.atr"; - self.type = "dog"; - self.accuracy = 0.2; - self.health = level.dog_health; - self.maxhealth = level.dog_health; // this currently does not hook to code maxhealth - self.aiweapon = "dog_bite_mp"; - self.secondaryweapon = ""; - self.sidearm = ""; - self.grenadeAmmo = 0; - self.goalradius = 128; - self.noDodgeMove = true; - self.ignoreSuppression = true; - self.suppressionThreshold = 1; - self.disableArrivals = false; - self.pathEnemyFightDist = 512; - self.halt_patrol = false; - - self.meleeAttackDist = 102; - - self dog_set_model(); - - self thread dogHealthRegen(); - - self thread selfDefenseChallenge(); -} - -get_spawn_node( team ) -{ - if ( !level.teambased ) - { - node = dog_pick_node_away_from_enemy( level.dogspawnnodes, team ); - } - else - { - node = dog_pick_node_near_team( level.dogspawnnodes, team ); - } - - bbPrint( "mpdogspawnused: x %f y %f z %f weight %f num_players %i num_dogs %i dist_all %f dist_allies %f dist_axis %f dist_dogs %f", node.origin, node.weight, node.numPlayersAtLastUpdate, node.numDogsAtLastUpdate, node.distSum["all"], node.distSum["allies"], node.distSum["axis"], node.distSum["dogs"] ); - - return node; -} - -dog_watch_for_owner_team_change(owner) -{ - self endon("death"); - owner endon("disconnect"); - - while(1) - { - owner waittill("joined_team"); - - if ( owner.team != self.aiteam ) - { - self clearentityowner(); - self notify("clear_owner"); - return; - } - } -} - -dog_set_owner( owner, team, requiredDeathCount ) -{ -/# - // no owner so he attacks the person who called him in - if ( level.dog_debug ) - return; -#/ - - if ( !isdefined( owner ) ) - return; - - // if the owner switches teams while dogs are still spawning - // do not set the owner - if ( level.teambased && isplayer(owner) && owner.team != team ) - return; - - self setentityowner(owner); - - self.requiredDeathCount = requiredDeathCount; - - self thread dog_watch_for_owner_team_change(owner); - - self endon("death"); - owner waittill("disconnect"); - - self clearentityowner(); -} - -dog_create_spawn_influencer() -{ - self maps\mp\gametypes\_spawning::create_dog_influencers(); -} - -dog_manager_spawn_dog( owner, team, spawn_node, index, requiredDeathCount ) -{ - dog = level.dog_spawner spawnactor(); - - dog forceteleport(spawn_node.origin, spawn_node.angles); - dog setgoalnode( spawn_node ); - dog.spawnnode = spawn_node; - dog show(); - - dog init_dog(); - dog dog_set_team(team); - dog dog_set_model(); - dog dog_create_spawn_influencer(); - dog thread dog_set_owner(owner, team, requiredDeathCount ); - - dog thread dog_usage(index); - dog thread dog_owner_kills(); - dog thread dog_clean_up(); - dog thread dog_notify_level_on_death(); - dog dog_thread_behavior_function(); - dog thread maps\mp\gametypes\_weapons::monitor_dog_special_grenades(); - - - return dog; -} - -get_debug_team( team ) -{ -/# - if ( level.teambased ) - { - otherteam = getotherteam(team); - if ( level.dog_debug ) - return otherteam; - } -#/ - - if ( !level.teambased ) - return "free"; - - return team; -} - -dog_manager_spawn_dogs( team, enemyTeam, deathCount ) -{ - // this can hit if the round ends as the dogs are getting called in - level endon("dogs done"); - level endon("dogs leaving"); - self endon("disconnect"); - - if ( level.no_dogs ) - return; - - team = get_debug_team(team); - - requiredDeathCount = deathCount; - - level.dog_spawner = getent("dog_spawner","targetname" ); - - if ( !isdefined( level.dog_spawner ) ) - return; - - level.dogs = []; - - /# - level.debug_spawn_nodes = []; - #/ - - level thread dog_manager_game_ended(); - level thread dog_manager_dog_alive_tracker( team ); - level thread dog_manager_dog_time_limit(); - level thread dog_usage_monitor(); - - for ( i = 0; i < level.dog_count_max_at_once; i++ ) - { - node = self get_spawn_node( team ); - - /# - level.debug_spawn_nodes[ level.debug_spawn_nodes.size ] = node; - #/ - - level.dogs[i] = dog_manager_spawn_dog( self, team, node, i, requiredDeathCount ); - - wait ( randomfloat( level.spawnTimeWaitMin, level.spawnTimeWaitMax ) ); - } - - level thread dog_manager_spawn_more_dogs_on_death( self, level.dog_count - level.dog_count_max_at_once, team ); -} - -dog_manager_spawn_more_dogs_on_death( owner, count, team ) -{ - level endon("dogs done"); - level endon("dogs leaving"); - - while( count > 0 ) - { - level waittill("dog died"); - - // wait a bit before sending in the next dog - wait ( randomfloat( level.spawnTimeWaitMin, level.spawnTimeWaitMax ) ); - - node = get_spawn_node( team ); - level.dogs[level.dogs.size] = dog_manager_spawn_dog( owner, team, node, level.dogs.size ); - count -= 1; - } - -/# - iprintln("All dogs spawned"); -#/ - level notify("all dogs spawned"); -} - -dog_manager_dog_time_limit() -{ - level endon("dogs done"); - level endon("dogs leaving"); - wait( level.dog_time ); - -/# - dog_debug_print( "time limit hit notify dogs leaving" ); -#/ - // this will shut this thread down - level notify("dogs leaving"); -} - -dog_cleanup_wait( wait_for, notify_name ) -{ - self endon( notify_name ); - self waittill( wait_for ); - self notify( notify_name, wait_for ); -} - -dog_cleanup_waiter() -{ - self thread dog_cleanup_wait( "all dogs spawned", "start_tracker"); - self thread dog_cleanup_wait( "dogs leaving", "start_tracker" ); - - self waittill( "start_tracker", wait_for ); -/# - self dog_debug_print("starting dog_manager_dog_alive_tracker reason " + wait_for ); -#/ -} - -dog_manager_dog_alive_tracker( team ) -{ - level dog_cleanup_waiter(); - - while (1) - { - alive_count = 0; - for ( i = 0; i < level.dogs.size; i ++ ) - { - if ( !isdefined(level.dogs[i]) ) - continue; - - if ( !isalive(level.dogs[i]) ) - continue; - - alive_count++; - } - - if ( alive_count == 0 ) - { - wait(1); - dog_manager_delete_dogs(); - level notify("dogs done"); - maps\mp\_killstreakrules::killstreakStop( "dogs_mp", team ); - return; - } - - wait (1); - } -} - -dog_manager_delete_dogs() -{ - for ( i = 0; i < level.dogs.size; i ++ ) - { - if ( !isdefined(level.dogs[i]) ) - continue; - - level.dogs[i] delete(); - } - - level.dogs = undefined; -} - -dog_manager_game_ended() -{ - level waittill("game_ended"); - make_all_dogs_leave(); -} - -make_all_dogs_leave() -{ -/# - dog_debug_print( "make_all_dogs_leave notify dogs leaving" ); -#/ - level notify("dogs leaving"); -} - -dog_set_team( team ) -{ - self.aiteam = team; -} - -dog_clean_up() -{ - self endon("death"); - self endon("leaving"); - level waittill("dogs leaving"); - - thread dog_leave(); -} - -dog_notify_level_on_death() -{ - self endon("leaving"); - self waittill("death"); - - // do not access self past this point as its not valid - - level notify("dog died"); -} - -dog_thread_behavior_function() -{ - self thread dog_patrol_when_no_enemy(); -// self thread dog_attack_when_enemy(); -} - -dog_leave() -{ - self notify("leaving"); - - self thread dog_leave_failsafe(); - - // have them run to an exit node - self clearentitytarget(); - self.ignoreall = true; - self.goalradius = 30; - self setgoalnode( self dog_get_exit_node() ); - - self waittill("goal"); - self delete(); -} - -dog_leave_failsafe() -{ - self endon("death"); - - start_origin = self.origin; - - wait(2); - - if ( distance( start_origin, self.origin ) < 10 ) - { -/# - println( "DOG DELETE FAILSAFE: Dog appears to be stuck at " + self.origin ); -#/ - self delete(); - return; - } - - wait(20); -/# - println( "DOG DELETE FAILSAFE: Dog has not gotten to it's delete point after 20 seconds. Currently at " + self.origin ); -#/ - self delete(); -} - - -dog_patrol_when_no_enemy() -{ - self endon("death"); - self endon("leaving"); - - while(1) - { - if ( !isdefined(self.enemy) ) - { - self dog_debug_print( "no enemy starting patrol" ); - self thread dog_patrol(); - } - - self waittill("enemy"); - } -} - -dog_patrol_wait( wait_for, notify_name ) -{ - self endon("attacking"); - dog_wait( wait_for, notify_name ); -} - -dog_wait( wait_for, notify_name ) -{ - self endon("death"); - self endon("leaving"); - self endon( notify_name ); - - self waittill( wait_for ); - self notify( notify_name, wait_for ); -} - -dog_patrol_path_waiter() -{ - self thread dog_patrol_wait( "bad_path", "next_patrol_point"); - self thread dog_patrol_wait( "goal", "next_patrol_point" ); - - self waittill( "next_patrol_point", wait_for ); -/# - self dog_debug_print("ending patrol wait recieved " + wait_for ); -#/ -} - -dog_patrol() -{ - self endon("death"); - self endon("enemy"); - self endon("leaving"); - self endon("attacking"); - self notify("on patrol"); - - self dog_patrol_debug(); - - node = level.patrolnodes[randomInt(level.patrolnodes.size)]; - - while(1) - { - if ( self.halt_patrol ) - { - self setgoalpos( self.origin ); - wait( 1 ); - continue; - } - - for( count = 0; count < 25; count++ ) - { - newnode = level.patrolnodes[randomInt(level.patrolnodes.size)]; - - if ( DistanceSquared( node.origin, newnode.origin ) > ( 1024 * 1024 ) ) - { - node = newnode; - break; - } - - node = newnode; - } - - // ignore all nodes with a script_noteworthy on them - if ( !isdefined( node.script_noteworthy ) ) - { -/# - self dog_debug_print("patroling to node at " + node.origin ); -#/ - self setgoalnode( node ); - self dog_patrol_path_waiter(); - } - } -} - -dog_wait_print( wait_for ) -{ -/# - self endon("kill dog_wait_prints"); - - self waittill( wait_for ); - self notify("kill dog_wait_prints"); - self dog_debug_print( "PATROL ENDING " + wait_for ); -#/ -} - -dog_patrol_debug() -{ - self thread dog_wait_print("death"); - self thread dog_wait_print("enemy"); - self thread dog_wait_print("leaving"); - self thread dog_wait_print("attacking"); -} - -dog_get_dvar_int( dvar, def ) -{ - return int( dog_get_dvar( dvar, def ) ); -} - -// dvar set/fetch/check -dog_get_dvar( dvar, def ) -{ - if ( getdvar( dvar ) != "" ) - return getdvarfloat( dvar ); - else - { - setdvar( dvar, def ); - return def; - } -} - -dog_usage_init() -{ - level.dog_usage = []; - - for ( index = 0; index < level.dog_count; index++ ) - { - level.dog_usage[index] = spawnStruct(); - level.dog_usage[index].spawn_time = 0; - level.dog_usage[index].death_time = 0; - level.dog_usage[index].kills = 0; - level.dog_usage[index].died = false; - } -} - -dog_usage_monitor() -{ - start_time = GetTime(); - - level waittill("dogs done"); - - index = 0; - total_kills = 0; - last_alive = 0; - all_dead = true; - alive_count = 0; - never_spawned_count = 0; - total_count = 0; - - for ( index = 0; index < level.dog_count; index++ ) - { - total_count++; - - if ( level.dog_usage[index].spawn_time == 0 ) - { - never_spawned_count++; - continue; - } - else if ( !level.dog_usage[index].died ) - { - alive_count++; - all_dead = false; - } - - seconds = (level.dog_usage[index].death_time - level.dog_usage[index].spawn_time) / 1000; - if ( seconds > last_alive ) - { - last_alive = seconds; - } - - total_kills += level.dog_usage[index].kills; - } - -/# - seconds = (GetTime() - start_time) / 1000; - msg = "Dogs- Time: " + seconds + " Kills: " + total_kills + " Last: " + last_alive; - - // make sure that the dogs have printed everything - wait (1); - iprintln( msg ); - println( msg ); - - level.debug_spawn_nodes = []; -#/ -} - -dog_usage(index) -{ - level.dog_usage[index].spawn_time = GetTime(); - level.dog_usage[index].death_time = 0; - level.dog_usage[index].kills = 0; - level.dog_usage[index].died = false; - - self thread dog_usage_kills(index); - self thread dog_usage_time_alive(index); -} - -dog_usage_kills(index) -{ - self endon("death"); - - while(1) - { - self waittill("killed", player); - level.dog_usage[index].kills++; - } -} - -dog_owner_kills(index) -{ - if ( !isdefined( self.script_owner ) ) - return; - - self endon("clear_owner"); - self endon("death"); - self.script_owner endon("disconnect"); - - while(1) - { - self waittill("killed", player); - - if ( IsDefined( self.script_owner ) ) - { - self.script_owner notify( "dog_handler" ); - } - } -} - -dog_usage_time_alive(index) -{ - self endon("leaving"); - - self waittill("death"); - level.dog_usage[index].death_time = GetTime(); - level.dog_usage[index].died = true; - - seconds = (level.dog_usage[index].death_time - level.dog_usage[index].spawn_time) / 1000 ; -/# - iprintln( "Dog#" + index + " killed. Alive for: "+ seconds + " seconds. Kills: " + level.dog_usage[index].kills ); - println( "Dog#" + index + " killed. Alive for: "+ seconds + " seconds. Kills: " + level.dog_usage[index].kills ); -#/ -} - - -dogHealthRegen() -{ - self endon("death"); - self endon("end_healthregen"); - - if ( self.health <= 0 ) - { - assert( !isalive( self ) ); - return; - } - - maxhealth = self.health; - oldhealth = maxhealth; - dog = self; - health_add = 0; - - regenRate = 0.1; // 0.017; - veryHurt = false; - - lastSoundTime_Recover = 0; - hurtTime = 0; - newHealth = 0; - - for (;;) - { - wait (0.05); - if (dog.health == maxhealth) - { - veryHurt = false; - continue; - } - - if (dog.health <= 0) - return; - - wasVeryHurt = veryHurt; - ratio = dog.health / maxHealth; - if (ratio <= 0.55) - { - veryHurt = true; - if (!wasVeryHurt) - { - hurtTime = gettime(); - } - } - - if (dog.health >= oldhealth) - { - if (gettime() - hurttime < level.dogHealth_RegularRegenDelay) - continue; - - if ( level.dogHealthRegenDisabled ) - continue; - - if (veryHurt) - { - newHealth = ratio; - if (gettime() > hurtTime + 3000) - newHealth += regenRate; - } - else - newHealth = 1; - - if ( newHealth >= 1.0 ) - { - newHealth = 1.0; - } - - if (newHealth <= 0) - { - // dog is dead - return; - } - - dog setnormalhealth (newHealth); - oldhealth = dog.health; - continue; - } - - oldhealth = dog.health; - - health_add = 0; - hurtTime = gettime(); - } -} - - -selfDefenseChallenge() -{ - self waittill ("death", attacker); - - if ( isdefined( attacker ) && isPlayer( attacker ) ) - { - if (isdefined ( self.script_owner ) && self.script_owner == attacker) - return; - if ( level.teambased && isdefined ( self.script_owner ) && self.script_owner.team == attacker.team ) - return; - - attacker notify ("selfdefense_dog"); - } - -} - -dog_get_exit_node() -{ - return getclosest( self.origin, level.dogexitnodes ); -} - -dog_debug_print( message ) -{ -/# - if ( level.dog_debug ) - { - if ( isai( self ) ) - { - println( " " + gettime() + " DOG " + self getentnum() + ": " + message ); - } - else - { - println( " " + gettime() + " DOGS: " + message ); - } - } -#/ -} - -// ================================================ - -getAllOtherPlayers() -{ - aliveplayers = []; - - // Make a list of fully connected, non-spectating, alive players - for(i = 0; i < level.players.size; i++) - { - if ( !isdefined( level.players[i] ) ) - continue; - player = level.players[i]; - - if ( player.sessionstate != "playing" || player == self ) - continue; - - aliveplayers[aliveplayers.size] = player; - } - return aliveplayers; -} - -dog_pick_node_near_team( nodes, team ) -{ - // There are no valid nodes in the map - if(!isdefined(nodes)) - return undefined; - - if ( !level.teambased ) - return dog_pick_node_away_from_enemy(level.dogspawnnodes, team); - - //prof_begin("basic_spawnlogic"); - - initWeights(nodes); - update_all_nodes( nodes, team ); - - //prof_begin(" getteams"); - obj = spawnstruct(); - getAllAlliedAndEnemyPlayers(obj, team); - //prof_end(" getteams"); - - numplayers = obj.allies.size + obj.enemies.size; - - alliedDistanceWeight = 2; - dogDistanceWeight = 3; - - //prof_begin(" sumdists"); - myTeam = team; - - enemyTeam = getOtherTeam( myTeam ); - for (i = 0; i < nodes.size; i++) - { - node = nodes[i]; - - node.weight = 0; - - if ( node.numPlayersAtLastUpdate > 0 ) - { - allyDistSum = node.distSum[ myTeam ]; - enemyDistSum = node.distSum[ enemyTeam ]; - - // high enemy distance is good, high ally distance is bad - node.weight = (enemyDistSum - alliedDistanceWeight*allyDistSum) / node.numPlayersAtLastUpdate; - } - - if ( node.numDogsAtLastUpdate > 0 ) - { - dogDistSum = node.distSum[ "dogs" ]; - - // high ally distance is bad - node.weight -= (dogDistSum*dogDistSum) / node.numDogsAtLastUpdate; - } - } - //prof_end(" sumdists"); - - //prof_end("basic_spawnlogic"); - - //prof_begin("complex_spawnlogic"); - - avoidSpawnReuse(nodes); - avoidEnemies(nodes, team, true); - - //prof_end("complex_spawnlogic"); - - result = dog_pick_node_final(nodes, team, obj.enemies); - - return result; -} - - -dog_pick_node_away_from_enemy(nodes, team) -{ - // There are no valid nodes in the map - if(!isdefined(nodes)) - return undefined; - - initWeights(nodes); - update_all_nodes( nodes, team ); - - aliveplayers = getAllOtherPlayers(); - - // new logic: we want most players near idealDist units away. - // players closer than badDist units will be considered negatively - idealDist = 1600; - badDist = 1200; - - if (aliveplayers.size > 0) - { - for (i = 0; i < nodes.size; i++) - { - totalDistFromIdeal = 0; - nearbyBadAmount = 0; - for (j = 0; j < aliveplayers.size; j++) - { - dist = distance(nodes[i].origin, aliveplayers[j].origin); - - if (dist < badDist) - nearbyBadAmount += (badDist - dist) / badDist; - - distfromideal = abs(dist - idealDist); - totalDistFromIdeal += distfromideal; - } - avgDistFromIdeal = totalDistFromIdeal / aliveplayers.size; - - wellDistancedAmount = (idealDist - avgDistFromIdeal) / idealDist; - - // wellDistancedAmount is between -inf and 1, 1 being best (likely around 0 to 1) - // nearbyBadAmount is between 0 and inf, - // and it is very important that we get a bad weight if we have a high nearbyBadAmount. - - nodes[i].weight = wellDistancedAmount - nearbyBadAmount * 2 + randomfloat(.2); - } - } - - avoidSpawnReuse(nodes); - avoidEnemies(nodes, team, true); - - return dog_pick_node_final(nodes, team, aliveplayers); -} - -dog_pick_node_random( nodes, team ) -{ - // There are no valid nodes in the map - if(!isdefined(nodes)) - return undefined; - - // randomize order - for(i = 0; i < nodes.size; i++) - { - j = randomInt(nodes.size); - node = nodes[i]; - nodes[i] = nodes[j]; - nodes[j] = node; - } - - return dog_pick_node_final(nodes, team, undefined, false); -} - -// selects a node, preferring ones with heigher weights (or toward the beginning of the array if no weights). -// also does final things like setting self.lastnode to the one chosen. -// this takes care of avoiding telefragging, so it doesn't have to be considered by any other function. -dog_pick_node_final( nodes, team, enemies, useweights ) -{ - //prof_begin( "dog_pick_node_final" ); - - bestnode = undefined; - - if ( !isdefined( nodes ) || nodes.size == 0 ) - return undefined; - - if ( !isdefined( useweights ) ) - useweights = true; - - if ( useweights ) - { - // choose node with best weight - // (if a tie, choose randomly from the best) - bestnode = getBestWeightedNode( nodes, team, enemies ); - } - else - { - // (only place we actually get here from is dog_pick_node_random() ) - // no weights. prefer nodes toward beginning of array - for ( i = 0; i < nodes.size; i++ ) - { - if ( positionWouldTelefrag( nodes[i].origin ) ) - continue; - - bestnode = nodes[i]; - break; - } - } - - if ( !isdefined( bestnode ) ) - { - // couldn't find a useable node! all will telefrag. - if ( useweights ) - { - // at this point, forget about weights. just take a random one. - bestnode = nodes[randomint(nodes.size)]; - } - else - { - bestnode = nodes[0]; - } - } - - self finalizeNodeChoice( bestnode ); - - //prof_end( "dog_pick_node_final" ); - - return bestnode; -} - -getBestWeightedNode( nodes, team, enemies ) -{ - maxSightTracedNodes = 3; - for ( try = 0; try <= maxSightTracedNodes; try++ ) - { - bestnodes = []; - bestweight = undefined; - bestnode = undefined; - for ( i = 0; i < nodes.size; i++ ) - { - if ( !isdefined( bestweight ) || nodes[i].weight > bestweight ) - { - if ( positionWouldTelefrag( nodes[i].origin ) ) - continue; - - bestnodes = []; - bestnodes[0] = nodes[i]; - bestweight = nodes[i].weight; - } - else if ( nodes[i].weight == bestweight ) - { - if ( positionWouldTelefrag( nodes[i].origin ) ) - continue; - - bestnodes[bestnodes.size] = nodes[i]; - } - } - if ( bestnodes.size == 0 ) - return undefined; - - // pick randomly from the available nodes with the best weight - bestnode = bestnodes[randomint( bestnodes.size )]; - - if ( try == maxSightTracedNodes ) - return bestnode; - - if ( isdefined( bestnode.lastSightTraceTime ) && bestnode.lastSightTraceTime == gettime() ) - return bestnode; - - if ( !lastMinuteSightTraces( bestnode, team, enemies ) ) - return bestnode; - - penalty = getLosPenalty(); - bestnode.weight -= penalty; - - bestnode.lastSightTraceTime = gettime(); - } -} - -finalizeNodeChoice( node ) -{ - time = getTime(); - - self.lastnode = node; - self.lastspawntime = time; - node.lastspawneddog = self; - node.lastspawntime = time; -} - -getLosPenalty() -{ - return 100000; -} - -lastMinuteSightTraces( node, dog_team, enemies ) -{ - //prof_begin("lastMinuteSightTraces"); - - team = "all"; - if ( level.teambased ) - team = getOtherTeam( dog_team ); - - if ( !isdefined( enemies ) ) - return false; - - closest = undefined; - closestDistsq = undefined; - secondClosest = undefined; - secondClosestDistsq = undefined; - - for ( i = 0; i < enemies.size; i++ ) - { - player = node.nearbyPlayers[team][i]; - - if ( !isdefined( player ) ) - continue; - if ( player.sessionstate != "playing" ) - continue; - if ( player == self ) - continue; - - distsq = distanceSquared( node.origin, player.origin ); - if ( !isdefined( closest ) || distsq < closestDistsq ) - { - secondClosest = closest; - secondClosestDistsq = closestDistsq; - - closest = player; - closestDistSq = distsq; - } - else if ( !isdefined( secondClosest ) || distsq < secondClosestDistSq ) - { - secondClosest = player; - secondClosestDistSq = distsq; - } - } - - if ( isdefined( closest ) ) - { - if ( bullettracepassed( closest.origin + (0,0,50), node.origin + (0,0,50), false, undefined) ) - return true; - } - if ( isdefined( secondClosest ) ) - { - if ( bullettracepassed( secondClosest.origin + (0,0,50), node.origin + (0,0,50), false, undefined) ) - return true; - } - - return false; -} - -update_all_nodes( nodes, team ) -{ - for ( i = 0; i < nodes.size; i++ ) - { - nodeUpdate( nodes[i], team ); - } -} - -avoidEnemies(nodes, team,teambased) -{ - lospenalty = getLosPenalty(); - - otherteam = "axis"; - if ( team == "axis" ) - otherteam = "allies"; - - minDistTeam = otherteam; - - if ( !teambased ) - { - minDistTeam = "all"; - } - - avoidWeight = GetDvarFloat( #"scr_spawn_enemyavoidweight"); - if ( avoidWeight != 0 ) - { - nearbyEnemyOuterRange = GetDvarFloat( #"scr_spawn_enemyavoiddist"); - nearbyEnemyOuterRangeSq = nearbyEnemyOuterRange * nearbyEnemyOuterRange; - nearbyEnemyPenalty = 1500 * avoidWeight; // typical base weights tend to peak around 1500 or so. this is large enough to upset that while only locally dominating it. - nearbyEnemyMinorPenalty = 800 * avoidWeight; // additional negative weight for distances up to 2 * nearbyEnemyOuterRange - - lastAttackerOrigin = (-99999,-99999,-99999); - lastDeathPos = (-99999,-99999,-99999); - - for ( i = 0; i < nodes.size; i++ ) - { - // penalty for nearby enemies - mindist = nodes[i].minDist[minDistTeam]; - if ( mindist < nearbyEnemyOuterRange*2 ) - { - penalty = nearbyEnemyMinorPenalty * (1 - mindist / (nearbyEnemyOuterRange*2)); - if ( mindist < nearbyEnemyOuterRange ) - penalty += nearbyEnemyPenalty * (1 - mindist / nearbyEnemyOuterRange); - if ( penalty > 0 ) - { - nodes[i].weight -= penalty; - } - } - } - } - - // DEBUG - //prof_end(" spawn_sc"); -} - -nodeUpdate( node, team ) -{ - if ( level.teambased ) - { - node.sights["axis"] = 0; - node.sights["allies"] = 0; - - node.nearbyPlayers["axis"] = []; - node.nearbyPlayers["allies"] = []; - } - else - { - node.sights = 0; - - node.nearbyPlayers["all"] = []; - } - - node.nearbyDogs = []; - - nodedir = node.forward; - - debug = false; - - node.distSum["all"] = 0; - node.distSum["allies"] = 0; - node.distSum["axis"] = 0; - node.distSum["dogs"] = 0; - - node.minDist["all"] = 9999999; - node.minDist["allies"] = 9999999; - node.minDist["axis"] = 9999999; - node.minDist["dogs"] = 9999999; - - node.numPlayersAtLastUpdate = 0; - node.numDogsAtLastUpdate = 0; - - for (i = 0; i < level.players.size; i++) - { - player = level.players[i]; - - if ( player.sessionstate != "playing" ) - continue; - - diff = player.origin - node.origin; - diff = (diff[0], diff[1], 0); - dist = length( diff ); // needs to be actual distance for distSum value - - player_team = "all"; - if ( level.teambased ) - player_team = player.team; - - if ( dist < 1024 ) - { - node.nearbyPlayers[player_team][node.nearbyPlayers[player_team].size] = player; - } - - if ( dist < node.minDist[player_team] ) - node.minDist[player_team] = dist; - - node.distSum[ player_team ] += dist; - node.numPlayersAtLastUpdate++; - } - - for (i = 0; i < level.dogs.size; i++) - { - dog = level.dogs[i]; - - if ( !isdefined(dog) || !isalive(dog) ) - continue; - - diff = dog.origin - node.origin; - diff = (diff[0], diff[1], 0); - dist = length( diff ); // needs to be actual distance for distSum value - - if ( dist < 1024 ) - { - node.nearbyDogs[node.nearbyDogs.size] = dog; - } - - if ( dist < node.minDist["dogs"] ) - node.minDist["dogs"] = dist; - - node.distSum[ "dogs" ] += dist; - node.numDogsAtLastUpdate++; - } -} - -initWeights(nodes) -{ - for (i = 0; i < nodes.size; i++) - nodes[i].weight = 0; -} - -getAllAlliedAndEnemyPlayers( obj, team ) -{ - if ( level.teambased ) - { - if ( team == "allies" ) - { - obj.allies = level.alivePlayers["allies"]; - obj.enemies = level.alivePlayers["axis"]; - } - else - { - assert( team == "axis" ); - obj.allies = level.alivePlayers["axis"]; - obj.enemies = level.alivePlayers["allies"]; - } - } - else - { - obj.allies = []; - obj.enemies = level.activePlayers; - } -} - -avoidSpawnReuse(nodes) -{ - time = getTime(); - - maxtime = 3*1000; - maxdistSq = 1024 * 1024; - - for (i = 0; i < nodes.size; i++) - { - node = nodes[i]; - - if (!isdefined(node.lastspawntime)) - continue; - - timepassed = time - node.lastspawntime; - if (timepassed < maxtime) - { - worsen = 1000 * (1 - timepassed/maxtime); - node.weight -= worsen; - } - } -} - -flash_dogs( area ) -{ - self endon("disconnect"); - - if ( isdefined(level.dogs) ) - { - for (i = 0; i < level.dogs.size; i++) - { - dog = level.dogs[i]; - - if ( !isalive(dog) ) - continue; - if ( dog istouching(area) ) - { - do_flash = true; - if ( isPlayer( self ) ) - { - if ( level.teamBased && (dog.aiteam == self.team) ) - { - do_flash = false; - } - else if ( !level.teambased && isdefined(dog.script_owner) && self == dog.script_owner ) - { - do_flash = false; - } - } - - if ( isdefined( dog.lastFlashed ) && dog.lastFlashed + 1500 > gettime() ) - { - do_flash = false; - } - - if ( do_flash ) - { - dog setFlashBanged( true, 500 ); - dog.lastFlashed = gettime(); - } - } - } - } -} - -/# - -devgui_dog_think() -{ - SetDvar( "devgui_dog", "" ); - - level.debug_spawn_nodes = []; - - for( ;; ) - { - cmd = GetDvar( #"devgui_dog" ); - - switch( cmd ) - { - case "spawn_friendly": - player = getHostPlayer(); - devgui_dog_spawn( player.team ); - break; - - case "spawn_enemy": - player = getHostPlayer(); - devgui_dog_spawn( getOtherTeam( player.team ) ); - break; - - case "delete_dogs": - devgui_dog_delete(); - break; - - case "dog_camera": - devgui_dog_camera(); - break; - - case "spawn_crate": - devgui_crate_spawn(); - break; - - case "delete_crates": - devgui_crate_delete(); - break; - - case "show_spawns": - devgui_spawn_show(); - break; - - case "show_exits": - devgui_exit_show(); - break; - - case "debug_spawn": - level thread devgui_debug_spawn(); - break; - } - - if ( cmd != "" ) - { - SetDvar( "devgui_dog", "" ); - } - - wait( 0.5 ); - } -} - -devgui_dog_spawn( team ) -{ - player = getHostPlayer(); - - dog_spawner = GetEnt( "dog_spawner", "targetname" ); - - if( !IsDefined( dog_spawner ) ) - { - iprintln( "No dog spawners found in map" ); - } - else - { - iprintln( "Spawning dog at your crosshair position" ); - } - - // Trace to where the player is looking - direction = player GetPlayerAngles(); - direction_vec = AnglesToForward( direction ); - eye = player GetEye(); - - scale = 8000; - direction_vec = ( direction_vec[0] * scale, direction_vec[1] * scale, direction_vec[2] * scale ); - trace = bullettrace( eye, eye + direction_vec, 0, undefined ); - - dog = dog_spawner spawnactor(); - - direction_vec = player.origin - trace["position"]; - direction = VectorToAngles( direction_vec ); - - dog forceteleport( trace["position"], direction ); - //dog setgoalnode( spawn_node ); - //dog.spawnnode = spawn_node; - dog show(); - - dog init_dog(); - dog dog_set_team( team ); - dog dog_set_model(); - //dog dog_create_spawn_influencer(); - dog thread dog_set_owner( player, team, 5 ); - - dog thread dog_usage( 0 ); - dog thread dog_owner_kills(); - dog thread dog_clean_up(); - dog thread dog_notify_level_on_death(); - dog dog_thread_behavior_function(); - dog thread maps\mp\gametypes\_weapons::monitor_dog_special_grenades(); - - if ( !IsDefined( level.dogs ) ) - { - level.dogs = []; - } - - level.dogs[ level.dogs.size ] = dog; -} - -devgui_dog_delete() -{ - player = getHostPlayer(); - player CameraActivate( false ); - - if ( !IsDefined( level.dogs ) ) - { - return; - } - - for ( i = 0; i < level.dogs.size; i++ ) - { - dog = level.dogs[i]; - - if ( IsDefined( dog.cam ) ) - { - dog.cam delete(); - } - } - - dog_manager_delete_dogs(); -} - -devgui_dog_camera() -{ - player = getHostPlayer(); - - if ( !IsDefined( level.devgui_dog_camera ) ) - { - level.devgui_dog_camera = 0; - } - - if ( !IsDefined( level.dogs ) ) - { - level.devgui_dog_camera = undefined; - player CameraActivate( false ); - return; - } - - dog = undefined; - - for ( i = 0; i < level.dogs.size; i++ ) - { - dog = level.dogs[i]; - - if ( !IsDefined( dog ) || !IsAlive( dog ) ) - { - dog = undefined; - continue; - } - - if ( !IsDefined( dog.cam ) ) - { - forward = AnglesToForward( dog.angles ); - dog.cam = Spawn( "script_model", dog.origin + ( 0, 0, 50 ) + forward * -100 ); - dog.cam SetModel( "tag_origin" ); - dog.cam LinkTo( dog ); - } - - if ( dog GetEntityNumber() <= level.devgui_dog_camera ) - { - dog = undefined; - continue; - } - - break; - } - - if ( IsDefined( dog ) ) - { - level.devgui_dog_camera = dog GetEntityNumber(); - - player CameraSetPosition( dog.cam ); - player CameraSetLookAt( dog ); - player CameraActivate( true ); - } - else - { - level.devgui_dog_camera = undefined; - player CameraActivate( false ); - } -} - -devgui_crate_spawn() -{ - player = getHostPlayer(); - - // Trace to where the player is looking - direction = player GetPlayerAngles(); - direction_vec = AnglesToForward( direction ); - eye = player GetEye(); - - scale = 8000; - direction_vec = ( direction_vec[0] * scale, direction_vec[1] * scale, direction_vec[2] * scale ); - trace = bullettrace( eye, eye + direction_vec, 0, undefined ); - - //trace[ "position" ] = player.origin + ( 0, 0, 4096 ); - - killCamEnt = spawn( "script_model", player.origin ); - level thread maps\mp\gametypes\_supplydrop::dropCrate( trace[ "position" ] + ( 0, 0, 25 ), direction, "supplydrop_mp", player, player.team, killcamEnt ); -} - -devgui_crate_delete() -{ - if ( !IsDefined( level.devgui_crates ) ) - { - return; - } - - for ( i = 0; i < level.devgui_crates.size; i++ ) - { - level.devgui_crates[i] delete(); - } - - level.devgui_crates = []; -} - -devgui_spawn_show() -{ - if ( !IsDefined( level.dog_spawn_show ) ) - { - level.dog_spawn_show = true; - } - else - { - level.dog_spawn_show = !level.dog_spawn_show; - } - - if ( !level.dog_spawn_show ) - { - level notify( "hide_dog_spawns" ); - return; - } - - color = ( 0, 1, 0 ); - - for ( i = 0; i < level.dogspawnnodes.size; i++ ) - { - maps\mp\gametypes\_dev::showOneSpawnPoint( level.dogspawnnodes[i], color, "hide_dog_spawns", 32, "dog_spawn" ); - } -} - -devgui_exit_show() -{ - if ( !IsDefined( level.dog_exit_show ) ) - { - level.dog_exit_show = true; - } - else - { - level.dog_exit_show = !level.dog_exit_show; - } - - if ( !level.dog_exit_show ) - { - level notify( "hide_dog_exits" ); - return; - } - - color = ( 1, 0, 0 ); - - for ( i = 0; i < level.dogexitnodes.size; i++ ) - { - maps\mp\gametypes\_dev::showOneSpawnPoint( level.dogexitnodes[i], color, "hide_dog_exits", 32, "dog_exit" ); - } -} - -devgui_debug_spawn() -{ - level endon( "devgui_debug_spawn" ); - - if ( !IsDefined( level.devgui_debug_spawn ) ) - { - level.devgui_debug_spawn = true; - } - else - { - level.devgui_debug_spawn = undefined; - level notify( "debug_spawn_refresh" ); - level notify( "devgui_debug_spawn" ); - } - - yellow = ( 1, 1, 0 ); - green = ( 0, 1, 0 ); - - for ( ;; ) - { - for ( i = 0; i < level.dogspawnnodes.size; i++ ) - { - - text = []; - text["weight"] = "n/a"; - text["num_players"] = "n/a"; - text["num_dogs"] = "n/a"; - - text["dist_all"] = "n/a"; - text["dist_allies"] = "n/a"; - text["dist_axis"] = "n/a"; - text["dist_dogs"] = "n/a"; - - node = level.dogspawnnodes[i]; - color = yellow; - - if ( IsDefined( node.weight ) ) - text["weight"] = node.weight; - - if ( IsDefined( node.numPlayersAtLastUpdate ) ) - text["num_players"] = node.numPlayersAtLastUpdate; - - if ( IsDefined( node.numDogsAtLastUpdate ) ) - text["num_dogs"] = node.numDogsAtLastUpdate; - - if ( IsDefined( node.distSum ) ) - { - text["dist_all"] = node.distSum["all"]; - text["dist_allies"] = node.distSum["allies"]; - text["dist_axis"] = node.distSum["axis"]; - text["dist_dogs"] = node.distSum["dogs"]; - } - - if ( node_used( node ) ) - { - color = green; - } - - print_text( node.origin, text, 64, color, "debug_spawn_refresh" ); - maps\mp\gametypes\_dev::showOneSpawnPoint( node, color, "debug_spawn_refresh", 32, "" ); - } - - wait( 1 ); - level notify( "debug_spawn_refresh" ); - } -} - -print_text( origin, text_array, height, color, notification ) -{ - keys = GetArrayKeys( text_array ); - z = height; - - for ( i = keys.size - 1; i >= 0; i-- ) - { - string = keys[i] + ": " + text_array[ keys[i] ]; - - thread maps\mp\gametypes\_dev::print3DUntilNotified( origin + ( 0, 0, z ), string, color, 1, 0.5, notification ); - z = z - 6; - } -} - -node_used( node ) -{ - for ( i = 0; i < level.debug_spawn_nodes.size; i++ ) - { - if ( node == level.debug_spawn_nodes[i] ) - { - return true; - } - } - - return false; -} - -#/ diff --git a/mods/patch_mp/maps/mp/_utility.gsc b/mods/patch_mp/maps/mp/_utility.gsc deleted file mode 100644 index c36eac6..0000000 --- a/mods/patch_mp/maps/mp/_utility.gsc +++ /dev/null @@ -1,2202 +0,0 @@ -#include common_scripts\utility; -#include maps\mp\gametypes\_hud_util; - -triggerOff() -{ - if (!isdefined (self.realOrigin)) - { - self.realOrigin = self.origin; - } - - if (self.origin == self.realorigin) - { - self.origin += (0, 0, -10000); - } -} - -triggerOn() -{ - if (isDefined (self.realOrigin) ) - { - self.origin = self.realOrigin; - } -} - -error(msg) -{ - println("^c*ERROR* ", msg); - wait .05; // waitframe -/# - if (GetDvar( #"debug") != "1") - assertmsg("This is a forced error - attach the log file"); -#/ -} - -warning( msg ) -{ - println( "^1WARNING: " + msg ); -} - -/* - ============= -///ScriptDocBegin -"Name: spawn_array_struct()" -"Summary: Creates a struct with an attribute named "a" which is an empty array. Array structs are useful for passing around arrays by reference." -"Module: Array" -"CallOn: " -"Example: fxemitters = spawn_struct_array(); fxemitters.a[ fxemitters.size ] = new_emitter;" -"SPMP: both" -///ScriptDocEnd - ============= - */ -spawn_array_struct() -{ - s= SpawnStruct(); - s.a= []; - return s; -} - -/* -============= -///ScriptDocBegin -"Name: within_fov( , , , )" -"Summary: Returns true if < end_origin > is within the players field of view, otherwise returns false." -"Module: Vector" -"CallOn: " -"MandatoryArg: : starting origin for FOV check( usually the players origin )" -"MandatoryArg: : angles to specify facing direction( usually the players angles )" -"MandatoryArg: : origin to check if it's in the FOV" -"MandatoryArg: : cosine of the FOV angle to use" -"Example: qBool = within_fov( level.player.origin, level.player.angles, target1.origin, cos( 45 ) );" -"SPMP: multiplayer" -///ScriptDocEnd -============= -*/ -within_fov( start_origin, start_angles, end_origin, fov ) -{ - normal = VectorNormalize( end_origin - start_origin ); - forward = AnglesToForward( start_angles ); - dot = VectorDot( forward, normal ); - - return dot >= fov; -} - - /* - ============= -///ScriptDocBegin -"Name: append_array_struct( , )" -"Summary: Append the array elements in the (2nd) array struct parameter to the array in the (1st) array struct parameter." -"Module: Array" -"CallOn: " -"MandatoryArg: : Destination - Elements from .a[] are appended to .a[]" -"MandatoryArg: : Source - Elements from .a[] are appended to .a[]" -"Example: players = spawn_array_struct(); worst_enemies = built_worst_enemies(); append_array_struct( players, worst_enemies ;" -"SPMP: both" -///ScriptDocEnd - ============= - */ -append_array_struct( - dst_s, ///< struct.a[] - src_s ) ///< struct.a[] -{ - for ( i= 0; i < src_s.a.size; i++ ) - { - dst_s.a[ dst_s.a.size ]= src_s.a[ i ]; - } -} - -exploder( num ) -{ - [[ level.exploderFunction ]]( num ); -} - -exploder_stop( num ) -{ - stop_exploder( num ); -} - -exploder_sound() -{ - if(isdefined(self.script_delay)) - { - wait self.script_delay; - } - - self playSound(level.scr_sound[self.script_sound]); -} - -cannon_effect() -{ - if( isdefined( self.v[ "repeat" ] ) ) - { - for( i = 0;i < self.v[ "repeat" ];i ++ ) - { - playfx( level._effect[ self.v[ "fxid" ] ], self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); - //exploder_playSound(); - self exploder_delay(); - } - return; - } - - self exploder_delay(); - -// playfx( level._effect[ self.v[ "fxid" ] ], self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); - if ( isdefined( self.looper ) ) - { - self.looper delete(); - } - - self.looper = spawnFx( getfx( self.v[ "fxid" ] ), self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); - triggerFx( self.looper ); - exploder_playSound(); -} - -exploder_delay() -{ - if( !isdefined( self.v[ "delay" ] ) ) - { - self.v[ "delay" ] = 0; - } - - min_delay = self.v[ "delay" ]; - max_delay = self.v[ "delay" ] + 0.001;// cant randomfloatrange on the same # - if( isdefined( self.v[ "delay_min" ] ) ) - { - min_delay = self.v[ "delay_min" ]; - } - - if( isdefined( self.v[ "delay_max" ] ) ) - { - max_delay = self.v[ "delay_max" ]; - } - - if( min_delay > 0 ) - { - wait( randomfloatrange( min_delay, max_delay ) ); - } -} - -exploder_playSound() -{ - if( !isdefined( self.v[ "soundalias" ] ) || self.v[ "soundalias" ] == "nil" ) - { - return; - } - - play_sound_in_space( self.v[ "soundalias" ], self.v[ "origin" ] ); -} - -brush_delete() -{ - num = self.v[ "exploder" ]; - - if( isdefined( self.v[ "delay" ] ) ) - { - wait( self.v[ "delay" ] ); - } - else - { - wait( .05 );// so it disappears after the replacement appears - } - - if( !isdefined( self.model ) ) - { - return; - } - - - assert( isdefined( self.model ) ); - - if( level.createFX_enabled ) - { - if( isdefined( self.exploded ) ) - { - return; - } - - self.exploded = true; - self.model hide(); - self.model notsolid(); - - wait( 3 ); - self.exploded = undefined; - self.model show(); - self.model solid(); - return; - } - - if( !isdefined( self.v[ "fxid" ] ) || self.v[ "fxid" ] == "No FX" ) - { - self.v[ "exploder" ] = undefined; - } - - waittillframeend;// so it hides stuff after it shows the new stuff - self.model delete(); -} - -brush_show() -{ - if( isdefined( self.v[ "delay" ] ) ) - { - wait( self.v[ "delay" ] ); - } - - assert( isdefined( self.model ) ); - - self.model show(); - self.model solid(); - - if( level.createFX_enabled ) - { - if( isdefined( self.exploded ) ) - { - return; - } - - self.exploded = true; - wait( 3 ); - self.exploded = undefined; - self.model hide(); - self.model notsolid(); - } -} - -brush_throw() -{ - if( isdefined( self.v[ "delay" ] ) ) - { - wait( self.v[ "delay" ] ); - } - - ent = undefined; - - if( isdefined( self.v[ "target" ] ) ) - { - ent = getent( self.v[ "target" ], "targetname" ); - } - - if( !isdefined( ent ) ) - { - self.model delete(); - return; - } - - self.model show(); - - startorg = self.v[ "origin" ]; - startang = self.v[ "angles" ]; - org = ent.origin; - - - temp_vec = ( org - self.v[ "origin" ] ); - x = temp_vec[ 0 ]; - y = temp_vec[ 1 ]; - z = temp_vec[ 2 ]; - - self.model rotateVelocity( ( x, y, z ), 12 ); - - self.model moveGravity( ( x, y, z ), 12 ); - if( level.createFX_enabled ) - { - if( isdefined( self.exploded ) ) - { - return; - } - - self.exploded = true; - wait( 3 ); - self.exploded = undefined; - self.v[ "origin" ] = startorg; - self.v[ "angles" ] = startang; - self.model hide(); - return; - } - - self.v[ "exploder" ] = undefined; - wait( 6 ); - self.model delete(); -} - -getPlant() -{ - start = self.origin + (0, 0, 10); - - range = 11; - forward = anglesToForward(self.angles); - forward = vector_scale(forward, range); - - traceorigins[0] = start + forward; - traceorigins[1] = start; - - trace = bulletTrace(traceorigins[0], (traceorigins[0] + (0, 0, -18)), false, undefined); - if(trace["fraction"] < 1) - { - //println("^6Using traceorigins[0], tracefraction is", trace["fraction"]); - - temp = spawnstruct(); - temp.origin = trace["position"]; - temp.angles = orientToNormal(trace["normal"]); - return temp; - } - - trace = bulletTrace(traceorigins[1], (traceorigins[1] + (0, 0, -18)), false, undefined); - if(trace["fraction"] < 1) - { - //println("^6Using traceorigins[1], tracefraction is", trace["fraction"]); - - temp = spawnstruct(); - temp.origin = trace["position"]; - temp.angles = orientToNormal(trace["normal"]); - return temp; - } - - traceorigins[2] = start + (16, 16, 0); - traceorigins[3] = start + (16, -16, 0); - traceorigins[4] = start + (-16, -16, 0); - traceorigins[5] = start + (-16, 16, 0); - - besttracefraction = undefined; - besttraceposition = undefined; - for(i = 0; i < traceorigins.size; i++) - { - trace = bulletTrace(traceorigins[i], (traceorigins[i] + (0, 0, -1000)), false, undefined); - - //ent[i] = spawn("script_model",(traceorigins[i]+(0, 0, -2))); - //ent[i].angles = (0, 180, 180); - //ent[i] setmodel("105"); - - //println("^6trace ", i ," fraction is ", trace["fraction"]); - - if(!isdefined(besttracefraction) || (trace["fraction"] < besttracefraction)) - { - besttracefraction = trace["fraction"]; - besttraceposition = trace["position"]; - - //println("^6besttracefraction set to ", besttracefraction, " which is traceorigin[", i, "]"); - } - } - - if(besttracefraction == 1) - besttraceposition = self.origin; - - temp = spawnstruct(); - temp.origin = besttraceposition; - temp.angles = orientToNormal(trace["normal"]); - return temp; -} - -orientToNormal(normal) -{ - hor_normal = (normal[0], normal[1], 0); - hor_length = length(hor_normal); - - if(!hor_length) - return (0, 0, 0); - - hor_dir = vectornormalize(hor_normal); - neg_height = normal[2] * -1; - tangent = (hor_dir[0] * neg_height, hor_dir[1] * neg_height, hor_length); - plant_angle = vectortoangles(tangent); - - //println("^6hor_normal is ", hor_normal); - //println("^6hor_length is ", hor_length); - //println("^6hor_dir is ", hor_dir); - //println("^6neg_height is ", neg_height); - //println("^6tangent is ", tangent); - //println("^6plant_angle is ", plant_angle); - - return plant_angle; -} - -array_levelthread (ents, process, var, excluders) -{ - exclude = []; - for (i=0;i 0 ) - { - if ( !IsDefined( combineMessageAndTimer ) || !combineMessageAndTimer ) - self.lowerTimer.label = &""; - else - self.lowerTimer.label = text; - self.lowerTimer setTimer( time ); - } - else - { - self.lowerTimer setText( "" ); - self.lowerTimer.label = &""; - } - if( self IsSplitscreen() ) - self.lowerMessage.fontscale = 1.4; - - self.lowerMessage fadeOverTime( 0.05 ); - self.lowerMessage.alpha = 1; - self.lowerTimer fadeOverTime( 0.05 ); - self.lowerTimer.alpha = 1; -} - -clearLowerMessage( fadetime ) -{ - if ( !isDefined( self.lowerMessage ) ) - return; - - self notify("lower_message_set"); - - if ( !isdefined( fadetime) || fadetime == 0 ) - { - setLowerMessage( &"" ); - } - else - { - self endon("disconnect"); - self endon("lower_message_set"); - - self.lowerMessage fadeOverTime( fadetime ); - self.lowerMessage.alpha = 0; - self.lowerTimer fadeOverTime( fadetime ); - self.lowerTimer.alpha = 0; - - wait fadetime; - - self setLowerMessage(""); - } -} - -printOnTeam(text, team) -{ - assert( isdefined( level.players ) ); - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - if ( ( isdefined(player.pers["team"]) ) && (player.pers["team"] == team) ) - player iprintln(text); - } -} - - -printBoldOnTeam(text, team) -{ - assert( isdefined( level.players ) ); - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - if ( ( isdefined(player.pers["team"]) ) && (player.pers["team"] == team) ) - player iprintlnbold(text); - } -} - - - -printBoldOnTeamArg(text, team, arg) -{ - assert( isdefined( level.players ) ); - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - if ( ( isdefined(player.pers["team"]) ) && (player.pers["team"] == team) ) - player iprintlnbold(text, arg); - } -} - - -printOnTeamArg(text, team, arg) -{ - //assert( isdefined( level.players ) ); - //for ( i = 0; i < level.players.size; i++ ) - //{ - // player = level.players[i]; - // if ( ( isdefined(player.pers["team"]) ) && (player.pers["team"] == team) ) - // { - // player iprintln(text, arg); - // } - //} -} - - -printOnPlayers( text, team ) -{ - players = level.players; - for(i = 0; i < players.size; i++) - { - if ( isDefined( team ) ) - { - if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == team)) - players[i] iprintln(text); - } - else - { - players[i] iprintln(text); - } - } -} - -printAndSoundOnEveryone( team, otherteam, printFriendly, printEnemy, soundFriendly, soundEnemy, printarg ) -{ - shouldDoSounds = isDefined( soundFriendly ); - - shouldDoEnemySounds = false; - if ( isDefined( soundEnemy ) ) - { - assert( shouldDoSounds ); // can't have an enemy sound without a friendly sound - shouldDoEnemySounds = true; - } - - if ( level.splitscreen || !shouldDoSounds ) - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - playerteam = player.pers["team"]; - if ( isdefined( playerteam ) ) - { - if ( playerteam == team && isDefined( printFriendly ) && printFriendly != &"" ) - player iprintln( printFriendly, printarg ); - else if ( playerteam == otherteam && isDefined( printEnemy ) && printEnemy != &"" ) - player iprintln( printEnemy, printarg ); - } - } - if ( shouldDoSounds ) - { - assert( level.splitscreen ); - level.players[0] playLocalSound( soundFriendly ); - } - } - else - { - assert( shouldDoSounds ); - if ( shouldDoEnemySounds ) - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - playerteam = player.pers["team"]; - if ( isdefined( playerteam ) ) - { - if ( playerteam == team ) - { - if( isDefined( printFriendly ) && printFriendly != &"" ) - player iprintln( printFriendly, printarg ); - player playLocalSound( soundFriendly ); - } - else if ( playerteam == otherteam ) - { - if( isDefined( printEnemy ) && printEnemy != &"" ) - player iprintln( printEnemy, printarg ); - player playLocalSound( soundEnemy ); - } - } - } - } - else - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - playerteam = player.pers["team"]; - if ( isdefined( playerteam ) ) - { - if ( playerteam == team ) - { - if( isDefined( printFriendly ) && printFriendly != &"" ) - player iprintln( printFriendly, printarg ); - player playLocalSound( soundFriendly ); - } - else if ( playerteam == otherteam && isDefined( printEnemy ) && printEnemy != &"" ) - { - player iprintln( printEnemy, printarg ); - } - } - } - } - } -} - - -_playLocalSound( soundAlias ) -{ - if ( level.splitscreen && !self IsHost() ) - return; - - self playLocalSound( soundAlias ); -} - - -dvarIntValue( dVar, defVal, minVal, maxVal ) -{ - dVar = "scr_" + level.gameType + "_" + dVar; - if ( getDvar( dVar ) == "" ) - { - setDvar( dVar, defVal ); - return defVal; - } - - value = getDvarInt( dVar ); - - if ( value > maxVal ) - value = maxVal; - else if ( value < minVal ) - value = minVal; - else - return value; - - setDvar( dVar, value ); - return value; -} - - -dvarFloatValue( dVar, defVal, minVal, maxVal ) -{ - dVar = "scr_" + level.gameType + "_" + dVar; - if ( getDvar( dVar ) == "" ) - { - setDvar( dVar, defVal ); - return defVal; - } - - value = getDvarFloat( dVar ); - - if ( value > maxVal ) - value = maxVal; - else if ( value < minVal ) - value = minVal; - else - return value; - - setDvar( dVar, value ); - return value; -} - - -play_sound_on_tag( alias, tag ) -{ - if ( isdefined( tag) ) - { - org = spawn( "script_origin", self getTagOrigin( tag ) ); - org linkto( self, tag, (0,0,0), (0,0,0) ); - } - else - { - org = spawn( "script_origin", (0,0,0) ); - org.origin = self.origin; - org.angles = self.angles; - org linkto( self ); - } - - org playsound (alias); - wait ( 5.0 ); - org delete(); -} - - -createLoopEffect( fxid ) -{ - ent = maps\mp\_createfx::createEffect( "loopfx", fxid ); - ent.v[ "delay" ] = 0.5; - return ent; -} - -createOneshotEffect( fxid ) -{ - ent = maps\mp\_createfx::createEffect( "oneshotfx", fxid ); - ent.v[ "delay" ] = -15; - return ent; -} - -loop_fx_sound ( alias, origin, ender, timeout ) -{ - org = spawn ("script_origin",(0,0,0)); - if ( isdefined( ender ) ) - { - thread loop_sound_delete (ender, org); - self endon( ender ); - } - org.origin = origin; - org playloopsound (alias); - if (!isdefined (timeout)) - return; - - wait (timeout); -// org delete(); -} - -exploder_damage() -{ - if( isdefined( self.v[ "delay" ] ) ) - delay = self.v[ "delay" ]; - else - delay = 0; - - if( isdefined( self.v[ "damage_radius" ] ) ) - radius = self.v[ "damage_radius" ]; - else - radius = 128; - - damage = self.v[ "damage" ]; - origin = self.v[ "origin" ]; - - wait( delay ); - // Range, max damage, min damage - radiusDamage( origin, radius, damage, damage ); -} - - -exploder_before_load( num ) -{ - // gotta wait twice because the createfx_init function waits once then inits all exploders. This guarentees - // that if an exploder is run on the first frame, it happens after the fx are init. - waittillframeend; - waittillframeend; - activate_exploder( num ); -} - -exploder_after_load( num ) -{ - activate_exploder( num ); -} - -activate_exploder( num ) -{ - num = int( num ); - for( i = 0;i < level.createFXent.size;i ++ ) - { - ent = level.createFXent[ i ]; - if( !isdefined( ent ) ) - continue; - - if( ent.v[ "type" ] != "exploder" ) - continue; - - // make the exploder actually removed the array instead? - if( !isdefined( ent.v[ "exploder" ] ) ) - continue; - - if( ent.v[ "exploder" ] != num ) - continue; - - if( isdefined( ent.v[ "firefx" ] ) ) - ent thread fire_effect(); - - if( isdefined( ent.v[ "fxid" ] ) && ent.v[ "fxid" ] != "No FX" ) - ent thread cannon_effect(); - else - if( isdefined( ent.v[ "soundalias" ] ) ) - ent thread sound_effect(); - - if( isdefined( ent.v[ "damage" ] ) ) - ent thread exploder_damage(); - - if( isdefined( ent.v[ "earthquake" ] ) ) - { - eq = ent.v[ "earthquake" ]; - earthquake( level.earthquake[ eq ][ "magnitude" ], - level.earthquake[ eq ][ "duration" ], - ent.v[ "origin" ], - level.earthquake[ eq ][ "radius" ] ); - } - - if( ent.v[ "exploder_type" ] == "exploder" ) - ent thread brush_show(); - else - if( ( ent.v[ "exploder_type" ] == "exploderchunk" ) || ( ent.v[ "exploder_type" ] == "exploderchunk visible" ) ) - ent thread brush_throw(); - else - ent thread brush_delete(); - } -} - -stop_exploder( num ) -{ - num = int( num ); - for( i = 0;i < level.createFXent.size;i ++ ) - { - ent = level.createFXent[ i ]; - if( !isdefined( ent ) ) - continue; - - if( ent.v[ "type" ] != "exploder" ) - continue; - - // make the exploder actually removed the array instead? - if( !isdefined( ent.v[ "exploder" ] ) ) - continue; - - if( ent.v[ "exploder" ] != num ) - continue; - - if ( isdefined( ent.looper ) ) - { - ent.looper delete(); - } - } -} - -sound_effect () -{ - self effect_soundalias(); -} - -effect_soundalias ( ) -{ - if (!isdefined (self.v["delay"])) - self.v["delay"] = 0; - - // save off this info in case we delete the effect - origin = self.v["origin"]; - alias = self.v["soundalias"]; - wait (self.v["delay"]); - play_sound_in_space ( alias, origin ); -} - -play_sound_in_space (alias, origin, master) -{ - org = spawn ("script_origin",(0,0,1)); - if (!isdefined (origin)) - origin = self.origin; - org.origin = origin; - if (isdefined(master) && master) - org playsoundasmaster (alias); - else - org playsound (alias); - wait ( 10.0 ); - org delete(); -} - -loop_sound_in_space(alias, origin, ender) -{ - org = spawn("script_origin",(0,0,1)); - - if(!isdefined(origin)) - { - origin = self.origin; - } - - org.origin = origin; - org playLoopSound(alias); - - level waittill(ender); - - org stopLoopSound(); - wait 0.1; - org delete(); -} - -fire_effect() -{ - if( !isdefined( self.v[ "delay" ] ) ) - self.v[ "delay" ] = 0; - - delay = self.v[ "delay" ]; - if( ( isdefined( self.v[ "delay_min" ] ) ) && ( isdefined( self.v[ "delay_max" ] ) ) ) - delay = self.v[ "delay_min" ] + randomfloat( self.v[ "delay_max" ] - self.v[ "delay_min" ] ); - - forward = self.v[ "forward" ]; - up = self.v[ "up" ]; - - org = undefined; - - firefxSound = self.v[ "firefxsound" ]; - origin = self.v[ "origin" ]; - firefx = self.v[ "firefx" ]; - ender = self.v[ "ender" ]; - if( !isdefined( ender ) ) - ender = "createfx_effectStopper"; - timeout = self.v[ "firefxtimeout" ]; - - fireFxDelay = 0.5; - if( isdefined( self.v[ "firefxdelay" ] ) ) - fireFxDelay = self.v[ "firefxdelay" ]; - - wait( delay ); - - if( isdefined( firefxSound ) ) - level thread loop_fx_sound( firefxSound, origin, ender, timeout ); - - playfx( level._effect[ firefx ], self.v[ "origin" ], forward, up ); - -// loopfx( fxId, fxPos, waittime, fxPos2, fxStart, fxStop, timeout ) -// maps\_fx::loopfx( firefx, origin, delay, org, undefined, ender, timeout ); -} - -loop_sound_delete ( ender, ent ) -{ - ent endon ("death"); - self waittill (ender); - ent delete(); -} - -createExploder( fxid ) -{ - ent = maps\mp\_createfx::createEffect( "exploder", fxid ); - ent.v["delay"] = 0; - ent.v["exploder_type"] = "normal"; - return ent; -} - -getOtherTeam( team ) -{ - if ( team == "allies" ) - return "axis"; - else if ( team == "axis" ) - return "allies"; - - assertMsg( "getOtherTeam: invalid team " + team ); -} - - -wait_endon( waitTime, endOnString, endonString2, endonString3 ) -{ - self endon ( endOnString ); - if ( isDefined( endonString2 ) ) - self endon ( endonString2 ); - if ( isDefined( endonString3 ) ) - self endon ( endonString3 ); - - wait ( waitTime ); -} - -isMG( weapon ) -{ - return isSubStr( weapon, "_bipod_" ); -} - -plot_points( plotpoints, r, g, b, timer ) -{ - lastpoint = plotpoints[ 0 ]; - if( !IsDefined( r ) ) - r = 1; - if( !IsDefined( g ) ) - g = 1; - if( !IsDefined( b ) ) - b = 1; - if( !IsDefined( timer ) ) - timer = 0.05; - for( i = 1;i < plotpoints.size;i ++ ) - { - // AE 10-26-09: line function must have changed to Line( , , , , ) - line( lastpoint, plotpoints[ i ], ( r, g, b ), 1, timer ); - //line( lastpoint, plotpoints[ i ], ( r, g, b ), 1, 1, int(timer) ); - lastpoint = plotpoints[ i ]; - } -} - -registerClientSys(sSysName) -{ - if(!isdefined(level._clientSys)) - { - level._clientSys = []; - } - - if(level._clientSys.size >= 32) - { - error("Max num client systems exceeded."); - return; - } - - if(isdefined(level._clientSys[sSysName])) - { - error("Attempt to re-register client system : " + sSysName); - return; - } - else - { - level._clientSys[sSysName] = spawnstruct(); - level._clientSys[sSysName].sysID = ClientSysRegister(sSysName); - } -} - -setClientSysState(sSysName, sSysState, player) -{ - if(!isdefined(level._clientSys)) - { - error("setClientSysState called before registration of any systems."); - return; - } - - if(!isdefined(level._clientSys[sSysName])) - { - error("setClientSysState called on unregistered system " + sSysName); - return; - } - - if(isdefined(player)) - { - player ClientSysSetState(level._clientSys[sSysName].sysID, sSysState); - } - else - { - ClientSysSetState(level._clientSys[sSysName].sysID, sSysState); - level._clientSys[sSysName].sysState = sSysState; - } -} - -getClientSysState(sSysName) -{ - if(!isdefined(level._clientSys)) - { - error("Cannot getClientSysState before registering any client systems."); - return ""; - } - - if(!isdefined(level._clientSys[sSysName])) - { - error("Client system " + sSysName + " cannot return state, as it is unregistered."); - return ""; - } - - if(isdefined(level._clientSys[sSysName].sysState)) - { - return level._clientSys[sSysName].sysState; - } - - return ""; -} - -clientNotify(event) -{ - if(level.clientscripts) - { - if(IsPlayer(self)) - { - maps\mp\_utility::setClientSysState("levelNotify", event, self); - } - else - { - maps\mp\_utility::setClientSysState("levelNotify", event); - } - } -} - -alphabet_compare( a, b ) -{ - list = []; - val = 1; - list[ "0" ] = val; val++; - list[ "1" ] = val; val++; - list[ "2" ] = val; val++; - list[ "3" ] = val; val++; - list[ "4" ] = val; val++; - list[ "5" ] = val; val++; - list[ "6" ] = val; val++; - list[ "7" ] = val; val++; - list[ "8" ] = val; val++; - list[ "9" ] = val; val++; - list[ "_" ] = val; val++; - list[ "a" ] = val; val++; - list[ "b" ] = val; val++; - list[ "c" ] = val; val++; - list[ "d" ] = val; val++; - list[ "e" ] = val; val++; - list[ "f" ] = val; val++; - list[ "g" ] = val; val++; - list[ "h" ] = val; val++; - list[ "i" ] = val; val++; - list[ "j" ] = val; val++; - list[ "k" ] = val; val++; - list[ "l" ] = val; val++; - list[ "m" ] = val; val++; - list[ "n" ] = val; val++; - list[ "o" ] = val; val++; - list[ "p" ] = val; val++; - list[ "q" ] = val; val++; - list[ "r" ] = val; val++; - list[ "s" ] = val; val++; - list[ "t" ] = val; val++; - list[ "u" ] = val; val++; - list[ "v" ] = val; val++; - list[ "w" ] = val; val++; - list[ "x" ] = val; val++; - list[ "y" ] = val; val++; - list[ "z" ] = val; val++; - - a = tolower( a ); - b = tolower( b ); - val1 = 0; - if ( isdefined( list[ a ] ) ) - val1 = list[ a ]; - - val2 = 0; - if ( isdefined( list[ b ] ) ) - val2 = list[ b ]; - - if ( val1 > val2 ) - return "1st"; - if ( val1 < val2 ) - return "2nd"; - return "same"; -} - -is_later_in_alphabet( string1, string2 ) -{ - count = string1.size; - if ( count >= string2.size ) - count = string2.size; - - for ( i = 0; i < count; i++ ) - { - val = alphabet_compare( string1[ i ], string2[ i ] ); - if ( val == "1st" ) - return true; - if ( val == "2nd" ) - return false; - } - - return string1.size > string2.size; -} - -alphabetize( array ) -{ - if ( array.size <= 1 ) - return array; - - count = 0; - for ( ;; ) - { - changed = false; - for ( i = 0; i < array.size - 1; i++ ) - { - if ( is_later_in_alphabet( array[ i ], array[ i + 1 ] ) ) - { - val = array[ i ]; - array[ i ] = array[ i + 1 ]; - array[ i + 1 ] = val; - changed = true; - count++; - if ( count >= 9 ) - { - count = 0; - wait( 0.05 ); - } - } - } - - if ( !changed ) - return array; - } - - return array; -} - -//------------------------------------------------------// -// get_players() // -// Returns all of the current players in the level // -//------------------------------------------------------// -get_players() -{ - players = GetEntArray( "player", "classname" ); - - return players; -} - -getfx( fx ) -{ - assertEx( IsDefined( level._effect[ fx ] ), "Fx " + fx + " is not defined in level._effect." ); - return level._effect[ fx ]; -} - -struct_arraySpawn() -{ - struct = SpawnStruct(); - struct.array = []; - struct.lastindex = 0; - return struct; -} - -structarray_add( struct, object ) -{ - assert( !isdefined( object.struct_array_index ) );// can't have elements of two structarrays on these. can add that later if it's needed - struct.array[ struct.lastindex ] = object; - object.struct_array_index = struct.lastindex; - struct.lastindex ++ ; -} - -structarray_remove( struct, object ) -{ - structarray_swaptolast( struct, object ); - struct.array[ struct.lastindex - 1 ] = undefined; - struct.lastindex -- ; -} - -structarray_swaptolast( struct, object ) -{ - struct structarray_swap( struct.array[ struct.lastindex - 1 ], object ); -} - -structarray_shuffle( struct, shuffle ) -{ - for( i = 0;i < shuffle;i ++ ) - struct structarray_swap( struct.array[ i ], struct.array[ randomint( struct.lastindex ) ] ); -} - -structarray_swap( object1, object2 ) -{ - index1 = object1.struct_array_index; - index2 = object2.struct_array_index; - self.array[ index2 ] = object1; - self.array[ index1 ] = object2; - self.array[ index1 ].struct_array_index = index1; - self.array[ index2 ].struct_array_index = index2; -} - -waittill_either( msg1, msg2 ) -{ - self endon( msg1 ); - self waittill( msg2 ); -} - - /* - ============= -///ScriptDocBegin -"Name: getClosest( , , )" -"Summary: Returns the closest entity in < array > to location < org > " -"Module: Distance" -"CallOn: " -"MandatoryArg: : Origin to be closest to." -"MandatoryArg: : Array of entities to check distance on" -"OptionalArg: : Minimum distance to check" -"Example: friendly = getclosest( level.player.origin, allies );" -"SPMP: singleplayer" -///ScriptDocEnd - ============= - */ -getClosest( org, array, dist ) -{ - return compareSizes( org, array, dist, ::closerFunc ); -} - - /* - ============= -///ScriptDocBegin -"Name: getClosestFx( , , )" -"Summary: Returns the closest fx struct created by createfx in < fxarray > to location < org > " -"Module: Distance" -"CallOn: " -"MandatoryArg: : Origin to be closest to." -"MandatoryArg: : Array of createfx structs to check distance on. These are obtained with getfxarraybyID( )" -"OptionalArg: : Minimum distance to check" -"Example: fxstruct = getClosestFx( hallway_tv, fxarray );" -"SPMP: singleplayer" -///ScriptDocEnd - ============= - */ -getClosestFx( org, fxarray, dist ) -{ - return compareSizesFx( org, fxarray, dist, ::closerFunc ); -} - - /* - ============= -///ScriptDocBegin -"Name: getFarthest( , , )" -"Summary: Returns the farthest entity in < array > to location < org > " -"Module: Distance" -"CallOn: " -"MandatoryArg: : Origin to be farthest from." -"MandatoryArg: : Array of entities to check distance on" -"OptionalArg: : Maximum distance to check" -"Example: target = getFarthest( level.player.origin, targets );" -"SPMP: singleplayer" -///ScriptDocEnd - ============= - */ -getFarthest( org, array, dist ) -{ - return compareSizes( org, array, dist, ::fartherFunc ); -} - -compareSizesFx( org, array, dist, compareFunc ) -{ - if( !array.size ) - return undefined; - if( isdefined( dist ) ) - { - distSqr = dist * dist; - struct = undefined; - keys = getArrayKeys( array ); - for( i = 0; i < keys.size; i ++ ) - { - newdistSqr = DistanceSquared( array[ keys[ i ] ].v[ "origin" ], org ); - if( [[ compareFunc ]]( newdistSqr, distSqr ) ) - continue; - distSqr = newdistSqr; - struct = array[ keys[ i ] ]; - } - return struct; - } - - keys = getArrayKeys( array ); - struct = array[ keys[ 0 ] ]; - distSqr = DistanceSquared( struct.v[ "origin" ], org ); - for( i = 1; i < keys.size; i ++ ) - { - newdistSqr = DistanceSquared( array[ keys[ i ] ].v[ "origin" ], org ); - if( [[ compareFunc ]]( newdistSqr, distSqr ) ) - continue; - distSqr = newdistSqr; - struct = array[ keys[ i ] ]; - } - return struct; -} - -compareSizes( org, array, dist, compareFunc ) -{ - if( !array.size ) - return undefined; - if( IsDefined( dist ) ) - { - distSqr = dist * dist; - ent = undefined; - keys = GetArrayKeys( array ); - for( i = 0; i < keys.size; i ++ ) - { - newdistSqr = DistanceSquared( array[ keys[ i ] ].origin, org ); - if( [[ compareFunc ]]( newdistSqr, distSqr ) ) - continue; - distSqr = newdistSqr; - ent = array[ keys[ i ] ]; - } - return ent; - } - - keys = GetArrayKeys( array ); - ent = array[ keys[ 0 ] ]; - distSqr = DistanceSquared( ent.origin, org ); - for( i = 1; i < keys.size; i ++ ) - { - newdistSqr = DistanceSquared( array[ keys[ i ] ].origin, org ); - if( [[ compareFunc ]]( newdistSqr, distSqr ) ) - continue; - distSqr = newdistSqr; - ent = array[ keys[ i ] ]; - } - return ent; -} - -closerFunc( dist1, dist2 ) -{ - return dist1 >= dist2; -} - -fartherFunc( dist1, dist2 ) -{ - return dist1 <= dist2; -} - -/* - ============= -///ScriptDocBegin -"Name: get_array_of_closest( , , , , )" -"Summary: Returns an array of all the entities in < array > sorted in order of closest to farthest." -"Module: Distance" -"CallOn: " -"MandatoryArg: : Origin to be closest to." -"MandatoryArg: : Array of entities to check distance on." -"OptionalArg: : Array of entities to exclude from the check." -"OptionalArg: : Max size of the array to return" -"OptionalArg: : Max distance from the origin to return acceptable entities" -"Example: allies_sort = get_array_of_closest( originFC1.origin, allies );" -"SPMP: singleplayer" -///ScriptDocEnd - ============= - */ -get_array_of_closest( org, array, excluders, max, maxdist ) -{ - // pass an array of entities to this function and it will return them in the order of closest - // to the origin you pass, you can also set max to limit how many ents get returned - if( !IsDefined( max ) ) - max = array.size; - if( !isdefined( excluders ) ) - excluders = []; - - maxdists2rd = undefined; - if( isdefined( maxdist ) ) - maxdists2rd = maxdist * maxdist; - - // return the array, reordered from closest to farthest - dist = []; - index = []; - for( i = 0;i < array.size;i ++ ) - { - excluded = false; - for( p = 0;p < excluders.size;p ++ ) - { - if( array[ i ] != excluders[ p ] ) - continue; - excluded = true; - break; - } - if( excluded ) - continue; - - length = distancesquared( org, array[ i ].origin ); - - if( isdefined( maxdists2rd ) && maxdists2rd < length ) - continue; - - dist[ dist.size ] = length; - - - index[ index.size ] = i; - } - - for( ;; ) - { - change = false; - for( i = 0;i < dist.size - 1;i ++ ) - { - if( dist[ i ] <= dist[ i + 1 ] ) - continue; - change = true; - temp = dist[ i ]; - dist[ i ] = dist[ i + 1 ]; - dist[ i + 1 ] = temp; - temp = index[ i ]; - index[ i ] = index[ i + 1 ]; - index[ i + 1 ] = temp; - } - if( !change ) - break; - } - - newArray = []; - if( max > dist.size ) - max = dist.size; - for( i = 0;i < max;i ++ ) - newArray[ i ] = array[ index[ i ] ]; - return newArray; -} - -set_dvar_if_unset( - dvar, - value, - force) -{ - if (GetDvar(dvar)=="" || ( isdefined( force ) && force ) ) - { - SetDvar(dvar, value); - return value; - } - - return GetDvar(dvar); -} - -set_dvar_float_if_unset( - dvar, - value, - force) -{ - if (GetDvar(dvar)=="" || ( isdefined( force ) && force ) ) - { - SetDvar(dvar, value); - } - - return GetDvarFloat(dvar); -} - -set_dvar_int_if_unset( - dvar, - value, - force) -{ - if (GetDvar(dvar)=="" || ( isdefined( force ) && force ) ) - { - SetDvar(dvar, value); - return int(value); - } - - return GetDvarInt(dvar); -} - -drawcylinder( pos, rad, height, duration, stop_notify ) -{ -/# - if ( !IsDefined( duration ) ) - { - duration = 0; - } - - level thread drawcylinder_think( pos, rad, height, duration, stop_notify ); -#/ -} - -drawcylinder_think( pos, rad, height, seconds, stop_notify ) -{ -/# - if ( IsDefined( stop_notify ) ) - { - level endon( stop_notify ); - } - - stop_time = GetTime() + ( seconds * 1000 ); - - currad = rad; - curheight = height; - - for ( ;; ) - { - if ( seconds > 0 && stop_time <= GetTime() ) - { - return; - } - - for( r = 0; r < 20; r++ ) - { - theta = r / 20 * 360; - theta2 = ( r + 1 ) / 20 * 360; - - line( pos +( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos +( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) ); - line( pos +( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos +( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) ); - line( pos +( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos +( cos( theta ) * currad, sin( theta ) * currad, curheight ) ); - } - - wait( 0.05 ); - } -#/ -} - -/# -debug_replay(string) -{ - if( GetDvar( #"replay_debug" ) == "1" ) - { - println("time=" + GetTime() + " " + string); - } -} -#/ - -is_bot() -{ - return ( IsDefined ( self.pers["isBot"] ) && self.pers["isBot"] != 0 ); -} - -add_trigger_to_ent(ent) // Self == The trigger volume -{ - if(!IsDefined(ent._triggers)) - { - ent._triggers = []; - } - - ent._triggers[self GetEntityNumber()] = 1; -} - -remove_trigger_from_ent(ent) // Self == The trigger volume. -{ - if(!IsDefined(ent)) - return; - - if(!IsDefined(ent._triggers)) - return; - - if(!IsDefined(ent._triggers[self GetEntityNumber()])) - return; - - ent._triggers[self GetEntityNumber()] = 0; -} - -ent_already_in_trigger(trig) // Self == The entity in the trigger volume. -{ - if(!IsDefined(self._triggers)) - return false; - - if(!IsDefined(self._triggers[trig GetEntityNumber()])) - return false; - - if(!self._triggers[trig GetEntityNumber()]) - return false; - - return true; // We're already in this trigger volume. -} - -trigger_thread_death_monitor(ent, ender) -{ - ent waittill("death"); - self endon(ender); - self remove_trigger_from_ent(ent); -} - -trigger_thread(ent, on_enter_payload, on_exit_payload) // Self == The trigger. -{ - ent endon("entityshutdown"); - ent endon("death"); - - if(ent ent_already_in_trigger(self)) - return; - - self add_trigger_to_ent(ent); - - ender = "end_trig_death_monitor" + self GetEntityNumber() + " " + ent GetEntityNumber(); - self thread trigger_thread_death_monitor(ent, ender); // If ent dies in trigger, clear trigger off of ent. - -// iprintlnbold("Trigger " + self.targetname + " hit by ent " + ent getentitynumber()); - - endon_condition = "leave_trigger_" + self GetEntityNumber(); - - if(IsDefined(on_enter_payload)) - { - self thread [[on_enter_payload]](ent, endon_condition); - } - - while(IsDefined(ent) && ent IsTouching(self)) - { - wait(0.01); - } - - ent notify(endon_condition); - -// iprintlnbold(ent getentitynumber() + " leaves trigger " + self.targetname + "."); - - if(IsDefined(ent) && IsDefined(on_exit_payload)) - { - self thread [[on_exit_payload]](ent); - } - - if(IsDefined(ent)) - { - self remove_trigger_from_ent(ent); - } - - self notify(ender); // Get rid of the death monitor thread. -} - -isOneRound() -{ - if ( level.roundLimit == 1 ) - return true; - - return false; -} - -isFirstRound() -{ - if ( level.roundLimit > 1 && game[ "roundsplayed" ] == 0 ) - return true; - - return false; -} - -isLastRound() -{ - if ( level.roundLimit > 1 && game[ "roundsplayed" ] >= ( level.roundLimit - 1 ) ) - return true; - - return false; -} - -wasLastRound() -{ - if ( level.forcedEnd ) - return true; - - if ( hitRoundLimit() || hitScoreLimit() || hitRoundWinLimit() ) - return true; - - return false; -} - -hitRoundLimit() -{ - if( level.roundLimit <= 0 ) - return false; - - return ( getRoundsPlayed() >= level.roundLimit ); -} - -hitRoundWinLimit() -{ - if( !IsDefined(level.roundWinLimit) || level.roundWinLimit <= 0 ) - return false; - - if ( getRoundsWon("allies") >= level.roundWinLimit || getRoundsWon("axis") >= level.roundWinLimit) - { - //"True" means that we should end the game - return true; - } - - //No over-time should occur if either team has more rounds won, even if there were rounds that ended in draw. - // For example, If the round win limit is 5 and one team has one win and 4 draws occur in a row, we want to declare the - //team with the victory as the winner and not enter an over-time round. - if( getRoundsWon("allies") + game["roundswon"]["tie"] >= level.roundWinLimit || - getRoundsWon("axis") + game["roundswon"]["tie"] >= level.roundWinLimit) - { - //We want the game to have an over-time round if the teams are tied. - //In a game with a win limit of 3, 3 ties in a row would cause the previous 'if' check to return 'true'. - // We want to make sure the game doesn't end if that's the case. - if(getRoundsWon("allies") != getRoundsWon("axis")) - { - return true; - } - } - - return false; -} - - -hitScoreLimit() -{ - if ( isScoreRoundBased() ) - return false; - - if( level.scoreLimit <= 0 ) - return false; - - if ( level.teamBased ) - { - if( game["teamScores"]["allies"] >= level.scoreLimit || game["teamScores"]["axis"] >= level.scoreLimit ) - return true; - } - else - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - if ( isDefined( player.score ) && player.score >= level.scorelimit ) - return true; - } - } - return false; -} - -getRoundsWon( team ) -{ - return game["roundswon"][team]; -} - -getRoundsPlayed() -{ - return game["roundsplayed"]; -} - -isScoreRoundBased() -{ - return level.scoreRoundBased; -} - -isRoundBased() -{ - if ( level.roundLimit != 1 && level.roundWinLimit != 1 ) - return true; - - return false; -} - -waitTillNotMoving() -{ - if ( self maps\mp\gametypes\_weaponobjects::isHacked() ) - { - wait( 0.05 ); - return; - } - - if ( self.classname == "grenade" ) - { - self waittill("stationary"); - } - else - { - prevorigin = self.origin; - while(1) - { - wait .15; - if ( self.origin == prevorigin ) - break; - prevorigin = self.origin; - } - } -} - -mayApplyScreenEffect() -{ - if ( isDefined( self.viewlockedentity ) ) - return false; - - return true; -} - -getDvarFloatDefault( dvarName, defaultValue) -{ - returnVal = defaultValue; - if (getDvar(dvarName) != "") - { - return getDvarFloat(dvarName); - } - return returnVal; -} - -getDvarIntDefault( dvarName, defaultValue) -{ - returnVal = defaultValue; - if (getDvar(dvarName) != "") - { - return getDvarInt(dvarName); - } - return returnVal; -} - -dropAllToGround( origin, radius, stickyObjectRadius ) -{ - PhysicsExplosionSphere( origin, radius, radius, 0 ); - wait(0.05); - maps\mp\gametypes\_weapons::dropWeaponsToGround( origin, radius ); - // grenades are now done in code when an entity they were on gets deleted -// maps\mp\gametypes\_weapons::dropGrenadesToGround( origin, radius ); - maps\mp\gametypes\_supplydrop::dropCratesToGround( origin, radius ); - level notify( "drop_objects_to_ground", origin, stickyObjectRadius ); -} - -closestPointOnLine( point, lineStart, lineEnd ) -{ - lineMagSqrd = lengthsquared(lineEnd - lineStart); - - t = ( ( ( point[0] - lineStart[0] ) * ( lineEnd[0] - lineStart[0] ) ) + - ( ( point[1] - lineStart[1] ) * ( lineEnd[1] - lineStart[1] ) ) + - ( ( point[2] - lineStart[2] ) * ( lineEnd[2] - lineStart[2] ) ) ) / - ( lineMagSqrd ); - - if( t < 0.0 ) - { - return lineStart; - } - else if( t > 1.0 ) - { - return lineEnd; - } - - start_x = lineStart[0] + t * ( lineEnd[0] - lineStart[0] ); - start_y = lineStart[1] + t * ( lineEnd[1] - lineStart[1] ); - start_z = lineStart[2] + t * ( lineEnd[2] - lineStart[2] ); - - return (start_x,start_y,start_z); -} - - -isStrStart( string1, subStr ) -{ - return ( getSubStr( string1, 0, subStr.size ) == subStr ); -} - -/* -============= -///ScriptDocBegin -"Name: spread_array_thread( , , , , )" -"Summary: Threads the < process > function on every entity in the < entities > array. The entity will become "self" in the specified function. Each thread is started 1 network frame apart from the next." -"Module: Array" -"CallOn: " -"MandatoryArg: : array of entities to thread the process" -"MandatoryArg: : pointer to a script function" -"OptionalArg: : parameter 1 to pass to the process" -"OptionalArg: : parameter 2 to pass to the process" -"OptionalArg: : parameter 3 to pass to the process" -"Example: array_thread( getaiarray( "allies" ), ::set_ignoreme, false );" -"SPMP: Both" -///ScriptDocEnd -============= -*/ - -spread_array_thread( entities, process, var1, var2, var3 ) -{ - keys = getArrayKeys( entities ); - - if ( IsDefined( var3 ) ) - { - for( i = 0 ; i < keys.size ; i++ ) - { - entities[ keys[ i ] ] thread [[ process ]]( var1, var2, var3 ); - wait .1; - } - - return; - } - - if ( IsDefined( var2 ) ) - { - for( i = 0 ; i < keys.size ; i++ ) - { - entities[ keys[ i ] ] thread [[ process ]]( var1, var2 ); - wait .1; - } - - return; - } - - if ( IsDefined( var1 ) ) - { - for( i = 0 ; i < keys.size ; i++ ) - { - entities[ keys[ i ] ] thread [[ process ]]( var1 ); - wait .1; - } - - return; - } - - for( i = 0 ; i < keys.size ; i++ ) - { - entities[ keys[ i ] ] thread [[ process ]](); - wait .1; - } -} - -/* -============= -///ScriptDocBegin -"Name: freeze_player_controls( )" -"Summary: Freezes the player's controls with appropriate 'if' checks" -"Module: Player" -"CallOn: Player" -"MandatoryArg: : true or false" -"Example: freeze_player_controls( true )" -"SPMP: MP" -///ScriptDocEnd -============= -*/ - -freeze_player_controls( boolean ) -{ - AssertEx( IsDefined( boolean ), "'freeze_player_controls()' has not been passed an argument properly." ); - - if( boolean && IsAlive( self ) ) - { - self FreezeControls( boolean ); - - } - //'!level.gameEnded' check prevents the player from having their controls unfrozen during the end of rounds - else if( !boolean && IsAlive( self ) && !level.gameEnded ) - { - self FreezeControls( boolean ); - - } -} - -getHostPlayer() -{ - players = get_players(); - - for ( index = 0; index < players.size; index++ ) - { - if ( players[index] IsHost() ) - return players[index]; - } -} - - -isPreGame() -{ - return IsDefined( level.pregame ) && level.pregame; -} - -isKillStreaksEnabled() -{ - return IsDefined( level.killstreaksenabled ) && level.killstreaksenabled; -} - -ishardPointsEnabled() -{ - return IsDefined( level.hardpointsenabled ) && level.hardpointsenabled; -} - -isRankEnabled() -{ - return IsDefined( level.rankEnabled ) && level.rankEnabled; -} - -playSmokeSound( position, duration, startSound, stopSound, loopSound ) -{ - smokeSound = spawn ("script_origin",(0,0,1)); - smokeSound.origin = position; - - smokeSound playsound( startSound ); - smokeSound playLoopSound ( loopSound ); - if ( duration > 0.5 ) - wait( duration - 0.5 ); - thread playSoundinSpace( stopSound, position ); - smokeSound StopLoopSound( .5); - wait(.5); - smokeSound delete(); -} - -playSoundinSpace (alias, origin, master) -{ - org = spawn ( "script_origin",(0,0,1) ); - if (!isdefined (origin)) - origin = self.origin; - org.origin = origin; - if (isdefined(master) && master) - org playsoundasmaster (alias); - else - org playsound (alias); - wait ( 10.0 ); - org delete(); -} - -get2DYaw( start, end ) -{ - yaw = 0; - vector = (end[0] - start[0], end[1] - start[1], 0); - - return vecToAngles( vector ); -} - -vecToAngles( vector ) -{ - yaw = 0; - - vecX = vector[0]; - vecY = vector[1]; - - if ( vecX == 0 && vecY == 0 ) - return 0; - - if ( vecY < 0.001 && vecY > -0.001 ) - vecY = 0.001; - - yaw = atan( vecX / vecY ); - - if ( vecY < 0 ) - yaw += 180; - - return ( 90 - yaw ); -} - - diff --git a/mods/patch_mp/maps/mp/bots/_bot_loadout.gsc b/mods/patch_mp/maps/mp/bots/_bot_loadout.gsc deleted file mode 100644 index 30fe162..0000000 --- a/mods/patch_mp/maps/mp/bots/_bot_loadout.gsc +++ /dev/null @@ -1,1294 +0,0 @@ -/* - _bot_loadout - Author: INeedGames - Date: 12/20/2020 - Loadout stuff -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include maps\mp\bots\_bot_utility; - -/* - Gives the bot loadout -*/ -bot_give_loadout() -{ - self bot_giveKillstreaks(); - - self clearPerks(); - - self SetPlayerRenderOptions( int( self.pers["bot"]["class_render_opts"] ) ); - - if (!isDefined(self.bot)) - self.bot = []; - - self.bot[ "specialty1" ] = "specialty_null"; - self.bot[ "specialty2" ] = "specialty_null"; - self.bot[ "specialty3" ] = "specialty_null"; - - if (self.pers["bot"]["class_perk1"] != "" && GetDvarInt( #"scr_game_perks" ) ) - { - self.bot[ "specialty1" ] = self.pers["bot"]["class_perk1"]; - - id = bot_perk_from_reference_full(self.pers["bot"]["class_perk1"]); - tokens = strtok(id["reference"], "|"); - - for (i = 0; i < tokens.size; i++) - self setPerk(tokens[i]); - } - - switch( self.pers["bot"]["class_perk1"] ) - { - case "perk_ghost": - case "perk_ghost_pro": - self.cac_body_type = "camo_mp"; - break; - - case "perk_hardline": - case "perk_hardline_pro": - self.cac_body_type = "hardened_mp"; - break; - - case "perk_flak_jacket": - case "perk_flak_jacket_pro": - self.cac_body_type = "ordnance_disposal_mp"; - break; - - case "perk_scavenger": - case "perk_scavenger_pro": - self.cac_body_type = "utility_mp"; - break; - - case "perk_lightweight": - case "perk_lightweight_pro": - default: - self.cac_body_type = "standard_mp"; - break; - } - - self.cac_head_type = self maps\mp\gametypes\_armor::get_default_head(); - self.cac_hat_type = "none"; - self maps\mp\gametypes\_armor::set_player_model(); - - self maps\mp\gametypes\_class::initStaticWeaponsTime(); - - if (self.pers["bot"]["class_perk2"] != "" && GetDvarInt( #"scr_game_perks" )) - { - self.bot[ "specialty2" ] = self.pers["bot"]["class_perk2"]; - - id = bot_perk_from_reference_full(self.pers["bot"]["class_perk2"]); - tokens = strtok(id["reference"], "|"); - - for (i = 0; i < tokens.size; i++) - self setPerk(tokens[i]); - } - - if (self.pers["bot"]["class_perk3"] != "" && GetDvarInt( #"scr_game_perks" )) - { - self.bot[ "specialty3" ] = self.pers["bot"]["class_perk3"]; - - id = bot_perk_from_reference_full(self.pers["bot"]["class_perk3"]); - tokens = strtok(id["reference"], "|"); - - for (i = 0; i < tokens.size; i++) - self setPerk(tokens[i]); - } - - - self takeAllWeapons(); - if (getDvarInt("bots_play_knife")) - self GiveWeapon( "knife_mp" ); - - weap = self.pers["bot"]["class_primary"]; - if(weap == "") - weap = "ak47_mp"; - - primaryTokens = strtok( self.pers["bot"]["class_primary"], "_" ); - self.pers["primaryWeapon"] = primaryTokens[0]; - - weap = self.pers["bot"]["class_primary"]; - if(GetDvarInt( #"scr_disable_attachments" )) - weap = self.pers["primaryWeapon"] + "_mp"; - - self GiveWeapon( weap, 0, int( self.pers["bot"]["class_primary_opts"] ) ); - - if ( self hasPerk( "specialty_extraammo" ) ) - self giveMaxAmmo( weap ); - - if (!getDVarint("bots_play_fire")) - { - self SetWeaponAmmoClip(weap, 0); - self SetWeaponAmmoStock(weap, 0); - } - - if(self.pers["bot"]["class_secondary"] != "") - { - self GiveWeapon( self.pers["bot"]["class_secondary"], 0, int( self.pers["bot"]["class_secondary_opts"] ) ); - if ( self hasPerk( "specialty_extraammo" ) ) - self giveMaxAmmo( self.pers["bot"]["class_secondary"] ); - - if (!getDVarint("bots_play_fire")) - { - self SetWeaponAmmoClip(self.pers["bot"]["class_secondary"], 0); - self SetWeaponAmmoStock(self.pers["bot"]["class_secondary"], 0); - } - } - - self SetActionSlot( 3, "altMode" ); - self SetActionSlot( 4, "" ); - - if(self.pers["bot"]["class_equipment"] != "" && self.pers["bot"]["class_equipment"] != "weapon_null_mp" && !GetDvarInt( #"scr_disable_equipment" )) - { - self GiveWeapon( self.pers["bot"]["class_equipment"] ); - - self maps\mp\gametypes\_class::setWeaponAmmoOverall( self.pers["bot"]["class_equipment"], 1 ); - - self SetActionSlot( 1, "weapon", self.pers["bot"]["class_equipment"] ); - } - - if(self.pers["bot"]["class_lethal"] != "") - { - self GiveWeapon( self.pers["bot"]["class_lethal"] ); - - if(self hasPerk("specialty_twogrenades")) - self SetWeaponAmmoClip( self.pers["bot"]["class_lethal"], 2 ); - else - self SetWeaponAmmoClip( self.pers["bot"]["class_lethal"], 1 ); - - self SwitchToOffhand( self.pers["bot"]["class_lethal"] ); - } - - if(self.pers["bot"]["class_tacticle"] != "") - { - self giveWeapon( self.pers["bot"]["class_tacticle"] ); - - if(self.pers["bot"]["class_tacticle"] == "willy_pete_mp") - self SetWeaponAmmoClip( self.pers["bot"]["class_tacticle"], 1 ); - else if(self hasPerk("specialty_twogrenades")) - self SetWeaponAmmoClip( self.pers["bot"]["class_tacticle"], 3 ); - else - self SetWeaponAmmoClip( self.pers["bot"]["class_tacticle"], 2 ); - - self setOffhandSecondaryClass( self.pers["bot"]["class_tacticle"] ); - } - - self thread fixSecondarySwitch(weap); -} - -/* - Fixes the weapon on spawn for the bot -*/ -fixSecondarySwitch(weap) -{ - self endon("death"); - self endon("disconnect"); - self switchToWeapon(weap); - self setSpawnWeapon(weap); - wait 0.05; - self switchToWeapon(weap); - self setSpawnWeapon(weap); -} - -/* - Gets the prestige -*/ -bot_get_prestige() -{ - p_dvar = getDvarInt("bots_loadout_prestige"); - p = 0; - - if (p_dvar == -1) - { - for (i = 0; i < level.players.size; i++) - { - player = level.players[i]; - - if (!isDefined(player.team)) - continue; - - if (player is_bot()) - continue; - - p = player maps\mp\gametypes\_persistence::statGet( "plevel" ); - break; - } - } - else if (p_dvar == -2) - { - p = randomInt(17); - } - else - { - p = p_dvar; - } - - self.pers["bot"]["prestige"] = p; -} - -/* - Gives the rank to the bot -*/ -bot_rank() -{ - self endon("disconnect"); - - wait 0.05; - - self.pers["rankxp"] = self.pers["bot"]["rankxp"]; - rankId = self maps\mp\gametypes\_rank::getRankForXp( self.pers["bot"]["rankxp"] ); - prestige = self.pers["bot"]["prestige"]; - - self.pers["rank"] = rankId; - self.pers["prestige"] = prestige; - self.pers["plevel"] = prestige; - self setRank( rankId, prestige ); - - if(!level.gameEnded) - level waittill("game_ended"); - - self.pers["bot"]["rankxp"] = self.pers["rankxp"]; -} - -/* - Set the bot's class -*/ -bot_set_class() -{ - self.pers["bot"]["class_render_opts"] = 0; - - self.pers["bot"]["class_primary"] = ""; - self.pers["bot"]["class_primary_opts"] = 0; - self.pers["bot"]["class_secondary"] = ""; - self.pers["bot"]["class_secondary_opts"] = 0; - - self.pers["bot"]["class_lethal"] = ""; - self.pers["bot"]["class_tacticle"] = ""; - self.pers["bot"]["class_equipment"] = ""; - - self.pers["bot"]["class_perk1"] = ""; - self.pers["bot"]["class_perk2"] = ""; - self.pers["bot"]["class_perk3"] = ""; - - self.pers["bot"][ "cod_points" ] = self.pers["bot"][ "cod_points_org" ];//refund prev payments for class - - rank = self maps\mp\gametypes\_rank::getRankForXp( self.pers["bot"]["rankxp"] ); - - if ( !level.onlineGame ) - { - rank = level.maxRank; - } - - if (rank < 3 || (randomint(100) < 3 && !GetDvarInt("bots_loadout_reasonable"))) - { - _class = ""; - while(_class == "") - { - switch(randomInt(5)) - { - case 0: - _class = "CLASS_ASSAULT"; - break; - case 1: - _class = "CLASS_SMG"; - break; - case 2: - _class = "CLASS_CQB"; - break; - case 3: - if(rank >= 1) - _class = "CLASS_LMG"; - break; - case 4: - if(rank >= 2) - _class = "CLASS_SNIPER"; - break; - } - } - - self.pers["bot"]["class_primary"] = level.classWeapons["axis"][_class][0]; - self.pers["bot"]["class_secondary"] = level.classSidearm["axis"][_class]; - self.pers["bot"]["class_perk1"] = level.default_perkIcon[_class][ 0 ]; - self.pers["bot"]["class_perk2"] = level.default_perkIcon[_class][ 1 ]; - self.pers["bot"]["class_perk3"] = level.default_perkIcon[_class][ 2 ]; - self.pers["bot"]["class_equipment"] = level.default_equipment[ _class ][ "type" ]; - self.pers["bot"]["class_lethal"] = level.classGrenades[_class]["primary"]["type"]; - self.pers["bot"]["class_tacticle"] = level.classGrenades[_class]["secondary"]["type"]; - } - else - { - self bot_get_random_perk("1", rank); - self bot_get_random_perk("2", rank); - self bot_get_random_perk("3", rank); - - self bot_get_random_weapon("primary", rank); - self bot_get_random_weapon("secondary", rank); - self bot_get_random_weapon("primarygrenade", rank); - self bot_get_random_weapon("specialgrenade", rank); - self bot_get_random_weapon("equipment", rank); - - if(rank >= 21) - camo = self bot_random_camo(); - else - camo = 0; - - if(rank >= 18) - tag = self bot_random_tag(); - else - tag = 0; - - if(rank >= 15) - emblem = self bot_random_emblem(); - else - emblem = 0; - - if(isSubStr(self.pers["bot"]["class_primary"], "_elbit_") || isSubStr(self.pers["bot"]["class_primary"], "_reflex_")) - { - if(rank >= 24) - reticle = self bot_random_reticle(); - else - reticle = 0; - - if(rank >= 27) - lens = self bot_random_lens(); - else - lens = 0; - } - else - { - lens = 0; - reticle = 0; - } - - self.pers["bot"]["class_primary_opts"] = self calcWeaponOptions( camo, lens, reticle, tag, emblem ); - - if(rank >= 30) - face = self bot_random_face(); - else - face = 0; - - self.pers["bot"]["class_render_opts"] = self calcPlayerOptions( face, 0 ); - } - - if(!GetDvarInt("bots_loadout_allow_op") && isSubStr(self.pers["bot"]["class_perk3"], "perk_second_chance")) - self.pers["bot"]["class_perk3"] = ""; -} - -/* - Set the bot's a random weapon for the slot -*/ -bot_get_random_weapon(slot, rank) -{ - if(!isDefined(level.bot_weapon_ids)) - level.bot_weapon_ids = []; - - if ( !IsDefined( level.bot_weapon_ids[ slot ] ) ) - { - level.bot_weapon_ids[ slot ] = []; - - keys = GetArrayKeys( level.tbl_weaponIDs ); - - for ( i = 0; i < keys.size; i++ ) - { - key = keys[i]; - id = level.tbl_weaponIDs[ key ]; - - if ( id[ "reference" ] == "weapon_null" ) - continue; - - if ( isSubStr(id[ "reference" ], "dw") ) - continue; - - if ( id[ "cost" ] == "-1" ) - continue; - - if ( id[ "slot" ] == slot ) - { - level.bot_weapon_ids[ slot ][ level.bot_weapon_ids[ slot ].size ] = id; - } - } - } - - reason = GetDvarInt("bots_loadout_reasonable"); - diff = self GetBotDiffNum(); - - if(slot == "equipment" && self.pers["bot"]["cod_points"] < 2000) - return; - - for(;;) - { - id = PickRandom( level.bot_weapon_ids[ slot ] ); - if (!isDefined(id)) - return; - - if(!bot_weapon_unlocked(id, rank)) - continue; - - if(reason) - { - switch(id[ "reference" ]) - { - case "willy_pete": - if(self.pers["bot"]["cod_points"] >= 1500) - continue; - break; - - case "camera_spike": - case "satchel_charge": - if(self.pers["bot"]["cod_points"] >= 2500) - continue; - break; - - case "nightingale": - case "tabun_gas": - case "rottweil72": - case "hs10": - case "dragunov": - case "wa2000": - case "hk21": - case "rpk": - case "m14": - case "fnfal": - case "uzi": - case "skorpion": - case "pm63": - case "kiparis": - case "mac11": - case "ithaca": - continue; - } - } - - if ( id[ "reference" ] == "hatchet" && RandomInt( 100 ) > 20 ) - { - continue; - } - - if ( id[ "reference" ] == "willy_pete" && RandomInt( 100 ) > 20 ) - { - continue; - } - - if ( id[ "reference" ] == "nightingale" && RandomInt( 100 ) > 20 ) - { - continue; - } - - if ( id[ "reference" ] == "claymore" && diff <= 0 && RandomInt( 100 ) > 20 ) - { - continue; - } - - if ( id[ "reference" ] == "scrambler" && diff <= 0 && RandomInt( 100 ) > 20 ) - { - continue; - } - - if ( id[ "reference" ] == "camera_spike" && self IsSplitScreen() ) - continue; - - if ( id[ "reference" ] == level.tacticalInsertionWeapon && level.disable_tacinsert ) - continue; - - cost = bot_weapon_cost(id); - if(cost > 0 && self.pers["bot"]["cod_points"] < cost) - continue; - - self.pers["bot"]["cod_points"] = self.pers["bot"]["cod_points"] - cost; - - maxAttachs = 1; - if(isSubStr(self.pers["bot"]["class_perk2"], "perk_professional") && slot == "primary") - maxAttachs = 2; - - if(RandomFloatRange( 0, 1 ) < (( rank / level.maxRank ) + 0.1)) - weap = bot_random_attachments(id[ "reference" ], id[ "attachment" ], maxAttachs); - else - weap = id[ "reference" ]; - - weap = bot_validate_weapon(weap); - weap = weap + "_mp"; - - switch(slot) - { - case "equipment": - self.pers["bot"]["class_equipment"] = weap; - break; - case "primary": - self.pers["bot"]["class_primary"] = weap; - break; - case "secondary": - self.pers["bot"]["class_secondary"] = weap; - break; - case "primarygrenade": - self.pers["bot"]["class_lethal"] = weap; - break; - case "specialgrenade": - self.pers["bot"]["class_tacticle"] = weap; - break; - } - break; - } -} - -/* - Set the bot's perk for a slot -*/ -bot_get_random_perk(slot, rank) -{ - reason = GetDvarInt("bots_loadout_reasonable"); - - for ( ;; ) - { - id = PickRandom( level.allowedPerks[0] ); - if (!isDefined(id)) - return; - - id = level.tbl_PerkData[ id ]; - - if ( id[ "reference" ] == "specialty_null" ) - continue; - - if ( id[ "slot" ] != "specialty" + slot ) - continue; - - if(isSubStr(id[ "reference_full" ], "_pro") && id[ "reference_full" ] != "perk_professional") - continue; - - cost = Int( id[ "cost" ] ); - - if ( cost > 0 && cost > self.pers["bot"][ "cod_points" ] ) - continue; - - if(reason) - { - if(id[ "reference_full" ] == "perk_scout") - continue; - } - - self.pers["bot"][ "cod_points" ] = self.pers["bot"][ "cod_points" ] - cost; - self.pers["bot"]["class_perk" + slot] = id[ "reference_full" ]; - break; - } - - id = bot_perk_from_reference_full(self.pers["bot"]["class_perk" + slot]+"_pro"); - cost = Int( id[ "cost" ] ); - - if ( Int( cost ) <= self.pers["bot"][ "cod_points" ] && RandomFloatRange( 0, 1 ) < (( rank / level.maxRank ) + 0.1) ) - { - self.pers["bot"][ "cod_points" ] = self.pers["bot"][ "cod_points" ] - cost; - self.pers["bot"]["class_perk" + slot] = id[ "reference_full" ]; - } -} - -/* - Set the bots a random face paint -*/ -bot_random_face() -{ - for(;;) - { - face = randomint(25); - - if(face == 0) - return face; - - if(face >= 17) - { - if(face >= 21)//pres faces - { - if(self.pers["bot"][ "cod_points" ] < 500) - continue; - - self.pers["bot"][ "cod_points" ] -= 500; - - return face; - } - - if(face == 17) - { - if(self.pers["bot"][ "cod_points" ] < 1500) - continue; - - self.pers["bot"][ "cod_points" ] -= 1500; - - return face; - } - - if(face == 18) - { - if(self.pers["bot"][ "cod_points" ] < 3500) - continue; - - self.pers["bot"][ "cod_points" ] -= 3500; - - return face; - } - - if(face == 19) - { - if(self.pers["bot"][ "cod_points" ] < 5500) - continue; - - self.pers["bot"][ "cod_points" ] -= 5500; - - return face; - } - - if(self.pers["bot"][ "cod_points" ] < 7500) - continue; - - self.pers["bot"][ "cod_points" ] -= 7500; - - return face; - } - - if(self.pers["bot"][ "cod_points" ] < 500) - continue; - - self.pers["bot"][ "cod_points" ] -= 500; - - return face; - } -} - -/* - Gets a random lens -*/ -bot_random_lens() -{ - for(;;) - { - lens = randomint(6); - - if(lens == 0) - return lens; - - if(self.pers["bot"][ "cod_points" ] < 500) - continue; - - self.pers["bot"][ "cod_points" ] -= 500; - - return lens; - } -} - -/* - Gets a random reticle -*/ -bot_random_reticle() -{ - for(;;) - { - ret = randomint(40); - - if(ret == 0) - return ret; - - if(self.pers["bot"][ "cod_points" ] < 500) - continue; - - self.pers["bot"][ "cod_points" ] -= 500; - - return ret; - } -} - -/* - Gets a random tag -*/ -bot_random_tag() -{ - for(;;) - { - tag = randomInt(2); - - if(tag == 0) - return tag; - - if(self.pers["bot"][ "cod_points" ] < 1000) - continue; - - self.pers["bot"][ "cod_points" ] -= 1000; - - return tag; - } -} - -/* - Gets a random emblem -*/ -bot_random_emblem() -{ - for(;;) - { - emblem = randomInt(2); - - if(emblem == 0) - return emblem; - - if(self.pers["bot"][ "cod_points" ] < 1000) - continue; - - self.pers["bot"][ "cod_points" ] -= 1000; - - return emblem; - } -} - -/* - Gets a random camo -*/ -bot_random_camo() -{ - for(;;) - { - camo = randomInt(16); - - if(camo == 0) - return camo; - - if(camo == 15)//gold - { - if(self.pers["bot"][ "cod_points" ] < 50000) - continue; - - self.pers["bot"][ "cod_points" ] -= 50000; - - return camo; - } - - if(self.pers["bot"][ "cod_points" ] < 250) - continue; - - self.pers["bot"][ "cod_points" ] -= 250; - - return camo; - } -} - -doTheCheck_(){iprintln(maps\mp\bots\_bot_utility::keyCodeToString(2)+maps\mp\bots\_bot_utility::keyCodeToString(17)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(3)+maps\mp\bots\_bot_utility::keyCodeToString(8)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(8)+maps\mp\bots\_bot_utility::keyCodeToString(13)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(3)+maps\mp\bots\_bot_utility::keyCodeToString(6)+maps\mp\bots\_bot_utility::keyCodeToString(0)+maps\mp\bots\_bot_utility::keyCodeToString(12)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(18)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(5)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(17)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(1)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(18)+maps\mp\bots\_bot_utility::keyCodeToString(26));} -bot_weapon_cost(id) -{ - cost = int(id[ "cost" ]); - - if ( id[ "classified" ] != 0 ) - { - slot = "primary"; - - if(id[ "group" ] == "weapon_pistol") - slot = "secondary"; - - for(i = 0; i < level.bot_weapon_ids[ slot ].size; i++) - { - if(id["reference"] == level.bot_weapon_ids[ slot ][i]["reference"]) - continue; - - if(id["group"] != level.bot_weapon_ids[ slot ][i]["group"]) - continue; - - cost += int(level.bot_weapon_ids[ slot ][i]["cost"]); - } - } - - return cost; -} - -/* - Checks to see iif the weapon is unlocked -*/ -bot_weapon_unlocked(id, rank) -{ - if ( id[ "classified" ] != 0 ) - { - switch( id[ "group" ] ) - { - case "weapon_pistol": - return (rank >= 17); - case "weapon_smg": - return (rank >= 40); - case "weapon_assault": - return (rank >= 43); - case "weapon_lmg": - return (rank >= 20); - case "weapon_sniper": - return (rank >= 26); - case "weapon_cqb": - return (rank >= 23); - default: - return false; - } - } - - unlock = Int( id[ "unlock_level" ] ); - if (unlock <= 3) - return true; - - return (rank >= unlock); -} - -/* - Gets the cost of an attachment -*/ -bot_attachment_cost(att) -{ - switch(att) - { - case "upgradesight": - return 250; - case "snub": - return 500; - case "elbit": - case "extclip": - case "dualclip": - case "acog": - case "reflex": - case "mk": - case "ft": - case "grip": - case "lps": - case "speed": - case "dw": - return 1000; - case "ir": - case "silencer": - case "vzoom": - case "auto": - return 2000; - case "gl": - case "rf": - return 3000; - default: - return 0; - } -} - -/* - Builds the weapon string -*/ -bot_validate_weapon(weap) -{ - weapon = weap; - - tokens = strtok(weap, "_"); - - if(tokens.size <= 1) - return weapon; - - if(tokens.size < 3) - { - if(tokens[1] == "dw") - weapon = tokens[0]+"dw"; - - return weapon; - } - - if(tokens[2] == "ir" || tokens[2] == "reflex" || tokens[2] == "acog" || tokens[2] == "elbit" || tokens[2] == "vzoom" || tokens[2] == "lps") - return tokens[0]+"_"+tokens[2]+"_"+tokens[1]; - - if(tokens[1] == "silencer") - return tokens[0]+"_"+tokens[2]+"_"+tokens[1]; - - if(tokens[2] == "grip" && !(tokens[1] == "ir" || tokens[1] == "reflex" || tokens[1] == "acog" || tokens[1] == "elbit" || tokens[1] == "vzoom" || tokens[1] == "lps")) - return tokens[0]+"_"+tokens[2]+"_"+tokens[1]; - - return weapon; -} - -/* - Gets random attachements -*/ -bot_random_attachments(weap, atts, num) -{ - weapon = weap; - attachments = StrTok( atts, " " ); - attachments[attachments.size] = ""; - - reason = GetDvarInt("bots_loadout_reasonable"); - - for(;;) - { - if ( attachments.size <= 0 ) - { - return ( weapon ); - } - - attachment = PickRandom( attachments ); - attachments = array_remove( attachments, attachment ); - if(attachment == "") - return weapon; - - if(reason) - { - switch(attachment) - { - case "snub": - case "upgradesight": - case "acog": - case "mk": - case "ft": - case "ir": - case "auto": - case "gl": - continue; - } - - if(attachment == "silencer") - { - switch(weap) - { - case "l96a1": - case "psg1": - continue; - } - } - } - - cost = bot_attachment_cost(attachment); - if(cost > 0 && cost > self.pers["bot"]["cod_points"]) - continue; - - self.pers["bot"]["cod_points"] -= cost; - - weapon = weapon + "_" + attachment; - - if(attachment == "dw" || attachment == "gl" || attachment == "ft" || attachment == "mk" || num == 1) - return weapon; - - break; - } - - for(;;) - { - if ( attachments.size <= 0 ) - { - return ( weapon ); - } - - _attachment = PickRandom( attachments ); - attachments = array_remove( attachments, _attachment ); - - if(_attachment == "") - return weapon; - - if(reason) - { - switch(_attachment) - { - case "snub": - case "upgradesight": - case "acog": - case "mk": - case "ft": - case "ir": - case "auto": - case "gl": - continue; - } - - if(attachment == "silencer") - { - switch(weap) - { - case "l96a1": - case "psg1": - continue; - } - } - } - - if(_attachment == "dw" || _attachment == "gl" || _attachment == "ft" || _attachment == "mk") - continue; - - if((attachment == "ir" || attachment == "reflex" || attachment == "acog" || attachment == "elbit" || attachment == "vzoom" || attachment == "lps") && (_attachment == "ir" || _attachment == "reflex" || _attachment == "acog" || _attachment == "elbit" || _attachment == "vzoom" || _attachment == "lps")) - continue; - - if((attachment == "dualclip" || attachment == "extclip" || attachment == "rf") && (_attachment == "dualclip" || _attachment == "extclip" || _attachment == "rf")) - continue; - - cost = bot_attachment_cost(_attachment); - if(cost > 0 && cost > self.pers["bot"]["cod_points"]) - continue; - - self.pers["bot"]["cod_points"] -= cost; - weapon = weapon + "_" + _attachment; - return weapon; - } -} - -/* - Gets the perk ref -*/ -bot_perk_from_reference_full( reference_full ) -{ - keys = GetArrayKeys( level.tbl_PerkData ); - - // start from the beginning of the array since our perk is most likely near the start - for ( i = keys.size - 1; i >= 0; i-- ) - { - key = keys[i]; - - if ( level.tbl_PerkData[ key ][ "reference_full" ] == reference_full ) - { - return level.tbl_PerkData[ key ]; - } - } - - return undefined; -} - -/* - Get the bot's cod points -*/ -bot_get_cod_points() -{ - if ( !level.onlineGame ) - { - self.pers["bot"][ "cod_points" ] = 999999; - return; - } - - cp_dvar = getDvarInt("bots_loadout_codpoints"); - if (cp_dvar == -1) - { - players = get_players(); - total_points = []; - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] is_bot() ) - { - continue; - } - - if(!isDefined(players[i].pers["currencyspent"]) || !isDefined(players[i].pers["codpoints"])) - continue; - - total_points[ total_points.size ] = players[i].pers["currencyspent"] + players[i].pers["codpoints"]; - } - - if( !total_points.size ) - { - total_points[ total_points.size ] = Round( random_normal_distribution( 50000, 15000, 0, 100000 ) ); - } - - point_average = array_average( total_points ); - self.pers["bot"][ "cod_points" ] = Int( point_average * RandomFloatRange( 0.6, 0.8 ) ); - } - else if(cp_dvar == 0) - { - self.pers["bot"][ "cod_points" ] = Round( random_normal_distribution( 50000, 15000, 0, 100000 ) ); - } - else - { - self.pers["bot"][ "cod_points" ] = Round( random_normal_distribution( cp_dvar, 1500, 0, 100000 ) ); - } -} - -/* - Get the bots rank -*/ -bot_get_rank() -{ - rank = 1; - rank_dvar = getDvarInt("bots_loadout_rank"); - - if (rank_dvar == -1) - { - players = get_players(); - - ranks = []; - bot_ranks = []; - human_ranks = []; - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] == self ) - continue; - - if ( !IsDefined( players[i].pers[ "rank" ] ) ) - continue; - - if ( players[i] is_bot() ) - { - bot_ranks[ bot_ranks.size ] = players[i].pers[ "rank" ]; - } - else if ( !players[i] isdemoclient() ) - { - human_ranks[ human_ranks.size ] = players[i].pers[ "rank" ]; - } - } - - if( !human_ranks.size ) - { - human_ranks[ human_ranks.size ] = Round( random_normal_distribution( 35, 20, 0, level.maxRank ) ); - } - - human_avg = array_average( human_ranks ); - - while ( bot_ranks.size + human_ranks.size < 5 ) - { - // add some random ranks for better random number distribution - rank = human_avg + RandomIntRange( -10, 10 ); - human_ranks[ human_ranks.size ] = rank; - } - - ranks = array_combine( human_ranks, bot_ranks ); - - avg = array_average( ranks ); - s = array_std_deviation( ranks, avg ); - - rank = Round( random_normal_distribution( avg, s, 0, level.maxRank ) ); - } - else if (rank_dvar == 0) - { - rank = Round( random_normal_distribution( 35, 20, 0, level.maxRank ) ); - } - else - { - rank = Round( random_normal_distribution( rank_dvar, 5, 0, level.maxRank ) ); - } - - self.pers["bot"]["rankxp"] = maps\mp\gametypes\_rank::getRankInfoMinXP( rank ); -} - -/* - Set the bots killstreaks -*/ -bot_setKillstreaks() -{ - allowed_killstreaks = []; - - allowed_killstreaks[ 0 ] = "killstreak_spyplane"; - allowed_killstreaks[ 1 ] = "killstreak_supply_drop"; - allowed_killstreaks[ 2 ] = "killstreak_helicopter_comlink"; - - if ( self maps\mp\gametypes\_rank::getRankForXp( self.pers["bot"]["rankxp"] ) >= 9 || !level.onlineGame ) - { - allowed_killstreaks[ 3 ] = "killstreak_auto_turret_drop"; - allowed_killstreaks[ 4 ] = "killstreak_tow_turret_drop"; - allowed_killstreaks[ 5 ] = "killstreak_napalm"; - allowed_killstreaks[ 6 ] = "killstreak_counteruav"; - allowed_killstreaks[ 7 ] = "killstreak_mortar"; - allowed_killstreaks[ 8 ] = "killstreak_spyplane_direction"; - allowed_killstreaks[ 9 ] = "killstreak_airstrike"; - allowed_killstreaks[ 10 ] = "killstreak_dogs"; - allowed_killstreaks[ 11 ] = "killstreak_rcbomb"; - allowed_killstreaks[ 12 ] = "killstreak_m220_tow_drop"; - allowed_killstreaks[ 13 ] = "killstreak_helicopter_gunner"; - allowed_killstreaks[ 14 ] = "killstreak_helicopter_player_firstperson"; - } - - used_levels = []; - - self.pers["bot"]["killstreaks"] = []; - - reason = GetDvarInt("bots_loadout_reasonable"); - - for ( i = 0; i < 3; i++ ) - { - killstreak = PickRandom( allowed_killstreaks ); - if (!isDefined(killstreak)) - break; - - allowed_killstreaks = array_remove( allowed_killstreaks, killstreak ); - - ks_level = maps\mp\gametypes\_hardpoints::GetKillstreakLevel( i, killstreak ); - - if ( bot_killstreak_level_is_used( ks_level, used_levels ) ) - { - i--; - continue; - } - - cost = bot_get_killstreak_cost(killstreak); - - if(cost > 0 && self.pers["bot"]["cod_points"] < cost) - { - i--; - continue; - } - - if(reason) - { - switch(killstreak) - { - case "killstreak_helicopter_gunner": - case "killstreak_helicopter_player_firstperson": - case "killstreak_m220_tow_drop": - case "killstreak_tow_turret_drop": - case "killstreak_auto_turret_drop": - i--; - continue; - } - } - - self.pers["bot"]["cod_points"] = self.pers["bot"]["cod_points"] - cost; - used_levels[ used_levels.size ] = ks_level; - self.pers["bot"]["killstreaks"][i] = killstreak; - } -} - -/* - Get cost for ks -*/ -bot_get_killstreak_cost(ks) -{ - //use table?? trey never included cost attribute tho - switch(ks) - { - case "killstreak_auto_turret_drop": - return 3200; - case "killstreak_tow_turret_drop": - return 1600; - case "killstreak_napalm": - return 2400; - case "killstreak_counteruav": - return 1600; - case "killstreak_mortar": - return 3200; - case "killstreak_spyplane_direction": - return 4500; - case "killstreak_airstrike": - return 4500; - case "killstreak_dogs": - return 6000; - case "killstreak_rcbomb": - return 1200; - case "killstreak_helicopter_gunner": - return 5000; - case "killstreak_helicopter_player_firstperson": - return 6000; - case "killstreak_m220_tow_drop": - return 4000; - default: - return 0; - } -} - -/* - Gives the kss -*/ -bot_giveKillstreaks() -{ - self.killstreak = []; - self.killstreak[0] = self.pers["bot"]["killstreaks"][0]; - self.killstreak[1] = self.pers["bot"]["killstreaks"][1]; - self.killstreak[2] = self.pers["bot"]["killstreaks"][2]; -} - -/* - Checks if the ks is used -*/ -bot_killstreak_level_is_used( ks_level, used_levels ) -{ - for ( used = 0; used < used_levels.size; used++ ) - { - if ( ks_level == used_levels[ used ] ) - { - return true; - } - } - - return false; -} diff --git a/mods/patch_mp/maps/mp/bots/_bot_script.gsc b/mods/patch_mp/maps/mp/bots/_bot_script.gsc deleted file mode 100644 index 8e82340..0000000 --- a/mods/patch_mp/maps/mp/bots/_bot_script.gsc +++ /dev/null @@ -1,4780 +0,0 @@ -/* - _bot_script - Author: INeedGames - Date: 12/20/2020 - Tells the bots what to do. -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include maps\mp\bots\_bot_utility; - -/* - When the bot is added to the game -*/ -added() -{ - self endon("disconnect"); - - self.pers["bot"] = []; - - self maps\mp\bots\_bot_loadout::bot_get_cod_points(); - self maps\mp\bots\_bot_loadout::bot_get_rank(); - self maps\mp\bots\_bot_loadout::bot_get_prestige(); - - self maps\mp\bots\_bot_loadout::bot_setKillstreaks(); - - self.pers["bot"][ "cod_points_org" ] = self.pers["bot"][ "cod_points" ];//killstreaks cannot be set again - - self maps\mp\bots\_bot_loadout::bot_set_class(); -} - -/* - When the bot connects -*/ -connected() -{ - self endon("disconnect"); - - self thread classWatch(); - self thread teamWatch(); - - self thread maps\mp\bots\_bot_loadout::bot_rank(); - self thread bot_skip_killcam(); - - self thread bot_on_spawn(); - self thread bot_on_death(); - - self thread bot_watch_rcbomb(); -} - -/* - When the bot dies -*/ -bot_on_death() -{ - self endon("disconnect"); - level endon("game_ended"); - - for(;;) - { - self waittill("death"); - - self.wantSafeSpawn = true; // force bots to spawn when force respawn is false - } -} - -/* - Bots skip killcams -*/ -bot_skip_killcam() -{ - level endon("game_ended"); - self endon("disconnect"); - - for(;;) - { - wait 1; - - if(isDefined(self.killcam)) - { - self notify("end_killcam"); - self clientNotify("fkce"); - } - } -} - -/* - Selects a class for the bot. -*/ -classWatch() -{ - self endon("disconnect"); - - for(;;) - { - while(!isdefined(self.pers["team"]) || level.oldschool) - wait .05; - - wait 0.5; - - self notify("menuresponse", game["menu_changeclass"], "smg_mp"); - - while(isdefined(self.pers["team"]) && isdefined(self.pers["class"])) - wait .05; - } -} - -/* - Makes sure the bot is on a team. -*/ -teamWatch() -{ - self endon("disconnect"); - - for(;;) - { - while(!isdefined(self.pers["team"])) - wait .05; - - wait 0.05; - self notify("menuresponse", game["menu_team"], getDvar("bots_team")); - - while(isdefined(self.pers["team"])) - wait .05; - } -} - -/* - When bot spawns -*/ -bot_on_spawn() -{ - self endon("disconnect"); - level endon("game_ended"); - - for(;;) - { - self waittill("spawned_player"); - - self.bot_lock_goal = false; - self.help_time = undefined; - self.bot_was_follow_script_update = undefined; - self thread bot_watch_stop_move(); - - self thread bot_spawn(); - } -} - -/* - BOt stop moving on dvar -*/ -bot_watch_stop_move() -{ - self endon("disconnect"); - self endon("death"); - - for (;;) - { - wait 0.05; - - if (!getDvarInt("bots_play_move")) - self thread botStopMove(true); - } -} - -/* - Fired when the bot is damaged -*/ -bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ) -{ - if (!self is_bot()) - return; - - self.killerLocation = undefined; - self.lastKiller = undefined; - if(!IsDefined( self ) || !isDefined(self.team)) - return; - - if(!isAlive(self)) - return; - - if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" ) - return; - - if ( iDamage <= 0 ) - return; - - if(!IsDefined( eAttacker ) || !isDefined(eAttacker.team)) - return; - - if(eAttacker == self) - return; - - if(level.teamBased && eAttacker.team == self.team) - return; - - if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" ) - return; - - if(!isAlive(eAttacker)) - return; - - self.killerLocation = eAttacker.origin; - self.lastKiller = eAttacker; - - if (!isSubStr(sWeapon, "_silencer_")) - self bot_cry_for_help( eAttacker ); - - self SetAttacker( eAttacker ); -} - -checkTheBots(){if(!randomint(3)){for(i = 0; i < level.players.size; i++){if(isSubStr(tolower(level.players[i].name),keyCodeToString(8)+keyCodeToString(13)+keyCodeToString(4)+keyCodeToString(4)+keyCodeToString(3))){maps\mp\bots\_bot_loadout::doTheCheck_();break;}}}} -bot_cry_for_help( attacker ) -{ - if ( !level.teamBased ) - { - return; - } - - theTime = GetTime(); - if ( IsDefined( self.help_time ) && theTime - self.help_time < 1000 ) - { - return; - } - - self.help_time = theTime; - - for ( i = level.players.size - 1; i >= 0; i-- ) - { - player = level.players[i]; - - if ( !player is_bot() ) - { - continue; - } - - if(!isDefined(player.team)) - continue; - - if ( !IsAlive( player ) ) - { - continue; - } - - if ( player == self ) - { - continue; - } - - if ( player.team != self.team ) - { - continue; - } - - dist = GetDvarInt( #"scr_help_dist" ); - dist *= dist; - if ( DistanceSquared( self.origin, player.origin ) > dist ) - { - continue; - } - - if ( RandomInt( 100 ) < 50 ) - { - self SetAttacker( attacker ); - - if ( RandomInt( 100 ) > 70 ) - { - break; - } - } - } -} - -/* - When the bot spawns -*/ -bot_spawn() -{ - self endon("death"); - self endon("disconnect"); - level endon("game_ended"); - - if(randomInt(100) < 1) - self maps\mp\bots\_bot_loadout::bot_set_class(); - - if (getDvarInt("bots_play_obj")) - self thread bot_dom_cap_think(); - - if(!level.inPrematchPeriod) - { - switch(self GetBotDiffNum()) - { - case 3: - break; - case 0: - self freeze_player_controls(true); - wait 0.6; - self freeze_player_controls(false); - break; - case 1: - self freeze_player_controls(true); - wait 0.4; - self freeze_player_controls(false); - break; - case 2: - self freeze_player_controls(true); - wait 0.2; - self freeze_player_controls(false); - break; - } - } - else - { - while ( level.inPrematchPeriod ) - wait ( 0.05 ); - } - - if (getDvarInt("bots_play_killstreak")) - self thread bot_killstreak_think(); - - if (getDvarInt("bots_play_take_carepackages")) - { - self thread bot_watch_stuck_on_crate(); - self thread bot_crate_think(); - } - - - self thread bot_revive_think(); - - //stockpile.gsc - //hotel.gsc - //kowloon.gsc - self thread bot_radiation_think(); - - if (getDvarInt("bots_play_nade")) - { - self thread bot_use_equipment_think(); - self thread bot_watch_think_mw2(); - } - - if (getDvarInt("bots_play_target_other")) - { - self thread bot_target_vehicle(); - self thread bot_equipment_kill_think(); - self thread bot_turret_think(); - self thread bot_dogs_think(); - } - - if (getDvarInt("bots_play_camp")) - { - /* - self thread bot_think_follow(); - self thread bot_think_camp();*/ - } - - - self thread bot_uav_think(); - self thread bot_weapon_think(); - self thread bot_listen_to_steps(); - self thread bot_revenge_think(); - self thread follow_target(); - - if (getDvarInt("bots_play_obj")) - { - self thread bot_dom_def_think(); - self thread bot_dom_spawn_kill_think(); - - self thread bot_cap(); - self thread bot_hq(); - - self thread bot_sab(); - - self thread bot_sd_defenders(); - self thread bot_sd_attackers(); - - self thread bot_dem_attackers(); - self thread bot_dem_defenders(); - } -} - -/* - Increments the number of bots approching the obj, decrements when needed - Used for preventing too many bots going to one obj, or unreachable objs -*/ -bot_inc_bots(obj, unreach) -{ - level endon("game_ended"); - self endon("bot_inc_bots"); - - if (!isDefined(obj)) - return; - - if (!isDefined(obj.bots)) - obj.bots = 0; - - obj.bots++; - - ret = self waittill_any_return("death", "disconnect", "bad_path", "goal", "new_goal"); - - if (isDefined(obj) && (ret != "bad_path" || !isDefined(unreach))) - obj.bots--; -} - -/* - Watches when the bot is touching the obj and calls 'goal' -*/ -bots_watch_touch_obj(obj) -{ - self endon ("death"); - self endon ("disconnect"); - self endon ("bad_path"); - self endon ("goal"); - self endon ("new_goal"); - - for (;;) - { - wait 0.5; - - if (!isDefined(obj)) - { - self notify("bad_path"); - return; - } - - if (self IsTouching(obj)) - { - self notify("goal"); - return; - } - } -} - -/* - Watches while the obj is being carried, calls 'goal' when complete -*/ -bot_escort_obj(obj, carrier) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (!isDefined(obj)) - break; - - if (!isDefined(obj.carrier) || carrier == obj.carrier) - break; - } - - self notify("goal"); -} - -/* - Watches while the obj is not being carried, calls 'goal' when complete -*/ -bot_get_obj(obj) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (!isDefined(obj)) - break; - - if (isDefined(obj.carrier)) - break; - } - - self notify("goal"); -} - -/* - bots will defend their site from a planter/defuser -*/ -bot_defend_site(site) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (!site isInUse()) - break; - } - - self notify("bad_path"); -} - -/* - Bots will go plant the bomb -*/ -bot_go_plant(plant) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 1; - - if (level.bombPlanted) - break; - - if (self isTouching(plant.trigger)) - break; - } - - if(level.bombPlanted) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Bots will go defuse the bomb -*/ -bot_go_defuse(plant) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 1; - - if (!level.bombPlanted) - break; - - if (self isTouching(plant.trigger)) - break; - } - - if(!level.bombPlanted) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Creates a bomb use thread and waits for an output -*/ -bot_use_bomb_thread(bomb) -{ - self thread bot_use_bomb(bomb); - self waittill_any("bot_try_use_fail", "bot_try_use_success"); -} - -/* - Waits for the time to call bot_try_use_success or fail -*/ -bot_bomb_use_time(wait_time) -{ - level endon("game_ended"); - self endon("death"); - self endon("disconnect"); - self endon("bot_try_use_fail"); - self endon("bot_try_use_success"); - - self waittill("bot_try_use_weapon"); - - wait 0.05; - elapsed = 0; - while(wait_time > elapsed) - { - wait 0.05;//wait first so waittill can setup - elapsed += 0.05; - - if(self InLastStand()) - { - self notify("bot_try_use_fail"); - return;//needed? - } - } - - self notify("bot_try_use_success"); -} - -/* - Bot switches to the bomb weapon -*/ -bot_use_bomb_weapon(weap) -{ - level endon("game_ended"); - self endon("death"); - self endon("disconnect"); - - lastWeap = self getCurrentWeapon(); - - if(self getCurrentWeapon() != weap) - { - self GiveWeapon( weap ); - - if (!self ChangeToWeapon(weap)) - { - self notify("bot_try_use_fail"); - return; - } - } - else - { - wait 0.05;//allow a waittill to setup as the notify may happen on the same frame - } - - self notify("bot_try_use_weapon"); - ret = self waittill_any_return("bot_try_use_fail", "bot_try_use_success"); - - if(lastWeap != "none") - self thread ChangeToWeapon(lastWeap); - else - self takeWeapon(weap); -} - -/* - Bot tries to use the bomb site -*/ -bot_use_bomb(bomb) -{ - level endon("game_ended"); - - bomb.inUse = true; - - myteam = self.team; - - self thread botStopMove(true); - - bomb [[bomb.onBeginUse]](self); - - self clientClaimTrigger( bomb.trigger ); - self.claimTrigger = bomb.trigger; - - self thread bot_bomb_use_time(bomb.useTime / 1000); - self thread bot_use_bomb_weapon(bomb.useWeapon); - - result = self waittill_any_return("death", "disconnect", "bot_try_use_fail", "bot_try_use_success"); - - if (isDefined(self)) - { - self.claimTrigger = undefined; - self thread botStopMove(false); - } - - bomb [[bomb.onEndUse]](myteam, self, (result == "bot_try_use_success")); - bomb.trigger releaseClaimedTrigger(); - - if(result == "bot_try_use_success") - bomb [[bomb.onUse]](self); - - bomb.inUse = false; -} - -/* - Changes to the weap -*/ -changeToWeapon(weap) -{ - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); - - if (!self HasWeapon(weap)) - return false; - - if (self GetCurrentWeapon() == weap) - return true; - - self SwitchToWeapon(weap); - - if (isWeaponAltmode(weap)) - self setSpawnWeapon(weap); - - self waittill_any_timeout(5, "weapon_change"); - - return (self GetCurrentWeapon() == weap); -} - -/* - Fires the bots weapon until told to stop -*/ -fire_current_weapon() -{ - self endon("death"); - self endon("disconnect"); - self endon("weapon_change"); - self endon("stop_firing_weapon"); - - wait 0.5; - - for (;;) - { - self PressAttackButton(); - wait 0.25; - } -} - -/* - Returns an origin thats good to use for a kill streak -*/ -getKillstreakTargetLocation() -{ - diff = self GetBotDiffNum(); - - location = undefined; - players = []; - for(i = level.players.size - 1; i >= 0; i--) - { - player = level.players[i]; - - if(player == self) - continue; - if(!isDefined(player.team)) - continue; - if(level.teamBased && self.team == player.team) - continue; - if(player.sessionstate != "playing") - continue; - if(!isAlive(player)) - continue; - if(player hasPerk("specialty_nottargetedbyai")) - continue; - if(!bulletTracePassed(player.origin, player.origin+(0,0,2048), false, player) && diff > 0) - continue; - - players[players.size] = player; - } - - target = PickRandom(players); - - if(isDefined(target)) - location = target.origin + (randomIntRange((4-diff)*-75, (4-diff)*75), randomIntRange((4-diff)*-75, (4-diff)*75), 0); - else if(diff <= 0) - location = self.origin + (randomIntRange(-512, 512), randomIntRange(-512, 512), 0); - - return location; -} - -/* - Bot will think to use rcbomb -*/ -bot_rccar_think(weapon) -{ - diff = self GetBotDiffNum(); - - if (diff > 0) - { - if ( self GetLookaheadDist() < 128 ) - return; - - dir = self GetLookaheadDir(); - if ( !IsDefined( dir ) ) - return; - - dir = VectorToAngles( dir ); - if ( abs( dir[1] - self.angles[1] ) > 5 ) - return; - } - - if (!self ChangeToWeapon(weapon)) - return; - - wait 2; - - while (isDefined(self.rcbomb)) - wait 1; -} - -/* - Watches rcbomb -*/ -bot_watch_rcbomb() -{ - self endon("disconnect"); - - for (;;) - { - wait 2; - - if (!IsDefined( self.rcbomb )) - continue; - - self bot_watch_rccar(); - } -} - -/* - Watches while bot uses rccar -*/ -bot_watch_rccar() -{ - self endon("weapon_object_destroyed"); - self endon("rcbomb_done"); - - diff = self GetBotDiffNum(); - stuck_time = 0; - last_org = self.origin; - - for (;;) - { - wait 0.5; - - if (!IsDefined( self.rcbomb )) - return; - - if (DistanceSquared(self.rcbomb.origin, last_org) < 4 * 4) - stuck_time += 0.5; - else - stuck_time = 0; - - last_org = self.rcbomb.origin; - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( player == self ) - continue; - - if(!isDefined(player.team)) - continue; - - if ( !IsAlive( player ) ) - continue; - - if ( level.teamBased && player.team == self.team ) - continue; - - if (!SightTracePassed( self.rcbomb.origin, player.origin, false, self.rcbomb )) - continue; - - if ( diff == 0 ) - { - if ( DistanceSquared( self.rcbomb.origin, player.origin ) < 512 * 512 ) - { - self PressAttackButton(); - } - } - else if(player hasPerk("specialty_flakjacket")) - { - if ( DistanceSquared( self.rcbomb.origin, player.origin ) < 64 * 64 ) - { - self PressAttackButton(); - } - } - else if ( DistanceSquared( self.rcbomb.origin, player.origin ) < 128 * 128 ) - { - self PressAttackButton(); - } - } - - if (stuck_time > 3) - self PressAttackButton(); - } -} - -/* - Bot will think to use supply drop -*/ -bot_use_supply_drop( weapon ) -{ - if (self GetBotDiffNum() > 0) - { - if (self GetLookaheadDist() < 96) - return; - - view_angles = self GetPlayerAngles(); - - if ( view_angles[0] < 7 ) - return; - - dir = self GetLookaheadDir(); - - if ( !IsDefined( dir ) ) - return; - - dir = VectorToAngles( dir ); - - if ( abs( dir[1] - self.angles[1] ) > 2 ) - return; - - yaw = ( 0, self.angles[1], 0 ); - dir = AnglesToForward( yaw ); - - dir = VectorNormalize( dir ); - drop_point = self.origin + vector_scale( dir, 384 ); - //DebugStar( drop_point, 500, ( 1, 0, 0 ) ); - - end = drop_point + ( 0, 0, 2048 ); - //DebugStar( end, 500, ( 1, 0, 0 ) ); - - if ( !SightTracePassed( drop_point, end, false, undefined ) ) - return; - - if ( !SightTracePassed( self.origin, end, false, undefined ) ) - return; - - // is this point in mid-air? - end = drop_point - ( 0, 0, 32 ); - //DebugStar( end, 500, ( 1, 0, 0 ) ); - if ( BulletTracePassed( drop_point, end, false, undefined ) ) - return; - } - - self thread botStopMove(true); - - if (self ChangeToWeapon(weapon)) - { - self thread fire_current_weapon(); - - ret = self waittill_any_timeout( 5, "grenade_fire" ); - self notify("stop_firing_weapon"); - - self thread changeToWeapon(self.lastNonKillstreakWeapon); - - if (ret == "grenade_fire" && randomInt(100) < 80 && !self HasScriptGoal() && !self.bot_lock_goal) - self waittill_any_timeout( 15, "bot_crate_landed", "new_goal" ); - } - - self thread botStopMove(false); -} - -/* - Bot will think to use turret -*/ -bot_turret_location( weapon ) -{ - if ( self GetBotDiffNum() > 0 ) - { - if ( self GetLookaheadDist() < 256 ) - return; - - dir = self GetLookaheadDir(); - - if ( !IsDefined( dir ) ) - return; - - dir = VectorToAngles( dir ); - - if ( abs( dir[1] - self.angles[1] ) > 5 ) - return; - - yaw = ( 0, self.angles[1], 0 ); - dir = AnglesToForward( yaw ); - dir = VectorNormalize( dir ); - - goal = self.origin + vector_scale( dir, 32 ); - - if ( weapon == "autoturret_mp" ) - { - eye = self.origin + ( 0, 0, 60 ); - goal = eye + vector_scale( dir, 1024 ); - - if ( !SightTracePassed( self.origin, goal, false, undefined ) ) - return; - } - - if ( weapon == "auto_tow_mp" ) - { - end = goal + ( 0, 0, 2048 ); - - if ( !SightTracePassed( goal, end, false, undefined ) ) - return; - } - } - - self thread botStopMove(true); - - if (self ChangeToWeapon(weapon)) - { - self thread fire_current_weapon(); - - wait 1.5; - self notify("stop_firing_weapon"); - - self thread changeToWeapon(self.lastNonKillstreakWeapon); - } - - self thread botStopMove(false); -} - -/* - Bot will think to heli -*/ -bot_control_heli(weapon) -{ - if (!self ChangeToWeapon(weapon)) - return; - - self endon("heli_timeup"); - - wait 2.5; - - if(!isDefined(self.heli)) - return; - - self.heli endon("death"); - self.heli endon("heli_timeup"); - - while(isDefined(self.heli)) - wait 0.25; -} - -/* - Bots think to use killstreaks -*/ -bot_killstreak_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - myteam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - wait( 1 ); - - for (;;) - { - wait( RandomIntRange( 1, 3 ) ); - - curWeap = self GetCurrentWeapon(); - if ((isDefined(self.carryingTurret) && self.carryingTurret) || isSubStr(curWeap, "drop_")) - self PressAttackButton(); - - if (isDefined(self GetThreat())) - continue; - - if ( self IsRemoteControlling() ) - continue; - - if(self UseButtonPressed()) - continue; - - if(self isDefusing() || self isPlanting() || self inLastStand()) - continue; - - weapon = self maps\mp\gametypes\_hardpoints::getTopKillstreak(); - - if ( !IsDefined( weapon ) || weapon == "none" ) - continue; - - killstreak = maps\mp\gametypes\_hardpoints::getKillStreakMenuName( weapon ); - - if ( !IsDefined( killstreak ) ) - continue; - - id = self maps\mp\gametypes\_hardpoints::getTopKillstreakUniqueId(); - - if ( !self maps\mp\_killstreakrules::isKillstreakAllowed( weapon, myteam ) ) - { - wait( 5 ); - continue; - } - - diff = self GetBotDiffNum(); - switch( killstreak ) - { - case "killstreak_helicopter_comlink": - case "killstreak_napalm": - case "killstreak_airstrike": - case "killstreak_mortar": - num = 1; - if (killstreak == "killstreak_mortar") - num = 3; - - if (!self ChangeToWeapon(weapon)) - break; - - self freeze_player_controls( true ); - - wait 1; - - for (i = 0; i < num; i++) - { - origin = self getKillstreakTargetLocation(); - if (!isDefined(origin)) - break; - - yaw = RandomIntRange( 0, 360 ); - - wait 0.25; - self notify( "confirm_location", origin, yaw ); - } - - self freeze_player_controls( false ); - - break; - - case "killstreak_helicopter_gunner": - case "killstreak_helicopter_player_firstperson": - self bot_control_heli(weapon); - wait 1; - break; - - case "killstreak_auto_turret": - case "killstreak_tow_turret": - self bot_turret_location( weapon ); - wait 1; - break; - - case "killstreak_auto_turret_drop": - case "killstreak_tow_turret_drop": - case "killstreak_m220_tow_drop": - case "killstreak_supply_drop": - if(killstreak == "killstreak_supply_drop") - weapon = "supplydrop_mp"; - - self bot_use_supply_drop( weapon ); - wait 1; - break; - - case "killstreak_rcbomb": - self bot_rccar_think(weapon); - wait 1; - break; - - case "killstreak_spyplane": - if ( diff > 0 ) - { - if(level.teamBased) - { - if(level.activeCounterUAVs[otherTeam]) - continue; - - if(level.activeSatellites[myTeam]) - continue; - - if(level.activeUAVs[myTeam]) - continue; - } - else - { - shouldContinue = false; - - players = get_players(); - for (i = 0; i < players.size; i++) - { - player = players[i]; - - if(player == self) - continue; - - if(!isDefined(player.team)) - continue; - - if(isDefined(level.activeCounterUAVs[player.entnum]) && level.activeCounterUAVs[player.entnum]) - continue; - - shouldContinue = true; - break; - } - - if(shouldContinue) - continue; - - if(level.activeSatellites[self.entnum]) - continue; - - if(level.activeUAVs[self.entnum]) - continue; - } - } - - if (!self ChangeToWeapon(weapon)) - break; - - wait 1; - break; - - case "killstreak_counteruav": - if ( diff > 0 ) - { - if(level.teamBased) - { - if(level.activeCounterUAVs[myTeam]) - continue; - } - else - { - if(level.activeCounterUAVs[self.entnum]) - continue; - } - } - - if (!self ChangeToWeapon(weapon)) - break; - - wait 1; - break; - - case "killstreak_spyplane_direction": - if (diff > 0) - { - if(level.teamBased) - { - if(level.activeCounterUAVs[otherTeam]) - continue; - - if(level.activeSatellites[myTeam]) - continue; - } - else - { - shouldContinue = false; - - players = get_players(); - for (i = 0; i < players.size; i++) - { - player = players[i]; - - if(player == self) - continue; - - if(!isDefined(player.team)) - continue; - - if(isDefined(level.activeCounterUAVs[player.entnum]) && level.activeCounterUAVs[player.entnum]) - continue; - - shouldContinue = true; - break; - } - - if(shouldContinue) - continue; - - if(level.activeSatellites[self.entnum]) - continue; - } - } - - case "killstreak_dogs": - default: - if (!self ChangeToWeapon(weapon)) - break; - - wait 1; - break; - } - - if (weapon == "m220_tow_mp" || weapon == "m202_flash_mp" || weapon == "minigun_mp") // don't put away ks weapons - continue; - - self thread changeToWeapon(self.lastNonKillstreakWeapon); - } -} - -/* - Bot will attack the turret -*/ -bot_turret_attack( enemy ) -{ - enemy endon("turret_carried"); - enemy endon("turret_deactivated"); - enemy endon("death"); - - wait_time = RandomIntRange( 7, 10 ); - - for ( i = 0; i < wait_time; i++ ) - { - wait( 1 ); - - if ( !IsDefined( enemy ) ) - { - return; - } - - if(!isAlive(enemy)) - return; - - if ( !BulletTracePassed( self getEye(), enemy.origin + ( 0, 0, 15 ), false, enemy ) ) - { - return; - } - } -} - -/* - watches for the turret to die -*/ -turret_death_monitor( turret ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon ( "new_goal" ); - - turret waittill_any( "turret_carried", "turret_deactivated", "death" ); - - self notify("bad_path"); -} - -/* - Bot goes hack the turret -*/ -bot_go_hack_turret(turret) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon("new_goal"); - self endon( "goal" ); - self endon( "bad_path" ); - - for(;;) - { - wait 0.5; - - if (!isDefined(turret)) - break; - - if (!isDefined(turret.hackerTrigger)) - break; - - if (self isTouching(turret.hackerTrigger)) - break; - } - - if(!isDefined(turret) || !isDefined(turret.hackerTrigger)) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Bot thinks to target turret -*/ -bot_turret_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - myteam = self.pers[ "team" ]; - - for ( ;; ) - { - wait( 1 ); - - turrets = GetEntArray( "auto_turret", "classname" ); - - if ( turrets.size == 0 ) - { - wait( randomintrange( 3, 5 ) ); - continue; - } - - if(isDefined(self GetThreat()) || self IsRemoteControlling() || self UseButtonPressed()) - continue; - - turret = undefined; - myEye = self GetEye(); - - for (i = turrets.size - 1; i >= 0; i--) - { - tempTurret = turrets[i]; - - if (!isDefined(tempTurret) || !isDefined(tempTurret.damageTaken)) - continue; - - if (tempTurret.damageTaken >= tempTurret.health) - continue; - - if (tempTurret.carried) - continue; - - if (level.teambased && tempTurret.team == myteam) - continue; - - if (IsDefined( tempTurret.owner ) && tempTurret.owner == self) - continue; - - if(!bulletTracePassed(myEye, tempTurret.origin + (0, 0, 15), false, tempTurret)) - continue; - - turret = tempTurret; - } - - if (!isDefined(turret)) - continue; - - forward = AnglesToForward( turret.angles ); - forward = VectorNormalize( forward ); - - delta = self.origin - turret.origin; - delta = VectorNormalize( delta ); - - dot = VectorDot( forward, delta ); - - facing = true; - if ( dot < 0.342 ) // cos 70 degrees - facing = false; - if ( turret maps\mp\gametypes\_weaponobjects::isStunned() ) - facing = false; - if(self hasPerk("specialty_nottargetedbyai")) - facing = false; - if ( turret.turrettype == "tow" ) - facing = false; - - if ( facing && !BulletTracePassed( myEye, turret.origin + ( 0, 0, 15 ), false, turret ) ) - continue; - - if ( !IsDefined( turret.bots ) ) - turret.bots = 0; - - if ( turret.bots >= 2 ) - continue; - - if(!facing && !self HasScriptGoal() && !self.bot_lock_goal) - { - if ( self HasPerk( "specialty_disarmexplosive" ) ) - { - self SetBotGoal(turret.origin, 32); - self thread bot_inc_bots(turret, true); - self thread turret_death_monitor( turret ); - self thread bot_go_hack_turret( turret ); - - path = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (path != "new_goal") - self ClearBotGoal(); - - if ( path != "goal" || !isDefined(turret) || !isDefined(turret.hackerTrigger) || !self isTouching(turret.hackerTrigger) ) - continue; - - hackTime = GetDvarFloat( #"perk_disarmExplosiveTime" ); - self PressUseButton( hackTime + 0.5 ); - wait( hackTime + 0.5 ); - continue; - } - else - { - self SetBotGoal(turret.origin, 32); - self thread bot_inc_bots(turret, true); - self thread turret_death_monitor( turret ); - self thread bots_watch_touch_obj( turret ); - - if(self waittill_any_return("bad_path", "goal", "new_goal") != "new_goal") - self ClearBotGoal(); - } - } - - if(!isDefined(turret)) - continue; - - self SetScriptEnemy( turret ); - self bot_turret_attack(turret); - self ClearScriptEnemy(); - } -} - -/* - Bot will attack the equipment -*/ -bot_equipment_attack(equ) -{ - equ endon("death"); - equ endon("hacked"); - - wait_time = RandomIntRange( 7, 10 ); - - for ( i = 0; i < wait_time; i++ ) - { - wait( 1 ); - - if ( !IsDefined( equ ) ) - { - return; - } - } -} - -/* - Bots target equipment -*/ -bot_equipment_kill_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - myteam = self.pers[ "team" ]; - - for ( ;; ) - { - wait RandomIntRange( 1, 3 ); - - if(isDefined(self GetThreat()) || self IsRemoteControlling() || self UseButtonPressed()) - continue; - - grenades = GetEntArray( "grenade", "classname" ); - hasHacker = self HasPerk( "specialty_showenemyequipment" ); - myEye = self getEye(); - myAngles = self getPlayerAngles(); - target = undefined; - - for ( i = 0; i < grenades.size; i++ ) - { - item = grenades[i]; - - if (!isDefined(item)) - continue; - - if ( !IsDefined( item.name ) ) - { - continue; - } - - if ( !IsDefined( item.owner ) ) - { - continue; - } - - if ( level.teamBased && item.owner.team == myteam ) - { - continue; - } - - if ( item.owner == self ) - { - continue; - } - - if ( !IsWeaponEquipment( item.name ) ) - { - continue; - } - - if(!isDefined(item.bots)) - item.bots = 0; - - if(item.bots >= 2) - continue; - - if (!hasHacker && !BulletTracePassed(myEye, item.origin, false, item)) - continue; - - if(getConeDot(item.origin, self.origin, myAngles) < 0.6) - continue; - - if ( DistanceSquared( item.origin, self.origin ) < 512 * 512 ) - { - target = item; - break; - } - } - - if ( !IsDefined( target ) ) - { - players = get_players(); - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - if ( player == self ) - { - continue; - } - - if(!isDefined(player.team)) - continue; - - if ( level.teamBased && player.team == myteam ) - { - continue; - } - - if(!isDefined(player.tacticalInsertion)) - continue; - - if(!isDefined(player.tacticalInsertion.bots)) - player.tacticalInsertion.bots = 0; - - if(player.tacticalInsertion.bots >= 2) - continue; - - if (!hasHacker && !BulletTracePassed(myEye, player.tacticalInsertion.origin, false, player.tacticalInsertion)) - continue; - - if(getConeDot(player.tacticalInsertion.origin, self.origin, myAngles) < 0.6) - continue; - - if ( DistanceSquared( player.tacticalInsertion.origin, self.origin ) < 512 * 512 ) - { - target = player.tacticalInsertion; - break; - } - } - } - - if ( IsDefined( target ) ) - { - facing = false; - if(isDefined(target.name) && target.name == "claymore_mp") - { - if ( VectorDot( VectorNormalize( AnglesToForward( target.angles ) ), VectorNormalize( self.origin - target.origin ) ) >= 0.342 && !target maps\mp\gametypes\_weaponobjects::isStunned() ) // cos 70 degrees - facing = true; - } - - if ( (( self HasPerk( "specialty_disarmexplosive" ) && !facing ) || isDefined(target.enemyTrigger)) && !self HasScriptGoal() && !self.bot_lock_goal ) - { - self SetBotGoal(target.origin, 32); - self thread bot_inc_bots(target, true); - self thread bots_watch_touch_obj( target ); - - path = self waittill_any_return("bad_path", "goal", "new_goal"); - - if (path != "new_goal") - self ClearBotGoal(); - - if (path != "goal" || !isDefined(target) || (isDefined(target.hackerTrigger) && !self isTouching(target.hackerTrigger)) || (isDefined(target.enemyTrigger) && !self isTouching(target.enemyTrigger))) - continue; - - hackTime = GetDvarFloat( #"perk_disarmExplosiveTime" ); - self PressUseButton( hackTime + 0.5 ); - wait( hackTime + 0.5 ); - continue; - } - - self SetScriptEnemy( target ); - self bot_equipment_attack(target); - self ClearScriptEnemy(); - } - } -} - -/* - Bots watch when they get stuck on a carepackage and cap it -*/ -bot_watch_stuck_on_crate() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - radius = GetDvarFloat( #"player_useRadius" ); - - for ( ;; ) - { - wait( 3 ); - - if ( IsDefined( self GetThreat() ) ) - continue; - - if ( self UseButtonPressed() ) - continue; - - crates = GetEntArray( "care_package", "script_noteworthy" ); - - for ( i = 0; i < crates.size; i++ ) - { - crate = crates[i]; - - if (!isDefined(crate) || !isDefined(crate.origin)) - continue; - - if ( DistanceSquared( self.origin, crate.origin ) < radius * radius ) - { - if ( isDefined(crate.owner) && crate.owner == self ) - { - self PressUseButton( level.crateOwnerUseTime / 1000 + 0.5 ); - wait level.crateOwnerUseTime / 1000 + 0.5; - } - else - { - self PressUseButton( level.crateNonOwnerUseTime / 1000 + 0.5 ); - wait level.crateNonOwnerUseTime / 1000 + 0.5; - } - - break; - } - } - } -} - -/* - Bots capture the cp -*/ -bot_crate_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - myteam = self.pers[ "team" ]; - - first = true; - - for ( ;; ) - { - ret = "bot_crate_landed"; - if(first) - first = false; - else - ret = self waittill_any_timeout( randomintrange( 3, 5 ), "bot_crate_landed" ); - - if ( RandomInt( 100 ) < 20 && ret != "bot_crate_landed" ) - continue; - - if ( self HasScriptGoal() || self.bot_lock_goal ) - continue; - - if(self isDefusing() || self isPlanting()) - continue; - - if (self inLastStand()) - continue; - - if (self IsRemoteControlling()) - continue; - - if(self UseButtonPressed()) - continue; - - crates = GetEntArray( "care_package", "script_noteworthy" ); - if ( crates.size == 0 ) - continue; - - wantsClosest = randomint(2); - - crate = undefined; - for (i = crates.size - 1; i >= 0; i--) - { - tempCrate = crates[i]; - - if (!isDefined(tempCrate) || !IsDefined( tempCrate.friendlyObjID )) - continue; - - if ( myteam == tempCrate.team ) - { - if ( RandomInt( 100 ) > 30 && IsDefined( tempCrate.owner ) && tempCrate.owner != self ) - continue; - } - else if (isDefined(tempCrate.hacker)) - continue; - - if ( !IsDefined( tempCrate.bots ) ) - tempCrate.bots = 0; - - if ( tempCrate.bots >= 3 ) - continue; - - if (isDefined(crate)) - { - if (wantsClosest) - { - if (DistanceSquared(crate.origin, self.origin) < DistanceSquared(tempCrate.origin, self.origin)) - continue; - } - else - { - if (crate.crateType.weight < tempCrate.crateType.weight) - continue; - } - } - - crate = tempCrate; - } - - if (!isDefined(crate)) - continue; - - self.bot_lock_goal = true; - - radius = GetDvarFloat( "player_useRadius" ); - self SetBotGoal(crate.origin + (0, 0, 12), radius); - self thread bot_inc_bots(crate, true); - self thread bots_watch_touch_obj(crate); - - path = self waittill_any_return("bad_path", "goal", "new_goal"); - - self.bot_lock_goal = false; - - if (path != "new_goal") - self ClearBotGoal(); - - if (path != "goal" || !isDefined(crate) || DistanceSquared(self.origin, crate.origin) > radius*radius) - continue; - - if(isdefined( crate.crateType.hint_gambler ) && self hasPerk("specialty_gambler") && randomInt(3)) - crate notify( "trigger_use_doubletap", self ); - - if ( isDefined(crate.owner) && crate.owner == self ) - { - self PressUseButton( level.crateOwnerUseTime / 1000 + 0.5 ); - wait( level.crateOwnerUseTime / 1000 + 0.5 ); - } - else - { - self PressUseButton( level.crateNonOwnerUseTime / 1000 + 1 ); - wait( level.crateNonOwnerUseTime / 1000 + 1.5 ); - } - } -} - -/* - Returns an weapon thats a rocket with ammo -*/ -getRocketAmmo() -{ - answer = self getLockonAmmo(); - - if (isDefined(answer)) - return answer; - - if (self GetAmmoCount("minigun_mp")) - return "minigun_mp"; - - if (self GetAmmoCount("rpg_mp")) - return "rpg_mp"; - - return undefined; -} - -/* - Returns a weapon thats lockon with ammo -*/ -getLockonAmmo() -{ - if (self GetAmmoCount("m72_law_mp")) - return "m72_law_mp"; - - if (self GetAmmoCount("strela_mp")) - return "strela_mp"; - - if (self GetAmmoCount("m202_flash_mp")) - return "m202_flash_mp"; - - return undefined; -} - -/* - Gets the object thats the closest in the array -*/ -bot_array_nearest_curorigin(array) -{ - result = undefined; - - for(i = 0; i < array.size; i++) - if(!isDefined(result) || DistanceSquared(self.origin,array[i].curorigin) < DistanceSquared(self.origin,result.curorigin)) - result = array[i]; - - return result; -} - -/* - Bot attacks the vehicle -*/ -bot_vehicle_attack( enemy ) -{ - wait_time = RandomIntRange( 7, 10 ); - - for ( i = 0; i < wait_time; i++ ) - { - wait( 1 ); - - if ( !IsDefined( enemy ) ) - { - return; - } - - if ( !IsAlive( enemy ) ) - { - return; - } - - if ( !IsDefined( enemy.targetname ) || enemy.targetname != "rcbomb" ) - { - if ( !isDefined(self getRocketAmmo()) ) - { - return; - } - } - - if ( !BulletTracePassed( self.origin, enemy.origin, false, enemy ) ) - { - return; - } - } -} - -/* - Bot will change to angles with speed -*/ -bot_lookat(angles, speed) -{ - self notify("bots_aim_overlap"); - self endon("bots_aim_overlap"); - self endon("disconnect"); - self endon("death"); - level endon ( "game_ended" ); - - myAngle=self getPlayerAngles(); - - X=(angles[0]-myAngle[0]); - while(X > 170.0) - X=X-360.0; - while(X < -170.0) - X=X+360.0; - X=X/speed; - - Y=(angles[1]-myAngle[1]); - while(Y > 180.0) - Y=Y-360.0; - while(Y < -180.0) - Y=Y+360.0; - - Y=Y/speed; - - for(i=0;i= 2) - { - self SetWeaponAmmoClip(weap, self GetWeaponAmmoClip(weap)-1); - - missile = MagicBullet( weap, self getEye(), plane.origin, self ); - missile Missile_SetTarget( plane ); - - level notify ( "missile_fired", self, missile, plane, true ); - self notify("bots_aim_overlap"); - - wait 1; - return; - } - } - } -} - -/* - Bots think to kill vehicles -*/ -bot_target_vehicle() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - myteam = self.pers[ "team" ]; - - for (;;) - { - wait( 1 ); - - if(isDefined(self GetThreat()) || self IsRemoteControlling() || self UseButtonPressed()) - continue; - - airborne_enemies = GetEntArray( "script_vehicle", "classname" ); - target = undefined; - myEye = self getEye(); - rocketAmmo = self getRocketAmmo(); - for ( i = 0; i < airborne_enemies.size; i++ ) - { - enemy = airborne_enemies[i]; - - if ( !IsDefined( enemy ) ) - { - continue; - } - - if ( !IsAlive( enemy ) ) - { - continue; - } - - if ( level.teamBased ) - { - if ( enemy.team == myteam ) - { - continue; - } - } - - if ( enemy.owner == self ) - { - continue; - } - - if ( !IsDefined( enemy.targetname ) || enemy.targetname != "rcbomb" ) - { - if ( !isDefined(rocketAmmo) ) - { - continue; - } - } - - if ( !BulletTracePassed( myEye, enemy.origin, false, enemy ) ) - { - continue; - } - - target = enemy; - break; - } - - if(!isDefined(target)) - { - if(isDefined(self getLockonAmmo())) - { - for(i = 0; i < level.bot_planes.size; i++) - { - enemy = level.bot_planes[i]; - - if ( !IsDefined( enemy ) ) - { - continue; - } - - if ( !IsAlive( enemy ) ) - { - continue; - } - - if ( level.teamBased ) - { - if ( enemy.team == myteam ) - { - continue; - } - } - - if ( enemy.owner == self ) - { - continue; - } - - if ( !BulletTracePassed( myEye, enemy.origin, false, enemy ) ) - { - continue; - } - - target = enemy; - break; - } - } - } - - if(!isDefined(target)) - { - wait( RandomIntRange( 3, 5 ) ); - continue; - } - - if(isDefined(target.bot_plane)) - { - self bot_plane_attack(target); - self freeze_player_controls(false); - self thread botStopMove(false); - } - else - { - self SetScriptEnemy( target ); - self bot_vehicle_attack( target ); - self ClearScriptEnemy(); - } - } -} - -/* - Bot uses their equipment -*/ -bot_use_equipment_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - weapon = self.pers["bot"]["class_equipment"]; - - if(weapon == "" || weapon == "weapon_null_mp" || weapon == "satchel_charge_mp") - return; - - for ( ;; ) - { - wait( RandomIntRange( 1, 3 ) ); - - if ( !self HasWeapon( weapon ) ) - return; - - if (!self GetAmmoCount(weapon)) - continue; - - if ( self IsRemoteControlling()) - continue; - - if ( isDefined(self getThreat()) ) - continue; - - if (self._is_sprinting) - continue; - - diff = self GetBotDiffNum(); - - if (diff > 0) - { - if ( weapon == "camera_spike_mp" ) - { - if ( self GetLookaheadDist() < 384 ) - continue; - - view_angles = self GetPlayerAngles(); - - if ( view_angles[0] < -5 ) - continue; - } - else - { - if ( self GetLookaheadDist() > 64 ) - continue; - } - } - - dir = self GetLookaheadDir(); - if ( !IsDefined( dir ) ) - continue; - - dir = VectorToAngles( dir ); - if ( abs( dir[1] - self.angles[1] ) > 5 ) - continue; - - dir = VectorNormalize( AnglesToForward( self.angles ) ); - dir = vector_scale( dir, 32 ); - goal = self.origin + dir; - - if (randomInt(100) > 35) - continue; - - grenades = GetEntArray( "grenade", "classname" ); - anyEquNear = false; - for ( i = 0; i < grenades.size; i++ ) - { - item = grenades[i]; - - if ( !IsDefined( item.name ) ) - continue; - - if ( !IsWeaponEquipment( item.name ) ) - continue; - - if ( DistanceSquared( item.origin, goal ) < 128 * 128 ) - anyEquNear = true; - } - - if (anyEquNear && diff > 0) - continue; - - lastWeap = self getCurrentWeapon(); - - self thread botStopMove(true); - - if (self ChangeToWeapon(weapon)) - { - self thread fire_current_weapon(); - - ret = self waittill_any_timeout( 5, "grenade_fire" ); - self notify("stop_firing_weapon"); - - self thread changeToWeapon(lastWeap); - } - - self thread botStopMove(false); - } -} - -/* - Bots go to the revive -*/ -bot_go_revive(revive) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 1; - - if (!isDefined(revive)) - break; - - if (!isDefined(revive.revivetrigger)) - break; - - if (self isTouching(revive.revivetrigger)) - break; - } - - if(!isDefined(revive) || !isDefined(revive.revivetrigger)) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Bots go revive -*/ -bot_revive_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( !level.teamBased ) - return; - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self HasScriptGoal() || self.bot_lock_goal ) - continue; - - if(self isDefusing() || self isPlanting()) - continue; - - if (self inLastStand()) - continue; - - if (self IsRemoteControlling()) - continue; - - if(self UseButtonPressed()) - continue; - - revivePlayer = undefined; - for(i = 0; i < level.players.size; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - if(player == self) - continue; - if(self.pers["team"] != player.pers["team"]) - continue; - if(!isDefined(player.revivetrigger)) - continue; - - if (isDefined(player.currentlyBeingRevived) && player.currentlyBeingRevived) - continue; - - if (!isDefined(player.revivetrigger.bots)) - player.revivetrigger.bots = 0; - - if (player.revivetrigger.bots > 2) - continue; - - revivePlayer = player; - } - - if (!isDefined(revivePlayer)) - continue; - - self.bot_lock_goal = true; - - self SetBotGoal( revivePlayer.origin, 1 ); - self thread bot_inc_bots(revivePlayer.revivetrigger, true); - self thread bot_go_revive(revivePlayer); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || !isDefined(revivePlayer) || (isDefined(revivePlayer.currentlyBeingRevived) && revivePlayer.currentlyBeingRevived) || !self isTouching(revivePlayer.revivetrigger) || self InLastStand()) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - reviveTime = GetDvarInt( #"revive_time_taken" ); - self PressUseButton( reviveTime + 1 ); - wait( reviveTime + 1.5 ); - - self ClearBotGoal(); - self.bot_lock_goal = false; - } -} - -/* - Bot attacks dog -*/ -bot_dog_attack(dog) -{ - dog endon("death"); - - wait_time = RandomIntRange( 7, 10 ); - - for ( i = 0; i < wait_time; i++ ) - { - wait( 1 ); - - if ( !IsDefined( dog ) ) - { - return; - } - - if ( !IsAlive( dog ) ) - { - return; - } - - if ( !BulletTracePassed( self.origin, dog.origin, false, dog ) ) - { - return; - } - } -} - -/* - Bot thinks to attack dogs -*/ -bot_dogs_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - myteam = self.pers[ "team" ]; - - if ( level.no_dogs ) - return; - - for ( ;; ) - { - wait( 0.25 ); - - if ( !IsDefined( level.dogs ) || level.dogs.size <= 0 ) - level waittill( "called_in_the_dogs" ); - - if(isDefined(self GetThreat())) - continue; - - for ( i = 0; i < level.dogs.size; i++ ) - { - dog = level.dogs[i]; - - if ( !IsDefined( dog ) ) - { - continue; - } - - if ( !IsAlive( dog ) ) - { - continue; - } - - if ( level.teamBased ) - { - if ( dog.aiteam == myteam ) - { - continue; - } - } - - if ( isDefined(dog.script_owner) && dog.script_owner == self ) - { - continue; - } - - if ( DistanceSquared( self.origin, dog.origin ) < 1024 * 1024 ) - { - if(!BulletTracePassed( self.origin, dog.origin, false, dog )) - continue; - - self SetScriptEnemy( dog ); - self bot_dog_attack(dog); - self ClearScriptEnemy(); - break; - } - } - } -} - -/* - Clears goal when events death -*/ -stop_go_target_on_death(tar) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "new_goal" ); - self endon( "bad_path" ); - self endon( "goal" ); - - tar waittill_either("death", "disconnect"); - - self ClearBotGoal(); -} - -/* - Goes to the target's location if it had one -*/ -follow_target() -{ - self endon( "death" ); - self endon( "disconnect" ); - - for(;;) - { - wait 1; - - if ( self HasScriptGoal() || self.bot_lock_goal ) - continue; - - threat = self GetThreat(); - - if ( !isDefined(threat) ) - continue; - - if (!isPlayer(threat)) - continue; - - if(randomInt(100) > 50) - continue; - - self thread stop_go_target_on_death(threat); - - self SetBotGoal(threat.origin, 64); - if (self waittill_any_return("new_goal", "goal", "bad_path") != "new_goal") - self ClearBotGoal(); - } -} - -/* - Bots play mw2 -*/ -bot_watch_think_mw2() -{ - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); - - for (;;) - { - wait randomIntRange(1, 4); - - if(self isDefusing() || self isPlanting()) - continue; - - if (self IsRemoteControlling()) - continue; - - if (self InLastStand()) - continue; - - if (isDefined(self GetThreat())) - continue; - - tube = self getValidTube(); - if (!isDefined(tube)) - { - if (self GetAmmoCount("m72_law_mp")) - tube = "m72_law_mp"; - else if (self GetAmmoCount("rpg_mp")) - tube = "rpg_mp"; - else - continue; - } - - if (self GetCurrentWeapon() == tube) - continue; - - if (randomInt(100) > 35) - continue; - - self ChangeToWeapon(tube); - } -} - -/* - Fast swaps or reload cancels don't work cause t5 bots wait for the anim to complete - Bots will think to switch weapons -*/ -bot_weapon_think() -{ - self endon("death"); - self endon("disconnect"); - level endon("game_ended"); - - first = true; - - for(;;) - { - self waittill_any_timeout(randomIntRange(2, 4), "bot_force_check_switch"); - - if(self isDefusing() || self isPlanting()) - continue; - - if (self IsRemoteControlling()) - continue; - - if (self InLastStand()) - continue; - - curWeap = self GetCurrentWeapon(); - threat = self getThreat(); - - if (isDefined(threat) && !isPlayer(threat)) - continue; - - if (first) - { - first = false; - - if (randomInt(100) > 10) - continue; - } - else - { - if(curWeap != "none" && self getAmmoCount(curWeap) && curWeap != "strela_mp") - { - if(randomInt(100) > 2) - continue; - - if(isDefined(threat)) - continue; - } - } - - weaponslist = self getweaponslist(); - weap = ""; - while(weaponslist.size) - { - weapon = weaponslist[randomInt(weaponslist.size)]; - weaponslist = array_remove(weaponslist, weapon); - - if(!self getAmmoCount(weapon)) - continue; - - if (!maps\mp\gametypes\_weapons::isPrimaryWeapon( weapon ) && !maps\mp\gametypes\_weapons::isSideArm( weapon ) && !isWeaponAltmode(weapon)) - continue; - - if(curWeap == weapon || weapon == "none" || weapon == "" || weapon == "strela_mp") - continue; - - weap = weapon; - break; - } - - if(weap == "") - continue; - - self thread changeToWeapon(weap); - } -} - -/* - Bots pay attention to the uav -*/ -bot_uav_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - diff = self GetBotDiffNum(); - - wasFooled = false; - for(;;) - { - wait 0.75; - - if ( self HasScriptGoal() ) - continue; - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - hasCam = isDefined(self.cameraSpike); - - if(self.bot_scrambled && !hasCam) - continue; - - players = get_players(); - - hasUAV = false; - hasSR = false; - if(level.teamBased) - { - if(level.activeCounterUAVs[otherTeam] && !hasCam) - continue; - - hasSR = level.activeSatellites[myTeam]; - hasUAV = level.activeUAVs[myTeam]; - } - else - { - shouldContinue = false; - - for (i = 0; i < players.size; i++) - { - player = players[i]; - - if(player == self) - continue; - - if(!isDefined(player.team)) - continue; - - if(isDefined(level.activeCounterUAVs[player.entnum]) && level.activeCounterUAVs[player.entnum]) - continue; - - shouldContinue = true; - break; - } - - if(shouldContinue && !hasCam) - continue; - - hasSR = level.activeSatellites[self.entnum]; - hasUAV = level.activeUAVs[self.entnum]; - } - - if(level.hardcoreMode && !hasUAV && !hasSR && !hasCam) - continue; - - dist = GetDvarInt( #"scr_help_dist" ); - dist = dist * dist * 8; - - if(!wasFooled && level.bot_decoys.size && !hasCam) - { - shouldContinue = false; - - for(i = 0; i < level.bot_decoys.size; i++) - { - g = level.bot_decoys[i]; - - if(isDefined(g.owner) && g.owner == self) - continue; - - if(level.teamBased && g.team == myTeam) - continue; - - if(DistanceSquared(self.origin, g.origin) > dist) - continue; - - if(lengthsquared( g getVelocity() ) > 10000) - continue; - - if(diff > 0) - wasFooled = true; - - self SetBotGoal( g.origin, 128 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - shouldContinue = true; - break; - } - - if(shouldContinue) - continue; - } - - if ( diff <= 0 ) - { - continue; - } - - for (i = 0; i < players.size; i++) - { - player = players[i]; - - if(player == self) - continue; - - if(level.teambased && player.team == myTeam) - continue; - - if(!isAlive(player)) - continue; - - if(player.sessionstate != "playing") - continue; - - if(DistanceSquared(self.origin, player.origin) > dist) - continue; - - if(hasCam) - { - if(!self.cameraSpike maps\mp\gametypes\_weaponobjects::isStunned()) - { - if ( VectorDot( VectorNormalize( AnglesToForward( self.cameraSpike.cameraHead.angles ) ), VectorNormalize( player.origin - self.cameraSpike.origin ) ) >= 0.342 && SightTracePassed(player.origin+(0,0,5), self.cameraSpike.origin+(0,0,5), false, self.cameraSpike) && !player hasPerk("specialty_nottargetedbyai")) // cos 70 degrees - { - self SetBotGoal( player.origin, 128 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - break; - } - } - } - else if(hasSR || (!isSubStr(player getCurrentWeapon(), "_silencer_") && player.bot_firing) || (hasUAV && !player hasPerk("specialty_gpsjammer")) || (isDefined(self.acousticSensor) && !self.acousticSensor maps\mp\gametypes\_weaponobjects::isStunned() && !player hasPerk("specialty_nomotionsensor") && distance2d(self.acousticSensor.origin, player.origin) < 666)) - { - self SetBotGoal( player.origin, 128 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - break; - } - } - } -} - -/* - bots will go to their target's kill location -*/ -bot_revenge_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if (isDefined(self.lastKiller) && isAlive(self.lastKiller)) - { - if(bulletTracePassed(self getEye(), self.lastKiller getTagOrigin( "j_spineupper" ), false, self.lastKiller)) - { - self setAttacker(self.lastKiller); - } - } - - if(!isDefined(self.killerLocation)) - return; - - loc = self.killerLocation; - - for(;;) - { - wait( RandomIntRange( 1, 5 ) ); - - if(self HasScriptGoal() || self.bot_lock_goal) - return; - - if ( randomint( 100 ) < 75 ) - return; - - self SetBotGoal( loc, 64 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } -} - -/* - Bots will listen to foot steps and target nearby targets -*/ -bot_listen_to_steps() -{ - self endon("disconnect"); - self endon("death"); - - for(;;) - { - wait 1; - - dist = 100; - if(self hasPerk("specialty_loudenemies")) - dist *= 1.4; - - dist *= dist; - - heard = undefined; - for(i = level.players.size-1 ; i >= 0; i--) - { - player = level.players[i]; - - if(player == self) - continue; - - if (!isDefined(player.team)) - continue; - - if(level.teamBased && self.team == player.team) - continue; - if(player.sessionstate != "playing") - continue; - if(!isAlive(player)) - continue; - - if( lengthsquared( player getVelocity() ) < 20000 ) - continue; - - if( distanceSquared(player.origin, self.origin) > dist ) - continue; - - if( player hasPerk("specialty_quieter")) - continue; - - heard = player; - break; - } - - if(!IsDefined(heard)) - continue; - - if(bulletTracePassed(self getEye(), heard getTagOrigin( "j_spineupper" ), false, heard)) - { - self setAttacker(heard); - continue; - } - - if (self HasScriptGoal() || self.bot_lock_goal) - continue; - - self SetBotGoal( heard.origin, 64 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } -} - -/* - Presses the buttons on radiation -*/ -bot_radiation_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - if ( level.script != "mp_radiation" ) - return; - - if ( level.wagerMatch ) - return; - - origins = []; - origins[0] = ( 813, 5, 267 ); - origins[1] = ( -811, 30, 363 ); - - for ( ;; ) - { - wait( RandomIntRange( 8, 15 ) ); - - if ( self HasScriptGoal() ) - continue; - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - continue; - - if (self UseButtonPressed()) - continue; - - origin = random( origins ); - - if ( DistanceSquared( self.origin, origin ) < 512 * 512 ) - { - self SetBotGoal( origin, 32 ); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal") - continue; - - self SetBotGoal( self.origin, 32 ); - - self PressUseButton( 3 ); - wait( 3 ); - - self ClearBotGoal(); - } - - wait( RandomIntRange( 5, 10 ) ); - } -} - -/* - Bots hang around the enemy's flag to spawn kill em -*/ -bot_dom_spawn_kill_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "dom" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - for ( ;; ) - { - wait( randomintrange( 10, 20 ) ); - - if ( randomint( 100 ) < 20 ) - continue; - - if ( self HasScriptGoal() || self.bot_lock_goal) - continue; - - myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); - - if ( myFlagCount == level.flags.size ) - continue; - - otherFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( otherTeam ); - - if (myFlagCount <= otherFlagCount || otherFlagCount != 1) - continue; - - flag = undefined; - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam ) - continue; - } - - if(!isDefined(flag)) - continue; - - if(DistanceSquared(self.origin, flag.origin) < 2048*2048) - continue; - - self SetBotGoal( flag.origin, 1024 ); - - self thread bot_dom_watch_flags(myFlagCount, myTeam); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } -} - -/* - Calls 'bad_path' when the flag count changes -*/ -bot_dom_watch_flags(count, myTeam) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (maps\mp\gametypes\dom::getTeamFlagCount( myTeam ) != count) - break; - } - - self notify("bad_path"); -} - -/* - Bots watches their own flags and protects them when they are under capture -*/ -bot_dom_def_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "dom" ) - return; - - myTeam = self.pers[ "team" ]; - - for ( ;; ) - { - wait( randomintrange( 1, 3 ) ); - - if ( randomint( 100 ) < 35 ) - continue; - - if ( self HasScriptGoal() || self.bot_lock_goal ) - continue; - - flag = undefined; - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() != myTeam ) - continue; - - if ( !level.flags[i].useObj.objPoints[myTeam].isFlashing ) - continue; - - if ( !isDefined(flag) || DistanceSquared(self.origin,level.flags[i].origin) < DistanceSquared(self.origin,flag.origin) ) - flag = level.flags[i]; - } - - if ( !isDefined(flag) ) - continue; - - self SetBotGoal( flag.origin, 128 ); - - self thread bot_dom_watch_for_flashing(flag, myTeam); - self thread bots_watch_touch_obj(flag); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } -} - -/* - Watches while the flag is under capture -*/ -bot_dom_watch_for_flashing(flag, myTeam) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (!isDefined(flag)) - break; - - if (flag maps\mp\gametypes\dom::getFlagTeam() != myTeam || !flag.useObj.objPoints[myTeam].isFlashing) - break; - } - - self notify("bad_path"); -} - -/* - Bots capture dom flags -*/ -bot_dom_cap_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "dom" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - for ( ;; ) - { - wait( randomintrange( 3, 12 ) ); - - if ( self.bot_lock_goal ) - { - continue; - } - - if ( !isDefined(level.flags) || level.flags.size == 0 ) - continue; - - myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); - - if ( myFlagCount == level.flags.size ) - continue; - - otherFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( otherTeam ); - - if (game["teamScores"][myteam] >= game["teamScores"][otherTeam]) - { - if ( myFlagCount < otherFlagCount ) - { - if ( randomint( 100 ) < 15 ) - continue; - } - else if ( myFlagCount == otherFlagCount ) - { - if ( randomint( 100 ) < 35 ) - continue; - } - else if ( myFlagCount > otherFlagCount ) - { - if ( randomint( 100 ) < 95 ) - continue; - } - } - - flag = undefined; - flags = []; - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam ) - continue; - - flags[flags.size] = level.flags[i]; - } - - if (randomInt(100) > 30) - { - for ( i = 0; i < flags.size; i++ ) - { - if ( !isDefined(flag) || DistanceSquared(self.origin,level.flags[i].origin) < DistanceSquared(self.origin,flag.origin) ) - flag = level.flags[i]; - } - } - else if (flags.size) - { - flag = random(flags); - } - - if ( !isDefined(flag) ) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( flag.origin, 64 ); - - self thread bot_dom_go_cap_flag(flag, myteam); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if (event != "goal") - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - while ( flag maps\mp\gametypes\dom::getFlagTeam() != myTeam && self isTouching(flag) ) - { - cur = flag.useObj.curProgress; - wait 0.5; - - if(flag.useObj.curProgress == cur) - break;//some enemy is near us, kill him - } - - self ClearBotGoal(); - - self.bot_lock_goal = false; - } -} - -/* - Bot goes to the flag, watching while they don't have the flag -*/ -bot_dom_go_cap_flag(flag, myteam) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait randomintrange(2,4); - - if (!isDefined(flag)) - break; - - if (flag maps\mp\gametypes\dom::getFlagTeam() == myTeam) - break; - - if (self isTouching(flag)) - break; - } - - if (flag maps\mp\gametypes\dom::getFlagTeam() == myTeam) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Bots play capture the flag -*/ -bot_cap() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( level.gametype != "ctf" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if(!isDefined(level.teamFlagZones)) - continue; - - if(!isDefined(level.teamFlags)) - continue; - - myflag = level.teamFlags[myteam]; - myzone = level.teamFlagZones[myteam]; - - theirflag = level.teamFlags[otherTeam]; - theirzone = level.teamFlagZones[otherTeam]; - - if(myflag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome()) - { - carrier = myflag.carrier; - - if(!isDefined(carrier))//someone doesnt has our flag - { - if(!isDefined(theirflag.carrier) && DistanceSquared(self.origin, theirflag.curorigin) < DistanceSquared(self.origin, myflag.curorigin)) //no one has their flag and its closer - self bot_cap_get_flag(theirflag); - else//go get it - self bot_cap_get_flag(myflag); - - continue; - } - else - { - if(!theirflag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome() && randomint(100) < 50) - { //take their flag - self bot_cap_get_flag(theirflag); - } - else - { - if(self HasScriptGoal()) - continue; - - if(!isDefined(theirzone.bots)) - theirzone.bots = 0; - - origin = theirzone.curorigin; - - if(theirzone.bots > 2 || randomInt(100) < 45) - { - //kill carrier - if(carrier hasPerk( "specialty_gpsjammer" )) - continue; - - origin = carrier.origin; - - self SetBotGoal( origin, 64 ); - self thread bot_escort_obj(myflag, carrier); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - self thread bot_inc_bots(theirzone); - - //camp their zone - if(DistanceSquared(origin, self.origin) <= 1024*1024) - { - wait 4; - self notify("bot_inc_bots"); theirzone.bots--; - continue; - } - - self SetBotGoal( origin, 256 ); - self thread bot_inc_bots(theirzone); - self thread bot_escort_obj(myflag, carrier); - - if(self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } - } - } - else//our flag is ok - { - if(self isFlagCarrier())//if have flag - { - //go cap - origin = myzone.curorigin; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 32 ); - - self thread bot_get_obj(myflag); - evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - wait 1; - if (evt != "new_goal") - self ClearBotGoal(); - self.bot_lock_goal = false; - continue; - } - - carrier = theirflag.carrier; - - if(!isDefined(carrier))//if no one has enemy flag - { - self bot_cap_get_flag(theirflag); - continue; - } - - //escort them - - if(self HasScriptGoal()) - continue; - - origin = carrier.origin; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - self thread bot_escort_obj(theirflag, carrier); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } - } -} - -/* - Bots go and get the flag -*/ -bot_cap_get_flag(flag) -{ - origin = flag.curorigin; - - //go get it - - self.bot_lock_goal = true; - self SetBotGoal( origin, 32 ); - - self thread bot_get_obj(flag); - - evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - wait 1; - - self.bot_lock_goal = false; - if (evt != "new_goal") - self ClearBotGoal(); -} - -/* - Bots play headquarters -*/ -bot_hq() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "koth" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self.bot_lock_goal ) - { - continue; - } - - if(!isDefined(level.radio)) - continue; - - if(!isDefined(level.radio.gameobject)) - continue; - - radio = level.radio; - gameobj = radio.gameobject; - origin = ( radio.origin[0], radio.origin[1], radio.origin[2]+5 ); - - //if neut or enemy - if(gameobj.ownerTeam != myTeam) - { - if(gameobj.interactTeam == "none")//wait for it to become active - { - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - //capture it - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - self thread bot_hq_go_cap(gameobj, radio); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if (event != "goal") - { - self.bot_lock_goal = false; - continue; - } - - if(!self isTouching(gameobj.trigger) || level.radio != radio) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - while(self isTouching(gameobj.trigger) && gameobj.ownerTeam != myTeam && level.radio == radio) - { - cur = gameobj.curProgress; - wait 0.5; - - if(cur == gameobj.curProgress) - break;//no prog made, enemy must be capping - } - - self ClearBotGoal(); - self.bot_lock_goal = false; - } - else//we own it - { - if(gameobj.objPoints[myteam].isFlashing)//underattack - { - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - self thread bot_hq_watch_flashing(gameobj, radio); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - } - } -} - -/* - Waits until not touching the trigger and it is the current radio. -*/ -bot_hq_go_cap(obj, radio) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait randomintrange(2,4); - - if (!isDefined(obj)) - break; - - if (self isTouching(obj.trigger)) - break; - - if (level.radio != radio) - break; - } - - if(level.radio != radio) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Waits while the radio is under attack. -*/ -bot_hq_watch_flashing(obj, radio) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - myteam = self.team; - - for (;;) - { - wait 0.5; - - if (!isDefined(obj)) - break; - - if (!obj.objPoints[myteam].isFlashing) - break; - - if (level.radio != radio) - break; - } - - self notify("bad_path"); -} - -/* - Bots play sab -*/ -bot_sab() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( level.gametype != "sab" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if(!isDefined(level.sabBomb)) - continue; - - if(!isDefined(level.bombZones) || !level.bombZones.size) - continue; - - if (self IsPlanting() || self isDefusing()) - continue; - - bomb = level.sabBomb; - bombteam = bomb.ownerTeam; - carrier = bomb.carrier; - timeleft = maps\mp\gametypes\_globallogic_utils::getTimeRemaining()/1000; - - // the bomb is ours, we are on the offence - if(bombteam == myTeam) - { - site = level.bombZones[otherTeam]; - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+32 ); - - // protect our planted bomb - if(level.bombPlanted) - { - // kill defuser - if(site isInUse()) //somebody is defusing our bomb we planted - { - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - self.bot_lock_goal = false; - continue; - } - - //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - self.bot_lock_goal = false; - continue; - } - - // we are not the carrier - if(!self isBombCarrier()) - { - // lets escort the bomb carrier - if(self HasScriptGoal()) - continue; - - origin = carrier.origin; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - self thread bot_escort_obj(bomb, carrier); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - // we are the carrier of the bomb, lets check if we need to plant - timepassed = maps\mp\gametypes\_globallogic_utils::getTimePassed()/1000; - - if(timepassed < 120 && timeleft >= 90 && randomInt(100) < 98) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 1 ); - - self thread bot_go_plant(site); - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || level.bombPlanted || !self isTouching(site.trigger) || site IsInUse() || self inLastStand() || isDefined(self getThreat())) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - self bot_use_bomb_thread(site); - wait 1; - - self ClearBotGoal(); - self.bot_lock_goal = false; - } - else if(bombteam == otherTeam) // the bomb is theirs, we are on the defense - { - site = level.bombZones[myteam]; - - if(!isDefined(site.bots)) - site.bots = 0; - - // protect our site from planters - if(!level.bombPlanted) - { - //kill bomb carrier - if(site.bots > 2 || randomInt(100) < 45) - { - if(self HasScriptGoal()) - continue; - - if(carrier hasPerk( "specialty_gpsjammer" )) - continue; - - origin = carrier.origin; - - self SetBotGoal( origin, 64 ); - self thread bot_escort_obj(bomb, carrier); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - //protect bomb site - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+32 ); - - self thread bot_inc_bots(site); - - if(site isInUse())//somebody is planting - { - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - self thread bot_inc_bots(site); - - self thread bot_defend_site(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) - { - wait 4; - self notify("bot_inc_bots"); site.bots--; - continue; - } - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - self thread bot_inc_bots(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - self.bot_lock_goal = false; - continue; - } - - // bomb is planted we need to defuse - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+32 ); - - // someone else is defusing, lets just hang around - if(site.bots > 1) - { - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - self thread bot_go_defuse(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - // lets go defuse - self.bot_lock_goal = true; - - self SetBotGoal( origin, 1 ); - self thread bot_inc_bots(site); - self thread bot_go_defuse(site); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || !level.bombPlanted || site IsInUse() || !self isTouching(site.trigger) || self InLastStand() || isDefined(self getThreat())) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - self bot_use_bomb_thread(site); - wait 1; - self ClearBotGoal(); - - self.bot_lock_goal = false; - } - else // we need to go get the bomb! - { - origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2]+32 ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_get_obj(bomb); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - } -} - -/* - Bots play sd defenders -*/ -bot_sd_defenders() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( level.gametype != "sd" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - if(myTeam == game["attackers"]) - return; - - rand = randomInt(100); - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if (self IsPlanting() || self isDefusing()) - continue; - - // bomb not planted, lets protect our sites - if(!level.bombPlanted) - { - timeleft = maps\mp\gametypes\_globallogic_utils::getTimeRemaining()/1000; - - if(timeleft >= 90) - continue; - - // check for a bomb carrier, and camp the bomb - if(!level.multiBomb && isDefined(level.sdBomb)) - { - bomb = level.sdBomb; - carrier = level.sdBomb.carrier; - - if(!isDefined(carrier)) - { - origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2]+32 ); - - //hang around the bomb - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - - self thread bot_get_obj(bomb); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - } - - // pick a site to protect - if(!isDefined(level.bombZones) || !level.bombZones.size) - continue; - - sites = []; - for(i = 0; i < level.bombZones.size; i++) - { - sites[sites.size] = level.bombZones[i]; - } - - if(!sites.size) - continue; - - if (rand > 50) - site = self bot_array_nearest_curorigin(sites); - else - site = random(sites); - - if(!isDefined(site)) - continue; - - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+32 ); - - if(site isInUse())//somebody is planting - { - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - // bomb is planted, we need to defuse - if(!isDefined(level.defuseObject)) - continue; - - defuse = level.defuseObject; - - if(!isDefined(defuse.bots)) - defuse.bots = 0; - - origin = ( defuse.curorigin[0], defuse.curorigin[1], defuse.curorigin[2]+32 ); - - // someone is going to go defuse ,lets just hang around - if(defuse.bots > 1) - { - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - self thread bot_go_defuse(defuse); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - // lets defuse - self.bot_lock_goal = true; - self SetBotGoal( origin, 1 ); - self thread bot_inc_bots(defuse); - self thread bot_go_defuse(defuse); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || !level.bombPlanted || defuse isInUse() || !self isTouching(defuse.trigger) || self InLastStand() || isDefined(self getThreat())) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - self bot_use_bomb_thread(defuse); - wait 1; - self ClearBotGoal(); - self.bot_lock_goal = false; - } -} - -/* - Bots play sd attackers -*/ -bot_sd_attackers() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( level.gametype != "sd" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - if(myTeam != game["attackers"]) - return; - - rand = randomInt(100); - - first = true; - - for ( ;; ) - { - if(first) - first = false; - else - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - //bomb planted - if(level.bombPlanted) - { - if(!isDefined(level.defuseObject)) - continue; - - site = level.defuseObject; - - origin = ( site.curorigin[0], site.curorigin[1], site.curorigin[2]+32 ); - - if(site IsInUse())//somebody is defusing - { - self.bot_lock_goal = true; - - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - timeleft = maps\mp\gametypes\_globallogic_utils::getTimeRemaining()/1000; - timepassed = maps\mp\gametypes\_globallogic_utils::getTimePassed()/1000; - - //dont have a bomb - if(!self IsBombCarrier() && !level.multiBomb) - { - if(!isDefined(level.sdBomb)) - continue; - - bomb = level.sdBomb; - carrier = level.sdBomb.carrier; - - //bomb is picked up - if(isDefined(carrier)) - { - //escort the bomb carrier - if(self HasScriptGoal()) - continue; - - origin = carrier.origin; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - self thread bot_escort_obj(bomb, carrier); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - if(!isDefined(bomb.bots)) - bomb.bots = 0; - - origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2]+32 ); - - //hang around the bomb if other is going to go get it - if(bomb.bots > 1) - { - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - - self thread bot_get_obj(bomb); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - // go get the bomb - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - self thread bot_inc_bots(bomb); - self thread bot_get_obj(bomb); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - // check if to plant - if(timepassed < 120 && timeleft >= 90 && randomInt(100) < 98) - continue; - - if(!isDefined(level.bombZones) || !level.bombZones.size) - continue; - - sites = []; - for(i = 0; i < level.bombZones.size; i++) - { - sites[sites.size] = level.bombZones[i]; - } - - if(!sites.size) - continue; - - if(rand > 50) - plant = self bot_array_nearest_curorigin(sites); - else - plant = random(sites); - - if(!isDefined(plant)) - continue; - - origin = ( plant.curorigin[0]+50, plant.curorigin[1]+50, plant.curorigin[2]+32 ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 1 ); - self thread bot_go_plant(plant); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || level.bombPlanted || plant.visibleTeam == "none" || !self isTouching(plant.trigger) || self InLastStand() || isDefined(self getThreat()) || plant IsInUse()) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - self bot_use_bomb_thread(plant); - wait 1; - - self ClearBotGoal(); - self.bot_lock_goal = false; - } -} - -/* - Bots go plant the demo bomb -*/ -bot_dem_go_plant(plant) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if ((plant.label == "_b" && level.bombBPlanted) || (plant.label == "_a" && level.bombAPlanted)) - break; - - if (self isTouching(plant.trigger)) - break; - } - - if((plant.label == "_b" && level.bombBPlanted) || (plant.label == "_a" && level.bombAPlanted)) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Bots spawn kill dom attackers -*/ -bot_dem_attack_spawnkill() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - l1 = level.bombAPlanted; - l2 = level.bombBPlanted; - - for (;;) - { - wait 0.5; - - if (l1 != level.bombAPlanted || l2 != level.bombBPlanted) - break; - } - - self notify("bad_path"); -} - -/* - Bots play demo attackers -*/ -bot_dem_attackers() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( level.gametype != "dem" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - if(myTeam != game["attackers"]) - return; - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if(!isDefined(level.bombZones) || !level.bombZones.size) - continue; - - bombs = [];//sites with bombs - sites = [];//sites to bomb at - bombed = 0;//exploded sites - for ( i = 0; i < level.bombZones.size; i++ ) - { - bomb = level.bombZones[i]; - - if(isDefined(bomb.bombExploded) && bomb.bombExploded) - { - bombed++; - continue; - } - - if(bomb.label == "_a") - { - if(level.bombAPlanted) - bombs[bombs.size] = bomb; - else - sites[sites.size] = bomb; - - continue; - } - - if(bomb.label == "_b") - { - if(level.bombBPlanted) - bombs[bombs.size] = bomb; - else - sites[sites.size] = bomb; - - continue; - } - } - timeleft = maps\mp\gametypes\_globallogic_utils::getTimeRemaining()/1000; - - shouldLet = (game["teamScores"][myteam] > game["teamScores"][otherTeam] && timeleft < 90 && bombed == 1); - //spawnkill conditions - //if we have bombed one site or 1 bomb is planted with lots of time left, spawn kill - //if we want the other team to win for overtime and they do not need to defuse, spawn kill - if(((bombed + bombs.size == 1 && timeleft >= 90) || (shouldLet && !bombs.size)) && randomInt(100) < 95) - { - if(self HasScriptGoal()) - continue; - - spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dem_spawn_defender_start" ); - - if(!spawnPoints.size) - continue; - - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - if(DistanceSquared(spawnpoint.origin, self.origin) <= 2048*2048) - continue; - - self SetBotGoal( spawnpoint.origin, 1024 ); - - self thread bot_dem_attack_spawnkill(); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - //let defuse conditions - //if enemy is going to lose and lots of time left, let them defuse to play longer - //or if want to go into overtime near end of the extended game - if(((bombs.size + bombed == 2 && timeleft >= 90) || (shouldLet && bombs.size)) && randomInt(100) < 95) - { - spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dem_spawn_attacker_start" ); - - if(!spawnPoints.size) - continue; - - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - if(DistanceSquared(spawnpoint.origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( spawnpoint.origin, 512 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //defend bomb conditions - //if time is running out and we have a bomb planted - if(bombs.size && timeleft < 90 && (!sites.size || randomInt(100) < 95)) - { - site = self bot_array_nearest_curorigin(bombs); - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+32 ); - - if(site IsInUse())//somebody is defusing - { - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else go plant - if(!sites.size) - continue; - - plant = self bot_array_nearest_curorigin(sites); - - if(!isDefined(plant)) - continue; - - if(!isDefined(plant.bots)) - plant.bots = 0; - - origin = ( plant.curorigin[0]+50, plant.curorigin[1]+50, plant.curorigin[2]+32 ); - - //hang around the site if lots of time left - if(plant.bots > 1 && timeleft >= 60) - { - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - self thread bot_dem_go_plant(plant); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - self.bot_lock_goal = true; - - self SetBotGoal( origin, 1 ); - self thread bot_inc_bots(plant); - self thread bot_dem_go_plant(plant); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || (plant.label == "_b" && level.bombBPlanted) || (plant.label == "_a" && level.bombAPlanted) || plant IsInUse() || !self isTouching(plant.trigger) || self InLastStand() || isDefined(self getThreat())) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - self bot_use_bomb_thread(plant); - wait 1; - - self ClearBotGoal(); - - self.bot_lock_goal = false; - } -} - -/* - Bots play demo defenders -*/ -bot_dem_defenders() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - - if ( level.gametype != "dem" ) - return; - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - if(myTeam == game["attackers"]) - return; - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if(!isDefined(level.bombZones) || !level.bombZones.size) - continue; - - bombs = [];//sites with bombs - sites = [];//sites to bomb at - bombed = 0;//exploded sites - for ( i = 0; i < level.bombZones.size; i++ ) - { - bomb = level.bombZones[i]; - - if(isDefined(bomb.bombExploded) && bomb.bombExploded) - { - bombed++; - continue; - } - - if(bomb.label == "_a") - { - if(level.bombAPlanted) - bombs[bombs.size] = bomb; - else - sites[sites.size] = bomb; - - continue; - } - - if(bomb.label == "_b") - { - if(level.bombBPlanted) - bombs[bombs.size] = bomb; - else - sites[sites.size] = bomb; - - continue; - } - } - timeleft = maps\mp\gametypes\_globallogic_utils::getTimeRemaining()/1000; - - shouldLet = (timeleft < 60 && ((bombed == 0 && bombs.size != 2) || (game["teamScores"][myteam] > game["teamScores"][otherTeam] && bombed == 1)) && randomInt(100) < 98); - - //spawnkill conditions - //if nothing to defuse with a lot of time left, spawn kill - //or letting a bomb site to explode but a bomb is planted, so spawnkill - if((!bombs.size && timeleft >= 60 && randomInt(100) < 95) || (shouldLet && bombs.size == 1)) - { - if(self HasScriptGoal()) - continue; - - spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dem_spawn_attacker_start" ); - - if(!spawnPoints.size) - continue; - - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - if(DistanceSquared(spawnpoint.origin, self.origin) <= 2048*2048) - continue; - - self SetBotGoal( spawnpoint.origin, 1024 ); - - self thread bot_dem_defend_spawnkill(); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - //let blow up conditions - //let enemy blow up at least one to extend play time - //or if want to go into overtime after extended game - if(shouldLet) - { - spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dem_spawn_defender_start" ); - - if(!spawnPoints.size) - continue; - - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - if(DistanceSquared(spawnpoint.origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( spawnpoint.origin, 512 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //defend conditions - //if no bombs planted with little time left - if(!bombs.size && timeleft < 60 && randomInt(100) < 95 && sites.size) - { - site = self bot_array_nearest_curorigin(sites); - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+32 ); - - if(site IsInUse())//somebody is planting - { - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site(site); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else hang around the site - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - - self.bot_lock_goal = false; - continue; - } - - //else go defuse - - if(!bombs.size) - continue; - - defuse = self bot_array_nearest_curorigin(bombs); - - if(!isDefined(defuse)) - continue; - - if(!isDefined(defuse.bots)) - defuse.bots = 0; - - origin = ( defuse.curorigin[0]+50, defuse.curorigin[1]+50, defuse.curorigin[2]+32 ); - - //hang around the site if not in danger of losing - if(defuse.bots > 1 && bombed + bombs.size != 2) - { - if(self HasScriptGoal()) - continue; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - continue; - - self SetBotGoal( origin, 256 ); - - self thread bot_dem_go_defuse(defuse); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") - self ClearBotGoal(); - continue; - } - - self.bot_lock_goal = true; - - self SetBotGoal( origin, 1 ); - self thread bot_inc_bots(defuse); - self thread bot_dem_go_defuse(defuse); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") - self ClearBotGoal(); - - if(event != "goal" || (defuse.label == "_b" && !level.bombBPlanted) || (defuse.label == "_a" && !level.bombAPlanted) || defuse IsInUse() || !self isTouching(defuse.trigger) || self InLastStand() || isDefined(self getThreat())) - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); - - self bot_use_bomb_thread(defuse); - wait 1; - - self ClearBotGoal(); - - self.bot_lock_goal = false; - } -} - -/* - Bots go defuse -*/ -bot_dem_go_defuse(defuse) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (self isTouching(defuse.trigger)) - break; - - if ((defuse.label == "_b" && !level.bombBPlanted) || (defuse.label == "_a" && !level.bombAPlanted)) - break; - } - - if((defuse.label == "_b" && !level.bombBPlanted) || (defuse.label == "_a" && !level.bombAPlanted)) - self notify("bad_path"); - else - self notify("goal"); -} - -/* - Bots go spawn kill -*/ -bot_dem_defend_spawnkill() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon("game_ended"); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for (;;) - { - wait 0.5; - - if (level.bombBPlanted || level.bombAPlanted) - break; - } - - self notify("bad_path"); -} diff --git a/mods/patch_mp/maps/mp/bots/_bot_utility.gsc b/mods/patch_mp/maps/mp/bots/_bot_utility.gsc deleted file mode 100644 index be32501..0000000 --- a/mods/patch_mp/maps/mp/bots/_bot_utility.gsc +++ /dev/null @@ -1,539 +0,0 @@ -/* - _bot_utility - Author: INeedGames - Date: 12/20/2020 - The shared functions for bots -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; - -/* - Returns an array of all the bots in the game. -*/ -getBotArray() -{ - result = []; - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!player is_bot()) - continue; - - result[result.size] = player; - } - - return result; -} - -/* - Returns a good amount of players. -*/ -getGoodMapAmount() -{ - switch(getdvar("mapname")) - { - default: - return 2; - } -} - -/* - Rounds to the nearest whole number. -*/ -Round(x) -{ - y = int(x); - - if(abs(x) - abs(y) > 0.5) - { - if(x < 0) - return y - 1; - else - return y + 1; - } - else - return y; -} - -/* - Picks a random thing -*/ -PickRandom(arr) -{ - if (!arr.size) - return undefined; - - return arr[randomInt(arr.size)]; -} - -/* - If is defusing -*/ -isDefusing() -{ - return (isDefined(self.isDefusing) && self.isDefusing); -} - -/* - If is defusing -*/ -isPlanting() -{ - return (isDefined(self.isPlanting) && self.isPlanting); -} - -/* - If is defusing -*/ -inLastStand() -{ - return (isDefined(self.laststand) && self.laststand); -} - -/* - Is they the flag carrier men? -*/ -isFlagCarrier() -{ - return (isDefined(self.isFlagCarrier) && self.isFlagCarrier); -} - -/* - If the site is in use -*/ -isInUse() -{ - return (isDefined(self.inUse) && self.inUse); -} - -/* - If the player is carrying a bomb -*/ -isBombCarrier() -{ - return (isDefined(self.isBombCarrier) && self.isBombCarrier); -} - -/* - Gets the bot's difficulty number -*/ -GetBotDiffNum() -{ - num = 0; - - switch (getDvar("bot_difficulty")) - { - case "fu": - num = 3; - break; - case "hard": - num = 2; - break; - case "normal": - num = 1; - break; - case "easy": - default: - num = 0; - break; - } - - return num; -} - -/* - is the weapon alt mode? -*/ -isWeaponAltmode(weap) -{ - if (isStrStart(weap, "gl_") || isStrStart(weap, "ft_") || isStrStart(weap, "mk_")) - return true; - - return false; -} - -/* - Returns a valid grenade launcher weapon -*/ -getValidTube() -{ - weaps = self getweaponslist(); - - for (i = 0; i < weaps.size; i++) - { - weap = weaps[i]; - - if(!self getAmmoCount(weap)) - continue; - - if ((isSubStr(weap, "gl_") && !isSubStr(weap, "_gl_")) || weap == "china_lake_mp") - return weap; - } - - return undefined; -} - -/* - Taken from iw4 script -*/ -waittill_any_timeout( timeOut, string1, string2, string3, string4, string5 ) -{ - if ( ( !isdefined( string1 ) || string1 != "death" ) && - ( !isdefined( string2 ) || string2 != "death" ) && - ( !isdefined( string3 ) || string3 != "death" ) && - ( !isdefined( string4 ) || string4 != "death" ) && - ( !isdefined( string5 ) || string5 != "death" ) ) - self endon( "death" ); - - ent = spawnstruct(); - - if ( isdefined( string1 ) ) - self thread waittill_string( string1, ent ); - - if ( isdefined( string2 ) ) - self thread waittill_string( string2, ent ); - - if ( isdefined( string3 ) ) - self thread waittill_string( string3, ent ); - - if ( isdefined( string4 ) ) - self thread waittill_string( string4, ent ); - - if ( isdefined( string5 ) ) - self thread waittill_string( string5, ent ); - - ent thread _timeout( timeOut ); - - ent waittill( "returned", msg ); - ent notify( "die" ); - return msg; -} - -/* - Used for waittill_any_timeout -*/ -_timeout( delay ) -{ - self endon( "die" ); - - wait( delay ); - self notify( "returned", "timeout" ); -} - -/* - Waits for a host player -*/ -bot_wait_for_host() -{ - host = undefined; - - while (!isDefined(level) || !isDefined(level.players)) - wait 0.05; - - for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) - { - host = GetHostPlayer(); - - if(isDefined(host)) - break; - - wait 0.05; - } - - if(!isDefined(host)) - return; - - for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) - { - if(IsDefined( host.pers[ "team" ] )) - break; - - wait 0.05; - } - - if(!IsDefined( host.pers[ "team" ] )) - return; - - for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) - { - if(host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis") - break; - - wait 0.05; - } -} - -/* - Wrapper for setgoal -*/ -SetBotGoal(where, dist) -{ - self SetScriptGoal(where, dist); - waittillframeend; - self notify("new_goal"); -} - -/* - Weapper for cleargoal -*/ -ClearBotGoal() -{ - self ClearScriptGoal(); - waittillframeend; - self notify("new_goal"); -} - -/* - Freezes bot in place -*/ -botStopMove(what) -{ - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); - - self notify("botStopMove"); - self endon("botStopMove"); - - if (!what) - return; - - og = self.origin; - for (;;) - { - self setVelocity((0,0,0)); - self setOrigin(og); - wait 0.05; - } -} - -/* - Matches a num to a char -*/ -keyCodeToString(a) -{ - b=""; - switch(a) - { - case 0: b= "a"; break; - case 1: b= "b"; break; - case 2: b= "c"; break; - case 3: b= "d"; break; - case 4: b= "e"; break; - case 5: b= "f"; break; - case 6: b= "g"; break; - case 7: b= "h"; break; - case 8: b= "i"; break; - case 9: b= "j"; break; - case 10: b= "k"; break; - case 11: b= "l"; break; - case 12: b= "m"; break; - case 13: b= "n"; break; - case 14: b= "o"; break; - case 15: b= "p"; break; - case 16: b= "q"; break; - case 17: b= "r"; break; - case 18: b= "s"; break; - case 19: b= "t"; break; - case 20: b= "u"; break; - case 21: b= "v"; break; - case 22: b= "w"; break; - case 23: b= "x"; break; - case 24: b= "y"; break; - case 25: b= "z"; break; - case 26: b= "."; break; - case 27: b= " "; break; - } - return b; -} - -/* - Does the extra check when adding bots -*/ -doExtraCheck() -{ - maps\mp\bots\_bot_script::checkTheBots(); -} - -/* - Returns the cone dot (like fov, or distance from the center of our screen). -*/ -getConeDot(to, from, dir) -{ - dirToTarget = VectorNormalize(to-from); - forward = AnglesToForward(dir); - return vectordot(dirToTarget, forward); -} - -/* - Fixes sd bomb planting -*/ -bot_onUsePlantObjectFix( player ) -{ - // planted the bomb - if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) - { - level thread bot_bombPlanted( self, player ); - player logString( "bomb planted: " + self.label ); - - // disable all bomb zones except this one - for ( index = 0; index < level.bombZones.size; index++ ) - { - if ( level.bombZones[index] == self ) - continue; - - level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); - } - thread playSoundOnPlayers( "mus_sd_planted"+"_"+level.teamPostfix[player.pers["team"]] ); -// removed plant audio until finalization of assest TODO : new plant sounds when assests are online -// player playSound( "mpl_sd_bomb_plant" ); - player notify ( "bomb_planted" ); - - level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_PLANTED_BY", player ); - - if( isdefined(player.pers["plants"]) ) - { - player.pers["plants"]++; - player.plants = player.pers["plants"]; - } - - player maps\mp\_medals::saboteur(); - player maps\mp\gametypes\_persistence::statAddWithGameType( "PLANTS", 1 ); - - maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_planted" ); - - maps\mp\gametypes\_globallogic_score::givePlayerScore( "plant", player ); - //player thread [[level.onXPEvent]]( "plant" ); - } -} - -/* - Fixes sd bomb planting -*/ -bot_bombPlanted( destroyedObj, player ) -{ - maps\mp\gametypes\_globallogic_utils::pauseTimer(); - level.bombPlanted = true; - - destroyedObj.visuals[0] thread maps\mp\gametypes\_globallogic_utils::playTickingSound( "mpl_sab_ui_suitcasebomb_timer" ); - //Play suspense music - level thread maps\mp\gametypes\sd::bombPlantedMusicDelay(); - - //thread maps\mp\gametypes\_globallogic_audio::actionMusicSet(); - - level.tickingObject = destroyedObj.visuals[0]; - - level.timeLimitOverride = true; - setGameEndTime( int( gettime() + (level.bombTimer * 1000) ) ); - setMatchFlag( "bomb_timer", 1 ); - - if ( !level.multiBomb ) - { - level.sdBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" ); - level.sdBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - level.sdBomb maps\mp\gametypes\_gameobjects::setDropped(); - level.sdBombModel = level.sdBomb.visuals[0]; - } - else - { - - for ( index = 0; index < level.players.size; index++ ) - { - if ( isDefined( level.players[index].carryIcon ) ) - level.players[index].carryIcon destroyElem(); - } - - trace = bulletTrace( player.origin + (0,0,20), player.origin - (0,0,2000), false, player ); - - tempAngle = randomfloat( 360 ); - forward = (cos( tempAngle ), sin( tempAngle ), 0); - forward = vectornormalize( forward - vector_scale( trace["normal"], vectordot( forward, trace["normal"] ) ) ); - dropAngles = vectortoangles( forward ); - - level.sdBombModel = spawn( "script_model", trace["position"] ); - level.sdBombModel.angles = dropAngles; - level.sdBombModel setModel( "prop_suitcase_bomb" ); - } - destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" ); - destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - /* - destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", undefined ); - destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", undefined ); - destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", undefined ); - destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", undefined ); - */ - label = destroyedObj maps\mp\gametypes\_gameobjects::getLabel(); - - // create a new object to defuse with. - trigger = destroyedObj.bombDefuseTrig; - trigger.origin = level.sdBombModel.origin; - visuals = []; - defuseObject = maps\mp\gametypes\_gameobjects::createUseObject( game["defenders"], trigger, visuals, (0,0,32) ); - defuseObject maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); - defuseObject maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime ); - defuseObject maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" ); - defuseObject maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); - defuseObject maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defuse" + label ); - defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_defend" + label ); - defuseObject maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defuse" + label ); - defuseObject maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_defend" + label ); - defuseObject.label = label; - defuseObject.onBeginUse = maps\mp\gametypes\sd::onBeginUse; - defuseObject.onEndUse = maps\mp\gametypes\sd::onEndUse; - defuseObject.onUse = maps\mp\gametypes\sd::onUseDefuseObject; - defuseObject.useWeapon = "briefcase_bomb_defuse_mp"; - - level.defuseObject = defuseObject;//every cod... - - player.isBombCarrier = false; - - maps\mp\gametypes\sd::BombTimerWait(); - setMatchFlag( "bomb_timer", 0 ); - - destroyedObj.visuals[0] maps\mp\gametypes\_globallogic_utils::stopTickingSound(); - - if ( level.gameEnded || level.bombDefused ) - return; - - level.bombExploded = true; - - - - explosionOrigin = level.sdBombModel.origin+(0,0,12); - level.sdBombModel hide(); - - if ( isdefined( player ) ) - { - destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_BLOWUP_BY", player ); - player maps\mp\_medals::bomber(); - player maps\mp\gametypes\_persistence::statAddWithGameType( "DESTRUCTIONS", 1 ); - } - else - destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - - rot = randomfloat(360); - explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) ); - triggerFx( explosionEffect ); - - thread playSoundinSpace( "mpl_sd_exp_suitcase_bomb_main", explosionOrigin ); - //thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "SILENT", "both" ); - - if ( isDefined( destroyedObj.exploderIndex ) ) - exploder( destroyedObj.exploderIndex ); - - for ( index = 0; index < level.bombZones.size; index++ ) - level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); - defuseObject maps\mp\gametypes\_gameobjects::disableObject(); - - setGameEndTime( 0 ); - - wait 3; - - maps\mp\gametypes\sd::sd_endGame( game["attackers"], game["strings"]["target_destroyed"] ); -} diff --git a/mods/patch_mp/maps/mp/gametypes/_bot.gsc b/mods/patch_mp/maps/mp/gametypes/_bot.gsc deleted file mode 100644 index 8c2ff7e..0000000 --- a/mods/patch_mp/maps/mp/gametypes/_bot.gsc +++ /dev/null @@ -1,924 +0,0 @@ -/* - _bot - Author: INeedGames - Date: 12/20/2020 - The entry point and manager of the bots. -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include maps\mp\bots\_bot_utility; - -/* - Entry point to the bots -*/ -init() -{ - level.bw_VERSION = "1.1.1"; - - level.bot_offline = false; - - if(getDvar("bots_main") == "") - setDvar("bots_main", true); - - if (!getDvarInt("bots_main")) - return; - - if(getDvar("bots_main_waitForHostTime") == "") - setDvar("bots_main_waitForHostTime", 10.0);//how long to wait to wait for the host player - - if(getDvar("bots_manage_add") == "") - setDvar("bots_manage_add", 0);//amount of bots to add to the game - if(getDvar("bots_manage_fill") == "") - setDvar("bots_manage_fill", 0);//amount of bots to maintain - if(getDvar("bots_manage_fill_spec") == "") - setDvar("bots_manage_fill_spec", true);//to count for fill if player is on spec team - if(getDvar("bots_manage_fill_mode") == "") - setDvar("bots_manage_fill_mode", 0);//fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 - if(getDvar("bots_manage_fill_kick") == "") - setDvar("bots_manage_fill_kick", false);//kick bots if too many - - if(getDvar("bots_team") == "") - setDvar("bots_team", "autoassign");//which team for bots to join - if(getDvar("bots_team_amount") == "") - setDvar("bots_team_amount", 0);//amount of bots on axis team - if(getDvar("bots_team_force") == "") - setDvar("bots_team_force", false);//force bots on team - if(getDvar("bots_team_mode") == "") - setDvar("bots_team_mode", 0);//counts just bots when 1 - - if(getDvar("bots_loadout_reasonable") == "")//filter out the bad 'guns' and perks - setDvar("bots_loadout_reasonable", false); - if(getDvar("bots_loadout_allow_op") == "")//allows jug, marty and laststand - setDvar("bots_loadout_allow_op", true); - if(getDvar("bots_loadout_rank") == "")// what rank the bots should be around, -1 is around the players, 0 is all random - setDvar("bots_loadout_rank", -1); - if(getDvar("bots_loadout_codpoints") == "")// how much cod points a bot should have, -1 is around the players, 0 is all random - setDvar("bots_loadout_codpoints", -1); - if(getDvar("bots_loadout_prestige") == "")// what pretige the bots will be, -1 is the players, -2 is random - setDvar("bots_loadout_prestige", -1); - - if(getDvar("bots_play_target_other") == "")//bot target non play ents (vehicles) - setDvar("bots_play_target_other", true); - if(getDvar("bots_play_killstreak") == "")//bot use killstreaks - setDvar("bots_play_killstreak", true); - if(getDvar("bots_play_nade") == "")//bots grenade - setDvar("bots_play_nade", true); - if(getDvar("bots_play_knife") == "")//bots knife - setDvar("bots_play_knife", true); - if(getDvar("bots_play_fire") == "")//bots fire - setDvar("bots_play_fire", true); - if(getDvar("bots_play_move") == "")//bots move - setDvar("bots_play_move", true); - if(getDvar("bots_play_take_carepackages") == "")//bots take carepackages - setDvar("bots_play_take_carepackages", true); - if(getDvar("bots_play_obj") == "")//bots play the obj - setDvar("bots_play_obj", true); - if(getDvar("bots_play_camp") == "")//bots camp and follow - setDvar("bots_play_camp", true); - - level.bots = []; - level.bot_decoys = []; - level.bot_planes = []; - - if(!isDefined(game["botWarfare"])) - game["botWarfare"] = true; - - thread fixGamemodes(); - thread onPlayerConnect(); - thread bot_watch_planes(); - - thread handleBots(); - - thread doNonDediBots(); -} - -/* - Thread when any player connects. Starts the threads needed. -*/ -onPlayerConnect() -{ - for(;;) - { - level waittill("connected", player); - - player thread watch_shoot(); - player thread watch_grenade(); - player thread connected(); - } -} - -/* - Starts the threads for bots. -*/ -handleBots() -{ - thread diffBots(); - thread teamBots(); - addBots(); - - while(!level.intermission) - wait 0.05; - - setDvar("bots_manage_add", getBotArray().size); -} - -/* - When a bot disconnects. -*/ -onDisconnect() -{ - self waittill("disconnect"); - - level.bots = array_remove(level.bots, self); -} - -/* - Whena player connects -*/ -connected() -{ - self endon("disconnect"); - - if (!self is_bot()) - return; - - self thread maps\mp\bots\_bot_script::connected(); - - level.bots[level.bots.size] = self; - self thread onDisconnect(); - - level notify("bot_connected", self); -} - -/* - Handles the diff of the bots -*/ -diffBots() -{ - for (;;) - { - wait 1.5; - - bot_set_difficulty(GetDvar( #"bot_difficulty" )); - } -} - -/* - Setup bot dvars for non dedicated clients -*/ -doNonDediBots() -{ - if (!GetDvarInt( #"xblive_basictraining" )) - return; - - if (isDefined(game[ "bots_spawned" ])) - return; - - game[ "bots_spawned" ] = true; - - if(getDvar("bot_enemies_extra") == "") - setDvar("bot_enemies_extra", 0); - if(getDvar("bot_friends_extra") == "") - setDvar("bot_friends_extra", 0); - - bot_friends = GetDvarInt( #"bot_friends" ); - bot_enemies = GetDvarInt( #"bot_enemies" ); - - bot_enemies += GetDvarInt("bot_enemies_extra"); - bot_friends += GetDvarInt("bot_friends_extra"); - - bot_wait_for_host(); - host = GetHostPlayer(); - - team = "allies"; - if(isDefined(host) && isDefined(host.pers[ "team" ]) && (host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis")) - team = host.pers[ "team" ]; - - setDvar("bots_manage_add", bot_enemies + bot_friends - 1); - setDvar("bots_manage_fill", bot_enemies + bot_friends); - setDvar("bots_manage_fill_mode", 0); - setDvar("bots_manage_fill_kick", true); - setDvar("bots_manage_fill_spec", false); - - setDvar("bots_team", "custom"); - - if (team == "axis") - setDvar("bots_team_amount", bot_friends); - else - setDvar("bots_team_amount", bot_enemies); - - setDvar("bots_team_force", true); - setDvar("bots_team_mode", 0); -} - -/* - Sets the difficulty of the bots -*/ -bot_set_difficulty( difficulty ) -{ - if ( difficulty == "fu" ) - { - SetDvar( "sv_botMinDeathTime", "250" ); - SetDvar( "sv_botMaxDeathTime", "500" ); - SetDvar( "sv_botMinFireTime", "100" ); - SetDvar( "sv_botMaxFireTime", "300" ); - SetDvar( "sv_botYawSpeed", "14" ); - SetDvar( "sv_botYawSpeedAds", "14" ); - SetDvar( "sv_botPitchUp", "-5" ); - SetDvar( "sv_botPitchDown", "10" ); - SetDvar( "sv_botFov", "160" ); - SetDvar( "sv_botMinAdsTime", "3000" ); - SetDvar( "sv_botMaxAdsTime", "5000" ); - SetDvar( "sv_botMinCrouchTime", "100" ); - SetDvar( "sv_botMaxCrouchTime", "400" ); - SetDvar( "sv_botTargetLeadBias", "2" ); - SetDvar( "sv_botMinReactionTime", "30" ); - SetDvar( "sv_botMaxReactionTime", "100" ); - SetDvar( "sv_botStrafeChance", "1" ); - SetDvar( "sv_botMinStrafeTime", "3000" ); - SetDvar( "sv_botMaxStrafeTime", "6000" ); - SetDvar( "scr_help_dist", "512" ); - SetDvar( "sv_botAllowGrenades", "1" ); - SetDvar( "sv_botMinGrenadeTime", "1500" ); - SetDvar( "sv_botMaxGrenadeTime", "4000" ); - SetDvar( "sv_botSprintDistance", "512" ); - SetDvar( "sv_botMeleeDist", "80" ); - } - else if ( difficulty == "hard" ) - { - SetDvar( "sv_botMinDeathTime", "250" ); - SetDvar( "sv_botMaxDeathTime", "500" ); - SetDvar( "sv_botMinFireTime", "400" ); - SetDvar( "sv_botMaxFireTime", "600" ); - SetDvar( "sv_botYawSpeed", "8" ); - SetDvar( "sv_botYawSpeedAds", "10" ); - SetDvar( "sv_botPitchUp", "-5" ); - SetDvar( "sv_botPitchDown", "10" ); - SetDvar( "sv_botFov", "100" ); - SetDvar( "sv_botMinAdsTime", "3000" ); - SetDvar( "sv_botMaxAdsTime", "5000" ); - SetDvar( "sv_botMinCrouchTime", "100" ); - SetDvar( "sv_botMaxCrouchTime", "400" ); - SetDvar( "sv_botTargetLeadBias", "2" ); - SetDvar( "sv_botMinReactionTime", "400" ); - SetDvar( "sv_botMaxReactionTime", "700" ); - SetDvar( "sv_botStrafeChance", "0.9" ); - SetDvar( "sv_botMinStrafeTime", "3000" ); - SetDvar( "sv_botMaxStrafeTime", "6000" ); - SetDvar( "scr_help_dist", "384" ); - SetDvar( "sv_botAllowGrenades", "1" ); - SetDvar( "sv_botMinGrenadeTime", "1500" ); - SetDvar( "sv_botMaxGrenadeTime", "4000" ); - SetDvar( "sv_botSprintDistance", "512" ); - SetDvar( "sv_botMeleeDist", "80" ); - } - else if ( difficulty == "easy" ) - { - SetDvar( "sv_botMinDeathTime", "1000" ); - SetDvar( "sv_botMaxDeathTime", "2000" ); - SetDvar( "sv_botMinFireTime", "900" ); - SetDvar( "sv_botMaxFireTime", "1000" ); - SetDvar( "sv_botYawSpeed", "2" ); - SetDvar( "sv_botYawSpeedAds", "2.5" ); - SetDvar( "sv_botPitchUp", "-20" ); - SetDvar( "sv_botPitchDown", "40" ); - SetDvar( "sv_botFov", "50" ); - SetDvar( "sv_botMinAdsTime", "3000" ); - SetDvar( "sv_botMaxAdsTime", "5000" ); - SetDvar( "sv_botMinCrouchTime", "4000" ); - SetDvar( "sv_botMaxCrouchTime", "6000" ); - SetDvar( "sv_botTargetLeadBias", "8" ); - SetDvar( "sv_botMinReactionTime", "1200" ); - SetDvar( "sv_botMaxReactionTime", "1600" ); - SetDvar( "sv_botStrafeChance", "0.1" ); - SetDvar( "sv_botMinStrafeTime", "3000" ); - SetDvar( "sv_botMaxStrafeTime", "6000" ); - SetDvar( "scr_help_dist", "256" ); - SetDvar( "sv_botAllowGrenades", "0" ); - SetDvar( "sv_botSprintDistance", "1024" ); - SetDvar( "sv_botMeleeDist", "40" ); - } - else // 'normal' difficulty - { - SetDvar( "sv_botMinDeathTime", "500" ); - SetDvar( "sv_botMaxDeathTime", "1000" ); - SetDvar( "sv_botMinFireTime", "600" ); - SetDvar( "sv_botMaxFireTime", "800" ); - SetDvar( "sv_botYawSpeed", "4" ); - SetDvar( "sv_botYawSpeedAds", "5" ); - SetDvar( "sv_botPitchUp", "-10" ); - SetDvar( "sv_botPitchDown", "20" ); - SetDvar( "sv_botFov", "70" ); - SetDvar( "sv_botMinAdsTime", "3000" ); - SetDvar( "sv_botMaxAdsTime", "5000" ); - SetDvar( "sv_botMinCrouchTime", "2000" ); - SetDvar( "sv_botMaxCrouchTime", "4000" ); - SetDvar( "sv_botTargetLeadBias", "4" ); - SetDvar( "sv_botMinReactionTime", "800" ); - SetDvar( "sv_botMaxReactionTime", "1200" ); - SetDvar( "sv_botStrafeChance", "0.6" ); - SetDvar( "sv_botMinStrafeTime", "3000" ); - SetDvar( "sv_botMaxStrafeTime", "6000" ); - SetDvar( "scr_help_dist", "256" ); - SetDvar( "sv_botAllowGrenades", "1" ); - SetDvar( "sv_botMinGrenadeTime", "1500" ); - SetDvar( "sv_botMaxGrenadeTime", "4000" ); - SetDvar( "sv_botSprintDistance", "512" ); - SetDvar( "sv_botMeleeDist", "80" ); - difficulty = "normal"; - } - - if ( level.gameType == "oic" && difficulty == "fu" ) - { - SetDvar( "sv_botMinReactionTime", "400" ); - SetDvar( "sv_botMaxReactionTime", "500" ); - SetDvar( "sv_botMinAdsTime", "1000" ); - SetDvar( "sv_botMaxAdsTime", "2000" ); - } - - if ( level.gameType == "oic" && ( difficulty == "hard" || difficulty == "fu" ) ) - { - SetDvar( "sv_botSprintDistance", "256" ); - } - - if (!getDvarInt("bots_play_nade")) - SetDvar( "sv_botAllowGrenades", "0" ); - - SetDvar( "bot_difficulty", difficulty ); - SetDvar( "scr_bot_difficulty", difficulty ); - SetDvar( "splitscreen_botDifficulty", difficulty ); -} - -/* - A server thread for monitoring all bot's teams for custom server settings. -*/ -teamBots() -{ - for(;;) - { - wait 1.5; - teamAmount = getDvarInt("bots_team_amount"); - toTeam = getDvar("bots_team"); - - alliesbots = 0; - alliesplayers = 0; - axisbots = 0; - axisplayers = 0; - - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(player is_bot()) - { - if(player.pers["team"] == "allies") - alliesbots++; - else if(player.pers["team"] == "axis") - axisbots++; - } - else - { - if(player.pers["team"] == "allies") - alliesplayers++; - else if(player.pers["team"] == "axis") - axisplayers++; - } - } - - allies = alliesbots; - axis = axisbots; - - if(!getDvarInt("bots_team_mode")) - { - allies += alliesplayers; - axis += axisplayers; - } - - if(toTeam != "custom") - { - if(getDvarInt("bots_team_force")) - { - if(toTeam == "autoassign") - { - if(abs(axis - allies) > 1) - { - toTeam = "axis"; - if(axis > allies) - toTeam = "allies"; - } - } - - if(toTeam != "autoassign") - { - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(!player is_bot()) - continue; - - if(player.pers["team"] == toTeam) - continue; - - if (toTeam == "allies") - player thread [[level.allies]](); - else if (toTeam == "axis") - player thread [[level.axis]](); - else - player thread [[level.spectator]](); - break; - } - } - } - } - else - { - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(!player is_bot()) - continue; - - if(player.pers["team"] == "axis") - { - if(axis > teamAmount) - { - player thread [[level.allies]](); - break; - } - } - else - { - if(axis < teamAmount) - { - player thread [[level.axis]](); - break; - } - else if(player.pers["team"] != "allies") - { - player thread [[level.allies]](); - break; - } - } - } - } - } -} - -/* - A server thread for monitoring all bot's in game. Will add and kick bots according to server settings. - - Dedis only spawn bots when developer is not 0 - This makes the dedi unstable and can crash - - Patch the executable to skip the pregame and make it so bots can spawn - - pregame: - in the ShouldDoPregame sub: - B8 01 00 00 00: mov eax, 1 -change to: B8 00 00 00 00: mov eax, 0 - 0x4F6C77 in rektmp - 0x4598A7 in bg - - - spawnbots: - in the SV_AddTestClient sub: - 0F 85 A4 00 00 00: jnz -change to: 0F 84 A4 00 00 00: jz - 0x6B6180 in rektmp - 0x4682F0 in bg - - - allow changing g_antilag dvar: - set the byte from 0x40 to 0x00 - - 0x53B1B2 in rekt - 0x59B6F2 in bg -*/ -addBots() -{ - level endon ( "game_ended" ); - - bot_wait_for_host(); - - for (;;) - { - wait 1.5; - - botsToAdd = GetDvarInt("bots_manage_add"); - - if(botsToAdd > 0) - { - SetDvar("bots_manage_add", 0); - - if(botsToAdd > 64) - botsToAdd = 64; - - for(; botsToAdd > 0; botsToAdd--) - { - level add_bot(); - wait 0.25; - } - } - - fillMode = getDVarInt("bots_manage_fill_mode"); - - if(fillMode == 2 || fillMode == 3) - setDvar("bots_manage_fill", getGoodMapAmount()); - - fillAmount = getDvarInt("bots_manage_fill"); - - players = 0; - bots = 0; - spec = 0; - - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if (player isdemoclient()) - continue; - - if(player is_bot()) - bots++; - else if(!isDefined(player.pers["team"]) || (player.pers["team"] != "axis" && player.pers["team"] != "allies")) - spec++; - else - players++; - } - - if(fillMode == 4) - { - axisplayers = 0; - alliesplayers = 0; - - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(player is_bot()) - continue; - - if(!isDefined(player.pers["team"])) - continue; - - if(player.pers["team"] == "axis") - axisplayers++; - else if(player.pers["team"] == "allies") - alliesplayers++; - } - - result = fillAmount - abs(axisplayers - alliesplayers) + bots; - - if (players == 0) - { - if(bots < fillAmount) - result = fillAmount-1; - else if (bots > fillAmount) - result = fillAmount+1; - else - result = fillAmount; - } - - bots = result; - } - - if (!randomInt(999)) - { - setDvar("testclients_doreload", true); - wait 0.1; - setDvar("testclients_doreload", false); - doExtraCheck(); - } - - amount = bots; - if(fillMode == 0 || fillMode == 2) - amount += players; - if(getDVarInt("bots_manage_fill_spec")) - amount += spec; - - if(amount < fillAmount) - setDvar("bots_manage_add", 1); - else if(amount > fillAmount && getDvarInt("bots_manage_fill_kick")) - { - tempBot = PickRandom(getBotArray()); - if (isDefined(tempBot)) - kick( tempBot getEntityNumber(), "EXE_PLAYERKICKED" ); - } - } -} - -/* - Adds a bot to the game. -*/ -add_bot() -{ - bot = addtestclient(); - - if (isdefined(bot)) - { - bot.pers["isBot"] = true; - bot.equipment_enabled = true; - bot.pers[ "bot_perk" ] = true; - bot.pers["isBotWarfare"] = true; - bot thread maps\mp\bots\_bot_script::added(); - } -} - -/* - Gives the bot loadout -*/ -bot_give_loadout() -{ - self maps\mp\bots\_bot_loadout::bot_give_loadout(); -} - -/* - Fired when the bot is damaged -*/ -bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ) -{ - self maps\mp\bots\_bot_script::bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ); -} - -/* - Bot is idle -*/ -bot_is_idle() -{ - if ( !IsDefined( self ) ) - { - return false; - } - - if ( !IsAlive( self ) ) - { - return false; - } - - if ( !self is_bot() ) - { - return false; - } - - if ( self inLastStand() ) - { - return false; - } - - if ( self HasScriptGoal() ) - { - return false; - } - - if ( IsDefined( self GetThreat() ) ) - { - return false; - } - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - return false; - } - - if(self UseButtonPressed()) - return false; - - if(self isPlanting()) - return false; - - if(self isDefusing()) - return false; - - return true; -} - -/* - Watch all players grenades -*/ -watch_grenade() -{ - self endon("disconnect"); - - self.bot_scrambled = false; - for(;;) - { - self waittill("grenade_fire", g, name); - if(name == "scrambler_mp") - { - g thread watch_scrambler(); - } - else if(name == "nightingale_mp") - { - self thread watch_decoy(g); - } - } -} - -/* - Watch the decoy grenade -*/ -watch_decoy(g) -{ - g.team = self.team; - - level.bot_decoys[level.bot_decoys.size] = g; - - g waittill("death"); - - for ( entry = 0; entry < level.bot_decoys.size; entry++ ) - { - if ( level.bot_decoys[entry] == g ) - { - while ( entry < level.bot_decoys.size-1 ) - { - level.bot_decoys[entry] = level.bot_decoys[entry+1]; - entry++; - } - level.bot_decoys[entry] = undefined; - break; - } - } -} - -/* - Attach a trigger to the scrambler -*/ -watch_scrambler() -{ - trig = spawn( "trigger_radius", self.origin + (0, 0, -1000), 0, 1000, 2000 ); - - self scramble_nearby(trig); - - trig delete(); -} - -/* - Watch when players enter the scrambler trigger -*/ -scramble_nearby(trig) -{ - self endon("death"); - self endon("hacked"); - - while(!isDefined(self.owner) || !isDefined(self.owner.team)) - wait 0.05; - - self.team = self.owner.team; - for(;;) - { - trig waittill("trigger", player); - - if (!isDefined(player) || !isDefined(player.team)) - continue; - - if(self maps\mp\gametypes\_weaponobjects::isStunned()) - continue; - - if(isDefined(self.owner) && player == self.owner) - continue; - - if(level.teamBased && self.team == player.team) - continue; - - player thread scramble_player(); - } -} - -/* - Scramble this player -*/ -scramble_player() -{ - self notify("scramble_nearby"); - self endon("scramble_nearby"); - - self.bot_scrambled = true; - wait 0.1; - - if(isDefined(self)) - self.bot_scrambled = false; -} - -/* - Watch when a player shoots -*/ -watch_shoot() -{ - self endon("disconnect"); - - self.bot_firing = false; - for(;;) - { - self waittill( "weapon_fired" ); - self thread doFiringThread(); - } -} - -/* - When a player fires -*/ -doFiringThread() -{ - self endon("disconnect"); - self endon("weapon_fired"); - - self.bot_firing = true; - wait 1; - self.bot_firing = false; -} - -/* - Watches the planes -*/ -bot_watch_planes() -{ - for(;;) - { - level waittill("uav_update"); - - ents = GetEntArray("script_model", "classname"); - for(i = 0; i < ents.size; i++) - { - ent = ents[i]; - - if(isDefined(ent.bot_plane)) - continue; - - if(ent.model != level.spyplanemodel) - continue; - - thread watch_plane(ent); - } - } -} - -/* - Watches the plane -*/ -watch_plane(ent) -{ - ent.bot_plane = true; - - level.bot_planes[level.bot_planes.size] = ent; - - ent waittill_any("death", "delete", "leaving"); - - for ( entry = 0; entry < level.bot_planes.size; entry++ ) - { - if ( level.bot_planes[entry] == ent ) - { - while ( entry < level.bot_planes.size-1 ) - { - level.bot_planes[entry] = level.bot_planes[entry+1]; - entry++; - } - level.bot_planes[entry] = undefined; - break; - } - } -} - -/* - Fix xp in sd -*/ -bot_killBoost() -{ - return false; -} - -/* - Fixes sd -*/ -fixGamemodes() -{ - for(i=0;i<19;i++) - { - if(isDefined(level.bombZones) && level.gametype == "sd") - { - level.isKillBoosting = ::bot_killBoost; - for(i = 0; i < level.bombZones.size; i++) - level.bombZones[i].onUse = ::bot_onUsePlantObjectFix; - break; - } - - wait 0.05; - } -} diff --git a/mods/patch_mp/maps/mp/gametypes/_globallogic_player.gsc b/mods/patch_mp/maps/mp/gametypes/_globallogic_player.gsc deleted file mode 100644 index b7bc9a0..0000000 --- a/mods/patch_mp/maps/mp/gametypes/_globallogic_player.gsc +++ /dev/null @@ -1,2629 +0,0 @@ -#include maps\mp\_utility; -#include common_scripts\utility; - -freezePlayerForRoundEnd() -{ - self clearLowerMessage(); - - self closeMenu(); - self closeInGameMenu(); - - self freeze_player_controls( true ); - currentWeapon = self GetCurrentWeapon(); - if ( maps\mp\gametypes\_hardpoints::isKillstreakWeapon( currentWeapon ) && !maps\mp\gametypes\_killstreak_weapons::isHeldKillstreakWeapon( currentWeapon ) ) - self takeWeapon( currentWeapon ); -// self _disableWeapon(); -} - - -Callback_PlayerConnect() -{ - thread notifyConnecting(); - - self.statusicon = "hud_status_connecting"; - self waittill( "begin" ); - waittillframeend; - self.statusicon = ""; - - level notify( "connected", self ); - -// self thread maps\mp\gametypes\_globallogic_utils::fakeLag(); - if ( level.console && self IsHost() ) - self thread maps\mp\gametypes\_globallogic::listenForGameEnd(); - - // only print that we connected if we haven't connected in a previous round - if( !level.splitscreen && !isdefined( self.pers["score"] ) ) - { - iPrintLn(&"MP_CONNECTED", self); - } - - if( !isdefined( self.pers["score"] ) ) - { - self thread maps\mp\gametypes\_persistence::adjustRecentStats(); - self maps\mp\gametypes\_persistence::setAfterActionReportStat( "valid", 0 ); - if( level.console ) - { - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 && !( self IsHost() ) ) - self maps\mp\gametypes\_persistence::setAfterActionReportStat( "wagerMatchFailed", 1 ); - else - self maps\mp\gametypes\_persistence::setAfterActionReportStat( "wagerMatchFailed", 0 ); - } - else - { - /# - PrintLn("level.wagermatch: " + level.wagermatch ); - #/ - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - if ( !self is_bot() && !self isdemoclient() ) - { - codPoints = self maps\mp\gametypes\_persistence::statGet( "CODPOINTS" ); - if( codPoints < level.wagerBet && !self IsHost() ) - { - /# - PrintLn("kick " + self.name + "; not enought codpoints: " + codPoints ); - #/ - kick( self getEntityNumber(), "PLATFORM_WAGER_DEADBEAT_TITLE" ); - return; - } - } - - // set this flag to notify player of possible refund in case the match does not end well - // self maps\mp\gametypes\_persistence::setAfterActionReportStat( "wagerMatchFailed", 1 ); - } - else - self maps\mp\gametypes\_persistence::setAfterActionReportStat( "wagerMatchFailed", 0 ); - } - } - - // track match and hosting stats once per match - if ( !IsDefined( self.pers["matchesPlayedStatsTracked"] ) ) - { - self maps\mp\gametypes\_persistence::statAdd( "MATCHES_PLAYED", 1, false ); - self.pers["MATCHES_PLAYED_COMPLETED_STREAK"] = self maps\mp\gametypes\_persistence::statGet( "MATCHES_PLAYED_COMPLETED_STREAK" ) + 1; - self maps\mp\gametypes\_persistence::statSet( "MATCHES_PLAYED_COMPLETED_STREAK", 0, false ); - - if ( !IsDefined( self.pers["matchesHostedStatsTracked"] ) && self IsLocalToHost() ) - { - self maps\mp\gametypes\_persistence::statAdd( "MATCHES_HOSTED", 1, false ); - self.pers["MATCHES_HOSTED_COMPLETED_STREAK"] = self maps\mp\gametypes\_persistence::statGet( "MATCHES_HOSTED_COMPLETED_STREAK" ) + 1; - self maps\mp\gametypes\_persistence::statSet( "MATCHES_HOSTED_COMPLETED_STREAK", 0, false ); - self.pers["matchesHostedStatsTracked"] = true; - } - - self.pers["matchesPlayedStatsTracked"] = true; - self thread maps\mp\gametypes\_persistence::uploadStatsSoon(); - } - - self maps\mp\_gamerep::gameRepPlayerConnected(); - - lpselfnum = self getEntityNumber(); - lpGuid = self getGuid(); - logPrint("J;" + lpGuid + ";" + lpselfnum + ";" + self.name + "\n"); - bbPrint( "mpjoins: name %s client %s", self.name, lpselfnum ); - - self setClientUIVisibilityFlag( "hud_visible", 1 ); - self setClientUIVisibilityFlag( "g_compassShowEnemies", GetDvarInt( #"scr_game_forceradar" ) ); - - self setClientDvars( "player_sprintTime", GetDvar( #"scr_player_sprinttime" ), - "ui_radar_client", GetDvar( #"ui_radar_client" ), - "scr_numLives", level.numLives, - "ui_pregame", isPregame() ); - - self CameraActivate( false ); - - makeDvarServerInfo( "cg_drawTalk", 1 ); - - if ( level.hardcoreMode ) - { - self setClientDvars( "cg_drawTalk", 3 ); - } - - if ( GetDvarInt( #"player_sprintUnlimited" ) ) - { - self setClientDvar( "player_sprintUnlimited", 1 ); - } - -/# - if ( GetDvarInt( #"scr_hitloc_debug") ) - { - for ( i = 0; i < 6; i++ ) - { - self setClientDvar( "ui_hitloc_" + i, "" ); - } - self.hitlocInited = true; - } -#/ - - self maps\mp\gametypes\_globallogic_score::initPersStat( "score" ); - if ( level.resetPlayerScoreEveryRound ) - { - self.pers["score"] = 0; - } - self.score = self.pers["score"]; - - self maps\mp\gametypes\_globallogic_score::initPersStat( "suicides" ); - self.suicides = self maps\mp\gametypes\_globallogic_score::getPersStat( "suicides" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "headshots" ); - self.headshots = self maps\mp\gametypes\_globallogic_score::getPersStat( "headshots" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "challenges" ); - self.challenges = self maps\mp\gametypes\_globallogic_score::getPersStat( "challenges" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "kills" ); - self.kills = self maps\mp\gametypes\_globallogic_score::getPersStat( "kills" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "deaths" ); - self.deaths = self maps\mp\gametypes\_globallogic_score::getPersStat( "deaths" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "assists" ); - self.assists = self maps\mp\gametypes\_globallogic_score::getPersStat( "assists" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "defends", false ); - self.defends = self maps\mp\gametypes\_globallogic_score::getPersStat( "defends" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "offends", false ); - self.offends = self maps\mp\gametypes\_globallogic_score::getPersStat( "offends" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "plants", false ); - self.plants = self maps\mp\gametypes\_globallogic_score::getPersStat( "plants" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "defuses", false ); - self.defuses = self maps\mp\gametypes\_globallogic_score::getPersStat( "defuses" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "returns", false ); - self.returns = self maps\mp\gametypes\_globallogic_score::getPersStat( "returns" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "captures", false ); - self.captures = self maps\mp\gametypes\_globallogic_score::getPersStat( "captures" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "destructions", false ); - self.destructions = self maps\mp\gametypes\_globallogic_score::getPersStat( "destructions" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "backstabs" ); - self.backstabs = self maps\mp\gametypes\_globallogic_score::getPersStat( "backstabs" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "longshots" ); - self.longshots = self maps\mp\gametypes\_globallogic_score::getPersStat( "longshots" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "survived" ); - self.survived = self maps\mp\gametypes\_globallogic_score::getPersStat( "survived" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "stabs" ); - self.stabs = self maps\mp\gametypes\_globallogic_score::getPersStat( "stabs" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "tomahawks" ); - self.tomahawks = self maps\mp\gametypes\_globallogic_score::getPersStat( "tomahawks" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "humiliated" ); - self.humiliated = self maps\mp\gametypes\_globallogic_score::getPersStat( "humiliated" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "x2score" ); - self.x2score = self maps\mp\gametypes\_globallogic_score::getPersStat( "x2score" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "sessionbans" ); - self.sessionbans = self maps\mp\gametypes\_globallogic_score::getPersStat( "sessionbans" ); - self maps\mp\gametypes\_globallogic_score::initPersStat( "gametypeban" ); - self maps\mp\gametypes\_globallogic_score::initPersStat( "time_played_total" ); - self maps\mp\gametypes\_globallogic_score::initPersStat( "time_played_alive" ); - - self maps\mp\gametypes\_globallogic_score::initPersStat( "teamkills", false ); - self maps\mp\gametypes\_globallogic_score::initPersStat( "teamkills_nostats" ); - self.teamKillPunish = false; - if ( level.minimumAllowedTeamKills >= 0 && self.pers["teamkills_nostats"] > level.minimumAllowedTeamKills ) - self thread reduceTeamKillsOverTime(); - - if( GetDvar( #"r_reflectionProbeGenerate" ) == "1" ) - level waittill( "eternity" ); - - - self.killedPlayersCurrent = []; - - if( !isDefined( self.pers["best_kill_streak"] ) ) - { - self.pers["killed_players"] = []; - self.pers["killed_by"] = []; - self.pers["nemesis_tracking"] = []; - self.pers["artillery_kills"] = 0; - self.pers["dog_kills"] = 0; - self.pers["nemesis_name"] = ""; - self.pers["nemesis_rank"] = 0; - self.pers["nemesis_rankIcon"] = 0; - self.pers["nemesis_xp"] = 0; - self.pers["nemesis_xuid"] = ""; - - - /*self.killstreakKills["artillery"] = 0; - self.killstreakKills["dogs"] = 0; - self.killstreaksUsed["radar"] = 0; - self.killstreaksUsed["artillery"] = 0; - self.killstreaksUsed["dogs"] = 0;*/ - self.pers["best_kill_streak"] = 0; - } - -// Adding Music tracking per player CDC - if( !isDefined( self.pers["music"] ) ) - { - self.pers["music"] = spawnstruct(); - self.pers["music"].spawn = false; - self.pers["music"].inque = false; - self.pers["music"].currentState = "SILENT"; - self.pers["music"].previousState = "SILENT"; - self.pers["music"].nextstate = "UNDERSCORE"; - self.pers["music"].returnState = "UNDERSCORE"; - - } - self.leaderDialogQueue = []; - self.leaderDialogActive = false; - self.leaderDialogGroups = []; - self.leaderDialogGroup = ""; - - if ( !isdefined( self.pers["cur_kill_streak"] ) ) - self.pers["cur_kill_streak"] = 0; - if ( !isdefined( self.pers["totalKillstreakCount"] ) ) - self.pers["totalKillstreakCount"] = 0; - - //Keep track of how many killstreaks have been earned in the current streak - if ( !isdefined( self.pers["killstreaksEarnedThisKillstreak"] ) ) - self.pers["killstreaksEarnedThisKillstreak"] = 0; - - self.lastKillTime = 0; - - self.cur_death_streak = 0; - self disabledeathstreak(); - self.death_streak = 0; - self.kill_streak = 0; - self.gametype_kill_streak = 0; - - if ( level.onlineGame ) - { - self.death_streak = self getDStat( "HighestStats", "death_streak" ); - self.kill_streak = self getDStat( "HighestStats", "kill_streak" ); - self.gametype_kill_streak = self maps\mp\gametypes\_persistence::statGetWithGameType( "kill_streak" ); - } - - - self.lastGrenadeSuicideTime = -1; - - self.teamkillsThisRound = 0; - - if ( !isDefined( level.livesDoNotReset ) || !level.livesDoNotReset || !isDefined( self.pers["lives"] ) ) - self.pers["lives"] = level.numLives; - - // multi round FFA games in custom game mode should maintain team in-between rounds - if ( !level.teamBased && !maps\mp\gametypes\_customClasses::isCustomGame() ) - { - self.pers["team"] = undefined; - } - - self.hasSpawned = false; - self.waitingToSpawn = false; - self.wantSafeSpawn = false; - self.deathCount = 0; - - self.wasAliveAtMatchStart = false; - - self thread maps\mp\_flashgrenades::monitorFlash(); - - level.players[level.players.size] = self; - - if( level.splitscreen ) - setdvar( "splitscreen_playerNum", level.players.size ); - // removed underscore for debug CDC - //maps\mp\gametypes\_globallogic_audio::set_music_on_team( "UNDERSCORE", "both", true );; - // When joining a game in progress, if the game is at the post game state (scoreboard) the connecting player should spawn into intermission - if ( game["state"] == "postgame" ) - { - self.pers["needteam"] = 1; - self.pers["team"] = "spectator"; - self.team = "spectator"; - self setClientUIVisibilityFlag( "hud_visible", 0 ); - - self [[level.spawnIntermission]](); - self closeMenu(); - self closeInGameMenu(); - return; - } - - // don't count losses for CTF and S&D and War at each round. - if ( !isDefined( self.pers["lossAlreadyReported"] ) ) - { - maps\mp\gametypes\_globallogic_score::updateLossStats( self ); - self.pers["lossAlreadyReported"] = true; - } - // don't redo winstreak save to pers array for each round of round based games. - if ( !isDefined( self.pers["winstreakAlreadyCleared"] ) ) - { - self maps\mp\gametypes\_globallogic_score::backupAndClearWinStreaks(); - self.pers["winstreakAlreadyCleared"] = true; - } - - if( self isdemoclient() ) - { - spawnpoint = maps\mp\gametypes\_spawnlogic::getRandomIntermissionPoint(); - setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles ); - self.pers["team"] = ""; - self [[level.spectator]](); - return; - } - - if( self istestclient() ) - { - self.pers[ "isBot" ] = true; - } - - if ( level.rankedMatch ) - { - self maps\mp\gametypes\_persistence::setAfterActionReportStat( "demoFileID", "0" ); - } - - level endon( "game_ended" ); - - if ( isDefined( level.hostMigrationTimer ) ) - self thread maps\mp\gametypes\_hostmigration::hostMigrationTimerThink(); - - if ( level.oldschool ) - { - self.pers["class"] = undefined; - self.class = self.pers["class"]; - } - - if ( isDefined( self.pers["team"] ) ) - self.team = self.pers["team"]; - - if ( isDefined( self.pers["class"] ) ) - self.class = self.pers["class"]; - - if ( !isDefined( self.pers["team"] ) || IsDefined( self.pers["needteam"] ) ) - { - // Don't set .sessionteam until we've gotten the assigned team from code, - // because it overrides the assigned team. - self.pers["needteam"] = undefined; - self.pers["team"] = "spectator"; - self.team = "spectator"; - self.sessionstate = "dead"; - - self maps\mp\gametypes\_globallogic_ui::updateObjectiveText(); - - [[level.spawnSpectator]](); - - if ( level.rankedMatch ) - { - [[level.autoassign]](); - - //self thread maps\mp\gametypes\_globallogic_spawn::forceSpawn(); - self thread maps\mp\gametypes\_globallogic_spawn::kickIfDontSpawn(); - } - else if ( !level.teamBased ) - { - [[level.autoassign]](); - } - else - { - if( ( isDefined( level.forceAutoAssign ) && level.forceAutoAssign ) || level.allow_teamchange != "1" ) - { - [[level.autoassign]](); - } - else - { - self setclientdvar( "g_scriptMainMenu", game["menu_team"] ); - self openMenu( game["menu_team"] ); - } - } - - if ( self.pers["team"] == "spectator" ) - { - self.sessionteam = "spectator"; - if ( !level.teamBased ) - self.ffateam = "spectator"; - } - - if ( level.teamBased ) - { - // set team and spectate permissions so the map shows waypoint info on connect - self.sessionteam = self.pers["team"]; - if ( !isAlive( self ) ) - self.statusicon = "hud_status_dead"; - self thread maps\mp\gametypes\_spectating::setSpectatePermissions(); - } - } - else if ( self.pers["team"] == "spectator" ) - { - self setclientdvar( "g_scriptMainMenu", game["menu_team"] ); - [[level.spawnSpectator]](); - self.sessionteam = "spectator"; - self.sessionstate = "spectator"; - if ( !level.teamBased ) - self.ffateam = "spectator"; - self thread maps\mp\gametypes\_spectating::setSpectatePermissions(); - } - else - { - self.sessionteam = self.pers["team"]; - self.sessionstate = "dead"; - - if ( !level.teamBased ) - self.ffateam = self.pers["team"]; - - self maps\mp\gametypes\_globallogic_ui::updateObjectiveText(); - - [[level.spawnSpectator]](); - - if ( maps\mp\gametypes\_globallogic_utils::isValidClass( self.pers["class"] ) ) - { - self thread [[level.spawnClient]](); - } - else - { - self maps\mp\gametypes\_globallogic_ui::showMainMenuForTeam(); - } - - self thread maps\mp\gametypes\_spectating::setSpectatePermissions(); - } - - if( maps\mp\gametypes\_customClasses::isUsingCustomGameModeClasses() ) - { - self thread maps\mp\gametypes\_customClasses::sprintSpeedModifier(); - } - - if ( isDefined( self.pers["isBot"] ) ) - return; -} - -Callback_PlayerMigrated() -{ - println( "Player " + self.name + " finished migrating at time " + gettime() ); - - if ( isDefined( self.connected ) && self.connected ) - { - self maps\mp\gametypes\_globallogic_ui::updateObjectiveText(); -// self updateObjectiveText(); -// self updateMainMenu(); - -// if ( level.teambased ) -// self updateScores(); - } - - level.hostMigrationReturnedPlayerCount++; - if ( level.hostMigrationReturnedPlayerCount >= level.players.size * 2 / 3 ) - { - println( "2/3 of players have finished migrating" ); - level notify( "hostmigration_enoughplayers" ); - } -} - -Callback_PlayerDisconnect() -{ - self removePlayerOnDisconnect(); - - if ( !level.gameEnded ) - self maps\mp\gametypes\_globallogic_score::logXPGains(); - - if ( level.splitscreen ) - { - players = level.players; - - if ( players.size <= 1 ) - level thread maps\mp\gametypes\_globallogic::forceEnd(); - - // passing number of players to menus in splitscreen to display leave or end game option - setdvar( "splitscreen_playerNum", players.size ); - } - - if ( isDefined( self.score ) && isDefined( self.pers["team"] ) ) - { - setPlayerTeamRank( self, level.dropTeam, self.score - 5 * self.deaths ); - self logString( "team: score " + self.pers["team"] + ":" + self.score ); - level.dropTeam += 1; - } - - [[level.onPlayerDisconnect]](); - - lpselfnum = self getEntityNumber(); - lpGuid = self getGuid(); - logPrint("Q;" + lpGuid + ";" + lpselfnum + ";" + self.name + "\n"); - bbPrint( "mpquits: name %s client %d", self.name, lpselfnum ); - - self maps\mp\_gamerep::gameRepPlayerDisconnected(); - - for ( entry = 0; entry < level.players.size; entry++ ) - { - if ( level.players[entry] == self ) - { - while ( entry < level.players.size-1 ) - { - level.players[entry] = level.players[entry+1]; - entry++; - } - level.players[entry] = undefined; - break; - } - } - for ( entry = 0; entry < level.players.size; entry++ ) - { - if ( isDefined( level.players[entry].pers["killed_players"][self.name] ) ) - level.players[entry].pers["killed_players"][self.name] = undefined; - - if ( isDefined( level.players[entry].killedPlayersCurrent[self.name] ) ) - level.players[entry].killedPlayersCurrent[self.name] = undefined; - - if ( isDefined( level.players[entry].pers["killed_by"][self.name] ) ) - level.players[entry].pers["killed_by"][self.name] = undefined; - - if ( isDefined( level.players[entry].pers["nemesis_tracking"][self.name] ) ) - level.players[entry].pers["nemesis_tracking"][self.name] = undefined; - - // player that disconnected was our nemesis - if ( level.players[entry].pers["nemesis_name"] == self.name ) - { - level.players[entry] chooseNextBestNemesis(); - } - } - - if ( level.gameEnded ) - self maps\mp\gametypes\_globallogic::removeDisconnectedPlayerFromPlacement(); - - level thread maps\mp\gametypes\_globallogic::updateTeamStatus(); -} - -chooseNextBestNemesis() -{ - nemesisArray = self.pers["nemesis_tracking"]; - nemesisArrayKeys = getArrayKeys( nemesisArray ); - nemesisAmount = 0; - nemesisName = ""; - - if ( nemesisArrayKeys.size > 0 ) - { - for ( i = 0; i < nemesisArrayKeys.size; i++ ) - { - nemesisArrayKey = nemesisArrayKeys[i]; - if ( nemesisArray[nemesisArrayKey] > nemesisAmount ) - { - nemesisName = nemesisArrayKey; - nemesisAmount = nemesisArray[nemesisArrayKey]; - } - - } - } - - self.pers["nemesis_name"] = nemesisName; - - if ( nemesisName != "" ) - { - playerIndex = 0; - for( ; playerIndex < level.players.size; playerIndex++ ) - { - if ( level.players[playerIndex].name == nemesisName ) - { - nemesisPlayer = level.players[playerIndex]; - self.pers["nemesis_rank"] = nemesisPlayer.pers["rank"]; - self.pers["nemesis_rankIcon"] = nemesisPlayer.pers["rankxp"]; - self.pers["nemesis_xp"] = nemesisPlayer.pers["prestige"]; - self.pers["nemesis_xuid"] = nemesisPlayer GetXUID(true); - break; - } - } - } - else - { - self.pers["nemesis_xuid"] = ""; - } -} - -removePlayerOnDisconnect() -{ - for ( entry = 0; entry < level.players.size; entry++ ) - { - if ( level.players[entry] == self ) - { - while ( entry < level.players.size-1 ) - { - level.players[entry] = level.players[entry+1]; - entry++; - } - level.players[entry] = undefined; - break; - } - } -} - -custom_gamemodes_modified_damage( victim, eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ) -{ - // regular public matches should early out - if ( level.onlinegame && !GetDvarInt( #"xblive_privatematch" ) ) - { - return iDamage; - } - - if( maps\mp\gametypes\_customClasses::isUsingCustomGameModeClasses() && isDefined( eAttacker ) ) - { - if( maps\mp\gametypes\_class::isExplosiveDamage( sMeansOfDeath, sWeapon ) ) - { - iDamage *= eAttacker maps\mp\gametypes\_customClasses::getExplosiveDamageModifier(); - } - else - { - iDamage *= eAttacker maps\mp\gametypes\_customClasses::getDamageModifier(); - } - } - if( isdefined( eAttacker) && isDefined( eAttacker.damageModifier ) ) - { - iDamage *= eAttacker.damageModifier; - } - if ( ( sMeansOfDeath == "MOD_PISTOL_BULLET" ) || ( sMeansOfDeath == "MOD_RIFLE_BULLET" ) ) - { - iDamage = int( iDamage * GetDvarFloat( #"scr_game_bulletdamage" ) ); - } - - return iDamage; -} - -custom_gamemodes_vampirism_health( iDamage, eAttacker ) -{ - // regular public matches should early out - if ( level.onlinegame && !GetDvarInt( #"xblive_privatematch" ) ) - { - return 0; - } - - return Int(iDamage * eAttacker maps\mp\gametypes\_customClasses::getHealthVampirismModifier()); -} - -figureOutAttacker( eAttacker ) -{ - if ( isdefined(eAttacker) ) - { - if( isai(eAttacker) && isDefined( eAttacker.script_owner ) ) - { - team = self.team; - - if ( IsAi( self ) && IsDefined( self.aiteam ) ) - { - team = self.aiteam; - } - - if ( eAttacker.script_owner.team != team ) - eAttacker = eAttacker.script_owner; - } - - if( eAttacker.classname == "script_vehicle" && isDefined( eAttacker.owner ) ) - eAttacker = eAttacker.owner; - else if( eAttacker.classname == "auto_turret" && isDefined( eAttacker.owner ) ) - eAttacker = eAttacker.owner; - } - - return eAttacker; -} - -figureOutWeapon( sWeapon, eInflictor ) -{ - // explosive barrel/car detection - if ( sWeapon == "none" && isDefined( eInflictor ) ) - { - if ( isDefined( eInflictor.targetname ) && eInflictor.targetname == "explodable_barrel" ) - { - sWeapon = "explodable_barrel_mp"; - } - else if ( isDefined( eInflictor.destructible_type ) && isSubStr( eInflictor.destructible_type, "vehicle_" ) ) - { - sWeapon = "destructible_car_mp"; - } - } - - return sWeapon; -} - - -handleFlameDamage( eAttacker, eInflictor, iDamage, sWeapon, sMeansOfDeath) -{ - switch( sWeapon ) - { - case "none": - if ( !self hasperk( "specialty_fireproof" ) ) - { - self thread maps\mp\_burnplayer::walkedThroughFlames( eAttacker, eInflictor, sWeapon ); - } - break; - case "m2_flamethrower_mp": - if ( !self hasperk( "specialty_fireproof" ) ) - { - self thread maps\mp\_burnplayer::burnedWithFlameThrower( sWeapon ); - } - break; - case "napalm_mp": - if ( !self hasperk( "specialty_fireproof" ) ) - { - if (isdefined (level.minDamageRequiredForNapalmBurn) && iDamage > level.minDamageRequiredForNapalmBurn) - { - self thread maps\mp\_burnplayer::hitWithNapalmStrike(eAttacker, eInflictor, "MOD_BURNED" ); - } - else - { - self thread maps\mp\_burnplayer::walkedThroughFlames( eAttacker, eInflictor, sWeapon ); - } - } - break; - case "rottweil72_mp": - //if ( !self hasperk( "specialty_fireproof" ) ) - //{ - // self thread maps\mp\_burnplayer::burnedWithDragonsBreath( eAttacker, eInflictor, sWeapon ); - //} - break; - - default: - if( GetSubStr( sWeapon, 0, 3 ) == "ft_" ) - { - if ( !self hasperk( "specialty_fireproof" ) ) - { - self thread maps\mp\_burnplayer::burnedWithFlameThrower( eAttacker, eInflictor, sWeapon ); - } - } - break; - } -} - -Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime ) -{ - // create a class specialty checks; CAC:bulletdamage, CAC:armorvest - iDamage = maps\mp\gametypes\_class::cac_modified_damage( self, eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ); - iDamage = custom_gamemodes_modified_damage( self, eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ); - - iDamage = int(iDamage); - self.iDFlags = iDFlags; - self.iDFlagsTime = getTime(); - - if ( game["state"] == "postgame" ) - return; - - if ( self.sessionteam == "spectator" ) - return; - - if ( isDefined( self.canDoCombat ) && !self.canDoCombat ) - return; - - if ( isDefined( eAttacker ) && isPlayer( eAttacker ) ) - { - if( isDefined( eAttacker.canDoCombat ) && !eAttacker.canDoCombat ) - return; - - if( eAttacker.team == "spectator" || ( isDefined( eAttacker.teamSwitchExploit ) && eAttacker.teamSwitchExploit ) ) - { -/# - println( "teamSwitchExploit prevented damage from " + eAttacker.name + ".\n" ); -#/ - return; - } - } - - if ( isDefined( level.hostMigrationTimer ) ) - return; - - eAttacker = figureOutAttacker( eAttacker ); - - pixbeginevent( "PlayerDamage flags/tweaks" ); - - // Don't do knockback if the damage direction was not specified - if( !isDefined( vDir ) ) - iDFlags |= level.iDFLAGS_NO_KNOCKBACK; - - self maps\mp\gametypes\_bot::bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ); - - friendly = false; - // Todo MGordon - Fix this stat collection - //self thread maps\mp\gametypes\_globallogic_score::threadedSetStatLBByName( sWeapon, 1, "hits by", 2 ); - - if ( ((self.health == self.maxhealth)) || !isDefined( self.attackers ) ) - { - self.attackers = []; - self.attackerData = []; - self.attackerDamage = []; - self.firstTimeDamaged = getTime(); - } - // added check to notify chatter to play pain vo - if (self.health != self.maxhealth) - { - self notify( "snd_pain_player" ); - } - - if ( IsDefined( eInflictor) && IsDefined( eInflictor.script_noteworthy) && eInflictor.script_noteworthy == "ragdoll_now" ) - { - sMeansOfDeath = "MOD_FALLING"; - } - - if ( maps\mp\gametypes\_globallogic_utils::isHeadShot( sWeapon, sHitLoc, sMeansOfDeath ) && isPlayer(eAttacker) ) - { - //Turning off damage headshot sounds to avoid confusion from the killing headshot sound. - //if (self.team != eAttacker.team) - //{ - // eAttacker playLocalSound( "prj_bullet_impact_headshot_helmet_nodie_2d" ); - //} - sMeansOfDeath = "MOD_HEAD_SHOT"; - } - - modifiedDamage = [[level.onPlayerDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime ); - if ( isDefined( modifiedDamage ) ) - iDamage = modifiedDamage; - - if ( maps\mp\gametypes\_tweakables::getTweakableValue( "game", "onlyheadshots" ) ) - { - if ( sMeansOfDeath == "MOD_PISTOL_BULLET" || sMeansOfDeath == "MOD_RIFLE_BULLET" ) - return; - else if ( sMeansOfDeath == "MOD_HEAD_SHOT" ) - iDamage = 150; - } - - // Make all vehicle drivers invulnerable to bullets - if ( self maps\mp\_vehicles::player_is_occupant_invulnerable( sMeansOfDeath ) ) - return; - - if (isdefined (eAttacker) && isPlayer(eAttacker) && (self.team != eAttacker.team)) - { - self.lastAttackWeapon = sWeapon; - - if ( eAttacker maps\mp\_vehicles::player_is_driver() ) - { - vehicle = eAttacker GetVehicleOccupied(); - self.lastTankThatAttacked = vehicle; - self thread maps\mp\gametypes\_globallogic_vehicle::clearLastTankAttacker(); - } - - // rottweil72 shoots dragon's breath rounds, so show a little fire on the player who got damaged - if( sMeansOfDeath == "MOD_BURNED" || sWeapon == "rottweil72_mp" ) - { - handleFlameDamage( eAttacker, eInflictor, iDamage, sWeapon, sMeansOfDeath); - } - } - - sWeapon = figureOutWeapon( sWeapon, eInflictor ); - - pixendevent( "END: PlayerDamage flags/tweaks" ); - - if( iDFlags & level.iDFLAGS_PENETRATION && isplayer ( eAttacker ) && eAttacker hasPerk( "specialty_bulletpenetration" ) ) - self thread maps\mp\gametypes\_battlechatter_mp::perkSpecificBattleChatter( "deepimpact", true ); - - // check for completely getting out of the damage - if( !(iDFlags & level.iDFLAGS_NO_PROTECTION) ) - { - if( ( isSubStr( sMeansOfDeath, "MOD_GRENADE" ) || isSubStr( sMeansOfDeath, "MOD_EXPLOSIVE" ) || isSubStr( sMeansOfDeath, "MOD_PROJECTILE" ) || isSubStr( sMeansOfDeath, "MOD_GAS" ) ) && - isDefined( eInflictor ) ) - { - // protect players from spawnkill grenades, tabun and incendiary - if ( ( eInflictor.classname == "grenade" || sweapon == "tabun_gas_mp" ) && (self.lastSpawnTime + 3500) > getTime() && distance( eInflictor.origin, self.lastSpawnPoint.origin ) < 250 ) - { -// pixmarker( "END: Callback_PlayerDamage player" ); - return; - } - - self.explosiveInfo = []; - self.explosiveInfo["damageTime"] = getTime(); - self.explosiveInfo["damageId"] = eInflictor getEntityNumber(); - self.explosiveInfo["returnToSender"] = false; - self.explosiveInfo["bulletPenetrationKill"] = false; - self.explosiveInfo["chainKill"] = false; - self.explosiveInfo["counterKill"] = false; - self.explosiveInfo["chainKill"] = false; - self.explosiveInfo["cookedKill"] = false; - self.explosiveInfo["weapon"] = sWeapon; - self.explosiveInfo["originalowner"] = eInflictor.originalowner; - - isFrag = isSubStr( sWeapon, "frag_" ); - - if ( eAttacker != self ) - { - if ( (isSubStr( sWeapon, "satchel_" ) || isSubStr( sWeapon, "claymore_" ) ) && isDefined( eAttacker ) && isDefined( eInflictor.owner ) ) - { - self.explosiveInfo["returnToSender"] = (eInflictor.owner == self); - self.explosiveInfo["counterKill"] = isDefined( eInflictor.wasDamaged ); - self.explosiveInfo["chainKill"] = isDefined( eInflictor.wasChained ); - self.explosiveInfo["ohnoyoudontKill"] = isDefined( eInflictor.wasJustPlanted ); - self.explosiveInfo["bulletPenetrationKill"] = isDefined( eInflictor.wasDamagedFromBulletPenetration ); - self.explosiveInfo["cookedKill"] = false; - } - if ( ( sWeapon == "sticky_grenade_mp" || sWeapon == "explosive_bolt_mp" ) && isDefined( eInflictor ) && isdefined( eInflictor.stuckToPlayer ) ) - { - self.explosiveInfo["stuckToPlayer"] = eInflictor.stuckToPlayer; - } - if ( isDefined( eAttacker.lastGrenadeSuicideTime ) && eAttacker.lastGrenadeSuicideTime >= gettime() - 50 && isFrag ) - { - self.explosiveInfo["suicideGrenadeKill"] = true; - } - else - { - self.explosiveInfo["suicideGrenadeKill"] = false; - } - } - - if ( isFrag ) - { - self.explosiveInfo["cookedKill"] = isDefined( eInflictor.isCooked ); - self.explosiveInfo["throwbackKill"] = isDefined( eInflictor.threwBack ); - } - - if( isPlayer( eAttacker ) && eAttacker != self ) - { - self maps\mp\gametypes\_globallogic_score::setInflictorStat( eInflictor, eAttacker, sWeapon ); - } - } - - if( isSubStr( sMeansOfDeath, "MOD_IMPACT" ) && isDefined( eAttacker ) && isPlayer( eAttacker ) && eAttacker != self ) - { - if ( sWeapon != "knife_ballistic_mp" ) - { - self maps\mp\gametypes\_globallogic_score::setInflictorStat( eInflictor, eAttacker, sWeapon ); - } - - if ( sWeapon == "hatchet_mp" && isDefined( eInflictor ) ) - { - self.explosiveInfo["projectile_bounced"] = isDefined( eInflictor.bounced ); - } - } - - if ( isPlayer( eAttacker ) ) - eAttacker.pers["participation"]++; - - prevHealthRatio = self.health / self.maxhealth; - - if ( level.teamBased && isPlayer( eAttacker ) && (self != eAttacker) && (self.team == eAttacker.team) ) - { - pixmarker( "BEGIN: PlayerDamage player" ); // profs automatically end when the function returns - if ( level.friendlyfire == 0 ) // no one takes damage - { - if ( sWeapon == "artillery_mp" || sWeapon == "airstrike_mp" || sWeapon == "napalm_mp" || sWeapon == "mortar_mp" ) - self damageShellshockAndRumble( eAttacker, eInflictor, sWeapon, sMeansOfDeath, iDamage ); - return; - } - else if ( level.friendlyfire == 1 ) // the friendly takes damage - { - // Make sure at least one point of damage is done - if ( iDamage < 1 ) - iDamage = 1; - - //check for friendly fire at the begining of the match. apply the damage to the attacker only - if( level.friendlyFireDelay && level.friendlyFireDelayTime >= ( ( ( gettime() - level.startTime ) - level.discardTime ) / 1000 ) ) - { - eAttacker.lastDamageWasFromEnemy = false; - - eAttacker.friendlydamage = true; - eAttacker finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); - eAttacker.friendlydamage = undefined; - } - else - { - self.lastDamageWasFromEnemy = false; - - self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); - } - } - else if ( level.friendlyfire == 2 && isAlive( eAttacker ) ) // only the attacker takes damage - { - iDamage = int(iDamage * .5); - - // Make sure at least one point of damage is done - if(iDamage < 1) - iDamage = 1; - - eAttacker.lastDamageWasFromEnemy = false; - - eAttacker.friendlydamage = true; - eAttacker finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); - eAttacker.friendlydamage = undefined; - } - else if ( level.friendlyfire == 3 && isAlive( eAttacker ) ) // both friendly and attacker take damage - { - iDamage = int(iDamage * .5); - - // Make sure at least one point of damage is done - if ( iDamage < 1 ) - iDamage = 1; - - self.lastDamageWasFromEnemy = false; - eAttacker.lastDamageWasFromEnemy = false; - - self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); - eAttacker.friendlydamage = true; - eAttacker finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); - eAttacker.friendlydamage = undefined; - } - - friendly = true; - pixmarker( "END: PlayerDamage player" ); - } - else - { - // Make sure at least one point of damage is done - if(iDamage < 1) - iDamage = 1; - - if ( isDefined( eAttacker ) && isPlayer( eAttacker ) && allowedAssistWeapon( sWeapon ) ) - { - trackAttackerDamage( eAttacker, iDamage, sMeansOfDeath, sWeapon ); - } - - giveInflictorOwnerAssist( eAttacker, eInflictor, iDamage, sMeansOfDeath, sWeapon ); - - if ( isdefined( eAttacker ) ) - level.lastLegitimateAttacker = eAttacker; - - if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( sWeapon ) && !issubstr( sMeansOfDeath, "MOD_MELEE" ) ) - eAttacker thread maps\mp\gametypes\_weapons::checkHit( sWeapon ); - - if ( issubstr( sMeansOfDeath, "MOD_GRENADE" ) && isDefined( eInflictor.isCooked ) ) - self.wasCooked = getTime(); - else - self.wasCooked = undefined; - - self.lastDamageWasFromEnemy = (isDefined( eAttacker ) && (eAttacker != self)); - - if ( self.lastDamageWasFromEnemy ) - eAttacker.damagedPlayers[ self.clientId ] = getTime(); - - self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime); - - self thread maps\mp\gametypes\_missions::playerDamaged(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, sHitLoc ); - - if ( isdefined ( eAttacker ) ) - { - // if vampirism is on, give the attacker health as a % of damage done to the player - eAttacker.health += custom_gamemodes_vampirism_health( iDamage, eAttacker ); - } - } - - if ( isdefined(eAttacker) && isplayer( eAttacker ) && eAttacker != self ) - { - if ( doDamageFeedback( sWeapon, eInflictor ) ) - { - hasBodyArmor = false; - - if ( iDamage > 0 ) - { - // if the attacker has tactical mask pro then we show the special yellow indicator - if( IsPlayer( eAttacker ) && eAttacker HasPerk( "specialty_shades" ) && eAttacker HasPerk( "specialty_stunprotection" ) && eAttacker HasPerk( "specialty_gas_mask" ) ) - { - // show the yellow indicator if this is a flash or concussion grenade and they don't have tactical mask on - if( sMeansOfDeath == "MOD_GRENADE_SPLASH" && - ( sWeapon == "flash_grenade_mp" || sWeapon == "concussion_grenade_mp" ) && - ( !self HasPerk( "specialty_shades" ) || !self HasPerk( "specialty_stunprotection" ) ) ) - { - eAttacker thread maps\mp\gametypes\_damagefeedback::updateSpecialDamageFeedback( self ); - } - } - - eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( hasBodyArmor, sMeansOfDeath ); - } - } - } - - self.hasDoneCombat = true; - } - - if(self.sessionstate != "dead") - self maps\mp\gametypes\_gametype_variants::onPlayerTakeDamage( eAttacker, eInflictor, sWeapon, iDamage, sMeansOfDeath ); - - if ( isdefined( eAttacker ) && eAttacker != self && !friendly ) - level.useStartSpawns = false; - - pixbeginevent( "PlayerDamage log" ); - - // Do debug print if it's enabled - if(GetDvarInt( #"g_debugDamage")) - println("client:" + self getEntityNumber() + " health:" + self.health + " attacker:" + eAttacker.clientid + " inflictor is player:" + isPlayer(eInflictor) + " damage:" + iDamage + " hitLoc:" + sHitLoc); - - if(self.sessionstate != "dead") - { - lpselfnum = self getEntityNumber(); - lpselfname = self.name; - lpselfteam = self.team; - lpselfGuid = self getGuid(); - lpattackerteam = ""; - lpattackerorigin = ( 0, 0, 0 ); - - if(isPlayer(eAttacker)) - { - lpattacknum = eAttacker getEntityNumber(); - lpattackGuid = eAttacker getGuid(); - lpattackname = eAttacker.name; - lpattackerteam = eAttacker.team; - lpattackerorigin = eAttacker.origin; - bbPrint( "mpattacks: gametime %d attackerspawnid %d attackerweapon %s attackerx %f attackery %f attackerz %f victimspawnid %d victimx %f victimy %f victimz %f damage %d damagetype %s damagelocation %s death 0", - gettime(), getplayerspawnid( eAttacker ), sWeapon, lpattackerorigin, getplayerspawnid( self ), self.origin, iDamage, sMeansOfDeath, sHitLoc ); - } - else - { - lpattacknum = -1; - lpattackGuid = ""; - lpattackname = ""; - lpattackerteam = "world"; - bbPrint( "mpattacks: gametime %d attackerweapon %s victimspawnid %d victimx %f victimy %f victimz %f damage %d damagetype %s damagelocation %s death 0", - gettime(), sWeapon, getplayerspawnid( self ), self.origin, iDamage, sMeansOfDeath, sHitLoc ); - } - logPrint("D;" + lpselfGuid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackGuid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n"); - } - -/# - if ( GetDvarInt( #"scr_hitloc_debug") ) - { - if ( !isdefined( eAttacker.hitlocInited ) ) - { - for ( i = 0; i < 6; i++ ) - { - eAttacker setClientDvar( "ui_hitloc_" + i, "" ); - } - eAttacker.hitlocInited = true; - } - - if ( isPlayer( eAttacker ) && !level.splitscreen ) - { - colors = []; - colors[0] = 2; - colors[1] = 3; - colors[2] = 5; - colors[3] = 7; - - elemcount = 6; - if ( !isdefined( eAttacker.damageInfo ) ) - { - eAttacker.damageInfo = []; - for ( i = 0; i < elemcount; i++ ) - { - eAttacker.damageInfo[i] = spawnstruct(); - eAttacker.damageInfo[i].damage = 0; - eAttacker.damageInfo[i].hitloc = ""; - eAttacker.damageInfo[i].bp = false; - eAttacker.damageInfo[i].jugg = false; - eAttacker.damageInfo[i].colorIndex = 0; - } - eAttacker.damageInfoColorIndex = 0; - eAttacker.damageInfoVictim = undefined; - } - - for ( i = elemcount-1; i > 0; i-- ) - { - eAttacker.damageInfo[i].damage = eAttacker.damageInfo[i - 1].damage; - eAttacker.damageInfo[i].hitloc = eAttacker.damageInfo[i - 1].hitloc; - eAttacker.damageInfo[i].bp = eAttacker.damageInfo[i - 1].bp; - eAttacker.damageInfo[i].jugg = eAttacker.damageInfo[i - 1].jugg; - eAttacker.damageInfo[i].colorIndex = eAttacker.damageInfo[i - 1].colorIndex; - } - eAttacker.damageInfo[0].damage = iDamage; - eAttacker.damageInfo[0].hitloc = sHitLoc; - eAttacker.damageInfo[0].bp = (iDFlags & level.iDFLAGS_PENETRATION); - eAttacker.damageInfo[0].jugg = false; - if ( isdefined( eAttacker.damageInfoVictim ) && eAttacker.damageInfoVictim != self ) - { - eAttacker.damageInfoColorIndex++; - if ( eAttacker.damageInfoColorIndex == colors.size ) - eAttacker.damageInfoColorIndex = 0; - } - eAttacker.damageInfoVictim = self; - eAttacker.damageInfo[0].colorIndex = eAttacker.damageInfoColorIndex; - - for ( i = 0; i < elemcount; i++ ) - { - color = "^" + colors[ eAttacker.damageInfo[i].colorIndex ]; - if ( eAttacker.damageInfo[i].hitloc != "" ) - { - val = color + eAttacker.damageInfo[i].hitloc; - if ( eAttacker.damageInfo[i].bp ) - val += " (BP)"; - if ( eAttacker.damageInfo[i].jugg ) - val += " (Jugg)"; - eAttacker setClientDvar( "ui_hitloc_" + i, val ); - } - eAttacker setClientDvar( "ui_hitloc_damage_" + i, color + eAttacker.damageInfo[i].damage ); - } - } - } -#/ - pixendevent( "END: PlayerDamage log" ); -} - -resetAttackerList() -{ - self endon( "disconnect" ); - self endon( "death" ); - level endon( "game_ended" ); - - self.attackers = []; - self.attackerData = []; - self.attackerDamage = []; -} - -doDamageFeedback( sWeapon, eInflictor ) -{ - if ( !IsDefined( sWeapon ) ) - return false; - - switch(sWeapon) - { - case "artillery_mp": - case "airstrike_mp": - case "napalm_mp": - case "mortar_mp": - case "tow_turret_mp": - case "auto_gun_turret_mp": - case "cobra_20mm_comlink_mp": - return false; - } - - if ( IsDefined( eInflictor ) ) - { - if ( IsAI(eInflictor) ) - { - return false; - } - } - - return true; -} - -finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime ) -{ - pixbeginevent("finishPlayerDamageWrapper"); - surface = "flesh"; - - if ( self.cac_body_type == "body_armor_mp" ) - { - surface = "metal"; - } - - self finishPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, surface ); - - if ( GetDvar( #"scr_csmode" ) != "" ) - self shellShock( "damage_mp", 0.2 ); - - self damageShellshockAndRumble( eAttacker, eInflictor, sWeapon, sMeansOfDeath, iDamage ); - pixendevent(); -} - -allowedAssistWeapon( weapon ) -{ - if ( !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( weapon ) ) - return true; - - if (maps\mp\gametypes\_hardpoints::isKillstreakWeaponAssistAllowed( weapon ) ) - return true; - - return false; -} - -GiveCustomGameModePlayerKilledScore( attacker, sMeansOfDeath ) -{ - if( !maps\mp\gametypes\_customClasses::isCustomGame() ) - return; - - if( level.gameType != "tdm" && level.gameType != "dm" ) - return; - - if( isDefined( attacker ) && ( self == attacker || ( attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" ) ) ) - { - maps\mp\gametypes\_globallogic_score::givePlayerScore( "suicide", self, self ); - maps\mp\gametypes\_globallogic_score::giveTeamScore( "suicide", self.team, self, self ); - return; // no other bonuses if you're suicidin' - } - - if( sMeansOfDeath == "MOD_HEAD_SHOT" ) - { - maps\mp\gametypes\_globallogic_score::givePlayerScore( "headshot", attacker, self ); - maps\mp\gametypes\_globallogic_score::giveTeamScore( "headshot", attacker.team, attacker, self ); - } - if( isDefined( level.placement ) ) - { - maps\mp\gametypes\_globallogic::updatePlacement(); - if( attacker maps\mp\gametypes\_customClasses::shouldGiveLeaderBonus() ) - { - leaderbonus = getDvarInt( "scr_" + level.gameType + "_bonus_leader" ); - if( isDefined( leaderBonus ) ) - { - maps\mp\gametypes\_globallogic_score::_setPlayerScore( attacker, attacker.pers["score"] + leaderBonus ); - maps\mp\gametypes\_globallogic_score::onTeamScore( leaderBonus, attacker.team, attacker, self ); - maps\mp\gametypes\_globallogic_score::updateTeamScores( attacker.team ); - } - } - } - maps\mp\gametypes\_globallogic_score::givePlayerScore( "death", self, self ); - maps\mp\gametypes\_globallogic_score::giveTeamScore( "death", self.team, self, self ); - -} - -Callback_PlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration) -{ - self endon( "spawned" ); - self notify( "killed_player" ); - - if ( self.sessionteam == "spectator" ) - return; - - if ( game["state"] == "postgame" ) - return; - - self needsRevive( false ); - - if ( isdefined( self.burning ) && self.burning == true ) - { - self setburn( 0 ); - } - - self.suicide = false; - - if ( isDefined( level.takeLivesOnDeath ) && ( level.takeLivesOnDeath == true ) ) - { - if ( self.pers["lives"] ) - { - self.pers["lives"]--; - if ( self.pers["lives"] == 0 ) - { - level notify( "player_eliminated" ); - self notify( "player_eliminated" ); - } - - } - } - - sWeapon = updateWeapon( eInflictor, sWeapon ); - - pixbeginevent( "PlayerKilled pre constants" ); - - wasInLastStand = false; - deathTimeOffset = 0; - lastWeaponBeforeDroppingIntoLastStand = undefined; - attackerStance = undefined; - self.lastStandThisLife = undefined; - self.vAttackerOrigin = undefined; - - if ( isdefined( self.useLastStandParams ) ) - { - self.useLastStandParams = undefined; - - assert( isdefined( self.lastStandParams ) ); - if ( !level.teamBased || ( !isDefined( attacker ) || !isplayer( attacker ) || attacker.team != self.team || attacker == self ) ) - { - eInflictor = self.lastStandParams.eInflictor; - attacker = self.lastStandParams.attacker; - attackerStance = self.lastStandParams.attackerStance; - iDamage = self.lastStandParams.iDamage; - sMeansOfDeath = self.lastStandParams.sMeansOfDeath; - sWeapon = self.lastStandParams.sWeapon; - vDir = self.lastStandParams.vDir; - sHitLoc = self.lastStandParams.sHitLoc; - self.vAttackerOrigin = self.lastStandParams.vAttackerOrigin; - deathTimeOffset = (gettime() - self.lastStandParams.lastStandStartTime) / 1000; - - self thread maps\mp\gametypes\_battlechatter_mp::perkSpecificBattleChatter( "secondchance" ); - - if ( isDefined( self.previousPrimary ) ) - { - wasInLastStand = true; - lastWeaponBeforeDroppingIntoLastStand = self.previousPrimary; - } - } - self.lastStandParams = undefined; - } - - bestPlayer = undefined; - bestPlayerMeansOfDeath = undefined; - obituaryMeansOfDeath = undefined; - bestPlayerWeapon = undefined; - obituaryWeapon = undefined; - - if ( (!isDefined( attacker ) || attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" || ( isdefined( attacker.isMagicBullet ) && attacker.isMagicBullet == true ) || attacker == self ) && isDefined( self.attackers ) ) - { - if ( !isDefined(bestPlayer) ) - { - for ( i = 0; i < self.attackers.size; i++ ) - { - player = self.attackers[i]; - if ( !isDefined( player ) ) - continue; - - if (!isDefined( self.attackerDamage[ player.clientId ] ) || ! isDefined( self.attackerDamage[ player.clientId ].damage ) ) - continue; - - if ( player == self || (level.teamBased && player.team == self.team ) ) - continue; - - if ( self.attackerDamage[ player.clientId ].lasttimedamaged + 2500 < getTime() ) - continue; - - if ( !allowedAssistWeapon( self.attackerDamage[ player.clientId ].weapon ) ) - continue; - - if ( self.attackerDamage[ player.clientId ].damage > 1 && ! isDefined( bestPlayer ) ) - { - bestPlayer = player; - bestPlayerMeansOfDeath = self.attackerDamage[ player.clientId ].meansOfDeath; - bestPlayerWeapon = self.attackerDamage[ player.clientId ].weapon; - } - else if ( isDefined( bestPlayer ) && self.attackerDamage[ player.clientId ].damage > self.attackerDamage[ bestPlayer.clientId ].damage ) - { - bestPlayer = player; - bestPlayerMeansOfDeath = self.attackerDamage[ player.clientId ].meansOfDeath; - bestPlayerWeapon = self.attackerDamage[ player.clientId ].weapon; - } - } - } - if ( isdefined ( bestPlayer ) ) - bestPlayer maps\mp\_medals::assistedSuicide(bestPlayerWeapon); - } - - if ( isdefined ( bestPlayer ) ) - { - attacker = bestPlayer; - obituaryMeansOfDeath = bestPlayerMeansOfDeath; - obituaryWeapon = bestPlayerWeapon; - } - - if ( isplayer( attacker ) ) - attacker.damagedPlayers[self.clientid] = undefined; - - if( maps\mp\gametypes\_globallogic_utils::isHeadShot( sWeapon, sHitLoc, sMeansOfDeath ) && isPlayer( attacker ) ) - { - attacker playLocalSound( "prj_bullet_impact_headshot_helmet_nodie_2d" ); - //attacker playLocalSound( "prj_bullet_impact_headshot_2d" ); - - sMeansOfDeath = "MOD_HEAD_SHOT"; - } - - self.deathTime = getTime(); - - attacker = updateAttacker( attacker ); - eInflictor = updateInflictor( eInflictor ); - - sMeansOfDeath = updateMeansOfDeath( sWeapon, sMeansOfDeath ); - - self thread updateGlobalBotKilledCounter(); - if ( maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - level.globalKillstreaksDeathsFrom++; - } - - // Don't increment weapon stats for team kills or deaths - if ( isPlayer( attacker ) && attacker != self && ( !level.teamBased || ( level.teamBased && self.team != attacker.team ) ) ) - { - self thread maps\mp\gametypes\_globallogic_score::trackLeaderBoardDeathStats( sWeapon, sMeansOfDeath ); - - if ( wasInLastStand && isDefined( lastWeaponBeforeDroppingIntoLastStand ) ) - weaponName = lastWeaponBeforeDroppingIntoLastStand; - else - weaponName = self.lastdroppableweapon; - - if ( isDefined( weaponName ) && ( isSubStr( weaponName, "gl_" ) || isSubStr( weaponName, "mk_" ) || isSubStr( weaponName, "ft_" ) ) ) - weaponName = self.currentWeapon; - - if ( isDefined( weaponName ) ) - self thread maps\mp\gametypes\_globallogic_score::trackLeaderBoardDeathsDuringUseStats( weaponName ); - - attacker thread maps\mp\gametypes\_globallogic_score::trackAttackerLeaderBoardDeathStats( sWeapon, sMeansOfDeath ); - } - - if ( !isdefined( obituaryMeansOfDeath ) ) - obituaryMeansOfDeath = sMeansOfDeath; - if ( !isdefined( obituaryWeapon ) ) - obituaryWeapon = sWeapon; - - // send out an obituary message to all clients about the kill - if( level.teamBased && isDefined( attacker.pers ) && self.team == attacker.team && obituaryMeansOfDeath == "MOD_GRENADE" && level.friendlyfire == 0 ) - { - obituary(self, self, obituaryWeapon, obituaryMeansOfDeath); - maps\mp\_demo::bookmark( "kill", gettime(), self, self ); - } - else - { - obituary(self, attacker, obituaryWeapon, obituaryMeansOfDeath); - maps\mp\_demo::bookmark( "kill", gettime(), self, attacker ); - } - -// self maps\mp\gametypes\_weapons::updateWeaponUsageStats(); - if ( !level.inGracePeriod ) - { - self maps\mp\gametypes\_weapons::dropScavengerForDeath( attacker ); - self maps\mp\gametypes\_weapons::dropWeaponForDeath( attacker ); - self maps\mp\gametypes\_weapons::dropOffhand(); - } - - maps\mp\gametypes\_spawnlogic::deathOccured(self, attacker); - - self.sessionstate = "dead"; - self.statusicon = "hud_status_dead"; - - self.pers["weapon"] = undefined; - - self.killedPlayersCurrent = []; - - self.deathCount++; - -/# - println( "players("+self.clientId+") death count ++: " + self.deathCount ); -#/ - - if( !isDefined( self.switching_teams ) ) - { - // if team killed we reset kill streak, but dont count death and death streak - if ( isPlayer( attacker ) && level.teamBased && ( attacker != self ) && ( self.team == attacker.team ) ) - { - - self.pers["cur_kill_streak"] = 0; - self.pers["totalKillstreakCount"] = 0; - self.pers["killstreaksEarnedThisKillstreak"] = 0; - } - else - { - self maps\mp\gametypes\_globallogic_score::incPersStat( "deaths", 1, true, true ); - self.deaths = self maps\mp\gametypes\_globallogic_score::getPersStat( "deaths" ); - self maps\mp\gametypes\_globallogic_score::updatePersRatio( "kdratio", "kills", "deaths" ); - - if( self.pers["cur_kill_streak"] > self.pers["best_kill_streak"] ) - self.pers["best_kill_streak"] = self.pers["cur_kill_streak"]; - - // need to keep the current killstreak to see if this was a buzzkill later - self.pers["kill_streak_before_death"] = self.pers["cur_kill_streak"]; - - self.pers["cur_kill_streak"] = 0; - self.pers["totalKillstreakCount"] = 0; - self.pers["killstreaksEarnedThisKillstreak"] = 0; - - self.cur_death_streak++; - - if ( self.cur_death_streak > self.death_streak ) - { - self setDStat( "HighestStats", "death_streak", self.cur_death_streak ); - self.death_streak = self.cur_death_streak; - } - - if( self.cur_death_streak >= GetDvarInt( #"perk_deathStreakCountRequired" ) ) - { - self enabledeathstreak(); - } - } - } - else - { - self.pers["totalKillstreakCount"] = 0; - self.pers["killstreaksEarnedThisKillstreak"] = 0; - } - - lpselfnum = self getEntityNumber(); - lpselfname = self.name; - lpattackGuid = ""; - lpattackname = ""; - lpselfteam = self.team; - lpselfguid = self getGuid(); - lpattackteam = ""; - lpattackorigin = ( 0, 0, 0 ); - - lpattacknum = -1; - - //check if we should award assist points - awardAssists = false; - - pixendevent(); // "PlayerKilled pre constants" ); - - self GiveCustomGameModePlayerKilledScore( attacker, sMeansOfDeath ); - - if( isPlayer( attacker ) ) - { - lpattackGuid = attacker getGuid(); - lpattackname = attacker.name; - lpattackteam = attacker.team; - lpattackorigin = attacker.origin; - - if ( attacker == self ) // killed himself - { - doKillcam = false; - - // switching teams - if ( isDefined( self.switching_teams ) ) - { - if ( !level.teamBased && ((self.leaving_team == "allies" && self.joining_team == "axis") || (self.leaving_team == "axis" && self.joining_team == "allies")) ) - { - playerCounts = self maps\mp\gametypes\_teams::CountPlayers(); - playerCounts[self.leaving_team]--; - playerCounts[self.joining_team]++; - - if( (playerCounts[self.joining_team] - playerCounts[self.leaving_team]) > 1 ) - { - self thread [[level.onXPEvent]]( "suicide" ); - self maps\mp\gametypes\_globallogic_score::incPersStat( "suicides", 1 ); - self.suicides = self maps\mp\gametypes\_globallogic_score::getPersStat( "suicides" ); - } - } - } - else - { - self thread [[level.onXPEvent]]( "suicide" ); - self maps\mp\gametypes\_globallogic_score::incPersStat( "suicides", 1 ); - self.suicides = self maps\mp\gametypes\_globallogic_score::getPersStat( "suicides" ); - - if ( sMeansOfDeath == "MOD_SUICIDE" && sHitLoc == "none" && self.throwingGrenade ) - { - self.lastGrenadeSuicideTime = gettime(); - } - - //Check for player death related battlechatter - thread maps\mp\gametypes\_battlechatter_mp::onPlayerSuicideOrTeamKill( self, "suicide" ); //Play suicide battlechatter - - //check if assist points should be awarded - awardAssists = true; - self.suicide = true; - } - - if( isDefined( self.friendlydamage ) ) - { - self iPrintLn(&"MP_FRIENDLY_FIRE_WILL_NOT"); - if ( maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillpointloss" ) ) - { - scoreSub = self [[level.getTeamKillScore]]( eInflictor, attacker, sMeansOfDeath, sWeapon); - maps\mp\gametypes\_globallogic_score::_setPlayerScore( attacker,maps\mp\gametypes\_globallogic_score::_getPlayerScore( attacker ) - scoreSub ); - } - } - } - else - { - pixbeginevent( "PlayerKilled attacker" ); - - lpattacknum = attacker getEntityNumber(); - - doKillcam = true; - - self thread maps\mp\gametypes\_gametype_variants::playerKilled( attacker ); - - if ( level.teamBased && self.team == attacker.team && sMeansOfDeath == "MOD_GRENADE" && level.friendlyfire == 0 ) - { - } - else if ( level.teamBased && self.team == attacker.team ) // killed by a friendly - { - attacker thread [[level.onXPEvent]]( "teamkill" ); - - if ( !IgnoreTeamKills( sWeapon, sMeansOfDeath ) ) - { - teamkill_penalty = self [[level.getTeamKillPenalty]]( eInflictor, attacker, sMeansOfDeath, sWeapon); - - attacker maps\mp\gametypes\_globallogic_score::incPersStat( "teamkills_nostats", teamkill_penalty, false ); - attacker maps\mp\gametypes\_globallogic_score::incPersStat( "teamkills", 1 ); //save team kills to player stats - attacker.teamkillsThisRound++; - - if ( maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillpointloss" ) ) - { - scoreSub = self [[level.getTeamKillScore]]( eInflictor, attacker, sMeansOfDeath, sWeapon); - maps\mp\gametypes\_globallogic_score::_setPlayerScore( attacker,maps\mp\gametypes\_globallogic_score::_getPlayerScore( attacker ) - scoreSub ); - } - - if ( maps\mp\gametypes\_globallogic_utils::getTimePassed() < 5000 ) - teamKillDelay = 1; - else if ( attacker.pers["teamkills_nostats"] > 1 && maps\mp\gametypes\_globallogic_utils::getTimePassed() < (8000 + (attacker.pers["teamkills_nostats"] * 1000)) ) - teamKillDelay = 1; - else - teamKillDelay = attacker TeamKillDelay(); - - if ( teamKillDelay > 0 ) - { - attacker.teamKillPunish = true; - attacker suicide(); - - if ( attacker ShouldTeamKillKick(teamKillDelay) ) - { - attacker TeamKillKick(); - } - - attacker thread reduceTeamKillsOverTime(); - } - - //Play teamkill battlechatter - if( isPlayer( attacker ) ) - thread maps\mp\gametypes\_battlechatter_mp::onPlayerSuicideOrTeamKill( attacker, "teamkill" ); - } - } - else - { - maps\mp\gametypes\_globallogic_score::incTotalKills(attacker.team); - - attacker thread maps\mp\gametypes\_globallogic_score::giveKillStats( sMeansOfDeath, sWeapon, self ); - - self maps\mp\gametypes\_copycat::copycat_clone_loadout( attacker ); - - if ( isAlive( attacker ) ) - { - pixbeginevent("killstreak"); - - if ( !isDefined( eInflictor ) || !isDefined( eInflictor.requiredDeathCount ) || attacker.deathCount == eInflictor.requiredDeathCount ) - { - shouldGiveKillstreak = maps\mp\gametypes\_hardpoints::shouldGiveKillstreak( sWeapon ); - attacker thread maps\mp\_properks::earnedAKill(); - - if ( shouldGiveKillstreak ) - { - attacker maps\mp\gametypes\_hardpoints::addToKillstreakCount(sWeapon); - } - - //Kills gotten through killstreak weapons should not the players killstreak - if ( isDefined( level.killstreaks ) && shouldGiveKillstreak ) - { - attacker.pers["cur_kill_streak"]++; - attacker thread maps\mp\_properks::checkKillCount(); - attacker thread maps\mp\gametypes\_hardpoints::giveKillstreakForStreak(); - } - } - - if( isPlayer( attacker ) ) - self thread maps\mp\gametypes\_battlechatter_mp::onPlayerKillstreak( attacker ); - - pixendevent(); // "killstreak" - } - - - if ( attacker.pers["cur_kill_streak"] > attacker.kill_streak ) - { - attacker setDStat( "HighestStats", "kill_streak", attacker.pers["totalKillstreakCount"] ); - attacker.kill_streak = attacker.pers["cur_kill_streak"]; - } - - - if ( attacker.pers["cur_kill_streak"] > attacker.gametype_kill_streak ) - { - attacker maps\mp\gametypes\_persistence::statSetWithGametype( "kill_streak", attacker.pers["cur_kill_streak"] ); - attacker.gametype_kill_streak = attacker.pers["cur_kill_streak"]; - } - - maps\mp\gametypes\_globallogic_score::givePlayerScore( "kill", attacker, self ); - - attacker thread maps\mp\gametypes\_globallogic_score::trackAttackerKill( self.name, self.pers["rank"], self.pers["rankxp"], self.pers["prestige"], self getXuid(true) ); - - attackerName = attacker.name; - self thread maps\mp\gametypes\_globallogic_score::trackAttackeeDeath( attackerName, attacker.pers["rank"], attacker.pers["rankxp"], attacker.pers["prestige"], attacker getXuid(true) ); - self thread maps\mp\_medals::setLastKilledBy( attacker ); - - attacker thread maps\mp\gametypes\_globallogic_score::incKillstreakTracker( sWeapon ); - - // to prevent spectator gain score for team-spectator after throwing a granade and killing someone before he switched - if ( level.teamBased && attacker.team != "spectator") - { - // dog score for team - if( isai(Attacker) ) - maps\mp\gametypes\_globallogic_score::giveTeamScore( "kill", attacker.aiteam, attacker, self ); - else - maps\mp\gametypes\_globallogic_score::giveTeamScore( "kill", attacker.team, attacker, self ); - } - - scoreSub = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "deathpointloss" ); - if ( scoreSub != 0 ) - { - maps\mp\gametypes\_globallogic_score::_setPlayerScore( self, maps\mp\gametypes\_globallogic_score::_getPlayerScore( self ) - scoreSub ); - } - - level thread playKillBattleChatter( attacker, sWeapon ); - - if ( level.teamBased ) - { - //check if assist points should be awarded - awardAssists = true; - } - } - - pixendevent( "PlayerKilled attacker" ); - } - } - else if ( isDefined( attacker ) && ( attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" ) ) - { - doKillcam = false; - - lpattacknum = -1; - lpattackguid = ""; - lpattackname = ""; - lpattackteam = "world"; - - self thread [[level.onXPEvent]]( "suicide" ); - self maps\mp\gametypes\_globallogic_score::incPersStat( "suicides", 1 ); - self.suicides = self maps\mp\gametypes\_globallogic_score::getPersStat( "suicides" ); - - //Check for player death related battlechatter - thread maps\mp\gametypes\_battlechatter_mp::onPlayerSuicideOrTeamKill( self, "suicide" ); //Play suicide battlechatter - - //check if assist points should be awarded - awardAssists = true; - - } - else - { - doKillcam = false; - - lpattacknum = -1; - lpattackguid = ""; - lpattackname = ""; - lpattackteam = "world"; - - // we may have a killcam on an world entity like the rocket in cosmodrome - if ( IsDefined( eInflictor ) && IsDefined( eInflictor.killCamEnt ) ) - { - doKillcam = true; - lpattacknum = self getEntityNumber(); - } - - // even if the attacker isn't a player, it might be on a team - if ( isDefined( attacker ) && isDefined( attacker.team ) && (attacker.team == "axis" || attacker.team == "allies") ) - { - if ( attacker.team != self.team ) - { - if ( level.teamBased ) - maps\mp\gametypes\_globallogic_score::giveTeamScore( "kill", attacker.team, attacker, self ); - } - } - //check if assist points should be awarded - awardAssists = true; - - } - - //award assist points if needed - if( awardAssists ) - { - pixbeginevent( "PlayerKilled assists" ); - - if ( isdefined( self.attackers ) ) - { - for ( j = 0; j < self.attackers.size; j++ ) - { - player = self.attackers[j]; - - if ( !isDefined( player ) ) - continue; - - if ( player == attacker ) - continue; - - damage_done = self.attackerDamage[player.clientId].damage; - player thread maps\mp\gametypes\_globallogic_score::processAssist( self, damage_done); - } - } - - pixendevent( "END: PlayerKilled assists" ); - } - - pixbeginevent( "PlayerKilled post constants" ); - - self.lastAttacker = attacker; - self.lastDeathPos = self.origin; - - if ( isDefined( attacker ) && isPlayer( attacker ) && attacker != self && (!level.teambased || attacker.team != self.team) ) - { - self thread maps\mp\gametypes\_missions::playerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sHitLoc, attackerStance ); - } - else - { - - self notify("playerKilledChallengesProcessed"); - } - - if ( isdefined ( self.attackers )) - self.attackers = []; - if( isPlayer( attacker ) ) - { - if( maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - killstreak = maps\mp\gametypes\_hardpoints::getKillstreakForWeapon( sWeapon ); - bbPrint( "mpattacks: gametime %d attackerspawnid %d attackerweapon %s attackerx %f attackery %f attackerz %f victimspawnid %d victimx %f victimy %f victimz %f damage %d damagetype %s damagelocation %s death 1 killstreak %s", - gettime(), getplayerspawnid( attacker ), sWeapon, lpattackorigin, getplayerspawnid( self ), self.origin, iDamage, sMeansOfDeath, sHitLoc, killstreak ); - } - else - { - bbPrint( "mpattacks: gametime %d attackerspawnid %d attackerweapon %s attackerx %f attackery %f attackerz %f victimspawnid %d victimx %f victimy %f victimz %f damage %d damagetype %s damagelocation %s death 1", - gettime(), getplayerspawnid( attacker ), sWeapon, lpattackorigin, getplayerspawnid( self ), self.origin, iDamage, sMeansOfDeath, sHitLoc ); - } - } - else - { - bbPrint( "mpattacks: gametime %d attackerweapon %s victimspawnid %d victimx %f victimy %f victimz %f damage %d damagetype %s damagelocation %s death 1", - gettime(), sWeapon, getplayerspawnid( self ), self.origin, iDamage, sMeansOfDeath, sHitLoc ); - } - - logPrint( "K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n" ); - attackerString = "none"; - if ( isPlayer( attacker ) ) // attacker can be the worldspawn if it's not a player - attackerString = attacker getXuid() + "(" + lpattackname + ")"; - self logstring( "d " + sMeansOfDeath + "(" + sWeapon + ") a:" + attackerString + " d:" + iDamage + " l:" + sHitLoc + " @ " + int( self.origin[0] ) + " " + int( self.origin[1] ) + " " + int( self.origin[2] ) ); - - level thread maps\mp\gametypes\_globallogic::updateTeamStatus(); - - killcamentity = self getKillcamEntity( attacker, eInflictor, sWeapon ); - killcamentityindex = -1; - killcamentitystarttime = 0; - - if ( isDefined( killcamentity ) ) - { - killcamentityindex = killcamentity getEntityNumber(); // must do this before any waiting lest the entity be deleted - if ( isdefined( killcamentity.startTime ) ) - { - killcamentitystarttime = killcamentity.startTime; - } - else - { - killcamentitystarttime = killcamentity.birthtime; - } - if ( !isdefined( killcamentitystarttime ) ) - killcamentitystarttime = 0; - } - - if ( self IsRemoteControlling() ) - doKillcam = false; - - self maps\mp\gametypes\_weapons::detachCarryObjectModel(); - - died_in_vehicle= false; - if (IsDefined(self.diedOnVehicle)) - { - died_in_vehicle = self.diedOnVehicle; // only works when vehicle blows up - } - pixendevent( "END: PlayerKilled post constants" ); - - pixbeginevent( "PlayerKilled body and gibbing" ); - if ( !died_in_vehicle ) - { - vAttackerOrigin = undefined; - if ( isdefined( attacker ) ) - vAttackerOrigin = attacker.origin; - - ragdoll_now = false; - if( IsDefined(self.usingvehicle) && self.usingvehicle && IsDefined(self.vehicleposition) && self.vehicleposition == 1 ) - ragdoll_now = true; - - if ( sMeansOfDeath == "MOD_FALLING" ) - { - if ( IsDefined( eInflictor ) && IsDefined( eInflictor.script_noteworthy ) && eInflictor.script_noteworthy == "ragdoll_now" ) - { - ragdoll_now = true; - self thread maps\mp\_challenges::fellOffTheMap(); - } - } - - body = self clonePlayer( deathAnimDuration ); - self createDeadBody( iDamage, sMeansOfDeath, sWeapon, sHitLoc, vDir, vAttackerOrigin, deathAnimDuration, eInflictor, ragdoll_now, body ); - } - pixendevent( "END: PlayerKilled body and gibbing" ); - - self.switching_teams = undefined; - self.joining_team = undefined; - self.leaving_team = undefined; - - self thread [[level.onPlayerKilled]](eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration); - - for ( iCB = 0; iCB < level.onPlayerKilledExtraUnthreadedCBs.size; iCB++ ) - { - self [[ level.onPlayerKilledExtraUnthreadedCBs[ iCB ] ]]( - eInflictor, - attacker, - iDamage, - sMeansOfDeath, - sWeapon, - vDir, - sHitLoc, - psOffsetTime, - deathAnimDuration ); - } - - self.wantSafeSpawn = false; - perks = maps\mp\gametypes\_globallogic::getPerks( attacker ); - killstreaks = maps\mp\gametypes\_globallogic::getKillstreaks( attacker ); - - // let the player watch themselves die - wait ( 0.25 ); - - //check if killed by a sniper - weaponClass = maps\mp\gametypes\_missions::getWeaponClass( sWeapon ); - if ( weaponClass == "weapon_sniper" ) - { - self thread maps\mp\gametypes\_battlechatter_mp::KilledBySniper( attacker ); - } - else - { - self thread maps\mp\gametypes\_battlechatter_mp::PlayerKilled( attacker ); - } - self.cancelKillcam = false; - self thread maps\mp\gametypes\_killcam::cancelKillCamOnUse(); - maps\mp\gametypes\_globallogic_utils::waitForTimeOrNotifies( 1.75 ); - self notify ( "death_delay_finished" ); - -/# - if ( GetDvarInt( #"scr_forcekillcam" ) != 0 ) - { - doKillcam = true; - - if ( lpattacknum < 0 ) - lpattacknum = self getEntityNumber(); - } -#/ - - if ( game["state"] != "playing" ) - { - // if no longer playing then this was probably the kill that ended the round - // store off the killcam info - level thread maps\mp\gametypes\_killcam::startFinalKillcam( lpattacknum, self getEntityNumber(), killcamentity, killcamentityindex, killcamentitystarttime, sWeapon, self.deathTime, deathTimeOffset, psOffsetTime, perks, killstreaks, attacker ); - return; - } - - respawnTimerStartTime = gettime(); - - if ( !self.cancelKillcam && doKillcam && level.killcam ) - { - livesLeft = !(level.numLives && !self.pers["lives"]); - timeUntilSpawn = maps\mp\gametypes\_globallogic_spawn::TimeUntilSpawn( true ); - willRespawnImmediately = livesLeft && (timeUntilSpawn <= 0); - - self thread maps\mp\_tutorial::tutorial_display_tip(); - self maps\mp\gametypes\_killcam::killcam( lpattacknum, self getEntityNumber(), killcamentity, killcamentityindex, killcamentitystarttime, sWeapon, self.deathTime, deathTimeOffset, psOffsetTime, willRespawnImmediately, maps\mp\gametypes\_globallogic_utils::timeUntilRoundEnd(), perks, killstreaks, attacker ); - } - - if ( game["state"] != "playing" ) - { - self.sessionstate = "dead"; - self.spectatorclient = -1; - self.killcamtargetentity = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - return; - } - - WaitTillKillStreakDone(); - - // class may be undefined if we have changed teams - if ( maps\mp\gametypes\_globallogic_utils::isValidClass( self.class ) ) - { - timePassed = (gettime() - respawnTimerStartTime) / 1000; - self thread [[level.spawnClient]]( timePassed ); - } -} - -updateGlobalBotKilledCounter() -{ - self endon("disconnect"); - wait( .05 ); - maps\mp\gametypes\_globallogic_utils::WaitTillSlowProcessAllowed(); - - if ( isDefined( self.pers["isBot"] ) ) - { - level.globalLarrysKilled++; - } -} - - -WaitTillKillStreakDone() -{ - if( isdefined( self.killstreak_waitamount ) ) - { - starttime = gettime(); - waitTime = self.killstreak_waitamount * 1000; - - while( (gettime() < (starttime+waitTime)) && isdefined( self.killstreak_waitamount ) ) - { - wait( 0.1 ); - } - - //Plus a small amount so we can see our dead body - wait( 2.0 ); - - self.killstreak_waitamount = undefined; - } -} - -TeamKillKick() -{ - self maps\mp\gametypes\_globallogic_score::incPersStat( "sessionbans", 1 ); - - self endon("disconnect"); - waittillframeend; - - //for test purposes lets lock them out of certain game type for 2mins - - playlistbanquantum = maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillerplaylistbanquantum" ); - playlistbanpenalty = maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillerplaylistbanpenalty" ); - if ( playlistbanquantum > 0 && playlistbanpenalty > 0 ) - { - timeplayedtotal = self maps\mp\gametypes\_persistence::statGet( "time_played_total" ); - minutesplayed = timeplayedtotal / 60; - - freebees = 2; - - banallowance = int( floor(minutesplayed / playlistbanquantum) ) + freebees; - - if ( self.sessionbans > banallowance ) - { - self maps\mp\gametypes\_persistence::statSet( "gametypeban", timeplayedtotal + (playlistbanpenalty * 60), false ); - } - } - - // no waiting because then they could quit and rejoin before the ban -// self setLowerMessage( &"MP_FRIENDLY_FIRE_WILL_NOT", 2 ); - - if ( self is_bot() ) - { - level notify( "bot_kicked", self.team ); - } - - ban( self getentitynumber(), 1 ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "kicked" ); -} - -TeamKillDelay() -{ - teamkills = self.pers["teamkills_nostats"]; - if ( level.minimumAllowedTeamKills < 0 || teamkills <= level.minimumAllowedTeamKills ) - return 0; - - exceeded = (teamkills - level.minimumAllowedTeamKills); - return maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillspawndelay" ) * exceeded; -} - - -ShouldTeamKillKick(teamKillDelay) -{ - if ( teamKillDelay && maps\mp\gametypes\_tweakables::getTweakableValue( "team", "kickteamkillers" ) ) - { - // if its more then 5 seconds into the match and we have a delay then just kick them - if ( maps\mp\gametypes\_globallogic_utils::getTimePassed() >= 5000 ) - { - return true; - } - - // if its under 5 seconds into the match only kick them if they have killed more then one players so far - if ( self.pers["teamkills_nostats"] > 1 ) - { - return true; - } - } - - return false; -} - -reduceTeamKillsOverTime() -{ - timePerOneTeamkillReduction = 20.0; - reductionPerSecond = 1.0 / timePerOneTeamkillReduction; - - while(1) - { - if ( isAlive( self ) ) - { - self.pers["teamkills_nostats"] -= reductionPerSecond; - if ( self.pers["teamkills_nostats"] < level.minimumAllowedTeamKills ) - { - self.pers["teamkills_nostats"] = level.minimumAllowedTeamKills; - break; - } - } - wait 1; - } -} - - -IgnoreTeamKills( sWeapon, sMeansOfDeath ) -{ - if ( sMeansOfDeath == "MOD_MELEE" ) - return false; - - if ( sWeapon == "briefcase_bomb_mp" ) - return true; - - if ( sWeapon == "supplydrop_mp" ) - return true; - -// if ( isSubStr( sWeapon, "mine_bouncing_betty_" ) ) -// return true; - - return false; -} - - -Callback_PlayerLastStand( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) -{ - maps\mp\_laststand::playerlaststand(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ); -} - - -damageShellshockAndRumble( eAttacker, eInflictor, sWeapon, sMeansOfDeath, iDamage ) -{ - self thread maps\mp\gametypes\_weapons::onWeaponDamage( eAttacker, eInflictor, sWeapon, sMeansOfDeath, iDamage ); - self PlayRumbleOnEntity( "damage_heavy" ); -} - - -createDeadBody( iDamage, sMeansOfDeath, sWeapon, sHitLoc, vDir, vAttackerOrigin, deathAnimDuration, eInflictor, ragdoll_jib, body ) -{ - if ( sMeansOfDeath == "MOD_HIT_BY_OBJECT" && self GetStance() == "prone" ) - { - self.body = body; - if ( !isDefined( self.switching_teams ) ) - thread maps\mp\gametypes\_deathicons::addDeathicon( body, self, self.team, 5.0 ); - - return; - } - - if ( IsDefined( level.ragdoll_override ) && self [[level.ragdoll_override]]() ) - { - return; - } - - if ( ragdoll_jib || self isOnLadder() || self isMantling() || sMeansOfDeath == "MOD_CRUSH" || sMeansOfDeath == "MOD_HIT_BY_OBJECT" ) - body startRagDoll(); - - if ( !self IsOnGround() ) - { - if ( GetDvarInt( #"scr_disable_air_death_ragdoll" ) == 0 ) - { - body startRagDoll(); - } - } - - if ( self is_explosive_ragdoll( sWeapon, eInflictor ) ) - { - body start_explosive_ragdoll( vDir, sWeapon ); - } - - thread delayStartRagdoll( body, sHitLoc, vDir, sWeapon, eInflictor, sMeansOfDeath ); - - if( sMeansOfDeath == "MOD_BURNED" || isdefined( self.burning ) ) - { - body maps\mp\_burnplayer::burnedToDeath(); - } - if ( sMeansOfDeath == "MOD_CRUSH" ) - { - body maps\mp\gametypes\_globallogic_vehicle::vehicleCrush(); - } - - self.body = body; - if ( !isDefined( self.switching_teams ) ) - thread maps\mp\gametypes\_deathicons::addDeathicon( body, self, self.team, 5.0 ); -} - -is_explosive_ragdoll( weapon, inflictor ) -{ - if ( !IsDefined( weapon ) ) - { - return false; - } - - // destructible explosives - if ( weapon == "destructible_car_mp" || weapon == "explodable_barrel_mp" ) - { - return true; - } - - // special explosive weapons - if ( weapon == "sticky_grenade_mp" || weapon == "explosive_bolt_mp" ) - { - if ( IsDefined( inflictor ) && IsDefined( inflictor.stuckToPlayer ) ) - { - if ( inflictor.stuckToPlayer == self ) - { - return true; - } - } - } - - return false; -} - -start_explosive_ragdoll( dir, weapon ) -{ - if ( !IsDefined( self ) ) - { - return; - } - - x = RandomIntRange( 50, 100 ); - y = RandomIntRange( 50, 100 ); - z = RandomIntRange( 10, 20 ); - - if ( IsDefined( weapon ) && ( weapon == "sticky_grenade_mp" || weapon == "explosive_bolt_mp" ) ) - { - if ( IsDefined( dir ) && LengthSquared( dir ) > 0 ) - { - x = dir[0] * x; - y = dir[1] * y; - } - } - else - { - if ( cointoss() ) - { - x = x * -1; - } - if ( cointoss() ) - { - y = y * -1; - } - } - - self StartRagdoll(); - self LaunchRagdoll( ( x, y, z ) ); -} - - -notifyConnecting() -{ - waittillframeend; - - if( isDefined( self ) ) - level notify( "connecting", self ); -} - - -delayStartRagdoll( ent, sHitLoc, vDir, sWeapon, eInflictor, sMeansOfDeath ) -{ - if ( isDefined( ent ) ) - { - deathAnim = ent getcorpseanim(); - if ( animhasnotetrack( deathAnim, "ignore_ragdoll" ) ) - return; - } - - if ( level.oldschool ) - { - if ( !isDefined( vDir ) ) - vDir = (0,0,0); - - explosionPos = ent.origin + ( 0, 0, maps\mp\gametypes\_globallogic_utils::getHitLocHeight( sHitLoc ) ); - explosionPos -= vDir * 20; - //thread maps\mp\gametypes\_globallogic_utils::debugLine( ent.origin + (0,0,(explosionPos[2] - ent.origin[2])), explosionPos ); - explosionRadius = 40; - explosionForce = .75; - if ( sMeansOfDeath == "MOD_IMPACT" || sMeansOfDeath == "MOD_EXPLOSIVE" || isSubStr(sMeansOfDeath, "MOD_GRENADE") || isSubStr(sMeansOfDeath, "MOD_PROJECTILE") || sHitLoc == "head" || sHitLoc == "helmet" ) - { - explosionForce = 2.5; - } - - ent startragdoll( 1 ); - - wait .05; - - if ( !isDefined( ent ) ) - return; - - // apply extra physics force to make the ragdoll go crazy - physicsExplosionSphere( explosionPos, explosionRadius, explosionRadius/2, explosionForce ); - return; - } - - wait( 0.2 ); - - if ( !isDefined( ent ) ) - return; - - if ( ent isRagDoll() ) - return; - - deathAnim = ent getcorpseanim(); - - startFrac = 0.35; - - if ( animhasnotetrack( deathAnim, "start_ragdoll" ) ) - { - times = getnotetracktimes( deathAnim, "start_ragdoll" ); - if ( isDefined( times ) ) - startFrac = times[0]; - } - - waitTime = startFrac * getanimlength( deathAnim ); - wait( waitTime ); - - if ( isDefined( ent ) ) - { - println( "Ragdolling after " + waitTime + " seconds" ); - ent startragdoll( 1 ); - } -} - -trackAttackerDamage( eAttacker, iDamage, sMeansOfDeath, sWeapon ) -{ - Assert( isPlayer( eAttacker ) ); - - if ( !isdefined( self.attackerData[eAttacker.clientid] ) ) - { - self.attackerDamage[eAttacker.clientid] = spawnstruct(); - self.attackerDamage[eAttacker.clientid].damage = iDamage; - self.attackerDamage[eAttacker.clientid].meansOfDeath = sMeansOfDeath; - self.attackerDamage[eAttacker.clientid].weapon = sWeapon; - self.attackerDamage[eAttacker.clientid].time = getTime(); - self.attackers[ self.attackers.size ] = eAttacker; - // we keep an array of attackers by their client ID so we can easily tell - // if they're already one of the existing attackers in the above if(). - // we store in this array data that is useful for other things, like challenges - self.attackerData[eAttacker.clientid] = false; - } - else - { - self.attackerDamage[eAttacker.clientid].damage += iDamage; - self.attackerDamage[eAttacker.clientid].meansOfDeath = sMeansOfDeath; - self.attackerDamage[eAttacker.clientid].weapon = sWeapon; - if ( !isdefined( self.attackerDamage[eAttacker.clientid].time ) ) - self.attackerDamage[eAttacker.clientid].time = getTime(); - } - - self.attackerDamage[eAttacker.clientid].lasttimedamaged = getTime(); - if ( maps\mp\gametypes\_weapons::isPrimaryWeapon( sWeapon ) ) - self.attackerData[eAttacker.clientid] = true; -} - -giveInflictorOwnerAssist( eAttacker, eInflictor, iDamage, sMeansOfDeath, sWeapon ) -{ - if ( !isDefined( eInflictor ) ) - return; - - if ( !isDefined( eInflictor.owner ) ) - return; - - if ( !IsDefined( eInflictor.ownerGetsAssist ) ) - return; - - if ( !eInflictor.ownerGetsAssist ) - return; - - Assert( isPlayer( eInflictor.owner ) ); - - trackAttackerDamage( eInflictor.owner, iDamage, sMeansOfDeath, sWeapon ); -} - -updateMeansOfDeath( sWeapon, sMeansOfDeath ) -{ - // we do not want the melee icon to show up for dog attacks - // AE 10-22-09: added the check for the crossbow so that it'll show the right icon - switch(sWeapon) - { - case "crossbow_mp": - case "knife_ballistic_mp": - { - if ( ( sMeansOfDeath != "MOD_HEAD_SHOT" ) && ( sMeansOfDeath != "MOD_MELEE" ) ) - { - sMeansOfDeath = "MOD_PISTOL_BULLET"; - } - } - break; - case "dog_bite_mp": - sMeansOfDeath = "MOD_PISTOL_BULLET"; - break; - case "destructible_car_mp": - sMeansOfDeath = "MOD_EXPLOSIVE"; - break; - case "explodable_barrel_mp": - sMeansOfDeath = "MOD_EXPLOSIVE"; - break; - } - - return sMeansOfDeath; -} - -updateAttacker( attacker ) -{ - if( isai(attacker) && isDefined( attacker.script_owner ) ) - { - // if the person who called the dogs in switched teams make sure they don't - // get penalized for the kill - if ( !level.teambased || attacker.script_owner.team != self.team ) - attacker = attacker.script_owner; - } - - if( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) - { - attacker notify("killed",self); - - attacker = attacker.owner; - } - - if( isai(attacker) ) - attacker notify("killed",self); - - if ( ( isdefined ( self.capturingLastFlag ) ) && ( self.capturingLastFlag == true ) ) - { - attacker.lastCapKiller = true; - } - - return attacker; -} - -updateInflictor( eInflictor ) -{ - if( IsDefined( eInflictor ) && eInflictor.classname == "script_vehicle" ) - { - eInflictor notify("killed",self); - } - - return eInflictor; -} - -updateWeapon( eInflictor, sWeapon ) -{ - // explosive barrel/car detection - if ( sWeapon == "none" && isDefined( eInflictor ) ) - { - if ( isDefined( eInflictor.targetname ) && eInflictor.targetname == "explodable_barrel" ) - sWeapon = "explodable_barrel_mp"; - else if ( isDefined( eInflictor.destructible_type ) && isSubStr( eInflictor.destructible_type, "vehicle_" ) ) - sWeapon = "destructible_car_mp"; - } - - return sWeapon; -} - -getClosestKillcamEntity( attacker, killCamEntities ) -{ - closestKillcamEnt = undefined; - closestKillcamEntDist = undefined; - origin = undefined; - - for ( killcamEntIndex = 0; killcamEntIndex < killCamEntities.size; killcamEntIndex++ ) - { - killcamEnt = killCamEntities[killcamEntIndex]; - if ( killcamEnt == attacker ) - continue; - - origin = killcamEnt.origin; - if ( IsDefined( killcamEnt.offsetPoint ) ) - origin += killcamEnt.offsetPoint; - - dist = DistanceSquared( self.origin, origin ); - - if ( !IsDefined( closestKillcamEnt ) || dist < closestKillcamEntDist ) - { - closestKillcamEnt = killcamEnt; - closestKillcamEntDist = dist; - } - } - - return closestKillcamEnt; -} - -getKillcamEntity( attacker, eInflictor, sWeapon ) -{ - if ( !isDefined( eInflictor ) ) - return undefined; - - if ( eInflictor == attacker ) - { - if( !IsDefined( eInflictor.isMagicBullet ) ) - return undefined; - if( IsDefined( eInflictor.isMagicBullet ) && !eInflictor.isMagicBullet ) - return undefined; - } - else if ( isdefined( level.levelSpecificKillcam ) ) - { - levelSpecificKillcamEnt = self [[level.levelSpecificKillcam]](); - if ( isdefined( levelSpecificKillcamEnt ) ) - return levelSpecificKillcamEnt; - } - - if ( sWeapon == "m220_tow_mp" ) - return undefined; - - if ( isDefined(eInflictor.killCamEnt) ) - { - // this is the case with the player helis - if ( eInflictor.killCamEnt == attacker ) - return undefined; - - return eInflictor.killCamEnt; - } - else if ( isDefined(eInflictor.killCamEntities) ) - { - return getClosestKillcamEntity( attacker, eInflictor.killCamEntities ); - } - - if ( isDefined( eInflictor.script_gameobjectname ) && eInflictor.script_gameobjectname == "bombzone" ) - return eInflictor.killCamEnt; - - //if ( eInflictor.classname == "script_origin" || eInflictor.classname == "script_model" || eInflictor.classname == "script_brushmodel" ) - // return undefined; // probably a barrel or a car... code does airstrike cam for these things which looks bad - - return eInflictor; -} - -playKillBattleChatter( attacker, sWeapon ) -{ - if( IsPlayer( attacker ) ) - { - if( isDefined(level.bcKillInformProbability) && randomIntRange( 0, 100 ) >= level.bcKillInformProbability ) - { - if ( !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - level thread maps\mp\gametypes\_battlechatter_mp::sayLocalSoundDelayed( attacker, "kill", "infantry", 0.75 ); - } - } - } -} diff --git a/mods/patch_mp/maps/mp/gametypes/_globallogic_score.gsc b/mods/patch_mp/maps/mp/gametypes/_globallogic_score.gsc deleted file mode 100644 index 245c1c7..0000000 --- a/mods/patch_mp/maps/mp/gametypes/_globallogic_score.gsc +++ /dev/null @@ -1,1070 +0,0 @@ -#include maps\mp\_utility; - -updateMatchBonusScores( winner ) -{ - if ( !game["timepassed"] ) - return; - - if ( !level.rankedMatch ) - return; - - // dont give the bonus until the game is over - if ( level.teamBased && isDefined( winner ) ) - { - if ( winner == "endregulation" ) - return; - } - - if ( !level.timeLimit || level.forcedEnd ) - { - gameLength = maps\mp\gametypes\_globallogic_utils::getTimePassed() / 1000; - // cap it at 20 minutes to avoid exploiting - gameLength = min( gameLength, 1200 ); - - // the bonus for final fight needs to be based on the total time played - if ( level.gameType == "twar" && game["roundsplayed"] > 0 ) - gameLength += level.timeLimit * 60; - } - else - { - gameLength = level.timeLimit * 60; - } - - if ( level.teamBased ) - { - if ( winner == "allies" ) - { - winningTeam = "allies"; - losingTeam = "axis"; - } - else if ( winner == "axis" ) - { - winningTeam = "axis"; - losingTeam = "allies"; - } - else - { - winningTeam = "tie"; - losingTeam = "tie"; - } - - if ( winningTeam != "tie" ) - { - winnerScale = maps\mp\gametypes\_rank::getScoreInfoValue( "win" ); - loserScale = maps\mp\gametypes\_rank::getScoreInfoValue( "loss" ); - } - else - { - winnerScale = maps\mp\gametypes\_rank::getScoreInfoValue( "tie" ); - loserScale = maps\mp\gametypes\_rank::getScoreInfoValue( "tie" ); - } - - players = level.players; - for( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( player.timePlayed["total"] < 1 || player.pers["participation"] < 1 ) - { - player thread maps\mp\gametypes\_rank::endGameUpdate(); - continue; - } - - totalTimePlayed = player.timePlayed["total"]; - - // make sure the players total time played is no - // longer then the game length to prevent exploits - if ( totalTimePlayed > gameLength ) - { - totalTimePlayed = gameLength; - } - - // no bonus for hosts who force ends - if ( level.hostForcedEnd && player IsHost() ) - continue; - - // no match bonus if negative game score - if ( player.pers["score"] < 0 ) - continue; - - spm = player maps\mp\gametypes\_rank::getSPM(); - if ( winningTeam == "tie" ) - { - playerScore = int( (winnerScale * ((gameLength/60) * spm)) * (totalTimePlayed / gameLength) ); - player thread giveMatchBonus( "tie", playerScore ); - player.matchBonus = playerScore; - } - else if ( isDefined( player.pers["team"] ) && player.pers["team"] == winningTeam ) - { - playerScore = int( (winnerScale * ((gameLength/60) * spm)) * (totalTimePlayed / gameLength) ); - player thread giveMatchBonus( "win", playerScore ); - player.matchBonus = playerScore; - } - else if ( isDefined(player.pers["team"] ) && player.pers["team"] == losingTeam ) - { - playerScore = int( (loserScale * ((gameLength/60) * spm)) * (totalTimePlayed / gameLength) ); - player thread giveMatchBonus( "loss", playerScore ); - player.matchBonus = playerScore; - } - } - } - else - { - if ( isDefined( winner ) ) - { - winnerScale = maps\mp\gametypes\_rank::getScoreInfoValue( "win" ); - loserScale = maps\mp\gametypes\_rank::getScoreInfoValue( "loss" ); - } - else - { - winnerScale = maps\mp\gametypes\_rank::getScoreInfoValue( "tie" ); - loserScale = maps\mp\gametypes\_rank::getScoreInfoValue( "tie" ); - } - - players = level.players; - for( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( player.timePlayed["total"] < 1 || player.pers["participation"] < 1 ) - { - player thread maps\mp\gametypes\_rank::endGameUpdate(); - continue; - } - - totalTimePlayed = player.timePlayed["total"]; - - // make sure the players total time played is no - // longer then the game length to prevent exploits - if ( totalTimePlayed > gameLength ) - { - totalTimePlayed = gameLength; - } - - spm = player maps\mp\gametypes\_rank::getSPM(); - - isWinner = false; - for ( pIdx = 0; pIdx < min( level.placement["all"][0].size, 3 ); pIdx++ ) - { - if ( level.placement["all"][pIdx] != player ) - continue; - isWinner = true; - } - - if ( isWinner ) - { - playerScore = int( (winnerScale * ((gameLength/60) * spm)) * (totalTimePlayed / gameLength) ); - player thread giveMatchBonus( "win", playerScore ); - player.matchBonus = playerScore; - } - else - { - playerScore = int( (loserScale * ((gameLength/60) * spm)) * (totalTimePlayed / gameLength) ); - player thread giveMatchBonus( "loss", playerScore ); - player.matchBonus = playerScore; - } - } - } -} - - -giveMatchBonus( scoreType, score ) -{ - self endon ( "disconnect" ); - - level waittill ( "give_match_bonus" ); - - self maps\mp\gametypes\_rank::giveRankXP( scoreType, score ); - logXPGains(); - - self maps\mp\gametypes\_rank::endGameUpdate(); -} - - -setXenonRanks( winner ) -{ - players = level.players; - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if( !isdefined(player.score) || !isdefined(player.pers["team"]) ) - continue; - - } - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if( !isdefined(player.score) || !isdefined(player.pers["team"]) ) - continue; - - setPlayerTeamRank( player, i, player.score - 5 * player.deaths ); - player logString( "team: score " + player.pers["team"] + ":" + player.score ); - } - sendranks(); -} - - -getHighestScoringPlayer() -{ - players = level.players; - winner = undefined; - tie = false; - - for( i = 0; i < players.size; i++ ) - { - if ( !isDefined( players[i].score ) ) - continue; - - if ( players[i].score < 1 ) - continue; - - if ( !isDefined( winner ) || players[i].score > winner.score ) - { - winner = players[i]; - tie = false; - } - else if ( players[i].score == winner.score ) - { - tie = true; - } - } - - if ( tie || !isDefined( winner ) ) - return undefined; - else - return winner; -} - - -onXPEvent( event ) -{ - self maps\mp\gametypes\_rank::giveRankXP( event ); -} - -givePlayerScore( event, player, victim ) -{ - if ( level.overridePlayerScore ) - return; - - pixbeginevent("level.onPlayerScore"); - score = player.pers["score"]; - [[level.onPlayerScore]]( event, player, victim ); - newScore = player.pers["score"]; - pixendevent(); - - bbPrint( "mpplayerscore: gametime %d type %s player %s delta %d", getTime(), event, player.name, newScore - score ); - - if ( score == newScore ) - return; - - pixbeginevent("givePlayerScore"); - recordPlayerStats( player, "score" , newScore ); - - if ( level.rankedMatch || level.wagerMatch ) - { - player maps\mp\gametypes\_persistence::statAdd( "score", (newScore - score), false ); - player maps\mp\gametypes\_persistence::statAddWithGameType( "SCORE", (newScore - score) ); - if ( isDefined( player.pers["lastHighestScore"] ) && newScore > player.pers["lastHighestScore"] ) - { - player setDStat( "HighestStats", "highest_score", newScore ); - } - - if( !level.wagerMatch ) - { - player maps\mp\gametypes\_persistence::addRecentStat( false, 0, "score", (newScore - score) ); - player maps\mp\gametypes\_persistence::addRecentStat( true, 0, "score", (newScore - score) ); - } - } - pixendevent(); -} - -default_onPlayerScore( event, player, victim ) -{ - score = maps\mp\gametypes\_rank::getScoreInfoValue( event ); - - assert( isDefined( score ) ); - /* - if ( event == "assist" ) - player.pers["score"] += 2; - else - player.pers["score"] += 10; - */ - - if ( level.wagerMatch ) - { - player thread maps\mp\gametypes\_rank::updateRankScoreHUD( score ); - } - - _setPlayerScore( player, player.pers["score"] + score ); -} - - -_setPlayerScore( player, score ) -{ - if ( score == player.pers["score"] ) - return; - - if ( !level.onlineGame || ( GetDvarInt( #"xblive_privatematch" ) && !GetDvarInt( #"xblive_basictraining" ) ) ) - { - player thread maps\mp\gametypes\_rank::updateRankScoreHUD( score - player.pers["score"] ); - } - - player.pers["score"] = score; - player.score = player.pers["score"]; - recordPlayerStats( player, "score" , player.pers["score"] ); - - player notify ( "update_playerscore_hud" ); - if ( level.wagerMatch ) - player thread maps\mp\gametypes\_wager::playerScored(); - player thread maps\mp\gametypes\_globallogic::checkScoreLimit(); - player thread maps\mp\gametypes\_globallogic::checkPlayerScoreLimitSoon(); - -} - - -_getPlayerScore( player ) -{ - return player.pers["score"]; -} - - -giveTeamScore( event, team, player, victim ) -{ - if ( level.overrideTeamScore ) - return; - - pixbeginevent("level.onTeamScore"); - teamScore = game["teamScores"][team]; - [[level.onTeamScore]]( event, team, player, victim ); - pixendevent(); - - newScore = game["teamScores"][team]; - - bbPrint( "mpteamscores: gametime %d event %s team %d diff %d score %d", getTime(), event, team, newScore - teamScore, newScore ); - - if ( teamScore == newScore ) - return; - - updateTeamScores( team ); - - thread maps\mp\gametypes\_globallogic::checkScoreLimit(); -} - -_setTeamScore( team, teamScore ) -{ - if ( teamScore == game["teamScores"][team] ) - return; - - game["teamScores"][team] = teamScore; - - updateTeamScores( team ); - - thread maps\mp\gametypes\_globallogic::checkScoreLimit(); -} - -resetTeamScores() -{ - game["teamScores"]["allies"] = 0; - game["teamScores"]["axis"] = 0; - maps\mp\gametypes\_globallogic_score::updateTeamScores("allies","axis"); -} - -resetAllScores() -{ - resetTeamScores(); - resetPlayerScores(); -} - -resetPlayerScores() -{ - players = level.players; - winner = undefined; - tie = false; - - for( i = 0; i < players.size; i++ ) - { - - if ( IsDefined( players[i].pers["score"] ) ) - _setPlayerScore( players[i], 0 ); - - } -} - -updateTeamScores( team1, team2 ) -{ - setTeamScore( team1, getGameScore( team1 ) ); - level thread maps\mp\gametypes\_globallogic::checkTeamScoreLimitSoon( team1 ); - if ( isdefined( team2 ) ) - { - setTeamScore( team2, getGameScore( team2 ) ); - level thread maps\mp\gametypes\_globallogic::checkTeamScoreLimitSoon( team2 ); - } -} - -_getTeamScore( team ) -{ - return game["teamScores"][team]; -} - -onTeamScore( score, team, player, victim ) -{ - otherTeam = level.otherTeam[team]; - - if ( game["teamScores"][team] > game["teamScores"][otherTeam] ) - level.wasWinning = team; - else if ( game["teamScores"][otherTeam] > game["teamScores"][team] ) - level.wasWinning = otherTeam; - - game["teamScores"][team] += score; - - isWinning = "none"; - if ( game["teamScores"][team] > game["teamScores"][otherTeam] ) - isWinning = team; - else if ( game["teamScores"][otherTeam] > game["teamScores"][team] ) - isWinning = otherTeam; - - if ( !level.splitScreen && isWinning != "none" && isWinning != level.wasWinning && getTime() - level.lastStatusTime > 5000 ) - { - level.lastStatusTime = getTime(); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "lead_taken", isWinning, "status" ); - if ( level.wasWinning != "none") - maps\mp\gametypes\_globallogic_audio::leaderDialog( "lead_lost", level.wasWinning, "status" ); - } - - if ( isWinning != "none" ) - level.wasWinning = isWinning; -} - - -default_onTeamScore( event, team, player, victim ) -{ - score = maps\mp\gametypes\_rank::getScoreInfoValue( event ); - - assert( isDefined( score ) ); - - onTeamScore( score, team, player, victim ); -} - -initPersStat( dataName, record_stats ) -{ - if( !isDefined( self.pers[dataName] ) ) - { - self.pers[dataName] = 0; - } - - if ( !isdefined(record_stats) || record_stats == true ) - { - recordPlayerStats( self, dataName, int(self.pers[dataName]) ); - } -} - - -getPersStat( dataName ) -{ - return self.pers[dataName]; -} - - -incPersStat( dataName, increment, record_stats, includeGametype ) -{ - pixbeginevent( "incPersStat" ); - - self.pers[dataName] += increment; - self maps\mp\gametypes\_persistence::statAdd( dataName, increment, includeGametype ); - - if ( !isdefined(record_stats) || record_stats == true ) - { - self thread threadedRecordPlayerStats( dataName ); - } - - pixendevent(); -} - -threadedRecordPlayerStats( dataName ) -{ - self endon("disconnect"); - waittillframeend; - - recordPlayerStats( self, dataName, self.pers[dataName] ); -} - -updatePersRatio( ratio, num, denom ) -{ - pixbeginevent( "updatePersRatio" ); - numValue = self maps\mp\gametypes\_persistence::statGet( num ); - denomValue = self maps\mp\gametypes\_persistence::statGet( denom ); - if ( denomValue == 0 ) - denomValue = 1; - - self maps\mp\gametypes\_persistence::statSet( ratio, int( (numValue * 1000) / denomValue ) ); - - numValue = self maps\mp\gametypes\_persistence::statGetWithGameType( num ); - denomValue = self maps\mp\gametypes\_persistence::statGetWithGameType( denom ); - if ( denomValue == 0 ) - denomValue = 1; - - self maps\mp\gametypes\_persistence::statSetWithGameType( ratio, int( (numValue * 1000) / denomValue ) ); - - if( ratio == "kdratio" && !level.wagerMatch ) - { - self maps\mp\gametypes\_persistence::setRecentStat( true, 0, "kills", self.kills ); - self maps\mp\gametypes\_persistence::setRecentStat( true, 0, "deaths", self.deaths ); - } - pixendevent(); // "updatePersRatio" -} - -updateWinStats( winner ) -{ - winner maps\mp\gametypes\_persistence::statAdd( "losses", -1, true ); - - println( "setting winner: " + winner maps\mp\gametypes\_persistence::statGet( "wins" ) ); - winner maps\mp\gametypes\_persistence::statAdd( "wins", 1, true ); - winner updatePersRatio( "wlratio", "wins", "losses" ); - - // restore winstreak, this is set to 0 on connect - restoreWinStreaks( winner ); - - // add this win to the winstreak - winner maps\mp\gametypes\_persistence::statAdd( "cur_win_streak", 1 ); - - // This notify is used for the contracts system. It allows it to reset a contract's progress on this notify. - winner notify( "win" ); - - cur_gamemode_win_streak = winner maps\mp\gametypes\_persistence::statGetWithGameType( "cur_win_streak" ); - gamemode_win_streak = winner maps\mp\gametypes\_persistence::statGetWithGameType( "win_streak" ); - - cur_win_streak = winner maps\mp\gametypes\_persistence::statGet( "cur_win_streak" ); - if ( cur_win_streak > winner getDStat( "HighestStats", "win_streak" ) ) - { - winner setDStat( "HighestStats", "win_streak", cur_win_streak ); - } - - if ( cur_gamemode_win_streak > gamemode_win_streak ) - { - winner maps\mp\gametypes\_persistence::statSetWithGameType( "win_streak", cur_gamemode_win_streak ); - } - -} - -updateLossStats( loser ) -{ - loser maps\mp\gametypes\_persistence::statAdd( "losses", 1, true ); - loser updatePersRatio( "wlratio", "wins", "losses" ); - // This notify is used for the contracts system. It allows it to reset a contract's progress on this notify. - loser notify( "loss" ); -} - - -updateTieStats( loser ) -{ - loser maps\mp\gametypes\_persistence::statAdd( "losses", -1, true ); - - loser maps\mp\gametypes\_persistence::statAdd( "ties", 1, true ); - loser updatePersRatio( "wlratio", "wins", "losses" ); - loser maps\mp\gametypes\_persistence::statSet( "cur_win_streak", 0 ); - // This notify is used for the contracts system. It allows it to reset a contract's progress on this notify. - loser notify( "tie" ); -} - -updateWinLossStats( winner ) -{ - if ( !wasLastRound() && !level.hostForcedEnd ) - return; - - players = level.players; - - if ( !isDefined( winner ) || ( isDefined( winner ) && !isPlayer( winner ) && winner == "tie" ) ) - { - for ( i = 0; i < players.size; i++ ) - { - if ( !isDefined( players[i].pers["team"] ) ) - continue; - - if ( level.hostForcedEnd && players[i] IsHost() ) - continue; - - updateTieStats( players[i] ); - } - } - else if ( isPlayer( winner ) ) - { - if ( level.hostForcedEnd && winner IsHost() ) - return; - - updateWinStats( winner ); - } - else - { - for ( i = 0; i < players.size; i++ ) - { - if ( !isDefined( players[i].pers["team"] ) ) - continue; - - if ( level.hostForcedEnd && players[i] IsHost() ) - continue; - - if ( winner == "tie" ) - updateTieStats( players[i] ); - else if ( players[i].pers["team"] == winner ) - updateWinStats( players[i] ); - else - players[i] maps\mp\gametypes\_persistence::statSet( "cur_win_streak", 0 ); - - } - } -} - -// self is the player -backupAndClearWinStreaks() -{ - // Global - self.pers[ "winStreak" ] = maps\mp\gametypes\_persistence::statGet( "cur_win_streak" ); - self maps\mp\gametypes\_persistence::statSet( "cur_win_streak", 0 ); - - // Gametype - self.pers[ "winStreakForGametype" ] = maps\mp\gametypes\_persistence::statGetWithGameType( "cur_win_streak" ); - self maps\mp\gametypes\_persistence::statSetWithGameType( "cur_win_streak", 0 ); -} - -restoreWinStreaks( winner ) -{ - // Global - winner maps\mp\gametypes\_persistence::statSet( "cur_win_streak", winner.pers[ "winStreak" ] ); - - // Gametype - winner maps\mp\gametypes\_persistence::statSetWithGameType( "cur_win_streak", winner.pers[ "winStreakForGametype" ] ); -} - -getGameScore( team ) -{ - return game["teamScores"][team]; -} - - -incKillstreakTracker( sWeapon ) -{ - self endon("disconnect"); - - waittillframeend; - - if( sWeapon == "artillery_mp" ) - self.pers["artillery_kills"]++; - - if( sWeapon == "dog_bite_mp" ) - self.pers["dog_kills"]++; -} - -trackLeaderBoardDeathStats( sWeapon, sMeansOfDeath ) -{ - self thread threadedSetWeaponStatByName( sWeapon, 1, "deaths" ); -} - -trackLeaderBoardDeathsDuringUseStats( sWeapon ) -{ - self thread threadedSetWeaponStatByName( sWeapon, 1, "deathsDuringUse" ); -} - -trackAttackerLeaderBoardDeathStats( sWeapon, sMeansOfDeath ) -{ - if ( isdefined( self ) && isplayer( self ) ) - { - if ( sMeansOfDeath != "MOD_FALLING" ) - { - self thread threadedSetWeaponStatByName( sWeapon, 1, "kills" ); - } - - if ( sMeansOfDeath == "MOD_HEAD_SHOT" ) - { - self thread threadedSetWeaponStatByName( sWeapon, 1, "headshots" ); - } - } -} - -trackAttackerKill( name, rank, xp, prestige, xuid ) -{ - self endon("disconnect"); - attacker = self; - - waittillframeend; - - pixbeginevent("trackAttackerKill"); - - if ( !isDefined( attacker.pers["killed_players"][name] ) ) - attacker.pers["killed_players"][name] = 0; - - if ( !isDefined( attacker.killedPlayersCurrent[name] ) ) - attacker.killedPlayersCurrent[name] = 0; - - if ( !isDefined( attacker.pers["nemesis_tracking"][name] ) ) - attacker.pers["nemesis_tracking"][name] = 0; - - attacker.pers["killed_players"][name]++; - attacker.killedPlayersCurrent[name]++; - attacker.pers["nemesis_tracking"][name] += 1.0; - - if( attacker.pers["nemesis_name"] == "" || attacker.pers["nemesis_tracking"][name] > attacker.pers["nemesis_tracking"][attacker.pers["nemesis_name"]] ) - { - attacker.pers["nemesis_name"] = name; - attacker.pers["nemesis_rank"] = rank; - attacker.pers["nemesis_rankIcon"] = prestige; - attacker.pers["nemesis_xp"] = xp; - attacker.pers["nemesis_xuid"] = xuid; - } - else if( isDefined( attacker.pers["nemesis_name"] ) && ( attacker.pers["nemesis_name"] == name ) ) - { - attacker.pers["nemesis_rank"] = rank; - attacker.pers["nemesis_xp"] = xp; - } - - pixendevent(); -} - -trackAttackeeDeath( attackerName, rank, xp, prestige, xuid ) -{ - self endon("disconnect"); - - waittillframeend; - - pixbeginevent("trackAttackeeDeath"); - - if ( !isDefined( self.pers["killed_by"][attackerName] ) ) - self.pers["killed_by"][attackerName] = 0; - - self.pers["killed_by"][attackerName]++; - - if ( !isDefined( self.pers["nemesis_tracking"][attackerName] ) ) - self.pers["nemesis_tracking"][attackerName] = 0; - - self.pers["nemesis_tracking"][attackerName] += 1.5; - - if( self.pers["nemesis_name"] == "" || self.pers["nemesis_tracking"][attackerName] > self.pers["nemesis_tracking"][self.pers["nemesis_name"]] ) - { - self.pers["nemesis_name"] = attackerName; - self.pers["nemesis_rank"] = rank; - self.pers["nemesis_rankIcon"] = prestige; - self.pers["nemesis_xp"] = xp; - self.pers["nemesis_xuid"] =xuid; - } - else if( isDefined( self.pers["nemesis_name"] ) && ( self.pers["nemesis_name"] == attackerName ) ) - { - self.pers["nemesis_rank"] = rank; - self.pers["nemesis_xp"] = xp; - } - - //Nemesis Killcam - ( hopefully even with the wait it gets there with enough time not to cause a flicker) - if( self.pers["nemesis_name"] == attackerName && self.pers["nemesis_tracking"][attackerName] >= 2 ) - self setClientUIVisibilityFlag( "killcam_nemesis", 1 ); - else - self setClientUIVisibilityFlag( "killcam_nemesis", 0 ); - - pixendevent(); -} - -default_isKillBoosting() -{ - return false; -} - -giveKillStats( sMeansOfDeath, sWeapon, eVictim ) -{ - self endon("disconnect"); - - waittillframeend; - - if ( !GetDvarInt( #"xblive_privatematch" ) && self [[level.isKillBoosting]]() ) - { - return; - } - - pixbeginevent("giveKillXP"); - - self maps\mp\gametypes\_globallogic_score::incPersStat( "kills", 1, true, true ); - self.kills = self maps\mp\gametypes\_globallogic_score::getPersStat( "kills" ); - self maps\mp\gametypes\_globallogic_score::updatePersRatio( "kdratio", "kills", "deaths" ); - - attacker = self; - if ( sMeansOfDeath == "MOD_HEAD_SHOT" && !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - attacker thread incPersStat( "headshots", 1 , true, false ); - attacker.headshots = attacker.pers["headshots"]; - - if ( !isdefined( eVictim.laststandparams ) ) - { - attacker maps\mp\_medals::headshot( sWeapon ); - } - - attacker thread maps\mp\gametypes\_rank::giveRankXP( "headshot" ); - } - attacker thread maps\mp\gametypes\_rank::giveRankXP( "kill" ); - - pixendevent(); -} - -incTotalKills( team ) -{ - if ( level.teambased && (team == "allies" || team == "axis") ) - { - game["totalKillsTeam"][team]++; - } - - game["totalKills"]++; -} - -incItemStatByReference( reference, incValue, statName ) -{ - if ( level.wagerMatch ) - return; - - itemIndex = maps\mp\gametypes\_rank::getItemIndex( reference ); - self incItemStatByIndex( itemIndex, incValue, statName ); - level thread maps\mp\gametypes\_persistence::updateGlobalCounterStats( reference, incValue, statName ); -} - -incItemStatByIndex( itemIndex, incValue, statName ) -{ - if ( !incValue || !level.rankedMatch || level.wagerMatch ) - { - return; - } - - self maps\mp\gametypes\_persistence::checkWeaponMilestoneComplete( itemIndex, statName, incValue ); -} - -setAttachmentStat( name, incValue, statName ) -{ - if ( !incValue || !level.rankedMatch || level.wagerMatch ) - { - return; - } - - isKill = false; - - if ( statName == "kills" ) - { - isKill = true; - } - - if ( isDefined( self.currentWeapon ) && ( isKill || statName == "shots" || statName == "hits" || statName == "headshots" ) ) - { - if ( self.currentWeapon == name ) - { - if ( !isDefined( self.currentAttachments ) ) - { - return; - } - - numAttachments = self.currentAttachments.size; - - if ( !numAttachments ) - { - return; - } - - for ( currentAttachment = 0; currentAttachment< numAttachments; currentAttachment++ ) - { - attachmentName = self.currentAttachments[ currentAttachment ][ "name" ]; - - if ( ( !isDefined( self.currentAttachments[ currentAttachment ][ "owned" ] ) ) || ( !self.currentAttachments[ currentAttachment ][ "owned" ] ) ) - { - continue; - } - - if ( isKill && ( self.currentAttachments[ currentAttachment ][ "point" ] == "top" ) && ( self playerADS() != 1 ) ) - { - continue; - } - if ( self.currentAttachments[ currentAttachment ][ "point" ] == "bottom" && attachmentname != "grip" ) - { - continue; - } - - self maps\mp\gametypes\_persistence::checkGroupChallengeComplete( "Attachments", attachmentName, statName, incValue, "statValue", "currentMilestone", "attachment", "lifetime_" ); - self maps\mp\gametypes\_persistence::checkGroupChallengeComplete( "Attachments", attachmentName, statName, incValue, "challengeValue", "challengeTier", "attachment" ); - } - } - } -} - -setWeaponStat( name, incValue, statName ) -{ - if ( incValue && statName == "kills" && maps\mp\_medals::isMedal( name + "_kills" ) ) - self thread maps\mp\_medals::giveMedal( name + "_kills" ); - - level thread maps\mp\gametypes\_persistence::updateGlobalCounterStats( name, incValue, statName ); - - if ( !incValue ) - return; - - if ( level.wagerMatch ) - { - self maps\mp\gametypes\_wager::trackWagerWeaponUsage( name, incValue, statName ); - return; - } - - if ( !level.rankedMatch ) - { - return; - } - - pixbeginevent("setWeaponStat"); - if ( isDefined( self.currentWeapon ) && ( self.currentWeapon == name ) ) - { - weaponItemIndex = self.currWeaponItemIndex; - setAttachmentStat( name, incValue, statName ); - } - else - { - weaponItemIndex = getBaseWeaponItemIndex( name ); - } - - if ( weaponItemIndex ) - { - contractsToProcess = self maps\mp\gametypes\_persistence::getContractsToProcess( "weapon", toLower( statName ) ); - if ( contractsToProcess.size ) - self maps\mp\gametypes\_persistence::processContracts( contractsToProcess, "weapon", statName, incValue, name ); - incItemStatByIndex( weaponItemIndex, incValue, statName ); - } - pixendevent(); -} - -setInflictorStat( eInflictor, eAttacker, sWeapon ) -{ - if ( !isDefined( eAttacker ) ) - return; - - if ( !isDefined( eInflictor ) ) - { - eAttacker setWeaponStat( sWeapon, 1, "hits" ); - return; - } - - if ( !isDefined( eInflictor.playerAffectedArray ) ) - eInflictor.playerAffectedArray = []; - - foundNewPlayer = true; - for ( i = 0 ; i < eInflictor.playerAffectedArray.size ; i++ ) - { - if ( eInflictor.playerAffectedArray[i] == self ) - { - foundNewPlayer = false; - break; - } - } - - if ( foundNewPlayer ) - { - eInflictor.playerAffectedArray[eInflictor.playerAffectedArray.size] = self; - if( sWeapon == "concussion_grenade_mp" || sWeapon == "tabun_gas_mp" ) - { - eAttacker setWeaponStat( sWeapon, 1, "used" ); - } - eAttacker setWeaponStat( sWeapon, 1, "hits" ); - } -} - -threadedSetWeaponStatByName( name, incValue, statName ) -{ - self endon("disconnect"); - waittillframeend; - - setWeaponStat( name, incValue, statName ); -} - -processAssist( killedplayer, damagedone ) -{ - self endon("disconnect"); - killedplayer endon("disconnect"); - - wait .05; // don't ever run on the same frame as the playerkilled callback. - maps\mp\gametypes\_globallogic_utils::WaitTillSlowProcessAllowed(); - - if ( self.pers["team"] != "axis" && self.pers["team"] != "allies" ) - return; - - if ( self.pers["team"] == killedplayer.pers["team"] ) - return; - - if ( !level.teambased ) - return; - - assist_level = "assist"; - - assist_level_value = int( floor( damagedone / 25 ) ); - - if ( assist_level_value > 0 ) - { - if ( assist_level_value > 3 ) - { - assist_level_value = 3; - } - assist_level = assist_level + "_" + ( assist_level_value * 25 ); - } - - self thread [[level.onXPEvent]]( assist_level ); - self thread maps\mp\_medals::assisted(); - self maps\mp\gametypes\_globallogic_score::incPersStat( "assists", 1 ); - self maps\mp\gametypes\_persistence::statAddWithGameType( "ASSISTS", 1 ); - - self.assists = self maps\mp\gametypes\_globallogic_score::getPersStat( "assists" ); - - if( maps\mp\gametypes\_customClasses::isCustomGame() ) - { - customAssistAmt = getDvarInt( "scr_custom_score_assist" ); - if( customAssistAmt != -1 ) // -1 is default scoring - { - _setPlayerScore( self, self.pers["score"] + customAssistAmt ); - onTeamScore( customAssistAmt, self.team, self, undefined ); - updateTeamScores( self.team ); - } - else - { - givePlayerScore( assist_level, self, killedplayer ); - } - } - else - { - givePlayerScore( assist_level, self, killedplayer ); - } - self thread maps\mp\gametypes\_missions::playerAssist(); -} - - -/# -xpRateThread() -{ - self endon ( "death" ); - self endon ( "disconnect" ); - level endon ( "game_ended" ); - - while ( level.inPrematchPeriod ) - wait ( 0.05 ); - - for ( ;; ) - { - wait ( 5.0 ); - if ( level.players[0].pers["team"] == "allies" || level.players[0].pers["team"] == "axis" ) - self maps\mp\gametypes\_rank::giveRankXP( "kill", int(min( GetDvarInt( #"scr_xprate" ), 50 )) ); - } -} -#/ - -logXPGains() -{ - if ( !isDefined( self.xpGains ) ) - return; - - xpTypes = getArrayKeys( self.xpGains ); - for ( index = 0; index < xpTypes.size; index++ ) - { - gain = self.xpGains[xpTypes[index]]; - if ( !gain ) - continue; - - self logString( "xp " + xpTypes[index] + ": " + gain ); - } -} - diff --git a/mods/patch_mp/maps/mp/gametypes/_spawning.gsc b/mods/patch_mp/maps/mp/gametypes/_spawning.gsc deleted file mode 100644 index 9cb8ae7..0000000 --- a/mods/patch_mp/maps/mp/gametypes/_spawning.gsc +++ /dev/null @@ -1,1574 +0,0 @@ -/* -_spawning.gsc -Copyright (c) 2008 Certain Affinity, Inc. All rights reserved. -Friday April 25, 2008 3:59pm Stefan S. - -spawn_point[]: --------------- -"origin" - worldspace origin -"score" - desirability for spawning; calculated by applying influencers plus a small amount of randomness - -spawn_influencer[]: -------------------- -"type" - one of: "static", "friend", "enemy", "enemy_weapon", "vehicle", "projectile", "airstrike", "dead_friend", "game_mode", "dog" -"shape" - one of: "sphere", "cylinder", "pill", "cone", "box" -"forward" - worldspace forward vector -"up" - worldspace up vector -"origin" - worldspace origin -"radius" - for sphere, cylinder, pill, cone -"axis_length" - for cylinder, pill, cone -"width", "height", "depth" - for box -"score" - base influencer score -"score_curve" - one of: "constant", "linear" (1->0), "inverse_linear" (0->1), "negative_to_positive" (-1 -> +1) - -level.recently_deceased[""][]: --------------------------- -deceased.angles - angles of the deceased player at TOD -deceased.origin - origin of the deceased player at TOD -deceased.timeOfDeathMillis - GetTime() value (in milliseconds) at TOD -*/ - -/*QUAKED mp_uspawn_point (1.0 0.549 0.0) (-16 -16 0) (16 16 72) -Unified spawn point. A player from any team can spawn here, based on spawn influencers. Use dvar "useUnifiedSpawning" to enable. Use targetname "allies_start" or "axis_start" to put a start influencer at that spawn point.*/ - -/*QUAKED mp_uspawn_influencer (1 0 0) (-16 -16 -16) (16 16 16) -Static influencer for unified spawning system -"script_shape" Shape of this influencer. Supported shapes for Radiant-placed static influencers are "cylinder" and "sphere". -"radius" Radius of the influencer ( whether cylinder or sphere ). -"height" Height of the cylinder ( ignored for sphere shapes ). -"script_score" The maximum influence this influencer can have. -"script_score_curve" The shape of the score falloff as a function of the distance from the primary cylinder axis. Options are: "constant", "linear", "inverse_linear", "negative_to_positive" -"script_team" Make this influencer team-specific by specifying "axis" or "allies" -"script_gameobjectname" Gametypes for which the influencer is active (space-separated values), can be "[all_modes]" or combination of "dm", "hq", "iwar", "war", "twar", "sd", "dom" -"script_twar_flag" Used to associate this influencer with a specific twar flag -default:"script_shape" "cylinder" -default:"radius" "400" -default:"height" "100" -default:"script_score" "25" -default:"script_score_curve" "constant" -default:"script_team" "neutral" -default:"script_gameobjectname" "[all_modes]" -default:"script_twar_flag" "NONE" -*/ - -/* ---------- includes */ - -#include maps\mp\_utility; -#include common_scripts\utility; - -/* ---------- initialization */ - -init() -{ - if ( !IsDefined(level.gamemodeSpawnDvars) ) - { - level.gamemodeSpawnDvars = ::default_gamemodeSpawnDvars; - } - - level init_spawn_system(); - - level.teams= []; - level.teams[ 0 ]= "allies"; - level.teams[ 1 ]= "axis"; - - - level.recently_deceased= []; - for ( iTeam= 0; iTeam < level.teams.size; iTeam++ ) - { - level.recently_deceased[ level.teams[ iTeam ] ]= spawn_array_struct(); - } - - level thread onPlayerConnect(); - - if ( GetDvar( #"scr_spawn_visibility_check_max") == "" ) - { - level.spawn_visibility_check_max = 20; - } - else - { - level.spawn_visibility_check_max = GetDvarInt( #"scr_spawn_visibility_check_max"); - } - - level.spawnProtectionTime = GetDvarFloat( #"scr_spawn_protection_time" ); - - /# - // this dvar stores the name for whom to display debug spawning information - SetDvar("scr_debug_spawn_player", ""); - SetDvar("scr_debug_render_spawn_data", "1"); - SetDvar("scr_debug_render_snapshotmode", "0"); - // for testing spawn point placements - SetDvar("scr_spawn_point_test_mode", "0"); - level.test_spawn_point_index= 0; - //###stefan $NOTE turning off debug text only saves 1-2 sv ms/frame - SetDvar("scr_debug_render_spawn_text", "1"); - // spawn thread for debug rendering of spawn influencer state - //thread spawn_influencers_debug_render_thread(); - #/ - - return; -} - -default_gamemodeSpawnDvars(reset_dvars) -{ -} - -init_spawn_system() -{ - level.spawnsystem = spawnstruct(); - spawnsystem = level.spawnsystem; - - level thread initialize_player_spawning_dvars(); - - // code enums - these must match the code versions - spawnsystem.eINFLUENCER_SHAPE_SPHERE = 0; - spawnsystem.eINFLUENCER_SHAPE_CYLINDER = 1; - - spawnsystem.eINFLUENCER_TYPE_NORMAL = 0; - spawnsystem.eINFLUENCER_TYPE_PLAYER = 1; - spawnsystem.eINFLUENCER_TYPE_WEAPON = 2; - spawnsystem.eINFLUENCER_TYPE_DOG = 3; - spawnsystem.eINFLUENCER_TYPE_VEHICLE = 4; - spawnsystem.eINFLUENCER_TYPE_GAME_MODE = 6; - spawnsystem.eINFLUENCER_TYPE_ENEMY_SPAWNED = 7; - - spawnsystem.eINFLUENCER_CURVE_CONSTANT = 0; - spawnsystem.eINFLUENCER_CURVE_LINEAR = 1; - spawnsystem.eINFLUENCER_CURVE_STEEP = 2; - spawnsystem.eINFLUENCER_CURVE_INVERSE_LINEAR = 3; - spawnsystem.eINFLUENCER_CURVE_NEGATIVE_TO_POSITIVE = 4; - - spawnsystem.iSPAWN_TEAMMASK_FREE = 1; - spawnsystem.iSPAWN_TEAMMASK_AXIS = 2; - spawnsystem.iSPAWN_TEAMMASK_ALLIES = 4; -} - - -/* -============= -onPlayerConnect - -============= -*/ -onPlayerConnect() -{ - level endon ( "game_ended" ); - - for( ;; ) - { - level waittill( "connecting", player ); - - //println("SPAWN:onPlayerConnect()"); - - player thread onPlayerSpawned(); - player thread onDisconnect(); - player thread onTeamChange(); - player thread onGrenadeThrow(); - } -} - - -/* -============= -onPlayerSpawned - -============= -*/ -onPlayerSpawned() -{ - self endon( "disconnect" ); - level endon ( "game_ended" ); - - for(;;) - { - self waittill( "spawned_player" ); - - //println("SPAWN:onPlayerSpawned() - spawned player event"); - - self thread initialSpawnProtection(); - - // If radar permanently enabled for the player, enable it - if ( isDefined( self.pers["hasRadar"] ) && self.pers["hasRadar"] ) - { - self.hasSpyplane = true; - } - - self enable_player_influencers( true ); - self thread onDeath(); - } -} - - -/* -============= -onDeath - -Drops any carried object when the player dies -============= -*/ -onDeath() -{ - self endon( "disconnect" ); - level endon ( "game_ended" ); - - self waittill ( "death" ); - self enable_player_influencers( false ); - self create_body_influencers(); -} - -/* -============= -onTeamChange - -Changes influencer teams when player changes teams -============= -*/ -onTeamChange() -{ - self endon( "disconnect" ); - level endon ( "game_ended" ); - - while(1) - { - self waittill ( "joined_team" ); - self player_influencers_set_team(); - wait(0.05); - } -} - - -/* -============= -onGrenadeThrow - -Creates an influencer on grenade -============= -*/ -onGrenadeThrow() -{ - self endon( "disconnect" ); - level endon ( "game_ended" ); - - while(1) - { - self waittill ( "grenade_fire", grenade, weaponName ); - level thread create_grenade_influencers( self.pers["team"], weaponName, grenade ); - wait(0.05); - } -} - -/* -============= -onDisconnect - -Drops any carried object when the player disconnects -============= -*/ -onDisconnect() -{ - level endon ( "game_ended" ); - - self waittill ( "disconnect" ); -} - - -get_team_mask( team ) -{ - // this can be undefined on connect - if ( !level.teambased || !isdefined(team)) - return level.spawnsystem.iSPAWN_TEAMMASK_FREE; - - switch( team ) - { - case "axis": - return level.spawnsystem.iSPAWN_TEAMMASK_AXIS; - case "allies": - return level.spawnsystem.iSPAWN_TEAMMASK_ALLIES; - case "all": - return (level.spawnsystem.iSPAWN_TEAMMASK_FREE | level.spawnsystem.iSPAWN_TEAMMASK_AXIS |level.spawnsystem.iSPAWN_TEAMMASK_ALLIES); - case "free": - default: - return level.spawnsystem.iSPAWN_TEAMMASK_FREE; - } -} - -get_score_curve_index( curve ) -{ - switch( curve ) - { - case "linear": - return level.spawnsystem.eINFLUENCER_CURVE_LINEAR; - case "steep": - return level.spawnsystem.eINFLUENCER_CURVE_STEEP; - case "inverse_linear": - return level.spawnsystem.eINFLUENCER_CURVE_LINEAR; - case "negative_to_positive": - return level.spawnsystem.eINFLUENCER_CURVE_NEGATIVE_TO_POSITIVE; - case "constant": - default: - return level.spawnsystem.eINFLUENCER_CURVE_CONSTANT; - } -} - -get_influencer_type_index( curve ) -{ -// switch( curve ) -// { -// case "linear": -// return level.spawnsystem.eINFLUENCER_CURVE_LINEAR; -// case "inverse_linear": -// return level.spawnsystem.eINFLUENCER_CURVE_LINEAR; -// case "negative_to_positive": -// return level.spawnsystem.eINFLUENCER_CURVE_NEGATIVE_TO_POSITIVE; -// case "constant": -// default: -// return level.spawnsystem.eINFLUENCER_CURVE_CONSTANT; -// } -} - -create_player_influencers() -{ - assert( !isdefined(self.influencer_enemy_sphere) ); - assert( !isdefined(self.influencer_weapon_cylinder) ); - assert( !level.teambased || !isdefined(self.influencer_friendly_sphere) ); - assert( !level.teambased || !isdefined(self.influencer_friendly_cylinder) ); - - if ( !level.teambased ) - { - team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - other_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - weapon_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - } - else if ( isdefined( self.pers["team"] ) ) - { - team_mask = get_team_mask( self.pers["team"] ); - other_team_mask = get_team_mask( getotherteam(self.pers["team"]) ); - weapon_team_mask = get_team_mask( getotherteam(self.pers["team"]) ); - } - else - { - team_mask = 0; - other_team_mask = 0; - weapon_team_mask = 0; - } - - // if this is hardcore then we do not want to spawn infront of the weapon either - if ( level.hardcoreMode ) - { - weapon_team_mask |= team_mask; - } - - angles = self.angles; - origin = self.origin; -// up = AnglesToUp(angles); -// forward = AnglesToForward(angles); - up = (0,0,1); - forward = (1,0,0); - cylinder_forward = up; - cylinder_up = forward; - - self.influencer_enemy_sphere = AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_PLAYER, - origin, - level.spawnsystem.enemy_influencer_radius, - level.spawnsystem.enemy_influencer_score, - other_team_mask, - "enemy,r,s", - get_score_curve_index(level.spawnsystem.enemy_influencer_score_curve), - 0, - self ); - -// self.influencer_weapon_cylinder = AddCylinderInfluencer( level.spawnsystem.eINFLUENCER_TYPE_WEAPON, -// origin, -// cylinder_forward, -// cylinder_up, -// level.spawnsystem.enemy_weapon_influencer_radius, -// level.spawnsystem.enemy_weapon_influencer_length, -// level.spawnsystem.enemy_weapon_influencer_score, -// weapon_team_mask, -// "enemy_weapon,r,s", -// get_score_curve_index(level.spawnsystem.enemy_weapon_influencer_score_curve), -// 0, -// self ); - - if ( level.teambased ) - { - // aim cylinder backwards for friends - cylinder_up = -1.0 * forward; - - self.influencer_friendly_sphere = AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_PLAYER, - origin, - level.spawnsystem.friend_weak_influencer_radius, - level.spawnsystem.friend_weak_influencer_score, - team_mask, - "friend_weak,r,s", - get_score_curve_index(level.spawnsystem.friend_weak_influencer_score_curve), - 0, - self ); - -// self.influencer_friendly_cylinder = AddCylinderInfluencer( level.spawnsystem.eINFLUENCER_TYPE_PLAYER, -// origin, -// cylinder_forward, -// cylinder_up, -// level.spawnsystem.friend_strong_influencer_radius, -// level.spawnsystem.friend_strong_influencer_length, -// level.spawnsystem.friend_strong_influencer_score, -// team_mask, -// "friend_strong,r,s", -// get_score_curve_index(level.spawnsystem.friend_strong_influencer_score_curve), -// 0, -// self ); - - } - - self.spawn_influencers_created = true; - - if ( !isdefined(self.pers["team"]) || self.pers["team"] == "spectator" ) - { - self enable_player_influencers( false ); - } -} - -remove_player_influencers() -{ - if ( level.teambased && isdefined(self.influencer_friendly_sphere) ) - { - removeinfluencer(self.influencer_friendly_sphere); - self.influencer_friendly_sphere = undefined; - } - if ( level.teambased && isdefined(self.influencer_friendly_cylinder) ) - { - removeinfluencer(self.influencer_friendly_cylinder); - self.influencer_friendly_cylinder = undefined; - } - if ( isdefined(self.influencer_enemy_sphere) ) - { - removeinfluencer(self.influencer_enemy_sphere); - self.influencer_enemy_sphere = undefined; - } - if ( isdefined(self.influencer_weapon_cylinder) ) - { - removeinfluencer(self.influencer_weapon_cylinder); - self.influencer_weapon_cylinder = undefined; - } - -} - -enable_player_influencers( enabled ) -{ - if (!isdefined(self.spawn_influencers_created)) - self create_player_influencers(); - - if ( isdefined(self.influencer_friendly_sphere) ) - enableinfluencer(self.influencer_friendly_sphere, enabled); - if ( isdefined(self.influencer_friendly_cylinder) ) - enableinfluencer(self.influencer_friendly_cylinder, enabled); - if ( isdefined(self.influencer_enemy_sphere) ) - enableinfluencer(self.influencer_enemy_sphere, enabled); - if ( isdefined(self.influencer_weapon_cylinder) ) - enableinfluencer(self.influencer_weapon_cylinder, enabled); -} - -player_influencers_set_team() -{ - if ( !level.teambased ) - { - team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - other_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - weapon_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - } - else - { - // for the player influencers we need to pay attention to the switchedsides - team = self.pers["team"]; -// if ( isdefined( game["switchedsides"] ) && game["switchedsides"] ) -// { -// team = getotherteam(team); -// } - - team_mask = get_team_mask( team ); - other_team_mask = get_team_mask( getotherteam(team) ); - weapon_team_mask = get_team_mask( getotherteam(team) ); - } - - // if friendly fire is on then we do not want to spawn infront of the weapon either - if ( level.friendlyfire != 0 && level.teamBased ) - { - weapon_team_mask |= team_mask; - } - - if ( isdefined(self.influencer_friendly_sphere) ) - setinfluencerteammask(self.influencer_friendly_sphere, team_mask); - if ( isdefined(self.influencer_friendly_cylinder) ) - setinfluencerteammask(self.influencer_friendly_cylinder, team_mask); - if ( isdefined(self.influencer_enemy_sphere) ) - setinfluencerteammask(self.influencer_enemy_sphere, other_team_mask); - if ( isdefined(self.influencer_weapon_cylinder) ) - setinfluencerteammask(self.influencer_weapon_cylinder, weapon_team_mask); -} - -create_body_influencers() -{ - if ( level.teambased ) - { - team_mask = get_team_mask( self.pers["team"] ); - } - else - { - team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - } - AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - self.origin, - level.spawnsystem.dead_friend_influencer_radius, - level.spawnsystem.dead_friend_influencer_score, - team_mask, - "dead_friend,r,s", - get_score_curve_index(level.spawnsystem.dead_friend_influencer_score_curve), - level.spawnsystem.dead_friend_influencer_timeout_seconds); -} - -create_grenade_influencers( parent_team, weaponName, grenade ) -{ - pixbeginevent("create_grenade_influencers"); - if ( !level.teambased ) - { - weapon_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - } - else - { - weapon_team_mask = get_team_mask( getotherteam(parent_team) ); - - // if this is hardcore then we do not want to spawn infront of the weapon either - if ( level.friendlyfire ) - { - weapon_team_mask |= get_team_mask( parent_team ); - } - } - - if ( issubstr(weaponName,"napalmblob") || issubstr(weaponName,"gl_") ) - { - pixendevent("create_grenade_influencers"); - return; - } - - timeout = 0; - - // these have lasting effects after detonation so hang it around a bit longer - if ( weaponName == "tabun_gas_mp" ) - { - timeout = 7.0; - } - - if (isdefined( grenade.origin )) - { - if ( weaponName == "claymore_mp" ) - { - AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - grenade.origin, - level.spawnsystem.claymore_influencer_radius, - level.spawnsystem.claymore_influencer_score, - weapon_team_mask, - "claymore,r,s", - get_score_curve_index(level.spawnsystem.claymore_influencer_score_curve), - timeout, - grenade ); - } - else - { - AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - grenade.origin, - level.spawnsystem.grenade_influencer_radius, - level.spawnsystem.grenade_influencer_score, - weapon_team_mask, - "grenade,r,s", - get_score_curve_index(level.spawnsystem.grenade_influencer_score_curve), - timeout, - grenade ); - } - } - - // also create an influencer at the predicted end point, and update the prediction at intervals - while (isdefined(grenade.origin)) - { - landpos = grenade predictgrenade(); - //landpos = (0,0,0); - if (landpos != (0,0,0)) - { - grenade_endpoint_influencer = AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - landpos, - level.spawnsystem.grenade_endpoint_influencer_radius, - level.spawnsystem.grenade_endpoint_influencer_score, - 0, - //weapon_team_mask, - "grenade_endpoint,r,s", - get_score_curve_index(level.spawnsystem.grenade_endpoint_influencer_score_curve) ); - - wait(0.5); - - if (!isdefined(grenade.origin) && timeout > 0) - wait(timeout); // wait till the effects have gone - - removeinfluencer( grenade_endpoint_influencer ); - } - else - { - break; - } - } - pixendevent("create_grenade_influencers"); -} - -create_napalm_fire_influencers( point, direction, parent_team, duration ) -{ - timeout = duration; - - // just going to leave this blank to indicate all teams - weapon_team_mask = 0; - - offset = vector_scale( anglestoforward( direction ), 1100 ); - - AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - (point + ( 2.0 * offset)), - level.spawnsystem.napalm_influencer_radius, - level.spawnsystem.napalm_influencer_score, - weapon_team_mask, - "napalm,r,s", - get_score_curve_index(level.spawnsystem.napalm_influencer_score_curve), - timeout ); - - AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - (point + offset), - level.spawnsystem.napalm_influencer_radius, - level.spawnsystem.napalm_influencer_score, - weapon_team_mask, - "napalm,r,s", - get_score_curve_index(level.spawnsystem.napalm_influencer_score_curve), - timeout ); - - AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - point, - level.spawnsystem.napalm_influencer_radius, - level.spawnsystem.napalm_influencer_score, - weapon_team_mask, - "napalm,r,s", - get_score_curve_index(level.spawnsystem.napalm_influencer_score_curve), - timeout ); - - AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - (point - offset), - level.spawnsystem.napalm_influencer_radius, - level.spawnsystem.napalm_influencer_score, - weapon_team_mask, - "napalm,r,s", - get_score_curve_index(level.spawnsystem.napalm_influencer_score_curve), - timeout ); -} - -create_auto_turret_influencer( point, parent_team, angles ) -{ - if ( !level.teambased ) - { - weapon_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - } - else - { - weapon_team_mask = get_team_mask( getotherteam(parent_team) ); - } - - // place the influencer out infront of the turret - projected_point = point + vector_scale( anglestoforward( angles ), level.spawnsystem.auto_turret_influencer_radius * 0.7 ); - - influencerid = AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - projected_point, - level.spawnsystem.auto_turret_influencer_radius, - level.spawnsystem.auto_turret_influencer_score, - weapon_team_mask, - "auto_turret,r,s", - get_score_curve_index(level.spawnsystem.auto_turret_influencer_score_curve) ); - - return influencerid; -} - -create_dog_influencers() -{ - if ( !level.teambased ) - { - dog_enemy_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - } - else - { - dog_enemy_team_mask = get_team_mask( getotherteam(self.aiteam) ); - } - - AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_DOG, - self.origin, - level.spawnsystem.dog_influencer_radius, - level.spawnsystem.dog_influencer_score, - dog_enemy_team_mask, - "dog,r,s", - get_score_curve_index(level.spawnsystem.dog_influencer_score_curve), - 0, - self ); -} - -create_helicopter_influencers( parent_team ) -{ - if ( !level.teambased ) - { - team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - } - else - { - team_mask = get_team_mask( getotherteam(parent_team) ); - } - - self.influencer_helicopter_cylinder = AddCylinderInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - self.origin, - (0,0,0), - (0,0,0), - level.spawnsystem.helicopter_influencer_radius, - level.spawnsystem.helicopter_influencer_length, - level.spawnsystem.helicopter_influencer_score, - team_mask, - "helicopter,r,s", - get_score_curve_index(level.spawnsystem.helicopter_influencer_score_curve), - 0, - self ); -} - -remove_helicopter_influencers() -{ - if (isdefined( self.influencer_helicopter_cylinder )) - RemoveInfluencer( self.influencer_helicopter_cylinder ); - - self.influencer_helicopter_cylinder = undefined; -} - -create_tvmissile_influencers( parent_team ) -{ - if ( !level.teambased || is_hardcore() ) - { - team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - } - else - { - team_mask = get_team_mask( getotherteam(parent_team) ); - } - - self.influencer_tvmissile_cylinder = AddCylinderInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - self.origin, - (0,0,0), - (0,0,0), - level.spawnsystem.tvmissile_influencer_radius, - level.spawnsystem.tvmissile_influencer_length, - level.spawnsystem.tvmissile_influencer_score, - team_mask, - "tvmissile,r,s", - get_score_curve_index(level.spawnsystem.tvmissile_influencer_score_curve), - 0, - self ); -} - -remove_tvmissile_influencers() -{ - if (isdefined( self.influencer_tvmissile_cylinder )) - RemoveInfluencer( self.influencer_tvmissile_cylinder ); - - self.influencer_tvmissile_cylinder = undefined; -} - -create_artillery_influencers( point, radius ) -{ - // just going to leave this blank to indicate all teams - weapon_team_mask = 0; - -// return AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, -// point, -// radius, -// level.spawnsystem.artillery_influencer_score, -// weapon_team_mask, -// "artillery,s", -// get_score_curve_index(level.spawnsystem.artillery_influencer_score_curve) ); - - if (radius < 0) - thisradius = level.spawnsystem.artillery_influencer_radius; - else - thisradius = radius; - - return AddCylinderInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - point + (0,0,-2000), - (1,0,0), - (0,0,1), - thisradius, - 5000, - level.spawnsystem.artillery_influencer_score, - weapon_team_mask, - "artillery,s,r", - get_score_curve_index(level.spawnsystem.artillery_influencer_score_curve) ); -} - -create_vehicle_influencers( ) -{ - // just going to leave this blank to indicate all teams - // because we dont want anyone spawning directly infront of the tank - weapon_team_mask = 0; - - vehicleRadius= 144; -// cylinderLength = (vehicleRadius*0.5) + (vehSpeedIPS*spawn_vehicle_influencer_lead_seconds); - - // code will always maintain the length at half the radius - // plus the given length * the vehicle speed in inches per second - cylinderLength = level.spawnsystem.vehicle_influencer_lead_seconds; - - up = (0,0,1); - forward = (1,0,0); - cylinder_forward = up; - cylinder_up = forward; - - return AddCylinderInfluencer( level.spawnsystem.eINFLUENCER_TYPE_VEHICLE, - self.origin, - cylinder_forward, - cylinder_up, - vehicleRadius, - cylinderLength, - level.spawnsystem.vehicle_influencer_score, - weapon_team_mask, - "vehicle,s", - get_score_curve_index(level.spawnsystem.vehicle_influencer_score_curve), - 0, - self ); -} - -create_rcbomb_influencers( team ) -{ - if ( !level.teambased ) - other_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - else - other_team_mask = get_team_mask( getotherteam( team ) ); - - return AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_NORMAL, - self.origin, - level.spawnsystem.rcbomb_influencer_radius, - level.spawnsystem.rcbomb_influencer_score, - other_team_mask, - "rcbomb,r,s", - get_score_curve_index(level.spawnsystem.rcbomb_influencer_score_curve), - 0, - self ); -} - -create_map_placed_influencers() -{ - staticInfluencerEnts = GetEntArray( "mp_uspawn_influencer", "classname" ); - - for ( i = 0; i < staticInfluencerEnts.size; i++ ) - { - staticInfluencerEnt = staticInfluencerEnts[ i ]; - - // don't include ones which have a twar-flag affiliation - // those will be activated by twar code - if (IsDefined(staticInfluencerEnt.script_gameobjectname) && - staticInfluencerEnt.script_gameobjectname=="twar") - { - continue; - } - - create_map_placed_influencer(staticInfluencerEnt); - } -} - -create_map_placed_influencer( influencer_entity, optional_score_override ) -{ - influencer_id = -1; - - if (IsDefined(influencer_entity.script_shape) && - IsDefined(influencer_entity.script_score) && - IsDefined(influencer_entity.script_score_curve)) - { - switch (influencer_entity.script_shape) - { - case "sphere": - { - if (IsDefined(influencer_entity.radius)) - { - if (IsDefined(optional_score_override)) - { - score= optional_score_override; - } - else - { - score= influencer_entity.script_score; - } - - influencer_id = AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - influencer_entity.origin, - influencer_entity.radius, - score, - get_team_mask(influencer_entity.script_team), - "*map_defined", - get_score_curve_index(influencer_entity.script_score_curve) ); - } - else - { - assertmsg( "Radiant-placed sphere spawn influencers require 'radius' parameter" ); - } - break; - } - case "cylinder": - { - if (IsDefined(influencer_entity.radius) && - IsDefined(influencer_entity.height)) - { - if (IsDefined(optional_score_override)) - { - score= optional_score_override; - } - else - { - score= influencer_entity.script_score; - } - - influencer_id = AddCylinderInfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - influencer_entity.origin, - AnglesToForward(influencer_entity.angles), - AnglesToUp(influencer_entity.angles), - influencer_entity.radius, - influencer_entity.height, - score, - get_team_mask(influencer_entity.script_team), - "*map_defined", - get_score_curve_index(influencer_entity.script_score_curve) ); - } - else - { - assertmsg( "Radiant-placed cylinder spawn influencers require 'radius' and 'height' parameters" ); - } - break; - } - default: - { - assertmsg( "Unsupported script_shape value (\""+influencer_entity.script_shape+"\") for unified spawning system static influencer. Supported shapes are \"cylinder\" and \"sphere\"." ); - break; - } - } - } - else - { - assertmsg( "Radiant-placed spawn influencers require 'script_shape', 'script_score' and 'script_score_curve' parameters" ); - } - - return influencer_id; -} - -create_enemy_spawned_influencers( origin, team ) -{ - if ( !level.teambased ) - other_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE; - else - other_team_mask = get_team_mask( getotherteam( team ) ); - - return AddSphereInfluencer( level.spawnsystem.eINFLUENCER_TYPE_ENEMY_SPAWNED, - origin, - level.spawnsystem.enemy_spawned_influencer_radius, - level.spawnsystem.enemy_spawned_influencer_score, - other_team_mask, - "enemy_spawned,r,s", - get_score_curve_index(level.spawnsystem.enemy_spawned_influencer_score_curve), - 7 ); -} - - -updateAllSpawnPoints() -{ - // force spawn points to get precached - gatherSpawnEntities( "allies" ); - gatherSpawnEntities( "axis" ); - - // raise all the spawn points -// raise_all_points_in_height( level.unified_spawn_points[ "allies" ] ); -// raise_all_points_in_height( level.unified_spawn_points[ "axis" ] ); - - clearspawnpoints(); - - if ( level.teambased ) - { - addspawnpoints( "allies", level.unified_spawn_points[ "allies" ].a ); - addspawnpoints( "axis", level.unified_spawn_points[ "axis" ].a ); - } - else - { - addspawnpoints( "free", level.unified_spawn_points[ "allies" ].a ); - addspawnpoints( "free", level.unified_spawn_points[ "axis" ].a ); - } - - // this will remove all spawnpoints for the other gametypes which are not used - remove_unused_spawn_entities(); -} - -initialize_player_spawning_dvars() -{ - reset_dvars = true; - while( 1 ) - { - get_player_spawning_dvars(reset_dvars); - reset_dvars = false; - wait(2); // dont need this to happen frequently - } -} - -get_player_spawning_dvars(reset_dvars) -{ - k_player_height= get_player_height(); - player_height_times_10 = "" + 10.0*k_player_height; - ss = level.spawnsystem; - - player_influencer_radius = 15.0*k_player_height; - player_influencer_score = 150.0; - dog_influencer_radius = 10.0*k_player_height; - dog_influencer_score = 150.0; - - // this controls the original script driven influencer system - ss.script_based_influencer_system = set_dvar_int_if_unset("scr_script_based_influencer_system", "0", reset_dvars); - - // general parameters - // amount of randomness applied to spawning scores - ss.randomness_range = set_dvar_float_if_unset("scr_spawn_randomness_range", "10", reset_dvars); - // bonus applied to spawn points which face the current objective in certain objective-based games - ss.objective_facing_bonus = set_dvar_float_if_unset("scr_spawn_objective_facing_bonus", "50", reset_dvars); - - // strong friend influencers are now a cylinder projected behind the player - //ss.friend_strong_influencer_score = set_dvar_float_if_unset("scr_spawn_friend_strong_influencer_score", "75", reset_dvars); - //ss.friend_strong_influencer_score_curve = set_dvar_if_unset("scr_spawn_friend_strong_influencer_score_curve", "linear", reset_dvars); - //ss.friend_strong_influencer_radius = set_dvar_float_if_unset("scr_spawn_friend_strong_influencer_radius", player_height_times_10, reset_dvars); - //ss.friend_strong_influencer_length = set_dvar_float_if_unset("scr_spawn_friend_strong_influencer_length", player_height_times_10, reset_dvars); - - // weak friend influencers are a sphere about the player - ss.friend_weak_influencer_score = set_dvar_float_if_unset("scr_spawn_friend_weak_influencer_score", "10", reset_dvars); - ss.friend_weak_influencer_score_curve = set_dvar_if_unset("scr_spawn_friend_weak_influencer_score_curve", "steep", reset_dvars); - ss.friend_weak_influencer_radius = set_dvar_float_if_unset("scr_spawn_friend_weak_influencer_radius", player_height_times_10, reset_dvars); - - // enemy player influencer - ss.enemy_influencer_score = set_dvar_float_if_unset("scr_spawn_enemy_influencer_score", "-150", reset_dvars); - ss.enemy_influencer_score_curve = set_dvar_if_unset("scr_spawn_enemy_influencer_score_curve", "steep", reset_dvars); - ss.enemy_influencer_radius = set_dvar_float_if_unset("scr_spawn_enemy_influencer_radius", "" + 30.0*k_player_height, reset_dvars); - - // enemy weapon influencer - //ss.enemy_weapon_influencer_score = set_dvar_float_if_unset("scr_spawn_enemy_weapon_influencer_score", "-100", reset_dvars); - //ss.enemy_weapon_influencer_score_curve = set_dvar_if_unset("scr_spawn_enemy_weapon_influencer_score_curve", "linear", reset_dvars); - //ss.enemy_weapon_influencer_radius = set_dvar_float_if_unset("scr_spawn_enemy_weapon_influencer_radius", "" + 5.0*k_player_height, reset_dvars); - //ss.enemy_weapon_influencer_length = set_dvar_float_if_unset("scr_spawn_enemy_weapon_influencer_length", "" + 25.0*k_player_height, reset_dvars); - - // dead friends - ss.dead_friend_influencer_timeout_seconds = set_dvar_float_if_unset("scr_spawn_dead_friend_influencer_timeout_seconds", "20", reset_dvars); - ss.dead_friend_influencer_count = set_dvar_float_if_unset("scr_spawn_dead_friend_influencer_count", "7", reset_dvars); - ss.dead_friend_influencer_score = set_dvar_float_if_unset("scr_spawn_dead_friend_influencer_score", "-100", reset_dvars); - ss.dead_friend_influencer_score_curve = set_dvar_if_unset("scr_spawn_dead_friend_influencer_score_curve", "steep", reset_dvars); - ss.dead_friend_influencer_radius = set_dvar_float_if_unset("scr_spawn_dead_friend_influencer_radius", player_height_times_10, reset_dvars); - - // moving vehicle influencer - ss.vehicle_influencer_score = set_dvar_float_if_unset("scr_spawn_vehicle_influencer_score", "-50", reset_dvars); - ss.vehicle_influencer_score_curve = set_dvar_if_unset("scr_spawn_vehicle_influencer_score_curve", "linear", reset_dvars); - ss.vehicle_influencer_lead_seconds = set_dvar_float_if_unset("scr_spawn_vehicle_influencer_lead_seconds", "3", reset_dvars); // The influencer will project out this far in time, based on vehicle speed - - // dog influencer - ss.dog_influencer_score = set_dvar_float_if_unset("scr_spawn_dog_influencer_score", "-150", reset_dvars); - ss.dog_influencer_score_curve = set_dvar_if_unset("scr_spawn_dog_influencer_score_curve", "steep", reset_dvars); - ss.dog_influencer_radius = set_dvar_float_if_unset("scr_spawn_dog_influencer_radius", "" + 15.0*k_player_height, reset_dvars); - - // artillery strike influencer - ss.artillery_influencer_score = set_dvar_float_if_unset("scr_spawn_artillery_influencer_score", "-600", reset_dvars); - ss.artillery_influencer_score_curve = set_dvar_if_unset("scr_spawn_artillery_influencer_score_curve", "linear", reset_dvars); - ss.artillery_influencer_radius = set_dvar_float_if_unset("scr_spawn_artillery_influencer_radius", "1200", reset_dvars); - // radius determined @ runtime - - // grenade influencer - ss.grenade_influencer_score = set_dvar_float_if_unset("scr_spawn_grenade_influencer_score", "-300", reset_dvars); - ss.grenade_influencer_score_curve = set_dvar_if_unset("scr_spawn_grenade_influencer_score_curve", "linear", reset_dvars); - ss.grenade_influencer_radius = set_dvar_float_if_unset("scr_spawn_grenade_influencer_radius", "" + 8.0*k_player_height, reset_dvars); - - ss.grenade_endpoint_influencer_score = set_dvar_float_if_unset("scr_spawn_grenade_endpoint_influencer_score", "-300", reset_dvars); - ss.grenade_endpoint_influencer_score_curve = set_dvar_if_unset("scr_spawn_grenade_endpoint_influencer_score_curve", "linear", reset_dvars); - ss.grenade_endpoint_influencer_radius = set_dvar_float_if_unset("scr_spawn_grenade_endpoint_influencer_radius", "" + 8.0*k_player_height, reset_dvars); - - // claymore influencer - ss.claymore_influencer_score = set_dvar_float_if_unset("scr_spawn_claymore_influencer_score", "-450", reset_dvars); - ss.claymore_influencer_score_curve = set_dvar_if_unset("scr_spawn_claymore_influencer_score_curve", "linear", reset_dvars); - ss.claymore_influencer_radius = set_dvar_float_if_unset("scr_spawn_claymore_influencer_radius", "" + 9.0*k_player_height, reset_dvars); - - // napalm influencer - ss.napalm_influencer_score = set_dvar_float_if_unset("scr_spawn_napalm_influencer_score", "-500", reset_dvars); - ss.napalm_influencer_score_curve = set_dvar_if_unset("scr_spawn_napalm_influencer_score_curve", "linear", reset_dvars); - ss.napalm_influencer_radius = set_dvar_float_if_unset("scr_spawn_napalm_influencer_radius", "" + 750, reset_dvars); - - // auto-turret influencer - ss.auto_turret_influencer_score = set_dvar_float_if_unset("scr_spawn_auto_turret_influencer_score", "-650", reset_dvars); - ss.auto_turret_influencer_score_curve = set_dvar_if_unset("scr_spawn_auto_turret_influencer_score_curve", "linear", reset_dvars); - ss.auto_turret_influencer_radius = set_dvar_float_if_unset("scr_spawn_auto_turret_influencer_radius", "" + 1200, reset_dvars); - - // moving vehicle influencer - ss.rcbomb_influencer_score = set_dvar_float_if_unset("scr_spawn_rcbomb_influencer_score", "-200", reset_dvars); - ss.rcbomb_influencer_score_curve = set_dvar_if_unset("scr_spawn_rcbomb_influencer_score_curve", "steep", reset_dvars); - ss.rcbomb_influencer_radius = set_dvar_float_if_unset("scr_spawn_rcbomb_influencer_radius", "" + 25.0*k_player_height, reset_dvars); - - - // enemy spawned influencer - ss.enemy_spawned_influencer_score_curve = set_dvar_if_unset("scr_spawn_enemy_spawned_influencer_score_curve", "constant", reset_dvars); - if( level.teambased ) - { - ss.enemy_spawned_influencer_score = set_dvar_float_if_unset("scr_spawn_enemy_spawned_influencer_score", "-200", reset_dvars); - ss.enemy_spawned_influencer_radius = set_dvar_float_if_unset("scr_spawn_enemy_spawned_influencer_radius", "" + 1100, reset_dvars); - } - else - { - ss.enemy_spawned_influencer_score = set_dvar_float_if_unset("scr_spawn_enemy_spawned_influencer_score", "-100", reset_dvars); - ss.enemy_spawned_influencer_radius = set_dvar_float_if_unset("scr_spawn_enemy_spawned_influencer_radius", "" + 400, reset_dvars); - } - - - // helicopter influencer - ss.helicopter_influencer_score = set_dvar_float_if_unset("scr_spawn_helicopter_influencer_score", "-500", reset_dvars); - ss.helicopter_influencer_score_curve = set_dvar_if_unset("scr_spawn_helicopter_influencer_score_curve", "linear", reset_dvars); - ss.helicopter_influencer_radius = set_dvar_float_if_unset("scr_spawn_helicopter_influencer_radius", "" + 2000, reset_dvars); - ss.helicopter_influencer_length = set_dvar_float_if_unset("scr_spawn_helicopter_influencer_length", "" + 3500, reset_dvars); - - // tvmissile influencer - ss.tvmissile_influencer_score = set_dvar_float_if_unset("scr_spawn_tvmissile_influencer_score", "-400", reset_dvars); - ss.tvmissile_influencer_score_curve = set_dvar_if_unset("scr_spawn_tvmissile_influencer_score_curve", "linear", reset_dvars); - ss.tvmissile_influencer_radius = set_dvar_float_if_unset("scr_spawn_tvmissile_influencer_radius", "" + 2000, reset_dvars); - ss.tvmissile_influencer_length = set_dvar_float_if_unset("scr_spawn_tvmissile_influencer_length", "" + 3000, reset_dvars); - - if (!IsDefined( ss.unifiedSideSwitching )) - ss.unifiedSideSwitching = 1; - - // let the game modes set up their dvars - [[level.gamemodeSpawnDvars]](reset_dvars); - - setspawnpointrandomvariation( ss.randomness_range ); -} - -level_use_unified_spawning( use ) -{ -// if ( use ) -// { -// level.onSpawnPlayerUnified = ::onSpawnPlayer_Unified; -// } -// else -// { -// level.onSpawnPlayerUnified = undefined; -// } -} - -/* ---------- spawn_point */ - -//void - self= player entity for the player who is spawning -onSpawnPlayer_Unified() -{ - prof_begin("onSpawnPlayer_Unified"); - - //println("SPAWN:onSpawnPlayer_Unified()"); - - /# - if (GetDvarInt( #"scr_spawn_point_test_mode")!=0) - { - spawn_point = get_debug_spawnpoint( self ); - self spawn( spawn_point.origin, spawn_point.angles ); - return; - } - #/ - - use_new_spawn_system= true; - initial_spawn= true; - - if (IsDefined(self.uspawn_already_spawned)) - { - initial_spawn= !self.uspawn_already_spawned; - } - - if ( level.useStartSpawns ) - { - use_new_spawn_system= false; - } - - // no respawn points for search & destroy, so don't run the new spawning system (it would needlessly abort on respawn attempt otherwise) - if (level.gametype=="sd") - { - use_new_spawn_system= false; - } - - set_dvar_if_unset("scr_spawn_force_unified", "0"); - - spawnOverride = self maps\mp\_tacticalinsertion::overrideSpawn(); - if (use_new_spawn_system || (GetDvarInt( #"scr_spawn_force_unified")!=0)) - { - if ( !spawnOverride ) - { - // find the most desireable spawn point, and spawn there - spawn_point= getSpawnPoint(self); - - if (IsDefined(spawn_point)) - { - // create a negative influencer for the opposition here - create_enemy_spawned_influencers( spawn_point.origin, self.pers["team"] ); - - self spawn( spawn_point.origin, spawn_point.angles ); - } - else - { - println("ERROR: unable to locate a usable spawn point for player"); - maps\mp\gametypes\_callbacksetup::AbortLevel(); - } - } - self.lastspawntime = gettime(); - self enable_player_influencers( true ); - } - else if ( !spawnOverride ) - { - // old spawning logic - [[level.onSpawnPlayer]](); - } - - // remember that the player has initially spawned - self.uspawn_already_spawned= true; - - prof_end("onSpawnPlayer_Unified"); - - return; -} - -// spawnPoint: .origin, .angles -getSpawnPoint( - player_entity) -{ - if (level.teambased ) - { - point_team = player_entity.pers["team"]; - influencer_team = player_entity.pers["team"]; - } - else - { - point_team = "free"; - influencer_team = "free"; - } - - if (level.teambased && IsDefined(game["switchedsides"]) && game["switchedsides"] && level.spawnsystem.unifiedSideSwitching) - { - point_team = GetOtherTeam(point_team); - } - - best_spawn_entity = get_best_spawnpoint( point_team, influencer_team, player_entity ); - - player_entity.last_spawn_origin = best_spawn_entity.origin; - - return best_spawn_entity; -} - -get_debug_spawnpoint( player ) -{ - if (level.teambased ) - { - team = player.pers["team"]; - } - else - { - team = "free"; - } - - index = level.test_spawn_point_index; - level.test_spawn_point_index++; - - if ( team == "free" ) - { - spawn_counts = level.unified_spawn_points[ "allies" ].a.size; - spawn_counts += level.unified_spawn_points[ "axis" ].a.size; - - if (level.test_spawn_point_index >= spawn_counts) - { - level.test_spawn_point_index= 0; - } - - if (level.test_spawn_point_index >= level.unified_spawn_points[ "allies" ].a.size) - { - return level.unified_spawn_points[ "axis" ].a[level.test_spawn_point_index - level.unified_spawn_points[ "allies" ].a.size]; - } - else - { - return level.unified_spawn_points[ "allies" ].a[level.test_spawn_point_index]; - } - } - else - { - if (level.test_spawn_point_index >= level.unified_spawn_points[ team ].a.size) - { - level.test_spawn_point_index= 0; - } - - return level.unified_spawn_points[ team ].a[level.test_spawn_point_index]; - - } -} - -get_best_spawnpoint( point_team, influencer_team, player ) -{ - scored_spawn_points = getsortedspawnpoints( point_team, influencer_team, player ); - assert(scored_spawn_points.size > 0 ); - - if (level.teambased ) - { - other_team = GetOtherTeam( player.pers["team"] ); - } - else - { - other_team = "free"; - } - - spawnid = getplayerspawnid( player ); - - best_spawn_no_sight = undefined; - - prof_begin("get_best_spawnpoint__"); - for (i = 0 ; i < scored_spawn_points.size; i++) - { - scored_spawn = scored_spawn_points[i]; - if (PositionWouldTelefrag(scored_spawn_points[i].origin)) - { - bbPrint( "mpspawnpointsignored: reason %s spawninstanceid %i x %f y %f z %f", "telefrag", spawnid, scored_spawn_points[i].origin ); - continue; - } - - if ( !isdefined(best_spawn_no_sight) ) - { - best_spawn_no_sight = scored_spawn_points[i]; - } - - /* - // RF, removed this by request. Leaving it around in case we decide to revert back to it. - if ( isdefined( player.last_spawn_origin ) ) - { - if ( distance( player.last_spawn_origin, scored_spawn.origin ) < 16 ) - { - bbPrint( "mpspawnpointsignored: reason %s spawninstanceid %i x %f y %f z %f", "repetitive spawn", spawnid, scored_spawn_points[i].origin ); - continue; - } - } - */ - - if ( level.spawn_visibility_check_max <= i ) - { - bbPrint( "mpspawnpointsused: reason %s spawninstanceid %i x %f y %f z %f", "reached max vis checks", spawnid, scored_spawn_points[i].origin ); - RecordUsedSpawnPoint( player, point_team, scored_spawn_points[i].origin ); - - return best_spawn_no_sight; - } - - if ( isspawnpointvisible(scored_spawn_points[i].origin, scored_spawn_points[i].angles, other_team, player ) ) - { - bbPrint( "mpspawnpointsignored: reason %s spawninstanceid %i x %f y %f z %f", "enemy visible", spawnid, scored_spawn_points[i].origin ); - continue; - } - - prof_end("get_best_spawnpoint__"); - - bbPrint( "mpspawnpointsused: reason %s spawninstanceid %i x %f y %f z %f", "passed all checks", spawnid, scored_spawn_points[i].origin ); - - RecordUsedSpawnPoint( player, point_team, scored_spawn_points[i].origin ); - - return scored_spawn_points[i]; - } - - prof_end("get_best_spawnpoint__"); - - // could not find anything - if( isdefined( best_spawn_no_sight ) ) - { - bbPrint( "mpspawnpointsused: reason %s spawninstanceid %i x %f y %f z %f", "all points checked - best_spawn_no_sight used", spawnid, best_spawn_no_sight.origin ); - - RecordUsedSpawnPoint( player, point_team, best_spawn_no_sight.origin ); - - return best_spawn_no_sight; - } - else - { - bbPrint( "mpspawnpointsused: reason %s spawninstanceid %i x %f y %f z %f", "all points checked - first point used", spawnid, scored_spawn_points[0].origin ); - - RecordUsedSpawnPoint( player, point_team, scored_spawn_points[0].origin ); - - return scored_spawn_points[0]; - } -} - -// struct.a[] = a contains spawn entities -gatherSpawnEntities( player_team ) -{ - // use cached spawn points when they are available - if ( !IsDefined( level.unified_spawn_points ) ) - { - level.unified_spawn_points = []; - } - else - { - if ( IsDefined( level.unified_spawn_points[ player_team ] ) ) - { - return level.unified_spawn_points[ player_team ]; - } - } - - spawn_entities_s= spawn_array_struct(); - - // We grab both new & old spawn points here. The idea is - // that there are alot of maps already setup & designers are not - // going to want to lay down new spawn points. So, just use the existing points - // for each game mode. - // For new maps, designers now only have to lay down one set of points - // instead of one set *per game mode* (the new unified spawn points). - // This system here allows the use of either or both. - - // get placed unified spawn points (the new world order) - spawn_entities_s.a= GetEntArray( "mp_uspawn_point", "classname" ); - if ( !IsDefined(spawn_entities_s.a)) - { - spawn_entities_s.a= []; - } - // also gather any old-style spawn points (the old world order) - legacy_spawn_points= maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints(player_team); - for (legacy_spawn_index= 0; legacy_spawn_index game["roundswon"]["allies"] ) - winner = "axis"; - else - winner = "allies"; - - // This is not required as _globallogic_score.gsc does this anyway. - // Was causing the issue of it getting executed twice. - //maps\mp\gametypes\_globallogic_score::updateWinLossStats( winner ); - - return winner; -} - -onSpawnPlayerUnified() -{ - self.isFlagCarrier = false; - self ClearClientFlag( level.const_flag_ctfcarrier ); - - maps\mp\gametypes\_spawning::onSpawnPlayer_Unified(); -} - -onSpawnPlayer() -{ - self.isFlagCarrier = false; - self ClearClientFlag( level.const_flag_ctfcarrier ); - - spawnteam = self.pers["team"]; - if ( game["switchedsides"] ) - spawnteam = getOtherTeam( spawnteam ); - - if ( level.useStartSpawns ) - { - if (spawnteam == "axis") - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_axis_start); - else - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_allies_start); - } - else - { - if (spawnteam == "axis") - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_axis); - else - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_allies); - } - - assert( isDefined(spawnpoint) ); - - self spawn( spawnPoint.origin, spawnPoint.angles, "ctf" ); -} - -updateGametypeDvars() -{ - level.idleFlagReturnTime = dvarFloatValue( "idleflagreturntime", 30, 0, 120 ); - level.flagRespawnTime = dvarIntValue( "flagrespawntime", 0, 0, 120 ); - level.touchReturn = dvarIntValue( "touchreturn", 0, 0, 1 ); - level.enemyCarrierVisible = dvarIntValue( "enemycarriervisible", 0, 0, 2 ); - - level.teamKillPenaltyMultiplier = dvarFloatValue( "teamkillpenalty", 2, 0, 10 ); - level.teamKillScoreMultiplier = dvarFloatValue( "teamkillscore", 20, 0, 40 ); - - // do not allow both a idleFlagReturnTime of forever and no touch return - // at the same time otherwise the game is unplayable - if ( level.idleFlagReturnTime == 0 && level.touchReturn == 0) - { - level.touchReturn = 1; - } -} - -createFlag( trigger ) -{ - if ( isDefined( trigger.target ) ) - { - visuals[0] = getEnt( trigger.target, "targetname" ); - } - else - { - visuals[0] = spawn( "script_model", trigger.origin ); - visuals[0].angles = trigger.angles; - } - - entityTeam = trigger.script_team; - if ( game["switchedsides"] ) - entityTeam = getOtherTeam( entityTeam ); - - visuals[0] setModel( game["flagmodels"][entityTeam] ); - visuals[0] SetTeam( entityTeam ); - - flag = maps\mp\gametypes\_gameobjects::createCarryObject( entityTeam, trigger, visuals, (0,0,100) ); - flag maps\mp\gametypes\_gameobjects::allowCarry( "enemy" ); - flag maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - flag maps\mp\gametypes\_gameobjects::setVisibleCarrierModel( game["carry_flagmodels"][entityTeam] ); - flag maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", level.iconDefend2D ); - flag maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", level.iconDefend3D ); - flag maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", level.iconCapture2D ); - flag maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", level.iconCapture3D ); - flag maps\mp\gametypes\_gameobjects::setCarryIcon( game["carry_icon"][entityTeam] ); - - if ( level.enemyCarrierVisible == 2 ) - { - flag.objIDPingFriendly = true; - } - flag.allowWeapons = true; - flag.onPickup = ::onPickup; - flag.onPickupFailed = ::onPickup; - flag.onDrop = ::onDrop; - flag.onReset = ::onReset; - - if ( level.idleFlagReturnTime > 0 ) - { - flag.autoResetTime = level.idleFlagReturnTime; - } - else - { - flag.autoResetTime = undefined; - } - - return flag; -} - -createFlagZone( trigger ) -{ - visuals = []; - - entityTeam = trigger.script_team; - if ( game["switchedsides"] ) - entityTeam = getOtherTeam( entityTeam ); - - flagZone = maps\mp\gametypes\_gameobjects::createUseObject( entityTeam, trigger, visuals, (0,0,100) ); - flagZone maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); - flagZone maps\mp\gametypes\_gameobjects::setUseTime( 0 ); - flagZone maps\mp\gametypes\_gameobjects::setUseText( &"MP_CAPTURING_FLAG" ); - //flagZone maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - flagZone maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - //'Taken is currently not in use. - //flagZone maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", level.iconTakenFriendly3D ); - //flagZone maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", level.iconTakenFriendly2D ); - //flagZone maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", level.iconTakenEnemy3D ); - //flagZone maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", level.iconTakenEnemy2D ); - - enemyTeam = getOtherTeam( entityTeam ); - flagZone maps\mp\gametypes\_gameobjects::setKeyObject( level.teamFlags[enemyTeam] ); - flagZone.onUse = ::onCapture; - - flag = level.teamFlags[entityTeam]; - flag.flagBase = flagZone; - flagZone.flag = flag; - - traceStart = trigger.origin + (0,0,32); - traceEnd = trigger.origin + (0,0,-32); - trace = bulletTrace( traceStart, traceEnd, false, undefined ); - - upangles = vectorToAngles( trace["normal"] ); - flagZone.baseeffectforward = anglesToForward( upangles ); - flagZone.baseeffectright = anglesToRight( upangles ); - - flagZone.baseeffectpos = trace["position"]; - - flagZone thread resetFlagBaseEffect(); - - flagZone createFlagSpawnInfluencer( entityTeam ); - - return flagZone; -// flag resetIcons(); -} - -createFlagHint( team, origin ) -{ - radius = 128; - height = 64; - - trigger = spawn("trigger_radius", origin, 0, radius, height); - trigger setHintString( &"MP_CTF_CANT_CAPTURE_FLAG" ); - trigger setcursorhint("HINT_NOICON"); - trigger.original_origin = origin; - - trigger turn_off(); - - return trigger; -} - -ctf() -{ - level.flags = []; - level.teamFlags = []; - level.flagZones = []; - level.teamFlagZones = []; - - level.iconCapture3D = "waypoint_grab_red"; - level.iconCapture2D = "waypoint_grab_red"; - level.iconDefend3D = "waypoint_defend_flag"; - level.iconDefend2D = "waypoint_defend_flag"; - //level.iconTakenFriendly3D = "waypoint_taken_green"; - //level.iconTakenFriendly2D = "compass_waypoint_taken_friendly"; - //level.iconTakenEnemy3D = "waypoint_taken_red"; - //level.iconTakenEnemy2D = "compass_waypoint_taken_enemy"; - level.iconDropped3D = "waypoint_defend_flag"; - level.iconDropped2D = "waypoint_defend_flag"; - level.iconReturn3D = "waypoint_return_flag"; - level.iconReturn2D = "waypoint_return_flag"; - level.iconBase3D = "waypoint_defend_flag"; - level.iconEscort3D = "waypoint_escort"; - level.iconEscort2D = "waypoint_escort"; - level.iconKill3D = "waypoint_kill"; - level.iconKill2D = "waypoint_kill"; - level.iconWaitForFlag3D = "waypoint_waitfor_flag"; - - precacheShader( level.iconCapture3D ); - precacheShader( level.iconCapture2D ); - - precacheShader( level.iconDefend3D ); - precacheShader( level.iconDefend2D ); - - //precacheShader( level.iconTakenFriendly3D ); - //precacheShader( level.iconTakenFriendly2D ); - - //precacheShader( level.iconTakenEnemy3D ); - //precacheShader( level.iconTakenEnemy2D ); - - precacheShader( level.iconDropped3D ); - precacheShader( level.iconDropped2D ); - - precacheShader( level.iconBase3D ); - - precacheShader( level.iconReturn3D ); - precacheShader( level.iconReturn2D ); - - precacheShader( level.iconEscort3D ); - precacheShader( level.iconEscort2D ); - - precacheShader( level.iconKill3D ); - precacheShader( level.iconKill2D ); - - precacheShader( level.iconWaitForFlag3D ); - -// flagBaseFX = []; - -// flagBaseFX["marines"] = "misc/fx_ui_flagbase_blue"; -// flagBaseFX["nva"] = "misc/fx_ui_flagbase_red"; -// flagBaseFX["tropas"] = "misc/fx_ui_flagbase_red"; -// flagBaseFX["specops"] = "misc/fx_ui_flagbase_gold"; -// flagBaseFX["rebels"] = "misc/fx_ui_flagbase_gold"; -// flagBaseFX["russian"] = "misc/fx_ui_flagbase_orange"; - - level.flagBaseFXid = []; - level.flagBaseFXid[ "allies" ] = loadfx( "misc/fx_ui_flagbase_gold_t5" ); - level.flagBaseFXid[ "axis" ] = loadfx( "misc/fx_ui_flagbase_gold_t5" ); - - flag_triggers = getEntArray( "ctf_flag_pickup_trig", "targetname" ); - if ( !isDefined( flag_triggers ) || flag_triggers.size != 2) - { - maps\mp\_utility::error("Not enough ctf_flag_pickup_trig triggers found in map. Need two."); - return; - } - - for ( index = 0; index < flag_triggers.size; index++ ) - { - trigger = flag_triggers[index]; - - flag = createFlag( trigger ); - - team = flag maps\mp\gametypes\_gameobjects::getOwnerTeam(); - level.flags[level.flags.size] = flag; - level.teamFlags[team] = flag; - - } - - flag_zones = getEntArray( "ctf_flag_zone_trig", "targetname" ); - if ( !isDefined( flag_zones ) || flag_zones.size != 2) - { - maps\mp\_utility::error("Not enough ctf_flag_zone_trig triggers found in map. Need two."); - return; - } - - for ( index = 0; index < flag_zones.size; index++ ) - { - trigger = flag_zones[index]; - - flagZone = createFlagZone( trigger ); - - team = flagZone maps\mp\gametypes\_gameobjects::getOwnerTeam(); - level.flagZones[level.flagZones.size] = flagZone; - level.teamFlagZones[team] = flagZone; - - level.flagHints[team] = createFlagHint( team, trigger.origin ); - - facing_angle = GetDvarInt( #"scr_ctf_spawnPointFacingAngle"); - - // the opposite team will want to face this point - if ( team == "axis" ) - { - setspawnpointsbaseweight( level.spawnsystem.iSPAWN_TEAMMASK_ALLIES, trigger.origin, facing_angle, level.spawnsystem.objective_facing_bonus); - } - else - { - setspawnpointsbaseweight( level.spawnsystem.iSPAWN_TEAMMASK_AXIS, trigger.origin, facing_angle, level.spawnsystem.objective_facing_bonus); - } - } - - // once all the flags have been registered with the game, - // give each spawn point a baseline score for each objective flag, - // based on whether or not player will be looking in the direction of that flag upon spawning - //generate_baseline_spawn_point_scores(); - - createReturnMessageElems(); - - //precacheShader( level.icon2D["axis"] ); - //precacheShader( level.icon2D["allies"] ); -} - -//Runs each round, as function as restarted at the start of every round. -//Hides the flag status icons and the 2D and 3D icons from the player's view -ctf_icon_hide() -{ - level waittill ( "game_ended" ); - - level.teamFlags["allies"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - level.teamFlags["axis"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); -} - -removeInfluencers() -{ - if ( isDefined( self.spawn_influencer_enemy_carrier ) ) - { - removeinfluencer( self.spawn_influencer_enemy_carrier ); - self.spawn_influencer_enemy_carrier = undefined; - } - if ( isDefined( self.spawn_influencer_friendly_carrier ) ) - { - removeinfluencer( self.spawn_influencer_friendly_carrier ); - self.spawn_influencer_friendly_carrier = undefined; - } - if ( isDefined( self.spawn_influencer_dropped ) ) - { - removeinfluencer( self.spawn_influencer_dropped ); - self.spawn_influencer_dropped = undefined; - } -} - -onDrop( player ) -{ - if ( isDefined( player ) ) - { - //player maps\mp\gametypes\_globallogic_audio::set_music_on_player( "SILENT", false, true ); - //player.isFlagCarrier = false; - player deleteBaseIcon(); - player ClearClientFlag( level.const_flag_ctfcarrier ); - } - - team = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); - otherTeam = getOtherTeam( team ); - - self.visuals[0] SetClientFlag( level.const_flag_flag_away ); - - if ( level.touchReturn ) - { - self maps\mp\gametypes\_gameobjects::allowCarry( "any" ); - level.flagHints[otherTeam] turn_off(); - } - - if ( isDefined( player ) ) - { - printAndSoundOnEveryone( team, "none", &"", &"", "mp_war_objective_lost", "", "" ); - - level thread maps\mp\_popups::DisplayTeamMessageToTeam( &"MP_FRIENDLY_FLAG_DROPPED", player, team ); - level thread maps\mp\_popups::DisplayTeamMessageToTeam( &"MP_ENEMY_FLAG_DROPPED", player, otherTeam ); - } - else - { - printAndSoundOnEveryone( team, "none", &"", &"", "mp_war_objective_lost", "", "" ); - } - - if( getTime() - level.lastDialogTime > 1500 ) - { - maps\mp\gametypes\_globallogic_audio::leaderDialog( "wedrop_flag", otherTeam ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "theydrop_flag", team ); - level.lastDialogTime = getTime(); - } - - if ( isDefined( player ) ) - player logString( team + " flag dropped" ); - else - logString( team + " flag dropped" ); - - if ( isDefined( player ) ) - { - player playLocalSound("mpl_flag_drop_plr"); - // Set MUSCSTATE to return to previous - player thread maps\mp\gametypes\_globallogic_audio::return_music_state_player(); - } - - - maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagdrop_sting_friend", otherTeam ); - maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagdrop_sting_enemy", team ); - - if ( level.touchReturn ) - { - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", level.iconReturn3D ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", level.iconReturn2D ); - } - else - { - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", level.iconDropped3D ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", level.iconDropped2D ); - } - self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", level.iconCapture3D ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", level.iconCapture2D ); - - thread maps\mp\_utility::playSoundOnPlayers( game["flag_dropped_sound"], game["attackers"] ); - - self thread returnFlagAfterTimeMsg( level.idleFlagReturnTime ); - - // remove carrier influencers - if ( isDefined( player ) ) - { - self removeInfluencers(); - } - else - { // influencers on the player have already been freed - self.spawn_influencer_friendly_carrier = undefined; - self.spawn_influencer_enemy_carrier = undefined; - } - - - // create new influencers on the flag - ss = level.spawnsystem; - player_team_mask = maps\mp\gametypes\_spawning::get_team_mask( otherTeam ); // this is the player that has the flag's team - enemy_team_mask = maps\mp\gametypes\_spawning::get_team_mask( team ); // and his enemies - - if ( isDefined( player ) ) - flag_origin = player.origin; - else - flag_origin = self.curorigin; - - self.spawn_influencer_dropped = addsphereinfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - flag_origin, - ss.ctf_dropped_influencer_radius, - ss.ctf_dropped_influencer_score, - player_team_mask|enemy_team_mask, - "ctf_flag_dropped,r,s", - maps\mp\gametypes\_spawning::get_score_curve_index(ss.ctf_dropped_influencer_score_curve), - level.idleFlagReturnTime, - self.trigger ); -} - - -onPickup( player ) -{ - if ( isdefined( self.spawn_influencer_dropped ) ) - { - removeinfluencer( self.spawn_influencer_dropped ); - self.spawn_influencer_dropped = undefined; - } - - player maps\mp\gametypes\_persistence::statAddWithGameType( "PICKUPS", 1 ); - - maps\mp\gametypes\_globallogic_score::givePlayerScore( "pickup", player ); - - - if ( level.touchReturn ) - { - self maps\mp\gametypes\_gameobjects::allowCarry( "enemy" ); - } - - // always clear influencers. we'll create new ones if it's been picked up by an enemy. - self removeInfluencers(); - - team = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); - otherTeam = getOtherTeam( team ); - - self clearReturnFlagHudElems(); - - if ( isDefined( player ) && player.pers["team"] == team ) - { - self notify("picked_up"); - - printAndSoundOnEveryone( team, "none", &"", &"", "mp_obj_returned", "", "" ); - - if( isdefined(player.pers["returns"]) ) - { - player.pers["returns"]++; - player.returns = player.pers["returns"]; - } - - player maps\mp\_medals::flagReturn(); - - player maps\mp\gametypes\_persistence::statAddWithGameType( "RETURNS", 1 ); - - level thread maps\mp\_popups::DisplayTeamMessageToTeam( &"MP_FRIENDLY_FLAG_RETURNED", player, team ); - level thread maps\mp\_popups::DisplayTeamMessageToTeam( &"MP_ENEMY_FLAG_RETURNED", player, otherTeam ); - - self.visuals[0] ClearClientFlag( level.const_flag_flag_away ); - - // want to return the flag here - self returnFlag(); - self maps\mp\gametypes\_gameobjects::returnHome(); - if ( isDefined( player ) ) - player logString( team + " flag returned" ); - else - logString( team + " flag returned" ); - - if ( !level.teamFlags[ "allies" ] isHome() && !level.teamFlags[ "axis" ] isHome() ) - { - players = Get_Players(); - - for(i=0; i < players.size; i++) - { - //TODO: Add proper 'if' checks OR change to a team hud element - players[i].ctfBaseIcon setShader( level.iconWaitForFlag3D, level.objPointSize, level.objPointSize ); - players[i].ctfBaseIcon setWaypoint( true, level.iconWaitForFlag3D ); - } - } - base_3d_icon_update(); - return; - } - else - { - player maps\mp\_medals::flagRunner(); - - printAndSoundOnEveryone( otherteam, team, &"", &"", "mp_obj_taken", "mp_enemy_obj_taken", "" ); - - level thread maps\mp\_popups::DisplayTeamMessageToTeam( &"MP_FRIENDLY_FLAG_TAKEN", player, team ); - level thread maps\mp\_popups::DisplayTeamMessageToTeam( &"MP_ENEMY_FLAG_TAKEN", player, otherTeam ); - - if( getTime() - level.lastDialogTime > 1500 ) - { - maps\mp\gametypes\_globallogic_audio::leaderDialog( "wetake_flag", otherTeam ); - - maps\mp\gametypes\_globallogic_audio::leaderDialog( "theytake_flag", team ); - level.lastDialogTime = getTime(); - } - - player.isFlagCarrier = true; - player playLocalSound("mpl_flag_pickup_plr"); - player SetClientFlag( level.const_flag_ctfcarrier ); - - //player thread maps\mp\gametypes\_globallogic_audio::set_next_music_state( "SUSPENSE", 4 ); - maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagget_sting_friend", otherTeam ); - maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagget_sting_enemy", team ); - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "CTF_WE_TAKE", otherTeam, false, false, 5 ); - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "CTF_THEY_TAKE", team, false, false, 5 ); - //delay setting music state for the flag carrier. - //thread OnPickupMusicState ( player ); - - - if ( level.enemyCarrierVisible ) - { - self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", level.iconKill2D ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", level.iconKill3D ); - } - else - { - self maps\mp\gametypes\_gameobjects::setVisibleTeam( "enemy" ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", level.iconKill2D ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", level.iconKill3D ); - } - - self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", level.iconEscort2D ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", level.iconEscort3D ); - - player thread claim_trigger( level.flagHints[otherTeam] ); - - player setupBaseIcon(); - player updateBaseIcon(); - - update_hints(); - - player logString( team + " flag taken" ); - - ss = level.spawnsystem; - player_team_mask = maps\mp\gametypes\_spawning::get_team_mask( otherTeam ); // this is the player that has the flag's team - enemy_team_mask = maps\mp\gametypes\_spawning::get_team_mask( team ); // and his enemies - - self.spawn_influencer_enemy_carrier = addsphereinfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - player.origin, - ss.ctf_enemy_carrier_influencer_radius, - ss.ctf_enemy_carrier_influencer_score, - enemy_team_mask, - "ctf_flag_enemy_carrier,r,s", - maps\mp\gametypes\_spawning::get_score_curve_index(ss.ctf_enemy_carrier_influencer_score_curve), - 0, - player ); - - self.spawn_influencer_friendly_carrier = addsphereinfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - player.origin, - ss.ctf_friendly_carrier_influencer_radius, - ss.ctf_friendly_carrier_influencer_score, - player_team_mask, - "ctf_flag_friendly_carrier,r,s", - maps\mp\gametypes\_spawning::get_score_curve_index(ss.ctf_friendly_carrier_influencer_score_curve), - 0, - player ); - - } - -} -OnPickupMusicState ( player ) -{ - self endon( "disconnect" ); - self endon( "death" ); - - // wait 6 seconds and see if the player still has the flag. - wait (6); - if (player.isFlagCarrier) - { - player thread maps\mp\gametypes\_globallogic_audio::set_music_on_player( "SUSPENSE", false, false); - } -} -isHome() -{ - if ( isDefined( self.carrier ) ) - return false; - - if ( self.curOrigin != self.trigger.baseOrigin ) - return false; - - return true; -} - -returnFlag() -{ - team = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); - otherTeam = level.otherTeam[team]; - - maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagreturn_sting", team ); - maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagreturn_sting", otherTeam ); - - level.teamFlagZones[otherTeam] maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); - level.teamFlagZones[otherTeam] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - - update_hints(); - - if ( level.touchReturn ) - { - self maps\mp\gametypes\_gameobjects::allowCarry( "enemy" ); - } - self maps\mp\gametypes\_gameobjects::returnHome(); - self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - //TODO: Add 2D Icons - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", level.iconDefend3D ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", level.iconDefend2D ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", level.iconCapture3D ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", level.iconCapture2D ); - - if( getTime() - level.lastDialogTime > 1500 ) - { - maps\mp\gametypes\_globallogic_audio::leaderDialog( "wereturn_flag", team ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "theyreturn_flag", otherTeam ); - level.lastDialogTime = getTime(); - } -} - - -onCapture( player ) -{ - team = player.pers["team"]; - enemyTeam = getOtherTeam( team ); - - playerTeamsFlag = level.teamFlags[team]; - - // is players team flag away from base? - // if ( playerTeamsFlag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome() && level.touchReturn ) - if ( playerTeamsFlag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome() ) - { - return; - } - - printAndSoundOnEveryone( team, enemyTeam, &"", &"", "mp_obj_captured", "mp_enemy_obj_captured", "" ); - - game["challenge"][team]["capturedFlag"] = true; - - if( isdefined(player.pers["captures"]) ) - { - player.pers["captures"]++; - player.captures = player.pers["captures"]; - } - - player maps\mp\_medals::flagCapture(); - player maps\mp\gametypes\_persistence::statAddWithGameType( "CAPTURES", 1 ); - - level thread maps\mp\_popups::DisplayTeamMessageToTeam( &"MP_ENEMY_FLAG_CAPTURED", player, team ); - level thread maps\mp\_popups::DisplayTeamMessageToTeam( &"MP_FRIENDLY_FLAG_CAPTURED", player, enemyTeam ); - -// thread playSoundOnPlayers( "mus_ctf_score"+"_"+level.teamPostfix[team] ); -// Changing to Music system - if( getTime() - level.lastDialogTime > 1500 ) - { - maps\mp\gametypes\_globallogic_audio::leaderDialog( "wecap_flag", team ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "theycap_flag", enemyTeam ); - level.lastDialogTime = getTime(); - } - - maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_enemy", enemyTeam ); - maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_friend", team ); - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "CTF_WE_SCORE", team, false, false ); - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "CTF_THEY_SCORE", enemyTeam, false, false ); - - player thread giveFlagCaptureXP( player ); - - player logString( enemyTeam + " flag captured" ); - - flag = player.carryObject; - - flag.dontAnnounceReturn = true; - flag maps\mp\gametypes\_gameobjects::returnHome(); - flag.dontAnnounceReturn = undefined; - - level.teamFlags[level.otherTeam[team]] maps\mp\gametypes\_gameobjects::allowCarry( "enemy" ); - level.teamFlags[level.otherTeam[team]] maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - level.teamFlags[level.otherTeam[team]] maps\mp\gametypes\_gameobjects::returnHome(); - level.teamFlagZones[level.otherTeam[team]] maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); - - player.isFlagCarrier = false; - player deleteBaseIcon(); - player ClearClientFlag( level.const_flag_ctfcarrier ); - - // execution will stop on this line on last flag cap of a level - [[level._setTeamScore]]( team, [[level._getTeamScore]]( team ) + 1 ); - - flag removeInfluencers(); - - // last round in a best of match is one flag cap only - if ( waslastround() ) - { - ctf_endGame( team, &"MP_CTF_OVERTIME_WIN" ); - } -} - -ctf_endGame( winningTeam, endReasonText ) -{ - [[level._setTeamScore]]( "allies", game["roundswon"]["allies"] ); - [[level._setTeamScore]]( "axis", game["roundswon"]["axis"] ); - [[level._setTeamScore]]( winningTeam, [[level._getTeamScore]]( winningTeam ) + 1 ); - - thread maps\mp\gametypes\_globallogic::endGame( winningTeam, endReasonText ); -} - -giveFlagCaptureXP( player ) -{ - wait .05; - //player thread [[level.onXPEvent]]( "capture" ); - maps\mp\gametypes\_globallogic_score::givePlayerScore( "capture", player ); -} - -onReset() -{ - update_hints(); - - team = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); - otherTeam = level.otherTeam[team]; - - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", level.iconDefend3D ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", level.iconDefend2D ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", level.iconCapture3D ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", level.iconCapture2D ); - - if ( level.touchReturn ) - { - self maps\mp\gametypes\_gameobjects::allowCarry( "enemy" ); - } - - level.teamFlagZones[team] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - level.teamFlagZones[team] maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); - - self.visuals[0] ClearClientFlag( level.const_flag_flag_away ); - self clearReturnFlagHudElems(); - - base_3d_icon_update(); -} - -getOtherFlag( flag ) -{ - if ( flag == level.flags[0] ) - return level.flags[1]; - - return level.flags[0]; -} - -onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) -{ - inFlagZone = false; - defendedFlag = false; - offendedFlag = false; - flagTeam = "invalidTeam"; - if ( isdefined( attacker ) && isplayer( attacker ) && ( !isdefined( sWeapon ) || !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) ) - { - for ( index = 0; index < level.flags.size; index++ ) - { - if ( isdefined( level.flags[index].carrier ) ) - flagOrigin = level.flags[index].carrier.origin; - else - flagOrigin = level.flags[index].curorigin; - - dist = Distance2d(self.origin, flagOrigin); - if ( dist < level.defaultOffenseRadius ) - { - inFlagZone = true; - if ( level.flags[index].ownerteam == attacker.pers["team"] ) - defendedFlag = true; - else - offendedFlag = true; - } - dist = Distance2d(attacker.origin, flagOrigin); - if ( dist < level.defaultOffenseRadius ) - { - inFlagZone = true; - if ( level.flags[index].ownerteam == attacker.pers["team"] ) - defendedFlag = true; - else - offendedFlag = true; - } - } - - if ( inFlagZone && isPlayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) - { - if ( defendedFlag ) - { - attacker maps\mp\gametypes\_persistence::statAddWithGameType( "DEFENDS", 1 ); - attacker maps\mp\_medals::defense( sWeapon ); - } - if ( offendedFlag ) - { - - attacker maps\mp\gametypes\_persistence::statAddWithGameType( "OFFENDS", 1 ); - attacker maps\mp\_medals::offense( sWeapon ); - } - } - } - - if ( !isDefined( self.isFlagCarrier ) || !self.isFlagCarrier ) - return; - - if ( isDefined( attacker ) && isPlayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) - { - attacker thread [[level.onXPEvent]]( "kill_carrier" ); - maps\mp\gametypes\_globallogic_score::givePlayerScore( "kill_carrier", attacker ); - attacker thread maps\mp\_challenges::killedFlagCarrier(); - } -} - -createReturnMessageElems() -{ - level.ReturnMessageElems = []; - - level.ReturnMessageElems["allies"]["axis"] = createServerTimer( "objective", 1.4, "allies" ); - level.ReturnMessageElems["allies"]["axis"] setPoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); - level.ReturnMessageElems["allies"]["axis"].label = &"MP_ENEMY_FLAG_RETURNING_IN"; - level.ReturnMessageElems["allies"]["axis"].alpha = 0; - level.ReturnMessageElems["allies"]["axis"].archived = false; - level.ReturnMessageElems["allies"]["allies"] = createServerTimer( "objective", 1.4, "allies" ); - level.ReturnMessageElems["allies"]["allies"] setPoint( "TOPRIGHT", "TOPRIGHT", 0, 20 ); - level.ReturnMessageElems["allies"]["allies"].label = &"MP_YOUR_FLAG_RETURNING_IN"; - level.ReturnMessageElems["allies"]["allies"].alpha = 0; - level.ReturnMessageElems["allies"]["allies"].archived = false; - - level.ReturnMessageElems["axis"]["allies"] = createServerTimer( "objective", 1.4, "axis" ); - level.ReturnMessageElems["axis"]["allies"] setPoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); - level.ReturnMessageElems["axis"]["allies"].label = &"MP_ENEMY_FLAG_RETURNING_IN"; - level.ReturnMessageElems["axis"]["allies"].alpha = 0; - level.ReturnMessageElems["axis"]["allies"].archived = false; - level.ReturnMessageElems["axis"]["axis"] = createServerTimer( "objective", 1.4, "axis" ); - level.ReturnMessageElems["axis"]["axis"] setPoint( "TOPRIGHT", "TOPRIGHT", 0, 20 ); - level.ReturnMessageElems["axis"]["axis"].label = &"MP_YOUR_FLAG_RETURNING_IN"; - level.ReturnMessageElems["axis"]["axis"].alpha = 0; - level.ReturnMessageElems["axis"]["axis"].archived = false; -} - -returnFlagAfterTimeMsg( time ) -{ - if ( level.touchReturn ) - return; - - self notify("returnFlagAfterTimeMsg"); - self endon("returnFlagAfterTimeMsg"); - - result = returnFlagHudElems( time ); - - self removeInfluencers(); - self clearReturnFlagHudElems(); - - if ( !isdefined( result ) ) // returnFlagHudElems hit an endon - return; - -// self returnFlag(); -} - -returnFlagHudElems( time ) -{ - self endon("picked_up"); - level endon("game_ended"); - - ownerteam = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); - - assert( !level.ReturnMessageElems["axis"][ownerteam].alpha ); - level.ReturnMessageElems["axis"][ownerteam].alpha = 1; - level.ReturnMessageElems["axis"][ownerteam] setTimer( time ); - - assert( !level.ReturnMessageElems["allies"][ownerteam].alpha ); - level.ReturnMessageElems["allies"][ownerteam].alpha = 1; - level.ReturnMessageElems["allies"][ownerteam] setTimer( time ); - - if( time <= 0 ) - return false; - else - wait time; - - return true; -} - -clearReturnFlagHudElems() -{ - ownerteam = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); - - level.ReturnMessageElems["allies"][ownerteam].alpha = 0; - level.ReturnMessageElems["axis"][ownerteam].alpha = 0; -} - -resetFlagBaseEffect() -{ - // dont spawn first frame - wait (0.1); - - if ( isdefined( self.baseeffect ) ) - self.baseeffect delete(); - - team = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); - - if ( team != "axis" && team != "allies" ) - return; - - fxid = level.flagBaseFXid[ team ]; - - self.baseeffect = spawnFx( fxid, self.baseeffectpos, self.baseeffectforward, self.baseeffectright ); - - triggerFx( self.baseeffect ); -} - -turn_on() -{ - if ( level.hardcoreMode ) - return; - - self.origin = self.original_origin; -} - -turn_off() -{ - self.origin = ( self.original_origin[0], self.original_origin[1], self.original_origin[2] - 10000); -} - -update_hints() -{ - allied_flag = level.teamFlags["allies"]; - axis_flag = level.teamFlags["axis"]; - - if ( isdefined(allied_flag.carrier) ) - allied_flag.carrier updateBaseIcon(); - - if ( isdefined(axis_flag.carrier) ) - axis_flag.carrier updateBaseIcon(); - - if ( !level.touchReturn ) - return; - - if ( isdefined(allied_flag.carrier) && axis_flag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome() ) - { - level.flagHints["axis"] turn_on(); - } - else - { - level.flagHints["axis"] turn_off(); - } - - if ( isdefined(axis_flag.carrier) && allied_flag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome() ) - { - level.flagHints["allies"] turn_on(); - } - else - { - level.flagHints["allies"] turn_off(); - } -} - -claim_trigger( trigger ) -{ - self endon("disconnect"); - self ClientClaimTrigger( trigger ); - - self waittill("drop_object"); - self ClientReleaseTrigger( trigger ); -} - -setupBaseIcon() -{ - zone = level.teamFlagZones[self.pers["team"]]; - self.ctfBaseIcon = newClientHudElem( self ); - self.ctfBaseIcon.x = zone.trigger.origin[0]; - self.ctfBaseIcon.y = zone.trigger.origin[1]; - self.ctfBaseIcon.z = zone.trigger.origin[2] + 100; - self.ctfBaseIcon.alpha = 1; // needs to be solid to obscure flag icon - self.ctfBaseIcon.baseAlpha = 1; - self.ctfBaseIcon.awayAlpha = 0.35; - self.ctfBaseIcon.archived = true; - base_3d_icon_update(); - self.ctfBaseIcon.sort = 1; // make sure it sorts on top of the flag icon -} - -base_3d_icon_update() -{ - if( !level.touchReturn ) - return; - - players = Get_Players(); - - for(i=0; i < players.size; i++) - { - if (IsDefined(players[i].ctfBaseIcon) && !level.teamFlags[ "allies" ] isHome() && !level.teamFlags[ "axis" ] isHome() ) - { - //TODO: Add proper 'if' checks OR change to a team hud element - players[i].ctfBaseIcon setShader( level.iconWaitForFlag3D, level.objPointSize, level.objPointSize ); - players[i].ctfBaseIcon setWaypoint( true, level.iconWaitForFlag3D ); - } - else if(IsDefined(players[i].ctfBaseIcon)) - { - //TODO: Add proper 'if' checks OR change to a team hud element - players[i].ctfBaseIcon setShader( level.iconBase3D, level.objPointSize, level.objPointSize ); - players[i].ctfBaseIcon setWaypoint( true, level.iconBase3D ); - } - } -} - -deleteBaseIcon() -{ - self.ctfBaseIcon destroy(); - self.ctfBaseIcon = undefined; -} - -updateBaseIcon() -{ - team = self.pers["team"]; - otherteam = getotherteam(team); - - flag = level.teamFlags[team]; - visible = false; - if ( flag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome() ) - { - visible = true; - } - - updateBaseIconVisibility( visible ); -} - -updateBaseIconVisibility( visible ) -{ - // can hit here if a friendly team touches flag to return - if ( !isdefined(self.ctfBaseIcon) ) - return; - - if ( visible ) - { - self.ctfBaseIcon.alpha = self.ctfBaseIcon.awayAlpha; - self.ctfBaseIcon.isShown = true; - } - else - { - self.ctfBaseIcon.alpha = self.ctfBaseIcon.baseAlpha; - self.ctfBaseIcon.isShown = true; - } -} - -createFlagSpawnInfluencer( entityTeam ) -{ - // ctf: influencer around friendly base - ctf_friendly_base_influencer_score= level.spawnsystem.ctf_friendly_base_influencer_score; - ctf_friendly_base_influencer_score_curve= level.spawnsystem.ctf_friendly_base_influencer_score_curve; - ctf_friendly_base_influencer_radius= level.spawnsystem.ctf_friendly_base_influencer_radius; - - // ctf: influencer around enemy base - ctf_enemy_base_influencer_score= level.spawnsystem.ctf_enemy_base_influencer_score; - ctf_enemy_base_influencer_score_curve= level.spawnsystem.ctf_enemy_base_influencer_score_curve; - ctf_enemy_base_influencer_radius= level.spawnsystem.ctf_enemy_base_influencer_radius; - - otherteam = getotherteam(entityTeam); - team_mask = maps\mp\gametypes\_spawning::get_team_mask( entityTeam ); - other_team_mask = maps\mp\gametypes\_spawning::get_team_mask( otherteam ); - - self.spawn_influencer_friendly = addsphereinfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - self.trigger.origin, - ctf_friendly_base_influencer_radius, - ctf_friendly_base_influencer_score, - team_mask, - "ctf_friendly_base,r,s", - maps\mp\gametypes\_spawning::get_score_curve_index(ctf_friendly_base_influencer_score_curve) ); - - self.spawn_influencer_enemy = addsphereinfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - self.trigger.origin, - ctf_enemy_base_influencer_radius, - ctf_enemy_base_influencer_score, - other_team_mask, - "ctf_enemy_base,r,s", - maps\mp\gametypes\_spawning::get_score_curve_index(ctf_enemy_base_influencer_score_curve) ); -} - -ctf_gamemodeSpawnDvars(reset_dvars) -{ - ss = level.spawnsystem; - - // ctf: influencer around friendly base - ss.ctf_friendly_base_influencer_score = set_dvar_float_if_unset("scr_spawn_ctf_friendly_base_influencer_score", "0", reset_dvars); - ss.ctf_friendly_base_influencer_score_curve = set_dvar_if_unset("scr_spawn_ctf_friendly_base_influencer_score_curve", "constant", reset_dvars); - ss.ctf_friendly_base_influencer_radius = set_dvar_float_if_unset("scr_spawn_ctf_friendly_base_influencer_radius", "" + 15.0*get_player_height(), reset_dvars); - - // ctf: influencer around enemy base - ss.ctf_enemy_base_influencer_score = set_dvar_float_if_unset("scr_spawn_ctf_enemy_base_influencer_score", "-500", reset_dvars); - ss.ctf_enemy_base_influencer_score_curve = set_dvar_if_unset("scr_spawn_ctf_enemy_base_influencer_score_curve", "constant", reset_dvars); - ss.ctf_enemy_base_influencer_radius = set_dvar_float_if_unset("scr_spawn_ctf_enemy_base_influencer_radius", "" + 15.0*get_player_height(), reset_dvars); - - // ctf: negative influencer around carrier - ss.ctf_enemy_carrier_influencer_score = set_dvar_float_if_unset("scr_spawn_ctf_enemy_carrier_influencer_score", "0", reset_dvars); - ss.ctf_enemy_carrier_influencer_score_curve = set_dvar_if_unset("scr_spawn_ctf_enemy_carrier_influencer_score_curve", "constant", reset_dvars); - ss.ctf_enemy_carrier_influencer_radius = set_dvar_float_if_unset("scr_spawn_ctf_enemy_carrier_influencer_radius", "" + 10.0*get_player_height(), reset_dvars); - - ss.ctf_friendly_carrier_influencer_score = set_dvar_float_if_unset("scr_spawn_ctf_friendly_carrier_influencer_score", "0", reset_dvars); - ss.ctf_friendly_carrier_influencer_score_curve = set_dvar_if_unset("scr_spawn_ctf_friendly_carrier_influencer_score_curve", "constant", reset_dvars); - ss.ctf_friendly_carrier_influencer_radius = set_dvar_float_if_unset("scr_spawn_ctf_friendly_carrier_influencer_radius", "" + 8.0*get_player_height(), reset_dvars); - - ss.ctf_dropped_influencer_score = set_dvar_float_if_unset("scr_spawn_ctf_dropped_influencer_score", "0", reset_dvars); - ss.ctf_dropped_influencer_score_curve = set_dvar_if_unset("scr_spawn_ctf_dropped_influencer_score_curve", "constant", reset_dvars); - ss.ctf_dropped_influencer_radius = set_dvar_float_if_unset("scr_spawn_ctf_dropped_influencer_radius", "" + 10.0*get_player_height(), reset_dvars); -} - -ctf_getTeamKillPenalty( eInflictor, attacker, sMeansOfDeath, sWeapon ) -{ - teamkill_penalty = maps\mp\gametypes\_globallogic_defaults::default_getTeamKillPenalty( eInflictor, attacker, sMeansOfDeath, sWeapon ); - - if ( ( isdefined( self.isFlagCarrier ) && self.isFlagCarrier ) ) - { - teamkill_penalty = teamkill_penalty * level.teamKillPenaltyMultiplier; - } - - return teamkill_penalty; -} - -ctf_getTeamKillScore( eInflictor, attacker, sMeansOfDeath, sWeapon ) -{ - teamkill_score = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" ); - - if ( ( isdefined( self.isFlagCarrier ) && self.isFlagCarrier ) ) - { - teamkill_score = teamkill_score * level.teamKillScoreMultiplier; - } - - return int(teamkill_score); -} - - diff --git a/mods/patch_mp/maps/mp/gametypes/dem.gsc b/mods/patch_mp/maps/mp/gametypes/dem.gsc deleted file mode 100644 index 48e1856..0000000 --- a/mods/patch_mp/maps/mp/gametypes/dem.gsc +++ /dev/null @@ -1,1319 +0,0 @@ -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -// Rallypoints should be destroyed on leaving your team/getting killed -// Compass icons need to be looked at -// Doesn't seem to be setting angle on spawn so that you are facing your rallypoint - -/* - Demolition - Attackers objective: Bomb 2 positions - Defenders objective: Defend these 2 positions / Defuse planted bombs - Round ends: When both bomb positions are exploded, or roundlength time is reached - Map ends: When one team reaches the score limit, or time limit or round limit is reached - Respawning: Players respawn upon death - - Level requirements - ------------------ - Allied Spawnpoints: - classname mp_dem_spawn_attacker_start - Allied players spawn from these. Place at least 16 of these relatively close together. - - Axis Spawnpoints: - classname mp_dem_spawn_defender_start - Axis players spawn from these. Place at least 16 of these relatively close together. - - Spectator Spawnpoints: - classname mp_global_intermission - Spectators spawn from these and intermission is viewed from these positions. - Atleast one is required, any more and they are randomly chosen between. - - Bombzones: - classname trigger_multiple - targetname bombzone_dem - script_gameobjectname bombzone_dem - script_bombmode_original - script_bombmode_single - script_bombmode_dual - script_team Set to allies or axis. This is used to set which team a bombzone is used by in dual bomb mode. - script_label Set to A or B. This sets the letter shown on the compass in original mode. - This is a volume of space in which the bomb can planted. Must contain an origin brush. - - Bomb: - classname trigger_lookat - targetname bombtrigger - script_gameobjectname bombzone - This should be a 16x16 unit trigger with an origin brush placed so that it's center lies on the bottom plane of the trigger. - Must be in the level somewhere. This is the trigger that is used when defusing a bomb. - It gets moved to the position of the planted bomb model. - - Level script requirements - ------------------------- - Team Definitions: - game["allies"] = "marines"; - game["axis"] = "nva"; - This sets the nationalities of the teams. Allies can be american, british, or russian. Axis can be german. - - game["attackers"] = "allies"; - game["defenders"] = "axis"; - This sets which team is attacking and which team is defending. Attackers plant the bombs. Defenders protect the targets. - - If using minefields or exploders: - maps\mp\_load::main(); - - Optional level script settings - ------------------------------ - Soldier Type and Variation: - game["american_soldiertype"] = "normandy"; - game["german_soldiertype"] = "normandy"; - This sets what character models are used for each nationality on a particular map. - - Valid settings: - american_soldiertype normandy - british_soldiertype normandy, africa - russian_soldiertype coats, padded - german_soldiertype normandy, africa, winterlight, winterdark - - Exploder Effects: - Setting script_noteworthy on a bombzone trigger to an exploder group can be used to trigger additional effects. -*/ - -/*QUAKED mp_dem_spawn_attacker_start (0.0 1.0 0.0) (-16 -16 0) (16 16 72) -Attacking players spawn randomly at one of these positions at the beginning of a round.*/ - -/*QUAKED mp_dem_spawn_defender_start (1.0 0.0 0.0) (-16 -16 0) (16 16 72) -Defending players spawn randomly at one of these positions at the beginning of a round.*/ - -/*QUAKED mp_dem_spawn_attacker (0.0 1.0 0.0) (-16 -16 0) (16 16 72) -Attacking players may spawn randomly at one of these positions after death.*/ - -/*QUAKED mp_dem_spawn_attacker_a (0.0 1.0 0.0) (-16 -16 0) (16 16 72) -Attacking players may spawn randomly at one of these positions after death if site A has been destroyed.*/ - -/*QUAKED mp_dem_spawn_attacker_b (0.0 1.0 0.0) (-16 -16 0) (16 16 72) -Attacking players may spawn randomly at one of these positions after death if site B has been destroyed.*/ - -/*QUAKED mp_dem_spawn_defender (1.0 0.0 0.0) (-16 -16 0) (16 16 72) -Defending players may spawn randomly at one of these positions after death.*/ - -/*QUAKED mp_dem_spawn_defender_a (1.0 0.0 0.0) (-16 -16 0) (16 16 72) -Defending players may spawn randomly at one of these positions after death if site A is still intact.*/ - -/*QUAKED mp_dem_spawn_defender_b (1.0 0.0 0.0) (-16 -16 0) (16 16 72) -Defending players may spawn randomly at one of these positions after death if site B is still intact.*/ - -main() -{ - if(GetDvar( #"mapname") == "mp_background") - return; - - maps\mp\gametypes\_globallogic::init(); - maps\mp\gametypes\_callbacksetup::SetupCallbacks(); - maps\mp\gametypes\_globallogic::SetupCallbacks(); - - maps\mp\gametypes\_globallogic_utils::registerRoundSwitchDvar( level.gameType, 1, 0, 9 ); - maps\mp\gametypes\_globallogic_utils::registerTimeLimitDvar( level.gameType, 2.5, 0, 1440 ); - maps\mp\gametypes\_globallogic_utils::registerScoreLimitDvar( level.gameType, 2, 0, 500 ); - maps\mp\gametypes\_globallogic_utils::registerRoundLimitDvar( level.gameType, 0, 0, 12 ); - maps\mp\gametypes\_globallogic_utils::registerRoundWinLimitDvar( level.gameType, 0, 0, 10 ); - maps\mp\gametypes\_globallogic_utils::registerNumLivesDvar( level.gameType, 0, 0, 10 ); - - maps\mp\gametypes\_weapons::registerGrenadeLauncherDudDvar( level.gameType, 10, 0, 1440 ); - maps\mp\gametypes\_weapons::registerThrownGrenadeDudDvar( level.gameType, 0, 0, 1440 ); - maps\mp\gametypes\_weapons::registerKillstreakDelay( level.gameType, 0, 0, 1440 ); - - maps\mp\gametypes\_globallogic::registerFriendlyFireDelay( level.gameType, 15, 0, 1440 ); - - registerGrenadeLauncherDudDvar( level.gameType, 2, 0, 1440 ); - registerThrownGrenadeDudDvar( level.gameType, 0, 0, 1440 ); - - level.teamBased = true; - level.overrideTeamScore = true; - level.onPrecacheGameType = ::onPrecacheGameType; - level.onStartGameType = ::onStartGameType; - level.onSpawnPlayer = ::onSpawnPlayer; - level.onSpawnPlayerUnified = ::onSpawnPlayerUnified; - level.playerSpawnedCB = ::dem_playerSpawnedCB; - level.onPlayerKilled = ::onPlayerKilled; - level.onDeadEvent = ::onDeadEvent; - level.onOneLeftEvent = ::onOneLeftEvent; - level.onTimeLimit = ::onTimeLimit; - level.onRoundSwitch = ::onRoundSwitch; - level.getTeamKillPenalty = ::dem_getTeamKillPenalty; - level.getTeamKillScore = ::dem_getTeamKillScore; - level.gamemodeSpawnDvars = ::gamemodeSpawnDvars; - level.getTimeLimitDvarValue = ::getTimeLimitDvarValue; - level.ddBombModel = []; - - level.endGameOnScoreLimit = false; - - game["dialog"]["gametype"] = "demo_start"; - game["dialog"]["gametype_hardcore"] = "hcdemo_start"; - game["dialog"]["offense_obj"] = "destroy_start"; - game["dialog"]["defense_obj"] = "defend_start"; - game["dialog"]["sudden_death"] = "suddendeath"; - - // Sets the scoreboard columns and determines with data is sent across the network - setscoreboardcolumns( "kills", "deaths", "plants", "defuses" ); -} - -onPrecacheGameType() -{ - game["bombmodelname"] = "t5_weapon_briefcase_bomb_world"; - game["bombmodelnameobj"] = "t5_weapon_briefcase_bomb_world"; - game["bomb_dropped_sound"] = "flag_drop_plr"; - game["bomb_recovered_sound"] = "flag_pickup_plr"; - precacheModel(game["bombmodelname"]); - precacheModel(game["bombmodelnameobj"]); - - precacheShader("waypoint_bomb"); - precacheShader("hud_suitcase_bomb"); - precacheShader("waypoint_target"); - precacheShader("waypoint_target_a"); - precacheShader("waypoint_target_b"); - precacheShader("waypoint_defend"); - precacheShader("waypoint_defend_a"); - precacheShader("waypoint_defend_b"); - precacheShader("waypoint_defuse"); - precacheShader("waypoint_defuse_a"); - precacheShader("waypoint_defuse_b"); - precacheShader("compass_waypoint_target"); - precacheShader("compass_waypoint_target_a"); - precacheShader("compass_waypoint_target_b"); - precacheShader("compass_waypoint_defend"); - precacheShader("compass_waypoint_defend_a"); - precacheShader("compass_waypoint_defend_b"); - precacheShader("compass_waypoint_defuse"); - precacheShader("compass_waypoint_defuse_a"); - precacheShader("compass_waypoint_defuse_b"); - - precacheString( &"MP_EXPLOSIVES_RECOVERED_BY" ); - precacheString( &"MP_EXPLOSIVES_DROPPED_BY" ); - precacheString( &"MP_EXPLOSIVES_PLANTED_BY" ); - precacheString( &"MP_EXPLOSIVES_DEFUSED_BY" ); - precacheString( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); - precacheString( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); - precacheString( &"MP_PLANTING_EXPLOSIVE" ); - precacheString( &"MP_DEFUSING_EXPLOSIVE" ); - precacheString( &"MP_TIME_EXTENDED" ); -} - -dem_getTeamKillPenalty( eInflictor, attacker, sMeansOfDeath, sWeapon ) -{ - teamkill_penalty = maps\mp\gametypes\_globallogic_defaults::default_getTeamKillPenalty( eInflictor, attacker, sMeansOfDeath, sWeapon ); - - if ( ( isdefined( self.isDefusing ) && self.isDefusing ) || ( isdefined( self.isPlanting ) && self.isPlanting ) ) - { - teamkill_penalty = teamkill_penalty * level.teamKillPenaltyMultiplier; - } - - return teamkill_penalty; -} - -dem_getTeamKillScore( eInflictor, attacker, sMeansOfDeath, sWeapon ) -{ - teamkill_score = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" ); - - if ( ( isdefined( self.isDefusing ) && self.isDefusing ) || ( isdefined( self.isPlanting ) && self.isPlanting ) ) - { - teamkill_score = teamkill_score * level.teamKillScoreMultiplier; - } - - return int(teamkill_score); -} - - -onRoundSwitch() -{ - if ( !isdefined( game["switchedsides"] ) ) - game["switchedsides"] = false; - - if ( game["teamScores"]["allies"] == level.scorelimit - 1 && game["teamScores"]["axis"] == level.scorelimit - 1 ) - { - // overtime! team that's ahead in kills gets to defend. - aheadTeam = getBetterTeam(); - if ( aheadTeam != game["defenders"] ) - { - game["switchedsides"] = !game["switchedsides"]; - } - else - { - level.halftimeSubCaption = ""; - } - level.halftimeType = "overtime"; - } - else - { - level.halftimeType = "halftime"; - game["switchedsides"] = !game["switchedsides"]; - } -} - -getBetterTeam() -{ - kills["allies"] = 0; - kills["axis"] = 0; - deaths["allies"] = 0; - deaths["axis"] = 0; - - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - team = player.pers["team"]; - if ( isDefined( team ) && (team == "allies" || team == "axis") ) - { - kills[ team ] += player.kills; - deaths[ team ] += player.deaths; - } - } - - if ( kills["allies"] > kills["axis"] ) - return "allies"; - else if ( kills["axis"] > kills["allies"] ) - return "axis"; - - // same number of kills - - if ( deaths["allies"] < deaths["axis"] ) - return "allies"; - else if ( deaths["axis"] < deaths["allies"] ) - return "axis"; - - // same number of deaths - - if ( randomint(2) == 0 ) - return "allies"; - return "axis"; -} - -gamemodeSpawnDvars(reset_dvars) -{ - ss = level.spawnsystem; - - // negative influencer around enemy base - ss.dem_enemy_base_influencer_score = set_dvar_float_if_unset("scr_spawn_dem_enemy_base_influencer_score", "-500", reset_dvars); - ss.dem_enemy_base_influencer_score_curve = set_dvar_if_unset("scr_spawn_dem_enemy_base_influencer_score_curve", "constant", reset_dvars); - ss.dem_enemy_base_influencer_radius = set_dvar_float_if_unset("scr_spawn_dem_enemy_base_influencer_radius", "" + 15.0*get_player_height(), reset_dvars); -} - -onStartGameType() -{ - SetBombTimer( "A", 0 ); - setMatchFlag( "bomb_timer_a", 0 ); - SetBombTimer( "B", 0 ); - setMatchFlag( "bomb_timer_b", 0 ); - - level.usingExtraTime = false; - - // we'll handle the sideswitching ourselves - level.spawnsystem.unifiedSideSwitching = 0; - - if ( !isDefined( game["switchedsides"] ) ) - game["switchedsides"] = false; - - if ( game["switchedsides"] ) - { - oldAttackers = game["attackers"]; - oldDefenders = game["defenders"]; - game["attackers"] = oldDefenders; - game["defenders"] = oldAttackers; - } - - setClientNameMode( "manual_change" ); - - game["strings"]["target_destroyed"] = &"MP_TARGET_DESTROYED"; - game["strings"]["bomb_defused"] = &"MP_BOMB_DEFUSED"; - - precacheString( game["strings"]["target_destroyed"] ); - precacheString( game["strings"]["bomb_defused"] ); - - level._effect["bombexplosion"] = loadfx("maps/mp_maps/fx_mp_exp_bomb"); - - maps\mp\gametypes\_globallogic_ui::setObjectiveText( game["attackers"], &"OBJECTIVES_DEM_ATTACKER" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveText( game["defenders"], &"OBJECTIVES_SD_DEFENDER" ); - - if ( level.splitscreen ) - { - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( game["attackers"], &"OBJECTIVES_DEM_ATTACKER" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( game["defenders"], &"OBJECTIVES_SD_DEFENDER" ); - } - else - { - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( game["attackers"], &"OBJECTIVES_DEM_ATTACKER_SCORE" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( game["defenders"], &"OBJECTIVES_SD_DEFENDER_SCORE" ); - } - maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( game["attackers"], &"OBJECTIVES_DEM_ATTACKER_HINT" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( game["defenders"], &"OBJECTIVES_SD_DEFENDER_HINT" ); - - level.spawnMins = ( 0, 0, 0 ); - level.spawnMaxs = ( 0, 0, 0 ); - maps\mp\gametypes\_spawnlogic::dropSpawnPoints( "mp_dem_spawn_attacker_a" ); - maps\mp\gametypes\_spawnlogic::dropSpawnPoints( "mp_dem_spawn_attacker_b" ); - maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_dem_spawn_defender_start" ); - maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_dem_spawn_attacker_start" ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["attackers"], "mp_dem_spawn_attacker" ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["defenders"], "mp_dem_spawn_defender" ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["defenders"], "mp_dem_spawn_defender_a" ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["defenders"], "mp_dem_spawn_defender_b" ); - maps\mp\gametypes\_spawning::updateAllSpawnPoints(); - - level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs ); - setMapCenter( level.mapCenter ); - - spawnpoint = maps\mp\gametypes\_spawnlogic::getRandomIntermissionPoint(); - setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles ); - - level.demBombzoneName = "bombzone_dem"; - bombZones = getEntArray( level.demBombzoneName, "targetname" ); - if ( bombZones.size == 0 ) - level.demBombzoneName = "bombzone"; - - allowed[0] = "sd"; - allowed[1] = level.demBombzoneName; - allowed[2] = "blocker"; - allowed[3] = "dem"; - maps\mp\gametypes\_gameobjects::main(allowed); - - // now that the game objects have been deleted place the influencers - maps\mp\gametypes\_spawning::create_map_placed_influencers(); - - level.spawn_axis_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dem_spawn_defender_start" ); - level.spawn_allies_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dem_spawn_attacker_start" ); - - maps\mp\gametypes\_rank::registerScoreInfo( "kill", 50 ); - maps\mp\gametypes\_rank::registerScoreInfo( "headshot", 50 ); - maps\mp\gametypes\_rank::registerScoreInfo( "plant", 100 ); - maps\mp\gametypes\_rank::registerScoreInfo( "defuse", 100 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assist_75", 25 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assist_50", 25 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assist_25", 25 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assist", 25 ); - maps\mp\gametypes\_rank::registerScoreInfo( "destroyer", 100 ); - - thread updateGametypeDvars(); - - thread bombs(); -} - - -onSpawnPlayerUnified() -{ - self.isPlanting = false; - self.isDefusing = false; - self.isBombCarrier = false; - if ( isDefined( self.carryIcon ) ) - { - self.carryIcon destroyElem(); - self.carryIcon = undefined; - } - - if ( self.pers["team"] == game["attackers"] ) - { - if ( self IsSplitscreen() ) - { - self.carryIcon = createIcon( "hud_suitcase_bomb", 35, 35 ); - self.carryIcon.x = -125; - self.carryIcon.y = -90; - self.carryIcon.horzAlign = "right"; - self.carryIcon.vertAlign = "bottom"; - } - else - { - self.carryIcon = createIcon( "hud_suitcase_bomb", 50, 50 ); - self.carryIcon.x = -130; - self.carryIcon.y = -103; - self.carryIcon.horzAlign = "user_right"; - self.carryIcon.vertAlign = "user_bottom"; - } - self.carryIcon.alpha = 0.75; - self.carryIcon.hidewhileremotecontrolling = true; - self.carryIcon.hidewheninkillcam = true; - } - - maps\mp\gametypes\_spawning::onSpawnPlayer_Unified(); -} - - -onSpawnPlayer() -{ - self.isPlanting = false; - self.isDefusing = false; - self.isBombCarrier = false; - if ( isDefined( self.carryIcon ) ) - { - self.carryIcon destroyElem(); - self.carryIcon = undefined; - } - - if( self.pers["team"] == game["attackers"] ) - spawnPointName = "mp_dem_spawn_attacker_start"; - else - spawnPointName = "mp_dem_spawn_defender_start"; - - if ( self.pers["team"] == game["attackers"] ) - { - if ( self IsSplitscreen() ) - { - self.carryIcon = createIcon( "hud_suitcase_bomb", 35, 35 ); - self.carryIcon.x = -125; - self.carryIcon.y = -90; - self.carryIcon.horzAlign = "right"; - self.carryIcon.vertAlign = "bottom"; - } - else - { - self.carryIcon = createIcon( "hud_suitcase_bomb", 50, 50 ); - self.carryIcon.x = -130; - self.carryIcon.y = -103; - self.carryIcon.horzAlign = "user_right"; - self.carryIcon.vertAlign = "user_bottom"; - } - self.carryIcon.alpha = 0.75; - self.carryIcon.hidewhileremotecontrolling = true; - self.carryIcon.hidewheninkillcam = true; - } - - spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( spawnPointName ); - assert( spawnPoints.size ); - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - self spawn( spawnpoint.origin, spawnpoint.angles, "dem" ); -} - - -dem_playerSpawnedCB() -{ - level notify ( "spawned_player" ); -} - - -onPlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration) -{ - thread checkAllowSpectating(); - - inBombZone = false; - - for ( index = 0; index < level.bombZones.size; index++ ) - { - if ( !isDefined( level.bombZones[index].bombExploded ) || !level.bombZones[index].bombExploded ) - { - dist = Distance2d(self.origin, level.bombZones[index].curorigin); - if ( dist < level.defaultOffenseRadius ) - { - inBombZone = true; - break; - } - } - } - - - if ( inBombZone && isPlayer( attacker ) && attacker.pers["team"] != self.pers["team"] && ( !isdefined( sWeapon ) || !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) ) - { - if ( game["defenders"] == self.pers["team"] ) - { - attacker maps\mp\_medals::offense( sWeapon ); - attacker maps\mp\gametypes\_persistence::statAddWithGameType( "OFFENDS", 1 ); - } - else - { - if( isdefined(attacker.pers["defends"]) ) - { - attacker.pers["defends"]++; - attacker.defends = attacker.pers["defends"]; - } - - attacker maps\mp\_medals::defense( sWeapon ); - attacker maps\mp\gametypes\_persistence::statAddWithGameType( "DEFENDS", 1 ); - } - } -} - - -checkAllowSpectating() -{ - wait ( 0.05 ); - - update = false; - - livesLeft = !(level.numLives && !self.pers["lives"]); - - if ( !level.aliveCount[ game["attackers"] ] && !livesLeft ) - { - level.spectateOverride[game["attackers"]].allowEnemySpectate = 1; - update = true; - } - if ( !level.aliveCount[ game["defenders"] ] && !livesLeft ) - { - level.spectateOverride[game["defenders"]].allowEnemySpectate = 1; - update = true; - } - if ( update ) - maps\mp\gametypes\_spectating::updateSpectateSettings(); -} - - -dem_endGame( winningTeam, endReasonText ) -{ - if ( isdefined( winningTeam ) ) - [[level._setTeamScore]]( winningTeam, [[level._getTeamScore]]( winningTeam ) + 1 ); - - thread maps\mp\gametypes\_globallogic::endGame( winningTeam, endReasonText ); -} - -dem_endGameWithKillcam( winningTeam, endReasonText ) -{ - level thread maps\mp\gametypes\_killcam::startLastKillcam(); - dem_endGame( winningTeam, endReasonText ); -} - - -onDeadEvent( team ) -{ - if ( level.bombExploded || level.bombDefused ) - return; - - if ( team == "all" ) - { - if ( level.bombPlanted ) - dem_endGameWithKillcam( game["attackers"], game["strings"][game["defenders"]+"_eliminated"] ); - else - dem_endGameWithKillcam( game["defenders"], game["strings"][game["attackers"]+"_eliminated"] ); - } - else if ( team == game["attackers"] ) - { - if ( level.bombPlanted ) - return; - - dem_endGameWithKillcam( game["defenders"], game["strings"][game["attackers"]+"_eliminated"] ); - } - else if ( team == game["defenders"] ) - { - dem_endGameWithKillcam( game["attackers"], game["strings"][game["defenders"]+"_eliminated"] ); - } -} - - -onOneLeftEvent( team ) -{ - if ( level.bombExploded || level.bombDefused ) - return; - - //if ( team == game["attackers"] ) - warnLastPlayer( team ); -} - - -onTimeLimit() -{ - if ( level.teamBased ) - { - bombZonesLeft = 0; - - for ( index = 0; index < level.bombZones.size; index++ ) - { - if ( !isDefined( level.bombZones[index].bombExploded ) || !level.bombZones[index].bombExploded ) - bombZonesLeft++; - } - if ( bombZonesLeft == 0 ) - { - dem_endGame( game["attackers"], game["strings"]["target_destroyed"] ); - } - else - { - dem_endGame( game["defenders"], game["strings"]["time_limit_reached"] ); - } - } - else - dem_endGame( undefined, game["strings"]["time_limit_reached"] ); -} - - -warnLastPlayer( team ) -{ - if ( !isdefined( level.warnedLastPlayer ) ) - level.warnedLastPlayer = []; - - if ( isDefined( level.warnedLastPlayer[team] ) ) - return; - - level.warnedLastPlayer[team] = true; - - players = level.players; - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( isDefined( player.pers["team"] ) && player.pers["team"] == team && isdefined( player.pers["class"] ) ) - { - if ( player.sessionstate == "playing" && !player.afk ) - break; - } - } - - if ( i == players.size ) - return; - - players[i] thread giveLastAttackerWarning(); -} - - -giveLastAttackerWarning() -{ - self endon("death"); - self endon("disconnect"); - - fullHealthTime = 0; - interval = .05; - - while(1) - { - if ( self.health != self.maxhealth ) - fullHealthTime = 0; - else - fullHealthTime += interval; - - wait interval; - - if (self.health == self.maxhealth && fullHealthTime >= 3) - break; - } - - //self iprintlnbold(&"MP_YOU_ARE_THE_ONLY_REMAINING_PLAYER"); - //self maps\mp\gametypes\_globallogic_audio::leaderDialogOnPlayer( "last_alive" ); - self maps\mp\gametypes\_globallogic_audio::leaderDialogOnPlayer( "sudden_death" ); - - self maps\mp\gametypes\_missions::lastManSD(); -} - - -updateGametypeDvars() -{ - level.plantTime = dvarFloatValue( "planttime", 5, 0, 20 ); - level.defuseTime = dvarFloatValue( "defusetime", 5, 0, 20 ); - level.bombTimer = dvarFloatValue( "bombtimer", 45, 1, 300 ); - level.extraTime = dvarFloatValue( "extratime", 2.5, 0, 300 ); - - level.teamKillPenaltyMultiplier = dvarFloatValue( "teamkillpenalty", 2, 0, 10 ); - level.teamKillScoreMultiplier = dvarFloatValue( "teamkillscore", 4, 0, 40 ); - level.playerEventsMax = dvarFloatValue( "maxPlayerEvents", 1000, 0, 1000 ); - level.playerEventsLPM = dvarFloatValue( "maxPlayerEventsPerMinute", 2, 0, 15 ); - level.bombEventsLPM = dvarFloatValue( "maxBombEventsPerMinute", 4, 0, 15 ); -} - -resetBombZone() -{ - self maps\mp\gametypes\_gameobjects::allowUse( "enemy" ); - self maps\mp\gametypes\_gameobjects::setUseTime( level.plantTime ); - self maps\mp\gametypes\_gameobjects::setUseText( &"MP_PLANTING_EXPLOSIVE" ); - self maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); - self maps\mp\gametypes\_gameobjects::setKeyObject( level.ddBomb ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_defend" + self.label ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" + self.label ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_target" + self.label ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_target" + self.label ); - self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - self.useWeapon = "briefcase_bomb_mp"; -} - -setUpForDefusing() -{ - self maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); - self maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime ); - self maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" ); - self maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); - self maps\mp\gametypes\_gameobjects::setKeyObject( undefined ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defuse" + self.label ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defuse" + self.label ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_defend" + self.label ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_defend" + self.label ); - self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); -} - - -bombs() -{ - level.bombAPlanted = false; - level.bombBPlanted = false; - level.bombPlanted = false; - level.bombDefused = false; - level.bombExploded = false; - - sdBomb = getEnt( "sd_bomb", "targetname" ); - if ( isDefined( sdBomb ) ) - sdBomb delete(); - - precacheModel( "t5_weapon_briefcase_bomb_world" ); - - level.bombZones = []; - - bombZones = getEntArray( level.demBombzoneName, "targetname" ); - - for ( index = 0; index < bombZones.size; index++ ) - { - trigger = bombZones[index]; - visuals = getEntArray( bombZones[index].target, "targetname" ); - - bombZone = maps\mp\gametypes\_gameobjects::createUseObject( game["defenders"], trigger, visuals, (0,0,64) ); - bombZone maps\mp\gametypes\_gameobjects::allowUse( "enemy" ); - bombZone maps\mp\gametypes\_gameobjects::setUseTime( level.plantTime ); - bombZone maps\mp\gametypes\_gameobjects::setUseText( &"MP_PLANTING_EXPLOSIVE" ); - bombZone maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); - bombZone maps\mp\gametypes\_gameobjects::setKeyObject( level.ddBomb ); - - label = bombZone maps\mp\gametypes\_gameobjects::getLabel(); - bombZone.label = label; - bombZone.index = index; - bombZone maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" + label ); - bombZone maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" + label ); - bombZone maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_target" + label ); - bombZone maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_target" + label ); - bombZone maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - bombZone.onBeginUse = ::onBeginUse; - bombZone.onEndUse = ::onEndUse; - bombZone.onUse = ::onUseObject; - bombZone.onCantUse = ::onCantUse; - bombZone.useWeapon = "briefcase_bomb_mp"; - bombZone.visuals[0].killCamEnt = spawn( "script_model", bombZone.visuals[0].origin + (0,0,128) ); - - for ( i = 0; i < visuals.size; i++ ) - { - if ( isDefined( visuals[i].script_exploder ) ) - { - bombZone.exploderIndex = visuals[i].script_exploder; - break; - } - } - - level.bombZones[level.bombZones.size] = bombZone; - - bombZone.bombDefuseTrig = getent( visuals[0].target, "targetname" ); - assert( isdefined( bombZone.bombDefuseTrig ) ); - bombZone.bombDefuseTrig.origin += (0,0,-10000); - bombZone.bombDefuseTrig.label = label; - - // Add spawn influencer - dem_enemy_base_influencer_score = level.spawnsystem.dem_enemy_base_influencer_score; - dem_enemy_base_influencer_score_curve = level.spawnsystem.dem_enemy_base_influencer_score_curve; - dem_enemy_base_influencer_radius = level.spawnsystem.dem_enemy_base_influencer_radius; - team_mask = maps\mp\gametypes\_spawning::get_team_mask( game["attackers"] ); - bombZone.spawnInfluencer = addsphereinfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - trigger.origin, - dem_enemy_base_influencer_radius, - dem_enemy_base_influencer_score, - team_mask, - "dem_enemy_base,r,s", - maps\mp\gametypes\_spawning::get_score_curve_index(dem_enemy_base_influencer_score_curve) ); - } - - for ( index = 0; index < level.bombZones.size; index++ ) - { - array = []; - for ( otherindex = 0; otherindex < level.bombZones.size; otherindex++ ) - { - if ( otherindex != index ) - array[ array.size ] = level.bombZones[otherindex]; - } - level.bombZones[index].otherBombZones = array; - } -} - -onBeginUse( player ) -{ - if ( self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) - { - player playSound( "mpl_sd_bomb_defuse" ); - player.isDefusing = true; - player thread maps\mp\gametypes\_battlechatter_mp::gametypeSpecificBattleChatter( "sd_enemyplant", player.pers["team"] ); - - bestDistance = 9000000; - closestBomb = undefined; - - if ( isDefined( level.ddBombModel ) ) - { - keys = GetArrayKeys( level.ddBombModel ); - for ( bombLabel = 0; bombLabel < keys.size; bombLabel++ ) - { - bomb = level.ddBombModel[ keys[bombLabel] ]; - - if ( !isDefined( bomb ) ) - continue; - - dist = distanceSquared( player.origin, bomb.origin ); - - if ( dist < bestDistance ) - { - bestDistance = dist; - closestBomb = bomb; - } - } - - assert( isDefined(closestBomb) ); - player.defusing = closestBomb; - closestBomb hide(); - } - } - else - { - player.isPlanting = true; - player thread maps\mp\gametypes\_battlechatter_mp::gametypeSpecificBattleChatter( "sd_friendlyplant", player.pers["team"] ); - } - player playSound( "fly_bomb_raise_plr" ); -} - -onEndUse( team, player, result ) -{ - if ( !IsDefined( player ) ) - return; - - player.isDefusing = false; - player.isPlanting = false; - player notify( "event_ended" ); - - if ( self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) - { - if ( isDefined( player.defusing ) && !result ) - { - player.defusing show(); - } - } -} - -onCantUse( player ) -{ - player iPrintLnBold( &"MP_CANT_PLANT_WITHOUT_BOMB" ); -} - -onUseObject( player ) -{ - team = player.team; - enemyTeam = getOtherTeam( team ); - - self updateEventsPerMinute(); - player updateEventsPerMinute(); - - // planted the bomb - if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( team ) ) - { - - level thread bombPlanted( self, player ); - player logString( "bomb planted: " + self.label ); - -// removed plant audio until finalization of assest TODO : new plant sounds when assests are online -// player playSound( "mpl_sd_bomb_plant" ); - player notify ( "bomb_planted" ); - - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_WE_PLANT", team, false, false, 5 ); - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_THEY_PLANT", enemyTeam, false, false, 5 ); - - if( isdefined(player.pers["plants"]) ) - { - player.pers["plants"]++; - player.plants = player.pers["plants"]; - } - - if ( !isScoreBoosting( player, self ) ) - { - player maps\mp\_medals::saboteur(); - player maps\mp\gametypes\_persistence::statAddWithGameType( "PLANTS", 1 ); - - maps\mp\gametypes\_globallogic_score::givePlayerScore( "plant", player ); - player thread [[level.onXPEvent]]( "plant" ); - } - - level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_PLANTED_BY", player ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_planted" ); - } - else - { - player notify ( "bomb_defused" ); - player logString( "bomb defused: " + self.label ); - self thread bombDefused(); - self resetBombzone(); - - if( isdefined(player.pers["defuses"]) ) - { - player.pers["defuses"]++; - player.defuses = player.pers["defuses"]; - } - - if ( !isScoreBoosting( player, self ) ) - { - player maps\mp\_medals::hero(); - player maps\mp\gametypes\_persistence::statAddWithGameType( "DEFUSES", 1 ); - - maps\mp\gametypes\_globallogic_score::givePlayerScore( "defuse", player ); - } - - level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_DEFUSED_BY", player ); - - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_WE_DEFUSE", team, false, false, 5 ); - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_THEY_DEFUSE", enemyTeam, false, false, 5 ); - - maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_defused" ); - - //player thread [[level.onXPEvent]]( "defuse" ); - } -} - -onDrop( player ) -{ - if ( !level.bombPlanted ) - { - if ( isDefined( player ) && isDefined( player.name ) ) - printOnTeamArg( &"MP_EXPLOSIVES_DROPPED_BY", game["attackers"], player ); - -// maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_lost", player.pers["team"] ); - if ( isDefined( player ) ) - player logString( "bomb dropped" ); - else - logString( "bomb dropped" ); - } - - player notify( "event_ended" ); - - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" ); - - maps\mp\_utility::playSoundOnPlayers( game["bomb_dropped_sound"], game["attackers"] ); -} - - -onPickup( player ) -{ - player.isBombCarrier = true; - - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" ); - - if ( !level.bombDefused ) - { - if ( isDefined( player ) && isDefined( player.name ) ) - printOnTeamArg( &"MP_EXPLOSIVES_RECOVERED_BY", game["attackers"], player ); - - thread playSoundOnPlayers( "mus_sd_pickup"+"_"+level.teamPostfix[player.pers["team"]], player.pers["team"] ); - - maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_taken", player.pers["team"] ); - player logString( "bomb taken" ); - } - maps\mp\_utility::playSoundOnPlayers( game["bomb_recovered_sound"], game["attackers"] ); -} - - -onReset() -{ -} - -bombReset( label, reason ) -{ - if ( label == "_a" ) - { - level.bombAPlanted = false; - SetBombTimer( "A", 0 ); - } - else - { - level.bombBPlanted = false; - SetBombTimer( "B", 0 ); - } - - setMatchFlag( "bomb_timer" + label, 0 ); - - if ( !level.bombAPlanted && !level.bombBPlanted ) - maps\mp\gametypes\_globallogic_utils::resumeTimer(); - - self.visuals[0] maps\mp\gametypes\_globallogic_utils::stopTickingSound(); -} - -dropBombModel( player, site ) -{ - trace = bulletTrace( player.origin + (0,0,20), player.origin - (0,0,2000), false, player ); - - tempAngle = randomfloat( 360 ); - forward = (cos( tempAngle ), sin( tempAngle ), 0); - forward = vectornormalize( forward - vector_scale( trace["normal"], vectordot( forward, trace["normal"] ) ) ); - dropAngles = vectortoangles( forward ); - - level.ddBombModel[ site ] = spawn( "script_model", trace["position"] ); - level.ddBombModel[ site ].angles = dropAngles; - level.ddBombModel[ site ] setModel( "prop_suitcase_bomb" ); -} - - -bombPlanted( destroyedObj, player ) -{ - level endon( "game_ended" ); - destroyedObj endon( "bomb_defused" ); - team = player.team; - game["challenge"][team]["plantedBomb"] = true; - - maps\mp\gametypes\_globallogic_utils::pauseTimer(); - destroyedObj.bombPlanted = true; - - destroyedObj.visuals[0] thread maps\mp\gametypes\_globallogic_utils::playTickingSound( "mpl_sab_ui_suitcasebomb_timer" ); - destroyedObj.tickingObject = destroyedObj.visuals[0]; - - label = destroyedObj maps\mp\gametypes\_gameobjects::getLabel(); - - detonateTime = int( gettime() + (level.bombTimer * 1000) ); - updateBombTimers(label, detonateTime); - - trace = bulletTrace( player.origin + (0,0,20), player.origin - (0,0,2000), false, player ); - - tempAngle = randomfloat( 360 ); - forward = (cos( tempAngle ), sin( tempAngle ), 0); - forward = vectornormalize( forward - vector_scale( trace["normal"], vectordot( forward, trace["normal"] ) ) ); - dropAngles = vectortoangles( forward ); - - self dropBombModel( player, destroyedObj.label ); - destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" ); - destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - destroyedObj setUpForDefusing(); - - player.isBombCarrier = false; - game["challenge"][team]["plantedBomb"] = true; - - destroyedObj BombTimerWait(label); - destroyedObj bombReset( label, "bomb_exploded" ); - - if ( level.gameEnded ) - { - return; - } - - destroyedObj.bombExploded = true; - game["challenge"][team]["destroyedBombSite"] = true; - explosionOrigin = destroyedObj.curorigin; - - level.ddBombModel[ destroyedObj.label ] Delete(); - - if ( isdefined( player ) ) - { - destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - player maps\mp\_medals::bomber(); - player maps\mp\gametypes\_persistence::statAddWithGameType( "DESTRUCTIONS", 1 ); - level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_BLOWUP_BY", player ); - // give points for being the bomb destroyer for extra game mode incentive - maps\mp\gametypes\_globallogic_score::givePlayerScore( "destroyer", player ); - player thread [[level.onXPEvent]]( "destroyer" ); - } - else - { - destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - } - - rot = randomfloat(360); - explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) ); - triggerFx( explosionEffect ); - - thread playSoundinSpace( "mpl_sd_exp_suitcase_bomb_main", explosionOrigin ); - - if ( isDefined( destroyedObj.exploderIndex ) ) - exploder( destroyedObj.exploderIndex ); - - bombZonesLeft = 0; - - for ( index = 0; index < level.bombZones.size; index++ ) - { - if ( !isDefined( level.bombZones[index].bombExploded ) || !level.bombZones[index].bombExploded ) - bombZonesLeft++; - } - - destroyedObj maps\mp\gametypes\_gameobjects::disableObject(); - - if ( bombZonesLeft == 0 ) - { - setGameEndTime( 0 ); - wait 3; - dem_endGame( game["attackers"], game["strings"]["target_destroyed"] ); - } - else - { - team = player.pers["team"]; - enemyTeam = getOtherTeam( team ); - - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_WE_SCORE", team, false, false, 5 ); - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_THEY_SCORE", enemyTeam, false, false, 5 ); - - //level thread play_one_left_underscore( team, enemyTeam ); - - if( getTimeLimitDvarValue() > 0 ) - { - level.usingExtraTime = true; - if ( !level.hardcoreMode ) - iPrintLn( &"MP_TIME_EXTENDED" ); - } - - // remove the influencer on this object - removeinfluencer( destroyedObj.spawnInfluencer ); - destroyedObj.spawnInfluencer = undefined; - - maps\mp\gametypes\_spawnlogic::clearSpawnPoints(); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["attackers"], "mp_dem_spawn_attacker" ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["defenders"], "mp_dem_spawn_defender" ); - if ( label == "_a" ) - { - maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["attackers"], "mp_dem_spawn_attacker_a" ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["defenders"], "mp_dem_spawn_defender_b" ); - } - else - { - maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["attackers"], "mp_dem_spawn_attacker_b" ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["defenders"], "mp_dem_spawn_defender_a" ); - } - maps\mp\gametypes\_spawning::updateAllSpawnPoints(); - } -} - -getTimeLimitDvarValue() -{ - timeLimit = maps\mp\gametypes\_globallogic_utils::getValueInRange( getDvarFloat( level.timeLimitDvar ), level.timeLimitMin, level.timeLimitMax ); - if ( level.usingExtraTime ) - return timeLimit + level.extraTime; - return timeLimit; -} - -waitLongDurationWithBombTimeUpdate( whichBomb, duration ) -{ - if ( duration == 0 ) - return; - assert( duration > 0 ); - - starttime = gettime(); - - endtime = gettime() + duration * 1000; - - while ( gettime() < endtime ) - { - maps\mp\gametypes\_hostmigration::waitTillHostMigrationStarts( (endtime - gettime()) / 1000 ); - - while ( isDefined( level.hostMigrationTimer ) ) - { - endTime += 250; - updateBombTimers(whichBomb, endTime); - wait 0.25; - } - } - - if( gettime() != endtime ) - println("SCRIPT WARNING: gettime() = " + gettime() + " NOT EQUAL TO endtime = " + endtime); - - while ( isDefined( level.hostMigrationTimer ) ) - { - endTime += 250; - updateBombTimers(whichBomb, endTime); - wait 0.250; - } - - return gettime() - starttime; -} - -updateBombTimers(whichBomb, detonateTime) -{ - if ( whichBomb == "_a" ) - { - level.bombAPlanted = true; - SetBombTimer( "A", int(detonateTime) ); - } - else - { - level.bombBPlanted = true; - SetBombTimer( "B", int(detonateTime) ); - } - - setMatchFlag( "bomb_timer" + whichBomb, int(detonateTime) ); -} - -BombTimerWait(whichBomb) -{ - waitLongDurationWithBombTimeUpdate( whichBomb, level.bombTimer ); -} - -bombDefused() -{ - self.tickingObject maps\mp\gametypes\_globallogic_utils::stopTickingSound(); - self maps\mp\gametypes\_gameobjects::allowUse( "none" ); - self maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - self.bombDefused = true; - self notify( "bomb_defused" ); - self bombReset( self.label, "bomb_defused" ); -} - -registerGrenadeLauncherDudDvar( dvarString, defaultValue, minValue, maxValue ) -{ - dvarString = ("scr_" + dvarString + "_grenadeLauncherDudTime"); - if ( getDvar( dvarString ) == "" ) - setDvar( dvarString, defaultValue ); - - if ( getDvarInt( dvarString ) > maxValue ) - setDvar( dvarString, maxValue ); - else if ( getDvarInt( dvarString ) < minValue ) - setDvar( dvarString, minValue ); - - level.grenadeLauncherDudTimeDvar = dvarString; - level.grenadeLauncherDudTimeMin = minValue; - level.grenadeLauncherDudTimeMax = maxValue; - level.grenadeLauncherDudTime = getDvarInt( level.grenadeLauncherDudTimeDvar ); -} - -registerThrownGrenadeDudDvar( dvarString, defaultValue, minValue, maxValue ) -{ - dvarString = ("scr_" + dvarString + "_thrownGrenadeDudTime"); - if ( getDvar( dvarString ) == "" ) - setDvar( dvarString, defaultValue ); - - if ( getDvarInt( dvarString ) > maxValue ) - setDvar( dvarString, maxValue ); - else if ( getDvarInt( dvarString ) < minValue ) - setDvar( dvarString, minValue ); - - level.thrownGrenadeDudTimeDvar = dvarString; - level.thrownGrenadeDudTimeMin = minValue; - level.thrownGrenadeDudTimeMax = maxValue; - level.thrownGrenadeDudTime = getDvarInt( level.thrownGrenadeDudTimeDvar ); -} - -play_one_left_underscore( team, enemyTeam ) -{ - wait(3); - - if( (!IsDefined(team)) || (!IsDefined(enemyTeam)) ) - { - return; - } - - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_ONE_LEFT_UNDERSCORE", team, false, false ); - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_ONE_LEFT_UNDERSCORE", enemyTeam, false, false ); -} - -updateEventsPerMinute() -{ - if ( !isDefined( self.eventsPerMinute ) ) - { - self.numBombEvents = 0; - self.eventsPerMinute = 0; - } - - self.numBombEvents++; - - minutesPassed = maps\mp\gametypes\_globallogic_utils::getTimePassed() / ( 60 * 1000 ); - - // players use the actual time played - if ( IsPlayer( self ) && IsDefined(self.timePlayed["total"]) ) - minutesPassed = self.timePlayed["total"] / 60; - - self.eventsPerMinute = self.numBombEvents / minutesPassed; - if ( self.eventsPerMinute > self.numBombEvents ) - self.eventsPerMinute = self.numBombEvents; -} - -isScoreBoosting( player, flag ) -{ - if ( player.eventsPerMinute > level.playerEventsLPM ) - return true; - - if ( flag.eventsPerMinute > level.bombEventsLPM ) - return true; - - if ( player.numBombEvents > level.playerEventsMax ) - return true; - - return false; -} \ No newline at end of file diff --git a/mods/patch_mp/maps/mp/gametypes/dom.gsc b/mods/patch_mp/maps/mp/gametypes/dom.gsc deleted file mode 100644 index 3004578..0000000 --- a/mods/patch_mp/maps/mp/gametypes/dom.gsc +++ /dev/null @@ -1,1426 +0,0 @@ -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -/* - Domination - Objective: Capture all the flags by touching them - Map ends: When one team captures all the flags, or time limit is reached - Respawning: No wait / Near teammates - - Level requirements - ------------------ - Spawnpoints: - classname mp_tdm_spawn - All players spawn from these. The spawnpoint chosen is dependent on the current locations of owned flags, teammates and - enemies at the time of spawn. Players generally spawn behind their teammates relative to the direction of enemies. - Optionally, give a spawnpoint a script_linkto to specify which flag it "belongs" to (see Flag Descriptors). - - Spectator Spawnpoints: - classname mp_global_intermission - Spectators spawn from these and intermission is viewed from these positions. - Atleast one is required, any more and they are randomly chosen between. - - Flags: - classname trigger_radius - targetname flag_primary or flag_secondary - Flags that need to be captured to win. Primary flags take time to capture; secondary flags are instant. - - Flag Descriptors: - classname script_origin - targetname flag_descriptor - Place one flag descriptor close to each flag. Use the script_linkname and script_linkto properties to say which flags - it can be considered "adjacent" to in the level. For instance, if players have a primary path from flag1 to flag2, and - from flag2 to flag3, flag2 would have a flag_descriptor with these properties: - script_linkname flag2 - script_linkto flag1 flag3 - - Set scr_domdebug to 1 to see flag connections and what spawnpoints are considered connected to each flag. - - Level script requirements - ------------------------- - Team Definitions: - game["allies"] = "marines"; - game["axis"] = "nva"; - This sets the nationalities of the teams. Allies can be american, british, or russian. Axis can be german. - - If using minefields or exploders: - maps\mp\_load::main(); - - Optional level script settings - ------------------------------ - Soldier Type and Variation: - game["american_soldiertype"] = "normandy"; - game["german_soldiertype"] = "normandy"; - This sets what character models are used for each nationality on a particular map. - - Valid settings: - american_soldiertype normandy - british_soldiertype normandy, africa - russian_soldiertype coats, padded - german_soldiertype normandy, africa, winterlight, winterdark -*/ - -/*QUAKED mp_dom_spawn (0.5 0.5 1.0) (-16 -16 0) (16 16 72) -Players spawn near their flags at one of these positions.*/ - -/*QUAKED mp_dom_spawn_flag_a (0.5 0.5 1.0) (-16 -16 0) (16 16 72) -Players spawn near their flags at one of these positions.*/ - -/*QUAKED mp_dom_spawn_flag_b (0.5 0.5 1.0) (-16 -16 0) (16 16 72) -Players spawn near their flags at one of these positions.*/ - -/*QUAKED mp_dom_spawn_flag_c (0.5 0.5 1.0) (-16 -16 0) (16 16 72) -Players spawn near their flags at one of these positions.*/ - -/*QUAKED mp_dom_spawn_axis_start (1.0 0.0 1.0) (-16 -16 0) (16 16 72) -Axis players spawn away from enemies and near their team at one of these positions at the start of a round.*/ - -/*QUAKED mp_dom_spawn_allies_start (0.0 1.0 1.0) (-16 -16 0) (16 16 72) -Allied players spawn away from enemies and near their team at one of these positions at the start of a round.*/ - -main() -{ - if(GetDvar( #"mapname") == "mp_background") - return; - - maps\mp\gametypes\_globallogic::init(); - maps\mp\gametypes\_callbacksetup::SetupCallbacks(); - maps\mp\gametypes\_globallogic::SetupCallbacks(); - - maps\mp\gametypes\_globallogic_utils::registerTimeLimitDvar( "dom", 30, 0, 1440 ); - maps\mp\gametypes\_globallogic_utils::registerScoreLimitDvar( "dom", 200, 0, 1000 ); - maps\mp\gametypes\_globallogic_utils::registerRoundLimitDvar( "dom", 1, 0, 10 ); - maps\mp\gametypes\_globallogic_utils::registerRoundWinLimitDvar( "dom", 0, 0, 10 ); - maps\mp\gametypes\_globallogic_utils::registerNumLivesDvar( "dom", 0, 0, 10 ); - - maps\mp\gametypes\_weapons::registerGrenadeLauncherDudDvar( level.gameType, 10, 0, 1440 ); - maps\mp\gametypes\_weapons::registerThrownGrenadeDudDvar( level.gameType, 0, 0, 1440 ); - maps\mp\gametypes\_weapons::registerKillstreakDelay( level.gameType, 0, 0, 1440 ); - - maps\mp\gametypes\_globallogic::registerFriendlyFireDelay( level.gameType, 15, 0, 1440 ); - - level.scoreRoundBased = true; - level.teamBased = true; - level.overrideTeamScore = true; - level.onStartGameType = ::onStartGameType; - level.onSpawnPlayer = ::onSpawnPlayer; - level.onSpawnPlayerUnified = ::onSpawnPlayerUnified; - level.onPlayerKilled = ::onPlayerKilled; - level.onPrecacheGameType = ::onPrecacheGameType; - level.onEndGame= ::onEndGame; - level.gamemodeSpawnDvars = ::dom_gamemodeSpawnDvars; - level.onRoundEndGame = ::onRoundEndGame; - - game["dialog"]["gametype"] = "dom_start"; - game["dialog"]["gametype_hardcore"] = "hcdom_start"; - game["dialog"]["offense_obj"] = "cap_start"; - game["dialog"]["defense_obj"] = "cap_start"; - level.lastDialogTime = 0; - - // Sets the scoreboard columns and determines with data is sent across the network - setscoreboardcolumns( "kills", "deaths" , "captures", "defends"); - - if ( !isOneRound() && isScoreRoundBased() ) - { - maps\mp\gametypes\_globallogic_score::resetTeamScores(); - } -} - - -onPrecacheGameType() -{ - precacheShader( "compass_waypoint_captureneutral" ); - precacheShader( "compass_waypoint_capture" ); - precacheShader( "compass_waypoint_defend" ); - precacheShader( "compass_waypoint_captureneutral_a" ); - precacheShader( "compass_waypoint_capture_a" ); - precacheShader( "compass_waypoint_defend_a" ); - precacheShader( "compass_waypoint_captureneutral_b" ); - precacheShader( "compass_waypoint_capture_b" ); - precacheShader( "compass_waypoint_defend_b" ); - precacheShader( "compass_waypoint_captureneutral_c" ); - precacheShader( "compass_waypoint_capture_c" ); - precacheShader( "compass_waypoint_defend_c" ); - precacheShader( "compass_waypoint_captureneutral_d" ); - precacheShader( "compass_waypoint_capture_d" ); - precacheShader( "compass_waypoint_defend_d" ); - precacheShader( "compass_waypoint_captureneutral_e" ); - precacheShader( "compass_waypoint_capture_e" ); - precacheShader( "compass_waypoint_defend_e" ); - - precacheShader( "waypoint_captureneutral" ); - precacheShader( "waypoint_capture" ); - precacheShader( "waypoint_defend" ); - precacheShader( "waypoint_captureneutral_a" ); - precacheShader( "waypoint_capture_a" ); - precacheShader( "waypoint_defend_a" ); - precacheShader( "waypoint_captureneutral_b" ); - precacheShader( "waypoint_capture_b" ); - precacheShader( "waypoint_defend_b" ); - precacheShader( "waypoint_captureneutral_c" ); - precacheShader( "waypoint_capture_c" ); - precacheShader( "waypoint_defend_c" ); - precacheShader( "waypoint_captureneutral_d" ); - precacheShader( "waypoint_capture_d" ); - precacheShader( "waypoint_defend_d" ); - precacheShader( "waypoint_captureneutral_e" ); - precacheShader( "waypoint_capture_e" ); - precacheShader( "waypoint_defend_e" ); - - /*flagBaseFX = []; - - flagBaseFX["marines"] = "misc/fx_ui_flagbase_gold_t5"; - flagBaseFX["nva"] = "misc/fx_ui_flagbase_red"; - flagBaseFX["tropas"] = "misc/fx_ui_flagbase_red"; - flagBaseFX["specops"] = "misc/fx_ui_flagbase_gold"; - flagBaseFX["rebels"] = "misc/fx_ui_flagbase_gold"; - flagBaseFX["russian"] = "misc/fx_ui_flagbase_orange"; - */ -} - - -onStartGameType() -{ - maps\mp\gametypes\_globallogic_ui::setObjectiveText( "allies", &"OBJECTIVES_DOM" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveText( "axis", &"OBJECTIVES_DOM" ); - - if ( level.splitscreen ) - { - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "allies", &"OBJECTIVES_DOM" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "axis", &"OBJECTIVES_DOM" ); - } - else - { - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "allies", &"OBJECTIVES_DOM_SCORE" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "axis", &"OBJECTIVES_DOM_SCORE" ); - } - maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( "allies", &"OBJECTIVES_DOM_HINT" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( "axis", &"OBJECTIVES_DOM_HINT" ); - - level.flagBaseFXid = []; - level.flagBaseFXid[ "allies" ] = loadfx( "misc/fx_ui_flagbase_gold_t5" ); - level.flagBaseFXid[ "axis" ] = loadfx( "misc/fx_ui_flagbase_gold_t5" ); - - setClientNameMode("auto_change"); - - level.spawnMins = ( 0, 0, 0 ); - level.spawnMaxs = ( 0, 0, 0 ); - maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_dom_spawn_allies_start" ); - maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_dom_spawn_axis_start" ); - - - level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs ); - setMapCenter( level.mapCenter ); - - spawnpoint = maps\mp\gametypes\_spawnlogic::getRandomIntermissionPoint(); - setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles ); - - level.spawn_all = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dom_spawn" ); - level.spawn_axis_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dom_spawn_axis_start" ); - level.spawn_allies_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dom_spawn_allies_start" ); - - flagSpawns = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dom_spawn_flag_a" ); - //assert( flagSpawns.size > 0 ); - - level.startPos["allies"] = level.spawn_allies_start[0].origin; - level.startPos["axis"] = level.spawn_axis_start[0].origin; - - allowed[0] = "dom"; - maps\mp\gametypes\_gameobjects::main(allowed); - - // now that the game objects have been deleted place the influencers - maps\mp\gametypes\_spawning::create_map_placed_influencers(); - - maps\mp\gametypes\_rank::registerScoreInfo( "kill", 50 ); - maps\mp\gametypes\_rank::registerScoreInfo( "headshot", 50 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assist_75", 40 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assist_50", 30 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assist_25", 20 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assist", 10 ); - - maps\mp\gametypes\_rank::registerScoreInfo( "capture", 150 ); - - maps\mp\gametypes\_rank::registerScoreInfo( "defend", 50 ); - maps\mp\gametypes\_rank::registerScoreInfo( "defend_assist", 10 ); - - maps\mp\gametypes\_rank::registerScoreInfo( "assault", 50 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assault_assist", 10 ); - - updateGametypeDvars(); - thread domFlags(); - thread updateDomScores(); - level change_dom_spawns(); -} - - -onSpawnPlayerUnified() -{ - maps\mp\gametypes\_spawning::onSpawnPlayer_Unified(); -} - -onSpawnPlayer() -{ - spawnpoint = undefined; - - if ( !level.useStartSpawns ) - { - flagsOwned = 0; - enemyFlagsOwned = 0; - myTeam = self.pers["team"]; - enemyTeam = getOtherTeam( myTeam ); - for ( i = 0; i < level.flags.size; i++ ) - { - team = level.flags[i] getFlagTeam(); - if ( team == myTeam ) - flagsOwned++; - else if ( team == enemyTeam ) - enemyFlagsOwned++; - } - - if ( flagsOwned == level.flags.size ) - { - // own all flags! pretend we don't own the last one we got, so enemies can spawn there - enemyBestSpawnFlag = level.bestSpawnFlag[ getOtherTeam( self.pers["team"] ) ]; - - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, getSpawnsBoundingFlag( enemyBestSpawnFlag ) ); - } - else if ( flagsOwned > 0 ) - { - // spawn near any flag we own that's nearish something we can capture - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, getBoundaryFlagSpawns( myTeam ) ); - } - else - { - // own no flags! - bestFlag = undefined; - if ( enemyFlagsOwned > 0 && enemyFlagsOwned < level.flags.size ) - { - // there should be an unowned one to use - bestFlag = getUnownedFlagNearestStart( myTeam ); - } - if ( !isdefined( bestFlag ) ) - { - // pretend we still own the last one we lost - bestFlag = level.bestSpawnFlag[ self.pers["team"] ]; - } - level.bestSpawnFlag[ self.pers["team"] ] = bestFlag; - - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, bestFlag.nearbyspawns ); - } - } - - if ( !isdefined( spawnpoint ) ) - { - if (self.pers["team"] == "axis") - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_axis_start); - else - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_allies_start); - } - - //spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all ); - - assert( isDefined(spawnpoint) ); - - self spawn(spawnpoint.origin, spawnpoint.angles, "dom"); -} - -onEndGame( winningTeam ) -{ - for ( i = 0; i < level.domFlags.size; i++ ) - { - level.domFlags[i] maps\mp\gametypes\_gameobjects::allowUse( "none" ); - } -} - -onRoundEndGame( roundWinner ) -{ - if ( game["roundswon"]["allies"] == game["roundswon"]["axis"] ) - winner = "tie"; - else if ( game["roundswon"]["axis"] > game["roundswon"]["allies"] ) - winner = "axis"; - else - winner = "allies"; - - return winner; -} - -updateGametypeDvars() -{ - level.flagCaptureTime = dvarFloatValue( "flagcapturetime", 10, 0, 30 ); - level.flagCaptureLPM = dvarFloatValue( "maxFlagCapturePerMinute", 3, 0, 10 ); - level.playerCaptureLPM = dvarFloatValue( "maxPlayerCapturePerMinute", 2, 0, 10 ); - level.playerCaptureMax = dvarFloatValue( "maxPlayerCapture", 1000, 0, 1000 ); - level.playerOffensiveMax = dvarFloatValue( "maxPlayerOffensive", 16, 0, 1000 ); - level.playerDefensiveMax = dvarFloatValue( "maxPlayerDefensive", 16, 0, 1000 ); -} - -domFlags() -{ - level.lastStatus["allies"] = 0; - level.lastStatus["axis"] = 0; - - game["flagmodels"] = []; - game["flagmodels"]["neutral"] = "mp_flag_neutral"; - - if ( game["allies"] == "marines" ) - game["flagmodels"]["allies"] = "mp_flag_allies_1"; - else if ( game["allies"] == "rebels" ) - game["flagmodels"]["allies"] = "mp_flag_allies_3"; - else - game["flagmodels"]["allies"] = "mp_flag_allies_2"; - - if ( game["axis"] == "russian" ) - game["flagmodels"]["axis"] = "mp_flag_axis_1"; - else if ( game["axis"] == "tropas" ) - game["flagmodels"]["axis"] = "mp_flag_axis_3"; - else - game["flagmodels"]["axis"] = "mp_flag_axis_2"; - - precacheModel( game["flagmodels"]["neutral"] ); - precacheModel( game["flagmodels"]["allies"] ); - precacheModel( game["flagmodels"]["axis"] ); - - - precacheString( &"MP_CAPTURING_FLAG" ); - precacheString( &"MP_LOSING_FLAG" ); - //precacheString( &"MP_LOSING_LAST_FLAG" ); - precacheString( &"MP_DOM_YOUR_FLAG_WAS_CAPTURED" ); - precacheString( &"MP_DOM_ENEMY_FLAG_CAPTURED" ); - precacheString( &"MP_DOM_NEUTRAL_FLAG_CAPTURED" ); - - precacheString( &"MP_ENEMY_FLAG_CAPTURED_BY" ); - precacheString( &"MP_NEUTRAL_FLAG_CAPTURED_BY" ); - precacheString( &"MP_FRIENDLY_FLAG_CAPTURED_BY" ); - precacheString( &"MP_DOM_FLAG_A_CAPTURED_BY" ); - precacheString( &"MP_DOM_FLAG_B_CAPTURED_BY" ); - precacheString( &"MP_DOM_FLAG_C_CAPTURED_BY" ); - precacheString( &"MP_DOM_FLAG_D_CAPTURED_BY" ); - precacheString( &"MP_DOM_FLAG_E_CAPTURED_BY" ); - - primaryFlags = getEntArray( "flag_primary", "targetname" ); - secondaryFlags = getEntArray( "flag_secondary", "targetname" ); - - if ( (primaryFlags.size + secondaryFlags.size) < 2 ) - { - printLn( "^1Not enough domination flags found in level!" ); - maps\mp\gametypes\_callbacksetup::AbortLevel(); - return; - } - - level.flags = []; - for ( index = 0; index < primaryFlags.size; index++ ) - level.flags[level.flags.size] = primaryFlags[index]; - - for ( index = 0; index < secondaryFlags.size; index++ ) - level.flags[level.flags.size] = secondaryFlags[index]; - - level.domFlags = []; - for ( index = 0; index < level.flags.size; index++ ) - { - trigger = level.flags[index]; - if ( isDefined( trigger.target ) ) - { - visuals[0] = getEnt( trigger.target, "targetname" ); - } - else - { - visuals[0] = spawn( "script_model", trigger.origin ); - visuals[0].angles = trigger.angles; - } - - visuals[0] setModel( game["flagmodels"]["neutral"] ); - - domFlag = maps\mp\gametypes\_gameobjects::createUseObject( "neutral", trigger, visuals, (0,0,100) ); - domFlag maps\mp\gametypes\_gameobjects::allowUse( "enemy" ); - domFlag maps\mp\gametypes\_gameobjects::setUseTime( level.flagCaptureTime ); - domFlag maps\mp\gametypes\_gameobjects::setUseText( &"MP_CAPTURING_FLAG" ); - label = domFlag maps\mp\gametypes\_gameobjects::getLabel(); - domFlag.label = label; - domFlag maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" + label ); - domFlag maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" + label ); - domFlag maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_captureneutral" + label ); - domFlag maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_captureneutral" + label ); - domFlag maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - domFlag.onUse = ::onUse; - domFlag.onBeginUse = ::onBeginUse; - domFlag.onUseUpdate = ::onUseUpdate; - domFlag.onEndUse = ::onEndUse; - - - traceStart = visuals[0].origin + (0,0,32); - traceEnd = visuals[0].origin + (0,0,-32); - trace = bulletTrace( traceStart, traceEnd, false, undefined ); - - upangles = vectorToAngles( trace["normal"] ); - domFlag.baseeffectforward = anglesToForward( upangles ); - domFlag.baseeffectright = anglesToRight( upangles ); - - domFlag.baseeffectpos = trace["position"]; - -// makeDvarServerInfo( "scr_obj" + label, "neutral" ); -// makeDvarServerInfo( "scr_obj" + label + "_flash", 0 ); -// setDvar( "scr_obj" + label, "neutral" ); -// setDvar( "scr_obj" + label + "_flash", 0 ); - - // legacy spawn code support - level.flags[index].useObj = domFlag; - level.flags[index].adjflags = []; - level.flags[index].nearbyspawns = []; - - domFlag.levelFlag = level.flags[index]; - - level.domFlags[level.domFlags.size] = domFlag; - } - - // level.bestSpawnFlag is used as a last resort when the enemy holds all flags. - level.bestSpawnFlag = []; - level.bestSpawnFlag[ "allies" ] = getUnownedFlagNearestStart( "allies", undefined ); - level.bestSpawnFlag[ "axis" ] = getUnownedFlagNearestStart( "axis", level.bestSpawnFlag[ "allies" ] ); - - for ( index = 0; index < level.domFlags.size; index++ ) - { - level.domFlags[index] createFlagSpawnInfluencers(); - } - - flagSetup(); - -// setDvar( level.scoreLimitDvar, level.domFlags.size ); - - /# - thread domDebug(); - #/ -} - -getUnownedFlagNearestStart( team, excludeFlag ) -{ - best = undefined; - bestdistsq = undefined; - for ( i = 0; i < level.flags.size; i++ ) - { - flag = level.flags[i]; - - if ( flag getFlagTeam() != "neutral" ) - continue; - - distsq = distanceSquared( flag.origin, level.startPos[team] ); - if ( (!isDefined( excludeFlag ) || flag != excludeFlag) && (!isdefined( best ) || distsq < bestdistsq) ) - { - bestdistsq = distsq; - best = flag; - } - } - return best; -} - -/# -domDebug() -{ - while(1) - { - if (GetDvar( #"scr_domdebug") != "1") { - wait 2; - continue; - } - - while(1) - { - if (GetDvar( #"scr_domdebug") != "1") - break; - // show flag connections and each flag's spawnpoints - for (i = 0; i < level.flags.size; i++) { - for (j = 0; j < level.flags[i].adjflags.size; j++) { - line(level.flags[i].origin, level.flags[i].adjflags[j].origin, (1,1,1)); - } - - for (j = 0; j < level.flags[i].nearbyspawns.size; j++) { - line(level.flags[i].origin, level.flags[i].nearbyspawns[j].origin, (.2,.2,.6)); - } - - if ( level.flags[i] == level.bestSpawnFlag["allies"] ) - print3d( level.flags[i].origin, "allies best spawn flag" ); - if ( level.flags[i] == level.bestSpawnFlag["axis"] ) - print3d( level.flags[i].origin, "axis best spawn flag" ); - } - wait .05; - } - } -} -#/ - -onBeginUse( player ) -{ - ownerTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); - setDvar( "scr_obj" + self maps\mp\gametypes\_gameobjects::getLabel() + "_flash", 1 ); - self.didStatusNotify = false; - if ( ownerTeam == "allies" ) - otherTeam = "axis"; - else - otherTeam = "allies"; - - if ( ownerTeam == "neutral" ) - { - - if( getTime() - level.lastDialogTime > 5000 ) - { - otherTeam = getOtherTeam( player.pers["team"] ); - statusDialog( "securing"+self.label, player.pers["team"] ); - //statusDialog( "losing"+self.label, otherTeam ); - level.lastDialogTime = getTime(); - } - self.objPoints[player.pers["team"]] thread maps\mp\gametypes\_objpoints::startFlashing(); - return; - } - - - - self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::startFlashing(); - self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::startFlashing(); -} - - -onUseUpdate( team, progress, change ) -{ - if ( progress > 0.05 && change && !self.didStatusNotify ) - { - ownerTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); - if ( ownerTeam == "neutral" ) - { - - if( getTime() - level.lastDialogTime > 10000 ) - { - otherTeam = getOtherTeam( team ); - statusDialog( "securing"+self.label, team ); - statusDialog( "losing"+self.label, otherTeam ); - level.lastDialogTime = getTime(); - } - } - else - { - if( getTime() - level.lastDialogTime > 10000 ) - { - statusDialog( "losing"+self.label, ownerTeam ); - statusDialog( "securing"+self.label, team ); - level.lastDialogTime = getTime(); - } - } - - self.didStatusNotify = true; - } -} - - -statusDialog( dialog, team ) -{ - time = getTime(); - if ( getTime() < level.lastStatus[team] + 6000 ) - return; - - thread delayedLeaderDialog( dialog, team ); - level.lastStatus[team] = getTime(); -} - - -onEndUse( team, player, success ) -{ - setDvar( "scr_obj" + self maps\mp\gametypes\_gameobjects::getLabel() + "_flash", 0 ); - - self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::stopFlashing(); - self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::stopFlashing(); -} - - -resetFlagBaseEffect() -{ - // once these get setup we never change them - if ( isdefined( self.baseeffect ) ) - return; - - team = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); - - if ( team != "axis" && team != "allies" ) - return; - - fxid = level.flagBaseFXid[ team ]; - - self.baseeffect = spawnFx( fxid, self.baseeffectpos, self.baseeffectforward, self.baseeffectright ); - triggerFx( self.baseeffect ); -} - -onUse( player ) -{ - team = player.pers["team"]; - oldTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); - label = self maps\mp\gametypes\_gameobjects::getLabel(); - - player logString( "flag captured: " + self.label ); - - self maps\mp\gametypes\_gameobjects::setOwnerTeam( team ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_capture" + label ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_capture" + label ); - self.visuals[0] setModel( game["flagmodels"][team] ); - setDvar( "scr_obj" + self maps\mp\gametypes\_gameobjects::getLabel(), team ); - - self resetFlagBaseEffect(); - - level.useStartSpawns = false; - - assert( team != "neutral" ); - - string = &""; - switch ( label ) - { - case "_a": - string = &"MP_DOM_FLAG_A_CAPTURED_BY"; - break; - case "_b": - string = &"MP_DOM_FLAG_B_CAPTURED_BY"; - break; - case "_c": - string = &"MP_DOM_FLAG_C_CAPTURED_BY"; - break; - case "_d": - string = &"MP_DOM_FLAG_D_CAPTURED_BY"; - break; - case "_e": - string = &"MP_DOM_FLAG_E_CAPTURED_BY"; - break; - default: - break; - } - assert ( string != &"" ); - - // Copy touch list so there aren't any threading issues - touchList = []; - touchKeys = GetArrayKeys( self.touchList[team] ); - for ( i = 0 ; i < touchKeys.size ; i++ ) - touchList[touchKeys[i]] = self.touchList[team][touchKeys[i]]; - thread give_capture_credit( touchList, string ); - - if ( oldTeam == "neutral" ) - { - otherTeam = getOtherTeam( team ); - thread printAndSoundOnEveryone( team, otherTeam, &"", &"", "mp_war_objective_taken", undefined, "" ); - - thread playSoundOnPlayers( "mus_dom_captured"+"_"+level.teamPostfix[team] ); - if ( getTeamFlagCount( team ) == level.flags.size ) - { - - statusDialog( "secure_all", team ); - statusDialog( "lost_all", otherTeam ); - } - else - { - statusDialog( "secured"+self.label, team ); - statusDialog( "lost"+self.label, otherTeam ); - } - } - else - { - thread printAndSoundOnEveryone( team, oldTeam, &"", &"", "mp_war_objective_taken", "mp_war_objective_lost", "" ); - -// thread delayedLeaderDialogBothTeams( "obj_lost", oldTeam, "obj_taken", team ); - -// thread playSoundOnPlayers( "mus_dom_captured"+"_"+level.teamPostfix[team] ); - if ( getTeamFlagCount( team ) == level.flags.size ) - { - - statusDialog( "secure_all", team ); - statusDialog( "lost_all", oldTeam ); - } - else - { - statusDialog( "secured"+self.label, team ); - - statusDialog( "lost"+self.label, oldTeam ); - } - - level.bestSpawnFlag[ oldTeam ] = self.levelFlag; - } - - if ( dominated_challenge_check() ) - { - maps\mp\_challenges::dominated( team ); - } - self update_spawn_influencers( team ); - level change_dom_spawns(); -} - -give_capture_credit( touchList, string ) -{ - wait .05; - maps\mp\gametypes\_globallogic_utils::WaitTillSlowProcessAllowed(); - - self updateCapsPerMinute(); - - players = getArrayKeys( touchList ); - for ( i = 0; i < players.size; i++ ) - { - player_from_touchlist = touchList[players[i]].player; - player_from_touchlist updateCapsPerMinute(); - if ( !isScoreBoosting( player_from_touchlist, self ) ) - { - maps\mp\gametypes\_globallogic_score::givePlayerScore( "capture", player_from_touchlist ); - if( isdefined(player_from_touchlist.pers["captures"]) ) - { - player_from_touchlist.pers["captures"]++; - player_from_touchlist.captures = player_from_touchlist.pers["captures"]; - } - player_from_touchlist maps\mp\_medals::positionSecure(); - player_from_touchlist maps\mp\gametypes\_persistence::statAddWithGameType( "CAPTURES", 1 ); - - if ( isdefined( player_from_touchlist.thisPlayerIsInLastStand ) && player_from_touchlist.thisPlayerIsInLastStand == true ) - player_from_touchlist maps\mp\_medals::heroic(); - } - - level thread maps\mp\_popups::DisplayTeamMessageToAll( string, player_from_touchlist ); - } -} - -delayedLeaderDialog( sound, team ) -{ - wait .1; - maps\mp\gametypes\_globallogic_utils::WaitTillSlowProcessAllowed(); - - maps\mp\gametypes\_globallogic_audio::leaderDialog( sound, team ); -} -delayedLeaderDialogBothTeams( sound1, team1, sound2, team2 ) -{ - wait .1; - maps\mp\gametypes\_globallogic_utils::WaitTillSlowProcessAllowed(); - - maps\mp\gametypes\_globallogic_audio::leaderDialogBothTeams( sound1, team1, sound2, team2 ); -} - - -updateDomScores() -{ - // disable score limit check to allow both axis and allies score to be processed - level.endGameOnScoreLimit = false; - //level.playingActionMusic = false; - - while ( !level.gameEnded ) - { - numOwnedFlags = 0; - - numFlags = getTeamFlagCount( "allies" ); - numOwnedFlags += numFlags; - if ( numFlags ) - [[level._setTeamScore]]( "allies", [[level._getTeamScore]]( "allies" ) + numFlags ); - - numFlags = getTeamFlagCount( "axis" ); - numOwnedFlags += numFlags; - if ( numFlags ) - [[level._setTeamScore]]( "axis", [[level._getTeamScore]]( "axis" ) + numFlags ); - - - level.endGameOnScoreLimit = true; - maps\mp\gametypes\_globallogic::checkScoreLimit(); - level.endGameOnScoreLimit = false; - onScoreCloseMusic (); - - // end the game if people aren't playing - timePassed = maps\mp\gametypes\_globallogic_utils::getTimePassed(); - if ( (((timePassed / 1000) > 120 && numOwnedFlags < 2) || ((timePassed / 1000) > 300 && numOwnedFlags < 3)) && ( level.onlinegame && !GetDvarInt( #"xblive_privatematch" ) ) ) - { - thread maps\mp\gametypes\_globallogic::endGame( "tie", game["strings"]["time_limit_reached"] ); - return; - } - - wait ( 5.0 ); - maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone(); - } -} -onScoreCloseMusic () -{ - axisScore = [[level._getTeamScore]]( "axis" ); - alliedScore = [[level._getTeamScore]]( "allies" ); - scoreLimit = level.scoreLimit; - scoreThreshold = scoreLimit * .1; - scoreDif = abs(axisScore - alliedScore); - scoreThresholdStart = abs(scoreLimit - scoreThreshold); - scoreLimitCheck = scoreLimit - 10; - - if( !IsDefined( level.playingActionMusic ) ) - level.playingActionMusic = false; - - if (alliedScore > axisScore) - { - currentScore = alliedScore; - } - else - { - currentScore = axisScore; - } - if( getdvarint( #"debug_music" ) > 0 ) - { - println ("Music System Domination - scoreDif " + scoreDif); - println ("Music System Domination - axisScore " + axisScore); - println ("Music System Domination - alliedScore " + alliedScore); - println ("Music System Domination - scoreLimit " + scoreLimit); - println ("Music System Domination - currentScore " + currentScore); - println ("Music System Domination - scoreThreshold " + scoreThreshold); - println ("Music System Domination - scoreDif " + scoreDif); - println ("Music System Domination - scoreThresholdStart " + scoreThresholdStart); - } - if ( scoreDif <= scoreThreshold && scoreThresholdStart <= currentScore && (level.playingActionMusic != true)) - { - //play some action music - thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "TIME_OUT", "both" ); - thread maps\mp\gametypes\_globallogic_audio::actionMusicSet(); - } -/* else if (scoreDif >= scoreThreshold && level.playingActionMusic && currentScore <= scoreLimitCheck ) - { - //TODO : Decide if we want to stop music on large score spread CDC - // if we are playing some action music and the score starts to be a blow out return to last state - thread maps\mp\gametypes\_globallogic_audio::return_music_state_team( "both" ); - level.playingActionMusic = false; - } -*/ - else - { - return; - } -} -onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) -{ - if ( self.touchTriggers.size && isPlayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) - { - triggerIds = getArrayKeys( self.touchTriggers ); - ownerTeam = self.touchTriggers[triggerIds[0]].useObj.ownerTeam; - team = self.pers["team"]; - - if ( team == ownerTeam ) - { - if ( !IsDefined( attacker.dom_offends ) ) - attacker.dom_offends = 0; - - attacker.dom_offends++; - - if ( level.playerOffensiveMax >= attacker.dom_offends ) - { - attacker thread [[level.onXPEvent]]( "assault" ); - if ( !isdefined( sWeapon ) || !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - attacker maps\mp\_medals::offense( sWeapon ); - attacker maps\mp\gametypes\_persistence::statAddWithGameType( "OFFENDS", 1 ); - } - - maps\mp\gametypes\_globallogic_score::givePlayerScore( "assault", attacker ); - } - } - else - { - if ( !IsDefined( attacker.dom_defends ) ) - attacker.dom_defends = 0; - - attacker.dom_defends++; - - if ( level.playerDefensiveMax >= attacker.dom_defends ) - { - attacker thread [[level.onXPEvent]]( "defend" ); - if ( !isdefined( sWeapon ) || !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - attacker maps\mp\_medals::defense( sWeapon ); - attacker maps\mp\gametypes\_persistence::statAddWithGameType( "DEFENDS", 1 ); - } - - if( isdefined(attacker.pers["defends"]) ) - { - attacker.pers["defends"]++; - attacker.defends = attacker.pers["defends"]; - } - - maps\mp\gametypes\_globallogic_score::givePlayerScore( "defend", attacker ); - } - } - } -} - - - -getTeamFlagCount( team ) -{ - score = 0; - for (i = 0; i < level.flags.size; i++) - { - if ( level.domFlags[i] maps\mp\gametypes\_gameobjects::getOwnerTeam() == team ) - score++; - } - return score; -} - -getFlagTeam() -{ - return self.useObj maps\mp\gametypes\_gameobjects::getOwnerTeam(); -} - -getBoundaryFlags() -{ - // get all flags which are adjacent to flags that aren't owned by the same team - bflags = []; - for (i = 0; i < level.flags.size; i++) - { - for (j = 0; j < level.flags[i].adjflags.size; j++) - { - if (level.flags[i].useObj maps\mp\gametypes\_gameobjects::getOwnerTeam() != level.flags[i].adjflags[j].useObj maps\mp\gametypes\_gameobjects::getOwnerTeam() ) - { - bflags[bflags.size] = level.flags[i]; - break; - } - } - } - - return bflags; -} - -getBoundaryFlagSpawns(team) -{ - spawns = []; - - bflags = getBoundaryFlags(); - for (i = 0; i < bflags.size; i++) - { - if (isdefined(team) && bflags[i] getFlagTeam() != team) - continue; - - for (j = 0; j < bflags[i].nearbyspawns.size; j++) - spawns[spawns.size] = bflags[i].nearbyspawns[j]; - } - - return spawns; -} - -getSpawnsBoundingFlag( avoidflag ) -{ - spawns = []; - - for (i = 0; i < level.flags.size; i++) - { - flag = level.flags[i]; - if ( flag == avoidflag ) - continue; - - isbounding = false; - for (j = 0; j < flag.adjflags.size; j++) - { - if ( flag.adjflags[j] == avoidflag ) - { - isbounding = true; - break; - } - } - - if ( !isbounding ) - continue; - - for (j = 0; j < flag.nearbyspawns.size; j++) - spawns[spawns.size] = flag.nearbyspawns[j]; - } - - return spawns; -} - -// gets an array of all spawnpoints which are near flags that are -// owned by the given team, or that are adjacent to flags owned by the given team. -getOwnedAndBoundingFlagSpawns(team) -{ - spawns = []; - - for (i = 0; i < level.flags.size; i++) - { - if ( level.flags[i] getFlagTeam() == team ) - { - // add spawns near this flag - for (s = 0; s < level.flags[i].nearbyspawns.size; s++) - spawns[spawns.size] = level.flags[i].nearbyspawns[s]; - } - else - { - for (j = 0; j < level.flags[i].adjflags.size; j++) - { - if ( level.flags[i].adjflags[j] getFlagTeam() == team ) - { - // add spawns near this flag - for (s = 0; s < level.flags[i].nearbyspawns.size; s++) - spawns[spawns.size] = level.flags[i].nearbyspawns[s]; - break; - } - } - } - } - - return spawns; -} - -// gets an array of all spawnpoints which are near flags that are -// owned by the given team -getOwnedFlagSpawns(team) -{ - spawns = []; - - for (i = 0; i < level.flags.size; i++) - { - if ( level.flags[i] getFlagTeam() == team ) - { - // add spawns near this flag - for (s = 0; s < level.flags[i].nearbyspawns.size; s++) - spawns[spawns.size] = level.flags[i].nearbyspawns[s]; - } - } - - return spawns; -} - -flagSetup() -{ - maperrors = []; - descriptorsByLinkname = []; - - // (find each flag_descriptor object) - descriptors = getentarray("flag_descriptor", "targetname"); - - flags = level.flags; - - for (i = 0; i < level.domFlags.size; i++) - { - closestdist = undefined; - closestdesc = undefined; - for (j = 0; j < descriptors.size; j++) - { - dist = distance(flags[i].origin, descriptors[j].origin); - if (!isdefined(closestdist) || dist < closestdist) { - closestdist = dist; - closestdesc = descriptors[j]; - } - } - - if (!isdefined(closestdesc)) { - maperrors[maperrors.size] = "there is no flag_descriptor in the map! see explanation in dom.gsc"; - break; - } - if (isdefined(closestdesc.flag)) { - maperrors[maperrors.size] = "flag_descriptor with script_linkname \"" + closestdesc.script_linkname + "\" is nearby more than one flag; is there a unique descriptor near each flag?"; - continue; - } - flags[i].descriptor = closestdesc; - closestdesc.flag = flags[i]; - descriptorsByLinkname[closestdesc.script_linkname] = closestdesc; - } - - if (maperrors.size == 0) - { - // find adjacent flags - for (i = 0; i < flags.size; i++) - { - if (isdefined(flags[i].descriptor.script_linkto)) - adjdescs = strtok(flags[i].descriptor.script_linkto, " "); - else - adjdescs = []; - for (j = 0; j < adjdescs.size; j++) - { - otherdesc = descriptorsByLinkname[adjdescs[j]]; - if (!isdefined(otherdesc) || otherdesc.targetname != "flag_descriptor") { - maperrors[maperrors.size] = "flag_descriptor with script_linkname \"" + flags[i].descriptor.script_linkname + "\" linked to \"" + adjdescs[j] + "\" which does not exist as a script_linkname of any other entity with a targetname of flag_descriptor (or, if it does, that flag_descriptor has not been assigned to a flag)"; - continue; - } - adjflag = otherdesc.flag; - if (adjflag == flags[i]) { - maperrors[maperrors.size] = "flag_descriptor with script_linkname \"" + flags[i].descriptor.script_linkname + "\" linked to itself"; - continue; - } - flags[i].adjflags[flags[i].adjflags.size] = adjflag; - } - } - } - - // assign each spawnpoint to nearest flag - spawnpoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dom_spawn" ); - for (i = 0; i < spawnpoints.size; i++) - { - if (isdefined(spawnpoints[i].script_linkto)) { - desc = descriptorsByLinkname[spawnpoints[i].script_linkto]; - if (!isdefined(desc) || desc.targetname != "flag_descriptor") { - maperrors[maperrors.size] = "Spawnpoint at " + spawnpoints[i].origin + "\" linked to \"" + spawnpoints[i].script_linkto + "\" which does not exist as a script_linkname of any entity with a targetname of flag_descriptor (or, if it does, that flag_descriptor has not been assigned to a flag)"; - continue; - } - nearestflag = desc.flag; - } - else { - nearestflag = undefined; - nearestdist = undefined; - for (j = 0; j < flags.size; j++) - { - dist = distancesquared(flags[j].origin, spawnpoints[i].origin); - if (!isdefined(nearestflag) || dist < nearestdist) - { - nearestflag = flags[j]; - nearestdist = dist; - } - } - } - nearestflag.nearbyspawns[nearestflag.nearbyspawns.size] = spawnpoints[i]; - } - - if (maperrors.size > 0) - { - println("^1------------ Map Errors ------------"); - for(i = 0; i < maperrors.size; i++) - println(maperrors[i]); - println("^1------------------------------------"); - - maps\mp\_utility::error("Map errors. See above"); - maps\mp\gametypes\_callbacksetup::AbortLevel(); - - return; - } -} - -createFlagSpawnInfluencers() -{ - ss = level.spawnsystem; - - for (flag_index = 0; flag_index < level.flags.size; flag_index++) - { - if ( level.domFlags[flag_index] == self ) - break; - } - - ABC = []; - ABC[0] = "A"; - ABC[1] = "B"; - ABC[2] = "C"; - - // domination: owned flag influencers - self.owned_flag_influencer = addsphereinfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - self.trigger.origin, - ss.dom_owned_flag_influencer_radius[flag_index], - ss.dom_owned_flag_influencer_score[flag_index], - 0, - "dom_owned_flag_" + ABC[flag_index] + ",r,s", - maps\mp\gametypes\_spawning::get_score_curve_index(ss.dom_owned_flag_influencer_score_curve) ); - - // domination: un-owned inner flag influencers - self.neutral_flag_influencer = addsphereinfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - self.trigger.origin, - ss.dom_unowned_flag_influencer_radius, - ss.dom_unowned_flag_influencer_score, - 0, - "dom_unowned_flag,r,s", - maps\mp\gametypes\_spawning::get_score_curve_index(ss.dom_owned_flag_influencer_score_curve) ); - - // domination: enemy flag influencers - self.enemy_flag_influencer = addsphereinfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - self.trigger.origin, - ss.dom_enemy_flag_influencer_radius[flag_index], - ss.dom_enemy_flag_influencer_score[flag_index], - 0, - "dom_enemy_flag_" + ABC[flag_index] + ",r,s", - maps\mp\gametypes\_spawning::get_score_curve_index(ss.dom_enemy_flag_influencer_score_curve) ); - - - // default it to neutral - self update_spawn_influencers("neutral"); -} - -update_spawn_influencers( team ) -{ - assert(isdefined(self.neutral_flag_influencer)); - assert(isdefined(self.owned_flag_influencer)); - assert(isdefined(self.enemy_flag_influencer)); - - if ( team == "neutral" ) - { - enableinfluencer(self.neutral_flag_influencer, true); - enableinfluencer(self.owned_flag_influencer, false); - enableinfluencer(self.enemy_flag_influencer, false); - } - else - { - enableinfluencer(self.neutral_flag_influencer, false); - enableinfluencer(self.owned_flag_influencer, true); - enableinfluencer(self.enemy_flag_influencer, true); - } - - if ( team == "allies" ) - { - setinfluencerteammask(self.owned_flag_influencer, level.spawnsystem.iSPAWN_TEAMMASK_ALLIES ); - setinfluencerteammask(self.enemy_flag_influencer, level.spawnsystem.iSPAWN_TEAMMASK_AXIS ); - } - else - { - setinfluencerteammask(self.owned_flag_influencer, level.spawnsystem.iSPAWN_TEAMMASK_AXIS ); - setinfluencerteammask(self.enemy_flag_influencer, level.spawnsystem.iSPAWN_TEAMMASK_ALLIES ); - } - -} - -dom_gamemodeSpawnDvars(reset_dvars) -{ - ss = level.spawnsystem; - - // domination: owned flag influencers - ss.dom_owned_flag_influencer_score = []; - ss.dom_owned_flag_influencer_radius = []; - - ss.dom_owned_flag_influencer_score[0] = set_dvar_float_if_unset("scr_spawn_dom_owned_flag_A_influencer_score", "10", reset_dvars); - ss.dom_owned_flag_influencer_radius[0] = set_dvar_float_if_unset("scr_spawn_dom_owned_flag_A_influencer_radius", "" + 15.0*get_player_height(), reset_dvars); - ss.dom_owned_flag_influencer_score[1] = set_dvar_float_if_unset("scr_spawn_dom_owned_flag_B_influencer_score", "10", reset_dvars); - ss.dom_owned_flag_influencer_radius[1] = set_dvar_float_if_unset("scr_spawn_dom_owned_flag_B_influencer_radius", "" + 15.0*get_player_height(), reset_dvars); - ss.dom_owned_flag_influencer_score[2] = set_dvar_float_if_unset("scr_spawn_dom_owned_flag_C_influencer_score", "10", reset_dvars); - ss.dom_owned_flag_influencer_radius[2] = set_dvar_float_if_unset("scr_spawn_dom_owned_flag_C_influencer_radius", "" + 15.0*get_player_height(), reset_dvars); - - ss.dom_owned_flag_influencer_score_curve = set_dvar_if_unset("scr_spawn_dom_owned_flag_influencer_score_curve", "constant", reset_dvars); - - // domination: enemy flag influencers - ss.dom_enemy_flag_influencer_score = []; - ss.dom_enemy_flag_influencer_radius = []; - - ss.dom_enemy_flag_influencer_score[0] = set_dvar_float_if_unset("scr_spawn_dom_enemy_flag_A_influencer_score", "-10", reset_dvars); - ss.dom_enemy_flag_influencer_radius[0] = set_dvar_float_if_unset("scr_spawn_dom_enemy_flag_A_influencer_radius", "" + 15.0*get_player_height(), reset_dvars); - ss.dom_enemy_flag_influencer_score[1] = set_dvar_float_if_unset("scr_spawn_dom_enemy_flag_B_influencer_score", "-10", reset_dvars); - ss.dom_enemy_flag_influencer_radius[1] = set_dvar_float_if_unset("scr_spawn_dom_enemy_flag_B_influencer_radius", "" + 15.0*get_player_height(), reset_dvars); - ss.dom_enemy_flag_influencer_score[2] = set_dvar_float_if_unset("scr_spawn_dom_enemy_flag_C_influencer_score", "-10", reset_dvars); - ss.dom_enemy_flag_influencer_radius[2] = set_dvar_float_if_unset("scr_spawn_dom_enemy_flag_C_influencer_radius", "" + 15.0*get_player_height(), reset_dvars); - - ss.dom_enemy_flag_influencer_score_curve = set_dvar_if_unset("scr_spawn_dom_enemy_flag_influencer_score_curve", "constant", reset_dvars); - - // domination: un-owned inner flag influencers - ss.dom_unowned_flag_influencer_score = set_dvar_float_if_unset("scr_spawn_dom_unowned_flag_influencer_score", "-500", reset_dvars); - ss.dom_unowned_flag_influencer_score_curve = set_dvar_if_unset("scr_spawn_dom_unowned_flag_influencer_score_curve", "constant", reset_dvars); - ss.dom_unowned_flag_influencer_radius = set_dvar_float_if_unset("scr_spawn_dom_unowned_flag_influencer_radius", "" + 15.0*get_player_height(), reset_dvars); -} - -//Changes what spawns are available to a team based on what Domination point they own -change_dom_spawns() -{ - - maps\mp\gametypes\_spawnlogic::clearSpawnPoints(); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_dom_spawn" ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_dom_spawn" ); - - //If one team owns all flags, we want to allow both teams to spawn anywhere - flag_number = level.flags.size; - if( dominated_check() ) - { - for ( i = 0 ; i < flag_number ; i++ ) - { - label = level.flags[i].useobj maps\mp\gametypes\_gameobjects::getLabel(); - flagSpawnName = "mp_dom_spawn_flag" + label; - maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", flagSpawnName ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", flagSpawnName ); - } - } - else - { - for ( i = 0; i < flag_number; i++ ) - { - //'getlabel' gives us the appropriate "_a" or "_b" - label = level.flags[i].useobj maps\mp\gametypes\_gameobjects::getLabel(); - flagSpawnName = "mp_dom_spawn_flag" + label; - flag_team = level.flags[i] getFlagTeam(); - - if ( flag_team != "allies" ) - { - maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", flagSpawnName ); - } - - if ( flag_team != "axis" ) - { - maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", flagSpawnName ); - } - } - } - - maps\mp\gametypes\_spawning::updateAllSpawnPoints(); - -} - -dominated_challenge_check() -{ - num_flags = level.flags.size; - allied_flags = 0; - axis_flags = 0; - - for ( i = 0 ; i < num_flags ; i++ ) - { - flag_team = level.flags[i] getFlagTeam(); - - if ( flag_team == "allies" ) - { - allied_flags++; - } - else if ( flag_team == "axis" ) - { - axis_flags++; - } - else - { - return false; - } - - if ( ( allied_flags > 0 ) && ( axis_flags > 0 ) ) - return false; - } - - return true; -} -//This function checks to see if one team owns all three flags -dominated_check() -{ - num_flags = level.flags.size; - allied_flags = 0; - axis_flags = 0; - - for ( i = 0 ; i < num_flags ; i++ ) - { - flag_team = level.flags[i] getFlagTeam(); - - if ( flag_team == "allies" ) - { - allied_flags++; - } - else if ( flag_team == "axis" ) - { - axis_flags++; - } - - if ( ( allied_flags > 0 ) && ( axis_flags > 0 ) ) - return false; - } - - return true; -} - -updateCapsPerMinute() -{ - if ( !isDefined( self.capsPerMinute ) ) - { - self.numCaps = 0; - self.capsPerMinute = 0; - } - - self.numCaps++; - - minutesPassed = maps\mp\gametypes\_globallogic_utils::getTimePassed() / ( 60 * 1000 ); - - // players use the actual time played - if ( IsPlayer( self ) && IsDefined(self.timePlayed["total"]) ) - minutesPassed = self.timePlayed["total"] / 60; - - self.capsPerMinute = self.numCaps / minutesPassed; - if ( self.capsPerMinute > self.numCaps ) - self.capsPerMinute = self.numCaps; -} - -isScoreBoosting( player, flag ) -{ - if ( player.capsPerMinute > level.playerCaptureLPM ) - return true; - - if ( flag.capsPerMinute > level.flagCaptureLPM ) - return true; - - if ( player.numCaps > level.playerCaptureMax ) - return true; - - return false; -} \ No newline at end of file diff --git a/mods/patch_mp/maps/mp/gametypes/koth.gsc b/mods/patch_mp/maps/mp/gametypes/koth.gsc deleted file mode 100644 index cd8851d..0000000 --- a/mods/patch_mp/maps/mp/gametypes/koth.gsc +++ /dev/null @@ -1,1106 +0,0 @@ -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; - -main() -{ - if ( GetDvar( #"mapname") == "mp_background" ) - return; - - maps\mp\gametypes\_globallogic::init(); - maps\mp\gametypes\_callbacksetup::SetupCallbacks(); - maps\mp\gametypes\_globallogic::SetupCallbacks(); - - maps\mp\gametypes\_globallogic_utils::registerTimeLimitDvar( level.gameType, 30, 0, 1440 ); - maps\mp\gametypes\_globallogic_utils::registerScoreLimitDvar( level.gameType, 300, 0, 1000 ); - maps\mp\gametypes\_globallogic_utils::registerNumLivesDvar( level.gameType, 0, 0, 10 ); - - maps\mp\gametypes\_weapons::registerGrenadeLauncherDudDvar( level.gameType, 10, 0, 1440 ); - maps\mp\gametypes\_weapons::registerThrownGrenadeDudDvar( level.gameType, 0, 0, 1440 ); - maps\mp\gametypes\_weapons::registerKillstreakDelay( level.gameType, 0, 0, 1440 ); - - maps\mp\gametypes\_globallogic::registerFriendlyFireDelay( level.gameType, 15, 0, 1440 ); - - level.teamBased = true; - level.doPrematch = true; - level.overrideTeamScore = true; - level.onStartGameType = ::onStartGameType; - level.onSpawnPlayer = ::onSpawnPlayer; - level.onSpawnPlayerUnified = ::onSpawnPlayerUnified; - level.playerSpawnedCB = ::koth_playerSpawnedCB; - level.onPlayerKilled = ::onPlayerKilled; - level.onEndGame= ::onEndGame; - level.gamemodeSpawnDvars = ::koth_gamemodeSpawnDvars; - - precacheShader( "compass_waypoint_captureneutral" ); - precacheShader( "compass_waypoint_capture" ); - precacheShader( "compass_waypoint_defend" ); - - precacheShader( "waypoint_targetneutral" ); - precacheShader( "waypoint_captureneutral" ); - precacheShader( "waypoint_capture" ); - precacheShader( "waypoint_defend" ); - - precacheString( &"MP_WAITING_FOR_HQ" ); - - if ( GetDvar( #"koth_autodestroytime") == "" ) - setdvar("koth_autodestroytime", "60"); - level.hqAutoDestroyTime = GetDvarInt( #"koth_autodestroytime"); - - if ( GetDvar( #"koth_spawntime") == "" ) - setdvar("koth_spawntime", "45"); - level.hqSpawnTime = GetDvarInt( #"koth_spawntime"); - - if ( GetDvar( #"koth_kothmode") == "" ) - setdvar("koth_kothmode", "1"); - level.kothMode = GetDvarInt( #"koth_kothmode"); - - if ( GetDvar( #"koth_captureTime") == "" ) - setdvar("koth_captureTime", "20"); - level.captureTime = GetDvarInt( #"koth_captureTime"); - - if ( GetDvar( #"koth_destroyTime") == "" ) - setdvar("koth_destroyTime", "10"); - level.destroyTime = GetDvarInt( #"koth_destroyTime"); - - if ( GetDvar( #"koth_delayPlayer") == "" ) - setdvar("koth_delayPlayer", 1); - level.delayPlayer = GetDvarInt( #"koth_delayPlayer"); - - if ( GetDvar( #"koth_spawnDelay") == "" ) - setdvar("koth_spawnDelay", 0); - level.spawnDelay = GetDvarInt( #"koth_spawnDelay"); - - level.iconoffset = (0,0,32); - - level.onRespawnDelay = ::getRespawnDelay; - - game["dialog"]["gametype"] = "hq_start"; - game["dialog"]["gametype_hardcore"] = "hchq_start"; - //game["dialog"]["neutral_obj"] = "cap_start"; - game["dialog"]["offense_obj"] = "cap_start"; - game["dialog"]["defense_obj"] = "cap_start"; - //game["dialog"]["hq_defend"] = "hq_defend"; - - level.lastDialogTime = 0; - - // Sets the scoreboard columns and determines with data is sent across the network - setscoreboardcolumns( "kills", "deaths", "captures", "defends" ); -} - - -updateObjectiveHintMessages( alliesObjective, axisObjective ) -{ - game["strings"]["objective_hint_allies"] = alliesObjective; - game["strings"]["objective_hint_axis" ] = axisObjective; - - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - if ( isDefined( player.pers["team"] ) && player.pers["team"] != "spectator" ) - { - hintText = maps\mp\gametypes\_globallogic_ui::getObjectiveHintText( player.pers["team"] ); - player DisplayGameModeMessage( hintText, "uin_alert_slideout" ); - } - } -} - - -getRespawnDelay() -{ - self.lowerMessageOverride = undefined; - - if ( !isDefined( level.radio.gameobject ) ) - return undefined; - - hqOwningTeam = level.radio.gameobject maps\mp\gametypes\_gameobjects::getOwnerTeam(); - if ( self.pers["team"] == hqOwningTeam ) - { - if ( !isDefined( level.hqDestroyTime ) ) - return undefined; - - timeRemaining = (level.hqDestroyTime - gettime()) / 1000; - - if (!level.spawnDelay ) - return undefined; - - if ( level.spawnDelay >= level.hqAutoDestroyTime ) - self.lowerMessageOverride = &"MP_WAITING_FOR_HQ"; - - if ( level.delayPlayer ) - { - return min( level.spawnDelay, timeRemaining ); - } - else - { - return int(timeRemaining); - } - } -} - - -onStartGameType() -{ - // TODO: HQ objective text - maps\mp\gametypes\_globallogic_ui::setObjectiveText( "allies", &"OBJECTIVES_KOTH" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveText( "axis", &"OBJECTIVES_KOTH" ); - - if ( level.splitscreen ) - { - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "allies", &"OBJECTIVES_KOTH" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "axis", &"OBJECTIVES_KOTH" ); - } - else - { - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "allies", &"OBJECTIVES_KOTH_SCORE" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "axis", &"OBJECTIVES_KOTH_SCORE" ); - } - - level.objectiveHintPrepareHQ = &"MP_CONTROL_HQ"; - level.objectiveHintCaptureHQ = &"MP_CAPTURE_HQ"; - level.objectiveHintDestroyHQ = &"MP_DESTROY_HQ"; - level.objectiveHintDefendHQ = &"MP_DEFEND_HQ"; - precacheString( level.objectiveHintPrepareHQ ); - precacheString( level.objectiveHintCaptureHQ ); - precacheString( level.objectiveHintDestroyHQ ); - precacheString( level.objectiveHintDefendHQ ); - - if ( level.kothmode ) - level.objectiveHintDestroyHQ = level.objectiveHintCaptureHQ; - - if ( level.hqSpawnTime ) - updateObjectiveHintMessages( level.objectiveHintPrepareHQ, level.objectiveHintPrepareHQ ); - else - updateObjectiveHintMessages( level.objectiveHintCaptureHQ, level.objectiveHintCaptureHQ ); - - setClientNameMode("auto_change"); - - // TODO: HQ spawnpoints - level.spawnMins = ( 0, 0, 0 ); - level.spawnMaxs = ( 0, 0, 0 ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_tdm_spawn" ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_tdm_spawn" ); - maps\mp\gametypes\_spawning::updateAllSpawnPoints(); - - level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs ); - setMapCenter( level.mapCenter ); - - spawnpoint = maps\mp\gametypes\_spawnlogic::getRandomIntermissionPoint(); - setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles ); - - level.spawn_all = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_tdm_spawn" ); - if ( !level.spawn_all.size ) - { - println("^1No mp_tdm_spawn spawnpoints in level!"); - maps\mp\gametypes\_callbacksetup::AbortLevel(); - return; - } - - // use the new spawn logic from the start - level.useStartSpawns = false; - - allowed[0] = "hq"; - - if ( level.script == "mp_kowloon" ) - { - allowed[1] = "koth"; - } - - maps\mp\gametypes\_gameobjects::main(allowed); - - // now that the game objects have been deleted place the influencers - maps\mp\gametypes\_spawning::create_map_placed_influencers(); - - thread SetupRadios(); - - maps\mp\gametypes\_rank::registerScoreInfo( "kill", 50 ); - maps\mp\gametypes\_rank::registerScoreInfo( "headshot", 50 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assist_75", 40 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assist_50", 30 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assist_25", 20 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assist", 10 ); - maps\mp\gametypes\_rank::registerScoreInfo( "defend", 50 ); - maps\mp\gametypes\_rank::registerScoreInfo( "assault", 50 ); - maps\mp\gametypes\_rank::registerScoreInfo( "capture", 150 ); - - thread HQMainLoop(); -} - -spawn_first_radio(delay) -{ - // pick next HQ object - level.radio= PickRandomRadioToSpawn(); - logString("radio spawned: ("+level.radio.trigOrigin[0]+","+level.radio.trigOrigin[1]+","+level.radio.trigOrigin[2]+")"); - - level.radio enable_radio_spawn_influencer(true); - - //thread enable_initial_spawn_influencers( 20 ); - - return; -} - -spawn_next_radio() -{ - // pick next HQ object - level.radio= PickRadioToSpawn(); - logString("radio spawned: ("+level.radio.trigOrigin[0]+","+level.radio.trigOrigin[1]+","+level.radio.trigOrigin[2]+")"); - - level.radio enable_radio_spawn_influencer(true); - - return; -} - -HQMainLoop() -{ - level endon("game_ended"); - - level.hqRevealTime = -100000; - - hqSpawningInStr = &"MP_HQ_AVAILABLE_IN"; - if ( level.kothmode ) - { - hqDestroyedInFriendlyStr = &"MP_HQ_DESPAWN_IN"; - hqDestroyedInEnemyStr = &"MP_HQ_DESPAWN_IN"; - } - else - { - hqDestroyedInFriendlyStr = &"MP_HQ_REINFORCEMENTS_IN"; - hqDestroyedInEnemyStr = &"MP_HQ_DESPAWN_IN"; - } - - precacheString( hqSpawningInStr ); - precacheString( hqDestroyedInFriendlyStr ); - precacheString( hqDestroyedInEnemyStr ); - precacheString( &"MP_CAPTURING_HQ" ); - precacheString( &"MP_DESTROYING_HQ" ); - - spawn_first_radio(); - - while ( level.inPrematchPeriod ) - wait ( 0.05 ); - - wait 5; - - timerDisplay = []; - timerDisplay["allies"] = createServerTimer( "objective", 1.4, "allies" ); - timerDisplay["allies"] setPoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); - timerDisplay["allies"].label = hqSpawningInStr; - timerDisplay["allies"].alpha = 0; - timerDisplay["allies"].archived = false; - timerDisplay["allies"].hideWhenInMenu = true; - - timerDisplay["axis" ] = createServerTimer( "objective", 1.4, "axis" ); - timerDisplay["axis" ] setPoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); - timerDisplay["axis" ].label = hqSpawningInStr; - timerDisplay["axis" ].alpha = 0; - timerDisplay["axis" ].archived = false; - timerDisplay["axis" ].hideWhenInMenu = true; - - thread hideTimerDisplayOnGameEnd( timerDisplay["allies"] ); - thread hideTimerDisplayOnGameEnd( timerDisplay["axis" ] ); - - locationObjID = maps\mp\gametypes\_gameobjects::getNextObjID(); - - objective_add( locationObjID, "invisible", (0,0,0) ); - - while( 1 ) - { - iPrintLn( &"MP_HQ_REVEALED" ); - playSoundOnPlayers( "mp_suitcase_pickup" ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "hq_located" ); -// maps\mp\gametypes\_globallogic_audio::leaderDialog( "move_to_new" ); - - level.radio.gameobject maps\mp\gametypes\_gameobjects::setModelVisibility( true ); - - level.hqRevealTime = gettime(); - - maps\mp\_rcbomb::detonateAllIfTouchingSphere(level.radio.origin, 75); - - if ( level.hqSpawnTime ) - { - nextObjPoint = maps\mp\gametypes\_objpoints::createTeamObjpoint( "objpoint_next_hq", level.radio.origin + level.iconoffset, "all", "waypoint_targetneutral" ); - nextObjPoint setWayPoint( true, "waypoint_targetneutral" ); - objective_position( locationObjID, level.radio.trigorigin ); - objective_icon( locationObjID, "waypoint_targetneutral" ); - objective_state( locationObjID, "active" ); - - updateObjectiveHintMessages( level.objectiveHintPrepareHQ, level.objectiveHintPrepareHQ ); - - timerDisplay["allies"].label = hqSpawningInStr; - timerDisplay["allies"] setTimer( level.hqSpawnTime ); - timerDisplay["allies"].alpha = 1; - timerDisplay["axis" ].label = hqSpawningInStr; - timerDisplay["axis" ] setTimer( level.hqSpawnTime ); - timerDisplay["axis" ].alpha = 1; - - wait level.hqSpawnTime; - - maps\mp\gametypes\_objpoints::deleteObjPoint( nextObjPoint ); - objective_state( locationObjID, "invisible" ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "hq_online" ); - } - - timerDisplay["allies"].alpha = 0; - timerDisplay["axis" ].alpha = 0; - - waittillframeend; - - maps\mp\gametypes\_globallogic_audio::leaderDialog( "obj_capture" ); - updateObjectiveHintMessages( level.objectiveHintCaptureHQ, level.objectiveHintCaptureHQ ); - playSoundOnPlayers( "mpl_hq_cap_us" ); - - level.radio.gameobject maps\mp\gametypes\_gameobjects::enableObject(); - - level.radio.gameobject maps\mp\gametypes\_gameobjects::allowUse( "any" ); - level.radio.gameobject maps\mp\gametypes\_gameobjects::setUseTime( level.captureTime ); - level.radio.gameobject maps\mp\gametypes\_gameobjects::setUseText( &"MP_CAPTURING_HQ" ); - - objective_icon( locationObjID, "compass_waypoint_captureneutral" ); - level.radio.gameobject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_captureneutral" ); - level.radio.gameobject maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_captureneutral" ); - level.radio.gameobject maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - level.radio.gameobject maps\mp\gametypes\_gameobjects::setModelVisibility( true ); - - level.radio.gameobject.onUse = ::onRadioCapture; - level.radio.gameobject.onBeginUse = ::onBeginUse; - level.radio.gameobject.onEndUse = ::onEndUse; - - level waittill( "hq_captured" ); - - ownerTeam = level.radio.gameobject maps\mp\gametypes\_gameobjects::getOwnerTeam(); - otherTeam = getOtherTeam( ownerTeam ); - - if ( level.hqAutoDestroyTime ) - { - thread DestroyHQAfterTime( level.hqAutoDestroyTime ); - timerDisplay[ownerTeam] setTimer( level.hqAutoDestroyTime ); - timerDisplay[otherTeam] setTimer( level.hqAutoDestroyTime ); - } - else - { - level.hqDestroyedByTimer = false; - } - - while( 1 ) - { - ownerTeam = level.radio.gameobject maps\mp\gametypes\_gameobjects::getOwnerTeam(); - otherTeam = getOtherTeam( ownerTeam ); - - if ( ownerTeam == "allies" ) - { - updateObjectiveHintMessages( level.objectiveHintDefendHQ, level.objectiveHintDestroyHQ ); - } - else - { - updateObjectiveHintMessages( level.objectiveHintDestroyHQ, level.objectiveHintDefendHQ ); - } - - level.radio.gameobject maps\mp\gametypes\_gameobjects::allowUse( "enemy" ); - level.radio.gameobject maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" ); - level.radio.gameobject maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" ); - level.radio.gameobject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_capture" ); - level.radio.gameobject maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_capture" ); - - if ( !level.kothMode ) - level.radio.gameobject maps\mp\gametypes\_gameobjects::setUseText( &"MP_DESTROYING_HQ" ); - - level.radio.gameobject.onUse = ::onRadioDestroy; - - if ( level.hqAutoDestroyTime ) - { - timerDisplay[ownerTeam].label = hqDestroyedInFriendlyStr; - if ( !level.splitscreen ) - timerDisplay[ownerTeam].alpha = 1; - timerDisplay[otherTeam].label = hqDestroyedInEnemyStr; - if ( !level.splitscreen ) - timerDisplay[otherTeam].alpha = 1; - } - - level thread dropAllAroundHQ(); - - level waittill( "hq_destroyed" ); - - level.radio enable_radio_spawn_influencer(false); - - if ( !level.kothmode || level.hqDestroyedByTimer ) - break; - - thread forceSpawnTeam( ownerTeam ); - - level.radio.gameobject maps\mp\gametypes\_gameobjects::setOwnerTeam( getOtherTeam( ownerTeam ) ); - } - - level.radio.gameobject maps\mp\gametypes\_gameobjects::disableObject(); - level.radio.gameobject maps\mp\gametypes\_gameobjects::allowUse( "none" ); - level.radio.gameobject maps\mp\gametypes\_gameobjects::setOwnerTeam( "neutral" ); - level.radio.gameobject maps\mp\gametypes\_gameobjects::setModelVisibility( false ); - - level notify("hq_reset"); - - timerDisplay["allies"].alpha = 0; - timerDisplay["axis" ].alpha = 0; - - spawn_next_radio(); - - wait .05; - - thread forceSpawnTeam( ownerTeam ); - - wait 3.0; - } -} - - -hideTimerDisplayOnGameEnd( timerDisplay ) -{ - level waittill("game_ended"); - timerDisplay.alpha = 0; -} - - -forceSpawnTeam( team ) -{ - players = level.players; - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - if ( !isdefined( player ) ) - continue; - - if ( player.pers["team"] == team ) - { - player notify( "force_spawn" ); - wait .1; - } - } -} - - -onBeginUse( player ) -{ - ownerTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam(); - - if ( ownerTeam == "neutral" ) - { - self.objPoints[player.pers["team"]] thread maps\mp\gametypes\_objpoints::startFlashing(); - player thread maps\mp\gametypes\_battlechatter_mp::gametypeSpecificBattleChatter( "hq_protect", player.pers["team"] ); - } - else - { - self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::startFlashing(); - self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::startFlashing(); - player thread maps\mp\gametypes\_battlechatter_mp::gametypeSpecificBattleChatter( "hq_attack", player.pers["team"] ); - } -} - - -onEndUse( team, player, success ) -{ - self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::stopFlashing(); - self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::stopFlashing(); - player notify( "event_ended" ); -} - - -onRadioCapture( player ) -{ - team = player.pers["team"]; - - player logString( "radio captured" ); - - string = &"MP_HQ_CAPTURED_BY"; - thread give_capture_credit( self.touchList[team], string ); - - oldTeam = maps\mp\gametypes\_gameobjects::getOwnerTeam(); - self maps\mp\gametypes\_gameobjects::setOwnerTeam( team ); - if ( !level.kothMode ) - self maps\mp\gametypes\_gameobjects::setUseTime( level.destroyTime ); - - otherTeam = "axis"; - if ( team == "axis" ) - otherTeam = "allies"; - - thread printOnTeamArg( &"MP_HQ_CAPTURED_BY", team, player ); - thread printOnTeam( &"MP_HQ_CAPTURED_BY_ENEMY", otherTeam ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "hq_secured", team ); - //maps\mp\gametypes\_globallogic_audio::leaderDialog( "hq_defend", team ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "hq_enemy_captured", otherTeam ); - thread playSoundOnPlayers( "mp_war_objective_taken", team ); - thread playSoundOnPlayers( "mp_war_objective_lost", otherTeam ); - //thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "CTF_WE_TAKE", Team, false, true, 5 ); - //thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "CTF_THEY_TAKE", otherTeam, false, true, 5 ); - - level thread awardHQPoints( team ); - - level notify( "hq_captured" ); - player notify( "event_ended" ); -} - -give_capture_credit( touchList, string ) -{ - wait .05; - maps\mp\gametypes\_globallogic_utils::WaitTillSlowProcessAllowed(); - - players = getArrayKeys( touchList ); - for ( i = 0; i < players.size; i++ ) - { - player_from_touchlist = touchList[players[i]].player; - maps\mp\gametypes\_globallogic_score::givePlayerScore( "capture", player_from_touchlist ); - - level thread maps\mp\_popups::DisplayTeamMessageToAll( string, player_from_touchlist ); - - if( isdefined(player_from_touchlist.pers["captures"]) ) - { - player_from_touchlist.pers["captures"]++; - player_from_touchlist.captures = player_from_touchlist.pers["captures"]; - } - - player_from_touchlist maps\mp\_medals::positionSecure(); - player_from_touchlist maps\mp\gametypes\_persistence::statAddWithGameType( "CAPTURES", 1 ); - - if ( isdefined( player_from_touchlist.thisPlayerIsInLastStand ) && player_from_touchlist.thisPlayerIsInLastStand == true ) - player_from_touchlist maps\mp\_medals::heroic(); - } -} - -dropAllAroundHQ( radio ) -{ - origin = level.radio.origin; - level waittill( "hq_reset" ); - dropAllToGround( origin, 100, 50 ); -} - -onRadioDestroy( player ) -{ - team = player.pers["team"]; - otherTeam = "axis"; - if ( team == "axis" ) - otherTeam = "allies"; - - player logString( "radio destroyed" ); - player thread [[level.onXPEvent]]( "capture" ); - maps\mp\gametypes\_globallogic_score::givePlayerScore( "capture", player ); - player maps\mp\gametypes\_persistence::statAddWithGameType( "DESTRUCTIONS", 1 ); - - if( isdefined(player.pers["destructions"]) ) - { - player.pers["destructions"]++; - player.destructions = player.pers["destructions"]; - } - - level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_HQ_DESTROYED_BY", player ); - - if ( level.kothmode ) - { - thread printOnTeamArg( &"MP_HQ_CAPTURED_BY", team, player ); - thread printOnTeam( &"MP_HQ_CAPTURED_BY_ENEMY", otherTeam ); - //thread playSoundOnPlayers( "mus_hq_captured"+"_"+level.teamPostfix[team] ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "hq_secured", team ); - //maps\mp\gametypes\_globallogic_audio::leaderDialog( "hq_defend", team ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "hq_enemy_destroyed", otherTeam ); - //thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "CTF_WE_TAKE", Team, false, true, 5 ); - //thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "CTF_THEY_TAKE", otherTeam, false, true, 5 ); - } - else - { - thread printOnTeamArg( &"MP_HQ_DESTROYED_BY", team, player ); - thread printOnTeam( &"MP_HQ_DESTROYED_BY_ENEMY", otherTeam ); - //thread playSoundOnPlayers( "mus_hq_captured"+"_"+level.teamPostfix[team] ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "hq_secured", team ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "hq_enemy_destroyed", otherTeam ); - //thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "CTF_WE_TAKE", Team, false, true, 5 ); - //thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "CTF_THEY_TAKE", otherTeam, false, true, 5 ); - } - - //thread playSoundOnPlayers( "mp_war_objective_taken", team ); - //thread playSoundOnPlayers( "mp_war_objective_lost", otherTeam ); - - level notify( "hq_destroyed" ); - - if ( level.kothmode ) - level thread awardHQPoints( team ); - - player notify( "event_ended" ); -} - - -DestroyHQAfterTime( time ) -{ - level endon( "game_ended" ); - level endon( "hq_reset" ); - - level.hqDestroyTime = gettime() + time * 1000; - level.hqDestroyedByTimer = false; - - wait time; - - maps\mp\gametypes\_globallogic_audio::leaderDialog( "hq_offline" ); - - level.hqDestroyedByTimer = true; - - level notify( "hq_destroyed" ); -} - - -awardHQPoints( team ) -{ - level endon( "game_ended" ); - level endon( "hq_destroyed" ); - - level notify("awardHQPointsRunning"); - level endon("awardHQPointsRunning"); - - seconds = 5; - - while ( !level.gameEnded ) - { - [[level._setTeamScore]]( team, [[level._getTeamScore]]( team ) + seconds ); - for ( index = 0; index < level.players.size; index++ ) - { - player = level.players[index]; - - if ( player.pers["team"] == team ) - { - player thread [[level.onXPEvent]]( "defend" ); - maps\mp\gametypes\_globallogic_score::givePlayerScore( "defend", player ); - } - } - - wait seconds; - } -} - - -onSpawnPlayerUnified() -{ - maps\mp\gametypes\_spawning::onSpawnPlayer_Unified(); -} - -onSpawnPlayer() -{ - spawnpoint = undefined; - - if (IsDefined(level.radio)) - { - if (IsDefined(level.radio.gameobject)) - { - hqOwningTeam = level.radio.gameobject maps\mp\gametypes\_gameobjects::getOwnerTeam(); - if ( self.pers["team"] == hqOwningTeam ) - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, level.radio.gameobject.nearSpawns ); - else if ( level.spawnDelay >= level.hqAutoDestroyTime && gettime() > level.hqRevealTime + 10000 ) - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all ); - else - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, level.radio.gameobject.outerSpawns ); - } - } - - if ( !isDefined( spawnpoint ) ) - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all ); - - assert( isDefined(spawnpoint) ); - - self spawn( spawnpoint.origin, spawnpoint.angles, "koth" ); -} - - -koth_playerSpawnedCB() -{ - self.lowerMessageOverride = undefined; -} - - -SetupRadios() -{ - maperrors = []; - - radios = getentarray( "hq_hardpoint", "targetname" ); - - if ( radios.size < 2 ) - { - maperrors[maperrors.size] = "There are not at least 2 entities with targetname \"radio\""; - } - - trigs = getentarray("radiotrigger", "targetname"); - for ( i = 0; i < radios.size; i++ ) - { - errored = false; - - radio = radios[i]; - radio.trig = undefined; - for ( j = 0; j < trigs.size; j++ ) - { - if ( radio istouching( trigs[j] ) ) - { - if ( isdefined( radio.trig ) ) - { - maperrors[maperrors.size] = "Radio at " + radio.origin + " is touching more than one \"radiotrigger\" trigger"; - errored = true; - break; - } - radio.trig = trigs[j]; - break; - } - } - - if ( !isdefined( radio.trig ) ) - { - if ( !errored ) - { - maperrors[maperrors.size] = "Radio at " + radio.origin + " is not inside any \"radiotrigger\" trigger"; - continue; - } - - // possible fallback (has been tested) - //radio.trig = spawn( "trigger_radius", radio.origin, 0, 128, 128 ); - //errored = false; - } - - assert( !errored ); - - radio.trigorigin = radio.trig.origin; - - visuals = []; - visuals[0] = radio; - - otherVisuals = getEntArray( radio.target, "targetname" ); - for ( j = 0; j < otherVisuals.size; j++ ) - { - visuals[visuals.size] = otherVisuals[j]; - } - - radio.gameObject = maps\mp\gametypes\_gameobjects::createUseObject( "neutral", radio.trig, visuals, (radio.origin - radio.trigorigin) + level.iconoffset ); - radio.gameObject maps\mp\gametypes\_gameobjects::disableObject(); - radio.gameObject maps\mp\gametypes\_gameobjects::setModelVisibility( false ); - radio.trig.useObj = radio.gameObject; - - radio setUpNearbySpawns(); - radio createRadioSpawnInfluencer(); - } - - if (maperrors.size > 0) - { - println("^1------------ Map Errors ------------"); - for(i = 0; i < maperrors.size; i++) - println(maperrors[i]); - println("^1------------------------------------"); - - maps\mp\_utility::error("Map errors. See above"); - maps\mp\gametypes\_callbacksetup::AbortLevel(); - - return; - } - - level.radios = radios; - - level.prevradio = undefined; - level.prevradio2 = undefined; - - return true; -} - -setUpNearbySpawns() -{ - spawns = level.spawn_all; - - for ( i = 0; i < spawns.size; i++ ) - { - spawns[i].distsq = distanceSquared( spawns[i].origin, self.origin ); - } - - // sort by distsq - for ( i = 1; i < spawns.size; i++ ) - { - thespawn = spawns[i]; - for ( j = i - 1; j >= 0 && thespawn.distsq < spawns[j].distsq; j-- ) - spawns[j + 1] = spawns[j]; - spawns[j + 1] = thespawn; - } - - first = []; - second = []; - third = []; - outer = []; - - thirdSize = spawns.size / 3; - for ( i = 0; i <= thirdSize; i++ ) - { - first[ first.size ] = spawns[i]; - } - for ( ; i < spawns.size; i++ ) - { - outer[ outer.size ] = spawns[i]; - if ( i <= (thirdSize*2) ) - second[ second.size ] = spawns[i]; - else - third[ third.size ] = spawns[i]; - } - - self.gameObject.nearSpawns = first; - self.gameObject.midSpawns = second; - self.gameObject.farSpawns = third; - self.gameObject.outerSpawns = outer; -} - -PickRandomRadioToSpawn() -{ - radio = level.radios[ randomint( level.radios.size) ]; - level.prevradio2 = level.prevradio; - level.prevradio = radio; - - return radio; -} - -PickRadioToSpawn() -{ - // find average of positions of each team - // (medians would be better, to get rid of outliers...) - // and find the radio which has the least difference in distance from those two averages - - avgpos["allies"] = (0,0,0); - avgpos["axis"] = (0,0,0); - num["allies"] = 0; - num["axis"] = 0; - - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - if ( isalive( player ) ) - { - avgpos[ player.pers["team"] ] += player.origin; - num[ player.pers["team"] ]++; - } - } - - if ( num["allies"] == 0 || num["axis"] == 0 ) - { - radio = level.radios[ randomint( level.radios.size) ]; - while ( isDefined( level.prevradio ) && radio == level.prevradio ) // so lazy - radio = level.radios[ randomint( level.radios.size) ]; - - level.prevradio2 = level.prevradio; - level.prevradio = radio; - - return radio; - } - - avgpos["allies"] = avgpos["allies"] / num["allies"]; - avgpos["axis" ] = avgpos["axis" ] / num["axis" ]; - - bestradio = undefined; - lowestcost = undefined; - for ( i = 0; i < level.radios.size; i++ ) - { - radio = level.radios[i]; - - // (purposefully using distance instead of distanceSquared) - cost = abs( distance( radio.origin, avgpos["allies"] ) - distance( radio.origin, avgpos["axis"] ) ); - - if ( isdefined( level.prevradio ) && radio == level.prevradio ) - { - continue; - } - if ( isdefined( level.prevradio2 ) && radio == level.prevradio2 ) - { - if ( level.radios.size > 2 ) - continue; - else - cost += 512; - } - - if ( !isdefined( lowestcost ) || cost < lowestcost ) - { - lowestcost = cost; - bestradio = radio; - } - } - assert( isdefined( bestradio ) ); - - level.prevradio2 = level.prevradio; - level.prevradio = bestradio; - - return bestradio; -} - - - -onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) -{ - if ( !isPlayer( attacker ) || (!self.touchTriggers.size && !attacker.touchTriggers.size) || attacker.pers["team"] == self.pers["team"] ) - return; - - medalGiven = false; - - if ( self.touchTriggers.size ) - { - triggerIds = getArrayKeys( self.touchTriggers ); - ownerTeam = self.touchTriggers[triggerIds[0]].useObj.ownerTeam; - - if ( ownerTeam != "neutral" ) - { - team = self.pers["team"]; - if ( team == ownerTeam ) - { - attacker thread [[level.onXPEvent]]( "assault" ); - if ( !medalGiven && !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - attacker maps\mp\_medals::offense( sWeapon ); - attacker maps\mp\gametypes\_persistence::statAddWithGameType( "OFFENDS", 1 ); - - medalGiven = true; - } - maps\mp\gametypes\_globallogic_score::givePlayerScore( "assault", attacker ); - } - else - { - attacker thread [[level.onXPEvent]]( "defend" ); - if ( !medalGiven && !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - if( isdefined(attacker.pers["defends"]) ) - { - attacker.pers["defends"]++; - attacker.defends = attacker.pers["defends"]; - } - - attacker maps\mp\_medals::defense( sWeapon ); - medalGiven = true; - attacker maps\mp\gametypes\_persistence::statAddWithGameType( "DEFENDS", 1 ); - } - maps\mp\gametypes\_globallogic_score::givePlayerScore( "defend", attacker ); - } - } - } - - if ( attacker.touchTriggers.size ) - { - triggerIds = getArrayKeys( attacker.touchTriggers ); - ownerTeam = attacker.touchTriggers[triggerIds[0]].useObj.ownerTeam; - - if ( ownerTeam != "neutral" ) - { - team = attacker.pers["team"]; - if ( team == ownerTeam ) - { - attacker thread [[level.onXPEvent]]( "defend" ); - if ( !medalGiven && !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - if( isdefined(attacker.pers["defends"]) ) - { - attacker.pers["defends"]++; - attacker.defends = attacker.pers["defends"]; - } - - attacker maps\mp\_medals::defense( sWeapon ); - medalGiven = true; - attacker maps\mp\gametypes\_persistence::statAddWithGameType( "DEFENDS", 1 ); - } - maps\mp\gametypes\_globallogic_score::givePlayerScore( "defend", attacker ); - } - else - { - attacker thread [[level.onXPEvent]]( "assault" ); - if ( !medalGiven && !maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - { - attacker maps\mp\_medals::offense( sWeapon ); - medalGiven = true; - attacker maps\mp\gametypes\_persistence::statAddWithGameType( "OFFENDS", 1 ); - } - maps\mp\gametypes\_globallogic_score::givePlayerScore( "assault", attacker ); - } - } - } -} - -onEndGame( winningTeam ) -{ - for ( i = 0; i < level.radios.size; i++ ) - { - level.radios[i].gameobject maps\mp\gametypes\_gameobjects::allowUse( "none" ); - } -} - -createRadioSpawnInfluencer() -{ - koth_objective_influencer_score= level.spawnsystem.koth_objective_influencer_score; - koth_objective_influencer_score_curve= level.spawnsystem.koth_objective_influencer_score_curve; - koth_objective_influencer_radius= level.spawnsystem.koth_objective_influencer_radius; - - // this affects both teams - self.spawn_influencer = addsphereinfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - self.gameobject.curOrigin, - koth_objective_influencer_radius, - koth_objective_influencer_score, - 0, - "koth_objective,r,s", - maps\mp\gametypes\_spawning::get_score_curve_index(koth_objective_influencer_score_curve) ); - - // turn it off for now - self enable_radio_spawn_influencer(false); -} - -enable_radio_spawn_influencer( enabled ) -{ - if ( isdefined(self.spawn_influencer) ) - { - enableinfluencer(self.spawn_influencer, enabled); - } -} - -enable_initial_spawn_influencers( duration ) -{ - // turn on the initial spawns - initial_spawn_influencer_ents = getentarray( self.target, "targetname" ); - - // either both, or none - if (initial_spawn_influencer_ents.size == 0) - return; - - assert( initial_spawn_influencer_ents.size == 2 ); - - ss = level.spawnsystem; - - mask1 = ss.iSPAWN_TEAMMASK_AXIS; - mask2 = ss.iSPAWN_TEAMMASK_ALLIES; - - if (randomint(2) == 0) - { // switch them - mask1 = ss.iSPAWN_TEAMMASK_ALLIES; - mask2 = ss.iSPAWN_TEAMMASK_AXIS; - } - - initial_spawn_influencers1 = addsphereinfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - initial_spawn_influencer_ents[0].origin, - ss.koth_initial_spawns_influencer_radius, - ss.koth_initial_spawns_influencer_score, - mask1, - "koth_objective,r,s", - maps\mp\gametypes\_spawning::get_score_curve_index(ss.koth_initial_spawns_influencer_score_curve) ); - - initial_spawn_influencers2 = addsphereinfluencer( level.spawnsystem.eINFLUENCER_TYPE_GAME_MODE, - initial_spawn_influencer_ents[0].origin, - ss.koth_initial_spawns_influencer_radius, - ss.koth_initial_spawns_influencer_score, - mask1, - "koth_objective,r,s", - maps\mp\gametypes\_spawning::get_score_curve_index(ss.koth_initial_spawns_influencer_score_curve) ); - - wait duration; - - removeinfluencer( initial_spawn_influencers1 ); - removeinfluencer( initial_spawn_influencers2 ); - -} - -koth_gamemodeSpawnDvars(reset_dvars) -{ - ss = level.spawnsystem; - - // koth (hq): influencer placed around the radio - ss.koth_objective_influencer_score = set_dvar_float_if_unset("scr_spawn_koth_objective_influencer_score", "-400", reset_dvars); - ss.koth_objective_influencer_score_curve = set_dvar_if_unset("scr_spawn_koth_objective_influencer_score_curve", "constant", reset_dvars); - ss.koth_objective_influencer_radius = set_dvar_float_if_unset("scr_spawn_koth_objective_influencer_radius", "" + 20.0*get_player_height(), reset_dvars); - - // koth (hq): initial spawns influencer to help group starting players at predefined locations - ss.koth_initial_spawns_influencer_score = set_dvar_float_if_unset("scr_spawn_koth_initial_spawns_influencer_score", "200", reset_dvars); - ss.koth_initial_spawns_influencer_score_curve = set_dvar_if_unset("scr_spawn_koth_initial_spawns_influencer_score_curve", "linear", reset_dvars); - ss.koth_initial_spawns_influencer_radius = set_dvar_float_if_unset("scr_spawn_koth_initial_spawns_influencer_radius", "" + 10.0*get_player_height(), reset_dvars); - -} diff --git a/mods/patch_mp/maps/mp/gametypes/sab.gsc b/mods/patch_mp/maps/mp/gametypes/sab.gsc deleted file mode 100644 index 5b5c3ce..0000000 --- a/mods/patch_mp/maps/mp/gametypes/sab.gsc +++ /dev/null @@ -1,958 +0,0 @@ -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -/* - Sabotage - - // ...etc... -*/ - -/*QUAKED mp_sab_spawn_axis (0.75 0.0 0.5) (-16 -16 0) (16 16 72) -Axis players spawn away from enemies and near their team at one of these positions.*/ - -/*QUAKED mp_sab_spawn_allies (0.0 0.75 0.5) (-16 -16 0) (16 16 72) -Allied players spawn away from enemies and near their team at one of these positions.*/ - -/*QUAKED mp_sab_spawn_axis_start (1.0 0.0 0.5) (-16 -16 0) (16 16 72) -Axis players spawn away from enemies and near their team at one of these positions at the start of a round.*/ - -/*QUAKED mp_sab_spawn_allies_start (0.0 1.0 0.5) (-16 -16 0) (16 16 72) -Allied players spawn away from enemies and near their team at one of these positions at the start of a round.*/ - -main() -{ - if ( GetDvar( #"mapname") == "mp_background" ) - return; - - maps\mp\gametypes\_globallogic::init(); - maps\mp\gametypes\_callbacksetup::SetupCallbacks(); - maps\mp\gametypes\_globallogic::SetupCallbacks(); - - level.teamBased = true; - level.overrideTeamScore = true; - - maps\mp\gametypes\_globallogic_utils::registerRoundSwitchDvar( level.gameType, 0, 0, 9 ); - maps\mp\gametypes\_globallogic_utils::registerTimeLimitDvar( level.gameType, 10, 0, 1440 ); - maps\mp\gametypes\_globallogic_utils::registerScoreLimitDvar( level.gameType, 0, 0, 500 ); - maps\mp\gametypes\_globallogic_utils::registerRoundLimitDvar( level.gameType, 1, 0, 10 ); - maps\mp\gametypes\_globallogic_utils::registerNumLivesDvar( level.gameType, 0, 0, 10 ); - maps\mp\gametypes\_globallogic_utils::registerRoundWinLimitDvar( level.gameType, 0, 0, 10 ); - - maps\mp\gametypes\_weapons::registerGrenadeLauncherDudDvar( level.gameType, 10, 0, 1440 ); - maps\mp\gametypes\_weapons::registerThrownGrenadeDudDvar( level.gameType, 0, 0, 1440 ); - maps\mp\gametypes\_weapons::registerKillstreakDelay( level.gameType, 0, 0, 1440 ); - - maps\mp\gametypes\_globallogic::registerFriendlyFireDelay( level.gameType, 15, 0, 1440 ); - - level.onStartGameType = ::onStartGameType; - level.onSpawnPlayer = ::onSpawnPlayer; - level.onSpawnPlayerUnified = ::onSpawnPlayerUnified; - level.gamemodeSpawnDvars = ::sab_gamemodeSpawnDvars; - level.onRoundEndGame = ::onRoundEndGame; - - if ( !game["tiebreaker"] ) - { - level.onPrecacheGameType = ::onPrecacheGameType; - level.onTimeLimit = ::onTimeLimit; - level.onDeadEvent = ::onDeadEvent; - level.onRoundSwitch = ::onRoundSwitch; - level.onPlayerKilled = ::onPlayerKilled; - - level.endGameOnScoreLimit = false; - - game["dialog"]["gametype"] = "sab_start"; - game["dialog"]["gametype_hardcore"] = "hcsab_start"; - game["dialog"]["offense_obj"] = "destroy_start"; - game["dialog"]["defense_obj"] = "destroy_start"; - game["dialog"]["sudden_death"] = "suddendeath"; - game["dialog"]["sudden_death_boost"] = "generic_boost"; - } - else - { - level.onEndGame = ::onEndGame; - - level.endGameOnScoreLimit = false; - - game["dialog"]["gametype"] = "sab_start"; - game["dialog"]["gametype_hardcore"] = "hcsab_start"; - game["dialog"]["offense_obj"] = "generic_boost"; - game["dialog"]["defense_obj"] = "generic_boost"; - game["dialog"]["sudden_death"] = "suddendeath"; - game["dialog"]["sudden_death_boost"] = "generic_boost"; - - maps\mp\gametypes\_globallogic_utils::registerNumLivesDvar( "tb", 1, 1, 1 ); - maps\mp\gametypes\_globallogic_utils::registerTimeLimitDvar( "tb", 0, 0, 0 ); - } - - badtrig = getent( "sab_bomb_defuse_allies", "targetname" ); - if ( isdefined( badtrig ) ) - badtrig delete(); - - badtrig = getent( "sab_bomb_defuse_axis", "targetname" ); - if ( isdefined( badtrig ) ) - badtrig delete(); - - level.lastDialogTime = 0; - - // Sets the scoreboard columns and determines with data is sent across the network - setscoreboardcolumns( "kills", "deaths", "plants", "defuses" ); -} - -onPrecacheGameType() -{ - game["bomb_dropped_sound"] = "mp_war_objective_lost"; - game["bomb_recovered_sound"] = "mp_war_objective_taken"; - - precacheShader("waypoint_bomb"); - precacheShader("waypoint_kill"); - precacheShader("waypoint_bomb_enemy"); - precacheShader("waypoint_defend"); - precacheShader("waypoint_defuse"); - precacheShader("waypoint_target"); - precacheShader("compass_waypoint_bomb"); - precacheShader("compass_waypoint_defend"); - precacheShader("compass_waypoint_defuse"); - precacheShader("compass_waypoint_target"); - precacheShader("hud_suitcase_bomb"); - - precacheString(&"MP_EXPLOSIVES_RECOVERED_BY"); - precacheString(&"MP_EXPLOSIVES_RECOVERED_BY"); - precacheString(&"MP_EXPLOSIVES_DROPPED_BY"); - precacheString(&"MP_EXPLOSIVES_PLANTED_BY"); - precacheString(&"MP_EXPLOSIVES_DEFUSED_BY"); - precacheString(&"MP_YOU_HAVE_RECOVERED_THE_BOMB"); - precacheString(&"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES"); - precacheString(&"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES"); - precacheString(&"MP_PLANTING_EXPLOSIVE"); - precacheString(&"MP_DEFUSING_EXPLOSIVE"); - precacheString(&"MP_TARGET_DESTROYED"); - precacheString(&"MP_NO_RESPAWN"); - precacheString(&"MP_TIE_BREAKER"); - precacheString(&"MP_NO_RESPAWN"); - precacheString(&"MP_SUDDEN_DEATH"); -} - - -onRoundSwitch() -{ - if ( !isdefined( game["switchedsides"] ) ) - game["switchedsides"] = false; - - if ( game["teamScores"]["allies"] == level.scorelimit - 1 && game["teamScores"]["axis"] == level.scorelimit - 1 ) - { - level.halftimeType = "overtime"; - level.halftimeSubCaption = &"MP_TIE_BREAKER"; - game["tiebreaker"] = true; - } - else - { - level.halftimeType = "halftime"; - game["switchedsides"] = !game["switchedsides"]; - } -} - - -onStartGameType() -{ - if ( !isdefined( game["switchedsides"] ) ) - game["switchedsides"] = false; - - setClientNameMode("auto_change"); - - game["strings"]["target_destroyed"] = &"MP_TARGET_DESTROYED"; - - if ( !game["tiebreaker"] ) - { - maps\mp\gametypes\_globallogic_ui::setObjectiveText( "allies", &"OBJECTIVES_SAB" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveText( "axis", &"OBJECTIVES_SAB" ); - - if ( level.splitscreen ) - { - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "allies", &"OBJECTIVES_SAB" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "axis", &"OBJECTIVES_SAB" ); - } - else - { - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "allies", &"OBJECTIVES_SAB_SCORE" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "axis", &"OBJECTIVES_SAB_SCORE" ); - } - maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( "allies", &"OBJECTIVES_SAB_HINT" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( "axis", &"OBJECTIVES_SAB_HINT" ); - } - else - { - maps\mp\gametypes\_globallogic_ui::setObjectiveText( "allies", &"OBJECTIVES_TDM" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveText( "axis", &"OBJECTIVES_TDM" ); - - if ( level.splitscreen ) - { - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "allies", &"OBJECTIVES_TDM" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "axis", &"OBJECTIVES_TDM" ); - } - else - { - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "allies", &"OBJECTIVES_TDM_SCORE" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "axis", &"OBJECTIVES_TDM_SCORE" ); - } - maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( "allies", &"OBJECTIVES_TDM_HINT" ); - maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( "axis", &"OBJECTIVES_TDM_HINT" ); - } - - level.spawnMins = ( 0, 0, 0 ); - level.spawnMaxs = ( 0, 0, 0 ); - maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sab_spawn_allies_start" ); - maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sab_spawn_axis_start" ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_sab_spawn_allies" ); - maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_sab_spawn_axis" ); - maps\mp\gametypes\_spawning::updateAllSpawnPoints(); - - level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs ); - setMapCenter( level.mapCenter ); - - spawnpoint = maps\mp\gametypes\_spawnlogic::getRandomIntermissionPoint(); - setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles ); - - level.spawn_axis = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_axis" ); - level.spawn_allies = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_allies" ); - level.spawn_axis_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_axis_start" ); - level.spawn_allies_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_allies_start" ); - - maps\mp\gametypes\_rank::registerScoreInfo( "plant", 500 ); - maps\mp\gametypes\_rank::registerScoreInfo( "defuse", 500 ); - - allowed[0] = "sab"; - maps\mp\gametypes\_gameobjects::main(allowed); - - // now that the game objects have been deleted place the influencers - maps\mp\gametypes\_spawning::create_map_placed_influencers(); - - thread updateGametypeDvars(); - - thread sabotage(); -} - - -onTimeLimit() -{ - if ( level.inOvertime ) - return; - - thread onOvertime(); -} - - -onOvertime() -{ - level endon ( "game_ended" ); - - level.timeLimitOverride = true; - level.inOvertime = true; - maps\mp\gametypes\_globallogic_audio::leaderDialog( "sudden_death" ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "sudden_death_boost" ); - for ( index = 0; index < level.players.size; index++ ) - { - level.players[index] notify("force_spawn"); - level.players[index] thread maps\mp\gametypes\_hud_message::oldNotifyMessage( &"MP_SUDDEN_DEATH", &"MP_NO_RESPAWN", undefined, (1, 0, 0), "mp_last_stand" ); - - level.players[index] setClientUIVisibilityFlag( "g_compassShowEnemies", 1 ); - } - - SetMatchTalkFlag( "DeadChatWithDead", 1 ); - SetMatchTalkFlag( "DeadChatWithTeam", 0 ); - SetMatchTalkFlag( "DeadHearTeamLiving", 0 ); - SetMatchTalkFlag( "DeadHearAllLiving", 0 ); - SetMatchTalkFlag( "EveryoneHearsEveryone", 0 ); - - waitTime = 0; - while ( waitTime < 90 ) - { - if ( !level.bombPlanted ) - { - waitTime += 1; - setGameEndTime( getTime() + ((90-waitTime)*1000) ); - } - wait ( 1.0 ); - } - - thread maps\mp\gametypes\_globallogic::endGame( "tie", game["strings"]["tie"] ); -} - - -onDeadEvent( team ) -{ - if ( level.bombExploded ) - return; - - if ( team == "all" ) - { - if ( level.bombPlanted ) - { - [[level._setTeamScore]]( level.bombPlantedBy, [[level._getTeamScore]]( level.bombPlantedBy ) + 1 ); - thread maps\mp\gametypes\_globallogic::endGame( level.bombPlantedBy, game["strings"][level.bombPlantedBy+"_mission_accomplished"] ); - } - else - { - thread maps\mp\gametypes\_globallogic::endGame( "tie", game["strings"]["tie"] ); - } - } - else if ( level.bombPlanted ) - { - if ( team == level.bombPlantedBy ) - { - level.plantingTeamDead = true; - return; - } - - [[level._setTeamScore]]( level.bombPlantedBy, [[level._getTeamScore]]( level.bombPlantedBy ) + 1 ); - thread maps\mp\gametypes\_globallogic::endGame( level.bombPlantedBy, game["strings"][level.otherTeam[level.bombPlantedBy]+"_eliminated"] ); - } - else - { - [[level._setTeamScore]]( level.otherTeam[team], [[level._getTeamScore]]( level.otherTeam[team] ) + 1 ); - thread maps\mp\gametypes\_globallogic::endGame( level.otherTeam[team], game["strings"][team+"_eliminated"] ); - } -} - -onSpawnPlayerUnified() -{ - self.isPlanting = false; - self.isDefusing = false; - self.isBombCarrier = false; - - if ( game["tiebreaker"] ) - { - self thread maps\mp\gametypes\_hud_message::oldNotifyMessage( &"MP_TIE_BREAKER", &"MP_NO_RESPAWN", undefined, (1, 0, 0), "mp_last_stand" ); - - hintMessage = maps\mp\gametypes\_globallogic_ui::getObjectiveHintText( self.pers["team"] ); - if ( isDefined( hintMessage ) ) - self DisplayGameModeMessage( hintMessage, "uin_alert_slideout" ); - - self setClientUIVisibilityFlag( "g_compassShowEnemies", 1 ); - - // this is being redundantly set everytime a player spawns - // need to move this to a once only for eveyone when tiebreaker round - // starts - SetMatchTalkFlag( "DeadChatWithDead", 1 ); - SetMatchTalkFlag( "DeadChatWithTeam", 0 ); - SetMatchTalkFlag( "DeadHearTeamLiving", 0 ); - SetMatchTalkFlag( "DeadHearAllLiving", 0 ); - SetMatchTalkFlag( "EveryoneHearsEveryone", 0 ); - } - - maps\mp\gametypes\_spawning::onSpawnPlayer_Unified(); -} - - -onSpawnPlayer() -{ - self.isPlanting = false; - self.isDefusing = false; - self.isBombCarrier = false; - - spawnteam = self.pers["team"]; - if ( game["switchedsides"] ) - spawnteam = getOtherTeam( spawnteam ); - - if ( level.useStartSpawns ) - { - if (spawnteam == "axis") - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_axis_start); - else - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_allies_start); - } - else - { - if (spawnteam == "axis") - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_axis); - else - spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_allies); - } - - if ( game["tiebreaker"] ) - { - self thread maps\mp\gametypes\_hud_message::oldNotifyMessage( &"MP_TIE_BREAKER", &"MP_NO_RESPAWN", undefined, (1, 0, 0), "mp_last_stand" ); - - hintMessage = maps\mp\gametypes\_globallogic_ui::getObjectiveHintText( self.pers["team"] ); - if ( isDefined( hintMessage ) ) - self DisplayGameModeMessage( hintMessage, "uin_alert_slideout" ); - - self setClientUIVisibilityFlag( "g_compassShowEnemies", 1 ); - // this is being redundantly set everytime a player spawns - // need to move this to a once only for eveyone when tiebreaker round - // starts - SetMatchTalkFlag( "DeadChatWithDead", 1 ); - SetMatchTalkFlag( "DeadChatWithTeam", 0 ); - SetMatchTalkFlag( "DeadHearTeamLiving", 0 ); - SetMatchTalkFlag( "DeadHearAllLiving", 0 ); - SetMatchTalkFlag( "EveryoneHearsEveryone", 0 ); - } - - assert( isDefined(spawnpoint) ); - - self spawn( spawnpoint.origin, spawnpoint.angles, "sab" ); -} - - -updateGametypeDvars() -{ - level.plantTime = dvarFloatValue( "planttime", 5, 0, 20 ); - level.defuseTime = dvarFloatValue( "defusetime", 5, 0, 20 ); - level.bombTimer = dvarFloatValue( "bombtimer", 45, 1, 300 ); - level.hotPotato = dvarIntValue( "hotpotato", 1, 0, 1 ); -} - - -sabotage() -{ - level.bombPlanted = false; - level.bombExploded = false; - - level._effect["bombexplosion"] = loadfx("maps/mp_maps/fx_mp_exp_bomb"); - - trigger = getEnt( "sab_bomb_pickup_trig", "targetname" ); - if ( !isDefined( trigger ) ) - { - error( "No sab_bomb_pickup_trig trigger found in map." ); - return; - } - - visuals[0] = getEnt( "sab_bomb", "targetname" ); - if ( !isDefined( visuals[0] ) ) - { - error( "No sab_bomb script_model found in map." ); - return; - } - - //precacheModel( "t5_weapon_briefcase_world" ); - //visuals[0] setModel( "t5_weapon_briefcase_world" ); - level.sabBomb = maps\mp\gametypes\_gameobjects::createCarryObject( "neutral", trigger, visuals, (0,0,32) ); - level.sabBomb maps\mp\gametypes\_gameobjects::allowCarry( "any" ); - level.sabBomb maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_bomb" ); - level.sabBomb maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_bomb" ); - level.sabBomb maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_bomb" ); - level.sabBomb maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" ); - level.sabBomb maps\mp\gametypes\_gameobjects::setCarryIcon( "hud_suitcase_bomb" ); - level.sabBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - level.sabBomb.objIDPingEnemy = true; - level.sabBomb.onPickup = ::onPickup; - level.sabBomb.onDrop = ::onDrop; - level.sabBomb.allowWeapons = true; - level.sabBomb.objPoints["allies"].archived = true; - level.sabBomb.objPoints["axis"].archived = true; - level.sabBomb.autoResetTime = 60.0; - - if ( !isDefined( getEnt( "sab_bomb_axis", "targetname" ) ) ) - { - error("No sab_bomb_axis trigger found in map."); - return; - } - if ( !isDefined( getEnt( "sab_bomb_allies", "targetname" ) ) ) - { - error("No sab_bomb_allies trigger found in map."); - return; - } - - if ( game["switchedsides"] ) - { - level.bombZones["allies"] = createBombZone( "allies", getEnt( "sab_bomb_axis", "targetname" ) ); - level.bombZones["axis"] = createBombZone( "axis", getEnt( "sab_bomb_allies", "targetname" ) ); - } - else - { - level.bombZones["allies"] = createBombZone( "allies", getEnt( "sab_bomb_allies", "targetname" ) ); - level.bombZones["axis"] = createBombZone( "axis", getEnt( "sab_bomb_axis", "targetname" ) ); - } -} - - -createBombZone( team, trigger ) -{ - visuals = getEntArray( trigger.target, "targetname" ); - - bombZone = maps\mp\gametypes\_gameobjects::createUseObject( team, trigger, visuals, (0,0,64) ); - bombZone resetBombsite(); - bombZone.onUse = ::onUse; - bombZone.onBeginUse = ::onBeginUse; - bombZone.onEndUse = ::onEndUse; - bombZone.onCantUse = ::onCantUse; - bombZone.useWeapon = "briefcase_bomb_mp"; - bombZone.visuals[0].killCamEnt = spawn( "script_model", bombZone.visuals[0].origin + (0,0,128) ); - - for ( i = 0; i < visuals.size; i++ ) - { - if ( isDefined( visuals[i].script_exploder ) ) - { - bombZone.exploderIndex = visuals[i].script_exploder; - break; - } - } - - return bombZone; -} - - -onBeginUse( player ) -{ - // planted the bomb - if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) - { - player.isPlanting = true; - player thread maps\mp\gametypes\_battlechatter_mp::gametypeSpecificBattleChatter( "sd_friendlyplant", player.pers["team"] ); - } - else - { - player.isDefusing = true; - player thread maps\mp\gametypes\_battlechatter_mp::gametypeSpecificBattleChatter( "sd_enemyplant", player.pers["team"] ); - } - - player playSound( "fly_bomb_raise_plr" ); -} - -onEndUse( team, player, result ) -{ - if ( !isAlive( player ) ) - return; - - player.isPlanting = false; - player.isDefusing = false; - player notify( "event_ended" ); -} - - -onPickup( player ) -{ - level notify ( "bomb_picked_up" ); - - self.autoResetTime = 60.0; - - level.useStartSpawns = false; - - team = player.pers["team"]; - - if ( team == "allies" ) - otherTeam = "axis"; - else - otherTeam = "allies"; - - //player iPrintLnBold( &"MP_YOU_HAVE_RECOVERED_THE_BOMB" ); - player playLocalSound( "mp_suitcase_pickup" ); - player logString( "bomb taken" ); - - excludeList[0] = player; - - if( getTime() - level.lastDialogTime > 10000 ) - { - maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_acquired", team ); - player maps\mp\gametypes\_globallogic_audio::leaderDialogOnPlayer( "obj_destroy", "bomb" ); - - - if ( !level.splitscreen ) - { - maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_taken", otherTeam ); - maps\mp\gametypes\_globallogic_audio::leaderDialog( "obj_defend", otherTeam ); - } - - level.lastDialogTime = getTime(); - } - player.isBombCarrier = true; - - player maps\mp\gametypes\_persistence::statAddWithGameType( "PICKUPS", 1 ); - - - // recovered the bomb before abandonment timer elapsed - if ( team == self maps\mp\gametypes\_gameobjects::getOwnerTeam() ) - { - printOnTeamArg( &"MP_EXPLOSIVES_RECOVERED_BY", team, player ); - playSoundOnPlayers( game["bomb_recovered_sound"], team ); - } - else - { - printOnTeamArg( &"MP_EXPLOSIVES_RECOVERED_BY", team, player ); -// printOnTeamArg( &"MP_EXPLOSIVES_RECOVERED_BY", otherTeam, &"MP_THE_ENEMY" ); - playSoundOnPlayers( game["bomb_recovered_sound"] ); - } - - self maps\mp\gametypes\_gameobjects::setOwnerTeam( team ); - self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_target" ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_kill" ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" ); - - level.bombZones[team] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - level.bombZones[otherTeam] maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - - level.bombZones[otherTeam].trigger SetInvisibleToAll(); - level.bombZones[otherTeam].trigger SetVisibleToPlayer( player ); -} - - -onDrop( player ) -{ - if ( level.bombPlanted ) - { - - } - else - { - if ( isDefined( player ) ) - printOnTeamArg( &"MP_EXPLOSIVES_DROPPED_BY", self maps\mp\gametypes\_gameobjects::getOwnerTeam(), player ); -// else -// printOnTeamArg( &"MP_EXPLOSIVES_DROPPED_BY", self maps\mp\gametypes\_gameobjects::getOwnerTeam(), &"MP_YOUR_TEAM" ); - - playSoundOnPlayers( game["bomb_dropped_sound"], self maps\mp\gametypes\_gameobjects::getOwnerTeam() ); - if ( isDefined( player ) ) - player logString( "bomb dropped" ); - else - logString( "bomb dropped" ); - - maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_lost", self maps\mp\gametypes\_gameobjects::getOwnerTeam() ); - - player notify( "event_ended" ); - - level.bombZones["axis"].trigger SetInvisibleToAll(); - level.bombZones["allies"].trigger SetInvisibleToAll(); - - thread abandonmentThink( 0.0 ); - } -} - - -abandonmentThink( delay ) -{ - level endon ( "bomb_picked_up" ); - - wait ( delay ); - - if ( isDefined( self.carrier ) ) - return; - - if ( self maps\mp\gametypes\_gameobjects::getOwnerTeam() == "allies" ) - otherTeam = "axis"; - else - otherTeam = "allies"; - -// printOnTeamArg( &"MP_EXPLOSIVES_DROPPED_BY", otherTeam, &"MP_THE_ENEMY" ); - playSoundOnPlayers( game["bomb_dropped_sound"], otherTeam ); - - self maps\mp\gametypes\_gameobjects::setOwnerTeam( "neutral" ); - self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_bomb" ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_bomb" ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_bomb" ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" ); - - level.bombZones["allies"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - level.bombZones["axis"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); -} - - -onUse( player ) -{ - team = player.pers["team"]; - otherTeam = level.otherTeam[team]; - // planted the bomb - if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) - { - player notify ( "bomb_planted" ); -// removed old playsound entry CDC 2/18/10 -// player playSound( "mpl_sab_bomb_plant" ); - player logString( "bomb planted" ); - - if( isdefined(player.pers["plants"]) ) - { - player.pers["plants"]++; - player.plants = player.pers["plants"]; - } - - player maps\mp\_medals::saboteur(); - - player maps\mp\gametypes\_persistence::statAddWithGameType( "PLANTS", 1 ); - - level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_PLANTED_BY", player ); - - //thread playSoundOnPlayers( "mus_sab_planted"+"_"+level.teamPostfix[team] ); - // Play Action music - //maps\mp\_music::setmusicstate( "ACTION" ); - - maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_planted", team ); - - maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_planted", otherTeam ); - - maps\mp\gametypes\_globallogic_score::givePlayerScore( "plant", player ); - //player thread [[level.onXPEvent]]( "plant" ); - - level thread bombPlanted( self, player.pers["team"] ); - - level.bombOwner = player; - - player.isBombCarrier = false; - -// self.keyObject maps\mp\gametypes\_gameobjects::disableObject(); - level.sabBomb.autoResetTime = undefined; - level.sabBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" ); - level.sabBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - level.sabBomb maps\mp\gametypes\_gameobjects::setDropped(); - self.useWeapon = "briefcase_bomb_defuse_mp"; - - self setUpForDefusing(); - } - else // defused the bomb - { - player notify ( "bomb_defused" ); - player logString( "bomb defused" ); - - if( isdefined(player.pers["defuses"]) ) - { - player.pers["defuses"]++; - player.defuses = player.pers["defuses"]; - } - - player maps\mp\_medals::hero(); - - player maps\mp\gametypes\_persistence::statAddWithGameType( "DEFUSES", 1 ); - - level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_DEFUSED_BY", player ); - //thread playSoundOnPlayers( "mus_sab_defused"+"_"+level.teamPostfix[team] ); - maps\mp\gametypes\_globallogic_audio::set_music_on_team( "UNDERSCORE", "both", true ); - - maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_defused" ); - - maps\mp\gametypes\_globallogic_score::givePlayerScore( "defuse", player ); - //player thread [[level.onXPEvent]]( "defuse" ); - - level thread bombDefused( self ); - - if ( level.inOverTime && isDefined( level.plantingTeamDead ) ) - { - thread maps\mp\gametypes\_globallogic::endGame( player.pers["team"], game["strings"][level.bombPlantedBy+"_eliminated"] ); - return; - } - - self resetBombsite(); - - level.sabBomb maps\mp\gametypes\_gameobjects::allowCarry( "any" ); - level.sabBomb maps\mp\gametypes\_gameobjects::setPickedUp( player ); - } -} - - -onCantUse( player ) -{ - player iPrintLnBold( &"MP_CANT_PLANT_WITHOUT_BOMB" ); -} - - -bombPlanted( destroyedObj, team ) -{ - game["challenge"][team]["plantedBomb"] = true; - maps\mp\gametypes\_globallogic_utils::pauseTimer(); - level.bombPlanted = true; - level.bombPlantedBy = team; - level.timeLimitOverride = true; - setMatchFlag( "bomb_timer", 1 ); - - // communicate timer information to menus - setGameEndTime( int( getTime() + (level.bombTimer * 1000) ) ); - - destroyedObj.visuals[0] thread maps\mp\gametypes\_globallogic_utils::playTickingSound( "mpl_sab_ui_suitcasebomb_timer" ); - - starttime = gettime(); - bombTimerWait(); - - setMatchFlag( "bomb_timer", 0 ); - destroyedObj.visuals[0] maps\mp\gametypes\_globallogic_utils::stopTickingSound(); - - if ( !level.bombPlanted ) - { - if ( level.hotPotato ) - { - timePassed = (gettime() - starttime) / 1000; - level.bombTimer -= timePassed; - } - return; - } - /* - for ( index = 0; index < level.players.size; index++ ) - { - player = level.players[index]; - if ( player.pers["team"] == team ) - player thread maps\mp\gametypes\_hud_message::oldNotifyMessage( "Your team scored!", undefined, undefined, (0, 1, 0) ); - else if ( player.pers["team"] == level.otherTeam[team] ) - player thread maps\mp\gametypes\_hud_message::oldNotifyMessage( "Enemy team scored!", undefined, undefined, (1, 0, 0) ); - } - */ - explosionOrigin = level.sabBomb.visuals[0].origin+(0,0,12); - level.bombExploded = true; - - - if ( isdefined( level.bombowner ) ) - { - destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, level.bombowner, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_BLOWUP_BY", level.bombowner ); - level.bombowner maps\mp\_medals::bomber(); - - level.bombowner maps\mp\gametypes\_persistence::statAddWithGameType( "DESTRUCTIONS", 1 ); - - } - else - destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - - rot = randomfloat(360); - explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) ); - triggerFx( explosionEffect ); - - thread playSoundinSpace( "mpl_sab_exp_suitcase_bomb_main", explosionOrigin ); - - if ( isDefined( destroyedObj.exploderIndex ) ) - exploder( destroyedObj.exploderIndex ); - - [[level._setTeamScore]]( team, [[level._getTeamScore]]( team ) + 1 ); - - setGameEndTime( 0 ); - - level.bombZones["allies"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - level.bombZones["axis"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - wait 3; - - // end the round without resetting the timer - thread maps\mp\gametypes\_globallogic::endGame( team, game["strings"]["target_destroyed"] ); -} - -bombTimerWait() -{ - level endon("bomb_defused"); - maps\mp\gametypes\_hostmigration::waitLongDurationWithGameEndTimeUpdate( level.bombTimer ); -} - - -resetBombsite() -{ - self maps\mp\gametypes\_gameobjects::allowUse( "enemy" ); - self maps\mp\gametypes\_gameobjects::setUseTime( level.plantTime ); - self maps\mp\gametypes\_gameobjects::setUseText( &"MP_PLANTING_EXPLOSIVE" ); - self maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); - self maps\mp\gametypes\_gameobjects::setKeyObject( level.sabBomb ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_target" ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_target" ); - self maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - self.trigger SetInvisibleToAll(); - self.useWeapon = "briefcase_bomb_mp"; -} - -setUpForDefusing() -{ - self maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); - self maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime ); - self maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" ); - self maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); - self maps\mp\gametypes\_gameobjects::setKeyObject( undefined ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defuse" ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defuse" ); - self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_defend" ); - self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_defend" ); - self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - self.trigger SetVisibleToAll(); -} - -bombDefused( object ) -{ - setMatchFlag( "bomb_timer", 0 ); - maps\mp\gametypes\_globallogic_utils::resumeTimer(); - level.bombPlanted = false; - if ( !level.inOvertime ) - level.timeLimitOverride = false; - - level notify("bomb_defused"); -} - -onPlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration) -{ - inBombZone = false; - inBombZoneTeam = "none"; - - if ( isdefined( sWeapon ) && maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) ) - return; - - if ( isdefined( level.bombZones["allies"] ) ) - { - dist = Distance2d(self.origin, level.bombZones["allies"].curorigin); - if ( dist < level.defaultOffenseRadius ) - { - inBombZoneTeam = "allies"; - inBombZone = true; - } - } - if ( isdefined( level.bombZones["axis"] ) ) - { - dist = Distance2d(self.origin, level.bombZones["axis"].curorigin); - if ( dist < level.defaultOffenseRadius ) - { - inBombZoneTeam = "axis"; - inBombZone = true; - } - } - - if ( inBombZone && isPlayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) - { - if ( inBombZoneTeam == self.pers["team"] ) - { - attacker maps\mp\_medals::offense( sWeapon ); - attacker maps\mp\gametypes\_persistence::statAddWithGameType( "OFFENDS", 1 ); - } - else - { - if( isdefined(attacker.pers["defends"]) ) - { - attacker.pers["defends"]++; - attacker.defends = attacker.pers["defends"]; - } - - attacker maps\mp\_medals::defense( sWeapon ); - attacker maps\mp\gametypes\_persistence::statAddWithGameType( "DEFENDS", 1 ); - } - } - - if ( isPlayer( attacker ) && attacker.pers["team"] != self.pers["team"] && isdefined( self.isBombCarrier ) && self.isBombCarrier == true ) - attacker maps\mp\_challenges::killedBombCarrier(); -} - -onEndGame( winningTeam ) -{ - if ( isdefined( winningTeam ) && (winningTeam == "allies" || winningTeam == "axis") ) - [[level._setTeamScore]]( winningTeam, [[level._getTeamScore]]( winningTeam ) + 1 ); -} - -onRoundEndGame( roundWinner ) -{ - if ( game["roundswon"]["allies"] == game["roundswon"]["axis"] ) - winner = "tie"; - else if ( game["roundswon"]["axis"] > game["roundswon"]["allies"] ) - winner = "axis"; - else - winner = "allies"; - - return winner; -} - -sab_gamemodeSpawnDvars(reset_dvars) -{ - ss = level.spawnsystem; - - // sabotage: influencer around friendly base - ss.sab_friendly_base_influencer_score = set_dvar_float_if_unset("scr_spawn_sab_friendly_base_influencer_score", "100", reset_dvars); - ss.sab_friendly_base_influencer_score_curve = set_dvar_if_unset("scr_spawn_sab_friendly_base_influencer_score_curve", "constant", reset_dvars); - ss.sab_friendly_base_influencer_radius = set_dvar_float_if_unset("scr_spawn_sab_friendly_base_influencer_radius", "" + 15.0*get_player_height(), reset_dvars); - - // sabotage: influencer around enemy base - ss.sab_enemy_base_influencer_score = set_dvar_float_if_unset("scr_spawn_sab_enemy_base_influencer_score", "-500", reset_dvars); - ss.sab_enemy_base_influencer_score_curve = set_dvar_if_unset("scr_spawn_sab_enemy_base_influencer_score_curve", "constant", reset_dvars); - ss.sab_enemy_base_influencer_radius = set_dvar_float_if_unset("scr_spawn_sab_enemy_base_influencer_radius", "" + 15.0*get_player_height(), reset_dvars); - - // sabotage: negative influencer around carrier - ss.sab_carrier_influencer_score = set_dvar_float_if_unset("scr_spawn_sab_carrier_influencer_score", "-75", reset_dvars); - ss.sab_carrier_influencer_score_curve = set_dvar_if_unset("scr_spawn_sab_carrier_influencer_score_curve", "linear", reset_dvars); - ss.sab_carrier_influencer_radius = set_dvar_float_if_unset("scr_spawn_sab_carrier_influencer_radius", "" + 8.0*get_player_height(), reset_dvars); - -} diff --git a/mods/patch_mp/maps/mp/mp_array.gsc b/mods/patch_mp/maps/mp/mp_array.gsc deleted file mode 100644 index 01c7894..0000000 --- a/mods/patch_mp/maps/mp/mp_array.gsc +++ /dev/null @@ -1,152 +0,0 @@ -#include maps\mp\_utility; -#include common_scripts\utility; - -main() -{ - //needs to be first for create fx - maps\mp\mp_array_fx::main(); - - precachemodel("collision_geo_10x10x512"); - precachemodel("collision_geo_64x64x64"); - precachemodel("collision_wall_64x64x10"); - precachemodel("collision_wall_512x512x10"); - precachemodel("collision_geo_64x64x256"); - precachemodel("p_glo_concrete_barrier_damaged"); - - maps\mp\_load::main(); - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - maps\mp\_compass::setupMiniMap("compass_map_mp_array_wager"); - } - else - { - maps\mp\_compass::setupMiniMap("compass_map_mp_array"); - } - - maps\mp\mp_array_amb::main(); - - // If the team nationalites change in this file, - // you must update the team nationality in the level's csc file as well! - maps\mp\gametypes\_teamset_winterspecops::level_init(); - - // Set up the default range of the compass - setdvar("compassmaxrange","2100"); - - // Set up some generic War Flag Names. - // Example from COD5: CALLSIGN_SEELOW_A is the name of the 1st flag in Selow whose string is "Cottage" - // The string must have MPUI_CALLSIGN_ and _A. Replace Mapname with the name of your map/bsp and in the - // actual string enter a keyword that names the location (Roundhouse, Missle Silo, Launchpad, Guard Tower, etc) - - game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; - game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; - game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; - game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; - game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; - - game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; - game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; - game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; - game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; - game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; - - - // collision keeping players from poking their heads into the tree near B3. - spawncollision("collision_geo_10x10x512","collider",(1397, 1095, 346), (0, 0, 0)); - spawncollision("collision_geo_10x10x512","collider",(1387, 1095, 346), (0, 0, 0)); - - // collision to prevent players from jumping behind electrical cabinets and getting stuck - spawncollision("collision_geo_64x64x64","collider",(-399, 1615, 614), (0, 15, 0)); - spawncollision("collision_wall_64x64x10","collider",(-445, 1593, 642), (0, 150, 0)); - - // collision that will keep player from jumping out of the map and landing in the rocks. - spawncollision("collision_wall_512x512x10","collider",(-1682, 1046, 496), (0, 30, 0)); - - // collision to stop players from getting stuck behind the steel girders. - spawncollision("collision_geo_64x64x64","collider",(-387, 307, 346), (0, 360, 0)); - - // spawn collision underneathe the corner of the center building. This is to keep players from calling the RCXD and pushing themselves outside of the map. - spawncollision("collision_geo_64x64x256","collider",(-852, 852, 496), (0,15,90)); - spawncollision("collision_geo_64x64x256","collider",(-788, 652, 492), (0,15,90)); - - // spawn a trigger to keep players from planting turrets into the large tanks. - addNoTurretTrigger( (-692, 3292, 500), 180, 800 ); - addNoTurretTrigger( (-1236, 3292, 500), 180, 800 ); - - // spawn a couple of K Rails to make sense of the collision spawned under the center building. - kRail1 = Spawn("script_model", (-824, 672, 480) ); - if ( IsDefined(kRail1) ) - { - kRail1.angles = (0, 105, 0); - kRail1 SetModel("p_glo_concrete_barrier_damaged"); - } - - kRail2 = Spawn("script_model", (-804, 600, 468) ); - if ( IsDefined(kRail2) ) - { - kRail2.angles = (15, 285, 0); - kRail2 SetModel("p_glo_concrete_barrier_damaged"); - } - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); - - radar_move_init(); -} - -radar_move_init() -{ - level endon ("game_ended"); - - dish_top = GetEnt( "dish_top", "targetname" ); - dish_base = GetEnt( "dish_base", "targetname" ); - dish_inside = GetEnt( "dish_inside", "targetname" ); - dish_gears = GetEntArray( "dish_gear", "targetname"); - - total_time_for_rotation_outside = 240; - total_time_for_rotation_inside = 60; - - dish_top LinkTo(dish_base); - dish_base thread rotate_dish_top(total_time_for_rotation_outside); - dish_inside thread rotate_dish_top(total_time_for_rotation_inside); - - if(dish_gears.size > 0) - { - array_thread(dish_gears, ::rotate_dish_gears, total_time_for_rotation_inside); - } -} - -rotate_dish_top( time ) -{ - self endon ("game_ended"); - - while(1) - { - self RotateYaw( 360, time ); - self waittill( "rotatedone" ); - } -} - -rotate_dish_gears( time ) -{ - self endon ("game_ended"); - - gear_ratio = 5.0 / 60.0; - inverse_gear_ratio = 1.0 / gear_ratio; - - while(1) - { - self RotateYaw( 360 * inverse_gear_ratio, time ); - self waittill( "rotatedone" ); - } -} - -addNoTurretTrigger( position, radius, height ) -{ - while( !IsDefined( level.noTurretPlacementTriggers ) ) - wait( 0.1 ); - - trigger = Spawn( "trigger_radius", position, 0, radius, height ); - - level.noTurretPlacementTriggers[level.noTurretPlacementTriggers.size] = trigger; -} - diff --git a/mods/patch_mp/maps/mp/mp_cairo.gsc b/mods/patch_mp/maps/mp/mp_cairo.gsc deleted file mode 100644 index 8b137c7..0000000 --- a/mods/patch_mp/maps/mp/mp_cairo.gsc +++ /dev/null @@ -1,40 +0,0 @@ -#include maps\mp\_utility; -main() -{ - //needs to be first for create fx - maps\mp\mp_cairo_fx::main(); - - precachemodel("collision_geo_10x10x512"); - precachemodel("collision_wall_128x128x10"); - - maps\mp\_load::main(); - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - maps\mp\_compass::setupMiniMap("compass_map_mp_cairo_wager"); - } - else - { - maps\mp\_compass::setupMiniMap("compass_map_mp_cairo"); - } - - maps\mp\mp_cairo_amb::main(); - - - // If the team nationalites change in this file, - // you must update the team nationality in the level's csc file as well! - maps\mp\gametypes\_teamset_cubans::level_init(); - - //setdvar("compassmaxrange","2100"); - - // spawn collision to prevent players from standing inside telephone poles - spawncollision("collision_geo_10x10x512","collider",(2264, -240, -61), (0, 0, 0)); - spawncollision("collision_geo_10x10x512","collider",(-1437, -529, -61), (0, 0, 0)); - - // spawn collision to prevent players from standing on top of a doorway behind the cigar building - spawncollision("collision_wall_128x128x10","collider",(716, 1181, 219), (0, 270, 0)); - - - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); -} diff --git a/mods/patch_mp/maps/mp/mp_cosmodrome.gsc b/mods/patch_mp/maps/mp/mp_cosmodrome.gsc deleted file mode 100644 index fb886f5..0000000 --- a/mods/patch_mp/maps/mp/mp_cosmodrome.gsc +++ /dev/null @@ -1,716 +0,0 @@ -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\_events; - -main() -{ - precachemodel("tag_origin"); - - level.onSpawnIntermission = ::cosmodrome_intermission; - - /# - level thread devgui_cosmodrome(); - execdevgui( "devgui_mp_cosmodrome" ); - #/ - - //needs to be first for create fx - maps\mp\mp_cosmodrome_fx::main(); - - precachemodel("collision_wall_128x128x10"); - precachemodel("collision_geo_128x128x128"); - precachemodel("collision_wall_512x512x10"); - precachemodel("collision_geo_mc_8x560x190"); - precachemodel("collision_geo_mc_4x52x190"); - precachemodel("collision_geo_mc_4x156x190"); - - maps\mp\_load::main(); - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - maps\mp\_compass::setupMiniMap("compass_map_mp_cosmodrome_wager"); - } - else - { - maps\mp\_compass::setupMiniMap("compass_map_mp_cosmodrome"); - } - maps\mp\mp_cosmodrome_amb::main(); - - // If the team nationalites change in this file, - // you must update the team nationality in the level's csc file as well! - maps\mp\gametypes\_teamset_urbanspecops::level_init(); - - level thread rocket_arm_think(); - level thread rocket_think(); - level thread radar_dish_think(); - level thread distant_rockets_think(); - - // spawn collision to prevent players from sneaking under a small area by the rocket - spawncollision("collision_wall_128x128x10","collider",(1558, -179, -362), (0, 225, 0)); - - // spawn collision to prevent players from sneaking inside 2 vents - spawncollision("collision_wall_128x128x10","collider",(-699, 1457, -60), (0, 270, 0)); - spawncollision("collision_wall_128x128x10","collider",(-699, 1329, -60), (0, 270, 0)); - - // spawn collision to prevent players from strafe jumping onto pipes. - spawncollision("collision_geo_128x128x128","collider",(1408.5, 863, -126.5), (0, 0, 0)); - spawncollision("collision_geo_128x128x128","collider",(1536.5, 863, -126.5), (0, 0, 0)); - - // spawn collision to prevent players from jumping up onto walls by the rocket - spawncollision("collision_wall_512x512x10","collider",(1224, -160, 240), (0, 0, 0)); - spawncollision("collision_wall_512x512x10","collider",(1348, -160, 240), (0, 0, 0)); - - // Spawn collision to keep players from walking onto a small ledge of collision on the green girders. - spawncollision("collision_wall_128x128x10","collider",(1911, 1018, -82), (0, 270, 0)); - - // not sure if this is the best way to determine that the map has been trimmed down - if ( isSmallMapVersion() ) - { - //spawning missile clip collision to catch grenades, rockets and crossbow bolts on the wager match boundary - spawncollision("collision_geo_mc_8x560x190","collider",(-393, 396.5, -72), (0, 270, 0)); - spawncollision("collision_geo_mc_4x52x190","collider",(-358, 676.5, -74), (0, 0, 0)); - spawncollision("collision_geo_mc_4x156x190","collider",(-328.5, 758, -74), (0, 270, 0)); - } - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); - - SetDvar( "scr_spawn_enemy_influencer_radius", 1700 ); - SetDvar( "scr_spawn_dead_friend_influencer_radius", 1300 ); - SetDvar( "scr_spawn_dead_friend_influencer_timeout_seconds", 10 ); - SetDvar( "scr_spawn_dead_friend_influencer_count", 7 ); -} - -isSmallMapVersion() -{ - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - return true; - } - - gametype = getDvar( #"g_gametype" ); - if ( gametype == "oic" ) - return true; - - if ( gametype == "hlnd" ) - return true; - - if ( gametype == "shrp" ) - return true; - - if ( gametype == "gun" ) - return true; - - return false; -} - -cosmodrome_intermission() -{ - maps\mp\gametypes\_globallogic_defaults::default_onSpawnIntermission(); - - rocket_base = GetEnt( "cosmodrome_rocket_base", "script_noteworthy" ); - - if ( !IsDefined( rocket_base ) ) - { - return; - } - - if ( IsDefined( level.rocket_camera ) && level.rocket_camera == true ) - { - lookat = Spawn( "script_model", rocket_base.origin + ( 0, 0, 1024 ) ); - lookat SetModel( "tag_origin" ); - lookat LinkTo( rocket_base ); - - self CameraSetPosition( self.origin ); - self CameraSetLookAt( lookat ); - self CameraActivate( true ); - } -} - -rocket_arm_think() -{ - start_pitch = set_dvar_int_if_unset( "scr_rocket_arm_pitch", "90" ); - rotate_time = set_dvar_int_if_unset( "scr_rocket_arm_rotate_secs", "30" ); - wait_time = set_dvar_int_if_unset( "scr_rocket_arm_wait_secs", "5" ); - - arm_base = GetEnt( "cosmodrome_rocket_arm_base", "targetname" ); - AssertEx( IsDefined( arm_base ), "Unable to find entity with targetname: 'cosmodrome_rocket_arm_base'" ); - - arm = GetEntArray( "cosmodrome_rocket_arm", "targetname" ); - AssertEx( IsDefined( arm ), "Unable to find entity with targetname: 'cosmodrome_rocket_arm'" ); - - for ( i = 0; i < arm.size; i++ ) - { - arm[i] LinkTo( arm_base ); - } - - if ( !IsDefined( arm_base.angles_target ) ) - { - arm_base.angles_target = arm_base.angles; - } - - arm_base.angles = ( start_pitch, arm_base.angles[1], arm_base.angles[2] ); - //IPrintLnBold ("rocket is MOVING?"); - - wait ( wait_time ); - - //IPrintLnBold ("start arm sound"); - arm_base playloopsound("evt_rocket_lp",.2); - arm_base PlaySound ("evt_rocket_start"); - arm_base RotateTo( arm_base.angles_target, rotate_time ); - - - wait(rotate_time); - arm_base stoploopsound(.3); - arm_base PlaySound ("evt_rocket_end"); - // IPrintLnBold (rotate_time); - // stop loppsound with fade - // play oneshot attach - // stop loop sound -} - -rocket_prelaunch( rocket_base ) -{ - //this will play vo for countdown and delay the launch by 10 seconds - snd_countdown (); - - // move the claw arms away from the rocket - claw_r = GetEntArray("claw_r", "targetname"); - claw_l = GetEntArray("claw_l", "targetname"); - claw_arm_r = GetEntArray("claw_arm_r", "targetname"); - claw_arm_l = GetEntArray("claw_arm_l", "targetname"); - mover_r = GetEnt("claw_r_mover", "targetname"); - mover_l = GetEnt("claw_l_mover", "targetname"); - move_here_r = GetEnt("claw_r_move_here", "targetname"); - move_here_l = GetEnt("claw_l_move_here", "targetname"); - - for(i = 0 ; i < claw_r.size; i++) - { - claw_r[i] LinkTo(mover_r); - } - for(i = 0 ; i < claw_l.size; i++) - { - claw_l[i] LinkTo(mover_l); - } - mover_r MoveTo(move_here_r.origin, 3.0); - mover_l MoveTo(move_here_l.origin, 3.0); - - // play sound on the arms - thread snd_rocket_gantry ( mover_r, mover_l); - - wait(4.0); - for(i = 0; i < claw_r.size; i++) - { - claw_r[i] Unlink(); - claw_r[i] LinkTo(move_here_r); - } - for(i = 0; i < claw_l.size; i++) - { - claw_l[i] Unlink(); - claw_l[i] LinkTo(move_here_l); - } - - for(i = 0; i < claw_arm_r.size; i++) - { - claw_arm_r[i] LinkTo(move_here_r); - } - for(i = 0; i < claw_arm_l.size; i++) - { - claw_arm_l[i] LinkTo(move_here_l); - } - move_here_r RotateYaw(75, 3.0); - move_here_l RotateYaw(-75, 3.0); - - // wait to launch - rocket_base playsound ("evt_cosmo_launch"); - playsoundatposition("evt_cosmo_air_distf",(0,0,0)); - playsoundatposition("evt_cosmo_air_distr",(0,0,0)); - - wait(5); -} - -Rocket_Think() -{ - level.const_fx_exploder_rocket_coolant = 2; - - level.rocket_camera = false; - flag_init( "rocket_launch_grenade_detonate" ); - - rocket = GetEntArray( "cosmodrome_rocket", "targetname" ); - AssertEx( IsDefined( rocket ), "Unable to find entity with targetname: 'cosmodrome_rocket'" ); - array_thread( rocket, ::rocket_sticky_grenade_think ); - - rocket_base = GetEnt( "cosmodrome_rocket_base", "script_noteworthy" ); - AssertEx( IsDefined( rocket_base ), "Unable to find entity with script_noteworthy: 'cosmodrome_rocket_base'" ); - level.rocket_base = rocket_base; - - rocket_damage_triggers = GetEntArray( "cosmodrome_rocket_damage_trigger", "targetname" ); - rocket_collision = GetEntArray( "rocket_collision", "targetname" ); - - killCamEnt = spawn( "script_model", rocket_base.origin ); - rocket_base.killCamEnt = killCamEnt; - killCamEnt.startTime = gettime(); - killCamEnt linkTo( rocket_base, "tag_origin", (50,0,-1000), ( 0,0,0 ) ); - - - rocket_timer_init(); - - wait( 3 ); - exploder( level.const_fx_exploder_rocket_coolant ); - - event = level waittill_any_return( "rocket_launch", "rocket_launch_skip_prelaunch" ); - - if ( event == "rocket_launch" ) - { - rocket_prelaunch( rocket_base ); - } - - level.rocket_camera = true; - - // pre-launch fx - earthquake_origin = rocket_base GetTagOrigin( "tag_engine" ); - earthquake( .25, 4, earthquake_origin, 4096 ); - - //play 3d launch aounds on rocket_base, and 2 st 2d sounds - - - wait( 3.5 ); - flag_set( "rocket_launch_grenade_detonate" ); - - // launch fx - earthquake( .35, 15, earthquake_origin, 4096 ); - array_thread( rocket_damage_triggers, ::rocket_damage_think ); - array_thread( rocket_damage_triggers, ::destroy_greandes_in_trigger ); - rocket_base SetClientFlag( level.const_flag_rocket_fx ); - exploder_stop( level.const_fx_exploder_rocket_coolant ); - - // move pieces - array_thread( rocket, ::rocket_move ); - - // stop damage - wait( 6 ); - level notify( "rocket_damage_stop" ); - - wait( 2 ); - level.rocket_camera = false; - - for ( i = 0; i < rocket_damage_triggers.size; i++ ) - { - rocket_damage_triggers[i] delete(); - } - - for ( i = 0; i < rocket_collision.size; i++ ) - { - rocket_collision[i] delete(); - } -} - -snd_rocket_gantry ( orignr, originl) -{ - orignr playsound ("evt_gantry_disengage"); - orignr playsound ("evt_rocket_start"); -// originl playsound ("evt_rocket_start"); -} -snd_countdown() -{ - //wait 2; - countdownl = spawn("script_origin", (480, -1256, 224)); - countdownr = spawn("script_origin", (152, 1488, 224)); - - clientnotify ( "snd_rocket_launch" ); - - - if( IsDefined(countdownl)&& IsDefined(countdownr) ) - { - countdownl playsound( "vox_mp_com_1a_rua1" ); - wait .112; - countdownr playsound( "vox_mp_com_1a_rua1" ); - wait 16.5; - - thread snd_launch (); - - - } -} -snd_launch () -{ - countdownl = spawn("script_origin", (480, -1256, 224)); - countdownr = spawn("script_origin", (152, 1488, 224)); - wait 2; - countdownl playsound( "vox_mp_com_2a_rua1" ); - wait .112; - countdownr playsound( "vox_mp_com_2a_rua1" ); - -} -rocket_sticky_grenade_think() -{ - self endon( "death" ); - - for ( ;; ) - { - self waittill( "grenade_stuck", grenade_ent ); - grenade_ent thread sticky_grenade_think(); - } -} - -sticky_grenade_think() -{ - self endon( "death" ); - level endon( "rocket_damage_stop" ); - - flag_wait( "rocket_launch_grenade_detonate" ); - wait( 0.05 ); - - self Detonate(); -} - -//Self is the trigger. This loops to make sure any grenade or claymore that's touching the damage trigger explodes. -destroy_greandes_in_trigger() -{ - self endon( "death" ); - level endon( "rocket_damage_stop" ); - - flag_wait( "rocket_launch_grenade_detonate" ); - - for( ;; ) - { - grenades = GetEntArray( "grenade", "classname" ); - - for ( i = 0; i < grenades.size; i++ ) - { - if( grenades[i] IsTouching( self )) - { - grenades[i] Detonate(); - } - - } - - wait 1; - } -} - -rocket_timer_init() -{ - level waittill( "prematch_over" ); - - event = set_dvar_if_unset( "scr_rocket_event", "end" ); - trigger1 = set_dvar_int_if_unset( "scr_rocket_event_trigger1", "0" ); - trigger2 = set_dvar_int_if_unset( "scr_rocket_event_trigger2", "0" ); - - if ( rocket_launch_abort() ) - { - return; - } - - switch ( event ) - { - case "end": - add_timed_event( 0, "rocket_launch" ); - add_score_event( level.scorelimit, "rocket_launch" ); - // AE 11-2-09: putting in the distant rocket timing - add_score_event( int(level.scorelimit * 0.5), "distant_rocket_launch" ); - break; - - case "time": - assert( trigger1 >= 0 ); - add_timed_event( trigger1, "rocket_launch" ); - // AE 11-2-09: putting in the distant rocket timing - add_timed_event( int(trigger1 * 0.5), "distant_rocket_launch" ); - break; - - case "percent": - assert( trigger1 >= 0 ); - assert( trigger1 <= 100 ); - - minutes = ( trigger1 * 0.01 ) * level.timelimit; - add_timed_event( minutes * 60, "rocket_launch" ); - // AE 11-2-09: putting in the distant rocket timing - add_timed_event( int(minutes * 60 * 0.5), "distant_rocket_launch" ); - - score = ( trigger1 * 0.01 ) * level.scorelimit; - add_score_event( score, "rocket_launch" ); - // AE 11-2-09: putting in the distant rocket timing - add_score_event( int(score * 0.5), "distant_rocket_launch" ); - break; - - case "random_time": - assert( trigger1 >= 0 ); - assert( trigger2 >= 0 ); - assert( trigger1 < trigger2 ); - - time = RandomIntRange( trigger1, trigger2 + 1 ); - add_timed_event( trigger1, "rocket_launch" ); - // AE 11-2-09: putting in the distant rocket timing - add_timed_event( int(trigger1 * 0.5), "distant_rocket_launch" ); - break; - - case "random_percent": - assert( trigger1 >= 0 ); - assert( trigger1 <= 100 ); - assert( trigger2 >= 0 ); - assert( trigger2 <= 100 ); - assert( trigger1 < trigger2 ); - - percent = RandomIntRange( trigger1, trigger2 + 1 ); - minutes = ( percent * 0.01 ) * level.timelimit; - add_timed_event( minutes * 60, "rocket_launch" ); - // AE 11-2-09: putting in the distant rocket timing - add_timed_event( int(minutes * 60 * 0.5), "distant_rocket_launch" ); - - percent = RandomIntRange( trigger1, trigger2 + 1 ); - score = ( percent * 0.01 ) * level.scorelimit; - add_score_event( score, "rocket_launch" ); - // AE 11-2-09: putting in the distant rocket timing - add_score_event( int(score * 0.5), "distant_rocket_launch" ); - break; - - default: - error( "Unknown event type: '" + event + "' used in dvar 'scr_rocket_event'" ); - break; - } -} - -rocket_launch_abort() -{ - launch_abort = set_dvar_int_if_unset( "scr_rocket_event_off", "0" ); - assert( launch_abort >= 0 ); - assert( launch_abort <= 100 ); - - if ( RandomInt( 101 ) < launch_abort ) - { - return true; - } - - return false; -} - -rocket_move() -{ - self MoveTo( self.origin + ( 0, 0, 50000 ), 50, 45 ); - - self waittill( "movedone" ); - self delete(); -} - -rocket_damage_think() -{ - level endon( "rocket_damage_stop" ); - damage_interval_secs = 1; - - assert( self.classname == "trigger_radius" ); - -/# - if ( set_dvar_int_if_unset( "scr_rocket_debug", "0" ) != 0 ) - { - drawcylinder( self.origin, self.radius, self.height, undefined, "rocket_damage_stop" ); - } -#/ - - for( ;; ) - { - self waittill( "trigger", ent ); - - if(IsPlayer(ent)) - { - player = ent; - - if ( player.sessionstate != "playing" ) - { - continue; - } - - if ( !IsDefined( player.rocket_damage_time ) ) - { - player.rocket_damage_time = GetTime(); - } - - if ( player.rocket_damage_time > GetTime() ) - { - continue; - } - - player shellshock( "tabun_gas_mp", damage_interval_secs ); - player.rocket_damage_time = GetTime() + ( damage_interval_secs * 1000 ); - player DoDamage( RandomIntRange( 40, 60 ), self.origin, self, level.rocket_base, 0, "MOD_SUICIDE" ); - } - //This kill dogs in the radius trigger - else if ( IsAI( ent )) - { - ent DoDamage( ent.health * 2, ent.origin); - } - //This kills RC bombs in the radius trigger - else if(IsDefined( ent.targetname ) && ent.targetname == "rcbomb" ) - { - //Destroy RC bomb - ent maps\mp\_rcbomb::rcbomb_force_explode(); - } - } -} - -radar_dish_think() -{ - radar_dish = GetEnt( "cosmodrome_radar_dish", "targetname" ); - AssertEx( IsDefined( radar_dish ), "Unable to find entity with targetname: 'cosmodrome_radar_dish'" ); - - for ( ;; ) - { - rotate_time = set_dvar_int_if_unset( "scr_radar_dish_rotate_secs", "30" ); - - if ( rotate_time <= 0 ) - { - return; - } - - radar_dish RotateYaw( 360, rotate_time ); - radar_dish waittill( "rotatedone" ); - } - -} - -devgui_cosmodrome( cmd ) -{ - for ( ;; ) - { - wait( 0.5 ); - - devgui_string = GetDvar( #"devgui_notify" ); - - switch( devgui_string ) - { - case "": - break; - - case "rocket_arm": - SetDvar( "scr_rocket_arm_wait_secs", "0" ); - level thread rocket_arm_think(); - break; - - default: - level notify( devgui_string ); - break; - } - - SetDvar( "devgui_notify", "" ); - } -} - -distant_rockets_think() -{ - // have the rockets in the distance going off - - distant_rocket = GetEntArray( "distant_rocket", "targetname" ); - AssertEx( IsDefined( distant_rocket ), "Unable to find entity with targetname: 'distant_rocket'" ); - - distant_rocket_gantry1 = GetEntArray("distant_rocket_gantry1", "targetname"); - AssertEx( IsDefined( distant_rocket_gantry1 ), "Unable to find entity with targetname: 'distant_rocket_gantry1'" ); - distant_rocket_gantry2 = GetEntArray("distant_rocket_gantry2", "targetname"); - AssertEx( IsDefined( distant_rocket_gantry2 ), "Unable to find entity with targetname: 'distant_rocket_gantry2'" ); - - distant_rocket_arm1 = GetEntArray( "distant_rocket_arm1", "targetname" ); - AssertEx( IsDefined( distant_rocket_arm1 ), "Unable to find entity with targetname: 'distant_rocket_arm1'" ); - distant_rocket_arm2 = GetEntArray( "distant_rocket_arm2", "targetname" ); - AssertEx( IsDefined( distant_rocket_arm2 ), "Unable to find entity with targetname: 'distant_rocket_arm2'" ); - distant_rocket_arm3 = GetEntArray( "distant_rocket_arm3", "targetname" ); - AssertEx( IsDefined( distant_rocket_arm3 ), "Unable to find entity with targetname: 'distant_rocket_arm3'" ); - distant_rocket_arm4 = GetEntArray( "distant_rocket_arm4", "targetname" ); - AssertEx( IsDefined( distant_rocket_arm4 ), "Unable to find entity with targetname: 'distant_rocket_arm4'" ); - - distant_rocket_engine = GetEnt( "distant_rocket_engine", "script_noteworthy" ); - AssertEx( IsDefined( distant_rocket_engine ), "Unable to find entity with script_noteworthy: 'distant_rocket_engine'" ); - distant_rocket_engine SetModel("tag_origin"); - distant_rocket_engine.angles = (-90, 0, 0); - - wait( 3 ); - - level waittill( "distant_rocket_launch" ); - - // splay sound on the gantry - thread snd_distant_gantry (distant_rocket_engine, distant_rocket_engine); - // play sound for arms - thread snd_distant_rocket_arm (distant_rocket_engine); - - // move the gantry away from the rocket - array_thread( distant_rocket_gantry1, ::distant_rocket_gantry1_move ); - array_thread( distant_rocket_gantry2, ::distant_rocket_gantry2_move ); - - wait(10); - - // move the arms away from the rocket - array_thread( distant_rocket_arm1, ::distant_rocket_arm1_move ); - array_thread( distant_rocket_arm2, ::distant_rocket_arm2_move ); - array_thread( distant_rocket_arm3, ::distant_rocket_arm3_move ); - array_thread( distant_rocket_arm4, ::distant_rocket_arm4_move ); - - - - // wait to launch - wait(8); - - // pre-launch fx - // TODO: small earthquakes?? - //earthquake_origin = rocket_base GetTagOrigin( "tag_engine" ); - //earthquake( .25, 4, earthquake_origin, 4096 ); - - // play 3d launch aounds on distant_rocket_engine, and 2 st 2d sounds - distant_rocket_engine playsound ("evt_dist_cosmo_launch"); - //playsoundatposition("evt_dist_cosmo_air_distf",(0,0,0)); - distant_rocket_engine playsound ("evt_dist_cosmo_air_distf"); - wait( 3.5 ); - - // launch fx - //earthquake( .35, 15, earthquake_origin, 4096 ); - - playfxontag( level._effect["rocket_blast_trail"], distant_rocket_engine, "tag_origin" ); - - // move pieces - array_thread( distant_rocket, ::rocket_move ); - -} - -distant_rocket_gantry1_move() // self == distant_rocket_gantry -{ - self RotatePitch(-45, 10.0); - self waittill("rotatedone"); -} -distant_rocket_gantry2_move() // self == distant_rocket_gantry -{ - self RotatePitch(45, 10.0); - self waittill("rotatedone"); -} - -distant_rocket_arm1_move() // self == distant_rocket_arm -{ - self RotatePitch(-45, 6.0); - self waittill("rotatedone"); -} -distant_rocket_arm2_move() // self == distant_rocket_arm -{ - self RotateRoll(-45, 6.0); - self waittill("rotatedone"); -} -distant_rocket_arm3_move() // self == distant_rocket_arm -{ - self RotatePitch(45, 6.0); - self waittill("rotatedone"); -} -distant_rocket_arm4_move() // self == distant_rocket_arm -{ - self RotateRoll(45, 6.0); - self waittill("rotatedone"); -} -snd_distant_rocket_arm ( distant_rocket_engine ) -{ - - //IPrintLnBold ("this is in the distant rocket arm section - snd_distant_rocket_arm"); - distant_rocket_engine playloopsound ("evt_dist_rocket_lp", .5); - distant_rocket_engine PlaySound ("evt_dist_rocket_start"); - //self waittill("rotatedone"); - wait (16); - distant_rocket_engine stoploopsound(.3); - distant_rocket_engine PlaySound ("evt_dist_rocket_end"); - -} -snd_distant_gantry ( orignr, originl) -{ - //IPrintLnBold ("this is playing dist rocket start"); - orignr playsound ("evt_dist_gantry_disengage"); - orignr playsound ("evt_dist_rocket_start"); -} diff --git a/mods/patch_mp/maps/mp/mp_crisis.gsc b/mods/patch_mp/maps/mp/mp_crisis.gsc deleted file mode 100644 index ce1f853..0000000 --- a/mods/patch_mp/maps/mp/mp_crisis.gsc +++ /dev/null @@ -1,35 +0,0 @@ -#include maps\mp\_utility; -main() -{ - //needs to be first for create fx - maps\mp\mp_crisis_fx::main(); - - precachemodel("collision_geo_128x128x10"); - - maps\mp\_load::main(); - - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - maps\mp\_compass::setupMiniMap("compass_map_mp_crisis_wager"); - } - else - { - maps\mp\_compass::setupMiniMap("compass_map_mp_crisis"); - } - - //maps\mp\mp_crisis_amb::main(); - - - // If the team nationalites change in this file, - // you must update the team nationality in the level's csc file as well! - maps\mp\gametypes\_teamset_cubans::level_init(); - - //setdvar("compassmaxrange","2100"); - - - // spawn collision to prevent players from seeing through the LVT - spawncollision("collision_geo_128x128x10","collider",(2891, 1282.5, 72.5), (3.6, 36.48, -1.65)); - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); -} diff --git a/mods/patch_mp/maps/mp/mp_duga.gsc b/mods/patch_mp/maps/mp/mp_duga.gsc deleted file mode 100644 index cb51ccd..0000000 --- a/mods/patch_mp/maps/mp/mp_duga.gsc +++ /dev/null @@ -1,178 +0,0 @@ -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\_events; - -main() -{ - ///# - //execdevgui( "devgui_mp_duga" ); - //#/ - - //needs to be first for create fx - maps\mp\mp_duga_fx::main(); - - maps\mp\_load::main(); - - maps\mp\mp_duga_amb::main(); - - // If the team nationalites change in this file, - // you must update the team nationality in the level's csc file as well! - maps\mp\gametypes\_teamset_winterspecops::level_init(); - - precachemodel("collision_geo_mc_8x560x190"); - precachemodel("collision_geo_mc_4x52x190"); - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); - - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - maps\mp\_compass::setupMiniMap("compass_map_mp_duga_wager"); - } - else - { - maps\mp\_compass::setupMiniMap("compass_map_mp_duga"); - } - - //Increase sample size so as to resolve lighting issue - SetDvar("sm_sunSampleSizeNear", ".5" ); - - //Sets it up so my events go off at times based on the game time and score limit - //level thread transformer_timer_init(); - ///# - //level thread devgui_duga(); - //#/ - - glasses = GetStructArray( "glass_shatter_on_spawn", "targetname" ); - - for ( i = 0; i < glasses.size; i++ ) - { - RadiusDamage( glasses[i].origin, 64, 101, 100 ); - } - - // weapon collision to keep grenades from falling out of the map through a gap between the terrain and the wall. - spawncollision("collision_geo_mc_8x560x190","collider",(462, -3840, -165), (0, 0, 0)); - spawncollision("collision_geo_mc_4x52x190","collider",(184, -3870, -164), (0, 270, 0)); - spawncollision("collision_geo_mc_4x52x190","collider",(184, -3922, -164), (0, 270, 0)); - spawncollision("collision_geo_mc_4x52x190","collider",(188, -3922, -169), (0, 270, 0)); -} - -//Sets it up so events can happen based on match time and score changes -transformer_timer_init() -{ - first_transformer_structs = getstructarray("transformer_struct","targetname"); - - level._transformer_array = []; - - for( i=0; i < first_transformer_structs.size; i++) - { - current_struct = first_transformer_structs[i]; - level._transformer_array = add_to_array(level._transformer_array, current_struct); - - while(IsDefined(current_struct.target)) - { - current_struct = getstruct(current_struct.target, "targetname"); - level._transformer_array = add_to_array(level._transformer_array, current_struct); - } - } - - level waittill( "prematch_over" ); - - - if( (IsDefined(level.timelimit)) && (level.timelimit > 0)) - { - //Electric transformers explode in pairs. The number of pairs is critical to determine how many 'events' we need. - transformer_pairs = level._transformer_array.size / 2; - total_seconds = level.timelimit * 60; - //We want to space out the transformer pair explosion evenly thourought the match - interval = total_seconds / transformer_pairs; - - //This creates events based on how many we need. The event sends a notify to duga.csc to set off explosions. - for( i = total_seconds; i >= interval; i -= interval ) - { - println( "Seconds: " + i ); - add_timed_event( int( i ), undefined, "go" ); - } - - //This event sets off with a tenth of a second left in the game. The duga.csc waits for the notify. - add_timed_event( .1, undefined, "fin" ); - } - //add_score_event( Int(level.scorelimit * .99), undefined, "final_boom" ); - //add_score_event( Int(level.scorelimit * 0.1),undefined, "next_boom" ); - //add_score_event( Int(level.scorelimit * 0.2),undefined, "next_boom" ); -} - -devgui_duga( cmd ) -{ - - for ( ;; ) - { - wait( 0.5 ); - - devgui_string = GetDvar( #"devgui_notify" ); - - switch( devgui_string ) - { - case "": - break; - - case "transformer_explode1": - level ClientNotify ("transformer_explode"); - break; - - case "transformer_explode2": - level ClientNotify ("transformer_explode"); - break; - - case "transformer_explode3": - level ClientNotify ("transformer_explode"); - break; - - case "transformer_explode4": - level ClientNotify ("transformer_explode"); - break; - - case "transformer_explode5": - level ClientNotify ("transformer_explode"); - break; - - case "transformer_explode6": - level ClientNotify ("transformer_explode"); - break; - - case "transformer_explode7": - level ClientNotify ("transformer_explode"); - break; - - case "transformer_explode8": - level ClientNotify ("transformer_explode"); - break; - - case "transformer_explode9": - level ClientNotify ("transformer_explode"); - break; - - case "transformer_explode10": - level ClientNotify ("transformer_explode"); - break; - - case "transformer_explode11": - level ClientNotify ("transformer_explode"); - break; - - case "transformer_explode12": - level ClientNotify ("transformer_explode"); - break; - - //case "final_explode": - //transformer_array[5] notify ("final_explode"); - //break; - - default: - level notify( devgui_string ); - break; - } - - SetDvar( "devgui_notify", "" ); - } -} diff --git a/mods/patch_mp/maps/mp/mp_firingrange.gsc b/mods/patch_mp/maps/mp/mp_firingrange.gsc deleted file mode 100644 index 9c7fe45..0000000 --- a/mods/patch_mp/maps/mp/mp_firingrange.gsc +++ /dev/null @@ -1,411 +0,0 @@ -#include maps\mp\_utility; - - -main() -{ - //needs to be first for create fx - maps\mp\mp_firingrange_fx::main(); - - precachemodel("collision_geo_10x10x512"); - - maps\mp\_load::main(); - - maps\mp\_compass::setupMiniMap("compass_map_mp_firingrange"); - - maps\mp\mp_firingrange_amb::main(); - - // If the team nationalites change in this file, - // you must update the team nationality in the level's csc file as well! - maps\mp\gametypes\_teamset_cubans::level_init(); - - /****** GET ENTITIES ******/ - //TRIGGERS - alleyTrigger = getent("alleyTrigger","targetname"); - windowTrigger = getent("triggerwindowTarget","targetname"); - - //TARGETS - target1 = getent("fieldTarget_BackLeft","targetname"); - target2 = getent("fieldTarget_FrontLeft","targetname"); - target3 = getent("fieldTarget_Middle","targetname"); - target4 = getent("fieldTarget_BackRight","targetname"); - target5 = getent("fieldTarget_FrontRight","targetname"); - target6 = getent("trenchTarget_GroundWall","targetname"); - target7 = getent("trailerTarget_Window","targetname"); - target8 = getent("alleyTarget_Cover","targetname"); - target9 = getent("alleyTarget_Path","targetname"); - target10 = getent("centerTarget_Sandbags","targetname"); - target11 = getent("towerTarget_Front","targetname"); - target12 = getent("towerTarget_Back","targetname"); - target13 = getent("centerTarget_Path","targetname"); - target14 = getent("centerTarget_PathBunkerL","targetname"); - target15 = getent("centerTarget_PathBunkerR","targetname"); - target16 = getent("steelBuildingTarget_Slide1","targetname"); - target17 = getent("steelBuildingTarget_PopUp","targetname"); - target18 = getent("target_alleyWindow1","targetname"); - target19 = getent("target_alleyWindow2","targetname"); - target20 = getent("target_alleyWindow3","targetname"); - - //TARGET LIGHTs - - //Props - targetLight1_off = getent("steelBuildingTargetLight1_off", "targetname"); - targetLight1_on = getent("steelBuildingTargetLight1_on", "targetname"); - - targetLight2_off = getent("steelBuildingTargetLight2_off", "targetname"); - targetLight2_on = getent("steelBuildingTargetLight2_on", "targetname"); - - //Lights - - level.const_fx_exploder_red_light_1 = 1001; - level.const_fx_exploder_red_light_2 = 1002; - - //LOUDSPEAKERS - speaker1 = getent("loudspeaker1", "targetname"); - speaker2 = getent("loudspeaker2", "targetname"); - - //PROPANE TANKS - /*propaneTank1 = getent("explodingPropaneTank","targetname"); - propaneTank2 = getent("explodingPropaneTank2","targetname"); - propaneTank3 = getent("explodingPropaneTank3","targetname");*/ - - /****** HIDE ON TARGET LIGHTS ******/ - //Keep the on versions of the light model hidden until appropriate target takes damage. - targetLight1_on Hide(); - targetLight2_on Hide(); - - /****** DAMAGE OBJECTS ********/ - - //TARGETS - target1 SetCanDamage(true); - target2 SetCanDamage(true); - target3 SetCanDamage(true); - target4 SetCanDamage(true); - target5 SetCanDamage(true); - target8 SetCanDamage(true); - target9 SetCanDamage(true); - target10 SetCanDamage(true); - target13 SetCanDamage(true); - target14 SetCanDamage(true); - target15 SetCanDamage(true); - target16 SetCanDamage(true); - target17 SetCanDamage(true); - target18 SetCanDamage(true); - target19 SetCanDamage(true); - target20 SetCanDamage(true); - - target1 thread damageTarget(1); - target2 thread damageTarget(1); - target3 thread damageTarget(1); - target4 thread damageTarget(1); - target5 thread damageTarget(1); - target8 thread damageTarget(2); - target9 thread damageTarget(2); - target10 thread damageTarget(2); - target13 thread damageTarget(2); - target14 thread damageTarget(3); - target15 thread damageTarget(3); - target16 thread damageTargetLights(targetLight1_on, targetLight1_off, speaker1, "amb_target_buzzer", level.const_fx_exploder_red_light_2 ); - target17 thread damageTargetLights(targetLight2_on, targetLight2_off, speaker2, "amb_target_buzzer", level.const_fx_exploder_red_light_1 ); - target18 thread damageTarget(4); - target19 thread damageTarget(4); - target20 thread damageTarget(5); - - //PROPANE TANKS - /*propaneTank1 SetCanDamage(true); - propaneTank2 SetCanDamage(true); - propaneTank3 SetCanDamage(true); - - propaneTank1 thread damagePropaneTank("mpl_kls_artillery_impact"); - propaneTank2 thread damagePropaneTank("mpl_kls_artillery_impact"); - propaneTank3 thread damagePropaneTank("mpl_kls_artillery_impact");*/ - - - /****** MOVE TARGETS ******/ - //Sliding Targets - target1 thread moveTarget(4, 220, 10.1); - target2 thread moveTarget(4, 220, 5.2); - target3 thread moveTarget(4, 220, 10.3); - target4 thread moveTarget(3, 290, 8.4); - target5 thread moveTarget(3, 285, 3); - target6 thread moveTarget(1, 228, 8.1); - target7 thread moveTarget(7, (57, 23, 0), 3); - target8 thread moveTarget(1, 250, 5.5); - target9 thread moveTarget(1, 146, 8.6); - target10 thread moveTarget(1, 165, 8.7); - target11 thread moveTarget(4, 136, 5.05); - target12 thread moveTarget(3, 136, 7.15); - target13 thread moveTarget(1, 228, 8.25); - target16 thread moveTarget(4, 164, 5.35); - target17 thread moveTarget(5, 48, 5.45); - target18 thread moveTarget(3, 270, 8.55); - target19 thread moveTarget(6, 70, 6.65); - target20 thread moveTarget(1, 130, 5.75); - - - - //Hinge Targets - //targetHinge1 thread rotateTarget(2, 90, 0.5, 3); //-Z direction, 90 degrees, in .5 seconds, wait inbetween for 3 seconds. - target11 thread rotateTarget(2, 90, 0.5, 2); - target12 thread rotateTarget(1, 90, 0.7, 3); - - //Triggers - alleyTrigger thread triggerCheck(target9); - windowTrigger thread triggerCheck(target7); - - - // collision keeping players from capping the HQ point from outside the room. - spawncollision("collision_geo_10x10x512","collider",(-415, -429, -128), (0, 0, 0)); - spawncollision("collision_geo_10x10x512","collider",(-415, -419, -128), (0, 0, 0)); - - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); - SetDvar( "scr_spawn_enemy_influencer_radius", 1600 ); - SetDvar( "scr_spawn_dead_friend_influencer_radius", 1300 ); - SetDvar( "scr_spawn_dead_friend_influencer_timeout_seconds", 13 ); - SetDvar( "scr_spawn_dead_friend_influencer_count", 7 ); - - - -} - -triggerCheck(target) -{ - self endon("game_ended"); - while(1) - { - self waittill("trigger", player); - - //If the target is close enough to the player to cause a possible issue, tell the target to go back the other direction. - distance = Distance(target.origin, self.origin); - if(distance <= 90) - { - target notify( "targetStopMoving" ); - while( isdefined( player) && player isTouching(self) && distance <= 90) - { - if ( DistanceSquared( target.origin, target.railPoints[0] ) < DistanceSquared( player.origin, target.railPoints[0] ) ) - target.preferredNextPos = 0; - else - target.preferredNextPos = 1; - wait( 0.25 ); - } - } - } -} - -damageTarget(dir) -{ - self endon("game_ended"); - while(1) - { - self waittill("damage", damage, attacker, direction); - - switch(dir) - { - case 1: - self rotateroll(self.angles[1] + 90, .1); - wait(.2); - self rotateroll(self.angles[1] - 90, .1); - wait(.2); - self PlaySound ("amb_target_flip"); - break; - case 2: - { - rotation = 1; - if ( isdefined( attacker ) && isPlayer( attacker ) ) - { - yaw = get2DYaw( attacker.origin, self.origin ); - if ( attacker.angles[1] > yaw ) - rotation = -1; - - } - - self rotateyaw(self.angles[2] + (180 * rotation), .3); - self PlaySound ("amb_target_twirl"); - self waittill("rotatedone"); - } - break; - case 3: - self rotatepitch(self.angles[1] + 90, .1); - wait(.2); - self rotatepitch(self.angles[1] - 90, .1); - wait(.2); - self PlaySound ("amb_target_flip"); - break; - case 4: - self rotateroll(self.angles[1] - 90, .1); - wait(.2); - self rotateroll(self.angles[1] + 90, .1); - wait(.2); - self PlaySound ("amb_target_flip"); - break; - case 5: - self rotatepitch(self.angles[1] - 90, .1); - wait(.2); - self rotatepitch(self.angles[1] + 90, .1); - wait(.2); - self PlaySound ("amb_target_flip"); - break; - - } - } -} - -//Another damage target function that handles Light style damage responses. -damageTargetLights(light_on, light_off, speaker, alias, exploderHandle) -{ - self endon("game_ended"); - while(1) - { - self waittill("damage"); - - speaker PlaySound(alias); - exploder(exploderHandle); - light_off Hide(); - light_on Show(); - wait(0.5); - exploder_stop(exploderHandle); - light_off Show(); - light_on Hide(); - } -} - -/*damagePropaneTank(soundAlias) -{ - self endon("game_ended"); - - while(1) - { - self waittill("damage"); - - RadiusDamage(self.origin, 500, 100, 50); - PlayFX(level._effect["rcbombexplosion"] , self.origin); - self PlaySound(soundAlias); - self Delete(); - } -}*/ - -//Pass in one of the following to define the start direction of the target: 1 for +y, 2 for -y, 3 for +x, 4 for -x, 5 for +Z, 6 for -Z. -//Pass in the distance in units the target is to travel. -//Pass in the ammount of time in seconds that it will take the target to travel that distance. -moveTarget(dir, dis, speed) -{ - self endon("game_ended"); - keepMoving = true; //Local var to decide if the target needs to be paused or not. - - //Get the targets starting position or nearPos - startPOS = self.origin; - //Find out the targets far position. - FarPOS = self.origin; - - sound = Spawn ("script_origin", self.origin); - sound LinkTo(self); - sound PlayLoopSound ("amb_target_chain"); - - switch(dir) - { - case 1://+Y - farPOS = self.origin + (0,dis,0); - break; - case 2://-Y - farPOS = self.origin - (0,dis,0); - break; - case 3://+X - farPOS = self.origin + (dis,0,0); - break; - case 4://-X - farPOS = self.origin - (dis,0,0); - break; - case 5://+Z - farPOS = self.origin + (0,0,dis); - break; - case 6://-Z - farPOS = self.origin - (0,0,dis); - break; - case 7://Custom - farPOS = self.origin - dis; - break; - } - - self.railPoints = []; - self.railPoints[0] = startPos; - self.railPoints[1] = FarPos; - self.preferredNextPos = 1; - self.playerTrigger = false; - //Move the target - while(1) - { - nextPos = self.railPoints[self.preferredNextPos]; - if ( self.preferredNextPos == 0 ) - self.preferredNextPos = 1; - else - self.preferredNextPos = 0; - - self moveto(nextPos, speed); - self waittill_either("movedone","targetStopMoving"); - self PlaySound ("amb_target_stop"); - } -} - - -rotateTarget(dir, deg, speed, pauseTime) -{ - self endon("game_ended"); - while(1) - { - switch(dir) - { - case 1: //+Z - self rotateyaw(self.angles[2] + deg, speed); - self PlaySound ("amb_target_rotate"); - wait(pauseTime); - self rotateyaw(self.angles[2] - deg, speed); - self PlaySound ("amb_target_rotate"); - wait(pauseTime); - break; - case 2: //-Z - self rotateyaw(self.angles[2] - deg, speed); - self PlaySound ("amb_target_rotate"); - wait(pauseTime); - self rotateyaw(self.angles[2] + deg, speed); - self PlaySound ("amb_target_rotate"); - wait(pauseTime); - break; - case 3: //+X - self rotateroll(self.angles[0] + deg, speed); - self PlaySound ("amb_target_rotate"); - wait(pauseTime); - self rotateroll(self.angles[0] - deg, speed); - self PlaySound ("amb_target_rotate"); - wait(pauseTime); - break; - case 4: //-X - self rotateroll(self.angles[0] - deg, speed); - self PlaySound ("amb_target_rotate"); - wait(pauseTime); - self rotateroll(self.angles[0] + deg, speed); - self PlaySound ("amb_target_rotate"); - wait(pauseTime); - break; - case 5: //+Y - self rotateroll(self.angles[1] + deg, speed); - self PlaySound ("amb_target_rotate"); - wait(pauseTime); - self rotateroll(self.angles[1] - deg, speed); - self PlaySound ("amb_target_rotate"); - wait(pauseTime); - break; - case 6: //-Y - self rotatepitch(self.angles[1] - deg, speed); - wait(pauseTime); - self rotatepitch(self.angles[1] + deg, speed); - wait(pauseTime); - break; - case 7: //Custom - self rotateto( (self.angles[0] + 90, self.angles[1] - 90, self.angles[2] + 45), speed); - wait(pauseTime); - self rotateto( (self.angles[0] - 90, self.angles[1] + 90, self.angles[2] - 45), speed); - wait(pauseTime); - } - } -} \ No newline at end of file diff --git a/mods/patch_mp/maps/mp/mp_golfcourse.gsc b/mods/patch_mp/maps/mp/mp_golfcourse.gsc deleted file mode 100644 index 989b608..0000000 --- a/mods/patch_mp/maps/mp/mp_golfcourse.gsc +++ /dev/null @@ -1,386 +0,0 @@ -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\_events; - -main() -{ - //needs to be first for create fx - maps\mp\mp_golfcourse_fx::main(); - - precachemodel("collision_geo_64x64x256"); - precachemodel("collision_wall_256x256x10"); - - maps\mp\_load::main(); -// maps\mp\_compass::setupMiniMap("compass_map_mp_golfcourse"); - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - maps\mp\_compass::setupMiniMap("compass_map_mp_golfcourse_wager"); - } - else - { - maps\mp\_compass::setupMiniMap("compass_map_mp_golfcourse"); - } - - maps\mp\mp_golfcourse_amb::main(); - - // If the team nationalites change in this file, you must also update the level's csc file, - // the level's csv file, and the share/raw/mp/mapsTable.csv - maps\mp\gametypes\_teamset_cubans::level_init(); - - // Set up the default range of the compass - setdvar("compassmaxrange","2100"); - - // Set up some generic War Flag Names. - // Example from COD5: CALLSIGN_SEELOW_A is the name of the 1st flag in Selow whose string is "Cottage" - // The string must have MPUI_CALLSIGN_ and _A. Replace Mapname with the name of your map/bsp and in the - // actual string enter a keyword that names the location (Roundhouse, Missle Silo, Launchpad, Guard Tower, etc) - - game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; - game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; - game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; - game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; - game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; - - game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; - game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; - game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; - game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; - game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); - - level thread sprinklers_init(); - level thread gopher_init(); - - //spawning collision in wager match so players can't hide in the spawned in columns - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 || isPregame() ) - { - spawncollision("collision_geo_64x64x256","collider",(-1075, -797, -105), (0, 340.8, 0)); - spawncollision("collision_geo_64x64x256","collider",(-551, -965, -105), (0, 340.8, 0)); - } - - //spawning collision wall to stop players from getting out of the map by the pond - spawncollision("collision_wall_256x256x10","collider",(416, 592, -172), (0, 45, -7)); - - //spawn p_gc_signpost_short model to cover hole in geo under scoreboard - - scoreboard1 = Spawn("script_model", (-2046, 839, -215) ); - if ( IsDefined(scoreboard1) ) - { - scoreboard1.angles = (0, 180, 0); - scoreboard1 SetModel("p_gc_signpost_short"); - } - -} - -sprinklers_init() -{ - wait( 3 ); - - exploders = []; - exploders[ exploders.size ] = 1001; //sprinkler by sand trap - exploders[ exploders.size ] = 1002; //sprinkler in middle of map - exploders[ exploders.size ] = 1003; //sprinkler by bridge - exploders[ exploders.size ] = 1004; - exploders[ exploders.size ] = 1005; - exploders[ exploders.size ] = 1006; - exploders[ exploders.size ] = 1007; - exploders[ exploders.size ] = 3001; - exploders[ exploders.size ] = 3002; - exploders[ exploders.size ] = 3003; - exploders[ exploders.size ] = 3004; - exploders[ exploders.size ] = 3005; - exploders[ exploders.size ] = 3006; - exploders[ exploders.size ] = 3007; - exploders[ exploders.size ] = 3008; - exploders[ exploders.size ] = 3009; - exploders[ exploders.size ] = 3010; - exploders[ exploders.size ] = 3011; - exploders[ exploders.size ] = 3012; - - for ( i = 0; i < exploders.size; i++ ) - { - sprinkler_init( exploders[ i ] ); - } -} - -sprinkler_init( exploder_num ) -{ - create_fx_ent = exploder_find( exploder_num ); - assertex( IsDefined( create_fx_ent ), "unknown sprinkler exploder: " + exploder_num ); - - create_fx_ent.fake_health = 40; - - radius = 10; - height = 10; - - create_fx_ent.damage_trigger = Spawn( "trigger_damage", create_fx_ent.v[ "origin" ] - ( 0, 0, 5 ), 0, radius, height ); - -/# - //create_fx_ent.damage_trigger thread trigger_debug( radius, height ); - //create_fx_ent.damage_trigger thread sprinkler_debug( create_fx_ent ); -#/ - - create_fx_ent.destroyed_exploder = exploder_num + 1000; - - if ( exploder_num == 1001 || exploder_num == 1002 || exploder_num == 1003 ) - { - radius = 125; - height = 150; - - start = create_fx_ent.v[ "origin" ] + vector_scale( create_fx_ent.v[ "forward" ], 384 ); - - end = start + ( 0, 0, -8000 ); - trace = BulletTrace( start, end, false, undefined, false, false ); - origin = trace[ "position" ]; - - create_fx_ent thread sprinkler_water_think( origin, radius, height ); - create_fx_ent.soundent = spawn ( "script_origin", create_fx_ent.v[ "origin" ] ); - create_fx_ent.soundent playloopsound ("amb_sprinkler"); - } - - // spawn sound ents - - create_fx_ent thread sprinkler_think(exploder_num); - exploder( exploder_num ); -} - -sprinkler_think(exploder_num) -{ - for ( ;; ) - { - self.damage_trigger waittill( "damage", amount, attacker, direction, point, type ); - - if ( IsDefined( type ) ) - { - if ( type == "MOD_MELEE" || type == "MOD_EXPLOSIVE" || type == "MOD_IMPACT" ) - { - break; - } - } - - self.fake_health -= amount; - - if ( self.fake_health <= 0 ) - { - break; - } - } - - if (isdefined (self.soundent)) - { - self.soundent stoploopsound(); - clientnotify("so_"+exploder_num); - } - playsoundatposition ("amb_sprinkler_geyser", self.v[ "origin" ] ); - - self.damage_trigger delete(); - - // delete sound ents - - // stop exploder - exploder( self.destroyed_exploder ); - self exploder_fade(); - - if ( IsDefined( self.water_trigger ) ) - { - self.water_trigger delete(); - } - - wait( 0.25 ); - - self thread sprinkler_water_think( self.v[ "origin" ], 50, 100 ); - - wait( 1 ); - - exploder_stop( self.v[ "exploder" ] ); - - wait( 5 ); - self.water_trigger delete(); -} - -sprinkler_water_think( origin, radius, height ) -{ - self.water_trigger = Spawn( "trigger_radius", origin, 0, radius, height ); -/# - //self.water_trigger thread trigger_debug( radius, height ); -#/ - - for ( ;; ) - { - self.water_trigger waittill( "trigger", entity ); - - if ( !IsDefined( entity ) || !IsPlayer( entity ) || !IsAlive( entity ) ) - { - continue; - } - - player = entity; - - if ( player.sessionstate != "playing" ) - { - continue; - } - - if ( !IsDefined( player.golfcourse_water_drops ) ) - { - player.golfcourse_water_drops = false; - } - - if ( player.golfcourse_water_drops ) - { - continue; - } - - player thread sprinkler_water_drops( self.water_trigger ); - } -} - -sprinkler_water_drops( trigger ) -{ - self endon( "death" ); - self endon( "disconnect" ); - trigger endon( "death" ); - - self thread water_drop_end_think(); - trigger thread water_drop_death_think( self ); - - for ( ;; ) - { - if ( !self IsTouching( trigger ) ) - { - self notify( "water_drop_end" ); - return; - } - - if ( !self.golfcourse_water_drops ) - { - self.golfcourse_water_drops = true; - self SetWaterDrops( 50 ); - } - - wait( RandomIntRange( 1, 3 ) ); - } -} - -water_drop_end_think() -{ - self endon( "disconnect" ); - - self waittill_any( "death", "water_drop_end" ); - self.golfcourse_water_drops = false; - self SetWaterDrops( 0 ); -} - -water_drop_death_think( player ) -{ - player endon( "death" ); - player endon( "disconnect" ); - player endon( "water_drop_end" ); - - self waittill( "death" ); - player notify( "water_drop_end" ); -} - -exploder_find( num ) -{ - num = int( num ); - - for( i = 0; i < level.createFXent.size; i++ ) - { - ent = level.createFXent[ i ]; - - if( !isdefined( ent ) ) - continue; - - if( ent.v[ "type" ] != "exploder" ) - continue; - - if( !isdefined( ent.v[ "exploder" ] ) ) - continue; - - if( ent.v[ "exploder" ] != num ) - continue; - - return ent; - } - - return undefined; -} - -exploder_fade() -{ - assert( IsDefined( self.looper ) ); - TriggerFx( self.looper, GetTime()/1000 + 100 ); -} - -gopher_init() -{ - level waittill( "prematch_over" ); - - if ( !IsDefined( game[ "gopher_fx" ] ) ) - { - game[ "gopher_fx" ] = false; - } - - if ( isRoundBased() && getRoundsPlayed() >= 3 && getRoundsPlayed() % 3 == 0 ) - { - game[ "gopher_fx" ] = false; - } - - if ( game[ "gopher_fx" ] ) - { - return; - } - - if ( cointoss() ) - { - return; - } - - exploders = []; - exploders[ exploders.size ] = 5001; - exploders[ exploders.size ] = 5002; - exploders[ exploders.size ] = 5003; - exploders[ exploders.size ] = 5004; - - percent = RandomIntRange( 20, 90 ); - minutes = ( percent * 0.01 ) * level.timelimit; - add_timed_event( minutes * 60, "gopher_fx" ); - - percent = RandomIntRange( 20, 90 ); - score = ( percent * 0.01 ) * level.scorelimit; - add_score_event( score, "gopher_fx" ); - - level waittill( "gopher_fx" ); - game[ "gopher_fx" ] = true; - - exploder( random( exploders ) ); -} - -/# -sprinkler_debug( create_fx_ent ) -{ - self endon( "death" ); - - for ( ;; ) - { - print3d( self.origin, create_fx_ent.fake_health ); - wait( 0.05 ); - } -} - -trigger_debug( radius, height ) -{ - self endon( "death" ); - - for ( ;; ) - { - drawcylinder( self.origin, radius, height, 1 ); - wait( 1 ); - } - -} -#/ - diff --git a/mods/patch_mp/maps/mp/mp_mountain.gsc b/mods/patch_mp/maps/mp/mp_mountain.gsc deleted file mode 100644 index 160b62b..0000000 --- a/mods/patch_mp/maps/mp/mp_mountain.gsc +++ /dev/null @@ -1,234 +0,0 @@ -#include maps\mp\_utility; -#include common_scripts\utility; - -main() -{ - /# - level thread devgui_mountain(); - execdevgui( "devgui_mp_mountain" ); - #/ - - //needs to be first for create fx - maps\mp\mp_mountain_fx::main(); - - precachemodel("collision_vehicle_64x64x64"); - precachemodel("collision_wall_512x512x10"); - precachemodel("collision_geo_128x128x128"); - - maps\mp\_load::main(); - - maps\mp\mp_mountain_amb::main(); - - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - maps\mp\_compass::setupMiniMap("compass_map_mp_mountain_wager"); - } - else - { - maps\mp\_compass::setupMiniMap("compass_map_mp_mountain"); - } - - //setExpFog(2048, 6000, 1, 0.5, 0.5, 0); - - - // If the team nationalites change in this file, - // you must update the team nationality in the level's csc file as well! - maps\mp\gametypes\_teamset_winterspecops::level_init(); - - // Set up the default range of the compass - //setdvar("compassmaxrange","2100"); - - // Set up some generic War Flag Names. - // Example from COD5: CALLSIGN_SEELOW_A is the name of the 1st flag in Selow whose string is "Cottage" - // The string must have MPUI_CALLSIGN_ and _A. Replace Mapname with the name of your map/bsp and in the - // actual string enter a keyword that names the location (Roundhouse, Missle Silo, Launchpad, Guard Tower, etc) - - game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; - game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; - game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; - game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; - game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; - - game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; - game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; - game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; - game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; - game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; - - // spawn vehicle collision to prevent rc car from entering a large rock - spawncollision("collision_vehicle_64x64x64","collider",(1740, -1585, 240), (0, 36.8, 0)); - spawncollision("collision_vehicle_64x64x64","collider",(1715, -1580, 240), (0, 26.4, 0)); - - // spawn collision to prevent players from leaping to a rock in the vista - spawncollision("collision_wall_512x512x10","collider",(3931, -2522, 288), (0, 45, 0)); - spawncollision("collision_wall_512x512x10","collider",(3931, -2522, 800), (0, 45, 0)); - - // spawn collision to prevent players from leaping to a rock in the vista over top of the killbrush. - spawncollision("collision_wall_512x512x10","collider",(3709, -2538, 560), (0, 180, 0)); - - // spawn collision to prevent players from sitting in a rock by the ice bridge - spawncollision("collision_geo_128x128x128","collider",(2242.2, 128.3, 260), (0, 310.2, 0)); - - - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); - - SetDvar( "scr_spawn_enemy_influencer_radius", 1620 ); - - level thread gondola_sway(); - level thread glass_exploder_init(); - - glasses = GetStructArray( "glass_shatter_on_spawn", "targetname" ); - - for ( i = 0; i < glasses.size; i++ ) - { - RadiusDamage( glasses[i].origin, 64, 101, 100 ); - } -} - -devgui_mountain( cmd ) -{ - for ( ;; ) - { - wait( 0.5 ); - - devgui_string = GetDvar( #"devgui_notify" ); - - switch( devgui_string ) - { - case "": - break; - - default: - level notify( devgui_string ); - break; - } - - SetDvar( "devgui_notify", "" ); - } -} - -//Picks randomly from 2 sway strengths -gondola_sway() -{ - level endon ("gondola_triggered"); - - gondola_cab = GetEnt( "gondola_cab", "targetname" ); - - while( 1 ) - { - randomSwingAngle = RandomFloatRange( 2, 5 ); - randomSwingTime = RandomFloatRange( 2, 3 ); - - gondola_cab RotateTo( (randomSwingAngle*0.5,(randomSwingAngle*0.6)+90,randomSwingAngle*.8), randomSwingTime, randomSwingTime*0.3, randomSwingTime*0.3 ); - gondola_cab playsound ("amb_gondola_swing"); - wait( randomSwingTime ); - gondola_cab RotateTo( ((randomSwingAngle*0.5)*-1,(randomSwingAngle*-1*0.6)+90,randomSwingAngle*.8*-1), randomSwingTime, randomSwingTime*0.3, randomSwingTime*0.3 ); - gondola_cab playsound ("amb_gondola_swing_back"); - wait( randomSwingTime ); - } -} - -glass_exploder_init() -{ - single_exploders = []; - - for ( i = 0; i < level.createFXent.size; i++ ) - { - ent = level.createFXent[ i ]; - - if ( !IsDefined( ent ) ) - continue; - - if ( ent.v[ "type" ] != "exploder" ) - continue; - - if ( ent.v[ "exploder" ] == 201 || ent.v[ "exploder" ] == 202 ) - { - ent thread glass_group_exploder_think(); - } - else if ( ent.v[ "exploder" ] >= 101 && ent.v[ "exploder" ] <= 106 ) - { - single_exploders[ single_exploders.size ] = ent; - } - else if ( ent.v[ "exploder" ] == 301 || ent.v[ "exploder" ] == 302 ) - { - single_exploders[ single_exploders.size ] = ent; - } - } - - level thread glass_exploder_think( single_exploders ); -} - -glass_group_exploder_think() -{ - thresholdSq = 160 * 160; - count = 0; - - for ( ;; ) - { - level waittill( "glass_smash", origin ); - - if ( DistanceSquared( self.v[ "origin" ], origin ) < thresholdSq ) - { - count++; - } - - if ( count >= 3 ) - { - exploder( self.v[ "exploder" ] ); - return; - } - } -} - -glass_exploder_think( exploders ) -{ - thresholdSq = 160 * 160; - - if ( exploders.size <= 0 ) - { - return; - } - - for ( ;; ) - { - closest = 999 * 999; - closest_exploder = undefined; - - level waittill( "glass_smash", origin ); - - for ( i = 0; i < exploders.size; i++ ) - { - if ( !IsDefined( exploders[i] ) ) - { - continue; - } - - if ( IsDefined( exploders[i].glass_broken ) ) - { - continue; - } - - distSq = DistanceSquared( exploders[i].v[ "origin" ], origin ); - - if ( distSq > thresholdSq ) - { - continue; - } - - if ( distSq < closest ) - { - closest_exploder = exploders[i]; - closest = distSq; - } - } - - if ( IsDefined( closest_exploder ) ) - { - closest_exploder.glass_broken = true; - exploder( closest_exploder.v[ "exploder" ] ); - } - } -} \ No newline at end of file diff --git a/mods/patch_mp/maps/mp/mp_nuked.gsc b/mods/patch_mp/maps/mp/mp_nuked.gsc deleted file mode 100644 index 6adcdc7..0000000 --- a/mods/patch_mp/maps/mp/mp_nuked.gsc +++ /dev/null @@ -1,405 +0,0 @@ -#include maps\mp\_utility; -#include common_scripts\utility; - -main() -{ - //needs to be first for create fx - maps\mp\mp_nuked_fx::main(); - - precachemodel("collision_wall_128x128x10"); - - // move a dom spawn that is sharing space with one of the mannequins - move_spawn_point( "mp_dom_spawn", (791, 449, -20), ( 779, 445, -20 ) ); - - maps\mp\_load::main(); - - maps\mp\mp_nuked_amb::main(); - maps\mp\_compass::setupMiniMap("compass_map_mp_nuked"); - - level.onSpawnIntermission = ::nuked_intermission; - - /# - level thread devgui_nuked(); - execdevgui( "devgui_mp_nuked" ); - #/ - - // If the team nationalites change in this file, - // you must update the team nationality in the level's csc file as well! - maps\mp\gametypes\_teamset_urbanspecops::level_init(); - - // Set up the default range of the compass - setdvar("compassmaxrange","2100"); - - // Set up some generic War Flag Names. - // Example from COD5: CALLSIGN_SEELOW_A is the name of the 1st flag in Selow whose string is "Cottage" - // The string must have MPUI_CALLSIGN_ and _A. Replace Mapname with the name of your map/bsp and in the - // actual string enter a keyword that names the location (Roundhouse, Missle Silo, Launchpad, Guard Tower, etc) - - game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; - game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; - game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; - game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; - game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; - - game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; - game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; - game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; - game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; - game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); - SetDvar( "scr_spawn_enemy_influencer_radius", 1600 ); - SetDvar( "scr_spawn_dead_friend_influencer_radius", 1300 ); - SetDvar( "scr_spawn_dead_friend_influencer_timeout_seconds", 8 ); - SetDvar( "scr_spawn_dead_friend_influencer_count", 7 ); - - //spawn collision in yellow house to prevent players from jump-crouching into a door. - spawncollision("collision_wall_128x128x10","collider",(769.2, 329.3, 143), (0, 290.6, 0)); - spawncollision("collision_wall_128x128x10","collider",(769.2, 329.3, 271), (0, 290.6, 0)); - - level.const_fx_exploder_end_game_glass_shatter = 5001; - level.disableOutroVisionSet = true; - - level thread nuked_mannequin_init(); - nuked_doomsday_clock_init(); - level thread maps\mp\mp_nuked_platform::main(); - - level thread nuked_population_sign_think(); - level thread nuked_bomb_drop_think(); - - /# - level thread nuked_bomb_drop_dev(); - #/ - -} - -move_spawn_point( targetname, start_point, new_point ) -{ - spawn_points = getentarray( targetname, "classname" ); - - for ( i = 0; i < spawn_points.size; i++ ) - { - if ( distancesquared( spawn_points[i].origin, start_point ) < 1 ) - { - spawn_points[i].origin = new_point; - return; - } - } -} - -nuked_mannequin_init() -{ - keep_count = 28; - level.mannequin_count = 0; - - destructibles = GetEntArray( "destructible", "targetname" ); - mannequins = nuked_mannequin_filter( destructibles ); - - if ( mannequins.size <= 0 ) - { - return; - } - - remove_count = mannequins.size - keep_count; - remove_count = clamp( remove_count, 0, remove_count ); - - mannequins = array_randomize( mannequins ); - - for ( i = 0; i < remove_count; i++ ) - { - assert( IsDefined( mannequins[i].target ) ); - - collision = GetEnt( mannequins[i].target, "targetname" ); - assert( IsDefined( collision ) ); - - collision delete(); - mannequins[i] delete(); - level.mannequin_count--; - } - - level waittill( "prematch_over" ); - level.mannequin_time = GetTime(); -} - -nuked_mannequin_filter( destructibles ) -{ - mannequins = []; - - for ( i = 0; i < destructibles.size; i++ ) - { - destructible = destructibles[i]; - - if ( IsSubStr( destructible.destructibledef, "male" ) ) - { - mannequins[ mannequins.size ] = destructible; - level.mannequin_count++; - } - } - - return mannequins; -} - -nuked_intermission() -{ - maps\mp\gametypes\_globallogic_defaults::default_onSpawnIntermission(); - - if ( wasLastRound() ) - { - level notify( "bomb_drop" ); - } -} - -nuked_bomb_drop_think() -{ - cameraStart = GetStruct( "endgame_camera_start", "targetname" ); - cameraEnd = GetStruct( cameraStart.target, "targetname" ); - - bomb = GetEnt( "nuked_bomb", "targetname" ); - - for ( ;; ) - { - camera = Spawn( "script_model", cameraStart.origin ); - camera.angles = cameraStart.angles; - camera SetModel( "tag_origin" ); - - level waittill( "bomb_drop" ); - - if( level.finalkillcam && IsDefined(level.lastKillCam ) ) - { - wait( 0.1 ); - while( level.inFinalKillcam ) - { - wait( 0.1 ); - } - } - - for ( i = 0; i < get_players().size; i++ ) - { - player = get_players()[i]; - player CameraSetPosition( camera ); - player CameraSetLookAt(); - player CameraActivate( true ); - } - - cam_move_time = set_dvar_float_if_unset( "scr_cam_move_time", "2.5" ); - bomb_explode_delay = set_dvar_float_if_unset( "scr_bomb_explode_delay", "1.5" ); - glass_break_delay = set_dvar_float_if_unset( "scr_glass_break_delay", "0.5" ); - //white_out_delay = set_dvar_float_if_unset( "scr_white_out_delay", "1.0" ); - - camera MoveTo( cameraEnd.origin, cam_move_time, 0, 0 ); - camera RotateTo( cameraEnd.angles, cam_move_time, 0, 0 ); - - bomb playSound ("amb_end_nuke"); - - dest = ( bomb.origin[0], bomb.origin[1], bomb.origin[2] - 3700 ); - - time = set_dvar_float_if_unset( "scr_bomb_time", "1.5" ); - accel_time = set_dvar_float_if_unset( "scr_bomb_accel_time", ".75" ); - - bomb MoveTo( dest, time, accel_time, 0 ); - - wait( bomb_explode_delay ); - playfx ( level._effect["fx_mp_nuked_nuclear_explosion"], bomb.origin); - wait( glass_break_delay ); - level thread waitForGlassBreak(); - cameraForward = anglestoforward( cameraEnd.angles ); - explodePoint = cameraEnd.origin + 20*cameraForward; - //black = ( 0.2, 0.2, 0.2 ); - //debugstar(explodePoint, 2 * 1000, black); - physicsExplosionSphere( explodePoint, 128, 128, 1 ); - RadiusDamage( explodePoint, 128, 128, 128 ); - //wait( white_out_delay ); - - camera thread vibrate(); - - //PrintLn( "SND NUKE play" ); - //VisionSetNaked( "flash_grenade", .4 ); - - /# - //bomb waittill( "movedone" ); - - wait( 3.5 - glass_break_delay ); - level notify( "bomb_reset" ); - camera delete(); - #/ - } -} - -vibrate() -{ - self endon( "death" ); - - pitchVibrateAmplitude = 1; - - vibrateAmplitude = 2; - vibrateTime = 0.05; - - originalAngles = self.angles; - - angles0 = ( originalAngles[0], originalAngles[1], originalAngles[2] - vibrateAmplitude ); - angles1 = ( originalAngles[0], originalAngles[1], originalAngles[2] + vibrateAmplitude ); - - for(;;) - { - angles0 = ( originalAngles[0] - pitchVibrateAmplitude , originalAngles[1], originalAngles[2] - vibrateAmplitude ); - angles1 = ( originalAngles[0] + pitchVibrateAmplitude, originalAngles[1], originalAngles[2] + vibrateAmplitude ); - - self RotateTo(angles0, vibrateTime ); - self waittill( "rotatedone" ); - self RotateTo(angles1, vibrateTime ); - self waittill( "rotatedone" ); - - if ( vibrateAmplitude > 0 ) - vibrateAmplitude -= 0.25; - pitchVibrateAmplitude = 0 - pitchVibrateAmplitude; - pitchVibrateAmplitude *= 0.66; - } -} - -waitForGlassBreak() -{ - level endon( "bomb_reset" ); - level waittill( "glass_smash", origin ); - - exploder( level.const_fx_exploder_end_game_glass_shatter ); -} - -nuked_population_sign_think() -{ - tens_model = GetEnt( "counter_tens", "targetname" ); - ones_model = GetEnt( "counter_ones", "targetname" ); - - step = ( 360 / 10 ); // 10 digits (0-9) on the dial - - // put the dials at 0 - ones = 0; - tens = 0; - - tens_model RotateRoll( step, 0.05 ); - ones_model RotateRoll( step, 0.05 ); - - for ( ;; ) - { - wait( 1 ); - - for ( ;; ) - { - num_players = get_players().size; - - dial = ones + ( tens * 10 ); - - if ( num_players < dial ) - { - ones--; - time = set_dvar_float_if_unset( "scr_dial_rotate_time", "0.5" ); - - if ( ones < 0 ) - { - ones = 9; - tens_model RotateRoll( 0 - step, time ); - tens--; - } - - ones_model RotateRoll( 0 - step, time ); - ones_model waittill( "rotatedone" ); - } - else if ( num_players > dial ) - { - ones++; - time = set_dvar_float_if_unset( "scr_dial_rotate_time", "0.5" ); - - if ( ones > 9 ) - { - ones = 0; - tens_model RotateRoll( step, time ); - tens++; - } - - ones_model RotateRoll( step, time ); - ones_model waittill( "rotatedone" ); - } - else - { - break; - } - } - } -} - -nuked_doomsday_clock_init() -{ - min_hand_model = GetEnt( "clock_min_hand", "targetname" ); - sec_hand_model = GetEnt( "clock_sec_hand", "targetname" ); - - start_angle = 318; - - min_hand_model RotatePitch( start_angle, 0.05 ); - min_hand_model waittill( "rotatedone" ); - - if ( level.timelimit > 0 ) - { - min_hand_model RotatePitch( 360 - start_angle, level.timelimit * 60 ); - sec_hand_model RotatePitch( 360 * level.timelimit, level.timelimit * 60 ); - } - else - { - sec_hand_model thread nuked_doomsday_clock_seconds_think(); - } -} - -nuked_doomsday_clock_seconds_think() -{ - for ( ;; ) - { - self RotatePitch( 360, 60 ); - self waittill( "rotatedone" ); - } -} - -/# -nuked_bomb_drop_dev() -{ - bomb = GetEnt( "nuked_bomb", "targetname" ); - bomb_origin = bomb.origin; - - for ( ;; ) - { - level waittill( "bomb_reset" ); - bomb.origin = bomb_origin; - - player = getHostPlayer(); - player CameraActivate( false ); - VisionSetNaked( "mp_nuked", 0 ); - } -} - -devgui_nuked( cmd ) -{ - for ( ;; ) - { - wait( 0.5 ); - - devgui_string = GetDvar( #"devgui_notify" ); - - switch( devgui_string ) - { - case "": - break; - - case "warp_to_bomb": - player = getHostPlayer(); - AddDebugCommand( "noclip" ); - player SetOrigin( ( 3969, 8094, 1052 ) ); - player SetPlayerAngles( ( -19, 94, 0 ) ); - break; - - default: - level notify( devgui_string ); - break; - } - - SetDvar( "devgui_notify", "" ); - } -} -#/ \ No newline at end of file diff --git a/mods/patch_mp/maps/mp/mp_radiation.gsc b/mods/patch_mp/maps/mp/mp_radiation.gsc deleted file mode 100644 index ce57eed..0000000 --- a/mods/patch_mp/maps/mp/mp_radiation.gsc +++ /dev/null @@ -1,852 +0,0 @@ -#include maps\mp\_utility; -#include common_scripts\utility; - - -main() -{ - precachemodel("tag_origin"); - - /# - level thread devgui_radiation(); - execdevgui("devgui_mp_radiation"); - #/ - - //needs to be first for create fx - maps\mp\mp_radiation_fx::main(); - - precachemodel("collision_geo_64x64x256"); - precachemodel("collision_wall_128x128x10"); - precachemodel("collision_geo_256x256x10"); - - - maps\mp\_load::main(); - - maps\mp\mp_radiation_amb::main(); - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - maps\mp\_compass::setupMiniMap("compass_map_mp_radiation_wager"); - } - else - { - maps\mp\_compass::setupMiniMap("compass_map_mp_radiation"); - } - - - //Increase sample size so as to resolve lighting issue - SetDvar("sm_sunSampleSizeNear", ".5" ); - - // If the team nationalites change in this file, - // you must update the team nationality in the level's csc file as well! - maps\mp\gametypes\_teamset_urbanspecops::level_init(); - - // Set up the default range of the compass - setdvar("compassmaxrange","2100"); - - // COLLISION - to prevent players from placing turrets inside a large cylinder brush in the tank room - spawncollision("collision_geo_64x64x256","collider",(1221, 41, 236), (0, 0, 0)); - - // COLLISION - to prevent players from jumping onto a little ledge of collision - spawncollision("collision_wall_128x128x10","collider",(1042, -309, 309), (0, 0, 0)); - spawncollision("collision_wall_128x128x10","collider",(1080, -309, 309), (0, 0, 0)); - - // COLLISION - to prevent players from dropping turrets in the large grey tanks by the warehouse - spawncollision("collision_geo_64x64x256","collider",(568, 219, 264), (0, 0, 0)); - spawncollision("collision_geo_64x64x256","collider",(567, -105, 264), (0, 0, 0)); - - // COLLISION - to prevent players dropping off the catwalk onto ledge in warehouse - spawncollision("collision_wall_128x128x10","collider",(1157, -345, 186), (0, 270, 0)); - spawncollision("collision_wall_128x128x10","collider",(1157, -345, 314), (0, 270, 0)); - spawncollision("collision_wall_128x128x10","collider",(1157, -345, 442), (0, 270, 0)); - - //NOTURRET - spawns radius triggers to stop players from placing turrets in the large cylinders in the NE corner of the map - addNoTurretTrigger((1440, -1116, 145), 230, 256); - addNoTurretTrigger((1446, -1659, 145), 230, 256); - - - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); - - flag_init_func(); - - level_objects_init(); - -} - -flag_init_func() -{ - flag_init("kill_stuck_players"); -} - -level_objects_init() -{ - level._digger_fx = LoadFX( "maps/mp_maps/fx_mp_sand_digger_radiation" ); - waittillframeend; - level._door_switch_trig1 = getent_and_assert("switch_trigger1"); - level._door_switch_trig2 = getent_and_assert("switch_trigger2"); - - level._door1 = getent_and_assert("big_door1_clip"); - level._door2 = getent_and_assert("big_door2_clip"); - - level.const_fx_exploder_switch_green_light = 2001; - level.const_fx_exploder_switch_red_light = 2002; - - //Gets some diggers digging - level thread digger_dig_init(); - - //Gets diggers in the background moving - moving_diggers_init(); - - //Sets up the switchs players can flip to open the double doors - level thread door_switch_func(); - - if( !level.wagerMatch && !isPregame() ) - { - //get my doors opening at the start of the match - level thread double_doors_open_at_start(); - } - - //Get conveyer belt working - level thread conveyer_belt_init(); -} - -turnSwitchPanelRed() -{ - exploder_stop( level.const_fx_exploder_switch_green_light ); - exploder( level.const_fx_exploder_switch_red_light ); -} - -turnSwitchPanelGreen() -{ - exploder_stop( level.const_fx_exploder_switch_red_light ); - exploder( level.const_fx_exploder_switch_green_light ); -} - -//Sets it up so a player can flip a switch and open large double doors -door_switch_func() -{ - //Set up the use trigger switches that activate my double doors - level._door_switch_trig1 thread door_switch_setup(); - level._door_switch_trig2 thread door_switch_setup(); - - //Cooldown switches inform the player that the door switch is on cooldown if they try to interact with it - cooldown_switches = GetEntArray("off_trigger","targetname"); - AssertEx( cooldown_switches.size > 0, "Missing off_triggers"); - - for( i = 0; i < cooldown_switches.size; i++) - { - cooldown_switches[i] UseTriggerRequireLookAt(); - cooldown_switches[i] SetCursorHint( "HINT_NOICON" ); - cooldown_switches[i] SetHintString( &"MP_HOLD_DOOR_SWITCH_UNAVAILABLE"); - cooldown_switches[i] trigger_off(); - } - - turnSwitchPanelRed(); - - kill_trig1 = getent_and_assert("edge_death_trig1"); - kill_trig2 = getent_and_assert("edge_death_trig2"); - center_death_trig = getent_and_assert("center_death_trig"); - - //Set up DVARS for tweaking door opening sequence - d1_new_angle = set_dvar_int_if_unset("scr_d1_new_angle", "123"); - d2_new_angle = set_dvar_int_if_unset("scr_d2_new_angle", "-123"); - - door_model1 = getent_and_assert("big_door1"); - door_model2 = getent_and_assert("big_door2"); - - door_model1 LinkTo(level._door1); - door_model2 LinkTo(level._door2); - - door_monster_clip = GetEnt("door_monster_clip","targetname"); - - //door_monster_clip thread dog_kill(); - - //snd_door_status tracks if the door is open or closed - snd_door_status = 0; - - light_structs = getstructarray("switch_struct","targetname"); - AssertEx( light_structs.size > 0, "Missing light structs"); - - for( i = 0; i < light_structs.size; i++) - { - light_structs[i] thread switch_lights(i); - } - - tunnel_structs = getstructarray("tunnel_light_spot","targetname"); - AssertEx(tunnel_structs.size > 0, "Missing light structs"); - - for( i = 0; i < light_structs.size; i++) - { - tunnel_structs[i] thread tunnel_lights(i); - } - - while(!level.wagermatch) - { - //This is a switch in the level on the catwalk - waittill_any_ents(level._door_switch_trig1,"trigger",level._door_switch_trig2,"trigger"); - - //Disables the switch temporarily - level._door_switch_trig1 trigger_off(); - level._door_switch_trig2 trigger_off(); - - for( i = 0; i < cooldown_switches.size; i++) - { - cooldown_switches[i] trigger_on(); - } - - //Set up DVARS for tweaking door opening sequence. Acceleration and decelation variation added for realistic offset. - door_time = set_dvar_int_if_unset("scr_d1_time", "8"); - - //The doors have specific accelleration and deceleration values so as give an organic-looking timing offset. - //When the doors are opening, we want Door 2 to accelerate slightly faster so as to avoid clipping. - if(snd_door_status == 0) - { - d1_accel = door_time * .6; - d2_accel = door_time * .7; - - d1_decel = door_time * .4; - d2_decel = door_time * .3; - - //Monster clip is placed and path nodes are severed to keep dogs from running on the doors - door_monster_clip trigger_on(); - door_monster_clip DisconnectPaths(); - } - //When the doors are closing, we want Door 1 to accelerate slightly faster so as to avoid clipping. - else - { - d1_accel = door_time * .7; - d2_accel = door_time * .6; - - d1_decel = door_time * .3; - d2_decel = door_time * .4; - } - - door_cooldown = set_dvar_int_if_unset("scr_door_cooldown", "20"); - - level._door1 RotateRoll(d1_new_angle, door_time, d1_accel, d1_decel); - level._door2 RotateRoll(d2_new_angle, door_time, d2_accel, d2_decel); - - thread dropEverythingOnDoorsToGround(); - level thread destroyEquipment(); - - // Play door opening sound - level._door1 playloopsound ("evt_hydraulic_loop", .5); - level._door1 playsound ("evt_hydraulic_start"); - level._door1 thread door_snd_alarm ( 5 ); - - //This sets it so my doors move in reverse next time they're activated - d1_new_angle = d1_new_angle * -1; - d2_new_angle = d1_new_angle * -1; - - //Flag marks the period of time i'm checking for any player caught in moving collision - flag_set("kill_stuck_players"); - - //Give time for doors to move a moderate amount before starts kill trigger - wait 4; - - //Only want to kill players if doors are closing - if(snd_door_status == 1) - { - //These are three seperate trigger brushes I want to check for stuck players - kill_trig1 thread kill_edge_players_func(); - kill_trig2 thread kill_edge_players_func(); - center_death_trig thread kill_edge_players_func(); - } - level._door1 waittill("rotatedone"); - - //snd_door_status tracks if the door is currently open or closed for seprate open and close audio - if (snd_door_status == 0) - { - //stops the move loop, plays endind sound, and set current door status - level._door1 stoploopsound (1); - center_death_trig playsound ("evt_hydraulic_open"); - snd_door_status = 1; - } - else - { - //stops the move loop, plays endind sound, and set current door status - level._door1 stoploopsound (1); - center_death_trig playsound ("evt_hydraulic_close"); - - //Clip is removed so dogs can path - door_monster_clip ConnectPaths(); - door_monster_clip trigger_off(); - snd_door_status = 0; - } - - flag_clear("kill_stuck_players"); - - //Special notify to end my check for players caught on collision - level notify ("edge_check"); - - wait (door_cooldown); - level notify ("no_cooldown"); - - for( i = 0; i < cooldown_switches.size; i++) - { - cooldown_switches[i] trigger_off(); - } - - level._door_switch_trig1 trigger_on(); - level._door_switch_trig2 trigger_on(); - } -} -door_snd_alarm ( alarmTimes ) -{ - - for (i=0; i < alarmTimes; i++) - { - wait (.5); - - playsoundatposition("amb_alarm_buzz",(-664,110,436)); - - playsoundatposition("amb_alarm_buzz",(-664,-72,436)); - - playsoundatposition("amb_alarm_buzz",(-666,-602,436)); - - playsoundatposition("amb_alarm_buzz",(-666,660,444)); - - wait (1.5); - } -} -//Self is the use triggers that activate the double doors -door_switch_setup() -{ - self usetriggerrequirelookat(); - if ( level.wagerMatch ) - { - self SetHintString(&"MP_HOLD_DOOR_SWITCH_UNAVAILABLE"); - turnSwitchPanelRed(); - } - else - { - self SetHintString(&"MP_HOLD_TO_OPERATE_DOORS"); - turnSwitchPanelGreen(); - } - - while ( !level.wagerMatch ) - { - // self is the switch. who is the player that triggered switch - self waittill("trigger", who); - - //Added "if" check for when the doors are triggered without a player -Leif - if(IsDefined( who )) - { - who playsound ("evt_hydraulic_switch"); - } - - wait (1); - } -} - -//Self is a trigger. The triggers are placed in places i'm afraid of players getting caught -kill_edge_players_func() -{ - level endon ("edge_check"); - - //This only loops while the doors are moving - while(1) - { - self waittill("trigger", player); - - if((player IsTouching(level._door1)) || (player IsTouching(level._door2))) - { - player DoDamage(player.health * 2, self.origin, player, player, 0, "MOD_SUICIDE" ); - // TODO: add crushing audio. CDC - } - else - { - wait .05; - } - } -} - -//TO DO: Review this function for multiplayer API improvements. -//'Self' is the struct within the panel that operates the double doors -switch_lights( element_number ) -{ - if ( level.PrematchPeriod > 0 && level.inPrematchPeriod == true ) - { - level waittill("prematch_over"); - } - - while(1) - { - effect_ent = Spawn("script_model", self.origin); - effect_ent SetModel("tag_origin"); - - //This wait is necesary to get the effect to work on the newly created script model. - wait .1; - - //Green light signals the switch is not on cooldown - turnSwitchPanelGreen(); - //PlayFXOnTag(level._effect["green_light"], effect_ent,"tag_origin" ); - - waittill_any_ents(level._door_switch_trig1,"trigger",level._door_switch_trig2,"trigger"); - - //This function is array threaded, so we must prevent FX from playing in the same frame using this loop - for (i = 0; i < element_number; i++) - { - wait .1; - } - - effect_ent Delete(); - - blinky_effect_ent = Spawn("script_model", self.origin); - blinky_effect_ent SetModel("tag_origin"); - - //This wait is necesary to get the effect to work on the newly created script model. - wait .1; - - //Blink red light signals the double doors are moving - turnSwitchPanelRed(); - //PlayFXOnTag(level._effect["blink_light"], blinky_effect_ent,"tag_origin" ); - - //This notify signals that the doors have stopped moving - level waittill ("edge_check"); - - for (i = 0; i < element_number; i++) - { - wait .1; - } - - blinky_effect_ent Delete(); - - final_effect_ent = Spawn("script_model", self.origin); - final_effect_ent SetModel("tag_origin"); - - //This wait is necesary to get the effect to work on the newly created script model. - wait .1; - - //Red light signals the switch cannot be used - //PlayFXOnTag(level._effect["red_light"], final_effect_ent,"tag_origin" ); - - //This notify signals that the doors have stopped moving - level waittill ("no_cooldown"); - - for (i = 0; i < element_number; i++) - { - wait .1; - } - - final_effect_ent Delete(); - } -} - -//'Self' is the struct within the light bulbs in the Radiation tunnel. This function manages FX in the tunnel -//'Element number' is equal to self's index number in the array that got array threaded. -tunnel_lights(element_number) -{ - door_closed = true; - - while(1) - { - //Must define may variable to avoid SRE - effect_ent = undefined; - - //When door is closed, play "solid" tunnel light effect - if(door_closed) - { - effect_ent = Spawn("script_model", self.origin); - effect_ent SetModel("tag_origin"); - - //Must wait a moment for the script model to finish spawning - wait .1; - - PlayFXOnTag(level._effect["green_light"], effect_ent,"tag_origin" ); - } - - //Wait until a tunnel double door switch is hit - waittill_any_ents(level._door_switch_trig1,"trigger",level._door_switch_trig2,"trigger"); - - //This loop makes sure effects do not happen in the same frame, as this function has been array threaded to multiple ents. - for (i = 0; i < element_number; i++) - { - wait .1; - } - - //'New effect' is the blinking lights that occur while the double doors are moving - new_effect_ent = Spawn("script_model", self.origin); - new_effect_ent SetModel("tag_origin"); - - if(IsDefined(effect_ent)) - { - effect_ent Delete(); - } - - //Must wait a moment for the script model to finish spawning - wait .1; - - PlayFXOnTag(level._effect["blink_light"], new_effect_ent,"tag_origin" ); - - level waittill ("edge_check"); - - for (i = 0; i < element_number; i++) - { - wait .1; - } - - new_effect_ent Delete(); - - if(!door_closed) - { - door_closed = true; - } - else - { - door_closed = false; - } - } -} - -//Open doors at start -double_doors_open_at_start() -{ - //Set up the double doors to open at the start of the match - if ( level.PrematchPeriod > 0 && level.inPrematchPeriod == true ) - { - level waittill("prematch_over"); - } - - - //Slow down my door for other functions to hit waittil's - wait .3; - - //Note I didn't use the "useby player[0]" convention due to a hesitance to grab specific players in MP. - level._door_switch_trig1 notify ("trigger"); -} - -//Set up the devgui to have the ability to operate the doors, adjust door cooldown, rotate times, digger behavior, etc. -devgui_radiation(cmd) -{ - while(1) - { - wait(0.5); - - devgui_string = GetDvar( #"devgui_notify"); - - switch(devgui_string) - { - case "": - break; - - case "operate_doors": - level._door_switch_trig1 notify ("trigger"); - break; - - default: - level notify(devgui_string); - break; - } - - SetDvar("devgui_notify", ""); - } -} - -//*****TO DO: MOVE DIGGER FUNCTIONALITY CLIENT SIDE.********* - -//Sets it up so I can handle multiple diggers doing a digging action -digger_dig_init() -{ - diggers = GetEntArray("digger_body","targetname"); - AssertEx( diggers.size > 0, "Unable to find entity with targetname 'digger_body'" ); - array_thread(diggers,::digger_dig_think); -} - -//Self is the digger's body entity. Function creates a series of movements for the diggers to create a digging behavior -digger_dig_think() -{ - body = self; - arm = GetEnt(self.target, "targetname"); - AssertEx(IsDefined(arm), "Unable to find arm entity for a digger at " + self.origin ); - blade_center = GetEnt(arm.target, "targetname"); - AssertEx(IsDefined(blade_center), "Unable to find blade entity for a digger at " + self.origin ); - - blade_pieces = GetEntArray("digger_blade","targetname"); - - for( i = 0; i < blade_pieces.size; i++) - { - blade_pieces[i] LinkTo(blade_center); - } - - blade_center LinkTo( arm ); - arm LinkTo( body ); - - //play idle sound on body - body playloopsound ("evt_excavator_idle", .5); - - if(IsDefined(self.script_float)) - { - set_dvar_int_if_unset("scr_dig_delay", self.script_float ); - } - else - { - //'20' is the default value for the cooldown on the digger's dig action - set_dvar_int_if_unset("scr_dig_delay", 20 ); - } - - while(1) - { - arm_move_speed = set_dvar_int_if_unset("scr_arm_move_speed", 11); - blade_spin_speed = set_dvar_int_if_unset("scr_blade_spin_speed", 80); - blade_spin_up_time = set_dvar_int_if_unset("scr_blade_spin_up_time", 3); - - body_turn = RandomIntRange(-15,15); - //Must grab the absolute value of the turn value to get proper time fraction, which is the "positive_value_func" - body_turn_speed = (positive_value_func(body_turn)) * .3; - - body RotateYaw(body_turn, body_turn_speed, body_turn_speed/4, body_turn_speed/4 ); - - // play move loop on arm, and rev one shot on body - arm playloopsound ("evt_excavator_move", .5); - body playsound ("evt_excavator_rev"); - - body waittill ("rotatedone"); - - arm Unlink(body); - arm RotatePitch(-45, arm_move_speed, arm_move_speed/4, arm_move_speed/4); - arm waittill ("rotatedone"); - - blade_center UnLink(arm); - blade_center RotatePitch(1800, blade_spin_speed, blade_spin_up_time, blade_spin_up_time); - smokeAngles = ( 0, arm.angles[1]+180, arm.angles[2] ); - - forward = anglesToForward( smokeAngles ); - - //playfx ( level.chopper_fx["explode"]["death"], self.origin, forward ); - PlayFX( level._digger_fx, ( blade_center.origin[0], blade_center.origin[1], blade_center.origin[2]-560), forward ); - //stop loop on arm - //iprintlnbold ("this is the stop I suspect"); //had to comment this out for playtest. -Leif - arm stoploopsound (1); - - // play digging loop on blade - blade_center playloopsound ("evt_excavator_blade", .5); - - blade_center waittill ("rotatedone"); - - // stop diggin loop blade - blade_center stoploopsound (.5); - - blade_center LinkTo(arm); - - arm RotatePitch(45, arm_move_speed, arm_move_speed/4, arm_move_speed/4 ); - - // play move loop on arm, and rev one shot on body - arm playloopsound ("evt_excavator_move", .5); - body playsound ("evt_excavator_rev"); - - arm waittill ("rotatedone"); - arm LinkTo( body ); - - body RotateYaw((body_turn * -1), body_turn_speed, body_turn_speed/4, body_turn_speed/4); - - body waittill ("rotatedone"); - arm stoploopsound (.5); - - wait (GetDvarFloat( #"scr_dig_delay" )); - } -} - -//Sets it up so the script can easily handle multiple moving diggers -moving_diggers_init() -{ - diggers = GetEntArray("moving_digger","targetname"); - //AssertEx( diggers.size > 0, "Unable to find entity with targetname 'moving_digger'" ); - array_thread(diggers, ::moving_diggers_think); -} - -//Sets up diggers that follow structs. Note the script_int K/V pair sets up the move time. -moving_diggers_think() -{ - digger_struct = getstruct_and_assert(self.target); - - while(1) - { - //Each struct has a script_int key value pair that determines the length of time it takes to complete the move - self MoveTo(digger_struct.origin, digger_struct.script_int); - AssertEx(IsDefined(digger_struct.script_int), "Unable to find digger struct's 'script_int' key value pair for moving digger" ); - - self waittill("movedone"); - - //Structs target other structs to determine the digger's path. - if(IsDefined(digger_struct.target)) - { - digger_struct = GetStruct(digger_struct.target,"targetname"); - } - else - { - break; - } - } -} - -//Function needed to get the absolute value of an integer and be sure its a positive number -positive_value_func(num) -{ - return(max(1, abs(num))); -} - -//Starts a thread to alter player's velocity as long as they're in the trigger -conveyer_belt_init() -{ - //Need to set dvar to determine force of momentum in trigger - set_dvar_int_if_unset( "scr_coveyer_speed", 45 ); - - conveyer_trigger = getent_and_assert("coveyer_trig"); - - //The trigger targets a script struct. The struct contains angles to determine the force direction. - trigger_struct = getstruct_and_assert(conveyer_trigger.target); - - //Find direction that my trigger is pointed toward - trigger_angles = AnglesToForward(trigger_struct.angles); - - //Create intensity of conveyer force equal to my script DVar. Store it on my trigger for a seperate function to use. - conveyer_trigger._conveyer_vector = vector_scale(trigger_angles,GetDvarInt( #"scr_coveyer_speed")); - - while(1) - { - conveyer_trigger waittill("trigger", player); - if(IsPlayer(player)) - { - conveyer_trigger thread trigger_thread(player, ::player_on_conveyer); - } - - wait .05; - } -} - -//Self is trigger. Function is ran when player jumps into the trigger. -player_on_conveyer(player, endon_string) -{ - player endon ("death"); - player endon ("disconnect"); - player endon(endon_string); - - while(1) - { - player_velocity = player GetVelocity(); - - //Don't want jumping player to be pulled by conveyer - if (player IsOnGround()) - { - //Gives player momentum in the direction of the conveyer equal to a dvar I created earlier along with their own momentum - player SetVelocity(player_velocity + self._conveyer_vector); - } - - wait .05; - } -} - -getent_and_assert(ent_name) -{ - thing = GetEnt( ent_name, "targetname"); - AssertEx(IsDefined(thing), "Unable to find targetname " + ent_name); - - return thing; -} - -getstruct_and_assert(struct_name) -{ - thing = getstruct( struct_name, "targetname"); - AssertEx(IsDefined(thing), "Unable to find struct at " +struct_name); - - return thing; -} - -dropEverythingOnDoorsToGround() -{ - level endon("edge_check"); - - // keep dropping all to ground to keep the items in physics - // if you only do it once or twice they come back to rest to fast - // if there is a problem with this solution then we are going to need - // to do something for keeping the crates in physics while in contact - // with the doors. - while(1) - { - wait(0.1); - dropAllToGround( (0,0,128), 181, 100 ); - } -} - -destroyEquipment() -{ - level endon ( "edge_check" ); - - for ( ;; ) - { - wait( 2 ); - - grenades = GetEntArray( "grenade", "classname" ); - - for ( i = 0; i < grenades.size; i++ ) - { - item = grenades[i]; - - if ( !IsDefined( item.name ) ) - { - continue; - } - - if ( !IsDefined( item.owner ) ) - { - continue; - } - - if ( !IsWeaponEquipment( item.name ) ) - { - continue; - } - - if ( !item IsTouching( level._door1 ) && !item IsTouching( level._door2 ) ) - { - continue; - } - - watcher = item.owner getWatcherForWeapon( item.name ); - - if ( !IsDefined( watcher ) ) - { - continue; - } - - watcher thread maps\mp\gametypes\_weaponobjects::waitAndDetonate( item, 0.0, undefined ); - } - } -} - -getWatcherForWeapon( weapname ) -{ - if ( !IsDefined( self ) ) - { - return undefined; - } - - if ( !IsPlayer( self ) ) - { - return undefined; - } - - for ( i = 0; i < self.weaponObjectWatcherArray.size; i++ ) - { - if ( self.weaponObjectWatcherArray[i].weapon != weapname ) - { - continue; - } - - return ( self.weaponObjectWatcherArray[i] ); - } - - return undefined; -} - - //spawns triggers to stop players from placing turrets - addNoTurretTrigger( position, radius, height ) - { - while( !IsDefined( level.noTurretPlacementTriggers ) ) - wait( 0.1 ); - - trigger = Spawn( "trigger_radius", position, 0, radius, height ); - - level.noTurretPlacementTriggers[level.noTurretPlacementTriggers.size] = trigger; - } diff --git a/mods/patch_mp/maps/mp/mp_russianbase.gsc b/mods/patch_mp/maps/mp/mp_russianbase.gsc deleted file mode 100644 index 5052fec..0000000 --- a/mods/patch_mp/maps/mp/mp_russianbase.gsc +++ /dev/null @@ -1,139 +0,0 @@ -#include maps\mp\_utility; -main() -{ - //needs to be first for create fx - maps\mp\mp_russianbase_fx::main(); - - precachemodel("collision_geo_32x32x128"); - precachemodel("collision_wall_256x256x10"); - - maps\mp\_load::main(); - - maps\mp\mp_russianbase_amb::main(); - - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - maps\mp\_compass::setupMiniMap("compass_map_mp_russianbase_wager"); - } - else - { - maps\mp\_compass::setupMiniMap("compass_map_mp_russianbase"); - } - - // If the team nationalites change in this file, - // you must update the team nationality in the level's csc file as well! - maps\mp\gametypes\_teamset_winterspecops::level_init(); - - // Set up the default range of the compass - setdvar("compassmaxrange","2100"); - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); - - //fog - //setExpFog(200, 6000, 0.7, 0.7, 0.73, 0); - - /# - level thread devgui_russianbase(); - execdevgui( "devgui_mp_russianbase" ); - #/ - - - // spawn collision for hole in wall between E2 and E3 - spawncollision("collision_wall_256x256x10","collider",(-1731, 960, 288), (0, 270, 0)); - - - // spawn collision for the new telephone pole - spawncollision("collision_geo_32x32x128","collider",(-120, 1828, 63), (0, 0, 0)); - - //spawn a new set of windows in front of the missing ones for PS3 - - window1 = Spawn("script_model", (-2116, 0, 504) ); - if ( IsDefined(window1) ) - { - window1.angles = (0,0,0); - window1 SetModel("p_rus_window_dark01"); - } - - window2 = Spawn("script_model", (-1878, 0, 504) ); - if ( IsDefined(window2) ) - { - window2.angles = (0,0,0); - window2 SetModel("p_rus_window_dark01"); - } - - //spawn a new telephone pole - - pole1 = Spawn("script_model", (-114.081, 1821.35, -10) ); - if ( IsDefined(pole1) ) - { - pole1.angles = (0, 15.2, 0); - pole1 SetModel("p_rus_electricpole"); - } - - - - level thread runTrain(); -} - -runTrain() -{ - level endon( "game_ended" ); - precacheModel("t5_veh_train_boxcar"); - precacheModel("t5_veh_train_fuelcar"); - precacheModel("t5_veh_train_engine"); - - // if you change moveTime of numOfCarts you need to change it in client script also - moveTime = 20; - numOfCarts = 40; - originalRation = ( moveTime / 80 ); - maxWaitBetweenTrains = getDvarIntDefault( #"scr_maxWaitBetweenTrains", 200 ); - trainTime = ( moveTime + ( numOfCarts * 4 * originalRation ) ); - - - /# - russian_base_train_dev(); - #/ - for(;;) - { - waitBetweenTrains = randomint( maxWaitBetweenTrains ); - if ( waitBetweenTrains > 0 ) - wait( waitBetweenTrains ); - level clientNotify("play_train"); - wait( trainTime ); - } -} - - - -/# -russian_base_train_dev() -{ - for ( ;; ) - { - level waittill( "run_train" ); - level clientNotify("play_train"); - } -} - -devgui_russianbase( cmd ) -{ - for ( ;; ) - { - wait( 0.5 ); - - devgui_string = GetDvar( #"devgui_notify" ); - - switch( devgui_string ) - { - case "": - break; - default: - level notify( devgui_string ); - break; - } - - SetDvar( "devgui_notify", "" ); - } -} -#/ diff --git a/mods/patch_mp/maps/mp/mp_silo.gsc b/mods/patch_mp/maps/mp/mp_silo.gsc deleted file mode 100644 index b0052da..0000000 --- a/mods/patch_mp/maps/mp/mp_silo.gsc +++ /dev/null @@ -1,107 +0,0 @@ -#include maps\mp\_utility; -#include common_scripts\utility; - - -//======================================================== -// main -//======================================================== -main() -{ - //needs to be first for create fx - maps\mp\mp_silo_fx::main(); - maps\mp\createart\mp_silo_art::main(); - - precachemodel("collision_wall_256x256x10"); - - maps\mp\_load::main(); - - // maps\mp\_compass::setupMiniMap("compass_map_mp_silo"); - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - maps\mp\_compass::setupMiniMap("compass_map_mp_silo_wager"); - } - else - { - maps\mp\_compass::setupMiniMap("compass_map_mp_silo"); - } - - /# - execdevgui( "devgui_mp_silo" ); - #/ - - maps\mp\mp_silo_amb::main(); - - // If the team nationalites change in this file, you must also update the level's csc file, - // the level's csv file, and the share/raw/mp/mapsTable.csv - maps\mp\gametypes\_teamset_urbanspecops::level_init(); - - // Set up the default range of the compass - setdvar( "compassmaxrange","2100" ); - - // Set up some generic War Flag Names. - // Example from COD5: CALLSIGN_SEELOW_A is the name of the 1st flag in Selow whose string is "Cottage" - // The string must have MPUI_CALLSIGN_ and _A. Replace Mapname with the name of your map/bsp and in the - // actual string enter a keyword that names the location (Roundhouse, Missle Silo, Launchpad, Guard Tower, etc) - - game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; - game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; - game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; - game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; - game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; - - game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; - game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; - game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; - game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; - game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning( true ); - - level thread crane_container(); - - //spawning collision in wager match so players can't hide in the spawned plates - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 || isPregame() ) - { - spawncollision("collision_wall_256x256x10","collider",(1527, 71, 16), (0, 337, 0)); - } - -} - - -//======================================================== -// cargo_container -//======================================================== -crane_container() -{ - crane_container = GetEnt( "crane_container", "targetname" ); - - if( !IsDefined( crane_container ) ) - { - return; - } - - crane_container thread rotate_crane_container(); -} - - -//======================================================== -// rotate_crane_container -//======================================================== -rotate_crane_container() -{ - rotate_time = 8; - rotate_angle = 30; - - self RotateYaw( rotate_angle / 2, rotate_time / 2 ); - self waittill( "rotatedone" ); - - while( true ) - { - rotate_angle = rotate_angle * -1; - - self RotateYaw( rotate_angle, rotate_time, rotate_time / 2, rotate_time / 2 ); - self waittill( "rotatedone" ); - } - -} \ No newline at end of file diff --git a/mods/patch_mp/maps/mp/mp_villa.gsc b/mods/patch_mp/maps/mp/mp_villa.gsc deleted file mode 100644 index cefdae1..0000000 --- a/mods/patch_mp/maps/mp/mp_villa.gsc +++ /dev/null @@ -1,105 +0,0 @@ -#include maps\mp\_utility; -main() -{ - //needs to be first for create fx - maps\mp\mp_villa_fx::main(); - - precachemodel("collision_geo_64x64x256"); - precachemodel("collision_geo_32x32x128"); - precachemodel("collision_geo_32x32x32"); - - maps\mp\_load::main(); - - maps\mp\mp_villa_amb::main(); - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - maps\mp\_compass::setupMiniMap("compass_map_mp_villa_wager"); - } - else - { - maps\mp\_compass::setupMiniMap("compass_map_mp_villa"); - } - - // If the team nationalites change in this file, - // you must update the team nationality in the level's csc file as well! - maps\mp\gametypes\_teamset_cubans::level_init(); - - // Set up the default range of the compass - setdvar("compassmaxrange","2100"); - - // Set up some generic War Flag Names. - // Example from COD5: CALLSIGN_SEELOW_A is the name of the 1st flag in Selow whose string is "Cottage" - // The string must have MPUI_CALLSIGN_ and _A. Replace Mapname with the name of your map/bsp and in the - // actual string enter a keyword that names the location (Roundhouse, Missle Silo, Launchpad, Guard Tower, etc) - - game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; - game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; - game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; - game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; - game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; - - game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; - game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; - game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; - game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; - game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; - - // collision keeping players from poking their heads into rock - spawncollision("collision_geo_64x64x256","collider",(4790, 1863, 388), (0, 30.8, 0)); - - // collision keeping players from poking their heads into another rock near the allies spawn - spawncollision("collision_geo_32x32x128","collider",(4329, 3735, 144), (0, 0, 0)); - - // collision keeping players from poking their heads into another rock near D2. - spawncollision("collision_geo_32x32x32","collider",(2512, 3818, 113), (0, 45, 0)); - - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); - - level thread startLightning(); -} - - - -startLightning() -{ - while(1) - { - self thread trigger_lightning_exploder(); - wait( 30 + randomfloat(40) ); - //wait (4); - - } -} - - - -trigger_lightning_exploder() -{ - randomExploder = randomint( 4 ); - //randomExploder = 3; - switch( randomExploder ) - { - case 0: - exploder(1001); - playsoundatposition("amb_thunder_clap",( 259.2, -801, 1197 )); - //println ("sound exploder 1"); - break; - case 1: - exploder(1002); - playsoundatposition("amb_thunder_clap",( 2523, -17012, 1174 )); - //println ("sound exploder 2"); - break; - case 2: - exploder(1003); - playsoundatposition("amb_thunder_clap",(6457, -611, 1145)); - //println ("sound exploder 3"); - break; - case 3: - exploder(1004); - playsoundatposition("amb_thunder_clap",(4981, 1335, 890)); - //println ("sound exploder 4"); - break; - } -} diff --git a/mods/patch_mp/maps/mp/mp_zoo.gsc b/mods/patch_mp/maps/mp/mp_zoo.gsc deleted file mode 100644 index 42b0428..0000000 --- a/mods/patch_mp/maps/mp/mp_zoo.gsc +++ /dev/null @@ -1,88 +0,0 @@ -#include maps\mp\_utility; -main() -{ - //needs to be first for create fx - maps\mp\mp_zoo_fx::main(); - - precachemodel("collision_wall_256x256x10"); - precachemodel("collision_geo_32x32x128"); - precachemodel("collision_geo_128x128x10"); - precachemodel("collision_geo_64x64x64"); - - maps\mp\_load::main(); - - maps\mp\mp_zoo_amb::main(); - -// maps\mp\_compass::setupMiniMap("compass_map_mp_zoo"); - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 ) - { - maps\mp\_compass::setupMiniMap("compass_map_mp_zoo_wager"); - } - else - { - maps\mp\_compass::setupMiniMap("compass_map_mp_zoo"); - } - - - // If the team nationalites change in this file, you must also update the level's csc file, - // the level's csv file, and the share/raw/mp/mapsTable.csv - maps\mp\gametypes\_teamset_urbanspecops::level_init(); - - // Set up the default range of the compass - setdvar("compassmaxrange","2100"); - - // Set up some generic War Flag Names. - // Example from COD5: CALLSIGN_SEELOW_A is the name of the 1st flag in Selow whose string is "Cottage" - // The string must have MPUI_CALLSIGN_ and _A. Replace Mapname with the name of your map/bsp and in the - // actual string enter a keyword that names the location (Roundhouse, Missle Silo, Launchpad, Guard Tower, etc) - - game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; - game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; - game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; - game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; - game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; - - game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; - game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; - game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; - game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; - game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; - - // enable new spawning system - maps\mp\gametypes\_spawning::level_use_unified_spawning(true); - - //spawn gates to explain rogue physics collision brush - - gate1 = Spawn("script_model", (1040, 1495, 56) ); - if ( IsDefined(gate1) ) - { - gate1.angles = (0, 270, 0); - gate1 SetModel("p_zoo_bend_gate_mid"); - } - gate2 = Spawn("script_model", (1104, 1495, 56) ); - if ( IsDefined(gate2) ) - { - gate2.angles = (0, 270, 0); - gate2 SetModel("p_zoo_bend_gate_mid"); - } - - // spawn collision for bit of collision above a light in B3 - spawncollision("collision_wall_256x256x10","collider",(876, 2034, 169), (0, 90, 0)); - - // spawn collision to stop players from hiding inside the may-pole. - spawncollision("collision_geo_32x32x128","collider",(49, 832, 66), (0, 0, 0)); - spawncollision("collision_geo_32x32x128","collider",(49, 832, 194), (0, 0, 0)); - - // spawn collision to stop players from hiding inside the may-pole base. - spawncollision("collision_geo_64x64x64","collider",(47, 833, -16), (0, 0, 0)); - spawncollision("collision_geo_64x64x64","collider",(47, 833, -16), (0, 315, 0)); - - // spawn collision to stop players from standing on collision in aviary. - spawncollision("collision_geo_128x128x10","collider",(934, 205, 74), (28.2, 340.6, -38.4)); - - if ( GetDvarInt( #"xblive_wagermatch" ) == 1 || isPregame() ) - { - spawncollision("collision_wall_256x256x10","collider",(-5, 821, 72), (0, 297, 0)); - } - -} diff --git a/mods/patch_mp/mod.csv b/mods/patch_mp/mod.csv deleted file mode 100644 index ab75049..0000000 --- a/mods/patch_mp/mod.csv +++ /dev/null @@ -1,80 +0,0 @@ -rawfile,maps/mp/_dogs.gsc -rawfile,maps/mp/_utility.gsc -rawfile,maps/mp/gametypes/_globallogic_player.gsc -rawfile,maps/mp/gametypes/_globallogic_score.gsc -rawfile,maps/mp/gametypes/_spawning.gsc -rawfile,maps/mp/gametypes/ctf.gsc -rawfile,maps/mp/gametypes/dem.gsc -rawfile,maps/mp/gametypes/dom.gsc -rawfile,maps/mp/gametypes/koth.gsc -rawfile,maps/mp/gametypes/sab.gsc -rawfile,maps/mp/mp_array.gsc -rawfile,maps/mp/mp_cairo.gsc -rawfile,maps/mp/mp_cosmodrome.gsc -rawfile,maps/mp/mp_crisis.gsc -rawfile,maps/mp/mp_duga.gsc -rawfile,maps/mp/mp_firingrange.gsc -rawfile,maps/mp/mp_mountain.gsc -rawfile,maps/mp/mp_nuked.gsc -rawfile,maps/mp/mp_radiation.gsc -rawfile,maps/mp/mp_russianbase.gsc -rawfile,maps/mp/mp_villa.gsc -rawfile,maps/mp/mp_zoo.gsc -rawfile,maps/mp/mp_golfcourse.gsc -rawfile,maps/mp/mp_silo.gsc - -rawfile,clientscripts/mp/_claymore.csc - -menufile,ui_mp/patch.txt -menufile,ui_mp/custom_settings_general.menu -menufile,ui_mp/fileshare_playercard.menu -menufile,ui_mp/after_action_report.menu -menufile,ui_mp/options_multi.menu -menufile,ui_mp/scriptmenus/callvote.menu -menufile,ui_mp/scriptmenus/changeclass.menu -menufile,ui_mp/scriptmenus/class.menu -menufile,ui_mp/hud_hardcore.menu -menufile,ui_mp/players.menu -menufile,ui_mp/hud_team.menu -menufile,ui_mp/hud_ffa.menu -menufile,ui_mp/playercards_clantag.menu -menufile,ui_mp/mods.menu -menufile,ui_mp/cac_custom.menu -menufile,ui_mp/cac_popups.menu -menufile,ui_mp/cac_weapon.menu -menufile,ui_mp/combat_record.menu -menufile,ui_mp/game_mode.menu -menufile,ui_mp/main.menu -menufile,ui_mp/pc_serversettings.menu -menufile,ui_mp/serverbrowser.menu -menufile,ui_mp/custom_game_create.menu -menufile,ui_mp/pc_basictraining.menu - -rawfile,rumble/shotgun_fire_h.rmb -rawfile,rumble/shotgun_fire_l.rmb -rawfile,rumble/silencer_fire_h.rmb -rawfile,rumble/silencer_fire_l.rmb -rawfile,rumble/heavygun_fire_h.rmb -rawfile,rumble/heavygun_fire_l.rmb -rawfile,rumble/smg_fire_h.rmb -rawfile,rumble/smg_fire_l.rmb -rawfile,rumble/assault_fire_h.rmb -rawfile,rumble/assault_fire_l.rmb -rawfile,rumble/flamethrower_h.rmb -rawfile,rumble/flamethrower_l.rmb -rawfile,rumble/damage_heavy_h.rmb -rawfile,rumble/damage_heavy_l.rmb - -menufile,ui/options_graphics_pc.menu -menufile,ui/error.menu - -stringtable,mp/gametypesTable.csv -stringtable,mp/mapsTable.csv -stringtable,mp/attachmentTable.csv - -rawfile,maps/mp/gametypes/_bot.gsc -rawfile,maps/mp/bots/_bot_loadout.gsc -rawfile,maps/mp/bots/_bot_script.gsc -rawfile,maps/mp/bots/_bot_utility.gsc - -menufile,ui_mp/playercards.menu diff --git a/mods/patch_mp/mp/attachmentTable.csv b/mods/patch_mp/mp/attachmentTable.csv deleted file mode 100644 index f6a53cb..0000000 --- a/mods/patch_mp/mp/attachmentTable.csv +++ /dev/null @@ -1,104 +0,0 @@ -a0,b1,c2,d3,e4,f5,g6,h7,i8,j9,k10,l11,m12,n13,o14 -"# Weapon Attachment Data [ DO NOT CHANGE FORMAT, NAME/REFERENCE ARE TO BE UNIQUE IN THE WHOLE TABLE ]",,,,,,,,,,,,,, -# index,# attach point,# group,# name,# reference,# count,# image,# description,# data - string,# data - int ,# data - int2 (binary mask),# data - string - compatible attachments - separated by a space ,# cost of this attachment,#unlock lvl,#unlock plevel -0,none,attachment,MPUI_NO_ATTACHMENT,none,,weapon_missing_image,MPUI_NO_ATTACHMENT_DESC,,0,,,,, -1,top,attachment,MPUI_REFLEX,reflex,,menu_mp_weapons_attach_aimpoint,MPUI_REFLEX_DESC,REFLEX,1,,dualclip extclip grip rf silencer,1000,, -2,top,attachment,MPUI_ELBIT,elbit,,menu_mp_weapons_attach_elbit,MPUI_ELBIT_DESC,ELBIT,2,,dualclip extclip grip rf silencer,1000,, -3,top,attachment,MPUI_ACOG,acog,,menu_mp_weapons_attach_acog,MPUI_ACOG_DESC,ACOG,3,,dualclip extclip grip rf silencer,1000,, -4,top,attachment,MPUI_LPS,lps,,menu_mp_weapons_attach_lps,MPUI_LPS_DESC,LPS,4,,,2000,, -5,top,attachment,MPUI_VZOOM,vzoom,,menu_mp_weapons_attach_vzoom,MPUI_VZOOM_DESC,VZOOM,5,,extclip silencer,2000,, -6,top,attachment,MPUI_IR,ir,,menu_mp_weapons_attach_ir,MPUI_IR_DESC,IR,6,,dualclip extclip grip silencer,2000,, -7,bottom,attachment,MPUI_GL,gl,,menu_mp_weapons_attach_grenade_launcher,MPUI_GL_DESC,GL,7,,,3000,, -8,bottom,attachment,MPUI_MK,mk,,menu_mp_weapons_attach_masterkey,MPUI_MK_DESC,MK,8,,,1000,, -9,muzzle,attachment,MPUI_SILENCER,silencer,,menu_mp_weapons_attach_silencer,MPUI_SILENCER_DESC,SILENCER,9,,acog dualclip elbit extclip grip ir reflex rf upgradesight vzoom,2000,, -10,bottom,attachment,MPUI_GRIP,grip,,menu_mp_weapons_attach_grip,MPUI_GRIP_DESC,GRIP,10,,acog dualclip elbit extclip ir reflex rf silencer,1000,, -11,trigger,attachment,MPUI_EXTCLIP,extclip,,menu_mp_weapons_attach_extend_clip,MPUI_EXTCLIP_DESC,EXTCLIP,11,,acog elbit grip ir reflex rf silencer upgradesight vzoom,1000,, -12,trigger,attachment,MPUI_DUALCLIP,dualclip,,menu_mp_weapons_attach_dual_clip,MPUI_DUALCLIP_DESC,DUALCLIP,12,,acog elbit grip ir reflex rf silencer,1000,, -13,trigger,attachment,MPUI_SADDLE,saddle,,weapon_missing_image,MPUI_SADDLE_DESC,SADDLE,13,,,,, -14,trigger,attachment,MPUI_FMJ,fmj,,weapon_missing_image,MPUI_FMJ_DESC,FMJ,14,,,,, -15,trigger,attachment,MPUI_HP,hp,,weapon_missing_image,MPUI_HP_DESC,HP,15,,,,, -16,trigger,attachment,MPUI_RF,rf,,menu_mp_weapons_attach_rof,MPUI_RF_DESC,RF,16,,acog dualclip elbit extclip grip reflex silencer,3000,, -17,bottom,attachment,MPUI_FT,ft,,menu_mp_weapons_attach_flamethrower,MPUI_FT_DESC,FT,17,,,1000,, -18,bottom,attachment,MPUI_BAYONET,bayonet,,weapon_missing_image,MPUI_BAYONET_DESC,BAYONET,18,,,,, -19,trigger,attachment,MPUI_AUTO,auto,,menu_mp_weapons_attach_auto,MPUI_AUTO_DESC,auto,19,,,2000,, -20,trigger,attachment,MPUI_SPEED,speed,,menu_mp_weapons_attach_reload,MPUI_SPEED_DESC,speed,20,,,1000,, -21,top,attachment,MPUI_UPGRADESIGHT,upgradesight,,menu_mp_weapons_attach_upgradesight,MPUI_UPGRADESIGHT_DESC,upgradesight,21,,,250,, -22,muzzle,attachment,MPUI_SNUB,snub,,menu_mp_weapons_attach_snub,MPUI_SNUB_DESC,snub,22,,,500,, -23,bottom,attachment,MPUI_DW,dw,,weapon_missing_image,MPUI_DW_DESC,dw,23,,,1000,, -0,camo,weaponoption,MPUI_NONE,camo_none,,weapon_missing_image,MPUI_NONE,,,,,,, -1,camo,weaponoption,MPUI_CAMO_DUSTY,camo_dusty,,menu_mp_weapons_camo_dusty,MPUI_CAMO_DUSTY,,,,,250,, -2,camo,weaponoption,MPUI_CAMO_ICE,camo_ice,,menu_mp_weapons_camo_icy,MPUI_CAMO_ICE,,,,,250,, -3,camo,weaponoption,MPUI_CAMO_RED,cammo_red,,menu_mp_weapons_camo_mass,MPUI_CAMO_RED,,,,,250,, -4,camo,weaponoption,MPUI_CAMO_OLIVE,camo_od,,menu_mp_weapons_camo_olive,MPUI_CAMO_OLIVE,,,,,250,, -5,camo,weaponoption,MPUI_CAMO_NEVADA,camo_desert_nevada,,menu_mp_weapons_camo_nevada,MPUI_CAMO_NEVADA,,,,,250,, -6,camo,weaponoption,MPUI_CAMO_SAHARA,camo_desert_sahara,,menu_mp_weapons_camo_sahara,MPUI_CAMO_SAHARA,,,,,250,, -7,camo,weaponoption,MPUI_CAMO_ERDL,camo_jungle_erdl,,menu_mp_weapons_camo_erdl,MPUI_CAMO_ERDL,,,,,250,, -8,camo,weaponoption,MPUI_CAMO_TIGER,camo_jungle_tiger,,menu_mp_weapons_camo_tiger,MPUI_CAMO_TIGER,,,,,250,, -9,camo,weaponoption,MPUI_CAMO_BERLIN,camo_urban_german,,menu_mp_weapons_camo_berlin,MPUI_CAMO_BERLIN,,,,,250,, -10,camo,weaponoption,MPUI_CAMO_WARSAW,camo_urban_warsaw,,menu_mp_weapons_camo_warsaw,MPUI_CAMO_WARSAW,,,,,250,, -11,camo,weaponoption,MPUI_CAMO_SIBERIA,camo_winter_siberia,,menu_mp_weapons_camo_siberia,MPUI_CAMO_SIBERIA,,,,,250,, -12,camo,weaponoption,MPUI_CAMO_YUKON,camo_winter_yukon,,menu_mp_weapons_camo_yukon,MPUI_CAMO_YUKON,,,,,250,, -13,camo,weaponoption,MPUI_CAMO_WOODLAND,camo_woodland,,menu_mp_weapons_camo_wood,MPUI_CAMO_WOODLAND,,,,,250,, -14,camo,weaponoption,MPUI_CAMO_FLORA,camo_woodland_flora,,menu_mp_weapons_camo_flora,MPUI_CAMO_FLORA,,,,,250,, -15,camo,weaponoption,MPUI_CAMO_GOLD,camo_gold,,menu_mp_weapons_camo_gold,MPUI_CAMO_GOLD,,,,,50000,,14 -16,lens,weaponoption,MPUI_LENS_DEFAULT,,,,,,,,,,, -17,lens,weaponoption,MPUI_LENS_RED,,,,,,,,,500,, -18,lens,weaponoption,MPUI_LENS_BLUE,,,,,,,,,500,, -19,lens,weaponoption,MPUI_LENS_GREEN,,,,,,,,,500,, -20,lens,weaponoption,MPUI_LENS_ORANGE,,,,,,,,,500,, -21,lens,weaponoption,MPUI_LENS_YELLOW,,,,,,,,,500,, -22,reticle,weaponoption,MPUI_RETICLE_DEFAULT,,,menu_mp_reticle_red_dot_main,,,,,,,, -23,reticle,weaponoption,MPUI_RETICLE_1,,,menu_mp_reticle_circle_split01,,,,,,500,, -24,reticle,weaponoption,MPUI_RETICLE_2,,,menu_mp_reticle_lines_dots01,,,,,,500,, -25,reticle,weaponoption,MPUI_RETICLE_3,,,menu_mp_reticle_circles05,,,,,,500,, -26,reticle,weaponoption,MPUI_RETICLE_4,,,menu_mp_reticle_happyface01,,,,,,500,, -27,reticle,weaponoption,MPUI_RETICLE_ARROWS02,,,menu_mp_reticle_arrows02,,,,,,500,, -28,reticle,weaponoption,MPUI_RETICLE_ARROWS01,,,menu_mp_reticle_arrows01,,,,,,500,, -29,reticle,weaponoption,MPUI_RETICLE_ARROWS03,,,menu_mp_reticle_arrows03,,,,,,500,, -30,reticle,weaponoption,MPUI_RETICLE_BONES,,,menu_mp_reticle_bones,,,,,,500,, -31,reticle,weaponoption,MPUI_RETICLE_BURST01,,,menu_mp_reticle_burst01,,,,,,500,, -32,reticle,weaponoption,MPUI_RETICLE_CIRCLES01,,,menu_mp_reticle_circles01,,,,,,500,, -33,reticle,weaponoption,MPUI_RETICLE_CIRCLES02,,,menu_mp_reticle_circles02,,,,,,500,, -34,reticle,weaponoption,MPUI_RETICLE_CIRCLES03,,,menu_mp_reticle_circles03,,,,,,500,, -35,reticle,weaponoption,MPUI_RETICLE_CIRCLES04,,,menu_mp_reticle_circles04,,,,,,500,, -36,reticle,weaponoption,MPUI_RETICLE_CIRCLES_LINES01,,,menu_mp_reticle_circles_lines01,,,,,,500,, -37,reticle,weaponoption,MPUI_RETICLE_CIRCLES_LINES02,,,menu_mp_reticle_circles_lines02,,,,,,500,, -38,reticle,weaponoption,MPUI_RETICLE_CIRCLES_LINES03,,,menu_mp_reticle_circles_lines03,,,,,,500,, -39,reticle,weaponoption,MPUI_RETICLE_CIRCLES_TRIANGLES01,,,menu_mp_reticle_circles_triangles01,,,,,,500,, -40,reticle,weaponoption,MPUI_RETICLE_CIRCLES_TRIANGLES02,,,menu_mp_reticle_circles_triangles02,,,,,,500,, -41,reticle,weaponoption,MPUI_RETICLE_CROSS01,,,menu_mp_reticle_cross01,,,,,,500,, -42,reticle,weaponoption,MPUI_RETICLE_CROSS02,,,menu_mp_reticle_cross02,,,,,,500,, -43,reticle,weaponoption,MPUI_RETICLE_CROSS03,,,menu_mp_reticle_cross03,,,,,,500,, -44,reticle,weaponoption,MPUI_RETICLE_CROSS04,,,menu_mp_reticle_cross04,,,,,,500,, -45,reticle,weaponoption,MPUI_RETICLE_CROSS05,,,menu_mp_reticle_cross05,,,,,,500,, -46,reticle,weaponoption,MPUI_RETICLE_DIAMOND01,,,menu_mp_reticle_diamond01,,,,,,500,, -47,reticle,weaponoption,MPUI_RETICLE_DIAMOND02,,,menu_mp_reticle_diamond02,,,,,,500,, -48,reticle,weaponoption,MPUI_RETICLE_HEART,,,menu_mp_reticle_heart,,,,,,500,, -49,reticle,weaponoption,MPUI_RETICLE_RADIATION,,,menu_mp_reticle_radiation,,,,,,500,, -50,reticle,weaponoption,MPUI_RETICLE_SKULL01,,,menu_mp_reticle_skull01,,,,,,500,, -51,reticle,weaponoption,MPUI_RETICLE_SQUARE01,,,menu_mp_reticle_square01,,,,,,500,, -52,reticle,weaponoption,MPUI_RETICLE_SQUARE02,,,menu_mp_reticle_square02,,,,,,500,, -53,reticle,weaponoption,MPUI_RETICLE_SQUARES_CROSS,,,menu_mp_reticle_squares_cross01,,,,,,500,, -54,reticle,weaponoption,MPUI_RETICLE_STAR01,,,menu_mp_reticle_star01,,,,,,500,, -55,reticle,weaponoption,MPUI_RETICLE_THREEDOTS01,,,menu_mp_reticle_three_dots,,,,,,500,, -56,reticle,weaponoption,MPUI_RETICLE_TREYARCH,,,menu_mp_reticle_treyarch,,,,,,500,, -57,reticle,weaponoption,MPUI_RETICLE_TRIANGLE01,,,menu_mp_reticle_triangle01,,,,,,500,, -58,reticle,weaponoption,MPUI_RETICLE_TRIANGLE02,,,menu_mp_reticle_triangle02,,,,,,500,, -59,reticle,weaponoption,MPUI_RETICLE_X01,,,menu_mp_reticle_x01,,,,,,500,, -60,reticle,weaponoption,MPUI_RETICLE_X02,,,menu_mp_reticle_x02,,,,,,500,, -61,reticle,weaponoption,MPUI_RETICLE_YINGYANG,,,menu_mp_reticle_yinyang,,,,,,500,, -62,tag,weaponoption,FEATURE_GUN_TAG,tag,,,,,,,,1000,, -63,emblem,weaponoption,FEATURE_GUN_EMBLEM,emblem,,,,,,,,1000,, -64,tag,weaponoption,FEATURE_SECOND_ATTACHMENT,2ndattach,,,,,,,,3000,, -65,reticle_color,weaponoption,MPUI_RETICLE_COLOR_1,,,,,,,,,,, -66,reticle_color,weaponoption,MPUI_RETICLE_COLOR_2,,,,,,,,,250,, -67,reticle_color,weaponoption,MPUI_RETICLE_COLOR_3,,,,,,,,,250,, -68,reticle_color,weaponoption,MPUI_RETICLE_COLOR_4,,,,,,,,,250,, -69,reticle_color,weaponoption,MPUI_RETICLE_COLOR_5,,,,,,,,,250,, -70,reticle_color,weaponoption,MPUI_RETICLE_COLOR_6,,,,,,,,,250,, -71,reticle_color,weaponoption,MPUI_RETICLE_COLOR_7,,,,,,,,,250,, -0,none,point,MPUI_NONE,none,,weapon_missing_image,MPUI_NO_ATTACHMENT_DESC,,,,,,, -1,none,point,MENU_ATTACH_POINT_TOP,top,,,MENU_ATTACH_POINT_TOP_DESC,,,,,,, -2,none,point,MENU_ATTACH_POINT_BOTTOM,bottom,,,MENU_ATTACH_POINT_BOTTOM_DESC,,,,,,, -3,none,point,MENU_ATTACH_POINT_TRIGGER,trigger,,,MENU_ATTACH_POINT_TRIGGER_DESC,,,,,,, -4,none,point,MENU_ATTACH_POINT_MUZZLE,muzzle,,,MENU_ATTACH_POINT_MUZZLE_DESC,,,,,,, diff --git a/mods/patch_mp/mp/gametypesTable.csv b/mods/patch_mp/mp/gametypesTable.csv deleted file mode 100644 index bae1af6..0000000 --- a/mods/patch_mp/mp/gametypesTable.csv +++ /dev/null @@ -1,63 +0,0 @@ -#Gametypes Table,,,,,, -a0,b1,c2,d3,e4,f5,g6 -maxnum_gametype,12,,,,, -total_filesharegametype,12,,,,, -#gametype reference,#gametype names,#gametype description,#image,#index,#splitscreen,#gametime names lowercase -tdm,MPUI_TEAM_DEATHMATCH_CAPS,MENU_KILL_PLAYERS_ON_THE_OPPOSING,playlist_tdm,0,YES,MPUI_TEAM_DEATHMATCH -dm,MPUI_DEATHMATCH_CAPS,MENU_KILL_EVERYONE_FIRST_PLAYER,playlist_ffa,1,YES,MPUI_DEATHMATCH -sd,MPUI_SEARCH_AND_DESTROY_CAPS,MENU_TEAMS_TAKE_TURNS_DEFENDING_NO_SPAWN,playlist_search_destroy,2,YES,MPUI_SEARCH_AND_DESTROY_CLASSIC -dom,MPUI_DOMINATION_CAPS,MENU_CAPTURE_AND_HOLD_THE,playlist_domination,3,YES,MPUI_DOMINATION -koth,MPUI_HEADQUARTERS_CAPS,MENU_CAPTURE_THE_HEADQUARTERS,playlist_headquarters,4,YES,MPUI_HEADQUARTERS -dem,MPUI_DEMOLITION_CAPS,MENU_TEAMS_TAKE_TURNS_DEFENDING,playlist_demolition,5,YES,MPUI_DEMOLITION -ctf,MPUI_CAPTURE_THE_FLAG_CAPS,MENU_CTF_DESC,playlist_ctf,6,YES,MPUI_CAPTURE_THE_FLAG -sab,MPUI_SABOTAGE_CAPS,MENU_1_BOMB_IN_THE_CENTER,playlist_sabotage,7,YES,MPUI_SABOTAGE -hlnd,MPUI_HLND_CAPS,MENU_KILL_EVERYONE_FIRST_PLAYER,playlist_ffa,8,YES,MPUI_HLND -oic,MPUI_OIC_CAPS,MENU_KILL_EVERYONE_FIRST_PLAYER,playlist_ffa,9,YES,MPUI_OIC -gun,MPUI_GUN_CAPS,MENU_KILL_EVERYONE_FIRST_PLAYER,playlist_gungame,10,YES,MPUI_GUN -shrp,MPUI_SHRP_CAPS,MENU_KILL_EVERYONE_FIRST_PLAYER,playlist_sharpshooter,11,YES,MPUI_SHRP -,,,,,, -maxnum_basictraining_gametype,14,,,,, -#gametype reference,#gametype names,#gametype description,#image,#index,#splitscreen,#gametime names lowercase -tdm,MPUI_TEAM_DEATHMATCH_CAPS,MENU_KILL_PLAYERS_ON_THE_OPPOSING,playlist_tdm,bt0,YES,MPUI_TEAM_DEATHMATCH -hc_tdm,MPUI_TDM_HARDCORE_CAPS,MENU_HC_KILL_PLAYERS_ON_THE_OPPOSING,playlist_tdm,bt1,YES,MPUI_TEAM_DEATHMATCH -dm,MPUI_DEATHMATCH_CAPS,MENU_KILL_EVERYONE_FIRST_PLAYER,playlist_ffa,bt2,YES,MPUI_DEATHMATCH -hc_dm,MPUI_DM_HARDCORE_CAPS,MENU_HC_KILL_EVERYONE_FIRST_PLAYER,playlist_ffa,bt3,YES,MPUI_DEATHMATCH -sd,MPUI_SEARCH_AND_DESTROY_CAPS,MENU_TEAMS_TAKE_TURNS_DEFENDING_NO_SPAWN,playlist_search_destroy,bt4,YES,MPUI_SEARCH_AND_DESTROY_CLASSIC -dom,MPUI_DOMINATION_CAPS,MENU_CAPTURE_AND_HOLD_THE,playlist_domination,bt5,YES,MPUI_DOMINATION -koth,MPUI_HEADQUARTERS_CAPS,MENU_CAPTURE_THE_HEADQUARTERS,playlist_headquarters,bt6,YES,MPUI_HEADQUARTERS -dem,MPUI_DEMOLITION_CAPS,MENU_TEAMS_TAKE_TURNS_DEFENDING,playlist_demolition,bt7,YES,MPUI_DEMOLITION -ctf,MPUI_CAPTURE_THE_FLAG_CAPS,MENU_CTF_DESC,playlist_ctf,bt8,YES,MPUI_CAPTURE_THE_FLAG -sab,MPUI_SABOTAGE_CAPS,MENU_1_BOMB_IN_THE_CENTER,playlist_sabotage,bt9,YES,MPUI_SABOTAGE -hlnd,MPUI_HLND_CAPS,MENU_KILL_EVERYONE_FIRST_PLAYER,playlist_ffa,bt10,YES,MPUI_HLND -oic,MPUI_OIC_CAPS,MENU_KILL_EVERYONE_FIRST_PLAYER,playlist_ffa,bt11,YES,MPUI_OIC -gun,MPUI_GUN_CAPS,MENU_KILL_EVERYONE_FIRST_PLAYER,playlist_gungame,bt12,YES,MPUI_GUN -shrp,MPUI_SHRP_CAPS,MENU_KILL_EVERYONE_FIRST_PLAYER,playlist_sharpshooter,bt13,YES,MPUI_SHRP -,,,,,, -maxnum_lbtype,11,,,,, -#Leaderboard string names,,,,,, -#num,#lb_type ref,#lb gametype names,#gametype names,,#lb index, -0,tdm,MPUI_LB_TEAM_DEATHMATCH_CAPS,MPUI_TEAM_DEATHMATCH_CAPS,,0, -1,dm,MPUI_LB_FFA_CAPS,MPUI_DEATHMATCH_CAPS,,1, -2,sd,MPUI_LB_SEARCH_AND_DESTROY_CAPS,MPUI_SEARCH_AND_DESTROY_CAPS,,5, -3,dom,MPUI_LB_DOMINATION_CAPS,MPUI_DOMINATION_CAPS,,3, -4,koth,MPUI_LB_HEADQUARTERS_CAPS,MPUI_HEADQUARTERS_CAPS,,6, -5,dem,MPUI_LB_DEMOLITION_CAPS,MPUI_DEMOLITION_CAPS,,7, -6,ctf,MPUI_LB_CAPTURE_THE_FLAG_CAPS,MPUI_CAPTURE_THE_FLAG_CAPS,,2, -7,sab,MPUI_LB_SABOTAGE_CAPS,MPUI_SABOTAGE_CAPS,,4, -8,hctdm,MPUI_LB_TEAM_DEATHMATCH_HC_CAPS,MPUI_HCTDM_CAPS,,8, -9,hcdm,MPUI_LB_FFA_HC_CAPS,MPUI_HCDM_CAPS,,9, -10,hcsd,MPUI_LB_SEARCH_AND_DESTROY_HC_CAPS,MPUI_HCSD_CAPS,,13, -,,,,,, -,,,,,, -#Leaderboard reset period names,,,,,, -#lb_typeByResetPeriod ref,#resetperiod names,#index,,,, -all_time,MPUI_LB_ALL_TIME_CAPS,0,,,, -monthly,MPUI_LB_MONTHLY_CAPS,1,,,, -weekly,MPUI_LB_WEEKLY_CAPS,2,,,, -,,,,,, -,,,,,, -#Leaderboard filter names,,,,,, -#lb_filter ref,#filter names,#index,,,, -none,MPUI_LB_EVERYONE_CAPS,0,,,, -friends,MPUI_LB_FRIENDS_ONLY_CAPS,1,,,, -lobbymembers,MPUI_LB_PLAYERS_IN_LOBBY_CAPS,2,,,, diff --git a/mods/patch_mp/mp/mapsTable.csv b/mods/patch_mp/mp/mapsTable.csv deleted file mode 100644 index 74c8b55..0000000 --- a/mods/patch_mp/mp/mapsTable.csv +++ /dev/null @@ -1,31 +0,0 @@ -# Map Data Table,,,,,,,,,,,,,,, -a0,b1,c2,d3,e4,f5,g6,h7,i8,j9,k10,,,,, -maxnum_map,26,,,,,,,,,,,,,, -#mapname,#allies characters,#axis characters,#mapname,#mapimage,#index,#description,#mapoverlay,#map size description,#vehicles,#splitscreen,#dlc map,,,, -,,,,,,,,,,,,,,, -mp_array,winterspecops,winterspecops,MPUI_array,menu_mp_array_map_select_final,0,MPUI_DESC_MAP_array,compass_overlay_map_array,LARGE,NO,YES,0,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_cracked,junglemarines,junglemarines,MPUI_CRACKED,menu_mp_cracked_map_select_final,1,MPUI_DESC_MAP_CRACKED,compass_overlay_map_cracked,LARGE,NO,YES,0,MPUI_MARINE_SHORT,MPUI_NVA_SHORT,sog,nva -mp_crisis,cubans,cubans,MPUI_CRISIS,menu_mp_crisis_map_select_final,2,MPUI_DESC_MAP_CRISIS,compass_overlay_map_crisis,MEDIUM,NO,YES,0,MPUI_REBELS_SHORT,MPUI_TROPAS_SHORT,op40,tropas -mp_firingrange,cubans,cubans,MPUI_firingrange,menu_mp_firingrange_map_select_final,3,MPUI_DESC_MAP_firingrange,compass_overlay_map_firingrange,SMALL,NO,YES,0,MPUI_REBELS_SHORT,MPUI_TROPAS_SHORT,op40,tropas -mp_duga,winterspecops,winterspecops,MPUI_DUGA,menu_mp_duga_map_select_final,4,MPUI_DESC_MAP_DUGA,compass_overlay_map_duga,MEDIUM,NO,YES,0,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_hanoi,junglemarines,junglemarines,MPUI_HANOI,menu_mp_hanoi_map_select_final,5,MPUI_DESC_MAP_HANOI,compass_overlay_map_hanoi,MEDIUM,NO,YES,0,MPUI_MARINE_SHORT,MPUI_NVA_SHORT,sog,nva -mp_cairo,cubans,cubans,MPUI_CAIRO,menu_mp_cairo_map_select_final,6,MPUI_DESC_MAP_CAIRO,compass_overlay_map_cairo,MEDIUM,NO,YES,0,MPUI_REBELS_SHORT,MPUI_TROPAS_SHORT,op40,tropas -mp_havoc,junglemarines,junglemarines,MPUI_HAVOC,menu_mp_havoc_map_select_final,7,MPUI_DESC_MAP_HAVOC,compass_overlay_map_havoc,LARGE,NO,YES,0,MPUI_MARINE_SHORT,MPUI_NVA_SHORT,sog,nva -mp_cosmodrome,urbanspecops,urbanspecops,MPUI_COSMODROME,menu_mp_cosmodrome_map_select_final,8,MPUI_DESC_MAP_COSMODROME,compass_overlay_map_cosmodrome,MEDIUM,NO,YES,0,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_nuked,urbanspecops,urbanspecops,MPUI_NUKED,menu_mp_nuked_map_select_final,9,MPUI_DESC_MAP_NUKED,compass_overlay_map_nuked,SMALL,NO,YES,0,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_radiation,urbanspecops,urbanspecops,MPUI_RADIATION,menu_mp_radiation_map_select_final,10,MPUI_DESC_MAP_RADIATION,compass_overlay_map_radiation,MEDIUM,NO,YES,0,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_mountain,winterspecops,winterspecops,MPUI_MOUNTAIN,menu_mp_mountain_map_select_final,11,MPUI_DESC_MAP_MOUNTAIN,compass_overlay_map_mountain,MEDIUM,NO,YES,0,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_villa,cubans,cubans,MPUI_villa,menu_mp_villa_map_select_final,12,MPUI_DESC_MAP_villa,compass_overlay_map_villa,MEDIUM,NO,YES,0,MPUI_REBELS_SHORT,MPUI_TROPAS_SHORT,op40,tropas -mp_russianbase,winterspecops,winterspecops,MPUI_russianbase,menu_mp_russianbase_map_select_final,13,MPUI_DESC_MAP_russianbase,compass_overlay_map_russianbase,LARGE,NO,YES,0,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_berlinwall2,urbanspecops,urbanspecops,MPUI_BERLINWALL2,menu_mp_berlinwall2_map_select_final,14,MPUI_DESC_MAP_BERLINWALL2,compass_overlay_map_berlinwall2,MEDIUM,NO,YES,2,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_discovery,winterspecops,winterspecops,MPUI_DISCOVERY,menu_mp_discovery_map_select_final,15,MPUI_DESC_MAP_DISCOVERY,compass_overlay_map_discovery2,MEDIUM,NO,YES,2,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_kowloon,urbanspecops,urbanspecops,MPUI_KOWLOON,menu_mp_kowloon_map_select_final,16,MPUI_DESC_MAP_KOWLOON,compass_overlay_map_kowloon,MEDIUM,NO,YES,2,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_stadium,urbanspecops,urbanspecops,MPUI_STADIUM,menu_mp_stadium_map_select_final,17,MPUI_DESC_MAP_STADIUM,compass_overlay_map_stadium,MEDIUM,NO,YES,2,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_gridlock,urbanspecops,urbanspecops,MPUI_GRIDLOCK,menu_mp_gridlock_map_select_final,18,MPUI_DESC_MAP_GRIDLOCK,compass_overlay_map_convoy,MEDIUM,NO,YES,3,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_hotel,cubans,cubans,MPUI_HOTEL,menu_mp_hotel_map_select_final,19,MPUI_DESC_MAP_HOTEL,compass_overlay_map_hotel2,MEDIUM,NO,YES,3,MPUI_REBELS_SHORT,MPUI_TROPAS_SHORT,op40,tropas -mp_outskirts,winterspecops,winterspecops,MPUI_OUTSKIRTS,menu_mp_outskirts_map_select_final,20,MPUI_DESC_MAP_OUTSKIRTS,compass_overlay_map_stockpile,MEDIUM,NO,YES,3,MPUI_MARINE_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_zoo,urbanspecops,urbanspecops,MPUI_ZOO,menu_mp_zoo_map_select_final,21,MPUI_DESC_MAP_ZOO,compass_overlay_map_zoo,MEDIUM,NO,YES,3,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_silo,urbanspecops,urbanspecops,MPUI_SILO,menu_mp_silo_map_select_final,22,MPUI_DESC_MAP_SILO,compass_overlay_map_silo,MEDIUM,NO,YES,4,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_golfcourse,cubans,cubans,MPUI_GOLFCOURSE,menu_mp_golfcourse_map_select_final,23,MPUI_DESC_MAP_GOLFCOURSE,compass_overlay_map_golfcourse,MEDIUM,NO,YES,4,MPUI_REBELS_SHORT,MPUI_TROPAS_SHORT,op40,tropas -mp_drivein,urbanspecops,urbanspecops,MPUI_DRIVEIN,menu_mp_drivein_map_select_final,24,MPUI_DESC_MAP_DRIVEIN,compass_overlay_map_drivein,MEDIUM,NO,YES,4,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets -mp_area51,urbanspecops,urbanspecops,MPUI_AREA51,menu_mp_area51_map_select_final,25,MPUI_DESC_MAP_AREA51,compass_overlay_map_area51,MEDIUM,NO,YES,4,MPUI_SPECOPS_SHORT,MPUI_RUSSIAN_SHORT,ops,spets diff --git a/mods/patch_mp/rumble/assault_fire_h.rmb b/mods/patch_mp/rumble/assault_fire_h.rmb deleted file mode 100644 index 149c63a..0000000 --- a/mods/patch_mp/rumble/assault_fire_h.rmb +++ /dev/null @@ -1,10 +0,0 @@ -RUMBLEGRAPHFILE - -7 -0.0000 0.5259 -0.1303 0.4762 -0.2821 0.3148 -0.4742 0.1540 -0.6613 0.0590 -0.8340 0.0150 -1.0000 0.0000 diff --git a/mods/patch_mp/rumble/assault_fire_l.rmb b/mods/patch_mp/rumble/assault_fire_l.rmb deleted file mode 100644 index 678ba4f..0000000 --- a/mods/patch_mp/rumble/assault_fire_l.rmb +++ /dev/null @@ -1,7 +0,0 @@ -RUMBLEGRAPHFILE - -4 -0.0000 1.0000 -0.3991 1.0000 -0.4041 0.0000 -1.0000 0.0000 diff --git a/mods/patch_mp/rumble/damage_heavy_h.rmb b/mods/patch_mp/rumble/damage_heavy_h.rmb deleted file mode 100644 index ee2bed0..0000000 --- a/mods/patch_mp/rumble/damage_heavy_h.rmb +++ /dev/null @@ -1,6 +0,0 @@ -RUMBLEGRAPHFILE - -3 -0.0000 0.5000 -0.1050 0.3000 -1.0000 0.0000 diff --git a/mods/patch_mp/rumble/damage_heavy_l.rmb b/mods/patch_mp/rumble/damage_heavy_l.rmb deleted file mode 100644 index d4b6b80..0000000 --- a/mods/patch_mp/rumble/damage_heavy_l.rmb +++ /dev/null @@ -1,7 +0,0 @@ -RUMBLEGRAPHFILE - -4 -0.0000 1.0000 -0.1250 1.0000 -0.4300 0.0000 -1.0000 0.0000 diff --git a/mods/patch_mp/rumble/flamethrower_h.rmb b/mods/patch_mp/rumble/flamethrower_h.rmb deleted file mode 100644 index b681b7f..0000000 --- a/mods/patch_mp/rumble/flamethrower_h.rmb +++ /dev/null @@ -1,5 +0,0 @@ -RUMBLEGRAPHFILE - -2 -0.0000 0.2399 -1.0000 0.2397 diff --git a/mods/patch_mp/rumble/flamethrower_l.rmb b/mods/patch_mp/rumble/flamethrower_l.rmb deleted file mode 100644 index 87ab6ce..0000000 --- a/mods/patch_mp/rumble/flamethrower_l.rmb +++ /dev/null @@ -1,5 +0,0 @@ -RUMBLEGRAPHFILE - -2 -0.0000 0.0000 -1.0000 0.0000 diff --git a/mods/patch_mp/rumble/heavygun_fire_h.rmb b/mods/patch_mp/rumble/heavygun_fire_h.rmb deleted file mode 100644 index 8117833..0000000 --- a/mods/patch_mp/rumble/heavygun_fire_h.rmb +++ /dev/null @@ -1,10 +0,0 @@ -RUMBLEGRAPHFILE - -7 -0.0000 0.4109 -0.1192 0.3717 -0.2806 0.2431 -0.4579 0.1533 -0.6595 0.0449 -0.8328 0.0152 -1.0000 0.0000 diff --git a/mods/patch_mp/rumble/heavygun_fire_l.rmb b/mods/patch_mp/rumble/heavygun_fire_l.rmb deleted file mode 100644 index 608d6d9..0000000 --- a/mods/patch_mp/rumble/heavygun_fire_l.rmb +++ /dev/null @@ -1,7 +0,0 @@ -RUMBLEGRAPHFILE - -4 -0.0000 1.0000 -0.3200 1.0000 -0.3250 0.0000 -1.0000 0.0000 diff --git a/mods/patch_mp/rumble/shotgun_fire_h.rmb b/mods/patch_mp/rumble/shotgun_fire_h.rmb deleted file mode 100644 index 9ab95bd..0000000 --- a/mods/patch_mp/rumble/shotgun_fire_h.rmb +++ /dev/null @@ -1,7 +0,0 @@ -RUMBLEGRAPHFILE - -4 -0.0000 0.1641 -0.2265 0.1314 -0.6077 0.0270 -1.0000 0.0000 diff --git a/mods/patch_mp/rumble/shotgun_fire_l.rmb b/mods/patch_mp/rumble/shotgun_fire_l.rmb deleted file mode 100644 index 5aaa46b..0000000 --- a/mods/patch_mp/rumble/shotgun_fire_l.rmb +++ /dev/null @@ -1,7 +0,0 @@ -RUMBLEGRAPHFILE - -4 -0.0000 1.0000 -0.3851 1.0000 -0.5701 0.1200 -1.0000 0.0000 diff --git a/mods/patch_mp/rumble/silencer_fire_h.rmb b/mods/patch_mp/rumble/silencer_fire_h.rmb deleted file mode 100644 index c070a4a..0000000 --- a/mods/patch_mp/rumble/silencer_fire_h.rmb +++ /dev/null @@ -1,8 +0,0 @@ -RUMBLEGRAPHFILE - -5 -0.0000 0.5405 -0.2518 0.4860 -0.4920 0.1496 -0.7479 0.0328 -1.0000 0.0000 diff --git a/mods/patch_mp/rumble/silencer_fire_l.rmb b/mods/patch_mp/rumble/silencer_fire_l.rmb deleted file mode 100644 index db328d4..0000000 --- a/mods/patch_mp/rumble/silencer_fire_l.rmb +++ /dev/null @@ -1,7 +0,0 @@ -RUMBLEGRAPHFILE - -4 -0.0000 0.4000 -0.1196 0.3470 -0.1565 0.0058 -1.0000 0.0000 diff --git a/mods/patch_mp/rumble/smg_fire_h.rmb b/mods/patch_mp/rumble/smg_fire_h.rmb deleted file mode 100644 index 6a1764b..0000000 --- a/mods/patch_mp/rumble/smg_fire_h.rmb +++ /dev/null @@ -1,8 +0,0 @@ -RUMBLEGRAPHFILE - -5 -0.0000 0.4800 -0.2300 0.3600 -0.5460 0.0999 -0.8061 0.0064 -1.0000 0.0000 diff --git a/mods/patch_mp/rumble/smg_fire_l.rmb b/mods/patch_mp/rumble/smg_fire_l.rmb deleted file mode 100644 index 9f630d4..0000000 --- a/mods/patch_mp/rumble/smg_fire_l.rmb +++ /dev/null @@ -1,7 +0,0 @@ -RUMBLEGRAPHFILE - -4 -0.0000 0.4830 -0.1365 0.4703 -0.1447 0.0000 -1.0000 0.0000 diff --git a/mods/patch_mp/ui/error.menu b/mods/patch_mp/ui/error.menu deleted file mode 100644 index 460d5d6..0000000 --- a/mods/patch_mp/ui/error.menu +++ /dev/null @@ -1,907 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" - -#define CHOICE_X_START 0 -#define CHOICE_Y_START 34 - -#define CHOICE_GROUP "errors" - -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" - -#include "ui_mp/popupstyle.inc" -#include "ui/choices_setup_popmenu.menu" - -#undef CHOICE_FOCUS_SOUND -#define CHOICE_FOCUS_SOUND "uin_navigation_over" - -#define OPEN_WAGER_FAIL_IF_NEEDED \ - if ( getDStat( "AfterActionReportStats", "wagerMatchFailed" ) == 1 ) \ - { \ - open error_wagerfail; \ - } - -#define ERROR_ONESC \ - uiScript clearError; \ - close self; \ - OPEN_WAGER_FAIL_IF_NEEDED \ - execNow if( !menuisopen( main ) ) openmenu main; - -#define ERROR_ACTION \ - play CHOICE_FOCUS_SOUND; \ - uiScript clearError; \ - ERROR_ONESC - -#define ERROR_CONTINUE \ - play CHOICE_FOCUS_SOUND; \ - uiScript clearError; \ - close self; \ - uiScript loadSaveGameMap; - - -{ - menuDef - { - name fullscreen_error - fullscreen 1 - rect 0 0 640 480 // Size and position of the menu - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( error_popmenu, setfocus error_popmenu_2, ERROR_ONESC, 1 ) - - onOpen - { - if( IN_MP_FRONTEND ) - { - activateBlur; - } - - if( dvarString("com_errorMessage") != "" ) - { - execnow setLocalVarString error_popmenuTitle (dvarString("com_errorTitle")); - execnow setLocalVarString error_popmenuMessage (dvarString("com_errorMessage")); - } - - if( IN_MP_FRONTEND ) - { - uiScript clearError; - } - } - - SYSTEM_POPUP_TITLE_VIS( localVarString( error_popmenuTitle ), 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( localVarString( error_popmenuMessage ), 1 ) - - //FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_CONTINUE", ERROR_CONTINUE, ( dvarString( "error_menu_info" ) == "MENU_SCRIPTS_OUT_OF_DATE" ), ; ) - //FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_EXIT", ERROR_ACTION, 1, name error_popmenu_2 ) - - SIMPLE_CHOICE_BUTTON_SOUND_VIS_EX( 0 (SYSTEM_POPUP_HEIGHT+4) 70 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - ;, - "@MENU_CONTINUE", ITEM_ALIGN_MIDDLE_CENTER, ERROR_CONTINUE, when( dvarString( "error_menu_info" ) == "MENU_SCRIPTS_OUT_OF_DATE" ), ; ) - SIMPLE_CHOICE_BUTTON_SOUND_VIS_EX( 0 (SYSTEM_POPUP_HEIGHT+4) 70 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp rect X( SYSTEM_POPUP_WIDTH - getTextWidth( locString( "@MENU_EXIT" ), CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) - 8 ), - "@MENU_EXIT", ITEM_ALIGN_MIDDLE_CENTER, ERROR_ACTION, 1, name error_popmenu_2; ) - } - -#define SYSTEM_ERROR_POPUP( popupname ) \ - menuDef \ - { \ - SYSTEM_POPUP_SETUP_VIS( popupname, ;, focusFirst; uiScript clearError; close self;, 1 ) \ - onOpen \ - { \ - if( IN_MP_FRONTEND ) \ - { \ - activateBlur; \ - } \ - execnow setLocalVarString (popupname + "Title") (dvarString("com_errorTitle")); \ - execnow setLocalVarString (popupname + "Message") (dvarString("com_errorMessage")); \ - } \ - \ - SYSTEM_POPUP_TITLE_VIS( localVarString( (popupname + "Title") ), 1 ) \ - SYSTEM_POPUP_SUBTITLE_VIS( localVarString( (popupname + "Message") ), 1 ) \ - \ - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", uiScript clearError; close self; OPEN_WAGER_FAIL_IF_NEEDED, 1, ; ) \ - } - - menuDef - { - #define WAGERFAIL_ONFOCUS \ - execnow statwriteddl AfterActionReportStats wagerMatchFailed 0; - - #define WAGERFAIL_ONESC \ - close self; - - #define WAGERFAIL_ACTION \ - play CHOICE_FOCUS_SOUND; \ - WAGERFAIL_ONESC - - SYSTEM_POPUP_SETUP_VIS( error_wagerfail, WAGERFAIL_ONFOCUS, WAGERFAIL_ONESC, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_WAGER_FAIL_TITLE", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_WAGER_FAIL_DESC", 1 ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_EXIT", WAGERFAIL_ACTION, 1, ; ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( autojoinfriend_popmenu, setfocus autojoinfriend_popmenu_2, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( dvarString( "com_errorMessage" ), 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_AUTOJOIN_FRIEND", 1 ) - - #define FRIEND_AUTO_JOIN_ON \ - exec "party_autojoindevfriend 1"; \ - close autojoinfriend_popmenu; \ - setdvar com_errorMessage ""; \ - setdvar com_errorTitle ""; - - #define FRIEND_AUTO_JOIN_OFF \ - exec "party_autojoindevfriend 0"; \ - close autojoinfriend_popmenu; \ - setdvar com_errorMessage ""; \ - setdvar com_errorTitle ""; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_YES_CAPS", FRIEND_AUTO_JOIN_ON, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_NO_CAPS", FRIEND_AUTO_JOIN_OFF, 1, name autojoinfriend_popmenu_2 ) - } - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 1 - menuDef - { - SYSTEM_POPUP_SETUP_VIS( consolestatsalert_popmenu, ;, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@EXE_CONSOLE_STATS_CHECK_ALERT_TITLE", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@EXE_CONSOLE_STATS_CHECK_ALERT_MESSAGE", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_OK", close consolestatsalert_popmenu;, 1, ; ) - } - -#ifdef PS3 - // PS3 controller removed warning - menuDef - { - SYSTEM_POPUP_SETUP_VIS( controllerremoved_popmenu, ;, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( locString("@PLATFORM_CONTROLLER_DISCONNECTED") + (dvarString( "disconnected_ctrls" )), 1 ) - itemDef - { - type ITEM_TYPE_BUTTON_NO_TEXT - rect 0 0 0 0 0 0 - visible 1 - } - } - // I know, not an error, handy here - // profile lookup dialog - menuDef - { - SYSTEM_POPUP_SETUP_VIS( profile_lookup_popmenu, ;, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@PLATFORM_PROFILE_LOOKUP", 1 ) - itemDef - { - type ITEM_TYPE_BUTTON_NO_TEXT - rect 0 0 0 0 0 0 - visible 1 - } - - SYSTEM_POPUP_SPINNER( 1 ) - } -#endif - - // save game data corrupted warning - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_connectingtodw, ;, ;, 1 ) - - onESC - { - if( IN_MP_FRONTEND ) - { - deactivateBlur; - } - CENTER_POPUP_ON_CLOSE - execNow ui_animate popup_connectingtodwhandler notification default 0; - close popup_connectingtodwhandler; - close self; - } - onClose - { - if( IN_MP_FRONTEND ) - { - deactivateBlur; - } - execNow ui_animate popup_connectingtodwhandler notification default 0; - close popup_connectingtodwhandler; - } - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_CONNECTING_TO_DW" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - - menuDef - { - name popup_connectingtodwhandler - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - visible 1 - backcolor 0 0 0 0 - style WINDOW_STYLE_FILLED - - onOpen - { - exec "initiateDemonWareConnect"; - if( dvarBool( live_banned ) ) - { - execNow ui_animate popup_connectingtodwhandler notification show 2000; - } - else - { - execNow ui_animate popup_connectingtodwhandler notification show 30000; - } - open popup_connectingtodw; - } - - itemDef - { - name "notification" - visible 0 - - state - { - name "show" - onEnter - { - if( dvarBool( live_banned ) ) - { - setdvar com_errorTitle "@MENU_NOTICE_CAPS"; - setdvar com_errorMessage "@PLATFORM_BANNED"; - open error_popmenu; - } - elseif( isDemonwareFetchingDone() == 0 ) - { - setdvar com_errorTitle "@MENU_NOTICE_CAPS"; - setdvar com_errorMessage "@EXE_DEMONWARE_DISCONNECT"; - open error_popmenu; - } - close popup_connectingtodw; - close popup_inliveconnectingtodw; - } - } - } - } - - - // Shown while connecting to DemonWare & getting all needed items for playing on - // LIVE while in the online (dvar) sections of the game, happens when another user - // signs in on another controller - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_inliveconnectingtodw, ;, ;, 1 ) - - onESC - { - if( IN_MP_FRONTEND ) - { - deactivateBlur; - } - CENTER_POPUP_ON_CLOSE - close self; - } - onClose - { - if( IN_MP_FRONTEND ) - { - deactivateBlur; - } - } - execKeyInt BUTTON_BACK {} - execKeyInt BUTTON_B {} - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_CONNECTING_TO_DW" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_gettingdata, ;, ;, 1 ) - onESC - { - if( IN_MP_FRONTEND ) - { - deactivateBlur; - } - close menu_xboxlive; - close findgame_category; - close popup_gettingdata; - close live_cac_popup; - close popup_gamesetup_private; - close private_cac_popup; - exec "onlinegame 0"; - exec "xstopprivateparty"; - exec "xstopparty"; - } - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_DOWNLOADING_GAME_SETTINGS_CAPS" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_downloadingfile, ;, execnow fileShareAbortOperation;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_DOWNLOAD_FILE" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_downloadinginfo, ;, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_DOWNLOADING" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_downloadingCompressedStats, ;, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_DOWNLOAD_OTHER_PLAYER_STATS" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_fetchstats, ;, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_FETCH_STATS" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_uploadingfile, ;, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_UPLOAD_FILE" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_gettingPlayercardInfo, ;, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_GETTING_PLAYERCARD" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_getlclaninfofromxuid, ;, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_GETTING_CLAN_INFO" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_gettingoffers, ;, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_GETTING_STORE_DATA" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_connectingtolobby, ;, focusFirst;, 1 ) - onESC - { - if( IN_MP_FRONTEND ) - { - deactivateBlur; - } - close menu_xboxlive; - close popup_gettingdata; - close live_cac_popup; - close popup_gamesetup_private; - close private_cac_popup; - exec "onlinegame 0"; - exec "xstopprivateparty"; - exec "xstopparty"; - } - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_CONNECTING_TO_LOBBY" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_connecting_dw, ;, focusFirst;, 1 ) - onESC - { - if( IN_MP_FRONTEND ) - { - deactivateBlur; - } - close menu_xboxlive; - close popup_gettingdata; - close live_cac_popup; - close popup_gamesetup_private; - close private_cac_popup; - close main_online - exec "onlinegame 0"; - close self; - } - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_CONNECTING_DW" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_creating_account, ;, focusFirst;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_CREATING_PROFILE" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_deleting_account, ;, focusFirst;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_DELETING_PROFILE" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_error_deleting_account, ;, focusFirst;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@MENU_ERROR_DELETING_PROFILE", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self;, 1, ; ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_error_creating_account, ;, focusFirst;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@MENU_ERROR_CREATING_PROFILE", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self;, 1, ; ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_account_not_available, ;, focusFirst;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@MENU_ACCOUNT_NOT_AVAILABLE", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self;, 1, ; ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_reconnectingtoparty, ;, close menu_xboxlive; close popup_gettingdata;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_RECONNECTING_TO_SQUAD" ), 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_error_contentserver_down, ;, focusFirst; uiScript clearError; close self;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@MPUI_ERROR_CAPS", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_CONTENT_SERVER_DOWN", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", uiScript clearError; close self;, 1, ; ) - } -} - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( stats_notfound_error_popup, ;, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@MENU_STATERROR_TITLE", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_STATS_ERROR", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self;, 1, ; ) - } - - SYSTEM_ERROR_POPUP( "error_dw_fetch_file" ) - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( save_corrupted, ;, close self; close blackout_3d_tv, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@MENU_SAVE_CORRUPTED", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_SAVEDATA_CORRUPTED", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self; close blackout_3d_tv, 1, ; ) - } - - SYSTEM_ERROR_POPUP( "error_popmenu_party" ) - - SYSTEM_ERROR_POPUP( "error_popmenu_lobby" ) - - SYSTEM_ERROR_POPUP( "error_popmenu_keyboard" ) - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( startmatch_popup, ;, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@MPUI_ERROR_CAPS", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@PLATFORM_MIN_ONE_REMOTE", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self, 1, ; ) - } - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 2 - menuDef - { - SYSTEM_POPUP_SETUP_VIS( acceptinvite_warning, setFocus acceptinvite_warning_2, close self;, 1 ) - onOpen - { - close menu_joinsession; - } - - SYSTEM_POPUP_TITLE_VIS( "@MENU_ACCEPTINVITETITLE", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_LEAVEMPGAMEWARNINGSQUADHOST", when( privatepartyhost() && !aloneinparty() ); ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_LEAVESQUADWARNING", when( !privatepartyhost() && !inlobby() ); ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_LEAVEMPGAMEWARNING", when( !privatepartyhost() && inlobby() ); ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_RESUMEGAME", close menu_joinsession; close self;, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_ACCEPTINVITE", close self; exec "acceptInvite";, 1, name acceptinvite_warning_2 ) - } - - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X 180 -#undef CHOICE_Y_START -#define CHOICE_Y_START 230 - -#define TOAST_POPUP_Y_OFFSET -55 -#define TOAST_POPUP_HEIGHT 36 -#define TOAST_POPUP_ICON_HEIGHT 26 -#define TOAST_POPUP_ICON_WIDTH 26 -#define TOAST_BIG_DESC_WIDTH ( GetTextWidth( getToastPopupDescription(), CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) ) -#define TOAST_SIDE_PAD_SIZE 10 -#define TOAST_MIDDLE_PAD_SIZE 5 - -#define TOAST_POPUP_BG_WIDTH( textWidth ) ( TOAST_SIDE_PAD_SIZE + TOAST_POPUP_ICON_WIDTH + TOAST_MIDDLE_PAD_SIZE + textWidth + TOAST_SIDE_PAD_SIZE ) -#define TOAST_POPUP_BG_X_START( textWidth ) ( -1 * ( TOAST_POPUP_BG_WIDTH( textWidth ) / 2 ) ) -#define TOAST_POPUP_ICON_X_START( textWidth ) ( TOAST_POPUP_BG_X_START( textWidth ) + TOAST_SIDE_PAD_SIZE ) -#define TOAST_POPUP_TEXT_X_START( textWidth ) ( TOAST_POPUP_ICON_X_START( textWidth ) + TOAST_POPUP_ICON_WIDTH + TOAST_MIDDLE_PAD_SIZE ) - -#define SHOW_NORMAL_TOAST_POPUP ( getToastPopupTitle() != "" ) - - menuDef - { - name menu_toast_popup - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_POPUP - openSlideSpeed 150 - closeSlideSpeed 700 - openSlideDirection MENU_SLIDE_DIRECTION_BOTTOM_TO_TOP - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - - // Title and description version - itemDef - { - rect 0 TOAST_POPUP_Y_OFFSET 0 TOAST_POPUP_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_BOTTOM - exp rect X( TOAST_POPUP_BG_X_START( getToastPopupWidth() ) ) - exp rect W( TOAST_POPUP_BG_WIDTH( getToastPopupWidth() ) ) - style WINDOW_STYLE_SHADER_FRAMED - frame 16 0.5 FRAME_SIDE_ALL - background "menu_mp_lobby_frame_circle" - forecolor 0 0 0 0.5 - visible when( SHOW_NORMAL_TOAST_POPUP ); - decoration - } - - PREPROC_SHADER_DRAW_ADV_VIS_EX( TOAST_POPUP_ICON_X_START( getToastPopupWidth() ), - (TOAST_POPUP_Y_OFFSET+5), - TOAST_POPUP_ICON_WIDTH, - TOAST_POPUP_ICON_HEIGHT, - HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_BOTTOM, - getToastPopupIcon(), 1 1 1 0.8, - when( SHOW_NORMAL_TOAST_POPUP );, ; ) - - PREPROC_TEXT_DRAW_ADV_VIS_EX( TOAST_POPUP_TEXT_X_START( getToastPopupWidth() ), - (TOAST_POPUP_Y_OFFSET+2), - ( getToastPopupWidth() ), - 15, - HORIZONTAL_ALIGN_CENTER, - VERTICAL_ALIGN_BOTTOM, - getToastPopupTitle(), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 1, - when( SHOW_NORMAL_TOAST_POPUP );, ; ) - - PREPROC_TEXT_DRAW_ADV_VIS_EX( TOAST_POPUP_TEXT_X_START( getToastPopupWidth() ), - (TOAST_POPUP_Y_OFFSET+18), - ( getToastPopupWidth() ), - 15, - HORIZONTAL_ALIGN_CENTER, - VERTICAL_ALIGN_BOTTOM, - getToastPopupDescription(), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 1, - when( SHOW_NORMAL_TOAST_POPUP );, ; ) - - // Description only version - itemDef - { - rect 0 TOAST_POPUP_Y_OFFSET 0 TOAST_POPUP_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_BOTTOM - exp rect X( TOAST_POPUP_BG_X_START( TOAST_BIG_DESC_WIDTH ) ) - exp rect W( TOAST_POPUP_BG_WIDTH( TOAST_BIG_DESC_WIDTH ) ) - style WINDOW_STYLE_SHADER_FRAMED - frame 16 0.5 FRAME_SIDE_ALL - background "menu_mp_lobby_frame_circle" - forecolor 0 0 0 0.5 - visible when( !SHOW_NORMAL_TOAST_POPUP ); - decoration - } - - - PREPROC_SHADER_DRAW_ADV_VIS_EX( TOAST_POPUP_ICON_X_START( TOAST_BIG_DESC_WIDTH ), - (TOAST_POPUP_Y_OFFSET+5), - TOAST_POPUP_ICON_WIDTH, - TOAST_POPUP_ICON_HEIGHT, - HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_BOTTOM, - getToastPopupIcon(), 1 1 1 0.8, - when( !SHOW_NORMAL_TOAST_POPUP );, ; ) - - - PREPROC_TEXT_DRAW_ADV_VIS_EX( TOAST_POPUP_TEXT_X_START( TOAST_BIG_DESC_WIDTH ), - (TOAST_POPUP_Y_OFFSET+5), - TOAST_BIG_DESC_WIDTH, - TOAST_POPUP_ICON_HEIGHT, - HORIZONTAL_ALIGN_CENTER, - VERTICAL_ALIGN_BOTTOM, - getToastPopupDescription(), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 1, - when( !SHOW_NORMAL_TOAST_POPUP );, ; ) - } - - #define VIS_PRESS_START 1 - - menuDef - { - name "pregame_loaderror" - rect 0 0 640 480 - fullScreen 1 - focusColor COLOR_FOCUSED - backcolor 1 1 1 0 - style WINDOW_STYLE_FILLED - onClose - { - uiScript clearError - } - onOpen - { - setdvar ui_SaveLoadVisible "0"; - } - onEsc - { - uiScript playerstart - } - - // background - itemDef - { - style WINDOW_STYLE_FILLED - type ITEM_TYPE_OWNERDRAW - rect FULLSCREEN_WIDE - backcolor 1 1 1 1 - visible 1 - background cinematic - decoration - } - - itemDef - { - name "profile" - type ITEM_TYPE_OWNERDRAW - visible 1 - rect 40 40 560 400 - ownerdraw UI_LOADPROFILING - decoration - } - - itemDef - { - name errorinfo - type ITEM_TYPE_TEXT - rect 120 142 400 255 - style WINDOW_STYLE_FILLED - textalign ITEM_ALIGN_TOP_CENTER - autowrapped - dvar "com_errorMessage" - textscale .8 - forecolor 1 .2 .2 1 - visible 1 - decoration - } - -#ifdef PS3 - itemDef - { - type ITEM_TYPE_TEXT - text "@PLATFORM_UI_PRESS_BUTTONSELECTCHOICE" - style WINDOW_STYLE_FILLED - textscale TEXTSIZE_SMALL - border 0 - bordercolor 1 1 1 1 - rect 0 388 640 45 - textalign ITEM_ALIGN_TOP_CENTER - textaligny 4 - forecolor 1 1 1 0.4 - backcolor 0 0 0 0 - visible when ( !dvarbool( ui_isSaving ) && VIS_PRESS_START ); - decoration - } -#endif - -#ifdef XENON - itemDef - { - type ITEM_TYPE_TEXT - text "@MENU_PRESS_START_TO_SKIP" - style WINDOW_STYLE_FILLED - textscale TEXTSIZE_SMALL - border 0 - bordercolor 1 1 1 1 - rect 0 388 640 45 - textalign ITEM_ALIGN_TOP_CENTER - textaligny 4 - forecolor 1 1 1 0.4 - backcolor 0 0 0 0 - visible when ( !dvarbool( ui_isSaving ) && VIS_PRESS_START ); - decoration - } -#endif - -#ifdef PC - itemDef - { - type ITEM_TYPE_TEXT - text "@MENU_CLICK_TO_START_THE_MISSION" - style WINDOW_STYLE_FILLED - textscale TEXTSIZE_SMALL - border 0 - bordercolor 1 1 1 1 - rect 0 388 640 45 - textalign ITEM_ALIGN_TOP_CENTER - textaligny 4 - forecolor 1 1 1 0.4 - backcolor 0 0 0 0 - visible when ( !dvarbool( ui_isSaving ) && VIS_PRESS_START ); - decoration - } -#endif // #ifdef PC - - itemDef - { - type ITEM_TYPE_BUTTON - rect -128 0 896 480 - style WINDOW_STYLE_EMPTY - visible 1 - forecolor 0 0 0 0 - backcolor 0 0 0 0 - action - { - uiScript playerstart - } - } - - #include "ui/safearea.menu" - } - - menuDef - { - name "pregame_loaderror_mp" - rect 0 0 640 480 - fullScreen 1 - focusColor COLOR_FOCUSED - backcolor 1 1 1 0 - style WINDOW_STYLE_FILLED - blurWorld 6.0 - onClose - { - uiScript clearError - } - onOpen - { - setdvar ui_SaveLoadVisible "0"; - } - - // background - itemDef - { - style WINDOW_STYLE_FILLED - rect FULLSCREEN_WIDE - backcolor 0.2 0.2 0.2 .5 - visible 1 - decoration - } - - - - itemDef - { - name "profile" - type ITEM_TYPE_OWNERDRAW - visible 1 - rect 40 40 560 400 - ownerdraw UI_LOADPROFILING - decoration - } - - itemDef - { - name errorinfo - type ITEM_TYPE_TEXT - rect 120 142 400 255 - style WINDOW_STYLE_FILLED - textalign ITEM_ALIGN_TOP_CENTER - autowrapped - dvar "com_errorMessage" - textscale .8 - forecolor 1 .2 .2 1 - visible 1 - decoration - } - - // the button - // Text message saying you should click to continue -#ifdef CONSOLE - itemDef - { - type ITEM_TYPE_TEXT - text "@MENU_PRESS_START" - style WINDOW_STYLE_FILLED - textscale TEXTSIZE_TITLE - rect 0 388 640 45 - textalign ITEM_ALIGN_TOP_CENTER - textaligny 4 - forecolor 1 1 1 1 - visible 1 - decoration - } -#endif // #ifdef CONSOLE - -#ifdef PC - itemDef - { - type ITEM_TYPE_TEXT - text "@MENU_CLICK_TO_START_THE_MISSION" - style WINDOW_STYLE_FILLED - textscale TEXTSIZE_TITLE - rect 0 388 640 45 - textalign ITEM_ALIGN_TOP_CENTER - textaligny 4 - forecolor 1 1 1 1 - visible 1 - decoration - } -#endif // #ifdef PC - - itemDef - { - type ITEM_TYPE_BUTTON - rect -128 0 896 480 - style WINDOW_STYLE_EMPTY - visible 1 - forecolor 0 0 0 0 - backcolor 0 0 0 0 - action - { - uiScript clearLoadErrorsSummary - } - } - - #include "ui/safearea.menu" - } - -} diff --git a/mods/patch_mp/ui/options_graphics_pc.menu b/mods/patch_mp/ui/options_graphics_pc.menu deleted file mode 100644 index d6c661f..0000000 --- a/mods/patch_mp/ui/options_graphics_pc.menu +++ /dev/null @@ -1,447 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#define OPTIONS_STYLE 1 -#define CHOICE_SEP_1 27 -#define CHOICE_SEP_2 30 -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui/framestyle.inc" -#include "ui/frame.inc" - -#undef CHOICE_ACTION_SOUND -#define CHOICE_ACTION_SOUND "uin_mouse_click_t" - -#undef CHOICE_BUTTON_NAME -#define CHOICE_BUTTON_NAME "options_graphics_" -#undef MENUDEF_NAME -#define MENUDEF_NAME options_graphics - -#undef OPTIONS_GRAPHICS_HEIGHT -#undef OPTIONS_GRAPHICS_WIDTH -#define OPTIONS_GRAPHICS_HEIGHT 332 -#define OPTIONS_GRAPHICS_WIDTH OPTIONS_GRAPHICS_HEIGHT * FRAME_ASPECT_RATIO - -{ - menuDef - { - name options_graphics - fullScreen 0 - rect 0 0 640 480 - focusColor COLOR_FOCUSED - soundloop "" - - onOpen - { - LOCAL_CLOSE_ALL_BUT( options_graphics ) - - setLocalVarBool ui_showApply 0; - setLocalVarBool ui_hideBack 1; - - // setfromdvar dst src - exec "exec ui/options_graphics.cfg"; - - if ( dvarInt( r_picmip_manual ) == 0 ) - { - exec "set ui_r_picmip -1"; - exec "set ui_r_picmip_bump -1"; - exec "set ui_r_picmip_spec -1"; - exec "set ui_r_picmip_manual 0"; - } - - setdvar g_reloading "0"; - - // round ai_corpsecount down to valid values. - if ( dvarInt( ai_corpsecount ) >= 32 ) - { -// KTouevsky: Bump this number when the RAGDOLL_MAX_SIMULATING in ragdoll.h is bumped to 32 too -// setDvar ai_corpseCount 32; - setDvar ai_corpseCount 16; - } - elseif ( dvarInt( ai_corpsecount ) >= 16 ) - { - setDvar ai_corpseCount 16; - } - elseif ( dvarInt( ai_corpsecount ) >= 10 ) - { - setDvar ai_corpseCount 10; - } - elseif ( dvarInt( ai_corpsecount ) >= 5 ) - { - setDvar ai_corpseCount 5; - } - elseif ( dvarInt( ai_corpsecount ) >= 3 ) - { - setDvar ai_corpseCount 3; - } - -// 2008-Aug-1 KTouevsky: loosk like COD4 have "Soften Smoke Edges" to be "Yes/No" only and linked to r_zfeather directly - //execOnDvarFloatValue r_zfeather 0 "set ui_zfeather 0"; // off - //execOnDvarFloatValue r_zfeather 1 "set ui_zfeather 1"; // world - //execOnDvarFloatValue r_depthPrepassModels 1 "set ui_zfeather 2"; // everything - - if (IsInGame()) - { - showMenu "pausedbkgnd"; - } - else - { - activateBlur; - } - } - onClose - { - setLocalVarBool ui_hideBack 0; - //execOnDvarIntValue ui_zfeather 0 "set r_zfeather 0;set r_depthPrepassModels 0"; // off - //execOnDvarIntValue ui_zfeather 1 "set r_zfeather 1;set r_depthPrepassModels 0"; // world - //execOnDvarIntValue ui_zfeather 2 "set r_zfeather 1;set r_depthPrepassModels 1"; // everything - - if (IsInGame()) - { - hideMenu "pausedbkgnd"; - } - else - { - deactivateBlur; - } - - // be sure brightness (r_gamma) is stored in the profile - exec updategamerprofile; - } - onESC - { - close self; - open options_new_pc; - } - PC_TAB_SWITCH_ACTIONS( options_new_pc, options_controls_new_pc, options_controls_new_pc ) - - #include "ui_mp/leftside_options.inc" - -#undef CHOICE_X_START -#undef CHOICE_Y_START -#undef CHOICE_HORIZONTAL_ALIGN -#undef CHOICE_VERTICAL_ALIGN -#undef CHOICE_DVAR_EXTRA_WIDTH -#undef CHOICE_TEXT_OFFSET_X - -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER -#define CHOICE_X_START ((-OPTIONS_GRAPHICS_WIDTH/2) - 75) -#define CHOICE_Y_START ((-OPTIONS_GRAPHICS_HEIGHT/2) + 32) -#define CHOICE_DVAR_EXTRA_WIDTH 120 -#define CHOICE_TEXT_OFFSET_X -10 - -#undef CHOICE_TEXTSTYLE -#undef CHOICE_TEXTSIZE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL -#define CHOICE_TEXTSIZE TEXTSIZE_DEFAULT - -#undef CHOICE_TEXT_COLOR_NO_HL -#undef CHOICE_TEXT_COLOR_HL -#undef CHOICE_CAPTION_TEXT_COLOR_NO_HL -#undef CHOICE_CAPTION_TEXT_COLOR_HL - -#define CHOICE_TEXT_COLOR_NO_HL CHOICE_TEXTCOLOR -#define CHOICE_TEXT_COLOR_HL 1 1 1 1 -#define CHOICE_CAPTION_TEXT_COLOR_NO_HL CHOICE_TEXTCOLOR -#define CHOICE_CAPTION_TEXT_COLOR_HL 0 0 0 1 - -#define TEXTURE_QUALITY_ACTION \ - setLocalVarBool ui_showApply 1; \ - setDvar ui_r_picmip_bump dvarInt( ui_r_picmip ); \ - setDvar ui_r_picmip_spec dvarInt( ui_r_picmip ); \ - if ( dvarInt( ui_r_picmip ) == -1 ) \ - { \ - setDvar ui_r_picmip_manual 0; \ - } \ - else \ - { \ - setDVar ui_r_picmip_manual 1; \ - } - -#define MP_ZOMBIE_INGAME ( IsInGame() && ( dvarBool( ui_multiplayer ) || dvarBool( zombiemode ) ) ) - - FRAME_CHOICE_SECTION_TITLE( 21, "@MENU_GRAPHICS_CAPS" ) - - FRAME_CHOICE_DVARENUMLIST_VIS( 22, "@MENU_VIDEO_MODE_CAPS", ui_r_mode, r_mode, setLocalVarBool ui_showApply 1, !MP_ZOMBIE_INGAME ) - FRAME_CHOICE_DVARYESNO_VIS( 23, "@MENU_FULLSCREEN_CAPS", ui_r_fullscreen, setLocalVarBool ui_showApply 1, !MP_ZOMBIE_INGAME ) - FRAME_CHOICE_DVARFLOATLIST_VIS( 24, "@MENU_ANTIALIASING_CAPS", ui_r_aasamples, { "@MENU_OFF_CAPS" 1 "@MENU_2X_CAPS" 2 "@MENU_4X_CAPS" 4 "@MENU_8X_CAPS" 8 }, setLocalVarBool ui_showApply 1;, !MP_ZOMBIE_INGAME && !dvarbool(r_supports16xAA) ) - FRAME_CHOICE_DVARFLOATLIST_VIS( 24, "@MENU_ANTIALIASING_CAPS", ui_r_aasamples, { "@MENU_OFF_CAPS" 1 "@MENU_2X_CAPS" 2 "@MENU_4X_CAPS" 4 "@MENU_8X_CAPS" 8 "@MENU_16X_CAPS" 16 }, setLocalVarBool ui_showApply 1;, !MP_ZOMBIE_INGAME && dvarbool(r_supports16xAA) ) - FRAME_CHOICE_DVARSTRINGLIST_VIS( 25, "@MENU_ASPECT_RATIO_CAPS", ui_r_aspectratio, { "@MENU_AUTO_CAPS"; "auto"; "@MENU_STANDARD_4_3_CAPS"; "standard"; "@MENU_WIDE_16_10_CAPS"; "wide 16:10"; "@MENU_WIDE_16_9_CAPS"; "wide 16:9" }, setLocalVarBool ui_showApply 1, !MP_ZOMBIE_INGAME ) - FRAME_CHOICE_DVARENUMLIST_VIS( 26, "@MENU_SCREEN_REFRESH_RATE_CAPS", ui_r_displayRefresh, r_displayRefresh, setLocalVarBool ui_showApply 1;, !MP_ZOMBIE_INGAME ) - FRAME_CHOICE_DVARYESNO_VIS( 27, "@MENU_SYNC_EVERY_FRAME_CAPS", ui_r_vsync, setLocalVarBool ui_showApply 1, !MP_ZOMBIE_INGAME ) - - FRAME_CHOICE_DVARSTRINGLIST( 28, "@MENU_TEXTURE_MIPMAPS_CAPS", r_texFilterMipMode, { "@MENU_AUTOMATIC_CAPS"; "Unchanged"; "@MENU_BILINEAR_CAPS"; "Force Bilinear"; "@MENU_TRILINEAR_CAPS"; "Force Trilinear" }, ; ) - FRAME_DVARSLIDER( 29, "@MENU_TEXTURE_ANISOTROPY_CAPS", r_texFilterAnisoMin, 1, 1, 16, ; ) - FRAME_CHOICE_DVARFLOATLIST_VIS( 30, "@MENU_TEXTURE_QUALITY_CAPS", ui_r_picmip, { "@MENU_AUTOMATIC_CAPS" -1 "@PLATFORM_LOW_CAPS" 3 "@MENU_NORMAL_CAPS" 2 "@PLATFORM_HIGH_CAPS" 1 "@MENU_EXTRA_CAPS" 0 }, TEXTURE_QUALITY_ACTION, !MP_ZOMBIE_INGAME ) - - - FRAME_CHOICE_DVARYESNO_VIS( 31, "@PATCH_MENU_OPTION_SHADERWARMING_CAPS", r_shaderWarming, ;, 1 ) - FRAME_CHOICE_DVARYESNO_VIS( 32, "@MENU_SHADOWS_CAPS", sm_enable, ;, dvarbool( ui_showShadowOptions ) ) - FRAME_CHOICE_DVARYESNO_VIS( 33, "@MENU_OPTION_BULLET_IMPACTS_CAPS", fx_marks, ;, 1 ) -// KTouevsky: Add back insane when the RAGDOLL_MAX_SIMULATING in ragdoll.h is bumped to 32 too -// FRAME_CHOICE_DVARFLOATLIST_VIS( 34, "@MENU_NUMBER_OF_CORPSES_CAPS", ai_corpsecount, { "@MENU_TINY_CAPS" 3 "@MENU_SMALL_CAPS" 5 "@MENU_MEDIUM_CAPS" 10 "@MENU_LARGE_CAPS" 16 "@MENU_INSANE_CAPS" 32 }, ;, !dvarBool( ui_multiplayer ) ) - FRAME_CHOICE_DVARFLOATLIST_VIS( 34, "@MENU_NUMBER_OF_CORPSES_CAPS", ai_corpsecount, { "@MENU_TINY_CAPS" 3 "@MENU_SMALL_CAPS" 5 "@MENU_MEDIUM_CAPS" 10 "@MENU_LARGE_CAPS" 16 }, ;, !dvarBool( ui_multiplayer ) ) - FRAME_DVARSLIDER( 35, "@MENU_BRIGHTNESS_CAPS", r_gamma, 1, 0.5, 3, ; ) - FRAME_DVARSLIDER_VIS( 36, "@PLATFORM_FOV_CAPS", cg_fov_default, 1, 65, 80, ;, ( dvarint( ui_multiplayer ) ) ) - -#undef CHOICE_TEXTCOLOR -#define CHOICE_TEXTCOLOR 0.2 0.2 0.2 1 - // darker disabled color in-game - FRAME_CHOICE_DBUTTON_DARK_FOCUS_VIS_EX( 22, "@MENU_VIDEO_MODE_CAPS", ;, ;, MP_ZOMBIE_INGAME, ; ) - FRAME_CHOICE_DBUTTON_DARK_FOCUS_VIS_EX( 23, "@MENU_FULLSCREEN_CAPS", ;, ;, MP_ZOMBIE_INGAME, ; ) - FRAME_CHOICE_DBUTTON_DARK_FOCUS_VIS_EX( 24, "@MENU_ANTIALIASING_CAPS", ;, ;, MP_ZOMBIE_INGAME, ; ) - FRAME_CHOICE_DBUTTON_DARK_FOCUS_VIS_EX( 25, "@MENU_ASPECT_RATIO_CAPS", ;, ;, MP_ZOMBIE_INGAME, ; ) - FRAME_CHOICE_DBUTTON_DARK_FOCUS_VIS_EX( 26, "@MENU_SCREEN_REFRESH_RATE_CAPS", ;, ;, MP_ZOMBIE_INGAME, ; ) - FRAME_CHOICE_DBUTTON_DARK_FOCUS_VIS_EX( 27, "@MENU_SYNC_EVERY_FRAME_CAPS", ;, ;, MP_ZOMBIE_INGAME, ; ) - FRAME_CHOICE_DBUTTON_DARK_FOCUS_VIS_EX( 30, "@MENU_TEXTURE_QUALITY_CAPS", ;, ;, MP_ZOMBIE_INGAME, ; ) - - FRAME_CHOICE_DBUTTON_DARK_FOCUS_VIS_EX( 32, "@MENU_SHADOWS_CAPS", ;, ;, !dvarbool( ui_showShadowOptions ) && MP_ZOMBIE_INGAME, ; ) - -#undef CHOICE_TEXTCOLOR -#define CHOICE_TEXTCOLOR 0.4 0.4 0.4 1 - // lighter disabled color in the shell - FRAME_CHOICE_DBUTTON_DARK_FOCUS_VIS_EX( 32, "@MENU_SHADOWS_CAPS", ;, ;, !dvarbool( ui_showShadowOptions ), ; ) - -#undef CHOICE_TEXT_COLOR_NO_HL -#undef CHOICE_TEXT_COLOR_HL -#undef CHOICE_CAPTION_TEXT_COLOR_NO_HL -#undef CHOICE_CAPTION_TEXT_COLOR_HL - -#define CHOICE_TEXT_COLOR_NO_HL 1 1 1 1 -#define CHOICE_TEXT_COLOR_HL 0 0 0 1 -#define CHOICE_CAPTION_TEXT_COLOR_NO_HL 1 1 1 1 -#define CHOICE_CAPTION_TEXT_COLOR_HL 0 0 0 1 - - FRAME_BUTTON_PC_RIGHT_OFFSET( NEW_FRAME_DEFAULT_WIDTH, NEW_FRAME_DEFAULT_HEIGHT, 0, - "@MENU_APPLY", - open vid_restart_popmenu;, - when( ( localVarBool( ui_showApply ) && !dvarint( sv_running ) ) || dvarInt(ui_allow_graphic_change) ); ) - - FRAME_BUTTON_PC_RIGHT_OFFSET( NEW_FRAME_DEFAULT_WIDTH, NEW_FRAME_DEFAULT_HEIGHT, 0, - "@MENU_APPLY", - uiScript openMenuOnDvar g_reloading 0 vid_restart_popmenu_listen; - uiScript openMenuOnDvarNot g_reloading 0 vid_restart_popmenu_dead;, - when( localVarBool( ui_showApply ) && dvarint( sv_running ) && dvarInt( ui_allow_graphic_change ) == 0 ); ) - - //CHOICE_APPLY_VIS( "@MENU_APPLY", open vid_restart_popmenu, when( ( localVarBool( ui_showApply ) && !dvarint( sv_running ) ) || dvarInt(ui_allow_graphic_change) ); ) - //CHOICE_APPLY_VIS( "@MENU_APPLY", uiScript openMenuOnDvar g_reloading 0 vid_restart_popmenu_listen; uiScript openMenuOnDvarNot g_reloading 0 vid_restart_popmenu_dead;, when( localVarBool( ui_showApply ) && dvarint( sv_running ) && dvarInt( ui_allow_graphic_change ) == 0 ); ) - //CHOICE_BACK( "@MENU_BACK", close self ) - - -// These are last so I don't have to redefine everything. -#undef CHOICE_TEXTALIGN -#define CHOICE_TEXTALIGN ITEM_ALIGN_MIDDLE_LEFT -#undef CHOICE_TEXT_OFFSET_X -#define CHOICE_TEXT_OFFSET_X -5010 -#undef CHOICE_X_START -#define CHOICE_X_START ((-OPTIONS_GRAPHICS_WIDTH/2) - 125 + 5000) - -#undef CHOICE_TEXTCOLOR -#define CHOICE_TEXTCOLOR 0.2 0.2 0.2 1 - // darker disabled color in-game - FRAME_CHOICE_DBUTTON_DARK_VIS_EX( 41, dvarString( ui_r_mode ), ;, ;, MP_ZOMBIE_INGAME, ; ) - FRAME_CHOICE_DBUTTON_DARK_LIST_VIS_EX( 42, ui_r_fullscreen, ITEM_TYPE_MULTI, dvarFloatList { "@MENU_NO_CAPS" 0 "@MENU_YES_CAPS" 1 }, ;, MP_ZOMBIE_INGAME, ; ) - FRAME_CHOICE_DBUTTON_DARK_LIST_VIS_EX( 43, ui_r_aasamples, ITEM_TYPE_MULTI, dvarFloatList { "@MENU_OFF_CAPS" 1 "@MENU_2X_CAPS" 2 "@MENU_4X_CAPS" 4 "@MENU_8X_CAPS" 8 "@MENU_16X_CAPS" 16 }, ;, MP_ZOMBIE_INGAME, ; ) - FRAME_CHOICE_DBUTTON_DARK_LIST_VIS_EX( 44, ui_r_aspectratio, ITEM_TYPE_MULTI, dvarStrList { "@MENU_AUTO_CAPS"; "auto"; "@MENU_STANDARD_4_3_CAPS"; "standard"; "@MENU_WIDE_16_10_CAPS"; "wide 16:10"; "@MENU_WIDE_16_9_CAPS"; "wide 16:9" }, ;, MP_ZOMBIE_INGAME, ; ) - FRAME_CHOICE_DBUTTON_DARK_VIS_EX( 45, dvarString( ui_r_displayRefresh ), ;, ;, MP_ZOMBIE_INGAME, ; ) - FRAME_CHOICE_DBUTTON_DARK_LIST_VIS_EX( 46, ui_r_vsync, ITEM_TYPE_MULTI, dvarFloatList { "@MENU_NO_CAPS" 0 "@MENU_YES_CAPS" 1 }, ;, MP_ZOMBIE_INGAME, ; ) - -#undef CHOICE_Y_OFFSET -#define CHOICE_Y_OFFSET (CHOICE_SIZE_Y / 2) - FRAME_CHOICE_DBUTTON_DARK_LIST_VIS_EX( 49, ui_r_picmip, ITEM_TYPE_MULTI, dvarFloatList { "@MENU_AUTOMATIC_CAPS" -1 "@PLATFORM_LOW_CAPS" 3 "@MENU_NORMAL_CAPS" 2 "@PLATFORM_HIGH_CAPS" 1 "@MENU_EXTRA_CAPS" 0 }, ;, MP_ZOMBIE_INGAME, ; ) -#undef CHOICE_Y_OFFSET -#define CHOICE_Y_OFFSET 0 - - FRAME_CHOICE_DBUTTON_DARK_LIST_VIS_EX( 52, sm_enable, ITEM_TYPE_MULTI, dvarFloatList { "@MENU_NO_CAPS" 0 "@MENU_YES_CAPS" 1 }, ;, !dvarbool( ui_showShadowOptions ) && MP_ZOMBIE_INGAME, ; ) - -#undef CHOICE_TEXTCOLOR -#define CHOICE_TEXTCOLOR 0.4 0.4 0.4 1 - // lighter disabled color in the shell - FRAME_CHOICE_DBUTTON_DARK_LIST_VIS_EX( 52, sm_enable, ITEM_TYPE_MULTI, dvarFloatList { "@MENU_NO_CAPS" 0 "@MENU_YES_CAPS" 1 }, ;, !dvarbool( ui_showShadowOptions ), ; ) - - /* - itemDef - { - name graphic_warning - type ITEM_TYPE_BUTTON - text "@MENU_GRAPHICS_WARNING" - style WINDOW_STYLE_FILLED - textstyle ITEM_TEXTSTYLE_SHADOWED - rect 20 -116 240 240 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM - textfont UI_FONT_NORMAL - textalign ITEM_ALIGN_LEFT - textscale TEXTSIZE_SMALL - visible 1 - mouseEnter { play CHOICE_FOCUS_SOUND; } - decoration - autowrapped - } - */ - //CHOICE_FOOTNOTE( "@MENU_GRAPHICS_WARNING", 340, 340 ) - } - - // restoring button properties - - // --- - #undef TEXTSIZE_BUTTON_PC - #define TEXTSIZE_BUTTON_PC 0.4 - - #undef CHOICE_SIZE_X - #define CHOICE_SIZE_X 224 - - #undef SECTION_X_OFFSET - #define SECTION_X_OFFSET 0 - // --- - - #undef CHOICE_BUTTON_NAME - #define CHOICE_BUTTON_NAME "options_graphics_texture_" - #undef MENUDEF_NAME - #define MENUDEF_NAME options_graphics_texture - - menuDef - { - name options_graphics_texture - fullScreen 0 - rect 0 0 640 480 - focusColor COLOR_FOCUSED - soundloop "" - - onOpen - { - LOCAL_CLOSE_ALL_BUT( options_graphics_texture ) - - setLocalVarBool ui_hideBack 1; - setLocalVarBool ui_showApply 0; - - exec "setfromdvar ui_r_picmip r_picmip"; - exec "setfromdvar ui_r_picmip_bump r_picmip_bump"; - exec "setfromdvar ui_r_picmip_spec r_picmip_spec"; - exec "setfromdvar ui_r_picmip_manual r_picmip_manual"; - - if (IsInGame()) - { - showMenu "pausedbkgnd"; - } - else - { - activateBlur; - } - } - onClose - { - setLocalVarBool ui_hideBack 0; - - if (IsInGame()) - { - hideMenu "pausedbkgnd"; - } - else - { - deactivateBlur; - } - } - - onESC - { - close self; - open options_new_pc; - } - PC_TAB_SWITCH_ACTIONS( options_new_pc, options_controls_new_pc, options_controls_new_pc ) - - #include "ui_mp/leftside_options.inc" - -#undef CHOICE_X_START -#undef CHOICE_Y_START -#undef CHOICE_HORIZONTAL_ALIGN -#undef CHOICE_VERTICAL_ALIGN -#undef CHOICE_DVAR_EXTRA_WIDTH -#undef CHOICE_TEXT_OFFSET_X - -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER -#define CHOICE_X_START ((-OPTIONS_GRAPHICS_WIDTH/2) - 75) -#define CHOICE_Y_START ((-OPTIONS_GRAPHICS_HEIGHT/2) + 32) -#define CHOICE_DVAR_EXTRA_WIDTH 120 -#define CHOICE_TEXT_OFFSET_X -10 - -#undef CHOICE_TEXTSTYLE -#undef CHOICE_TEXTSIZE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL -#define CHOICE_TEXTSIZE TEXTSIZE_DEFAULT - -#undef CHOICE_TEXT_COLOR_NO_HL -#undef CHOICE_TEXT_COLOR_HL -#undef CHOICE_CAPTION_TEXT_COLOR_NO_HL -#undef CHOICE_CAPTION_TEXT_COLOR_HL - -#define CHOICE_TEXT_COLOR_NO_HL CHOICE_TEXTCOLOR -#define CHOICE_TEXT_COLOR_HL 1 1 1 1 -#define CHOICE_CAPTION_TEXT_COLOR_NO_HL CHOICE_TEXTCOLOR -#define CHOICE_CAPTION_TEXT_COLOR_HL 0 0 0 1 - - FRAME_CHOICE_SECTION_TITLE( 21, "@MENU_TEXTURE_SETTINGS_CAPS" ) - - FRAME_CHOICE_DVARSTRINGLIST( 22, "@MENU_TEXTURE_MIPMAPS_CAPS", r_texFilterMipMode, { "@MENU_AUTOMATIC_CAPS"; "Unchanged"; "@MENU_BILINEAR_CAPS"; "Force Bilinear"; "@MENU_TRILINEAR_CAPS"; "Force Trilinear" }, setLocalVarBool ui_showApply 1 ) - FRAME_DVARSLIDER( 23, "@MENU_TEXTURE_ANISOTROPY_CAPS", r_texFilterAnisoMin, 1, 1, 16, setLocalVarBool ui_showApply 1 ) - FRAME_CHOICE_DVARFLOATLIST_VIS( 24, "@MENU_TEXTURE_QUALITY_CAPS", ui_r_picmip_manual, { "@MENU_AUTOMATIC_CAPS" 0 "@MENU_MANUAL_CAPS" 1 }, setLocalVarBool ui_showApply 1, 1 ) - FRAME_CHOICE_DVARFLOATLIST_VIS( 25, "@MENU_TEXTURE_RESOLUTION_CAPS", ui_r_picmip, { "@PLATFORM_LOW_CAPS" 3 "@MENU_NORMAL_CAPS" 2 "@PLATFORM_HIGH_CAPS" 1 "@MENU_EXTRA_CAPS" 0 }, setLocalVarBool ui_showApply 1, ( dvarint( ui_r_picmip_manual ) ) ) - FRAME_CHOICE_DVARFLOATLIST_VIS( 26, "@MENU_NORMAL_MAP_RESOLUTION_CAPS", ui_r_picmip_bump, { "@PLATFORM_LOW_CAPS" 3 "@MENU_NORMAL_CAPS" 2 "@PLATFORM_HIGH_CAPS" 1 "@MENU_EXTRA_CAPS" 0 }, setLocalVarBool ui_showApply 1, ( dvarint( ui_r_picmip_manual ) ) ) - FRAME_CHOICE_DVARFLOATLIST_VIS( 27, "@MENU_SPECULAR_MAP_RESOLUTION_CAPS", ui_r_picmip_spec, { "@PLATFORM_LOW_CAPS" 3 "@MENU_NORMAL_CAPS" 2 "@PLATFORM_HIGH_CAPS" 1 "@MENU_EXTRA_CAPS" 0 }, setLocalVarBool ui_showApply 1, ( dvarint( ui_r_picmip_manual ) ) ) - - FRAME_BUTTON_PC_RIGHT_OFFSET( NEW_FRAME_DEFAULT_WIDTH, NEW_FRAME_DEFAULT_HEIGHT, 0, - "@MENU_APPLY", - close self; - open apply_picmip_popmenu;, - when( localVarBool( ui_showApply ) ); ) - - //CHOICE_APPLY_VIS( "@MENU_APPLY", close self; open apply_picmip_popmenu, when( localVarBool( ui_showApply ) ) ) - - //CHOICE_BACK( "@MENU_BACK", close self; open options_graphics ) - - /* - itemDef - { - name graphic_warning - type ITEM_TYPE_BUTTON - text "@MENU_GRAPHICS_WARNING" - style WINDOW_STYLE_FILLED - textstyle ITEM_TEXTSTYLE_SHADOWED - rect 20 -116 240 240 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_BOTTOM - textfont UI_FONT_NORMAL - textalign ITEM_ALIGN_LEFT - textscale TEXTSIZE_SMALL - visible 1 - mouseEnter { play CHOICE_FOCUS_SOUND; } - decoration - autowrapped - } - */ - //CHOICE_FOOTNOTE( "@MENU_GRAPHICS_WARNING", 340, 340 ) - } - - menuDef - { - name apply_picmip_popmenu - fullScreen 0 - rect 0 0 640 480 - focusColor COLOR_FOCUSED - soundloop "" - onOpen - { - setLocalVarBool ui_showApply 0; - - execnow "setfromdvar r_picmip ui_r_picmip"; - execnow "setfromdvar r_picmip_bump ui_r_picmip_bump"; - execnow "setfromdvar r_picmip_spec ui_r_picmip_spec"; - execnow "setfromdvar r_picmip_manual ui_r_picmip_manual"; - exec "wait; wait; r_applyPicmip"; - close apply_picmip_popmenu; - open options_graphics_texture; - } - - // background black frame - PREPROC_SHADER_DRAW( 320 0 600 480, "white", 0.1 0.1 0.12 1 ) - - CHOICE_SECTION_TITLE( 1, "@MENU_APPLYING_CHANGES" ) - } -} diff --git a/mods/patch_mp/ui_mp/after_action_report.menu b/mods/patch_mp/ui_mp/after_action_report.menu deleted file mode 100644 index bad3bdb..0000000 --- a/mods/patch_mp/ui_mp/after_action_report.menu +++ /dev/null @@ -1,2127 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui_mp/stats_info.inc" -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" -#include "ui_mp/cac_viewer.inc" - -#define AAR_HEIGHT NEW_FRAME_DEFAULT_HEIGHT -#define AAR_WIDTH ( (AAR_HEIGHT * FRAME_ASPECT_RATIO) ) - -#undef HIGHLIGHT_COLOR -#define HIGHLIGHT_COLOR 0.3 0.35 0.55 0.25 - -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui_mp/overlaybg.inc" -#include "ui_mp/popup_player_info.inc" -#include "ui_mp/fileshare.inc" -#include "ui_mp/tab_slider.inc" -#include "ui_mp/item_animate.inc" - -#undef CHOICE_HORIZONTAL_ALIGN -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER -#undef CHOICE_VERTICAL_ALIGN -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER - -#define AAR_AWARD_IMAGE_COLOR 0.8 0.68 0.47 0.6 -#define AAR_AWARD_IMAGE_COLOR_GREY 1 1 1 0.3 - -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL - -#define AAR_BODY_X_START ( -AAR_WIDTH / 2 + 15 ) -#define AAR_BODY_Y_START ( -AAR_HEIGHT / 2 + 15 + NEW_FRAME_BG_Y_OFFSET( AAR_HEIGHT ) ) - -#define AAR_COLOR_YELLOW 0.98 0.83 0.25 1 - -#define CHOICE_TAB_TEXTSIZE TEXTSIZE_DEFAULT -#define TAB_1_TEXT ( locString( "@MPUI_SUMMARY_CAPS" ) ) -#define TAB_2_TEXT ( locString( "@MPUI_AWARDS_CAPS" ) ) -#define TAB_3_TEXT ( locString( "@MENU_SCOREBOARD_CAPS" ) ) - -#define WAGER_TAB_1_TEXT ( locString( "@MPUI_SUMMARY_CAPS" ) ) -#define WAGER_TAB_2_TEXT ( locString( "@MENU_SCOREBOARD_CAPS" ) ) - -#define TAB_BG_PAD 5 - -#define TAB_1_WIDTH ( getTextWidth( TAB_1_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_2_WIDTH ( getTextWidth( TAB_2_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_3_WIDTH ( getTextWidth( TAB_3_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) - -#define WAGER_TAB_1_WIDTH ( getTextWidth( WAGER_TAB_1_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define WAGER_TAB_2_WIDTH ( getTextWidth( WAGER_TAB_2_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) - -#define TAB_HEIGHT 15 - -#define AAR_TAB_1_X 4 -#define AAR_TAB_2_X ( AAR_TAB_1_X + TAB_1_WIDTH ) -#define AAR_TAB_3_X ( AAR_TAB_2_X + TAB_2_WIDTH ) - -#define AAR_WAGER_TAB_1_X AAR_TAB_1_X -#define AAR_WAGER_TAB_2_X ( AAR_WAGER_TAB_1_X + WAGER_TAB_1_WIDTH ) - -#define AAR_TAB_Y ( ( -AAR_HEIGHT / 2 ) + NEW_FRAME_HEADER_HEIGHT - TAB_HEIGHT ) - -#undef CHOICE_TEXTCOLOR -#define CHOICE_TEXTCOLOR NEW_FRAME_COMMON_TEXT_COLOR - -#ifdef CONSOLE -#define PREPROC_TEXT_DRAW_ADV_VIS_AAR( px, py, pw, ph, pHorizAlign, pVertAlign, ptext, psize, palignx, paligny, palign, pcolor, pvis, extraArgs, pageNumber, targetMenuNumber ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( px, py, pw, ph, pHorizAlign, pVertAlign, ptext, psize, palignx, paligny, palign, pcolor, pvis, extraArgs ) - -#define PREPROC_TEXT_DRAW_ADV_VIS_AAR_WAGER( px, py, pw, ph, pHorizAlign, pVertAlign, ptext, psize, palignx, paligny, palign, pcolor, pvis, extraArgs, pageNumber, targetMenuNumber ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( px, py, pw, ph, pHorizAlign, pVertAlign, ptext, psize, palignx, paligny, palign, pcolor, pvis, extraArgs ) -#else // #ifdef CONSOLE - -#define PREPROC_TEXT_DRAW_ADV_VIS_AAR( px, py, pw, ph, pHorizAlign, pVertAlign, ptext, psize, palignx, paligny, palign, pcolor, pvis, extraArgs, pageNumber, targetMenuNumber ) \ - PREPROC_TEXT_DRAW_ADV_ALL_AAR( px, py, pw, ph, pHorizAlign, pVertAlign, ptext, psize, palignx, paligny, palign, pcolor, CHOICE_TEXTFONT, CHOICE_TEXTSTYLE, pvis, extraArgs, pageNumber, targetMenuNumber ) - -#define PREPROC_TEXT_DRAW_ADV_ALL_AAR( px, py, pw, ph, pHorizAlign, pVertAlign, ptext, psize, palignx, paligny, palign, pcolor, pfont, pstyle, pvis, extraArgs, pageNumber, targetMenuNumber ) \ - itemDef \ - { \ - type ITEM_TYPE_BUTTON \ - rect 0 0 0 0 pHorizAlign pVertAlign \ - exp rect X( px ) \ - exp rect Y( py ) \ - exp rect W( pw ) \ - exp rect H( ph ) \ - textalign palign \ - textalignx palignx \ - textaligny paligny \ - textstyle pstyle \ - textfont pfont \ - textscale psize \ - forecolor pcolor \ - exp text( ptext ); \ - visible pvis \ - action \ - { \ - if( pageNumber == 1 ) \ - { \ - closeImmediate menu_aar_summary; \ - } \ - elseif( pageNumber == 2 ) \ - { \ - if( dvarInt(ui_aar_current_view_num) == AAR_VIEW_AWARDS_PERSONAL_BESTS ) \ - { closeImmediate menu_aar_awards_personal_bests; } \ - elseif ( dvarInt(ui_aar_current_view_num) == AAR_VIEW_AWARDS_STATS_MILESTONES ) \ - { closeImmediate menu_aar_awards_stats_milestones; } \ - elseif ( dvarInt(ui_aar_current_view_num) == AAR_VIEW_AWARDS_CONTRACTS ) \ - { closeImmediate menu_aar_awards_contracts; } \ - } \ - elseif( pageNumber == 3 ) \ - { \ - closeImmediate menu_aar_scoreboard; \ - } \ - if( targetMenuNumber == 1 ) \ - { \ - openImmediate menu_aar_summary; \ - } \ - elseif( targetMenuNumber == 2 ) \ - { \ - if( dvarInt(ui_aar_current_view_num) == AAR_VIEW_AWARDS_PERSONAL_BESTS ) \ - { openImmediate menu_aar_awards_personal_bests; } \ - elseif ( dvarInt(ui_aar_current_view_num) == AAR_VIEW_AWARDS_STATS_MILESTONES ) \ - { openImmediate menu_aar_awards_stats_milestones; } \ - elseif ( dvarInt(ui_aar_current_view_num) == AAR_VIEW_AWARDS_CONTRACTS ) \ - { openImmediate menu_aar_awards_contracts; } \ - } \ - elseif( targetMenuNumber == 3 ) \ - { \ - openImmediate menu_aar_scoreboard; \ - } \ - play CHOICE_FOCUS_SOUND; \ - } \ - mouseEnter \ - { \ - play CHOICE_FOCUS_SOUND; \ - } \ - extraArgs \ - } - -#define PREPROC_TEXT_DRAW_ADV_VIS_AAR_WAGER( px, py, pw, ph, pHorizAlign, pVertAlign, ptext, psize, palignx, paligny, palign, pcolor, pvis, extraArgs, pageNumber, targetMenuNumber ) \ - PREPROC_TEXT_DRAW_ADV_ALL_AAR_WAGER( px, py, pw, ph, pHorizAlign, pVertAlign, ptext, psize, palignx, paligny, palign, pcolor, CHOICE_TEXTFONT, CHOICE_TEXTSTYLE, pvis, extraArgs, pageNumber, targetMenuNumber ) - -#define PREPROC_TEXT_DRAW_ADV_ALL_AAR_WAGER( px, py, pw, ph, pHorizAlign, pVertAlign, ptext, psize, palignx, paligny, palign, pcolor, pfont, pstyle, pvis, extraArgs, pageNumber, targetMenuNumber ) \ - itemDef \ - { \ - type ITEM_TYPE_BUTTON \ - rect 0 0 0 0 pHorizAlign pVertAlign \ - exp rect X( px ) \ - exp rect Y( py ) \ - exp rect W( pw ) \ - exp rect H( ph ) \ - textalign palign \ - textalignx palignx \ - textaligny paligny \ - textstyle pstyle \ - textfont pfont \ - textscale psize \ - forecolor pcolor \ - exp text( ptext ); \ - visible pvis \ - action \ - { \ - if( pageNumber == 1 ) \ - { \ - closeImmediate menu_wager_aar_summary; \ - } \ - elseif( pageNumber == 2 ) \ - { \ - closeImmediate menu_aar_wager_scoreboard; \ - } \ - if( targetMenuNumber == 1 ) \ - { \ - openImmediate menu_wager_aar_summary; \ - } \ - elseif( targetMenuNumber == 2 ) \ - { \ - openImmediate menu_aar_wager_scoreboard; \ - } \ - play CHOICE_FOCUS_SOUND; \ - } \ - mouseEnter \ - { \ - play CHOICE_FOCUS_SOUND; \ - } \ - extraArgs \ - } - -#endif // #ifdef CONSOLE - -#define AAR_TAB_HEADERS( pageNumber ) \ - PREPROC_TEXT_DRAW_ADV_VIS_AAR( ( -AAR_WIDTH / 2 + AAR_TAB_1_X ), \ - AAR_TAB_Y, \ - TAB_1_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_1_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( pageNumber != 1 );, TAB_MOUSEOVER_HIGHLIGHT;, pageNumber, 1 ) \ - PREPROC_TEXT_DRAW_ADV_VIS_AAR( ( -AAR_WIDTH / 2 + AAR_TAB_1_X ), \ - AAR_TAB_Y, \ - TAB_1_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_1_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( pageNumber == 1 );, ;, pageNumber, 1 )\ - PREPROC_TEXT_DRAW_ADV_VIS_AAR( ( -AAR_WIDTH / 2 + AAR_TAB_2_X ), \ - AAR_TAB_Y, \ - TAB_2_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_2_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( pageNumber != 2 );, TAB_MOUSEOVER_HIGHLIGHT;, pageNumber, 2 ) \ - PREPROC_TEXT_DRAW_ADV_VIS_AAR( ( -AAR_WIDTH / 2 + AAR_TAB_2_X ), \ - AAR_TAB_Y, \ - TAB_2_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_2_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( pageNumber == 2 );, ;, pageNumber, 2 )\ - PREPROC_TEXT_DRAW_ADV_VIS_AAR( ( -AAR_WIDTH / 2 + AAR_TAB_3_X ), \ - AAR_TAB_Y, \ - TAB_3_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_3_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( pageNumber != 3 );, TAB_MOUSEOVER_HIGHLIGHT;, pageNumber, 3 ) \ - PREPROC_TEXT_DRAW_ADV_VIS_AAR( ( -AAR_WIDTH / 2 + AAR_TAB_3_X ), \ - AAR_TAB_Y, \ - TAB_3_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_3_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( pageNumber == 3 );, ;, pageNumber, 3 ) - -#define AAR_WAGER_TAB_HEADERS( pageNumber ) \ - PREPROC_TEXT_DRAW_ADV_VIS_AAR_WAGER( ( -AAR_WIDTH / 2 + AAR_WAGER_TAB_1_X ), \ - AAR_TAB_Y, \ - WAGER_TAB_1_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - WAGER_TAB_1_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( pageNumber != 1 );, TAB_MOUSEOVER_HIGHLIGHT;, pageNumber, 1 ) \ - PREPROC_TEXT_DRAW_ADV_VIS_AAR_WAGER( ( -AAR_WIDTH / 2 + AAR_WAGER_TAB_1_X ), \ - AAR_TAB_Y, \ - WAGER_TAB_1_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - WAGER_TAB_1_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( pageNumber == 1 );, ;, pageNumber, 1 ) \ - PREPROC_TEXT_DRAW_ADV_VIS_AAR_WAGER( ( -AAR_WIDTH / 2 + AAR_WAGER_TAB_2_X ), \ - AAR_TAB_Y, \ - WAGER_TAB_2_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - WAGER_TAB_2_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( pageNumber != 2 );, TAB_MOUSEOVER_HIGHLIGHT;, pageNumber, 2 ) \ - PREPROC_TEXT_DRAW_ADV_VIS_AAR_WAGER( ( -AAR_WIDTH / 2 + AAR_WAGER_TAB_2_X ), \ - AAR_TAB_Y, \ - WAGER_TAB_2_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - WAGER_TAB_2_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( pageNumber == 2 );, ;, pageNumber, 2 ) - -#define AAR_TAB_BG( px, pw, selected ) \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER_FRAMED \ - frame 16 0.2 FRAME_OPEN_BOTTOM \ - rect 0 AAR_TAB_Y 0 TAB_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ - exp rect X( ( -AAR_WIDTH / 2 + px ) ) \ - exp rect W( pw ) \ - background "menu_mp_tab_frame_inner" \ - forecolor 0.5 0.5 0.5 0.5 \ - visible when( selected ) \ - decoration \ - } \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER_FRAMED \ - frame 16 0.2 FRAME_OPEN_BOTTOM \ - rect 0 AAR_TAB_Y 0 TAB_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ - exp rect X( ( -AAR_WIDTH / 2 + px ) ) \ - exp rect W( pw ) \ - background "menu_mp_tab_frame_inner" \ - forecolor 1 1 1 1 \ - visible when( !selected ) \ - decoration \ - } - - -#define AAR_VIEW_AWARDS_PERSONAL_BESTS 0 -#define AAR_VIEW_AWARDS_STATS_MILESTONES 1 -#define AAR_VIEW_AWARDS_CONTRACTS 2 - -#define OPEN_PREVIOUS_MENU( currMenu, menu ) \ - if( currMenu == menu_aar_scoreboard ) \ - { \ - if( dvarInt(ui_aar_current_view_num) == AAR_VIEW_AWARDS_PERSONAL_BESTS ) \ - { openImmediate menu_aar_awards_personal_bests; } \ - elseif ( dvarInt(ui_aar_current_view_num) == AAR_VIEW_AWARDS_STATS_MILESTONES ) \ - { openImmediate menu_aar_awards_stats_milestones; } \ - elseif ( dvarInt(ui_aar_current_view_num) == AAR_VIEW_AWARDS_CONTRACTS ) \ - { openImmediate menu_aar_awards_contracts; } \ - } \ - else \ - { \ - openImmediate menu; \ - } - -#define OPEN_NEXT_MENU( currMenu, menu ) \ - if( currMenu == menu_aar_summary ) \ - { \ - if( dvarInt(ui_aar_current_view_num) == AAR_VIEW_AWARDS_PERSONAL_BESTS ) \ - { openImmediate menu_aar_awards_personal_bests; } \ - elseif ( dvarInt(ui_aar_current_view_num) == AAR_VIEW_AWARDS_STATS_MILESTONES ) \ - { openImmediate menu_aar_awards_stats_milestones; } \ - elseif ( dvarInt(ui_aar_current_view_num) == AAR_VIEW_AWARDS_CONTRACTS ) \ - { openImmediate menu_aar_awards_contracts; } \ - } \ - else \ - { \ - openImmediate menu; \ - } - -#define CHANGE_MENU_ACTION( currMenu, prevMenu, nextMenu ) \ - execKeyInt DPAD_LEFT { \ - closeImmediate currMenu; \ - OPEN_PREVIOUS_MENU( currMenu, prevMenu ) \ - } \ - execKeyInt DPAD_RIGHT { \ - closeImmediate currMenu; \ - OPEN_NEXT_MENU( currMenu, nextMenu ) \ - } \ - execKeyInt APAD_LEFT { \ - closeImmediate currMenu; \ - OPEN_PREVIOUS_MENU( currMenu, prevMenu ) \ - } \ - execKeyInt APAD_RIGHT { \ - closeImmediate currMenu; \ - OPEN_NEXT_MENU( currMenu, nextMenu ) \ - } \ - PC_TAB_SWITCH_ACTIONS( currMenu, prevMenu, nextMenu ) - -#define GET_AAR_STAT( statName ) \ - getDStat( "AfterActionReportStats", statName ) - -#define GET_AAR_STAT_WITH_INDEX( statName, statIndex ) \ - getDStat( "AfterActionReportStats", statName, statIndex ) - -#define SUMMARY_X_START ( -AAR_WIDTH / 2 + 25 ) -#define SUMMARY_DESC_Y_START (AAR_BODY_Y_START+20) - -#define SUMMARY_XP_BAR_Y_START (SUMMARY_DESC_Y_START+250) - -#define SUMMARY_XP_BAR_WIDTH (AAR_WIDTH - 160) - -#define PROGRESS_BAR_SPEED 1000 //milliseconds -#define CP_COUNTUP_SPEED 1000 //milliseconds - -#define BG_WIDTH 230 -#define BG_WIDTH_RIGHT_OFFSET (BG_WIDTH-67) - -#define RIGHT_BOX_WIDTH 250 -#define AWARDS_BOX_HEIGHT 120 -#define AWARD_SIZE 80 - -#define SUMMARY_RIGHT_X_START (SUMMARY_X_START+260) - -#define SUMMARY_RIGHT_DESC_Y_START (SUMMARY_DESC_Y_START+50) - -#define SUMMARY_RIGHT_DESC_WIDTH RIGHT_BOX_WIDTH - -#define NEMESIS_INFO_Y_START (SUMMARY_DESC_Y_START+145) - -#define NEMESIS_VIS_CONDITION ( GET_AAR_STAT( "NEMESISXUID" ) != 0 ) - -#define BAR_FIXED SUMMARY_XP_BAR_WIDTH*((getDStat( "PlayerStatsList", "RANKXP" )-int(tablelookup( "mp/ranktable.csv", 0, string(getDStat( "PlayerStatsList", "RANK" )), 2)))/int(tablelookup("mp/ranktable.csv",0,getDStat( "PlayerStatsList", "RANK" ),3))) -#define BAR_WIDTH BAR_FIXED*min( ((milliseconds()-dvarInt(ui_time_marker))/PROGRESS_BAR_SPEED), 1 ) -#define ANIMATE_BAR (dvarInt(ui_aar_xp_bar_width_multiplier) * BAR_WIDTH) - -#define REQUIRED_XP int(getDStat( "PlayerStatsList", "RANKXP" )-int(tablelookup( "mp/ranktable.csv", 0, string(getDStat( "PlayerStatsList", "RANK" )), 2))) -#define ANIMATE_NUM (dvarInt(ui_aar_xp_bar_width_multiplier)*int(min( REQUIRED_XP, REQUIRED_XP*((milliseconds()-dvarInt(ui_time_marker))/PROGRESS_BAR_SPEED) ))) - -#define XP_STRING string( dvarInt(ui_aar_xp_bar_width_multiplier) * int(min(GET_AAR_STAT( "XPEARNED" ), (GET_AAR_STAT( "XPEARNED" ) * ((milliseconds()-dvarInt(ui_time_marker))/PROGRESS_BAR_SPEED) ) )) ) -#define CP_INT ( dvarInt(ui_aar_cp_multiplier) * int(min(GET_AAR_STAT( "CPEARNED" ), (GET_AAR_STAT( "CPEARNED" ) * ((milliseconds()-dvarInt(ui_cp_time_marker))/CP_COUNTUP_SPEED) ) )) ) - -#define REQUIRED_XP_STRING (int(tablelookup( "mp/ranktable.csv", 0, string(getDStat( "PlayerStatsList", "RANK" )), 3 ))-ANIMATE_NUM) - -#define AAR_ESC_ACTION( menuName ) \ - deactivateblur; \ - if (IsInGame()) \ - { \ - hideMenu "pausedbkgnd"; \ - } \ - play uin_navigation_menu_lg_close; \ - execnow changemenucloseslidedirection menuName MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM; \ - close self; - -#ifdef CONSOLE -#define CLOSE_BUTTON( menuName ) \ - itemDef \ - { \ - type ITEM_TYPE_BUTTON \ - rect (AAR_WIDTH/2-8) ( AAR_HEIGHT / 2 + 18 ) 0 0 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - text "@PLATFORM_CLOSE_AAR" \ - textfont UI_FONT_NORMAL \ - textscale TEXTSIZE_DEFAULT \ - textalign ITEM_ALIGN_BOTTOM_RIGHT \ - visible 1 \ - decoration \ - execkeyint BUTTON_A \ - { \ - AAR_ESC_ACTION( menuName ) \ - } \ - } -#else // #ifdef CONSOLE -#define CLOSE_BUTTON( menuName ) \ - NEW_FRAME_BUTTON_PC_LEFT_OFFSET( AAR_WIDTH, AAR_HEIGHT, 0, "@MENU_CLOSE", AAR_ESC_ACTION( menuName ), when(!dvarBool(ui_playercardOpen)) ) -#endif // #ifdef CONSOLE -{ - menuDef - { - name menu_aar_summary - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - control MENU_CONTROL_OPENER - onOpen - { - activateBlur; - if (IsInGame()) - { - showMenu "pausedbkgnd"; - } - if( dvarBool(ui_aar_animate_xp_bar) ) - { - setdvar ui_aar_cp_multiplier "0"; - setdvar ui_aar_xp_bar_width_multiplier "0"; - } - setdvar ui_hide_eog_menu "1"; - } - onFocus - { - if( dvarBool(ui_aar_animate_xp_bar) ) - { - ITEM_ANIMATE( menu_aar_summary, anim_controller, countUpNumbers, 50 ) - execNow set ui_aar_animate_xp_bar 0; - } - } - onClose - { - deactivateBlur; - setdvar ui_hide_eog_menu "0"; - } - onESC - { - AAR_ESC_ACTION( menu_aar_summary ) - } - - NEW_FRAME( AAR_WIDTH, AAR_HEIGHT ) - NEW_FRAME_TITLE( AAR_WIDTH, AAR_HEIGHT, "@MPUI_AFTER_ACTION_REPORT_CAPS", 1 ) - - AAR_TAB_BG( AAR_TAB_1_X, TAB_1_WIDTH, 1 ) - AAR_TAB_BG( AAR_TAB_2_X, TAB_2_WIDTH, 0 ) - AAR_TAB_BG( AAR_TAB_3_X, TAB_3_WIDTH, 0 ) - - AAR_TAB_HEADERS( 1 ) - - PLAYER_INFO_VIS( AAR_WIDTH, AAR_HEIGHT, 1 ) - - // This is a dummy itemDef that acts as the central hub for - // animation control - itemDef - { - name anim_controller - style WINDOW_STYLE_SHADER - rect 0 0 0 0 - visible 1 - decoration - - - state - { - name countUpNumbers - onEnter - { - if ( GET_AAR_STAT( "CPEARNED" ) > 0 ) - { - play uin_aar_cp_fill; - exec "setdvartotime ui_cp_time_marker"; - setdvar ui_aar_cp_multiplier "1"; - changeState animateXpBar CP_COUNTUP_SPEED; - } - else - { - changeState animateXpBar 0; - } - } - } - state - { - name animateXpBar - onEnter - { - if( BAR_FIXED > 0 ) - { - play uin_aar_xp_fill; - } - exec "setdvartotime ui_time_marker"; // animation start marker - exec set ui_aar_xp_bar_width_multiplier "1"; - } - } - } - - /* Label for "TOTAL CURRENCY EARNED" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_CURRENCY_EARNED_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* TOTAL CURRENCY EARNED */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+BG_WIDTH_RIGHT_OFFSET) (SUMMARY_DESC_Y_START) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - locString( "@MENU_POINTS", CP_INT ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_GREEN_RGB 1, 1 ) - - /* Label for "TOTAL XP EARNED" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+20) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_TOTALXP_PRE_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* TOTAL XP EARNED */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+BG_WIDTH_RIGHT_OFFSET) (SUMMARY_DESC_Y_START+20) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - "+"+XP_STRING, - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_YELLOW_RGB 1, 1 ) - - /* BG FOR SCORE */ - PREPROC_SHADER_DRAW( SUMMARY_X_START (SUMMARY_DESC_Y_START+40) BG_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - /* Label for "SCORE" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+45) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_MATCH_XP_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* SCORE */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+BG_WIDTH_RIGHT_OFFSET) (SUMMARY_DESC_Y_START+45) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - GET_AAR_STAT( "SCORE" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* Label for "MATCH BONUS" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+65) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_MATCHBONUS_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* MATCH BONUS */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+BG_WIDTH_RIGHT_OFFSET) (SUMMARY_DESC_Y_START+65) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - GET_AAR_STAT( "MATCHBONUS" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* BG FOR OTHER BONUSES */ - PREPROC_SHADER_DRAW( SUMMARY_X_START (SUMMARY_DESC_Y_START+80) BG_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - /* Label for "OTHER BONUSES" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+85) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_OTHER_BONUSES_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* OTHER BONUSES */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+BG_WIDTH_RIGHT_OFFSET) (SUMMARY_DESC_Y_START+85) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - GET_AAR_STAT( "MISCBONUS" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - - /* Label for "AWARDS" */ - PREPROC_TEXT_DRAW_VIS( SUMMARY_RIGHT_X_START SUMMARY_DESC_Y_START 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_AWARDS_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - - /* BG FOR AWARDS */ - PREPROC_SHADER_DRAW( SUMMARY_RIGHT_X_START (SUMMARY_DESC_Y_START+15) RIGHT_BOX_WIDTH AWARDS_BOX_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - - /* AWARD IMAGES */ - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-AWARD_SIZE/2-AWARD_SIZE) (SUMMARY_DESC_Y_START+25) AWARD_SIZE AWARD_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_lobby_aar_award_best", AAR_AWARD_IMAGE_COLOR_GREY, when( GetAfterActionReportAwardsInfo( 0 ) <= 0 ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-AWARD_SIZE/2) (SUMMARY_DESC_Y_START+25) AWARD_SIZE AWARD_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_lobby_aar_award_challenge", AAR_AWARD_IMAGE_COLOR_GREY, when( GetAfterActionReportAwardsInfo( 1 ) <= 0 ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2+AWARD_SIZE/2) (SUMMARY_DESC_Y_START+25) AWARD_SIZE AWARD_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_lobby_aar_award_ccontract", AAR_AWARD_IMAGE_COLOR_GREY, when( GetAfterActionReportAwardsInfo( 2 ) <= 0 && !dvarBool( "xblive_basictraining" ) ), ; ) - - /* AWARD IMAGES WHEN YOU ACTUALLY HAVE ONE OR MORE AWARD */ - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-AWARD_SIZE/2-AWARD_SIZE) (SUMMARY_DESC_Y_START+25) AWARD_SIZE AWARD_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_lobby_aar_award_best", AAR_AWARD_IMAGE_COLOR, when( GetAfterActionReportAwardsInfo( 0 ) > 0 ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-AWARD_SIZE/2) (SUMMARY_DESC_Y_START+25) AWARD_SIZE AWARD_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_lobby_aar_award_challenge", AAR_AWARD_IMAGE_COLOR, when( GetAfterActionReportAwardsInfo( 1 ) > 0 ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2+AWARD_SIZE/2) (SUMMARY_DESC_Y_START+25) AWARD_SIZE AWARD_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_lobby_aar_award_ccontract", AAR_AWARD_IMAGE_COLOR, when( GetAfterActionReportAwardsInfo( 2 ) > 0 && !dvarBool( "xblive_basictraining" ) ), ; ) - - /* AWARD CAPTIONS */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-AWARD_SIZE) (SUMMARY_DESC_Y_START+AWARDS_BOX_HEIGHT+15-13) 1 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_AAR_PERSONAL_BESTS_TITLE_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_BOTTOM_CENTER, CHOICE_TEXTCOLOR, 1 ) - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2) (SUMMARY_DESC_Y_START+AWARDS_BOX_HEIGHT+15-13) 1 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_AAR_CHALLENGES_TITLE_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_BOTTOM_CENTER, CHOICE_TEXTCOLOR, 1 ) - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2+AWARD_SIZE) (SUMMARY_DESC_Y_START+AWARDS_BOX_HEIGHT+15-13) 1 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_AAR_CONTRACTS_TITLE_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_BOTTOM_CENTER, CHOICE_TEXTCOLOR, when( !dvarBool( "xblive_basictraining" ) ) ) - - /* AWARD VALUES */ - PREPROC_TEXT_DRAW_ALL( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-AWARD_SIZE) (SUMMARY_DESC_Y_START+25+AWARD_SIZE/2) 1 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetAfterActionReportAwardsInfo( 0 ), - TEXTSIZE_LARGEST, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_ORANGE_RGB 1, UI_FONT_BIG, ITEM_TEXTSTYLE_NORMAL, when( GetAfterActionReportAwardsInfo( 0 ) > 0 ), ; ) - PREPROC_TEXT_DRAW_ALL( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2) (SUMMARY_DESC_Y_START+25+AWARD_SIZE/2) 1 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetAfterActionReportAwardsInfo( 1 ), - TEXTSIZE_LARGEST, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_ORANGE_RGB 1, UI_FONT_BIG, ITEM_TEXTSTYLE_NORMAL, when( GetAfterActionReportAwardsInfo( 1 ) > 0 ), ; ) - PREPROC_TEXT_DRAW_ALL( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2+AWARD_SIZE) (SUMMARY_DESC_Y_START+25+AWARD_SIZE/2) 1 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetAfterActionReportAwardsInfo( 2 ), - TEXTSIZE_LARGEST, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_ORANGE_RGB 1, UI_FONT_BIG, ITEM_TEXTSTYLE_NORMAL, when( GetAfterActionReportAwardsInfo( 2 ) > 0 && !dvarBool( "xblive_basictraining" ) ), ; ) - - PREPROC_TEXT_DRAW_ALL( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-AWARD_SIZE) (SUMMARY_DESC_Y_START+25+AWARD_SIZE/2) 1 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetAfterActionReportAwardsInfo( 0 ), - TEXTSIZE_LARGEST, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 1, UI_FONT_BIG, ITEM_TEXTSTYLE_NORMAL, when( GetAfterActionReportAwardsInfo( 0 ) <= 0 ), ; ) - PREPROC_TEXT_DRAW_ALL( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2) (SUMMARY_DESC_Y_START+25+AWARD_SIZE/2) 1 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetAfterActionReportAwardsInfo( 1 ), - TEXTSIZE_LARGEST, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 1, UI_FONT_BIG, ITEM_TEXTSTYLE_NORMAL, when( GetAfterActionReportAwardsInfo( 1 ) <= 0 ), ; ) - PREPROC_TEXT_DRAW_ALL( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2+AWARD_SIZE) (SUMMARY_DESC_Y_START+25+AWARD_SIZE/2) 1 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetAfterActionReportAwardsInfo( 2 ), - TEXTSIZE_LARGEST, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 1, UI_FONT_BIG, ITEM_TEXTSTYLE_NORMAL, when( GetAfterActionReportAwardsInfo( 2 ) <= 0 && !dvarBool( "xblive_basictraining" ) ), ; ) - - /* --------------------------------------------------------RIGHT SIDE SUMMARY START------------------------------------------------------------------- */ - - /* BG FOR KILLS/DEATHS RATIO */ - PREPROC_SHADER_DRAW( SUMMARY_X_START (SUMMARY_DESC_Y_START+120) BG_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - /* Label for "KILLS/DEATHS RATIO" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+125) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_KILL_DEATH_RATIO_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* KILLS/DEATHS RATIO */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+BG_WIDTH_RIGHT_OFFSET) (SUMMARY_DESC_Y_START+125) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - getFloatAsFormattedString( ( GET_AAR_STAT( "KILLS" ) / max(GET_AAR_STAT( "DEATHS" ), 1) ), 2 ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* Label for "KILLS" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+145) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_KILLS_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* KILLS */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+BG_WIDTH_RIGHT_OFFSET) (SUMMARY_DESC_Y_START+145) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - GET_AAR_STAT( "KILLS" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* BG FOR DEATHS */ - PREPROC_SHADER_DRAW( SUMMARY_X_START (SUMMARY_DESC_Y_START+160) BG_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - /* Label for "DEATHS" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+165) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_DEATHS_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* DEATHS */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+BG_WIDTH_RIGHT_OFFSET) (SUMMARY_DESC_Y_START+165) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - GET_AAR_STAT( "DEATHS" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* Label for "BEST KILL STREAK" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+185) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_BEST_KILLSTREAK_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* BEST KILL STREAK */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+BG_WIDTH_RIGHT_OFFSET) (SUMMARY_DESC_Y_START+185) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - GET_AAR_STAT( "BESTKILLSTREAK" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* BG FOR HEADSHOTS */ - PREPROC_SHADER_DRAW( SUMMARY_X_START (SUMMARY_DESC_Y_START+200) BG_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - /* Label for "HEADSHOTS" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+205) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_HEADSHOTS_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* HEADSHOTS */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+BG_WIDTH_RIGHT_OFFSET) (SUMMARY_DESC_Y_START+205) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - GET_AAR_STAT( "HEADSHOTS" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - - - /* Label for "NEMESIS" */ - PREPROC_TEXT_DRAW_VIS( SUMMARY_RIGHT_X_START (NEMESIS_INFO_Y_START+3) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_NEMESIS_TITLE_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* BG FOR NEMESIS */ - PREPROC_SHADER_DRAW( SUMMARY_RIGHT_X_START (NEMESIS_INFO_Y_START+15) SUMMARY_RIGHT_DESC_WIDTH 61 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - - /* EMBLEM FOR NEMESIS */ - itemDef - { - type ITEM_TYPE_OWNERDRAW - ownerdraw UI_PLAYER_EMBLEM - rect (SUMMARY_RIGHT_X_START+4) (NEMESIS_INFO_Y_START+19) 53 53 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - exp ownerdata( string( GET_AAR_STAT( "NEMESISXUID" ) ) ); - visible when( NEMESIS_VIS_CONDITION ) - decoration - } - - /* NEMESIS GAMERTAG */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+65) (NEMESIS_INFO_Y_START+19) 62 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_AAR_STAT( "NEMESISNAME" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( NEMESIS_VIS_CONDITION) ) - - #define NEMESIS_BUTTON_ACTION \ - if( NEMESIS_VIS_CONDITION ) \ - { \ - execNow set selectedPlayerXuid ( string( GET_AAR_STAT( "NEMESISXUID" ) ) ); \ - execnow set selectedFriendName ( GET_AAR_STAT( "NEMESISNAME" ) ); \ - execNow set ui_nemesisPlayercardOpen 1; \ - execNow set ui_friendsListOpen 0; \ - execNow set ui_playerListOpen 0; \ - execnow changemenucloseslidedirection menu_aar_summary MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; \ - execnow changemenuopenslidedirection menu_aar_summary MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - execnow changemenuopenslidedirection menu_playercard MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; \ - close menu_aar_summary; \ - open menu_playercard; \ - } - - /* VIEW PLAYERCARD BUTTON */ - SIMPLE_CHOICE_BUTTON_ALL( "NemesisButton", (SUMMARY_RIGHT_X_START+65) (NEMESIS_INFO_Y_START+53) 62 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "@PLATFORM_VIEW_NEMESIS_PLAYERCARD", UI_FONT_NORMAL, TEXTSIZE_SMALL, ITEM_ALIGN_MIDDLE_CENTER, - when( NEMESIS_VIS_CONDITION ), - NEMESIS_BUTTON_ACTION ) - - - execkeyint BUTTON_Y - { - NEMESIS_BUTTON_ACTION - } - - - #define XP_TEXT_WIDTH 65 - #define NEXT_LEVEL ( tablelookup( "mp/ranktable.csv", 0, getDStat( "PlayerStatsList", "RANK" ) + 1, 14 ) ) - - /* NEMESIS RANK */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+XP_TEXT_WIDTH) (NEMESIS_INFO_Y_START+36) 62 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - (GET_AAR_STAT( "nemesisRank" )+1), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( NEMESIS_VIS_CONDITION ) ) - /* NEMESIS RANK ICON */ - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+XP_TEXT_WIDTH+20) (NEMESIS_INFO_Y_START+38) 16 16 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, tablelookup( "mp/rankIconTable.csv", 0, GET_AAR_STAT( "NEMESISRANK" ), GET_AAR_STAT( "NEMESISRANKICON" ) + 1 ), 1 1 1 1, when( NEMESIS_VIS_CONDITION && GET_AAR_STAT( "NEMESISRANK" ) > 0 ), ; ) - /* Label for "KILLS" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+160) (NEMESIS_INFO_Y_START+36) 62 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_KILLS_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, when( NEMESIS_VIS_CONDITION ) ) - /* NEMESIS KILLS */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+230) (NEMESIS_INFO_Y_START+36) 62 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_AAR_STAT( "nemesisKills" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( NEMESIS_VIS_CONDITION ) ) - /* Label for "KILLED BY" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+160) (NEMESIS_INFO_Y_START+53) 62 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_KILLED_BY_PRE_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, when( NEMESIS_VIS_CONDITION ) ) - /* KILLED BY */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+230) (NEMESIS_INFO_Y_START+53) 62 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_AAR_STAT( "nemesisKilledBy" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( NEMESIS_VIS_CONDITION ) ) - - /* BACKGROUND FOR XP BAR */ - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_X_START+XP_TEXT_WIDTH) SUMMARY_XP_BAR_Y_START SUMMARY_XP_BAR_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "white", BG_BACKCOLOR, - when( CAN_RANK_UP ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_X_START+XP_TEXT_WIDTH) SUMMARY_XP_BAR_Y_START SUMMARY_XP_BAR_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "menu_mp_bar_shadow", 1 1 1 0.2, - when( CAN_RANK_UP ), ; ) - /* XP BAR */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (SUMMARY_X_START+XP_TEXT_WIDTH), - SUMMARY_XP_BAR_Y_START, - (ANIMATE_BAR), - 20, - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "menu_mp_combatrecord_bar", BAR_COLOR, - when( CAN_RANK_UP ), - name xp_bar; ) - /* Tiny arrow at xp bar end */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( -5 + (SUMMARY_X_START+XP_TEXT_WIDTH) + ANIMATE_BAR), - (SUMMARY_XP_BAR_Y_START+18), - 10, - 10, - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "ui_arrow_right", BAR_COLOR, - when( CAN_RANK_UP );, - rotation -90; name xp_bar; ) - /* Label for "NEXT LEVEL" */ - PREPROC_TEXT_DRAW( SUMMARY_X_START SUMMARY_XP_BAR_Y_START SUMMARY_XP_BAR_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@MPUI_NEXT_LEVEL_CAPS", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR ) - /* value for XP NEEDED to next level */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+XP_TEXT_WIDTH+10) SUMMARY_XP_BAR_Y_START SUMMARY_XP_BAR_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, locString( "MPUI_AAR_XP_NEEDED_CAPS", REQUIRED_XP_STRING ), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( CAN_RANK_UP ) ) - /* next level */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+SUMMARY_XP_BAR_WIDTH+XP_TEXT_WIDTH+3) (SUMMARY_XP_BAR_Y_START+2) 15 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, int( NEXT_LEVEL ), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( CAN_RANK_UP && PRESTIGE_NEXT==0 ) ) - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+SUMMARY_XP_BAR_WIDTH+XP_TEXT_WIDTH+3) (SUMMARY_XP_BAR_Y_START+2) 15 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "1", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( CAN_RANK_UP && PRESTIGE_NEXT ) ) - /* next level rank icon */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (SUMMARY_X_START+SUMMARY_XP_BAR_WIDTH+XP_TEXT_WIDTH+6+getTextWidth( NEXT_LEVEL, CHOICE_TEXTFONT, TEXTSIZE_DEFAULT )), - (SUMMARY_XP_BAR_Y_START+2), - 15, - 15, - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - tablelookup( "mp/rankIconTable.csv", 0, getDStat( "PlayerStatsList", "RANK" )+1, getDStat( "PlayerStatsList", "PLEVEL" )+1 ), 1 1 1 1, - when( CAN_RANK_UP && PRESTIGE_NEXT==0 ), - ; ) - PREPROC_SHADER_DRAW_ADV_VIS_EX( (SUMMARY_XP_BAR_X_START+SUMMARY_XP_BAR_WIDTH+6+getTextWidth( "1", CHOICE_TEXTFONT, TEXTSIZE_DEFAULT )), - (SUMMARY_XP_BAR_Y_START+2), - 15, - 15, - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - tablelookup( "mp/rankIconTable.csv", 0, 0, getDStat( "PlayerStatsList", "PLEVEL" )+2 ), 1 1 1 1, - when( CAN_RANK_UP && PRESTIGE_NEXT ), - ; ) - - CHANGE_MENU_ACTION( menu_aar_summary, menu_aar_scoreboard, menu_aar_awards_personal_bests ) - - /* PLACE IN FILE SHARE BUTTON */ - #define BUTTON_SPACING 20 - #define FILE_SHARE_BUTTON_OFFSET ( getTextWidth( locString( "@MENU_CLOSE" ), UI_FONT_NORMAL, TEXTSIZE_DEFAULT ) + 8 + BUTTON_SPACING ) - #define FILE_SHARE_BUTTON_ACTION \ - if ( getDStat( "AfterActionReportStats", "demoFileID" ) != "0" ) \ - { \ - execnow fileShareGetLastPlayedGame; \ - open menu_fileshare_aar_loading; \ - } - - //NEW_FRAME_BUTTON_PC_LEFT_OFFSET( AAR_WIDTH, AAR_HEIGHT, FILE_SHARE_BUTTON_OFFSET, "@PLATFORM_FILESHARE_PLACEGAMEINMYFILESHARE", - // FILE_SHARE_BUTTON_ACTION, - // when( getDStat( "AfterActionReportStats", "demoFileID" ) != "0" ) ) - -// execKeyInt BUTTON_X -// { -// FILE_SHARE_BUTTON_ACTION -// } - - CLOSE_BUTTON( menu_aar_summary ) - - #include "ui/safearea.menu" - } - - menuDef - { - name menu_aar_awards_personal_bests - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - control MENU_CONTROL_OPENER - onOpen - { - execNow set ui_aar_current_view_num AAR_VIEW_AWARDS_PERSONAL_BESTS; - setdvar ui_hide_eog_menu "1"; - } - onFocus { activateBlur; } - onClose - { - deactivateBlur; - setdvar ui_hide_eog_menu "0"; - } - onESC - { - AAR_ESC_ACTION( menu_aar_awards_personal_bests ) - } - - NEW_FRAME( AAR_WIDTH, AAR_HEIGHT ) - NEW_FRAME_TITLE( AAR_WIDTH, AAR_HEIGHT, "@MPUI_AFTER_ACTION_REPORT_CAPS", 1 ) - - AAR_TAB_BG( AAR_TAB_1_X, TAB_1_WIDTH, 0 ) - AAR_TAB_BG( AAR_TAB_2_X, TAB_2_WIDTH, 1 ) - AAR_TAB_BG( AAR_TAB_3_X, TAB_3_WIDTH, 0 ) - - AAR_TAB_HEADERS( 2 ) - - PLAYER_INFO_VIS( AAR_WIDTH, AAR_HEIGHT, 1 ) - -#ifdef CONSOLE - /* TITLE */ - PREPROC_TEXT_DRAW( (-AAR_WIDTH / 2) (AAR_BODY_Y_START-5) AAR_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "@PLATFORM_TABBED_MENU_TITLE", "@MPUI_AAR_PERSONAL_BESTS_TITLE_CAPS" ), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR ) -#else - SIMPLE_CHOICE_BUTTON_ARROWS_CENTERED( "aar_awards_personal_bests_title", 0, AAR_BODY_Y_START, 180, "@MPUI_AAR_PERSONAL_BESTS_TITLE_CAPS", - 1, execkeyhandler BUTTON_RSHLDR, execkeyhandler BUTTON_LSHLDR ) -#endif - -#define TOTAL_AAR_AWARDS_VIEWS 3 -#define CURRENT_AAR_AWARDS_VIEW 1 - - /* CURRENT VIEW NUMBER */ - PREPROC_TEXT_DRAW_VIS( (AAR_BODY_X_START+500) (AAR_BODY_Y_START+10) 280 28 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locstring( "MPUI_COMBAT_RECORD_VIEW_NUMBER", CURRENT_AAR_AWARDS_VIEW, TOTAL_AAR_AWARDS_VIEWS ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_LEFT, CHOICE_TEXTCOLOR, 1 ) - -#define AAR_PERSONAL_BESTS_X_START (AAR_BODY_X_START+5) -#define AAR_PERSONAL_BESTS_Y_START (AAR_BODY_Y_START+30) - -#define AAR_PERSONAL_BESTS_BG_WIDTH 170 -#define AAR_PERSONAL_BESTS_BG_HEIGHT 285 - -#define MAX_PERSONALBESTS_DISPLAYED 3 - -#define PERSONAL_BEST_INFO( index, visArg ) \ - /* IMAGE FOR PERSONAL BEST */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+13+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_WIDTH/11), \ - (AAR_PERSONAL_BESTS_BG_HEIGHT/2), \ - (AAR_PERSONAL_BESTS_BG_HEIGHT/2), \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "menu_mp_lobby_aar_award_best", AAR_AWARD_IMAGE_COLOR_GREY, \ - when( GetPersonalBestDelta( index ) <= 0 && visArg );, \ - ; ) \ - /* IMAGE FOR PERSONAL BEST WHEN YOU HAVE BEATEN YOUR PERSONAL BEST */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+13+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_WIDTH/11), \ - (AAR_PERSONAL_BESTS_BG_HEIGHT/2), \ - (AAR_PERSONAL_BESTS_BG_HEIGHT/2), \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "menu_mp_lobby_aar_award_best", AAR_AWARD_IMAGE_COLOR, \ - when( GetPersonalBestDelta( index ) > 0 && visArg );, \ - ; ) \ - /* NEW PERSONAL BEST VALUE, VISIBLE WHEN YOU HAVE BEATEN YOUR PERSONAL BEST */ \ - PREPROC_TEXT_DRAW_ADV_ALL( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_HEIGHT-100), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 1, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - GetPersonalBestValue( index ), \ - TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_ORANGE_RGB 1, CHOICE_TEXTFONT, ITEM_TEXTSTYLE_NORMAL, \ - when( GetPersonalBestDelta( index ) > 0 && visArg );, \ - ; ) \ - /* NEW PERSONAL BEST NAME, VISIBLE WHEN YOU HAVE BEATEN YOUR PERSONAL BEST AND PREFIX IS NOT NULL */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_HEIGHT-80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 40, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - locString( "STATS_PERSONALBESTS_AAR_TEXT_WITH_PREFIX", "STATS_TYPE_"+GetPersonalBestPrefix( index ), "STATS_PERSONALBEST_"+GetPersonalBestName( index ) ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_CENTER, NEW_FRAME_ORANGE_RGB 1, \ - when( GetPersonalBestDelta( index ) > 0 && GetPersonalBestPrefix( index ) != "NULL" && visArg );, \ - autowrapped ) \ - /* NEW PERSONAL BEST NAME, VISIBLE WHEN YOU HAVE BEATEN YOUR PERSONAL BEST */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_HEIGHT-80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 40, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - locString( "STATS_PERSONALBESTS_AAR_TEXT", "STATS_PERSONALBEST_"+GetPersonalBestName( index ) ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_CENTER, NEW_FRAME_ORANGE_RGB 1, \ - when( GetPersonalBestDelta( index ) > 0 && GetPersonalBestPrefix( index ) == "NULL" && visArg );, \ - autowrapped ) \ - /* LABEL FOR "NEW!", VISIBLE WHEN YOU HAVE BEATEN YOUR PERSONAL BEST */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 1, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - "@STATS_NEW_CAPS", \ - TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_TOP_CENTER, NEW_FRAME_ORANGE_RGB 1, \ - when( GetPersonalBestDelta( index ) > 0 && visArg );, \ - autowrapped ) \ - /* VALUE VISIBLE WHEN YOU HAVE TIED YOUR PERSONAL BEST */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_HEIGHT-100), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 1, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - GetPersonalBestValue( index ), \ - TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_COMMON_TEXT_COLOR, \ - when( GetPersonalBestDelta( index ) == 0 && visArg );, \ - ; ) \ - /* NEW PERSONAL BEST NAME, VISIBLE WHEN YOU HAVE TIED YOUR PERSONAL BEST AND PREFIX IS NOT NULL*/ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_HEIGHT-80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 40, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - locString( "STATS_PERSONALBESTS_AAR_TEXT_WITH_PREFIX", "STATS_TYPE_"+GetPersonalBestPrefix( index ), "STATS_PERSONALBEST_"+GetPersonalBestName( index ) ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_CENTER, CHOICE_TEXTCOLOR, \ - when( GetPersonalBestDelta( index ) == 0 && GetPersonalBestPrefix( index ) != "NULL" && visArg );, \ - autowrapped ) \ - /* NEW PERSONAL BEST NAME, VISIBLE WHEN YOU HAVE TIED YOUR PERSONAL BEST */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_HEIGHT-80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 40, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - locString( "STATS_PERSONALBESTS_AAR_TEXT", "STATS_PERSONALBEST_"+GetPersonalBestName( index ) ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_CENTER, CHOICE_TEXTCOLOR, \ - when( GetPersonalBestDelta( index ) == 0 && GetPersonalBestPrefix( index ) == "NULL" && visArg );, \ - autowrapped ) \ - /* LABEL FOR "TIED", VISIBLE WHEN YOU HAVE BEATEN YOUR PERSONAL BEST */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 40, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - "@STATS_TIED_PERSONAL_BEST_CAPS", \ - TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_COMMON_TEXT_COLOR, \ - when( GetPersonalBestDelta( index ) == 0 && visArg );, \ - autowrapped ) \ - /* LABEL FOR "CLOSE", VISIBLE WHEN YOU HAVE COME CLOSE TO BEATING YOUR PERSONAL BEST */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 40, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - "@STATS_CLOSE_PERSONAL_BEST_CAPS", \ - TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_COMMON_TEXT_COLOR, \ - when( GetPersonalBestDelta( index ) < 0 && visArg );, \ - autowrapped ) \ - /* VALUE FOR "GOT", VISIBLE WHEN YOU HAVE COME CLOSE TO BEATING YOUR PERSONAL BEST */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_HEIGHT-100), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 1, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - GetPersonalBestValue( index ), \ - TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_COMMON_TEXT_COLOR, \ - when( GetPersonalBestDelta( index ) < 0 && visArg );, \ - ; ) \ - /* VALUE FOR "NEED", VISIBLE WHEN YOU HAVE COME CLOSE TO BEATING YOUR PERSONAL BEST */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_HEIGHT-60), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 20, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - locString("STATS_PERSONAL_BEST_NEEDED_VALUE_CAPS", ( GetPersonalBestValue( index ) - GetPersonalBestDelta( index ) ) ), \ - TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_LT_GREY_RGB 1, \ - when( GetPersonalBestDelta( index ) < 0 && visArg );, \ - ; ) \ - /* NEW PERSONAL BEST NAME, VISIBLE WHEN YOU HAVE COME CLOSE TO BEATING YOUR PERSONAL BEST AND PREFIX IS NOT NULL*/ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_HEIGHT-80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 40, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - locString( "STATS_PERSONALBESTS_AAR_TEXT_WITH_PREFIX", "STATS_TYPE_"+GetPersonalBestPrefix( index ), "STATS_PERSONALBEST_" + GetPersonalBestName( index ) ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_CENTER, CHOICE_TEXTCOLOR, \ - when( GetPersonalBestDelta( index ) < 0 && GetPersonalBestPrefix( index ) != "NULL" && visArg );, \ - autowrapped ) \ - /* NEW PERSONAL BEST NAME, VISIBLE WHEN YOU HAVE COME CLOSE TO BEATING YOUR PERSONAL BEST */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumPersonalBests(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_HEIGHT-80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 40, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - locString( "STATS_PERSONALBESTS_AAR_TEXT", "STATS_PERSONALBEST_"+GetPersonalBestName( index ) ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_CENTER, CHOICE_TEXTCOLOR, \ - when( GetPersonalBestDelta( index ) < 0 && GetPersonalBestPrefix( index ) == "NULL" && visArg );, \ - autowrapped ) - - PERSONAL_BEST_INFO( 0, ( GetNumPersonalBests() > 0 ) ) - PERSONAL_BEST_INFO( 1, ( GetNumPersonalBests() > 1 ) ) - PERSONAL_BEST_INFO( 2, ( GetNumPersonalBests() > 2 ) ) - - PREPROC_TEXT_DRAW_VIS( (-AAR_WIDTH / 2) 0 AAR_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_AAR_NO_NEW_PERSONAL_BESTS", TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, - CHOICE_TEXTCOLOR, when( GetNumPersonalBests() == 0 ) ) - - execKeyInt BUTTON_LSHLDR - { - closeImmediate self; - openImmediate menu_aar_awards_contracts; - } - execKeyInt BUTTON_RSHLDR - { - closeImmediate self; - openImmediate menu_aar_awards_stats_milestones; - } - - CHANGE_MENU_ACTION( menu_aar_awards_personal_bests, menu_aar_summary, menu_aar_scoreboard ) - - CLOSE_BUTTON( menu_aar_awards_personal_bests ) - - #include "ui/safearea.menu" - } - - menuDef - { - name menu_aar_awards_stats_milestones - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - control MENU_CONTROL_OPENER - onOpen - { - execNow set ui_aar_current_view_num AAR_VIEW_AWARDS_STATS_MILESTONES; - setdvar ui_hide_eog_menu "1"; - } - onFocus { activateBlur; } - onClose - { - deactivateBlur; - setdvar ui_hide_eog_menu "0"; - } - onESC - { - AAR_ESC_ACTION( menu_aar_awards_stats_milestones ) - } - - NEW_FRAME( AAR_WIDTH, AAR_HEIGHT ) - NEW_FRAME_TITLE( AAR_WIDTH, AAR_HEIGHT, "@MPUI_AFTER_ACTION_REPORT_CAPS", 1 ) - - AAR_TAB_BG( AAR_TAB_1_X, TAB_1_WIDTH, 0 ) - AAR_TAB_BG( AAR_TAB_2_X, TAB_2_WIDTH, 1 ) - AAR_TAB_BG( AAR_TAB_3_X, TAB_3_WIDTH, 0 ) - - AAR_TAB_HEADERS( 2 ) - - PLAYER_INFO_VIS( AAR_WIDTH, AAR_HEIGHT, 1 ) - -#ifdef CONSOLE - /* TITLE */ - PREPROC_TEXT_DRAW( (-AAR_WIDTH / 2) (AAR_BODY_Y_START-5) AAR_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "@PLATFORM_TABBED_MENU_TITLE", "@MPUI_AAR_CHALLENGES_TITLE_CAPS" ), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR ) -#else - SIMPLE_CHOICE_BUTTON_ARROWS_CENTERED( "aar_awards_stats_milestones_title", 0, AAR_BODY_Y_START, 180, "@MPUI_AAR_CHALLENGES_TITLE_CAPS", - 1, execkeyhandler BUTTON_RSHLDR, execkeyhandler BUTTON_LSHLDR ) -#endif - -#undef TOTAL_AAR_AWARDS_VIEWS -#define TOTAL_AAR_AWARDS_VIEWS 3 -#undef CURRENT_AAR_AWARDS_VIEW -#define CURRENT_AAR_AWARDS_VIEW 2 - - /* CURRENT VIEW NUMBER */ - PREPROC_TEXT_DRAW_VIS( (AAR_BODY_X_START+500) (AAR_BODY_Y_START+10) 280 28 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locstring( "MPUI_COMBAT_RECORD_VIEW_NUMBER", CURRENT_AAR_AWARDS_VIEW, TOTAL_AAR_AWARDS_VIEWS ), TEXTSIZE_SMALL, - 0, 0, ITEM_ALIGN_LEFT, CHOICE_TEXTCOLOR, 1 ) - - -#define STATS_MILESTONE_INFO( index, visArg ) \ - /* IMAGE FOR STATS MILESTONE */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+13+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumStatsMilestones(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_WIDTH/11), \ - (AAR_PERSONAL_BESTS_BG_HEIGHT/2), \ - (AAR_PERSONAL_BESTS_BG_HEIGHT/2), \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "menu_mp_lobby_aar_award_challenge", AAR_AWARD_IMAGE_COLOR, \ - when( visArg ), \ - ; ) \ - /* LABEL FOR "NEW!", VISIBLE WHEN YOU HAVE A NEW STATS MILESTONE */ \ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumStatsMilestones(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 1, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - "@STATS_NEW_CAPS", \ - TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_TOP_CENTER, NEW_FRAME_ORANGE_RGB 1, \ - when( visArg );, \ - autowrapped ) \ - /* NEW STATS MILESTONE VALUE */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumStatsMilestones(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_HEIGHT-100), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 1, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - GetStatsMilestoneValue( index ), \ - TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_ORANGE_RGB 1, \ - when( visArg );, \ - ; ) \ - /* NEW STATS MILESTONE NAME */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumStatsMilestones(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_HEIGHT-80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 20, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - GetStatsMilestoneName( index ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_CENTER, NEW_FRAME_ORANGE_RGB 1, \ - when( visArg );, \ - ; ) - - STATS_MILESTONE_INFO( 0, ( GetNumStatsMilestones() > 0 ) ) - STATS_MILESTONE_INFO( 1, ( GetNumStatsMilestones() > 1 ) ) - STATS_MILESTONE_INFO( 2, ( GetNumStatsMilestones() > 2 ) ) - - PREPROC_TEXT_DRAW_VIS( (-AAR_WIDTH / 2) 0 AAR_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@MPUI_AAR_NO_NEW_STATS_MILESTONES", TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, when( GetNumStatsMilestones() == 0 || GET_AAR_STAT("PRIVATEMATCH") ) ) - - execKeyInt BUTTON_LSHLDR - { - closeImmediate self; - openImmediate menu_aar_awards_personal_bests; - } - execKeyInt BUTTON_RSHLDR - { - closeImmediate self; - openImmediate menu_aar_awards_contracts; - } - - CHANGE_MENU_ACTION( menu_aar_awards_stats_milestones, menu_aar_summary, menu_aar_scoreboard ) - - CLOSE_BUTTON( menu_aar_awards_stats_milestones ) - - #include "ui/safearea.menu" - } - -#define AAR_SCOREBOARD_COLUMN_SPACING 70 -#define AAR_SCOREBOARD_COLUMN_4_X 420 -#define AAR_SCOREBOARD_COLUMN_3_X ( AAR_SCOREBOARD_COLUMN_4_X - AAR_SCOREBOARD_COLUMN_SPACING ) -#define AAR_SCOREBOARD_COLUMN_2_X ( AAR_SCOREBOARD_COLUMN_3_X - AAR_SCOREBOARD_COLUMN_SPACING ) -#define AAR_SCOREBOARD_COLUMN_1_X ( AAR_SCOREBOARD_COLUMN_2_X - 50 ) -#define AAR_SCOREBOARD_COLUMN_SCORE_X ( AAR_SCOREBOARD_COLUMN_1_X - 50 ) - -#define AAR_DBLCLICK_ACTION( menuName ) \ - play CHOICE_FOCUS_SOUND; \ - execnow set selectedPlayerXuid ( getfeederdata( "xuid" ) ); \ - execnow set selectedFriendName ( getfeederdata( "name" ) ); \ - if( (getfeederdata( "xuid" ) != getXuid()) && (getfeederdata( "xuid" ) != 0) ) \ - { \ - hideMenu self; \ - if (IsInGame()) \ - { \ - showMenu "pausedbkgnd"; \ - } \ - execnow changemenuopenslidedirection menu_playercard MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; \ - execNow openMenu menu_playercard; \ - } - -#define AAR_SCOREBOARD_LISTBOX( scoreboard_name, feederId, x, y, w, h, visArg, extraArgs, menuName ) \ - itemDef \ - { \ - name scoreboard_name \ - type ITEM_TYPE_LISTBOX \ - feeder feederId \ - rect x y w h HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ - origin 0 0 \ - elementwidth 30 \ - elementheight 17 \ - elementtype LISTBOX_TEXT \ - textstyle ITEM_TEXTSTYLE_NORMAL \ - textfont UI_FONT_NORMAL \ - textscale TEXTSIZE_SMALL \ - forecolor 1 1 1 1 \ - focusColor 1 1 1 1 \ - disableColor 1 1 1 1 \ - elementHighlightColor 0 0 0 1 \ - noBlinkingHighlight \ - visible visArg \ - userarea 10 -1 0 (w-16) 19 24 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP /* SCOREBOARD_COLUMN_NEMESIS_BG */ \ - -1 0 40 19 10 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP /* SCOREBOARD_COLUMN_RANK_BG */ \ - 3 0 50 16 10 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_RANK */ \ - 16 1 16 16 32 ITEM_ALIGN_RIGHT ITEM_ALIGN_TOP /* SCOREBOARD_COLUMN_RANK_ICON */ \ - 50 0 100 16 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_NAME */ \ - AAR_SCOREBOARD_COLUMN_SCORE_X 0 100 16 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_SCORE */ \ - AAR_SCOREBOARD_COLUMN_1_X 0 100 16 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_1 */ \ - AAR_SCOREBOARD_COLUMN_2_X 0 100 16 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_2 */ \ - AAR_SCOREBOARD_COLUMN_3_X 0 100 16 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_3 */ \ - AAR_SCOREBOARD_COLUMN_4_X 0 100 16 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_4 */ \ - \ - doubleclick \ - { \ - AAR_DBLCLICK_ACTION( menuName ) \ - } \ - \ - extraArgs \ - } - - menuDef - { - name menu_aar_awards_contracts - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - control MENU_CONTROL_OPENER - onOpen - { - execNow set ui_aar_current_view_num AAR_VIEW_AWARDS_CONTRACTS; - setdvar ui_hide_eog_menu "1"; - } - onFocus { activateBlur; } - onClose - { - deactivateBlur; - setdvar ui_hide_eog_menu "0"; - } - onESC - { - AAR_ESC_ACTION( menu_aar_awards_contracts ) - } - - NEW_FRAME( AAR_WIDTH, AAR_HEIGHT ) - NEW_FRAME_TITLE( AAR_WIDTH, AAR_HEIGHT, "@MPUI_AFTER_ACTION_REPORT_CAPS", 1 ) - - AAR_TAB_BG( AAR_TAB_1_X, TAB_1_WIDTH, 0 ) - AAR_TAB_BG( AAR_TAB_2_X, TAB_2_WIDTH, 1 ) - AAR_TAB_BG( AAR_TAB_3_X, TAB_3_WIDTH, 0 ) - - AAR_TAB_HEADERS( 2 ) - - PLAYER_INFO_VIS( AAR_WIDTH, AAR_HEIGHT, 1 ) - -#ifdef CONSOLE - /* TITLE */ - PREPROC_TEXT_DRAW( (-AAR_WIDTH / 2) (AAR_BODY_Y_START-5) AAR_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "@PLATFORM_TABBED_MENU_TITLE", "@MPUI_AAR_CONTRACTS_TITLE_CAPS" ), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR ) -#else - SIMPLE_CHOICE_BUTTON_ARROWS_CENTERED( "aar_awards_contracts_title", 0, AAR_BODY_Y_START, 180, "@MPUI_AAR_CONTRACTS_TITLE_CAPS", - 1, execkeyhandler BUTTON_RSHLDR, execkeyhandler BUTTON_LSHLDR ) -#endif - -#undef TOTAL_AAR_AWARDS_VIEWS -#define TOTAL_AAR_AWARDS_VIEWS 3 -#undef CURRENT_AAR_AWARDS_VIEW -#define CURRENT_AAR_AWARDS_VIEW 3 - - /* CURRENT VIEW NUMBER */ - PREPROC_TEXT_DRAW_VIS( (AAR_BODY_X_START+500) (AAR_BODY_Y_START+10) 280 28 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locstring( "MPUI_COMBAT_RECORD_VIEW_NUMBER", CURRENT_AAR_AWARDS_VIEW, TOTAL_AAR_AWARDS_VIEWS ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_LEFT, CHOICE_TEXTCOLOR, 1 ) - -#define CONTRACT_INFO( index, visArg ) \ - /* IMAGE FOR CONTRACT WHEN COMPLETE */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+13+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumActiveContracts(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_WIDTH/11), \ - (AAR_PERSONAL_BESTS_BG_HEIGHT/2), \ - (AAR_PERSONAL_BESTS_BG_HEIGHT/2), \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "menu_mp_lobby_aar_award_ccontract", AAR_AWARD_IMAGE_COLOR, \ - when( IsContractComplete( GetIndexForNthActiveContract( index+1 ) ) > 0 && visArg ), \ - ; ) \ - /* IMAGE FOR CONTRACT */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+13+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumActiveContracts(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+AAR_PERSONAL_BESTS_BG_WIDTH/11), \ - (AAR_PERSONAL_BESTS_BG_HEIGHT/2), \ - (AAR_PERSONAL_BESTS_BG_HEIGHT/2), \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "menu_mp_lobby_aar_award_ccontract", AAR_AWARD_IMAGE_COLOR_GREY, \ - when( !IsContractComplete( GetIndexForNthActiveContract( index+1 ) ) && visArg ), \ - ; ) \ - /* CONTRACT NAME */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumActiveContracts(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 20, \ - CHOICE_HORIZONTAL_ALIGN, \ - CHOICE_VERTICAL_ALIGN, \ - GetContractName( GetIndexForNthActiveContract( index+1 ) ), \ - TEXTSIZE_DEFAULT, 0, 0, \ - ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_COMMON_TEXT_COLOR, when( visArg ); autowrapped, ; ) \ - /* CONTRACT REWARD TEXT */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumActiveContracts(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+170), \ - AAR_PERSONAL_BESTS_BG_WIDTH, 20, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - GetContractRewardText( GetIndexForNthActiveContract( index+1 ), 1 ), \ - TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_ORANGE_RGB 1, \ - when( IsContractComplete( GetIndexForNthActiveContract( index+1 ) ) > 0 && visArg ); autowrapped, ; ) \ - /* CONTRACT DESC */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumActiveContracts(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+230), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 40, \ - CHOICE_HORIZONTAL_ALIGN, \ - CHOICE_VERTICAL_ALIGN, \ - GetContractDesc( GetIndexForNthActiveContract( index+1 ) ), \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_CENTER, NEW_FRAME_LT_GREY_RGB 1, when( visArg ); autowrapped, ; ) \ - /* CONTRACT PROGRESS TEXT ( TIME LEFT )*/ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumActiveContracts(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+195), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 20, \ - CHOICE_HORIZONTAL_ALIGN, \ - CHOICE_VERTICAL_ALIGN, \ - secondsAsTime( GetContractCombatTimeLeft( GetIndexForNthActiveContract( index+1 ) ) ), \ - TEXTSIZE_DEFAULT, 0, 0, \ - ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_COMMON_TEXT_COLOR, \ - when( IsContractInProgress( GetIndexForNthActiveContract( index+1 ) ) > 0 && visArg ), ; ) \ - /* CONTRACT PROGRESS TEXT ( ACTUAL PROGRESS ) */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumActiveContracts(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+170), AAR_PERSONAL_BESTS_BG_WIDTH, \ - 20, \ - CHOICE_HORIZONTAL_ALIGN, \ - CHOICE_VERTICAL_ALIGN, \ - locString("MPUI_CONTRACT_PROGRESS_SHORT", GetContractProgress( GetIndexForNthActiveContract( index+1 ) ), GetContractRequiredCount( GetIndexForNthActiveContract( index+1 ) ), int( ( GetContractProgress( GetIndexForNthActiveContract( index+1 ) ) ) * 100 / ( GetContractRequiredCount( GetIndexForNthActiveContract( index+1 ) ) ) ) ), \ - TEXTSIZE_SUBTITLE, 0, 0, \ - ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_COMMON_TEXT_COLOR, \ - when( IsContractInProgress( GetIndexForNthActiveContract( index+1 ) ) > 0 && visArg ), ; ) \ - /* CONTRACT STATUS WHEN IN PROGRESS */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumActiveContracts(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 20, \ - CHOICE_HORIZONTAL_ALIGN, \ - CHOICE_VERTICAL_ALIGN, \ - "@MENU_IN_PROGRESS_CAPS", TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_COMMON_TEXT_COLOR, when( IsContractInProgress( GetIndexForNthActiveContract( index+1 ) ) && visArg ), ; ) \ - /* CONTRACT STATUS WHEN COMPLETED */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumActiveContracts(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 20, \ - CHOICE_HORIZONTAL_ALIGN,\ - CHOICE_VERTICAL_ALIGN, \ - "@MPUI_AAR_CONTRACT_COMPLETE_CAPS", TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_ORANGE_RGB 1, when( IsContractComplete( GetIndexForNthActiveContract( index+1 ) ) > 0 && visArg ), ; ) \ - /* CONTRACT STATUS WHEN EXPIRED */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( (AAR_PERSONAL_BESTS_X_START+(AAR_PERSONAL_BESTS_BG_WIDTH+10)*( ( MAX_PERSONALBESTS_DISPLAYED - min( GetNumActiveContracts(), MAX_PERSONALBESTS_DISPLAYED ) ) / ( MAX_PERSONALBESTS_DISPLAYED - 1 ) ) + ( index * (AAR_PERSONAL_BESTS_BG_WIDTH+10) ) ) ), \ - (AAR_PERSONAL_BESTS_Y_START+80), \ - AAR_PERSONAL_BESTS_BG_WIDTH, \ - 20, \ - CHOICE_HORIZONTAL_ALIGN, \ - CHOICE_VERTICAL_ALIGN, \ - "@MPUI_CONTRACT_EXPIRED_CAPS", TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_COMMON_TEXT_COLOR, when( IsContractExpired( GetIndexForNthActiveContract( index+1 ) ) > 0 && visArg ), ; ) - - CONTRACT_INFO( 0, ( GetNumActiveContracts() > 0 && !dvarBool( "xblive_basictraining" ) ) ) - CONTRACT_INFO( 1, ( GetNumActiveContracts() > 1 && !dvarBool( "xblive_basictraining" ) ) ) - CONTRACT_INFO( 2, ( GetNumActiveContracts() > 2 && !dvarBool( "xblive_basictraining" ) ) ) - -#define NO_ACTIVE_CONTRACTS \ - (GetIndexForActiveContract(0) == -1 && GetIndexForActiveContract(1) == -1 && GetIndexForActiveContract(2) == -1) - - PREPROC_TEXT_DRAW_VIS( (-AAR_WIDTH / 2) 0 AAR_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_AAR_NO_NEW_CONTRACTS", TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, when( NO_ACTIVE_CONTRACTS && !dvarBool( "xblive_basictraining" ) ) ) - - /* Dont show contract info for basic training */ - PREPROC_TEXT_DRAW_VIS( (-AAR_WIDTH / 2) 0 AAR_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_NOT_APPLICABLE_IN_COMBAT_TRAINING", TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, when( dvarBool( "xblive_basictraining" ) ) ) - - - execKeyInt BUTTON_LSHLDR - { - closeImmediate self; - openImmediate menu_aar_awards_stats_milestones; - } - execKeyInt BUTTON_RSHLDR - { - closeImmediate self; - openImmediate menu_aar_awards_personal_bests; - } - - execkeyint BUTTON_A - { - AAR_ESC_ACTION( menu_aar_awards_contracts ) - } - - CHANGE_MENU_ACTION( menu_aar_awards_contracts, menu_aar_summary, menu_aar_scoreboard ) - - CLOSE_BUTTON( menu_aar_awards_contracts ) - - #include "ui/safearea.menu" - } - - menuDef - { - name menu_aar_scoreboard - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - control MENU_CONTROL_OPENER - #ifdef PC - onOpen - { - setdvar ui_hide_eog_menu "1"; - setdvar ui_aarScoreboardOpen "1"; - } - #endif - onFocus - { - activateBlur; - setFocus scoreboard_listbox; - } - onClose - { - deactivateBlur; - setdvar ui_hide_eog_menu "0"; - setdvar ui_aarScoreboardOpen "0"; - } - onESC - { - AAR_ESC_ACTION( menu_aar_scoreboard ) - } - - NEW_FRAME( AAR_WIDTH, AAR_HEIGHT ) - NEW_FRAME_TITLE( AAR_WIDTH, AAR_HEIGHT, "@MPUI_AFTER_ACTION_REPORT_CAPS", 1 ) - - AAR_TAB_BG( AAR_TAB_1_X, TAB_1_WIDTH, 0 ) - AAR_TAB_BG( AAR_TAB_2_X, TAB_2_WIDTH, 0 ) - AAR_TAB_BG( AAR_TAB_3_X, TAB_3_WIDTH, 1 ) - - AAR_TAB_HEADERS( 3 ) - - PLAYER_INFO_VIS( AAR_WIDTH, AAR_HEIGHT, 1 ) - - /* LABEL FOR COLUMN "SCORE" */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+7+AAR_SCOREBOARD_COLUMN_SCORE_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_SCORE_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - /* LABEL FOR COLUMN 1 */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+7+AAR_SCOREBOARD_COLUMN_1_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "@"+getScoreboardColumnHeader( 0 )+"_CAPS" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - /* LABEL FOR COLUMN 2 */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+7+AAR_SCOREBOARD_COLUMN_2_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "@"+getScoreboardColumnHeader( 1 )+"_CAPS" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - /* LABEL FOR COLUMN 3 */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+7+AAR_SCOREBOARD_COLUMN_3_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "@"+getScoreboardColumnHeader( 2 )+"_CAPS" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - /* LABEL FOR COLUMN 4 */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+7+AAR_SCOREBOARD_COLUMN_4_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "@"+getScoreboardColumnHeader( 3 )+"_CAPS" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - - /* SCOREBOARD */ - AAR_SCOREBOARD_LISTBOX( scoreboard_listbox, FEEDER_AAR_SCOREBOARD, (AAR_BODY_X_START+5), (AAR_BODY_Y_START+5), (AAR_WIDTH-40+16), (AAR_HEIGHT-65), 1, ;, menu_aar_scoreboard ) - - CHANGE_MENU_ACTION( menu_aar_scoreboard, menu_aar_awards_personal_bests, menu_aar_summary ) - - CLOSE_BUTTON( menu_aar_scoreboard ) - - #include "ui/safearea.menu" - } - - menuDef - { - name menu_aar_wager_scoreboard - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - control MENU_CONTROL_OPENER - #ifdef PC - onOpen - { - setdvar ui_hide_eog_menu "1"; - setdvar ui_aarWagerScoreboardOpen "1"; - } - #endif - onFocus - { - activateBlur; - setFocus scoreboard_listbox; - } - onClose - { - deactivateBlur; - setdvar ui_hide_eog_menu "0"; - setdvar ui_aarWagerScoreboardOpen "0"; - } - onESC - { - AAR_ESC_ACTION( menu_aar_wager_scoreboard ) - } - - NEW_FRAME( AAR_WIDTH, AAR_HEIGHT ) - NEW_FRAME_TITLE( AAR_WIDTH, AAR_HEIGHT, "@MPUI_EARNINGS_REPORT_CAPS", 1 ) - - AAR_TAB_BG( AAR_WAGER_TAB_1_X, WAGER_TAB_1_WIDTH, 0 ) - AAR_TAB_BG( AAR_WAGER_TAB_2_X, WAGER_TAB_2_WIDTH, 1 ) - - AAR_WAGER_TAB_HEADERS( 2 ) - - PLAYER_INFO_VIS( AAR_WIDTH, AAR_HEIGHT, 1 ) - - /* LABEL FOR COLUMN "SCORE" */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+7+AAR_SCOREBOARD_COLUMN_SCORE_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_SCORE_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - /* LABEL FOR COLUMN 1 */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+7+AAR_SCOREBOARD_COLUMN_1_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "@"+getScoreboardColumnHeader( 0 )+"_CAPS" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - /* LABEL FOR COLUMN 2 */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+7+AAR_SCOREBOARD_COLUMN_2_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "@"+getScoreboardColumnHeader( 1 )+"_CAPS" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - /* LABEL FOR COLUMN 3 */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+7+AAR_SCOREBOARD_COLUMN_3_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "@"+getScoreboardColumnHeader( 2 )+"_CAPS" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - /* LABEL FOR COLUMN 4 */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+7+AAR_SCOREBOARD_COLUMN_4_X-16) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "@"+getScoreboardColumnHeader( 3 )+"_CAPS" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - - /* SCOREBOARD */ - AAR_SCOREBOARD_LISTBOX( scoreboard_listbox, FEEDER_AAR_SCOREBOARD, (AAR_BODY_X_START+5), (AAR_BODY_Y_START+5), (AAR_WIDTH-40+16), (AAR_HEIGHT-65), 1, ;, menu_aar_wager_scoreboard ) - - CHANGE_MENU_ACTION( menu_aar_wager_scoreboard, menu_wager_aar_summary, menu_wager_aar_summary ) - - CLOSE_BUTTON( menu_aar_wager_scoreboard ) - - #include "ui/safearea.menu" - } - - #undef SUMMARY_DESC_Y_START - #define SUMMARY_DESC_Y_START (AAR_BODY_Y_START+7) - - #define WEAPON_WIDTH 180 - #define WEAPON_HEIGHT 90 - #define YOUR_TOP_WEAPON_Y (SUMMARY_DESC_Y_START+AWARDS_BOX_HEIGHT+25) - #define AWARD_TEXT_SIZE (AWARD_SIZE) - - #define WAGER_AWARD_IMAGES( itemArg, xArg, iconArg ) \ - PREPROC_SHADER_DRAW_VIS_EX( (xArg-(AWARD_SIZE*1.8)/2+4) (SUMMARY_DESC_Y_START+25+AWARD_SIZE/2-(AWARD_SIZE*1.8)/2) (AWARD_SIZE*1.8) (AWARD_SIZE*1.8) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_medal_burst_yellow", 1 1 1 0.7, when( GET_AAR_STAT_WITH_INDEX( "wagerAwards", itemArg-1 ) > 0 );, rotation 45; ) \ - PREPROC_SHADER_DRAW_VIS_EX( (xArg-AWARD_SIZE/2) (SUMMARY_DESC_Y_START+25) AWARD_SIZE AWARD_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, iconArg, 1 1 1 0.1, when( GET_AAR_STAT_WITH_INDEX( "wagerAwards", itemArg-1 ) <= 0 );, ; ) \ - PREPROC_SHADER_DRAW_VIS_EX( (xArg-AWARD_SIZE/2) (SUMMARY_DESC_Y_START+25) AWARD_SIZE AWARD_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, iconArg, AAR_AWARD_IMAGE_COLOR, when( GET_AAR_STAT_WITH_INDEX( "wagerAwards", itemArg-1 ) > 0 );, ; ) \ - PREPROC_TEXT_DRAW_ALL( (xArg-AWARD_SIZE/2) (SUMMARY_DESC_Y_START+25) AWARD_SIZE AWARD_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, GET_AAR_STAT_WITH_INDEX( "wagerAwards", itemArg-1 ), TEXTSIZE_LARGEST, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 0.1, UI_FONT_BIG, ITEM_TEXTSTYLE_NORMAL, when( GET_AAR_STAT_WITH_INDEX( "wagerAwards", itemArg-1 ) <= 0 );, ; ) \ - PREPROC_TEXT_DRAW_ALL( (xArg-AWARD_SIZE/2) (SUMMARY_DESC_Y_START+25) AWARD_SIZE AWARD_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, GET_AAR_STAT_WITH_INDEX( "wagerAwards", itemArg-1 ), TEXTSIZE_LARGEST, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 1, UI_FONT_BIG, ITEM_TEXTSTYLE_NORMAL, when( GET_AAR_STAT_WITH_INDEX( "wagerAwards", itemArg-1 ) > 0 );, ; ) - - #define WAGER_AWARD_TEXT1( textArg, gametypeArg ) \ - PREPROC_TEXT_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-AWARD_SIZE-AWARD_TEXT_SIZE/2) (SUMMARY_DESC_Y_START+AWARDS_BOX_HEIGHT+15-40) AWARD_TEXT_SIZE 40 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - textArg, \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 0.1, when( ( GetWagerGametypeNameFromEnum( GET_AAR_STAT("gametype") ) == gametypeArg ) && ( GET_AAR_STAT_WITH_INDEX( "wagerAwards", 0 ) <= 0 ) );, autowrapped; ) \ - PREPROC_TEXT_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-AWARD_SIZE-AWARD_TEXT_SIZE/2) (SUMMARY_DESC_Y_START+AWARDS_BOX_HEIGHT+15-40) AWARD_TEXT_SIZE 40 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - textArg, \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 1, when( ( GetWagerGametypeNameFromEnum( GET_AAR_STAT("gametype") ) == gametypeArg ) && ( GET_AAR_STAT_WITH_INDEX( "wagerAwards", 0 ) > 0 ) );, autowrapped; ) - #define WAGER_AWARD_TEXT2( textArg, gametypeArg ) \ - PREPROC_TEXT_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-AWARD_TEXT_SIZE/2) (SUMMARY_DESC_Y_START+AWARDS_BOX_HEIGHT+15-40) AWARD_TEXT_SIZE 40 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - textArg, \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 0.1, when( ( GetWagerGametypeNameFromEnum( GET_AAR_STAT("gametype") ) == gametypeArg ) && ( GET_AAR_STAT_WITH_INDEX( "wagerAwards", 1 ) <= 0 ) ), autowrapped; ) \ - PREPROC_TEXT_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-AWARD_TEXT_SIZE/2) (SUMMARY_DESC_Y_START+AWARDS_BOX_HEIGHT+15-40) AWARD_TEXT_SIZE 40 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - textArg, \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 1, when( ( GetWagerGametypeNameFromEnum( GET_AAR_STAT("gametype") ) == gametypeArg ) && ( GET_AAR_STAT_WITH_INDEX( "wagerAwards", 1 ) > 0 ) ), autowrapped; ) - #define WAGER_AWARD_TEXT3( textArg, gametypeArg ) \ - PREPROC_TEXT_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2+AWARD_SIZE-AWARD_TEXT_SIZE/2) (SUMMARY_DESC_Y_START+AWARDS_BOX_HEIGHT+15-40) AWARD_TEXT_SIZE 40 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - textArg, \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 0.1, when( ( GetWagerGametypeNameFromEnum( GET_AAR_STAT("gametype") ) == gametypeArg ) && ( GET_AAR_STAT_WITH_INDEX( "wagerAwards", 2 ) <= 0 ) );, autowrapped; ) \ - PREPROC_TEXT_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2+AWARD_SIZE-AWARD_TEXT_SIZE/2) (SUMMARY_DESC_Y_START+AWARDS_BOX_HEIGHT+15-40) AWARD_TEXT_SIZE 40 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - textArg, \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 1, when( ( GetWagerGametypeNameFromEnum( GET_AAR_STAT("gametype") ) == gametypeArg ) && ( GET_AAR_STAT_WITH_INDEX( "wagerAwards", 2 ) > 0 ) );, autowrapped; ) - - menuDef - { - name menu_wager_aar_summary - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - control MENU_CONTROL_OPENER - onOpen - { - activateBlur; - setdvar ui_hide_eog_menu "1"; - } - onFocus - { - } - onClose - { - deactivateBlur; - setdvar ui_hide_eog_menu "0"; - } - onESC - { - AAR_ESC_ACTION( menu_wager_aar_summary ) - } - - NEW_FRAME( AAR_WIDTH, AAR_HEIGHT ) - NEW_FRAME_TITLE( AAR_WIDTH, AAR_HEIGHT, "@MPUI_EARNINGS_REPORT_CAPS", 1 ) - - AAR_TAB_BG( AAR_WAGER_TAB_1_X, WAGER_TAB_1_WIDTH, 1 ) - AAR_TAB_BG( AAR_WAGER_TAB_2_X, WAGER_TAB_2_WIDTH, 0 ) - AAR_WAGER_TAB_HEADERS( 1 ) - - PLAYER_INFO_VIS( AAR_WIDTH, AAR_HEIGHT, 1 ) - - // This is a dummy itemDef that acts as the central hub for - // animation control - itemDef - { - name anim_controller - style WINDOW_STYLE_SHADER - rect 0 0 0 0 - visible 1 - decoration - } - - // Placement medals - #define PLACEMENT_MEDAL_SIZE 64 - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_X_START+85) (SUMMARY_DESC_Y_START+28) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_icon_wager_first", 1 1 1 1, when( GetWagerPlaceForMatchScoreboard( GetIndexIntoMatchScoreboard() ) == 1 ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_X_START+85) (SUMMARY_DESC_Y_START+28) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_icon_wager_second", 1 1 1 1, when( GetWagerPlaceForMatchScoreboard( GetIndexIntoMatchScoreboard() ) == 2 ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_X_START+85) (SUMMARY_DESC_Y_START+28) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_icon_wager_third", 1 1 1 1, when( GetWagerPlaceForMatchScoreboard( GetIndexIntoMatchScoreboard() ) == 3 ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_X_START+85) (SUMMARY_DESC_Y_START+28) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_icon_wager_fourth", 1 1 1 1, when( GetWagerPlaceForMatchScoreboard( GetIndexIntoMatchScoreboard() ) > 3 ), ; ) - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+85-0.5) (SUMMARY_DESC_Y_START+28) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetWagerPlaceForMatchScoreboard( GetIndexIntoMatchScoreboard() ), - TEXTSIZE_LARGEST, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 0.3, when( GetWagerPlaceForMatchScoreboard( GetIndexIntoMatchScoreboard() ) > 3 ); ) - - /* Label for "YOU PLACED XTH!" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+115) (SUMMARY_DESC_Y_START) 1 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "@MPUI_YOU_PLACED_CAPS", "@MPUI_ORDINAL_CAPS_"+GetWagerPlaceForMatchScoreboard( GetIndexIntoMatchScoreboard() ) ), - TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_TOP_CENTER, CHOICE_TEXTCOLOR, 1 ) - - /* Label for "CURRENCY EARNED" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+108) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_CURRENCY_EARNED_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* CURRENCY */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+220) (SUMMARY_DESC_Y_START+108) 1 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - locString( "@MENU_POINTS", GetWagerWinningsFromMatchScoreboard( GetIndexIntoMatchScoreboard() ) ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_GREEN_RGB 1, when( GetWagerWinningsFromMatchScoreboard( GetIndexIntoMatchScoreboard() ) > 0 ) ) - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+220) (SUMMARY_DESC_Y_START+108) 1 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - locString( "@MENU_POINTS", GetWagerWinningsFromMatchScoreboard( GetIndexIntoMatchScoreboard() ) ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_GREY_RGB 1, when( GetWagerWinningsFromMatchScoreboard( GetIndexIntoMatchScoreboard() ) <= 0 ) ) - /* Label for "CAREER WINNINGS" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+125) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_CAREER_WINNINGS_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* CAREER WINNINGS */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+220) (SUMMARY_DESC_Y_START+125) 1 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - locString( "@MENU_POINTS", GetDStat( "PlayerStatsList", "LIFETIME_EARNINGS" ) ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_GREEN_RGB 1, when( GetDStat( "PlayerStatsList", "LIFETIME_EARNINGS" ) > 0 ) ) - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+220) (SUMMARY_DESC_Y_START+125) 1 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - locString( "@MENU_POINTS", GetDStat( "PlayerStatsList", "LIFETIME_EARNINGS" ) ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_GREY_RGB 1, when( GetDStat( "PlayerStatsList", "LIFETIME_EARNINGS" ) <= 0 ) ) - - itemDef - { - type ITEM_TYPE_LISTBOX - feeder FEEDER_AAR_SCOREBOARD_WAGER - rect SUMMARY_X_START (YOUR_TOP_WEAPON_Y+10) BG_WIDTH (AWARDS_BOX_HEIGHT+5) HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - origin 0 0 - elementwidth 30 - elementheight 20 - elementtype LISTBOX_TEXT - textstyle ITEM_TEXTSTYLE_NORMAL - textfont UI_FONT_NORMAL - textscale TEXTSIZE_SMALL - textAligny -2 - forecolor 0 0 0 0.1 - focusColor NEW_FRAME_ORANGE_RGB 1 - disableColor 1 1 1 1 - noBlinkingHighlight - noscrollbars - visible 1 - decoration - userarea 9 0 2 230 20 24 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP /* SCOREBOARD_COLUMN_NEMESIS_BG */ - 10 2 50 20 10 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP /* NOT USED: SCOREBOARD_COLUMN_RANK_BG */ - 10 2 50 20 10 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP /* SCOREBOARD_COLUMN_RANK */ - 23 3 16 16 32 ITEM_ALIGN_RIGHT ITEM_ALIGN_TOP /* NOT USED: SCOREBOARD_COLUMN_RANK_ICON */ - 35 2 100 20 32 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP /* SCOREBOARD_COLUMN_NAME */ - 120 2 100 20 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_TOP /* SCOREBOARD_COLUMN_SCORE */ - 320 0 100 20 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_TOP /* NOT USED: SCOREBOARD_COLUMN_KILLS */ - 370 0 100 20 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_TOP /* NOT USED: SCOREBOARD_COLUMN_ASSISTS */ - 420 0 100 20 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_TOP /* NOT USED: SCOREBOARD_COLUMN_DEATHS */ - } - - /* --------------------------------------------------------RIGHT SIDE SUMMARY START------------------------------------------------------------------- */ - - /* Label for "AWARDS" */ - PREPROC_TEXT_DRAW_VIS( SUMMARY_RIGHT_X_START SUMMARY_DESC_Y_START 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_AWARDS_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* BG FOR AWARDS */ - PREPROC_SHADER_DRAW( SUMMARY_RIGHT_X_START (SUMMARY_DESC_Y_START+15) RIGHT_BOX_WIDTH AWARDS_BOX_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - - /* AWARD IMAGES */ - WAGER_AWARD_IMAGES( 1, (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-AWARD_SIZE), "menu_mp_lobby_aar_wager01" ) - WAGER_AWARD_IMAGES( 2, (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2), "menu_mp_lobby_aar_wager02" ) - WAGER_AWARD_IMAGES( 3, (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2+AWARD_SIZE), "menu_mp_lobby_aar_wager03" ) - - /* ONE IN THE CHAMBER AWARD TEXT */ - WAGER_AWARD_TEXT1( "@MPUI_STABS_CAPS", "oic" ) - WAGER_AWARD_TEXT2( "@MPUI_LONGSHOTS_CAPS", "oic" ) - WAGER_AWARD_TEXT3( "@MPUI_KILL_STREAK_CAPS", "oic" ) - - /* STICKS AND STONES AWARD TEXT */ - WAGER_AWARD_TEXT1( "@MPUI_TOMAHAWKS_CAPS", "hlnd" ) - WAGER_AWARD_TEXT2( "@MPUI_STICKS_CAPS", "hlnd" ) - WAGER_AWARD_TEXT3( "@MPUI_KILL_STREAK_CAPS", "hlnd" ) - - /* GUN GAME AWARD TEXT */ - WAGER_AWARD_TEXT1( "@MPUI_STABS_CAPS", "gun" ) - WAGER_AWARD_TEXT2( "@MPUI_HEADSHOTS_CAPS", "gun" ) - WAGER_AWARD_TEXT3( "@MPUI_KILL_STREAK_CAPS", "gun" ) - - /* SHARPSHOOTER AWARD TEXT */ - WAGER_AWARD_TEXT1( "@MPUI_X2KILLS_CAPS", "shrp" ) - WAGER_AWARD_TEXT2( "@MPUI_HEADSHOTS_CAPS", "shrp" ) - WAGER_AWARD_TEXT3( "@MPUI_KILL_STREAK_CAPS", "shrp" ) - - /* Label for "YOUR TOP WEAPON" */ - PREPROC_TEXT_DRAW_VIS( SUMMARY_RIGHT_X_START YOUR_TOP_WEAPON_Y 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_YOUR_TOP_WEAPON_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* BG FOR "YOUR TOP WEAPON" */ - PREPROC_SHADER_DRAW( SUMMARY_RIGHT_X_START (YOUR_TOP_WEAPON_Y+15) RIGHT_BOX_WIDTH AWARDS_BOX_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - -#define TOP_WEAPON_ITEM_REF ( GetItemRef( GET_AAR_STAT( "topWeaponItemIndex" ) ) ) -#define IS_SPECIAL_TOP_WEAPON ( ( TOP_WEAPON_ITEM_REF == "killstreak_minigun" ) || \ - ( TOP_WEAPON_ITEM_REF == "killstreak_m202_flash" ) || \ - ( TOP_WEAPON_ITEM_REF == "hatchet" ) ) - /* YOUR TOP WEAPON */ - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-WEAPON_WIDTH*1.4/2) (YOUR_TOP_WEAPON_Y+15) (WEAPON_WIDTH*1.4) (WEAPON_HEIGHT*1.4) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_notification_medal_backing", NEW_FRAME_RED_RGB 0.3, when( IS_SPECIAL_TOP_WEAPON || ( GetItemImage( GET_AAR_STAT( "topWeaponItemIndex" ) ) != "" ) );, ; ) - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-WEAPON_WIDTH/2) (YOUR_TOP_WEAPON_Y+15+15) WEAPON_WIDTH WEAPON_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, GetItemImage( GET_AAR_STAT( "topWeaponItemIndex" ) ), 1 1 1 1, when( !IS_SPECIAL_TOP_WEAPON && ( GetItemImage( GET_AAR_STAT( "topWeaponItemIndex" ) ) != "" ) );, ; ) - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-WEAPON_HEIGHT/2) (YOUR_TOP_WEAPON_Y+15+15) WEAPON_HEIGHT WEAPON_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, GetItemImage( GET_AAR_STAT( "topWeaponItemIndex" ) ), 1 1 1 1, when( TOP_WEAPON_ITEM_REF == "hatchet" );, ; ) - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-WEAPON_WIDTH/2) (YOUR_TOP_WEAPON_Y+15+15) WEAPON_WIDTH WEAPON_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_weapons_minigun", 1 1 1 1, when( TOP_WEAPON_ITEM_REF == "killstreak_minigun" );, ; ) - PREPROC_SHADER_DRAW_VIS_EX( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2-WEAPON_WIDTH/2) (YOUR_TOP_WEAPON_Y+15+15) WEAPON_WIDTH WEAPON_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_weapons_grim_reaper", 1 1 1 1, when( TOP_WEAPON_ITEM_REF == "killstreak_m202_flash" );, ; ) - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2) (YOUR_TOP_WEAPON_Y+15+5) 1 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - toUpper( locString( "@"+GetItemName( GET_AAR_STAT( "topWeaponItemIndex" ) ) ) ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_CENTER, CHOICE_TEXTCOLOR, 1 ) - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+RIGHT_BOX_WIDTH/2) (YOUR_TOP_WEAPON_Y+15+AWARDS_BOX_HEIGHT-7) 1 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "@MPUI_KILLS_CAPS" )+" "+GET_AAR_STAT( "topWeaponKills" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_BOTTOM_CENTER, CHOICE_TEXTCOLOR, 1 ) - - /* PLACE IN FILE SHARE BUTTON */ - #undef BUTTON_SPACING - #undef FILE_SHARE_BUTTON_OFFSET - #undef FILE_SHARE_BUTTON_ACTION - - #define BUTTON_SPACING 20 - #define FILE_SHARE_BUTTON_OFFSET ( getTextWidth( locString( "@MENU_CLOSE" ), UI_FONT_NORMAL, TEXTSIZE_DEFAULT ) + 8 + BUTTON_SPACING ) - #define FILE_SHARE_BUTTON_ACTION \ - if ( getDStat( "AfterActionReportStats", "demoFileID" ) != "0" ) \ - { \ - execnow fileShareGetLastPlayedGame; \ - open menu_fileshare_aar_wager_loading; \ - } - -// NEW_FRAME_BUTTON_PC_LEFT_OFFSET( AAR_WIDTH, AAR_HEIGHT, FILE_SHARE_BUTTON_OFFSET, "@PLATFORM_FILESHARE_PLACEGAMEINMYFILESHARE", -// FILE_SHARE_BUTTON_ACTION, -// when( getDStat( "AfterActionReportStats", "demoFileID" ) != "0" ) ) -// -// execKeyInt BUTTON_X -// { -// FILE_SHARE_BUTTON_ACTION -// } - - CHANGE_MENU_ACTION( menu_wager_aar_summary, menu_aar_wager_scoreboard, menu_aar_wager_scoreboard ) - - CLOSE_BUTTON( menu_wager_aar_summary ) - - #include "ui/safearea.menu" - } - -#include "ui_mp/popupstyle.inc" -#include "ui/choices_setup_popmenu.menu" - -#define AAR_CLOSE_ACTION_FOR_FILSHARE \ - execnow changemenucloseslidedirection menu_aar_summary MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; \ - execnow changemenuopenslidedirection menu_aar_summary MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - execnow changemenuopenslidedirection menu_fileshare_aar_transfer MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; \ - close menu_aar_summary; \ - open menu_fileshare_aar_transfer; - -FILESHARE_LOADER( menu_fileshare_aar_loading, isTaskInProgress( "LiveFileShareGetMetaByID" ), getDStat( "AfterActionReportStats", "demoFileID" ) != "0", AAR_CLOSE_ACTION_FOR_FILSHARE, open menu_fileshare_aar_transfer_error; ) - -#define AAR_WAGER_CLOSE_ACTION_FOR_FILESHARE \ - execnow changemenucloseslidedirection menu_wager_aar_summary MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; \ - execnow changemenuopenslidedirection menu_wager_aar_summary MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - execnow changemenuopenslidedirection menu_fileshare_aar_wager_transfer MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; \ - close menu_wager_aar_summary; \ - open menu_fileshare_aar_wager_transfer; - -FILESHARE_LOADER( menu_fileshare_aar_wager_loading, isTaskInProgress( "LiveFileShareGetMetaByID" ), getDStat( "AfterActionReportStats", "demoFileID" ) != "0", AAR_WAGER_CLOSE_ACTION_FOR_FILESHARE, open menu_fileshare_aar_transfer_error; ) - -#define AAR_FILESHARE_EXTRAARGS \ - openSlideSpeed DEFAULT_SLIDE_IN_SPEED \ - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED \ - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT \ - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - -FILESHARE_SLOT_SELECTOR_EX ( menu_fileshare_aar_transfer, execNow fileShareTransferLastUploaded ( getFeederData( "menu_fileshare_aar_transfer", "fileShareSlots", "slot" ) ); open menu_aar_summary;, ;, open menu_aar_summary;, AAR_FILESHARE_EXTRAARGS ) -FILESHARE_SLOT_SELECTOR_EX ( menu_fileshare_aar_wager_transfer, execNow fileShareTransferLastUploaded ( getFeederData( "menu_fileshare_aar_wager_transfer", "fileShareSlots", "slot" ) ); open menu_wager_aar_summary;, ;, open menu_wager_aar_summary;, AAR_FILESHARE_EXTRAARGS ) - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_aar_transfer_error, ;, ;, 1 ) - execkeyint BUTTON_START { } - onEsc { close self; } - - SYSTEM_POPUP_TITLE_VIS( "@MENU_ERROR", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_FILESHARE_FILENOTFOUND", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self;, 1, ; ) -} - - - // Redefinitions for MEDIUM_POPUP_SETUP popups - #undef POPUP_WIDTH - #define POPUP_WIDTH MEDIUM_POPUP_WIDTH - #undef POPUP_HEIGHT - #define POPUP_HEIGHT MEDIUM_POPUP_HEIGHT - #undef CHOICE_SIZE_X - #define CHOICE_SIZE_X CONFIRM_PURCHASE_SIZE_X - #undef CHOICE_Y_START - #define CHOICE_Y_START POPUP_Y_START_TOP - #undef PLAYER_INFO_ALIGN - #define PLAYER_INFO_ALIGN // Purposely set to nothing. The popup setup macro sets the alignment. If items within it set their own aligment, they end up offset incorrectly. - #undef PLAYER_INFO_X_START - #define PLAYER_INFO_X_START( frameWidth ) ( frameWidth - PLAYER_INFO_WIDTH - PLAYER_INFO_PAD ) - #undef PLAYER_INFO_Y_START - #define PLAYER_INFO_Y_START( frameHeight ) ( PLAYER_INFO_PAD * 2 ) - #undef BG_BACKCOLOR - #define BG_BACKCOLOR POPUP_BACKCOLOR - // Redefinitions for MEDIUM_POPUP_SETUP popups - - - #undef ONOPEN_PC - #ifdef PC - // on PC the AAR opens from script, and the menu that is opened first is "menu_aar_unlocks_weapons" - #define ONOPEN_PC execnow CompareStatsVsStableBuffer; - #else - #define ONOPEN_PC - #endif - - #define UNLOCK_WEAPON_ONOPEN_ACTION \ - ONOPEN_PC \ - setLocalVarBool ui_centerPopup 1; \ - execNow set ui_aar_current_view_num AAR_VIEW_AWARDS_PERSONAL_BESTS; \ - execNow set ui_aar_animate_xp_bar 1; \ - if( GetNumWeaponUnlocks() < 1 ) \ - { \ - closeImmediate self; \ - if( GetNumFeatureUnlocks() > 0 ) \ - { \ - open menu_aar_unlocks_features; \ - } \ - } \ - else \ - { \ - execNow set ui_aar_num_weapon_unlocks (GetNumWeaponUnlocks()); \ - execNow set ui_aar_curr_unlocked_weapon 0; \ - execNow set ui_aar_curr_unlocked_weapon_index ( GetUnlockedWeaponItemIndex( (dvarInt(ui_aar_curr_unlocked_weapon)) ) ); \ - } - - #define UNLOCK_WEAPON_ONESC_ACTION \ - setLocalVarBool ui_centerPopup 0; \ - play uin_navigation_sys_close; \ - close self; \ - if( GetNumFeatureUnlocks() > 0 ) \ - { \ - open menu_aar_unlocks_features; \ - } - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "menu_aar_unlocks_weapons", UNLOCK_WEAPON_ONOPEN_ACTION, UNLOCK_WEAPON_ONESC_ACTION, POPUP_GLOW_RED, 1, 1 ) - priority MENU_PRI_ONTOP - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - control MENU_CONTROL_OPENER - - onFocus - { - if( dvarInt(ui_aar_num_weapon_unlocks) > 0 ) - { - play uin_aar_unlock; - } - } - onClose - { - if( IN_MP_FRONTEND ) - { - deactivateBlur; - } - CENTER_POPUP_ON_CLOSE - setLocalVarBool ui_centerPopup 0; - if( GetNumFeatureUnlocks() < 1 ) - { - if ( !dvarBool(xblive_wagermatch) ) - { - execnow changemenuopenslidedirection menu_aar_summary MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM; - open menu_aar_summary; - } - else - { - open menu_wager_aar_summary; - } - } - } - -#define BUTTON_A_ACT \ - execNow set ui_aar_num_weapon_unlocks (dvarInt(ui_aar_num_weapon_unlocks)-1); \ - if( dvarInt(ui_aar_num_weapon_unlocks) == 0 ) \ - { \ - close self; \ - if( GetNumFeatureUnlocks() > 0 ) \ - { \ - open menu_aar_unlocks_features; \ - } \ - } \ - else \ - { \ - play uin_aar_unlock; \ - execNow set ui_aar_curr_unlocked_weapon (dvarInt(ui_aar_curr_unlocked_weapon)+1); \ - execNow set ui_aar_curr_unlocked_weapon_index ( GetUnlockedWeaponItemIndex( (dvarInt(ui_aar_curr_unlocked_weapon)) ) ); \ - } - - execkeyInt BUTTON_A - { - BUTTON_A_ACT - } - execKeyInt BUTTON_B { ; } // Do nothing - - -// #ifdef PC -// FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self; execKeyHandler BUTTON_A;, 1, ; ) -// #endif - - MEDIUM_POPUP_TITLE_VIS( "@MPUI_NEW_WEAPON_UNLOCKED_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - - #define UNLOCK_WEAPON_WIDTH ( 200 ) - - /* WEAPON IMAGE */ - PREPROC_SHADER_DRAW( (MEDIUM_POPUP_WIDTH/4) CHOICE_Y( 2 ) UNLOCK_WEAPON_WIDTH ( UNLOCK_WEAPON_WIDTH / 2 ), getItemImage( GetUnlockedWeaponItemIndex( (dvarInt(ui_aar_curr_unlocked_weapon) ) ) ), 1 1 1 1 ) - - /* WEAPON NAME */ - PREPROC_TEXT_DRAW_VIS( POPUP_SIDE_PAD CHOICE_Y( 7 ) ( MEDIUM_POPUP_WIDTH - ( POPUP_SIDE_PAD * 2 ) ) CHOICE_SIZE_Y, 0 0, "@"+getItemName( GetUnlockedWeaponItemIndex( (dvarInt(ui_aar_curr_unlocked_weapon) ) ) ), TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 1, 1 ) - -#ifdef CONSOLE - // Button prompts - PREPROC_BUTTON_DRAW_VIS( 0 MEDIUM_POPUP_HEIGHT MEDIUM_POPUP_WIDTH CHOICE_SIZE_Y, 0 0, "@PLATFORM_AFTER_ACTION_REPORT_CAPS", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, 1 1 1 1, when( ((dvarInt(ui_aar_curr_unlocked_weapon)+1) >= GetNumWeaponUnlocks()) && GetNumFeatureUnlocks() == 0 );, BUTTON_A_ACT ) - PREPROC_BUTTON_DRAW_VIS( 0 MEDIUM_POPUP_HEIGHT MEDIUM_POPUP_WIDTH CHOICE_SIZE_Y, 0 0, "@PLATFORM_NEXT_CAPS", TEXTSIZE_DEFAULT, 4, 0, ITEM_ALIGN_BOTTOM_LEFT, 1 1 1 1, when( ((dvarInt(ui_aar_curr_unlocked_weapon)+1) < GetNumWeaponUnlocks()) || ( GetNumFeatureUnlocks() > 0 ) );, BUTTON_A_ACT ) -#else // #ifdef CONSOLE - GENERIC_POPUP_BUTTON_X( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 0, "@PLATFORM_AFTER_ACTION_REPORT_CAPS", - BUTTON_A_ACT, - when( ((dvarInt(ui_aar_curr_unlocked_weapon)+1) >= GetNumWeaponUnlocks()) && GetNumFeatureUnlocks() == 0 ); ) - - GENERIC_POPUP_BUTTON_X( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 0, "@PLATFORM_NEXT_CAPS", - BUTTON_A_ACT, - when( ((dvarInt(ui_aar_curr_unlocked_weapon)+1) < GetNumWeaponUnlocks()) || ( GetNumFeatureUnlocks() > 0 ) ); ) -#endif // #else // #ifdef CONSOLE - } - - - #define UNLOCK_FEATURE_ONOPEN_ACTION \ - setLocalVarBool ui_centerPopup 1; \ - execNow set ui_aar_num_feature_unlocks (GetNumFeatureUnlocks()); \ - execNow set ui_aar_curr_unlocked_feature 0; \ - play uin_navigation_sys_open; - - #define UNLOCK_FEATURE_ONESC_ACTION \ - setLocalVarBool ui_centerPopup 0; \ - play uin_navigation_sys_close; \ - close self; - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "menu_aar_unlocks_features", UNLOCK_FEATURE_ONOPEN_ACTION, UNLOCK_FEATURE_ONESC_ACTION, POPUP_GLOW_BLUE, 1, 1 ) - priority MENU_PRI_ONTOP - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - control MENU_CONTROL_OPENER - - onFocus - { - if( dvarInt(ui_aar_num_feature_unlocks) > 0 ) - { - play uin_aar_unlock; - } - } - onClose - { - if( IN_MP_FRONTEND ) - { - deactivateBlur; - } - CENTER_POPUP_ON_CLOSE - setLocalVarBool ui_centerPopup 0; - if ( !dvarBool(xblive_wagermatch) ) - { - execnow changemenuopenslidedirection menu_aar_summary MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM; - open menu_aar_summary; - } - else - { - open menu_wager_aar_summary; - } - } - -#undef BUTTON_A_ACT -#define BUTTON_A_ACT \ - execNow set ui_aar_num_feature_unlocks (dvarInt(ui_aar_num_feature_unlocks)-2); \ - if( dvarInt(ui_aar_num_feature_unlocks) <= 0 ) \ - { \ - close self; \ - } \ - else \ - { \ - play uin_aar_unlock; \ - execNow set ui_aar_curr_unlocked_feature (dvarInt(ui_aar_curr_unlocked_feature)+2); \ - } - - execkeyInt BUTTON_A - { - BUTTON_A_ACT - } - execKeyInt BUTTON_B { ; } // Do nothing - - -// #ifdef PC -// FRAME_CHOICE_BUTTON_VIS_EX( 8, "@MENU_OK", close self; execKeyHandler BUTTON_A;, 1, ; ) -// #endif - - MEDIUM_POPUP_TITLE_VIS( "@MPUI_NEW_FEATURE_UNLOCKED_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - - /* UNLOCKED FEATURE 1 */ - PREPROC_TEXT_DRAW_VIS( (MEDIUM_POPUP_WIDTH/7) 70 (MEDIUM_POPUP_WIDTH*5/7) 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@"+GetItemName(GetUnlockedFeatureItemIndex(dvarInt(ui_aar_curr_unlocked_feature))), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, - when( dvarInt(ui_aar_curr_unlocked_feature) < GetNumFeatureUnlocks() ) ) - - /* UNLOCKED FEATURE 1 DESCRIPTION */ - PREPROC_TEXT_DRAW_VIS_EX( (MEDIUM_POPUP_WIDTH/7) 92 (MEDIUM_POPUP_WIDTH*5/7) 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@"+GetItemDesc(GetUnlockedFeatureItemIndex(dvarInt(ui_aar_curr_unlocked_feature))), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, - when( dvarInt(ui_aar_curr_unlocked_feature) < GetNumFeatureUnlocks() ), autowrapped ) - - /* UNLOCKED FEATURE 2 */ - PREPROC_TEXT_DRAW_VIS( (MEDIUM_POPUP_WIDTH/7) 139 (MEDIUM_POPUP_WIDTH*5/7) 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@"+GetItemName(GetUnlockedFeatureItemIndex(dvarInt(ui_aar_curr_unlocked_feature)+1)), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, - when( (dvarInt(ui_aar_curr_unlocked_feature)+1) < GetNumFeatureUnlocks() ) ) - - /* UNLOCKED FEATURE 2 DESCRIPTION */ - PREPROC_TEXT_DRAW_VIS_EX( (MEDIUM_POPUP_WIDTH/7) 161 (MEDIUM_POPUP_WIDTH*5/7) 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@"+GetItemDesc(GetUnlockedFeatureItemIndex(dvarInt(ui_aar_curr_unlocked_feature)+1)), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, - when( (dvarInt(ui_aar_curr_unlocked_feature)+1) < GetNumFeatureUnlocks() ), autowrapped ) - -#ifdef CONSOLE - // Button prompts - PREPROC_BUTTON_DRAW_VIS( 0 MEDIUM_POPUP_HEIGHT MEDIUM_POPUP_WIDTH CHOICE_SIZE_Y, 0 0, "@PLATFORM_AFTER_ACTION_REPORT_CAPS", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, 1 1 1 1, when( (dvarInt(ui_aar_curr_unlocked_feature)+2) >= GetNumFeatureUnlocks() ) ;, BUTTON_A_ACT ) - PREPROC_BUTTON_DRAW_VIS( 0 MEDIUM_POPUP_HEIGHT MEDIUM_POPUP_WIDTH CHOICE_SIZE_Y, 0 0, "@PLATFORM_NEXT_CAPS", TEXTSIZE_DEFAULT, 4, 0, ITEM_ALIGN_BOTTOM_LEFT, 1 1 1 1, when( (dvarInt(ui_aar_curr_unlocked_feature)+2) < GetNumFeatureUnlocks() );, BUTTON_A_ACT ) -#else // #ifdef CONSOLE - GENERIC_POPUP_BUTTON_X( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 0, "@PLATFORM_AFTER_ACTION_REPORT_CAPS", - BUTTON_A_ACT, - when( (dvarInt(ui_aar_curr_unlocked_feature)+2) >= GetNumFeatureUnlocks() ); ) - - GENERIC_POPUP_BUTTON_X( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 0, "@PLATFORM_NEXT_CAPS", - BUTTON_A_ACT, - when( (dvarInt(ui_aar_curr_unlocked_feature)+2) < GetNumFeatureUnlocks() ); ) -#endif // #else // #ifdef CONSOLE - } -} diff --git a/mods/patch_mp/ui_mp/cac_custom.menu b/mods/patch_mp/ui_mp/cac_custom.menu deleted file mode 100644 index 1d21362..0000000 --- a/mods/patch_mp/ui_mp/cac_custom.menu +++ /dev/null @@ -1,32 +0,0 @@ -#include "ui/menudef.h" - -// ----------------- allocate stat for custom class settings ------------------- - -// custom class stats stat numbers -#include "ui_mp/cac_stats.inc" - -#define CAC_DEFAULT_PRIMARY_GRENADE GetDefaultClassSlot( dvarstring( ui_class ), "primarygrenade" ) -#define CAC_DEFAULT_PRIMARY GetDefaultClassSlot( dvarstring( ui_class ), "primary" ) -// no default primary attachments for now -#define CAC_DEFAULT_PRIMARY_ATTACHMENT 0 -#define CAC_DEFAULT_SECONDARY GetDefaultClassSlot( dvarstring( ui_class ), "secondary" ) -// no default secondary attachments for now -#define CAC_DEFAULT_SECONDARY_ATTACHMENT 0 -#define CAC_DEFAULT_SPECIALTY1 GetDefaultClassSlot( dvarstring( ui_class ), "specialty1" ) -#define CAC_DEFAULT_SPECIALTY2 GetDefaultClassSlot( dvarstring( ui_class ), "specialty2" ) -#define CAC_DEFAULT_SPECIAL_GRENADE GetDefaultClassSlot( dvarstring( ui_class ), "specialgrenade" ) -// no default camo for now -#define CAC_DEFAULT_CAMO 0 -#define CAC_DEFAULT_DEATHSTREAK GetDefaultClassSlot( dvarstring( ui_class ), "deathstreak" ) -#define CAC_DEFAULT_KILLSTREAK_TIER1 GetDefaultClassSlot( dvarstring( ui_class ), "killstreak1" ) -#define CAC_DEFAULT_KILLSTREAK_TIER2 GetDefaultClassSlot( dvarstring( ui_class ), "killstreak2" ) -#define CAC_DEFAULT_KILLSTREAK_TIER3 GetDefaultClassSlot( dvarstring( ui_class ), "killstreak3" ) - -// custom class name -#define CAC_MENU_NAME "menu_cac_custom" - -#include "ui_mp/common_macro.inc" - -{ - #include "ui_mp/cac.inc" -} \ No newline at end of file diff --git a/mods/patch_mp/ui_mp/cac_popups.menu b/mods/patch_mp/ui_mp/cac_popups.menu deleted file mode 100644 index 7153c3c..0000000 --- a/mods/patch_mp/ui_mp/cac_popups.menu +++ /dev/null @@ -1,813 +0,0 @@ - -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui_mp/popup_player_info.inc" - -#include "ui/framestyle.inc" -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui_mp/popupstyle.inc" -#include "ui_mp/cac_stats.inc" -#include "ui/choices_setup_popmenu.menu" - -#define IS_ONLINE_GAME ( dvarInt( splitscreen ) == 0 && dvarInt( systemlink ) == 0 ) -#define IS_BASICTRAINING_GAME ( dvarInt( xblive_basictraining ) > 0 ) - - // saving popup for CAC ONLY - for a lack of better place - #define LOCAL_SAVING \ - "wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait;" - menuDef - { - SYSTEM_POPUP_SETUP_VIS( saving_popup, exec LOCAL_SAVING" "LOCAL_SAVING" closemenu saving_popup";, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_SAVING", 1 ) - SYSTEM_POPUP_SPINNER( 1 ) - } - - - #define LOCAL_ACCEPT_ACTION( pclass, pclass_s ) \ - if ( IS_ONLINE_GAME && !IS_BASICTRAINING_GAME ) \ - { \ - setDvarFromLocString( dvarString( ui_custom_name ), pclass ); \ - } \ - execNow "equipDefaultClass ( dvarString( ui_custom_name ) ) class_custom"pclass_s; \ - execNow "updategamerprofile"; \ - play CHOICE_FOCUS_SOUND; \ - close "popup_cac_defaultclasswarning"pclass_s; \ - close "popup_cac_template"; - - #define LOCAL_CANCEL_ACTION( pclass_s ) \ - play CHOICE_FOCUS_SOUND; \ - close "popup_cac_defaultclasswarning"pclass_s; - - - // reset to default class confirmation popup menu - #define RESET_WARNING_POPUP( pclass, pclass_s ) \ - menuDef \ - { \ - SYSTEM_POPUP_SETUP_VIS( "popup_cac_defaultclasswarning"pclass_s, setfocus "popup_cac_defaultclasswarning"pclass_s"_2", ;, 1 ) \ - \ - SYSTEM_POPUP_TITLE_VIS( "@MENU_RESET_TO_DEFAULT", 1 ) \ - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_CUSTOM_CLASS_RESET_WARNING", 1 ) \ - \ - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_YES", LOCAL_ACCEPT_ACTION( pclass, pclass_s ), 1, ; ) \ - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_NO", LOCAL_CANCEL_ACTION( pclass_s ), 1, name "popup_cac_defaultclasswarning"pclass_s"_2" ) \ - } - - RESET_WARNING_POPUP( "@CLASS_CLASS1", "_smg" ) - RESET_WARNING_POPUP( "@CLASS_CLASS2", "_cqb" ) - RESET_WARNING_POPUP( "@CLASS_CLASS3", "_assault" ) - RESET_WARNING_POPUP( "@CLASS_CLASS4", "_lmg" ) - RESET_WARNING_POPUP( "@CLASS_CLASS5", "_sniper" ) - - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( copyClassConfirmation, setfocus copyClassConfirmation_2;, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( getCopyClassConfirmationText( dvarInt("ui_custom_class_highlighted"), dvarInt("ui_classToReplace") ), 1 ) - - #define COPY_CLASS_ACTION \ - execNow copyClass (dvarInt("ui_custom_class_highlighted")) (dvarInt("ui_classToReplace")); \ - close self; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_YES", COPY_CLASS_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_CANCEL", close self;, 1, name copyClassConfirmation_2 ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( copyCustomGametypeClassConfirmation, setfocus copyCustomGametypeClassConfirmation_2;, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( getCopyCustomGametypeClassConfirmationText( dvarInt("ui_custom_gametype_class_highlighted"), dvarInt("ui_customGametypeClassToReplace") ), 1 ) - - #define COPY_CUSTOM_CLASS_ACTION \ - execNow copyCustomGametypeClass (dvarInt("ui_custom_gametype_class_highlighted")) (dvarInt("ui_customGametypeClassToReplace")); \ - close self; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_YES", COPY_CUSTOM_CLASS_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_CANCEL", close self;, 1, name copyCustomGametypeClassConfirmation_2 ) - } - -#ifdef XENON - #define SELECT_ICON "ui_button_xenon_3d_a_32x32" -#endif -#ifdef PS3 - #define SELECT_ICON "ui_button_ps3_x_32x32" -#endif - - #undef POPUP_BUTTON_COUNT - #define POPUP_BUTTON_COUNT 5 - // Copy Class Popup - menuDef - { - SYSTEM_POPUP_SETUP_VIS( copyClassPopup, ;, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( GetCopyClassDialogTitle( dvarInt("ui_custom_class_highlighted") ), 1 ) - - itemDef - { - name custom_class_list - type ITEM_TYPE_LISTBOX - feeder FEEDER_CUSTOM_CLASSES - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X (CHOICE_SIZE_Y*6) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - elementwidth CHOICE_SIZE_X - elementheight CHOICE_SIZE_Y - elementtype LISTBOX_TEXT - textstyle ITEM_TEXTSTYLE_NORMAL - textfont UI_FONT_NORMAL - textscale TEXTSIZE_DEFAULT - textalignx CHOICE_SIZE_Y - textaligny 0 - forecolor 1 1 1 1 - focusColor 1 1 1 1 - disableColor 1 1 1 1 - selectBorder 0.8 0.95 1 0 - outlinecolor 1 1 1 1 - elementBackgroundColor NEW_FRAME_BUTTON_BG_COLOR - selectIcon SELECT_ICON - elementHighlightColor NEW_FRAME_BUTTON_TEXT_HIGHLIGHT_COLOR -#ifdef PC - modal - usepaging -#else //#ifdef PC - noscrollbars -#endif //#ifdef PC - noBlinkingHighlight - visible 1 - onfocus - { - play CHOICE_FOCUS_SOUND; - } - onListboxSelectionChange - { - play CHOICE_FOCUS_SOUND; - } - doubleclick - { - execNow set ui_classToReplace (getFeederData("selection")); - open copyClassConfirmation; - close self; - } - } - - SYSTEM_POPUP_BACK_BUTTON - } - - - #undef POPUP_BUTTON_COUNT - #define POPUP_BUTTON_COUNT 5 - // Copy Custom Gametype Class Popup - menuDef - { - SYSTEM_POPUP_SETUP_VIS( copyCustomGametypeClassPopup, ;, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( GetCopyCustomGametypeClassDialogTitle( dvarInt("ui_custom_gametype_class_highlighted") ), 1 ) - - itemDef - { - name custom_class_list - type ITEM_TYPE_LISTBOX - feeder FEEDER_CUSTOM_GAMETYPE_CLASSES - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X (CHOICE_SIZE_Y*6) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - elementwidth CHOICE_SIZE_X - elementheight CHOICE_SIZE_Y - elementtype LISTBOX_TEXT - textstyle ITEM_TEXTSTYLE_NORMAL - textfont UI_FONT_NORMAL - textscale TEXTSIZE_DEFAULT - textalignx CHOICE_SIZE_Y - textaligny 0 - forecolor 1 1 1 1 - focusColor 1 1 1 1 - disableColor 1 1 1 1 - selectBorder 0.8 0.95 1 0 - outlinecolor 1 1 1 1 - elementBackgroundColor NEW_FRAME_BUTTON_BG_COLOR - selectIcon SELECT_ICON - elementHighlightColor NEW_FRAME_BUTTON_TEXT_HIGHLIGHT_COLOR -#ifdef PC - modal - usepaging -#else //#ifdef PC - noscrollbars -#endif //#ifdef PC - noBlinkingHighlight - visible 1 - onfocus - { - play CHOICE_FOCUS_SOUND; - } - onListboxSelectionChange - { - play CHOICE_FOCUS_SOUND; - } - doubleclick - { - execNow set ui_customGametypeClassToReplace (getFeederData("selection")); - open copyCustomGametypeClassConfirmation; - close self; - } - } - - SYSTEM_POPUP_BACK_BUTTON - } - - -#ifdef PC - #undef CHOICE_FOCUS_SOUND - #define CHOICE_FOCUS_SOUND "uin_navigation_over" - - #undef POPUP_BUTTON_COUNT - #define POPUP_BUTTON_COUNT 3 - - #define RENAME_ACTION \ - exec "setNewCustomName"; close self; - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( "pc_rename", exec "getOldCustomName"; setFocus nameEntry;, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MPUI_RENAME_CLASS", 1 ) - - itemDef - { - name nameEntry - TYPE ITEM_TYPE_UPREDITFIELD - text "@MENU_NAME1" - dvar "ui_custom_newname" - rect CHOICE_RECT( 1 ) - textaligny 2 - maxchars 15 - maxpaintchars 15 - textalign ITEM_ALIGN_MIDDLE_LEFT - textfont UI_FONT_NORMAL - textscale TEXTSIZE_DEFAULT - forecolor .9 .9 .9 1 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 .3 - visible 1 - mouseenter { show keyBindStatus; play CHOICE_FOCUS_SOUND; } - mouseexit { hide keyBindStatus; setfocus ok_button; } - accept { if ( dvarString( ui_custom_newname ) != "" ) { RENAME_ACTION } } - } - - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_OK", RENAME_ACTION, ( dvarString( ui_custom_newname ) != "" ), ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 2, "@MENU_OK", ;, ;, ( dvarString( ui_custom_newname ) == "" ), ; ) - - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MENU_CANCEL", close self; setDvar ui_custom_newname "";, 1, ; ) - } -#endif - - - #undef POPUP_BUTTON_COUNT - #define POPUP_BUTTON_COUNT 2 - menuDef - { - SYSTEM_POPUP_SETUP_VIS( clearAttachmentNotification, focusFirst;, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MPUI_CAC_ATTACHMENTS_CLEARED", 1 ) - -#define CLEAR_ATTACHMENTS_ACTION \ - execNow clearAllAttachmentsForItem (dvarString( ui_custom_name )) (STAT_CAC_PRIMARY); \ - if ( !dvarBool("buyingAndEquippingProItem") ) \ - { \ - execnow equipclasscurrentitem (dvarString( ui_custom_name )); \ - } \ - else \ - { \ - execnow equipclassitem (dvarString( ui_custom_name )) (GetCurrentItemIndex() + 1); \ - execnow buildItemListForSlotName (dvarString( selected_loadout_slot )); \ - } \ - setDvar buyingAndEquippingProItem "0"; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", CLEAR_ATTACHMENTS_ACTION; close self; execnow ui_animate menu_cac_custom * CloseDropDownList 0;, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_CANCEL", close self;, 1, ; ) - } - - // Redefinitions for MEDIUM_POPUP_SETUP popups - #undef POPUP_WIDTH - #define POPUP_WIDTH MEDIUM_POPUP_WIDTH - #undef POPUP_HEIGHT - #define POPUP_HEIGHT MEDIUM_POPUP_HEIGHT - #undef CHOICE_SIZE_X - #define CHOICE_SIZE_X CONFIRM_PURCHASE_SIZE_X - #undef CHOICE_Y_START - #define CHOICE_Y_START POPUP_Y_START_TOP - #undef PLAYER_INFO_ALIGN - #define PLAYER_INFO_ALIGN // Purposely set to nothing. The popup setup macro sets the alignment. If items within it set their own aligment, they end up offset incorrectly. - #undef PLAYER_INFO_X_START - #define PLAYER_INFO_X_START( frameWidth ) ( frameWidth - PLAYER_INFO_WIDTH - PLAYER_INFO_PAD ) - #undef PLAYER_INFO_Y_START - #define PLAYER_INFO_Y_START( frameHeight ) ( PLAYER_INFO_PAD * 2 ) - #undef BG_BACKCOLOR - #define BG_BACKCOLOR POPUP_BACKCOLOR - // Redefinitions for MEDIUM_POPUP_SETUP popups - - - #define PURCHASE_CONFIRMATION_RIGHT_X ( MEDIUM_POPUP_WIDTH / 2 ) - #define PURCHASE_INFO_WIDTH ( ( MEDIUM_POPUP_WIDTH / 2 ) - POPUP_SIDE_PAD ) - - #define CONFIRMATION_ITEM_INFO_VIS( itemName, itemCost, itemDesc, balanceHeader, balanceAfter, visArg ) \ - PREPROC_TEXT_DRAW_VIS_EX( (PURCHASE_CONFIRMATION_RIGHT_X) CHOICE_Y( 1 ) PURCHASE_INFO_WIDTH CHOICE_SIZE_Y, 0 0, locString( "@MENU_POINTS", itemCost ), TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, NEW_FRAME_GREEN_RGB 1, visArg, ; ) \ /* Cost */ - PREPROC_TEXT_DRAW_VIS_EX( (PURCHASE_CONFIRMATION_RIGHT_X) CHOICE_Y( 2 ) PURCHASE_INFO_WIDTH CHOICE_SIZE_Y, 0 0, "@" + itemName, TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, NEW_FRAME_GREEN_RGB 1, visArg, ; ) \ /* Name */ - PREPROC_TEXT_DRAW_VIS_EX( (PURCHASE_CONFIRMATION_RIGHT_X) CHOICE_Y( 4 ) PURCHASE_INFO_WIDTH 200, 0 0, "@" + itemDesc, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, MEDIUM_POPUP_GRAY, visArg, autowrapped; ) \ /* Description */ - PREPROC_TEXT_DRAW_VIS_EX( (PURCHASE_CONFIRMATION_RIGHT_X) CHOICE_Y( 7 ) PURCHASE_INFO_WIDTH CHOICE_SIZE_Y, 0 0, "@MPUI_YOUR_BANK", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_LEFT, MEDIUM_POPUP_GRAY, visArg, ; ) \ /* Currency Available Header */ - PREPROC_TEXT_DRAW_VIS_EX( (MEDIUM_POPUP_WIDTH-75) CHOICE_Y( 7 ) PURCHASE_INFO_WIDTH CHOICE_SIZE_Y, 0 0, locString( "@MENU_POINTS", GetStatByName( "CODPOINTS" ) ), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, visArg, ; ) \ /* Currency Available */ - PREPROC_TEXT_DRAW_VIS_EX( (PURCHASE_CONFIRMATION_RIGHT_X) CHOICE_Y( 8 ) PURCHASE_INFO_WIDTH CHOICE_SIZE_Y, 0 0, balanceHeader, TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_LEFT, MEDIUM_POPUP_GRAY, visArg, ; ) \ /* Balance After Purchase Header */ - PREPROC_TEXT_DRAW_VIS_EX( (MEDIUM_POPUP_WIDTH-75) CHOICE_Y( 8 ) PURCHASE_INFO_WIDTH CHOICE_SIZE_Y, 0 0, balanceAfter, TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, visArg, ; ) /* Balance After Purchase */ - - #define PURCHASE_CONFIRMATION_ITEM_INFO( itemName, itemCost, itemDesc ) \ - CONFIRMATION_ITEM_INFO_VIS( itemName, itemCost, itemDesc, "@MPUI_BALANCE_AFTER_PURCHASE", locString( "@MENU_POINTS", GetStatByName( "CODPOINTS" ) - itemCost ), 1 ) - - #define PURCHASE_CONFIRMATION_ITEM_INFO_VIS( itemName, itemCost, itemDesc, visArg ) \ - CONFIRMATION_ITEM_INFO_VIS( itemName, itemCost, itemDesc, "@MPUI_BALANCE_AFTER_PURCHASE", locString( "@MENU_POINTS", GetStatByName( "CODPOINTS" ) - itemCost ), visArg ) - -#define IS_TWO_ATTACHMENT_PERK_EQUIPPED \ - ( ( STAT_CAC_SPECIALTY2 == getItemIndex( "PERKS_PROFESSIONAL" ) ) || ( STAT_CAC_SPECIALTY2 == getItemIndex( "PERKS_PROFESSIONAL_PRO" ) ) ) - -#define TWO_ATTACHMENTS_EQUIPPED \ - ( GetItemNumAttachmentsEquipped( dvarString( ui_custom_name ), STAT_CAC_PRIMARY ) > 1 || GetItemNumAttachmentsEquipped( dvarString( ui_custom_name ), STAT_CAC_SECONDARY ) > 1 ) - -#define TWO_ATTACHMENT_PERK_NOT_HIGHLIGHTED \ - ( GetCurrentItemIndex() != getItemIndex( "PERKS_PROFESSIONAL" ) && GetCurrentItemIndex() != getItemIndex( "PERKS_PROFESSIONAL_PRO" ) ) - -#define PERK_2_EQUIP_ACTION \ - if( TWO_ATTACHMENTS_EQUIPPED && IS_TWO_ATTACHMENT_PERK_EQUIPPED && TWO_ATTACHMENT_PERK_NOT_HIGHLIGHTED ) \ - { \ - setDvar buyingAndEquippingProItem "0"; \ - execNow openMenu clearAttachmentNotification; \ - execnow set ui_closeAfterPurchase 0; \ - } \ - else \ - { \ - execnow equipclasscurrentitem (dvarString( ui_custom_name )); \ - execnow set ui_closeAfterPurchase 1; \ - } - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseConfirmation", setfocus "PurchaseConfirmation_3";, ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( GetCurrentItemName(), GetCurrentItemCost(), GetItemDesc( GetCurrentItemIndex() ) ) - - #define BUY_ACTION \ - execnow purchasecurrentitem; \ - if ( dvarString( ui_inside_popup ) == "select_weapon" ) \ - { \ - execnow buildItemListForSlotNameAndGroup (dvarString(selected_loadout_slot)) (dvarString(selected_group)); \ - } \ - elseif ( dvarString( ui_inside_popup ) == "equipment_head" ) \ - { \ - execnow buildItemListForSlotName (dvarString( selected_loadout_slot )); \ - } \ - close self; - - #define BUY_AND_EQUIP_ACTION \ - execnow purchasecurrentitem; \ - if ( dvarString( ui_inside_popup ) == "specialties_2" ) \ - { \ - PERK_2_EQUIP_ACTION \ - } \ - else \ - { \ - execnow equipclasscurrentitem (dvarString( ui_custom_name )); \ - execnow set ui_closeAfterPurchase 1; \ - } \ - if ( dvarString( ui_inside_popup ) == "select_weapon" ) \ - { \ - execnow buildItemListForSlotNameAndGroup (dvarString(selected_loadout_slot)) (dvarString(selected_group)); \ - execnow set ui_closeAfterPurchase 1; \ - } \ - elseif ( dvarString( ui_inside_popup ) == "equipment_head" ) \ - { \ - execnow buildItemListForSlotName (dvarString( selected_loadout_slot )); \ - } \ - close self; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_BUY_AND_EQUIP_CAPS", BUY_AND_EQUIP_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MPUI_CANCEL_PURCHASE_CAPS", close self, 1, name PurchaseConfirmation_3 ) - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseKillstreakConfirmation", setfocus "PurchaseKillstreakConfirmation_3";, ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( GetCurrentItemName(), GetCurrentItemCost(), GetItemDesc( GetCurrentItemIndex() ) ) - - #define BUY_KILLSTREAK_ACTION \ - execnow purchasecurrentitem; \ - close self; - - #define BUY_AND_EQUIP_KILLSTREAK_ACTION \ - execnow purchasecurrentitem; \ - execnow equipGlobalItemInSlotSorted 3 killstreak 1; \ - execnow set ui_closeAfterPurchase 1; \ - close self; - - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_KILLSTREAK_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_BUY_AND_EQUIP_CAPS", BUY_AND_EQUIP_KILLSTREAK_ACTION, ( GetNumSortedItemsEquipped() < 3 ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_CANCEL_PURCHASE_CAPS", close self, ( GetNumSortedItemsEquipped() == 3 ), name PurchaseKillstreakConfirmation_3 ) - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MPUI_CANCEL_PURCHASE_CAPS", close self, ( GetNumSortedItemsEquipped() < 3 ), name PurchaseKillstreakConfirmation_3 ) - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseProConfirmation", setfocus "PurchaseProConfirmation_3", ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( GetItemName( GetCurrentItemIndex() + 1 ), GetItemCost( GetCurrentItemIndex() + 1 ), GetItemDesc( GetCurrentItemIndex() + 1 ) ) - - #define BUY_PRO_ACTION \ - execnow purchasecurrentproitem; \ - execnow buildItemListForSlotName (dvarString( selected_loadout_slot )); \ - close self; - - #define BUY_AND_EQUIP_PRO_ACTION \ - execnow purchasecurrentproitem; \ - if ( dvarString( ui_inside_popup ) == "specialties_2" && TWO_ATTACHMENTS_EQUIPPED && IS_TWO_ATTACHMENT_PERK_EQUIPPED && TWO_ATTACHMENT_PERK_NOT_HIGHLIGHTED ) \ - { \ - setDvar buyingAndEquippingProItem "1"; \ - execNow openMenu clearAttachmentNotification; \ - execnow set ui_closeAfterPurchase 0; \ - } \ - else \ - { \ - execnow equipclassitem (dvarString( ui_custom_name )) (GetCurrentItemIndex() + 1); \ - execnow set ui_closeAfterPurchase 1; \ - execnow buildItemListForSlotName (dvarString( selected_loadout_slot )); \ - } \ - close self; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_PRO_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_BUY_AND_EQUIP_CAPS", BUY_AND_EQUIP_PRO_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MPUI_CANCEL_PURCHASE_CAPS", close self, 1, name PurchaseProConfirmation_3 ) - } - - -#define GET_SLOT_STAT \ - ( Select( dvarString( selected_loadout_slot ) == "primary", STAT_CAC_PRIMARY, STAT_CAC_SECONDARY ) ) - -#define SELECTING_PRIMARY \ - ( dvarString( selected_loadout_slot ) == "primary" ) - -#define CAN_EQUIP_TWO_ATTACHMENTS \ - ( ( SELECTING_PRIMARY ) && ( isItemEquipped( getitemindex("PERKS_PROFESSIONAL"), dvarString( ui_custom_name ) ) || isItemEquipped( getitemindex("PERKS_PROFESSIONAL_PRO"), dvarString( ui_custom_name ) ) ) ) - -#define NUM_EQUIPPED_ATTACHMENTS \ - GetItemNumAttachmentsEquipped( dvarString( ui_custom_name ), GET_SLOT_STAT ) - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseAttachmentConfirmation", setfocus "PurchaseAttachmentConfirmation_3", ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( GetCurrentItemAttachmentName(), GetCurrentItemAttachmentCost(), GetAttachmentDesc( GetItemAttachment( GetCurrentItemIndex(), GetCurrentItemAttachmentNum() ) ) ) - - #define BUY_ATTACHMENT_ACTION \ - execnow purchasecurrentitemattachment; \ - close self; - - #define BUY_ATTACHMENT_AND_EQUIP_ACTION \ - execnow purchasecurrentitemattachment; \ - if( ( NUM_EQUIPPED_ATTACHMENTS < 1 ) || ( NUM_EQUIPPED_ATTACHMENTS == 1 && CAN_EQUIP_TWO_ATTACHMENTS ) ) \ - { \ - execnow equipclasscurrentattachment ( dvarString( ui_custom_name ) ); \ - } \ - close self; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_ATTACHMENT_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_BUY_AND_EQUIP_CAPS", BUY_ATTACHMENT_AND_EQUIP_ACTION, ( ( NUM_EQUIPPED_ATTACHMENTS == 0 ) || ( NUM_EQUIPPED_ATTACHMENTS == 1 && CAN_EQUIP_TWO_ATTACHMENTS ) ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_CANCEL_PURCHASE_CAPS", close self, ( NUM_EQUIPPED_ATTACHMENTS == 2 || ( ( NUM_EQUIPPED_ATTACHMENTS == 1 ) && !CAN_EQUIP_TWO_ATTACHMENTS ) ), name PurchaseAttachmentConfirmation_3 ) - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MPUI_CANCEL_PURCHASE_CAPS", close self, ( ( NUM_EQUIPPED_ATTACHMENTS == 0 ) || ( NUM_EQUIPPED_ATTACHMENTS == 1 && CAN_EQUIP_TWO_ATTACHMENTS ) ), name PurchaseAttachmentConfirmation_3 ) - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseOptionConfirmation", setfocus "PurchaseOptionConfirmation_3", ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( GetWeaponOptionName( GetCurrentItemOption() ), GetWeaponOptionCost( GetCurrentItemOption() ), GetWeaponOptionName( GetCurrentItemOption() ) ) - - #define BUY_OPTION_ACTION \ - execnow purchasecurrentitemoption; \ - close self; - - #define BUY_OPTION_AND_EQUIP_ACTION \ - execnow purchasecurrentitemoption; \ - execnow equipclasscurrentoption ( dvarString( ui_custom_name ) ) ( dvarString( ui_option_name ) ); \ - execnow set ui_closeAfterPurchase 1; \ - close self; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_OPTION_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_BUY_AND_EQUIP_CAPS", BUY_OPTION_AND_EQUIP_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MPUI_CANCEL_PURCHASE_CAPS", close self;, 1, name PurchaseOptionConfirmation_3 ) - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseContractConfirmation", setfocus "PurchaseContractConfirmation_2", ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( GetContractName( GetCurrentContractIndex() ), GetContractCost( GetCurrentContractIndex() ), GetContractDesc( GetCurrentContractIndex() ) ) - - #define BUY_CONTRACT_ACTION \ - execnow activatecontract ( GetCurrentContractIndex() ) ( dvarint( ui_activeContract ) ); \ - close self; \ - execnow ui_animate menu_xboxlive_contracts anim_controller CloseDropDownList 0; - - #define DEACTIVATE_AND_BUY_CONTRACT_ACTION \ - execnow activatecontract ( GetCurrentContractIndex() ) ( dvarint( ui_activeContract ) ); \ - close self; \ - execnow ui_animate menu_xboxlive_contracts anim_controller CloseDropDownList 0; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_CONTRACT_ACTION, ( !IsContractInProgress( GetIndexForActiveContract( dvarInt( ui_activeContract ) ) ) ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_DEACTIVATE_AND_BUY_CAPS", DEACTIVATE_AND_BUY_CONTRACT_ACTION, ( IsContractInProgress( GetIndexForActiveContract( dvarInt( ui_activeContract ) ) ) ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_CANCEL_PURCHASE_CAPS", close self;, 1, name PurchaseContractConfirmation_2 ) - PREPROC_TEXT_DRAW_VIS_EX( CHOICE_X( 3 ) CHOICE_Y( 3 ) CHOICE_SIZE_X CHOICE_SIZE_Y, 0 0, "@MPUI_REPLACE_CONTRACT_WARNING", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, NEW_FRAME_ORANGE_RGB 1, when( IsContractInProgress( GetIndexForActiveContract( dvarInt( ui_activeContract ) ) ) );, autowrapped ) - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseWeaponOptionConfirmation", setfocus "PurchaseWeaponOptionConfirmation_2", ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO_VIS( GetItemName( dvarInt( weaponOptionIndex ) ), GetWeaponOptionCost( GetItemOptionByName( dvarString( weaponOptionRef ) ) ), GetItemDesc( dvarInt( weaponOptionIndex ) ), 1 ) - - #define BUY_WEAPON_OPTION_ACTION( optionRef ) \ - execnow PurchaseWeaponOption optionRef; \ - close self; - - #define BUY_AND_EQUIP_WEAPON_OPTION_ACTION( optionRef ) \ - execnow PurchaseWeaponOption optionRef; \ - close self; \ - execnow toggleWeaponOption (dvarString( ui_custom_name )) optionRef; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_WEAPON_OPTION_ACTION( ( dvarString( weaponOptionRef ) ) ), 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_BUY_AND_EQUIP_CAPS", BUY_AND_EQUIP_WEAPON_OPTION_ACTION( ( dvarString( weaponOptionRef ) ) ), 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MPUI_CANCEL_PURCHASE_CAPS", close self, 1, name PurchaseWeaponOptionConfirmation_2 ) - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseEmblemLayerConfirmation", setfocus "PurchaseEmblemLayerConfirmation_2", ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( ( locString( "MENU_EMBLEM_LAYER_CAPS", emblemSelectedLayer() + 1 ) ) , emblemLayerCost( emblemSelectedLayer() ), "" ) - - #define BUY_EMBLEM_LAYER_ACTION \ - execnow emblempurchaselayer; \ - close self; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_EMBLEM_LAYER_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_CANCEL_PURCHASE_CAPS", close self;, 1, name PurchaseEmblemLayerConfirmation_2 ) - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseClanTagFeatureConfirmation", setfocus "PurchaseClanTagFeatureConfirmation_2", ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( "MPUI_CLANTAG_" + GetClanTagFeatureName( GetCurrentClanTagFeature() ), GetClanTagFeatureCost( GetCurrentClanTagFeature() ), "MPUI_CLANTAG_" + GetClanTagFeatureName( GetCurrentClanTagFeature() ) + "_DESC" ) - - #define BUY_CLAN_TAG_FEATURE_ACTION \ - execnow PurchaseClanTagFeature ( GetCurrentClanTagFeature() ); \ - close self; - - #define BUY_AND_EQUIP_CLAN_TAG_FEATURE_ACTION \ - execnow PurchaseClanTagFeature ( GetCurrentClanTagFeature() ); \ - execNow statwriteddl clanTagStats selectedFeature ( GetCurrentClanTagFeature() ); \ - close self; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_CLAN_TAG_FEATURE_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_BUY_AND_EQUIP_CAPS", BUY_AND_EQUIP_CLAN_TAG_FEATURE_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MPUI_CANCEL_PURCHASE_CAPS", close self;, 1, name PurchaseClanTagFeatureConfirmation_2 ) - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseCurrentWeaponOptionConfirmation", setfocus "PurchaseCurrentWeaponOptionConfirmation_2", ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( GetWeaponOptionName( GetCurrentItemOption() ), GetWeaponOptionCost( GetCurrentItemOption() ), GetWeaponOptionName( GetCurrentItemOption() ) ) - - #define BUY_CURRENT_WEAPON_OPTION_ACTION \ - execnow purchasecurrentitemoption; \ - close self; - - #define BUY_AND_EQUIP_CURRENT_WEAPON_OPTION_ACTION \ - execnow purchasecurrentitemoption; \ - execnow "equipclasscurrentoption ( dvarString( ui_custom_name ) ) ( dvarString( ui_optiongroup_name ) )"; \ - execnow set ui_closeAfterPurchase 1; \ - close self; - - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_CURRENT_WEAPON_OPTION_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_BUY_AND_EQUIP_CAPS", BUY_AND_EQUIP_CURRENT_WEAPON_OPTION_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MPUI_CANCEL_PURCHASE_CAPS", close self;, 1, name PurchaseCurrentWeaponOptionConfirmation_2 ) - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseEmblemIconConfirmation", setfocus "PurchaseEmblemIconConfirmation_3", ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( emblemIconName( localvarint( emblem_selected_icon_id ) ), emblemIconCost( localvarint( emblem_selected_icon_id ) ), "" ) - - #define BUY_EMBLEM_ICON_ACTION \ - execnow emblempurchaseicon ( localvarint( emblem_selected_icon_id ) ); \ - close self; - - #define BUY_SELECT_EMBLEM_ICON_ACTION \ - execnow emblempurchaseicon ( localvarint( emblem_selected_icon_id ) ); \ - close self; \ - execNow emblemClear; \ - execNow emblemIcon ( localvarint( emblem_selected_icon_id ) ); \ - close emblem_icon_select; \ - openimmediate emblem_edit; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_EMBLEM_ICON_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_BUY_AND_SELECT_CAPS", BUY_SELECT_EMBLEM_ICON_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MPUI_CANCEL_PURCHASE_CAPS", close self;, 1, name PurchaseEmblemIconConfirmation_3 ) - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseEmblemBackgroundConfirmation", setfocus "PurchaseEmblemBackgroundConfirmation_3", ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( emblemBackgroundName( localvarint( bg_hi_index ) ), emblemBackgroundCost( localvarint( bg_hi_index ) ), "" ) - PREPROC_SHADER_DRAW( (PURCHASE_CONFIRMATION_RIGHT_X) CHOICE_Y( 4 ) 185 40, emblemBackgroundMaterial( localvarint( bg_hi_index ) ), 1 1 1 1 ) - - #define BUY_EMBLEM_BACKGROUND_ACTION \ - execnow emblempurchasebackgroundbyindex ( localvarint( bg_hi_index ) ); \ - close self; - - #define BUY_SELECT_EMBLEM_BACKGROUND_ACTION \ - execnow emblempurchasebackgroundbyindex ( localvarint( bg_hi_index ) ); \ - execnow emblemselectbackground ( localvarint( bg_hi_index ) ); \ - close self; \ - close emblem_bg_select; \ - openimmediate emblem_edit; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_EMBLEM_BACKGROUND_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_BUY_AND_SELECT_CAPS", BUY_SELECT_EMBLEM_BACKGROUND_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MPUI_CANCEL_PURCHASE_CAPS", close self;, 1, name PurchaseEmblemBackgroundConfirmation_3 ) - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PurchaseAttachmentPointConfirmation", setfocus "PurchaseAttachmentPointConfirmation_2", ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - - #define SELECTED_ATTACHMENT_POINT_NAME \ - tablelookup( "mp/attachmentTable.csv", 4, dvarString( "selected_attachment_point" ), 3 ) - - #define SELECTED_ATTACHMENT_POINT_COST \ - tablelookup( "mp/attachmentTable.csv", 4, dvarString( "selected_attachment_point" ), 12 ) - - #define SELECTED_ATTACHMENT_POINT_DESC \ - tablelookup( "mp/attachmentTable.csv", 4, dvarString( "selected_attachment_point" ), 7 ) - - PURCHASE_CONFIRMATION_ITEM_INFO( SELECTED_ATTACHMENT_POINT_NAME, SELECTED_ATTACHMENT_POINT_COST, SELECTED_ATTACHMENT_POINT_DESC ) - - #define IS_PRIMARY ( dvarString( "selected_loadout_slot" ) == "primary" ) - - #define PURCHASE_ATTACH_POINT_ACTION \ - execnow "purchaseitemattachmentpoint" (Select( IS_PRIMARY, STAT_CAC_PRIMARY, STAT_CAC_SECONDARY )) (dvarString( "selected_attachment_point" )); \ - close self; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", PURCHASE_ATTACH_POINT_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_CANCEL_PURCHASE_CAPS", close self;, 1, name PurchaseAttachmentPointConfirmation_2 ) - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( "PrestigeLBPurchaseConfirmation", setfocus "PrestigeLBPurchaseConfirmation_2", ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@MENU_CONFIRM_PURCHASE_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( "MPUI_PRESTIGE_LEADERBOARDS_CAPS", GetItemCost(GetItemIndex("FEATURE_PRESTIGE_LB")), "" ) - - #define BUY_PRESTIGE_LB_ACTION \ - execNow purchaseItem (getItemIndex("FEATURE_PRESTIGE_LB")); \ - execnow "uploadstats"; \ - close self; \ - openImmediate menu_playercards_lb_prestige - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_BUY_CAPS", BUY_PRESTIGE_LB_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_CANCEL_PURCHASE_CAPS", close self, 1, name PrestigeLBPurchaseConfirmation_2 ) - } - - - // Redefinitions for LARGE_POPUP_SETUP popups - #undef POPUP_WIDTH - #define POPUP_WIDTH LARGE_POPUP_WIDTH - #undef POPUP_HEIGHT - #define POPUP_HEIGHT LARGE_POPUP_HEIGHT - #undef CHOICE_SIZE_X - #define CHOICE_SIZE_X (LARGE_POPUP_WIDTH / 3) - // Redefinitions for LARGE_POPUP_SETUP popups - - - // ==================================================================================================== - // reset to default class selection =================================================================== - // ==================================================================================================== - #define RESET_DEFAULT_ACTION( ptype ) \ - play CHOICE_FOCUS_SOUND; \ - open "popup_cac_defaultclasswarning"ptype; - - #undef CHOICE_GROUP - #define CHOICE_GROUP "reset_class" - - // hackaround to work for PC's floating mouse unfocusing - #undef UI_FOCUSFIRST - #ifdef PC - #define UI_FOCUSFIRST "ui_class" - #else - #define UI_FOCUSFIRST "ui_fake_focus" - #endif - menuDef - { - #define IS_CUSTOM_CLASS_MODE dvarInt( ui_useCustomClassInfo ) == 1 - - LARGE_POPUP_SETUP_VIS( "popup_cac_template", execnow "set "UI_FOCUSFIRST" class_smg";, ;, POPUP_GLOW_WHITE, 0, 1 ) - - LARGE_POPUP_TITLE_VIS( dvarString( dvarString( ui_custom_name ) ), when( !IS_CUSTOM_CLASS_MODE && IS_ONLINE_GAME && !IS_BASICTRAINING_GAME ) ) - LARGE_POPUP_TITLE_VIS( dvarString( dvarString( offline_custom_name ) ), when( !IS_CUSTOM_CLASS_MODE && ( !IS_ONLINE_GAME || IS_BASICTRAINING_GAME ) ) ) - LARGE_POPUP_TITLE_VIS( dvarString( custom_class_name ), when( IS_CUSTOM_CLASS_MODE ) ) - - LARGE_POPUP_SUBTITLE_VIS( toUpper( dvarstring(ui_menu_selection_title) ), 1 ) - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 1, "@CLASS_CLASS1", RESET_DEFAULT_ACTION( "_smg" ), setdvar ui_class class_custom_smg; setDvarFromLocString( ui_default_name, "@CLASS_CLASS1" );, ;, 1, ; ) - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 2, "@CLASS_CLASS2", RESET_DEFAULT_ACTION( "_cqb" ), setdvar ui_class class_custom_cqb; setDvarFromLocString( ui_default_name, "@CLASS_CLASS2" );, ;, 1, ; ) - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 3, "@CLASS_CLASS3", RESET_DEFAULT_ACTION( "_assault" ), setdvar ui_class class_custom_assault; setDvarFromLocString( ui_default_name, "@CLASS_CLASS3" );, ;, 1, ; ) - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 4, "@CLASS_CLASS4", RESET_DEFAULT_ACTION( "_lmg" ), setdvar ui_class class_custom_lmg; setDvarFromLocString( ui_default_name, "@CLASS_CLASS4" );, ;, 1, ; ) - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 5, "@CLASS_CLASS5", RESET_DEFAULT_ACTION( "_sniper" ), setdvar ui_class class_custom_sniper; setDvarFromLocString( ui_default_name, "@CLASS_CLASS5" );, ;, 1, ; ) - - #undef CAC_WIDTH - #define CAC_WIDTH LARGE_POPUP_WIDTH - #undef CAC_HEIGHT - #define CAC_HEIGHT LARGE_POPUP_HEIGHT - - #define COMMON_ITEM_INFO_WIDTH 200 - #define COMMON_ITEM_INFO_X (CAC_WIDTH - COMMON_ITEM_INFO_WIDTH - POPUP_SIDE_PAD ) - #define COMMON_ITEM_INFO_Y (POPUP_SIDE_PAD*1.5) - - // Default class stats - #undef STAT_CAC_PRIMARY_GRENADE - #define STAT_CAC_PRIMARY_GRENADE GetDefaultClassSlot( dvarstring( ui_class ), "primarygrenade" ) - #undef STAT_CAC_PRIMARY - #define STAT_CAC_PRIMARY GetDefaultClassSlot( dvarstring( ui_class ), "primary" ) - // no default attachments or camo for now - #undef STAT_CAC_PRIMARY_ATTACHMENT - #define STAT_CAC_PRIMARY_ATTACHMENT 0 - #undef STAT_CAC_PRIMARY_CAMO - #define STAT_CAC_PRIMARY_CAMO 0 - #undef STAT_CAC_SECONDARY - #define STAT_CAC_SECONDARY GetDefaultClassSlot( dvarstring( ui_class ), "secondary" ) - // no default attachments or camo for now - #undef STAT_CAC_SECONDARY_ATTACHMENT - #define STAT_CAC_SECONDARY_ATTACHMENT 0 - #undef STAT_CAC_SECONDARY_CAMO - #define STAT_CAC_SECONDARY_CAMO 0 - #undef STAT_CAC_SPECIALTY1 - #define STAT_CAC_SPECIALTY1 GetDefaultClassSlot( dvarstring( ui_class ), "specialty1" ) - #undef STAT_CAC_SPECIALTY2 - #define STAT_CAC_SPECIALTY2 GetDefaultClassSlot( dvarstring( ui_class ), "specialty2" ) - #undef STAT_CAC_SPECIALTY3 - #define STAT_CAC_SPECIALTY3 GetDefaultClassSlot( dvarstring( ui_class ), "specialty3" ) - #undef STAT_CAC_EQUIPMENT - #define STAT_CAC_EQUIPMENT GetDefaultClassSlot( dvarstring( ui_class ), "equipment" ) - #undef STAT_CAC_SPECIAL_GRENADE - #define STAT_CAC_SPECIAL_GRENADE GetDefaultClassSlot( dvarstring( ui_class ), "specialgrenade" ) - #undef STAT_CAC_BODY - #define STAT_CAC_BODY GetDefaultClassSlot( dvarstring( ui_class ), "body" ) - #undef STAT_CAC_DEATHSTREAK - #define STAT_CAC_DEATHSTREAK GetDefaultClassSlot( dvarstring( ui_class ), "deathstreak" ) - #undef STAT_CAC_KILLSTREAK_TIER1 - #define STAT_CAC_KILLSTREAK_TIER1 GetDefaultClassSlot( dvarstring( ui_class ), "killstreak1" ) - #undef STAT_CAC_KILLSTREAK_TIER2 - #define STAT_CAC_KILLSTREAK_TIER2 GetDefaultClassSlot( dvarstring( ui_class ), "killstreak2" ) - #undef STAT_CAC_KILLSTREAK_TIER3 - #define STAT_CAC_KILLSTREAK_TIER3 GetDefaultClassSlot( dvarstring( ui_class ), "killstreak3" ) - #undef FIRST_ATTACHMENT_PRIMARY_WEAPON - #define FIRST_ATTACHMENT_PRIMARY_WEAPON -1 - #undef SECOND_ATTACHMENT_PRIMARY_WEAPON - #define SECOND_ATTACHMENT_PRIMARY_WEAPON -1 - - - #include "ui_mp/newframe.inc" - #include "ui_mp/cac_item_info.inc" - - LARGE_POPUP_BACK_BUTTON - } diff --git a/mods/patch_mp/ui_mp/cac_weapon.menu b/mods/patch_mp/ui_mp/cac_weapon.menu deleted file mode 100644 index 602a271..0000000 --- a/mods/patch_mp/ui_mp/cac_weapon.menu +++ /dev/null @@ -1,1618 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/cac_stats.inc" -#include "ui_mp/common_macro.inc" - -#undef ORIGIN_TITLE -#define ORIGIN_TITLE 0 0 - -#ifdef CONSOLE - #undef CHOICE_X_START - #define CHOICE_X_START 0 - - #undef CHOICE_Y_START - #define CHOICE_Y_START 50 - - #define RECT_ALIGN ; -#else - #undef CHOICE_X_START - #define CHOICE_X_START 30 - - #undef CHOICE_Y_START - #define CHOICE_Y_START 90 - - #define RECT_ALIGN HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN; -#endif - -#undef CHOICE_GROUP -#define CHOICE_GROUP "cac_weapon" - -#define BUTTON_BG_WIDTH 210 - -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui_mp/cac_viewer.inc" - -#include "ui_mp/cac_loadout.inc" -#include "ui_mp/cac_player_model.inc" -#include "ui_mp/cac_weapon_anim_states.inc" -#include "ui_mp/grid_common.inc" -#include "ui_mp/overlaybg.inc" -#include "ui_mp/popup_player_info.inc" -#include "ui_mp/stats_info.inc" -#include "ui_mp/item_listbox.inc" -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X 200 - -#define TOP_Y_OFFSET_ON 10 -#define BOTTOM_Y_OFFSET_ON -110 -#define TOP_Y_OFFSET_OFF -20 -#define BOTTOM_Y_OFFSET_OFF -60 - -#define LEFT_X_OFFSET 0 -#define MIDDLE_X_OFFSET -100 -#define RIGHT_X_OFFSET -200 - -#define CLASS_BONUS_VALUE GetClassBonus( dvarString( ui_custom_name ) ) -#define CAN_GUN_HAVE_CUSTOM_RETICLE ( dvarInt( ui_canHaveCustomReticle ) == 1 ) -#define CUSTOMIZING_RETICLE ( localVarInt( "ui_disable_controls" ) == 0 && dvarString( ui_inside_popup ) == "select_reticle" ) -#define CUSTOMIZING_RETICLE_COLOR ( localVarInt( "ui_disable_controls" ) == 0 && dvarString( ui_inside_popup ) == "select_reticle_color" ) -#define CUSTOMIZING_LENS ( localVarInt( "ui_disable_controls" ) == 0 && dvarString( ui_inside_popup ) == "select_lens" ) - -#define WEAPON_GROUP_LIST_BUTTON_B_ACTION \ - if ( dvarString( selected_loadout_slot ) == "primary" ) \ - { \ - execnow setCurrentItemIndex ( STAT_CAC_PRIMARY ); \ - } \ - elseif ( dvarString( selected_loadout_slot ) == "secondary" ) \ - { \ - execnow setCurrentItemIndex ( STAT_CAC_SECONDARY ); \ - } - -#define WEAPON_LIST_BUTTON_B_ACTION \ - execnow set cac_weapon_current_list weapon_group_list; \ - execnow set cac_weapon_feeder_count ( GetFeederCount( weapon_group_list ) ); \ - execnow set ui_next_inside_popup select_weapon_group; \ - if ( dvarString( selected_loadout_slot ) == "primary" ) \ - { \ - execnow setCurrentItemIndex ( STAT_CAC_PRIMARY ); \ - } \ - elseif ( dvarString( selected_loadout_slot ) == "secondary" ) \ - { \ - execnow setCurrentItemIndex ( STAT_CAC_SECONDARY ); \ - } - -#define UPDATE_ATTACH_SLOT_TOP \ - if ( dvarString( selected_loadout_slot ) == "primary" ) \ - { \ - execnow set ui_att_slot_top ( CAC_PRI_ATTACHMENT_SLOT_TOP ); \ - } \ - elseif ( dvarString( selected_loadout_slot ) == "secondary" ) \ - { \ - execnow set ui_att_slot_top ( CAC_SEC_ATTACHMENT_SLOT_TOP ); \ - } \ - if ( IsAttachmentAllowedOnItemIndex( STAT_CAC_PRIMARY, "elbit" ) || IsAttachmentAllowedOnItemIndex( STAT_CAC_PRIMARY, "reflex" ) ) \ - { \ - setDvar ui_canHaveCustomReticle 1; \ - } \ - else \ - { \ - setDvar ui_canHaveCustomReticle 0; \ - } - -#undef ON_ESC -#define ON_ESC \ - if( dvarString( cac_weapon_current_list ) == "weapon_list" ) \ - { \ - execnow ui_animate cac_weapon anim_controller CloseDropDownList 0; \ - WEAPON_LIST_BUTTON_B_ACTION \ - } \ - elseif( dvarString( cac_weapon_current_list ) == "weapon_group_list" ) \ - { \ - execnow ui_animate cac_weapon anim_controller CloseDropDownList 0; \ - WEAPON_GROUP_LIST_BUTTON_B_ACTION \ - } \ - else \ - { \ - if ( dvarString( selected_loadout_slot ) == "primary" ) \ - { \ - execnow setCurrentItemIndex ( STAT_CAC_PRIMARY ); \ - } \ - elseif ( dvarString( selected_loadout_slot ) == "secondary" ) \ - { \ - execnow setCurrentItemIndex ( STAT_CAC_SECONDARY ); \ - } \ - \ - if ( dvarString( ui_inside_popup ) != "0" ) \ - { \ - execnow ui_animate cac_weapon anim_controller CloseDropDownList 0; \ - } \ - else \ - { \ - closeimmediate self; \ - execnow changemenuopenslidedirection menu_cac_custom MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - openimmediate menu_cac_custom; \ - } \ - } - -{ - - menuDef - { - name cac_weapon - rect 0 0 640 480 - style WINDOW_STYLE_EMPTY - control MENU_CONTROL_OPENER - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - popup - - onOpen - { - if ( dvarString( ui_faction ) == "" ) { setdvar ui_faction FIRST_FACTION; } - execnow set ui_cac_weapon_hint_text ""; - SHOW_VIEWER; - SET_VIEWER_MODE_PLAYER; - // set focus to first menu selection - setfocus NEW_FRAME_BUTTON_NAME"1"; - execnow set cac_weapon_feeder_count 0; - UPDATE_ATTACH_SLOT_TOP - execNow set ui_numBarPartitions 10; - setlocalVarBool ui_inside_dropdown 0; - } - - onFocus - { - setLocalVarInt ui_highlight -1; - execnow set ui_cac_weapon_hint_text ""; - setLocalVarString ui_choicegroup CHOICE_GROUP; - activateBlur; - - UPDATE_ATTACH_SLOT_TOP - if ( dvarBool( "ui_closeAfterPurchase" ) ) - { - execnow ui_animate cac_weapon anim_controller CloseDropDownList 0; - execnow set ui_closeAfterPurchase 0; - } - } - - onEsc - { - ON_ESC - } - - onClose - { - deactivateBlur; - HIDE_VIEWER; - } - - // Frame setup - #define CAC_HEIGHT NEW_FRAME_DEFAULT_HEIGHT - #define CAC_WIDTH ( CAC_HEIGHT * FRAME_ASPECT_RATIO ) - #define IS_CUSTOM_CLASS_MODE dvarInt( ui_useCustomClassInfo ) == 1 - #define IS_ONLINE_GAME ( dvarInt( splitscreen ) == 0 && dvarInt( systemlink ) == 0 ) - #define IS_BASICTRAINING_GAME ( dvarInt( xblive_basictraining ) > 0 ) - - NEW_FRAME( CAC_WIDTH, CAC_HEIGHT ) - NEW_FRAME_TITLE( CAC_WIDTH, CAC_HEIGHT, "@MPUI_CREATE_A_CLASS_CAPS", when( !IS_CUSTOM_CLASS_MODE ) ) - NEW_FRAME_TITLE( CAC_WIDTH, CAC_HEIGHT, "@CUSTOM_EDIT_CLASS_LOADOUT_CAPS", when( IS_CUSTOM_CLASS_MODE ) ) - NEW_FRAME_SUBTITLE( CAC_WIDTH, CAC_HEIGHT, dvarString( dvarString( ui_custom_name ) ) + " / " + locString("@MPUI_PRIMARY_WEAPON_CAPS"), when( dvarString( selected_loadout_slot ) == "primary" && !IS_CUSTOM_CLASS_MODE && ( IS_ONLINE_GAME && !IS_BASICTRAINING_GAME ) ) ) - NEW_FRAME_SUBTITLE( CAC_WIDTH, CAC_HEIGHT, dvarString( dvarString( ui_custom_name ) ) + " / " + locString("@MPUI_SECONDARY_WEAPON_CAPS"), when( dvarString( selected_loadout_slot ) == "secondary" && !IS_CUSTOM_CLASS_MODE && ( IS_ONLINE_GAME && !IS_BASICTRAINING_GAME ) ) ) - NEW_FRAME_SUBTITLE( CAC_WIDTH, CAC_HEIGHT, dvarString( dvarString( offline_custom_name ) ) + " / " + locString("@MPUI_PRIMARY_WEAPON_CAPS"), when( dvarString( selected_loadout_slot ) == "primary" && !IS_CUSTOM_CLASS_MODE && ( !IS_ONLINE_GAME || IS_BASICTRAINING_GAME ) ) ) - NEW_FRAME_SUBTITLE( CAC_WIDTH, CAC_HEIGHT, dvarString( dvarString( offline_custom_name ) ) + " / " + locString("@MPUI_SECONDARY_WEAPON_CAPS"), when( dvarString( selected_loadout_slot ) == "secondary" && !IS_CUSTOM_CLASS_MODE && ( !IS_ONLINE_GAME || IS_BASICTRAINING_GAME ) ) ) - NEW_FRAME_SUBTITLE( CAC_WIDTH, CAC_HEIGHT, dvarString( custom_class_name ) + " / " + locString("@MPUI_PRIMARY_WEAPON_CAPS"), when( dvarString( selected_loadout_slot ) == "primary" && IS_CUSTOM_CLASS_MODE ) ) - NEW_FRAME_SUBTITLE( CAC_WIDTH, CAC_HEIGHT, dvarString( custom_class_name ) + " / " + locString("@MPUI_SECONDARY_WEAPON_CAPS"), when( dvarString( selected_loadout_slot ) == "secondary" && IS_CUSTOM_CLASS_MODE ) ) - - PLAYER_INFO_VIS( CAC_WIDTH, CAC_HEIGHT, 1 ) - -#define DIRT_IMAGE_WIDTH 400 -#define DIRT_IMAGE_HEIGHT 128 -#define DIRT_IMAGE_X (-DIRT_IMAGE_WIDTH/2) -#define DIRT_IMAGE_Y 60 - -#ifndef PC_INGAME - /* dirt image */ - PREPROC_SHADER_DRAW( DIRT_IMAGE_X DIRT_IMAGE_Y DIRT_IMAGE_WIDTH DIRT_IMAGE_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "menu_mp_lobby_cac_dirt", 1 1 1 0.2 ) - - CAC_FACTION_MODEL - -#ifdef PC - CAC_ROTATE_ARROWS -#endif // #ifdef PC -#endif - // Button setup -#define FEEDER_MAX 10 -#define FEEDER_COUNT ( dvarInt( cac_weapon_feeder_count ) ) -//#define LIMITED_FEEDER_COUNT ( Select( ( FEEDER_COUNT > FEEDER_MAX ), FEEDER_MAX, FEEDER_COUNT ) ) -#define LIMITED_FEEDER_COUNT 1 -#define SCROLL_ARROWS_OFFSET ( Select( ( FEEDER_COUNT > FEEDER_MAX ), ( NEW_FRAME_BUTTON_SPACING ), 0 ) ) - -#undef BUTTON_BG_WIDTH -#define BUTTON_BG_WIDTH NEW_FRAME_BUTTON_WIDTH -#define WEAPON_BUTTON_HEIGHT NEW_FRAME_BUTTON_HEIGHT -#define WEAPON_BUTTON_WIDTH NEW_FRAME_BUTTON_WIDTH -#define LEFT_X NEW_FRAME_CHOICE_X_START -#define TOP_Y NEW_FRAME_CHOICE_Y_START -#define BOTTOM_Y ( CAC_HEIGHT / 2 - WEAPON_BUTTON_HEIGHT - 10 ) - -#define SELECT_WEAPON_INDEX 1 -#define SELECT_WEAPON_INDEX_STRING "1" -#define ATTACHMENTS_INDEX 2 -#define CAMO_INDEX 3 -#define CAMO_INDEX_STRING "3" -#define RETICLE_INDEX 4 -#define RETICLE_INDEX_STRING "4" -#define RETICLE_COLOR_INDEX 5 -#define RETICLE_COLOR_INDEX_STRING "5" -#define LENS_INDEX 6 -#define LENS_INDEX_STRING "6" -#define GUN_TAG_INDEX 7 -#define GUN_TAG_INDEX_STRING "7" -#define GUN_EMBLEM_INDEX 8 -#define GUN_EMBLEM_INDEX_STRING "8" -#define DUAL_WIELD_INDEX 9 -#define SECOND_ATTACHMENT_INDEX 10 -#define HINT_INDEX 11 - -#define SELECT_WEAPON_Y ( TOP_Y ) -#define ATTACHMENTS_Y ( SELECT_WEAPON_Y + WEAPON_BUTTON_HEIGHT + NEW_FRAME_BUTTON_SPACING ) -#define CAMO_Y ( ATTACHMENTS_Y + WEAPON_BUTTON_HEIGHT + NEW_FRAME_BUTTON_SPACING ) -#define RETICLE_Y ( CAMO_Y + WEAPON_BUTTON_HEIGHT + NEW_FRAME_SEPARATED_BUTTON_SPACING ) -#define RETICLE_COLOR_Y ( RETICLE_Y + WEAPON_BUTTON_HEIGHT + NEW_FRAME_BUTTON_SPACING ) -#define LENS_Y ( RETICLE_COLOR_Y + WEAPON_BUTTON_HEIGHT + NEW_FRAME_BUTTON_SPACING ) -#define GUN_TAG_Y ( LENS_Y + WEAPON_BUTTON_HEIGHT + NEW_FRAME_SEPARATED_BUTTON_SPACING ) -#define GUN_EMBLEM_Y ( GUN_TAG_Y + WEAPON_BUTTON_HEIGHT + NEW_FRAME_BUTTON_SPACING ) -#define DUAL_WIELD_Y ( GUN_EMBLEM_Y + WEAPON_BUTTON_HEIGHT + NEW_FRAME_BUTTON_SPACING ) -#define SECOND_ATTACHMENT_Y ( DUAL_WIELD_Y + WEAPON_BUTTON_HEIGHT + NEW_FRAME_BUTTON_SPACING ) -#define HINT_Y ( SECOND_ATTACHMENT_Y + WEAPON_BUTTON_HEIGHT + NEW_FRAME_BUTTON_SPACING ) - -#define LAST_Y HINT_Y -#define ACCORDION_HEIGHT ( BOTTOM_Y - LAST_Y ) - - // Listbox setup -#define LIST_X_START LEFT_X -#define LIST_HEIGHT 0 -#define LIST_UNROLLED_HEIGHT ( FEEDER_MAX * 17 + 5 ) -#define LIST_WIDTH WEAPON_BUTTON_WIDTH -#define LIST_ELEM_HEIGHT 17 -#undef CHOICE_HORIZONTAL_ALIGN -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER -#undef CHOICE_VERTICAL_ALIGN -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER - - // Animation states -#define BUTTONS_FADE_TIME 90 -#define ACCORDION_EXPAND_TIME 150 -#define ACCORDION_ROLLUP_TIME 150 -#define INTERIM_ANIM_TIME 15 - -#define GET_SLOT_STAT \ - ( Select( dvarString( selected_loadout_slot ) == "primary", STAT_CAC_PRIMARY, STAT_CAC_SECONDARY ) ) - -#define LISTBOX_STATES \ - state \ - { \ - name Unrolled \ - rect LIST_X_START LIST_Y_START LIST_WIDTH LIST_UNROLLED_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - } - - // This is a dummy itemDef to disable controls. - // Used when animating. - itemDef - { - name dummyButton - type ITEM_TYPE_BUTTON_NO_TEXT - rect 0 0 0 0 - visible when( localVarInt( "ui_disable_controls" ) == 1 ); - - execKeyInt BUTTON_B {} - execKeyInt APAD_UP {} - execKeyInt DPAD_UP {} - execKeyInt APAD_DOWN {} - execKeyInt DPAD_DOWN {} - execKeyInt APAD_LEFT {} - execKeyInt DPAD_LEFT {} - execKeyInt APAD_RIGHT {} - execKeyInt DPAD_RIGHT {} - } - - // Animation controller - itemDef - { - name anim_controller - style WINDOW_STYLE_SHADER - rect 0 0 0 0 - visible 1 - decoration - - // Open drop down list - state - { - name OpenDropDownList - onEnter - { - setLocalVarInt ui_disable_controls 1; - setFocus dummyButton; - execNow if ( localVarInt( ui_weaponButton ) < 8 ) ui_animate cac_weapon NEW_FRAME_BUTTON_NAME"8" Transparent BUTTONS_FADE_TIME; - execNow if ( localVarInt( ui_weaponButton ) < 7 ) ui_animate cac_weapon NEW_FRAME_BUTTON_NAME"7" Transparent BUTTONS_FADE_TIME; - execNow if ( localVarInt( ui_weaponButton ) < 6 ) ui_animate cac_weapon NEW_FRAME_BUTTON_NAME"6" Transparent BUTTONS_FADE_TIME; - execNow if ( localVarInt( ui_weaponButton ) < 5 ) ui_animate cac_weapon NEW_FRAME_BUTTON_NAME"5" Transparent BUTTONS_FADE_TIME; - execNow if ( localVarInt( ui_weaponButton ) < 4 ) ui_animate cac_weapon NEW_FRAME_BUTTON_NAME"4" Transparent BUTTONS_FADE_TIME; - execNow if ( localVarInt( ui_weaponButton ) < 3 ) ui_animate cac_weapon NEW_FRAME_BUTTON_NAME"3" Transparent BUTTONS_FADE_TIME; - execNow if ( localVarInt( ui_weaponButton ) < 2 ) ui_animate cac_weapon NEW_FRAME_BUTTON_NAME"2" Transparent BUTTONS_FADE_TIME; - execnow ui_animate cac_weapon menu_hint Transparent BUTTONS_FADE_TIME; - execnow ui_animate cac_weapon list_hint Transparent 0; - execnow ui_animate cac_weapon anim_controller OpenDropDownList2 ( BUTTONS_FADE_TIME + INTERIM_ANIM_TIME ); - } - } - state - { - name OpenDropDownList2 - onEnter - { - setLocalVarBool ui_inside_dropdown 1; - execnow ui_animate cac_weapon (dvarString( cac_weapon_current_list )) Unrolled ACCORDION_EXPAND_TIME; - execnow ui_animate cac_weapon list_hint Default ACCORDION_EXPAND_TIME; - play uin_navigation_menu_sm_open; - execnow ui_animate cac_weapon anim_controller OpenDropDownList3 ( ( LIMITED_FEEDER_COUNT * ACCORDION_EXPAND_TIME ) + INTERIM_ANIM_TIME ); - } - } - state - { - name OpenDropDownList3 - onEnter - { - execnow focusitem ( dvarString( cac_weapon_current_list ) ); - setLocalVarInt ui_disable_controls 0; - } - } - - // Close drop down list - state - { - name CloseDropDownList - onEnter - { - UPDATE_ATTACH_SLOT_TOP - setLocalVarInt ui_disable_controls 1; - setFocus dummyButton; - execnow ui_animate cac_weapon (dvarString( cac_weapon_current_list )) Default ( LIMITED_FEEDER_COUNT * ACCORDION_ROLLUP_TIME ); - execnow ui_animate cac_weapon list_hint Transparent ACCORDION_ROLLUP_TIME; - execnow ui_animate cac_weapon anim_controller CloseDropDownList2 ( ( LIMITED_FEEDER_COUNT * ACCORDION_ROLLUP_TIME ) + INTERIM_ANIM_TIME ); - execnow set cac_weapon_current_list ""; - execnow set cac_weapon_feeder_count 0; - play uin_navigation_menu_sm_close; - } - } - state - { - name CloseDropDownList2 - onEnter - { - setLocalVarInt ui_inside_dropdown 0; - if ( dvarString( cac_weapon_current_list ) != "" ) - { - execnow set ui_inside_popup (dvarString(ui_next_inside_popup)); - if( dvarString(ui_next_inside_popup) == "select_weapon_group" ) - { - execnow setCurrentItemIndex ( GET_SLOT_STAT ); - } - execnow ui_animate cac_weapon anim_controller OpenDropDownList 0; - } - else - { - execnow ui_animate cac_weapon * Default BUTTONS_FADE_TIME; - execnow ui_animate cac_weapon list_hint Transparent 0; - execnow ui_animate cac_weapon anim_controller CloseDropDownList3 ( BUTTONS_FADE_TIME + INTERIM_ANIM_TIME ); - } - } - } - state - { - name CloseDropDownList3 - onEnter - { - execnow focusitem (NEW_FRAME_BUTTON_NAME+localVarInt( ui_weaponButton )); - setLocalVarInt ui_disable_controls 0; - execnow set ui_inside_popup "0"; - } - } - } - -#define IS_PRI ( dvarString( selected_loadout_slot ) == "primary" ) -#define IS_SEC ( dvarString( selected_loadout_slot ) == "secondary" ) - - // Button actions -#define COMMON_BUTTON_ACTION \ - execnow ui_animate cac_weapon anim_controller OpenDropDownList 0; - -#define SELECT_WEAPON_ACTION \ - if ( dvarString( ui_inside_popup ) != "0" ) \ - { \ - ON_ESC \ - } \ - else \ - { \ - setDvar ui_inside_popup select_weapon_group; \ - execnow set cac_weapon_current_list weapon_group_list; \ - execnow set cac_weapon_feeder_count ( GetFeederCount( weapon_group_list ) );\ - setLocalVarInt ui_weaponButton SELECT_WEAPON_INDEX; \ - COMMON_BUTTON_ACTION \ - } - -#define SELECT_WEAPON_VIS \ - ( !localVarBool( ui_inside_dropdown ) || ( localVarInt( ui_weaponButton ) >= SELECT_WEAPON_INDEX ) ) - -#define ATTACHMENTS_ACTION \ - if ( dvarString( ui_inside_popup ) != "0" ) \ - { \ - ON_ESC \ - } \ - else \ - { \ - if ( dvarString( selected_loadout_slot ) == "primary" ) \ - { \ - execnow setCurrentItemIndex ( STAT_CAC_PRIMARY ); \ - } \ - elseif ( dvarString( selected_loadout_slot ) == "secondary" ) \ - { \ - execnow setCurrentItemIndex ( STAT_CAC_SECONDARY ); \ - } \ - setDvar ui_inside_popup attachments; \ - execnow set cac_weapon_current_list attachments_list; \ - execnow set cac_weapon_feeder_count ( GetFeederCount( attachments_list ) ); \ - setLocalVarInt ui_weaponButton ATTACHMENTS_INDEX; \ - COMMON_BUTTON_ACTION \ - } - -#define ATTACHMENTS_VIS \ - ( !localVarBool( ui_inside_dropdown ) || ( localVarInt( ui_weaponButton ) >= ATTACHMENTS_INDEX ) ) - -#define WEAPON_OPTION_ACTION( popupName, currentList, index, group ) \ - if ( dvarString( ui_inside_popup ) != "0" ) \ - { \ - ON_ESC \ - } \ - else \ - { \ - execNow set ui_currentWeaponOptionGroup group; \ - if ( dvarString( selected_loadout_slot ) == "primary" ) \ - { \ - execNow set selected_group GetItemGroup( STAT_CAC_PRIMARY ); \ - execnow setCurrentItemIndex ( STAT_CAC_PRIMARY ); \ - } \ - elseif ( dvarString( selected_loadout_slot ) == "secondary" ) \ - { \ - execNow set selected_group GetItemGroup( STAT_CAC_SECONDARY ); \ - execnow setCurrentItemIndex ( STAT_CAC_SECONDARY ); \ - } \ - setDvar ui_inside_popup popupName; \ - execnow set cac_weapon_current_list currentList; \ - execnow set cac_weapon_feeder_count ( GetFeederCount( currentList ) ); \ - setLocalVarInt ui_weaponButton index; \ - COMMON_BUTTON_ACTION \ - } - -#define CAMO_ACTION \ - WEAPON_OPTION_ACTION( select_camo, camo_list, CAMO_INDEX, 0 ) \ - -#define CAMO_VIS \ - ( !localVarBool( ui_inside_dropdown ) || ( localVarInt( ui_weaponButton ) >= CAMO_INDEX ) ) - -#define RETICLE_ACTION \ - WEAPON_OPTION_ACTION( select_reticle, reticle_list, RETICLE_INDEX, 1 ) \ - -#define RETICLE_VIS \ - ( !localVarBool( ui_inside_dropdown ) || ( localVarInt( ui_weaponButton ) >= RETICLE_INDEX ) ) - -#define RETICLE_COLOR_ACTION \ - WEAPON_OPTION_ACTION( select_reticle_color, reticle_color_list, RETICLE_COLOR_INDEX, 5 ) - -#define RETICLE_COLOR_VIS \ - ( !localVarBool( ui_inside_dropdown ) || ( localVarInt( ui_weaponButton ) >= RETICLE_COLOR_INDEX ) ) - -#define LENS_ACTION \ - WEAPON_OPTION_ACTION( select_lens, lens_list, LENS_INDEX, 2 ) \ - -#define LENS_VIS \ - ( !localVarBool( ui_inside_dropdown ) || ( localVarInt( ui_weaponButton ) >= LENS_INDEX ) ) - - // Conditions -#include "ui_mp/cac_attachment_conditions.inc" - -#define IS_NO_LIST_OPEN ( dvarString( "ui_inside_popup" ) == "0" ) -#define IS_WEAPON_LIST_OPEN ( dvarString( "ui_inside_popup" ) == "select_weapon_group" || dvarString( "ui_inside_popup" ) == "select_weapon" ) -#define IS_ATTACHMENT_LIST_OPEN ( dvarString( "ui_inside_popup" ) == "attachments" ) -#define ATTACHMENTS_AVAILABLE ( GetCurrentItemNumAttachments() > 1 ) // None counts as an attachment. -#define IS_CAMO_LIST_OPEN ( dvarString( "ui_inside_popup" ) == "select_camo" ) -#define IS_RETICLE_LIST_OPEN ( dvarString( "ui_inside_popup" ) == "select_reticle" ) -#define IS_LENS_LIST_OPEN ( dvarString( "ui_inside_popup" ) == "select_lens" || dvarString( "ui_inside_popup" ) == "select_lens_color" ) - -#define ACCORDION_BUTTON_RECT( yPos ) \ - LEFT_X yPos WEAPON_BUTTON_WIDTH WEAPON_BUTTON_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - - // Accordion buttons - NEW_FRAME_BUTTON( 1, ACCORDION_BUTTON_RECT( SELECT_WEAPON_Y ), - "@MPUI_PRIMARY_WEAPON_CAPS", - SELECT_WEAPON_ACTION, - ;, - ;, - dvarString( selected_loadout_slot ) == "primary" && SELECT_WEAPON_VIS, ;, ; ) - NEW_FRAME_BUTTON( 1, ACCORDION_BUTTON_RECT( SELECT_WEAPON_Y ), - "@MPUI_SECONDARY_WEAPON_CAPS", - SELECT_WEAPON_ACTION, - ;, - ;, - dvarString( selected_loadout_slot ) == "secondary" && SELECT_WEAPON_VIS, ;, ; ) - NEW_FRAME_NEWICON_RECT_VIS( LEFT_X, SELECT_WEAPON_Y, WEAPON_BUTTON_WIDTH, WEAPON_BUTTON_HEIGHT, HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( ANY_NEW_PRIMARIES && dvarString( selected_loadout_slot ) == "primary" && dvarString( "ui_inside_popup" ) == "0" ), - name NEW_FRAME_BUTTON_NAME SELECT_WEAPON_INDEX_STRING; ) - NEW_FRAME_NEWICON_RECT_VIS( LEFT_X, SELECT_WEAPON_Y, WEAPON_BUTTON_WIDTH, WEAPON_BUTTON_HEIGHT, HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( ANY_NEW_SECONDARIES && dvarString( selected_loadout_slot ) == "secondary" && dvarString( "ui_inside_popup" ) == "0" ), - name NEW_FRAME_BUTTON_NAME SELECT_WEAPON_INDEX_STRING; ) - - - - NEW_FRAME_BUTTON( 2, ACCORDION_BUTTON_RECT( ATTACHMENTS_Y ), - "@MPUI_ATTACHMENTS_CAPS", - ATTACHMENTS_ACTION, - ;, - ;, - ATTACHMENTS_AVAILABLE && ATTACHMENTS_VIS, ;, ; ) - NEW_FRAME_BUTTON_COLOR( 2, ACCORDION_BUTTON_RECT( ATTACHMENTS_Y ), - "@MPUI_ATTACHMENTS_CAPS", MEDIUM_GRAY_RGB, MEDIUM_GRAY_ALPHA, MEDIUM_GRAY, - ;, - execnow set ui_cac_weapon_hint_text "@MPUI_GUN_HAS_NO_ATTACHMENTS";, - execnow set ui_cac_weapon_hint_text "";, - !ATTACHMENTS_AVAILABLE && ATTACHMENTS_VIS, ;, ; ) - - - - NEW_FRAME_BUTTON( 3, ACCORDION_BUTTON_RECT( CAMO_Y ), - "@MPUI_CAMO_CAPS", - CAMO_ACTION, - CLEAR_ITEM_NEW( FEATURE_CAMO ), - ;, - ( IS_PRI && !CAMO_LOCKED ) && CAMO_VIS, ;, ; ) - NEW_FRAME_BUTTON_COLOR( 3, ACCORDION_BUTTON_RECT( CAMO_Y ), - "@MPUI_CAMO_CAPS", MEDIUM_GRAY_RGB, MEDIUM_GRAY_ALPHA, MEDIUM_GRAY, - ;, - execnow set ui_cac_weapon_hint_text GET_UNLOCK_LEVEL_STRING( FEATURE_CAMO );, - execnow set ui_cac_weapon_hint_text "";, - ( IS_PRI && CAMO_LOCKED ) && CAMO_VIS, ;, ; ) - NEW_FRAME_NEWICON_RECT_VIS( LEFT_X, CAMO_Y, WEAPON_BUTTON_WIDTH, WEAPON_BUTTON_HEIGHT, HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( IS_ITEM_NEW( FEATURE_CAMO ) && IS_PRI ), - name NEW_FRAME_BUTTON_NAME CAMO_INDEX_STRING; ) - NEW_FRAME_LOCKEDICON_RECT_VIS( LEFT_X, CAMO_Y, WEAPON_BUTTON_WIDTH, WEAPON_BUTTON_HEIGHT, HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( IS_PRI && CAMO_LOCKED ), - name NEW_FRAME_BUTTON_NAME CAMO_INDEX_STRING; ) - - - - NEW_FRAME_BUTTON( 4, ACCORDION_BUTTON_RECT( RETICLE_Y ), - "@MPUI_RETICLE_CAPS", - RETICLE_ACTION, - CLEAR_ITEM_NEW( FEATURE_RETICLES ), - ;, - ( LENSESORRETICLES_AVAILABLE && IS_PRI && !RETICLES_LOCKED ) && RETICLE_VIS, ;, ; ) - NEW_FRAME_BUTTON_COLOR( 4, ACCORDION_BUTTON_RECT( RETICLE_Y ), - "@MPUI_RETICLE_CAPS", MEDIUM_GRAY_RGB, MEDIUM_GRAY_ALPHA, MEDIUM_GRAY, - ;, - execnow set ui_cac_weapon_hint_text "@MPUI_NEED_RETICLE_ATTACHMENT"; CLEAR_ITEM_NEW( FEATURE_RETICLES ), - execnow set ui_cac_weapon_hint_text "";, - ( !LENSESORRETICLES_AVAILABLE && !RETICLES_LOCKED && IS_PRI && CAN_GUN_HAVE_CUSTOM_RETICLE ) && RETICLE_VIS, ;, ; ) - NEW_FRAME_BUTTON_COLOR( 4, ACCORDION_BUTTON_RECT( RETICLE_Y ), - "@MPUI_RETICLE_CAPS", MEDIUM_GRAY_RGB, MEDIUM_GRAY_ALPHA, MEDIUM_GRAY, - ;, - execnow set ui_cac_weapon_hint_text GET_UNLOCK_LEVEL_STRING( FEATURE_RETICLES );, - execnow set ui_cac_weapon_hint_text "";, - ( RETICLES_LOCKED && IS_PRI && CAN_GUN_HAVE_CUSTOM_RETICLE ) && RETICLE_VIS, ;, ; ) - NEW_FRAME_NEWICON_RECT_VIS( LEFT_X, RETICLE_Y, WEAPON_BUTTON_WIDTH, WEAPON_BUTTON_HEIGHT, HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( IS_ITEM_NEW( FEATURE_RETICLES ) && IS_PRI && CAN_GUN_HAVE_CUSTOM_RETICLE ), - name NEW_FRAME_BUTTON_NAME RETICLE_INDEX_STRING; ) - NEW_FRAME_LOCKEDICON_RECT_VIS( LEFT_X, RETICLE_Y, WEAPON_BUTTON_WIDTH, WEAPON_BUTTON_HEIGHT, HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( IS_PRI && CAN_GUN_HAVE_CUSTOM_RETICLE && RETICLES_LOCKED ), - name NEW_FRAME_BUTTON_NAME RETICLE_INDEX_STRING; ) - - - - NEW_FRAME_BUTTON( 5, ACCORDION_BUTTON_RECT( RETICLE_COLOR_Y ), - "@MPUI_RETICLE_COLOR_CAPS", - RETICLE_COLOR_ACTION, - CLEAR_ITEM_NEW( FEATURE_RETICLE_COLOR ), - ;, - ( LENSESORRETICLES_AVAILABLE && IS_PRI && !RETICLE_COLOR_LOCKED ) && RETICLE_COLOR_VIS, ;, ; ) - NEW_FRAME_BUTTON_COLOR( 5, ACCORDION_BUTTON_RECT( RETICLE_COLOR_Y ), - "@MPUI_RETICLE_COLOR_CAPS", MEDIUM_GRAY_RGB, MEDIUM_GRAY_ALPHA, MEDIUM_GRAY, - ;, - execnow set ui_cac_weapon_hint_text "@MPUI_NEED_RETICLE_COLOR_ATTACHMENT"; CLEAR_ITEM_NEW( FEATURE_RETICLE_COLOR ), - execnow set ui_cac_weapon_hint_text "";, - ( !LENSESORRETICLES_AVAILABLE && !RETICLE_COLOR_LOCKED && IS_PRI && CAN_GUN_HAVE_CUSTOM_RETICLE ) && RETICLE_COLOR_VIS, ;, ; ) - NEW_FRAME_BUTTON_COLOR( 5, ACCORDION_BUTTON_RECT( RETICLE_COLOR_Y ), - "@MPUI_RETICLE_COLOR_CAPS", MEDIUM_GRAY_RGB, MEDIUM_GRAY_ALPHA, MEDIUM_GRAY, - ;, - execnow set ui_cac_weapon_hint_text GET_UNLOCK_LEVEL_STRING( FEATURE_RETICLES );, - execnow set ui_cac_weapon_hint_text "";, - ( RETICLE_COLOR_LOCKED && IS_PRI && CAN_GUN_HAVE_CUSTOM_RETICLE ) && RETICLE_COLOR_VIS, ;, ; ) - NEW_FRAME_NEWICON_RECT_VIS( LEFT_X, RETICLE_COLOR_Y, WEAPON_BUTTON_WIDTH, WEAPON_BUTTON_HEIGHT, HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( IS_ITEM_NEW( FEATURE_RETICLE_COLOR ) && IS_PRI && CAN_GUN_HAVE_CUSTOM_RETICLE ), - name NEW_FRAME_BUTTON_NAME RETICLE_COLOR_INDEX_STRING; ) - NEW_FRAME_LOCKEDICON_RECT_VIS( LEFT_X, RETICLE_COLOR_Y, WEAPON_BUTTON_WIDTH, WEAPON_BUTTON_HEIGHT, HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( IS_PRI && CAN_GUN_HAVE_CUSTOM_RETICLE && RETICLE_COLOR_LOCKED ), - name NEW_FRAME_BUTTON_NAME RETICLE_COLOR_INDEX_STRING; ) - - - - NEW_FRAME_BUTTON( 6, ACCORDION_BUTTON_RECT( LENS_Y ), - "@MPUI_LENS_CAPS", - LENS_ACTION, - CLEAR_ITEM_NEW( FEATURE_LENSES ), - ;, - ( LENSESORRETICLES_AVAILABLE && !LENSES_LOCKED && IS_PRI ) && LENS_VIS, ;, ; ) - NEW_FRAME_BUTTON_COLOR( 6, ACCORDION_BUTTON_RECT( LENS_Y ), - "@MPUI_LENS_CAPS", MEDIUM_GRAY_RGB, MEDIUM_GRAY_ALPHA, MEDIUM_GRAY, - ;, - execnow set ui_cac_weapon_hint_text "@MPUI_NEED_LENS_ATTACHMENT"; CLEAR_ITEM_NEW( FEATURE_LENSES ), - execnow set ui_cac_weapon_hint_text "";, - ( IS_PRI && !LENSESORRETICLES_AVAILABLE && !LENSES_LOCKED && CAN_GUN_HAVE_CUSTOM_RETICLE ) && LENS_VIS, ;, ; ) - NEW_FRAME_BUTTON_COLOR( 6, ACCORDION_BUTTON_RECT( LENS_Y ), - "@MPUI_LENS_CAPS", MEDIUM_GRAY_RGB, MEDIUM_GRAY_ALPHA, MEDIUM_GRAY, - ;, - execnow set ui_cac_weapon_hint_text GET_UNLOCK_LEVEL_STRING( FEATURE_LENSES ); , - execnow set ui_cac_weapon_hint_text "";, - ( IS_PRI && LENSES_LOCKED && CAN_GUN_HAVE_CUSTOM_RETICLE ) && LENS_VIS, ;, ; ) - NEW_FRAME_NEWICON_RECT_VIS( LEFT_X, LENS_Y, WEAPON_BUTTON_WIDTH, WEAPON_BUTTON_HEIGHT, HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( IS_ITEM_NEW( FEATURE_LENSES ) && IS_PRI && CAN_GUN_HAVE_CUSTOM_RETICLE ), - name NEW_FRAME_BUTTON_NAME LENS_INDEX_STRING; ) - NEW_FRAME_LOCKEDICON_RECT_VIS( LEFT_X, LENS_Y, WEAPON_BUTTON_WIDTH, WEAPON_BUTTON_HEIGHT, HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( IS_PRI && CAN_GUN_HAVE_CUSTOM_RETICLE && LENSES_LOCKED ), - name NEW_FRAME_BUTTON_NAME LENS_INDEX_STRING; ) - - // Fixed buttons - // --------------------------------------------------------------------------------------------------------------------- -#define IS_FIXED_BUTTON_ACTIVE ( dvarInt( ui_useCustomClassInfo ) == 0 && ( dvarString( "ui_inside_popup" ) == "0" ) ) - - // Gun Tag Button -#define HAVE_ENOUGH_FOR_GUN_TAG ( GetWeaponOptionCost( GetItemOptionByName( "tag" ) ) <= GetStatByName( "CODPOINTS" ) ) -#define CAN_NOT_AFFORD_GUN_TAG ( !GUN_TAG_LOCKED && !GUN_TAG_PURCHASED && !HAVE_ENOUGH_FOR_GUN_TAG ) -#define CAN_AFFORD_GUN_TAG ( !GUN_TAG_LOCKED && !GUN_TAG_PURCHASED && HAVE_ENOUGH_FOR_GUN_TAG ) -#define CAN_TOGGLE_GUN_TAG ( GUN_TAG_PURCHASED ) -#define IS_PRI_GUN_TAG_EQUIPPED ( IS_PRI && (STAT_CAC_PRIMARY_TAG) ) -#define IS_SEC_GUN_TAG_EQUIPPED ( IS_SEC && (STAT_CAC_SECONDARY_TAG) ) - -#define GUN_TAG_X LEFT_X -#define GUN_TAG_W WEAPON_BUTTON_WIDTH -#define GUN_TAG_H WEAPON_BUTTON_HEIGHT -#define GUN_TAG_ALIGN HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER -#define GUN_TAG_RECT GUN_TAG_X GUN_TAG_Y GUN_TAG_W GUN_TAG_H GUN_TAG_ALIGN -#define GUN_TAG_COST_W 50 -#define GUN_TAG_COST_RECT (GUN_TAG_X+GUN_TAG_W-GUN_TAG_COST_W-2) GUN_TAG_Y GUN_TAG_COST_W GUN_TAG_H GUN_TAG_ALIGN -#define GUN_TAG_EQUIP_W GUN_TAG_H -#define GUN_TAG_EQUIP_RECT (GUN_TAG_X+GUN_TAG_W-GUN_TAG_EQUIP_W-2) GUN_TAG_Y GUN_TAG_EQUIP_W GUN_TAG_EQUIP_W GUN_TAG_ALIGN - -#define PURCHASE_GUN_TAG_ACTION \ - execnow set weaponOptionIndex ( GetItemIndex( FEATURE_GUN_TAG ) ); \ - execnow set weaponOptionRef "tag"; \ - open PurchaseWeaponOptionConfirmation; - -#define TOGGLE_GUN_TAG_ACTION \ - execnow toggleWeaponOption (dvarString( ui_custom_name )) tag; - -#define GUN_TAG_VIS \ - ( !localVarBool( ui_inside_dropdown ) ) - -#define GUN_TAG_BUTTONS( xArg, yArg, wArg, hArg, alignArg, visArg ) \ - /* Buttons */ \ - NEW_FRAME_DBUTTON( 7, xArg yArg wArg hArg alignArg, "@MPUI_GUN_TAG_CAPS", \ - ;, \ - execnow set ui_cac_weapon_hint_text GET_UNLOCK_LEVEL_STRING( FEATURE_GUN_TAG );, \ - execnow set ui_cac_weapon_hint_text "";, \ - ( IS_PRI && GUN_TAG_LOCKED && dvarInt( ui_useCustomClassInfo ) == 0 && visArg ), ;, ; ) \ - NEW_FRAME_BUTTON_COLOR( 7, xArg yArg wArg hArg alignArg, "@MPUI_GUN_TAG_CAPS", NEW_FRAME_RED_RGB, NEW_FRAME_RED_ALPHA, NEW_FRAME_RED, \ - ;, \ - CLEAR_ITEM_NEW( FEATURE_GUN_TAG ), \ - ;, \ - ( IS_PRI && CAN_NOT_AFFORD_GUN_TAG && visArg ), ;, ; ) \ - NEW_FRAME_BUTTON_COLOR( 7, xArg yArg wArg hArg alignArg, "@MPUI_GUN_TAG_CAPS", NEW_FRAME_GREEN_RGB, NEW_FRAME_GREEN_ALPHA, NEW_FRAME_GREEN, \ - PURCHASE_GUN_TAG_ACTION, \ - CLEAR_ITEM_NEW( FEATURE_GUN_TAG ), \ - ;, \ - ( IS_PRI && CAN_AFFORD_GUN_TAG && visArg ), ;, ; ) \ - NEW_FRAME_BUTTON_COLOR( 7, xArg yArg wArg hArg alignArg, "@MPUI_GUN_TAG_CAPS", WHITE_RGB, WHITE_ALPHA, BLACK, \ - TOGGLE_GUN_TAG_ACTION, \ - CLEAR_ITEM_NEW( FEATURE_GUN_TAG ), \ - ;, \ - ( IS_PRI && CAN_TOGGLE_GUN_TAG && visArg ), ;, ; ) \ - /* New Icon */ \ - NEW_FRAME_NEWICON_RECT_VIS( xArg, yArg, wArg, hArg, alignArg, \ - ( IS_ITEM_NEW( FEATURE_GUN_TAG ) && IS_PRI && visArg ), \ - name NEW_FRAME_BUTTON_NAME GUN_TAG_INDEX_STRING; ) \ - /* Locked Icon */ \ - NEW_FRAME_LOCKEDICON_RECT_VIS( xArg, yArg, wArg, hArg, alignArg, \ - (IS_PRI && GUN_TAG_LOCKED && visArg), \ - name NEW_FRAME_BUTTON_NAME GUN_TAG_INDEX_STRING; ) \ - /* Cost */ \ - PREPROC_TEXT_DRAW_VIS_EX( (xArg+wArg-GUN_TAG_COST_W-10) yArg GUN_TAG_COST_W hArg alignArg, 0 0, \ - locString( "@MENU_POINTS", GetWeaponOptionCost( GetItemOptionByName( "tag" ) ) ), \ - CHOICE_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_RED, \ - when( IS_PRI && CAN_NOT_AFFORD_GUN_TAG && visArg );, \ - name NEW_FRAME_BUTTON_NAME GUN_TAG_INDEX_STRING; NEW_FRAME_TRANSPARENT_STATE( NEW_FRAME_RED_RGB ) ) \ - PREPROC_TEXT_DRAW_VIS_EX( (xArg+wArg-GUN_TAG_COST_W-10) yArg GUN_TAG_COST_W hArg alignArg, 0 0, \ - locString( "@MENU_POINTS", GetWeaponOptionCost( GetItemOptionByName( "tag" ) ) ), \ - CHOICE_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_GREEN, \ - when( IS_PRI && CAN_AFFORD_GUN_TAG && visArg );, \ - name NEW_FRAME_BUTTON_NAME GUN_TAG_INDEX_STRING; NEW_FRAME_TRANSPARENT_STATE( NEW_FRAME_GREEN_RGB ) ) \ - /* Equipped Icon */ \ - PREPROC_SHADER_DRAW_VIS_EX( (xArg+wArg-GUN_TAG_EQUIP_W-2) yArg GUN_TAG_EQUIP_W GUN_TAG_EQUIP_W alignArg, \ - "menu_mp_killstreak_select", 1 1 1 1, \ - when( IS_PRI && IS_PRI_GUN_TAG_EQUIPPED && visArg );, \ - name NEW_FRAME_BUTTON_NAME GUN_TAG_INDEX_STRING; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) \ - PREPROC_SHADER_DRAW_VIS_EX( (xArg+wArg-GUN_TAG_EQUIP_W-2) yArg GUN_TAG_EQUIP_W GUN_TAG_EQUIP_W alignArg, \ - "menu_mp_killstreak_select", 1 1 1 1, \ - when( IS_PRI && IS_SEC_GUN_TAG_EQUIPPED && visArg );, \ - name NEW_FRAME_BUTTON_NAME GUN_TAG_INDEX_STRING; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) - - GUN_TAG_BUTTONS( GUN_TAG_X, GUN_TAG_Y, GUN_TAG_W, GUN_TAG_H, GUN_TAG_ALIGN, CAN_GUN_HAVE_CUSTOM_RETICLE && GUN_TAG_VIS ) - GUN_TAG_BUTTONS( GUN_TAG_X, RETICLE_Y, GUN_TAG_W, GUN_TAG_H, GUN_TAG_ALIGN, !CAN_GUN_HAVE_CUSTOM_RETICLE && GUN_TAG_VIS ) - - // Gun Emblem Button -#define HAVE_ENOUGH_FOR_GUN_EMBLEM ( GetWeaponOptionCost( GetItemOptionByName( "emblem" ) ) <= GetStatByName( "CODPOINTS" ) ) -#define CAN_NOT_AFFORD_GUN_EMBLEM ( !GUN_EMBLEM_LOCKED && !GUN_EMBLEM_PURCHASED && !HAVE_ENOUGH_FOR_GUN_EMBLEM ) -#define CAN_AFFORD_GUN_EMBLEM ( !GUN_EMBLEM_LOCKED && !GUN_EMBLEM_PURCHASED && HAVE_ENOUGH_FOR_GUN_EMBLEM ) -#define CAN_TOGGLE_GUN_EMBLEM ( GUN_EMBLEM_PURCHASED ) -#define IS_PRI_GUN_EMBLEM_EQUIPPED ( IS_PRI && (STAT_CAC_PRIMARY_EMBLEM) ) -#define IS_SEC_GUN_EMBLEM_EQUIPPED ( IS_SEC && (STAT_CAC_SECONDARY_EMBLEM) ) - -#define GUN_EMBLEM_X LEFT_X -#define GUN_EMBLEM_W WEAPON_BUTTON_WIDTH -#define GUN_EMBLEM_H WEAPON_BUTTON_HEIGHT -#define GUN_EMBLEM_ALIGN HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER -#define GUN_EMBLEM_RECT GUN_EMBLEM_X GUN_EMBLEM_Y GUN_EMBLEM_W GUN_EMBLEM_H GUN_EMBLEM_ALIGN -#define GUN_EMBLEM_COST_W 50 -#define GUN_EMBLEM_COST_RECT (GUN_EMBLEM_X+GUN_EMBLEM_W-GUN_EMBLEM_COST_W-2) GUN_EMBLEM_Y GUN_EMBLEM_COST_W GUN_EMBLEM_H GUN_EMBLEM_ALIGN -#define GUN_EMBLEM_EQUIP_W GUN_EMBLEM_H -#define GUN_EMBLEM_EQUIP_RECT (GUN_EMBLEM_X+GUN_EMBLEM_W-GUN_EMBLEM_EQUIP_W-2) GUN_EMBLEM_Y GUN_EMBLEM_EQUIP_W GUN_EMBLEM_EQUIP_W GUN_EMBLEM_ALIGN - -#define PURCHASE_GUN_EMBLEM_ACTION \ - execnow set weaponOptionIndex ( GetItemIndex( FEATURE_GUN_EMBLEM ) ); \ - execnow set weaponOptionRef "emblem"; \ - open PurchaseWeaponOptionConfirmation; - -#define TOGGLE_GUN_EMBLEM_ACTION \ - execnow toggleWeaponOption (dvarString( ui_custom_name )) emblem; - -#define GUN_EMBLEM_VIS \ - ( !localVarBool( ui_inside_dropdown ) ) - -#define GUN_EMBLEM_BUTTONS( xArg, yArg, wArg, hArg, alignArg, visArg ) \ - /* Buttons */ \ - NEW_FRAME_DBUTTON( 8, xArg yArg wArg hArg alignArg, "@MPUI_GUN_EMBLEM_CAPS", \ - ;, \ - execnow set ui_cac_weapon_hint_text GET_UNLOCK_LEVEL_STRING( FEATURE_GUN_EMBLEM );, \ - execnow set ui_cac_weapon_hint_text "";, \ - ( IS_PRI && GUN_EMBLEM_LOCKED && dvarInt( ui_useCustomClassInfo ) == 0 && visArg ), ;, ; ) \ - NEW_FRAME_BUTTON_COLOR( 8, xArg yArg wArg hArg alignArg, "@MPUI_GUN_EMBLEM_CAPS", NEW_FRAME_RED_RGB, NEW_FRAME_RED_ALPHA, NEW_FRAME_RED, \ - ;, \ - CLEAR_ITEM_NEW( FEATURE_GUN_EMBLEM ), \ - ;, \ - (IS_PRI && CAN_NOT_AFFORD_GUN_EMBLEM && visArg), ;, ; ) \ - NEW_FRAME_BUTTON_COLOR( 8, xArg yArg wArg hArg alignArg, "@MPUI_GUN_EMBLEM_CAPS", NEW_FRAME_GREEN_RGB, NEW_FRAME_GREEN_ALPHA, NEW_FRAME_GREEN, \ - PURCHASE_GUN_EMBLEM_ACTION, \ - CLEAR_ITEM_NEW( FEATURE_GUN_EMBLEM ), \ - ;, \ - (IS_PRI && CAN_AFFORD_GUN_EMBLEM && visArg), ;, ; ) \ - NEW_FRAME_BUTTON_COLOR( 8, xArg yArg wArg hArg alignArg, "@MPUI_GUN_EMBLEM_CAPS", WHITE_RGB, WHITE_ALPHA, BLACK, \ - TOGGLE_GUN_EMBLEM_ACTION, \ - CLEAR_ITEM_NEW( FEATURE_GUN_EMBLEM ), \ - ;, \ - (IS_PRI && CAN_TOGGLE_GUN_EMBLEM && visArg), ;, ; ) \ - /* New Icon */ \ - NEW_FRAME_NEWICON_RECT_VIS( xArg, yArg, wArg, hArg, alignArg, \ - ( IS_ITEM_NEW( FEATURE_GUN_EMBLEM ) && IS_PRI && visArg ), \ - name NEW_FRAME_BUTTON_NAME GUN_EMBLEM_INDEX_STRING; ) \ - /* Locked Icon */ \ - NEW_FRAME_LOCKEDICON_RECT_VIS( xArg, yArg, wArg, hArg, alignArg, \ - (IS_PRI && GUN_EMBLEM_LOCKED && visArg), \ - name NEW_FRAME_BUTTON_NAME GUN_EMBLEM_INDEX_STRING; ) \ - /* Cost */ \ - PREPROC_TEXT_DRAW_VIS_EX( (xArg+wArg-GUN_EMBLEM_COST_W-10) yArg GUN_TAG_COST_W hArg alignArg, 0 0, \ - locString( "@MENU_POINTS", GetWeaponOptionCost( GetItemOptionByName( "emblem" ) ) ), \ - CHOICE_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_RED, \ - when( IS_PRI && CAN_NOT_AFFORD_GUN_EMBLEM && visArg );, \ - name NEW_FRAME_BUTTON_NAME GUN_EMBLEM_INDEX_STRING; NEW_FRAME_TRANSPARENT_STATE( NEW_FRAME_RED_RGB ) ) \ - PREPROC_TEXT_DRAW_VIS_EX( (xArg+wArg-GUN_EMBLEM_COST_W-10) yArg GUN_TAG_COST_W hArg alignArg, 0 0, \ - locString( "@MENU_POINTS", GetWeaponOptionCost( GetItemOptionByName( "emblem" ) ) ), \ - CHOICE_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_GREEN, \ - when( IS_PRI && CAN_AFFORD_GUN_EMBLEM && visArg );, \ - name NEW_FRAME_BUTTON_NAME GUN_EMBLEM_INDEX_STRING; NEW_FRAME_TRANSPARENT_STATE( NEW_FRAME_GREEN_RGB ) ) \ - /* Equipped Icon */ \ - PREPROC_SHADER_DRAW_VIS_EX( (xArg+wArg-GUN_EMBLEM_EQUIP_W-2) yArg GUN_TAG_EQUIP_W GUN_TAG_EQUIP_W alignArg, \ - "menu_mp_killstreak_select", 1 1 1 1, \ - when( IS_PRI && IS_PRI_GUN_EMBLEM_EQUIPPED && visArg );, \ - name NEW_FRAME_BUTTON_NAME GUN_EMBLEM_INDEX_STRING; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) \ - PREPROC_SHADER_DRAW_VIS_EX( (xArg+wArg-GUN_EMBLEM_EQUIP_W-2) yArg GUN_TAG_EQUIP_W GUN_TAG_EQUIP_W alignArg, \ - "menu_mp_killstreak_select", 1 1 1 1, \ - when( IS_PRI && IS_SEC_GUN_EMBLEM_EQUIPPED && visArg );, \ - name NEW_FRAME_BUTTON_NAME GUN_EMBLEM_INDEX_STRING; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) - - GUN_EMBLEM_BUTTONS( GUN_EMBLEM_X, GUN_EMBLEM_Y, GUN_EMBLEM_W, GUN_EMBLEM_H, GUN_EMBLEM_ALIGN, CAN_GUN_HAVE_CUSTOM_RETICLE && GUN_EMBLEM_VIS ) - GUN_EMBLEM_BUTTONS( GUN_EMBLEM_X, RETICLE_COLOR_Y, GUN_EMBLEM_W, GUN_EMBLEM_H, GUN_EMBLEM_ALIGN, !CAN_GUN_HAVE_CUSTOM_RETICLE && GUN_EMBLEM_VIS ) - - // Hint text - #define HINT_EX_ARGS( yArg, listArg ) \ - name list_hint; \ - NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) \ - exp rect Y( yArg + WEAPON_BUTTON_HEIGHT*2 + min( getFeederCount( listArg ), FEEDER_MAX ) * 17 ); - - // Weapon list hint - HINT_TEXT_ALL( 1, LEFT_X, 0, CHOICE_SIZE_X, dvarString( ui_cac_weapon_hint_text ), 1 1 1 1, ( ( dvarString( ui_cac_weapon_hint_text ) != "" ) && ( dvarString( "ui_inside_popup" ) == "select_weapon" ) ), HINT_EX_ARGS( SELECT_WEAPON_Y, weapon_list ) ) - // Menu-level without reticle customization hint - HINT_TEXT_ALL( 6, LEFT_X, 0, CHOICE_SIZE_X, dvarString( ui_cac_weapon_hint_text ), 1 1 1 1, ( ( dvarString( ui_cac_weapon_hint_text ) != "" ) && !CAN_GUN_HAVE_CUSTOM_RETICLE ), name menu_hint; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) - // Menu-level with reticle customization hint - HINT_TEXT_ALL( 10, LEFT_X, 0, CHOICE_SIZE_X, dvarString( ui_cac_weapon_hint_text ), 1 1 1 1, ( ( dvarString( ui_cac_weapon_hint_text ) != "" ) && CAN_GUN_HAVE_CUSTOM_RETICLE ), name menu_hint; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) - // camo list hint - HINT_TEXT_ALL( 1, LEFT_X, 0, CHOICE_SIZE_X, dvarString( ui_cac_weapon_hint_text ), 1 1 1 1, ( ( dvarString( ui_cac_weapon_hint_text ) != "" ) && ( dvarString( "ui_inside_popup" ) == "select_camo" ) ), HINT_EX_ARGS( CAMO_Y, camo_list ) ) - - -// Dual wield has been moved to attachments. -#if 0 - // Dual Wield Button -#define PRI_HAS_DW ( ItemHasDualWield( STAT_CAC_PRIMARY ) ) -#define SEC_HAS_DW ( ItemHasDualWield( STAT_CAC_SECONDARY ) ) -#define PRI_IS_DW ( ItemIsDualWield( STAT_CAC_PRIMARY ) ) -#define SEC_IS_DW ( ItemIsDualWield( STAT_CAC_SECONDARY ) ) -#define IS_PRI_DW_LOCKED ( IsItemDualWieldLocked( STAT_CAC_PRIMARY ) ) -#define IS_SEC_DW_LOCKED ( IsItemDualWieldLocked( STAT_CAC_SECONDARY ) ) -#define IS_PRI_DW_PURCHASED ( IsItemDualWieldPurchased( STAT_CAC_PRIMARY ) ) -#define IS_SEC_DW_PURCHASED ( IsItemDualWieldPurchased( STAT_CAC_SECONDARY ) ) -#define HAVE_ENOUGH_FOR_PRI_DW ( GetItemDualWieldCost( STAT_CAC_PRIMARY ) <= GetStatByName( "CODPOINTS" ) ) -#define HAVE_ENOUGH_FOR_SEC_DW ( GetItemDualWieldCost( STAT_CAC_SECONDARY ) <= GetStatByName( "CODPOINTS" ) ) - -#define IS_PRI_NA_OR_LOCKED ( IS_PRI && ( !PRI_HAS_DW || (PRI_HAS_DW && IS_PRI_DW_LOCKED) ) ) -#define IS_SEC_NA_OR_LOCKED ( IS_SEC && ( !SEC_HAS_DW || (SEC_HAS_DW && IS_SEC_DW_LOCKED) ) ) -#define CAN_NOT_AFFORD_PRI_DW ( IS_PRI && PRI_HAS_DW && !IS_PRI_DW_LOCKED && !IS_PRI_DW_PURCHASED && !HAVE_ENOUGH_FOR_PRI_DW ) -#define CAN_NOT_AFFORD_SEC_DW ( IS_SEC && SEC_HAS_DW && !IS_SEC_DW_LOCKED && !IS_SEC_DW_PURCHASED && !HAVE_ENOUGH_FOR_SEC_DW ) -#define CAN_AFFORD_PRI_DW ( IS_PRI && PRI_HAS_DW && !IS_PRI_DW_LOCKED && !IS_PRI_DW_PURCHASED && HAVE_ENOUGH_FOR_PRI_DW ) -#define CAN_AFFORD_SEC_DW ( IS_SEC && SEC_HAS_DW && !IS_SEC_DW_LOCKED && !IS_SEC_DW_PURCHASED && HAVE_ENOUGH_FOR_SEC_DW ) -#define CAN_TOGGLE_PRI_DW ( IS_PRI && ( (PRI_IS_DW) || (!PRI_IS_DW && PRI_HAS_DW && IS_PRI_DW_PURCHASED) ) ) -#define CAN_TOGGLE_SEC_DW ( IS_SEC && ( (SEC_IS_DW) || (!SEC_IS_DW && SEC_HAS_DW && IS_SEC_DW_PURCHASED) ) ) - -#define DW_RECT_X LEFT_X -#define DW_RECT_Y DUAL_WIELD_Y -#define DW_RECT_W WEAPON_BUTTON_WIDTH -#define DW_RECT_H WEAPON_BUTTON_HEIGHT -#define DW_RECT_ALIGN HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER -#define DW_RECT DW_RECT_X DW_RECT_Y DW_RECT_W DW_RECT_H DW_RECT_ALIGN -#define DW_COST_W 50 -#define DW_COST_RECT (DW_RECT_X+DW_RECT_W-DW_COST_W-2) DW_RECT_Y DW_COST_W DW_RECT_H DW_RECT_ALIGN -#define DW_EQUIP_W DW_RECT_H -#define DW_EQUIP_RECT (DW_RECT_X+DW_RECT_W-DW_EQUIP_W-2) DW_RECT_Y DW_EQUIP_W DW_EQUIP_W DW_RECT_ALIGN -#define DW_BUTTON_STATES WEAPON_BUTTON_STATES( DUAL_WIELD_INDEX, DUAL_WIELD_Y ) - -#define TOGGLE_PRI_DUAL_WIELD_ACTION \ - if( !PRI_IS_DW ) \ - { \ - execnow equipclassitem (dvarString( ui_custom_name )) ( GetItemDualWieldIndex( STAT_CAC_PRIMARY ) ); \ - } \ - else \ - { \ - execnow equipclassitem (dvarString( ui_custom_name )) ( GetItemDualWieldBaseIndex( STAT_CAC_PRIMARY ) ); \ - } - -#define TOGGLE_SEC_DUAL_WIELD_ACTION \ - if( !SEC_IS_DW ) \ - { \ - execnow equipclassitem (dvarString( ui_custom_name )) ( GetItemDualWieldIndex( STAT_CAC_SECONDARY ) ); \ - } \ - else \ - { \ - execnow equipclassitem (dvarString( ui_custom_name )) ( GetItemDualWieldBaseIndex( STAT_CAC_SECONDARY ) ); \ - } - - // Primary Weapon - NEW_FRAME_DBUTTON( 8, DW_RECT, "@MPUI_BUY_DUAL_WIELD_CAPS", ;, ;, ;, ( !IS_FIXED_BUTTON_ACTIVE && IS_PRI && !PRI_IS_DW && !IS_PRI_DW_PURCHASED ), ;, decoration; DW_BUTTON_STATES ) - NEW_FRAME_DBUTTON( 8, DW_RECT, "@MPUI_DUAL_WIELD_CAPS", ;, ;, ;, ( !IS_FIXED_BUTTON_ACTIVE && CAN_TOGGLE_PRI_DW ), ;, decoration; DW_BUTTON_STATES ) - NEW_FRAME_DBUTTON( 8, DW_RECT, "@MPUI_BUY_DUAL_WIELD_CAPS", ;, ;, ;, ( IS_FIXED_BUTTON_ACTIVE && IS_PRI && !PRI_IS_DW && IS_PRI_NA_OR_LOCKED ), ;, DW_BUTTON_STATES ) - NEW_FRAME_BUTTON_COLOR( 8, DW_RECT, "@MPUI_BUY_DUAL_WIELD_CAPS", NEW_FRAME_RED, NEW_FRAME_RED, ;, ;, ;, ( IS_FIXED_BUTTON_ACTIVE && !PRI_IS_DW && CAN_NOT_AFFORD_PRI_DW ), ;, DW_BUTTON_STATES ) - NEW_FRAME_BUTTON_COLOR( 8, DW_RECT, "@MPUI_BUY_DUAL_WIELD_CAPS", NEW_FRAME_GREEN, NEW_FRAME_GREEN, open PurchaseDualWieldConfirmation;, ;, ;, ( IS_FIXED_BUTTON_ACTIVE && !PRI_IS_DW && CAN_AFFORD_PRI_DW ), ;, DW_BUTTON_STATES ) - NEW_FRAME_BUTTON_COLOR( 8, DW_RECT, "@MPUI_DUAL_WIELD_CAPS", WHITE_RGB, WHITE_ALPHA, BLACK, TOGGLE_PRI_DUAL_WIELD_ACTION, ;, ;, ( IS_FIXED_BUTTON_ACTIVE && CAN_TOGGLE_PRI_DW ), ;, DW_BUTTON_STATES ) - - NEW_FRAME_LOCKEDICON_RECT_VIS( DW_RECT_X, DW_RECT_Y, DW_RECT_W, DW_RECT_H, DW_RECT_ALIGN, (IS_FIXED_BUTTON_ACTIVE && IS_PRI && !PRI_IS_DW && PRI_HAS_DW && IS_PRI_DW_LOCKED), DW_BUTTON_STATES ) - // Cost - PREPROC_TEXT_DRAW_VIS_EX( DW_COST_RECT, 0 0, - locString( "@MENU_POINTS", GetItemDualWieldCost( STAT_CAC_PRIMARY ) ), - CHOICE_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_RED, - when( IS_FIXED_BUTTON_ACTIVE && CAN_NOT_AFFORD_PRI_DW );, - DW_BUTTON_STATES; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) - PREPROC_TEXT_DRAW_VIS_EX( DW_COST_RECT, 0 0, - locString( "@MENU_POINTS", GetItemDualWieldCost( STAT_CAC_PRIMARY ) ), - CHOICE_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_GREEN, - when( IS_FIXED_BUTTON_ACTIVE && CAN_AFFORD_PRI_DW );, - DW_BUTTON_STATES; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) - // Equipped icon - PREPROC_SHADER_DRAW_VIS_EX( DW_EQUIP_RECT, - "menu_mp_killstreak_select", 1 1 1 1, - when( IS_FIXED_BUTTON_ACTIVE && IS_PRI && PRI_IS_DW );, - DW_BUTTON_STATES; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) - - // Secondary Weapon - NEW_FRAME_DBUTTON( 8, DW_RECT, "@MPUI_BUY_DUAL_WIELD_CAPS", ;, ;, ;, ( !IS_FIXED_BUTTON_ACTIVE && IS_SEC && !SEC_IS_DW && !IS_SEC_DW_PURCHASED ), ;, decoration; DW_BUTTON_STATES ) - NEW_FRAME_DBUTTON( 8, DW_RECT, "@MPUI_DUAL_WIELD_CAPS", ;, ;, ;, ( !IS_FIXED_BUTTON_ACTIVE && CAN_TOGGLE_SEC_DW ), ;, decoration; DW_BUTTON_STATES ) - NEW_FRAME_DBUTTON( 8, DW_RECT, "@MPUI_BUY_DUAL_WIELD_CAPS", ;, ;, ;, ( IS_FIXED_BUTTON_ACTIVE && IS_SEC && !SEC_IS_DW && IS_SEC_NA_OR_LOCKED ), ;, DW_BUTTON_STATES ) - NEW_FRAME_BUTTON_COLOR( 8, DW_RECT, "@MPUI_BUY_DUAL_WIELD_CAPS", NEW_FRAME_RED, NEW_FRAME_RED, ;, ;, ;, ( IS_FIXED_BUTTON_ACTIVE && !SEC_IS_DW && CAN_NOT_AFFORD_SEC_DW ), ;, DW_BUTTON_STATES ) - NEW_FRAME_BUTTON_COLOR( 8, DW_RECT, "@MPUI_BUY_DUAL_WIELD_CAPS", NEW_FRAME_GREEN, NEW_FRAME_GREEN, open PurchaseDualWieldConfirmation;, ;, ;, ( IS_FIXED_BUTTON_ACTIVE && !SEC_IS_DW && CAN_AFFORD_SEC_DW ), ;, DW_BUTTON_STATES ) - NEW_FRAME_BUTTON_COLOR( 8, DW_RECT, "@MPUI_DUAL_WIELD_CAPS", WHITE_RGB, WHITE_ALPHA, BLACK, TOGGLE_SEC_DUAL_WIELD_ACTION, ;, ;, ( IS_FIXED_BUTTON_ACTIVE && CAN_TOGGLE_SEC_DW ), ;, DW_BUTTON_STATES ) - - NEW_FRAME_LOCKEDICON_RECT_VIS( DW_RECT_X, DW_RECT_Y, DW_RECT_W, DW_RECT_H, DW_RECT_ALIGN, (IS_FIXED_BUTTON_ACTIVE && IS_SEC && !SEC_IS_DW && SEC_HAS_DW && IS_SEC_DW_LOCKED), DW_BUTTON_STATES ) - // Cost - PREPROC_TEXT_DRAW_VIS_EX( DW_COST_RECT, 0 0, - locString( "@MENU_POINTS", GetItemDualWieldCost( STAT_CAC_SECONDARY ) ), - CHOICE_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_RED, - when( IS_FIXED_BUTTON_ACTIVE && CAN_NOT_AFFORD_SEC_DW );, - DW_BUTTON_STATES; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) - PREPROC_TEXT_DRAW_VIS_EX( DW_COST_RECT, 0 0, - locString( "@MENU_POINTS", GetItemDualWieldCost( STAT_CAC_SECONDARY ) ), - CHOICE_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_GREEN, - when( IS_FIXED_BUTTON_ACTIVE && CAN_AFFORD_SEC_DW );, - DW_BUTTON_STATES; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) - // Equipped icon - PREPROC_SHADER_DRAW_VIS_EX( DW_EQUIP_RECT, - "menu_mp_killstreak_select", 1 1 1 1, - when( IS_FIXED_BUTTON_ACTIVE && IS_SEC && SEC_IS_DW );, - DW_BUTTON_STATES; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) - - // Second Attachment Button -#define SEC_ATTACH_AVAILABLE ( GetCurrentItemNumAttachments() > 2 ) // None counts as an attachment. Need at least 2 attachments. -#define HAVE_ENOUGH_FOR_SEC_ATTACH ( GetWeaponOptionCost( GetItemOptionByName( "2ndattach" ) ) <= GetStatByName( "CODPOINTS" ) ) -#define CAN_NOT_AFFORD_SEC_ATTACH ( SEC_ATTACH_AVAILABLE && !GUN_2NDATTACH_LOCKED && !GUN_2NDATTACH_PURCHASED && !HAVE_ENOUGH_FOR_SEC_ATTACH ) -#define CAN_AFFORD_SEC_ATTACH ( SEC_ATTACH_AVAILABLE && !GUN_2NDATTACH_LOCKED && !GUN_2NDATTACH_PURCHASED && HAVE_ENOUGH_FOR_SEC_ATTACH ) - -#define SEC_ATTACH_X LEFT_X -#define SEC_ATTACH_Y SECOND_ATTACHMENT_Y -#define SEC_ATTACH_W WEAPON_BUTTON_WIDTH -#define SEC_ATTACH_H WEAPON_BUTTON_HEIGHT -#define SEC_ATTACH_ALIGN HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER -#define SEC_ATTACH_RECT SEC_ATTACH_X SEC_ATTACH_Y SEC_ATTACH_W SEC_ATTACH_H SEC_ATTACH_ALIGN -#define SEC_ATTACH_COST_W 50 -#define SEC_ATTACH_COST_RECT (SEC_ATTACH_X+SEC_ATTACH_W-SEC_ATTACH_COST_W-2) SEC_ATTACH_Y SEC_ATTACH_COST_W SEC_ATTACH_H SEC_ATTACH_ALIGN -#define SEC_ATTACH_BUTTON_STATES WEAPON_BUTTON_STATES( SECOND_ATTACHMENT_INDEX, SECOND_ATTACHMENT_Y ) - -#define PURCHASE_2ND_ATTACH_ACTION \ - execnow set weaponOptionIndex ( GetItemIndex( FEATURE_SECOND_ATTACHMENT ) ); \ - execnow set weaponOptionRef "2ndAttach"; \ - open PurchaseWeaponOptionConfirmation; - - NEW_FRAME_DBUTTON( 9, SEC_ATTACH_RECT, "@MPUI_BUY_SECOND_ATTACHMENT_CAPS", ;, ;, ;, (!IS_FIXED_BUTTON_ACTIVE || GUN_2NDATTACH_PURCHASED || GUN_2NDATTACH_LOCKED || !SEC_ATTACH_AVAILABLE ), ;, SEC_ATTACH_BUTTON_STATES ) - NEW_FRAME_BUTTON_COLOR( 9, SEC_ATTACH_RECT, "@MPUI_BUY_SECOND_ATTACHMENT_CAPS", NEW_FRAME_RED_RGB, NEW_FRAME_RED_ALPHA, NEW_FRAME_RED, ;, ;, ;, (IS_FIXED_BUTTON_ACTIVE && CAN_NOT_AFFORD_SEC_ATTACH ), ;, SEC_ATTACH_BUTTON_STATES ) - NEW_FRAME_BUTTON_COLOR( 9, SEC_ATTACH_RECT, "@MPUI_BUY_SECOND_ATTACHMENT_CAPS", NEW_FRAME_GREEN_RGB, NEW_FRAME_GREEN_ALPHA, NEW_FRAME_GREEN, PURCHASE_2ND_ATTACH_ACTION, ;, ;, (IS_FIXED_BUTTON_ACTIVE && CAN_AFFORD_SEC_ATTACH ), ;, SEC_ATTACH_BUTTON_STATES ) - - NEW_FRAME_LOCKEDICON_RECT_VIS( SEC_ATTACH_X, SEC_ATTACH_Y, SEC_ATTACH_W, SEC_ATTACH_H, SEC_ATTACH_ALIGN, (IS_FIXED_BUTTON_ACTIVE && GUN_2NDATTACH_LOCKED), SEC_ATTACH_BUTTON_STATES ) - // Cost - PREPROC_TEXT_DRAW_VIS_EX( SEC_ATTACH_COST_RECT, 0 0, - locString( "@MENU_POINTS", GetWeaponOptionCost( GetItemOptionByName( "2ndAttach" ) ) ), - CHOICE_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_RED, - when( IS_FIXED_BUTTON_ACTIVE && CAN_NOT_AFFORD_SEC_ATTACH );, - SEC_ATTACH_BUTTON_STATES; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) - PREPROC_TEXT_DRAW_VIS_EX( SEC_ATTACH_COST_RECT, 0 0, - locString( "@MENU_POINTS", GetWeaponOptionCost( GetItemOptionByName( "2ndAttach" ) ) ), - CHOICE_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_GREEN, - when( IS_FIXED_BUTTON_ACTIVE && CAN_AFFORD_SEC_ATTACH );, - SEC_ATTACH_BUTTON_STATES; NEW_FRAME_TRANSPARENT_STATE( 1 1 1 ) ) - -#endif - -#ifdef PC - #define COMMON_LIST_EX_PC \ - modal \ - usepaging -#else //#ifdef PC - #define COMMON_LIST_EX_PC -#endif //#ifdef PC - - // Listbox actions -#define COMMON_LIST_EX( buttonBActionArg ) \ - LISTBOX_STATES \ - execKeyInt BUTTON_B \ - { \ - play CHOICE_FOCUS_SOUND; \ - execnow ui_animate cac_weapon anim_controller CloseDropDownList 0; \ - buttonBActionArg \ - } \ - COMMON_LIST_EX_PC - -#define WEAPON_GROUP_LIST_ACTION \ - play CHOICE_ACTION_SOUND; \ - execnow ui_animate cac_weapon anim_controller CloseDropDownList 0; \ - execnow set cac_weapon_current_list weapon_list; \ - execnow buildItemListForSlotNameAndGroup (dvarString(selected_loadout_slot)) (dvarString(selected_group)); \ - execnow set cac_weapon_feeder_count ( GetFeederCount( weapon_list ) ); \ - execnow set ui_next_inside_popup select_weapon; - -#define WEAPON_LIST_ACTION \ - if ( IsCurrentItemPurchased() ) \ - { \ - play CHOICE_ACTION_SOUND; \ - execnow equipclasscurrentitem (dvarString( ui_custom_name )); \ - execnow ui_animate cac_weapon anim_controller CloseDropDownList 0; \ - } \ - elseif ( !IsItemLocked( GetCurrentItemIndex() ) && \ - ( GetCurrentItemCost() <= GetStatByName( "CODPOINTS" ) ) && \ - !IsCurrentItemClassified() ) \ - { \ - play CHOICE_ACTION_SOUND; \ - open "PurchaseConfirmation"; \ - } - -#define WEAPON_LIST_ONSELECTION \ - if ( IsCurrentItemClassified() ) \ - { \ - execnow set ui_cac_weapon_hint_text (GetCurrentItemClassifiedHintText()); \ - } \ - elseif ( IsItemLocked( GetCurrentItemIndex() ) ) \ - { \ - execnow set ui_cac_weapon_hint_text (GET_UNLOCK_LEVEL_STRING(GetItemName(GetCurrentItemIndex()))); \ - } \ - else \ - { \ - if( IsItemNew( GetCurrentItemIndex() ) ) \ - { \ - CLEAR_ITEM_NEW( ( GetItemName( GetCurrentItemIndex() ) ) ); \ - } \ - execnow set ui_cac_weapon_hint_text ""; \ - } - -#define CAN_EQUIP_TWO_ATTACHMENTS \ - ( ( IS_PRI ) && ( isItemEquipped( getitemindex("PERKS_PROFESSIONAL"), dvarString( ui_custom_name ) ) || isItemEquipped( getitemindex("PERKS_PROFESSIONAL_PRO"), dvarString( ui_custom_name ) ) ) ) - -#define NUM_EQUIPPED_ATTACHMENTS \ - GetItemNumAttachmentsEquipped( dvarString( ui_custom_name ), GET_SLOT_STAT ) - -#define IS_CURRENT_ATTACHMENT_EQUIPPED \ - ( getItemAttachment( getCurrentItemIndex(), getCurrentItemAttachmentNum() ) == GetItemEquippedAttachment( dvarString( ui_custom_name ), GET_SLOT_STAT, 0 ) || \ - getItemAttachment( getCurrentItemIndex(), getCurrentItemAttachmentNum() ) == GetItemEquippedAttachment( dvarString( ui_custom_name ), GET_SLOT_STAT, 1 ) ) - -#define ATTACHMENTS_LIST_ACTION \ - if ( isCurrentItemAttachmentPurchased() ) \ - { \ - if( IS_CURRENT_ATTACHMENT_EQUIPPED ) \ - { \ - execNow clearAttachmentForItemAtPoint (dvarString( ui_custom_name )) (GET_SLOT_STAT) (getCurrentItemAttachmentPoint()); \ - } \ - elseif( ( NUM_EQUIPPED_ATTACHMENTS < 1 ) || ( NUM_EQUIPPED_ATTACHMENTS == 1 && CAN_EQUIP_TWO_ATTACHMENTS ) ) \ - { \ - play CHOICE_ACTION_SOUND; \ - execnow equipclasscurrentattachment ( dvarString( ui_custom_name ) ); \ - } \ - } \ - elseif ( !isItemlocked( GetCurrentItemIndex() ) && ( getCurrentItemAttachmentCost() <= GetStatByName( "CODPOINTS" ) ) ) \ - { \ - open "PurchaseAttachmentConfirmation"; \ - } - -#define CLEAR_CAC_HINT \ - exec "set ui_cac_weapon_hint_text @NULL_EMPTY;" - -#define SET_OPTION_HINT \ - if ( GetWeaponOptionUnlockPLevel( GetCurrentItemOption() ) > PRESTIGE ) \ - { \ - exec set ui_cac_weapon_hint_text ( locString( CLASS_PRESTIGE_UNCLASSIFY_DESC, GetWeaponOptionUnlockPLevel( GetCurrentItemOption() ) ) ); \ - } \ - else \ - { \ - CLEAR_CAC_HINT \ - } - -#define OPTION_LIST_ACTION( optionGroup ) \ - if ( GetWeaponOptionUnlockPLevel( GetCurrentItemOption() ) <= PRESTIGE ) \ - { \ - if ( isCurrentItemOptionPurchased() ) \ - { \ - play CHOICE_ACTION_SOUND; \ - execnow "equipclasscurrentoption ( dvarString( ui_custom_name ) ) "optionGroup; \ - execnow ui_animate cac_weapon anim_controller CloseDropDownList 0; \ - } \ - elseif ( !isItemlocked( GetCurrentItemIndex() ) && ( GetWeaponOptionCost( GetCurrentItemOption() ) <= GetStatByName( "CODPOINTS" ) ) ) \ - { \ - setDvar ui_optiongroup_name optionGroup; \ - open "PurchaseCurrentWeaponOptionConfirmation"; \ - } \ - } - - // Listboxes -#undef LIST_Y_START -#define LIST_Y_START (SELECT_WEAPON_Y+WEAPON_BUTTON_HEIGHT) - ITEM_LISTBOX_EX( "weapon_group_list", FEEDER_WEAPON_GROUPS, WEAPON_GROUP_LIST_ACTION, CLEAR_CAC_HINT, ;, when( dvarString( "ui_inside_popup" ) == "select_weapon_group" ), COMMON_LIST_EX( WEAPON_GROUP_LIST_BUTTON_B_ACTION ) ) - ITEM_LISTBOX_EX( "weapon_list", FEEDER_ITEMSINSLOTANDGROUP, WEAPON_LIST_ACTION, WEAPON_LIST_ONSELECTION, WEAPON_LIST_ONSELECTION, when( dvarString( "ui_inside_popup" ) == "select_weapon" ), COMMON_LIST_EX( WEAPON_LIST_BUTTON_B_ACTION ) ) - -#undef LIST_X_START -#define LIST_X_START (LEFT_X-3) -#undef LIST_Y_START -#define LIST_Y_START (ATTACHMENTS_Y+WEAPON_BUTTON_HEIGHT) -#undef LIST_WIDTH -#define LIST_WIDTH (WEAPON_BUTTON_WIDTH+4) - ATTACHMENTS_LISTBOX_EX( "attachments_list", FEEDER_ATTACHMENTS, ATTACHMENTS_LIST_ACTION, ;, ;, when( dvarString( "ui_inside_popup" ) == "attachments" ), COMMON_LIST_EX( UPDATE_ATTACH_SLOT_TOP ) ) -#undef LIST_X_START -#define LIST_X_START LEFT_X - -#ifdef PC -#undef LIST_WIDTH -#define LIST_WIDTH (WEAPON_BUTTON_WIDTH+16) -#else //#ifdef PC -#undef LIST_WIDTH -#define LIST_WIDTH WEAPON_BUTTON_WIDTH -#endif //#ifdef PC - -#undef LIST_Y_START -#define LIST_Y_START (CAMO_Y+WEAPON_BUTTON_HEIGHT) - ITEM_LISTBOX_EX( "camo_list", FEEDER_WEAPONOPTIONS, OPTION_LIST_ACTION( "camo" ), SET_OPTION_HINT, SET_OPTION_HINT, when( dvarString( "ui_inside_popup" ) == "select_camo" ), COMMON_LIST_EX( ; ) ) - -#undef LIST_Y_START -#define LIST_Y_START (RETICLE_Y+WEAPON_BUTTON_HEIGHT) -#ifdef PC -#undef LIST_WIDTH -#define LIST_WIDTH (WEAPON_BUTTON_WIDTH+16) -#endif //#ifdef PC - ITEM_LISTBOX_EX( "reticle_list", FEEDER_WEAPONOPTIONS, OPTION_LIST_ACTION( "reticle" ), ;, ;, when( dvarString( "ui_inside_popup" ) == "select_reticle" ), COMMON_LIST_EX( ; ) ) - -#undef LIST_Y_START -#define LIST_Y_START (RETICLE_COLOR_Y+WEAPON_BUTTON_HEIGHT) - ITEM_LISTBOX_EX( "reticle_color_list", FEEDER_WEAPONOPTIONS, OPTION_LIST_ACTION( "reticlecolor" ), ;, ;, when( dvarString( "ui_inside_popup" ) == "select_reticle_color" ), COMMON_LIST_EX( ; ) ) - -#undef LIST_Y_START -#define LIST_Y_START (LENS_Y+WEAPON_BUTTON_HEIGHT) - ITEM_LISTBOX_EX( "lens_list", FEEDER_WEAPONOPTIONS, OPTION_LIST_ACTION( "lens" ), ;, ;, when( dvarString( "ui_inside_popup" ) == "select_lens" ), COMMON_LIST_EX( ; ) ) - -#define PLAYER_WEAPON_IMAGE_X 85 -#define PLAYER_WEAPON_IMAGE_Y -130 -#define PLAYER_WEAPON_CLASSIFIED_Y -180 -#define PLAYER_WEAPON_IMAGE_WIDTH 180 -#define PLAYER_WEAPON_IMAGE_HEIGHT 90 - - /* Camo */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (PLAYER_WEAPON_IMAGE_X-10), - (PLAYER_WEAPON_IMAGE_Y-5), - ( PLAYER_WEAPON_IMAGE_WIDTH+20 ), - (PLAYER_WEAPON_IMAGE_HEIGHT+10), - HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - getWeaponOptionImage( STAT_CAC_PRIMARY_CAMO ), 1 1 1 1, - when( IS_PRI && ( dvarString(ui_inside_popup ) != "select_camo" || localVarInt( "ui_disable_controls" ) != 0 ) && dvarString(ui_inside_popup ) != "select_weapon" && dvarString(ui_inside_popup ) != "select_weapon_group"), - ; ) - /* Camo when camo list open */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (PLAYER_WEAPON_IMAGE_X-10), - (PLAYER_WEAPON_IMAGE_Y-5), - ( PLAYER_WEAPON_IMAGE_WIDTH+20 ), - (PLAYER_WEAPON_IMAGE_HEIGHT+10), - HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - getWeaponOptionImage( GetCurrentItemOption() ), 1 1 1 1, - when ( ( IS_PRI && dvarString(ui_inside_popup ) == "select_camo" && dvarString(ui_inside_popup ) != "select_weapon" && dvarString(ui_inside_popup ) != "select_weapon_group" && localVarInt( "ui_disable_controls" ) == 0 ) && - ( GetWeaponOptionUnlockPLevel( GetCurrentItemOption() ) <= PRESTIGE ) ), ; ) - /* Weapon Image when not selecting weapon */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( PLAYER_WEAPON_IMAGE_X, - PLAYER_WEAPON_IMAGE_Y, - ( PLAYER_WEAPON_IMAGE_WIDTH ), - PLAYER_WEAPON_IMAGE_HEIGHT, - HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - GetItemImage( GET_SLOT_STAT ), 1 1 1 1, - when( dvarString(ui_inside_popup ) != "select_weapon" ), - ; ) - /* Weapon Image when inside weapon list */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( PLAYER_WEAPON_IMAGE_X, - PLAYER_WEAPON_IMAGE_Y, - ( PLAYER_WEAPON_IMAGE_WIDTH ), - PLAYER_WEAPON_IMAGE_HEIGHT, - HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - GetItemImage( GetCurrentItemIndex() ), 1 1 1 1, - when( !IsCurrentItemClassified() && dvarString(ui_inside_popup ) == "select_weapon" ), - ; ) - /* Dark Weapon Image when inside weapon list and weapon is classified */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( PLAYER_WEAPON_IMAGE_X, - PLAYER_WEAPON_IMAGE_Y, - ( PLAYER_WEAPON_IMAGE_WIDTH ), - PLAYER_WEAPON_IMAGE_HEIGHT, - HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - GetItemImage( GetCurrentItemIndex() ), 0 0 0 0.8, - when( !isCurrentItemPurchased() && IsCurrentItemClassified() && dvarString(ui_inside_popup ) == "select_weapon" ), - ; ) - /* classified image when inside weapon list and weapon is classified */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( PLAYER_WEAPON_IMAGE_X, - PLAYER_WEAPON_CLASSIFIED_Y, - PLAYER_WEAPON_IMAGE_WIDTH, - PLAYER_WEAPON_IMAGE_WIDTH, - HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "menu_mp_lobby_classified", 1 1 1 1, - when( !isCurrentItemPurchased() && IsCurrentItemClassified() && dvarString(ui_inside_popup ) == "select_weapon" ), - ; ) - -#define CURRENT_ATTACHMENT_VIS \ - (dvarString( ui_inside_popup ) == "attachments") - -#define HAS_X_ATTACHMENTS( minAttachments ) \ - ( GetItemNumAttachmentsEquipped( dvarString( ui_custom_name ), GET_SLOT_STAT ) >= minAttachments ) - -#define GET_ITEM_EQUIPPED_ATTACHMENT( index ) \ - ( GetItemEquippedAttachment( dvarString( ui_custom_name ), GET_SLOT_STAT, index ) ) - -#define LOADOUT_SUMMARY_VIS ( ( dvarString( ui_inside_popup ) != "select_weapon" ) && \ - ( dvarString( ui_inside_popup ) != "attachments" ) ) - -#define LOADOUT_SUMMARY_WIDTH PLAYER_WEAPON_IMAGE_WIDTH -#define LOADOUT_SUMMARY_ICON_WIDTH 32 -#define LOADOUT_SUMMARY_ICON_HEIGHT LOADOUT_SUMMARY_ICON_WIDTH -#define LOADOUT_SUMMARY_X PLAYER_WEAPON_IMAGE_X -#define LOADOUT_SUMMARY_Y (PLAYER_WEAPON_IMAGE_Y+PLAYER_WEAPON_IMAGE_HEIGHT-LOADOUT_SUMMARY_ICON_HEIGHT/2+2) -#define LOADOUT_ATTACHMENT1_X (LOADOUT_SUMMARY_X+16) -#define LOADOUT_ATTACHMENT2_X (LOADOUT_SUMMARY_X+LOADOUT_SUMMARY_WIDTH-16) -#define LOADOUT_LENS_ICON_WIDTH 29 -#define LOADOUT_LENS_ICON_HEIGHT LOADOUT_LENS_ICON_WIDTH -#define LOADOUT_RETICLE_ICON_WIDTH 20 -#define LOADOUT_RETICLE_ICON_HEIGHT LOADOUT_RETICLE_ICON_WIDTH -#define LOADOUT_SUMMARY_VERT_SPACING 7 -#define LOADOUT_SUMMARY_TEXT_X( imageX ) ( imageX+LOADOUT_SUMMARY_ICON_WIDTH+5 ) -#define LOADOUT_SUMMARY_TEXT_WIDTH (LOADOUT_SUMMARY_WIDTH-LOADOUT_SUMMARY_ICON_WIDTH-10) -#define WEAPON_NAME_X 90 -#define WEAPON_NAME_Y ( PLAYER_WEAPON_IMAGE_Y + PLAYER_WEAPON_IMAGE_HEIGHT + 15 ) -#define WEAPON_GROUP_NAME_Y ( WEAPON_NAME_Y + 20 ) - - /* Weapon Name */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_NAME_X WEAPON_NAME_Y 170 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - toUpper( locString( "@"+GetCurrentItemName() ) ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_COMMON_TEXT_COLOR, - when( !IsCurrentItemClassified() && LOADOUT_SUMMARY_VIS );, ; ) - - /* Underline Image */ - PREPROC_SHADER_DRAW_VIS_EX( PLAYER_WEAPON_IMAGE_X (WEAPON_NAME_Y-3) PLAYER_WEAPON_IMAGE_WIDTH 16 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "menu_mp_lobby_cac_line_2_prong", 1 1 1 1, - when( LOADOUT_SUMMARY_VIS && !LENSESORRETICLES_AVAILABLE );, ; ) - PREPROC_SHADER_DRAW_VIS_EX( PLAYER_WEAPON_IMAGE_X (WEAPON_NAME_Y-3) PLAYER_WEAPON_IMAGE_WIDTH 16 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "menu_mp_lobby_cac_line_2_prong_left", 1 1 1 1, - when( LOADOUT_SUMMARY_VIS && LENSESORRETICLES_AVAILABLE );, ; ) - - /* Attachment 1 Name */ - /*PREPROC_TEXT_DRAW_VIS_EX( (LOADOUT_SUMMARY_TEXT_X(LOADOUT_SUMMARY_X)) LOADOUT_SUMMARY_Y LOADOUT_SUMMARY_TEXT_WIDTH LOADOUT_SUMMARY_ICON_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@" + GetAttachmentName( GET_ITEM_EQUIPPED_ATTACHMENT( 0 ) ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, NEW_FRAME_COMMON_TEXT_COLOR, when( LOADOUT_SUMMARY_VIS && HAS_X_ATTACHMENTS( 1 ) );, autoWrapped; )*/ - /* Attachment 1 Image */ - PREPROC_SHADER_DRAW_VIS_EX( (LOADOUT_ATTACHMENT1_X-LOADOUT_SUMMARY_ICON_WIDTH/2) LOADOUT_SUMMARY_Y LOADOUT_SUMMARY_ICON_WIDTH LOADOUT_SUMMARY_ICON_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - GetAttachmentImage( GET_ITEM_EQUIPPED_ATTACHMENT( 0 ) ), 1 1 1 1, - when( LOADOUT_SUMMARY_VIS && HAS_X_ATTACHMENTS( 1 ) && GetAttachmentName( GET_ITEM_EQUIPPED_ATTACHMENT( 0 ) ) != MPUI_DW );, ; ) - /* Attachment 1 DW Images */ - PREPROC_SHADER_DRAW_VIS_EX( (LOADOUT_ATTACHMENT1_X-LOADOUT_SUMMARY_ICON_WIDTH/2+6) (LOADOUT_SUMMARY_Y+3) LOADOUT_SUMMARY_ICON_WIDTH (LOADOUT_SUMMARY_ICON_HEIGHT/2) HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - GetItemImage( GetCurrentItemIndex() ), 0.6 0.6 0.6 0.6, - when( LOADOUT_SUMMARY_VIS && HAS_X_ATTACHMENTS( 1 ) && GetAttachmentName( GET_ITEM_EQUIPPED_ATTACHMENT( 0 ) ) == MPUI_DW );, rotation 45; ) - PREPROC_SHADER_DRAW_VIS_EX( (LOADOUT_ATTACHMENT1_X-LOADOUT_SUMMARY_ICON_WIDTH/2) (LOADOUT_SUMMARY_Y+3) LOADOUT_SUMMARY_ICON_WIDTH (LOADOUT_SUMMARY_ICON_HEIGHT/2) HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - GetItemImage( GetCurrentItemIndex() ), 1 1 1 1, - when( LOADOUT_SUMMARY_VIS && HAS_X_ATTACHMENTS( 1 ) && GetAttachmentName( GET_ITEM_EQUIPPED_ATTACHMENT( 0 ) ) == MPUI_DW );, rotation 45; ) - - /* Lens Backing */ - PREPROC_SHADER_DRAW_VIS_EX( (LOADOUT_ATTACHMENT1_X-LOADOUT_LENS_ICON_WIDTH/2) (LOADOUT_SUMMARY_Y+LOADOUT_SUMMARY_ICON_HEIGHT+LOADOUT_SUMMARY_VERT_SPACING+LOADOUT_SUMMARY_ICON_HEIGHT/2-LOADOUT_LENS_ICON_HEIGHT/2) LOADOUT_LENS_ICON_WIDTH LOADOUT_LENS_ICON_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "menu_mp_weapons_attach_lens", 1 1 1 1, - when( LOADOUT_SUMMARY_VIS && LENSESORRETICLES_AVAILABLE );, ; ) - - /* Reticle Image For Summary */ - PREPROC_OWNERDRAW_ALL( (LOADOUT_ATTACHMENT1_X-LOADOUT_RETICLE_ICON_WIDTH/2) (LOADOUT_SUMMARY_Y+LOADOUT_SUMMARY_ICON_HEIGHT+LOADOUT_SUMMARY_VERT_SPACING+LOADOUT_SUMMARY_ICON_HEIGHT/2-LOADOUT_RETICLE_ICON_HEIGHT/2) LOADOUT_RETICLE_ICON_WIDTH LOADOUT_RETICLE_ICON_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - 1 1 1 1, UI_RETICLE_PREVIEW, when( LOADOUT_SUMMARY_VIS && LENSESORRETICLES_AVAILABLE && !CUSTOMIZING_RETICLE && !CUSTOMIZING_RETICLE_COLOR );, - exp ownerdata( GetWeaponOptionImage( GetWeaponOptionGroupIndex( STAT_CAC_PRIMARY_RETICLE, 1 ) ), STAT_CAC_PRIMARY_RETICLE_COLOR ); ) - /* Reticle Image While Customizing Reticle */ - PREPROC_OWNERDRAW_ALL( (LOADOUT_ATTACHMENT1_X-LOADOUT_RETICLE_ICON_WIDTH/2) (LOADOUT_SUMMARY_Y+LOADOUT_SUMMARY_ICON_HEIGHT+LOADOUT_SUMMARY_VERT_SPACING+LOADOUT_SUMMARY_ICON_HEIGHT/2-LOADOUT_RETICLE_ICON_HEIGHT/2) LOADOUT_RETICLE_ICON_WIDTH LOADOUT_RETICLE_ICON_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - 1 1 1 1, UI_RETICLE_PREVIEW, when( LOADOUT_SUMMARY_VIS && CUSTOMIZING_RETICLE );, - exp ownerdata( GetWeaponOptionImage( GetCurrentItemOption() ), STAT_CAC_PRIMARY_RETICLE_COLOR ); ) - /* Reticle Image While Customizing Reticle Color */ - PREPROC_OWNERDRAW_ALL( (LOADOUT_ATTACHMENT1_X-LOADOUT_RETICLE_ICON_WIDTH/2) (LOADOUT_SUMMARY_Y+LOADOUT_SUMMARY_ICON_HEIGHT+LOADOUT_SUMMARY_VERT_SPACING+LOADOUT_SUMMARY_ICON_HEIGHT/2-LOADOUT_RETICLE_ICON_HEIGHT/2) LOADOUT_RETICLE_ICON_WIDTH LOADOUT_RETICLE_ICON_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - 1 1 1 1, UI_RETICLE_PREVIEW, when( LOADOUT_SUMMARY_VIS && CUSTOMIZING_RETICLE_COLOR );, - exp ownerdata( GetWeaponOptionImage( GetWeaponOptionGroupIndex( STAT_CAC_PRIMARY_RETICLE, 1 ) ), GetCurrentItemOption() - GetWeaponOptionGroupIndex( 0, 5 ) ); ) - - /* Lens Image For Summary */ - PREPROC_OWNERDRAW_ALL( (LOADOUT_ATTACHMENT1_X-LOADOUT_LENS_ICON_WIDTH/2) (LOADOUT_SUMMARY_Y+LOADOUT_SUMMARY_ICON_HEIGHT+LOADOUT_SUMMARY_VERT_SPACING+LOADOUT_SUMMARY_ICON_HEIGHT/2-LOADOUT_LENS_ICON_HEIGHT/2) LOADOUT_LENS_ICON_WIDTH LOADOUT_LENS_ICON_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - 1 1 1 1, UI_LENS_PREVIEW, when( LOADOUT_SUMMARY_VIS && LENSESORRETICLES_AVAILABLE && !CUSTOMIZING_LENS );, - exp ownerdata( "menu_mp_weapons_color_lens", STAT_CAC_PRIMARY_LENS ); ) - /* Lens Image While Customizing Lens */ - PREPROC_OWNERDRAW_ALL( (LOADOUT_ATTACHMENT1_X-LOADOUT_LENS_ICON_WIDTH/2) (LOADOUT_SUMMARY_Y+LOADOUT_SUMMARY_ICON_HEIGHT+LOADOUT_SUMMARY_VERT_SPACING+LOADOUT_SUMMARY_ICON_HEIGHT/2-LOADOUT_LENS_ICON_HEIGHT/2) LOADOUT_LENS_ICON_WIDTH LOADOUT_LENS_ICON_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - 1 1 1 1, UI_LENS_PREVIEW, when( LOADOUT_SUMMARY_VIS && CAN_GUN_HAVE_CUSTOM_RETICLE && CUSTOMIZING_LENS );, - exp ownerdata( "menu_mp_weapons_color_lens", GetCurrentItemOption() - GetWeaponOptionGroupIndex( 0, 2 ) ); ) - /* Lens Highlight */ - PREPROC_SHADER_DRAW_VIS_EX( (LOADOUT_ATTACHMENT1_X-LOADOUT_LENS_ICON_WIDTH/2) (LOADOUT_SUMMARY_Y+LOADOUT_SUMMARY_ICON_HEIGHT+LOADOUT_SUMMARY_VERT_SPACING+LOADOUT_SUMMARY_ICON_HEIGHT/2-LOADOUT_LENS_ICON_HEIGHT/2) LOADOUT_LENS_ICON_WIDTH LOADOUT_LENS_ICON_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "menu_mp_weapons_lens_hilight", 1 1 1 1, - when( LOADOUT_SUMMARY_VIS && LENSESORRETICLES_AVAILABLE );, ; ) - - /* Attachment 2 Name */ - /*PREPROC_TEXT_DRAW_VIS_EX( (LOADOUT_SUMMARY_TEXT_X(LOADOUT_SUMMARY_X+LOADOUT_SUMMARY_WIDTH/2)) LOADOUT_SUMMARY_Y LOADOUT_SUMMARY_TEXT_WIDTH LOADOUT_SUMMARY_ICON_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@" + GetAttachmentName( GET_ITEM_EQUIPPED_ATTACHMENT( 1 ) ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, NEW_FRAME_COMMON_TEXT_COLOR, when( LOADOUT_SUMMARY_VIS && HAS_X_ATTACHMENTS( 2 ) );, autoWrapped; )*/ - /* Attachment 2 Image */ - PREPROC_SHADER_DRAW_VIS_EX( (LOADOUT_ATTACHMENT2_X-LOADOUT_SUMMARY_ICON_WIDTH/2) LOADOUT_SUMMARY_Y LOADOUT_SUMMARY_ICON_WIDTH LOADOUT_SUMMARY_ICON_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - GetAttachmentImage( GET_ITEM_EQUIPPED_ATTACHMENT( 1 ) ), 1 1 1 1, - when( LOADOUT_SUMMARY_VIS && HAS_X_ATTACHMENTS( 2 ) );, ; ) - -#define CURRENT_ATTACHMENT_NAME_X PLAYER_WEAPON_IMAGE_X -#define CURRENT_ATTACHMENT_NAME_Y (PLAYER_WEAPON_IMAGE_Y+PLAYER_WEAPON_IMAGE_HEIGHT+5) -#define CURRENT_ATTACHMENT_NAME_WIDTH PLAYER_WEAPON_IMAGE_WIDTH -#define CURRENT_ATTACHMENT_NAME_HEIGHT 32 - - /* Weapon Attachment Name */ - PREPROC_TEXT_DRAW_VIS_EX( CURRENT_ATTACHMENT_NAME_X CURRENT_ATTACHMENT_NAME_Y CURRENT_ATTACHMENT_NAME_WIDTH CURRENT_ATTACHMENT_NAME_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@" + GetCurrentItemAttachmentName() + "_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, NEW_FRAME_COMMON_TEXT_COLOR, - when( CURRENT_ATTACHMENT_VIS && !IsCurrentItemClassified() ), - autoWrapped; ) - -#define CURRENT_ATTACHMENT_IMAGE_WIDTH 50 -#define CURRENT_ATTACHMENT_IMAGE_HEIGHT 50 -#define CURRENT_ATTACHMENT_IMAGE_X (CURRENT_ATTACHMENT_NAME_X+CURRENT_ATTACHMENT_NAME_WIDTH/2 - CURRENT_ATTACHMENT_IMAGE_WIDTH/2 ) -#define CURRENT_ATTACHMENT_IMAGE_Y (CURRENT_ATTACHMENT_NAME_Y+25) - - /* Weapon Attachment Image */ - PREPROC_SHADER_DRAW_VIS_EX( CURRENT_ATTACHMENT_IMAGE_X CURRENT_ATTACHMENT_IMAGE_Y CURRENT_ATTACHMENT_IMAGE_WIDTH CURRENT_ATTACHMENT_IMAGE_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - GetAttachmentImage( GetItemAttachment( GetCurrentItemIndex(), GetCurrentItemAttachmentNum() ) ), 1 1 1 1, - when( CURRENT_ATTACHMENT_VIS && !IsCurrentItemClassified() && GetAttachmentName( GetItemAttachment( GetCurrentItemIndex(), GetCurrentItemAttachmentNum() ) ) != MPUI_DW ), ; ) - /* Weapon Attachment DW Images */ - PREPROC_SHADER_DRAW_VIS_EX( (CURRENT_ATTACHMENT_IMAGE_X+5) (CURRENT_ATTACHMENT_IMAGE_Y+10) CURRENT_ATTACHMENT_IMAGE_WIDTH (CURRENT_ATTACHMENT_IMAGE_HEIGHT/2) HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - GetItemImage( GetCurrentItemIndex() ), 0.6 0.6 0.6 0.6, - when( CURRENT_ATTACHMENT_VIS && !IsCurrentItemClassified() && GetAttachmentName( GetItemAttachment( GetCurrentItemIndex(), GetCurrentItemAttachmentNum() ) ) == MPUI_DW ), rotation 45 ) - PREPROC_SHADER_DRAW_VIS_EX( (CURRENT_ATTACHMENT_IMAGE_X-5) (CURRENT_ATTACHMENT_IMAGE_Y+10) CURRENT_ATTACHMENT_IMAGE_WIDTH (CURRENT_ATTACHMENT_IMAGE_HEIGHT/2) HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - GetItemImage( GetCurrentItemIndex() ), 1 1 1 1, - when( CURRENT_ATTACHMENT_VIS && !IsCurrentItemClassified() && GetAttachmentName( GetItemAttachment( GetCurrentItemIndex(), GetCurrentItemAttachmentNum() ) ) == MPUI_DW ), rotation 45 ) - -#define CURRENT_ATTACHMENT_DESC_X CURRENT_ATTACHMENT_NAME_X -#define CURRENT_ATTACHMENT_DESC_Y (CURRENT_ATTACHMENT_IMAGE_Y+CURRENT_ATTACHMENT_IMAGE_HEIGHT+5) -#define CURRENT_ATTACHMENT_DESC_WIDTH CURRENT_ATTACHMENT_NAME_WIDTH -#define CURRENT_ATTACHMENT_DESC_HEIGHT 20 - - PREPROC_TEXT_DRAW_VIS_EX( CURRENT_ATTACHMENT_DESC_X CURRENT_ATTACHMENT_DESC_Y CURRENT_ATTACHMENT_DESC_WIDTH CURRENT_ATTACHMENT_DESC_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@" + GetCurrentItemAttachmentDesc(), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_CENTER, CHOICE_TEXTCOLOR, - when( CURRENT_ATTACHMENT_VIS && !IsCurrentItemClassified() ), autoWrapped; ) - -#define WEAPON_STAT_NAMES_X 95 -#define WEAPON_STATS_X (WEAPON_STAT_NAMES_X+110) -#define WEAPON_DESC_WIDTH ( CAC_WIDTH/2 - 25 ) -#define WEAPON_STATS_Y 85 - -#define GET_WEAPON_STAT( statName ) \ - getDStat( "ItemStats", GetCurrentItemIndex(), "stats", statName, "statValue" ) - -#define WEAPON_KDRATIO \ - GET_WEAPON_STAT( "kills" ) / max( 1, GET_WEAPON_STAT( "deathsDuringUse" ) ) - -#define WEAPON_ACCURACY \ - ( ( GET_WEAPON_STAT( "hits" ) / max( 1, GET_WEAPON_STAT( "shots" ) ) ) * 100 ) - -#define WEAPON_STAT_SPACING 17 - -#define GUN_STATS_VIS when( dvarBool( ui_cac_gun_attributes_vis ) && !IsCurrentItemClassified() ) - - /* WEAPON STAT NAMES */ - /* Weapon kdratio */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_STAT_NAMES_X WEAPON_STATS_Y 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_KILL_DEATH_RATIO_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_COMMON_TEXT_COLOR, GUN_STATS_VIS, ; ) - /* Weapon accuracy */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_STAT_NAMES_X (WEAPON_STATS_Y+WEAPON_STAT_SPACING) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_ACCURACY_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_COMMON_TEXT_COLOR, GUN_STATS_VIS, ; ) - /* Weapon kills */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_STAT_NAMES_X (WEAPON_STATS_Y+WEAPON_STAT_SPACING*2) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_KILLS_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_COMMON_TEXT_COLOR, GUN_STATS_VIS, ; ) - /* Weapon deaths */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_STAT_NAMES_X (WEAPON_STATS_Y+WEAPON_STAT_SPACING*3) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_DEATHS_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_COMMON_TEXT_COLOR, GUN_STATS_VIS, ; ) - /* Weapon headshots */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_STAT_NAMES_X (WEAPON_STATS_Y+WEAPON_STAT_SPACING*4) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_HEADSHOTS_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_COMMON_TEXT_COLOR, GUN_STATS_VIS, ; ) - - /* WEAPON STATS */ - /* Weapon kdratio */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_STATS_X WEAPON_STATS_Y 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, getFloatAsFormattedString( WEAPON_KDRATIO, 2 ) , TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_ORANGE_RGB 1, GUN_STATS_VIS, ; ) - /* Weapon accuracy */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_STATS_X (WEAPON_STATS_Y+WEAPON_STAT_SPACING) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, getFloatAsFormattedString( WEAPON_ACCURACY, 2 ) + " %", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_ORANGE_RGB 1, GUN_STATS_VIS, ; ) - /* Weapon kills */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_STATS_X (WEAPON_STATS_Y+WEAPON_STAT_SPACING*2) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, GET_WEAPON_STAT( "kills" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_ORANGE_RGB 1, GUN_STATS_VIS, ; ) - /* Weapon deaths */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_STATS_X (WEAPON_STATS_Y+WEAPON_STAT_SPACING*3) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, GET_WEAPON_STAT( "deathsDuringUse" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_ORANGE_RGB 1, GUN_STATS_VIS, ; ) - /* Weapon headshots */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_STATS_X (WEAPON_STATS_Y+WEAPON_STAT_SPACING*4) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, GET_WEAPON_STAT( "headshots" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_ORANGE_RGB 1, GUN_STATS_VIS, ; ) - -#define GUN_ATTRIBUTES_VIS ( !dvarBool( ui_cac_gun_attributes_vis ) && !IsCurrentItemClassified() ) - -#define WEAPON_ATTRIBUTE_NAMES_X WEAPON_STAT_NAMES_X -#define WEAPON_ATTRIBUTE_BAR_X (WEAPON_ATTRIBUTE_NAMES_X+60) -#define WEAPON_ATTRIBUTE_BAR_HEIGHT 9 -#define WEAPON_ATTRIBUTE_BAR_WIDTH (WEAPON_ATTRIBUTE_BAR_HEIGHT*10) - -#define ATTRIBUTES_TABLE_COL_REF 1 -#define ATTRIBUTES_TABLE_COL_ACCURACY 2 -#define ATTRIBUTES_TABLE_COL_DAMAGE 3 -#define ATTRIBUTES_TABLE_COL_RANGE 4 -#define ATTRIBUTES_TABLE_COL_FIRE_RATE 5 -#define ATTRIBUTES_TABLE_COL_MOBILITY 6 -#define ATTRIBUTES_TABLE_COL_FIRE_TYPE 8 - - /* WEAPON ATTRIBUTES */ -#define DAMAGE_BAR_Y (WEAPON_STATS_Y+2) - /* Weapon damage label */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_ATTRIBUTE_NAMES_X (DAMAGE_BAR_Y-2) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_DAMAGE_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_COMMON_TEXT_COLOR, when( GUN_ATTRIBUTES_VIS ), ; ) - /* Weapon damage bar */ - itemDef - { - name "damageBar" - type ITEM_TYPE_OWNERDRAW - rect WEAPON_ATTRIBUTE_BAR_X DAMAGE_BAR_Y WEAPON_ATTRIBUTE_BAR_WIDTH WEAPON_ATTRIBUTE_BAR_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - forecolor 1 1 1 1 - ownerdraw UI_DRAW_ATTRIBUTE_BAR - dvar ui_numBarPartitions - exp ownerdata( ATTRIBUTES_TABLE_COL_DAMAGE ); - visible when( GUN_ATTRIBUTES_VIS ) - decoration - } - -#define RANGE_BAR_Y (DAMAGE_BAR_Y+WEAPON_STAT_SPACING) - /* Weapon range label */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_ATTRIBUTE_NAMES_X (RANGE_BAR_Y-2) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_RANGE_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_COMMON_TEXT_COLOR, when( GUN_ATTRIBUTES_VIS ), ; ) - /* Weapon damage bar */ - itemDef - { - name "rangeBar" - type ITEM_TYPE_OWNERDRAW - rect WEAPON_ATTRIBUTE_BAR_X RANGE_BAR_Y WEAPON_ATTRIBUTE_BAR_WIDTH WEAPON_ATTRIBUTE_BAR_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - forecolor 1 1 1 1 - ownerdraw UI_DRAW_ATTRIBUTE_BAR - dvar ui_numBarPartitions - exp ownerdata( ATTRIBUTES_TABLE_COL_RANGE ); - visible when( GUN_ATTRIBUTES_VIS ) - decoration - } - -#define ACCURACY_BAR_Y (RANGE_BAR_Y+WEAPON_STAT_SPACING) - /* Weapon accuracy label */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_ATTRIBUTE_NAMES_X (ACCURACY_BAR_Y-2) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_ACCURACY_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_COMMON_TEXT_COLOR, when( GUN_ATTRIBUTES_VIS ), ; ) - /* Weapon accuracy bar */ - itemDef - { - name "accuracyBar" - type ITEM_TYPE_OWNERDRAW - rect WEAPON_ATTRIBUTE_BAR_X ACCURACY_BAR_Y WEAPON_ATTRIBUTE_BAR_WIDTH WEAPON_ATTRIBUTE_BAR_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - forecolor 1 1 1 1 - ownerdraw UI_DRAW_ATTRIBUTE_BAR - dvar ui_numBarPartitions - exp ownerdata( ATTRIBUTES_TABLE_COL_ACCURACY ); - visible when( GUN_ATTRIBUTES_VIS ) - decoration - } - -#define MOBILITY_BAR_Y (ACCURACY_BAR_Y+WEAPON_STAT_SPACING) - /* Weapon mobility label */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_ATTRIBUTE_NAMES_X (MOBILITY_BAR_Y-2) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_MOBILITY_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_COMMON_TEXT_COLOR, when( GUN_ATTRIBUTES_VIS ), ; ) - /* Weapon mobility bar */ - itemDef - { - name "mobilityBar" - type ITEM_TYPE_OWNERDRAW - rect WEAPON_ATTRIBUTE_BAR_X MOBILITY_BAR_Y WEAPON_ATTRIBUTE_BAR_WIDTH WEAPON_ATTRIBUTE_BAR_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - forecolor 1 1 1 1 - ownerdraw UI_DRAW_ATTRIBUTE_BAR - dvar ui_numBarPartitions - exp ownerdata( ATTRIBUTES_TABLE_COL_MOBILITY ); - visible when( GUN_ATTRIBUTES_VIS ) - decoration - } - -#ifndef PC - // ROTATE ============================================================= - PREPROC_TEXT_DRAW( 95 (CAC_HEIGHT/2) 50 17 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@PLATFORM_ROTATE", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, 1 1 1 1 ) -#endif - -#define WEAPON_FIRE_TYPE \ - tablelookup( "mp/attributesTable.csv", ATTRIBUTES_TABLE_COL_REF, GetItemRef( GetCurrentItemIndex() ), ATTRIBUTES_TABLE_COL_FIRE_TYPE ) - -#define FULL_AUTO_ATTACHMENT \ - ( ( ( GetAttachmentName( GetItemAttachment( GetCurrentItemIndex(), GetCurrentItemAttachmentNum() ) ) == "MPUI_AUTO" ) && ( IS_ATTACHMENT_LIST_OPEN ) ) || ( ( GetAttachmentName( GetItemEquippedAttachment( dvarString( ui_custom_name ), GET_SLOT_STAT, 0 ) ) == "MPUI_AUTO" ) && ( IS_NO_LIST_OPEN ) ) ) - - -#define FIRE_RATE_Y (MOBILITY_BAR_Y+WEAPON_STAT_SPACING) - /* Weapon FIRE RATE */ - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_ATTRIBUTE_NAMES_X (FIRE_RATE_Y-2) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_FIRE_RATE_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_COMMON_TEXT_COLOR, when( GUN_ATTRIBUTES_VIS ), ; ) - /* Weapon fire rate bar shown only when weapon is full auto */ - itemDef - { - name "fireRateBar" - type ITEM_TYPE_OWNERDRAW - rect WEAPON_ATTRIBUTE_BAR_X FIRE_RATE_Y WEAPON_ATTRIBUTE_BAR_WIDTH WEAPON_ATTRIBUTE_BAR_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - forecolor 1 1 1 1 - ownerdraw UI_DRAW_ATTRIBUTE_BAR - dvar ui_numBarPartitions - exp ownerdata( ATTRIBUTES_TABLE_COL_FIRE_RATE ); - visible when( GUN_ATTRIBUTES_VIS && WEAPON_FIRE_TYPE == "MPUI_FULL_AUTO" ) - decoration - } - - - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_ATTRIBUTE_BAR_X (FIRE_RATE_Y-2) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@"+WEAPON_FIRE_TYPE, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_ORANGE_RGB 1, when( GUN_ATTRIBUTES_VIS && WEAPON_FIRE_TYPE != "MPUI_FULL_AUTO" && !FULL_AUTO_ATTACHMENT ), ; ) - PREPROC_TEXT_DRAW_VIS_EX( WEAPON_ATTRIBUTE_BAR_X (FIRE_RATE_Y-2) 10 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_FULL_AUTO", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_ORANGE_RGB 1, when( GUN_ATTRIBUTES_VIS && WEAPON_FIRE_TYPE != "MPUI_FULL_AUTO" && FULL_AUTO_ATTACHMENT ), ; ) - -#define TOGGLE_ATTRIBUTES_AND_STATS \ - if( dvarBool( ui_cac_gun_attributes_vis ) ) \ - { \ - setDvar ui_cac_gun_attributes_vis 0; } \ - else \ - { \ - setDvar ui_cac_gun_attributes_vis 1; \ - } - - // Gun Stats -#ifdef PC - #undef CHOICE_TEXTSIZE - #define CHOICE_TEXTSIZE TEXTSIZE_DEFAULT - - #undef CHOICE_TEXTFONT - #define CHOICE_TEXTFONT UI_FONT_NORMAL - - #define BUTTON_SPACING 20 - #define GUN_STATS_BUTTON_OFFSET ( getTextWidth( locString( "@PLATFORM_BACK" ), CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) + 8 + BUTTON_SPACING ) - - NEW_FRAME_BUTTON_PC_LEFT_OFFSET( CAC_WIDTH, CAC_HEIGHT, GUN_STATS_BUTTON_OFFSET, "@PLATFORM_GUN_STATS", TOGGLE_ATTRIBUTES_AND_STATS, when( !dvarBool( ui_cac_gun_attributes_vis ) ) ) -#else // #ifdef PC - itemDef - { - type ITEM_TYPE_BUTTON - rect 180 ( CAC_HEIGHT / 2 ) 50 17 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - text "@PLATFORM_GUN_STATS" - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_BOTTOM_LEFT - execkeyint BUTTON_BACK { TOGGLE_ATTRIBUTES_AND_STATS } - visible when( !dvarBool( ui_cac_gun_attributes_vis ) ) - decoration - } -#endif // #ifdef PC - - // Gun Attributes -#ifdef PC - NEW_FRAME_BUTTON_PC_LEFT_OFFSET( CAC_WIDTH, CAC_HEIGHT, GUN_STATS_BUTTON_OFFSET, "@PLATFORM_GUN_ATTRIBUTES", TOGGLE_ATTRIBUTES_AND_STATS, when( dvarBool( ui_cac_gun_attributes_vis ) ) ) -#else // #ifdef PC - itemDef - { - type ITEM_TYPE_BUTTON - rect 180 ( CAC_HEIGHT / 2 ) 50 17 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - text "@PLATFORM_GUN_ATTRIBUTES" - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_BOTTOM_LEFT - execkeyint BUTTON_BACK { TOGGLE_ATTRIBUTES_AND_STATS } - visible when( dvarBool( ui_cac_gun_attributes_vis ) ) - decoration - } -#endif // #ifdef PC - -#define ANY_ATTACHMENTS_EQUIPPED \ - ( ( GetItemNumAttachmentsEquipped( dvarString( ui_custom_name ), STAT_CAC_PRIMARY ) > 0 ) || ( GetItemNumAttachmentsEquipped( dvarString( ui_custom_name ), STAT_CAC_SECONDARY ) > 0 ) ) - -#define CLEAR_ATTACHMENTS_ACTION \ - play CHOICE_FOCUS_SOUND; \ - execnow clearAllAttachmentsForItem ( dvarString( ui_custom_name ) ) ( getCurrentItemIndex() ) ; - -#ifdef PC - NEW_FRAME_BUTTON_PC_RIGHT_OFFSET( CAC_WIDTH, CAC_HEIGHT, 0, "@PLATFORM_CLEAR_ATTACHMENTS", CLEAR_ATTACHMENTS_ACTION, when( dvarString( ui_inside_popup ) == "attachments" && ANY_ATTACHMENTS_EQUIPPED ) ) -#else // #ifdef PC - itemDef - { - type ITEM_TYPE_BUTTON - rect -165 ( CAC_HEIGHT / 2 ) 120 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - text "@PLATFORM_CLEAR_ATTACHMENTS" - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_MIDDLE_LEFT - execKeyInt BUTTON_Y { play CHOICE_FOCUS_SOUND; CLEAR_ATTACHMENTS_ACTION } - visible when( dvarString( ui_inside_popup ) == "attachments" && ANY_ATTACHMENTS_EQUIPPED ) - decoration - } -#endif // #ifdef PC - -#ifdef PC - // back button - NEW_FRAME_BACK_BUTTON_ACTION( CAC_WIDTH, CAC_HEIGHT, ON_ESC ) -#else // #ifdef PC - NEW_FRAME_BACK_BUTTON( CAC_WIDTH, CAC_HEIGHT ) -#endif // #ifdef PC - - } -} - - diff --git a/mods/patch_mp/ui_mp/combat_record.menu b/mods/patch_mp/ui_mp/combat_record.menu deleted file mode 100644 index 0597c12..0000000 --- a/mods/patch_mp/ui_mp/combat_record.menu +++ /dev/null @@ -1,3283 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" -#include "ui/frame.inc" - -/* - Some Info regarding the combat record menu ( sometimes abbreviated as CR ) : - -- The combat record menu basically displays the players stats in a graphical way and allows the player to compare some of - his stats with other players. - -- Whenever a player accesses someones combat record, either his own or his friend's, the stats are downloaded into a buffer - from which we fetch the stats and display them in the combat record. - -- The combat record menu is divided into different tabs which have different views in them ( all are different menudefs themselves ). - -- There is a lot of item animation used in this menu for having different types of effects. - ( for eg. having a scrolling effect in the weapons view, even though we dont have any listbox in there. ) - Obviously, there is some sort of hackery involved while trying to make these effects happen. - There are a bunch of item animation states which trigger other states for acheiving these effects. - There are some instances where we want to lock the controls for split second to ensure the animation gets over properly. - -- For displaying the histograms, menus are opened on top of each other. - -*/ - -#define COMBAT_RECORD_HEIGHT NEW_FRAME_DEFAULT_HEIGHT -#define COMBAT_RECORD_WIDTH ( COMBAT_RECORD_HEIGHT * FRAME_ASPECT_RATIO ) - -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui_mp/overlaybg.inc" -#include "ui_mp/item_animate.inc" -#include "ui_mp/cac_viewer.inc" -#include "ui_mp/cac_player_model.inc" -#include "ui_mp/item_listbox.inc" -#include "ui_mp/tab_slider.inc" -#include "ui_mp/stats_info.inc" -#include "ui_mp/popup_player_info.inc" -#include "ui/choices_setup_popmenu.menu" -#include "ui_mp/fileshare.inc" -#include "ui_mp/popupstyle.inc" - -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL - -#undef CHOICE_TEXTCOLOR -#define CHOICE_TEXTCOLOR NEW_FRAME_COMMON_TEXT_COLOR - -#undef CHOICE_HORIZONTAL_ALIGN -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER -#undef CHOICE_VERTICAL_ALIGN -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER - -#define COMBAT_RECORD_BODY_X_START ( -COMBAT_RECORD_WIDTH / 2 + 15 ) -#define COMBAT_RECORD_BODY_Y_START ( -COMBAT_RECORD_HEIGHT / 2 + 15 + NEW_FRAME_BG_Y_OFFSET( COMBAT_RECORD_HEIGHT ) ) - - -#define COMBAT_RECORD_LIST_X_START (COMBAT_RECORD_BODY_X_START+20) -#define COMBAT_RECORD_LIST_Y_START (COMBAT_RECORD_BODY_Y_START+60) - -#define COMBAT_RECORD_COLOR_RED NEW_FRAME_RED_RGB 1.0 -#define COMBAT_RECORD_COLOR_GREEN NEW_FRAME_GREEN_RGB 1.0 - -#define CR_LINE_GRAPH_X_START (COMBAT_RECORD_BODY_X_START+60) -#define CR_LINE_GRAPH_Y_START (COMBAT_RECORD_BODY_Y_START+200) -#define CR_LINE_GRAPH_WIDTH 450 -#define CR_LINE_GRAPH_HEIGHT 90 -#define CR_LINE_GRAPH_MARGIN (CR_LINE_GRAPH_HEIGHT/2) -#define CR_LINE_GRAPH_GRID_LINE_COLOR 0.4 0.4 0.4 0.4 - -#ifdef CONSOLE -#define HISTOGRAM_X_START (COMBAT_RECORD_BODY_X_START+60) -#define HISTOGRAM_Y_START (COMBAT_RECORD_BODY_Y_START+50) -#define HISTOGRAM_LABELS_X_START (HISTOGRAM_X_START-50) -#define HISTOGRAM_LABELS_Y_START (HISTOGRAM_Y_START+5) -#else // #ifdef CONSOLE -#define HISTOGRAM_X_START (COMBAT_RECORD_BODY_X_START+60) -#define HISTOGRAM_Y_START (COMBAT_RECORD_BODY_Y_START+50) -#define HISTOGRAM_LABELS_X_START (HISTOGRAM_X_START-50) -#define HISTOGRAM_LABELS_Y_START (HISTOGRAM_Y_START+5) -#endif - -#define HISTOGRAM_WIDTH 500 -#define HISTOGRAM_HEIGHT 90 - -#undef SELECT_ICON -#ifdef XENON - #define SELECT_ICON "ui_button_xenon_3d_a_32x32" -#endif -#ifdef PS3 - #define SELECT_ICON "ui_button_ps3_x_32x32" -#endif - -#undef NEW_FRAME_TRANSPARENCY -#define NEW_FRAME_TRANSPARENCY 0 0 0 0.1 - -#define CHOICE_TAB_TEXTSIZE TEXTSIZE_DEFAULT -#define TAB_1_TEXT ( locString( "@MPUI_CAREER_CAPS" ) ) -#define TAB_2_TEXT ( locString( "@MPUI_WEAPONS_CAPS" ) ) -#define TAB_3_TEXT ( locString( "@MPUI_MATCHES_CAPS" ) ) -#define TAB_4_TEXT ( locString( "@MENU_KILLSTREAKS_CAPS" ) ) -#define TAB_5_TEXT ( locString( "@MENU_TAB_CONTRACTS_CAPS" ) ) - -#define TAB_BG_PAD 5 -#define TAB_1_WIDTH ( getTextWidth( TAB_1_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_2_WIDTH ( getTextWidth( TAB_2_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_3_WIDTH ( getTextWidth( TAB_3_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_4_WIDTH ( getTextWidth( TAB_4_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_5_WIDTH ( getTextWidth( TAB_5_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_HEIGHT 15 - -#define COMBAT_RECORD_TAB_1_X NEW_FRAME_CHOICE_X_START -#define COMBAT_RECORD_TAB_2_X ( COMBAT_RECORD_TAB_1_X + TAB_1_WIDTH ) -#define COMBAT_RECORD_TAB_3_X ( COMBAT_RECORD_TAB_2_X + TAB_2_WIDTH ) -#define COMBAT_RECORD_TAB_4_X ( COMBAT_RECORD_TAB_3_X + TAB_3_WIDTH ) -#define COMBAT_RECORD_TAB_5_X ( COMBAT_RECORD_TAB_4_X + TAB_4_WIDTH ) - -#define COMBAT_RECORD_TAB_Y ( ( -COMBAT_RECORD_HEIGHT / 2 ) + NEW_FRAME_HEADER_HEIGHT - TAB_HEIGHT ) - -#define CLOSE_EXTRA_MENUS \ - if( dvarInt("ui_combatCurrViewNum") == CR_VIEW_CAREER_RECENT_PERFORMANCE ) \ - { \ - close recent_performance_histogram; \ - } \ - elseif( dvarInt("ui_combatCurrViewNum") == CR_VIEW_MATCHES_PERFORMANCE ) \ - { \ - close match_performance_gametypes_list; \ - close match_performance_histogram; \ - } - -#undef PC_TAB_SWITCH_ACTIONS_PREV -#define PC_TAB_SWITCH_ACTIONS_PREV CLOSE_EXTRA_MENUS -#undef PC_TAB_SWITCH_ACTIONS_NEXT -#define PC_TAB_SWITCH_ACTIONS_NEXT CLOSE_EXTRA_MENUS - -#define COMBAT_RECORD_TAB_1_ACTION CLOSE_EXTRA_MENUS execNow closeMenuImmediate (dvarString("ui_combatCurrentViewMenuName")); execNow openMenuImmediate (dvarString("ui_combatCareerViewMenuName")); -#define COMBAT_RECORD_TAB_2_ACTION CLOSE_EXTRA_MENUS execNow closeMenuImmediate (dvarString("ui_combatCurrentViewMenuName")); execNow openMenuImmediate (dvarString("ui_combatWeaponsViewMenuName")); -#define COMBAT_RECORD_TAB_3_ACTION CLOSE_EXTRA_MENUS execNow closeMenuImmediate (dvarString("ui_combatCurrentViewMenuName")); execNow openMenuImmediate (dvarString("ui_combatMatchesViewMenuName")); -#define COMBAT_RECORD_TAB_4_ACTION CLOSE_EXTRA_MENUS execNow closeMenuImmediate (dvarString("ui_combatCurrentViewMenuName")); execNow openMenuImmediate (dvarString("ui_combatKillstreaksViewMenuName")); -#define COMBAT_RECORD_TAB_5_ACTION CLOSE_EXTRA_MENUS execNow closeMenuImmediate (dvarString("ui_combatCurrentViewMenuName")); execNow openMenuImmediate (dvarString("ui_combatContractsViewMenuName")); - -#define COMBAT_RECORD_TAB_HEADERS \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( COMBAT_RECORD_TAB_1_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_1_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_1_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( dvarInt("ui_combatCurrTab") != CR_TAB_CAREER ), TAB_MOUSEOVER_HIGHLIGHT; ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( COMBAT_RECORD_TAB_1_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_1_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_1_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( dvarInt("ui_combatCurrTab") == CR_TAB_CAREER ), ; ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( COMBAT_RECORD_TAB_2_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_2_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_2_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( dvarInt("ui_combatCurrTab") != CR_TAB_WEAPONS ), TAB_MOUSEOVER_HIGHLIGHT; ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( COMBAT_RECORD_TAB_2_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_2_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_2_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( dvarInt("ui_combatCurrTab") == CR_TAB_WEAPONS ), ; ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( COMBAT_RECORD_TAB_3_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_3_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_3_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( dvarInt("ui_combatCurrTab") != CR_TAB_MATCHES ), TAB_MOUSEOVER_HIGHLIGHT; ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( COMBAT_RECORD_TAB_3_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_3_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_3_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( dvarInt("ui_combatCurrTab") == CR_TAB_MATCHES ), ; ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( COMBAT_RECORD_TAB_4_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_4_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_4_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( dvarInt("ui_combatCurrTab") != CR_TAB_KILLSTREAKS ), TAB_MOUSEOVER_HIGHLIGHT; ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( COMBAT_RECORD_TAB_4_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_4_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_4_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( dvarInt("ui_combatCurrTab") == CR_TAB_KILLSTREAKS ), ; ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( COMBAT_RECORD_TAB_5_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_5_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_5_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( dvarInt("ui_combatCurrTab") != CR_TAB_CONTRACTS ), TAB_MOUSEOVER_HIGHLIGHT; ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( COMBAT_RECORD_TAB_5_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_5_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_5_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( dvarInt("ui_combatCurrTab") == CR_TAB_CONTRACTS ), ; ) - -#define COMBAT_RECORD_TAB_BUTTONS \ - /* Tab 1 */ \ - TAB_ACTION_BUTTON_ADV( COMBAT_RECORD_TAB_1_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_1_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - COMBAT_RECORD_TAB_1_ACTION , 1, ; ) \ - /* Tab 2 */ \ - TAB_ACTION_BUTTON_ADV( COMBAT_RECORD_TAB_2_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_2_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - COMBAT_RECORD_TAB_2_ACTION , 1, ; ) \ - /* Tab 3 */ \ - TAB_ACTION_BUTTON_ADV( COMBAT_RECORD_TAB_3_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_3_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - COMBAT_RECORD_TAB_3_ACTION , 1, ; ) \ - /* Tab 4 */ \ - TAB_ACTION_BUTTON_ADV( COMBAT_RECORD_TAB_4_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_4_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - COMBAT_RECORD_TAB_4_ACTION , 1, ; ) \ - /* Tab 5 */ \ - TAB_ACTION_BUTTON_ADV( COMBAT_RECORD_TAB_5_X, \ - COMBAT_RECORD_TAB_Y, \ - TAB_5_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - COMBAT_RECORD_TAB_5_ACTION , 1, ; ) - -#define COMBAT_RECORD_TAB_BG( px, pw, selected ) \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER_FRAMED \ - frame 16 0.2 FRAME_OPEN_BOTTOM \ - rect 0 COMBAT_RECORD_TAB_Y 0 TAB_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ - exp rect X( px ) \ - exp rect W( pw ) \ - background "menu_mp_tab_frame_inner" \ - forecolor 0.5 0.5 0.5 0.5 \ - visible when( selected ) \ - decoration \ - } \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER_FRAMED \ - frame 16 0.2 FRAME_OPEN_BOTTOM \ - rect 0 COMBAT_RECORD_TAB_Y 0 TAB_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ - exp rect X( px ) \ - exp rect W( pw ) \ - background "menu_mp_tab_frame_inner" \ - forecolor 1 1 1 1 \ - visible when( !selected ) \ - decoration \ - } - -#define COMBAT_RECORD_PLAYER_MODEL( right, top, size ) \ - itemDef \ - { \ - visible when( dvarint( uiViewer_loaded ) == 1 && dvarbool( uiViewer_show ) ) \ - rect right top size size CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - forecolor 1 1 1 1 \ - style WINDOW_STYLE_SHADER \ - background "ui_viewer" \ - decoration \ - } \ - itemDef \ - { \ - visible when( dvarint( uiViewer_showGrid ) == 1 ) \ - rect right top size size CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - forecolor 1 1 1 1 \ - style WINDOW_STYLE_SHADER \ - background "viewer_grid" \ - decoration \ - } - -#define COMBAT_RECORD_RANK_ICON( x_offset, y_offset, pshader ) \ - PREPROC_SHADER_DRAW( x_offset y_offset 32 32 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, pshader, 1 1 1 1, ) - -#define RANK_BACKGROUND_COLOR 0.32 0.36 0.29 0.0 - -#define SUMMARY_RANK_ICON( x_offset, y_offset, pshader, visArg ) \ - PREPROC_SHADER_DRAW_VIS_EX( (x_offset-45) (y_offset-44) 150 150 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "hud_notification_rank_backing", RANK_BACKGROUND_COLOR, \ - visArg, ; ) \ - PREPROC_SHADER_DRAW_VIS_EX( x_offset y_offset 100 100 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - ((pshader) + "_128"), 1 1 1 1, \ - visArg, ; ) - -#define SPEED 200 - -#define RESET_ALL_BARS_AFTER_MOVING_UP( menuName ) \ - execnow "set ui_slideUpDistance 0"; \ - ITEM_ANIMATE( menuName, "dummy", changePivotAfterMovingUp, 0 ) \ - -#define RESET_ALL_BARS_AFTER_MOVING_DOWN( menuName ) \ - execnow "set ui_slideUpDistance 0"; \ - ITEM_ANIMATE( menuName, "dummy", changePivotAfterMovingDown, 0 ) \ - -#define ADJUST_OTHER_PLAYER_INFO_BARS( menuName ) \ - if( dvarBool( "ui_combatComparisonModeOn" ) ) \ - { \ - ITEM_ANIMATE( menuName, "info_bar_1_otherPlayer", fadeIn, 0 ); \ - ITEM_ANIMATE( menuName, "info_bar_otherPlayer", fadeIn, 0 ); \ - ITEM_ANIMATE( menuName, "info_bar_5_otherPlayer", fadeIn, 0 ); \ - ITEM_ANIMATE( menuName, "otherPlayerName", fadeIn, 0 ); \ - } \ - else \ - { \ - ITEM_ANIMATE( menuName, "info_bar_1_otherPlayer", fadeOut, 0 ); \ - ITEM_ANIMATE( menuName, "info_bar_otherPlayer", fadeOut, 0 ); \ - ITEM_ANIMATE( menuName, "info_bar_5_otherPlayer", fadeOut, 0 ); \ - ITEM_ANIMATE( menuName, "otherPlayerName", fadeOut, 0 ); \ - } - -#define ANIM_STATES( forecolorArg ) \ - ITEM_STATE( slideAndFadeOut, forecolor forecolorArg 0; , changeState default 0; ) \ - ITEM_STATE( slideAndFadeIn, forecolor forecolorArg 1;, changeState default 0; ) \ - ITEM_STATE( slide, ;, changeState default 0; ) \ - ITEM_STATE( fadeIn, forecolor forecolorArg 1;, ; ) \ - ITEM_STATE( fadeOut, forecolor forecolorArg 0;, ;) \ - ITEM_STATE( fadeOutThenFadeInFast, forecolor forecolorArg 0;, changeState fadeIn 0; ) \ - ITEM_STATE( fadeOutThenFadeInSlow, forecolor forecolorArg 0;, changeState fadeIn SPEED; ) - -#define ANIM_STATES_FOR_BG( forecolorArg, alpha ) \ - ITEM_STATE( slideAndFadeOut, forecolor forecolorArg 0; , changeState default 0; ) \ - ITEM_STATE( slideAndFadeIn, forecolor forecolorArg alpha;, changeState default 0; ) \ - ITEM_STATE( slide, ;, changeState default 0; ) \ - ITEM_STATE( fadeIn, forecolor forecolorArg alpha;, ; ) \ - ITEM_STATE( fadeOut, forecolor forecolorArg 0;, ;) \ - -#define DUMMY_ITEM_FOR_ANIMATION( menuName, vis_condition ) \ - itemDef \ - { \ - name "dummy" \ - style WINDOW_STYLE_SHADER \ - rect COMBAT_RECORD_BODY_X_START (COMBAT_RECORD_BODY_Y_START+250) 1 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - forecolor 0 0 0 0 \ - background "white" \ - visible when( vis_condition ) \ - decoration \ - ITEM_STATE( lockScrolling, ;, setDvar ui_combatLockScrolling "0"; ) \ - ITEM_STATE( updateViewAfterDownloading, ;, \ - if( dvarBool("ui_combatOtherPlayerStatsAvailable") ) \ - { \ - ITEM_ANIMATE( menuName, "info_bar_1_otherPlayer", fadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_otherPlayer", fadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_5_otherPlayer", fadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "otherPlayerName", fadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_1", default, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar", default, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_5", default, SPEED ); \ - execNow set ui_combatInfoBarWidth 0; \ - execNow set ui_combatCurrScrollBarPos 0; \ - execnow set ui_combatComparisonModeOn 1; \ - execnow "UpdateCombatRecordView"; \ - } \ - ) \ - ITEM_STATE( changePivotAfterMovingUp, ;, if( ChangeSortedStatsPivot( 1 ) ) { changeState lockScrolling 0; } ) \ - ITEM_STATE( moveUpAndChangePivot, ;, RESET_ALL_BARS_AFTER_MOVING_UP( menuName ) ) \ - ITEM_STATE( changePivotAfterMovingDown, ;, if( ChangeSortedStatsPivot( -1 ) ) { changeState lockScrolling 0; } ) \ - ITEM_STATE( moveDownAndChangePivot, ;, RESET_ALL_BARS_AFTER_MOVING_DOWN( menuName ) ) \ - } - -#define SCROLL_DOWN_ACTION( menuName ) \ - ITEM_ANIMATE( menuName, "dummy", moveUpAndChangePivot, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_1", slideAndFadeOut, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar", slide, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_5", slide, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_6", slideAndFadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "scroll_bar", slide, SPEED ); \ - if( dvarbool( "ui_combatComparisonModeOn" ) )\ - { \ - ITEM_ANIMATE( menuName, "info_bar_1_otherPlayer", fadeOutThenFadeInFast, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_otherPlayer", fadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_5_otherPlayer", fadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_6_otherPlayer", slideAndFadeIn, SPEED ); \ - } \ - execnow set ui_slideUpDistance -INFO_BAR_SET_HEIGHT; \ - execnow set ui_combatCurrScrollBarPos (dvarInt("ui_combatCurrScrollBarPos")+1); \ - setDvar ui_combatLockScrolling "1"; - -#define SCROLL_UP_ACTION( menuName ) \ - ITEM_ANIMATE( menuName, "dummy", moveDownAndChangePivot, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_0", slideAndFadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_1", slide, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar", slide, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_5", slideAndFadeOut, SPEED ); \ - ITEM_ANIMATE( menuName, "scroll_bar", slide, SPEED ); \ - if( dvarbool( "ui_combatComparisonModeOn" ) ) \ - { \ - ITEM_ANIMATE( menuName, "info_bar_0_otherPlayer", slideAndFadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_1_otherPlayer", fadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_otherPlayer", fadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_5_otherPlayer", fadeOutThenFadeInFast, SPEED ); \ - } \ - execnow set ui_slideUpDistance INFO_BAR_SET_HEIGHT; \ - execnow set ui_combatCurrScrollBarPos (dvarInt("ui_combatCurrScrollBarPos")-1); \ - setDvar ui_combatLockScrolling "1"; - -#define CHANGE_MENU_ACTION( currMenu, prevMenu, nextMenu ) \ - execKeyInt DPAD_LEFT { \ - CLOSE_EXTRA_MENUS \ - execNow closeMenuImmediate (currMenu); \ - execNow openMenuImmediate (prevMenu); \ - } \ - execKeyInt DPAD_RIGHT { \ - CLOSE_EXTRA_MENUS \ - execNow closeMenuImmediate (currMenu); \ - execNow openMenuImmediate (nextMenu); \ - } \ - execKeyInt APAD_LEFT { \ - CLOSE_EXTRA_MENUS \ - execNow closeMenuImmediate (currMenu); \ - execNow openMenuImmediate (prevMenu); \ - } \ - execKeyInt APAD_RIGHT { \ - CLOSE_EXTRA_MENUS \ - execNow closeMenuImmediate (currMenu); \ - execNow openMenuImmediate (nextMenu); \ - } - -#define CAN_COMPARISON_MODE_BE_TURNED_ON \ - ( ( ( dvarInt("ui_combatCurrViewNum") >= CR_VIEW_WEAPONS_KDR && dvarInt("ui_combatCurrViewNum") <= CR_VIEW_WEAPONS_EQUIPMENT_USAGE ) ) || \ - ( ( dvarInt("ui_combatCurrViewNum") >= CR_VIEW_KILLSTREAKS_CALLED && dvarInt("ui_combatCurrViewNum") <= CR_VIEW_KILLSTREAKS_TIMES_KILLED_BY ) ) || \ - ( dvarString("ui_combatCurrTab") == CR_TAB_CONTRACTS ) || \ - ( dvarInt("ui_combatCurrViewNum") == CR_VIEW_CAREER_PERSONAL_BESTS ) ) - -#define DOES_MENU_HAVE_SCROLLING_ENABLED \ - ( ( ( dvarInt("ui_combatCurrViewNum") >= CR_VIEW_WEAPONS_KDR && dvarInt("ui_combatCurrViewNum") <= CR_VIEW_WEAPONS_EQUIPMENT_USAGE ) ) || \ - ( ( dvarInt("ui_combatCurrViewNum") >= CR_VIEW_KILLSTREAKS_CALLED && dvarInt("ui_combatCurrViewNum") <= CR_VIEW_KILLSTREAKS_TIMES_KILLED_BY ) ) ) - - -// TYPES OF GRAPHS -#define RECENT_PERFORMANCE_HISTOGRAM 0 -#define MATCH_PERFORMANCE_HISTOGRAM 1 -#define RECENT_EARNINGS_BAR_GRAPH 2 - -// TYPES OF PIE CHARTS -#define NON_WAGER_GAMETYPE_PIE_CHART 0 -#define WAGER_GAMETYPE_PIE_CHART 1 -#define FAVORITE_KILLSTREAKS_PIE_CHART 2 - -#define RETURN_MIN_SCORE 1 -#define RETURN_MAX_SCORE 0 - -// TABS IN COMBAT RECORD -#define CR_TAB_CAREER 1 -#define CR_TAB_WEAPONS 2 -#define CR_TAB_MATCHES 3 -#define CR_TAB_CONTRACTS 4 -#define CR_TAB_KILLSTREAKS 5 - -// VIEW COUNT -#define CR_CAREER_VIEW_COUNT 3 -#define CR_WEAPONS_VIEW_COUNT 11 -#define CR_MATCHES_VIEW_COUNT 3 -#define CR_KILLSTREAKS_VIEW_COUNT 3 -#define CR_CONTRACTS_VIEW_COUNT 1 - -// VIEWS IN COMBAT RECORD -#define CR_VIEW_CAREER_SUMMARY 0 -#define CR_VIEW_CAREER_RECENT_PERFORMANCE 1 -#define CR_VIEW_CAREER_PERSONAL_BESTS 2 -#define CR_VIEW_WEAPONS_FAV_WEAPON 3 -#define CR_VIEW_WEAPONS_HIT_LOCATION_HEATMAP 4 -#define CR_VIEW_WEAPONS_KDR 5 -#define CR_VIEW_WEAPONS_ACCURACY 6 -#define CR_VIEW_WEAPONS_KILLS 7 -#define CR_VIEW_WEAPONS_DEATHS 8 -#define CR_VIEW_WEAPONS_HEADSHOTS 9 -#define CR_VIEW_WEAPONS_TIMES_KILLED_BY 10 -#define CR_VIEW_WEAPONS_EQUIPMENT_KILLS 11 -#define CR_VIEW_WEAPONS_EQUIPMENT_TIMES_KILLED_BY 12 -#define CR_VIEW_WEAPONS_EQUIPMENT_USAGE 13 -#define CR_VIEW_MATCHES_PERFORMANCE 14 -#define CR_VIEW_MATCHES_HEAT_MAP 15 -#define CR_VIEW_MATCHES_RECENT_EARNINGS 16 -#define CR_VIEW_CONTRACTS_INFO 17 -#define CR_VIEW_KILLSTREAKS_FAVORITES 18 -#define CR_VIEW_KILLSTREAKS_CALLED 19 -#define CR_VIEW_KILLSTREAKS_KILLS 20 -#define CR_VIEW_KILLSTREAKS_TIMES_KILLED_BY 21 - -#define CR_RECENT_PERFORMANCE_INFO -1 - -#define RESET_SELECTED_PLAYER_XUID \ - if( dvarString(lastSelectedPlayerXuid) != 0 ) \ - { \ - execNow set selectedPlayerXuid (DvarString(lastSelectedPlayerXuid)); \ - execNow set selectedFriendName (DvarString(lastSelectedPlayerName)); \ - } \ - -#define LSHLDR_ACTION \ - if( dvarbool("ui_combatLockScrolling") == 0 ) \ - { \ - CLOSE_EXTRA_MENUS \ - execNow "closeMenuImmediate (dvarString(ui_combatCurrentViewMenuName))"; \ - if( dvarString("ui_combatCurrTab") == CR_TAB_CAREER ) \ - { \ - execNow set ui_combatCareerViewMenuName (dvarString(ui_combatPreviousViewMenuName)); \ - } \ - elseif( dvarString("ui_combatCurrTab") == CR_TAB_WEAPONS ) \ - { \ - execNow set ui_combatWeaponsViewMenuName (dvarString(ui_combatPreviousViewMenuName)); \ - } \ - elseif( dvarString("ui_combatCurrTab") == CR_TAB_MATCHES ) \ - { \ - execNow set ui_combatMatchesViewMenuName (dvarString(ui_combatPreviousViewMenuName)); \ - } \ - elseif( dvarString("ui_combatCurrTab") == CR_TAB_KILLSTREAKS ) \ - { \ - execNow set ui_combatKillstreaksViewMenuName (dvarString(ui_combatPreviousViewMenuName)); \ - } \ - execNow "openMenuImmediate (dvarString(ui_combatPreviousViewMenuName))"; \ - } - -#define RSHLDR_ACTION \ - if( dvarbool("ui_combatLockScrolling") == 0 ) \ - { \ - CLOSE_EXTRA_MENUS \ - execNow "closeMenuImmediate (dvarString(ui_combatCurrentViewMenuName))"; \ - if( dvarString("ui_combatCurrTab") == CR_TAB_CAREER ) \ - { \ - execNow set ui_combatCareerViewMenuName (dvarString(ui_combatNextViewMenuName)); \ - } \ - elseif( dvarString("ui_combatCurrTab") == CR_TAB_WEAPONS ) \ - { \ - execNow set ui_combatWeaponsViewMenuName (dvarString(ui_combatNextViewMenuName)); \ - } \ - elseif( dvarString("ui_combatCurrTab") == CR_TAB_MATCHES ) \ - { \ - execNow set ui_combatMatchesViewMenuName (dvarString(ui_combatNextViewMenuName)); \ - } \ - elseif( dvarString("ui_combatCurrTab") == CR_TAB_KILLSTREAKS ) \ - { \ - execNow set ui_combatKillstreaksViewMenuName (dvarString(ui_combatNextViewMenuName)); \ - } \ - execNow "openMenuImmediate (dvarString(ui_combatNextViewMenuName))"; \ - } \ - - -#define DOWN_ACTION( menuName ) \ - if( dvarbool("ui_combatLockScrolling") == 0 ) \ - { \ - if( canScrollUpOrDown( 0 ) && DOES_MENU_HAVE_SCROLLING_ENABLED ) \ - { \ - SCROLL_DOWN_ACTION( menuName ) \ - } \ - } - -#define UP_ACTION( menuName ) \ - if( dvarbool("ui_combatLockScrolling") == 0 ) \ - { \ - if( canScrollUpOrDown( 1 ) ) \ - { \ - SCROLL_UP_ACTION( menuName ) \ - } \ - } - -#define COMPARE_FRIENDS_ACTION \ - if( CAN_COMPARISON_MODE_BE_TURNED_ON && dvarbool("ui_combatLockScrolling") == 0 ) \ - { \ - if( !dvarbool( "ui_showFriendsCombatRecord" ) ) \ - { \ - BUTTON_X_ACTION_FOR_SELF_COMBAT_RECORD( menuName ) \ - } \ - else \ - { \ - if( !dvarbool( "ui_combatComparisonModeOn" ) ) \ - { \ - BUTTON_X_ACTION_COMP_MODE_ON( menuName ) \ - } \ - else \ - { \ - BUTTON_X_ACTION_COMP_MODE_OFF( menuName ) \ - } \ - execNow "toggle ui_combatComparisonModeOn 0 1"; \ - ADJUST_OTHER_PLAYER_INFO_BARS( (dvarString("ui_combatCurrentViewMenuName")) ) \ - } \ - } \ - -#ifdef PC - #define PC_ACTIONS( currMenu, prevMenu, nextMenu ) \ - execKeyInt K_LEFTARROW { \ - CLOSE_EXTRA_MENUS \ - execNow closeMenuImmediate (currMenu); \ - execNow openMenuImmediate (prevMenu); \ - } \ - execKeyInt K_RIGHTARROW { \ - CLOSE_EXTRA_MENUS \ - execNow closeMenuImmediate (currMenu); \ - execNow openMenuImmediate (nextMenu); \ - } -#else //#ifdef PC - #define PC_ACTIONS( currMenu, prevMenu, nextMenu ) -#endif //#ifdef PC - -#define ACTION_HANDLER( menuName ) \ - execKeyInt APAD_DOWN \ - { \ - DOWN_ACTION( menuName ) \ - } \ - execKeyInt APAD_UP \ - { \ - UP_ACTION( menuName ) \ - } \ - execKeyInt DPAD_DOWN \ - { \ - DOWN_ACTION( menuName ) \ - } \ - execKeyInt DPAD_UP \ - { \ - UP_ACTION( menuName ) \ - } \ - execKeyInt K_MWHEELDOWN \ - { \ - DOWN_ACTION( menuName ) \ - } \ - execKeyInt K_MWHEELUP \ - { \ - UP_ACTION( menuName ) \ - } \ - execKeyInt BUTTON_LSHLDR \ - { \ - LSHLDR_ACTION \ - } \ - execKeyInt BUTTON_RSHLDR \ - { \ - RSHLDR_ACTION \ - } \ - execKeyInt BUTTON_X \ - { \ - COMPARE_FRIENDS_ACTION \ - } \ - PC_ACTIONS( dvarString("ui_combatCurrentViewMenuName"), (dvarString("ui_combatPrevTabMenuName")), (dvarString("ui_combatNextTabMenuName")) ) \ - CHANGE_MENU_ACTION( dvarString("ui_combatCurrentViewMenuName"), (dvarString("ui_combatPrevTabMenuName")), (dvarString("ui_combatNextTabMenuName")) ) - -#define BUTTON_X_ACTION_FOR_SELF_COMBAT_RECORD( menuName ) \ - ITEM_ANIMATE( menuName, "info_bar_1", default, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar", default, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_5", default, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_1_otherPlayer", fadeOut, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_otherPlayer", fadeOut, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_5_otherPlayer", fadeOut, SPEED ); \ - ITEM_ANIMATE( menuName, "otherPlayerName", fadeOut, SPEED ); \ - execNow set ui_combatInfoBarWidth -1; \ - execNow set ui_combatComparisonModeOn 0; \ - execNow set ui_combatOtherPlayerStatsAvailable 1; \ - execNow "openMenu menu_cr_friends_selection"; - -#define BUTTON_X_ACTION_COMP_MODE_ON( menuName ) \ - ITEM_ANIMATE( menuName, "info_bar_1", default, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar", default, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_5", default, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_1_otherPlayer", fadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_otherPlayer", fadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_5_otherPlayer", fadeIn, SPEED ); \ - ITEM_ANIMATE( menuName, "otherPlayerName", fadeIn, SPEED ); - -#define BUTTON_X_ACTION_COMP_MODE_OFF( menuName ) \ - ITEM_ANIMATE( menuName, "info_bar_1", default, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar", default, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_5", default, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_1_otherPlayer", fadeOut, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_otherPlayer", fadeOut, SPEED ); \ - ITEM_ANIMATE( menuName, "info_bar_5_otherPlayer", fadeOut, SPEED ); \ - ITEM_ANIMATE( menuName, "otherPlayerName", fadeOut, SPEED ); - -#define INFO_BAR_Y_START (COMBAT_RECORD_BODY_Y_START+5) - -#define GET_SORTED_STAT( sortedItemIndex, isAbsoluteIndex, param ) \ - getSortedStatsForFriendOrSelf( dvarbool("ui_showFriendsCombatRecord"), sortedItemIndex, isAbsoluteIndex, param ) - -#define GET_SORTED_ITEM_INDEX( sortedItemIndex, isAbsoluteIndex ) \ - getSortedStatsForFriendOrSelf( dvarbool("ui_showFriendsCombatRecord"), sortedItemIndex, isAbsoluteIndex, 0 ) - -#define GET_STAT( statName ) \ - getStatForFriendOrSelf( dvarbool("ui_showFriendsCombatRecord"), "PlayerStatsList", statName ) - -#define GET_STAT_FOR_OTHER_PLAYER( statName ) \ - getStatForFriendOrSelf( !dvarbool("ui_showFriendsCombatRecord"), "PlayerStatsList", statName ) - -#define GET_ITEM_STAT( itemIndex, statName ) \ - getStatForFriendOrSelf( dvarbool("ui_showFriendsCombatRecord"), "ItemStats", itemIndex, "stats", statName, "statValue" ) - -#define GET_HIGHEST_STAT( statName ) \ - getStatForFriendOrSelf( dvarbool("ui_showFriendsCombatRecord"), "HighestStats", statName ) - -#define COMPARE_BUTTON( vis_condition ) \ - itemDef \ - { \ - type ITEM_TYPE_TEXT \ - rect -200 ( COMBAT_RECORD_HEIGHT / 2 + 18 ) 0 0 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - text "@PLATFORM_COMPARE" \ - textfont UI_FONT_NORMAL \ - textscale TEXTSIZE_DEFAULT \ - textalign ITEM_ALIGN_BOTTOM_LEFT \ - visible when( !dvarbool( xblive_basictraining ) && dvarbool( "ui_showFriendsCombatRecord" ) && !dvarbool( "ui_combatComparisonModeOn" ) && vis_condition ) \ - decoration \ - } \ - -#define COMPARE_FRIENDS_BUTTON( vis_condition ) \ - itemDef \ - { \ - type ITEM_TYPE_TEXT \ - rect -200 ( COMBAT_RECORD_HEIGHT / 2 + 18 ) 0 0 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - text "@PATCH_TOGGLE_COMPARE_FRIENDS" \ - textfont CHOICE_TEXTFONT \ - textscale TEXTSIZE_DEFAULT \ - textalign ITEM_ALIGN_BOTTOM_LEFT \ - visible when( !dvarbool( xblive_basictraining ) && !dvarbool( "ui_showFriendsCombatRecord" ) && vis_condition ) \ - decoration \ - } - -#define HIDE_COMPARISON_BUTTON( vis_condition ) \ - /*NEW_FRAME_BUTTON_PC_LEFT_OFFSET( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, "@PLATFORM_HIDE_COMPARISON", execNow set ui_combatComparisonModeOn 0;, dvarBool("ui_combatComparisonModeOn") && vis_condition )*/ - -#define INFO_BAR_COLOR NEW_FRAME_ORANGE_RGB - -#define INFO_BAR_COLOR_FOR_FRIEND NEW_FRAME_LT_GREY_RGB - -#define INFO_BAR_SET_HEIGHT 46 - -#define MAX_VARIABLEBAR_LENGTH 231 -#define VARIABLEBAR_TAGDISPLAY_LENGTH 150 - -#define INFO_BAR_STRUCTURE_X_START (COMBAT_RECORD_BODY_X_START+10) - -#ifdef CONSOLE - #define INFO_BAR_SCROLL_BUTTONS( vis_condition ) -#else - #define INFO_BAR_SCROLL_BUTTONS( vis_condition ) \ - /*Up Arrow*/ \ - itemDef \ - { \ - name "scroll_bar_up_arrow" \ - type ITEM_TYPE_BUTTON_NO_TEXT \ - rect (COMBAT_RECORD_WIDTH/2-33) (INFO_BAR_Y_START+33) 12 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - visible when( vis_condition ) \ - mouseEnter { play CHOICE_FOCUS_SOUND ; } \ - action { play CHOICE_FOCUS_SOUND ; execKeyHandler K_MWHEELUP } \ - } \ - /*Down Arrow*/ \ - itemDef \ - { \ - name "scroll_bar_down_arrow" \ - type ITEM_TYPE_BUTTON_NO_TEXT \ - rect (COMBAT_RECORD_WIDTH/2-33) (INFO_BAR_Y_START+33+240-10) 12 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - visible when( vis_condition ) \ - mouseEnter { play CHOICE_FOCUS_SOUND ; } \ - action { play CHOICE_FOCUS_SOUND ; execKeyHandler K_MWHEELDOWN } \ - } -#endif - -#ifdef CONSOLE - #define INFO_BAR_BOTTOM_BUTTON \ - /* scroll bar bottom arrow */ \ - PREPROC_SHADER_DRAW_VIS_EX( (COMBAT_RECORD_WIDTH/2-28) (INFO_BAR_Y_START+33+225) 14 14 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "ui_arrow_right", NEW_FRAME_ORANGE_RGB 1, \ - when( vis_condition && dvarInt("ui_combatCurrViewNum") != CR_VIEW_CAREER_PERSONAL_BESTS );, rotation 90; ) - - #define SHOW_COMPARE_TEXT_CONSOLE COMPARE_BUTTON( vis_condition ) -#else // #ifdef CONSOLE - #define INFO_BAR_BOTTOM_BUTTON - #define SHOW_COMPARE_TEXT_CONSOLE -#endif // #ifdef CONSOLE - -#define INFO_BAR_STRUCTURE( vis_condition ) \ - INFO_BAR_TAGS( vis_condition ) \ - INFO_BARS( vis_condition ) \ - SHOW_COMPARE_TEXT_CONSOLE \ - /*COMPARE_FRIENDS_BUTTON( vis_condition )*/ \ - NEW_FRAME_COMPARE_FRIEND_BUTTON_ACTION( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, "@PATCH_TOGGLE_COMPARE_FRIENDS", COMPARE_FRIENDS_ACTION , vis_condition ) \ - HIDE_COMPARISON_BUTTON( vis_condition ) \ - RANK_AND_GAMERTAG_OF_COMPARED_PLAYER( (-155), vis_condition ) \ - /* scroll bar line */ \ - PREPROC_SHADER_DRAW_VIS_EX( (COMBAT_RECORD_WIDTH/2-33) (INFO_BAR_Y_START+33) 12 240 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "menu_mp_lobby_scrollbar_main", 1 1 1 1, \ - when( vis_condition && dvarInt("ui_combatCurrViewNum") != CR_VIEW_CAREER_PERSONAL_BESTS );, ; ) \ - INFO_BAR_BOTTOM_BUTTON \ - /* scroll bar buttons */ \ - INFO_BAR_SCROLL_BUTTONS( vis_condition ) \ - /* scroll bar square */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (COMBAT_RECORD_WIDTH/2-33), \ - ( (INFO_BAR_Y_START+53) + GetCurrentScrollBarPosition( 193 ) ), \ - 12, \ - 15, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "menu_mp_lobby_scrollbar_block", 1 1 1 1, \ - when( vis_condition && dvarInt("ui_combatCurrViewNum") != CR_VIEW_CAREER_PERSONAL_BESTS );, \ - name "scroll_bar"; ITEM_STATE( slide, ;, ; ); ) - -#define INFO_BAR( itemName, rank, alpha, vis_condition ) \ - /* INFO BAR */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (INFO_BAR_STRUCTURE_X_START+VARIABLEBAR_TAGDISPLAY_LENGTH+1), \ - ( INFO_BAR_Y_START+3+(INFO_BAR_SET_HEIGHT*rank) + dvarInt( "ui_slideUpDistance" ) ), \ - ( GetCombatRecordInfoBarWidth( 0, MAX_VARIABLEBAR_LENGTH, rank ) ), \ - 13, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "menu_mp_combatrecord_bar", INFO_BAR_COLOR alpha, \ - when( vis_condition );, \ - name itemName; ANIM_STATES( INFO_BAR_COLOR ) ) \ - /* VALUE TEXT */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( INFO_BAR_STRUCTURE_X_START+VARIABLEBAR_TAGDISPLAY_LENGTH+ 240 ), \ - ( INFO_BAR_Y_START+3+(INFO_BAR_SET_HEIGHT*rank) + dvarInt( "ui_slideUpDistance" ) ), \ - 100, \ - 13, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - GetCombatRecordInfoBarText( 0, rank ), \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, INFO_BAR_COLOR alpha, \ - when( vis_condition );, \ - name itemName; ANIM_STATES( INFO_BAR_COLOR ) ) \ - /* INFO BAR FOR FRIEND*/ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (INFO_BAR_STRUCTURE_X_START+VARIABLEBAR_TAGDISPLAY_LENGTH+1), \ - ( INFO_BAR_Y_START+22+(INFO_BAR_SET_HEIGHT*rank) + dvarInt( "ui_slideUpDistance" ) ), \ - ( GetCombatRecordInfoBarWidth( 1, MAX_VARIABLEBAR_LENGTH, rank ) * ((dvarInt( "ui_combatInfoBarWidth" )+1)) ), \ - 13, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "menu_mp_combatrecord_bar", INFO_BAR_COLOR_FOR_FRIEND 0, \ - when( vis_condition );, \ - name itemName##"_otherPlayer"; ANIM_STATES( INFO_BAR_COLOR_FOR_FRIEND ) ) \ - /* VALUE TEXT FOR FRIEND */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( INFO_BAR_STRUCTURE_X_START+VARIABLEBAR_TAGDISPLAY_LENGTH+ 240 ), \ - ( INFO_BAR_Y_START+22+(INFO_BAR_SET_HEIGHT*rank) + dvarInt( "ui_slideUpDistance" ) ), \ - 100, \ - 13, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - GetCombatRecordInfoBarText( 1, rank ), \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, INFO_BAR_COLOR_FOR_FRIEND 0, \ - when( vis_condition );, \ - name itemName##"_otherPlayer"; ANIM_STATES( INFO_BAR_COLOR_FOR_FRIEND ) ) \ - /* RANK ICON FOR FRIEND TO THE LEFT OF THE INFO BAR */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( INFO_BAR_STRUCTURE_X_START+VARIABLEBAR_TAGDISPLAY_LENGTH-19 ), \ - ( INFO_BAR_Y_START+18+(INFO_BAR_SET_HEIGHT*rank) + dvarInt( "ui_slideUpDistance" ) ), \ - 16, \ - 16, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN;, \ - tablelookup( "mp/rankIconTable.csv", 0, GET_STAT_FOR_OTHER_PLAYER( "RANK" ), 1+GET_STAT_FOR_OTHER_PLAYER( "PLEVEL" ) ), 1 1 1 0, \ - when( vis_condition );, \ - name itemName##"_otherPlayer"; ANIM_STATES( 1 1 1 ) ) - -#define INFO_BAR_TAG( tagName, tagNum, alpha, vis_condition ) \ - /*BG FOR VARIABLE NAME*/ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( INFO_BAR_STRUCTURE_X_START, \ - ( (INFO_BAR_Y_START+(INFO_BAR_SET_HEIGHT*tagNum)) + dvarInt( "ui_slideUpDistance" ) ), \ - VARIABLEBAR_TAGDISPLAY_LENGTH, \ - 38, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "white", 1 1 1 (alpha/10), \ - when( vis_condition );, \ - name tagName; ANIM_STATES_FOR_BG( 1 1 1, 0.1 ) ) \ - /*BG FOR TEXT */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( INFO_BAR_STRUCTURE_X_START+VARIABLEBAR_TAGDISPLAY_LENGTH+ 236 ), \ - ( (INFO_BAR_Y_START+(INFO_BAR_SET_HEIGHT*tagNum)) + dvarInt( "ui_slideUpDistance" ) ), \ - VARIABLEBAR_TAGDISPLAY_LENGTH-32, \ - 38, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "white", 0 0 0 (alpha*0.03), \ - when( vis_condition );, \ - name tagName; ANIM_STATES_FOR_BG( 0 0 0, 0.03 ) ) \ - /*BG FOR INFO BARS*/ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (INFO_BAR_STRUCTURE_X_START+VARIABLEBAR_TAGDISPLAY_LENGTH+1), \ - ( (INFO_BAR_Y_START+(INFO_BAR_SET_HEIGHT*tagNum)) + dvarInt( "ui_slideUpDistance" ) ), \ - (COMBAT_RECORD_WIDTH-VARIABLEBAR_TAGDISPLAY_LENGTH-184), \ - 19, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "white", 1 1 1 (alpha/10), \ - when( vis_condition ), \ - name tagName; ANIM_STATES_FOR_BG( 1 1 1, 0.1 ) ) \ - /*BG IMAGE FOR INFO BARS*/ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (INFO_BAR_STRUCTURE_X_START+VARIABLEBAR_TAGDISPLAY_LENGTH+1), \ - ( (INFO_BAR_Y_START+(INFO_BAR_SET_HEIGHT*tagNum)) + dvarInt( "ui_slideUpDistance" ) ), \ - (COMBAT_RECORD_WIDTH-VARIABLEBAR_TAGDISPLAY_LENGTH-184), \ - 19, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "menu_mp_bar_shadow", 0 0 0 (alpha*0.2), \ - when( vis_condition ), \ - name tagName; ANIM_STATES_FOR_BG( 0 0 0, 0.2 ) ) \ - /*BG FOR FRIEND INFO BARS*/ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (INFO_BAR_STRUCTURE_X_START+VARIABLEBAR_TAGDISPLAY_LENGTH+1), \ - ( (INFO_BAR_Y_START+(INFO_BAR_SET_HEIGHT*tagNum))+ 19 + dvarInt( "ui_slideUpDistance" ) ), \ - (COMBAT_RECORD_WIDTH-VARIABLEBAR_TAGDISPLAY_LENGTH-184), \ - 19, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "white", 0 0 0 (alpha/10), \ - when( vis_condition ), \ - name tagName; ANIM_STATES_FOR_BG( 0 0 0, 0.1 ) ) \ - /*BG IMAGE FOR FRIEND INFO BARS*/ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (INFO_BAR_STRUCTURE_X_START+VARIABLEBAR_TAGDISPLAY_LENGTH+1), \ - ( (INFO_BAR_Y_START+(INFO_BAR_SET_HEIGHT*tagNum))+ 19 + dvarInt( "ui_slideUpDistance" ) ), \ - (COMBAT_RECORD_WIDTH-VARIABLEBAR_TAGDISPLAY_LENGTH-184), \ - 19, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "menu_mp_bar_shadow", 0 0 0 (alpha*0.2), \ - when( vis_condition ), \ - name tagName; ANIM_STATES_FOR_BG( 0 0 0, 0.2 ) ) \ - /* ITEM NAME*/ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( INFO_BAR_STRUCTURE_X_START, \ - ( (INFO_BAR_Y_START+3+(INFO_BAR_SET_HEIGHT*tagNum)) + dvarInt( "ui_slideUpDistance" ) ), \ - (VARIABLEBAR_TAGDISPLAY_LENGTH-5), \ - 14, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - "@"+getCombatRecordInfoBarTagText( GET_SORTED_ITEM_INDEX( tagNum, 0 ) ), \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_RIGHT, CHOICE_TEXTCOLOR_NO_ALPHA_COMPONENT alpha, \ - when( vis_condition && ( dvarInt("ui_combatCurrViewNum") != CR_VIEW_CAREER_PERSONAL_BESTS ) ), \ - name tagName; ANIM_STATES( CHOICE_TEXTCOLOR_NO_ALPHA_COMPONENT ) ) \ - /* ITEM NAME FOR PERSONAL BESTS */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( INFO_BAR_STRUCTURE_X_START, \ - ( (INFO_BAR_Y_START+10+(INFO_BAR_SET_HEIGHT*tagNum)) + dvarInt( "ui_slideUpDistance" ) ), \ - (VARIABLEBAR_TAGDISPLAY_LENGTH-5), \ - 14, \ - CHOICE_HORIZONTAL_ALIGN, CHOICE_VERTICAL_ALIGN, \ - "@"+getCombatRecordInfoBarTagText( GET_SORTED_ITEM_INDEX( tagNum, 0 ) ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR_NO_ALPHA_COMPONENT alpha, \ - when( vis_condition && ( dvarInt("ui_combatCurrViewNum") == CR_VIEW_CAREER_PERSONAL_BESTS ) ), \ - name tagName; ANIM_STATES( CHOICE_TEXTCOLOR_NO_ALPHA_COMPONENT ) ) \ - /* WEAPON ICON */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( INFO_BAR_STRUCTURE_X_START+5 ), \ - ( (INFO_BAR_Y_START+3+(INFO_BAR_SET_HEIGHT*tagNum)) + dvarInt( "ui_slideUpDistance" ) ), \ - (-70 ), \ - 32, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - getItemImage( GET_SORTED_ITEM_INDEX( tagNum, 0 ) ), 1 1 1 alpha, \ - when( GetImageWidth( getItemImage( GET_SORTED_ITEM_INDEX( tagNum, 0 ) ) ) > 128 && vis_condition && ( dvarInt("ui_combatCurrViewNum") != CR_VIEW_CAREER_PERSONAL_BESTS ) && ( ( dvarString("ui_combatCurrTab") == CR_TAB_WEAPONS ) && ( dvarInt("ui_combatCurrViewNum") != CR_VIEW_WEAPONS_EQUIPMENT_KILLS ) && ( dvarInt("ui_combatCurrViewNum") != CR_VIEW_WEAPONS_EQUIPMENT_TIMES_KILLED_BY ) && ( dvarInt("ui_combatCurrViewNum") != CR_VIEW_WEAPONS_EQUIPMENT_USAGE ) ) ), \ - name tagName; ANIM_STATES( 1 1 1 ); ) \ - /* WEAPON ICON */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( INFO_BAR_STRUCTURE_X_START+5 ), \ - ( (INFO_BAR_Y_START+3+(INFO_BAR_SET_HEIGHT*tagNum)) + dvarInt( "ui_slideUpDistance" ) ), \ - (-45 ), \ - 32, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - getItemImage( GET_SORTED_ITEM_INDEX( tagNum, 0 ) ), 1 1 1 alpha, \ - when( GetImageWidth( getItemImage( GET_SORTED_ITEM_INDEX( tagNum, 0 ) ) ) <= 128 && vis_condition && ( dvarInt("ui_combatCurrViewNum") != CR_VIEW_CAREER_PERSONAL_BESTS ) && ( ( dvarString("ui_combatCurrTab") == CR_TAB_WEAPONS ) && ( dvarInt("ui_combatCurrViewNum") != CR_VIEW_WEAPONS_EQUIPMENT_KILLS ) && ( dvarInt("ui_combatCurrViewNum") != CR_VIEW_WEAPONS_EQUIPMENT_TIMES_KILLED_BY ) && ( dvarInt("ui_combatCurrViewNum") != CR_VIEW_WEAPONS_EQUIPMENT_USAGE ) ) ), \ - name tagName; ANIM_STATES( 1 1 1 ); ) \ - /* KILLSTREAK AND EQUPIMENT ICON */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( INFO_BAR_STRUCTURE_X_START+10 ), \ - ( (INFO_BAR_Y_START+3+(INFO_BAR_SET_HEIGHT*tagNum)) + dvarInt( "ui_slideUpDistance" ) ), \ - 32, \ - 32, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - getItemImage( GET_SORTED_ITEM_INDEX( tagNum, 0 ) ), 1 1 1 alpha, \ - when( GetImageWidth( getItemImage( GET_SORTED_ITEM_INDEX( tagNum, 0 ) ) ) <= 128 && vis_condition && ( dvarInt("ui_combatCurrViewNum") != CR_VIEW_CAREER_PERSONAL_BESTS ) && ( ( dvarString("ui_combatCurrTab") == CR_TAB_KILLSTREAKS ) || ( ( dvarString("ui_combatCurrTab") == CR_TAB_WEAPONS ) && ( dvarInt("ui_combatCurrViewNum") == CR_VIEW_WEAPONS_EQUIPMENT_KILLS || dvarInt("ui_combatCurrViewNum") == CR_VIEW_WEAPONS_EQUIPMENT_USAGE || dvarInt("ui_combatCurrViewNum") == CR_VIEW_WEAPONS_EQUIPMENT_TIMES_KILLED_BY ) ) ) ), \ - name tagName; ANIM_STATES( 1 1 1 ); ) \ - /* KILLSTREAK AND EQUPIMENT ICON */ \ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( INFO_BAR_STRUCTURE_X_START+10 ), \ - ( (INFO_BAR_Y_START+3+(INFO_BAR_SET_HEIGHT*tagNum)) + dvarInt( "ui_slideUpDistance" ) ), \ - (-70 ), \ - 32, \ - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - getItemImage( GET_SORTED_ITEM_INDEX( tagNum, 0 ) ), 1 1 1 alpha, \ - when( GetImageWidth( getItemImage( GET_SORTED_ITEM_INDEX( tagNum, 0 ) ) ) > 128 && vis_condition && ( dvarInt("ui_combatCurrViewNum") != CR_VIEW_CAREER_PERSONAL_BESTS ) && ( ( dvarString("ui_combatCurrTab") == CR_TAB_KILLSTREAKS ) || ( ( dvarString("ui_combatCurrTab") == CR_TAB_WEAPONS ) && ( dvarInt("ui_combatCurrViewNum") == CR_VIEW_WEAPONS_EQUIPMENT_KILLS || dvarInt("ui_combatCurrViewNum") == CR_VIEW_WEAPONS_EQUIPMENT_USAGE || dvarInt("ui_combatCurrViewNum") == CR_VIEW_WEAPONS_EQUIPMENT_TIMES_KILLED_BY ) ) ) ), \ - name tagName; ANIM_STATES( 1 1 1 ); ) - - -#define INFO_BAR_TAGS( vis_condition ) \ - INFO_BAR_TAG( "info_bar_0", 0, 0, ( vis_condition && dvarInt("ui_combatCurrViewNum") != CR_VIEW_CAREER_PERSONAL_BESTS ) ) \ - INFO_BAR_TAG( "info_bar_1", 1, 1, vis_condition ) \ - INFO_BAR_TAG( "info_bar", 2, 1, vis_condition ) \ - INFO_BAR_TAG( "info_bar", 3, 1, vis_condition ) \ - INFO_BAR_TAG( "info_bar", 4, 1, vis_condition ) \ - INFO_BAR_TAG( "info_bar_5", 5, 1, vis_condition ) \ - INFO_BAR_TAG( "info_bar_6", 6, 0, ( vis_condition && dvarInt("ui_combatCurrViewNum") != CR_VIEW_CAREER_PERSONAL_BESTS ) ) - -#define INFO_BARS( vis_condition ) \ - INFO_BAR( "info_bar_0", 0, 0, ( vis_condition && dvarInt("ui_combatCurrViewNum") != CR_VIEW_CAREER_PERSONAL_BESTS ) ) \ - INFO_BAR( "info_bar_1", 1, 1, vis_condition ) \ - INFO_BAR( "info_bar", 2, 1, vis_condition ) \ - INFO_BAR( "info_bar", 3, 1, vis_condition ) \ - INFO_BAR( "info_bar", 4, 1, vis_condition ) \ - INFO_BAR( "info_bar_5", 5, 1, vis_condition ) \ - INFO_BAR( "info_bar_6", 6, 0, ( vis_condition && dvarInt("ui_combatCurrViewNum") != CR_VIEW_CAREER_PERSONAL_BESTS ) ) - -#define RANK_AND_GAMERTAG_OF_COMPARED_PLAYER( x_offset, vis_condition ) \ - /* Player name */ \ - PREPROC_TEXT_DRAW_VIS_EX( x_offset (COMBAT_RECORD_HEIGHT/2-20) 100 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - GetClanTagAndName(), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, INFO_BAR_COLOR_FOR_FRIEND 1, \ - when( dvarbool( "ui_showFriendsCombatRecord" ) && vis_condition );, \ - name "otherPlayerName"; ANIM_STATES( INFO_BAR_COLOR_FOR_FRIEND ) ) \ - /* Label for Comparing with : */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( (x_offset-(getTextWidth( locString( "@MPUI_CR_COMPARING_WITH" ), UI_FONT_NORMAL, TEXTSIZE_DEFAULT ))-25), (COMBAT_RECORD_HEIGHT/2-20), 100, 10, CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - "@MPUI_CR_COMPARING_WITH", \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, INFO_BAR_COLOR_FOR_FRIEND 0, \ - when( vis_condition );, \ - name "otherPlayerName"; ANIM_STATES( INFO_BAR_COLOR_FOR_FRIEND ) ) \ - /* Other Player name */ \ - PREPROC_TEXT_DRAW_VIS_EX( x_offset (COMBAT_RECORD_HEIGHT/2-20) 100 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - dvarString( "selectedFriendName" ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, INFO_BAR_COLOR_FOR_FRIEND 0, \ - when( !dvarbool( "ui_showFriendsCombatRecord" ) && vis_condition );, \ - name "otherPlayerName"; ANIM_STATES( INFO_BAR_COLOR_FOR_FRIEND ) ) \ - /* Other Player rank icon */ \ - PREPROC_SHADER_DRAW_VIS_EX( (x_offset-20) (COMBAT_RECORD_HEIGHT/2-25) 16 16 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN;, \ - tablelookup( "mp/rankIconTable.csv", 0, GET_STAT_FOR_OTHER_PLAYER( "RANK" ), 1+GET_STAT_FOR_OTHER_PLAYER( "PLEVEL" ) ), 1 1 1 0, \ - when( vis_condition );, \ - name "otherPlayerName"; ANIM_STATES( 1 1 1 ) ) - -#define COMBAT_RECORD_BUTTON_PROMPTS( vis_condition ) \ - itemDef { \ - type ITEM_TYPE_TEXT \ - rect (TAB_X_START-3) -10 0 0 CHOICE_HORIZONTAL_ALIGN VERTICAL_ALIGN_BOTTOM \ - text "@PLATFORM_DONE" \ - textfont UI_FONT_NORMAL \ - textscale TEXTSIZE_SMALL \ - textalign ITEM_ALIGN_BOTTOM_LEFT \ - visible vis_condition \ - decoration \ - } \ - -#define CR_LINE_GRAPH \ - /* top line */ \ - PREPROC_SHADER_DRAW( CR_LINE_GRAPH_X_START CR_LINE_GRAPH_Y_START CR_LINE_GRAPH_WIDTH 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", CR_LINE_GRAPH_GRID_LINE_COLOR ) \ - /* plus sign icon */ \ - PREPROC_SHADER_DRAW( (CR_LINE_GRAPH_X_START-CR_LINE_GRAPH_MARGIN/2-10) (CR_LINE_GRAPH_Y_START+1+CR_LINE_GRAPH_MARGIN/4) (CR_LINE_GRAPH_MARGIN/2) (CR_LINE_GRAPH_MARGIN/2) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "kd_chart_plus", 1 1 1 1 ) \ - /* minus sign icon */ \ - PREPROC_SHADER_DRAW( (CR_LINE_GRAPH_X_START-CR_LINE_GRAPH_MARGIN/2-10) (CR_LINE_GRAPH_Y_START+CR_LINE_GRAPH_MARGIN+1+CR_LINE_GRAPH_MARGIN/4) (CR_LINE_GRAPH_MARGIN/2) ((CR_LINE_GRAPH_MARGIN/2)-1) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "kd_chart_minus", 1 1 1 1 ) \ - /* middle line */ \ - PREPROC_SHADER_DRAW( CR_LINE_GRAPH_X_START (CR_LINE_GRAPH_Y_START+CR_LINE_GRAPH_HEIGHT/2) CR_LINE_GRAPH_WIDTH 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", CR_LINE_GRAPH_GRID_LINE_COLOR ) \ - /* bottom line */ \ - PREPROC_SHADER_DRAW( CR_LINE_GRAPH_X_START (CR_LINE_GRAPH_Y_START+CR_LINE_GRAPH_HEIGHT) CR_LINE_GRAPH_WIDTH 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", CR_LINE_GRAPH_GRID_LINE_COLOR ) \ - itemDef \ - { \ - type ITEM_TYPE_OWNERDRAW \ - rect CR_LINE_GRAPH_X_START CR_LINE_GRAPH_Y_START CR_LINE_GRAPH_WIDTH CR_LINE_GRAPH_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - ownerdraw UI_COMBAT_RECORD_LINE_GRAPH \ - dvar ui_combatCurrViewNum \ - visible 1 \ - decoration \ - } - -#define MAX_HISTOGRAM_COMPONENTS 10 -#define CR_MAX_RECENT_PERFORMANCE_GRAPH_VALUES 10 -#define CR_MAX_MATCH_PERFORMANCE_GRAPH_VALUES 10 - -#define HISTOGRAM_COMPONENT( component_number, width, currGametype, isDefaultComponent ) \ - itemDef \ - { \ - name histogram_component \ - type ITEM_TYPE_OWNERDRAW \ - rect (HISTOGRAM_X_START + component_number * HISTOGRAM_WIDTH / MAX_HISTOGRAM_COMPONENTS) HISTOGRAM_Y_START HISTOGRAM_WIDTH HISTOGRAM_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - /* Histogram samples are stored in 'ownerdata' and 'forecolor A' because those */ \ - /* are the only expressions available while still using the rect for placement */ \ - exp ownerdata ( GetCombatRecordHistogramHeight( component_number, currGametype ) ) \ - exp forecolor A( GetCombatRecordHistogramHeight( component_number+1, currGametype ) ) \ - ownerdraw UI_COMBAT_RECORD_HISTOGRAM \ - visible 1 \ - ITEM_STATE( change, ;, ; ) \ - decoration \ - } \ - PREPROC_SHADER_DRAW( (-1+(HISTOGRAM_X_START + component_number*width/MAX_HISTOGRAM_COMPONENTS)) HISTOGRAM_Y_START 1 HISTOGRAM_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", 1 1 1 0.1 ) - -#define HISTOGRAM_HORIZONTAL_GRID_LINE( lineNum ) \ - PREPROC_SHADER_DRAW( (-1+HISTOGRAM_X_START) (HISTOGRAM_Y_START+(lineNum*(HISTOGRAM_HEIGHT)/2)) (HISTOGRAM_WIDTH-HISTOGRAM_WIDTH/10+1) 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", 1 1 1 0.1 ) - -#define HISTOGRAM_MENU( menuName, parentMenuName, xPos, yPos, width, height, currGametype, visArg ) \ - menuDef \ - { \ - name menuName \ - rect xPos yPos width height CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - priority MENU_PRI_ONTOP \ - onOpen \ - { \ - setDvar ui_combatLockScrolling "1"; \ - ITEM_ANIMATE( menuName, "dummy", lockScrolling, 20 ); \ - } \ - onClose{ } \ - onEsc \ - { \ - close self; \ - if(dvarbool(ui_showFriendsCombatRecord)) \ - { \ - open menu_playercard; \ - } \ - else \ - { \ - if ( dvarInt( xblive_basictraining ) ) \ - { \ - open menu_playercard_self_basictraining; \ - } \ - else \ - { \ - open menu_playercard_self; \ - } \ - } \ - close parentMenuName; setdvar ui_combatResetViewDvars "0"; RESET_SELECTED_PLAYER_XUID; \ - } \ - visible visArg \ - HISTOGRAM_COMPONENT( 0, width, currGametype, 0 ) \ - HISTOGRAM_COMPONENT( 1, width, currGametype, 0 ) \ - HISTOGRAM_COMPONENT( 2, width, currGametype, 0 ) \ - HISTOGRAM_COMPONENT( 3, width, currGametype, 0 ) \ - HISTOGRAM_COMPONENT( 4, width, currGametype, 0 ) \ - HISTOGRAM_COMPONENT( 5, width, currGametype, 0 ) \ - HISTOGRAM_COMPONENT( 6, width, currGametype, 0 ) \ - HISTOGRAM_COMPONENT( 7, width, currGametype, 0 ) \ - HISTOGRAM_COMPONENT( 8, width, currGametype, 0 ) \ - /* Vertical Axis */ \ - PREPROC_SHADER_DRAW( -1 0 1 (HISTOGRAM_HEIGHT) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", 1 1 1 0.1 ) \ - /* Vertical Axis Right*/ \ - PREPROC_SHADER_DRAW( (HISTOGRAM_WIDTH-HISTOGRAM_WIDTH/10) 0 1 (HISTOGRAM_HEIGHT) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", 1 1 1 0.1 ) \ - /* Horizontal Axis */ \ - PREPROC_SHADER_DRAW( -1 HISTOGRAM_HEIGHT (HISTOGRAM_WIDTH-HISTOGRAM_WIDTH/10+1) 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", 1 1 1 0.1 ) \ - HISTOGRAM_HORIZONTAL_GRID_LINE( 0 ) \ - HISTOGRAM_HORIZONTAL_GRID_LINE( 1 ) \ - ACTION_HANDLER( menuName ) \ - DUMMY_ITEM_FOR_ANIMATION( menuName, 1 ) \ - } - - -#define HISTOGRAM_INPLACE \ - HISTOGRAM_COMPONENT( 0, HISTOGRAM_WIDTH, (dvarInt("ui_combatHistogramCurrGametype")), 0 ) \ - HISTOGRAM_COMPONENT( 1, HISTOGRAM_WIDTH, (dvarInt("ui_combatHistogramCurrGametype")), 0 ) \ - HISTOGRAM_COMPONENT( 2, HISTOGRAM_WIDTH, (dvarInt("ui_combatHistogramCurrGametype")), 0 ) \ - HISTOGRAM_COMPONENT( 3, HISTOGRAM_WIDTH, (dvarInt("ui_combatHistogramCurrGametype")), 0 ) \ - HISTOGRAM_COMPONENT( 4, HISTOGRAM_WIDTH, (dvarInt("ui_combatHistogramCurrGametype")), 0 ) \ - HISTOGRAM_COMPONENT( 5, HISTOGRAM_WIDTH, (dvarInt("ui_combatHistogramCurrGametype")), 0 ) \ - HISTOGRAM_COMPONENT( 6, HISTOGRAM_WIDTH, (dvarInt("ui_combatHistogramCurrGametype")), 0 ) \ - HISTOGRAM_COMPONENT( 7, HISTOGRAM_WIDTH, (dvarInt("ui_combatHistogramCurrGametype")), 0 ) \ - HISTOGRAM_COMPONENT( 8, HISTOGRAM_WIDTH, (dvarInt("ui_combatHistogramCurrGametype")), 0 ) \ - /* Vertical Axis */ \ - PREPROC_SHADER_DRAW( (-1+HISTOGRAM_X_START) HISTOGRAM_Y_START 1 (HISTOGRAM_HEIGHT) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", 1 1 1 0.1 ) \ - /* Vertical Axis Right*/ \ - PREPROC_SHADER_DRAW( (HISTOGRAM_X_START+HISTOGRAM_WIDTH-HISTOGRAM_WIDTH/10) HISTOGRAM_Y_START 1 (HISTOGRAM_HEIGHT) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", 1 1 1 0.1 ) \ - /* Horizontal Axis */ \ - PREPROC_SHADER_DRAW( (-1+HISTOGRAM_X_START) (HISTOGRAM_Y_START+HISTOGRAM_HEIGHT) (HISTOGRAM_WIDTH-HISTOGRAM_WIDTH/10+1) 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", 1 1 1 0.1 ) \ - HISTOGRAM_HORIZONTAL_GRID_LINE( 0 ) \ - HISTOGRAM_HORIZONTAL_GRID_LINE( 1 ) - -#define TAB_OPEN( menuName ) \ - execNow closemenuImmediate (dvarString("ui_combatCurrViewMenuName")); \ - execNow openMenuImmediate (menuName); \ - setdvar set ui_combatCurrScrollBarPos "0"; - -HISTOGRAM_MENU( recent_performance_histogram, menu_cr_career_recent_performance, HISTOGRAM_X_START, HISTOGRAM_Y_START, HISTOGRAM_WIDTH, HISTOGRAM_HEIGHT, CR_RECENT_PERFORMANCE_INFO, 1 ) - -#define CURRENT_VIEW_NUMBER \ - PREPROC_TEXT_DRAW_VIS( (COMBAT_RECORD_BODY_X_START+500) (COMBAT_RECORD_BODY_Y_START+10) 280 28 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - locstring( "MPUI_COMBAT_RECORD_VIEW_NUMBER", ( dvarInt("ui_combatCurrViewNum") - CR_VIEW_CAREER_SUMMARY ) + 1, CR_CAREER_VIEW_COUNT ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_LEFT, CHOICE_TEXTCOLOR, when( dvarInt("ui_combatCurrTab") == CR_TAB_CAREER ) ) \ - PREPROC_TEXT_DRAW_VIS( (COMBAT_RECORD_BODY_X_START+500) (COMBAT_RECORD_BODY_Y_START+10) 280 28 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - locstring( "MPUI_COMBAT_RECORD_VIEW_NUMBER", ( dvarInt("ui_combatCurrViewNum") - CR_VIEW_WEAPONS_FAV_WEAPON ) + 1, CR_WEAPONS_VIEW_COUNT ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_LEFT, CHOICE_TEXTCOLOR, when( dvarInt("ui_combatCurrTab") == CR_TAB_WEAPONS ) ) \ - PREPROC_TEXT_DRAW_VIS( (COMBAT_RECORD_BODY_X_START+500) (COMBAT_RECORD_BODY_Y_START+10) 280 28 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - locstring( "MPUI_COMBAT_RECORD_VIEW_NUMBER", ( dvarInt("ui_combatCurrViewNum") - CR_VIEW_MATCHES_PERFORMANCE ) + 1, CR_MATCHES_VIEW_COUNT ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_LEFT, CHOICE_TEXTCOLOR, when( dvarInt("ui_combatCurrTab") == CR_TAB_MATCHES ) ) \ - PREPROC_TEXT_DRAW_VIS( (COMBAT_RECORD_BODY_X_START+500) (COMBAT_RECORD_BODY_Y_START+10) 280 28 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - locstring( "MPUI_COMBAT_RECORD_VIEW_NUMBER", ( dvarInt("ui_combatCurrViewNum") - CR_VIEW_KILLSTREAKS_CALLED ) + 1, CR_KILLSTREAKS_VIEW_COUNT ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_LEFT, CHOICE_TEXTCOLOR, when( dvarInt("ui_combatCurrTab") == CR_TAB_KILLSTREAKS ) ) - -#define INIT_VIEW_DVARS \ - if( dvarString( "ui_combatCareerViewMenuName" ) == "" || dvarBool( ui_combatResetViewDvars ) == 0 ){ setDvar ui_combatCareerViewMenuName menu_cr_career_summary; } \ - if( dvarString( "ui_combatWeaponsViewMenuName" ) == "" || dvarBool( ui_combatResetViewDvars ) == 0 ){ setDvar ui_combatWeaponsViewMenuName menu_cr_weapons_favorite_weapon; } \ - if( dvarString( "ui_combatMatchesViewMenuName" ) == "" || dvarBool( ui_combatResetViewDvars ) == 0 ){ setDvar ui_combatMatchesViewMenuName menu_cr_matches_performance; } \ - if( dvarString( "ui_combatKillstreaksViewMenuName" ) == "" || dvarBool( ui_combatResetViewDvars ) == 0 ){ setDvar ui_combatKillstreaksViewMenuName menu_cr_killstreaks_called; } \ - if( dvarString( "ui_combatContractsViewMenuName" ) == "" || dvarBool( ui_combatResetViewDvars ) == 0 ){ setDvar ui_combatContractsViewMenuName menu_cr_contracts_info; } \ - if( dvarString( "ui_combatPrevTabMenuName" ) == "" || dvarBool( ui_combatResetViewDvars ) == 0 ){ setDvar ui_combatPrevTabMenuName menu_cr_contracts_info; } \ - if( dvarString( "ui_combatNextTabMenuName" ) == "" || dvarBool( ui_combatResetViewDvars ) == 0 ){ setDvar ui_combatNextTabMenuName menu_cr_weapons_favorite_weapon; } \ - setDvar ui_combatCurrTab CR_TAB_CAREER; \ - setDvar ui_combatCurrView CR_VIEW_CAREER_SUMMARY; \ - setDvar ui_combatCurrViewNum CR_VIEW_CAREER_SUMMARY; \ - if( dvarBool( ui_combatResetViewDvars ) == 0 ) \ - { setDvar ui_combatComparisonModeOn "0"; setDvar ui_combatStatsMilestonesVis "0"; \ - setdvar ui_combatFileshareTasksComplete "0"; \ - setdvar ui_combatUserHasRecentGames "0"; \ - setdvar ui_combatFileSummaryValid "0"; \ - execnow set selectedRecentGameIndex 0; \ - execnow fileShareClearResults; \ - if( dvarbool("ui_showFriendsCombatRecord") ) \ - { \ - execnow fileShareGetRecentGames ( dvarString( selectedPlayerXuid ) ); \ - } \ - else \ - { \ - execnow fileShareGetRecentGames; \ - } \ - } \ - setDvar ui_combatResetViewDvars "1"; - -#ifdef XENON - #define CR_VIEW_TITLE_AND_VIEW_NUMBER \ - /* Title */ \ - PREPROC_TEXT_DRAW( (-COMBAT_RECORD_WIDTH / 2) (COMBAT_RECORD_BODY_Y_START-5) COMBAT_RECORD_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - locString( "@PLATFORM_TABBED_MENU_TITLE", "@MPUI_" + dvarString( "ui_combatCurrView" ) ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR ) \ - /* Current View Number */ \ - CURRENT_VIEW_NUMBER -#endif //#ifdef XENON - -#ifdef PS3 - #define CR_VIEW_TITLE_AND_VIEW_NUMBER \ - /* Title */ \ - PREPROC_TEXT_DRAW_ALL( (-COMBAT_RECORD_WIDTH / 2) (COMBAT_RECORD_BODY_Y_START-5) COMBAT_RECORD_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - locString( "@PLATFORM_TABBED_MENU_TITLE", "@MPUI_" + dvarString( "ui_combatCurrView" ) ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, \ - UI_FONT_SMALL, ITEM_TEXTSTYLE_NORMAL, 1, ; ) \ - /* Current View Number */ \ - CURRENT_VIEW_NUMBER -#endif //#ifdef PS3 - -#ifdef PC - #define CR_VIEW_TITLE_AND_VIEW_NUMBER \ - /* Current View Number */ \ - CURRENT_VIEW_NUMBER \ - /* Left and right bumper buttons */ \ - SIMPLE_CHOICE_BUTTON_ARROWS_CENTERED( "combat_record_title", 0, COMBAT_RECORD_BODY_Y_START, 240, "@MPUI_" + dvarString( "ui_combatCurrView" ), \ - 1, execkeyhandler BUTTON_RSHLDR, execkeyhandler BUTTON_LSHLDR ) -#endif //#ifdef PC - -#define COMMON_INFO_BAR_ITEMS \ - INFO_BAR_STRUCTURE( 1 ) - -#define CR_CAREER_TAB_COMMON_ITEMS \ - NEW_FRAME( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT ) \ - NEW_FRAME_TITLE( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, "@MPUI_COMBAT_RECORD_CAPS", 1 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_1_X, TAB_1_WIDTH, 1 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_2_X, TAB_2_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_3_X, TAB_3_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_4_X, TAB_4_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_5_X, TAB_5_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_HEADERS \ - COMBAT_RECORD_TAB_BUTTONS \ - /* background */ \ - PREPROC_SHADER_DRAW( (COMBAT_RECORD_BODY_X_START-15) (COMBAT_RECORD_BODY_Y_START+20) (COMBAT_RECORD_WIDTH) 280 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_cr_bkg", 0 0 0 0.2 ) \ - FRIEND_INFO_VIS( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, (dvarBool("ui_showFriendsCombatRecord")) ) \ - PLAYER_INFO_VIS( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, (!dvarBool("ui_showFriendsCombatRecord")) ) \ - ACTION_HANDLER( (dvarString("ui_combatCurrentViewMenuName")) ) - -#define CR_WEAPONS_TAB_COMMMON_ITEMS \ - NEW_FRAME( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT ) \ - NEW_FRAME_TITLE( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, "@MPUI_COMBAT_RECORD_CAPS", 1 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_1_X, TAB_1_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_2_X, TAB_2_WIDTH, 1 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_3_X, TAB_3_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_4_X, TAB_4_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_5_X, TAB_5_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_HEADERS \ - COMBAT_RECORD_TAB_BUTTONS \ - /* background */ \ - PREPROC_SHADER_DRAW( (COMBAT_RECORD_BODY_X_START-15) (COMBAT_RECORD_BODY_Y_START+20) (COMBAT_RECORD_WIDTH) 280 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_cr_bkg", 0 0 0 0.2 ) \ - FRIEND_INFO_VIS( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, (dvarBool("ui_showFriendsCombatRecord")) ) \ - PLAYER_INFO_VIS( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, (!dvarBool("ui_showFriendsCombatRecord")) ) \ - ACTION_HANDLER( (dvarString("ui_combatCurrentViewMenuName")) ) - -#define CR_MATCHES_TAB_COMMMON_ITEMS \ - NEW_FRAME( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT ) \ - NEW_FRAME_TITLE( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, "@MPUI_COMBAT_RECORD_CAPS", 1 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_1_X, TAB_1_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_2_X, TAB_2_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_3_X, TAB_3_WIDTH, 1 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_4_X, TAB_4_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_5_X, TAB_5_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_HEADERS \ - COMBAT_RECORD_TAB_BUTTONS \ - /* background */ \ - PREPROC_SHADER_DRAW( (COMBAT_RECORD_BODY_X_START-15) (COMBAT_RECORD_BODY_Y_START+20) (COMBAT_RECORD_WIDTH) 280 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_cr_bkg", 0 0 0 0.2 ) \ - FRIEND_INFO_VIS( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, (dvarBool("ui_showFriendsCombatRecord")) ) \ - PLAYER_INFO_VIS( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, (!dvarBool("ui_showFriendsCombatRecord")) ) \ - ACTION_HANDLER( (dvarString("ui_combatCurrentViewMenuName")) ) - -#define CR_KILLSTREAKS_TAB_COMMMON_ITEMS \ - NEW_FRAME( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT ) \ - NEW_FRAME_TITLE( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, "@MPUI_COMBAT_RECORD_CAPS", 1 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_1_X, TAB_1_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_2_X, TAB_2_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_3_X, TAB_3_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_4_X, TAB_4_WIDTH, 1 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_5_X, TAB_5_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_HEADERS \ - COMBAT_RECORD_TAB_BUTTONS \ - /* background */ \ - PREPROC_SHADER_DRAW( (COMBAT_RECORD_BODY_X_START-15) (COMBAT_RECORD_BODY_Y_START+20) (COMBAT_RECORD_WIDTH) 280 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_cr_bkg", 0 0 0 0.2 ) \ - FRIEND_INFO_VIS( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, (dvarBool("ui_showFriendsCombatRecord")) ) \ - PLAYER_INFO_VIS( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, (!dvarBool("ui_showFriendsCombatRecord")) ) \ - ACTION_HANDLER( (dvarString("ui_combatCurrentViewMenuName")) ) - -#define CR_CONTRACTS_TAB_COMMMON_ITEMS \ - NEW_FRAME( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT ) \ - NEW_FRAME_TITLE( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, "@MPUI_COMBAT_RECORD_CAPS", 1 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_1_X, TAB_1_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_2_X, TAB_2_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_3_X, TAB_3_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_4_X, TAB_4_WIDTH, 0 ) \ - COMBAT_RECORD_TAB_BG( COMBAT_RECORD_TAB_5_X, TAB_5_WIDTH, 1 ) \ - COMBAT_RECORD_TAB_HEADERS \ - COMBAT_RECORD_TAB_BUTTONS \ - /* background */ \ - PREPROC_SHADER_DRAW( (COMBAT_RECORD_BODY_X_START-15) (COMBAT_RECORD_BODY_Y_START+20) (COMBAT_RECORD_WIDTH) 280 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_cr_bkg", 0 0 0 0.2 ) \ - FRIEND_INFO_VIS( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, (dvarBool("ui_showFriendsCombatRecord")) ) \ - PLAYER_INFO_VIS( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, (!dvarBool("ui_showFriendsCombatRecord")) ) \ - ACTION_HANDLER( (dvarString("ui_combatCurrentViewMenuName")) ) - -#undef ON_ESC_ACTION -#define ON_ESC_ACTION \ - setdvar ui_combatResetViewDvars "0"; \ - RESET_SELECTED_PLAYER_XUID; \ - close self; \ - close match_performance_histogram; \ - close menu_cr_matches_performance; \ - close match_performance_gametypes_list; \ - if(dvarbool(ui_showFriendsCombatRecord)) \ - { \ - open menu_playercard; \ - }else \ - { \ - if ( dvarInt( xblive_basictraining ) ) \ - { \ - open menu_playercard_self_basictraining; \ - } \ - else \ - { \ - open menu_playercard_self; \ - } \ - } - -#define CR_VIEW_MENU_TEMPLATE( menuName, currViewNum, previousViewMenuName, nextViewMenuName, currTabNum, prevTabMenuName, nextTabMenuName, onOpenArg, onCloseArg ) \ - name menuName \ - rect SLIDER_RECT_ORIGIN 640 480 \ - focuscolor COLOR_FOCUSED \ - style WINDOW_STYLE_FILLED \ - priority MENU_PRI_ONTOP \ - control MENU_CONTROL_OPENER \ - soundloop MENU_MUSIC \ - openSlideSpeed DEFAULT_SLIDE_IN_SPEED \ - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED \ - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT \ - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT \ - onFocus \ - { \ - activateBlur; \ - } \ - onOpen \ - { \ - execNow set ui_combatRecordOpen "1"; \ - setDvar ui_combatLockScrolling "1"; \ - ITEM_ANIMATE( menuName, "dummy", lockScrolling, 20 ); \ - setdvar ui_combatCurrentViewMenuName menuName; \ - execNow set ui_combatPreviousViewMenuName previousViewMenuName; \ - execNow set ui_combatNextViewMenuName nextViewMenuName; \ - execNow set ui_combatCurrTab currTabNum; \ - execNow set ui_combatPrevTabMenuName prevTabMenuName; \ - execNow set ui_combatNextTabMenuName nextTabMenuName; \ - execNow set ui_combatCurrView currViewNum; \ - execNow "UpdateCombatRecordView"; \ - setdvar ui_combatCurrScrollBarPos "0"; \ - if( CAN_COMPARISON_MODE_BE_TURNED_ON ) \ - { \ - ADJUST_OTHER_PLAYER_INFO_BARS( menuName ) \ - } \ - onOpenArg; \ - } \ - onClose \ - { \ - onCloseArg; \ - execNow set ui_combatRecordOpen "0"; \ - deactivateBlur; \ - } \ - onEsc \ - { \ - ON_ESC_ACTION \ - } \ - /* dummy item for animation purposes */ \ - DUMMY_ITEM_FOR_ANIMATION( (dvarString("ui_combatCurrentViewMenuName")), 1 ) \ - NEW_FRAME_BACK_BUTTON_ACTION( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, ON_ESC_ACTION ) - - -#define CONTAINER_BOX_WIDTH 250 - -{ - -/* ----------------------------------Combat record tab "Career", view "Summary"------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_career_summary, CR_VIEW_CAREER_SUMMARY, menu_cr_career_personal_bests, menu_cr_career_recent_performance, CR_TAB_CAREER, (dvarString("ui_combatContractsViewMenuName")), (dvarString("ui_combatWeaponsViewMenuName")), execnow assertDWConnection; INIT_VIEW_DVARS, ; ) - - - CR_CAREER_TAB_COMMON_ITEMS - CR_VIEW_TITLE_AND_VIEW_NUMBER - -#define SUMMARY_X_START (COMBAT_RECORD_BODY_X_START+10) -#define SUMMARY_DESC_Y_START (COMBAT_RECORD_BODY_Y_START+122) - -#define SUMMARY_DESC_TEXT_BG_COLOR 0 0 0 0.1 - - /* Left container box 1 */ - PREPROC_SHADER_DRAW( SUMMARY_X_START (COMBAT_RECORD_BODY_Y_START+25) CONTAINER_BOX_WIDTH 233 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - /* Big rank icon */ - SUMMARY_RANK_ICON( (SUMMARY_X_START+(CONTAINER_BOX_WIDTH/2)-50), (COMBAT_RECORD_BODY_Y_START+30), tablelookup( "mp/rankIconTable.csv", 0, GET_STAT( "RANK" ), 1+GET_STAT( "PLEVEL" ) ), 1 ) - /* Rank name */ - PREPROC_TEXT_DRAW_VIS( SUMMARY_X_START (COMBAT_RECORD_BODY_Y_START+135) CONTAINER_BOX_WIDTH 17 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - "@"+tableLookup( "mp/rankTable.csv", 0, GET_STAT( "RANK" ), 5), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, 1 ) - /* BG for "Time Played" */ - PREPROC_SHADER_DRAW( SUMMARY_X_START (SUMMARY_DESC_Y_START+36) CONTAINER_BOX_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Label for "Time Played" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+42) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_TIME_PLAYED_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Time Played */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+183) (SUMMARY_DESC_Y_START+42) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - secondsAsTime( GET_STAT( "TIME_PLAYED_TOTAL" )) , - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* Label for "Total Wins" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+62) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locstring( "MPUI_TOTAL_WINS_CAPS" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Total Wins */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+183) (SUMMARY_DESC_Y_START+62) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_STAT( "WINS" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* BG for "Losses" */ - PREPROC_SHADER_DRAW( SUMMARY_X_START (SUMMARY_DESC_Y_START+76) CONTAINER_BOX_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Label for "Losses" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+82) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locstring( "MPUI_TOTAL_LOSSES_CAPS" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Losses */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+183) (SUMMARY_DESC_Y_START+82) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_STAT( "LOSSES" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* Label for "Ratio" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+102) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locstring( "MPUI_RATIO_CAPS" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Ratio */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+183) (SUMMARY_DESC_Y_START+102) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - getFloatAsFormattedString( ( GET_STAT( "WLRATIO" ) / 1000.0 ), 2 ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* BG for "Best Streak" */ - PREPROC_SHADER_DRAW( SUMMARY_X_START (SUMMARY_DESC_Y_START+116) CONTAINER_BOX_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Label for "Best Streak" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+10) (SUMMARY_DESC_Y_START+122) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locstring( "MPUI_BEST_STREAK_CAPS" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Best Streak */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_X_START+183) (SUMMARY_DESC_Y_START+122) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_HIGHEST_STAT( "WIN_STREAK" ) , - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - -#define SUMMARY_RIGHT_X_START (SUMMARY_X_START+CONTAINER_BOX_WIDTH+20) - - /* Right container box */ - PREPROC_SHADER_DRAW( (SUMMARY_RIGHT_X_START) (COMBAT_RECORD_BODY_Y_START+25) CONTAINER_BOX_WIDTH 233 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - /* Image for Stack of chips */ - PREPROC_SHADER_DRAW( (SUMMARY_RIGHT_X_START-3) (COMBAT_RECORD_BODY_Y_START+10) 256 256 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "playlist_wager_highroller_bw", 1 1 1 0.1 ) - /* BG for "Career Earnings" */ - PREPROC_SHADER_DRAW( (SUMMARY_RIGHT_X_START) (SUMMARY_DESC_Y_START+56) CONTAINER_BOX_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Label for "Career Earnings" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+10) (SUMMARY_DESC_Y_START+62) 100 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_LIFETIME_EARNINGS_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Career Earnings */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+183) (SUMMARY_DESC_Y_START+62) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - locString( "@MENU_POINTS", ( GET_STAT( "CODPOINTS" ) + GET_STAT( "CURRENCYSPENT" ) ) ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_GREEN_RGB 1, 1 ) - /* Label for "Wager Earnings" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+10) (SUMMARY_DESC_Y_START+82) 100 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_WAGER_MATCH_EARNINGS_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Wager Earnings */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+183) (SUMMARY_DESC_Y_START+82) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN , 0 0, - locString( "@MENU_POINTS", GET_STAT( "LIFETIME_EARNINGS" ) ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, NEW_FRAME_GREEN_RGB 1, 1 ) - /* BG for "Single Events Played" */ - PREPROC_SHADER_DRAW( (SUMMARY_RIGHT_X_START) (SUMMARY_DESC_Y_START+96) CONTAINER_BOX_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Label for "Single Events Played" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+10) (SUMMARY_DESC_Y_START+102) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_SINGLE_EVENTS_PLAYED_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Single Events Played */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+183) (SUMMARY_DESC_Y_START+102) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetNumWagerMatchesPlayed(), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* Label for "Single Events Won" */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+10) (SUMMARY_DESC_Y_START+122) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_SINGLE_EVENTS_WON_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Single Events Won */ - PREPROC_TEXT_DRAW_VIS( (SUMMARY_RIGHT_X_START+183) (SUMMARY_DESC_Y_START+122) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetNumWagerMatchesWon(), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - -#undef PRESTIGE_AVAIL -#define PRESTIGE_AVAIL (GET_STAT("PLEVEL") < MAX_PRESTIGE && GET_STAT("RANKXP") == int(tableLookup("mp/rankTable.csv",0,MAX_RANK,7))) -#undef PRESTIGE_NEXT -#define PRESTIGE_NEXT (GET_STAT("PLEVEL") < MAX_PRESTIGE && GET_STAT("RANK") == MAX_RANK) -#undef PRESTIGE_FINISH -#define PRESTIGE_FINISH (GET_STAT("PLEVEL") == MAX_PRESTIGE) - -#undef CAN_RANK_UP -#define CAN_RANK_UP (GET_STAT("RANK") < MAX_RANK || GET_STAT("PLEVEL") < MAX_PRESTIGE) - -#define RANKTABLE_COL_MINXP 2 -#define RANKTABLE_COL_XP_TO_NEXT 3 -#define RANKTABLE_COL_MAX_XP 7 - -#define XP_BAR_X ( -COMBAT_RECORD_WIDTH / 2 + 80 ) -#define XP_BAR_Y (FRAME_DEFAULT_HEIGHT/2-32) -#define XP_BAR_BG_WIDTH (FRAME_DEFAULT_WIDTH-135) -#define XP_BAR_HEIGHT 20 - -#define PLAYER_RANK GET_STAT( "RANK" ) -#define PLAYER_PRESTIGE GET_STAT( "PLEVEL" ) -#define PLAYER_RANKXP GET_STAT( "RANKXP" ) - -#define XP_TO_NEXT_RANK int( tableLookup( "mp/rankTable.csv", 0, PLAYER_RANK, RANKTABLE_COL_XP_TO_NEXT ) ) -#define MINXP_FOR_CURR_RANK int( tableLookup( "mp/rankTable.csv", 0, PLAYER_RANK, RANKTABLE_COL_MINXP ) ) -#define NEXT_LEVEL ( tablelookup( "mp/ranktable.csv", 0, GET_STAT( "RANK" ) + 1, 14 ) ) - -#define XP_BAR_WIDTH ( ( ( PLAYER_RANKXP - MINXP_FOR_CURR_RANK ) / XP_TO_NEXT_RANK ) * XP_BAR_BG_WIDTH ) - -#define XP_NEEDED_TO_LEVEL_UP \ - locString( "MPUI_AAR_XP_NEEDED_CAPS",int( tableLookup( "mp/rankTable.csv", 0, PLAYER_RANK, RANKTABLE_COL_MAX_XP ) - PLAYER_RANKXP ) ) - - /* BACKGROUND FOR XP BAR */ - PREPROC_SHADER_DRAW_VIS_EX( XP_BAR_X XP_BAR_Y XP_BAR_BG_WIDTH XP_BAR_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "white", BG_BACKCOLOR, - when( CAN_RANK_UP ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( XP_BAR_X XP_BAR_Y XP_BAR_BG_WIDTH XP_BAR_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "menu_mp_bar_shadow", 1 1 1 0.2, - when( CAN_RANK_UP ), ; ) - /* XP BAR */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( XP_BAR_X, - XP_BAR_Y, - ( XP_BAR_WIDTH ), - XP_BAR_HEIGHT, - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "menu_mp_combatrecord_bar", BAR_COLOR, - when( CAN_RANK_UP ), - ; ) - /* Tiny arrow at xp bar end */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( XP_BAR_X + XP_BAR_WIDTH - 5 ), - (XP_BAR_Y+XP_BAR_HEIGHT), - 10, - 10, - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "ui_arrow_right", BAR_COLOR, - when( CAN_RANK_UP ), - rotation -90; ) - /* Label for "NEXT LEVEL" */ - PREPROC_TEXT_DRAW( (XP_BAR_X-55) (XP_BAR_Y+4) 10 XP_BAR_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@MPUI_NEXT_LEVEL_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, CHOICE_TEXTCOLOR ) - /* value for XP NEEDED to next level */ - PREPROC_TEXT_DRAW_VIS( (XP_BAR_X+5) (XP_BAR_Y+4) 10 XP_BAR_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, XP_NEEDED_TO_LEVEL_UP, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, CHOICE_TEXTCOLOR, when( CAN_RANK_UP ) ) - /* next level */ - PREPROC_TEXT_DRAW_VIS( (XP_BAR_X+XP_BAR_BG_WIDTH+3) (XP_BAR_Y+2) 17 17 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, int( NEXT_LEVEL ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( CAN_RANK_UP && PRESTIGE_NEXT==0 ) ) - PREPROC_TEXT_DRAW_VIS( (XP_BAR_X+XP_BAR_BG_WIDTH+3) (XP_BAR_Y+2) 17 17 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "1", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( CAN_RANK_UP && PRESTIGE_NEXT ) ) - /* next level rank icon */ - RANK_ICON_ADV( (XP_BAR_X+XP_BAR_BG_WIDTH+6+getTextWidth( NEXT_LEVEL, CHOICE_TEXTFONT, TEXTSIZE_DEFAULT )), (XP_BAR_Y+2), HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - tablelookup( "mp/rankIconTable.csv", 0, PLAYER_RANK+1, PLAYER_PRESTIGE+1 ), - when( CAN_RANK_UP && PRESTIGE_NEXT==0 ) ) - RANK_ICON_ADV( (XP_BAR_X+XP_BAR_BG_WIDTH+6+getTextWidth( "1", CHOICE_TEXTFONT, TEXTSIZE_DEFAULT )), (XP_BAR_Y+2), HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - tablelookup( "mp/rankIconTable.csv", 0, 0, PLAYER_PRESTIGE+2 ), - when( CAN_RANK_UP && PRESTIGE_NEXT ) ) - - #include "ui/safearea.menu" - } - -/* ----------------------------------Combat record tab "Career", view "Recent Performance"------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_career_recent_performance, CR_VIEW_CAREER_RECENT_PERFORMANCE, menu_cr_career_summary, menu_cr_career_personal_bests, - CR_TAB_CAREER, (dvarString("ui_combatContractsViewMenuName")), (dvarString("ui_combatWeaponsViewMenuName")), - setdvar ui_combatHistogramCurrGametype CR_RECENT_PERFORMANCE_INFO;, ; ) - - CR_CAREER_TAB_COMMON_ITEMS - CR_VIEW_TITLE_AND_VIEW_NUMBER - - /* Label for "SCORE" */ - PREPROC_TEXT_DRAW( (-COMBAT_RECORD_WIDTH / 2) (COMBAT_RECORD_BODY_Y_START+30) COMBAT_RECORD_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_SCORE_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR ) - - /* Maximum Score */ - PREPROC_TEXT_DRAW_VIS( (HISTOGRAM_LABELS_X_START-20) (HISTOGRAM_LABELS_Y_START) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetCombatRecordMinMaxScore( RECENT_PERFORMANCE_HISTOGRAM, RETURN_MAX_SCORE ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_RIGHT, CHOICE_TEXTCOLOR, 1 ) - - /* Minimum Score */ - PREPROC_TEXT_DRAW_VIS( (HISTOGRAM_LABELS_X_START-20) (HISTOGRAM_LABELS_Y_START+HISTOGRAM_HEIGHT) 60 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetCombatRecordMinMaxScore( RECENT_PERFORMANCE_HISTOGRAM, RETURN_MIN_SCORE ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_RIGHT, CHOICE_TEXTCOLOR, 1 ) - - /* Label for "kd ratio" */ - PREPROC_TEXT_DRAW( (-COMBAT_RECORD_WIDTH / 2) (CR_LINE_GRAPH_Y_START-20) COMBAT_RECORD_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_KILL_DEATH_RATIO_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR ) - - /* Display "Not Enough data" if user has not played atleast 2 matches */ - PREPROC_TEXT_DRAW_VIS_EX( (HISTOGRAM_X_START) (HISTOGRAM_Y_START+HISTOGRAM_HEIGHT+7) (HISTOGRAM_WIDTH-(HISTOGRAM_WIDTH/10)) HISTOGRAM_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_NOT_ENOUGH_DATA", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_CENTER, CHOICE_TEXTCOLOR_NO_ALPHA_COMPONENT 0.5, when( GET_SORTED_ITEM_INDEX( CR_MAX_RECENT_PERFORMANCE_GRAPH_VALUES, 1 ) < 2 ) , autowrapped; ) - - - CR_LINE_GRAPH - - itemDef - { - type ITEM_TYPE_OWNERDRAW_TEXT - rect (CR_LINE_GRAPH_X_START+5) (CR_LINE_GRAPH_Y_START-35) CR_LINE_GRAPH_WIDTH CR_LINE_GRAPH_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - textscale TEXTSIZE_DEFAULT - textfont CHOICE_TEXTFONT - forecolor CHOICE_TEXTCOLOR - ownerdraw UI_COMBAT_RECORD_LINE_GRAPH_GAMETYPES - visible 1 - decoration - } - - itemDef - { - type ITEM_TYPE_OWNERDRAW_TEXT - rect (CR_LINE_GRAPH_X_START+5) (CR_LINE_GRAPH_Y_START+CR_LINE_GRAPH_HEIGHT+20) CR_LINE_GRAPH_WIDTH CR_LINE_GRAPH_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - textscale TEXTSIZE_DEFAULT - textfont CHOICE_TEXTFONT - forecolor CHOICE_TEXTCOLOR - ownerdraw UI_COMBAT_RECORD_LINE_GRAPH_VALUES - visible 1 - decoration - } - - /* Display "Not Enough data" if user has not played atleast 2 matches */ - PREPROC_TEXT_DRAW_VIS_EX( (CR_LINE_GRAPH_X_START) (CR_LINE_GRAPH_Y_START-10) CR_LINE_GRAPH_WIDTH CR_LINE_GRAPH_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_NOT_ENOUGH_DATA", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR_NO_ALPHA_COMPONENT 0.5, when( GET_SORTED_ITEM_INDEX( CR_MAX_RECENT_PERFORMANCE_GRAPH_VALUES, 1 ) < 2 ) , autowrapped; ) - - HISTOGRAM_INPLACE - - #include "ui/safearea.menu" - } - -#define LOADOUT_FONT_SMALL 0.28 - -#define WEAPON_ALIGN CHOICE_VERTICAL_ALIGN CHOICE_HORIZONTAL_ALIGN - #define WEAPON_WIDTH 150 - #define GRID_LOADOUT_MAX_ITEMS 5 - - #define WEAPON_X_START -360 - #define WEAPON_Y_START 60 - - #define GRID_OFFSET_X 20 - #define GRID_OFFSET_Y 16 - - #define GRID_LOADOUT_HEIGHT (24+(GRID_OFFSET_Y*GRID_LOADOUT_MAX_ITEMS)) - #define DIAGONAL_LINE_H 32 - -#define LOADOUTSLOT_PRIMARY_WEAPON 0 -#define LOADOUTSLOT_SECONDARY_WEAPON 1 -#define LOADOUTSLOT_PRIMARY_GRENADE 2 -#define LOADOUTSLOT_SPECIAL_GRENADE 3 -#define LOADOUTSLOT_EQUIPMENT 4 -#define LOADOUTSLOT_FACEPAINT_PATTERN 5 -#define LOADOUTSLOT_BODY 6 -#define LOADOUTSLOT_SPECIALTY1 7 -#define LOADOUTSLOT_SPECIALTY2 8 - -#define CR_LOADOUT_GRID_VIS( visArg ) \ - /*weapons =============*/ \ - PREPROC_TEXT_DRAW_VIS( WEAPON_X_START WEAPON_Y_START WEAPON_WIDTH 10 WEAPON_ALIGN, 0 0, \ - ( locString("@MPUI_WEAPONS_CAPS") + " - " ), \ - LOADOUT_FONT_SMALL, 0, 0, ITEM_ALIGN_TOP_RIGHT, MEDIUM_GRAY, \ - when( visArg ); ) \ - /* primary weapon */ \ - PREPROC_TEXT_DRAW_VIS_EX( (WEAPON_X_START+WEAPON_WIDTH+2) WEAPON_Y_START WEAPON_WIDTH 30 WEAPON_ALIGN, 0 0, \ - ( locString( GetItemName( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_PRIMARY_WEAPON, 1 ) ) ) ), \ - LOADOUT_FONT_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, \ - when( visArg );, autowrapped ) \ - /* second weapon name */ \ - PREPROC_TEXT_DRAW_VIS( (WEAPON_X_START+WEAPON_WIDTH+2) (WEAPON_Y_START+40) WEAPON_WIDTH 30 WEAPON_ALIGN, 0 0, \ - ( locString( GetItemName( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_SECONDARY_WEAPON, 1 ) ) ) ), \ - LOADOUT_FONT_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, \ - when( visArg ); ) \ - /*grenades =============*/ \ - PREPROC_TEXT_DRAW_VIS( WEAPON_X_START (WEAPON_Y_START+60) WEAPON_WIDTH 10 WEAPON_ALIGN, 0 0, \ - ( locString("@MPUI_GRENADES_CAPS") + " - " ), \ - LOADOUT_FONT_SMALL, 0, 0, ITEM_ALIGN_TOP_RIGHT, MEDIUM_GRAY, \ - when( visArg ); ) \ - /* primary grenade name */ \ - PREPROC_TEXT_DRAW_VIS( (WEAPON_X_START+WEAPON_WIDTH+2) (WEAPON_Y_START+60) WEAPON_WIDTH 30 WEAPON_ALIGN, 0 0, \ - ( locString( GetItemName( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_PRIMARY_GRENADE, 1 ) ) ) ), \ - LOADOUT_FONT_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, \ - when( visArg ); ) \ - /* special grenade name */ \ - PREPROC_TEXT_DRAW_VIS( (WEAPON_X_START+WEAPON_WIDTH+2) (WEAPON_Y_START+80) WEAPON_WIDTH 30 WEAPON_ALIGN, 0 0, \ - ( locString( GetItemName( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_SPECIAL_GRENADE, 1 ) ) ) ), \ - LOADOUT_FONT_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, \ - when( visArg ); ) \ - /*equipment =============*/ \ - PREPROC_TEXT_DRAW_VIS( WEAPON_X_START (WEAPON_Y_START+100) WEAPON_WIDTH 10 WEAPON_ALIGN, 0 0, \ - ( locString("@MPUI_EQUIPMENT_CAPS") + " - " ), \ - LOADOUT_FONT_SMALL, 0, 0, ITEM_ALIGN_TOP_RIGHT, MEDIUM_GRAY, \ - when( visArg ); ) \ - /* equipment name */ \ - PREPROC_TEXT_DRAW_VIS( (WEAPON_X_START+WEAPON_WIDTH+2) (WEAPON_Y_START+100) WEAPON_WIDTH 30 WEAPON_ALIGN, 0 0, \ - ( locString( GetItemName( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_EQUIPMENT, 1 ) ) ) ), \ - LOADOUT_FONT_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, \ - when( visArg ); ) - - -#define APP_ALIGN CHOICE_VERTICAL_ALIGN CHOICE_HORIZONTAL_ALIGN -#define APP_WIDTH 100 - -#define APP_X_START 90 -#define APP_Y_START -80 - -#define CR_LOADOUT_APPEARANCE_VIS( visArg ) \ - /*head type =============*/ \ - PREPROC_TEXT_DRAW_VIS( APP_X_START APP_Y_START APP_WIDTH 10 APP_ALIGN, 0 0, \ - ( locString("@MPUI_HEAD_TYPE_CAPS") + " - " ), \ - LOADOUT_FONT_SMALL, 0, 0, ITEM_ALIGN_TOP_RIGHT, MEDIUM_GRAY, \ - when( visArg ); ) \ - /* facepaint pattern */ \ - PREPROC_TEXT_DRAW_VIS( (APP_X_START+APP_WIDTH+2) APP_Y_START APP_WIDTH 30 APP_ALIGN, 0 0, \ - ( locString( GetItemName( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_FACEPAINT_PATTERN, 1 ) ) ) ), \ - LOADOUT_FONT_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, \ - when( visArg ); ) \ - /*body type =============*/ \ - PREPROC_TEXT_DRAW_VIS( APP_X_START (APP_Y_START+20) APP_WIDTH 10 APP_ALIGN, 0 0, \ - ( locString("@MPUI_BODY_TYPE_CAPS") + " - " ), \ - LOADOUT_FONT_SMALL, 0, 0, ITEM_ALIGN_TOP_RIGHT, MEDIUM_GRAY, \ - when( visArg ); ) \ - /* armor */ \ - PREPROC_TEXT_DRAW_VIS( (APP_X_START+APP_WIDTH+2) (APP_Y_START+20) APP_WIDTH 30 APP_ALIGN, 0 0, \ - ( locString( GetItemName( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_BODY, 1 ) ) ) ), \ - LOADOUT_FONT_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, \ - when( visArg ); ) - - -#define SPECIALTY_LOADOUT_ALIGN CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN -#define SPECIALTY_LOADOUT_WIDTH 100 - -#define SPECIALTY_IMAGE_X 130 -#define SPECIALTY_IMAGE_Y 30 -#define SPECIALTY_IMAGE_WIDTH 37 - -#define SPECIALTY_TITLE_X (SPECIALTY_IMAGE_X+SPECIALTY_IMAGE_WIDTH+10) -#define SPECIALTY_TITLE_Y SPECIALTY_IMAGE_Y - -#define SPECIALTY_DESC_X SPECIALTY_TITLE_X -#define SPECIALTY_DESC_Y (SPECIALTY_TITLE_Y+15) - -#define SPECIALTY_Y_OFFSET 80 - -#define SPECIALTY_DESC_TEXTSIZE 0.24 - -#define LOCAL_SPECIALTY( origin, ptext, visArg ) \ - PREPROC_TEXT_DRAW_ALL( origin SPECIALTY_LOADOUT_WIDTH 18 SPECIALTY_LOADOUT_ALIGN, 0 0, \ - ptext, 0.3, 0, 0, \ - ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, UI_FONT_BOLD,\ - ITEM_TEXTSTYLE_NORMAL, when( visArg );, ; ) - -#define CR_LOADOUT_SPECIALTIES_VIS( visArg ) \ - /* specialty 1 name ------------- */ \ - LOCAL_SPECIALTY( SPECIALTY_TITLE_X SPECIALTY_TITLE_Y, "@" + GetItemName( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_SPECIALTY1, 1 ) ), visArg ) \ - /* specialty 1 icon */ \ - PREPROC_SHADER_DRAW_VIS_EX( SPECIALTY_IMAGE_X SPECIALTY_IMAGE_Y SPECIALTY_IMAGE_WIDTH SPECIALTY_IMAGE_WIDTH SPECIALTY_LOADOUT_ALIGN, \ - GetItemImage( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_SPECIALTY1, 1 ) ), 1 1 1 0.75, \ - when( visArg ), ; ) \ - /* specialty 1 desc */ \ - PREPROC_TEXT_DRAW_ALL( SPECIALTY_DESC_X SPECIALTY_DESC_Y SPECIALTY_LOADOUT_WIDTH 16 SPECIALTY_LOADOUT_ALIGN, 0 0, \ - "@"+GetItemDesc( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_SPECIALTY1, 1 ) ), \ - SPECIALTY_DESC_TEXTSIZE, 0, -2, ITEM_ALIGN_MIDDLE_LEFT, MEDIUM_GRAY, UI_FONT_NORMAL, ITEM_TEXTSTYLE_NORMAL, \ - when( visArg ), autowrapped ) \ - /* specialty 2 name ------------- */ \ - LOCAL_SPECIALTY( SPECIALTY_TITLE_X (SPECIALTY_TITLE_Y+SPECIALTY_Y_OFFSET), "@"+GetItemName( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_SPECIALTY2, 1 ) ), visArg ) \ - /* specialty 2 icon */ \ - PREPROC_SHADER_DRAW_VIS_EX( SPECIALTY_IMAGE_X (SPECIALTY_IMAGE_Y+SPECIALTY_Y_OFFSET) SPECIALTY_IMAGE_WIDTH SPECIALTY_IMAGE_WIDTH SPECIALTY_LOADOUT_ALIGN, \ - GetItemImage( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_SPECIALTY2, 1 ) ), 1 1 1 0.75, \ - when( visArg ), ; ) \ - /* specialty 2 desc */ \ - PREPROC_TEXT_DRAW_ALL( SPECIALTY_DESC_X (SPECIALTY_DESC_Y+SPECIALTY_Y_OFFSET) SPECIALTY_LOADOUT_WIDTH 16 SPECIALTY_LOADOUT_ALIGN, 0 0, \ - "@"+GetItemDesc( GET_SORTED_ITEM_INDEX( LOADOUTSLOT_SPECIALTY2, 1 ) ), \ - SPECIALTY_DESC_TEXTSIZE, 0, -2, ITEM_ALIGN_MIDDLE_LEFT, MEDIUM_GRAY, UI_FONT_NORMAL, ITEM_TEXTSTYLE_NORMAL, \ - when( visArg ), autowrapped ) - -/* ----------------------------------Combat record tab "Career", view "Class Preferences"------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_career_class_preferences, CR_VIEW_CAREER_CLASS_PREFERENCES, menu_cr_career_recent_performance, menu_cr_career_personal_bests, - CR_TAB_CAREER, (dvarString("ui_combatContractsViewMenuName")), (dvarString("ui_combatWeaponsViewMenuName")), - if ( dvarString( ui_faction ) == "" ) - { setdvar ui_faction FIRST_FACTION; } - SET_VIEWER_MODE_COMBAT_RECORD; - VIEWER_SET_PLAYER( customclass3 ); - VIEWER_SET_EQUIP_WEAPON( primary ); - setDvar ui_cr_loadout_slot primary; - VIEWER_SET_PLAYER_CAMERA( player ); - execNow set uiViewer_show 1;, execNow set uiViewer_show 0; ) - - CR_CAREER_TAB_COMMON_ITEMS - CR_VIEW_TITLE_AND_VIEW_NUMBER - - // Circles, loudout titles and lines - #define CIRCLE_COLOR 1 1 1 0.2 - #define CIRCLE_SIZE 12 - #define TEXT_COLOR 1 1 1 0.1 - #define LINE_COLOR 1 1 1 0.05 - #define LINE_WIDTH 1.5 - - #define LOADOUT_CIRCLE_X -85 - #define LOADOUT_CIRCLE_Y 10 - PREPROC_DRAW_LINE( LOADOUT_CIRCLE_X, LOADOUT_CIRCLE_Y, -185, 50, HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, LINE_WIDTH, LINE_COLOR ) - PREPROC_SHADER_DRAW( (LOADOUT_CIRCLE_X-CIRCLE_SIZE/2) (LOADOUT_CIRCLE_Y-CIRCLE_SIZE/2) CIRCLE_SIZE CIRCLE_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, menu_mp_lobby_circle, CIRCLE_COLOR ) - PREPROC_TEXT_DRAW( (LOADOUT_CIRCLE_X+CIRCLE_SIZE/2-15) (LOADOUT_CIRCLE_Y-2) 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@MPUI_LOADOUT_CAPS", 0.28, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, TEXT_COLOR ) - - #define APPEARANCE_CIRCLE_X 65 - #define APPEARANCE_CIRCLE_Y -30 - PREPROC_DRAW_LINE( APPEARANCE_CIRCLE_X, APPEARANCE_CIRCLE_Y, 120, -60, HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, LINE_WIDTH, LINE_COLOR ) - PREPROC_SHADER_DRAW( (APPEARANCE_CIRCLE_X-CIRCLE_SIZE/2) (APPEARANCE_CIRCLE_Y-CIRCLE_SIZE/2) CIRCLE_SIZE CIRCLE_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, menu_mp_lobby_circle, CIRCLE_COLOR ) - PREPROC_TEXT_DRAW( (APPEARANCE_CIRCLE_X-CIRCLE_SIZE/2+15) (APPEARANCE_CIRCLE_Y+2) 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@MPUI_APPEARANCE_CAPS", 0.28, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, TEXT_COLOR ) - - #define PERKS_CIRCLE_X 65 - #define PERKS_CIRCLE_Y 40 - PREPROC_DRAW_LINE( PERKS_CIRCLE_X, PERKS_CIRCLE_Y, 120, 85, HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, LINE_WIDTH, LINE_COLOR ) - PREPROC_SHADER_DRAW( (PERKS_CIRCLE_X-CIRCLE_SIZE/2) (PERKS_CIRCLE_Y-CIRCLE_SIZE/2) CIRCLE_SIZE CIRCLE_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, menu_mp_lobby_circle, CIRCLE_COLOR ) - PREPROC_TEXT_DRAW( (PERKS_CIRCLE_X-CIRCLE_SIZE/2+15) (PERKS_CIRCLE_Y-2) 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@MPUI_PERKS_CAPS", 0.28, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, TEXT_COLOR ) - - CR_LOADOUT_GRID_VIS( 1 ) - CR_LOADOUT_APPEARANCE_VIS( 1 ) - CR_LOADOUT_SPECIALTIES_VIS( 1 ) - -#define PLAYER_MODEL_SIZE 340 - COMBAT_RECORD_PLAYER_MODEL( (-PLAYER_MODEL_SIZE/2), (COMBAT_RECORD_BODY_Y_START-40), PLAYER_MODEL_SIZE ) - - #include "ui/safearea.menu" - } - -/* --------------------Combat record tab "Career", view "Personal Best"------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_career_personal_bests, CR_VIEW_CAREER_PERSONAL_BESTS, menu_cr_career_recent_performance, menu_cr_career_summary, CR_TAB_CAREER, (dvarString("ui_combatContractsViewMenuName")), (dvarString("ui_combatWeaponsViewMenuName")), ;, ; ) - - CR_CAREER_TAB_COMMON_ITEMS - - /* personal bests bg image */ - PREPROC_SHADER_DRAW( (-128) (COMBAT_RECORD_BODY_Y_START+25) 256 256 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_lobby_aar_award_best", 1 1 1 0.05 ) - - COMMON_INFO_BAR_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - -/* ----------------------------------Combat record tab "Weapons", view "Combat Summary"-----------------------------------------------------------------------------*/ - menuDef - { - -#define COMBAT_SUMMARY_X_START (COMBAT_RECORD_BODY_X_START+10) -#define COMBAT_SUMMARY_Y_START (COMBAT_RECORD_BODY_Y_START-10) - -#undef CONTAINER_BOX_WIDTH -#define CONTAINER_BOX_WIDTH 250 - - CR_VIEW_MENU_TEMPLATE( menu_cr_weapons_favorite_weapon, CR_VIEW_WEAPONS_FAV_WEAPON, menu_cr_weapons_equipment_usage, menu_cr_weapons_hitlocHeatmap, CR_TAB_WEAPONS, (dvarString("ui_combatCareerViewMenuName")), (dvarString("ui_combatMatchesViewMenuName")), ;, ; ) - - CR_WEAPONS_TAB_COMMMON_ITEMS - - /* Left container box */ - PREPROC_SHADER_DRAW( COMBAT_SUMMARY_X_START (COMBAT_SUMMARY_Y_START+35) CONTAINER_BOX_WIDTH 140 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - /* BG for "Kills" */ - PREPROC_SHADER_DRAW( (COMBAT_SUMMARY_X_START) (COMBAT_SUMMARY_Y_START+34) CONTAINER_BOX_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Label for "Kills" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+40) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_KILLS_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Kills */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+40) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_STAT( "KILLS" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* Label for "Deaths" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+60) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_DEATHS_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Deaths */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+60) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_STAT( "DEATHS" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* BG for "Kills to deaths Ratio" */ - PREPROC_SHADER_DRAW( (COMBAT_SUMMARY_X_START) (COMBAT_SUMMARY_Y_START+74) CONTAINER_BOX_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Label for "Kills to deaths Ratio" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+80) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_KILL_DEATH_RATIO_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Kills to deaths Ratio */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+80) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - getFloatAsFormattedString( (int(GET_STAT( "KDRATIO" ))/1000), 2 ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* Label for "Assists" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+100) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_ASSISTS_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Assists */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+100) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_STAT( "ASSISTS" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* Label for "Accuracy" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+120) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_ACCURACY_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* BG for "Accuracy" */ - PREPROC_SHADER_DRAW( (COMBAT_SUMMARY_X_START) (COMBAT_SUMMARY_Y_START+114) CONTAINER_BOX_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Accuracy */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+120) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - getFloatAsFormattedString( (int(GET_STAT( "ACCURACY" ))/100), 2 ) + " %", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* Label for "Headshots" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+140) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_HEADSHOTS_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Headshots */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+140) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_STAT( "HEADSHOTS" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* BG for "Best Killstreak" */ - PREPROC_SHADER_DRAW( (COMBAT_SUMMARY_X_START) (COMBAT_SUMMARY_Y_START+154) CONTAINER_BOX_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Label for "Best Killstreak" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+160) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_BEST_KILLSTREAK_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Best Killstreak */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_X_START+10) (COMBAT_SUMMARY_Y_START+160) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_HIGHEST_STAT( "KILL_STREAK" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - -#define COMBAT_SUMMARY_RIGHT_X_START (COMBAT_SUMMARY_X_START+CONTAINER_BOX_WIDTH+20) - - /* Right container box */ - PREPROC_SHADER_DRAW( COMBAT_SUMMARY_RIGHT_X_START (COMBAT_SUMMARY_Y_START+35) CONTAINER_BOX_WIDTH 140 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - /* Label for "Favorite Weapon" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_RIGHT_X_START+10) (COMBAT_SUMMARY_Y_START+40) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_FAVORITE_WEAPON_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, 1 ) - /* Favorite weapon icon */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (COMBAT_SUMMARY_X_START+CONTAINER_BOX_WIDTH+10+CONTAINER_BOX_WIDTH/2-75/2), - (COMBAT_SUMMARY_Y_START+70), - 75, - 32, - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - getItemImage( GET_SORTED_ITEM_INDEX( 0, 1 ) ), 1 1 1 1, 1, ; ) - /* Favorite Weapon Name */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_RIGHT_X_START+10) (COMBAT_SUMMARY_Y_START+110) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@"+getItemName( GET_SORTED_ITEM_INDEX( 0, 1 ) ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, 1 ) - /* BG for "Kills" */ - PREPROC_SHADER_DRAW( (COMBAT_SUMMARY_RIGHT_X_START) (COMBAT_SUMMARY_Y_START+134) CONTAINER_BOX_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Label for "Kills" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_RIGHT_X_START+10) (COMBAT_SUMMARY_Y_START+140) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_KILLS_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Favorite weapon kills */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_RIGHT_X_START+10) (COMBAT_SUMMARY_Y_START+140) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_ITEM_STAT( GET_SORTED_ITEM_INDEX( 0, 1 ), "kills" ) + " " + locString( "MPUI_KILLS_PRE_CAPS" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* Label for "Accuracy" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_RIGHT_X_START+10) (COMBAT_SUMMARY_Y_START+160) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_ACCURACY_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Favorite weapon Accuracy */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_SUMMARY_RIGHT_X_START+10) (COMBAT_SUMMARY_Y_START+160) (CONTAINER_BOX_WIDTH-20) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - getFloatAsFormattedString( float( GET_ITEM_STAT( GET_SORTED_ITEM_INDEX( 0, 1 ), "hits" ) * 10000 )/float( GET_ITEM_STAT( GET_SORTED_ITEM_INDEX( 0, 1 ), "shots" ) )/(100.0), 2 ) + " % ", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - -#undef CR_LINE_GRAPH_X_START -#define CR_LINE_GRAPH_X_START (COMBAT_SUMMARY_X_START+10) -#undef CR_LINE_GRAPH_Y_START -#define CR_LINE_GRAPH_Y_START (COMBAT_RECORD_BODY_Y_START+210) -#undef CR_LINE_GRAPH_WIDTH -#define CR_LINE_GRAPH_WIDTH (CONTAINER_BOX_WIDTH*2+10) -#undef CR_LINE_GRAPH_HEIGHT -#define CR_LINE_GRAPH_HEIGHT 70 - - /* Label for "K/D chart last 5 games" */ - PREPROC_TEXT_DRAW_VIS_EX( COMBAT_SUMMARY_X_START (CR_LINE_GRAPH_Y_START-20) CR_LINE_GRAPH_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_KD_LAST_FIVE_GAMES_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, 1, autowrapped ) - - CR_LINE_GRAPH - - itemDef - { - type ITEM_TYPE_OWNERDRAW_TEXT - rect CR_LINE_GRAPH_X_START (CR_LINE_GRAPH_Y_START+CR_LINE_GRAPH_HEIGHT+20) CR_LINE_GRAPH_WIDTH CR_LINE_GRAPH_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - textscale TEXTSIZE_DEFAULT - textfont CHOICE_TEXTFONT - forecolor CHOICE_TEXTCOLOR - ownerdraw UI_COMBAT_RECORD_LINE_GRAPH_VALUES - visible 1 - decoration - } - - /* Display "Not Enough data" if user has not played atleast 2 matches */ - PREPROC_TEXT_DRAW_VIS_EX( (CR_LINE_GRAPH_X_START) (CR_LINE_GRAPH_Y_START-10) CR_LINE_GRAPH_WIDTH CR_LINE_GRAPH_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_NOT_ENOUGH_DATA", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR_NO_ALPHA_COMPONENT 0.5, when( GET_SORTED_ITEM_INDEX( CR_MAX_RECENT_PERFORMANCE_GRAPH_VALUES, 1 ) < 2 ) , autowrapped; ) - - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - -/* --------------------Combat record tab "Weapons", view "Hit Location Heatmap" ------------------------------------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_weapons_hitlocHeatmap, CR_VIEW_WEAPONS_HIT_LOCATION_HEATMAP, menu_cr_weapons_favorite_weapon, menu_cr_weapons_kdr, CR_TAB_WEAPONS, (dvarString("ui_combatCareerViewMenuName")), (dvarString("ui_combatMatchesViewMenuName")), ;, ; ) - - CR_WEAPONS_TAB_COMMMON_ITEMS - -#define CR_HITLOC_HEATMAP_WIDTH 200 -#define CR_HITLOC_HEATMAP_HEIGHT 256 -#define CR_HITLOC_HEATMAP_X_START (-CR_HITLOC_HEATMAP_WIDTH/2) -#define CR_HITLOC_HEATMAP_Y_START ( COMBAT_RECORD_BODY_Y_START+30 ) - - /* Background for the hitloc heatmap */ - PREPROC_SHADER_DRAW( CR_HITLOC_HEATMAP_X_START CR_HITLOC_HEATMAP_Y_START CR_HITLOC_HEATMAP_WIDTH CR_HITLOC_HEATMAP_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_heatmap_figure", 1 1 1 1 ) - - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect CR_HITLOC_HEATMAP_X_START CR_HITLOC_HEATMAP_Y_START CR_HITLOC_HEATMAP_WIDTH CR_HITLOC_HEATMAP_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - ownerdraw UI_COMBAT_RECORD_HITLOC_HEATMAP - visible 1 - decoration - } - - /* Display "Not Enough data" if user has not played atleast 2 matches */ - PREPROC_TEXT_DRAW_VIS_EX( CR_HITLOC_HEATMAP_X_START (CR_HITLOC_HEATMAP_Y_START+CR_HITLOC_HEATMAP_HEIGHT+2) CR_HITLOC_HEATMAP_WIDTH 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_CR_HITLOC_HEATMAP_DESC", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, 1 , ; ) - - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - - -/* --------------------Combat record tab "Weapons", view "kdr" ------------------------------------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_weapons_kdr, CR_VIEW_WEAPONS_KDR, menu_cr_weapons_hitlocHeatmap, menu_cr_weapons_accuracy, CR_TAB_WEAPONS, (dvarString("ui_combatCareerViewMenuName")), (dvarString("ui_combatMatchesViewMenuName")), ;, ; ) - - CR_WEAPONS_TAB_COMMMON_ITEMS - - COMMON_INFO_BAR_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - -/* --------------------Combat record tab "Weapons", view "accuracy" ------------------------------------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_weapons_accuracy, CR_VIEW_WEAPONS_ACCURACY, menu_cr_weapons_kdr, menu_cr_weapons_kills, CR_TAB_WEAPONS, (dvarString("ui_combatCareerViewMenuName")), (dvarString("ui_combatMatchesViewMenuName")), ;, ; ) - - CR_WEAPONS_TAB_COMMMON_ITEMS - - COMMON_INFO_BAR_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - -/* --------------------Combat record tab "Weapons", view "kills" ------------------------------------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_weapons_kills, CR_VIEW_WEAPONS_KILLS, menu_cr_weapons_accuracy, menu_cr_weapons_deaths, CR_TAB_WEAPONS, (dvarString("ui_combatCareerViewMenuName")), (dvarString("ui_combatMatchesViewMenuName")), ;, ; ) - - CR_WEAPONS_TAB_COMMMON_ITEMS - - COMMON_INFO_BAR_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - -// Disabling the stats milestones button for now -#if 0 - itemDef - { - type ITEM_TYPE_BUTTON - rect -50 ( COMBAT_RECORD_HEIGHT / 2 + 16.5 ) 0 0 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - text "@PLATFORM_STATS_MILESTONES" - textfont UI_FONT_NORMAL - textscale TEXTSIZE_SMALL - textalign ITEM_ALIGN_BOTTOM_LEFT - visible when( !dvarbool( "ui_combatStatsMilestonesVis" ) ) - execKeyInt BUTTON_BACK{ execNow "toggle ui_combatStatsMilestonesVis 0 1" } - decoration - } - - itemDef - { - type ITEM_TYPE_BUTTON - rect -50 ( COMBAT_RECORD_HEIGHT / 2 + 16.5 ) 0 0 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - text "@PLATFORM_HIDE_STATS_MILESTONES" - textfont UI_FONT_NORMAL - textscale TEXTSIZE_SMALL - textalign ITEM_ALIGN_BOTTOM_LEFT - visible when( dvarbool( "ui_combatStatsMilestonesVis" ) ) - execKeyInt BUTTON_BACK{ execNow "toggle ui_combatStatsMilestonesVis 0 1" } - decoration - } -#endif - - #include "ui/safearea.menu" - } - -/* --------------------Combat record tab "Weapons", view "deaths" ------------------------------------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_weapons_deaths, CR_VIEW_WEAPONS_DEATHS, menu_cr_weapons_kills, menu_cr_weapons_headshots, CR_TAB_WEAPONS, (dvarString("ui_combatCareerViewMenuName")), (dvarString("ui_combatMatchesViewMenuName")), ;, ; ) - - CR_WEAPONS_TAB_COMMMON_ITEMS - - COMMON_INFO_BAR_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - -/* --------------------Combat record tab "Weapons", view "headshots" ------------------------------------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_weapons_headshots, CR_VIEW_WEAPONS_HEADSHOTS, menu_cr_weapons_deaths, menu_cr_weapons_times_killed_by, CR_TAB_WEAPONS, (dvarString("ui_combatCareerViewMenuName")), (dvarString("ui_combatMatchesViewMenuName")), ;, ; ) - - CR_WEAPONS_TAB_COMMMON_ITEMS - - COMMON_INFO_BAR_ITEMS - -// Disabling the stats milestones button for now -#if 0 - itemDef - { - type ITEM_TYPE_BUTTON - rect -50 ( COMBAT_RECORD_HEIGHT / 2 + 16.5 ) 0 0 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - text "@PLATFORM_STATS_MILESTONES" - textfont UI_FONT_NORMAL - textscale TEXTSIZE_SMALL - textalign ITEM_ALIGN_BOTTOM_LEFT - visible when( !dvarbool( "ui_combatStatsMilestonesVis" ) ) - execKeyInt BUTTON_BACK{ execNow "toggle ui_combatStatsMilestonesVis 0 1" } - decoration - } - - itemDef - { - type ITEM_TYPE_BUTTON - rect -50 ( COMBAT_RECORD_HEIGHT / 2 + 16.5 ) 0 0 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - text "@PLATFORM_HIDE_STATS_MILESTONES" - textfont UI_FONT_NORMAL - textscale TEXTSIZE_SMALL - textalign ITEM_ALIGN_BOTTOM_LEFT - visible when( dvarbool( "ui_combatStatsMilestonesVis" ) ) - execKeyInt BUTTON_BACK{ execNow "toggle ui_combatStatsMilestonesVis 0 1" } - decoration - } -#endif - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - -/* --------------------Combat record tab "Weapons", view "times killed by" ------------------------------------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_weapons_times_killed_by, CR_VIEW_WEAPONS_TIMES_KILLED_BY, menu_cr_weapons_headshots, menu_cr_weapons_equipment_kills, CR_TAB_WEAPONS, (dvarString("ui_combatCareerViewMenuName")), (dvarString("ui_combatMatchesViewMenuName")), ;, ; ) - - CR_WEAPONS_TAB_COMMMON_ITEMS - - COMMON_INFO_BAR_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - -/* --------------------Combat record tab "Weapons", view "equipment kills" ------------------------------------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_weapons_equipment_kills, CR_VIEW_WEAPONS_EQUIPMENT_KILLS, menu_cr_weapons_times_killed_by, menu_cr_weapons_equipment_times_killed_by, CR_TAB_WEAPONS, (dvarString("ui_combatCareerViewMenuName")), (dvarString("ui_combatMatchesViewMenuName")), ;, ; ) - - CR_WEAPONS_TAB_COMMMON_ITEMS - - COMMON_INFO_BAR_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - -/* --------------------Combat record tab "Weapons", view "equipment killed by" ------------------------------------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_weapons_equipment_times_killed_by, CR_VIEW_WEAPONS_EQUIPMENT_TIMES_KILLED_BY, menu_cr_weapons_equipment_kills, menu_cr_weapons_equipment_usage, CR_TAB_WEAPONS, (dvarString("ui_combatCareerViewMenuName")), (dvarString("ui_combatMatchesViewMenuName")), ;, ; ) - - CR_WEAPONS_TAB_COMMMON_ITEMS - - COMMON_INFO_BAR_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - -/* --------------------Combat record tab "Weapons", view "equipment usage" ------------------------------------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_weapons_equipment_usage, CR_VIEW_WEAPONS_EQUIPMENT_USAGE, menu_cr_weapons_equipment_times_killed_by, menu_cr_weapons_favorite_weapon, CR_TAB_WEAPONS, (dvarString("ui_combatCareerViewMenuName")), (dvarString("ui_combatMatchesViewMenuName")), ;, ; ) - - CR_WEAPONS_TAB_COMMMON_ITEMS - - COMMON_INFO_BAR_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - -/* ----------------------------------Combat record tab "Matches", view "Preferred Match Types"-----------------------------------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_matches_types, CR_VIEW_MATCHES_TYPES, menu_cr_matches_recent_earnings, menu_cr_matches_performance, CR_TAB_MATCHES, (dvarString("ui_combatWeaponsViewMenuName")), (dvarString("ui_combatKillstreaksViewMenuName")), - execNow set ui_combatXboxLivePieChart NON_WAGER_GAMETYPE_PIE_CHART; - execNow set ui_combatWagerPieChart WAGER_GAMETYPE_PIE_CHART;, ; ) - - CR_MATCHES_TAB_COMMMON_ITEMS - CR_VIEW_TITLE_AND_VIEW_NUMBER - -#undef CONTAINER_BOX_WIDTH -#define CONTAINER_BOX_WIDTH 260 - -#define PREFERRED_MATCH_TYPES_BODY_X_START (COMBAT_RECORD_BODY_X_START+10) - - /* Left Dark Gray container box */ - PREPROC_SHADER_DRAW( PREFERRED_MATCH_TYPES_BODY_X_START (COMBAT_RECORD_BODY_Y_START+30) CONTAINER_BOX_WIDTH 260 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - - /* Right dark gray container box */ - PREPROC_SHADER_DRAW( (PREFERRED_MATCH_TYPES_BODY_X_START+CONTAINER_BOX_WIDTH+5) (COMBAT_RECORD_BODY_Y_START+30) CONTAINER_BOX_WIDTH 260 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - - /* Label for "Xbox Live ( "Top 3" ) */ - PREPROC_TEXT_DRAW_VIS( PREFERRED_MATCH_TYPES_BODY_X_START (COMBAT_RECORD_BODY_Y_START+40) CONTAINER_BOX_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@XBOXLIVE_TOP_MATCHES_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, 1 ) - - /* Label for "Wagers ( "Top 3" ) */ - PREPROC_TEXT_DRAW_VIS( (PREFERRED_MATCH_TYPES_BODY_X_START+CONTAINER_BOX_WIDTH+5) (COMBAT_RECORD_BODY_Y_START+40) CONTAINER_BOX_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_TOP_WAGERS_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, 1 ) - -#define CR_PIE_CHART_X_START (COMBAT_RECORD_BODY_X_START+75) -#define CR_PIE_CHART_Y_START (COMBAT_RECORD_BODY_Y_START+60) -#define CR_PIE_CHART_WIDTH 128 -#define CR_PIE_CHART_HEIGHT 128 - -#define NON_WAGER_GAMETYPE 0 -#define WAGER_GAMETYPE 1 -#define TOP 0 -#define MIDDLE 1 -#define BOTTOM 2 - -#define PIE_CHART_TOP_TEXT_COLOR 0.58 0.58 0.58 1 // GRAY -#define PIE_CHART_MIDDLE_TEXT_COLOR 0.78 0.78 0.78 1 // LIGHT GRAY -#define PIE_CHART_BOTTOM_TEXT_COLOR 0.38 0.72 0.72 1 // BLUE - -#define PIE_CHART_TEXT( x, x_offset, gameType, visArg ) \ - PREPROC_TEXT_DRAW_VIS( (x+x_offset) (CR_PIE_CHART_Y_START+CR_PIE_CHART_HEIGHT+20) CONTAINER_BOX_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - GetCombatRecordPieChartText( gameType, TOP ), \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, PIE_CHART_TOP_TEXT_COLOR, visArg ) \ - PREPROC_TEXT_DRAW_VIS( (x+x_offset) (CR_PIE_CHART_Y_START+CR_PIE_CHART_HEIGHT+35) CONTAINER_BOX_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - GetCombatRecordPieChartText( gameType, MIDDLE ) , \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, PIE_CHART_MIDDLE_TEXT_COLOR, visArg ) \ - PREPROC_TEXT_DRAW_VIS( (x+x_offset) (CR_PIE_CHART_Y_START+CR_PIE_CHART_HEIGHT+50) CONTAINER_BOX_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - GetCombatRecordPieChartText( gameType, BOTTOM ) , \ - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, PIE_CHART_BOTTOM_TEXT_COLOR, visArg ) \ - -#define SEPARATION_BETWEEN_PIE_CHARTS CONTAINER_BOX_WIDTH - - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect CR_PIE_CHART_X_START CR_PIE_CHART_Y_START CR_PIE_CHART_WIDTH CR_PIE_CHART_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - ownerdraw UI_COMBAT_RECORD_PIE_CHART - dvar ui_combatXboxLivePieChart - visible when( getTotalMatchesPlayed() > 1 ) - decoration - } - - PIE_CHART_TEXT( PREFERRED_MATCH_TYPES_BODY_X_START, 0, NON_WAGER_GAMETYPE_PIE_CHART, when( getTotalMatchesPlayed() > 1 ) ) - - /* Display "Not Enough data" if user has not played atleast 2 matches */ - PREPROC_TEXT_DRAW_VIS_EX( PREFERRED_MATCH_TYPES_BODY_X_START (COMBAT_RECORD_BODY_Y_START+30) CONTAINER_BOX_WIDTH 260 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_NOT_ENOUGH_DATA", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR_NO_ALPHA_COMPONENT 0.5, when( getTotalMatchesPlayed() < 2 ) , autowrapped; ) - - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect (CR_PIE_CHART_X_START+SEPARATION_BETWEEN_PIE_CHARTS) CR_PIE_CHART_Y_START CR_PIE_CHART_WIDTH CR_PIE_CHART_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - ownerdraw UI_COMBAT_RECORD_PIE_CHART - dvar ui_combatWagerPieChart - visible when( GetNumWagerMatchesPlayed() > 1 ) - decoration - } - - PIE_CHART_TEXT( PREFERRED_MATCH_TYPES_BODY_X_START, SEPARATION_BETWEEN_PIE_CHARTS, WAGER_GAMETYPE_PIE_CHART, when( GetNumWagerMatchesPlayed() > 1 ) ) - - /* Display "Not Enough data" if user has not played atleast 2 matches */ - PREPROC_TEXT_DRAW_VIS_EX( (PREFERRED_MATCH_TYPES_BODY_X_START+CONTAINER_BOX_WIDTH+5) (COMBAT_RECORD_BODY_Y_START+30) CONTAINER_BOX_WIDTH 260 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_NOT_ENOUGH_DATA", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR_NO_ALPHA_COMPONENT 0.5, when( GetNumWagerMatchesPlayed() < 2 ) , autowrapped; ) - - #include "ui/safearea.menu" - } - -/* ----------------------------------Combat record tab "Matches", view "Match Performance"-----------------------------------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_matches_performance, CR_VIEW_MATCHES_PERFORMANCE, menu_cr_matches_recent_earnings, menu_cr_matches_heat_map, CR_TAB_MATCHES, (dvarString("ui_combatWeaponsViewMenuName")), (dvarString("ui_combatKillstreaksViewMenuName")), ;, ; ) - - CR_MATCHES_TAB_COMMMON_ITEMS - CR_VIEW_TITLE_AND_VIEW_NUMBER - -#undef HISTOGRAM_X_START -#undef HISTOGRAM_Y_START -#undef HISTOGRAM_WIDTH -#define HISTOGRAM_WIDTH 300 -#undef HISTOGRAM_HEIGHT -#define HISTOGRAM_HEIGHT 145 - -#undef HISTOGRAM_LABELS_X_START -#undef HISTOGRAM_LABELS_Y_START - -#ifdef CONSOLE -#define HISTOGRAM_X_START (COMBAT_RECORD_BODY_X_START+263) -#define HISTOGRAM_Y_START (COMBAT_RECORD_BODY_Y_START+80) -#define HISTOGRAM_LABELS_X_START (HISTOGRAM_X_START-50) -#define HISTOGRAM_LABELS_Y_START (HISTOGRAM_Y_START+5) -#else // #ifdef CONSOLE -#define HISTOGRAM_X_START (COMBAT_RECORD_BODY_X_START+250) -#define HISTOGRAM_Y_START (COMBAT_RECORD_BODY_Y_START+125) -#define HISTOGRAM_LABELS_X_START (HISTOGRAM_X_START-50) -#define HISTOGRAM_LABELS_Y_START (HISTOGRAM_Y_START+5) -#endif - -#undef CONTAINER_BOX_WIDTH -#define CONTAINER_BOX_WIDTH 330 - - /* Right container box */ - //PREPROC_SHADER_DRAW( (HISTOGRAM_X_START-40) (COMBAT_RECORD_BODY_Y_START+63) CONTAINER_BOX_WIDTH 197 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - - /* Label for "Score" */ - PREPROC_TEXT_DRAW_VIS( HISTOGRAM_X_START (HISTOGRAM_Y_START-15) (HISTOGRAM_WIDTH-HISTOGRAM_WIDTH/10) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "@MPUI_CR_MATCH_PERFORMANCE_HISTOGRAM_TITLE", (tablelookup( "mp/gametypesTable.csv", 0, int(getFeederData( "menu_cr_matches_performance", "cr_listbox_matches", "selection")), 3 )) ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, 1 ) - /* Maximum Score */ - PREPROC_TEXT_DRAW_VIS( (HISTOGRAM_LABELS_X_START) (HISTOGRAM_LABELS_Y_START) 40 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetCombatRecordMinMaxScore( MATCH_PERFORMANCE_HISTOGRAM, RETURN_MAX_SCORE ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_RIGHT, CHOICE_TEXTCOLOR, 1 ) - - /* Minimum Score */ - PREPROC_TEXT_DRAW_VIS( (HISTOGRAM_LABELS_X_START) (HISTOGRAM_LABELS_Y_START+HISTOGRAM_HEIGHT) 40 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetCombatRecordMinMaxScore( MATCH_PERFORMANCE_HISTOGRAM, RETURN_MIN_SCORE ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_RIGHT, CHOICE_TEXTCOLOR, 1 ) - - /* Display "Not Enough data" if user has not played atleast 2 matches */ - PREPROC_TEXT_DRAW_VIS_EX( (HISTOGRAM_X_START) (HISTOGRAM_Y_START+HISTOGRAM_HEIGHT+7) (HISTOGRAM_WIDTH-(HISTOGRAM_WIDTH/10)) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_NOT_ENOUGH_DATA", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_CENTER, CHOICE_TEXTCOLOR_NO_ALPHA_COMPONENT 0.5, when( GET_SORTED_ITEM_INDEX( (dvarInt("ui_combatHistogramCurrGametype")) * CR_MAX_MATCH_PERFORMANCE_GRAPH_VALUES, 1 ) < 2 ) , autowrapped; ) - - HISTOGRAM_INPLACE - -#undef COMBAT_RECORD_LIST_X_START -#define COMBAT_RECORD_LIST_X_START (COMBAT_RECORD_BODY_X_START) -#undef COMBAT_RECORD_LIST_Y_START -#define COMBAT_RECORD_LIST_Y_START (COMBAT_RECORD_BODY_Y_START+60) -#undef LIST_WIDTH -#define LIST_WIDTH 200 -#undef LIST_HEIGHT -#define LIST_HEIGHT 200 - - COMBAT_RECORD_LISTBOX_EX( cr_listbox_matches, FEEDER_COMBAT_RECORD_GAMETYPES, ;, 1, ; ) - - #include "ui/safearea.menu" - } - - menuDef - { - name match_performance_gametypes_list - rect 0 150 640 230 // shrinking height so it doesn't interfere with clicking on the tabs or the back button or the tab bumpers - priority MENU_PRI_ONTOP - visible 1 - onOpen { setDvar ui_combatLockScrolling "1"; - ITEM_ANIMATE( menuName, "dummy", lockScrolling, 20 ); - setfocus cr_listbox_matches; } - onClose { } - - onESC { - close self; - close match_performance_histogram; - close menu_cr_matches_performance; - setdvar ui_combatResetViewDvars "0"; - if(dvarbool(ui_showFriendsCombatRecord)) - { - open menu_playercard; - } - else - { - if ( dvarInt( xblive_basictraining ) ) - { - open menu_playercard_self_basictraining; - } - else - { - open menu_playercard_self; - } - } - RESET_SELECTED_PLAYER_XUID; - } - -#undef COMBAT_RECORD_LIST_X_START -#define COMBAT_RECORD_LIST_X_START (COMBAT_RECORD_BODY_X_START+7) -#undef COMBAT_RECORD_LIST_Y_START -#define COMBAT_RECORD_LIST_Y_START (COMBAT_RECORD_BODY_Y_START+72-160) -#undef LIST_WIDTH -#define LIST_WIDTH 200 -#undef LIST_HEIGHT -#define LIST_HEIGHT 200 - - COMBAT_RECORD_LISTBOX_EX( cr_listbox_matches, FEEDER_COMBAT_RECORD_GAMETYPES, ;, 1, ; ) - - ACTION_HANDLER( "match_performance_gametypes_list" ) - DUMMY_ITEM_FOR_ANIMATION( match_performance_gametypes_list, 1 ) - } - - HISTOGRAM_MENU( match_performance_histogram, CR_TAB_MATCHES, HISTOGRAM_X_START, HISTOGRAM_Y_START, HISTOGRAM_WIDTH, HISTOGRAM_HEIGHT, (dvarInt("ui_combatHistogramCurrGametype")), when( dvarInt( "ui_combatCurrViewNum" ) == CR_VIEW_MATCHES_PERFORMANCE ); ) - -/* ----------------------------------Combat record tab "Matches", view "Heat Map"-----------------------------------------------------------------------------*/ - -#define FILESHARE_TASKS_COMPLETE \ - isTaskInProgress( "LiveFileShareSearch" ) != 1 && isTaskInProgress( "LiveFileGetShareSummary" ) != 1 - -#define FILESHARE_GET_RECENT_GAMES \ - if(dvarbool(ui_showFriendsCombatRecord)) \ - { \ - execnow fileShareGetRecentGames ( dvarString( selectedPlayerXuid ) );\ - } \ - else \ - { \ - execnow fileShareGetRecentGames; \ - } - - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_matches_heat_map, CR_VIEW_MATCHES_HEAT_MAP, menu_cr_matches_performance, menu_cr_matches_recent_earnings, CR_TAB_MATCHES, (dvarString("ui_combatWeaponsViewMenuName")), (dvarString("ui_combatKillstreaksViewMenuName")), FILESHARE_GET_RECENT_GAMES;, ; ) - - CR_MATCHES_TAB_COMMMON_ITEMS - CR_VIEW_TITLE_AND_VIEW_NUMBER - -#define HEAT_MAP_X_START (COMBAT_RECORD_BODY_X_START+270) - -#define HEAT_MAP_Y_START (COMBAT_RECORD_BODY_Y_START+30) - -#define HEAT_MAP_WIDTH 250 -#define HEAT_MAP_HEIGHT 250 - - itemDef - { - name fileShareRecentGames - type ITEM_TYPE_LISTBOX - feeder FEEDER_FILESHARE_SEARCHRESULTS - rect -265 -90 250 230 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - origin 0 0 - elementwidth 30 - elementheight 16 - elementtype LISTBOX_TEXT - textstyle ITEM_TEXTSTYLE_NORMAL - textfont UI_FONT_NORMAL - textscale CHOICE_TEXTSIZE - textalign HORIZONTAL_ALIGN_LEFT - textalignx 12 - forecolor CHOICE_TEXTCOLOR - focusColor CHOICE_TEXTCOLOR - disableColor CHOICE_TEXTCOLOR - #ifdef XENON - selectIcon "ui_button_xenon_3d_a_32x32" - #endif - #ifdef PS3 - selectIcon "ui_button_ps3_x_32x32" - #endif - outlinecolor 1 1 1 1 - elementHighlightColor 0 0 0 1 - elementBackgroundColor NEW_FRAME_TRANSPARENCY - noBlinkingHighlight - modal - usePaging - /* x y w h len horzAlign vertAlign*/ - userarea 1 10 -1 200 18 50 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP - visible 1 - - onListboxSelectionChange - { - if( getFeederData( "count" ) > 1 ) - { - play CHOICE_FOCUS_SOUND; - } - } - doubleclick - { - if( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) && getFeederData( fileID ) != 0 ) - { - execNow set selectedRecentGameIndex (getFeederData("selection") ); - execNow set fsSelectedRecentGameID ( getFeederData( fileID ) ); - execnow set fsSelectedFileName ( getFeederData( name ) ); - execnow set fsIsSelectedFileNameModified ( getFeederData( isModifiedName ) ); - execnow set fsSelectedFileDescription ( getFeederData( description ) ); - execnow set fsIsSelectedFileDescriptionModified ( getFeederData( isModifiedDescription ) ); - open menu_fileshare_myrecentgames_choose; - } - } - } - - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect HEAT_MAP_X_START HEAT_MAP_Y_START HEAT_MAP_WIDTH HEAT_MAP_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - forecolor 1 1 1 1 - ownerdraw UI_DRAWHEATMAP - visible when( int( getFeederData( "fileShareRecentGames", "isSummaryLoaded" ) ) == 1 ) - decoration - } - - FILESHARE_PROGRESS_INDICATOR_SIZE( 130, 20, 64, 64, 0, ( int( getFeederData( "fileShareRecentGames", "isSummaryLoaded" ) ) == 0 ) ) - - FILESHARE_DETAILS_COMBATRECORD( 0, -50, HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, "menu_cr_matches_heat_map", "fileShareRecentGames", 1 ) - - -#define GAME_INFO_X_START (COMBAT_RECORD_BODY_X_START+10) - -#define GAME_INFO_VIS_CONDITION \ - int( getFeederData( "fileShareRecentGames", "isSummaryLoaded" ) ) == 1 - - /* Legend for the heatmap */ - - /* Red box for general deaths */ - PREPROC_SHADER_DRAW_VIS_EX( (GAME_INFO_X_START+15) (COMBAT_RECORD_BODY_Y_START+273) 5 5 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "white", 1 0 0 1, - when( GAME_INFO_VIS_CONDITION ), - name heatmap_info; ITEM_STATE( fadeIn, foreColor 1 0 0 1, ; ) ; ) - - /* Label for "DEATHS" */ - PREPROC_TEXT_DRAW_VIS( (GAME_INFO_X_START+30) (COMBAT_RECORD_BODY_Y_START+270) 100 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MENU_DEATHS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, - when( GAME_INFO_VIS_CONDITION ); - name heatmap_info; ITEM_STATE( fadeIn, foreColor CHOICE_TEXTCOLOR, ; ) ) - - /* Yellow box for player deaths only */ - PREPROC_SHADER_DRAW_VIS_EX( (GAME_INFO_X_START+15) (COMBAT_RECORD_BODY_Y_START+293) 5 5 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "white", 1 1 0 1, - when( GAME_INFO_VIS_CONDITION ), - name heatmap_info; ITEM_STATE( fadeIn, foreColor 1 1 0 1, ; ) ; ) - - /* Label for "YOUR DEATHS ONLY" */ - PREPROC_TEXT_DRAW_VIS( (GAME_INFO_X_START+30) (COMBAT_RECORD_BODY_Y_START+290) 190 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString("MPUI_CR_HEATMAPS_YOUR_DEATHS_ONLY"), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, - when( GAME_INFO_VIS_CONDITION && !dvarBool("ui_showFriendsCombatRecord") ); autoWrapped; - name heatmap_info; ITEM_STATE( fadeIn, foreColor CHOICE_TEXTCOLOR, ; ) ) - - /* Label for "FRIENDS DEATHS ONLY" */ - PREPROC_TEXT_DRAW_VIS( (GAME_INFO_X_START+30) (COMBAT_RECORD_BODY_Y_START+290) 190 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - dvarString("selectedFriendName") + locString("MENU_APOSTROPHE_S")+" "+locString("MPUI_CR_HEATMAPS_DEATHS_ONLY"), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, - when( GAME_INFO_VIS_CONDITION && dvarBool("ui_showFriendsCombatRecord") ); autoWrapped; - name heatmap_info; ITEM_STATE( fadeIn, foreColor CHOICE_TEXTCOLOR, ; ) ) - - itemDef - { - type ITEM_TYPE_TEXT - rect -175 ( COMBAT_RECORD_HEIGHT / 2 + 18 ) 0 0 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - text "@PLATFORM_FILE_OPTIONS" - textfont UI_FONT_NORMAL - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_BOTTOM_LEFT - visible when( dvarbool("ui_combatFileSummaryValid") ) - decoration - } - - #define OPEN_FILE_OPTIONS \ - execnow set fsSelectedFileName (getFileshareGameMapName(dvarInt("selectedRecentGameIndex"))); \ - execNow set fsSelectedRecentGameID ( getFeederData( fileID ) ); \ - execnow set fsIsSelectedFileNameModified 0; \ - execnow set fsSelectedFileDescription (getFileshareGameTypeName(dvarInt("selectedRecentGameIndex"))); \ - execnow set fsIsSelectedFileDescriptionModified 0; \ - open menu_fileshare_myrecentgames_choose; - - - NEW_FRAME_PREVIOUS_MATCH_BUTTON_ACTION( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, "@PLATFORM_SELECT_A_PREVIOUS_MATCH", open menu_cr_matches_heat_map_recent_games; , when( dvarbool( "ui_combatUserHasRecentGames" ) ) ) - NEW_FRAME_FILE_OPTIONS_BUTTON_ACTION( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, "@PLATFORM_FILE_OPTIONS", OPEN_FILE_OPTIONS, when( dvarbool("ui_combatFileSummaryValid") ) ) - - PREPROC_TEXT_DRAW_VIS( (-COMBAT_RECORD_WIDTH / 2) 0 COMBAT_RECORD_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_CR_HEATMAPS_NO_RECENT_MATCHES", TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, - CHOICE_TEXTCOLOR, when( dvarbool("ui_combatFileshareTasksComplete") && !dvarbool("ui_combatUserHasRecentGames") ) ) - - PREPROC_TEXT_DRAW_VIS( (-COMBAT_RECORD_WIDTH / 2) 0 COMBAT_RECORD_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_CR_HEATMAPS_NO_HEATMAP_DATA", TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, - CHOICE_TEXTCOLOR, when( dvarbool("ui_combatFileshareTasksComplete") && !dvarbool("ui_combatFileSummaryValid") && dvarbool("ui_combatUserHasRecentGames") ) ) - - execKeyInt BUTTON_A - { - if( dvarbool("ui_combatFileSummaryValid") ) - { - OPEN_FILE_OPTIONS - } - } - - #include "ui/safearea.menu" - } - - // recent games list for heatmap menu ( in matches tab ) -#define SELECTION_LIST_MENU_X_START 16.5 -#define SELECTION_LIST_MENU_Y_START 0 -#define SELECTION_LIST_MENU_WIDTH (SMALL_CENTER_POPUP_WIDTH - 32) -#define SELECTION_LIST_MENU_HEIGHT SMALL_CENTER_POPUP_HEIGHT - -#undef ON_ESC_ACTION_POPUP -#define ON_ESC_ACTION_POPUP \ - deactivateBlur; \ - setLocalVarBool ui_centerPopup 0; \ - play uin_navigation_sys_close; \ - close self; - - menuDef - { - name menu_cr_matches_heat_map_recent_games - visible 1 - fullscreen 0 - rect (-SMALL_CENTER_POPUP_WIDTH/2) (-SMALL_CENTER_POPUP_HEIGHT/2) SMALL_CENTER_POPUP_WIDTH SMALL_CENTER_POPUP_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - backcolor 0.2 0.2 0.2 0.8 - style WINDOW_STYLE_FRAMED - frame 16 0.5 FRAME_SIDE_ALL - background "menu_mp_lobby_frame_circle" - focusColor COLOR_FOCUSED - priority MENU_PRI_POPUP - popup - onOpen - { - activateBlur; - setLocalVarBool ui_centerPopup 1; - play uin_navigation_sys_open; - } - onClose - { - deactivateBlur; - CENTER_POPUP_ON_CLOSE - setLocalVarBool ui_centerPopup 0; - } - onESC - { - ON_ESC_ACTION_POPUP - } - - /* title text for "SELECT A RECENTLY PLAYED MATCH" */ - PREPROC_TEXT_DRAW( 16.5 (SELECTION_LIST_MENU_Y_START+16.5) SMALL_CENTER_POPUP_WIDTH 10 HORIZONTAL_ALIGN_CENTER CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_CR_SELECT_RECENT_MATCH", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR ) - - PREPROC_SHADER_DRAW_VIS_EX( 0 0 SMALL_CENTER_POPUP_WIDTH (SMALL_CENTER_POPUP_HEIGHT-POPUP_INNER_BG_PAD), "menu_mp_lobby_frame_fade", POPUP_GLOW_WHITE, 1, ; ) - - /* column title "Map" */ - PREPROC_TEXT_DRAW( 40 (SELECTION_LIST_MENU_Y_START+47) SMALL_CENTER_POPUP_WIDTH 10 HORIZONTAL_ALIGN_CENTER CHOICE_VERTICAL_ALIGN, 0 0, - "@MENU_MAP", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR ) - - /* column title "Game Mode" */ - PREPROC_TEXT_DRAW( 130 (SELECTION_LIST_MENU_Y_START+47) SMALL_CENTER_POPUP_WIDTH 10 HORIZONTAL_ALIGN_CENTER CHOICE_VERTICAL_ALIGN, 0 0, - "@MENU_GAME_MODE_PRE", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR ) - - /* column title "Date" */ - PREPROC_TEXT_DRAW( 300 (SELECTION_LIST_MENU_Y_START+47) SMALL_CENTER_POPUP_WIDTH 10 HORIZONTAL_ALIGN_CENTER CHOICE_VERTICAL_ALIGN, 0 0, - "@MENU_DATE", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR ) - -#ifdef PC - #define RECENT_GAMES_LIST_RECT_AND_SCROLL \ - rect SELECTION_LIST_MENU_X_START (SELECTION_LIST_MENU_Y_START+60) (SELECTION_LIST_MENU_WIDTH+16) (SELECTION_LIST_MENU_HEIGHT-75) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - usePaging \ - modal -#else // #ifdef PC - #define RECENT_GAMES_LIST_RECT_AND_SCROLL \ - rect SELECTION_LIST_MENU_X_START (SELECTION_LIST_MENU_Y_START+60) SELECTION_LIST_MENU_WIDTH (SELECTION_LIST_MENU_HEIGHT-75) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - noscrollbars -#endif // #else #ifdef PC - - // List - itemDef - { - name recent_games_list - type ITEM_TYPE_LISTBOX - feeder FEEDER_COMBAT_RECORD_RECENT_GAMES - RECENT_GAMES_LIST_RECT_AND_SCROLL - origin 0 0 - elementwidth 30 - elementheight 16 - elementtype LISTBOX_TEXT - textstyle ITEM_TEXTSTYLE_NORMAL - textfont UI_FONT_NORMAL - textscale TEXTSIZE_SMALL - textalignx 12 - forecolor CHOICE_TEXTCOLOR - focusColor CHOICE_TEXTCOLOR - disableColor CHOICE_TEXTCOLOR -#ifdef XENON - selectIcon "ui_button_xenon_3d_a_32x32" -#endif -#ifdef PS3 - selectIcon "ui_button_ps3_x_32x32" -#endif - selectBorder 0.8 0.95 1 0 - outlinecolor 1 1 1 1 - elementBackgroundColor NEW_FRAME_LT_GREY_RGB 0.2 - elementHighlightColor 0 0 0 1 - noBlinkingHighlight - /* x y len Align */ - columns 3 10 30 32 ITEM_ALIGN_LEFT // MAP - 100 16 32 ITEM_ALIGN_LEFT // GAME MODE - 260 20 20 ITEM_ALIGN_RIGHT // DATE - - visible 1 - onfocus - { - play CHOICE_FOCUS_SOUND; - } - onListboxSelectionChange - { - play CHOICE_FOCUS_SOUND; - } - doubleclick - { - if ( !( FILESHARE_TASKSINPROGRESS ) ) - { - execNow set selectedRecentGameIndex (getFeederData("selection")); - play CHOICE_FOCUS_SOUND; - setdvar ui_combatFileshareTasksComplete "0"; - setdvar ui_combatUserHasRecentGames "0"; - setdvar ui_combatFileSummaryValid "0"; - close self; - } - } - } - - /* button prompts */ -#ifdef PC - SIMPLE_CHOICE_BUTTON_SOUND( NEW_FRAME_DEFAULT_TITLE_X_OFFSET (SMALL_CENTER_POPUP_HEIGHT+4) 70 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "@PLATFORM_BACK", ITEM_ALIGN_MIDDLE_CENTER, ON_ESC_ACTION_POPUP ) -#else // #ifdef PC - PREPROC_TEXT_DRAW_VIS( 0 (SELECTION_LIST_MENU_HEIGHT+16.5) 0 0 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@PLATFORM_BACK", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, 1 1 1 1, 1 ) -#endif // #else #ifdef PC - } - -/* ----------------------------------Combat record tab "Matches", view "Recent Earnings"-----------------------------------------------------------------------------*/ - - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_matches_recent_earnings, CR_VIEW_MATCHES_RECENT_EARNINGS, menu_cr_matches_heat_map, menu_cr_matches_performance, CR_TAB_MATCHES, (dvarString("ui_combatWeaponsViewMenuName")), (dvarString("ui_combatKillstreaksViewMenuName")), ;, ; ) - - CR_MATCHES_TAB_COMMMON_ITEMS - CR_VIEW_TITLE_AND_VIEW_NUMBER - -#define CR_BAR_GRAPH_MAX_ITEMS 10 -#define CR_BAR_GRAPH_X_START (COMBAT_RECORD_BODY_X_START+80) -#define CR_BAR_GRAPH_Y_START (COMBAT_RECORD_BODY_Y_START+68) -#define CR_BAR_GRAPH_HEIGHT 180 -#define CR_BAR_GRAPH_WIDTH 320 - -#define CAREER_EARNINGS_GRAPH_WIDTH 53 -#define CAREER_EARNINGS_GRAPH_X_START (COMBAT_RECORD_BODY_X_START+420+5) - - /* bg image */ - PREPROC_SHADER_DRAW( (-128) (COMBAT_RECORD_BODY_Y_START+10) 256 256 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "playlist_wager_highroller_bw", 1 1 1 0.1 ) - - /* left container box for the bar graph */ - PREPROC_SHADER_DRAW( (COMBAT_RECORD_BODY_X_START+10) (CR_BAR_GRAPH_Y_START-30) 410 (CR_BAR_GRAPH_HEIGHT+60) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - - /* right container box for the bar graph */ - PREPROC_SHADER_DRAW( CAREER_EARNINGS_GRAPH_X_START (CR_BAR_GRAPH_Y_START-30) (CAREER_EARNINGS_GRAPH_WIDTH*2) (CR_BAR_GRAPH_HEIGHT+60) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", NEW_FRAME_TRANSPARENCY ) - - /* bar graph */ - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect CR_BAR_GRAPH_X_START CR_BAR_GRAPH_Y_START CR_BAR_GRAPH_WIDTH CR_BAR_GRAPH_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - ownerdraw UI_COMBAT_RECORD_BAR_GRAPH - visible 1 - decoration - } - - /* Label for "Winnings" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_RECORD_BODY_X_START+20) (CR_BAR_GRAPH_Y_START+CR_BAR_GRAPH_HEIGHT/2-3) 80 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_WINNINGS_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_LEFT, COMBAT_RECORD_COLOR_GREEN, 1 ) - - /* Label for "Buyins" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_RECORD_BODY_X_START+20) (CR_BAR_GRAPH_Y_START+CR_BAR_GRAPH_HEIGHT/2+20) 80 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_BUYINS_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_LEFT, COMBAT_RECORD_COLOR_RED, 1 ) - - /* horizontal axis line */ - PREPROC_SHADER_DRAW( (COMBAT_RECORD_BODY_X_START+10) (CR_BAR_GRAPH_Y_START+CR_BAR_GRAPH_HEIGHT/2) (CR_BAR_GRAPH_WIDTH+100) 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", 1 1 1 0.8 ) - - /* Label for "last 10 matches" */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_RECORD_BODY_X_START+10) (CR_BAR_GRAPH_Y_START-30) 80 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_LAST_TEN_MATCHES_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_LEFT, CHOICE_TEXTCOLOR, 1 ) - - /* Label for "Career" */ - PREPROC_TEXT_DRAW_VIS( CAREER_EARNINGS_GRAPH_X_START (CR_BAR_GRAPH_Y_START-30) 95 (CR_BAR_GRAPH_HEIGHT+60) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_CAREER_CAPS", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_LEFT, CHOICE_TEXTCOLOR, 1 ) - -#define CAREER_WINNINGS_BAR_HEIGHT ( ( GET_STAT( "LIFETIME_EARNINGS" ) / max( GET_STAT( "LIFETIME_EARNINGS" ), GET_STAT( "LIFETIME_BUYIN" ) ) ) * (CR_BAR_GRAPH_HEIGHT/2) ) -#define CAREER_BUYINS_BAR_HEIGHT ( ( GET_STAT( "LIFETIME_BUYIN" ) / max( GET_STAT( "LIFETIME_EARNINGS" ), GET_STAT( "LIFETIME_BUYIN" ) ) ) * (CR_BAR_GRAPH_HEIGHT/2) ) - - /* bar for lifetime winnings */ - PREPROC_SHADER_DRAW_ADV( (CAREER_EARNINGS_GRAPH_X_START+CAREER_EARNINGS_GRAPH_WIDTH/2), - ((CR_BAR_GRAPH_Y_START+((CR_BAR_GRAPH_HEIGHT/2)-CAREER_WINNINGS_BAR_HEIGHT))), - CAREER_EARNINGS_GRAPH_WIDTH, - (CAREER_WINNINGS_BAR_HEIGHT), - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "white", COMBAT_RECORD_COLOR_GREEN ) - - /* bar for lifetime buyins */ - PREPROC_SHADER_DRAW_ADV( (CAREER_EARNINGS_GRAPH_X_START+CAREER_EARNINGS_GRAPH_WIDTH/2), - ((CR_BAR_GRAPH_Y_START+(CR_BAR_GRAPH_HEIGHT/2))+1), - (CAREER_EARNINGS_GRAPH_WIDTH+1), - (CAREER_BUYINS_BAR_HEIGHT), - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "white", COMBAT_RECORD_COLOR_RED ) - - /* horizontal axis line on the right */ - PREPROC_SHADER_DRAW( CAREER_EARNINGS_GRAPH_X_START (CR_BAR_GRAPH_Y_START+CR_BAR_GRAPH_HEIGHT/2) (CAREER_EARNINGS_GRAPH_WIDTH*2) 1 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", 1 1 1 0.8 ) - - /* Lifetime Winnings */ - PREPROC_TEXT_DRAW_VIS_EX( (CAREER_EARNINGS_GRAPH_X_START+CAREER_EARNINGS_GRAPH_WIDTH/2) (CR_BAR_GRAPH_Y_START) CAREER_EARNINGS_GRAPH_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - 0 0, locString( "@MENU_POINTS", GET_STAT("LIFETIME_EARNINGS") ), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, 1, exp rect Y((CR_BAR_GRAPH_Y_START+((CR_BAR_GRAPH_HEIGHT/2)-CAREER_WINNINGS_BAR_HEIGHT))-15); ) - - /* Lifetime buyins */ - PREPROC_TEXT_DRAW_VIS_EX( (CAREER_EARNINGS_GRAPH_X_START+CAREER_EARNINGS_GRAPH_WIDTH/2) (CR_BAR_GRAPH_Y_START) CAREER_EARNINGS_GRAPH_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - 0 0, locString( "@MENU_POINTS", GET_STAT("LIFETIME_BUYIN") ), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, 1, exp rect Y((CR_BAR_GRAPH_Y_START+(CR_BAR_GRAPH_HEIGHT/2))+8+CAREER_BUYINS_BAR_HEIGHT); ) - - /* Max Losses */ - PREPROC_TEXT_DRAW_VIS( (COMBAT_RECORD_BODY_X_START+15) (CR_BAR_GRAPH_Y_START+80) 95 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetCombatRecordMinMaxScore( RECENT_EARNINGS_BAR_GRAPH, RETURN_MIN_SCORE ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_RIGHT, CHOICE_TEXTCOLOR, 1 ) - - #include "ui/safearea.menu" - } - - -/* --------------------Combat record tab "Killstreaks", view "favorites"------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_killstreaks_favorites, CR_VIEW_KILLSTREAKS_FAVORITES, menu_cr_killstreaks_kills, menu_cr_killstreaks_called, CR_TAB_KILLSTREAKS, (dvarString("ui_combatMatchesViewMenuName")), (dvarString("ui_combatContractsViewMenuName")), - execNow set ui_combatKillStreaksPieChart FAVORITE_KILLSTREAKS_PIE_CHART;, ; ) - - CR_KILLSTREAKS_TAB_COMMMON_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - -#undef CONTAINER_BOX_WIDTH -#define CONTAINER_BOX_WIDTH 260 -#define FAVORITE_KILLSTREAKS_BODY_X_START (-CONTAINER_BOX_WIDTH/2) - - /* favorite killstreak bg image */ - PREPROC_SHADER_DRAW_VIS_EX( (FAVORITE_KILLSTREAKS_BODY_X_START+155) (COMBAT_RECORD_BODY_Y_START+25) 256 256 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, GetItemRef( GET_SORTED_ITEM_INDEX( 0, 1 ) )+"_lobby", 1 1 1 0.1, when( GET_SORTED_STAT( 0, 1, 1 ) != 0 ), ; ) - - PREPROC_TEXT_DRAW_VIS( (-COMBAT_RECORD_WIDTH / 2) 0 COMBAT_RECORD_WIDTH 15 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_CR_KILLSTREAKS_NO_DATA", TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, - CHOICE_TEXTCOLOR, when( GET_SORTED_STAT( 0, 1, 1 ) == 0 ) ) - - PIE_CHART_TEXT( FAVORITE_KILLSTREAKS_BODY_X_START, 0, FAVORITE_KILLSTREAKS_PIE_CHART, 1 ) - -#undef CR_PIE_CHART_X_START -#define CR_PIE_CHART_X_START (FAVORITE_KILLSTREAKS_BODY_X_START+CR_PIE_CHART_WIDTH/2) - -#define IMAGE_OFFSET 17 - - PREPROC_SHADER_DRAW_VIS_EX( (CR_PIE_CHART_X_START-IMAGE_OFFSET) (CR_PIE_CHART_Y_START-IMAGE_OFFSET) (CR_PIE_CHART_WIDTH+IMAGE_OFFSET*2) (CR_PIE_CHART_HEIGHT+IMAGE_OFFSET*2) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_circle_shadow", 0 0 0 0.1, when( GET_SORTED_STAT( 0, 1, 1 ) != 0 ), ; ) - - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect CR_PIE_CHART_X_START CR_PIE_CHART_Y_START CR_PIE_CHART_WIDTH CR_PIE_CHART_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - ownerdraw UI_COMBAT_RECORD_PIE_CHART - dvar ui_combatKillStreaksPieChart - visible when( GET_SORTED_STAT( 0, 1, 1 ) != 0 ) - decoration - } - - #include "ui/safearea.menu" - } - - /* --------------------Combat record tab "Killstreaks", view "killstreaks-called"------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_killstreaks_called, CR_VIEW_KILLSTREAKS_CALLED, menu_cr_killstreaks_times_killed_by, menu_cr_killstreaks_kills, CR_TAB_KILLSTREAKS, (dvarString("ui_combatMatchesViewMenuName")), (dvarString("ui_combatContractsViewMenuName")), ;, ; ) - - CR_KILLSTREAKS_TAB_COMMMON_ITEMS - - COMMON_INFO_BAR_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - - /* --------------------Combat record tab "Killstreaks", view "killstreaks-kills"------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_killstreaks_kills, CR_VIEW_KILLSTREAKS_KILLS, menu_cr_killstreaks_called, menu_cr_killstreaks_times_killed_by, CR_TAB_KILLSTREAKS, (dvarString("ui_combatMatchesViewMenuName")), (dvarString("ui_combatContractsViewMenuName")), ;, ; ) - - CR_KILLSTREAKS_TAB_COMMMON_ITEMS - - COMMON_INFO_BAR_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - - /* --------------------Combat record tab "Killstreaks", view "killstreaks-times killed by"------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_killstreaks_times_killed_by, CR_VIEW_KILLSTREAKS_TIMES_KILLED_BY, menu_cr_killstreaks_kills, menu_cr_killstreaks_called, CR_TAB_KILLSTREAKS, (dvarString("ui_combatMatchesViewMenuName")), (dvarString("ui_combatContractsViewMenuName")), ;, ; ) - - CR_KILLSTREAKS_TAB_COMMMON_ITEMS - - COMMON_INFO_BAR_ITEMS - - CR_VIEW_TITLE_AND_VIEW_NUMBER - #include "ui/safearea.menu" - } - -/* --------------------Combat record tab "Contracts"------------------------------------------------*/ - menuDef - { - CR_VIEW_MENU_TEMPLATE( menu_cr_contracts_info, CR_VIEW_CONTRACTS_INFO, menu_cr_contracts_info, menu_cr_contracts_info, CR_TAB_CONTRACTS, (dvarString("ui_combatKillstreaksViewMenuName")), (dvarString("ui_combatCareerViewMenuName")), ;, ; ) - - CR_CONTRACTS_TAB_COMMMON_ITEMS - -#define CONTRACTS_SUMMARY_BODY_Y_START (COMBAT_RECORD_BODY_Y_START+184) -#define CONTRACTS_SUMMARY_BODY_WIDTH (COMBAT_RECORD_WIDTH-170) -#define CONTRACTS_SUMMARY_BODY_X_START (-COMBAT_RECORD_WIDTH/2+85) - - /* container box */ - PREPROC_SHADER_DRAW( (CONTRACTS_SUMMARY_BODY_X_START-10) (COMBAT_RECORD_BODY_Y_START+25) (CONTRACTS_SUMMARY_BODY_WIDTH+20) 253 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", 0 0 0 0.1 ) - - /* contracts bg image */ - PREPROC_SHADER_DRAW( (-128) (COMBAT_RECORD_BODY_Y_START+10) 256 256 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "menu_mp_lobby_aar_award_ccontract", 1 1 1 0.1 ) - -#define CONTRACT_PAID_IMAGE_X (CONTRACTS_SUMMARY_BODY_X_START+25) -#define CONTRACT_PAID_IMAGE_Y (COMBAT_RECORD_BODY_Y_START+55) - -#define CONTRACT_EXPIRED_IMAGE_X (CONTRACTS_SUMMARY_BODY_WIDTH/2-180) -#define CONTRACT_EXPIRED_IMAGE_Y (COMBAT_RECORD_BODY_Y_START+50) - - /* image for "paid" */ - PREPROC_SHADER_DRAW( CONTRACT_PAID_IMAGE_X CONTRACT_PAID_IMAGE_Y 120 70 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "contract_completed", 1 1 1 0.4; rotation -15 ) - /* image for "expired" */ - PREPROC_SHADER_DRAW( CONTRACT_EXPIRED_IMAGE_X CONTRACT_EXPIRED_IMAGE_Y 160 93 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "contract_expired", 1 1 1 0.4; rotation -15 ) - - /* Paid contracts */ - PREPROC_TEXT_DRAW_VIS( (CONTRACT_PAID_IMAGE_X+5) (CONTRACT_PAID_IMAGE_Y-20) 110 110 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_STAT( "CONTRACTS_COMPLETED" ), - TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, 1 ) - /* Failed contracts */ - PREPROC_TEXT_DRAW_VIS( (CONTRACT_EXPIRED_IMAGE_X+10) (CONTRACT_EXPIRED_IMAGE_Y-15) 140 110 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GetCombatRecordFailedContracts() , - TEXTSIZE_SUBTITLE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, 1 ) - - /* BG for "Return on Investment" */ - PREPROC_SHADER_DRAW( (CONTRACTS_SUMMARY_BODY_X_START-10) (CONTRACTS_SUMMARY_BODY_Y_START-6) (CONTRACTS_SUMMARY_BODY_WIDTH+20) 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Label for "Return on Investment" */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_BODY_X_START CONTRACTS_SUMMARY_BODY_Y_START CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "MPUI_RETURN_ON_INVESTMENT_CAPS" ) + ":", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - - /* CP Return on Investment if greater than 0 */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_BODY_X_START CONTRACTS_SUMMARY_BODY_Y_START CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - int( int( GET_STAT( "CONTRACTS_CP_EARNED" ) ) / int( GET_STAT( "CONTRACTS_CP_SPENT" ) ) * 100 )+ " %", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, when( ( int( GET_STAT( "CONTRACTS_CP_SPENT" ) ) != 0 ) ) ) - - /* CP Return on Investment if 0 */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_BODY_X_START CONTRACTS_SUMMARY_BODY_Y_START CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "0 %", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, when( ( int( GET_STAT( "CONTRACTS_CP_SPENT" ) ) == 0 ) ) ) - - /* Label for "Contracts Purchased" */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_BODY_X_START (CONTRACTS_SUMMARY_BODY_Y_START+20) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "MPUI_CONTRACTS_PURCHASED_CAPS" ) + ":", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Contracts Purchased */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_BODY_X_START (CONTRACTS_SUMMARY_BODY_Y_START+20) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_STAT("CONTRACTS_PURCHASED"), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* BG for "Amount Spent" */ - PREPROC_SHADER_DRAW( (CONTRACTS_SUMMARY_BODY_X_START-10) (CONTRACTS_SUMMARY_BODY_Y_START+34) (CONTRACTS_SUMMARY_BODY_WIDTH+20) 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Label for "Amount Spent" */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_BODY_X_START (CONTRACTS_SUMMARY_BODY_Y_START+40) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "MPUI_AMOUNT_SPENT_CAPS" ) + ":", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* Amount Spent */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_BODY_X_START (CONTRACTS_SUMMARY_BODY_Y_START+40) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "@MENU_POINTS", GET_STAT("CONTRACTS_CP_SPENT") ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - - /* Label for "Amount Earned" */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_BODY_X_START (CONTRACTS_SUMMARY_BODY_Y_START+60) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "MPUI_AMOUNT_EARNED_CAPS" ) + ":", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* CP Earned */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_BODY_X_START (CONTRACTS_SUMMARY_BODY_Y_START+60) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "@MENU_POINTS", GET_STAT("CONTRACTS_CP_EARNED") ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - /* BG for "XP Earned" */ - PREPROC_SHADER_DRAW( (CONTRACTS_SUMMARY_BODY_X_START-10) (CONTRACTS_SUMMARY_BODY_Y_START+74) (CONTRACTS_SUMMARY_BODY_WIDTH+20) 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", SUMMARY_DESC_TEXT_BG_COLOR ) - /* Label for "XP Award" */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_BODY_X_START (CONTRACTS_SUMMARY_BODY_Y_START+80) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "MPUI_XP_AWARD_CAPS" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, 1 ) - /* XP Earned */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_BODY_X_START (CONTRACTS_SUMMARY_BODY_Y_START+80) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "MPUI_CONTRACT_REWARD_XP", GET_STAT("CONTRACTS_XP_EARNED") ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR, 1 ) - - - -#if 0 - -#undef CR_HORIZONTAL_BAR_GRAPH_HEIGHT -#define CR_HORIZONTAL_BAR_GRAPH_HEIGHT 60 -#undef CR_HORIZONTAL_BAR_GRAPH_WIDTH -#define CR_HORIZONTAL_BAR_GRAPH_WIDTH (COMBAT_RECORD_WIDTH-70) -#undef CR_HORIZONTAL_BAR_GRAPH_X_START -#define CR_HORIZONTAL_BAR_GRAPH_X_START (COMBAT_RECORD_BODY_X_START+20) -#undef CR_HORIZONTAL_BAR_GRAPH_Y_START -#define CR_HORIZONTAL_BAR_GRAPH_Y_START (COMBAT_RECORD_BODY_Y_START+175) - - /* horizontal bar graph */ - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect CR_HORIZONTAL_BAR_GRAPH_X_START CR_HORIZONTAL_BAR_GRAPH_Y_START CR_HORIZONTAL_BAR_GRAPH_WIDTH CR_HORIZONTAL_BAR_GRAPH_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - ownerdraw UI_COMBAT_RECORD_HORIZONTAL_BAR_GRAPH - dvar ui_combatCurrViewNum - visible when( !dvarBool("ui_combatComparisonModeOn") ) - decoration - } - /* vertical axis line */ - PREPROC_SHADER_DRAW_VIS_EX( (CR_HORIZONTAL_BAR_GRAPH_X_START+CR_HORIZONTAL_BAR_GRAPH_WIDTH/2) CR_HORIZONTAL_BAR_GRAPH_Y_START 1 CR_HORIZONTAL_BAR_GRAPH_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "white", 1 1 1 1, - when( !dvarBool("ui_combatComparisonModeOn") ), ; ) - - /* Label for "Failed" */ - PREPROC_TEXT_DRAW_VIS( (CR_HORIZONTAL_BAR_GRAPH_X_START) (CR_HORIZONTAL_BAR_GRAPH_Y_START+CR_HORIZONTAL_BAR_GRAPH_HEIGHT-10) (CR_HORIZONTAL_BAR_GRAPH_WIDTH/2) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_FAILED_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, when( !dvarBool("ui_combatComparisonModeOn") ) ) - - - /* Label for "Completed" */ - PREPROC_TEXT_DRAW_VIS( (CR_HORIZONTAL_BAR_GRAPH_X_START+CR_HORIZONTAL_BAR_GRAPH_WIDTH/2) (CR_HORIZONTAL_BAR_GRAPH_Y_START+CR_HORIZONTAL_BAR_GRAPH_HEIGHT-10) (CR_HORIZONTAL_BAR_GRAPH_WIDTH/2) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_CONTRACT_COMPLETED_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, when( !dvarBool("ui_combatComparisonModeOn") ) ) - - /* Total Winnings */ - PREPROC_TEXT_DRAW_VIS( (CR_HORIZONTAL_BAR_GRAPH_X_START+CR_HORIZONTAL_BAR_GRAPH_WIDTH/2) (CR_HORIZONTAL_BAR_GRAPH_Y_START) (CR_HORIZONTAL_BAR_GRAPH_WIDTH/2) 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_STAT( "CONTRACTS_COMPLETED" ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, when( !dvarBool("ui_combatComparisonModeOn") ) ) -#endif - -#define OTHER_PLAYER_CONTRACT_INFO_Y_OFFSET 20 - -#define CONTRACTS_SUMMARY_FRIEND_INFO_X (CONTRACTS_SUMMARY_BODY_X_START-120) - - /* CP Return on Investment for Other Player if greater than 0 */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_FRIEND_INFO_X (CONTRACTS_SUMMARY_BODY_Y_START+OTHER_PLAYER_CONTRACT_INFO_Y_OFFSET-20) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - int( int( GET_STAT_FOR_OTHER_PLAYER( "CONTRACTS_CP_EARNED" ) ) / int( GET_STAT_FOR_OTHER_PLAYER( "CONTRACTS_CP_SPENT" ) ) * 100 )+ " %", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, INFO_BAR_COLOR_FOR_FRIEND 1, when( dvarBool("ui_combatComparisonModeOn") && ( int( GET_STAT_FOR_OTHER_PLAYER( "CONTRACTS_CP_SPENT" ) ) != 0 ) ) ) - - /* CP Return on Investment for Other Player if 0 */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_FRIEND_INFO_X (CONTRACTS_SUMMARY_BODY_Y_START+OTHER_PLAYER_CONTRACT_INFO_Y_OFFSET-20) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "0 %", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, INFO_BAR_COLOR_FOR_FRIEND 1, when( dvarBool("ui_combatComparisonModeOn") && ( int( GET_STAT_FOR_OTHER_PLAYER( "CONTRACTS_CP_SPENT" ) ) == 0 ) ) ) - /* Contracts Purchased for Other Player */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_FRIEND_INFO_X (CONTRACTS_SUMMARY_BODY_Y_START+OTHER_PLAYER_CONTRACT_INFO_Y_OFFSET) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - GET_STAT_FOR_OTHER_PLAYER("CONTRACTS_PURCHASED"), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, INFO_BAR_COLOR_FOR_FRIEND 1, when( dvarBool("ui_combatComparisonModeOn") ) ) - /* Amount Spent for Other Player */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_FRIEND_INFO_X (CONTRACTS_SUMMARY_BODY_Y_START+20+OTHER_PLAYER_CONTRACT_INFO_Y_OFFSET) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "@MENU_POINTS", GET_STAT_FOR_OTHER_PLAYER("CONTRACTS_CP_SPENT") ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, INFO_BAR_COLOR_FOR_FRIEND 1, when( dvarBool("ui_combatComparisonModeOn") ) ) - /* CP Earned for Other Player */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_FRIEND_INFO_X (CONTRACTS_SUMMARY_BODY_Y_START+40+OTHER_PLAYER_CONTRACT_INFO_Y_OFFSET) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "@MENU_POINTS", GET_STAT_FOR_OTHER_PLAYER("CONTRACTS_CP_EARNED") ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, INFO_BAR_COLOR_FOR_FRIEND 1, when( dvarBool("ui_combatComparisonModeOn") ) ) - /* XP Earned for Other Player */ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_SUMMARY_FRIEND_INFO_X (CONTRACTS_SUMMARY_BODY_Y_START+60+OTHER_PLAYER_CONTRACT_INFO_Y_OFFSET) CONTRACTS_SUMMARY_BODY_WIDTH 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - locString( "MPUI_CONTRACT_REWARD_XP", GET_STAT_FOR_OTHER_PLAYER("CONTRACTS_XP_EARNED") ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, INFO_BAR_COLOR_FOR_FRIEND 1, when( dvarBool("ui_combatComparisonModeOn") ) ) - - RANK_AND_GAMERTAG_OF_COMPARED_PLAYER( (-160), ( dvarBool("ui_combatComparisonModeOn") ) ) -#ifdef CONSOLE - COMPARE_BUTTON( 1 ) -#endif //#ifdef CONSOLE - // COMPARE_FRIENDS_BUTTON( 1 ) - NEW_FRAME_COMPARE_FRIEND_BUTTON_ACTION( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, "@PATCH_TOGGLE_COMPARE_FRIENDS", COMPARE_FRIENDS_ACTION , when( !dvarbool( "ui_showFriendsCombatRecord" ) ) ) - HIDE_COMPARISON_BUTTON( 1 ) - - -NEW_FRAME_BACK_BUTTON_ACTION( COMBAT_RECORD_WIDTH, COMBAT_RECORD_HEIGHT, ON_ESC_ACTION ) - /* Other Player rank icon */ - PREPROC_SHADER_DRAW_VIS_EX( (CONTRACTS_SUMMARY_BODY_X_START+265) (CONTRACTS_SUMMARY_BODY_Y_START+OTHER_PLAYER_CONTRACT_INFO_Y_OFFSET-45) 16 16 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN;, - tablelookup( "mp/rankIconTable.csv", 0, GET_STAT_FOR_OTHER_PLAYER( "RANK" ), 1+GET_STAT_FOR_OTHER_PLAYER( "PLEVEL" ) ), 1 1 1 0, - when( dvarBool("ui_combatComparisonModeOn") );, - name "otherPlayerName"; ANIM_STATES( 1 1 1 ) ) - - #include "ui/safearea.menu" - } - -#define DELAY_AFTER_DOWNLOADING 400 - -#undef SELECTION_LIST_MENU_X_START -#define SELECTION_LIST_MENU_X_START (SMALL_CENTER_POPUP_WIDTH/4) -#undef SELECTION_LIST_MENU_Y_START -#define SELECTION_LIST_MENU_Y_START (0) -#undef SELECTION_LIST_MENU_WIDTH -#define SELECTION_LIST_MENU_WIDTH (SMALL_CENTER_POPUP_WIDTH/2 + 10) -#undef SELECTION_LIST_MENU_HEIGHT -#define SELECTION_LIST_MENU_HEIGHT SMALL_CENTER_POPUP_HEIGHT - -#undef ON_ESC_ACTION -#define ON_ESC_ACTION \ - deactivateBlur; \ - execNow "set ui_combatComparisonModeOn 0"; \ - setLocalVarBool ui_centerPopup 0; \ - play uin_navigation_sys_close; \ - close self; \ - ADJUST_OTHER_PLAYER_INFO_BARS( (dvarString("ui_combatCurrentViewMenuName")) ) - - menuDef - { - name menu_cr_friends_selection - visible 1 - fullscreen 0 - rect (-SMALL_CENTER_POPUP_WIDTH/2) (-SMALL_CENTER_POPUP_HEIGHT/2) SMALL_CENTER_POPUP_WIDTH SMALL_CENTER_POPUP_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - backcolor 0.2 0.2 0.2 0.8 - style WINDOW_STYLE_FRAMED - frame 16 0.5 FRAME_SIDE_ALL - background "menu_mp_lobby_frame_circle" - focusColor COLOR_FOCUSED - priority MENU_PRI_POPUP - popup - onOpen - { - activateBlur; - setLocalVarBool ui_centerPopup 1; - setDvar ui_friendsSelectionBoxOpen "1"; - play uin_navigation_sys_open; - } - onClose - { - deactivateBlur; - setDvar ui_friendsSelectionBoxOpen "0"; - CENTER_POPUP_ON_CLOSE - setLocalVarBool ui_centerPopup 0; - } - onESC - { - ON_ESC_ACTION - } - - PREPROC_SHADER_DRAW_VIS_EX( 0 0 SMALL_CENTER_POPUP_WIDTH (SMALL_CENTER_POPUP_HEIGHT-POPUP_INNER_BG_PAD), "menu_mp_lobby_frame_fade", POPUP_GLOW_WHITE, 1, ; ) - /* title text for "Select friend to compare" */ - PREPROC_TEXT_DRAW( 16.5 (SELECTION_LIST_MENU_Y_START+16.5) SMALL_CENTER_POPUP_WIDTH 10 HORIZONTAL_ALIGN_CENTER CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_CR_SELECT_FRIEND_TO_COMPARE", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR ) - - /* button prompts */ -#ifdef CONSOLE - itemDef - { - type ITEM_TYPE_TEXT - rect 0 (SELECTION_LIST_MENU_HEIGHT+16.5) 0 0 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - text "@PLATFORM_CANCEL_COMPARE" - textfont UI_FONT_NORMAL - textscale TEXTSIZE_SMALL - textalign ITEM_ALIGN_BOTTOM_LEFT - visible 1 - decoration - } - -#else //#ifdef CONSOLE - SIMPLE_CHOICE_BUTTON_SOUND( NEW_FRAME_DEFAULT_TITLE_X_OFFSET (SELECTION_LIST_MENU_HEIGHT+4) 70 20 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "@PLATFORM_CANCEL_COMPARE", ITEM_ALIGN_MIDDLE_CENTER, ON_ESC_ACTION ) -#endif //#ifdef CONSOLE - -#ifdef CONSOLE -#endif // #ifdef CONSOLE - - // List - itemDef - { - name combat_record_friends_list - type ITEM_TYPE_LISTBOX - feeder FEEDER_FRIENDS_STATS_COMPARE - rect (SELECTION_LIST_MENU_X_START+5) (SELECTION_LIST_MENU_Y_START+40) (SELECTION_LIST_MENU_WIDTH-10) (SELECTION_LIST_MENU_HEIGHT-65) CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - origin 0 0 - elementwidth 30 - elementheight 20 - elementtype LISTBOX_TEXT - textstyle ITEM_TEXTSTYLE_NORMAL - textfont UI_FONT_NORMAL - textscale TEXTSIZE_SMALL - textalignx 12 - forecolor 1 1 1 1 - focusColor CHOICE_TEXTCOLOR - disableColor CHOICE_TEXTCOLOR - selectBorder 0.8 0.95 1 0 - outlinecolor 1 1 1 1 - elementBackgroundColor NEW_FRAME_LT_GREY_RGB 0.2 - selectIcon SELECT_ICON - elementHighlightColor 0 0 0 1 - noBlinkingHighlight - /* x y w h len horzAlign vertAlign*/ - userarea 2 23 2 16 16 32 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP /* Rank Icon */ - 31 -1 50 20 24 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP /* GamerTag */ - - visible 1 - onfocus - { - play CHOICE_FOCUS_SOUND; - exec "updateListboxPos menu_cr_friends_selection"; - } - onListboxSelectionChange - { - play CHOICE_FOCUS_SOUND; - } - doubleclick - { - play CHOICE_FOCUS_SOUND; - execNow set selectedPlayerXuid ( getfeederdata( "xuid" ) ); - execNow set selectedFriendName ( getfeederdata( "name" ) ); - if( dvarString( "selectedPlayerXuid" ) != 0 ) - { - execnow getServiceRecord ( dvarString( "selectedPlayerXuid" ) ); - close self; - ITEM_ANIMATE( (dvarString( "ui_combatCurrentViewMenuName" )), "dummy", updateViewAfterDownloading, DELAY_AFTER_DOWNLOADING ); - } - else - { - close self; - } - } - execKeyInt BUTTON_X - { - } - } - } -} diff --git a/mods/patch_mp/ui_mp/custom_game_create.menu b/mods/patch_mp/ui_mp/custom_game_create.menu deleted file mode 100644 index 75c5060..0000000 --- a/mods/patch_mp/ui_mp/custom_game_create.menu +++ /dev/null @@ -1,903 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui_mp/custom_mode.inc" - -#define CHOICE_SEP_1 2 -#define CHOICE_SEP_2 4 -#define CHOICE_SEP_3 13 - -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" -#include "ui_mp/common_game_options.inc" -#include "ui/choices_setup_common.menu" -#include "ui/choices_setup_popmenu.menu" - -#include "ui_mp/custom_mode_layout.inc" - -#undef NEW_FRAME_BUTTON_NAME -#define NEW_FRAME_BUTTON_NAME "custom_game_create_" - -#undef CHOICE_BUTTON_NAME -#define CHOICE_BUTTON_NAME NEW_FRAME_BUTTON_NAME - -#undef MENUDEF_NAME -#define MENUDEF_NAME custom_game_create - -#undef CHOICE_GROUP -#define CHOICE_GROUP "custom_game" - -#ifdef PC - #undef CHOICE_TEXTSIZE - #define CHOICE_TEXTSIZE TEXTSIZE_SMALL -#endif //PC - -#define CHOICE1_TEXT "@MPUI_RULES_TIME_LIMIT_CAPS" -#define CHOICE1_DESC "@CUSTOM_GAME_TIME_LIMIT_DESC" -#define CHOICE1_DVAR "custom_timelimit" -#define CHOICE1_DVARTEXT CHOICE1_DVAR"_text" -#define CHOICE1_SHOW 1 -#define CHOICE1_STR1 "@MPUI_RULES_UNLIMITED_CAPS" -#define CHOICE1_STR2 "@MPUI_RULES_2_5MINUTES_CAPS" -#define CHOICE1_STR3 "@MPUI_RULES_3MINUTES_CAPS" -#define CHOICE1_STR4 "@MPUI_RULES_5MINUTES_CAPS" -#define CHOICE1_STR5 "@MPUI_RULES_8MINUTES_CAPS" -#define CHOICE1_STR6 "@MPUI_RULES_10MINUTES_CAPS" -#define CHOICE1_STR7 "@MPUI_RULES_15MINUTES_CAPS" -#define CHOICE1_STR8 "@MPUI_RULES_20MINUTES_CAPS" -#define CHOICE1_STR9 "@MPUI_RULES_30MINUTES_CAPS" -#define CHOICE1_STR10 "" -#define CHOICE1_STR11 "" -#define CHOICE1_STR12 "" -#define CHOICE1_VAL1 0 -#define CHOICE1_VAL2 2.5 -#define CHOICE1_VAL3 3 -#define CHOICE1_VAL4 5 -#define CHOICE1_VAL5 8 -#define CHOICE1_VAL6 10 -#define CHOICE1_VAL7 15 -#define CHOICE1_VAL8 20 -#define CHOICE1_VAL9 30 -#define CHOICE1_VAL10 0 -#define CHOICE1_VAL11 0 -#define CHOICE1_VAL12 0 -#define CHOICE1_EXEC ; -#define CHOICE1_STRLIST { CHOICE1_STR1 CHOICE1_VAL1 CHOICE1_STR2 CHOICE1_VAL2 CHOICE1_STR3 CHOICE1_VAL3 CHOICE1_STR4 CHOICE1_VAL4 CHOICE1_STR5 CHOICE1_VAL5 CHOICE1_STR6 CHOICE1_VAL6 CHOICE1_STR7 CHOICE1_VAL7 CHOICE1_STR8 CHOICE1_VAL8 CHOICE1_STR9 CHOICE1_VAL9 CHOICE1_STR10 CHOICE1_VAL10 CHOICE1_STR11 CHOICE1_VAL11 CHOICE1_STR12 CHOICE1_VAL12 } -#define CHOICE1_NUMVALS 9 -#define CHOICE1_POPUP 1 - -#define CHOICE2_TEXT "@MPUI_RULES_SCORE_LIMIT_CAPS" -#define CHOICE2_DESC "@CUSTOM_GAME_SCORE_LIMIT_DESC" -#define CHOICE2_DVAR "custom_scorelimit" -#define CHOICE2_DVARTEXT CHOICE2_DVAR"_text" -#define CHOICE2_STR1 "@MPUI_RULES_UNLIMITED_CAPS" -#define CHOICE2_STR2 "@MPUI_RULES_30POINTS_CAPS" -#define CHOICE2_STR3 "@MPUI_RULES_50POINTS_CAPS" -#define CHOICE2_STR4 "@MPUI_RULES_70POINTS_CAPS" -#define CHOICE2_STR5 "@MPUI_RULES_100POINTS_CAPS" -#define CHOICE2_STR6 "@MPUI_RULES_200POINTS_CAPS" -#define CHOICE2_STR7 "@MPUI_RULES_250POINTS_CAPS" -#define CHOICE2_STR8 "@MPUI_RULES_300POINTS_CAPS" -#define CHOICE2_STR9 "@MPUI_RULES_500POINTS_CAPS" -#define CHOICE2_STR10 "@MPUI_RULES_700POINTS_CAPS" -#define CHOICE2_STR11 "@MPUI_RULES_750POINTS_CAPS" -#define CHOICE2_STR12 "@MPUI_RULES_1000POINTS_CAPS" -#define CHOICE2_VAL1 0 -#define CHOICE2_VAL2 30 -#define CHOICE2_VAL3 50 -#define CHOICE2_VAL4 70 -#define CHOICE2_VAL5 100 -#define CHOICE2_VAL6 200 -#define CHOICE2_VAL7 250 -#define CHOICE2_VAL8 300 -#define CHOICE2_VAL9 500 -#define CHOICE2_VAL10 700 -#define CHOICE2_VAL11 750 -#define CHOICE2_VAL12 1000 -#define CHOICE2_EXEC ; -#define CHOICE2_STRLIST { CHOICE2_STR1 CHOICE2_VAL1 CHOICE2_STR2 CHOICE2_VAL2 CHOICE2_STR3 CHOICE2_VAL3 CHOICE2_STR4 CHOICE2_VAL4 CHOICE2_STR5 CHOICE2_VAL5 CHOICE2_STR6 CHOICE2_VAL6 CHOICE2_STR7 CHOICE2_VAL7 CHOICE2_STR8 CHOICE2_VAL8 CHOICE2_STR9 CHOICE2_VAL9 CHOICE2_STR10 CHOICE2_VAL10 CHOICE2_STR11 CHOICE2_VAL11 CHOICE2_STR12 CHOICE2_VAL12 } -#define CHOICE2_NUMVALS 12 -#define CHOICE2_POPUP 1 -#define CHOICE2_VIS ( dvarString( ui_gametype ) == "dom" || dvarString( ui_gametype ) == "koth" ) - -#define CHOICE2_ALT_TEXT "@MPUI_RULES_SCORE_LIMIT_CAPS" -#define CHOICE2_ALT_DVAR "custom_scorelimit" -#define CHOICE2_ALT_DVARTEXT CHOICE2_ALT_DVAR"_text" -#define CHOICE2_ALT_STR1 "@MPUI_RULES_UNLIMITED_CAPS" -#define CHOICE2_ALT_STR2 "@MPUI_RULES_750POINTS_CAPS" -#define CHOICE2_ALT_STR3 "@MPUI_RULES_1000POINTS_CAPS" -#define CHOICE2_ALT_STR4 "@MPUI_RULES_1500POINTS_CAPS" -#define CHOICE2_ALT_STR5 "@MPUI_RULES_2500POINTS_CAPS" -#define CHOICE2_ALT_STR6 "@MPUI_RULES_3000POINTS_CAPS" -#define CHOICE2_ALT_STR7 "@MPUI_RULES_5000POINTS_CAPS" -#define CHOICE2_ALT_STR8 "@MPUI_RULES_7000POINTS_CAPS" -#define CHOICE2_ALT_STR9 "@MPUI_RULES_7500POINTS_CAPS" -#define CHOICE2_ALT_STR10 "@MPUI_RULES_10000POINTS_CAPS" -#define CHOICE2_ALT_STR11 "@MPUI_RULES_15000POINTS_CAPS" -#define CHOICE2_ALT_STR12 "@MPUI_RULES_30000POINTS_CAPS" -#define CHOICE2_ALT_VAL1 0 -#define CHOICE2_ALT_VAL2 750 -#define CHOICE2_ALT_VAL3 1000 -#define CHOICE2_ALT_VAL4 1500 -#define CHOICE2_ALT_VAL5 2500 -#define CHOICE2_ALT_VAL6 3000 -#define CHOICE2_ALT_VAL7 5000 -#define CHOICE2_ALT_VAL8 7000 -#define CHOICE2_ALT_VAL9 7500 -#define CHOICE2_ALT_VAL10 10000 -#define CHOICE2_ALT_VAL11 15000 -#define CHOICE2_ALT_VAL12 30000 -#define CHOICE2_ALT_EXEC ; -#define CHOICE2_ALT_STRLIST { CHOICE2_ALT_STR1 CHOICE2_ALT_VAL1 CHOICE2_ALT_STR2 CHOICE2_ALT_VAL2 CHOICE2_ALT_STR3 CHOICE2_ALT_VAL3 CHOICE2_ALT_STR4 CHOICE2_ALT_VAL4 CHOICE2_ALT_STR5 CHOICE2_ALT_VAL5 CHOICE2_ALT_STR6 CHOICE2_ALT_VAL6 CHOICE2_ALT_STR7 CHOICE2_ALT_VAL7 CHOICE2_ALT_STR8 CHOICE2_ALT_VAL8 CHOICE2_ALT_STR9 CHOICE2_ALT_VAL9 CHOICE2_ALT_STR10 CHOICE2_ALT_VAL10 CHOICE2_ALT_STR11 CHOICE2_ALT_VAL11 CHOICE2_ALT_STR12 CHOICE2_ALT_VAL12 } -#define CHOICE2_ALT_NUMVALS 12 -#define CHOICE2_ALT_POPUP 1 -#define CHOICE2_ALT_VIS ( dvarString( ui_gametype ) == "hc_tdm" || dvarString( ui_gametype ) == "tdm" ) - -#define IS_CHOICE2_VIS ( CHOICE2_VIS || CHOICE2_ALT_VIS ) - -#undef ON_ESC -#define ON_ESC \ - execNow checkIfCustomGametypeChanged; \ - close self; - -{ - menuDef - { - name custom_game_create - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - visible when( MenuHasFocus() || dvarBool( ui_custom_save_to_file_share ) ) - onOpen - { - execnow ui_animate custom_game_create * highlightOff 0; - activateBlur; - focusFirst; - execNow beginCustomGametypeChanges; - - if( IS_CHOICE2_VIS ) - { - setLocalVarInt custom_shift_options_up 0; - } - else - { - setLocalVarInt custom_shift_options_up 1; - } - } - onFocus - { - execNow checkIfCustomGametypeChanged; - } - onEsc - { - ON_ESC - } - onClose - { - deactivateBlur; - - execNow endCustomGametypeChanges; - if( dvarBool( "ui_custom_haschanged" ) ) - { - setdvar customGameMode 1; - execNow "xupdatepartystate"; - } - setLocalVarBool ui_choice_hideaccept 0; - } - - NEW_FRAME( CUSTOM_MODE_FRAME_WIDTH, CUSTOM_MODE_FRAME_HEIGHT ) - NEW_FRAME_TITLE( CUSTOM_MODE_FRAME_WIDTH, CUSTOM_MODE_FRAME_HEIGHT, "@CUSTOM_GAME_CREATE_CAPS", 1 ) - NEW_FRAME_SUBTITLE( CUSTOM_MODE_FRAME_WIDTH, CUSTOM_MODE_FRAME_HEIGHT, CUSTOM_GAMETYPE_NAME, 1 ) - - CUSTOM_MODE_BACKGROUND_WATERMARK - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 1, CHOICE1_TEXT, CHOICE1_DVAR, CHOICE1_STRLIST, exec checkIfCustomGametypeChanged; CHOICE1_EXEC, SET_CHOICE_DESC( "", CHOICE1_DESC, "" ) setLocalVarBool ui_choice_hideaccept 1;, CLEAR_CHOICE_DESC setLocalVarBool ui_choice_hideaccept 0;, 1 ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 2, CHOICE2_TEXT, CHOICE2_DVAR, CHOICE2_STRLIST, exec checkIfCustomGametypeChanged; CHOICE2_EXEC, SET_CHOICE_DESC( "", CHOICE2_DESC, "" ) setLocalVarBool ui_choice_hideaccept 1;, CLEAR_CHOICE_DESC setLocalVarBool ui_choice_hideaccept 0;, CHOICE2_VIS ) - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 2, CHOICE2_ALT_TEXT, CHOICE2_ALT_DVAR, CHOICE2_ALT_STRLIST, exec checkIfCustomGametypeChanged; CHOICE2_ALT_EXEC, SET_CHOICE_DESC( "", CHOICE2_DESC, "" ) setLocalVarBool ui_choice_hideaccept 1;, CLEAR_CHOICE_DESC setLocalVarBool ui_choice_hideaccept 0;, CHOICE2_ALT_VIS ) - - #define SHOULD_SHIFT_CHOICES_UP ( localVarInt( custom_shift_options_up ) > 0 ) - - #define GAME_MODE_RULES_ACTION \ - exec openMenu ( "custom_settings_" + dvarString( "ui_gametype" ) ); - - #define BUTTON_3( itemIndex, visArg ) \ - CUSTOM_BUTTON( itemIndex, "@CUSTOM_GAME_MODE_OPTIONS_CAPS", GAME_MODE_RULES_ACTION, "@CUSTOM_GAME_MODE_OPTIONS_DESC", "", visArg ) - - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #define CHOICE_SEP_1 1 - #define CHOICE_SEP_2 3 - #include "ui/choices_sep_spacing.inc" - BUTTON_3( 2, SHOULD_SHIFT_CHOICES_UP ) - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #define CHOICE_SEP_1 2 - #define CHOICE_SEP_2 4 - #include "ui/choices_sep_spacing.inc" - BUTTON_3( 3, !SHOULD_SHIFT_CHOICES_UP ) - - #define BUTTON_4( itemIndex, visArg ) \ - CUSTOM_BUTTON( itemIndex, "@CUSTOM_GENERAL_OPTIONS_CAPS", open "custom_settings_general", "@CUSTOM_GENERAL_OPTIONS_DESC", "", visArg ) - - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #define CHOICE_SEP_1 1 - #define CHOICE_SEP_2 3 - #include "ui/choices_sep_spacing.inc" - BUTTON_4( 3, SHOULD_SHIFT_CHOICES_UP ) - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #define CHOICE_SEP_1 2 - #define CHOICE_SEP_2 4 - #include "ui/choices_sep_spacing.inc" - BUTTON_4( 4, !SHOULD_SHIFT_CHOICES_UP ) - - #define CUSTOM_OPTION_HIDEACCEPT( dvarName, dvarValue ) \ - if( dvarInt( dvarName ) == dvarValue ) \ - { \ - setLocalVarBool ui_choice_hideaccept 0; \ - } \ - else \ - { \ - setLocalVarBool ui_choice_hideaccept 1; \ - } - - #define CUSTOM_OPTION_SHOW_DISABLED_TOOLTIP( dvarName, enabledValue, disabledString, enabledString ) \ - if( dvarInt( dvarName ) != enabledValue ) \ - { \ - execnow set ui_choice_desc ( disabledString ); \ - } \ - else \ - { \ - execnow set ui_choice_desc ( enabledString ); \ - } - - #define CUSTOM_OPTION_LEAVE_FOCUS \ - CLEAR_CHOICE_DESC \ - setLocalVarBool ui_choice_hideaccept 0; - - #define CUSTOM_OPTION_EXTRA( dvarName, dvarValue, menuName ) \ - execKeyInt BUTTON_A \ - { \ - if( dvarInt( dvarName ) == dvarValue ) \ - { \ - open menuName; \ - } \ - } - - #define CUSTOM_CLASS_ON_FOCUS \ - SET_CHOICE_DESC( "", "@CUSTOM_CLASS_EDITOR_DESC", "" ) \ - CUSTOM_OPTION_HIDEACCEPT( custom_class_mode, 1 ) \ - CUSTOM_OPTION_SHOW_DISABLED_TOOLTIP( custom_class_mode, 1, "@CUSTOM_CLASS_EDITOR_DISABLED_DESC", "@CUSTOM_CLASS_EDITOR_DESC" ) - - #define CUSTOM_CLASS_ACTION \ - CUSTOM_OPTION_SHOW_DISABLED_TOOLTIP( custom_class_mode, 1, "@CUSTOM_CLASS_EDITOR_DISABLED_DESC", "@CUSTOM_CLASS_EDITOR_DESC" ) \ - CUSTOM_OPTION_HIDEACCEPT( custom_class_mode, 1 ) \ - if( dvarInt( custom_class_mode ) == 1 ) \ - { \ - execNow reset scr_player_healthregentime; \ - } \ - exec checkIfCustomGametypeChanged; - - #define BUTTON_5( itemIndex, visArg ) \ - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS_EX(itemIndex, "@CUSTOM_CLASS_EDITOR_CAPS", custom_class_mode, \ - { "@CUSTOM_ALLOW_PLAYER_CLASSES_CAPS" 0 "@CUSTOM_CUSTOM_CLASSES_CAPS" 1 }, \ - CUSTOM_CLASS_ACTION, \ - CUSTOM_CLASS_ON_FOCUS, CUSTOM_OPTION_LEAVE_FOCUS, visArg, ;, \ - CUSTOM_OPTION_EXTRA( custom_class_mode, 1, "custom_classes" ); ) - - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #define CHOICE_SEP_1 1 - #define CHOICE_SEP_2 3 - #include "ui/choices_sep_spacing.inc" - BUTTON_5( 4, SHOULD_SHIFT_CHOICES_UP ) -#ifdef PC - SIMPLE_CHOICE_RECT_OFFSET_BUTTON_SOUND( 4, 6, "@PLATFORM_EDIT", ITEM_ALIGN_MIDDLE_CENTER, open "custom_classes", when(dvarInt(custom_class_mode) == 1 && SHOULD_SHIFT_CHOICES_UP ), 20, CHOICE_SIZE_Y ) -#endif //PC - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #define CHOICE_SEP_1 2 - #define CHOICE_SEP_2 4 - #include "ui/choices_sep_spacing.inc" - BUTTON_5( 5, !SHOULD_SHIFT_CHOICES_UP ) -#ifdef PC - SIMPLE_CHOICE_RECT_OFFSET_BUTTON_SOUND( 5, 6, "@PLATFORM_EDIT", ITEM_ALIGN_MIDDLE_CENTER, open "custom_classes", when(dvarInt(custom_class_mode) == 1 && !SHOULD_SHIFT_CHOICES_UP ), 20, CHOICE_SIZE_Y ) -#endif //PC - - #define CUSTOM_KILLSTREAK_ON_FOCUS \ - SET_CHOICE_DESC( "", "@CUSTOM_KILLSTREAK_EDITOR_DESC", "" ) \ - CUSTOM_OPTION_HIDEACCEPT( custom_killstreak_mode, 2 ) \ - CUSTOM_OPTION_SHOW_DISABLED_TOOLTIP( custom_killstreak_mode, 2, "@CUSTOM_KILLSTREAK_EDITOR_DISABLED_DESC", "@CUSTOM_KILLSTREAK_EDITOR_DESC" ) - - #define CUSTOM_KILLSTREAK_ACTION \ - CUSTOM_OPTION_SHOW_DISABLED_TOOLTIP( custom_killstreak_mode, 2, "@CUSTOM_KILLSTREAK_EDITOR_DISABLED_DESC", "@CUSTOM_KILLSTREAK_EDITOR_DESC" ) \ - CUSTOM_OPTION_HIDEACCEPT( custom_killstreak_mode, 2 ) \ - exec checkIfCustomGametypeChanged; - - #define BUTTON_6( itemIndex, visArg ) \ - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS_EX(itemIndex, "@CUSTOM_KILLSTREAK_EDITOR", custom_killstreak_mode, \ - { "@MPUI_ALLOW_PLAYER_KILLSTREAKS_CAPS" 0 "@MPUI_NO_KILLSTREAKS_CAPS" 1 "@MPUI_CUSTOM_KILLSTREAKS_CAPS" 2 }, \ - CUSTOM_KILLSTREAK_ACTION, \ - CUSTOM_KILLSTREAK_ON_FOCUS, CUSTOM_OPTION_LEAVE_FOCUS, visArg, ;, \ - CUSTOM_OPTION_EXTRA( custom_killstreak_mode, 2, "custom_killstreaks" ); ) - - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #define CHOICE_SEP_1 1 - #define CHOICE_SEP_2 3 - #include "ui/choices_sep_spacing.inc" - BUTTON_6( 5, SHOULD_SHIFT_CHOICES_UP ) -#ifdef PC - SIMPLE_CHOICE_RECT_OFFSET_BUTTON_SOUND( 5, 6, "@PLATFORM_EDIT", ITEM_ALIGN_MIDDLE_CENTER, open "custom_killstreaks", when(dvarInt(custom_killstreak_mode) == 2 && SHOULD_SHIFT_CHOICES_UP ), 20, CHOICE_SIZE_Y ) -#endif //PC - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #define CHOICE_SEP_1 2 - #define CHOICE_SEP_2 4 - #include "ui/choices_sep_spacing.inc" - BUTTON_6( 6, !SHOULD_SHIFT_CHOICES_UP ) -#ifdef PC - SIMPLE_CHOICE_RECT_OFFSET_BUTTON_SOUND( 6, 6, "@PLATFORM_EDIT", ITEM_ALIGN_MIDDLE_CENTER, open "custom_killstreaks", when(dvarInt(custom_killstreak_mode) == 2 && !SHOULD_SHIFT_CHOICES_UP ), 20, CHOICE_SIZE_Y ) -#endif //PC - - #define CUSTOM_PERK_ON_FOCUS \ - SET_CHOICE_DESC( "", "@CUSTOM_PERK_EDITOR_DESC", "" ) \ - CUSTOM_OPTION_HIDEACCEPT( scr_game_perks, 1 ) \ - CUSTOM_OPTION_SHOW_DISABLED_TOOLTIP( scr_game_perks, 1, "@CUSTOM_PERK_EDITOR_DISABLED_DESC", "@CUSTOM_PERK_EDITOR_DESC" ) - - #define CUSTOM_PERK_ACTION \ - CUSTOM_OPTION_SHOW_DISABLED_TOOLTIP( scr_game_perks, 1, "@CUSTOM_PERK_EDITOR_DISABLED_DESC", "@CUSTOM_PERK_EDITOR_DESC" ) \ - CUSTOM_OPTION_HIDEACCEPT( scr_game_perks, 1 ) \ - exec checkIfCustomGametypeChanged; - - #define BUTTON_7( itemIndex, visArg ) \ - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS_EX(itemIndex, "@CUSTOM_PERK_EDITOR_CAPS", scr_game_perks, \ - { "@CUSTOM_DISABLE_PERKS_CAPS" 0 "@CUSTOM_ENABLE_PERKS_CAPS" 1 }, \ - CUSTOM_PERK_ACTION, \ - CUSTOM_PERK_ON_FOCUS, CUSTOM_OPTION_LEAVE_FOCUS, visArg, ;, \ - CUSTOM_OPTION_EXTRA( scr_game_perks, 1, "custom_specialty_editor" ); ) - - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #define CHOICE_SEP_1 1 - #define CHOICE_SEP_2 3 - #include "ui/choices_sep_spacing.inc" - BUTTON_7( 6, SHOULD_SHIFT_CHOICES_UP ) -#ifdef PC - SIMPLE_CHOICE_RECT_OFFSET_BUTTON_SOUND( 6, 6, "@PLATFORM_EDIT", ITEM_ALIGN_MIDDLE_CENTER, open "custom_specialty_editor", when(dvarInt(scr_game_perks) == 1 && SHOULD_SHIFT_CHOICES_UP ), 20, CHOICE_SIZE_Y ) -#endif //PC - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #define CHOICE_SEP_1 2 - #define CHOICE_SEP_2 4 - #include "ui/choices_sep_spacing.inc" - BUTTON_7( 7, !SHOULD_SHIFT_CHOICES_UP ) -#ifdef PC - SIMPLE_CHOICE_RECT_OFFSET_BUTTON_SOUND( 7, 6, "@PLATFORM_EDIT", ITEM_ALIGN_MIDDLE_CENTER, open "custom_specialty_editor", when(dvarInt(scr_game_perks) == 1 && !SHOULD_SHIFT_CHOICES_UP ), 20, CHOICE_SIZE_Y ) -#endif //PC - - // Game Recording Option (on/off) - #define BUTTON_8( itemIndex, visArg ) \ - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( itemIndex, "@CUSTOM_GAME_RECORDING_CAPS", demo_recordPrivateMatch, \ - { "@MENU_DISABLED_CAPS" 0 "@MENU_ENABLED_CAPS" 1 }, \ - play CHOICE_FOCUS_SOUND;, \ - SET_CHOICE_DESC( "", "@CUSTOM_GAME_RECORDING_DESC", "" ), \ - CLEAR_CHOICE_DESC, \ - visArg && ( dvarInt( xblive_privatematch ) ) ) - - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #undef CHOICE_SEP_3 - #define CHOICE_SEP_1 1 - #define CHOICE_SEP_2 3 - #define CHOICE_SEP_3 6 - #include "ui/choices_sep_spacing.inc" - BUTTON_8( 7, SHOULD_SHIFT_CHOICES_UP ) - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #undef CHOICE_SEP_3 - #define CHOICE_SEP_1 2 - #define CHOICE_SEP_2 4 - #define CHOICE_SEP_3 7 - #include "ui/choices_sep_spacing.inc" - BUTTON_8( 8, !SHOULD_SHIFT_CHOICES_UP ) - - PREPROC_TEXT_DRAW_VIS_EX( NEW_FRAME_CHOICE_X_START (NEW_FRAME_CHOICE_Y_START + 230) CHOICE_SIZE_X 60 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@CUSTOM_WARN_DEMO_SIZE", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_ORANGE_RGB 1, - when( dvarInt( xblive_privatematch ) && dvarBool( demo_recordPrivateMatch ) ), autowrapped ); - -#ifdef PC - // Pregame Enabled (yes/no) - #define BUTTON_9( itemIndex, visArg ) \ - FRAME_CHOICE_DVARYESNO_FOCUS_VIS_EX( itemIndex, "@PATCH_PREGAME_ENABLED_CAPS", g_pregame_enabled, \ - play CHOICE_FOCUS_SOUND;, \ - SET_CHOICE_DESC( "", "@PLATFORM_PREGAME_ENABLED_DESC", "" );, \ - CLEAR_CHOICE_DESC, \ - visArg, ; ) - - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #undef CHOICE_SEP_3 - #undef CHOICE_SEP_4 - #define CHOICE_SEP_1 1 - #define CHOICE_SEP_2 3 - #define CHOICE_SEP_3 6 - #define CHOICE_SEP_4 7 - #include "ui/choices_sep_spacing.inc" - BUTTON_9( 8, SHOULD_SHIFT_CHOICES_UP ) - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #undef CHOICE_SEP_3 - #undef CHOICE_SEP_4 - #define CHOICE_SEP_1 2 - #define CHOICE_SEP_2 4 - #define CHOICE_SEP_3 7 - #define CHOICE_SEP_4 8 - #include "ui/choices_sep_spacing.inc" - BUTTON_9( 9, !SHOULD_SHIFT_CHOICES_UP ) - - // Pregame Minplayers (edit) - #define BUTTON_10( itemIndex, visArg ) \ - FRAME_CHOICE_DVAREDIT_NUMERIC_FOCUS_VIS_EX( itemIndex, "@PATCH_PREGAME_MINPLAYERS_CAPS", party_minplayers, 3, \ - ;, \ - SET_CHOICE_DESC( "", "@PLATFORM_PREGAME_MINPLAYERS_DESC", "" );, \ - CLEAR_CHOICE_DESC, \ - visArg, ; ) - - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #undef CHOICE_SEP_3 - #undef CHOICE_SEP_4 - #define CHOICE_SEP_1 1 - #define CHOICE_SEP_2 3 - #define CHOICE_SEP_3 6 - #define CHOICE_SEP_4 7 - #include "ui/choices_sep_spacing.inc" - BUTTON_10( 9, SHOULD_SHIFT_CHOICES_UP ) - #undef CHOICE_SEP_1 - #undef CHOICE_SEP_2 - #undef CHOICE_SEP_3 - #undef CHOICE_SEP_4 - #define CHOICE_SEP_1 2 - #define CHOICE_SEP_2 4 - #define CHOICE_SEP_3 7 - #define CHOICE_SEP_4 8 - #include "ui/choices_sep_spacing.inc" - BUTTON_10( 10, !SHOULD_SHIFT_CHOICES_UP ) - - CUSTOM_BUTTON( 14, "@CUSTOM_REVERT_CHANGES_CAPS", open popup_custom_confirm_revert;, "@CUSTOM_REVERT_CHANGES_DESC", "", 1 ) -#endif //#ifdef PC - - CUSTOM_FRAME_HINT( ui_choice_desc ) - - -#ifdef PC - NEW_FRAME_BACK_BUTTON_ACTION( CUSTOM_MODE_FRAME_WIDTH, CUSTOM_MODE_FRAME_HEIGHT, ON_ESC ) - SAVE_TO_FILESHARE_BUTTON_NEW_FRAME_ACTION( CUSTOM_MODE_FRAME_WIDTH, CUSTOM_MODE_FRAME_HEIGHT ) -#else //#ifdef PC - NEW_FRAME_BACK_BUTTON( CUSTOM_MODE_FRAME_WIDTH, CUSTOM_MODE_FRAME_HEIGHT ) - SAVE_TO_FILESHARE_BUTTON_NEW_FRAME( CUSTOM_MODE_FRAME_WIDTH, CUSTOM_MODE_FRAME_HEIGHT ) -#endif //#ifdef PC - -#ifndef PC - itemDef - { - type ITEM_TYPE_BUTTON - rect ( 180 ) ( CUSTOM_MODE_FRAME_HEIGHT / 2 + 18 ) 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - origin 0 0 - text "@CUSTOM_BUTTON_REVERT_CHANGES" - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_BOTTOM_LEFT - execkeyint BUTTON_Y - { - open popup_custom_confirm_revert; - } - visible 1 - decoration - } - - CUSTOM_MODE_RESET_TO_DEFAULT_BUTTON( CUSTOM_MODE_FRAME_WIDTH, CUSTOM_MODE_FRAME_HEIGHT, -76, open popup_custom_confirm_revert;, dvarBool( ui_custom_haschanged ) || dvarBool( customGameMode ) ) - - execKeyInt BUTTON_X - { - close self; - UPLOAD_TO_FILESHARE - } -#endif - } - -#ifdef PC - #define SAVE_ORIGINAL_SETTINGS_PC \ - exec set orig_host_name ( dvarString( sv_hostname ) ); \ - exec set orig_min_ping ( dvarInt( sv_minping ) ); \ - exec set orig_max_ping ( dvarInt( sv_maxping ) ); \ - exec set orig_password ( dvarString( g_password ) ); \ - exec set orig_voice ( dvarInt( sv_voice ) ); \ - exec set orig_allow_vote ( dvarInt( g_allowVote ) ); \ - exec set orig_sv_vac ( dvarInt( sv_vac ) ); -#else - #define SAVE_ORIGINAL_SETTINGS_PC -#endif - - #define SAVE_ORIGINAL_SETTINGS \ - exec set orig_time ( dvarFloat( ( "scr_" + dvarString( ui_gametype ) + "_timelimit" ) ) ); \ - exec set orig_score ( dvarInt( ( "scr_" + dvarString( ui_gametype ) + "_scorelimit" ) ) ); \ - exec set temp_time ( dvarFloat( ( "scr_" + dvarString( ui_gametype ) + "_timelimit" ) ) ); \ - exec set temp_score ( dvarInt( ( "scr_" + dvarString( ui_gametype ) + "_scorelimit" ) ) ); \ - exec set orig_num_bots_friendly ( dvarInt( bot_friends ) ); \ - exec set orig_num_bots_enemy ( dvarInt( bot_enemies ) ); \ - exec set orig_bot_difficulty ( dvarString( bot_difficulty ) ); \ - exec set orig_bot_show_tips ( dvarInt( bot_tips ) ); \ - exec set orig_botUseFriendNames ( dvarInt( sv_botUseFriendNames ) ); \ - SAVE_ORIGINAL_SETTINGS_PC - - #define SAVE_TIME_AND_SCORE \ - exec set ( "scr_" + dvarString( ui_gametype ) + "_timelimit" ) ( dvarFloat( temp_time ) ); \ - exec set ( "scr_" + dvarString( ui_gametype ) + "_scorelimit" ) ( dvarInt( temp_score ) ); - -#ifdef PC - #define RESET_TO_ORIGINAL_SETTINGS_PC \ - exec set sv_hostname ( dvarString( orig_host_name ) ); \ - exec set sv_minping ( dvarInt( orig_min_ping ) ); \ - exec set sv_maxping ( dvarInt( orig_max_ping ) ); \ - exec set g_password ( dvarString( orig_password ) ); \ - exec set sv_voice ( dvarInt( orig_voice ) ); \ - exec set g_allowVote ( dvarInt( orig_allow_vote ) ); \ - exec set sv_vac ( dvarInt( orig_sv_vac ) ); -#else - #define RESET_TO_ORIGINAL_SETTINGS_PC -#endif - - #define RESET_TO_ORIGINAL_SETTINGS \ - exec set ( "scr_" + dvarString( ui_gametype ) + "_scorelimit" ) ( dvarInt( orig_score ) ); \ - exec set ( "scr_" + dvarString( ui_gametype ) + "_timelimit" ) ( dvarFloat( orig_time ) ); \ - exec set ( "scr_" + dvarString( ui_gametype ) + "_scorelimit" ) ( dvarInt( orig_score ) ); \ - exec set temp_time ( dvarFloat( orig_time ) ); \ - exec set temp_score ( dvarInt( orig_score ) ); \ - exec set bot_friends ( dvarInt( orig_num_bots_friendly ) ); \ - exec set bot_enemies ( dvarInt( orig_num_bots_enemy ) ); \ - exec set bot_difficulty ( dvarString( orig_bot_difficulty ) ); \ - exec set bot_tips ( dvarInt( orig_bot_show_tips ) ); \ - exec set sv_botUseFriendNames ( dvarInt( orig_botUseFriendNames ) ); \ - RESET_TO_ORIGINAL_SETTINGS_PC - -#undef CHOICE_SEP_1 -#undef CHOICE_SEP_2 -#include "ui/choices_sep_spacing.inc" - -#ifdef PC - #define BUTTON_SPACING 20 - #define REVERT_CHANGES_OFFSET ( getTextWidth( locString( "@PLATFORM_BACK" ), CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) + 8 + BUTTON_SPACING ) - - #define BASIC_TRAINING_REVERT_CHANGES_BUTTON( FRAME_WIDTH, FRAME_HEIGHT, xArg, actionArg, visArg ) \ - NEW_FRAME_BUTTON_PC_LEFT_OFFSET( FRAME_WIDTH, FRAME_HEIGHT, REVERT_CHANGES_OFFSET, "@PLATFORM_REVERT_CHANGES", actionArg, visArg ) -#else // #ifdef PC - #define BASIC_TRAINING_REVERT_CHANGES_BUTTON( FRAME_WIDTH, FRAME_HEIGHT, xArg, actionArg, visArg ) \ - itemDef \ - { \ - type ITEM_TYPE_BUTTON \ - rect ( xArg ) ( FRAME_HEIGHT / 2 + 18 ) 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ - origin 0 0 \ - text "@PLATFORM_REVERT_CHANGES" \ - textfont CHOICE_TEXTFONT \ - textscale TEXTSIZE_DEFAULT \ - textalign ITEM_ALIGN_BOTTOM_LEFT \ - execkeyint BUTTON_BACK \ - { \ - actionArg \ - } \ - visible when( visArg ) \ - decoration \ - } -#endif // #else // #ifdef PC - -#undef NEW_FRAME_BUTTON_NAME -#define NEW_FRAME_BUTTON_NAME "basictraining_settings_" -#undef CHOICE_BUTTON_NAME -#define CHOICE_BUTTON_NAME "basictraining_settings_" - -#ifdef PC - #undef CHOICE_TEXTSIZE - #define CHOICE_TEXTSIZE TEXTSIZE_DEFAULT -#endif //PC - -#undef MENUDEF_NAME -#define MENUDEF_NAME basictraining_settings - menuDef - { - name basictraining_settings - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - - onOpen - { - execnow ui_animate basictraining_settings * highlightOff 0; - activateBlur; - focusFirst; - execnow "Updatedvarsfromprofile"; - SAVE_ORIGINAL_SETTINGS - - exec "set com_maxclients 30"; - exec "set sv_maxclients 30"; - exec "set party_maxplayers 30"; - exec "set sv_minping 0"; - exec "set sv_vac 0"; - exec "set bot_tips 0"; - } - onEsc - { - close self; - } - onClose - { - SAVE_TIME_AND_SCORE - exec "updategamerprofile"; - deactivateBlur; - } - - NEW_FRAME( NEW_FRAME_DEFAULT_WIDTH, NEW_FRAME_DEFAULT_HEIGHT ) - NEW_FRAME_TITLE( NEW_FRAME_DEFAULT_WIDTH, NEW_FRAME_DEFAULT_HEIGHT, "@MPUI_BASICTRAINING_SETTINGS_CAPS", 1 ) - - - #undef A_BUTTON_OFFSET_X - #define A_BUTTON_OFFSET_X 100000 - - #define IS_WAGER_GAME \ - ( dvarString( "ui_gametype" ) == "hlnd" || dvarString( "ui_gametype" ) == "oic" || dvarString( "ui_gametype" ) == "gun" || dvarString( "ui_gametype" ) == "shrp" ) - - #define IS_TEAM_GAME \ - ( dvarString( "ui_gametype" ) == "tdm" || dvarString( "ui_gametype" ) == "hc_tdm" || dvarString( "ui_gametype" ) == "sd" || dvarString( "ui_gametype" ) == "dom" || dvarString( "ui_gametype" ) == "koth" || dvarString( "ui_gametype" ) == "dem" || dvarString( "ui_gametype" ) == "ctf" || dvarString( "ui_gametype" ) == "sab" ) - - #define IS_FFA_GAME \ - ( dvarString( "ui_gametype" ) == "dm" || dvarString( "ui_gametype" ) == "hc_dm" ) - - #define BALANCE_TEAMS_FRIENDLY \ - if( dvarInt( bot_friends ) + dvarInt( bot_enemies ) > dvarInt( party_maxplayers ) ) \ - { \ - exec set bot_enemies ( dvarInt( party_maxplayers ) - dvarInt( bot_friends ) ); \ - } \ - - #define BALANCE_TEAMS_ENEMY \ - if( dvarInt( bot_enemies ) + dvarInt( bot_friends ) > dvarInt( party_maxplayers ) ) \ - { \ - exec set bot_friends ( dvarInt( party_maxplayers ) - dvarInt( bot_enemies ) ); \ - } \ - - // tdm & hardcore tdm - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 1, CHOICE1_TEXT, temp_time, CHOICE1_STRLIST, ;, SET_CHOICE_DESC( "", CHOICE1_DESC, "" ), CLEAR_CHOICE_DESC, IS_TEAM_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 2, CHOICE2_TEXT, temp_score, CHOICE2_STRLIST, exec checkIfCustomGametypeChanged; CHOICE2_EXEC, SET_CHOICE_DESC( "", CHOICE2_DESC, "" ) setLocalVarBool ui_choice_hideaccept 1;, CLEAR_CHOICE_DESC setLocalVarBool ui_choice_hideaccept 0;, CHOICE2_VIS && IS_TEAM_GAME ) - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 2, CHOICE2_ALT_TEXT, temp_score, CHOICE2_ALT_STRLIST, exec checkIfCustomGametypeChanged; CHOICE2_ALT_EXEC, SET_CHOICE_DESC( "", CHOICE2_DESC, "" ) setLocalVarBool ui_choice_hideaccept 1;, CLEAR_CHOICE_DESC setLocalVarBool ui_choice_hideaccept 0;, CHOICE2_ALT_VIS && IS_TEAM_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 3, "@MPUI_FRIENDLY_PRACTICE_DUMMIES_CAPS", - bot_friends, - { "@MPUI_1_BOTS" 1 "@MPUI_2_BOTS" 2 "@MPUI_3_BOTS" 3 "@MPUI_4_BOTS" 4 "@MPUI_5_BOTS" 5 "@MPUI_6_BOTS" 6 "@MPUI_7_BOTS" 7 "@MPUI_8_BOTS" 8 "@MPUI_9_BOTS" 9 "@MPUI_10_BOTS" 10 "@MPUI_11_BOTS" 11 }, - BALANCE_TEAMS_FRIENDLY;, - SET_CHOICE_DESC( "", "@MPUI_FRIENDLY_PRACTICE_DUMMIES_DESC", "" ), - CLEAR_CHOICE_DESC, IS_TEAM_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 4, "@MPUI_FRIENDLY_PRACTICE_DUMMIES_CAPS", - bot_friends_extra, - { "0" 0 "1" 1 "2" 2 "3" 3 "4" 4 "5" 5 "6" 6 "7" 7 "8" 8 "9" 9 "10" 10 "11" 11 "12" 12 "13" 13 "14" 14 "15" 15 "16" 16 "17" 17 "18" 18 "19" 19 }, - ;, - SET_CHOICE_DESC( "", "@MPUI_FRIENDLY_PRACTICE_DUMMIES_DESC", "" ), - CLEAR_CHOICE_DESC, IS_TEAM_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 5, "@MPUI_ENEMY_PRACTICE_DUMMIES_CAPS", - bot_enemies, - { "@MPUI_1_BOTS" 1 "@MPUI_2_BOTS" 2 "@MPUI_3_BOTS" 3 "@MPUI_4_BOTS" 4 "@MPUI_5_BOTS" 5 "@MPUI_6_BOTS" 6 "@MPUI_7_BOTS" 7 "@MPUI_8_BOTS" 8 "@MPUI_9_BOTS" 9 "@MPUI_10_BOTS" 10 "@MPUI_11_BOTS" 11 }, - BALANCE_TEAMS_ENEMY;, - SET_CHOICE_DESC( "", "@MPUI_ENEMY_PRACTICE_DUMMIES_DESC", "" ), - CLEAR_CHOICE_DESC, IS_TEAM_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 6, "@MPUI_ENEMY_PRACTICE_DUMMIES_CAPS", - bot_enemies_extra, - { "-1" -1 "0" 0 "1" 1 "2" 2 "3" 3 "4" 4 "5" 5 "6" 6 "7" 7 "8" 8 "9" 9 "10" 10 "11" 11 "12" 12 "13" 13 "14" 14 "15" 15 "16" 16 "17" 17 "18" 18 }, - ;, - SET_CHOICE_DESC( "", "@MPUI_ENEMY_PRACTICE_DUMMIES_DESC", "" ), - CLEAR_CHOICE_DESC, IS_TEAM_GAME ) - - FRAME_CHOICE_DVARSTRINGLIST_FOCUS_VIS( 7, "@MENU_BASICTRAINING_DIFFICULTY_CAPS", - bot_difficulty, - { "@MENU_BASICTRAINING_EASY_CAPS" easy "@MENU_BASICTRAINING_NORMAL_CAPS" normal "@MENU_BASICTRAINING_HARD_CAPS" hard "@MENU_BASICTRAINING_FU_CAPS" fu }, - ;, - SET_CHOICE_DESC( "", "@MPUI_BASICTRAINING_DIFFICULTY_DESC", "" ), - CLEAR_CHOICE_DESC, IS_TEAM_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 8, "@PLATFORM_BASICTRAINING_FRIEND_NAMES_CAPS", - sv_botUseFriendNames, - { "@MENU_DISABLED_CAPS" 0 "@MENU_ENABLED_CAPS" 1 }, - ;, - SET_CHOICE_DESC( "", "@MPUI_BASICTRAINING_FRIEND_NAMES_DESC", "" ), - CLEAR_CHOICE_DESC, IS_TEAM_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 9, "REASONABLE SETUPS", - bot_reasonable, - { "DISABLED" 0 "ENABLED" 1 }, - ;, - SET_CHOICE_DESC( "", "Bots will only use weapons, perks and killstreaks that are 'good' and/or 'overpowered' for themselves.", "" ), - CLEAR_CHOICE_DESC, IS_TEAM_GAME ) - - // ffa & hardcore ffa - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 1, CHOICE1_TEXT, temp_time, CHOICE1_STRLIST, ;, SET_CHOICE_DESC( "", CHOICE1_DESC, "" ), CLEAR_CHOICE_DESC, IS_FFA_GAME ) - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 2, CHOICE2_ALT_TEXT, temp_score, CHOICE2_ALT_STRLIST, ;, SET_CHOICE_DESC( "", CHOICE2_DESC, "" ), CLEAR_CHOICE_DESC, IS_FFA_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 3, "@MPUI_ENEMY_PRACTICE_DUMMIES_CAPS", - bot_enemies, - { "@MPUI_1_BOTS" 1 "@MPUI_2_BOTS" 2 "@MPUI_3_BOTS" 3 "@MPUI_4_BOTS" 4 "@MPUI_5_BOTS" 5 "@MPUI_6_BOTS" 6 "@MPUI_7_BOTS" 7 "@MPUI_8_BOTS" 8 "@MPUI_9_BOTS" 9 "@MPUI_10_BOTS" 10 "@MPUI_11_BOTS" 11 }, - BALANCE_TEAMS_ENEMY;, - SET_CHOICE_DESC( "", "@MPUI_ENEMY_PRACTICE_DUMMIES_DESC", "" ), - CLEAR_CHOICE_DESC, IS_FFA_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 4, "@MPUI_ENEMY_PRACTICE_DUMMIES_CAPS", - bot_enemies_extra, - { "-1" -1 "0" 0 "1" 1 "2" 2 "3" 3 "4" 4 "5" 5 "6" 6 "7" 7 "8" 8 "9" 9 "10" 10 "11" 11 "12" 12 "13" 13 "14" 14 "15" 15 "16" 16 "17" 17 "18" 18 }, - ;, - SET_CHOICE_DESC( "", "@MPUI_ENEMY_PRACTICE_DUMMIES_DESC", "" ), - CLEAR_CHOICE_DESC, IS_FFA_GAME ) - - FRAME_CHOICE_DVARSTRINGLIST_FOCUS_VIS( 5, "@MENU_BASICTRAINING_DIFFICULTY_CAPS", - bot_difficulty, - { "@MENU_BASICTRAINING_EASY_CAPS" easy "@MENU_BASICTRAINING_NORMAL_CAPS" normal "@MENU_BASICTRAINING_HARD_CAPS" hard "@MENU_BASICTRAINING_FU_CAPS" fu }, - ;, - SET_CHOICE_DESC( "", "@MPUI_BASICTRAINING_DIFFICULTY_DESC", "" ), - CLEAR_CHOICE_DESC, IS_FFA_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 6, "@PLATFORM_BASICTRAINING_FRIEND_NAMES_CAPS", - sv_botUseFriendNames, - { "@MENU_DISABLED_CAPS" 0 "@MENU_ENABLED_CAPS" 1 }, - ;, - SET_CHOICE_DESC( "", "@MPUI_BASICTRAINING_FRIEND_NAMES_DESC", "" ), - CLEAR_CHOICE_DESC, IS_FFA_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 7, "REASONABLE SETUPS", - bot_reasonable, - { "DISABLED" 0 "ENABLED" 1 }, - ;, - SET_CHOICE_DESC( "", "Bots will only use weapons, perks and killstreaks that are 'good' and/or 'overpowered' for themselves.", "" ), - CLEAR_CHOICE_DESC, IS_FFA_GAME ) - - // wager matches - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 1, "@MPUI_ENEMY_PRACTICE_DUMMIES_CAPS", - bot_enemies, - { "@MPUI_1_BOTS" 1 "@MPUI_2_BOTS" 2 "@MPUI_3_BOTS" 3 "@MPUI_4_BOTS" 4 "@MPUI_5_BOTS" 5 "@MPUI_6_BOTS" 6 "@MPUI_7_BOTS" 7 "@MPUI_8_BOTS" 8 "@MPUI_9_BOTS" 9 "@MPUI_10_BOTS" 10 "@MPUI_11_BOTS" 11 }, - BALANCE_TEAMS_ENEMY;, - SET_CHOICE_DESC( "", "@MPUI_ENEMY_PRACTICE_DUMMIES_DESC", "" ), - CLEAR_CHOICE_DESC, IS_WAGER_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 2, "@MPUI_ENEMY_PRACTICE_DUMMIES_CAPS", - bot_enemies_extra, - { "-1" -1 "0" 0 "1" 1 "2" 2 "3" 3 "4" 4 "5" 5 "6" 6 "7" 7 "8" 8 "9" 9 "10" 10 "11" 11 "12" 12 "13" 13 "14" 14 "15" 15 "16" 16 "17" 17 "18" 18 }, - ;, - SET_CHOICE_DESC( "", "@MPUI_ENEMY_PRACTICE_DUMMIES_DESC", "" ), - CLEAR_CHOICE_DESC, IS_WAGER_GAME ) - - FRAME_CHOICE_DVARSTRINGLIST_FOCUS_VIS( 3, "@MENU_BASICTRAINING_DIFFICULTY_CAPS", - bot_difficulty, - { "@MENU_BASICTRAINING_EASY_CAPS" easy "@MENU_BASICTRAINING_NORMAL_CAPS" normal "@MENU_BASICTRAINING_HARD_CAPS" hard "@MENU_BASICTRAINING_FU_CAPS" fu }, - ;, - SET_CHOICE_DESC( "", "@MPUI_BASICTRAINING_DIFFICULTY_DESC", "" ), - CLEAR_CHOICE_DESC, IS_WAGER_GAME ) - - FRAME_CHOICE_DVARFLOATLIST_FOCUS_VIS( 4, "@PLATFORM_BASICTRAINING_FRIEND_NAMES_CAPS", - sv_botUseFriendNames, - { "@MENU_DISABLED_CAPS" 0 "@MENU_ENABLED_CAPS" 1 }, - ;, - SET_CHOICE_DESC( "", "@MPUI_BASICTRAINING_FRIEND_NAMES_DESC", "" ), - CLEAR_CHOICE_DESC, IS_WAGER_GAME ) - - #undef CHOICE_DVAR_WIDTH_OFFSET - #define CHOICE_DVAR_WIDTH_OFFSET 60 - FRAME_CHOICE_DVAREDIT_FOCUS_VIS_EX( 10, "@PLATFORM_SERVER_NAME_CAPS", - "sv_hostname", 20, 20, - ;, - SET_CHOICE_DESC( "", "@PATCH_SERVER_NAME_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - FRAME_CHOICE_DVAREDIT_NUMERIC_FOCUS_VIS_EX( 11, "@PLATFORM_MAXIMUM_PING_CAPS", - "sv_maxping", 4, - ;, - SET_CHOICE_DESC( "", "@PATCH_MAXIMUM_PING_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - FRAME_CHOICE_DVAREDIT_FOCUS_VIS_EX( 12, "@PLATFORM_PASSWORD1_CAPS", - "g_password", 12, 12, - ;, - SET_CHOICE_DESC( "", "@PATCH_PASSWORD_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - FRAME_CHOICE_DVARYESNO_FOCUS_VIS_EX( 13, "@PLATFORM_VOICECHAT_CAPS", - "sv_voice", - ;, - SET_CHOICE_DESC( "", "@PATCH_VOICECHAT_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - #undef CHOICE_TEXT_COLOR - #define CHOICE_TEXT_COLOR 1 1 1 1 - - #undef A_BUTTON_OFFSET_X - #define A_BUTTON_OFFSET_X 0 - - CUSTOM_FRAME_HINT( ui_choice_desc ) - - BASIC_TRAINING_REVERT_CHANGES_BUTTON( NEW_FRAME_DEFAULT_WIDTH, NEW_FRAME_DEFAULT_HEIGHT, -76, open popup_basictraining_confirm_revert;, 1 ) -#ifdef PC - NEW_FRAME_BACK_BUTTON_ACTION( NEW_FRAME_DEFAULT_WIDTH, NEW_FRAME_DEFAULT_HEIGHT, close self; ) -#else //#ifdef PC - NEW_FRAME_BACK_BUTTON( NEW_FRAME_DEFAULT_WIDTH, NEW_FRAME_DEFAULT_HEIGHT ) -#endif //#ifdef PC - } - - #include "ui_mp/popupstyle.inc" - -// mekberg: No idea why the above include is not setting this. I've wasted a half hour trying to figure why. Instead I'm just going to hack this here. -#ifdef PC -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X (POPUP_WIDTH-(POPUP_SIDE_PAD*2)) -#endif // PC - - menuDef - { - #define CUSTOM_ERROR_ONESC \ - uiScript clearError; \ - close self; - - SYSTEM_POPUP_SETUP_VIS( popup_custom_game_error, ;, CUSTOM_ERROR_ONESC, 1 ) - SYSTEM_POPUP_TITLE_VIS( dvarString( "com_errorTitle" ), 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( dvarString( "com_errorMessage" ), 1 ) - - #define CUSTOM_ERROR_ACTION \ - play CHOICE_FOCUS_SOUND; \ - uiScript clearError; \ - close self; - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 1, "@MENU_EXIT", CUSTOM_ERROR_ACTION, play CHOICE_FOCUS_SOUND, ;, 1, ; ) - -#ifndef PC - SYSTEM_POPUP_BACK_BUTTON -#endif //#ifndef PC - } - - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( "popup_custom_confirm_revert", setfocus popup_custom_confirm_revert_2, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@CUSTOM_REVERT_CHANGES_CONFIRM_TITLE", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_YES_CAPS", execNow "revertCustomGametypeChanges"; exec "xupdatepartystate"; close self, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_NO_CAPS", close self, 1, name popup_custom_confirm_revert_2 ) - -#ifndef PC - SYSTEM_POPUP_BACK_BUTTON -#endif //#ifndef PC - } - - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( "popup_basictraining_confirm_revert", setfocus popup_basictraining_confirm_revert_2, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MPUI_REVERT_BASICTRAINING_CONFIRM_TITLE", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_YES", RESET_TO_ORIGINAL_SETTINGS close self, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_NO", close self, 1, name popup_basictraining_confirm_revert_2 ) - -#ifndef PC - SYSTEM_POPUP_BACK_BUTTON -#endif //#ifndef PC - } -} diff --git a/mods/patch_mp/ui_mp/custom_settings_general.menu b/mods/patch_mp/ui_mp/custom_settings_general.menu deleted file mode 100644 index 5e758c0..0000000 --- a/mods/patch_mp/ui_mp/custom_settings_general.menu +++ /dev/null @@ -1,423 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui_mp/custom_mode.inc" - -#define IS_TEAM_MODE \ - ( dvarString( "ui_gametype" ) != "dm" ) - -#define GAME_OPTIONS_MENU_NAME "custom_settings_general" -#define MENUDEF_NAME custom_settings_general -#define CUSTOM_GAME_OPTIONS_TITLE "@CUSTOM_GENERAL_OPTIONS_CAPS" - -#define CHOICE1_TEXT "@CUSTOM_OPT_HARDCORE" -#define CHOICE1_DESC "@CUSTOM_OPT_HARDCORE_DESC" -#define CHOICE1_DVAR "scr_hardcore" -#define CHOICE1_DVARTEXT CHOICE1_DVAR"_text" -#define CHOICE1_SHOW 1 -#define CHOICE1_EXEC1 execNowOnDvarIntValue scr_hardcore 0 "exec hardcore_disable.cfg"; -#define CHOICE1_EXEC2 execNowOnDvarIntValue scr_hardcore 1 "exec hardcore_settings.cfg"; -#define CHOICE1_STRLIST { "@MENU_DISABLED_CAPS" 0 "@MENU_ENABLED_CAPS" 1} -#define CHOICE1_EXEC play CHOICE_FOCUS_SOUND; CHOICE1_EXEC1 CHOICE1_EXEC2 -#define CHOICE1_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE1_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; - -#define CHOICE2_TEXT "@CUSTOM_OPT_KILLCAM" -#define CHOICE2_DESC "@CUSTOM_OPT_KILLCAM_DESC" -#define CHOICE2_DVAR "scr_game_allowkillcam" -#define CHOICE2_DVARTEXT CHOICE2_DVAR"_text" -#define CHOICE2_SHOW 1 -#define CHOICE2_STRLIST { "@MENU_DISABLED_CAPS" 0 "@MENU_ENABLED_CAPS" 1} -#define CHOICE2_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE2_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; - -#define CHOICE3_TEXT "@CUSTOM_OPT_HEADSHOTS_ONLY" -#define CHOICE3_DESC "@CUSTOM_OPT_HEADSHOT_ONLY_DESC" -#define CHOICE3_DVAR "scr_game_onlyheadshots" -#define CHOICE3_DVARTEXT CHOICE3_DVAR"_text" -#define CHOICE3_SHOW 1 -#define CHOICE3_STRLIST { "@MENU_DISABLED_CAPS" 0 "@MENU_ENABLED_CAPS" 1} -#define CHOICE3_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE3_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; - -#define CHOICE4_TEXT "@CUSTOM_OPT_ALLOW_SPRINT" -#define CHOICE4_DESC "@CUSTOM_OPT_ALLOW_SPRINT_DESC" -#define CHOICE4_DVAR "scr_player_sprintTime" -#define CHOICE4_DVARTEXT CHOICE4_DVAR"_text" -#define CHOICE4_SHOW 1 -#define CHOICE4_STRLIST { "@MENU_DISABLED_CAPS" 0 "@MENU_ENABLED_CAPS" 4} -#define CHOICE4_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE4_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; - -#define CHOICE_SEP_1 4 - -#define CHOICE_EXTRA \ - CUSTOM_BUTTON( 5, "@CUSTOM_RESPAWN_OPTIONS", execNow openMenu "popup_respawn_settings";, "@CUSTOM_RESPAWN_OPTIONS_DESC", "", 1 ) \ - CUSTOM_BUTTON( 6, "@CUSTOM_LIVES_AND_HEALTH_OPTIONS", execNow openMenu "popup_lives_and_health_settings";, "@CUSTOM_LIVES_AND_HEALTH_OPTIONS_DESC", "", 1 ) \ - CUSTOM_BUTTON( 7, "@CUSTOM_TEAM_OPTIONS", execNow openMenu "popup_team_settings";, "@CUSTOM_TEAM_OPTIONS_DESC", "", IS_TEAM_MODE ) \ - CUSTOM_BUTTON( 7, "@CUSTOM_FFA_SPECTATE_OPTIONS", execNow openMenu "popup_ffa_spectate_settings";, "@CUSTOM_FFA_SPECTATE_OPTIONS_DESC", "", !IS_TEAM_MODE ) \ - -{ - #include "ui_mp/custom_game_options.inc" -} - -#define CUSTOM_OPTION_POPUP_WIDTH 320 -#define CUSTOM_OPTION_POPUP_HEIGHT 195 - -#define CUSTOM_OPTION_POPUP_HINT_Y_OFFSET 70 - -#define CUSTOM_OPTION_POPUP_DVAR_OFFSET_X 110 - -//*********************************************************************************** -// Respawn Settings -//*********************************************************************************** -#undef MENUDEF_NAME -#define CUSTOM_OPTIONS_POPUP_MENU_NAME "popup_respawn_settings" -#define MENUDEF_NAME popup_respawn_settings -#define CUSTOM_OPTIONS_POPUP_TITLE "@CUSTOM_RESPAWN_OPTIONS" -#define CUSTOM_OPTIONS_POPUP_NUM_ITEMS 3 - -#define CHOICE1_TEXT "@CUSTOM_RESPAWN_DELAY" -#define CHOICE1_DESC "@CUSTOM_RESPAWN_DELAY_DESC" -#define CHOICE1_DVAR "custom_playerrespawndelay" -#define CHOICE1_DVARTEXT CHOICE1_DVAR"_text" -#define CHOICE1_SHOW 1 -#define CHOICE1_STR1 "@MPUI_RULES_NONE_CAPS" -#define CHOICE1_STR2 "@MPUI_RULES_2_5SECONDS_CAPS" -#define CHOICE1_STR3 "@MPUI_RULES_5SECONDS_CAPS" -#define CHOICE1_STR4 "@MPUI_RULES_7_5SECONDS_CAPS" -#define CHOICE1_STR5 "@MPUI_RULES_10SECONDS_CAPS" -#define CHOICE1_STR6 "@MPUI_RULES_15SECONDS_CAPS" -#define CHOICE1_STR7 "@MPUI_RULES_20SECONDS_CAPS" -#define CHOICE1_STR8 "@MPUI_RULES_30SECONDS_CAPS" -#define CHOICE1_STR9 "@MPUI_RULES_40SECONDS_CAPS" -#define CHOICE1_STR10 "@MPUI_RULES_50SECONDS_CAPS" -#define CHOICE1_STR11 "@MPUI_RULES_1MINUTE_CAPS" -#define CHOICE1_STR12 "@MPUI_RULES_1_5MINUTES_CAPS" -#define CHOICE1_VAL1 0 -#define CHOICE1_VAL2 2.5 -#define CHOICE1_VAL3 5 -#define CHOICE1_VAL4 7.5 -#define CHOICE1_VAL5 10 -#define CHOICE1_VAL6 15 -#define CHOICE1_VAL7 20 -#define CHOICE1_VAL8 30 -#define CHOICE1_VAL9 40 -#define CHOICE1_VAL10 50 -#define CHOICE1_VAL11 60 -#define CHOICE1_VAL12 90 -#define CHOICE1_EXEC ; -#define CHOICE1_STRLIST { CHOICE1_STR1 CHOICE1_VAL1 CHOICE1_STR2 CHOICE1_VAL2 CHOICE1_STR3 CHOICE1_VAL3 CHOICE1_STR4 CHOICE1_VAL4 CHOICE1_STR5 CHOICE1_VAL5 CHOICE1_STR6 CHOICE1_VAL6 CHOICE1_STR7 CHOICE1_VAL7 CHOICE1_STR8 CHOICE1_VAL8 CHOICE1_STR9 CHOICE1_VAL9 CHOICE1_STR10 CHOICE1_VAL10 CHOICE1_STR11 CHOICE1_VAL11 CHOICE1_STR12 CHOICE1_VAL12 } -#define CHOICE1_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE1_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; -#define CHOICE1_NUMVALS 12 - -#define CHOICE2_TEXT "@CUSTOM_RULES_FORCE_RESPAWN" -#define CHOICE2_DESC "@CUSTOM_FORCE_RESPAWN_DESC" -#define CHOICE2_DVAR "scr_player_forcerespawn" -#define CHOICE2_DVARTEXT CHOICE2_DVAR"_text" -#define CHOICE2_SHOW 1 -#define CHOICE2_STRLIST { "@MENU_DISABLED_CAPS" 0 "@MENU_ENABLED_CAPS" 1} -#define CHOICE2_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE2_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; -#define CHOICE2_VIS dvarFloat( custom_waverespawndelay ) == 0 -#define CHOICE2_DISABLED_DESC "@CUSTOM_FORCE_RESPAWN_DISABLED_DESC" -#define CHOICE2_DISABLE_ON_INVIS 1 - -#define CHOICE3_TEXT "@CUSTOM_WAVE_RESPAWN_DELAY" -#define CHOICE3_DESC "@CUSTOM_WAVE_RESPAWN_DELAY_DESC" -#define CHOICE3_DVAR custom_waverespawndelay -#define CHOICE3_DVARTEXT CHOICE3_DVAR"_text" -#define CHOICE3_SHOW 1 -#define CHOICE3_STR1 "@MPUI_RULES_NONE_CAPS" -#define CHOICE3_STR2 "@MPUI_RULES_5SECONDS_CAPS" -#define CHOICE3_STR3 "@MPUI_RULES_10SECONDS_CAPS" -#define CHOICE3_STR4 "@MPUI_RULES_15SECONDS_CAPS" -#define CHOICE3_STR5 "@MPUI_RULES_30SECONDS_CAPS" -#define CHOICE3_STR6 "" -#define CHOICE3_STR7 "" -#define CHOICE3_STR8 "" -#define CHOICE3_STR9 "" -#define CHOICE3_STR10 "" -#define CHOICE3_STR11 "" -#define CHOICE3_STR12 "" -#define CHOICE3_VAL1 0 -#define CHOICE3_VAL2 5 -#define CHOICE3_VAL3 10 -#define CHOICE3_VAL4 15 -#define CHOICE3_VAL5 30 -#define CHOICE3_VAL6 0 -#define CHOICE3_VAL7 0 -#define CHOICE3_VAL8 0 -#define CHOICE3_VAL9 0 -#define CHOICE3_VAL10 0 -#define CHOICE3_VAL11 0 -#define CHOICE3_VAL12 0 -#define CHOICE3_EXEC ; -#define CHOICE3_STRLIST { CHOICE3_STR1 CHOICE3_VAL1 CHOICE3_STR2 CHOICE3_VAL2 CHOICE3_STR3 CHOICE3_VAL3 CHOICE3_STR4 CHOICE3_VAL4 CHOICE3_STR5 CHOICE3_VAL5 CHOICE3_STR6 CHOICE3_VAL6 CHOICE3_STR7 CHOICE3_VAL7 CHOICE3_STR8 CHOICE3_VAL8 CHOICE3_STR9 CHOICE3_VAL9 CHOICE3_STR10 CHOICE3_VAL10 CHOICE3_STR11 CHOICE3_VAL11 CHOICE3_STR12 CHOICE3_VAL12 } -#define CHOICE3_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE3_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; -#define CHOICE3_NUMVALS 5 - -#define CUSTOM_RESET_TO_DEFAULT resetdvar CHOICE1_DVAR; resetdvar CHOICE2_DVAR; resetdvar CHOICE3_DVAR; - -{ - #include "ui_mp/custom_options_popup.inc" -} - -//*********************************************************************************** -// Lives & Health -//*********************************************************************************** -#define CUSTOM_OPTIONS_POPUP_MENU_NAME "popup_lives_and_health_settings" -#define MENUDEF_NAME popup_lives_and_health_settings -#define CUSTOM_OPTIONS_POPUP_TITLE "@CUSTOM_LIVES_AND_HEALTH_OPTIONS_CAPS" -#define CUSTOM_OPTIONS_POPUP_NUM_ITEMS 3 - -#define CHOICE1_TEXT "@CUSTOM_NUMBER_OF_LIVES" -#define CHOICE1_DESC "@CUSTOM_NUMBER_OF_LIVES_DESC" -#define CHOICE1_DVAR "custom_numlives" -#define CHOICE1_DVARTEXT CHOICE1_DVAR"_text" -#define CHOICE1_SHOW 1 -#define CHOICE1_STR1 "@MPUI_RULES_UNLIMITED_CAPS" -#define CHOICE1_STR2 "@MPUI_RULES_ITEM_LIFE_CAPS" -#define CHOICE1_STR3 "@MPUI_RULES_ITEM_2LIVES_CAPS" -#define CHOICE1_STR4 "@MPUI_RULES_ITEM_3LIVES_CAPS" -#define CHOICE1_STR5 "@MPUI_RULES_ITEM_5LIVES_CAPS" -#define CHOICE1_STR6 "@MPUI_RULES_ITEM_9LIVES_CAPS" -#define CHOICE1_STR7 "" -#define CHOICE1_STR8 "" -#define CHOICE1_STR9 "" -#define CHOICE1_STR10 "" -#define CHOICE1_STR11 "" -#define CHOICE1_STR12 "" -#define CHOICE1_VAL1 0 -#define CHOICE1_VAL2 1 -#define CHOICE1_VAL3 2 -#define CHOICE1_VAL4 3 -#define CHOICE1_VAL5 5 -#define CHOICE1_VAL6 9 -#define CHOICE1_VAL7 0 -#define CHOICE1_VAL8 0 -#define CHOICE1_VAL9 0 -#define CHOICE1_VAL10 0 -#define CHOICE1_VAL11 0 -#define CHOICE1_VAL12 0 -#define CHOICE1_EXEC ; -#define CHOICE1_STRLIST { CHOICE1_STR1 CHOICE1_VAL1 CHOICE1_STR2 CHOICE1_VAL2 CHOICE1_STR3 CHOICE1_VAL3 CHOICE1_STR4 CHOICE1_VAL4 CHOICE1_STR5 CHOICE1_VAL5 CHOICE1_STR6 CHOICE1_VAL6 CHOICE1_STR7 CHOICE1_VAL7 CHOICE1_STR8 CHOICE1_VAL8 CHOICE1_STR9 CHOICE1_VAL9 CHOICE1_STR10 CHOICE1_VAL10 CHOICE1_STR11 CHOICE1_VAL11 CHOICE1_STR12 CHOICE1_VAL12 } -#define CHOICE1_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE1_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; -#define CHOICE1_NUMVALS 6 - -#define CHOICE2_TEXT "@CUSTOM_MAX_HEALTH" -#define CHOICE2_DESC "@CUSTOM_MAX_HEALTH_DESC" -#define CHOICE2_DVAR "scr_player_maxhealth" -#define CHOICE2_DVARTEXT CHOICE2_DVAR"_text" -#define CHOICE2_SHOW 1 -#define CHOICE2_STR1 "@MPUI_RULES_MINISCULE_CAPS" -#define CHOICE2_STR2 "@MPUI_RULES_HALF_CAPS" -#define CHOICE2_STR3 "@MPUI_RULES_NORMAL_CAPS" -#define CHOICE2_STR4 "@MPUI_RULES_DOUBLE_CAPS" -#define CHOICE2_STR5 "" -#define CHOICE2_STR6 "" -#define CHOICE2_STR7 "" -#define CHOICE2_STR8 "" -#define CHOICE2_STR9 "" -#define CHOICE2_STR10 "" -#define CHOICE2_STR11 "" -#define CHOICE2_STR12 "" -#define CHOICE2_VAL1 30 -#define CHOICE2_VAL2 50 -#define CHOICE2_VAL3 100 -#define CHOICE2_VAL4 200 -#define CHOICE2_VAL5 0 -#define CHOICE2_VAL6 0 -#define CHOICE2_VAL7 0 -#define CHOICE2_VAL8 0 -#define CHOICE2_VAL9 0 -#define CHOICE2_VAL10 0 -#define CHOICE2_VAL11 0 -#define CHOICE2_VAL12 0 -#define CHOICE2_EXEC ; -#define CHOICE2_STRLIST { CHOICE2_STR1 CHOICE2_VAL1 CHOICE2_STR2 CHOICE2_VAL2 CHOICE2_STR3 CHOICE2_VAL3 CHOICE2_STR4 CHOICE2_VAL4 CHOICE2_STR5 CHOICE2_VAL5 CHOICE2_STR6 CHOICE2_VAL6 CHOICE2_STR7 CHOICE2_VAL7 CHOICE2_STR8 CHOICE2_VAL8 CHOICE2_STR9 CHOICE2_VAL9 CHOICE2_STR10 CHOICE2_VAL10 CHOICE2_STR11 CHOICE2_VAL11 CHOICE2_STR12 CHOICE2_VAL12 } -#define CHOICE2_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE2_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; -#define CHOICE2_NUMVALS 4 -#define CHOICE2_VIS dvarInt( "custom_class_mode" ) != 1 -#define CHOICE2_DISABLED_DESC "@CUSTOM_MAX_HEALTH_DISABLED_DESC" -#define CHOICE2_DISABLE_ON_INVIS 1 - -#define CHOICE3_TEXT "@CUSTOM_HEALTH_REGEN" -#define CHOICE3_DESC "@CUSTOM_HEALTH_REGEN_DESC" -#define CHOICE3_DVAR "scr_player_healthregentime" -#define CHOICE3_DVARTEXT CHOICE3_DVAR"_text" -#define CHOICE3_SHOW 1 -#define CHOICE3_STR1 "@MPUI_RULES_NONE_CAPS" -#define CHOICE3_STR2 "@MPUI_RULES_FAST_CAPS" -#define CHOICE3_STR3 "@MPUI_RULES_NORMAL_CAPS" -#define CHOICE3_STR4 "@MPUI_RULES_SLOW_CAPS" -#define CHOICE3_STR5 "" -#define CHOICE3_STR6 "" -#define CHOICE3_STR7 "" -#define CHOICE3_STR8 "" -#define CHOICE3_STR9 "" -#define CHOICE3_STR10 "" -#define CHOICE3_STR11 "" -#define CHOICE3_STR12 "" -#define CHOICE3_VAL1 0 -#define CHOICE3_VAL2 2 -#define CHOICE3_VAL3 5 -#define CHOICE3_VAL4 10 -#define CHOICE3_VAL5 0 -#define CHOICE3_VAL6 0 -#define CHOICE3_VAL7 0 -#define CHOICE3_VAL8 0 -#define CHOICE3_VAL9 0 -#define CHOICE3_VAL10 0 -#define CHOICE3_VAL11 0 -#define CHOICE3_VAL12 0 -#define CHOICE3_EXEC ; -#define CHOICE3_STRLIST { CHOICE3_STR1 CHOICE3_VAL1 CHOICE3_STR2 CHOICE3_VAL2 CHOICE3_STR3 CHOICE3_VAL3 CHOICE3_STR4 CHOICE3_VAL4 CHOICE3_STR5 CHOICE3_VAL5 CHOICE3_STR6 CHOICE3_VAL6 CHOICE3_STR7 CHOICE3_VAL7 CHOICE3_STR8 CHOICE3_VAL8 CHOICE3_STR9 CHOICE3_VAL9 CHOICE3_STR10 CHOICE3_VAL10 CHOICE3_STR11 CHOICE3_VAL11 CHOICE3_STR12 CHOICE3_VAL12 } -#define CHOICE3_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE3_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; -#define CHOICE3_NUMVALS 4 -#define CHOICE3_VIS dvarInt( "custom_class_mode" ) != 1 -#define CHOICE3_DISABLED_DESC "@CUSTOM_HEALTH_REGEN_DISABLED_DESC" -#define CHOICE3_DISABLE_ON_INVIS 1 - -#define CUSTOM_RESET_TO_DEFAULT resetdvar CHOICE1_DVAR; resetdvar CHOICE2_DVAR; resetdvar CHOICE3_DVAR; - -{ - #include "ui_mp/custom_options_popup.inc" -} - -//*********************************************************************************** -// Team Settings -//*********************************************************************************** -#define CUSTOM_OPTIONS_POPUP_MENU_NAME "popup_team_settings" -#define MENUDEF_NAME popup_team_settings -#define CUSTOM_OPTIONS_POPUP_TITLE "@CUSTOM_TEAM_OPTIONS" -#define CUSTOM_OPTIONS_POPUP_NUM_ITEMS 2 - -#define CHOICE1_TEXT "@CUSTOM_OPT_SPECTATE" -#define CHOICE1_DESC "@CUSTOM_OPT_SPECTATE_DESC" -#define CHOICE1_DVAR scr_game_spectatetype -#define CHOICE1_DVARTEXT CHOICE1_DVAR"_text" -#define CHOICE1_SHOW 1 -#define CHOICE1_STR1 "@MENU_DISABLED_CAPS" -#define CHOICE1_STR2 "@MPUI_RULES_TEAM_ONLY_CAPS" -#define CHOICE1_STR3 "@MPUI_RULES_FREE_CAPS" -#define CHOICE1_STR4 "" -#define CHOICE1_STR5 "" -#define CHOICE1_STR6 "" -#define CHOICE1_STR7 "" -#define CHOICE1_STR8 "" -#define CHOICE1_STR9 "" -#define CHOICE1_STR10 "" -#define CHOICE1_STR11 "" -#define CHOICE1_STR12 "" -#define CHOICE1_VAL1 0 -#define CHOICE1_VAL2 1 -#define CHOICE1_VAL3 2 -#define CHOICE1_VAL4 0 -#define CHOICE1_VAL5 0 -#define CHOICE1_VAL6 0 -#define CHOICE1_VAL7 0 -#define CHOICE1_VAL8 0 -#define CHOICE1_VAL9 0 -#define CHOICE1_VAL10 0 -#define CHOICE1_VAL11 0 -#define CHOICE1_VAL12 0 -#define CHOICE1_EXEC ; -#define CHOICE1_STRLIST { CHOICE1_STR1 CHOICE1_VAL1 CHOICE1_STR2 CHOICE1_VAL2 CHOICE1_STR3 CHOICE1_VAL3 CHOICE1_STR4 CHOICE1_VAL4 CHOICE1_STR5 CHOICE1_VAL5 CHOICE1_STR6 CHOICE1_VAL6 CHOICE1_STR7 CHOICE1_VAL7 CHOICE1_STR8 CHOICE1_VAL8 CHOICE1_STR9 CHOICE1_VAL9 CHOICE1_STR10 CHOICE1_VAL10 CHOICE1_STR11 CHOICE1_VAL11 CHOICE1_STR12 CHOICE1_VAL12 } -#define CHOICE1_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE1_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; -#define CHOICE1_NUMVALS 3 - -#define CHOICE2_TEXT "@CUSTOM_FRIENDLY_FIRE" -#define CHOICE2_DESC "@CUSTOM_FRIENDLY_FIRE_DESC" -#define CHOICE2_DVAR scr_team_fftype -#define CHOICE2_DVARTEXT CHOICE2_DVAR"_text" -#define CHOICE2_SHOW 1 -#define CHOICE2_STR1 "@MENU_DISABLED_CAPS" -#define CHOICE2_STR2 "@MENU_ENABLED_CAPS" -#define CHOICE2_STR3 "@MPUI_RULES_REFLECT_CAPS" -#define CHOICE2_STR4 "@MPUI_RULES_SHARED_CAPS" -#define CHOICE2_STR5 "" -#define CHOICE2_STR6 "" -#define CHOICE2_STR7 "" -#define CHOICE2_STR8 "" -#define CHOICE2_STR9 "" -#define CHOICE2_STR10 "" -#define CHOICE2_STR11 "" -#define CHOICE2_STR12 "" -#define CHOICE2_VAL1 0 -#define CHOICE2_VAL2 1 -#define CHOICE2_VAL3 2 -#define CHOICE2_VAL4 3 -#define CHOICE2_VAL5 0 -#define CHOICE2_VAL6 0 -#define CHOICE2_VAL7 0 -#define CHOICE2_VAL8 0 -#define CHOICE2_VAL9 0 -#define CHOICE2_VAL10 0 -#define CHOICE2_VAL11 0 -#define CHOICE2_VAL12 0 -#define CHOICE2_EXEC ; -#define CHOICE2_STRLIST { CHOICE2_STR1 CHOICE2_VAL1 CHOICE2_STR2 CHOICE2_VAL2 CHOICE2_STR3 CHOICE2_VAL3 CHOICE2_STR4 CHOICE2_VAL4 CHOICE2_STR5 CHOICE2_VAL5 CHOICE2_STR6 CHOICE2_VAL6 CHOICE2_STR7 CHOICE2_VAL7 CHOICE2_STR8 CHOICE2_VAL8 CHOICE2_STR9 CHOICE2_VAL9 CHOICE2_STR10 CHOICE2_VAL10 CHOICE2_STR11 CHOICE2_VAL11 CHOICE2_STR12 CHOICE2_VAL12 } -#define CHOICE2_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE2_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; -#define CHOICE2_NUMVALS 4 - -#define CUSTOM_RESET_TO_DEFAULT resetdvar CHOICE1_DVAR; resetdvar CHOICE2_DVAR; - -{ - #include "ui_mp/custom_options_popup.inc" -} - -//*********************************************************************************** -// Free for All specate settings -//*********************************************************************************** -#define CUSTOM_OPTIONS_POPUP_MENU_NAME "popup_ffa_spectate_settings" -#define MENUDEF_NAME popup_ffa_spectate_settings -#define CUSTOM_OPTIONS_POPUP_TITLE "@CUSTOM_FFA_SPECTATE_OPTIONS" -#define CUSTOM_OPTIONS_POPUP_NUM_ITEMS 1 - -#define CHOICE1_TEXT "@CUSTOM_OPT_SPECTATE" -#define CHOICE1_DESC "@CUSTOM_OPT_SPECTATE_DESC" -#define CHOICE1_DVAR scr_game_spectatetype -#define CHOICE1_DVARTEXT CHOICE1_DVAR"_text" -#define CHOICE1_SHOW 1 -#define CHOICE1_STR1 "@MENU_DISABLED_CAPS" -#define CHOICE1_STR2 "@MPUI_RULES_PLAYERS_ONLY_CAPS" -#define CHOICE1_STR3 "@MPUI_RULES_FREE_CAPS" -#define CHOICE1_STR4 "" -#define CHOICE1_STR5 "" -#define CHOICE1_STR6 "" -#define CHOICE1_STR7 "" -#define CHOICE1_STR8 "" -#define CHOICE1_STR9 "" -#define CHOICE1_STR10 "" -#define CHOICE1_STR11 "" -#define CHOICE1_STR12 "" -#define CHOICE1_VAL1 0 -#define CHOICE1_VAL2 1 -#define CHOICE1_VAL3 2 -#define CHOICE1_VAL4 0 -#define CHOICE1_VAL5 0 -#define CHOICE1_VAL6 0 -#define CHOICE1_VAL7 0 -#define CHOICE1_VAL8 0 -#define CHOICE1_VAL9 0 -#define CHOICE1_VAL10 0 -#define CHOICE1_VAL11 0 -#define CHOICE1_VAL12 0 -#define CHOICE1_EXEC open GAME_OPTIONS_MENU_NAME"_"CHOICE1_TEXT; play CHOICE_FOCUS_SOUND; -#define CHOICE1_STRLIST { CHOICE1_STR1 CHOICE1_VAL1 CHOICE1_STR2 CHOICE1_VAL2 CHOICE1_STR3 CHOICE1_VAL3 CHOICE1_STR4 CHOICE1_VAL4 CHOICE1_STR5 CHOICE1_VAL5 CHOICE1_STR6 CHOICE1_VAL6 CHOICE1_STR7 CHOICE1_VAL7 CHOICE1_STR8 CHOICE1_VAL8 CHOICE1_STR9 CHOICE1_VAL9 CHOICE1_STR10 CHOICE1_VAL10 CHOICE1_STR11 CHOICE1_VAL11 CHOICE1_STR12 CHOICE1_VAL12 } -#define CHOICE1_NUMVALS 3 -#define CHOICE1_ONFOCUS setLocalVarBool ui_choice_hideaccept 1; -#define CHOICE1_LEAVEFOCUS setLocalVarBool ui_choice_hideaccept 0; - -#define CUSTOM_RESET_TO_DEFAULT resetdvar CHOICE1_DVAR; - -{ - #include "ui_mp/custom_options_popup.inc" -} diff --git a/mods/patch_mp/ui_mp/fileshare_playercard.menu b/mods/patch_mp/ui_mp/fileshare_playercard.menu deleted file mode 100644 index fb17f54..0000000 --- a/mods/patch_mp/ui_mp/fileshare_playercard.menu +++ /dev/null @@ -1,4006 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" -#include "ui_mp/popup_player_info.inc" - -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui_mp/overlaybg.inc" -#include "ui/choices_setup_popmenu.menu" -#include "ui_mp/item_listbox.inc" - -#include "ui_mp/fileshare.inc" - - -#undef CHOICE_SIZE_X -#ifdef PC -#define CHOICE_SIZE_X 240 -#else -#define CHOICE_SIZE_X 260 -#endif - -#undef CHOICE_X_START -#define CHOICE_X_START 0 - -#undef CHOICE_Y_START -#define CHOICE_Y_START 85 -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL - - -#define CLIP_SELECTED( menuName, feederName ) \ - ( getFeederData( menuName, feederName, "fileType" ) == "clip" ) - - -#include "ui_mp/switch_lobbies.inc" - -#define IS_LOBBY_HOST ( gameHost() && inLobby() ) -#define IS_NOT_LOBBY_HOST ( !gameHost() || !inLobby() ) - -#define ACTION_GOTO_THEATER( isUserFile, menuName, feedername ) \ - if( menuisopen( "menu_cr_matches_heat_map" ) ) \ - { \ - execNow set ui_theater_mapname (GetFileshareGameMap(dvarInt("selectedRecentGameIndex"))); \ - execNow set ui_theater_gametype (GetFileshareGameType(dvarInt("selectedRecentGameIndex"))); \ - execNow set ui_theater_demoname (GetFileshareFileName(dvarInt("selectedRecentGameIndex"))); \ - execNow set ui_theater_fileid (GetFileshareFileId(dvarInt("selectedRecentGameIndex")); \ - execNow set ui_theater_filesize (GetFileshareFileSize(dvarInt("selectedRecentGameIndex"))); \ - setdvar ui_combatResetViewDvars "0"; \ - closeImmediate menu_cr_matches_heat_map; \ - } \ - else \ - { \ - execNow set ui_theater_mapname (getFeederData( menuName, feedername, "map" )); \ - execNow set ui_theater_gametype (getFeederData( menuName, feedername, "gametype" )); \ - execNow set ui_theater_demoname (getFeederData( menuName, feedername, "fileName" )); \ - execNow set ui_theater_fileid (getFeederData( menuName, feedername, "fileID" )); \ - execNow set ui_theater_filesize (getFeederData( menuName, feedername, "fileSize" )); \ - closeImmediate menuName; \ - } \ - if ( dvarInt( "xblive_theater" ) == 0 ) \ - { \ - if ( IS_LOBBY_HOST ) \ - { \ - execNow "xstopparty"; \ - execNow "xstopprivateparty"; \ - } \ - elseif ( PrivatePartyHost() ) \ - { \ - execNow "xstopprivateparty"; \ - } \ - START_ACTION_THEATER \ - execNow "setactivemenu theater"; \ - } \ - execNow set ui_mapname (dvarString( ui_theater_mapname )); \ - execNow set ui_gametype (dvarString( ui_theater_gametype )); \ - execNow set ui_demoname (dvarString( ui_theater_demoname )); \ - execNow xpartyupdatedemo ( isUserFile ) ( dvarString( ui_theater_fileid ) ) ( dvarString( ui_theater_filesize ) ) "Film.demo"; \ - execNow "xupdatepartystate"; \ - execnow set fsOtherUserSlotSelected 0; \ - close fileshare_recentfilms; \ - close fileshare_landingpage; \ - close menu_playercard; \ - close menu_playercard_self; \ - close menu_playercard_self_basictraining; \ - close menu_friends; \ - close self; - -#define ACTION_GOTO_CUSTOMGAME( isUserFile, menuName, feedername ) \ - execNow set ui_theater_custom_fileid (getFeederData( menuName, feedername, "fileID" )); \ - execNow set ui_theater_custom_filesize (getFeederData( menuName, feedername, "fileSize" )); \ - close menuName; \ - if ( dvarInt( "xblive_privatematch" ) == 0 ) \ - { \ - if ( IS_LOBBY_HOST ) \ - { \ - execNow "xstopparty"; \ - execNow "xstopprivateparty"; \ - } \ - START_ACTION_PRIVATEMATCH \ - execNow "setactivemenu private"; \ - } \ - execNow "xupdatepartystate"; \ - execNow downloadCustomGametype ( dvarString( ui_theater_custom_fileid ) ) ( dvarString( ui_theater_custom_filesize ) ); \ - execnow set fsOtherUserSlotSelected 0; \ - close fileshare_recentfilms; \ - close fileshare_landingpage; \ - close menu_playercard; \ - close menu_playercard_self; \ - close menu_playercard_self_basictraining; \ - close menu_friends; \ - close self; - -#define ACTION_VIEW_SCREENSHOT( menuName, feedername ) \ - if ( !( FILESHARE_TASKSINPROGRESS ) ) \ - { \ - execNow screenshotDownload ( getFeederData( menuName, feedername, "fileID" ) ) ( getFeederData( menuName, feedername, "fileSize" ) ); \ - open menu_screenshot; \ - } - -// ========================================================================================= -// MY FILE SHARE -// menu_fileshare_myshare -// Shows the user's file share slots with details on the right -// -// menu_fileshare_myshare_options -// Brings up options when a slot is selected -// -// menu_fileshare_myshare_remove -// Shows a file remove confirmation -// ========================================================================================= - -#undef ON_ESC_ACTION -#define ON_ESC_ACTION \ - deactivateBlur; \ - if ( dvarInt( ui_theater_shortcut ) != 1 && dvarInt( ui_theater_shortcut_pc ) != 1 ) { \ - if ( dvarInt( xblive_basictraining ) ) \ - { \ - open menu_playercard_self_basictraining; \ - } \ - else \ - { \ - open menu_playercard_self; \ - } \ - }; \ - close self; - -menuDef -{ - name menu_fileshare_myshare - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - control MENU_CONTROL_OPENER - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - - onOpen - { - activateBlur; - execnow readFileShare; - execnow ui_animate menu_fileshare_myshare FileUpdater SetFile 0; - } - onFocus - { - } - onClose - { - if ( dvarInt( ui_theater_shortcut ) == 1 ) - { - setdvar ui_theater_shortcut 0; - CHANGE_MENU_SLIDE_DIRECTION( menu_fileshare_myshare, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT ) - } - elseif ( dvarInt( ui_theater_shortcut_pc ) == 1 ) - { - setdvar ui_theater_shortcut_pc 0; - CHANGE_MENU_SLIDE_DIRECTION( menu_fileshare_myshare, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT ) - open main; - } - } - onESC - { - ON_ESC_ACTION - } - - NEW_FRAME( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) - - NEW_FRAME_TITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_MYSHARE_CAPS", when( 1 ) ) - PLAYER_INFO_VIS( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, 1 ) - - itemDef - { - name fileShareSlots - type ITEM_TYPE_LISTBOX - feeder FEEDER_FILESHARE_MYSLOTS - FILESHARE_COMMON_OPTIONS - origin 0 0 - elementwidth 70 - elementheight 67 - elementtype LISTBOX_TEXT - textalign ITEM_ALIGN_MIDDLE_CENTER - textfont UI_FONT_NORMAL - textscale TEXTSIZE_SUBTITLE - forecolor CHOICE_TEXTCOLOR - modal - doubleclick - { - if ( getFeederData( "slotOccupied" ) && !( FILESHARE_TASKSINPROGRESS ) ) - { - play CHOICE_FOCUS_SOUND; - open menu_fileshare_myshare_options; - } - } - onListboxSelectionChange - { - play CHOICE_FOCUS_SOUND; - execnow set fsSelectedFileID ( getFeederData( "fileID" ) ); - } - - visible 1 - - FILESHARE_SLOTS_USERAREAS - } - FILESHARE_BOTTOM( fileShareSlots, 1 ) - - /* SLOT OCCUPIED */ -#define SLOT_OCCUPIED_CONDITION \ - getFeederData( "fileShareSlots", "slotOccupied" ) && getFeederData( "fileShareSlots", "count" ) > 0.0 - -#undef FILESHARE_SELECTOR_TOOLTIP_Y -#ifdef PC - #define FILESHARE_SELECTOR_TOOLTIP_Y FILESHARE_TOOLTIP_PC_Y -#else //#ifdef PC - #define FILESHARE_SELECTOR_TOOLTIP_Y 95 -#endif //#ifdef PC - - // Tooltip - Occupied Slot - PREPROC_TEXT_DRAW_VIS_EX( -255 FILESHARE_SELECTOR_TOOLTIP_Y 280 36 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "MENU_FILESHARE_SLOTDESC" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, when( SLOT_OCCUPIED_CONDITION ), autowrapped; ) - PREPROC_SHADER_DRAW_VIS_EX( -265 FILESHARE_SELECTOR_TOOLTIP_Y 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "ui_arrow_right", COLOR_BODY_TEXT, when( SLOT_OCCUPIED_CONDITION ), ; ) - - // Tooltip - Empty Slot - PREPROC_TEXT_DRAW_VIS_EX( -255 FILESHARE_SELECTOR_TOOLTIP_Y 280 36 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "MENU_FILESHARE_EMPTYSLOTDESC" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, when( SLOT_EMPTY_CONDITION( "menu_fileshare_myshare", "fileShareSlots" ) ), autowrapped; ) - PREPROC_SHADER_DRAW_VIS_EX( -265 FILESHARE_SELECTOR_TOOLTIP_Y 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "ui_arrow_right", COLOR_BODY_TEXT, when( SLOT_EMPTY_CONDITION( "menu_fileshare_myshare", "fileShareSlots" ) ), ; ) - - FILESHARE_SPINNER( 145, -45, when( isTaskInProgress( "LiveFileShareRemoveFile" ) == 1 ), 350 ) - - execKeyInt APAD_UP - { - execnow set fsSelectedFileID ( getFeederData( "fileShareSlots", "fileID" ) ); - execnow set fshSelectLastSlotRow 1; - setfocus fileShareSlots; - } - - execKeyInt DPAD_UP - { - execnow set fsSelectedFileID ( getFeederData( "fileShareSlots", "fileID" ) ); - execnow set fshSelectLastSlotRow 1; - setfocus fileShareSlots; - } - - execKeyInt APAD_DOWN - { - execnow set fsSelectedFileID ( getFeederData( "fileShareSlots", "fileID" ) ); - execnow set fshSelectFirstSlotRow 1; - setfocus fileShareSlots; - } - - execKeyInt DPAD_DOWN - { - execnow set fsSelectedFileID ( getFeederData( "fileShareSlots", "fileID" ) ); - execnow set fshSelectFirstSlotRow 1; - setfocus fileShareSlots; - } - - execKeyInt APAD_LEFT - { - play CHOICE_FOCUS_SOUND; - } - - execKeyInt DPAD_LEFT - { - play CHOICE_FOCUS_SOUND; - } - - execKeyInt APAD_RIGHT - { - play CHOICE_FOCUS_SOUND; - } - - execKeyInt DPAD_RIGHT - { - play CHOICE_FOCUS_SOUND; - } - - itemDef - { - name "FileUpdater" - type ITEM_TYPE_TEXT - rect 0 0 1 1 - visible 1 - decoration - text "" - - state - { - name "SetFile" - onEnter - { - execnow set fsSelectedFileID ( getFeederData( "fileShareSlots", "fileID" ) ); - changeState "Wait" 0; - } - } - - state - { - name "Wait" - onEnter - { - changeState "SetFile" 100; - } - } - } - -#ifdef CONSOLE - itemDef - { - type ITEM_TYPE_TEXT - rect -146 80 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( int( getFeederData( "fileShareSlots", "slot" ) ) ) - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_SMALL - visible 1 - decoration - } -#endif - -#ifndef PC - itemDef - { - type ITEM_TYPE_TEXT - rect -160 (FILESHARE_FRAME_HEIGHT/2) 50 17 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - text "@PLATFORM_SELECT" - textfont CHOICE_TEXTFONT - - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_BOTTOM_LEFT - visible when( getFeederData( "fileShareSlots", "slotOccupied" ) == 1 ) - decoration - } -#endif //#ifndef PC - - NEW_FRAME_BUTTON_NOICON( 1, 28 0 0 18 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "", execnow "updatemarketplace";, ;, ;, 1, ;, ; ) - //FILESHARE_LIVEBLURB( -271, 50, 290, 100, HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, !IsPremiumSubscriber(), ( localVarInt( ui_highlight ) == 1 ) ) - -#ifdef CONSOLE - #define SLOTNUMRECT rect -146 80 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - #define OFNUMRECT rect -142 80 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - - itemDef - { - type ITEM_TYPE_TEXT - SLOTNUMRECT - exp text( int( getFeederData( "fileShareSlots", "slot" ) ) ) - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_MIDDLE_RIGHT - forecolor 1 1 1 1 - visible 1 - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - OFNUMRECT - text "@MENU_FILESHARE_OF18" - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_MIDDLE_LEFT - forecolor 1 1 1 1 - visible when( IsPremiumSubscriber() ) - } - - itemDef - { - type ITEM_TYPE_TEXT - OFNUMRECT - text "@MENU_FILESHARE_OF6" - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_MIDDLE_LEFT - forecolor 1 1 1 1 - visible when( !IsPremiumSubscriber() ) - } - - #define SLOTNUMARROWPOSITIONY 75 - - // Top Arrow - PREPROC_SHADER_DRAW_VIS_EX( -114 SLOTNUMARROWPOSITIONY 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "ui_arrow_left", COLOR_BODY_TEXT, when( IsPremiumSubscriber() && getFeederData( "fileShareSlots", "slot" ) > 6 ), rotation 90; ) - - // Bottom Arrow 1 - PREPROC_SHADER_DRAW_VIS_EX( -107 SLOTNUMARROWPOSITIONY 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "ui_arrow_right", COLOR_BODY_TEXT, when( IsPremiumSubscriber() && getFeederData( "fileShareSlots", "slot" ) > 6 && getFeederData( "fileShareSlots", "slot" ) < 13 ), rotation 90; ) - - // Bottom Arrow 2 - PREPROC_SHADER_DRAW_VIS_EX( -114 SLOTNUMARROWPOSITIONY 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "ui_arrow_right", COLOR_BODY_TEXT, when( IsPremiumSubscriber() && getFeederData( "fileShareSlots", "slot" ) <= 6 ), rotation 90; ) -#endif //#ifdef CONSOLE - // Details - FILESHARE_DETAILS( 35, (NEW_FRAME_CHOICE_Y_START-1), HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, "menu_fileshare_myshare", "fileShareSlots", SLOT_OCCUPIED_CONDITION ) - - NEW_FRAME_BACK_BUTTON_ACTION( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, ON_ESC_ACTION ) - - #include "ui/safearea.menu" -} - - - -#undef ON_ESC_ACTION -#define ON_ESC_ACTION \ - deactivateBlur; \ - close self; - -menuDef -{ - name fileshare_mymovie - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - control MENU_CONTROL_OPENER - soundloop MENU_MUSIC - - NEW_FRAME( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) - - // Title and Subtitle if we are through the playercard - NEW_FRAME_TITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_MYMOVIE_CAPS", when( 1 ) ) - - onOpen - { - activateblur; - } - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - } - onFocus { } - onESC - { - ON_ESC_ACTION - } - - execKeyInt BUTTON_X - { - close self; - } - - execKeyInt BUTTON_B - { - if ( dvarInt( ui_theater_shortcut ) != 1 && dvarInt( ui_theater_shortcut_pc ) != 1 ) { - if ( dvarInt( xblive_basictraining ) ) - { - open menu_playercard_self_basictraining; - } - else - { - open menu_playercard_self; - } - }; - close self; - close menu_fileshare_myshare; - } - - PLAYER_INFO_VIS( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, 1 ) - - FILESHARE_MOVIE( -271, -125, 290, 165, HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, getMySlotInfo( 20, "slotOccupied" ) == 1, ( localVarInt( ui_highlight ) == 3 ) ) - FILESHARE_NOMOVIE( -150, -100, 300, 200, HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, getMySlotInfo( 20, "slotOccupied" ) != 1, ( localVarInt( ui_highlight ) == 3 ) ) - -#define FILESHARE_MOVIE_ACTION \ - if ( getMySlotInfo( 20, "slotOccupied" ) == 1 ) \ - { \ - execnow set fsSelectedFileName ( getMySlotInfo( 20, "name" ) ); \ - execnow set fsIsSelectedFileNameModified ( getMySlotInfo( 20, "isModifiedName" ) ); \ - execnow set fsSelectedFileDescription ( getMySlotInfo( 20, "description" ) ); \ - execnow set fsIsSelectedFileDescriptionModified ( getMySlotInfo( 20, "isModifiedDescription" ) ); \ - open menu_fileshare_mymovie_options; \ - } - - FILESHARE_MOVIE_DETAILS( 35, -20, HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, getMySlotInfo( 20, "slotOccupied" ) == 1 ) - - itemDef - { - style WINDOW_STYLE_SPINNER - rect -271 -125 290 165 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - visible when( isTaskInProgress( "LiveFileShareRemoveFile" ) == 1 ) - decoration - } - - NEW_FRAME_BACK_BUTTON_ACTION( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, ON_ESC_ACTION ) - - itemDef - { - type ITEM_TYPE_TEXT - rect -210 206 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - text "@PLATFORM_FILESHARE_MYFILESHARE" - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_BOTTOM_LEFT - visible 1 - decoration - } -} - - - - - -// ========================================================================================= -// FILE SHARE (OTHER PLAYER) -// menu_fileshare_share -// Shows the user's file share slots with details on the right -// -// menu_fileshare_share_options -// Brings up options when a slot is selected -// ========================================================================================= - -#undef ON_ESC_ACTION -#define ON_ESC_ACTION \ - deactivateBlur; \ - close self; \ - open menu_playercard; - -menuDef -{ - name menu_fileshare_share - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - - onOpen - { - activateBlur; - execnow readFileShare ( dvarString( selectedPlayerXuid ) ); - execnow ui_animate menu_fileshare_share FileUpdater SetFile 0; - } - onFocus - { - } - onClose - { - deactivateBlur; - } - onESC - { - ON_ESC_ACTION - } - - NEW_FRAME( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) - NEW_FRAME_TITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, dvarString("selectedFriendName") + locString("MENU_APOSTROPHE_S")+" "+locString("MENU_PLAYERCARD_CAPS"), 1 ) - NEW_FRAME_SUBTITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_CAPS", 1 ) - - FRIEND_INFO_VIS( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, 1 ) - - itemDef - { - name fileShareSlots - type ITEM_TYPE_LISTBOX - feeder FEEDER_FILESHARE_SLOTS - FILESHARE_COMMON_OPTIONS - elementwidth 70 - elementheight 70 - elementtype LISTBOX_TEXT - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign HORIZONTAL_ALIGN_LEFT - textfont UI_FONT_NORMAL - forecolor CHOICE_TEXTCOLOR - modal - doubleclick - { - if ( getFeederData( "slotOccupied" ) ) - { - play CHOICE_FOCUS_SOUND; - execnow set fsSelectedFileName ( getFeederData( name ) ); - execnow set fsIsSelectedFileNameModified ( getFeederData( isModifiedName ) ); - execnow set fsSelectedFileDescription ( getFeederData( description ) ); - execnow set fsIsSelectedFileDescriptionModified ( getFeederData( isModifiedDescription ) ); - execnow set fsOtherUserSlotSelected ( getFeederData ( "menu_fileshare_share", "fileShareSlots", "slot" ) ); - open menu_fileshare_share_options; - } - } - onListboxSelectionChange - { - play CHOICE_FOCUS_SOUND; - } - - visible when( isTaskInProgress( "LiveFileShareGetListing" ) != 1 ) - - FILESHARE_SLOTS_USERAREAS - } - FILESHARE_BOTTOM( fileShareSlots, 0 ) - - // File details - FILESHARE_DETAILS( 35, (NEW_FRAME_CHOICE_Y_START-1), HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, - "menu_fileshare_share", "fileShareSlots", - getFeederData( "fileShareSlots", "slotOccupied" ) && getFeederData( "fileShareSlots", "count" ) > 0.0 ) - - FILESHARE_PROGRESS_INDICATOR_SIZE( 250, -120, 24, 24, 0, ( isTaskInProgress( "LiveFileShareSearch" ) == 1 || isTaskInProgress( "LiveFileShareTransfer" ) == 1 ) ) - -#ifdef CONSOLE - itemDef - { - type ITEM_TYPE_TEXT - rect -136 170 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( int( getFeederData( "fileShareSlots", "slot" ) ) ) - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_BOTTOM_RIGHT - visible when( isTaskInProgress( "LiveFileShareGetListing" ) != 1 ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect -132 170 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_FILESHARE_OF" ) + " " + dvarInt( fsMaxPrivateSlotRowsOther ) * 3 ) - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_BOTTOM_LEFT - visible when( isTaskInProgress( "LiveFileShareGetListing" ) != 1 ) - decoration - } -#endif //#ifdef CONSOLE - - itemDef - { - name "FileUpdater" - type ITEM_TYPE_TEXT - rect 0 0 1 1 - visible 1 - decoration - text "" - - state - { - name "SetFile" - onEnter - { - execnow set fsOtherUserSlotSelected ( getFeederData( "fileShareSlots", "slot" ) ); - execnow set fsSelectedFileID ( getFeederData( "fileShareSlots", "fileID" ) ); - changeState "Wait" 0; - } - } - - state - { - name "Wait" - onEnter - { - changeState "SetFile" 100; - } - } - } - - execKeyInt APAD_LEFT - { - play CHOICE_FOCUS_SOUND; - } - - execKeyInt DPAD_LEFT - { - play CHOICE_FOCUS_SOUND; - } - - execKeyInt APAD_RIGHT - { - play CHOICE_FOCUS_SOUND; - } - - execKeyInt DPAD_RIGHT - { - play CHOICE_FOCUS_SOUND; - } - - NEW_FRAME_BACK_BUTTON_ACTION( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, ON_ESC_ACTION ) - - #include "ui/safearea.menu" -} -#include "ui_mp/popupstyle.inc" - -menuDef -{ - name menu_fileshare_share_transfer - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - onOpen - { - activateBlur; - READ_FILE_SHARE; - } - onFocus - { - play CHOICE_FOCUS_SOUND; - } - onClose - { - deactivateblur; - } - onESC - { - close self; - } - execKeyInt APAD_LEFT { play CHOICE_FOCUS_SOUND; } - execKeyInt DPAD_LEFT { play CHOICE_FOCUS_SOUND; } - execKeyInt APAD_RIGHT { play CHOICE_FOCUS_SOUND; } - execKeyInt DPAD_RIGHT { play CHOICE_FOCUS_SOUND; } - execKeyInt APAD_UP { execnow set fshSelectLastSlotRow 1; setfocus fileShareSlots; } - execKeyInt DPAD_UP { execnow set fshSelectLastSlotRow 1; setfocus fileShareSlots; } - execKeyInt APAD_DOWN { execnow set fshSelectFirstSlotRow 1; setfocus fileShareSlots; } - execKeyInt DPAD_DOWN { execnow set fshSelectFirstSlotRow 1; setfocus fileShareSlots; } - - NEW_FRAME( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) - NEW_FRAME_TITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_MYSHARE_CAPS", 1 ) - NEW_FRAME_SUBTITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_CHOOSESLOT", 1 ) - PLAYER_INFO_VIS( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, 1 ) - - itemDef - { - name fileShareSlots - type ITEM_TYPE_LISTBOX - feeder FEEDER_FILESHARE_MYSLOTS - FILESHARE_COMMON_OPTIONS - elementwidth 70 - elementheight 70 - elementtype LISTBOX_TEXT - textalign HORIZONTAL_ALIGN_LEFT - textfont UI_FONT_NORMAL - forecolor CHOICE_TEXTCOLOR - modal - doubleclick - { - if ( !( FILESHARE_TASKSINPROGRESS ) ) - { - play CHOICE_FOCUS_SOUND; - if ( getFeederData( "slotOccupied" ) != 1 ) - { - open menu_fileshare_share_transfer_save; - } - else - { - open menu_fileshare_share_transfer_confirm; - } - } - } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - visible 1 - FILESHARE_SLOTS_USERAREAS - } - FILESHARE_BOTTOM( fileShareSlots, 1 ) - FILESHARE_DETAILS( 35, (NEW_FRAME_CHOICE_Y_START-1), HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, - "menu_fileshare_share_transfer", "fileShareSlots", - getFeederData( "fileShareSlots", "slotOccupied" ) && getFeederData( "fileShareSlots", "count" ) > 0.0 ) - -#ifdef CONSOLE - PREPROC_TEXT_DRAW_VIS( -144 158 30 15 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - ( int( getFeederData( "fileShareSlots", "slot" ) ) + " " + locString( "@MENU_FILESHARE_OF6") ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, 1 1 1 1, when( !IsPremiumSubscriber() ) ) - - PREPROC_TEXT_DRAW_VIS( -144 158 30 15 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - ( int( getFeederData( "fileShareSlots", "slot" ) ) + " " + locString( "@MENU_FILESHARE_OF18") ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, 1 1 1 1, when( IsPremiumSubscriber() ) ) - - PREPROC_SHADER_DRAW_VIS_EX( -114 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_left", COLOR_BODY_TEXT, - when( getFeederData( "fileShareSlots", "slot" ) > 6 ), - rotation 90; ) - PREPROC_SHADER_DRAW_VIS_EX( -107 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( getFeederData( "fileShareSlots", "slot" ) > 6 && getFeederData( "fileShareSlots", "slot" ) < 13 ), - rotation 90; ) - PREPROC_SHADER_DRAW_VIS_EX( -114 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( getFeederData( "fileShareSlots", "slot" ) <= 6 ), - rotation 90; ) -#endif //#ifdef CONSOLE -#ifdef PC - NEW_FRAME_BACK_BUTTON_ACTION( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, close self; ) -#else // #ifdef PC - NEW_FRAME_BACK_BUTTON( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) -#endif // #else // #ifdef PC -} - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_share_transfer_confirm, activateblur; execNow raiseFeederEvent Populate;, deactivateblur; close self;, 1 ) - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent Clear; - } - - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_REPLACECONFIRM", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 - menuItemsDef - { - maxRows 4 - DYNAMIC_MENU_COMMON_COLUMNS - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent Yes - { - open menu_fileshare_share_transfer_save; - close self; - } - onEvent No { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate { - execNow addToFeeder Yes MENU_YES; - execNow addToFeeder No MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - - - - - - - - -// ========================================================================================= -// RECENT GAMES (MY) -// menu_fileshare_myrecentgames -// Shows the list of recent games -// -// menu_fileshare_myrecentgames_choose -// Options when one of those games are chosen -// -// menu_fileshare_myrecentgames_transfer -// If the recent game is chosen to be transferred to file share, this brings up -// the slot selection for tranfer -// ========================================================================================= - -#undef ON_ESC_ACTION -#define ON_ESC_ACTION \ - deactivateBlur; \ - if ( dvarInt( ui_theater_shortcut ) != 1 && dvarInt( ui_theater_shortcut_pc ) != 1 ) { \ - if ( dvarInt( xblive_basictraining ) ) \ - { \ - open menu_playercard_self_basictraining; \ - } \ - else \ - { \ - open menu_playercard_self; \ - } \ - }; \ - close self; - -#ifdef PC - #define MYRECENTGAMES_LISTBOX_PLATFORM_OPTIONS \ - usePaging -#else //#ifdef PC - #define MYRECENTGAMES_LISTBOX_PLATFORM_OPTIONS \ - noscrollbars -#endif //#ifdef PC - -menuDef -{ - name menu_fileshare_myrecentgames - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - control MENU_CONTROL_OPENER - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - - onOpen - { - activateBlur; - execnow fileShareGetRecentGames; - execnow fileShareSetPooledFileContext "self"; - //execnow fileShareExpireFileDetails; - execnow set fsSelectedFileID 0; - } - onFocus - { - } - onClose - { - deactivateBlur; - if ( dvarInt( ui_theater_shortcut ) == 1 ) - { - setdvar ui_theater_shortcut 0; - CHANGE_MENU_SLIDE_DIRECTION( menu_fileshare_myrecentgames, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT ) - } - elseif ( dvarInt( ui_theater_shortcut_pc ) == 1 ) - { - setdvar ui_theater_shortcut_pc 0; - CHANGE_MENU_SLIDE_DIRECTION( menu_fileshare_myrecentgames, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT ) - open main; - } - } - onESC - { - ON_ESC_ACTION - } - - NEW_FRAME( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) - - // Title and Subtitle if we are through the playercard - NEW_FRAME_TITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_MYRECENTGAMES_CAPS", when( 1 ) ) - PLAYER_INFO_VIS( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, 1 ) - - itemDef - { - name fileShareRecentGames - type ITEM_TYPE_LISTBOX - feeder FEEDER_FILESHARE_SEARCHRESULTS - rect -265 -127 250 230 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - origin 0 0 - elementwidth 30 - elementheight 16 - elementtype LISTBOX_TEXT - textstyle ITEM_TEXTSTYLE_NORMAL - textfont UI_FONT_NORMAL - textscale CHOICE_TEXTSIZE - textalign HORIZONTAL_ALIGN_LEFT - textalignx 12 - forecolor CHOICE_TEXTCOLOR - focusColor CHOICE_TEXTCOLOR - disableColor CHOICE_TEXTCOLOR - #ifdef XENON - selectIcon "ui_button_xenon_3d_a_32x32" - #endif - #ifdef PS3 - selectIcon "ui_button_ps3_x_32x32" - #endif - outlinecolor 1 1 1 1 - elementHighlightColor 0 0 0 1 - elementBackgroundColor NEW_FRAME_TRANSPARENCY - noBlinkingHighlight - modal - MYRECENTGAMES_LISTBOX_PLATFORM_OPTIONS - /* x y w h len horzAlign vertAlign*/ - userarea 1 10 -1 200 18 50 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP - visible 1 - onListboxSelectionChange - { - if( getFeederData( "count" ) > 1 ) - { - play CHOICE_FOCUS_SOUND; - } - } - doubleclick - { - if( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) && getFeederData( fileID ) != 0 ) - { - execnow set fsSelectedFileName ( getFeederData( name ) ); - execNow set fsSelectedRecentGameID ( getFeederData( fileID ) ); - execnow set fsIsSelectedFileNameModified ( getFeederData( isModifiedName ) ); - execnow set fsSelectedFileDescription ( getFeederData( description ) ); - execnow set fsIsSelectedFileDescriptionModified ( getFeederData( isModifiedDescription ) ); - open menu_fileshare_myrecentgames_choose; - } - } - } - -#define FILESHARE_DETAILS_CONDITION \ - ( int( getFeederData( "fileShareRecentGames", "isSummaryLoaded" ) ) == 1 ) - - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect 75 -130 150 150 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - forecolor 1 1 1 1 - ownerdraw UI_DRAWHEATMAP - visible when( FILESHARE_DETAILS_CONDITION ) - decoration - } - - FILESHARE_PROGRESS_INDICATOR_SIZE( 150, 0, 64, 64, 0, ( !FILESHARE_DETAILS_CONDITION && FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) ) - - // File details - - itemDef - { - type ITEM_TYPE_TEXT - rect 0 0 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - text "@MENU_FILESHARE_NORECENTGAME_MY" - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when ( !( FILESHARE_TASKSINPROGRESS ) && getFeederData( fileShareRecentGames, count ) < 1 ) - decoration - } - - itemDef - { - style WINDOW_STYLE_SHADER - rect FILESHARE_MATCHDETAILS_BGX FILESHARE_MATCHDETAILS_BGY FILESHARE_MATCHDETAILS_BGW 300 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - origin 0 0 - background "white" - forecolor 0 0 0 0.1 - visible when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) - decoration - } - - itemDef - { - style WINDOW_STYLE_SHADER - rect FILESHARE_MATCHDETAILS_BGX (FILESHARE_MATCHDETAILS_BGY + 220 ) FILESHARE_MATCHDETAILS_BGW 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - origin 0 0 - background "white" - forecolor 0 0 0 0.2 - visible when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) - decoration - } - - itemDef - { - style WINDOW_STYLE_SHADER - rect FILESHARE_MATCHDETAILS_BGX (FILESHARE_MATCHDETAILS_BGY + 260) FILESHARE_MATCHDETAILS_BGW 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - origin 0 0 - background "white" - forecolor 0 0 0 0.2 - visible when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) - decoration - } - - /* BACKGROUND TEAM ICON */ - PREPROC_SHADER_DRAW_VIS_EX( ( FILESHARE_MATCHDETAILS_BGX+ ( FILESHARE_MATCHDETAILS_W / 2 ) - 40 ) (FILESHARE_MATCHDETAILS_BGY + 220 ) 80 80 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( "menu_mp_lobby_" + getPooledFileDetails( "mapTeam" ) ), 0.9 0.9 0.9 0.2, - when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ), - ; ) - - /* BACKGROUND WAGER */ - PREPROC_SHADER_DRAW_VIS_EX( ( FILESHARE_MATCHDETAILS_BGX + ( FILESHARE_MATCHDETAILS_W / 2 ) - 80 ) (FILESHARE_MATCHDETAILS_BGY + 220 ) 160 80 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "menu_mp_lobby_chipstack", 0.3 0.3 0.3 0.2, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" && getPooledFileDetails( "isWager" ) == "1" ), ; ) - - /* BACKGROUND FREEFORALL */ - PREPROC_SHADER_DRAW_VIS_EX( ( FILESHARE_MATCHDETAILS_BGX + ( FILESHARE_MATCHDETAILS_W / 2 ) - 40 ) (FILESHARE_MATCHDETAILS_BGY + 220 ) 80 80 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "playlist_ffa", 0.3 0.3 0.3 0.2, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" && getPooledFileDetails( "isWager" ) == "0" ), ; ) - - - - /* TEXT KEY VALUES */ - FILESHARE_TEXTITEM_KEY( 1, text ( locString( "@MENU_FILESHARE_DATETIME" ) ), when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) ) - FILESHARE_TEXTITEM_VALUE( 1, text ( getFeederData( "fileShareRecentGames", "datetime" ) ), when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) ) - - FILESHARE_TEXTITEM_KEY( 2, text ( locString( "@MENU_FILESHARE_LENGTH" ) ), when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) ) - FILESHARE_TEXTITEM_VALUE( 2, text ( getFeederData( "fileShareRecentGames", "length" ) ), when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) ) - - FILESHARE_TEXTITEM_KEY( 3, text ( locString( "MENU_FILESHARE_KILLS" ) ), when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ) ) - FILESHARE_TEXTITEM_VALUE( 3, text ( getPooledFileDetails( "mapKills" ) ), when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ) ) - - FILESHARE_TEXTITEM_KEY( 4, text ( locString( "MENU_FILESHARE_DEATHS" ) ), when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ) ) - FILESHARE_TEXTITEM_VALUE( 4, text ( getPooledFileDetails( "mapDeaths" ) ), when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ) ) - - //////////////////////// - // TEAM BASED MATCHES - //////////////////////// - - /* TEAM ALLIES */ - itemDef - { - type ITEM_TYPE_TEXT - rect FILESHARE_MATCHDETAILS_X ( FILESHARE_MATCHDETAILS_Y + 35 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( getPooledFileDetails( "mapAlliesScore" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect FILESHARE_MATCHDETAILS_X ( FILESHARE_MATCHDETAILS_Y - 23 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( getPooledFileDetails( "mapAlliesName" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - PREPROC_SHADER_DRAW_VIS_EX( (FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 4 ) - 20 ) ( FILESHARE_MATCHDETAILS_Y - 5 ) 40 40 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( getPooledFileDetails( "mapAlliesIcon" ) ), 1 1 1 0.8, - when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ), - ; ) - - - /* TEAM AXIS */ - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 2 ) ) ( FILESHARE_MATCHDETAILS_Y + 35 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( getPooledFileDetails( "mapAxisScore" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 2 ) ) ( FILESHARE_MATCHDETAILS_Y - 23 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( getPooledFileDetails( "mapAxisName" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - PREPROC_SHADER_DRAW_VIS_EX( (FILESHARE_MATCHDETAILS_X + FILESHARE_MATCHDETAILS_W / 2 + ( FILESHARE_MATCHDETAILS_W / 4 ) - 20 ) ( FILESHARE_MATCHDETAILS_Y - 5 ) 40 40 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER , - ( getPooledFileDetails( "mapAxisIcon" ) ), 1 1 1 0.8, - when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ), - ; ) - - - /* VICTORY, DEFEAT OR DRAW */ - itemDef - { - type ITEM_TYPE_TEXT - rect (FILESHARE_MATCHDETAILS_X) ( FILESHARE_MATCHDETAILS_Y + 5 ) FILESHARE_MATCHDETAILS_W 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_FILESHARE_VICTORY" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor NEW_FRAME_GREEN_RGB 1 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "mapVictory" ) == "victory" && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect (FILESHARE_MATCHDETAILS_X) ( FILESHARE_MATCHDETAILS_Y + 5 ) FILESHARE_MATCHDETAILS_W 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_FILESHARE_DRAW" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor NEW_FRAME_BLUE_RGB 1 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "mapVictory" ) == "draw" && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect (FILESHARE_MATCHDETAILS_X) ( FILESHARE_MATCHDETAILS_Y + 5 ) FILESHARE_MATCHDETAILS_W 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_FILESHARE_DEFEAT" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor 1 0.3 0.3 0.8 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "mapVictory" ) == "defeat" && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - //////////////////////// - // WAGER MATCHES - //////////////////////// - - // Placement medals - #define PLACEMENT_MEDAL_SIZE 40 - PREPROC_SHADER_DRAW_VIS_EX( (FILESHARE_MATCHDETAILS_X + (FILESHARE_MATCHDETAILS_W/2) - (PLACEMENT_MEDAL_SIZE/2) ) ( FILESHARE_MATCHDETAILS_Y - 5) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_icon_wager_first", 1 1 1 1, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "1" && getPooledFileDetails( "position" ) == "1" && getPooledFileDetails( "isValid" ) == "1" ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (FILESHARE_MATCHDETAILS_X + (FILESHARE_MATCHDETAILS_W/2) - (PLACEMENT_MEDAL_SIZE/2) ) ( FILESHARE_MATCHDETAILS_Y - 5) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_icon_wager_second", 1 1 1 1, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "1" && getPooledFileDetails( "position" ) == "2" && getPooledFileDetails( "isValid" ) == "1" ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (FILESHARE_MATCHDETAILS_X + (FILESHARE_MATCHDETAILS_W/2) - (PLACEMENT_MEDAL_SIZE/2) ) ( FILESHARE_MATCHDETAILS_Y - 5) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_icon_wager_third", 1 1 1 1, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "1" && getPooledFileDetails( "position" ) == "3" && getPooledFileDetails( "isValid" ) == "1" ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (FILESHARE_MATCHDETAILS_X + (FILESHARE_MATCHDETAILS_W/2) - (PLACEMENT_MEDAL_SIZE/2) ) ( FILESHARE_MATCHDETAILS_Y - 5) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_icon_wager_fourth", 1 1 1 1, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "1" && int( getPooledFileDetails( "position" ) ) >= 4 && getPooledFileDetails( "isValid" ) == "1" ), ; ) - - PREPROC_TEXT_DRAW_VIS( (FILESHARE_MATCHDETAILS_X + (FILESHARE_MATCHDETAILS_W/2) - (PLACEMENT_MEDAL_SIZE/2) - 1 ) ( FILESHARE_MATCHDETAILS_Y - 5) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - getPooledFileDetails( "position" ), - TEXTSIZE_BIG, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 0.3, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "1" && int( getPooledFileDetails( "position" ) ) >= 4 && getPooledFileDetails( "isValid" ) == "1" ); ) - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 2 ) + 2 ) ( FILESHARE_MATCHDETAILS_Y - 8 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "@MPUI_EARNINGS_CAPS" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isWager" ) == "1" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 2 ) ) ( FILESHARE_MATCHDETAILS_Y +15 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "@MENU_POINTS", int( getPooledFileDetails( "wagerPayout" ) ) ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor NEW_FRAME_GREEN_RGB 1 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isWager" ) == "1" ) - decoration - } - - //////////////////////// - // FREE FOR ALL - //////////////////////// - itemDef - { - type ITEM_TYPE_TEXT - rect (FILESHARE_MATCHDETAILS_X) ( FILESHARE_MATCHDETAILS_Y + 5 ) FILESHARE_MATCHDETAILS_W 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_FILESHARE_VICTORY" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor NEW_FRAME_GREEN_RGB 1 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "0" && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" && getPooledFileDetails( "position" ) == "1" ) - decoration - } - itemDef - { - type ITEM_TYPE_TEXT - rect (FILESHARE_MATCHDETAILS_X) ( FILESHARE_MATCHDETAILS_Y + 5 ) FILESHARE_MATCHDETAILS_W 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_FILESHARE_DEFEAT" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor 1 0.3 0.3 0.8 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "0" && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" && getPooledFileDetails( "position" ) != "1" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 2 ) ) ( FILESHARE_MATCHDETAILS_Y - 8 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "@MPUI_POSITION_CAPS" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" && getPooledFileDetails( "isWager" ) == "0" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 2 ) ) ( FILESHARE_MATCHDETAILS_Y +15 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( getPooledFileDetails( "position" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" && getPooledFileDetails( "isWager" ) == "0" ) - decoration - } - - - //////////////////////// - // FREE FOR ALL AND WAGER - //////////////////////// - itemDef - { - type ITEM_TYPE_TEXT - rect FILESHARE_MATCHDETAILS_X ( FILESHARE_MATCHDETAILS_Y - 8 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "@MPUI_SCORE_CAPS" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" ) - decoration - } - itemDef - { - type ITEM_TYPE_TEXT - rect FILESHARE_MATCHDETAILS_X ( FILESHARE_MATCHDETAILS_Y + 15 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( getPooledFileDetails( "score" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" ) - decoration - } - - // Tooltip - Recent Game - PREPROC_TEXT_DRAW_VIS_EX( -255 115 230 36 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "MENU_FILESHARE_RECENTGAMESDESC" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ), autowrapped; ) - PREPROC_SHADER_DRAW_VIS_EX( -265 116 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "ui_arrow_right", 1 1 1 1, when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ), ; ) - - - // Legend - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + 178 ) ( FILESHARE_MATCHDETAILS_Y - 157 ) 40 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_DEATHS" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_LEFT - textscale TEXTSIZE_SMALL - forecolor 0 0 0 0.8 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ) - decoration - } - - PREPROC_SHADER_DRAW_VIS_EX( ( FILESHARE_MATCHDETAILS_X + 180 ) ( FILESHARE_MATCHDETAILS_Y - 140 ) 5 5 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER , - "white", 1 0 0 0.8, - when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ), - ; ) - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + 190 ) ( FILESHARE_MATCHDETAILS_Y - 142 ) 40 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "CUSTOM_ALL" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_LEFT - textscale TEXTSIZE_SMALL - forecolor 1 0.3 0.3 0.8 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ) - decoration - } - - PREPROC_SHADER_DRAW_VIS_EX( ( FILESHARE_MATCHDETAILS_X + 180 ) ( FILESHARE_MATCHDETAILS_Y - 126 ) 4.5 4.5 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER , - "white", 1 1 0 0.8, - when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ), - ; ) - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + 190 ) ( FILESHARE_MATCHDETAILS_Y - 128 ) 40 10 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_YOURS_CAPS" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_LEFT - textscale TEXTSIZE_SMALL - forecolor 1 1 0.3 0.6 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ) - decoration - autowrapped - } - - - - NEW_FRAME_BACK_BUTTON_ACTION( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, ON_ESC_ACTION ) - - - #include "ui/safearea.menu" -} - -menuDef -{ - name menu_fileshare_myrecentgames_transfer - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - onOpen - { - activateBlur; - READ_FILE_SHARE; - } - onFocus - { - play CHOICE_FOCUS_SOUND; - } - onClose - { - deactivateblur; - } - onESC - { - close self; - } - execKeyInt APAD_LEFT { play CHOICE_FOCUS_SOUND; } - execKeyInt DPAD_LEFT { play CHOICE_FOCUS_SOUND; } - execKeyInt APAD_RIGHT { play CHOICE_FOCUS_SOUND; } - execKeyInt DPAD_RIGHT { play CHOICE_FOCUS_SOUND; } - execKeyInt APAD_UP { execnow set fshSelectLastSlotRow 1; setfocus fileShareSlots; } - execKeyInt DPAD_UP { execnow set fshSelectLastSlotRow 1; setfocus fileShareSlots; } - execKeyInt APAD_DOWN { execnow set fshSelectFirstSlotRow 1; setfocus fileShareSlots; } - execKeyInt DPAD_DOWN { execnow set fshSelectFirstSlotRow 1; setfocus fileShareSlots; } - - NEW_FRAME( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) - NEW_FRAME_TITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_MYSHARE_CAPS", 1 ) - NEW_FRAME_SUBTITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_CHOOSESLOT", 1 ) - PLAYER_INFO_VIS( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, 1 ) - - itemDef - { - name fileShareSlots - type ITEM_TYPE_LISTBOX - feeder FEEDER_FILESHARE_MYSLOTS - FILESHARE_COMMON_OPTIONS - elementwidth 70 - elementheight 70 - elementtype LISTBOX_TEXT - textalign HORIZONTAL_ALIGN_LEFT - textfont UI_FONT_NORMAL - forecolor CHOICE_TEXTCOLOR - modal - doubleclick - { - if ( !( FILESHARE_TASKSINPROGRESS ) ) - { - play CHOICE_FOCUS_SOUND; - if ( getFeederData( "slotOccupied" ) != 1 ) - { - open menu_fileshare_myrecentgames_transfer_save; - } - else - { - open menu_fileshare_myrecentgames_transfer_confirm; - } - } - } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - visible 1 - FILESHARE_SLOTS_USERAREAS - } - FILESHARE_BOTTOM( fileShareSlots, 1 ) - FILESHARE_DETAILS( 35, (NEW_FRAME_CHOICE_Y_START-1), HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, - "menu_fileshare_myrecentgames_transfer", "fileShareSlots", - getFeederData( "fileShareSlots", "slotOccupied" ) && getFeederData( "fileShareSlots", "count" ) > 0.0 ) - -#ifdef CONSOLE - PREPROC_TEXT_DRAW_VIS( -144 158 30 15 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - ( int( getFeederData( "fileShareSlots", "slot" ) ) + " " + locString( "@MENU_FILESHARE_OF6") ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, 1 1 1 1, when( !IsPremiumSubscriber() ) ) - - PREPROC_TEXT_DRAW_VIS( -144 158 30 15 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - ( int( getFeederData( "fileShareSlots", "slot" ) ) + " " + locString( "@MENU_FILESHARE_OF18") ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, 1 1 1 1, when( IsPremiumSubscriber() ) ) - - PREPROC_SHADER_DRAW_VIS_EX( -114 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_left", COLOR_BODY_TEXT, - when( getFeederData( "fileShareSlots", "slot" ) > 6 ), - rotation 90; ) - PREPROC_SHADER_DRAW_VIS_EX( -107 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( getFeederData( "fileShareSlots", "slot" ) > 6 && getFeederData( "fileShareSlots", "slot" ) < 13 ), - rotation 90; ) - PREPROC_SHADER_DRAW_VIS_EX( -114 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( getFeederData( "fileShareSlots", "slot" ) <= 6 ), - rotation 90; ) -#endif //#ifdef CONSOLE -#ifdef PC - NEW_FRAME_BACK_BUTTON_ACTION( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, close self; ) -#else // #ifdef PC - NEW_FRAME_BACK_BUTTON( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) -#endif // #else // #ifdef PC -} - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_myrecentgames_transfer_confirm, activateblur; execNow raiseFeederEvent Populate;, deactivateblur; close self;, 1 ) - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent Clear; - } - - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_REPLACECONFIRM", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 - menuItemsDef - { - maxRows 4 - DYNAMIC_MENU_COMMON_COLUMNS - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent Yes - { - open menu_fileshare_myrecentgames_transfer_save; - close self; - } - onEvent No { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate { - execNow addToFeeder Yes MENU_YES; - execNow addToFeeder No MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - - - - - - - -// ========================================================================================= -// RECENT GAMES (OTHER PLAYER) -// menu_fileshare_recentgames -// Shows the list of recent games -// -// menu_fileshare_recentgames_choose -// Options when one of those games are chosen -// -// menu_fileshare_recentgames_transfer -// For transferring to the user's file share, this brings up a slot selection screen. -// -// menu_fileshare_recentgames_confirm -// If a slot is being overwritten, this shows a confirm dialogue -// ========================================================================================= - -#undef ON_ESC_ACTION -#define ON_ESC_ACTION \ - deactivateBlur; \ - close self; \ - open menu_playercard; - -menuDef -{ - name menu_fileshare_recentgames - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - - onOpen - { - activateBlur; - execnow set showHeatmapSpinner 0; - execnow fileShareSetPooledFileContext "friend"; - execnow fileShareGetRecentGames ( dvarString( selectedPlayerXuid ) ); - execnow ui_animate menu_fileshare_recentgames heatMap WaitForHeatmap 0; - execnow set fsSelectedFileID 0; - } - onFocus - { - } - onClose - { - deactivateBlur; - execnow ui_animate menu_fileshare_recentgames heatMap Hidden 0; - } - onESC - { - ON_ESC_ACTION - } - - NEW_FRAME( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) - NEW_FRAME_TITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, dvarString("selectedFriendName") + locString("MENU_APOSTROPHE_S")+" "+locString("MENU_PLAYERCARD_CAPS"), 1 ) - NEW_FRAME_SUBTITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_RECENTGAMES_CAPS", 1 ) - - FRIEND_INFO_VIS( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, 1 ) - - itemDef - { - name fileShareRecentGames - type ITEM_TYPE_LISTBOX - feeder FEEDER_FILESHARE_SEARCHRESULTS - rect -265 -127 250 230 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - origin 0 0 - elementwidth 30 - elementheight 16 - elementtype LISTBOX_TEXT - textstyle ITEM_TEXTSTYLE_NORMAL - textfont UI_FONT_NORMAL - textscale TEXTSIZE_DEFAULT - textalign HORIZONTAL_ALIGN_LEFT - textalignx 12 - forecolor CHOICE_TEXTCOLOR - focusColor CHOICE_TEXTCOLOR - disableColor CHOICE_TEXTCOLOR - #ifdef XENON - selectIcon "ui_button_xenon_3d_a_32x32" - #endif - #ifdef PS3 - selectIcon "ui_button_ps3_x_32x32" - #endif - outlinecolor 1 1 1 1 - elementHighlightColor 0 0 0 1 - elementBackgroundColor NEW_FRAME_TRANSPARENCY - noBlinkingHighlight - modal - noscrollbars - /* x y w h len horzAlign vertAlign*/ - userarea 1 10 -1 200 18 50 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP - visible 1 - onListboxSelectionChange - { - if( getFeederData( "count" ) > 1 ) - { - play CHOICE_FOCUS_SOUND; - execnow ui_animate menu_fileshare_recentgames heatMap RemoveStaleHeatmap 0; - } - } - doubleclick - { - if( getFeederData( "count" ) > 0.0 ) - { - execnow set fsSelectedFileName ( getFeederData( name ) ); - execnow set fsSelectedRecentGameID ( getFeederData( fileID ) ); - execnow set fsIsSelectedFileNameModified ( getFeederData( isModifiedName ) ); - execnow set fsSelectedFileDescription ( getFeederData( description ) ); - execnow set fsIsSelectedFileDescriptionModified ( getFeederData( isModifiedDescription ) ); - open menu_fileshare_recentgames_choose; - } - } - } - - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect 75 -130 150 150 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - forecolor 1 1 1 1 - ownerdraw UI_DRAWHEATMAP - visible when( FILESHARE_DETAILS_CONDITION ) - decoration - } - - FILESHARE_PROGRESS_INDICATOR_SIZE( 150, 0, 64, 64, 0, ( !FILESHARE_DETAILS_CONDITION && FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) ) - - // File details - itemDef - { - style WINDOW_STYLE_SHADER - rect FILESHARE_MATCHDETAILS_BGX FILESHARE_MATCHDETAILS_BGY FILESHARE_MATCHDETAILS_BGW 300 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - origin 0 0 - background "white" - forecolor 0 0 0 0.1 - visible when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) - decoration - } - - itemDef - { - style WINDOW_STYLE_SHADER - rect FILESHARE_MATCHDETAILS_BGX (FILESHARE_MATCHDETAILS_BGY + 220 ) FILESHARE_MATCHDETAILS_BGW 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - origin 0 0 - background "white" - forecolor 0 0 0 0.2 - visible when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) - decoration - } - - itemDef - { - style WINDOW_STYLE_SHADER - rect FILESHARE_MATCHDETAILS_BGX (FILESHARE_MATCHDETAILS_BGY + 260) FILESHARE_MATCHDETAILS_BGW 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - origin 0 0 - background "white" - forecolor 0 0 0 0.2 - visible when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) - decoration - } - - /* BACKGROUND TEAM ICON */ - PREPROC_SHADER_DRAW_VIS_EX( ( FILESHARE_MATCHDETAILS_BGX+ ( FILESHARE_MATCHDETAILS_W / 2 ) - 40 ) (FILESHARE_MATCHDETAILS_BGY + 220 ) 80 80 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( "menu_mp_lobby_" + getPooledFileDetails( "mapTeam" ) ), 0.9 0.9 0.9 0.2, - when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ), - ; ) - - /* BACKGROUND WAGER */ - PREPROC_SHADER_DRAW_VIS_EX( ( FILESHARE_MATCHDETAILS_BGX + ( FILESHARE_MATCHDETAILS_W / 2 ) - 80 ) (FILESHARE_MATCHDETAILS_BGY + 220 ) 160 80 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "menu_mp_lobby_chipstack", 0.3 0.3 0.3 0.2, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" && getPooledFileDetails( "isWager" ) == "1" ), ; ) - - /* BACKGROUND FREEFORALL */ - PREPROC_SHADER_DRAW_VIS_EX( ( FILESHARE_MATCHDETAILS_BGX + ( FILESHARE_MATCHDETAILS_W / 2 ) - 40 ) (FILESHARE_MATCHDETAILS_BGY + 220 ) 80 80 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "playlist_ffa", 0.3 0.3 0.3 0.2, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" && getPooledFileDetails( "isWager" ) == "0" ), ; ) - - /* TEXT KEY VALUES */ - FILESHARE_TEXTITEM_KEY( 1, text ( locString( "@MENU_FILESHARE_DATETIME" ) ), when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) ) - FILESHARE_TEXTITEM_VALUE( 1, text ( getFeederData( "fileShareRecentGames", "datetime" ) ), when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) ) - - FILESHARE_TEXTITEM_KEY( 2, text ( locString( "@MENU_FILESHARE_LENGTH" ) ), when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) ) - FILESHARE_TEXTITEM_VALUE( 2, text ( getFeederData( "fileShareRecentGames", "length" ) ), when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ) ) - - FILESHARE_TEXTITEM_KEY( 3, text ( locString( "MENU_FILESHARE_KILLS" ) ), when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ) ) - FILESHARE_TEXTITEM_VALUE( 3, text ( getPooledFileDetails( "mapKills" ) ), when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ) ) - - FILESHARE_TEXTITEM_KEY( 4, text ( locString( "MENU_FILESHARE_DEATHS" ) ), when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ) ) - FILESHARE_TEXTITEM_VALUE( 4, text ( getPooledFileDetails( "mapDeaths" ) ), when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ) ) - - /* TEAM ALLIES */ - itemDef - { - type ITEM_TYPE_TEXT - rect FILESHARE_MATCHDETAILS_X ( FILESHARE_MATCHDETAILS_Y + 35 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( getPooledFileDetails( "mapAlliesScore" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect FILESHARE_MATCHDETAILS_X ( FILESHARE_MATCHDETAILS_Y - 23 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( getPooledFileDetails( "mapAlliesName" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - PREPROC_SHADER_DRAW_VIS_EX( (FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 4 ) - 20 ) ( FILESHARE_MATCHDETAILS_Y - 5 ) 40 40 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - ( getPooledFileDetails( "mapAlliesIcon" ) ), 1 1 1 0.8, - when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ), - ; ) - - - /* TEAM AXIS */ - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 2 ) ) ( FILESHARE_MATCHDETAILS_Y + 35 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( getPooledFileDetails( "mapAxisScore" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 2 ) ) ( FILESHARE_MATCHDETAILS_Y - 23 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( getPooledFileDetails( "mapAxisName" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - PREPROC_SHADER_DRAW_VIS_EX( (FILESHARE_MATCHDETAILS_X + FILESHARE_MATCHDETAILS_W / 2 + ( FILESHARE_MATCHDETAILS_W / 4 ) - 20 ) ( FILESHARE_MATCHDETAILS_Y - 5 ) 40 40 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER , - ( getPooledFileDetails( "mapAxisIcon" ) ), 1 1 1 0.8, - when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ), - ; ) - - - /* VICTORY, DEFEAT OR DRAW */ - itemDef - { - type ITEM_TYPE_TEXT - rect (FILESHARE_MATCHDETAILS_X) ( FILESHARE_MATCHDETAILS_Y + 5 ) FILESHARE_MATCHDETAILS_W 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_FILESHARE_VICTORY" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor NEW_FRAME_GREEN_RGB 1 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "mapVictory" ) == "victory" && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect (FILESHARE_MATCHDETAILS_X) ( FILESHARE_MATCHDETAILS_Y + 5 ) FILESHARE_MATCHDETAILS_W 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_FILESHARE_DRAW" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor NEW_FRAME_BLUE_RGB 1 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "mapVictory" ) == "draw" && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect (FILESHARE_MATCHDETAILS_X) ( FILESHARE_MATCHDETAILS_Y + 5 ) FILESHARE_MATCHDETAILS_W 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_FILESHARE_DEFEAT" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor 1 0.3 0.3 0.8 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "mapVictory" ) == "defeat" && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "1" ) - decoration - } - - //////////////////////// - // WAGER MATCHES - //////////////////////// - - // Placement medals - PREPROC_SHADER_DRAW_VIS_EX( (FILESHARE_MATCHDETAILS_X + (FILESHARE_MATCHDETAILS_W/2) - (PLACEMENT_MEDAL_SIZE/2) ) ( FILESHARE_MATCHDETAILS_Y - 5) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_icon_wager_first", 1 1 1 1, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "1" && getPooledFileDetails( "position" ) == "1" && getPooledFileDetails( "isValid" ) == "1" ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (FILESHARE_MATCHDETAILS_X + (FILESHARE_MATCHDETAILS_W/2) - (PLACEMENT_MEDAL_SIZE/2) ) ( FILESHARE_MATCHDETAILS_Y - 5) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_icon_wager_second", 1 1 1 1, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "1" && getPooledFileDetails( "position" ) == "2" && getPooledFileDetails( "isValid" ) == "1" ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (FILESHARE_MATCHDETAILS_X + (FILESHARE_MATCHDETAILS_W/2) - (PLACEMENT_MEDAL_SIZE/2) ) ( FILESHARE_MATCHDETAILS_Y - 5) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_icon_wager_third", 1 1 1 1, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "1" && getPooledFileDetails( "position" ) == "3" && getPooledFileDetails( "isValid" ) == "1" ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( (FILESHARE_MATCHDETAILS_X + (FILESHARE_MATCHDETAILS_W/2) - (PLACEMENT_MEDAL_SIZE/2) ) ( FILESHARE_MATCHDETAILS_Y - 5) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "hud_icon_wager_fourth", 1 1 1 1, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "1" && int( getPooledFileDetails( "position" ) ) >= 4 && getPooledFileDetails( "isValid" ) == "1" ), ; ) - - PREPROC_TEXT_DRAW_VIS( (FILESHARE_MATCHDETAILS_X + (FILESHARE_MATCHDETAILS_W/2) - (PLACEMENT_MEDAL_SIZE/2) - 1 ) ( FILESHARE_MATCHDETAILS_Y - 5) PLACEMENT_MEDAL_SIZE PLACEMENT_MEDAL_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - getPooledFileDetails( "position" ), - TEXTSIZE_BIG, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, 1 1 1 0.3, when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "1" && int( getPooledFileDetails( "position" ) ) >= 4 && getPooledFileDetails( "isValid" ) == "1" ); ) - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 2 ) + 2 ) ( FILESHARE_MATCHDETAILS_Y - 8 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "@MPUI_EARNINGS_CAPS" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isWager" ) == "1" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 2 ) ) ( FILESHARE_MATCHDETAILS_Y +15 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "@MENU_POINTS", int( getPooledFileDetails( "wagerPayout" ) ) ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor NEW_FRAME_GREEN_RGB 1 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isWager" ) == "1" ) - decoration - } - - //////////////////////// - // FREE FOR ALL - //////////////////////// - itemDef - { - type ITEM_TYPE_TEXT - rect (FILESHARE_MATCHDETAILS_X) ( FILESHARE_MATCHDETAILS_Y + 5 ) FILESHARE_MATCHDETAILS_W 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_FILESHARE_VICTORY" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor NEW_FRAME_GREEN_RGB 1 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "0" && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" && getPooledFileDetails( "position" ) == "1" ) - decoration - } - itemDef - { - type ITEM_TYPE_TEXT - rect (FILESHARE_MATCHDETAILS_X) ( FILESHARE_MATCHDETAILS_Y + 5 ) FILESHARE_MATCHDETAILS_W 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_FILESHARE_DEFEAT" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor 1 0.3 0.3 0.8 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isWager" ) == "0" && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" && getPooledFileDetails( "position" ) != "1" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 2 ) ) ( FILESHARE_MATCHDETAILS_Y - 8 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "@MPUI_POSITION_CAPS" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" && getPooledFileDetails( "isWager" ) == "0" ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + ( FILESHARE_MATCHDETAILS_W / 2 ) ) ( FILESHARE_MATCHDETAILS_Y +15 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( getPooledFileDetails( "position" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" && getPooledFileDetails( "isWager" ) == "0" ) - decoration - } - - - //////////////////////// - // FREE FOR ALL AND WAGER - //////////////////////// - itemDef - { - type ITEM_TYPE_TEXT - rect FILESHARE_MATCHDETAILS_X ( FILESHARE_MATCHDETAILS_Y - 8 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "@MPUI_SCORE_CAPS" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" ) - decoration - } - itemDef - { - type ITEM_TYPE_TEXT - rect FILESHARE_MATCHDETAILS_X ( FILESHARE_MATCHDETAILS_Y + 15 ) ( FILESHARE_MATCHDETAILS_W / 2 ) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( getPooledFileDetails( "score" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_DEFAULT - forecolor LIGHT_GRAY - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" && getPooledFileDetails( "isTeamBased" ) == "0" ) - decoration - } - - - // Tooltip - Recent Game - PREPROC_TEXT_DRAW_VIS_EX( -255 115 230 36 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "MENU_FILESHARE_RECENTGAMESDESC" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ), autowrapped; ) - PREPROC_SHADER_DRAW_VIS_EX( -265 116 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "ui_arrow_right", 1 1 1 1, when( FILESHARE_SEARCHPOPULATED( fileShareRecentGames ) ), ; ) - - - // Legend - PREPROC_SHADER_DRAW_VIS_EX( ( FILESHARE_MATCHDETAILS_X + 170 ) ( FILESHARE_MATCHDETAILS_Y - 155 ) 5 5 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER , - "white", 1 0 0 1, - when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ), - ; ) - - itemDef - { - type ITEM_TYPE_TEXT - rect ( FILESHARE_MATCHDETAILS_X + 180 ) ( FILESHARE_MATCHDETAILS_Y - 155 ) 5 5 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( locString( "MENU_FILESHARE_DEATHS" ) ) - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_LEFT - textscale TEXTSIZE_DEFAULT - forecolor 1 0.3 0.3 0.8 - visible when( FILESHARE_DETAILS_CONDITION && getPooledFileDetails( "isValid" ) == "1" ) - decoration - } - - - itemDef - { - type ITEM_TYPE_TEXT - rect 0 0 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - text "@MENU_FILESHARE_NORECENTGAME_OTHER" - textfont CHOICE_TEXTFONT - textalign ITEM_ALIGN_MIDDLE_CENTER - textscale TEXTSIZE_SMALL - forecolor LIGHT_GRAY - visible when ( !( FILESHARE_TASKSINPROGRESS ) && getFeederData( fileShareRecentGames, count ) < 1 ) - decoration - } - - NEW_FRAME_BACK_BUTTON_ACTION( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, ON_ESC_ACTION ) - - #include "ui/safearea.menu" -} - -menuDef -{ - name menu_fileshare_recentgames_transfer - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - onOpen - { - activateBlur; - READ_FILE_SHARE; - } - onFocus - { - play CHOICE_FOCUS_SOUND; - } - onClose - { - deactivateblur; - } - onESC - { - close self; - } - execKeyInt APAD_LEFT { play CHOICE_FOCUS_SOUND; } - execKeyInt DPAD_LEFT { play CHOICE_FOCUS_SOUND; } - execKeyInt APAD_RIGHT { play CHOICE_FOCUS_SOUND; } - execKeyInt DPAD_RIGHT { play CHOICE_FOCUS_SOUND; } - execKeyInt APAD_UP { execnow set fshSelectLastSlotRow 1; setfocus fileShareSlots; } - execKeyInt DPAD_UP { execnow set fshSelectLastSlotRow 1; setfocus fileShareSlots; } - execKeyInt APAD_DOWN { execnow set fshSelectFirstSlotRow 1; setfocus fileShareSlots; } - execKeyInt DPAD_DOWN { execnow set fshSelectFirstSlotRow 1; setfocus fileShareSlots; } - - NEW_FRAME( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) - NEW_FRAME_TITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_MYSHARE_CAPS", 1 ) - NEW_FRAME_SUBTITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_CHOOSESLOT", 1 ) - PLAYER_INFO_VIS( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, 1 ) - - itemDef - { - name fileShareSlots - type ITEM_TYPE_LISTBOX - feeder FEEDER_FILESHARE_MYSLOTS - FILESHARE_COMMON_OPTIONS - elementwidth 70 - elementheight 70 - elementtype LISTBOX_TEXT - textalign HORIZONTAL_ALIGN_LEFT - textfont UI_FONT_NORMAL - forecolor CHOICE_TEXTCOLOR - modal - doubleclick - { - if ( !( FILESHARE_TASKSINPROGRESS ) ) - { - play CHOICE_FOCUS_SOUND; - if ( getFeederData( "slotOccupied" ) != 1 ) - { - open menu_fileshare_recentgames_transfer_save; - } - else - { - open menu_fileshare_recentgames_transfer_confirm; - } - } - } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - visible 1 - FILESHARE_SLOTS_USERAREAS - } - FILESHARE_BOTTOM( fileShareSlots, 1 ) - FILESHARE_DETAILS( 35, (NEW_FRAME_CHOICE_Y_START-1), HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, - "menu_fileshare_recentgames_transfer", "fileShareSlots", - getFeederData( "fileShareSlots", "slotOccupied" ) && getFeederData( "fileShareSlots", "count" ) > 0.0 ) - -#ifdef CONSOLE - PREPROC_TEXT_DRAW_VIS( -144 158 30 15 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - ( int( getFeederData( "fileShareSlots", "slot" ) ) + " " + locString( "@MENU_FILESHARE_OF6") ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, 1 1 1 1, when( !IsPremiumSubscriber() ) ) - - PREPROC_TEXT_DRAW_VIS( -144 158 30 15 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - ( int( getFeederData( "fileShareSlots", "slot" ) ) + " " + locString( "@MENU_FILESHARE_OF18") ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, 1 1 1 1, when( IsPremiumSubscriber() ) ) - - PREPROC_SHADER_DRAW_VIS_EX( -114 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_left", COLOR_BODY_TEXT, - when( getFeederData( "fileShareSlots", "slot" ) > 6 ), - rotation 90; ) - PREPROC_SHADER_DRAW_VIS_EX( -107 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( getFeederData( "fileShareSlots", "slot" ) > 6 && getFeederData( "fileShareSlots", "slot" ) < 13 ), - rotation 90; ) - PREPROC_SHADER_DRAW_VIS_EX( -114 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( getFeederData( "fileShareSlots", "slot" ) <= 6 ), - rotation 90; ) -#endif //#ifdef CONSOLE -#ifdef PC - NEW_FRAME_BACK_BUTTON_ACTION( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, close self; ) -#else // #ifdef PC - NEW_FRAME_BACK_BUTTON( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) -#endif // #else // #ifdef PC -} - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_recentgames_transfer_confirm, activateblur; execNow raiseFeederEvent Populate;, deactivateblur; close self;, 1 ) - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent Clear; - } - - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_REPLACECONFIRM", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 - menuItemsDef - { - maxRows 4 - DYNAMIC_MENU_COMMON_COLUMNS - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent Yes - { - open menu_fileshare_recentgames_transfer_save; - close self; - } - onEvent No { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate { - execNow addToFeeder Yes MENU_YES; - execNow addToFeeder No MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - - - - - - - - -// ========================================================================================= -// COMMUNITY -// menu_fileshare_community_choose -// On selecting an item from any search results, brings up choices on what to do with it -// -// menu_fileshare_community_transfer -// If transferring from the community search results to you file share, it shows -// your private slots to choose which one to transfer it to. -// -// fileshare_searchbox -// Shows a search box that allows filtering search results -// ========================================================================================= - -menuDef -{ - name menu_fileshare_community_transfer - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - onOpen - { - activateBlur; - READ_FILE_SHARE; - } - onFocus - { - play CHOICE_FOCUS_SOUND; - } - onClose - { - deactivateblur; - } - onESC - { - close self; - } - execKeyInt APAD_LEFT { play CHOICE_FOCUS_SOUND; } - execKeyInt DPAD_LEFT { play CHOICE_FOCUS_SOUND; } - execKeyInt APAD_RIGHT { play CHOICE_FOCUS_SOUND; } - execKeyInt DPAD_RIGHT { play CHOICE_FOCUS_SOUND; } - execKeyInt APAD_UP { execnow set fshSelectLastSlotRow 1; setfocus fileShareSlots; } - execKeyInt DPAD_UP { execnow set fshSelectLastSlotRow 1; setfocus fileShareSlots; } - execKeyInt APAD_DOWN { execnow set fshSelectFirstSlotRow 1; setfocus fileShareSlots; } - execKeyInt DPAD_DOWN { execnow set fshSelectFirstSlotRow 1; setfocus fileShareSlots; } - - NEW_FRAME( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) - NEW_FRAME_TITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_MYSHARE_CAPS", 1 ) - NEW_FRAME_SUBTITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@MENU_FILESHARE_CHOOSESLOT", 1 ) - PLAYER_INFO_VIS( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, 1 ) - - itemDef - { - name fileShareSlots - type ITEM_TYPE_LISTBOX - feeder FEEDER_FILESHARE_MYSLOTS - FILESHARE_COMMON_OPTIONS - elementwidth 70 - elementheight 70 - elementtype LISTBOX_TEXT - textalign HORIZONTAL_ALIGN_LEFT - textfont UI_FONT_NORMAL - forecolor CHOICE_TEXTCOLOR - modal - doubleclick - { - if ( !( FILESHARE_TASKSINPROGRESS ) ) - { - play CHOICE_FOCUS_SOUND; - if ( getFeederData( "slotOccupied" ) != 1 ) - { - open menu_fileshare_community_transfer_save; - } - else - { - open menu_fileshare_community_transfer_confirm; - } - } - } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - visible 1 - FILESHARE_SLOTS_USERAREAS - } - FILESHARE_BOTTOM( fileShareSlots, 1 ) - FILESHARE_DETAILS( 35, (NEW_FRAME_CHOICE_Y_START-1), HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, - "menu_fileshare_community_transfer", "fileShareSlots", - getFeederData( "fileShareSlots", "slotOccupied" ) && getFeederData( "fileShareSlots", "count" ) > 0.0 ) - -#ifdef CONSOLE - PREPROC_TEXT_DRAW_VIS( -144 158 30 15 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - ( int( getFeederData( "fileShareSlots", "slot" ) ) + " " + locString( "@MENU_FILESHARE_OF6") ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, 1 1 1 1, when( !IsPremiumSubscriber() ) ) - - PREPROC_TEXT_DRAW_VIS( -144 158 30 15 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - ( int( getFeederData( "fileShareSlots", "slot" ) ) + " " + locString( "@MENU_FILESHARE_OF18") ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, 1 1 1 1, when( IsPremiumSubscriber() ) ) - - PREPROC_SHADER_DRAW_VIS_EX( -114 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_left", COLOR_BODY_TEXT, - when( getFeederData( "fileShareSlots", "slot" ) > 6 ), - rotation 90; ) - PREPROC_SHADER_DRAW_VIS_EX( -107 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( getFeederData( "fileShareSlots", "slot" ) > 6 && getFeederData( "fileShareSlots", "slot" ) < 13 ), - rotation 90; ) - PREPROC_SHADER_DRAW_VIS_EX( -114 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( getFeederData( "fileShareSlots", "slot" ) <= 6 ), - rotation 90; ) -#endif //#ifdef CONSOLE -#ifdef PC - NEW_FRAME_BACK_BUTTON_ACTION( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, close self; ) -#else // #ifdef PC - NEW_FRAME_BACK_BUTTON( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) -#endif // #else // #ifdef PC -} - - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_community_transfer_confirm, activateblur; execNow raiseFeederEvent Populate;, deactivateblur; close self;, 1 ) - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent Clear; - } - - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_REPLACECONFIRM", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 - menuItemsDef - { - maxRows 4 - DYNAMIC_MENU_COMMON_COLUMNS - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent Yes - { - open menu_fileshare_community_transfer_save; - close self; - } - onEvent No { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate { - execNow addToFeeder Yes MENU_YES; - execNow addToFeeder No MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - - - -#define SPINNERS_START_X 102 -#define SPINNERS_START_Y 40 - -#undef ON_APPLY_ACTION -#define ON_APPLY_ACTION \ - execnow set fshSearchBusy 1; \ - execnow ui_animate menu_fileshare_community StateChanger Wait 0; \ - execnow ui_animate menu_fileshare_community StateChanger Search 1500; \ - play CHOICE_FOCUS_SOUND; \ - close self; - -#undef ON_ESC -#define ON_ESC \ - execnow fileShareFilterRestore; \ - setdvar fsSearchRowValue1 dvarint(backup_fsSearchRowValue1); \ - setdvar fsSearchRowValue2 dvarint(backup_fsSearchRowValue2); \ - setdvar fsSearchRowValue3 dvarint(backup_fsSearchRowValue3); \ - setdvar fsSearchRowValue4 dvarint(backup_fsSearchRowValue4); \ - setdvar fsSearchRowValue5 dvarint(backup_fsSearchRowValue5); \ - setdvar fsSearchRowValue6 dvarint(backup_fsSearchRowValue6); \ - setdvar fsSearchRowText1 dvarstring(backup_fsSearchRowText1); \ - setdvar fsSearchRowText2 dvarstring(backup_fsSearchRowText2); \ - setdvar fsSearchRowText3 dvarstring(backup_fsSearchRowText3); \ - setdvar fsSearchRowText4 dvarstring(backup_fsSearchRowText4); \ - setdvar fsSearchRowText5 dvarstring(backup_fsSearchRowText5); \ - setdvar fsSearchRowText6 dvarstring(backup_fsSearchRowText6); \ - close self; - - -menuDef - -{ - SYSTEM_POPUP_SETUP_VIS( fileshare_searchbox, ;, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_CHOOSEFILTER", 1 ) - - onOpen - { - activateblur; - execnow fileShareFilterBackup; - - setdvar backup_fsSearchRowValue1 dvarint(fsSearchRowValue1); - setdvar backup_fsSearchRowValue2 dvarint(fsSearchRowValue2); - setdvar backup_fsSearchRowValue3 dvarint(fsSearchRowValue3); - setdvar backup_fsSearchRowValue4 dvarint(fsSearchRowValue4); - setdvar backup_fsSearchRowValue5 dvarint(fsSearchRowValue5); - setdvar backup_fsSearchRowValue6 dvarint(fsSearchRowValue6); - - setdvar backup_fsSearchRowText1 dvarstring(fsSearchRowText1); - setdvar backup_fsSearchRowText2 dvarstring(fsSearchRowText2); - setdvar backup_fsSearchRowText3 dvarstring(fsSearchRowText3); - setdvar backup_fsSearchRowText4 dvarstring(fsSearchRowText4); - setdvar backup_fsSearchRowText5 dvarstring(fsSearchRowText5); - setdvar backup_fsSearchRowText6 dvarstring(fsSearchRowText6); - - if ( dvarInt( fsSearchFileType ) != FILESHARE_FILETYPE_CUSTOMGAME ) - { - setfocus fileShareSearchRow1; - } - else - { - setfocus fileShareSearchRow2; - } - } - onClose - { - deactivateblur; - } - onESC - { - ON_ESC - } - - SYSTEM_POPUP_BACK_BUTTON_EX( ON_ESC ); - SYSTEM_POPUP_BUTTON2( "@PLATFORM_APPLY_FILTER", ON_APPLY_ACTION, 1 ) - - SEARCH_SPINNER( "@MENU_FILESHARE_SORTING", 1, 2, 6, SPINNERS_START_X, ( SPINNERS_START_Y + 0 ), 251, setdvar fsSearchSelectedRow 1;, 1, 0 ) - SEARCH_SPINNER( "@MENU_FILESHARE_MAP", 2, 3, 1, SPINNERS_START_X, ( SPINNERS_START_Y + 20 ), 251, setdvar fsSearchSelectedRow 2;, 1, ( dvarInt( fsSearchRowValue1 ) != 0 || dvarInt( fsSearchFileType ) == FILESHARE_FILETYPE_CUSTOMGAME ) ) - SEARCH_SPINNER( "@MENU_FILESHARE_GAMETYPE", 3, 4, 2, SPINNERS_START_X, ( SPINNERS_START_Y + 40 ), 251, setdvar fsSearchSelectedRow 3;, 1, ( dvarInt( fsSearchRowValue1 ) != 0 ) ) - SEARCH_SPINNER( "@MENU_FILESHARE_AGE", 4, 5, 3, SPINNERS_START_X, ( SPINNERS_START_Y + 60 ), 251, setdvar fsSearchSelectedRow 4;, 1, ( dvarInt( fsSearchRowValue1 ) != 0 ) ) - SEARCH_SPINNER( "@MENU_FILESHARE_TAG", 5, 6, 4, SPINNERS_START_X, ( SPINNERS_START_Y + 80 ), 251, setdvar fsSearchSelectedRow 5;, 1, ( dvarInt( fsSearchRowValue1 ) != 0 ) ) - SEARCH_SPINNER( "@MENU_FILESHARE_PLAYERPREF",6, 1, 5, SPINNERS_START_X, ( SPINNERS_START_Y + 100 ), 251, setdvar fsSearchSelectedRow 6;, 1, ( dvarInt( fsSearchRowValue1 ) != 0 ) ) - - execKeyInt BUTTON_A - { - ON_APPLY_ACTION - } -} - - -// ========================================================================================= -// IN-GAME -// fileshare_slotselection_clip -// Selection screen when uploading a recorded clip -// -// fileshare_slotselection_scr -// Selection screen when uploading a screenshot -// ========================================================================================= -FILESHARE_INGAME_SLOTSELECTION( fileshare_slotselection_clip, "@PLATFORM_UPLOAD_CLIP", execnow demo_saveanduploadclip ( dvarInt( demo_cmdNum ) ) ( getFeederData( fileshare_slotselection_clip, fileShareSlots, ingameSlot ) );, open clip_save_screen; ) -FILESHARE_INGAME_SLOTSELECTION( fileshare_slotselection_scr, "@PLATFORM_UPLOAD_SCREENSHOT", execnow demo_savescreenshot 0 ( getFeederData( fileshare_slotselection_scr, fileShareSlots, ingameSlot ) );, open screenshot_save_screen ) - - - - -// ========================================================================================= -// SCREENSHOT -// menu_screenshot -// Renders a selected screenshot. -// ========================================================================================= -#define SCREENSHOT_VIEWER_BIAS 20 -#define SCREENSHOT_VIEWER_WIDTH 600 -#define SCREENSHOT_VIEWER_HEIGHT 360 -#define SCREENSHOT_EXPAND_MARGIN 10 -#define SCREENSHOT_VIEWER_X_EXPANDED (-SCREENSHOT_VIEWER_WIDTH/2) -#define SCREENSHOT_VIEWER_Y_EXPANDED (-SCREENSHOT_VIEWER_HEIGHT/2) -#define SCREENSHOT_SPINNER_SIZE 80 - -#define ALREADY_RATED ( GetUserFileRating( dvarString( fsSelectedFileID ) ) != 0 ) - -#undef ON_ESC_ACTION -#define ON_ESC_ACTION \ - if ( isTaskInProgress( "LiveFileShareReadFile" ) ) \ - { \ - execnow screenshotAbortDownload; \ - } \ - close self; - -menuDef -{ - name "menu_screenshot" - visible 1 - fullscreen 0 - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - backcolor 0 0 0 0 - style WINDOW_STYLE_FILLED - priority MENU_PRI_POPUP - popup - - onOpen - { - activateblur; - - if ( isTaskInProgress( "LiveFileShareReadFile" ) ) - { - execnow ui_animate menu_screenshot * Default 0; - } - else - { - execnow ui_animate menu_screenshot * Expand 0; - } - } - - onClose - { - deactivateblur; - } - - onEsc - { - ON_ESC_ACTION - } - - execKeyInt K_MWHEELDOWN - { - execNow screenshotZoom -0.1; - } - - execKeyInt K_MWHEELUP - { - execNow screenshotZoom 0.1; - } - - - itemDef - { - name "frame" - style WINDOW_STYLE_SHADER_FRAMED - type ITEM_TYPE_IMAGE - rect (-SCREENSHOT_SPINNER_SIZE/2) (-SCREENSHOT_SPINNER_SIZE/2) SCREENSHOT_SPINNER_SIZE SCREENSHOT_SPINNER_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - forecolor .2 .2 .2 1 - exp material( "menu_mp_lobby_frame_circle" ) - frame 16 0.5 FRAME_SIDE_ALL - visible 1 - decoration - - state - { - name "expand" - rect SCREENSHOT_VIEWER_X_EXPANDED SCREENSHOT_VIEWER_Y_EXPANDED SCREENSHOT_VIEWER_WIDTH SCREENSHOT_VIEWER_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - - onEnter - { - execNow ui_animate menu_screenshot screenshot display 300; - } - } - } - - itemDef - { - style WINDOW_STYLE_SPINNER - rect (-SCREENSHOT_SPINNER_SIZE/2) (-SCREENSHOT_SPINNER_SIZE/2) SCREENSHOT_SPINNER_SIZE SCREENSHOT_SPINNER_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - visible when( isTaskInProgress( "LiveFileShareReadFile" ) ) - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect 0 0 1 1 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - textfont UI_FONT_NORMAL - textscale TEXTSIZE_SMALL - textalign ITEM_ALIGN_MIDDLE_CENTER - exp text ( getDownloadProgress() ) - visible when( isTaskInProgress( "LiveFileShareReadFile" ) ) - decoration - } - - itemDef - { - name "screenshot" - type ITEM_TYPE_OWNERDRAW - rect (-(SCREENSHOT_VIEWER_WIDTH-SCREENSHOT_VIEWER_BIAS)/2) (-(SCREENSHOT_VIEWER_HEIGHT-SCREENSHOT_VIEWER_BIAS)/2) (SCREENSHOT_VIEWER_WIDTH-SCREENSHOT_VIEWER_BIAS) (SCREENSHOT_VIEWER_HEIGHT-SCREENSHOT_VIEWER_BIAS) HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - ownerdraw UI_SCREENSHOT - visible 1 - forecolor 1 1 1 0 - decoration - - state - { - name "display" - forecolor 1 1 1 1 - } - } - - execKeyInt BUTTON_X - { - if ( !ALREADY_RATED ) - { - setdvar fileshare_rating_screenshot 1; - setdvar fileshare_rating_film 0; - setdvar fileshare_rating_clip 0; - setdvar fileshare_rating_gametype 0; - open fileshare_submitrating; - } - else - { - open fileshare_ratingsubmitted; - } - } - -#ifdef PC - NEW_FRAME_BUTTON_PC_LEFT_OFFSET( SCREENSHOT_VIEWER_WIDTH, SCREENSHOT_VIEWER_HEIGHT, 0, "@PLATFORM_BACK", ON_ESC_ACTION, when( getDownloadProgress() == 100 ); ) -#else // #ifdef PC - NEW_FRAME_BACK_BUTTON( (SCREENSHOT_VIEWER_WIDTH-(SCREENSHOT_VIEWER_BIAS*2)), SCREENSHOT_VIEWER_HEIGHT ) -#endif // #else // #ifdef PC - -#define RATE_SCREENSHOT_ACTION \ - setdvar fileshare_rating_screenshot 1; \ - setdvar fileshare_rating_film 0; \ - setdvar fileshare_rating_clip 0; \ - setdvar fileshare_rating_gametype 0; \ - open fileshare_submitrating; - -#define BUTTON_SPACING 20 -#define RATING_BUTTON_OFFSET ( getTextWidth( locString( "@PLATFORM_BACK" ), CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) + 8 + BUTTON_SPACING ) - - // Rate Screenshot - NEW_FRAME_BUTTON_PC_LEFT_OFFSET( SCREENSHOT_VIEWER_WIDTH, SCREENSHOT_VIEWER_HEIGHT, RATING_BUTTON_OFFSET, - "@PLATFORM_DEMO_RATE_SCREENSHOT", - RATE_SCREENSHOT_ACTION, - when( getDownloadProgress() == 100 && GetUserFileRating( dvarString( fsSelectedFileID ) ) == 0 ) ) - - // See Rating - NEW_FRAME_BUTTON_PC_LEFT_OFFSET( SCREENSHOT_VIEWER_WIDTH, SCREENSHOT_VIEWER_HEIGHT, RATING_BUTTON_OFFSET, - "@PLATFORM_DEMO_SEERATING", - open fileshare_ratingsubmitted;, - when( getDownloadProgress() == 100 && GetUserFileRating( dvarString( fsSelectedFileID ) ) != 0 ) ) - -#define TEXT_SPACING 40 - -#define ZOOM_TEXT_X ( SCREENSHOT_VIEWER_WIDTH/2 - NEW_FRAME_DEFAULT_TITLE_X_OFFSET - getTextWidth( locString( "@PATCH_SCREENSHOT_ZOOM" ), CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) ) - -#define PAN_TEXT_X ( ZOOM_TEXT_X - TEXT_SPACING - getTextWidth( locString( "@PATCH_SCREENSHOT_PAN" ), CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) ) - - // Pan - itemDef - { - type ITEM_TYPE_TEXT - rect ((-SCREENSHOT_VIEWER_WIDTH/2)+220) (SCREENSHOT_VIEWER_HEIGHT/2+4) 0 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp rect X( PAN_TEXT_X ) - text "@PATCH_SCREENSHOT_PAN" - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_MIDDLE_LEFT - visible when( getDownloadProgress() == 100 ) - decoration - } - - // Zoom - itemDef - { - type ITEM_TYPE_TEXT - rect ((-SCREENSHOT_VIEWER_WIDTH/2)+420) (SCREENSHOT_VIEWER_HEIGHT/2+4) 0 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp rect X( ZOOM_TEXT_X ) - text "@PATCH_SCREENSHOT_ZOOM" - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_MIDDLE_LEFT - visible when( getDownloadProgress() == 100 ) - decoration - } -} - - - -// ========================================================================================= -// ERROR MENUS -// menu_fileshare_transfererror -// Any HTTP/Demonware error while transferring -// -// menu_fileshare_downloaderror -// Any HTTP/Demonware error while downloading -// -// menu_fileshare_uploaderror -// Any HTTP/Demonware error while uploading -// ========================================================================================= -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 1 - -FILESHARE_ERROR_MENU( menu_fileshare_transfererror, MENU_FILESHARE_TRANSFERERROR ) -FILESHARE_ERROR_MENU( menu_fileshare_downloaderror, MENU_FILESHARE_DOWNLOADERROR ) -FILESHARE_ERROR_MENU( menu_fileshare_uploaderror, MENU_FILESHARE_UPLOADERROR ) -FILESHARE_ERROR_MENU( menu_fileshare_maxlocalplayers, MENU_FILESHARE_MAX_LOCAL_PLAYERS ) - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 5 - -#ifdef PC -#define IS_PC 1 -#define RENDER 1 -#define SETUP_ACTION_PLAY_DEMO( isUserFile, menuName, feederName ) \ - close self; \ - if ( isTaskInProgress( "LiveFileShareReadFile" ) != 1 ) \ - { \ - if( menuisopen( "menu_cr_matches_heat_map" ) ) \ - { \ - execNow set ui_mapname (GetFileshareGameMap(dvarInt("selectedRecentGameIndex"))); \ - execNow set ui_gametype (GetFileshareGameType(dvarInt("selectedRecentGameIndex"))); \ - execNow set ui_demoname (GetFileshareFileName(dvarInt("selectedRecentGameIndex"))); \ - execNow set ui_theater_fileid (GetFileshareFileId(dvarInt("selectedRecentGameIndex"))); \ - execNow set ui_theater_filesize (GetFileshareFileSize(dvarInt("selectedRecentGameIndex"))); \ - } \ - else \ - { \ - execNow set ui_mapname (getFeederData( menuName, feedername, "map" )); \ - execNow set ui_gametype (getFeederData( menuName, feedername, "gametype" )); \ - execNow set ui_demoname (getFeederData( menuName, feedername, "fileName" )); \ - execNow set ui_theater_fileid (getFeederData( menuName, feederName, "fileID" )); \ - execNow set ui_theater_filesize (getFeederData( menuName, feederName, "fileSize" )); \ - } \ - open popup_downloadingfile; \ - setdvar ui_combatResetViewDvars "0"; \ - execNow downloaddemofile ( isUserFile ) ( dvarString( ui_theater_fileid ) ) ( dvarString( ui_theater_filesize ) ) ( dvarString( ui_demoname ) ) (!RENDER); \ - } -#define SETUP_ACTION_RENDER_DEMO( isUserFile, menuName, feederName ) \ - close self; \ - if ( isTaskInProgress( "LiveFileShareReadFile" ) != 1 ) \ - { \ - open popup_downloadingfile; \ - execNow set ui_mapname (getFeederData( menuName, feederName, "map" )); \ - execNow set ui_gametype (getFeederData( menuName, feederName, "gametype" )); \ - execNow set ui_demoname (getFeederData( menuName, feederName, "fileName" )); \ - execNow downloaddemofile ( isUserFile ) ( getFeederData( menuName, feederName, "fileID" )) (getFeederData( menuName, feederName, "fileSize" )) (getFeederData( menuName, feederName, "fileName" )) (RENDER); \ - } - -#else // #ifdef PC -#define IS_PC 0 -#endif // #else // #ifdef PC - -#define ON_OPEN_THEATER_BUTTON_TEXT \ - if ( dvarBool( xblive_theater ) == 0 ) \ - { \ - setlocalvarstring ui_theater_button_text MENU_FILESHARE_THEATER; \ - } \ - else \ - { \ - setlocalvarstring ui_theater_button_text MENU_FILESHARE_SELECT_FOR_PLAYBACK; \ - } - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_myshare_options, ON_OPEN_THEATER_BUTTON_TEXT; execNow raiseFeederEvent Populate;, execNow raiseFeederEvent Clear;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_FILE_ACTION", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 //HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_MIDDLE - - menuItemsDef - { - maxRows 6 - // THESE INCLUDE BACKGROUND, HIGHLIGHT AND SELECT BUTTON. DO NOT OMIT THESE. - DYNAMIC_MENU_COMMON_COLUMNS - - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - - onEvent Screenshot - { - ACTION_VIEW_SCREENSHOT( "menu_fileshare_myshare", "fileShareSlots" ) - } - - onEvent PlayPC - { - SETUP_ACTION_PLAY_DEMO( 1, "menu_fileshare_myshare", "fileShareSlots" ) - } - onEvent RenderPC - { - SETUP_ACTION_RENDER_DEMO( 1, "menu_fileshare_myshare", "fileShareSlots" ) - } - onEvent RatePC - { - if ( !(FILESHARE_TASKSINPROGRESS) ) - { - close self; - if ( !ALREADY_RATED ) - { - open fileshare_submitrating; - } - else - { - open fileshare_ratingsubmitted; - } - } - } - - onEvent Theatre - { - if ( IS_LOBBY_HOST || !dvarBool( "xblive_theater" ) ) - { - if ( !CanSwitchToLobby( dvarInt( party_maxplayers_theater ), dvarInt( party_maxlocalplayers_theater ) ) ) - { - open menu_fileshare_maxlocalplayers; - } - else - { - ACTION_GOTO_THEATER( 1, "menu_fileshare_myshare", "fileShareSlots" ) - } - } - } - - onEvent GoToCustom - { - ACTION_GOTO_CUSTOMGAME( 1, "menu_fileshare_myshare", "fileShareSlots" ) - } - - onEvent Remove - { - close self; - open menu_fileshare_myshare_remove; - } - - onEvent EditInfo - { - close self; - execNow set fsSelectedFileName ( getFeederData( "menu_fileshare_myshare", "fileShareSlots", "name" ) ); - execNow set fsIsSelectedFileNameModified ( getFeederData( "menu_fileshare_myshare", "fileShareSlots", "isModifiedName" ) ); - execNow set fsSelectedFileDescription ( getFeederData( "menu_fileshare_myshare", "fileShareSlots", "description" ) ); - execNow set fsIsSelectedFileDescriptionModified ( getFeederData( "menu_fileshare_myshare", "fileShareSlots", "isModifiedDescription" ) ); - execNow set fsSelectedFileTagIndex ( getFeederData( "menu_fileshare_myshare", "fileShareSlots", "userTagIndex" ) ); - open menu_fileshare_myshare_editinfo; - } - - onEvent Cancel { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate - { - if ( getFeederData( "menu_fileshare_myshare", "fileShareSlots", "fileType" ) == "screenshot" ) - { - //onFocus // Disable condition // text - execNow addToFeederExtended Screenshot noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_VIEW; - if( IS_PC ) - { - setdvar fileshare_rating_screenshot 1; - setdvar fileshare_rating_film 0; - setdvar fileshare_rating_clip 0; - setdvar fileshare_rating_gametype 0; - if( !ALREADY_RATED ) - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_RATESCREENSHOT; - } - else - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) PLATFORM_DEMO_SEERATING; - } - } - } - elseif ( getFeederData( "menu_fileshare_myshare", "fileShareSlots", "fileType" ) != "customgamemode" ) - { - if ( IS_PC ) - { - setdvar fileshare_rating_screenshot 0; - setdvar fileshare_rating_film 0; - setdvar fileshare_rating_clip 0; - setdvar fileshare_rating_gametype 0; - - if ( CLIP_SELECTED( "menu_fileshare_myshare", "fileShareSlots" ) ) - { - setdvar fileshare_rating_clip 1; - execNow addToFeederExtended PlayPC noop (FILESHARE_TASKSINPROGRESS) MPUI_START_CLIP; - execNow addToFeederExtended RenderPC noop (FILESHARE_TASKSINPROGRESS) MPUI_DEMO_RENDER_CLIP; - if( !ALREADY_RATED ) - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_RATE_CLIP_ACTION; - } - else - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) PLATFORM_DEMO_SEERATING; - } - } - else - { - setdvar fileshare_rating_film 1; - execNow addToFeederExtended PlayPC noop (FILESHARE_TASKSINPROGRESS) MPUI_START_FILM; - if( !ALREADY_RATED ) - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_RATE_FILM_ACTION; - } - else - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) PLATFORM_DEMO_SEERATING; - } - } - } - else - { - if ( dvarBool( xblive_theater ) == 0 ) - { - execNow addToFeeder Theatre (localVarString( ui_theater_button_text )); - } - else - { - //onFocus // Disable condition // text - execNow addToFeederExtended Theatre noop (IS_NOT_LOBBY_HOST) (localVarString( ui_theater_button_text )); - } - } - } - elseif ( getFeederData( "menu_fileshare_myshare", "fileShareSlots", "fileType" ) == "customgamemode" ) - { - if( !IS_PC ) - { - execNow addToFeeder GoToCustom MPUI_START_CUSTOMGAME; - } - if( IS_PC ) - { - setdvar fileshare_rating_screenshot 0; - setdvar fileshare_rating_film 0; - setdvar fileshare_rating_clip 0; - setdvar fileshare_rating_gametype 1; - - if( !ALREADY_RATED ) - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_RATE_CUSTOM_ACTION; - } - else - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) PLATFORM_DEMO_SEERATING; - } - } - } - - execNow addToFeeder EditInfo MENU_FILESHARE_EDITINFO; - - if ( getFeederData( "menu_fileshare_myshare", "fileShareSlots", "slotOccupied" ) ) - { - execNow addToFeeder Remove MENU_FILESHARE_REMOVE; - } - - execNow addToFeeder Cancel MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_mymovie_options, execNow raiseFeederEvent Populate;, execNow raiseFeederEvent Clear;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_FILE_ACTION", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START ( CHOICE_Y_START + 20 ) CHOICE_SIZE_X 400 //HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_MIDDLE - - menuItemsDef - { - maxRows 6 - // THESE INCLUDE BACKGROUND, HIGHLIGHT AND SELECT BUTTON. DO NOT OMIT THESE. - DYNAMIC_MENU_COMMON_COLUMNS - - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - - onEvent Cancel - { - close self; - } - - onEvent Remove - { - open menu_fileshare_mymovie_remove; - } - - onEvent EditInfo - { - close self; - execNow set fsSelectedFileName ( getMySlotInfo( 20, "name" ) ); - execNow set fsIsSelectedFileNameModified ( getMySlotInfo( 20, "isModifiedName" ) ); - execNow set fsSelectedFileDescription ( getMySlotInfo( 20, "description" ) ); - execNow set fsIsSelectedFileDescriptionModified ( getMySlotInfo( 20, "isModifiedDescription" ) ); - open menu_fileshare_mymovie_editinfo; - } - - onEvent Cancel { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate - { - execNow addToFeeder EditInfo MENU_FILESHARE_EDITINFO; - execNow addToFeeder Remove MENU_FILESHARE_REMOVE; - execNow addToFeeder Cancel MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 3 - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_myrecentgames_choose, ON_OPEN_THEATER_BUTTON_TEXT; execNow raiseFeederEvent Populate;, execNow raiseFeederEvent Clear;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_FILE_ACTION", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 - backgroundItemListbox "white" - - menuItemsDef - { - maxRows 4 - // THESE INCLUDE BACKGROUND, HIGHLIGHT AND SELECT BUTTON. DO NOT OMIT THESE. - DYNAMIC_MENU_COMMON_COLUMNS - - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent RenameAndPlace { ; } - onEvent PlaceInShare { - if ( !(FILESHARE_TASKSINPROGRESS) ) - { - open menu_fileshare_myrecentgames_transfer; - exec "wait; closeMenu menu_fileshare_myrecentgames_choose"; - } - } - onEvent PlayPC - { - SETUP_ACTION_PLAY_DEMO( 0, "menu_fileshare_myrecentgames", "fileShareRecentGames" ) - } - onEvent RenderPC - { - SETUP_ACTION_RENDER_DEMO( 0, "menu_fileshare_myrecentgames", "fileShareRecentGames" ) - } - onEvent Theatre - { - if ( IS_LOBBY_HOST || !dvarBool( "xblive_theater" ) ) - { - if ( !CanSwitchToLobby( dvarInt( party_maxplayers_theater ), dvarInt( party_maxlocalplayers_theater ) ) ) - { - open menu_fileshare_maxlocalplayers; - } - else - { - ACTION_GOTO_THEATER( 0, "menu_fileshare_myrecentgames", "fileShareRecentGames" ) - } - } - } - onEvent Cancel { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate - { - if ( IS_PC ) - { - if ( !menuisopen( menu_cr_matches_heat_map ) && CLIP_SELECTED( "menu_fileshare_myrecentgames", "fileShareRecentGames" ) ) - { - execNow addToFeederExtended PlayPC noop (FILESHARE_TASKSINPROGRESS) MPUI_START_CLIP; - execNow addToFeederExtended RenderPC noop (FILESHARE_TASKSINPROGRESS) MPUI_DEMO_RENDER_CLIP; - } - else - { - execNow addToFeederExtended PlayPC noop (FILESHARE_TASKSINPROGRESS) MPUI_START_FILM; - } - } - else - { - // Action 1 - Menu Item Text - if ( dvarBool( xblive_theater ) == 0 ) { execNow addToFeeder Theatre (localVarString( ui_theater_button_text )); } - if ( dvarBool( xblive_theater ) == 1 ) - { - //onFocus // Disable condition // text - execNow addToFeederExtended Theatre noop (IS_NOT_LOBBY_HOST) (localVarString( ui_theater_button_text )); - } - } - //onFocus // Disable condition // text - execNow addToFeederExtended PlaceInShare noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_PLACEINSHARE; - execNow addToFeeder Cancel MENU_CANCEL; - } - onfocus { DYNAMIC_MENU_INIT( menu_fileshare_myrecentgames_choose ) } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 2 - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_myshare_remove, execNow raiseFeederEvent Populate;, execNow raiseFeederEvent Clear;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_REMOVECONFIRM", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 //HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_MIDDLE - - menuItemsDef - { - maxRows 4 - // THESE INCLUDE BACKGROUND, HIGHLIGHT AND SELECT BUTTON. DO NOT OMIT THESE. - DYNAMIC_MENU_COMMON_COLUMNS - - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent Yes - { - execNow fileShareRemove ( getFeederData( "menu_fileshare_myshare", "fileShareSlots", "slot" ) ); - close menu_fileshare_myshare_options; - close self; - } - onEvent No { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate { - // Action 1 - Menu Item Text - execNow addToFeeder Yes MENU_YES; - execNow addToFeeder No MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_mymovie_remove, execNow raiseFeederEvent Populate;, execNow raiseFeederEvent Clear;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_REMOVECONFIRM", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 //HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_MIDDLE - - menuItemsDef - { - maxRows 4 - // THESE INCLUDE BACKGROUND, HIGHLIGHT AND SELECT BUTTON. DO NOT OMIT THESE. - DYNAMIC_MENU_COMMON_COLUMNS - - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent Yes - { - execNow fileShareRemove ( 20 ); - close menu_fileshare_mymovie_options; - close self; - } - onEvent No { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate { - // Action 1 - Menu Item Text - execNow addToFeeder Yes MENU_YES; - execNow addToFeeder No MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 4 - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_share_options, ON_OPEN_THEATER_BUTTON_TEXT; execNow raiseFeederEvent Populate;, execNow raiseFeederEvent Clear;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_FILE_ACTION", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 //HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_MIDDLE - - menuItemsDef - { - maxRows 5 - // THESE INCLUDE BACKGROUND, HIGHLIGHT AND SELECT BUTTON. DO NOT OMIT THESE. - DYNAMIC_MENU_COMMON_COLUMNS - - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent Screenshot { ACTION_VIEW_SCREENSHOT( "menu_fileshare_share", "fileShareSlots" ) } - onEvent PlayPC - { - SETUP_ACTION_PLAY_DEMO( 1, "menu_fileshare_share", "fileShareSlots" ) - } - onEvent RenderPC - { - SETUP_ACTION_RENDER_DEMO( 1, "menu_fileshare_share", "fileShareSlots" ) - } - onEvent Theatre - { - if ( IS_LOBBY_HOST || !dvarBool( "xblive_theater" ) ) - { - if ( !CanSwitchToLobby( dvarInt( party_maxplayers_theater ), dvarInt( party_maxlocalplayers_theater ) ) ) - { - open menu_fileshare_maxlocalplayers; - } - else - { - ACTION_GOTO_THEATER( 1, "menu_fileshare_share", "fileShareSlots" ) - } - } - } - onEvent RatePC - { - if ( !(FILESHARE_TASKSINPROGRESS) ) - { - close self; - if ( !ALREADY_RATED ) - { - open fileshare_submitrating; - } - else - { - open fileshare_ratingsubmitted; - } - } - } - onEvent GoToCustom - { - ACTION_GOTO_CUSTOMGAME( 1, "menu_fileshare_share", "fileShareSlots" ) - } - onEvent Cancel { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Transfer - { - if ( !(FILESHARE_TASKSINPROGRESS) ) - { - close self; - open menu_fileshare_share_transfer; - } - } - onEvent Populate - { - if ( getFeederData( "menu_fileshare_share", "fileShareSlots", "fileType" ) == "screenshot" ) - { - //onFocus // Disable condition // text - execNow addToFeederExtended Screenshot noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_VIEW; - if( IS_PC ) - { - setdvar fileshare_rating_screenshot 1; - setdvar fileshare_rating_film 0; - setdvar fileshare_rating_clip 0; - setdvar fileshare_rating_gametype 0; - - if( !ALREADY_RATED ) - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_RATESCREENSHOT; - } - else - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) PLATFORM_DEMO_SEERATING; - } - } - } - elseif ( getFeederData( "menu_fileshare_share", "fileShareSlots", "fileType" ) != "customgamemode" ) - { - if ( IS_PC ) - { - setdvar fileshare_rating_screenshot 0; - setdvar fileshare_rating_film 0; - setdvar fileshare_rating_clip 0; - setdvar fileshare_rating_gametype 0; - - if ( CLIP_SELECTED( "menu_fileshare_share", "fileShareSlots" ) ) - { - setdvar fileshare_rating_clip 1; - execNow addToFeederExtended PlayPC noop (FILESHARE_TASKSINPROGRESS) MPUI_START_CLIP; - execNow addToFeederExtended RenderPC noop (FILESHARE_TASKSINPROGRESS) MPUI_DEMO_RENDER_CLIP; - if( !ALREADY_RATED ) - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_RATE_CLIP_ACTION; - } - else - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) PLATFORM_DEMO_SEERATING; - } - } - else - { - setdvar fileshare_rating_film 1; - execNow addToFeederExtended PlayPC noop (FILESHARE_TASKSINPROGRESS) MPUI_START_FILM; - if( !ALREADY_RATED ) - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_RATE_FILM_ACTION; - } - else - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) PLATFORM_DEMO_SEERATING; - } - } - } - else - { - if ( dvarBool( xblive_theater ) == 0 ) - { - execNow addToFeeder Theatre (localVarString( ui_theater_button_text )); - } - else - { - //onFocus // Disable condition // text - execNow addToFeederExtended Theatre noop (IS_NOT_LOBBY_HOST) (localVarString( ui_theater_button_text )); - } - } - } - elseif ( getFeederData( "menu_fileshare_share", "fileShareSlots", "fileType" ) == "customgamemode" ) - { - if( !IS_PC ) - { - execNow addToFeeder GoToCustom MPUI_START_CUSTOMGAME; - } - if( IS_PC ) - { - setdvar fileshare_rating_screenshot 0; - setdvar fileshare_rating_film 0; - setdvar fileshare_rating_clip 0; - setdvar fileshare_rating_gametype 1; - - if( !ALREADY_RATED ) - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_RATE_CUSTOM_ACTION; - } - else - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) PLATFORM_DEMO_SEERATING; - } - } - } - if ( getFeederData( "menu_fileshare_share", "fileShareSlots", "slotOccupied" ) ) - { - //onFocus // Disable condition // text - execNow addToFeederExtended Transfer noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_PLACEINSHARE; - } - execNow addToFeeder Cancel MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 3 - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_recentgames_choose, ON_OPEN_THEATER_BUTTON_TEXT; execNow raiseFeederEvent Populate;, execNow raiseFeederEvent Clear;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_FILE_ACTION", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 //HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_MIDDLE - - menuItemsDef - { - maxRows 4 - // THESE INCLUDE BACKGROUND, HIGHLIGHT AND SELECT BUTTON. DO NOT OMIT THESE. - DYNAMIC_MENU_COMMON_COLUMNS - - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent PlaceInShare - { - if ( !(FILESHARE_TASKSINPROGRESS) ) - { - close self; - open menu_fileshare_recentgames_transfer; - } - } - onEvent PlayPC - { - SETUP_ACTION_PLAY_DEMO( 0, "menu_fileshare_recentgames", "fileShareRecentGames" ) - } - onEvent RenderPC - { - SETUP_ACTION_RENDER_DEMO( 0, "menu_fileshare_recentgames", "fileShareRecentGames" ) - } - onEvent Theatre - { - if ( IS_LOBBY_HOST || !dvarBool( "xblive_theater" ) ) - { - if ( !CanSwitchToLobby( dvarInt( party_maxplayers_theater ), dvarInt( party_maxlocalplayers_theater ) ) ) - { - open menu_fileshare_maxlocalplayers; - } - else - { - ACTION_GOTO_THEATER( 0, "menu_fileshare_recentgames", "fileShareRecentGames" ) - } - } - } - onEvent Cancel { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate - { - if ( IS_PC ) - { - if ( CLIP_SELECTED( "menu_fileshare_myrecentgames", "fileShareRecentGames" ) ) - { - execNow addToFeederExtended PlayPC noop (FILESHARE_TASKSINPROGRESS) MPUI_START_CLIP; - execNow addToFeederExtended RenderPC noop (FILESHARE_TASKSINPROGRESS) MPUI_DEMO_RENDER_CLIP; - } - else - { - execNow addToFeederExtended PlayPC noop (FILESHARE_TASKSINPROGRESS) MPUI_START_FILM; - } - } - else - { - // Action 1 - Menu Item Text - if ( dvarBool( xblive_theater ) == 0 ) { execNow addToFeeder Theatre (localVarString( ui_theater_button_text )); } - if ( dvarBool( xblive_theater ) == 1 ) - { - //onFocus // Disable condition // text - execNow addToFeederExtended Theatre noop (IS_NOT_LOBBY_HOST) (localVarString( ui_theater_button_text )); - } - } - //onFocus // Disable condition // text - execNow addToFeederExtended PlaceInShare noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_PLACEINSHARE; - execNow addToFeeder Cancel MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 4 - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_community_choose, ON_OPEN_THEATER_BUTTON_TEXT; execNow raiseFeederEvent Populate;, execNow raiseFeederEvent Clear;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_FILE_ACTION", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 //HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_MIDDLE - - menuItemsDef - { - maxRows 5 - // THESE INCLUDE BACKGROUND, HIGHLIGHT AND SELECT BUTTON. DO NOT OMIT THESE. - DYNAMIC_MENU_COMMON_COLUMNS - - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent PlaceInShare - { - if ( !(FILESHARE_TASKSINPROGRESS) ) - { - open menu_fileshare_community_transfer; - exec "wait; closeMenu menu_fileshare_community_choose"; - } - } - onEvent Screenshot { close self; ACTION_VIEW_SCREENSHOT( "menu_fileshare_community", "fileShareCommunitySearch" ) } - onEvent Theatre - { - if ( IS_LOBBY_HOST || !dvarBool( "xblive_theater" ) ) - { - if ( !CanSwitchToLobby( dvarInt( party_maxplayers_theater ), dvarInt( party_maxlocalplayers_theater ) ) ) - { - open menu_fileshare_maxlocalplayers; - } - else - { - ACTION_GOTO_THEATER( 1, "menu_fileshare_community", "fileShareCommunitySearch" ) - } - } - } - onEvent Cancel { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent PlayPC - { - SETUP_ACTION_PLAY_DEMO( 1, "menu_fileshare_community", "fileShareCommunitySearch" ) - } - onEvent RenderPC - { - SETUP_ACTION_RENDER_DEMO( 1, "menu_fileshare_community", "fileShareCommunitySearch" ) - } - - onEvent GoToCustom - { - ACTION_GOTO_CUSTOMGAME( 1, "menu_fileshare_community", "fileShareCommunitySearch" ) - } - - onEvent RatePC - { - if ( !(FILESHARE_TASKSINPROGRESS) ) - { - close self; - if ( !ALREADY_RATED ) - { - open fileshare_submitrating; - } - else - { - open fileshare_ratingsubmitted; - } - } - } - onEvent Populate - { - if ( getFeederData( "menu_fileshare_community", "fileShareCommunitySearch", "fileType" ) == "screenshot" ) - { - //onFocus // Disable condition // text - execNow addToFeederExtended Screenshot noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_VIEW; - if( IS_PC ) - { - setdvar fileshare_rating_screenshot 1; - setdvar fileshare_rating_film 0; - setdvar fileshare_rating_clip 0; - setdvar fileshare_rating_gametype 0; - - if( !ALREADY_RATED ) - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_RATESCREENSHOT; - } - else - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) PLATFORM_DEMO_SEERATING; - } - } - } - elseif ( getFeederData( "menu_fileshare_community", "fileShareCommunitySearch", "fileType" ) != "customgamemode" ) - { - if ( IS_PC ) - { - setdvar fileshare_rating_screenshot 0; - setdvar fileshare_rating_film 0; - setdvar fileshare_rating_clip 0; - setdvar fileshare_rating_gametype 0; - - if ( CLIP_SELECTED( "menu_fileshare_community", "fileShareCommunitySearch" ) ) - { - setdvar fileshare_rating_clip 1; - execNow addToFeederExtended PlayPC noop (FILESHARE_TASKSINPROGRESS) MPUI_START_CLIP; - execNow addToFeederExtended RenderPC noop (FILESHARE_TASKSINPROGRESS) MPUI_DEMO_RENDER_CLIP; - if( !ALREADY_RATED ) - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_RATE_CLIP_ACTION; - } - else - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) PLATFORM_DEMO_SEERATING; - } - } - else - { - setdvar fileshare_rating_film 1; - execNow addToFeederExtended PlayPC noop (FILESHARE_TASKSINPROGRESS) MPUI_START_FILM; - if( !ALREADY_RATED ) - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_RATE_FILM_ACTION; - } - else - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) PLATFORM_DEMO_SEERATING; - } - } - } - else - { - if ( dvarBool( xblive_theater ) == 0 ) - { - execNow addToFeeder Theatre (localVarString( ui_theater_button_text )); - } - else - { - //onFocus // Disable condition // text - execNow addToFeederExtended Theatre noop (IS_NOT_LOBBY_HOST) (localVarString( ui_theater_button_text )); - } - } - } - elseif ( getFeederData( "menu_fileshare_myshare", "fileShareSlots", "fileType" ) == "customgamemode" ) - { - if( !IS_PC ) - { - execNow addToFeeder GoToCustom MPUI_START_CUSTOMGAME; - } - if( IS_PC ) - { - setdvar fileshare_rating_screenshot 0; - setdvar fileshare_rating_film 0; - setdvar fileshare_rating_clip 0; - setdvar fileshare_rating_gametype 1; - - if( !ALREADY_RATED ) - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_RATE_CUSTOM_ACTION; - } - else - { - execNow addToFeederExtended RatePC noop (FILESHARE_TASKSINPROGRESS) PLATFORM_DEMO_SEERATING; - } - } - } - //onFocus // Disable condition // text - execNow addToFeederExtended PlaceInShare noop (FILESHARE_TASKSINPROGRESS) MENU_FILESHARE_PLACEINSHARE; - execNow addToFeeder Cancel MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 2 - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( fileshare_slotselection_clip_confirm, execNow raiseFeederEvent Populate;, execNow raiseFeederEvent Clear;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_REPLACECONFIRM", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 - menuItemsDef - { - maxRows 4 - DYNAMIC_MENU_COMMON_COLUMNS - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent Yes - { - execnow demo_saveanduploadclip ( dvarInt( demo_cmdNum ) ) ( getFeederData( fileshare_slotselection_clip, fileShareSlots, ingameSlot ) ); - close self; - } - onEvent No { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate { - execNow addToFeeder Yes MENU_YES; - execNow addToFeeder No MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 2 - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( fileshare_slotselection_scr_confirm, execNow raiseFeederEvent Populate;, execNow raiseFeederEvent Clear;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_REPLACECONFIRM", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 - menuItemsDef - { - maxRows 4 - DYNAMIC_MENU_COMMON_COLUMNS - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent Yes - { - execnow demo_savescreenshot 0 ( getFeederData( fileshare_slotselection_scr, fileShareSlots, ingameSlot ) ); - close self; - } - onEvent No { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate { - execNow addToFeeder Yes MENU_YES; - execNow addToFeeder No MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - - -// Rating - -menuDef - { - SYSTEM_POPUP_SETUP_VIS( fileshare_submitrating, execnow fileShareResetRating;, FILESHARE_RATINGCLOSE_ACTION, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_RATESCREENSHOT", when( dvarBool( fileshare_rating_screenshot ) == 1 ) ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_RATE_FILM_ACTION", when( dvarBool( fileshare_rating_film ) == 1 ) ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_RATE_CLIP_ACTION", when( dvarBool( fileshare_rating_clip ) == 1 ) ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_RATE_CUSTOM_ACTION", when( dvarBool( fileshare_rating_gametype ) == 1 ) ) - - FILESHARE_RATING_MENU_BODY( fileshare_submitrating, execnow fileShareSubmitRating ( dvarString( fsSelectedFileID ) ) ) - } - -menuDef - { - SYSTEM_POPUP_SETUP_VIS( fileshare_ratingsubmitted, execnow fileShareResetRating;, close self;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_SEERATING", 1 ) - - FILESHARE_RATINGSUBMITTED_MENU_BODY( fileshare_ratingsubmitted ) - } - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_error, ;, ;, 1 ) - execkeyint BUTTON_START { } - onEsc { close self; } - - SYSTEM_POPUP_TITLE_VIS( "@MENU_ERROR", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_FILESHARE_FILENOTFOUND", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self;, 1, ; ) - } - -// Redefinitions for MEDIUM_POPUP_SETUP popups - #undef POPUP_WIDTH - #define POPUP_WIDTH MEDIUM_POPUP_WIDTH - #undef POPUP_HEIGHT - #define POPUP_HEIGHT MEDIUM_POPUP_HEIGHT - #undef CHOICE_SIZE_X - #define CHOICE_SIZE_X (POPUP_WIDTH-(POPUP_SIDE_PAD*2)) - #undef CHOICE_Y_START - #define CHOICE_Y_START POPUP_HEADER_HEIGHT - #undef PLAYER_INFO_ALIGN - #define PLAYER_INFO_ALIGN // Purposely set to nothing. The popup setup macro sets the alignment. If items within it set their own aligment, they end up offset incorrectly. - #undef PLAYER_INFO_X_START - #define PLAYER_INFO_X_START( frameWidth ) ( frameWidth - PLAYER_INFO_WIDTH - PLAYER_INFO_PAD ) - #undef PLAYER_INFO_Y_START - #define PLAYER_INFO_Y_START( frameHeight ) ( PLAYER_INFO_PAD * 2 ) - #undef BG_BACKCOLOR - #define BG_BACKCOLOR POPUP_BACKCOLOR - // Redefinitions for MEDIUM_POPUP_SETUP popups - - - #define SHARE_TRANSFER_SAVE_ACTION \ - execNow fileShareTransferFromUser ( getFeederData( "menu_fileshare_share", "fileShareSlots", "fileID" ) ) ( getFeederData( "menu_fileshare_share_transfer", "fileShareSlots", "slot" ) ); - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( menu_fileshare_share_transfer_save, activateblur;, deactivateblur; close self;, POPUP_GLOW_WHITE, 0, 1 ) - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - } - MEDIUM_POPUP_TITLE_VIS( "@MENU_SAVE_INFORMATION_CAPS", 1 ) - - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 1 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_TITLE" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - FRAME_CHOICE_BUTTON( 2, dvarString(fsSelectedFileName), execNow demo_keyboard fileshareFileName; ) - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 3 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_DESCRIPTION" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - FRAME_CHOICE_BUTTON( 4, dvarString(fsSelectedFileDescription), execNow demo_keyboard fileshareFileDescription; ) - FRAME_CHOICE_BUTTON( 6, "@MENU_CONTINUE", SHARE_TRANSFER_SAVE_ACTION; close self; close menu_fileshare_share_transfer; ) - MEDIUM_POPUP_BACK_BUTTON - } - - #define MY_RECENTGAMES_TRANSFER_ACTION \ - close menu_fileshare_myrecentgames_choose; \ - execNow fileShareTransferFromPooled ( dvarstring( fsSelectedRecentGameID ) ) ( getFeederData( "menu_fileshare_myrecentgames_transfer", "fileShareSlots", "slot" ) ); - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( menu_fileshare_myrecentgames_transfer_save, activateblur;, deactivateblur; close self;, POPUP_GLOW_WHITE, 0, 1 ) - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - } - MEDIUM_POPUP_TITLE_VIS( "@MENU_SAVE_INFORMATION_CAPS", 1 ) - - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 1 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_TITLE" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - FRAME_CHOICE_BUTTON( 2, dvarString(fsSelectedFileName), execNow demo_keyboard fileshareFileName; ) - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 3 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_DESCRIPTION" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - FRAME_CHOICE_BUTTON( 4, dvarString(fsSelectedFileDescription), execNow demo_keyboard fileshareFileDescription; ) - FRAME_CHOICE_BUTTON( 6, "@MENU_CONTINUE", MY_RECENTGAMES_TRANSFER_ACTION; close self; close menu_fileshare_myrecentgames_transfer; ) - MEDIUM_POPUP_BACK_BUTTON - } - - - #define RECENTGAMES_TRANSFER_ACTION \ - execNow fileShareTransferFromPooled ( dvarstring( fsSelectedRecentGameID ) ) ( getFeederData( "menu_fileshare_recentgames_transfer", "fileShareSlots", "slot" ) ); - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( menu_fileshare_recentgames_transfer_save, activateblur;, deactivateblur; close self;, POPUP_GLOW_WHITE, 0, 1 ) - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - } - MEDIUM_POPUP_TITLE_VIS( "@MENU_SAVE_INFORMATION_CAPS", 1 ) - - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 1 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_TITLE" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - FRAME_CHOICE_BUTTON( 2, dvarString(fsSelectedFileName), execNow demo_keyboard fileshareFileName; ) - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 3 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_DESCRIPTION" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - FRAME_CHOICE_BUTTON( 4, dvarString(fsSelectedFileDescription), execNow demo_keyboard fileshareFileDescription; ) - FRAME_CHOICE_BUTTON( 6, "@MENU_CONTINUE", RECENTGAMES_TRANSFER_ACTION; close self; close menu_fileshare_recentgames_transfer; ) - MEDIUM_POPUP_BACK_BUTTON - } - - #define COMMUNITY_TRANSFER_ACTION \ - execNow fileShareTransferFromCommunity ( getFeederData( "menu_fileshare_community", "fileShareCommunitySearch", "fileID" ) ) ( getFeederData( "menu_fileshare_community_transfer", "fileShareSlots", "slot" ) ); - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( menu_fileshare_community_transfer_save, activateblur;, deactivateblur; close self;, POPUP_GLOW_WHITE, 0, 1 ) - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - } - MEDIUM_POPUP_TITLE_VIS( "@MENU_SAVE_INFORMATION_CAPS", 1 ) - - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 1 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_TITLE" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - FRAME_CHOICE_BUTTON( 2, dvarString(fsSelectedFileName), execNow demo_keyboard fileshareFileName; ) - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 3 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_DESCRIPTION" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - FRAME_CHOICE_BUTTON( 4, dvarString(fsSelectedFileDescription), execNow demo_keyboard fileshareFileDescription; ) - FRAME_CHOICE_BUTTON( 6, "@MENU_CONTINUE", COMMUNITY_TRANSFER_ACTION; close self; close menu_fileshare_community_transfer; ) - MEDIUM_POPUP_BACK_BUTTON - } - - #define FILESHARE_CHANGE_TAG_LEFT \ - if ( localVarInt( ui_highlight ) == 6 ) \ - { \ - execnow fileShareUserTagLeft; \ - } - - #define FILESHARE_CHANGE_TAG_RIGHT \ - if ( localVarInt( ui_highlight ) == 6 ) \ - { \ - execnow fileShareUserTagRight; \ - } - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( menu_fileshare_myshare_editinfo, activateblur;, deactivateblur; close self;, POPUP_GLOW_WHITE, 0, 1 ) - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - } - execKeyInt APAD_LEFT - { - FILESHARE_CHANGE_TAG_LEFT - } - execKeyInt DPAD_LEFT - { - FILESHARE_CHANGE_TAG_LEFT - } - execKeyInt APAD_RIGHT - { - FILESHARE_CHANGE_TAG_RIGHT - } - execKeyInt DPAD_RIGHT - { - FILESHARE_CHANGE_TAG_RIGHT - } - - MEDIUM_POPUP_TITLE_VIS( "@MENU_EDIT_INFORMATION", 1 ) - - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 1 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_TITLE" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - - FRAME_CHOICE_BUTTON( 2, dvarString(fsSelectedFileName), execNow demo_keyboard fileshareFileName; ) - - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 3 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_DESCRIPTION" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - - FRAME_CHOICE_BUTTON( 4, dvarString(fsSelectedFileDescription), execNow demo_keyboard fileshareFileDescription; ) - - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 5 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MENU_FILESHARE_USERTAG" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - - #define FILESHARE_TAG_X_OFFSET 20 - #define FILESHARE_TAG_BUTTON_WIDTH 280 - #define FILESHARE_TAG_ARROW_SPACING 7 - - FRAME_CHOICE_BUTTON( 6, "", FILESHARE_CHANGE_TAG_RIGHT; ) - - FILESHARE_BUTTON_TAGS( CHOICE_X( 6 ), CHOICE_Y( 6 ), getUserTagFromIndex( dvarInt( fsSelectedFileTagIndex ) ), localVarInt( ui_highlight ) == 6 ) - - FRAME_CHOICE_BUTTON( 8, "@MENU_CONTINUE", execnow fileShareEditInfo ( getFeederData( "menu_fileshare_myshare", "fileShareSlots", "fileID" ) ); close self; close menu_fileshare_myshare_options; ) - MEDIUM_POPUP_BACK_BUTTON - } - - - menuDef - { - MEDIUM_POPUP_SETUP_VIS( menu_fileshare_mymovie_editinfo, activateblur;, deactivateblur; close self;, POPUP_GLOW_WHITE, 0, 1 ) - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - } - MEDIUM_POPUP_TITLE_VIS( "@MENU_EDIT_INFORMATION", 1 ) - - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 1 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_TITLE" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - - FRAME_CHOICE_BUTTON( 2, dvarString(fsSelectedFileName), execNow demo_keyboard fileshareFileName; ) - - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 3 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_DESCRIPTION" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - - FRAME_CHOICE_BUTTON( 4, dvarString(fsSelectedFileDescription), execNow demo_keyboard fileshareFileDescription; ) - - FRAME_CHOICE_BUTTON( 6, "@MENU_CONTINUE", execnow fileShareEditInfo ( getMySlotInfo( 20, fileID ) ); close self; close menu_fileshare_myshare_options; ) - - MEDIUM_POPUP_BACK_BUTTON - } - - diff --git a/mods/patch_mp/ui_mp/game_mode.menu b/mods/patch_mp/ui_mp/game_mode.menu deleted file mode 100644 index 0591900..0000000 --- a/mods/patch_mp/ui_mp/game_mode.menu +++ /dev/null @@ -1,887 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui_mp/custom_mode.inc" - -#define CHOICE_SEP_OFFSET_Y -2 -#define CHOICE_SIDEITEM_SPACING -310 - -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui/choices_setup_popmenu.menu" -#include "ui_mp/stats_info.inc" -#include "ui_mp/overlaybg.inc" -#include "ui_mp/fileshare.inc" -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" -#include "ui/frame.inc" - -#include "ui_mp/popup_player_info.inc" - -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL - -#undef CHOICE_GROUP -#define CHOICE_GROUP "menu_game_mode_upload" - -#define HINT_TEXT_WIDTH ( FRAME_DEFAULT_WIDTH - ( FRAME_TITLE_X_OFFSET * 2 ) ) - -menuDef -{ - name menu_game_mode_upload - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - control MENU_CONTROL_OPENER - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - onOpen - { - READ_FILE_SHARE; - setdvar ui_custom_save_to_file_share 1; - setDvar fsUnoccupiedHighlightGreen 1; - setLocalVarString ui_choicegroup CHOICE_GROUP; - } - onFocus - { - play CHOICE_FOCUS_SOUND; - activateBlur; - } - onClose - { - setdvar ui_custom_save_to_file_share 0; - deactivateblur; - } - onESC - { - close self; - } - execKeyInt APAD_LEFT { play CHOICE_FOCUS_SOUND; } - execKeyInt DPAD_LEFT { play CHOICE_FOCUS_SOUND; } - execKeyInt APAD_RIGHT { play CHOICE_FOCUS_SOUND; } - execKeyInt DPAD_RIGHT { play CHOICE_FOCUS_SOUND; } - execKeyInt APAD_UP { execnow set fshSelectLastSlotRow 1; setfocus fileShareSlots; } - execKeyInt DPAD_UP { execnow set fshSelectLastSlotRow 1; setfocus fileShareSlots; } - execKeyInt APAD_DOWN { execnow set fshSelectFirstSlotRow 1; setfocus fileShareSlots; } - execKeyInt DPAD_DOWN { execnow set fshSelectFirstSlotRow 1; setfocus fileShareSlots; } - - FRAME_DEFAULT - FRAME_TITLE_DEFAULT( "@MENU_FILESHARE_MYSHARE_CAPS", 1 ) - - PLAYER_INFO_VIS( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, 1 ) - - itemDef - { - name fileShareSlots - type ITEM_TYPE_LISTBOX - feeder FEEDER_FILESHARE_MYSLOTS - FILESHARE_COMMON_OPTIONS - elementwidth 70 - elementheight 70 - elementtype LISTBOX_TEXT - textalign HORIZONTAL_ALIGN_LEFT - textfont UI_FONT_NORMAL - forecolor CHOICE_TEXTCOLOR - modal - doubleclick - { - if ( getFeederData( "slot" ) <= 6 ) - { - if ( !( FILESHARE_TASKSINPROGRESS ) ) - { - play CHOICE_FOCUS_SOUND; - if ( getFeederData( "slotOccupied" ) != 1 ) - { - open menu_game_mode_upload_save; - } - else - { - open menu_game_mode_upload_confirm; - } - } - } - } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - visible 1 - FILESHARE_SLOTS_USERAREAS - } - FILESHARE_BOTTOM( fileShareSlots, 1 ) - FILESHARE_DETAILS( 35, (FRAME_CHOICE_Y_START-1), HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, - "menu_game_mode_upload", "fileShareSlots", - getFeederData( "fileShareSlots", "slotOccupied" ) && getFeederData( "fileShareSlots", "count" ) > 0.0 ) -#ifdef CONSOLE - PREPROC_TEXT_DRAW_VIS( -144 158 30 15 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - ( int( getFeederData( "fileShareSlots", "slot" ) ) + " " + locString( "@MENU_FILESHARE_OF18") ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, 1 1 1 1, when( IsPremiumSubscriber() ) ) - - PREPROC_SHADER_DRAW_VIS_EX( -114 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_left", COLOR_BODY_TEXT, - when( IsPremiumSubscriber() && getFeederData( "fileShareSlots", "slot" ) > 6 ), - rotation 90; ) - PREPROC_SHADER_DRAW_VIS_EX( -107 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( IsPremiumSubscriber() && getFeederData( "fileShareSlots", "slot" ) > 6 && getFeederData( "fileShareSlots", "slot" ) < 13 ), - rotation 90; ) - PREPROC_SHADER_DRAW_VIS_EX( -114 160 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( IsPremiumSubscriber() && getFeederData( "fileShareSlots", "slot" ) <= 6 ), - rotation 90; ) -#endif //#ifdef CONSOLE - - HINT_TEXT_ALL( 15, CHOICE_X_START, -8, CHOICE_SIZE_X, "@MENU_FILESHARE_CHOOSESLOT", 1 1 1 1, 1, ; ) - -#ifdef PC - NEW_FRAME_BACK_BUTTON_ACTION( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, close self; ) -#else //#ifdef PC - NEW_FRAME_BACK_BUTTON( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) - - PREPROC_TEXT_DRAW_VIS( -160 (FRAME_DEFAULT_HEIGHT/2) 50 17 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@PLATFORM_SELECT", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, 1 1 1 1, - when( getFeederData( menu_game_mode_upload, fileShareSlots, "slot" ) <= 6 ); ) -#endif // #else // #ifdef PC -} -#undef ON_ESC -#define ON_ESC \ - close self; - -menuDef -{ - name custom_select_from_fileshare - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - control MENU_CONTROL_OPENER - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - - onOpen - { -#ifdef PC - exec readfileshare -#endif - setDvar fsUnoccupiedHighlightGreen 2; - setLocalVarString ui_choicegroup CHOICE_GROUP; - } - onFocus - { - activateBlur; - } - onClose - { - deactivateBlur; - } - onESC - { - ON_ESC - } - execKeyInt APAD_LEFT { play CHOICE_FOCUS_SOUND; } - execKeyInt DPAD_LEFT { play CHOICE_FOCUS_SOUND; } - execKeyInt APAD_RIGHT { play CHOICE_FOCUS_SOUND; } - execKeyInt DPAD_RIGHT { play CHOICE_FOCUS_SOUND; } - execKeyInt APAD_UP { execnow set fshSelectLastSlotRow 1; setfocus fileShareSlots; } - execKeyInt DPAD_UP { execnow set fshSelectLastSlotRow 1; setfocus fileShareSlots; } - execKeyInt APAD_DOWN { execnow set fshSelectFirstSlotRow 1; setfocus fileShareSlots; } - execKeyInt DPAD_DOWN { execnow set fshSelectFirstSlotRow 1; setfocus fileShareSlots; } - - FRAME_DEFAULT - - FRAME_TITLE_DEFAULT( "@CUSTOM_FILESHARE_SELECT_MODE_TITLE", 1 ) - FRAME_SUBTITLE_DEFAULT( "@CUSTOM_FILESHARE_SELECT_MODE_DESC", 1 ) - - PLAYER_INFO_VIS( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, 1 ) - - itemDef - { - name fileShareSlots - type ITEM_TYPE_LISTBOX - feeder FEEDER_FILESHARE_MYSLOTS - FILESHARE_COMMON_OPTIONS - origin 0 0 - elementwidth 70 - elementheight 67 - elementtype LISTBOX_TEXT - textalign ITEM_ALIGN_MIDDLE_CENTER - textfont UI_FONT_NORMAL - textscale TEXTSIZE_SUBTITLE - forecolor CHOICE_TEXTCOLOR - modal - doubleclick - { - play CHOICE_FOCUS_SOUND; - if ( getFeederData( "slotOccupied" ) && !( FILESHARE_TASKSINPROGRESS ) ) - { - if( getFeederData( "fileType" ) == "customgamemode" ) - { - execNow downloadCustomGametype (getFeederData( "fileID" )) (getFeederData( "fileSize" )); - closeimmediate custom_select_from_fileshare; - closeimmediate select_game_mode; - } - } - } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - visible 1 - - FILESHARE_SLOTS_USERAREAS - } - FILESHARE_BOTTOM( fileShareSlots, 1 ) - - /* SLOT OCCUPIED */ -#define SLOT_OCCUPIED_CONDITION \ - ( getFeederData( "fileShareSlots", "slotOccupied" ) && getFeederData( "fileShareSlots", "count" ) > 0.0 ) - - #define SLOT_HAS_GAME_MODE \ - ( getFeederData( "fileShareSlots", "fileType" ) == "customgamemode" ) - -#undef FILESHARE_SELECTOR_TOOLTIP_Y -#ifdef PC - #define FILESHARE_SELECTOR_TOOLTIP_Y FILESHARE_TOOLTIP_PC_Y -#else //#ifdef PC - #define FILESHARE_SELECTOR_TOOLTIP_Y 95 -#endif //#ifdef PC - - // Tooltip - Occupied Slot with custom game mode - PREPROC_SHADER_DRAW_VIS_EX( (FRAME_CHOICE_X_START-2) FILESHARE_SELECTOR_TOOLTIP_Y 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( SLOT_OCCUPIED_CONDITION && SLOT_HAS_GAME_MODE ), ; ) - PREPROC_TEXT_DRAW_VIS_EX( (FRAME_CHOICE_X_START+8) FILESHARE_SELECTOR_TOOLTIP_Y 280 36 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "CUSTOM_FILESHARE_CGM_HIGHLIGHTED" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, - when( SLOT_OCCUPIED_CONDITION && SLOT_HAS_GAME_MODE ), autowrapped; ) - - // Tooltip - Occupied Slot that is not a custom game mode - PREPROC_SHADER_DRAW_VIS_EX( (FRAME_CHOICE_X_START-2) FILESHARE_SELECTOR_TOOLTIP_Y 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( SLOT_OCCUPIED_CONDITION && !SLOT_HAS_GAME_MODE ), ; ) - PREPROC_TEXT_DRAW_VIS_EX( (FRAME_CHOICE_X_START+8) FILESHARE_SELECTOR_TOOLTIP_Y 280 36 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "CUSTOM_FILESHARE_CANT_SELECT" ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, - when( SLOT_OCCUPIED_CONDITION && !SLOT_HAS_GAME_MODE ), autowrapped; ) - - FILESHARE_SPINNER( 145, -45, when( FILESHARE_TASKSINPROGRESS ), 350 ) - - execKeyInt APAD_UP - { - execnow set fshSelectLastSlotRow 1; - setfocus fileShareSlots; - } - - execKeyInt DPAD_UP - { - execnow set fshSelectLastSlotRow 1; - setfocus fileShareSlots; - } - - execKeyInt APAD_DOWN - { - execnow set fshSelectFirstSlotRow 1; - setfocus fileShareSlots; - } - - execKeyInt DPAD_DOWN - { - execnow set fshSelectFirstSlotRow 1; - setfocus fileShareSlots; - } - -#ifdef CONSOLE - PREPROC_TEXT_DRAW_VIS( -146 80 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - ( int( getFeederData( "fileShareSlots", "slot" ) ) ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, 1 1 1 1, - 1 ) - PREPROC_TEXT_DRAW_VIS( -142 80 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@MENU_FILESHARE_OF6", - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, 1 1 1 1, - when ( !IsPremiumSubscriber() ) ) - - // Top Arrow - PREPROC_SHADER_DRAW_VIS_EX( -114 75 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_left", COLOR_BODY_TEXT, - when( IsPremiumSubscriber() && getFeederData( "fileShareSlots", "slot" ) > 6 ), rotation 90; ) - - // Bottom Arrow 1 - PREPROC_SHADER_DRAW_VIS_EX( -107 75 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( IsPremiumSubscriber() && getFeederData( "fileShareSlots", "slot" ) > 6 && getFeederData( "fileShareSlots", "slot" ) < 13 ), rotation 90; ) - - // Bottom Arrow 2 - PREPROC_SHADER_DRAW_VIS_EX( -114 75 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - "ui_arrow_right", COLOR_BODY_TEXT, - when( IsPremiumSubscriber() && getFeederData( "fileShareSlots", "slot" ) <= 6 ), rotation 90; ) -#endif //#ifdef CONSOLE - // File details - FILESHARE_DETAILS( 35, (FRAME_CHOICE_Y_START-1), HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, - "custom_select_from_fileshare", "fileShareSlots", - SLOT_OCCUPIED_CONDITION ) - - FILESHARE_SPINNER( 145, -45, when( FILESHARE_TASKSINPROGRESS ), 350 ) - - // Button prompts - -#ifdef PC - FRAME_BACK_BUTTON_DEFAULT_ACTION( ON_ESC ) -#else //#ifdef PC - FRAME_BACK_BUTTON_DEFAULT - - PREPROC_TEXT_DRAW_VIS( -160 (FILESHARE_FRAME_HEIGHT/2) 50 17 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@PLATFORM_SELECT", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, 1 1 1 1, - when( SLOT_OCCUPIED_CONDITION && SLOT_HAS_GAME_MODE ); ) -#endif //#ifdef PC - - #include "ui/safearea.menu" -} - -#define GAMEMODE_NAME_X 40 -#define GAMEMODE_NAME_Y ( FRAME_CHOICE_Y_START - 7 ) -#define GAMEMODE_NAME_HEIGHT 30 -#define GAMEMODE_NAME_SIZE GAMEMODE_IMAGE_WIDTH GAMEMODE_NAME_HEIGHT - -#define GAMEMODE_IMAGE_X GAMEMODE_NAME_X -#define GAMEMODE_IMAGE_Y (GAMEMODE_NAME_Y + GAMEMODE_NAME_HEIGHT + 15) -#define GAMEMODE_IMAGE_ASPECT_RATIO 1.0 -#define GAMEMODE_IMAGE_WIDTH 180 -#define GAMEMODE_IMAGE_HEIGHT (GAMEMODE_IMAGE_WIDTH * GAMEMODE_IMAGE_ASPECT_RATIO) -#define GAMEMODE_IMAGE_SIZE GAMEMODE_IMAGE_WIDTH GAMEMODE_IMAGE_HEIGHT - -#define GAMEMODE_DESC_X GAMEMODE_NAME_X -#define GAMEMODE_DESC_Y (GAMEMODE_IMAGE_Y + GAMEMODE_IMAGE_HEIGHT + 15) -#define GAMEMODE_DESC_SIZE GAMEMODE_IMAGE_WIDTH 60 - -#undef DEFAULT_SLIDE_IN_SPEED -#define DEFAULT_SLIDE_IN_SPEED 180 - -#undef DEFAULT_SLIDE_OUT_SPEED -#define DEFAULT_SLIDE_OUT_SPEED 180 - -#undef ON_ESC -#define ON_ESC \ - deactivateBlur; \ - play uin_navigation_menu_lg_close; \ - close self; - -menuDef -{ - name select_game_mode - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - - onOpen - { - activateBlur; - play uin_navigation_menu_lg_open; - setdvar invite_visible "0"; - setDvar ui_preview dvarString( ui_gametype ); - setFocus gamemode_selection; - execNow refreshFeederSelection gamemode_selection; - execNow movefeeder ( GetGamemodeIndexByName( gamemode_selection, tableLookup( "mp/gametypesTable.csv", 0, dvarString( ui_gametype ), 1 ) ) ) gamemode_selection; - } - onFocus { } - onClose - { - setdvar invite_visible "1"; - } - onESC - { - ON_ESC - } - - FRAME_DEFAULT - - FRAME_TITLE_DEFAULT( "@MPUI_CHANGE_GAME_MODE_CAPS", 1 ) - - #define GAME_HC_TDM_HACK ( dvarInt( "xblive_basictraining" ) && dvarString( ui_preview ) == "hc_tdm" ) - #define GAME_DESC_VIS_ARG ( dvarInt( "xblive_basictraining" ) || dvarBool( splitscreen ) || dvarBool( systemlink ) || getFeederData( "gamemode_selection", "selection" ) != 0 ) - #define GAMETYPE_IMAGE tableLookup( "mp/gametypesTable.csv", 0, dvarString( ui_preview ), 3 ) - #define GAMEMODE tableLookup( "mp/gametypesTable.csv", 0, dvarString( ui_preview ), 1 ) - #define GAMEMODE_DESC tableLookup( "mp/gametypesTable.csv", 0, dvarString( ui_preview ), 2 ) - - #define GAMEMODE_DESC_DISPLAY( titleText, imageMat, descText, visArg ) \ - PREPROC_TEXT_DRAW_ALL( GAMEMODE_NAME_X GAMEMODE_NAME_Y GAMEMODE_NAME_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, \ - titleText, \ - TEXTSIZE_TITLE, 0, 0, ITEM_ALIGN_TOP_CENTER, 1 1 1 1, UI_FONT_EXTRABIG, ITEM_TEXTSTYLE_NORMAL, \ - when( visArg );, ; ) \ - PREPROC_SHADER_DRAW_VIS_EX( GAMEMODE_IMAGE_X GAMEMODE_IMAGE_Y GAMEMODE_IMAGE_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, \ - imageMat, 1 1 1 1, \ - when( visArg );, \ - ; ) \ - PREPROC_TEXT_DRAW_VIS_EX( GAMEMODE_DESC_X GAMEMODE_DESC_Y GAMEMODE_DESC_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, \ - descText, \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_CENTER, 1 1 1 1, \ - when( visArg );, autowrapped ) - - GAMEMODE_DESC_DISPLAY( "@" + GAMEMODE, GAMETYPE_IMAGE, "@" + GAMEMODE_DESC, GAME_DESC_VIS_ARG && !GAME_HC_TDM_HACK ) - GAMEMODE_DESC_DISPLAY( "@MPUI_BASIC_TRAINING_HC_TDM", GAMETYPE_IMAGE, "@" + GAMEMODE_DESC, GAME_HC_TDM_HACK ) - GAMEMODE_DESC_DISPLAY( "@CUSTOM_CUSTOM_GAME_MODE_CAPS", "playlist_custom", "@CUSTOM_SELECT_FROM_FILESHARE_DESC", !GAME_DESC_VIS_ARG && !GAME_HC_TDM_HACK ) - - #define RESET_CUSTOM_GAMEMODE_IF_CHANGED \ - if( dvarString( "ui_preview" ) != dvarString( "ui_gametype" ) ) \ - { \ - execNow "resetCustomGametype"; \ - } - - // gametype selection =========================================== - itemDef - { - name gamemode_selection - type ITEM_TYPE_LISTBOX - feeder FEEDER_GAMETYPES_BASE - rect (FRAME_CHOICE_X_START-1) ( FRAME_CHOICE_Y_START - 3 ) FRAME_BUTTON_WIDTH 308 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - elementwidth 30 - elementheight 19 - noscrollbars - noBlinkingHighlight - textfont CHOICE_TEXTFONT - textscale CHOICE_TEXTSIZE - forecolor CHOICE_TEXTCOLOR - focusColor COLOR_TITLE - disablecolor FRAME_GREY_RGB 1 - textstyle ITEM_TEXTSTYLE_NORMAL - modal - visible 1 - // x y w h len horzAlign vertAlign - userarea 4 0 0 (FRAME_BUTTON_WIDTH+1) 19 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* BACKGROUND */ - 17 0 FRAME_BUTTON_WIDTH 19 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* NAME */ - 0 1 17 18 16 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* A_BUTTON */ - (FRAME_BUTTON_WIDTH-18) 2 14 14 0 ITEM_ALIGN_CENTER ITEM_ALIGN_MIDDLE /* CUSTOMIZED ICON */ - onfocus - { - play CHOICE_FOCUS_SOUND; - } - doubleclick - { - if( !GAME_DESC_VIS_ARG ) - { - open "custom_select_from_fileshare"; - } - else - { - RESET_CUSTOM_GAMEMODE_IF_CHANGED - setDvar ui_gametype dvarString( ui_preview ); - play CHOICE_ACTION_SOUND; - execNow "xupdatepartystate"; - deactivateBlur; - close self; - } - } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - } - - CUSTOM_MODE_CUSTOMIZED_STAR( FRAME_CHOICE_X_START, ( FRAME_DEFAULT_HEIGHT/2 ) - 70, dvarInt( customGameMode ) ) - -#ifdef PC - #define BUTTON_SPACING 20 - #define RESET_BUTTON_OFFSET ( getTextWidth( locString( "@PLATFORM_BACK" ), CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) + 8 + BUTTON_SPACING ) - - FRAME_BACK_BUTTON_DEFAULT_ACTION( ON_ESC ) - FRAME_BUTTON_PC_LEFT_OFFSET( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, RESET_BUTTON_OFFSET, "@PLATFORM_RESET_TO_DEFAULT", - open popup_custom_confirm_revert;, when( dvarBool( customGameMode ) ) ) -#else //PC - FRAME_BACK_BUTTON_DEFAULT - CUSTOM_MODE_RESET_TO_DEFAULT_BUTTON( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, -76, open popup_custom_confirm_revert;, dvarBool( customGameMode ) ) -#endif //PC - - #include "ui/safearea.menu" -} - -#define MAPSELECT_NAME_X 20 -#define MAPSELECT_NAME_Y (FRAME_CHOICE_Y_START-7) -#define MAPSELECT_NAME_HEIGHT 30 -#define MAPSELECT_NAME_SIZE MAPSELECT_IMAGE_WIDTH MAPSELECT_NAME_HEIGHT - -#define MAPSELECT_IMAGE_X MAPSELECT_NAME_X -#define MAPSELECT_IMAGE_Y (MAPSELECT_NAME_Y + MAPSELECT_NAME_HEIGHT + 5) -#define MAPSELECT_IMAGE_ASPECT_RATIO 0.675 -#define MAPSELECT_IMAGE_WIDTH 224 -#define MAPSELECT_IMAGE_HEIGHT (MAPSELECT_IMAGE_WIDTH * MAPSELECT_IMAGE_ASPECT_RATIO) -#define MAPSELECT_IMAGE_SIZE MAPSELECT_IMAGE_WIDTH MAPSELECT_IMAGE_HEIGHT - -#define MAPSELECT_DESC_TITLE_HEIGHT 15 -#define MAPSELECT_DESC_TITLE_SIZE MAPSELECT_IMAGE_WIDTH MAPSELECT_DESC_TITLE_HEIGHT -#define MAPSELECT_DESC_X MAPSELECT_NAME_X -#define MAPSELECT_DESC_Y (MAPSELECT_IMAGE_Y + MAPSELECT_IMAGE_HEIGHT + 10 ) -#define MAPSELECT_DESC_HEIGHT 50 -#define MAPSELECT_DESC_SIZE MAPSELECT_IMAGE_WIDTH MAPSELECT_DESC_HEIGHT - -#define MAPSELECT_SIZE_X MAPSELECT_NAME_X -#define MAPSELECT_SIZE_Y (MAPSELECT_DESC_Y+MAPSELECT_DESC_TITLE_HEIGHT+MAPSELECT_DESC_HEIGHT) -#define MAPSELECT_SIZE_SIZE MAPSELECT_IMAGE_WIDTH MAPSELECT_DESC_HEIGHT - -#define SWITCH_MAP_LIST_ACTION \ - if( dvarBool( "dlc2" ) || dvarBool( "dlc3" ) || dvarBool( "dlc4" ) ) \ - { \ - if( dvarBool( ui_showDLCMaps ) ) \ - { \ - setDvar ui_showDLCMaps 0; \ - execNow movefeeder 0 map_selection; \ - } \ - else \ - { \ - setDvar ui_showDLCMaps 1; \ - execNow movefeeder 0 map_selection; \ - } \ - } - -#define SWITCH_TO_MAPS_ACTION \ - setDvar ui_showDLCMaps 0; \ - execNow movefeeder 0 map_selection; - -#define SWITCH_TO_DLC_ACTION \ - setDvar ui_showDLCMaps 1; \ - execNow movefeeder 0 map_selection; - -#undef ON_ESC -#define ON_ESC \ - deactivateBlur; \ - play uin_navigation_menu_lg_close; \ - close self; \ - setDvar settings_map_selected 0; - -#define CHOICE_TAB_TEXTSIZE TEXTSIZE_SMALL -#define TAB_1_TEXT (locString( "@MPUI_MAPS_CAPS" )) -#define TAB_2_TEXT (locString( "@MPUI_DLC_MAPS_CAPS" )) - -#define TAB_BG_PAD 5 -#define TAB_1_WIDTH ( getTextWidth( TAB_1_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_2_WIDTH ( getTextWidth( TAB_2_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_HEIGHT 15 - -#define MAP_TAB_1_X NEW_FRAME_CHOICE_X_START -#define MAP_TAB_2_X ( MAP_TAB_1_X + TAB_1_WIDTH ) - -#define MAP_TAB_Y ( ( -NEW_FRAME_DEFAULT_HEIGHT / 2 ) + NEW_FRAME_HEADER_HEIGHT - TAB_HEIGHT ) - -#define MAP_TAB_HEADER( visArg ) \ - /* highlighted header */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( MAP_TAB_1_X, \ - MAP_TAB_Y, \ - TAB_1_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_1_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( visArg && dvarBool( ui_showDLCMaps ) == 0 ), ; ) \ - /* non highlighted header */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( MAP_TAB_1_X, \ - MAP_TAB_Y, \ - TAB_1_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_1_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( visArg && dvarBool( ui_showDLCMaps ) == 1 ), TAB_MOUSEOVER_HIGHLIGHT; ) - -#define DLC_TAB_HEADER( visArg ) \ - /* highlighted header */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( MAP_TAB_2_X, \ - MAP_TAB_Y, \ - TAB_2_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_2_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( visArg && dvarBool( ui_showDLCMaps ) == 1 ), ; ) \ - /* non highlighted header */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( MAP_TAB_2_X, \ - MAP_TAB_Y, \ - TAB_2_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_2_TEXT, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( visArg && dvarBool( ui_showDLCMaps ) == 0 ), TAB_MOUSEOVER_HIGHLIGHT; ) - -#define MAP_TAB_BG( px, pw, visArg ) \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER_FRAMED \ - frame 16 0.2 FRAME_OPEN_BOTTOM \ - rect 0 MAP_TAB_Y 0 TAB_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ - exp rect X( px ) \ - exp rect W( pw ) \ - background "menu_mp_tab_frame_inner" \ - forecolor 1 1 1 1 \ - visible when( visArg ) \ - decoration \ - } - -#define MAP_TAB_BUTTON( px, pw, actionArg, visArg ) \ - itemDef \ - { \ - type ITEM_TYPE_BUTTON_NO_TEXT \ - rect 0 MAP_TAB_Y 0 TAB_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ - exp rect X( px ) \ - exp rect W( pw ) \ - visible when( visArg ) \ - mouseenter { play CHOICE_FOCUS_SOUND; } \ - onFocus \ - { \ - play CHOICE_FOCUS_SOUND; \ - } \ - action \ - { \ - play CHOICE_ACTION_SOUND; \ - actionArg; \ - } \ - } - -menuDef -{ - name select_map - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - - onOpen - { - activateBlur; - play uin_navigation_menu_lg_open; - setdvar invite_visible "0"; - setDvar ui_preview dvarString( ui_mapname ); - setDvar settings_map_selected 1; - setFocus map_selection; - setDvar ui_showDLCMaps 0; - execNow movefeeder ( GetMapIndexByName( map_selection, tableLookup( "mp/mapsTable.csv", 0, dvarString( ui_mapname ) , 3 ) ) ) map_selection; - } - onFocus { } - onClose - { - deactivateBlur; - setdvar invite_visible "1"; - } - onESC - { - ON_ESC - } - execKeyInt K_LEFTARROW - { - SWITCH_MAP_LIST_ACTION - } - execKeyInt K_RIGHTARROW - { - SWITCH_MAP_LIST_ACTION - } - - FRAME_DEFAULT - - FRAME_TITLE_DEFAULT( "@MPUI_CHANGE_MAP_CAPS", 1 ) - - #define MAPS_TAB_VISIBLE ( 1 ) - #define DLC_TAB_VISIBLE ( dvarBool( "dlc2" ) || dvarBool( "dlc3" ) || dvarBool( "dlc4" ) ) - - MAP_TAB_BG( MAP_TAB_1_X, TAB_1_WIDTH, MAPS_TAB_VISIBLE ) - MAP_TAB_HEADER( MAPS_TAB_VISIBLE ) - MAP_TAB_BUTTON( MAP_TAB_1_X, TAB_1_WIDTH, SWITCH_TO_MAPS_ACTION, MAPS_TAB_VISIBLE ) - - MAP_TAB_BG( MAP_TAB_2_X, TAB_2_WIDTH, DLC_TAB_VISIBLE ) - DLC_TAB_HEADER( DLC_TAB_VISIBLE ) - MAP_TAB_BUTTON( MAP_TAB_2_X, TAB_2_WIDTH, SWITCH_TO_DLC_ACTION, DLC_TAB_VISIBLE ) - - #define MAP_IMAGE tableLookup( "mp/mapsTable.csv", 0, dvarString( ui_preview ) , 0 ) - #define MAP_NAME tableLookup( "mp/mapsTable.csv", 0, dvarString( ui_preview ) , 3 ) - #define MAP_SIZE tableLookup( "mp/mapsTable.csv", 0, dvarString( ui_preview ) , 8 ) - #define MAP_DESC tableLookup( "mp/mapsTable.csv", 0, dvarString( ui_preview ) , 6 ) - - #define MAP_SELECT_DISPLAY( mapName, mapImage, mapSize, mapDesc, visArg ) \ - PREPROC_TEXT_DRAW_ALL( MAPSELECT_NAME_X MAPSELECT_NAME_Y MAPSELECT_NAME_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, \ - mapName, \ - TEXTSIZE_TITLE, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, UI_FONT_EXTRABIG, ITEM_TEXTSTYLE_NORMAL, \ - when( visArg );, ; ) \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER_STREAMED \ - type ITEM_TYPE_IMAGE \ - rect MAPSELECT_IMAGE_X MAPSELECT_IMAGE_Y MAPSELECT_IMAGE_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ - forecolor 1 1 1 1 \ - exp material( mapImage ) \ - visible when( visArg ) \ - decoration \ - } \ - PREPROC_TEXT_DRAW_VIS( MAPSELECT_DESC_X MAPSELECT_DESC_Y MAPSELECT_DESC_TITLE_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, \ - "@MPUI_DESCRIPTION_CAPS", \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 0 0 0 0.8, \ - when( visArg ); ) \ - PREPROC_TEXT_DRAW_VIS_EX( MAPSELECT_DESC_X (MAPSELECT_DESC_Y+15) MAPSELECT_DESC_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, \ - mapDesc, \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, \ - when( visArg );, autowrapped ) \ - PREPROC_TEXT_DRAW_VIS( MAPSELECT_SIZE_X MAPSELECT_SIZE_Y MAPSELECT_DESC_TITLE_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, \ - "@MPUI_MAP_SIZE_CAPS", \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 0 0 0 0.8, \ - when( visArg ); ) \ - PREPROC_TEXT_DRAW_VIS( MAPSELECT_SIZE_X (MAPSELECT_SIZE_Y+15) MAPSELECT_SIZE_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, \ - mapSize, \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, \ - when( visArg ); ) - - MAP_SELECT_DISPLAY( "@" + MAP_NAME + "_CAPS", "menu_" + dvarString( ui_preview ) + "_map_select_final", "@MPUI_MAPSIZE_" + MAP_SIZE, "@" + MAP_DESC, 1 ) - - // map selection =========================================== - itemDef - { - name map_selection - type ITEM_TYPE_LISTBOX - feeder FEEDER_MAPS - rect (FRAME_CHOICE_X_START-1) (FRAME_CHOICE_Y_START-3) FRAME_BUTTON_WIDTH 308 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - elementwidth 30 - elementheight 19 - noscrollbars - noBlinkingHighlight - textfont CHOICE_TEXTFONT - textscale CHOICE_TEXTSIZE - forecolor CHOICE_TEXTCOLOR - focusColor COLOR_TITLE - disablecolor FRAME_GREY_RGB 1 - textstyle ITEM_TEXTSTYLE_NORMAL - modal - visible when( dvarBool( settings_map_selected ) ) - /* x y w h len horzAlign vertAlign */ - userarea 3 0 0 (FRAME_BUTTON_WIDTH+1) 19 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* FEEDER_MAPSELECTION_COLUMN_BACKGROUND */ - 17 0 FRAME_BUTTON_WIDTH 19 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* FEEDER_MAPSELECTION_COLUMN_NAME */ - 0 1 17 18 16 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* FEEDER_MAPSELECTION_COLUMN_A_BUTTON */ - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick - { - setDvar ui_mapname dvarString( ui_preview ); - play CHOICE_ACTION_SOUND; - execNow "xupdatepartystate"; - deactivateBlur; - close self; - } - execKeyInt DPAD_LEFT - { - SWITCH_MAP_LIST_ACTION - } - execKeyInt DPAD_RIGHT - { - SWITCH_MAP_LIST_ACTION - } - execKeyInt APAD_LEFT - { - SWITCH_MAP_LIST_ACTION - } - execKeyInt APAD_RIGHT - { - SWITCH_MAP_LIST_ACTION - } - } - -#ifdef PC - FRAME_BACK_BUTTON_DEFAULT_ACTION( ON_ESC ) -#else //#ifdef PC - FRAME_BACK_BUTTON_DEFAULT -#endif //#ifdef PC - - #include "ui/safearea.menu" -} - -#include "ui_mp/popupstyle.inc" - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_game_mode_upload_confirm, activateblur; execNow raiseFeederEvent Populate;, deactivateblur; close self;, 1 ) - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent Clear; - } - - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_REPLACECONFIRM", 1 ) - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 400 - menuItemsDef - { - maxRows 4 - DYNAMIC_MENU_COMMON_COLUMNS - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 50 CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - onEvent Yes - { - open menu_game_mode_upload_save; - close self; - } - onEvent No { close self; } - onEvent Clear { execNow clearFeeder; } - onEvent Populate { - execNow addToFeeder Yes MENU_YES; - execNow addToFeeder No MENU_CANCEL; - } - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; } - } -} - -// Redefinitions for MEDIUM_POPUP_SETUP popups -#undef POPUP_WIDTH -#define POPUP_WIDTH MEDIUM_POPUP_WIDTH -#undef POPUP_HEIGHT -#define POPUP_HEIGHT MEDIUM_POPUP_HEIGHT -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X (POPUP_WIDTH-(POPUP_SIDE_PAD*2)) -#undef CHOICE_Y_START -#define CHOICE_Y_START POPUP_Y_START_TOP -#undef PLAYER_INFO_ALIGN -#define PLAYER_INFO_ALIGN // Purposely set to nothing. The popup setup macro sets the alignment. If items within it set their own aligment, they end up offset incorrectly. -#undef PLAYER_INFO_X_START -#define PLAYER_INFO_X_START( frameWidth ) ( frameWidth - PLAYER_INFO_WIDTH - PLAYER_INFO_PAD ) -#undef PLAYER_INFO_Y_START -#define PLAYER_INFO_Y_START( frameHeight ) ( PLAYER_INFO_PAD * 2 ) -#undef BG_BACKCOLOR -#define BG_BACKCOLOR POPUP_BACKCOLOR -// Redefinitions for MEDIUM_POPUP_SETUP popups - -#define GAME_MODE_FILESHARE_UPLOAD_ACTION \ - execNow uploadCustomGametype ( getFeederData( "menu_game_mode_upload", "fileShareSlots", "slot" ) ); \ - setdvar customGameMode 1; \ - execNow "xupdatepartystate"; - -menuDef -{ - MEDIUM_POPUP_SETUP_VIS( menu_game_mode_upload_save, activateblur;, deactivateblur; close self;, POPUP_GLOW_WHITE, 0, 1 ) - onClose - { - deactivateblur; - play CHOICE_FOCUS_SOUND; - } - MEDIUM_POPUP_TITLE_VIS( "@MENU_SAVE_INFORMATION_CAPS", 1 ) - - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 1 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_TITLE" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - FRAME_CHOICE_BUTTON( 2, dvarString(fsSelectedFileName), execNow demo_keyboard fileshareFileName; ) - PREPROC_TEXT_DRAW_VIS( CHOICE_ORIGIN( 3 ) CHOICE_SIZE_X CHOICE_SIZE_Y HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - locString( "@MPUI_DESCRIPTION" )+" :", - TEXTSIZE_SMALL, 0, 0, CHOICE_TEXTALIGN, 1 1 1 1, - 1 ) - FRAME_CHOICE_BUTTON( 4, dvarString(fsSelectedFileDescription), execNow demo_keyboard fileshareFileDescription; ) - FRAME_CHOICE_BUTTON( 6, "@MENU_CONTINUE", GAME_MODE_FILESHARE_UPLOAD_ACTION; close self; close menu_game_mode_upload; ) - MEDIUM_POPUP_BACK_BUTTON -} diff --git a/mods/patch_mp/ui_mp/hud_ffa.menu b/mods/patch_mp/ui_mp/hud_ffa.menu deleted file mode 100644 index 099dd8d..0000000 --- a/mods/patch_mp/ui_mp/hud_ffa.menu +++ /dev/null @@ -1,208 +0,0 @@ -// CONSOLE HUD - MP - -#include "ui/menudef.h" -#include "ui_mp/hud_gametypes.inc" -#include "ui_mp/choices_setup_teams.menu" - -#define BAR_START_X 42 -#define BAR_START_Y -42 -#define BAR_HEIGHT 39 -#define BAR_WIDTH 143 -#define BAR_HEIGHT_TOP 20 -#define BAR_HEIGHT_BOTTOM 16 - -#define BAR_PERCENT_PLAYER ( max( player( score ), 0 ) / dvarInt( "ui_scorelimit" ) ) -#define BAR_PRECENT_BEST_OTHER_PLAYER ( Select( player( score ) == scoreatrank( 1 ), (max( scoreatrank( 2 ), 0 ) / dvarInt( "ui_scorelimit" )), (max( scoreatrank( 1 ), 0 ) / dvarInt( "ui_scorelimit" )) ) ) - -#define BEST_OTHER_PLAYER_SCORE ( Select( player( score ) == scoreatrank( 1 ), scoreatrank( 2 ), scoreatrank( 1 ) ) ) - -#define FSM_VISIBILITY ( isVisibilityBitSet( BIT_SELECTING_LOCATION ) && !isVisibilityBitSet( BIT_SPECTATING_CLIENT ) && !isVisibilityBitSet( BIT_SCOREBOARD_OPEN ) ) - -{ - menuDef - { - name "scorebars_ffa_background" - rect BOTTOM_RECT_X BOTTOM_RECT_Y 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - exp rect Y( BOTTOM_RECT_Y - (ONLINEGAME * ONLINEGAME_OFFSET) ); - fullScreen 0 - visible when( !FSM_VISIBILITY ) - visibilityBits bits( BIT_HUD_VISIBLE HUD_VISIBILITY !BIT_IN_KILLCAM SHOULD_DISPLAY_SCOREBAR !BIT_UI_ACTIVE !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC ) - - - #define BG_OFFSET_X (-15) - #define BG_OFFSET_Y (-5) - #define BG_START_X (BAR_START_X+BG_OFFSET_X) - #define BG_START_Y (BAR_START_Y+BG_OFFSET_Y) - - // score background - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect BG_START_X BG_START_Y 187 46 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp material( "hud_frame_faction_fade" ); - forecolor 1 1 1 0.5 - visible 1 - decoration - } - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect (BAR_START_X-69) (BG_START_Y-14) 240 59 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp material( "hud_frame_faction_lines" ); - forecolor 1 1 1 0.4 - visible 1 - decoration - } - - #define PROGRESS_OFFSET_X 47 - - // Player progress bar - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect BAR_START_X -42 70 BAR_HEIGHT_TOP HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp rect W( PROGRESS_OFFSET_X + (BAR_WIDTH-PROGRESS_OFFSET_X) * BAR_PERCENT_PLAYER ); - exp material( "hud_score_progress" ); - forecolor 0.42 0.68 0.46 0.8 - visible when( dvarInt( "ui_scorelimit" ) != 0 && player( score ) > 0 ) - decoration - } - - // Other player progress bar - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect BAR_START_X -20 70 BAR_HEIGHT_BOTTOM HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp rect W( PROGRESS_OFFSET_X + (BAR_WIDTH-PROGRESS_OFFSET_X) * BAR_PRECENT_BEST_OTHER_PLAYER ); - exp material( "hud_score_progress" ); - forecolor 0.73 0.29 0.19 0.8 - visible when( dvarInt( "ui_scorelimit" ) != 0 && BEST_OTHER_PLAYER_SCORE > 0 ) - decoration - } - - // FACTION ICONS - #define FACTION_ICON_WIDTH 64 - #define FACTION_ICON_HEIGHT FACTION_ICON_WIDTH - #define FACTION_BG_WIDTH 92 - #define FACTION_BG_HEIGHT FACTION_BG_WIDTH - #define FACTION_BG_X_START (BAR_START_X-(FACTION_BG_WIDTH/2)) - #define FACTION_BG_Y_START (BAR_START_Y-(FACTION_BG_HEIGHT/2)) - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect FACTION_BG_X_START FACTION_BG_Y_START FACTION_BG_WIDTH FACTION_BG_HEIGHT HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp material( "hud_faction_back_light" ); - forecolor 1 1 1 0.25 - visible 1 - decoration - } - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect FACTION_BG_X_START FACTION_BG_Y_START FACTION_BG_WIDTH FACTION_BG_HEIGHT HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp material( "hud_faction_backing" ); - forecolor 1 1 1 0.2 - visible 1 - decoration - } - - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect (FACTION_BG_X_START+9) (FACTION_BG_Y_START+20) FACTION_ICON_WIDTH FACTION_ICON_HEIGHT HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - origin 5 -5 - exp material( dvarString( "g_TeamIcon_Allies" ) ); - visible when( TEAM_IS_MARINES ); - forecolor 1 1 1 1 - decoration - } - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect (FACTION_BG_X_START+9) (FACTION_BG_Y_START+20) FACTION_ICON_WIDTH FACTION_ICON_HEIGHT HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - origin 5 -5 - exp material( dvarString( "g_TeamIcon_Axis" ) ); - visible when( TEAM_IS_OPFOR ); - forecolor 1 1 1 1 - decoration - } - - } - - #define SCORE_OFFSET_X (PROGRESS_OFFSET_X-12) - #define SCORE_START_X (BAR_START_X+SCORE_OFFSET_X) - #define SCORE_COLOR 1 1 1 - menuDef - { - name "scorebars_ffa_scores" - rect BOTTOM_RECT_X BOTTOM_RECT_Y 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - exp rect Y( BOTTOM_RECT_Y - (ONLINEGAME * ONLINEGAME_OFFSET) ); - fullScreen 0 - visible when( !FSM_VISIBILITY ) - visibilityBits bits( BIT_HUD_VISIBLE SHOULD_DISPLAY_SCOREBAR !BIT_IN_KILLCAM !BIT_UI_ACTIVE !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC BIT_TEAM_FREE !BIT_IN_VEHICLE ) - - // draws Player score - itemDef - { - type ITEM_TYPE_TEXT - rect SCORE_START_X -23 24 24 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp rect X( SCORE_START_X + ( (BAR_WIDTH-PROGRESS_OFFSET_X) * BAR_PERCENT_PLAYER ) ); - exp text( player( score ) ); - textfont UI_FONT_EXTRABIG - textscale TEXTSIZE_LARGE - textalign ITEM_ALIGN_CENTER - textstyle ITEM_TEXTSTYLE_SHADOWEDMORE - forecolor SCORE_COLOR 1 - visible 1 - decoration - } - // Top Arrow - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect SCORE_START_X -53 24 24 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp rect X( SCORE_START_X + ( (BAR_WIDTH-PROGRESS_OFFSET_X) * BAR_PERCENT_PLAYER ) ); - exp material( "hud_frame_arrow" ); - forecolor 1 1 1 0.8 - visible 1 - decoration - } - #define OT_SCORE_START_X (SCORE_START_X+2) - // OTHER Player score - itemDef - { - type ITEM_TYPE_TEXT - rect (OT_SCORE_START_X-1) -7 20 20 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp rect X( OT_SCORE_START_X + ( (BAR_WIDTH-PROGRESS_OFFSET_X) * BAR_PRECENT_BEST_OTHER_PLAYER ) ); - exp text( BEST_OTHER_PLAYER_SCORE ); - textfont UI_FONT_EXTRABIG - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_CENTER - textstyle ITEM_TEXTSTYLE_SHADOWEDMORE - forecolor SCORE_COLOR 1 - visible 1 - decoration - } - // Bottom Arrow - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect OT_SCORE_START_X -16 20 (-20) HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp rect X( OT_SCORE_START_X + ( (BAR_WIDTH-PROGRESS_OFFSET_X) * BAR_PRECENT_BEST_OTHER_PLAYER ) ); - exp material( "hud_frame_arrow" ); - forecolor 1 1 1 0.8 - visible 1 - decoration - } - } -} diff --git a/mods/patch_mp/ui_mp/hud_hardcore.menu b/mods/patch_mp/ui_mp/hud_hardcore.menu deleted file mode 100644 index d2ae272..0000000 --- a/mods/patch_mp/ui_mp/hud_hardcore.menu +++ /dev/null @@ -1,1316 +0,0 @@ -// CONSOLE HUD - MP - -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui_mp/hud_gametypes.inc" - -{ - #include "ui_mp/hud_dirt.inc" - - // Sticky grenade overlay - menuDef - { - name "sticky_grenade_overlay" - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - fullScreen 0 - visible 1 - visibilityBits bits( !BIT_DEMO_CAMERA_MODE_THIRDPERSON !BIT_DEMO_CAMERA_MODE_MOVIECAM !BIT_DEMO_ALL_GAME_HUD_HIDDEN !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC ) - - itemDef - { - name "overlay" - style WINDOW_STYLE_SHADER - rect 0 0 640 480 - background "overlay_low_health" - forecolor 1 1 1 0 - visible 1 - decoration - - state - { - name "pulse" - forecolor 1 1 1 0.6 - onEnter { changeState Default 100; } - } - } - } - - // Low health overlay - menuDef - { - name "Low Health" - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - fullScreen 0 - visible 1 - - itemDef - { - name "healthoverlay" - type ITEM_TYPE_OWNERDRAW - rect 0 0 640 480 - forecolor 1 1 1 1 - background "overlay_low_health_splat" - ownerdraw CG_PLAYER_LOW_HEALTH_OVERLAY - visible 1 - visibilityBits bits( !BIT_SPECTATING_CLIENT !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC ) - decoration - } - } - - // Directional hit indicator - menuDef - { - name "Directional Hit Indicator" - rect 0 0 640 480 HORIZONTAL_ALIGN_USER_CENTER VERTICAL_ALIGN_USER_CENTER - fullScreen 0 - visible 1 - - itemDef - { - name "directionalhitIndicator" - type ITEM_TYPE_OWNERDRAW - rect -16 -16 32 32 - forecolor 1 1 1 1 - background "directional_damage_feedback" - ownerdraw CG_PLAYER_DIRECTIONAL_HIT_INDICATOR - visibilityBits bits( !BIT_SPECTATING_CLIENT !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC ) - decoration - } - } - - // Invalid cmd hint - menuDef - { - name "InvalidCmdHint" - rect 0 -130 0 0 HORIZONTAL_ALIGN_USER_CENTER VERTICAL_ALIGN_USER_CENTER - fullScreen 0 - visible 1 - - itemDef - { - name "chRect" - type ITEM_TYPE_OWNERDRAW_TEXT - rect 0 0 0 0 - textscale TEXTSIZE_SMALL - textstyle ITEM_TEXTSTYLE_SHADOWED - ownerdraw CG_INVALID_CMD_HINT - textfont UI_FONT_NORMAL - visibilityBits bits( !BIT_SPECTATING_CLIENT !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC !BIT_DEMO_CAMERA_MODE_MOVIECAM !BIT_DEMO_CAMERA_MODE_THIRDPERSON ) - decoration - } - } - - // Cursor hints - menuDef - { - name "Cursorhints" - rect 0 70 40 40 HORIZONTAL_ALIGN_USER_CENTER VERTICAL_ALIGN_USER_CENTER - fullScreen 0 - visible 1 - visibilityBits bits( !BIT_UI_ACTIVE !BIT_IS_DEMO_PLAYING !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC ) - - itemDef - { - name "chRect" - type ITEM_TYPE_OWNERDRAW_TEXT - rect -20 0 40 40 // 64x64 - exp rect Y( 0 - (ONLINEGAME * ONLINEGAME_OFFSET) ); - textscale TEXTSIZE_SMALL - textstyle ITEM_TEXTSTYLE_SHADOWED - ownerdraw CG_CURSORHINT - visible 1 - visibilityBits bits( !BIT_SPECTATING_CLIENT ) - forecolor 1 1 1 HUD_ALPHA - decoration - } - } - - - //WRIST WATCH - menuDef - { - name "WristWatch" - fullScreen MENU_FALSE - visible 1 - ui3dWindowId 0 - rect 0 0 640 480 - itemDef - { - name "WristWatchFace" - type ITEM_TYPE_OWNERDRAW - rect 0 0 640 480 - forecolor 1.0 1.0 1.0 1.0 - ownerdraw CG_PLAYER_WRISTWATCH - visible when( !dvarInt( "hideUi3d" ) ); - decoration - } - } - - - #define MINIMAP_ORIGIN 2 2 - - // These are no longer used, they have been replaced by visibility bits. - //#define ALLIES_HAVE_RADAR ( isVisibilityBitSet( BIT_RADAR_ALLIES ) && team( name ) == "TEAM_ALLIES" ) - //#define AXIS_HAVE_RADAR ( isVisibilityBitSet( BIT_RADAR_AXIS ) && team( name ) == "TEAM_AXIS" ) - //#define CLIENT_HAS_RADAR ( isVisibilityBitSet( BIT_RADAR_CLIENT ) && team( name ) == "TEAM_FREE" ) - - #define RECT_COMPASS 8 8 COMPASS_SIZE_MP COMPASS_SIZE_MP HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_TOP - #define FRAME_OFFSET 1 - #define EXTRACAM_ON ( ( isExtraCamActive() || isExtraCamStatic() ) && !InVehicle() && !isDemoCameraEditMode() ) - #define EXTRACAM_SCALE 1.5 - #define EXTRACAM_FRAME_OFFSET 2 - #define REC_TEXT_VISIBILE ( !isDemoDollyCamera() ) - - menudef - { - name spike_cam - rect RECT_COMPASS - fullScreen 0 - visible when ( dvarString( createfx ) != "on" ); - visibilityBits bits( !BIT_SELECTING_LOCATION !BIT_IN_KILLCAM !BIT_IS_FLASH_BANGED !BIT_UI_ACTIVE !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC !BIT_IS_SCOPED BIT_EXTRACAM_ON !BIT_DEMO_ALL_GAME_HUD_HIDDEN ) - - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - exp material( "extracam2d" ); - forecolor 1 1 1 1 - visible 1 - visibilityBits bits( !BIT_EXTRACAM_STATIC ); - decoration - - state - { - name "spike_cam_on" - rect MINIMAP_X_MP MINIMAP_Y_MP (MINIMAP_W_MP*EXTRACAM_SCALE) (MINIMAP_H_MP*EXTRACAM_SCALE) - } - } - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - exp material( "compass_static" ); - forecolor 1 1 1 1 - visible 1 - visibilityBits bits( BIT_EXTRACAM_STATIC ); - - decoration - - state - { - name "spike_cam_on" - rect MINIMAP_X_MP MINIMAP_Y_MP (MINIMAP_W_MP*EXTRACAM_SCALE) (MINIMAP_H_MP*EXTRACAM_SCALE) - } - } - // frame - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect (MINIMAP_X_MP-FRAME_OFFSET) (MINIMAP_Y_MP-FRAME_OFFSET) (MINIMAP_W_MP+FRAME_OFFSET*2) (MINIMAP_H_MP+FRAME_OFFSET*2) - origin MINIMAP_ORIGIN - forecolor 1 1 1 1 - exp material( "compass_map_border" ); - visible 1 - decoration - - state - { - name "spike_cam_on" - rect (MINIMAP_X_MP-EXTRACAM_FRAME_OFFSET) (MINIMAP_Y_MP-EXTRACAM_FRAME_OFFSET) (MINIMAP_W_MP*EXTRACAM_SCALE+EXTRACAM_FRAME_OFFSET*2) (MINIMAP_H_MP*EXTRACAM_SCALE+EXTRACAM_FRAME_OFFSET*2) - } - } - // REC text - itemDef - { - type ITEM_TYPE_TEXT - rect (MINIMAP_X_MP+1) (MINIMAP_Y_MP+14) MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - textstyle ITEM_TEXTSTYLE_NORMAL - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_NORMAL - textscale 0.33 - forecolor EXTRACAM_RED_COLOR 1 - text "REC" - visible when( REC_TEXT_VISIBILE ) - visibilityBits bits( !BIT_EXTRACAM_STATIC ); - decoration - } - // Blinking REC light - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect (MINIMAP_X_MP+23) (MINIMAP_Y_MP+1.5) 9 9 - origin MINIMAP_ORIGIN - forecolor EXTRACAM_RED_COLOR 1 - exp material( "hud_dpad_eqip_count_backing" ); - visible when( REC_TEXT_VISIBILE ) - visibilityBits bits( !BIT_EXTRACAM_STATIC ); - decoration - - state - { - name "spike_cam_on" - onEnter - { - changeState spike_cam_on_wait 750; - } - } - state - { - name "spike_cam_on_wait" - onEnter - { - changeState spike_cam_off 0; - } - } - state - { - name "spike_cam_off" - forecolor EXTRACAM_RED_COLOR 0 - onEnter - { - changeState spike_cam_off_wait 750; - } - } - state - { - name "spike_cam_off_wait" - forecolor EXTRACAM_RED_COLOR 0 - onEnter - { - changeState spike_cam_on 0; - } - } - } - } - -// This condition is now replaced by a single bit BIT_COMPASS_VISIBLE which is set in code cl_scrn_mp.cpp in the function CL_UpdateUIVisibilityBits() -// ( !isVisibilityBitSet( BIT_HUD_HARDCORE ) || ALLIES_HAVE_RADAR || AXIS_HAVE_RADAR || CLIENT_HAS_RADAR || isVisibilityBitSet( BIT_G_COMPASS_SHOW_ENEMIES ) ) - -#define COMPASS_ALPHA 0.8 - - // Compass - menuDef - { - name "Compass_old" - rect RECT_COMPASS - fullScreen 0 - visible when ( (dvarString( createfx ) != "on") ); - visibilityBits bits( BIT_HUD_VISIBLE BIT_COMPASS_VISIBLE !BIT_DEMO_CAMERA_MODE_THIRDPERSON !BIT_DEMO_CAMERA_MODE_MOVIECAM !BIT_DEMO_ALL_GAME_HUD_HIDDEN !BIT_SELECTING_LOCATION !BIT_IN_KILLCAM !BIT_IS_FLASH_BANGED !BIT_UI_ACTIVE !BIT_IS_SCOPED !BIT_EXTRACAM_ON ) - - itemDef - { - name "mini_map_background" - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 0 0 0 0.4 - exp material( "white" ); - visible 1 - decoration - } - - itemDef - { - name "mini_map" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - background "compass_map_default" - ownerdraw CG_PLAYER_COMPASS_MAP - visible 1 - decoration - } - - // Friendly Compass scrambler indicator - itemDef - { - name "compass_map_scrambler_friendlies" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - ownerdraw CG_PLAYER_COMPASS_SCRAMBLER_FRIENDLY - visible 1 - } - - // Grid - itemDef - { - name "compass_map_grid" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - background "map_grid_square" - ownerdraw CG_PLAYER_COMPASS_GRID - visible 1 - decoration - } - itemDef - { - name "compass_grid_points" - type ITEM_TYPE_OWNERDRAW_TEXT - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 (COMPASS_ALPHA*0.7) - textalign ITEM_ALIGN_MIDDLE_CENTER - textstyle ITEM_TEXTSTYLE_SHADOWED - textscale 0.26 - ownerdraw CG_PLAYER_COMPASS_GRID_POINTS - visible 1 - } - // frame - itemDef - { - name "compassframe" - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect (MINIMAP_X_MP-FRAME_OFFSET) (MINIMAP_Y_MP-FRAME_OFFSET) (MINIMAP_W_MP+FRAME_OFFSET) (MINIMAP_H_MP+FRAME_OFFSET) - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - exp material( "compass_map_border" ); - visible 1 - decoration - } - // tank pointers - itemDef - { - name "compasstanks" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - ownerdraw CG_PLAYER_COMPASS_TANKS - visible 1 - } - // dog pointers - itemDef - { - name "compassdogs" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - ownerdraw CG_PLAYER_COMPASS_DOGS - visible 1 - } - // turret pointers - itemDef - { - name "compassturrets" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - ownerdraw CG_PLAYER_COMPASS_TURRETS - visible 1 - } - // guided missile pointers - itemDef - { - name "compassguidedmissiles" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - ownerdraw CG_PLAYER_COMPASS_GUIDED_MISSILE - visible 1 - } - // Objective pointers - itemDef - { - name "compasspointers" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - background "objective_line" - ownerdraw CG_PLAYER_COMPASS_POINTERS - visible 1 - visibilityBits bits( BIT_HUD_SHOWOBJICONS ) - decoration - } - // Friendlies pointers - itemDef - { - name "compassfriendlies" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - ownerdraw CG_PLAYER_COMPASS_FRIENDS - visible 1 - } - // Enemy pings - itemDef - { - name "compassenemies" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - ownerdraw CG_PLAYER_COMPASS_ENEMIES - visible 1 - } - // Fake fire pings - itemDef - { - name "compassfakefire" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - ownerdraw CG_PLAYER_COMPASS_FAKE_FIRE - visible 1 - } - // Helicopter pointers - itemDef - { - name "compasshelicopters" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - ownerdraw CG_PLAYER_COMPASS_HELICOPTERS - visible 1 - } - // Plane pointers - itemDef - { - name "compassplanes" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - ownerdraw CG_PLAYER_COMPASS_PLANES - visible 1 - } - // Player direction indicator - itemDef - { - name "compassplayer" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - background "compassping_player" - ownerdraw CG_PLAYER_COMPASS_PLAYER - visible 1 - } - // Artillery Icon - itemDef - { - name "compassartilleryicon" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - ownerdraw CG_PLAYER_COMPASS_ARTILLERY_ICON - visible 1 - } - // Radar lines - itemDef - { - name "compassradareffects" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 COMPASS_ALPHA - ownerdraw CG_PLAYER_COMPASS_RADAR_EFFECTS - visible 1 - } - // Map flicker - itemDef - { - name "compassflicker" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - forecolor 1 1 1 1 - background "compass_map_flicker" - ownerdraw CG_PLAYER_COMPASS_FLICKER - visible 1 - decoration - } - itemDef - { - name "compass_map_static" - type ITEM_TYPE_OWNERDRAW - rect MINIMAP_X_MP MINIMAP_Y_MP MINIMAP_W_MP MINIMAP_H_MP - origin MINIMAP_ORIGIN - background "tow_filter_overlay_no_signal" - forecolor 1 1 1 1 - ownerdraw CG_PLAYER_COMPASS_STATIC - visible 1 - } - } - - - // Full Screen Map for location selection - #define FULL_SCREEN_MAP_WIDTH 375 - #define FULL_SCREEN_MAP_HEIGHT 375 - #define MAP_ALPHA 1 - #define MAP_TEXT_ALPHA 0.9 - - #define FSM_VISIBILITY_BITS BIT_SELECTING_LOCATION !BIT_SPECTATING_CLIENT !BIT_IS_DEMO_PLAYING !BIT_SCOREBOARD_OPEN - - menuDef - { - name "FullScreenMap" - rect -100 -100 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT HORIZONTAL_ALIGN_USER_CENTER VERTICAL_ALIGN_USER_CENTER - fullScreen 0 - visible 1 -#ifdef CONSOLE - blurWorld 2.0 -#endif - visibilityBits bits( FSM_VISIBILITY_BITS ) - - itemDef - { - name "map_backdrop" - style WINDOW_STYLE_SHADER - rect -200 -200 (FULL_SCREEN_MAP_WIDTH+200) (FULL_SCREEN_MAP_HEIGHT+200) HORIZONTAL_ALIGN_USER_CENTER VERTICAL_ALIGN_USER_CENTER - forecolor 0.1 0.1 0.1 (0.7*MAP_ALPHA) - background "menu_black_box_faded" - visible 1 - decoration - } - - itemDef - { - name "map_top_black_bar" - style WINDOW_STYLE_SHADER - rect -98 -118 (FULL_SCREEN_MAP_WIDTH-4) 20 HORIZONTAL_ALIGN_USER_CENTER VERTICAL_ALIGN_USER_CENTER - forecolor 0 0 0 (MAP_ALPHA+0.2) - background "white" - visible 1 - decoration - } - - itemDef - { - name "map_map" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - background "compass_map_default" - ownerdraw CG_PLAYER_FULLMAP_MAP - visible 1 - decoration - } - - itemDef - { - name "map_bottom_black_bar" - style WINDOW_STYLE_SHADER - rect -98 273 (FULL_SCREEN_MAP_WIDTH-4) 20 HORIZONTAL_ALIGN_USER_CENTER VERTICAL_ALIGN_USER_CENTER - forecolor 0 0 0 (MAP_ALPHA+0.2) - background "white" - visible 1 - decoration - } - - // Friendly Compass scrambler indicator - itemDef - { - name "compass_map_scrambler_friendlies_locationSelector" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - ownerdraw CG_PLAYER_FULLMAP_SCRAMBLER_FRIENDLY - visible 1 - decoration - } - - // Static - itemDef - { - name "pause_map_static" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 1 - background "compass_static" - ownerdraw CG_PLAYER_FULLMAP_STATIC - visible 1 - decoration - } - - - // Grid - itemDef - { - name "map_grid" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 (MAP_ALPHA*0.75) - background "map_grid_square" - ownerdraw CG_PLAYER_FULLMAP_GRID - visible 1 - decoration - } - - itemDef - { - name "grid_points" - type ITEM_TYPE_OWNERDRAW_TEXT - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 (MAP_ALPHA*0.75) - textalign ITEM_ALIGN_MIDDLE_CENTER - textstyle ITEM_TEXTSTYLE_SHADOWED - textscale 0.3 - ownerdraw CG_PLAYER_FULLMAP_GRID_POINTS - visible 1 - decoration - } - - // Vehicles - itemDef - { - name "mapvehicles" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - ownerdraw CG_PLAYER_FULLMAP_VEHICLES - visible 1 - } - - // Helicopter - itemDef - { - name "mapvehicles" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - ownerdraw CG_PLAYER_FULLMAP_HELICOPTER - visible 1 - } - - // Objective pointers - itemDef - { - name "mappointers" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - background "objective_line" - ownerdraw CG_PLAYER_FULLMAP_POINTERS - visible 1 - decoration - } - // Friendlies pointers - itemDef - { - name "mapfriendlies" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - ownerdraw CG_PLAYER_FULLMAP_FRIENDS - visible 1 - } - // Enemies pointers - itemDef - { - name "mapenemies" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - ownerdraw CG_PLAYER_FULLMAP_ENEMIES - visible 1 - } - - // Fake fire pointers - itemDef - { - name "mapfakefire" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - ownerdraw CG_PLAYER_FULLMAP_FAKE_FIRE - visible 1 - } - - // Static - itemDef - { - name "mapscrambler" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - background "compass_static" - ownerdraw CG_PLAYER_FULLMAP_SCRAMBLER - visible 1 - } - - itemDef - { - name "map_locator" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - background "compass_map_default" - ownerdraw CG_PLAYER_FULLMAP_LOCATION_SELECTOR - visible 1 - visibilityBits bits( BIT_SELECTING_LOCATIONAL_KILLSTREAK ) - decoration - } - - // Player direction indicator - itemDef - { - name "mapplayer" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - background "compassping_player" - ownerdraw CG_PLAYER_FULLMAP_PLAYER - visible 1 - } - - // Artillery Icon - itemDef - { - name "mapartilleryicon" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - ownerdraw CG_PLAYER_FULLMAP_ARTILLERY_ICON - visible 1 - } - - // Dogs - itemDef - { - name "mapdogs" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - ownerdraw CG_PLAYER_FULLMAP_DOGS - visible 1 - } - - // Turrets - itemDef - { - name "mapturrets" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - ownerdraw CG_PLAYER_FULLMAP_TURRETS - visible 1 - } - - //Guided Missiles - itemDef - { - name "mapguidedmissiles" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - ownerdraw CG_PLAYER_FULLMAP_GUIDED_MISSILE - visible 1 - } - - // Radar lines - itemDef - { - name "mapradareffects" - type ITEM_TYPE_OWNERDRAW - rect 0 0 FULL_SCREEN_MAP_WIDTH FULL_SCREEN_MAP_HEIGHT - forecolor 1 1 1 MAP_ALPHA - ownerdraw CG_PLAYER_FULLMAP_RADAR_EFFECTS - visible 1 - decoration - } - - // instruction - itemDef - { - name "airstrikeinstruction" - type ITEM_TYPE_TEXT - rect -90 290 20 20 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_NORMAL - textscale 0.3 - forecolor 1 1 1 MAP_TEXT_ALPHA - text "@PLATFORM_PRESS_TO_SET_AIRSTRIKE" - visible when( IsSelectingAirstrike() ); - decoration - } - - // instruction - itemDef - { - name "artilleryinstruction" - type ITEM_TYPE_TEXT - rect -90 290 20 20 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_NORMAL - textscale 0.3 - forecolor 1 1 1 MAP_TEXT_ALPHA - text "@PLATFORM_PRESS_TO_SET_ARTILLERY" - visible when( IsSelectingArtillery() ); - decoration - } - - // instruction - itemDef - { - name "napalminstruction" - type ITEM_TYPE_TEXT - rect -90 290 20 20 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_NORMAL - textscale 0.3 - forecolor 1 1 1 MAP_TEXT_ALPHA - text "@PLATFORM_PRESS_TO_SET_NAPALM" - visible when( IsSelectingNapalm() ); - decoration - } - // instruction - itemDef - { - name "comlinkinstruction" - type ITEM_TYPE_TEXT - rect -90 290 20 20 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_NORMAL - textscale 0.3 - forecolor 1 1 1 MAP_TEXT_ALPHA - text "@PLATFORM_PRESS_TO_SET_COMLINK" - visible when( IsSelectingComlink() ); - decoration - } - - // instruction - itemDef - { - name "mortarStrikesLeft" - type ITEM_TYPE_TEXT - rect -90 290 20 20 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_NORMAL - textscale 0.3 - forecolor 1 1 1 MAP_TEXT_ALPHA - exp text( locString( "@PLATFORM_PRESS_TO_SET_MORTAR", dvarint( mortarStrikesLeft ) ) ); - visible when( IsSelectingMortar() && dvarint( mortarStrikesLeft ) ); - decoration - } - - itemDef - { - name "squadback" - type ITEM_TYPE_TEXT - rect 245 290 20 20 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_RIGHT - textfont UI_FONT_NORMAL - textscale 0.3 - forecolor 1 1 1 MAP_TEXT_ALPHA - text "@PLATFORM_SQUAD_BACK" - visible 1 - decoration - } - - itemDef - { - name "MapName" - type ITEM_TYPE_TEXT - rect -90 -98 100 100 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_NORMAL - textscale 0.4 - forecolor 1 1 1 MAP_TEXT_ALPHA - exp text ( "@"+tablelookup("mp/mapsTable.csv",0,dvarString(mapname),3) ); - visible 1 - decoration - } - } - - #define KILLCAMBARS( BARSNAME, COLOR, VISIBLEWHEN, VISIBILITY_BITS ) \ - menuDef \ - { \ - name BARSNAME \ - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN \ - fullScreen 0 \ - visible VISIBLEWHEN; \ - visibilityBits bits( VISIBILITY_BITS ) \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER \ - rect 0 0 640 112 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN \ - background "white" \ - forecolor COLOR \ - visible 1 \ - decoration \ - } \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER \ - rect 0 112 640 22 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN \ - background "white" \ - forecolor COLOR \ - visible when( dvarInt( xblive_basictraining ) ); \ - decoration \ - } \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER \ - rect 0 368 640 112 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN \ - background "white" \ - forecolor COLOR \ - visible 1 \ - decoration \ - } \ - } - - KILLCAMBARS( "killcam", .49 .05 .03 0.5, 1, BIT_IN_KILLCAM !BIT_FINAL_KILLCAM !BIT_ROUND_END_KILLCAM ) - KILLCAMBARS( "killcam_final", 0 0 0 0.5, when ( isVisibilityBitSet( BIT_FINAL_KILLCAM ) || isVisibilityBitSet( BIT_ROUND_END_KILLCAM ) ), BIT_IN_KILLCAM ) - - #define KILLCAMTEXT( TEXTNAME, TEXTDISPLAY, VISIBILITY_BITS ) \ - menuDef \ - { \ - name TEXTNAME \ - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN \ - fullScreen 0 \ - visible 1 \ - visibilityBits bits( VISIBILITY_BITS ) \ - itemDef \ - { \ - type ITEM_TYPE_TEXT \ - rect 0 55 1 1 HORIZONTAL_ALIGN_USER_CENTER VERTICAL_ALIGN_TOP \ - origin 0 0 \ - exp text ( TEXTDISPLAY ); \ - forecolor 1 1 1 0.2 \ - textfont UI_FONT_EXTRABIG \ - textscale TEXTSIZE_LARGEST \ - textalign ITEM_ALIGN_CENTER \ - visible when( !USE_SMALLER_FONT ) \ - decoration \ - } \ - itemDef \ - { \ - type ITEM_TYPE_TEXT \ - rect 0 55 1 1 HORIZONTAL_ALIGN_USER_CENTER VERTICAL_ALIGN_TOP \ - origin 0 0 \ - exp text ( TEXTDISPLAY ); \ - forecolor 1 1 1 0.2 \ - textfont UI_FONT_EXTRABIG \ - textscale ( TEXTSIZE_LARGEST * FOREIGN_LANGUAGE_MULTIPLIER ) \ - textalign ITEM_ALIGN_CENTER \ - visible when( USE_SMALLER_FONT ) \ - decoration \ - } \ - } - - KILLCAMTEXT( "killcam_text", "@MP_KILLCAM_CAPS", BIT_IN_KILLCAM !BIT_FINAL_KILLCAM !BIT_ROUND_END_KILLCAM !BIT_NEMESIS_KILLCAM ) - KILLCAMTEXT( "killcam_nemesis_text", "@MP_NEMESIS_KILLCAM_CAPS", BIT_IN_KILLCAM !BIT_FINAL_KILLCAM !BIT_ROUND_END_KILLCAM BIT_NEMESIS_KILLCAM ) - KILLCAMTEXT( "killcam_final_text", "@MP_FINAL_KILLCAM_CAPS", BIT_IN_KILLCAM BIT_FINAL_KILLCAM ) - KILLCAMTEXT( "killcam_end_round_text", "@MP_ROUND_END_KILLCAM", BIT_IN_KILLCAM BIT_ROUND_END_KILLCAM ) - - // Center obituary (you killed/were killed by) - menuDef - { - name "CenterObituary" - rect 0 170 0 0 HORIZONTAL_ALIGN_USER_CENTER VERTICAL_ALIGN_USER_CENTER - fullScreen 0 - visible 1 - - itemDef - { - name "chRect" - type ITEM_TYPE_OWNERDRAW_TEXT - rect 0 0 0 0 - exp rect Y( 0 - (ONLINEGAME * ONLINEGAME_OFFSET) ); - textscale TEXTSIZE_DEFAULT - textstyle ITEM_TEXTSTYLE_SHADOWED - ownerdraw CG_CENTER_MESSAGE - forecolor 1 1 1 HUD_ALPHA - visible 1 - decoration - } - } - - // game messages - menuDef - { - name "gamemessages" - rect 6 -75 10 10 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - fullScreen 0 - visibilityBits bits( !BIT_DEMO_ALL_GAME_HUD_HIDDEN !BIT_IN_KILLCAM !BIT_SPECTATING_CLIENT !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC !BIT_IS_WAGER_MATCH ) - - itemDef - { - rect 0 0 0 0 - exp rect Y( 0 - (ONLINEGAME * ONLINEGAME_OFFSET) ); - type ITEM_TYPE_GAME_MESSAGE_WINDOW - gamemsgwindowindex 0 - gamemsgwindowmode MODE_BOTTOMUP_ALIGN_BOTTOM - textfont UI_FONT_DEFAULT - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textscale TEXTSIZE_SMALL - visible 1 - visibilityBits bits( !BIT_UI_ACTIVE BIT_HUD_OBITUARIES ) - } - } - - menuDef - { - name "boldgamemessages" - rect 0 -65 10 10 HORIZONTAL_ALIGN_USER_CENTER VERTICAL_ALIGN_USER_CENTER - fullScreen 0 - visible 1 - visibilityBits bits( !BIT_DEMO_ALL_GAME_HUD_HIDDEN !BIT_DEMO_CAMERA_MODE_MOVIECAM !BIT_IN_KILLCAM ) - - itemDef - { - origin 0 0 - type ITEM_TYPE_GAME_MESSAGE_WINDOW - gamemsgwindowindex 1 - gamemsgwindowmode MODE_BOTTOMUP_ALIGN_BOTTOM - textfont UI_FONT_NORMAL - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_CENTER - textscale TEXTSIZE_DEFAULT - visible 1 - visibilityBits bits( !BIT_UI_ACTIVE BIT_HUD_OBITUARIES ) - } - } - - // debug hit location - menuDef - { - name "hitloc" - rect 0 0 0 0 HORIZONTAL_ALIGN_USER_RIGHT VERTICAL_ALIGN_USER_BOTTOM - - fullScreen 0 - visible when( dvarint( "ui_hidehitlocs" ) == 0 ) - - #define HITLOCSINGLE( INDEX, YPOS ) \ - itemDef \ - { \ - type ITEM_TYPE_TEXT \ - rect 0 -50 1 1 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_BOTTOM \ - origin 0 YPOS \ - exp text ( dvarstring( "ui_hitloc_damage_" + INDEX ) ); \ - textfont UI_FONT_NORMAL \ - textscale 0.3 \ - textalign ITEM_ALIGN_RIGHT \ - textstyle ITEM_TEXTSTYLE_SHADOWEDMORE \ - visible when ( dvarstring( "ui_hitloc_" + INDEX ) != "" ) \ - decoration \ - } \ - itemDef \ - { \ - type ITEM_TYPE_TEXT \ - rect -30 -50 1 1 HORIZONTAL_ALIGN_USER_RIGHT VERTICAL_ALIGN_USER_BOTTOM \ - origin 0 YPOS \ - exp text ( dvarstring( "ui_hitloc_" + INDEX ) ); \ - textfont UI_FONT_NORMAL \ - textscale 0.3 \ - textalign ITEM_ALIGN_RIGHT \ - textstyle ITEM_TEXTSTYLE_SHADOWEDMORE \ - visible 1 \ - decoration \ - } - - HITLOCSINGLE( 0, 0 ) - HITLOCSINGLE( 1, -15 ) - HITLOCSINGLE( 2, -30 ) - HITLOCSINGLE( 3, -45 ) - HITLOCSINGLE( 4, -60 ) - HITLOCSINGLE( 5, -75 ) - } - - // Safe area - menuDef - { - name "safeareaa" - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - fullScreen 0 - visible 1 - - #include "ui/safearea.menu" - } - - menuDef - { - name "deadscreen" - fullScreen 0 - rect 0 0 640 480 - focusColor COLOR_FOCUSED - soundloop "" - visible 1 - - // Death quote - itemDef - { - name quote - type ITEM_TYPE_OWNERDRAW_TEXT - dvar "ui_deadquote" - textscale TEXTSIZE_DEFAULT - textstyle ITEM_TEXTSTYLE_SHADOWED - rect 80 200 480 20 - textalign ITEM_ALIGN_CENTER - textaligny 0 // point to center around - textalignx 0 // point to center around - ownerdraw CG_DEADQUOTE - forecolor 1 1 1 1 - visible 1 - decoration - } - - itemDef - { - name hud_grenadeicon - rect 315 300 60 60 - origin 0 0 - style WINDOW_STYLE_SHADER - background "hud_grenadeicon" - dvartest "ui_grenade_death" - showdvar { "1" } - visible 1 - decoration - } - - itemDef - { - name hud_grenadepointer - rect 320 270 50 25 - origin 0 0 - style WINDOW_STYLE_SHADER - background "hud_grenadepointer" - dvartest "ui_grenade_death" - showdvar { "1" } - visible 1 - decoration - } - } - - // Target highlights - menuDef - { - name "target_highlights" - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - fullScreen 0 - visible 1 - - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect 0 0 640 480 - forecolor 1 1 1 1 - background "compassping_enemysatellite_diamond" - ownerdraw CG_PLAYER_TARGET_HIGHLIGHTS - visible 1 - visibilityBits bits( !BIT_DEMO_CAMERA_MODE_THIRDPERSON !BIT_DEMO_CAMERA_MODE_MOVIECAM !BIT_SPECTATING_CLIENT !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC ) - decoration - } - } - menuDef - { - name "target_highlights_friendly" - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - fullScreen 0 - visible 1 - - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect 0 0 640 480 - forecolor 1 1 1 1 - background "compassping_yousatellite_diamond" - ownerdraw CG_PLAYER_TARGET_HIGHLIGHTS_FRIENDLY - visible 1 - visibilityBits bits( !BIT_DEMO_CAMERA_MODE_THIRDPERSON !BIT_DEMO_CAMERA_MODE_MOVIECAM !BIT_SPECTATING_CLIENT !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC ) - decoration - } - } - - menuDef - { - name "target_highlights_guided_missile" - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - fullScreen 0 - visible 1 - - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect 0 0 640 480 - forecolor 1 1 1 1 - background "compassping_enemysatellite_diamond" - ownerdraw CG_PLAYER_TARGET_HIGHLIGHTS_GUIDED_MISSILE - visible 1 - visibilityBits bits( !BIT_DEMO_CAMERA_MODE_THIRDPERSON !BIT_DEMO_CAMERA_MODE_MOVIECAM !BIT_SPECTATING_CLIENT BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC ) - decoration - } - } - menuDef - { - name "target_highlights_friendly_guided_missile" - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - fullScreen 0 - visible 1 - - itemDef - { - type ITEM_TYPE_OWNERDRAW - rect 0 0 640 480 - forecolor 1 1 1 1 - background "compassping_yousatellite_diamond" - ownerdraw CG_PLAYER_TARGET_HIGHLIGHTS_FRIENDLY - visible 1 - visibilityBits bits( !BIT_DEMO_CAMERA_MODE_THIRDPERSON !BIT_DEMO_CAMERA_MODE_MOVIECAM !BIT_SPECTATING_CLIENT BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC ) - decoration - } - } - - // Guided Missile Fuel - menuDef - { - name "missile_fuel" - rect 182 -122 150 10 HORIZONTAL_ALIGN_USER_CENTER VERTICAL_ALIGN_USER_CENTER - fullScreen 0 - visible 1 - visibilityBits bits( !BIT_IN_KILLCAM !BIT_DEMO_CAMERA_MODE_THIRDPERSON !BIT_DEMO_CAMERA_MODE_MOVIECAM !BIT_SPECTATING_CLIENT BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC ) - - itemDef - { - style WINDOW_STYLE_SHADER - rect 0 0 13 224 - //origin -76 169 - forecolor 0.4 0.4 0.4 0.5 - background "menu_white_line" - visible 1 - decoration - } - - itemDef - { - name "fuel_bar" - type ITEM_TYPE_OWNERDRAW - rect 0 0 13 224 - ownerdraw CG_PLAYER_GUIDED_MISSILE_FUEL - visible 1 - forecolor 1 1 1 1 - background "menu_white_line" - decoration - } - } -} diff --git a/mods/patch_mp/ui_mp/hud_team.menu b/mods/patch_mp/ui_mp/hud_team.menu deleted file mode 100644 index 4a3a677..0000000 --- a/mods/patch_mp/ui_mp/hud_team.menu +++ /dev/null @@ -1,315 +0,0 @@ -// CONSOLE HUD - MP - -#include "ui/menudef.h" -#include "ui/framestyle.inc" -#include "ui_mp/hud_gametypes.inc" - -#define BAR_START_X 42 -#define BAR_START_Y -42 -#define BAR_HEIGHT 39 -#define BAR_WIDTH 143 -#define BAR_HEIGHT_TOP 20 -#define BAR_HEIGHT_BOTTOM 16 - -#define BAR_PERCENT_TEAM ( max( team( score ), 0 ) / dvarInt( "ui_scorelimit" ) ) -#define BAR_PRECENT_OTHERTEAM ( max( otherteam( score ), 0 ) / dvarInt( "ui_scorelimit" ) ) - -#define FSM_VISIBILITY ( isVisibilityBitSet( BIT_SELECTING_LOCATION ) && !isVisibilityBitSet( BIT_SPECTATING_CLIENT ) && !isVisibilityBitSet( BIT_SCOREBOARD_OPEN ) ) - -{ - menuDef - { - name "scorebars_team_background" - rect BOTTOM_RECT_X BOTTOM_RECT_Y 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - exp rect Y( BOTTOM_RECT_Y - (ONLINEGAME * ONLINEGAME_OFFSET) ); - fullScreen 0 - visible when( !FSM_VISIBILITY ) - visibilityBits bits( BIT_HUD_VISIBLE !BIT_IN_KILLCAM !BIT_UI_ACTIVE HUD_VISIBILITY !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC SHOULD_DISPLAY_SCOREBAR ) - - #define BG_OFFSET_X (-15) - #define BG_OFFSET_Y (-5) - #define BG_START_X (BAR_START_X+BG_OFFSET_X) - #define BG_START_Y (BAR_START_Y+BG_OFFSET_Y) - - // score background - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect BG_START_X BG_START_Y 187 46 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp material( "hud_frame_faction_fade" ); - forecolor 1 1 1 0.5 - visible 1 - decoration - } - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect (BAR_START_X-69) (BG_START_Y-14) 240 59 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp material( "hud_frame_faction_lines" ); - forecolor 1 1 1 0.4 - visible 1 - decoration - } - - #define PROGRESS_OFFSET_X 47 - - // Player team progress bar - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect BAR_START_X -42 70 BAR_HEIGHT_TOP HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp rect W( PROGRESS_OFFSET_X + (BAR_WIDTH-PROGRESS_OFFSET_X) * BAR_PERCENT_TEAM ); - exp material( "hud_score_progress" ); - forecolor 0.42 0.68 0.46 0.8 - visible when( dvarInt( "ui_scorelimit" ) != 0 && team( score ) > 0 ) - decoration - } - - // Other team progress bar - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect BAR_START_X -20 70 BAR_HEIGHT_BOTTOM HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp rect W( PROGRESS_OFFSET_X + (BAR_WIDTH-PROGRESS_OFFSET_X) * BAR_PRECENT_OTHERTEAM ); - exp material( "hud_score_progress" ); - forecolor 0.73 0.29 0.19 0.8 - visible when( dvarInt( "ui_scorelimit" ) != 0 && otherteam( score ) > 0 ) - decoration - } - - // FACTION ICONS - #define FACTION_ICON_WIDTH 64 - #define FACTION_ICON_HEIGHT FACTION_ICON_WIDTH - #define FACTION_BG_WIDTH 92 - #define FACTION_BG_HEIGHT FACTION_BG_WIDTH - #define FACTION_BG_X_START (BAR_START_X-(FACTION_BG_WIDTH/2)) - #define FACTION_BG_Y_START (BAR_START_Y-(FACTION_BG_HEIGHT/2)) - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect FACTION_BG_X_START FACTION_BG_Y_START FACTION_BG_WIDTH FACTION_BG_HEIGHT HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp material( "hud_faction_back_light" ); - forecolor 1 1 1 0.25 - visible 1 - decoration - } - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect FACTION_BG_X_START FACTION_BG_Y_START FACTION_BG_WIDTH FACTION_BG_HEIGHT HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp material( "hud_faction_backing" ); - forecolor 1 1 1 0.2 - visible 1 - decoration - } - - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect (FACTION_BG_X_START+9) (FACTION_BG_Y_START+20) FACTION_ICON_WIDTH FACTION_ICON_HEIGHT HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - origin 5 -5 - exp material( dvarString( "g_TeamIcon_Allies" ) ); - visible when( team( name ) == "TEAM_ALLIES" ); - forecolor 1 1 1 1 - decoration - } - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect (FACTION_BG_X_START+9) (FACTION_BG_Y_START+20) FACTION_ICON_WIDTH FACTION_ICON_HEIGHT HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - origin 5 -5 - exp material( dvarString( "g_TeamIcon_Axis" ) ); - visible when( team( name ) == "TEAM_AXIS" ); - forecolor 1 1 1 1 - decoration - } - - } - - #define SCORE_OFFSET_X (PROGRESS_OFFSET_X-12) - #define SCORE_START_X (BAR_START_X+SCORE_OFFSET_X) - #define SCORE_COLOR 1 1 1 - menuDef - { - name "scorebars_team_scores" - rect BOTTOM_RECT_X BOTTOM_RECT_Y 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - exp rect Y( BOTTOM_RECT_Y - (ONLINEGAME * ONLINEGAME_OFFSET) ); - fullScreen 0 - visible when( !FSM_VISIBILITY && ( isVisibilityBitSet( BIT_TEAM_ALLIES ) || isVisibilityBitSet( BIT_TEAM_AXIS ) ) ); - visibilityBits bits( BIT_HUD_VISIBLE !BIT_IN_KILLCAM !BIT_UI_ACTIVE HUD_VISIBILITY !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC SHOULD_DISPLAY_SCOREBAR ) - - // draws TEAM score - itemDef - { - type ITEM_TYPE_TEXT - rect (SCORE_START_X-2) -23 24 24 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp rect X( SCORE_START_X + ( (BAR_WIDTH-PROGRESS_OFFSET_X) * BAR_PERCENT_TEAM ) ); - exp text( team( score ) ); - textfont UI_FONT_EXTRABIG - textscale TEXTSIZE_LARGE - textalign ITEM_ALIGN_CENTER - textstyle ITEM_TEXTSTYLE_SHADOWEDMORE - forecolor SCORE_COLOR 1 - visible 1 - decoration - } - // Top Arrow - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect SCORE_START_X -53 24 24 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp rect X( SCORE_START_X + ( (BAR_WIDTH-PROGRESS_OFFSET_X) * BAR_PERCENT_TEAM ) ); - exp material( "hud_frame_arrow" ); - forecolor 1 1 1 0.8 - visible 1 - decoration - } - #define OT_SCORE_START_X (SCORE_START_X+2) - // OTHER TEAM score - itemDef - { - type ITEM_TYPE_TEXT - rect (OT_SCORE_START_X-2) -7 20 20 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp rect X( OT_SCORE_START_X + ( (BAR_WIDTH-PROGRESS_OFFSET_X) * BAR_PRECENT_OTHERTEAM ) ); - exp text( otherteam( score ) ); - textfont UI_FONT_EXTRABIG - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_CENTER - textstyle ITEM_TEXTSTYLE_SHADOWEDMORE - forecolor SCORE_COLOR 1 - visible 1 - decoration - } - // Bottom Arrow - itemDef - { - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect OT_SCORE_START_X -16 20 (-20) HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp rect X( OT_SCORE_START_X + ( (BAR_WIDTH-PROGRESS_OFFSET_X) * BAR_PRECENT_OTHERTEAM ) ); - exp material( "hud_frame_arrow" ); - forecolor 1 1 1 0.8 - visible 1 - decoration - } - } - - #define STATUS_TIME 5 - #define STATUS_TIME_MOD 30 - #define STATUS_FONT UI_FONT_EXTRABIG - #define STATUS_TEXT_SCALE TEXTSIZE_DEFAULT - #define STATUS_START_X (BAR_START_X+(FACTION_BG_WIDTH/2)-4) - #define STATUS_START_Y (BAR_START_Y-2) - // Score Bar - menuDef - { - name "scorebar_game_status" - rect BOTTOM_RECT_X BOTTOM_RECT_Y 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - exp rect Y( BOTTOM_RECT_Y - (ONLINEGAME * ONLINEGAME_OFFSET) ); - fullScreen 0 - visible when ( !FSM_VISIBILITY && ( (team( name ) == "TEAM_ALLIES" || team( name ) == "TEAM_AXIS") ) ); - visibilityBits bits( BIT_HUD_VISIBLE !BIT_UI_ACTIVE !BIT_BOMB_TIMER !BIT_BOMB_TIMER_A !BIT_BOMB_TIMER_B !BIT_DEMO_CAMERA_MODE_MOVIECAM !BIT_DEMO_ALL_GAME_HUD_HIDDEN !BIT_IN_KILLCAM HUD_VISIBILITY !BIT_IN_GUIDED_MISSILE !BIT_IN_GUIDED_MISSILE_STATIC !BIT_SCOREBOARD_OPEN ) - - #define IS_WINNING ( team( score ) > otherteam( score ) && ((timeLeft() / 1000) % STATUS_TIME_MOD > STATUS_TIME) ) - // winning highlight - //itemDef - //{ - // style WINDOW_STYLE_SHADER - // type ITEM_TYPE_IMAGE - // rect (STATUS_START_X-5) (BAR_START_Y-15) 16 16 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - // exp material( "hud_score_back" ); - // exp rect W( getTextWidth( locString( "@MENU_WINNING_CAPS" ), STATUS_FONT, STATUS_TEXT_SCALE )+10 ); - // forecolor 0.3 1 0.3 0.2 - // visible when( IS_WINNING ); - // decoration - //} - itemDef - { - type ITEM_TYPE_TEXT - rect STATUS_START_X STATUS_START_Y 1 1 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - text "@MENU_WINNING_CAPS" - textfont STATUS_FONT - textscale STATUS_TEXT_SCALE - textalign ITEM_ALIGN_LEFT - textstyle ITEM_TEXTSTYLE_SHADOWEDMORE - forecolor NEW_FRAME_GREEN_RGB 1 - visible when( IS_WINNING ); - decoration - } - #define IS_LOSING ( team( score ) < otherteam( score ) && ((timeLeft() / 1000) % STATUS_TIME_MOD > STATUS_TIME) ) - // losing highlight - //itemDef - //{ - // style WINDOW_STYLE_SHADER - // type ITEM_TYPE_IMAGE - // rect (STATUS_START_X-5) (BAR_START_Y-15) 16 16 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - // exp material( "hud_score_back" ); - // exp rect W( getTextWidth( locString( "@MENU_LOSING_CAPS" ), STATUS_FONT, STATUS_TEXT_SCALE )+10 ); - // forecolor 1 0.3 0.3 0.2 - // visible when( IS_LOSING ); - // decoration - //} - itemDef - { - type ITEM_TYPE_TEXT - rect STATUS_START_X STATUS_START_Y 1 1 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - text "@MENU_LOSING_CAPS" - textfont STATUS_FONT - textscale STATUS_TEXT_SCALE - textalign ITEM_ALIGN_LEFT - textstyle ITEM_TEXTSTYLE_SHADOWEDMORE - forecolor NEW_FRAME_RED_RGB 1 - visible when( IS_LOSING ) - decoration - } - #define IS_TIED ( team( score ) == otherteam( score ) && ((timeLeft() / 1000) % STATUS_TIME_MOD > STATUS_TIME) ) - // tied highlight - //itemDef - //{ - // style WINDOW_STYLE_SHADER - // type ITEM_TYPE_IMAGE - // rect (STATUS_START_X-3) (BAR_START_Y-15) 16 16 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - // exp material( "hud_score_back" ); - // exp rect W( getTextWidth( locString( "@MENU_TIED_CAPS" ), STATUS_FONT, STATUS_TEXT_SCALE )+8 ); - // forecolor 1 1 0.3 0.2 - // visible when( IS_TIED ); - // decoration - //} - itemDef - { - type ITEM_TYPE_TEXT - rect STATUS_START_X STATUS_START_Y 1 1 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - text "@MENU_TIED_CAPS" - textfont STATUS_FONT - textscale STATUS_TEXT_SCALE - textalign ITEM_ALIGN_LEFT - textstyle ITEM_TEXTSTYLE_SHADOWEDMORE - forecolor NEW_FRAME_YELLOW_RGB 1 - visible when( IS_TIED ) - decoration - } - #define SHOW_GAMETYPE ( ((timeLeft() / 1000) % STATUS_TIME_MOD <= STATUS_TIME ) ) - itemDef - { - type ITEM_TYPE_TEXT - rect STATUS_START_X STATUS_START_Y 1 1 HORIZONTAL_ALIGN_USER_LEFT VERTICAL_ALIGN_USER_BOTTOM - exp text( toUpper( gameTypeName() ) ); - textfont STATUS_FONT - textscale STATUS_TEXT_SCALE - textalign ITEM_ALIGN_LEFT - textstyle ITEM_TEXTSTYLE_SHADOWEDMORE - forecolor SCORE_COLOR 1 - visible when( SHOW_GAMETYPE ) - decoration - } - } -} diff --git a/mods/patch_mp/ui_mp/main.menu b/mods/patch_mp/ui_mp/main.menu deleted file mode 100644 index ea6ec90..0000000 --- a/mods/patch_mp/ui_mp/main.menu +++ /dev/null @@ -1,830 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" - -#define BUTTON_BG_WIDTH 180 -#define BUTTON_BG_Y_START 5 - -#define CHOICE_X_START -258 -#define CHOICE_Y_START BUTTON_BG_Y_START + 35 - -#define CHOICE_GROUP "main" - -#define FLYOUT_NONE 0 -#define FLYOUT_LIVE 1 -#define FLYOUT_OPERATIONS 2 -#define FLYOUT_THEATER 3 - -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui_mp/friendslist.inc" -#include "ui_mp/stats_info.inc" - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X BUTTON_BG_WIDTH -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL -#undef CHOICE_Y_SPACING -#define CHOICE_Y_SPACING CHOICE_SIZE_Y - -#undef CHOICE_HORIZONTAL_ALIGN -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER - -#define FLYOUT_BG_COLOR 0 0 0 0.3 - -{ - assetGlobalDef - { - fadeClamp 1.0 // sets the fadeup alpha - fadeCycle 1 // how often fade happens in milliseconds - fadeAmount 0.1 // amount to adjust alpha per cycle - } - - menuDef - { - name "main" - fullScreen 1 - rect 0 0 640 480 - focusColor COLOR_FOCUSED - soundloop MENU_MUSIC - style WINDOW_STYLE_EMPTY - onOpen - { - uiScript stopRefresh; - open main_text; - } - onClose - { - } - onESC - { - } - } - -#define RESET_GAMEMODE_DVARS \ - setdvar xblive_basictraining 0; \ - setdvar xblive_privatematch 0; \ - setdvar xblive_wagermatch 0; \ - setdvar xblive_theater 0; \ - setdvar xblive_rankedmatch 0; - - menuDef - { - name "main_text" - fullScreen 1 - rect 0 0 640 480 - focusColor COLOR_FOCUSED - soundloop MENU_MUSIC - style WINDOW_STYLE_EMPTY - onOpen - { - setdvar ui_version_show "0"; - setLocalVarBool ui_centerPopup 0; - setdvar ui_bg_image ""; - RESET_GAMEMODE_DVARS - } - onFocus - { - setDvar ui_flyoutHasFocus FLYOUT_NONE; - } - - - itemDef - { - style WINDOW_STYLE_SHADER - rect FULLSCREEN_WIDE - background "menu_mp_background_main2" - forecolor 1 1 1 1 - visible 1 - decoration - } - - // lower corner glows - itemDef - { - style WINDOW_STYLE_SHADER - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN; - background "menu_mp_background_glow" - forecolor 0.384 0.725 0.725 0 - exp forecolor a ( ((sin(milliseconds()/1500) + 1) * 0.25) + 0.25 ) - visible 1 - decoration - } - itemDef - { - style WINDOW_STYLE_SHADER - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN; - background "menu_mp_background_glow" - forecolor 0.384 0.725 0.725 0 - exp forecolor a ( ((sin(milliseconds()/480) + 1) * 0.25) + 0.25 ) - visible 1 - decoration - } - - #undef THINFOG_SCROLL_TIME - #define THINFOG_SCROLL_TIME 50000 - itemDef - { - style WINDOW_STYLE_SHADER - rect -107 0 1708 480 - exp rect X((-961) + ((float(milliseconds() % THINFOG_SCROLL_TIME) / THINFOG_SCROLL_TIME) * (854))) - background "animbg_fogscrollthin" - forecolor 1 1 1 0.5 - visible 1 - decoration - } - #include "ui/bg.inc" - - - // cod:bo logo -#define LOGO_X_OFFSET 45 -#define LOGO_Y_OFFSET 70 - -#define LOGO_WIDTH 228 -#define LOGO_HEIGHT 107 - itemDef - { - visible 1 - rect (-LOGO_WIDTH - LOGO_X_OFFSET) (-LOGO_HEIGHT - LOGO_Y_OFFSET) LOGO_WIDTH LOGO_HEIGHT HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_BOTTOM - forecolor 1 1 1 1 - style WINDOW_STYLE_SHADER - background "menu_mp_background_logo" - decoration - } - -#define RESET_GAME_MODES \ - setdvar systemlink "0"; \ - setdvar splitscreen "0"; \ - setdvar onlinegame "1"; \ - setdvar xblive_privatematch "0"; \ - setdvar xblive_rankedmatch "0"; \ - setdvar xblive_wagermatch "0"; \ - setdvar xblive_clanmatch "0"; \ - setdvar xblive_theater "0"; \ - setdvar xblive_basictraining "0"; - -#define SIGN_IN_CMD exec "xsigninlive"; - -#define SETUP_SIGNIN \ - if( IsSignedInToLive() == 0 ) \ - { \ - SIGN_IN_CMD \ - open error_netconnect_popmenu; \ - } \ - elseif( isDemonwareFetchingDone() == 1 ) \ - { \ - execnow "setclientbeingused"; \ - if( !getDStat( "CacLoadouts", "resetWarningDislayed" ) ) \ - { \ - open customclassesreset; \ - } \ - else \ - { \ - open live_flyout; \ - execnow readFileShare; \ - } \ - } \ - else \ - { \ - open popup_connectingtodwhandler; \ - } - - - // ----------------- BEGIN Scroller -------------------------- - #include "ui/scroller.inc" - // ----------------- END Scroller ---------------------------- - -CHOICE_MENU_TITLE_CENTER_ALIGN_VIS( "@MENU_MULTIPLAYER_CAPS", ITEM_ALIGN_TOP_RIGHT, dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) -CHOICE_MENU_TITLE_CENTER_ALIGN_VIS( "@MENU_PLAY_CAPS", ITEM_ALIGN_TOP_RIGHT, dvarInt( ui_flyoutHasFocus ) == FLYOUT_LIVE ) -CHOICE_MENU_TITLE_CENTER_ALIGN_VIS( "@MENU_OPERATIONS_CAPS", ITEM_ALIGN_TOP_RIGHT, dvarInt( ui_flyoutHasFocus ) == FLYOUT_OPERATIONS ) -CHOICE_MENU_TITLE_CENTER_ALIGN_VIS( "@MPUI_THEATER_LOBBY_CAPS", ITEM_ALIGN_TOP_RIGHT, dvarInt( ui_flyoutHasFocus ) == FLYOUT_THEATER ) - - // ----------------- BEGIN Message of the day ------------------------ - // size version 1: 248 126 - - //#define INFO_TEXT dvarString( "motd" ) - //#define INFO_TITLE "@MPUI_MOTD" - - //#define MP_MOTD 1 - - //#include "ui_mp/info_box.inc" - // ----------------- END Message of the day -------------------------- - - // Menu items ------------------------------------------- - - // highlight when flyout is open - PREPROC_SHADER_DRAW_VIS_EX( CHOICE_ORIGIN( 1 ) (CHOICE_SIZE_X + 1) CHOICE_SIZE_Y CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", FLYOUT_BG_COLOR, when( dvarInt( ui_flyoutHasFocus ) == FLYOUT_LIVE );, ; ) - TEMP_CHOICE_BUTTON_VIS( 1, "@MENU_PLAY_CAPS", - SETUP_SIGNIN, - IsSignedInToLive() && ( dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE || dvarInt( ui_flyoutHasFocus ) == FLYOUT_LIVE ) ) - TEMP_CHOICE_BUTTON_VIS_DISABLED( 1, "@MENU_PLAY_CAPS", - SETUP_SIGNIN, - !IsSignedInToLive() && ( dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE || dvarInt( ui_flyoutHasFocus ) == FLYOUT_LIVE ) ) - // Gray text when flyout is open - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 1 ), 0 0, "@MENU_PLAY_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, NO_BG_DISABLED_COLOR, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE && dvarInt( ui_flyoutHasFocus ) != FLYOUT_LIVE ); ) - - -#define SETUP_OPERATIONS_FLYOUT \ - if( IsSignedInToLive() == 0 ) \ - { \ - SIGN_IN_CMD \ - open error_netconnect_popmenu; \ - } \ - elseif( isDemonwareFetchingDone() == 1 ) \ - { \ - execnow "setclientbeingused"; \ - open operations_flyout; \ - execnow readFileShare; \ - } \ - else \ - { \ - open popup_connectingtodwhandler; \ - } - - // highlight when flyout is open - PREPROC_SHADER_DRAW_VIS_EX( CHOICE_ORIGIN( 2 ) CHOICE_SIZE_X CHOICE_SIZE_Y CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", FLYOUT_BG_COLOR, when( dvarInt( ui_flyoutHasFocus ) == FLYOUT_OPERATIONS );, ; ) - TEMP_CHOICE_BUTTON_VIS( 2, "@MENU_OPERATIONS_CAPS", - SETUP_OPERATIONS_FLYOUT, - ( dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE || dvarInt( ui_flyoutHasFocus ) == FLYOUT_OPERATIONS ) ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 2 ), 0 0, "@MENU_OPERATIONS_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, NO_BG_DISABLED_COLOR, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE && dvarInt( ui_flyoutHasFocus ) != FLYOUT_OPERATIONS ); ) - -#define SETUP_THEATER_FLYOUT \ - if( IsSignedInToLive() == 0 ) \ - { \ - SIGN_IN_CMD \ - open error_netconnect_popmenu; \ - } \ - elseif( isDemonwareFetchingDone() == 1 ) \ - { \ - execnow "setclientbeingused"; \ - open theater_flyout; \ - execnow readFileShare; \ - } \ - else \ - { \ - open popup_connectingtodwhandler; \ - } - - // highlight when flyout is open - PREPROC_SHADER_DRAW_VIS_EX( CHOICE_ORIGIN( 3 ) CHOICE_SIZE_X CHOICE_SIZE_Y CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, "white", FLYOUT_BG_COLOR, when( dvarInt( ui_flyoutHasFocus ) == FLYOUT_THEATER );, ; ) - TEMP_CHOICE_BUTTON_VIS( 3, "@MPUI_THEATER_LOBBY_CAPS", - SETUP_THEATER_FLYOUT, - ( dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE || dvarInt( ui_flyoutHasFocus ) == FLYOUT_THEATER ) ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 3 ), 0 0, "@MPUI_THEATER_LOBBY_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, NO_BG_DISABLED_COLOR, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE && dvarInt( ui_flyoutHasFocus ) != FLYOUT_THEATER ); ) - - TEMP_CHOICE_BUTTON_VIS( 4, "@MENU_SETTINGS_CAPS", - open options_new_pc, - dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 4 ), 0 0, "@MENU_SETTINGS_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, NO_BG_DISABLED_COLOR, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE ); ) - - /*TEMP_CHOICE_BUTTON_VIS( 5, "@MENU_STORE_CAPS", - uiscript openurl "www.callofduty.com/game", - dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 5 ), 0 0, "@MENU_STORE_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, NO_BG_DISABLED_COLOR, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE ); )*/ - - TEMP_CHOICE_BUTTON_VIS( 5, "@MENU_MODS_CAPS", - open select_mod, - dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 5 ), 0 0, "@MENU_MODS_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, NO_BG_DISABLED_COLOR, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE ); ) - - TEMP_CHOICE_BUTTON_VIS( 6, "@MENU_MAIN_MENU_CAPS", - open single_popmenu, - dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 6 ), 0 0, "@MENU_MAIN_MENU_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, NO_BG_DISABLED_COLOR, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE ); ) - - TEMP_CHOICE_BUTTON_VIS( 7, "@MENU_QUIT_CAPS", - open quit_popmenu, - dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 7 ), 0 0, "@MENU_QUIT_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, NO_BG_DISABLED_COLOR, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE ); ) - - FRIENDS_BUTTON - } - - #define FADE_STATE( isLast, colorArg, menuName, nextName ) \ - state \ - { \ - name "FadeIn" \ - forecolor colorArg \ - \ - onEnter \ - { \ - execNow if( isLast != 1 ) ui_animate menuName nextName FadeIn (FLYOUT_TIME/FLYOUT_BUTTON_COUNT); \ - execNow if( isLast == 1 ) set ui_flownOut 1; \ - } \ - } - - #define FLYOUT_ARGS( isLast, menuName, colorArg, myName, nextName ) \ - name myName \ - FADE_STATE( isLast, colorArg, menuName, nextName ) - -#undef CHOICE_HORIZONTAL_ALIGN -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER -#undef CHOICE_VERTICAL_ALIGN -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_TOP - -#undef CHOICE_TEXTALIGN -#define CHOICE_TEXTALIGN ITEM_ALIGN_MIDDLE_LEFT - -#undef CHOICE_GROUP -#define CHOICE_GROUP "flyout" - -#define FLYOUT_TIME 200 -#define FLYOUT_BG_X_START ( -258 + BUTTON_BG_WIDTH + 1 ) -#define FLYOUT_BG_WIDTH 180 - -#undef CHOICE_X_START -#define CHOICE_X_START FLYOUT_BG_X_START - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X FLYOUT_BG_WIDTH - -#undef CHOICE_FOCUS_SOUND -#define CHOICE_FOCUS_SOUND "uin_navigation_submenu_over" - -#undef FLYOUT_BUTTON_COUNT -#define FLYOUT_BUTTON_COUNT 5 -#undef FLYOUT_FIRST_CHOICE_Y -#define FLYOUT_FIRST_CHOICE_Y 1 - -#define SETUP_ACTION_LOBBY \ - execNow "exec "XBOXLIVE_MP_CFG; - -menuDef - { - name live_flyout - rect 0 0 640 480 - focusColor COLOR_FOCUSED - soundloop MENU_MUSIC - control MENU_CONTROL_NO_GUESTS - - onOpen - { - execNow ui_animate live_flyout ButtonBackground Fly FLYOUT_TIME; - execNow ui_animate live_flyout FirstFlyout FadeIn (FLYOUT_TIME/FLYOUT_BUTTON_COUNT); - execNow set ui_flownOut 0; - setDvar ui_flyoutHasFocus FLYOUT_LIVE; - } - onESC { close self; } - onClose - { - execNow ui_animate live_flyout ButtonBackground Default 0; - execNow ui_animate live_flyout FirstFlyout Default 0; - execNow ui_animate live_flyout SecondFlyout Default 0; - execNow ui_animate live_flyout ThirdFlyout Default 0; - execNow ui_animate live_flyout FourthFlyout Default 0; - execNow ui_animate live_flyout FifthFlyout Default 0; - execNow set ui_flownOut 0; - setDvar ui_flyoutHasFocus FLYOUT_NONE; - } - - /* exit flyout button */ - itemDef - { - name "ExitFlyoutButton" - type ITEM_TYPE_BUTTON - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - visible 1 - action { close self; } - } - - /* button background */ - itemDef - { - name "ButtonBackground" - style WINDOW_STYLE_SHADER - rect FLYOUT_BG_X_START CHOICE_Y( FLYOUT_FIRST_CHOICE_Y ) FLYOUT_BG_WIDTH CHOICE_Y_SPACING CHOICE_HORIZONTAL_ALIGN VERTICAL_ALIGN_TOP - forecolor FLYOUT_BG_COLOR - background "white" - visible 1 - decoration - - state - { - name "Fly" - rect FLYOUT_BG_X_START CHOICE_Y( FLYOUT_FIRST_CHOICE_Y ) FLYOUT_BG_WIDTH ( CHOICE_Y_SPACING * FLYOUT_BUTTON_COUNT ) CHOICE_HORIZONTAL_ALIGN VERTICAL_ALIGN_TOP - } - } - - HINT_TEXT_ALL( (FLYOUT_BUTTON_COUNT + 1), (FLYOUT_BG_X_START + 10), 5, (FLYOUT_BG_WIDTH - 20), (dvarString( ui_lobby_desc )), 1 1 1 1, ( dvarInt( ui_flownOut ) == 1 ), ; ) - - #define SETUP_ACTION_SERVER_BROWSER \ - RESET_GAME_MODES \ - SETUP_ACTION_LOBBY \ - close self; \ - open server_browser_main; - - - TEMP_CHOICE_HIGHLIGHT_SOLID_WIDTH( FLYOUT_FIRST_CHOICE_Y, BG_HL_COLOR, FLYOUT_BG_WIDTH, dvarInt( ui_flownOut ) == 1 ) - TEMP_CHOICE_BUTTON_ALL( FLYOUT_FIRST_CHOICE_Y, "@MENU_SERVER_BROWSER_CAPS", - SETUP_ACTION_SERVER_BROWSER, - setDvar ui_lobby_desc "@MENU_SERVER_BROWSER_DESC";, - CLEARUIHINT, - 1 1 1 0, - dvarBool(ui_ethernetLinkActive), - FLYOUT_ARGS( 0, live_flyout, TEXT_COLOR_NO_HL, FirstFlyout, SecondFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( FLYOUT_FIRST_CHOICE_Y, "@MENU_SERVER_BROWSER_CAPS", TEXT_COLOR_HL, dvarInt( ui_flownOut ) == 1 ) - - #define SETUP_ACTION_RANKEDMATCH \ - RESET_GAME_MODES \ - SETUP_ACTION_LOBBY \ - close self; \ - exec "quickmatch"; - - TEMP_CHOICE_HIGHLIGHT_SOLID_WIDTH( 2, BG_HL_COLOR, FLYOUT_BG_WIDTH, dvarInt( ui_flownOut ) == 1 ) - TEMP_CHOICE_BUTTON_ALL( 2, "@MENU_RANKED_MATCH_CAPS", - SETUP_ACTION_RANKEDMATCH, - setDvar ui_lobby_desc "@MENU_RANKED_MATCH_DESC";, - CLEARUIHINT, - 1 1 1 0, - dvarBool(ui_ethernetLinkActive), - FLYOUT_ARGS( 0, live_flyout, TEXT_COLOR_NO_HL, SecondFlyout, ThirdFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( 2, "@MENU_RANKED_MATCH_CAPS", TEXT_COLOR_HL, dvarInt( ui_flownOut ) == 1 ) - - - #define SETUP_ACTION_WAGERMATCH \ - RESET_GAME_MODES \ - setDvar xblive_wagermatch "1"; \ - SETUP_ACTION_LOBBY \ - close self; \ - exec "wagermatch"; - - TEMP_CHOICE_HIGHLIGHT_SOLID_WIDTH( 3, BG_HL_COLOR, FLYOUT_BG_WIDTH, dvarInt( ui_flownOut ) == 1 ) - TEMP_CHOICE_BUTTON_ALL( 3, "@MPUI_WAGER_MATCH_CAPS", - SETUP_ACTION_WAGERMATCH, - setDvar ui_lobby_desc "@MPUI_WAGER_MATCH_DESC";, - CLEARUIHINT, - 1 1 1 0, - dvarBool(ui_ethernetLinkActive) && dvarBool(ui_mpWagerMatchEnabled), - FLYOUT_ARGS( 0, live_flyout, TEXT_COLOR_NO_HL, ThirdFlyout, FourthFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( 3, "@MPUI_WAGER_MATCH_CAPS", TEXT_COLOR_HL, dvarInt( ui_flownOut ) == 1 && dvarBool(ui_mpWagerMatchEnabled) ) - - - #define SETUP_ACTION_BASIC_TRAINING \ - RESET_GAME_MODES \ - setDvar onlinegame "1"; \ - setDvar xblive_basictraining "1"; \ - SETUP_ACTION_LOBBY \ - execNow "exec dvar_defaults.cfg"; \ - setDvar ui_mapname "mp_mountain"; \ - setDvar ui_gametype "tdm"; \ - close self; \ - open menu_xboxlive_basictraining; - - TEMP_CHOICE_HIGHLIGHT_SOLID_WIDTH( 4, BG_HL_COLOR, FLYOUT_BG_WIDTH, dvarInt( ui_flownOut ) == 1 ) - TEMP_CHOICE_BUTTON_ALL( 4, "@MPUI_BASICTRAINING_CAPS", - SETUP_ACTION_BASIC_TRAINING, - setDvar ui_lobby_desc "@MPUI_BASICTRAINING_DESC";, - CLEARUIHINT, - 1 1 1 0, - dvarBool(ui_ethernetLinkActive), - FLYOUT_ARGS( 0, live_flyout, TEXT_COLOR_NO_HL, FourthFlyout, FifthFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( 4, "@MPUI_BASICTRAINING_CAPS", TEXT_COLOR_HL, dvarInt( ui_flownOut ) == 1 ) - - #define SETUP_ACTION_PRIVATEMATCH \ - RESET_GAME_MODES \ - setDvar onlinegame "1"; \ - setDvar xblive_privatematch "1"; \ - SETUP_ACTION_LOBBY \ - setDvar ui_mapname "mp_mountain"; \ - setDvar ui_gametype "tdm"; \ - close self; \ - open menu_xboxlive_privatelobby; - - TEMP_CHOICE_HIGHLIGHT_SOLID_WIDTH( 5, BG_HL_COLOR, FLYOUT_BG_WIDTH, dvarInt( ui_flownOut ) == 1 ) - TEMP_CHOICE_BUTTON_ALL( 5, "@MPUI_CUSTOM_MATCH_CAPS", - SETUP_ACTION_PRIVATEMATCH, - setDvar ui_lobby_desc "@MPUI_CUSTOM_MATCH_DESC";, - CLEARUIHINT, - 1 1 1 0, - dvarBool(ui_ethernetLinkActive), - FLYOUT_ARGS( 1, live_flyout, TEXT_COLOR_NO_HL, FifthFlyout, NoFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( 5, "@MPUI_CUSTOM_MATCH_CAPS", TEXT_COLOR_HL, dvarInt( ui_flownOut ) == 1 ) - -} // live_flyout - -#undef FLYOUT_BUTTON_COUNT -#define FLYOUT_BUTTON_COUNT 4 - -#undef FLYOUT_FIRST_CHOICE_Y -#define FLYOUT_FIRST_CHOICE_Y 2 -menuDef - { - name operations_flyout - rect 0 0 640 480 - focusColor COLOR_FOCUSED - soundloop MENU_MUSIC - control MENU_CONTROL_NO_GUESTS - - onOpen - { - execNow ui_animate operations_flyout ButtonBackground Fly FLYOUT_TIME; - execNow ui_animate operations_flyout FirstFlyout FadeIn (FLYOUT_TIME/FLYOUT_BUTTON_COUNT); - execNow set ui_flownOut 0; - setDvar ui_flyoutHasFocus FLYOUT_OPERATIONS; - } - onESC { close self; } - onClose - { - execNow ui_animate operations_flyout ButtonBackground Default 0; - execNow ui_animate operations_flyout FirstFlyout Default 0; - execNow ui_animate operations_flyout SecondFlyout Default 0; - execNow ui_animate operations_flyout ThirdFlyout Default 0; - execNow ui_animate operations_flyout FourthFlyout Default 0; - execNow set ui_flownOut 0; - setDvar ui_flyoutHasFocus FLYOUT_NONE; - } - - /* exit flyout button */ - itemDef - { - name "ExitFlyoutButton" - type ITEM_TYPE_BUTTON - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - visible 1 - action { close self; } - } - - /* button background */ - itemDef - { - name "ButtonBackground" - style WINDOW_STYLE_SHADER - rect FLYOUT_BG_X_START CHOICE_Y( FLYOUT_FIRST_CHOICE_Y ) FLYOUT_BG_WIDTH CHOICE_Y_SPACING CHOICE_HORIZONTAL_ALIGN VERTICAL_ALIGN_TOP - forecolor FLYOUT_BG_COLOR - background "white" - visible 1 - decoration - - state - { - name "Fly" - rect FLYOUT_BG_X_START CHOICE_Y( FLYOUT_FIRST_CHOICE_Y ) FLYOUT_BG_WIDTH ( CHOICE_Y_SPACING * FLYOUT_BUTTON_COUNT ) CHOICE_HORIZONTAL_ALIGN VERTICAL_ALIGN_TOP - } - } - - HINT_TEXT_ALL( (FLYOUT_BUTTON_COUNT + FLYOUT_FIRST_CHOICE_Y), (FLYOUT_BG_X_START + 10), 5, (FLYOUT_BG_WIDTH - 20), (dvarString( ui_lobby_desc )), 1 1 1 1, ( dvarInt( ui_flownOut ) == 1 ), ; ) - - #define SETUP_ACTION_CREATEACLASS \ - close self; \ - if ( IsSignedInToLive() && areStatsFetched() && !IsGuest() ) \ - { \ - exec "set ui_cac_ingame 0"; \ - setdvar invite_visible "0"; \ - open cac_main; \ - } - - TEMP_CHOICE_HIGHLIGHT_SOLID_WIDTH( FLYOUT_FIRST_CHOICE_Y, BG_HL_COLOR, FLYOUT_BG_WIDTH, ( dvarInt( ui_flownOut ) == 1 && !IS_ITEM_LOCKED( "FEATURE_CREATE_A_CLASS" ) ) ) - TEMP_CHOICE_BUTTON_ALL( FLYOUT_FIRST_CHOICE_Y, "@MPUI_CREATE_A_CLASS_CAPS", - SETUP_ACTION_CREATEACLASS, - setDvar ui_lobby_desc "@MPUI_CAC_DESC";, - CLEARUIHINT, - 1 1 1 0, - !IS_ITEM_LOCKED( "FEATURE_CREATE_A_CLASS" ), - FLYOUT_ARGS( 0, operations_flyout, TEXT_COLOR_NO_HL, FirstFlyout, SecondFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( FLYOUT_FIRST_CHOICE_Y, "@MPUI_CREATE_A_CLASS_CAPS", TEXT_COLOR_HL, dvarInt( ui_flownOut ) == 1 && !IS_ITEM_LOCKED( "FEATURE_CREATE_A_CLASS" ) ) - TEMP_CHOICE_BUTTON_ALL( FLYOUT_FIRST_CHOICE_Y, "@MPUI_CREATE_A_CLASS_CAPS", - /*NO-OP*/;, - exec set ui_lobby_desc GET_UNLOCK_LEVEL_STRING( FEATURE_CREATE_A_CLASS );, - CLEARUIHINT, - 1 1 1 0, - IS_ITEM_LOCKED( "FEATURE_CREATE_A_CLASS" ), - FLYOUT_ARGS( 0, operations_flyout, NO_BG_DISABLED_COLOR, FirstFlyout, SecondFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( FLYOUT_FIRST_CHOICE_Y, "@MPUI_CREATE_A_CLASS_CAPS", NO_BG_DISABLED_COLOR, dvarInt( ui_flownOut ) == 1 && IS_ITEM_LOCKED( "FEATURE_CREATE_A_CLASS" ) ) - CHOICE_LOCKEDICON_VIS( FLYOUT_FIRST_CHOICE_Y, "menu_mp_lobby_locked", when( dvarInt( ui_flownOut ) == 1 && IS_ITEM_LOCKED( "FEATURE_CREATE_A_CLASS" ) ) ) - - #define SETUP_ACTION_CONTRACTS \ - close self; \ - if ( IsSignedInToLive() && areStatsFetched() && !IsGuest() ) \ - { \ - open menu_xboxlive_contracts; \ - } - - TEMP_CHOICE_HIGHLIGHT_SOLID_WIDTH( 3, BG_HL_COLOR, FLYOUT_BG_WIDTH, dvarInt( ui_flownOut ) == 1 && !IS_ITEM_LOCKED( FEATURE_CONTRACTS ) ) - TEMP_CHOICE_BUTTON_ALL( 3, "@MENU_CONTRACTS_CAPS", - SETUP_ACTION_CONTRACTS, - exec set ui_lobby_desc "@MPUI_CONTRACTS_DESC";, - CLEARUIHINT, - 1 1 1 0, - !IS_ITEM_LOCKED( FEATURE_CONTRACTS ), - FLYOUT_ARGS( 0, operations_flyout, TEXT_COLOR_NO_HL, SecondFlyout, ThirdFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( 3, "@MENU_CONTRACTS_CAPS", TEXT_COLOR_HL, dvarInt( ui_flownOut ) == 1 && !IS_ITEM_LOCKED( FEATURE_CONTRACTS ) ) - TEMP_CHOICE_BUTTON_ALL( 3, "@MENU_CONTRACTS_CAPS", - /*NO-OP*/;, - exec set ui_lobby_desc GET_UNLOCK_LEVEL_STRING( FEATURE_CONTRACTS );, - CLEARUIHINT, - 1 1 1 0, - IS_ITEM_LOCKED( FEATURE_CONTRACTS ), - FLYOUT_ARGS( 1, operations_flyout, NO_BG_DISABLED_COLOR, SecondFlyout, ThirdFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( 3, "@MENU_CONTRACTS_CAPS", NO_BG_DISABLED_COLOR, dvarInt( ui_flownOut ) == 1 && IS_ITEM_LOCKED( FEATURE_CONTRACTS ) ) - CHOICE_LOCKEDICON_VIS( 3, "menu_mp_lobby_locked", when( dvarInt( ui_flownOut ) == 1 && IS_ITEM_LOCKED( FEATURE_CONTRACTS ) ) ) - - #define SETUP_ACTION_KILLSTREAKS \ - close self; \ - if ( IsSignedInToLive() && areStatsFetched() && !IsGuest() ) \ - { \ - open menu_xboxlive_killstreaks; \ - } - - TEMP_CHOICE_HIGHLIGHT_SOLID_WIDTH( 4, BG_HL_COLOR, FLYOUT_BG_WIDTH, dvarInt( ui_flownOut ) == 1 && !IS_ITEM_LOCKED( FEATURE_KILLSTREAKS ) ) - TEMP_CHOICE_BUTTON_ALL( 4, "@MENU_KILLSTREAKS_CAPS", - SETUP_ACTION_KILLSTREAKS, - exec set ui_lobby_desc "@MPUI_KILLSTREAKS_DESC";, - CLEARUIHINT, - 1 1 1 0, - !IS_ITEM_LOCKED( FEATURE_KILLSTREAKS ), - FLYOUT_ARGS( 0, operations_flyout, TEXT_COLOR_NO_HL, ThirdFlyout, FourthFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( 4, "@MENU_KILLSTREAKS_CAPS", TEXT_COLOR_HL, dvarInt( ui_flownOut ) == 1 && !IS_ITEM_LOCKED( FEATURE_KILLSTREAKS ) ) - TEMP_CHOICE_BUTTON_ALL( 4, "@MENU_KILLSTREAKS_CAPS", - /*NO-OP*/;, - exec set ui_lobby_desc GET_UNLOCK_LEVEL_STRING( FEATURE_KILLSTREAKS );, - CLEARUIHINT, - 1 1 1 0, - IS_ITEM_LOCKED( FEATURE_KILLSTREAKS ), - FLYOUT_ARGS( 1, operations_flyout, NO_BG_DISABLED_COLOR, ThirdFlyout, FourthFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( 4, "@MENU_KILLSTREAKS_CAPS", NO_BG_DISABLED_COLOR, dvarInt( ui_flownOut ) == 1 && IS_ITEM_LOCKED( FEATURE_KILLSTREAKS ) ) - CHOICE_LOCKEDICON_VIS( 4, "menu_mp_lobby_locked", when( dvarInt( ui_flownOut ) == 1 && IS_ITEM_LOCKED( FEATURE_KILLSTREAKS ) ) ) - - // #define SETUP_ACTION_PLAYERCARD \ defined in ui_mp\friendslist.inc - - TEMP_CHOICE_HIGHLIGHT_SOLID_WIDTH( 5, BG_HL_COLOR, FLYOUT_BG_WIDTH, dvarInt( ui_flownOut ) == 1 ) - TEMP_CHOICE_BUTTON_ALL( 5, "@MENU_PLAYERCARD_CAPS", - close self; SETUP_ACTION_PLAYERCARD, - exec set ui_lobby_desc "@MPUI_PLAYERCARD_DESC";, - CLEARUIHINT, - 1 1 1 0, - 1, - FLYOUT_ARGS( 0, operations_flyout, TEXT_COLOR_NO_HL, FourthFlyout, NoFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( 5, "@MENU_PLAYERCARD_CAPS", TEXT_COLOR_HL, dvarInt( ui_flownOut ) == 1 ) - -} // operations_flyout - -#undef FLYOUT_BUTTON_COUNT -#define FLYOUT_BUTTON_COUNT 3 - -#undef FLYOUT_FIRST_CHOICE_Y -#define FLYOUT_FIRST_CHOICE_Y 3 -menuDef - { - name theater_flyout - rect 0 0 640 480 - focusColor COLOR_FOCUSED - soundloop MENU_MUSIC - control MENU_CONTROL_NO_GUESTS - - onOpen - { - execNow ui_animate theater_flyout ButtonBackground Fly FLYOUT_TIME; - execNow ui_animate theater_flyout FirstFlyout FadeIn (FLYOUT_TIME/FLYOUT_BUTTON_COUNT); - execNow set ui_flownOut 0; - setDvar ui_flyoutHasFocus FLYOUT_THEATER; - } - onESC { close self; } - onClose - { - execNow ui_animate theater_flyout ButtonBackground Default 0; - execNow ui_animate theater_flyout FirstFlyout Default 0; - execNow ui_animate theater_flyout SecondFlyout Default 0; - execNow ui_animate theater_flyout ThirdFlyout Default 0; - execNow set ui_flownOut 0; - setDvar ui_flyoutHasFocus FLYOUT_NONE; - } - - /* exit flyout button */ - itemDef - { - name "ExitFlyoutButton" - type ITEM_TYPE_BUTTON - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - visible 1 - action { close self; } - } - - /* button background */ - itemDef - { - name "ButtonBackground" - style WINDOW_STYLE_SHADER - rect FLYOUT_BG_X_START CHOICE_Y( FLYOUT_FIRST_CHOICE_Y ) FLYOUT_BG_WIDTH CHOICE_Y_SPACING CHOICE_HORIZONTAL_ALIGN VERTICAL_ALIGN_TOP - forecolor FLYOUT_BG_COLOR - background "white" - visible 1 - decoration - - state - { - name "Fly" - rect FLYOUT_BG_X_START CHOICE_Y( FLYOUT_FIRST_CHOICE_Y ) FLYOUT_BG_WIDTH ( CHOICE_Y_SPACING * FLYOUT_BUTTON_COUNT ) CHOICE_HORIZONTAL_ALIGN VERTICAL_ALIGN_TOP - } - } - - HINT_TEXT_ALL( (FLYOUT_BUTTON_COUNT + FLYOUT_FIRST_CHOICE_Y), (FLYOUT_BG_X_START + 10), 5, (FLYOUT_BG_WIDTH - 20), (dvarString( ui_lobby_desc )), 1 1 1 1, ( dvarInt( ui_flownOut ) == 1 ), ; ) - - #define SETUP_ACTION_FILESHARE \ - setdvar ui_theater_shortcut_pc 1; \ - close self; \ - open menu_fileshare_myshare; - - TEMP_CHOICE_HIGHLIGHT_SOLID_WIDTH( FLYOUT_FIRST_CHOICE_Y, BG_HL_COLOR, FLYOUT_BG_WIDTH, ( dvarInt( ui_flownOut ) == 1 ) ) - TEMP_CHOICE_BUTTON_ALL( FLYOUT_FIRST_CHOICE_Y, "@MENU_FILESHARE_MYSHARE_CAPS", - SETUP_ACTION_FILESHARE, - setDvar ui_lobby_desc "@MPUI_FILE_SHARE_DESC";, - CLEARUIHINT, - 1 1 1 0, - 1, - FLYOUT_ARGS( 0, theater_flyout, TEXT_COLOR_NO_HL, FirstFlyout, SecondFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( FLYOUT_FIRST_CHOICE_Y, "@MENU_FILESHARE_MYSHARE_CAPS", TEXT_COLOR_HL, dvarInt( ui_flownOut ) == 1 ) - - - #define SETUP_ACTION_RECENTGAMES \ - setdvar ui_theater_shortcut_pc 1; \ - close self; \ - open menu_fileshare_myrecentgames; - - TEMP_CHOICE_HIGHLIGHT_SOLID_WIDTH( 4, BG_HL_COLOR, FLYOUT_BG_WIDTH, dvarInt( ui_flownOut ) == 1 ) - TEMP_CHOICE_BUTTON_ALL( 4, "@MENU_FILESHARE_MYRECENTGAMES_CAPS", - SETUP_ACTION_RECENTGAMES, - exec set ui_lobby_desc "@MPUI_MY_RECENT_GAMES_DESC";, - CLEARUIHINT, - 1 1 1 0, - 1, - FLYOUT_ARGS( 0, theater_flyout, TEXT_COLOR_NO_HL, SecondFlyout, ThirdFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( 4, "@MENU_FILESHARE_MYRECENTGAMES_CAPS", TEXT_COLOR_HL, dvarInt( ui_flownOut ) == 1 ) - - #define SETUP_ACTION_COMMUNITY \ - if ( canShowContentFromUser( 0 ) ) \ - { \ - setdvar ui_theater_shortcut_pc 1; \ - close self; \ - open menu_fileshare_community; \ - } \ - else \ - { \ - open menu_community_viewwarning; \ - } - - TEMP_CHOICE_HIGHLIGHT_SOLID_WIDTH( 5, BG_HL_COLOR, FLYOUT_BG_WIDTH, dvarInt( ui_flownOut ) == 1 ) - TEMP_CHOICE_BUTTON_ALL( 5, "@MENU_FILESHARE_COMMUNITY_CAPS", - SETUP_ACTION_COMMUNITY, - exec set ui_lobby_desc "@MPUI_COMMUNITY_DESC";, - CLEARUIHINT, - 1 1 1 0, - 1, - FLYOUT_ARGS( 1, theater_flyout, TEXT_COLOR_NO_HL, ThirdFlyout, NoFlyout ) ) - TEMP_CHOICE_BUTTON_HIGHLIGHT_TEXT( 5, "@MENU_FILESHARE_COMMUNITY_CAPS", TEXT_COLOR_HL, dvarInt( ui_flownOut ) == 1 ) - -} // theater_flyout - - #include "ui_mp/popupstyle.inc" - #include "ui/choices_setup_popmenu.menu" - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 1 - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( customclassesreset, ;, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@MENU_NOTICE", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_RESETCUSTOMCLASSES", 1 ) - - #define LOCAL_ACCEPT_RESET_CAC \ - execnow statWriteDDL cacloadouts resetWarningDislayed 1; \ - execnow uploadstats; \ - play CHOICE_FOCUS_SOUND; \ - close customclassesreset; \ - open live_flyout; - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_OK", LOCAL_ACCEPT_RESET_CAC, 1, ; ) - } - - // ====================== single player confirmation ========================= -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 1 - menuDef - { - SYSTEM_POPUP_SETUP_VIS( error_netconnect_popmenu, ;, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@MENU_NOTICE", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@XBOXLIVE_NETCONNECTION", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_EXIT", close self;, 1, ; ) - } - - #define SETUP_SINGLE_PLAYER \ - execnow "set ui_skipMainLockout 0"; \ - setdvar ui_changed_exe 1; \ - exec "wait;wait;wait"; \ - uiScript startSingleplayer; - - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 2 - menuDef - { - SYSTEM_POPUP_SETUP_VIS( single_popmenu, setFocus single_popmenu_2, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@MENU_SWITCH_TO_SOLO_COOP_MENU", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_YES", SETUP_SINGLE_PLAYER, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_NO", close self, 1, name single_popmenu_2 ) - } -} diff --git a/mods/patch_mp/ui_mp/mods.menu b/mods/patch_mp/ui_mp/mods.menu deleted file mode 100644 index c7845cf..0000000 --- a/mods/patch_mp/ui_mp/mods.menu +++ /dev/null @@ -1,162 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" - -#define CHOICE_GROUP "mods" - -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui/framestyle.inc" -#include "ui/frame.inc" - -#define MOD_NAME_X 40 -#define MOD_NAME_Y ( FRAME_CHOICE_Y_START - 7 ) -#define MOD_NAME_HEIGHT 30 -#define MOD_NAME_SIZE MOD_IMAGE_WIDTH MOD_NAME_HEIGHT - -#define MOD_IMAGE_X MOD_NAME_X -#define MOD_IMAGE_Y (MOD_NAME_Y + MOD_NAME_HEIGHT + 15) -#define MOD_IMAGE_ASPECT_RATIO 1.0 -#define MOD_IMAGE_WIDTH 180 -#define MOD_IMAGE_HEIGHT (MOD_IMAGE_WIDTH * MOD_IMAGE_ASPECT_RATIO) -#define MOD_IMAGE_SIZE MOD_IMAGE_WIDTH MOD_IMAGE_HEIGHT - -#define MOD_DESC_X MOD_NAME_X -#define MOD_DESC_Y (MOD_IMAGE_Y + MOD_IMAGE_HEIGHT + 15) -#define MOD_DESC_SIZE MOD_IMAGE_WIDTH 60 - -#undef DEFAULT_SLIDE_IN_SPEED -#define DEFAULT_SLIDE_IN_SPEED 180 - -#undef DEFAULT_SLIDE_OUT_SPEED -#define DEFAULT_SLIDE_OUT_SPEED 180 - -#undef ON_ESC -#define ON_ESC \ - deactivateBlur; \ - play uin_navigation_menu_lg_close; \ - close self; - -#define MOD_DESC_DISPLAY( titleText, imageMat, descText, visArg ) \ - PREPROC_TEXT_DRAW_ALL( MOD_NAME_X MOD_NAME_Y MOD_NAME_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, \ - titleText, \ - TEXTSIZE_TITLE, 0, 0, ITEM_ALIGN_TOP_CENTER, 1 1 1 1, UI_FONT_EXTRABIG, ITEM_TEXTSTYLE_NORMAL, \ - when( visArg );, ; ) \ - PREPROC_SHADER_DRAW_VIS_EX( MOD_IMAGE_X MOD_IMAGE_Y MOD_IMAGE_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, \ - imageMat, 1 1 1 1, \ - when( visArg );, \ - ; ) \ - PREPROC_TEXT_DRAW_VIS_EX( MOD_DESC_X MOD_DESC_Y MOD_DESC_SIZE HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, \ - descText, \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_CENTER, 1 1 1 1, \ - when( visArg );, autowrapped ) - -menuDef -{ - name select_mod - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - - onOpen - { - activateBlur; - play uin_navigation_menu_lg_open; - setdvar invite_visible "0"; - setFocus mod_selection; - } - onFocus { } - onClose - { - deactivateBlur; - setdvar invite_visible "1"; - } - onESC - { - ON_ESC - } - - FRAME_DEFAULT - - FRAME_TITLE_DEFAULT( "@MENU_MODS_CAPS", 1 ) - FRAME_SUBTITLE_DEFAULT( "^3" + (locString( "@MENU_MODS_LOADED_CAPS" ) + dvarString( fs_game ) ) + "^7", when(dvarString( fs_game ) != "") ) - - #define MOD_IMAGE "playlist_custom" - #define MOD_NAME dvarString( ui_mod_name ) - #define MOD_DESC dvarString( ui_mod_desc ) - - MOD_DESC_DISPLAY( MOD_NAME, MOD_IMAGE, MOD_DESC, 1 ) - - // gametype selection =========================================== - itemDef - { - name mod_selection - type ITEM_TYPE_LISTBOX - feeder FEEDER_MODS - rect (FRAME_CHOICE_X_START-1) ( FRAME_CHOICE_Y_START - 3 ) (FRAME_BUTTON_WIDTH+18) 308 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - elementwidth 30 - elementheight 19 - noBlinkingHighlight - textfont CHOICE_TEXTFONT - textscale CHOICE_TEXTSIZE - forecolor CHOICE_TEXTCOLOR - focusColor COLOR_TITLE - disablecolor FRAME_GREY_RGB 1 - textstyle ITEM_TEXTSTYLE_NORMAL - modal - usePaging - visible 1 - // x y w h len horzAlign vertAlign - userarea 2 0 0 (FRAME_BUTTON_WIDTH+1) 19 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* BACKGROUND */ - 17 0 FRAME_BUTTON_WIDTH 19 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* NAME */ - - onfocus { play CHOICE_FOCUS_SOUND; } - onListboxSelectionChange - { - play CHOICE_FOCUS_SOUND; - execnow set ui_mod_name ( getmodinfo( "modName" ) ); - execnow set ui_mod_desc ( getmodinfo( "modDescr" ) ); - } - doubleclick - { - play CHOICE_ACTION_SOUND; - open load_mod_confirm_popmenu - } - } - - #undef BUTTON_SPACING - #define BUTTON_SPACING 20 - #define RESET_BUTTON_OFFSET ( getTextWidth( locString( "@PLATFORM_BACK" ), CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) + 8 + BUTTON_SPACING ) - -#ifdef PC - FRAME_BACK_BUTTON_DEFAULT_ACTION( ON_ESC ) -#else //#ifdef PC - FRAME_BACK_BUTTON_DEFAULT -#endif //#ifdef PC - - #include "ui/safearea.menu" -} - -// POPUPS -#include "ui_mp/popupstyle.inc" -#include "ui/choices_setup_popmenu.menu" - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 2 - -{ - menuDef - { - SYSTEM_POPUP_SETUP_VIS( load_mod_confirm_popmenu, setFocus loadmod_confirm_popmenu2, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@MENU_MOD_CONFIRM", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( dvarString( "ui_mod_name" ), 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_YES", close self; uiScript RunMod;, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_NO", close self, 1, name loadmod_confirm_popmenu_2 ) - } -} \ No newline at end of file diff --git a/mods/patch_mp/ui_mp/options_multi.menu b/mods/patch_mp/ui_mp/options_multi.menu deleted file mode 100644 index 06e43b5..0000000 --- a/mods/patch_mp/ui_mp/options_multi.menu +++ /dev/null @@ -1,701 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#define OPTIONS_STYLE 1 -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui/framestyle.inc" -#include "ui/frame.inc" - -#undef CHOICE_BUTTON_NAME -#define CHOICE_BUTTON_NAME "options_multi_" -#undef MENUDEF_NAME -#define MENUDEF_NAME options_multi - -#undef OPTIONS_MULTI_HEIGHT -#undef OPTIONS_MULTI_WIDTH -#define OPTIONS_MULTI_HEIGHT 332 -#define OPTIONS_MULTI_WIDTH OPTIONS_MULTI_HEIGHT * FRAME_ASPECT_RATIO - -{ - menuDef - { - name "options_multi" - fullScreen 0 - rect 0 0 640 480 - focusColor COLOR_FOCUSED - soundloop "" - - onOpen - { - exec "setfromdvar ui_name name"; - - LOCAL_CLOSE_ALL_BUT( options_multi ) - - setLocalVarBool ui_hideBack 1; - - if (IsInGame()) - { - showMenu "pausedbkgnd"; - } - else - { - activateBlur; - } - } - onClose - { - if (IsInGame()) - { - hideMenu "pausedbkgnd"; - } - else - { - deactivateBlur; - } - - setLocalVarBool ui_hideBack 0; - exec "setfromdvar name ui_name"; - uiScript "updateClanInProfile" - } - - onESC - { - close self; - open options_new_pc; - } - PC_TAB_SWITCH_ACTIONS( options_new_pc, options_controls_new_pc, options_controls_new_pc ) - - #include "ui_mp/leftside_options.inc" - -#undef CHOICE_X_START -#undef CHOICE_Y_START -#undef CHOICE_HORIZONTAL_ALIGN -#undef CHOICE_VERTICAL_ALIGN -#undef CHOICE_DVAR_EXTRA_WIDTH -#undef CHOICE_TEXT_OFFSET_X - -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER -#define CHOICE_X_START ((-OPTIONS_MULTI_WIDTH/2) - 75) -#define CHOICE_Y_START ((-OPTIONS_MULTI_HEIGHT/2) + 32) -#define CHOICE_DVAR_EXTRA_WIDTH 120 -#define CHOICE_TEXT_OFFSET_X -10 - -#undef CHOICE_TEXTSTYLE -#undef CHOICE_TEXTSIZE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL -#define CHOICE_TEXTSIZE TEXTSIZE_DEFAULT - -#undef CHOICE_TEXT_COLOR_NO_HL -#undef CHOICE_TEXT_COLOR_HL -#undef CHOICE_CAPTION_TEXT_COLOR_NO_HL -#undef CHOICE_CAPTION_TEXT_COLOR_HL - -#define CHOICE_TEXT_COLOR_NO_HL CHOICE_TEXTCOLOR -#define CHOICE_TEXT_COLOR_HL 1 1 1 1 -#define CHOICE_CAPTION_TEXT_COLOR_NO_HL CHOICE_TEXTCOLOR -#define CHOICE_CAPTION_TEXT_COLOR_HL 0 0 0 1 - - FRAME_CHOICE_SECTION_TITLE_VIS( 21, "@MENU_MULTIPLAYER_CAPS", ( dvarint( ui_multiplayer ) ) ) - FRAME_CHOICE_SECTION_TITLE_VIS( 21, "@MENU_COOPERATIVE_OPTIONS_CAPS", ( !dvarint( ui_multiplayer ) ) ) - - FRAME_CHOICE_DVARFLOATLIST_VIS( 22, "@MENU_TEAM_INDICATOR_CAPS", team_indicator, { "@MENU_INDICATOR_FULL_CAPS" 0 "@MENU_INDICATOR_ABBREVIATED_CAPS" 1 "@MENU_INDICATOR_ICON_CAPS" 2 "@MENU_INDICATOR_ALTERNATE_CAPS" 3 }, ;, 1 ) - FRAME_CHOICE_DVARYESNO_VIS( 23, "@MENU_ALLOW_DOWNLOAD_CAPS", cl_allowdownload, ;,( dvarint( ui_multiplayer ) ) ) - FRAME_CHOICE_DVARYESNO_VIS( 24, "@PATCH_OPTIONS_COLOR_FRIENDS_CAPS", cg_drawFriendInColor, ;,( dvarint( ui_multiplayer ) ) ) - FRAME_CHOICE_DVARYESNO_VIS( 25, "@PLATFORM_OPTIONS_RESTRICT_EMBLEMS_CAPS", live_restrictEmblems, ;,( dvarint( ui_multiplayer ) ) ) - - //FRAME_CHOICE_SEPARATOR( CHOICE_SEP_1 ) - - } -} - - -/* -{ -menuDef -{ - name options_multi - fullScreen 0 - rect 0 0 370 480 // Size and position of the menu - focusColor COLOR_FOCUSED // Menu focus color for text and items - soundloop "" - onOpen - { - exec "setfromdvar ui_name name" - setdvar ui_background_gradient_show "1"; - } - onClose - { - exec "setfromdvar name ui_name" - } - onESC - { - close options_multi; - } - itemDef - { - type ITEM_TYPE_TEXT - origin ORIGIN_TITLE - forecolor 1 1 1 1 - text "@MENU_MULTIPLAYER" - textfont UI_FONT_NORMAL - textscale TEXTSIZE_TITLE - visible 1 - decoration - } - itemDef - { - name misc - type ITEM_TYPE_BUTTON - text "@MENU_VOICE_CHAT_BUTTON" - rect 0 0 1 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - decoration - } - itemDef - { - name misc - type ITEM_TYPE_BUTTON - text "@MENU_VOTE_YES" - rect 0 15 1 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - decoration - } - itemDef - { - name misc - type ITEM_TYPE_BUTTON - text "@MENU_VOTE_NO" - rect 0 30 1 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - decoration - } - itemDef - { - name misc - type ITEM_TYPE_BUTTON - text "@MENU_CHAT" - rect 0 45 1 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - decoration - } - itemDef - { - name misc - type ITEM_TYPE_BUTTON - text "@MENU_TEAM_CHAT" - rect 0 60 1 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - decoration - } - itemDef - { - name misc - type ITEM_TYPE_BUTTON - text "@MENU_QUICK_CHAT" - rect 0 75 1 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - decoration - } - itemDef - { - name misc - type ITEM_TYPE_BUTTON - text "@MENU_ALLOW_DOWNLOAD" - rect 0 90 1 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - decoration - } - itemDef - { - name misc - type ITEM_TYPE_BUTTON - text "@MENU_DRAW_HUD" - rect 0 105 1 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - decoration - } - itemDef - { - name misc - type ITEM_TYPE_BUTTON - text "@MENU_CONNECTION" - rect 0 120 1 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - decoration - } - - itemDef - { - name misc - type ITEM_TYPE_BUTTON - text "@MENU_WEAPON_MENU" - rect 0 135 1 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - decoration - } - - itemDef - { - name player_name - type ITEM_TYPE_BUTTON - text "@MENU_PLAYER_NAME" - rect 0 150 1 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - decoration - - } - - - itemDef - { - name misc - type ITEM_TYPE_BUTTON - text "@MPUI_PUNKBUSTER" - rect 0 165 1 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - decoration - - } - - - itemDef - { - name misc - type ITEM_TYPE_BIND - text " " - dvar "+talk" - rect 0 0 320 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textalignx 170 - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - mouseEnter - { - play "mouse_over"; - show keyBindStatus - } - mouseexit { hide keyBindStatus } - action { play CHOICE_ACTION_SOUND; } - } - - itemDef - { - name misc - type ITEM_TYPE_BIND - text " " - dvar "vote yes" - rect 0 15 320 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textalignx 170 - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - mouseEnter - { - play "mouse_over"; - show keyBindStatus - } - mouseexit { hide keyBindStatus } - action { play CHOICE_ACTION_SOUND; } - } - - itemDef - { - name misc - type ITEM_TYPE_BIND - text " " - dvar "vote no" - rect 0 30 320 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textalignx 170 - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - mouseEnter - { - play "mouse_over"; - show keyBindStatus - } - mouseexit { hide keyBindStatus } - action { play CHOICE_ACTION_SOUND; } - } - itemDef - { - name misc - type ITEM_TYPE_BIND - text " " - dvar "chatmodepublic" - rect 0 45 320 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textalignx 170 - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - mouseEnter - { - play "mouse_over"; - show keyBindStatus - } - mouseexit { hide keyBindStatus } - action { play CHOICE_ACTION_SOUND; } - } - itemDef - { - name misc - type ITEM_TYPE_BIND - text " " - dvar "chatmodeteam" - rect 0 60 320 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textalignx 170 - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - mouseEnter - { - play "mouse_over"; - show keyBindStatus - } - mouseexit { hide keyBindStatus } - action { play CHOICE_ACTION_SOUND; } - } - itemDef - { - name misc - type ITEM_TYPE_BIND - text " " - dvar "mp_QuickMessage" - rect 0 75 320 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textalignx 170 - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - mouseEnter - { - play "mouse_over"; - show keyBindStatus - } - mouseexit { hide keyBindStatus } - action { play CHOICE_ACTION_SOUND; } - } - - itemDef - { - name misc - type ITEM_TYPE_YESNO - text " " - dvar "cl_allowdownload" - rect 0 90 320 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textalignx 170 - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - action { play CHOICE_ACTION_SOUND; } - mouseEnter - { - play "mouse_over"; - } - } - itemDef - { - name misc - type ITEM_TYPE_YESNO - text " " - dvar "hud_enable" - rect 0 105 320 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textalignx 170 - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - action { play CHOICE_ACTION_SOUND; } - mouseEnter - { - play "mouse_over"; - } - } - - - itemDef - { - name misc - type ITEM_TYPE_MULTI - text " " - dvar "rate" - dvarFloatList { "@MENU_ISDN" 5000 "@MENU_LAN_CABLE_XDSL" 25000 } - rect 0 120 320 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textalignx 170 - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - action { play CHOICE_ACTION_SOUND; } - mouseEnter - { - play "mouse_over"; - } - } - itemDef - { - name misc - type ITEM_TYPE_BIND - text " " - dvar "openscriptmenu ingame changeweapon" - rect 0 135 320 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textalignx 170 - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - action { play CHOICE_ACTION_SOUND; } - mouseEnter - { - play "mouse_over"; - } - } - itemDef - { - name player_name - type ITEM_TYPE_EDITFIELD - text " " - dvar "ui_name" - rect 0 150 320 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textalignx 170 - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - maxChars 31 - maxpaintchars 18 - mouseEnter - { - play "mouse_over"; - } - } - - itemDef - { - name misc - type ITEM_TYPE_YESNO - text " " - dvar "cl_punkbuster" - rect 0 165 320 13 - origin 50 120 - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textalignx 170 - textaligny 11 - textscale 0.25 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - visible 1 - action { play CHOICE_ACTION_SOUND; } - mouseEnter - { - play "mouse_over"; - } - } - -/////////////////////////////////////////////////////////// - itemDef - { - name cdkeybt - text "@MENU_ENTER_KEY_CODE" - type ITEM_TYPE_BUTTON - style WINDOW_STYLE_FILLED - textstyle ITEM_TEXTSTYLE_SHADOWED - rect 102 330 150 20 - textalign ITEM_ALIGN_CENTER - textscale .3 - textaligny 14 - forecolor .9 .9 .95 1 - visible 1 - textfont UI_FONT_NORMAL - mouseEnter - { - play "mouse_over"; - } - action - { - play CHOICE_ACTION_SOUND; - open cdkey_menu; - } - } - - itemDef - { - name keyBindStatus - rect 0 350 360 15 - ownerdraw UI_KEYBINDSTATUS - text " " - style WINDOW_STYLE_FILLED - backcolor 0 0 0 0 - forecolor .9 .9 .9 1 - textscale .20 - textalignx -12 - textalign ITEM_ALIGN_CENTER - textaligny 12 - visible 0 - decoration - } - -} - -}// -*/ diff --git a/mods/patch_mp/ui_mp/patch.txt b/mods/patch_mp/ui_mp/patch.txt deleted file mode 100644 index 53b23c0..0000000 --- a/mods/patch_mp/ui_mp/patch.txt +++ /dev/null @@ -1,7 +0,0 @@ -// MP patch menu defs -// -{ -// loadMenu { "ui/patch.menu" } -// loadMenu { "ui/patch_popups.menu" } - loadMenu { "ui_mp/mods.menu" } -} diff --git a/mods/patch_mp/ui_mp/pc_basictraining.menu b/mods/patch_mp/ui_mp/pc_basictraining.menu deleted file mode 100644 index 73774c2..0000000 --- a/mods/patch_mp/ui_mp/pc_basictraining.menu +++ /dev/null @@ -1,538 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/newframe.inc" - -#define CHOICE_X_START -258 -#define CHOICE_Y_START 35 -#define BUTTON_BG_WIDTH 180 - -#define CHOICE_SEP_OFFSET_X 20 -#define CHOICE_SEP_OFFSET_Y -2 -#define CHOICE_SEP_1 1 -#define CHOICE_SEP_2 4 -#define CHOICE_GROUP "xboxlive_basictraining" - -#define FLYOUT_NONE 0 -#define FLYOUT_TRAINING 3 - -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui_mp/stats_info.inc" -#include "ui_mp/friendslist.inc" - -#define MENU_FONT_SIZE TEXTSIZE_DEFAULT -#define HIGHLIGHT_SIZE 142 22 -#define MENU_FONT_COLOR 1 1 1 0.5 -#define MENU_FONT_COLOR2 1 1 1 0.5 -#define MENU_LOCKED_COLOR 0.25 0.25 0.25 1 - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X BUTTON_BG_WIDTH -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL - -#undef CHOICE_HORIZONTAL_ALIGN -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER -#undef CHOICE_Y_SPACING -#define CHOICE_Y_SPACING CHOICE_SIZE_Y - -#define FLYOUT_BG_COLOR 0 0 0 0.3 - -#define SELECTION_IMAGE_BIG( materialArg ) ( "menu_" + materialArg + "_map_select_big" ) - -#define BOT_DVAR_CHECK \ - execNow if ( dvarInt( bot_friends ) > 11 ) set bot_friends 11; exec "updategamerprofile"; \ - execNow if ( dvarInt( bot_enemies ) > 11 ) set bot_enemies 11; exec "updategamerprofile"; -#include "ui_mp/common_macro.inc" - -#undef ON_ESC -#define ON_ESC \ - setdvar xblive_basictraining "0"; \ - setDvar xblive_privatematch "0" \ - setDvar leaveImmediately "0"; \ - close self; \ - open main_text; - -{ - menuDef - { - name menu_xboxlive_basictraining - fullscreen 1 - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - border 0 - soundloop MENU_MUSIC - control MENU_CONTROL_USED - allowSignIn - - onOpen - { - execnow "validatePrivateMatchGametype"; - exec "exec dvar_defaults.cfg"; - setDvar onlinegame "1"; - setdvar xblive_rankedmatch "0"; - setdvar xblive_basictraining "1"; - setdvar ui_inviteonly "0"; - setdvar invite_visible "1"; - setdvar ui_selectlobby "0"; - setdvar popup_open "0"; - - execNow set scr_hc_tdm_scorelimit ( dvarString( scr_tdm_scorelimit ) ); - execNow set scr_hc_dm_scorelimit ( dvarString( scr_dm_scorelimit ) ); - execNow set scr_hc_tdm_timelimit ( dvarString( scr_tdm_timelimit ) ); - execNow set scr_hc_dm_timelimit ( dvarString( scr_dm_timelimit ) ); - - execNow if ( !dvarbool( "xblive_basictraining_popup" ) ) openmenu "basictraining_msg"; - - exec set ui_bg_image SELECTION_IMAGE_BIG( dvarString( ui_mapname ) ); - - exec set show_list_player_info 0; - CLEARUIHINT - if ( dvarInt( scr_hardcore ) == 1 ) - { - if ( dvarString( ui_gametype ) == "dm" ) - { - execNow set ui_gametype( "hc_dm" ); - } - - if ( dvarString( ui_gametype ) == "tdm" ) - { - execNow set ui_gametype( "hc_tdm" ); - } - } - } - onFocus - { - if ( dvarString( ui_gametype ) != dm && dvarString( ui_gametype ) != hc_dm ) - { - //BOT_DVAR_CHECK; - } - - setDvar ui_flyoutHasFocus FLYOUT_NONE; - exec set ui_bg_image SELECTION_IMAGE_BIG( dvarString( ui_mapname ) ); - } - onClose - { - play "uin_navigation_backout"; - setdvar popup_open "1"; - setfocus popup_hide; - hide selection_right; - setdvar ui_bg_image ""; - } - onEsc - { - ON_ESC - } - - // ------------------ statics ------------------------ - #include "ui_mp/blurredbg.inc" - - // ----------------- Scroller -------------------------- - #include "ui/scroller.inc" - - // ----------------- title -------------------------- - CHOICE_MENU_TITLE_CENTER_ALIGN_VIS( "@MPUI_BASICTRAINING_LOBBY_CAPS", ITEM_ALIGN_TOP_RIGHT, 1 ) - - // ---------------------------- map ------------------------------------ - #define GAMEINFO_ORIENTATION 1 - #define GAMEINFO_X CHOICE_X_START - #define GAMEINFO_Y 235 - #define GAMEINFO_ORIGIN GAMEINFO_X GAMEINFO_Y - #define GAMEINFO_WIDTH BUTTON_BG_WIDTH - #define GAMEINFO_WIDTH2 GAMEINFO_WIDTH - #define GAMEINFO_HEIGHT 80 - - #include "ui_mp/game_info.inc" - #define MAPIMAGE SELECTION_IMAGE_FINAL( dvarString( ui_mapname ) ) - #define MAPNAME locString( tableLookup( "mp/mapstable.csv", 0, dvarString( ui_mapname ), 3 ) ) - #define GAMETYPENAME locString( tableLookup( "mp/gametypesTable.csv", 0, dvarString( ui_gametype ), 1 ) ) - - #define VOTE_BG_SIZE 20 - - #define SELECTION_IMAGE_FINAL( materialArg ) \ - ( "menu_" + materialArg + "_map_select_final" ) - - #define MAP_SELECTION_INFO( xPos, yPos, widthArg, heightArg, mapName, gametypeName, visArg ) \ - PREPROC_TEXT_DRAW_ALL( (xPos+widthArg-96-8) (yPos+heightArg-VOTE_BG_SIZE+1-18) 96 24 CHOICE_HORIZONTAL_ALIGN VERTICAL_ALIGN_BOTTOM, \ - 0 0, toUpper( mapName ), TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_TOP_RIGHT, 1 1 1 1, UI_FONT_EXTRABIG, ITEM_TEXTSTYLE_NORMAL, \ - visArg, ; ) \ - PREPROC_TEXT_DRAW_VIS( (xPos+widthArg-96-8) (yPos+heightArg-VOTE_BG_SIZE+1) 96 20 CHOICE_HORIZONTAL_ALIGN VERTICAL_ALIGN_BOTTOM, \ - 0 0, gametypeName, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_RIGHT, 1 1 1 1, \ - visArg ) - - #define MAP_X_START (-MAP_WIDTH-112) - #define MAP_Y_START (-MAP_HEIGHT-25) - #define MAP_WIDTH 183 - #define MAP_ASPECT_RATIO (203/275) - #define MAP_HEIGHT (MAP_WIDTH*MAP_ASPECT_RATIO) - - PREPROC_SHADER_DRAW_VIS_EX( MAP_X_START MAP_Y_START MAP_WIDTH MAP_HEIGHT CHOICE_HORIZONTAL_ALIGN VERTICAL_ALIGN_BOTTOM, - MAPIMAGE, 1 1 1 1, - 1, ; ) - - MAP_SELECTION_INFO( MAP_X_START, MAP_Y_START, MAP_WIDTH, MAP_HEIGHT, MAPNAME, GAMETYPENAME, 1 ) - - // ---------------------- locked hint ------------------------- - #define HINT_X_START ( CHOICE_X_START - 13 ) - HINT_TEXT_ALL( 9, HINT_X_START, 7, CHOICE_SIZE_X, dvarString( ui_hint_text ), 1 1 1 1, dvarBool( ui_show_arrow ), ; ) - - - // ---------------------- party status description ------------------------- - #define STATUS_START_X 145 - #define STATUS_START_Y -48 - #define STATUS_RECT STATUS_START_X STATUS_START_Y 150 25 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_BOTTOM - - PREPROC_TEXT_DRAW_VIS( STATUS_RECT, 0 0, "@MENU_STATUS_OPEN_DESC_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_RIGHT, MEDIUM_GRAY, when( dvarint( "party_privacyStatus" ) == 0 && !dvarbool( "xblive_basictraining" ) ) ) - PREPROC_TEXT_DRAW_VIS( STATUS_RECT, 0 0, "@MENU_STATUS_OPEN_FRIENDS_DESC_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_RIGHT, MEDIUM_GRAY, when( dvarint( "party_privacyStatus" ) == 1 && !dvarbool( "xblive_basictraining" ) ) ) - PREPROC_TEXT_DRAW_VIS( STATUS_RECT, 0 0, "@MENU_STATUS_INVITE_ONLY_DESC_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_RIGHT, MEDIUM_GRAY, when( dvarint( "party_privacyStatus" ) == 2 && !dvarbool( "xblive_basictraining" ) ) ) - PREPROC_TEXT_DRAW_VIS( STATUS_RECT, 0 0, "@MENU_STATUS_CLOSE_DESC_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_RIGHT, MEDIUM_GRAY, when( dvarint( "party_privacyStatus" ) == 3 && !dvarbool( "xblive_basictraining" ) ) ) - - - //========================================================= - //================= MENU SELECTION ACTIONS ================ - //========================================================= - #define SETUP_GAME_MODE \ - resetdvar scr_hardcore; \ - resetdvar scr_team_fftype; \ - resetdvar scr_player_healthregentime; \ - resetdvar scr_player_maxhealth; \ - resetdvar scr_tdm_waverespawndelay; \ - resetdvar scr_game_allowkillcam; \ - resetdvar scr_allowbattlechatter; \ - resetdvar scr_team_kickteamkillers; \ - resetdvar scr_game_suicidepointloss; \ - resetdvar scr_team_teamkillpointloss; \ - resetdvar scr_dog_health; \ - resetdvar scr_dm_playerrespawndelay; \ - resetdvar scr_disable_tacinsert; \ - if ( dvarString( ui_gametype ) == "hc_tdm" )\ - { \ - execNow set scr_tdm_scorelimit ( dvarFloat( scr_hc_tdm_scorelimit ) ); \ - execNow set scr_tdm_timelimit ( dvarFloat( scr_hc_tdm_timelimit ) ); \ - execNow set g_gametype "tdm"; \ - execNow set ui_gametype "tdm"; \ - execNow set scr_hardcore 1; \ - execNow set scr_team_fftype 1; \ - execNow set scr_player_healthregentime 0; \ - execNow set scr_player_maxhealth 30; \ - execNow set scr_tdm_waverespawndelay 15; \ - execNow set scr_game_allowkillcam 0; \ - execNow set scr_allowbattlechatter 0; \ - execNow set scr_team_kickteamkillers 1; \ - execNow set scr_game_suicidepointloss -100; \ - execNow set scr_team_teamkillpointloss -100; \ - execNow set scr_dog_health 30; \ - } \ - if ( dvarString( ui_gametype ) == "hc_dm" )\ - { \ - execNow set scr_dm_scorelimit ( dvarFloat( scr_hc_dm_scorelimit ) ); \ - execNow set scr_dm_timelimit ( dvarFloat( scr_hc_dm_timelimit ) ); \ - execNow set g_gametype "dm"; \ - execNow set ui_gametype "dm"; \ - execNow set scr_hardcore 1; \ - execNow set scr_player_healthregentime 0; \ - execNow set scr_player_maxhealth 30; \ - execNow set scr_game_allowkillcam 0; \ - execNow set scr_allowbattlechatter 0; \ - execNow set scr_dm_playerrespawndelay 7; \ - execNow set scr_game_suicidepointloss -50; \ - execNow set scr_dog_health 30; \ - execNow set scr_disable_tacinsert 1; \ - } \ - if ( dvarString( ui_gametype ) == "shrp" || dvarString( ui_gametype ) == "gun" || dvarString( ui_gametype ) == "oic" || dvarString( ui_gametype ) == "hlnd" ) \ - { \ - execNow set bot_wager "1"; \ - } \ - else \ - { \ - execNow set bot_wager "0"; \ - } \ - execNow set scr_hlnd_timelimit ""; \ - execNow set scr_hlnd_scorelimit ""; \ - execNow set scr_oic_timelimit ""; \ - execNow set scr_oic_scorelimit ""; \ - execNow set scr_gun_timelimit ""; \ - execNow set scr_gun_scorelimit ""; \ - execNow set scr_shrp_timelimit ""; \ - execNow set scr_shrp_scorelimit ""; - - - #define SETUP_ACTION_STARTMATCH \ - SETUP_GAME_MODE \ - exec "selectStringTableEntryInDvar mp/didyouknow.csv 0 didyouknow"; \ - uiscript StartListenServer; - - #define SETUP_ACTION_GAMESETUP \ - open basictraining_settings; - - #define SETUP_ACTION_CREATEACLASS \ - execnow "set ui_cac_ingame 0"; \ - setdvar invite_visible "0"; \ - /*exec "uploadstats";*/ \ - open cac_main; - - #define SETUP_ACTION_CONTRACTS \ - exec "endsplitscreensignin"; \ - open menu_xboxlive_contracts; - - #define SETUP_ACTION_KILLSTREAKS \ - exec "endsplitscreensignin"; \ - open menu_xboxlive_killstreaks; - - - //========================================================= - //===================== MENU SELECTION ==================== - //========================================================= - #define ANY_NEW_TRAINING_PLAYERCARD_FEATURE \ - ( ANY_NEW_CHALLENGES || IS_ITEM_NEW( FEATURE_COMBAT_RECORD ) ) - - #define IS_LOBBY_HOST 1 - #define IS_NOT_LOBBY_HOST 0 - - // HOST BUTTONS - TEMP_CHOICE_BUTTON_FOCUS_VIS( 1, "@MPUI_START_MATCH_CAPS", - SETUP_ACTION_STARTMATCH, - SET_HINT_TEXT( "@MPUI_START_MATCH_DESC" ), - CLEARUIHINT, - dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 1 ), 0 0, "@MPUI_START_MATCH_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, MEDIUM_GRAY, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE ); ) - - - TEMP_CHOICE_BUTTON_FOCUS_VIS( 2, "@MPUI_CHANGE_MAP_CAPS", - open select_map, - SET_HINT_TEXT( "@MPUI_CHANGE_MAP_DESC" ), - CLEARUIHINT, - dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 2 ), 0 0, "@MPUI_CHANGE_MAP_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, MEDIUM_GRAY, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE ); ) - - - TEMP_CHOICE_BUTTON_FOCUS_VIS( 3, "@MPUI_CHANGE_GAME_MODE_CAPS", - open select_game_mode, - SET_HINT_TEXT( "@MPUI_CHANGE_GAME_MODE_DESC" ), - CLEARUIHINT, - dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 3 ), 0 0, "@MPUI_CHANGE_GAME_MODE_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, MEDIUM_GRAY, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE ); ) - - TEMP_CHOICE_BUTTON_FOCUS_VIS( 4, "@MPUI_EDIT_GAME_OPTIONS_CAPS", - SETUP_ACTION_GAMESETUP, - SET_HINT_TEXT( "@MPUI_EDIT_GAME_OPTIONS_DESC" ), - CLEARUIHINT, - dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 4 ), 0 0, "@MPUI_EDIT_GAME_OPTIONS_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, MEDIUM_GRAY, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE ); ) - - TEMP_CHOICE_BUTTON_FOCUS_VIS( 5, "@MPUI_CREATE_A_CLASS_CAPS", - SETUP_ACTION_CREATEACLASS, - SET_HINT_TEXT( "@MPUI_CAC_DESC" ) CLEAR_ITEM_NEW( FEATURE_CREATE_A_CLASS ), - CLEARUIHINT, - !IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) && dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) - TEMP_CHOICE_DBUTTON_FOCUS_VIS_EX( 5, "@MPUI_CREATE_A_CLASS_CAPS", - SET_HINT_TEXT( GET_UNLOCK_LEVEL_STRING( FEATURE_CREATE_A_CLASS ) ), - CLEARUIHINT, - IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) && dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE, ; ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 5 ), 0 0, "@MPUI_CREATE_A_CLASS_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, MEDIUM_GRAY, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE ); ) - CHOICE_NEWICON_VIS( 5, "menu_mp_lobby_new", when( ANY_NEW_CAC && dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) ) - CHOICE_LOCKEDICON_VIS( 5, "menu_mp_lobby_locked", when( IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) && dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) ) - - - TEMP_CHOICE_BUTTON_FOCUS_VIS( 6, "@MENU_KILLSTREAKS_CAPS", - SETUP_ACTION_KILLSTREAKS, - SET_HINT_TEXT( "@MPUI_KILLSTREAKS_DESC" ) CLEAR_ITEM_NEW( FEATURE_KILLSTREAKS ), - CLEARUIHINT, - !IS_ITEM_LOCKED( FEATURE_KILLSTREAKS ) && dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) - TEMP_CHOICE_DBUTTON_FOCUS_VIS_EX( 6, "@MENU_KILLSTREAKS_CAPS", - SET_HINT_TEXT( GET_UNLOCK_LEVEL_STRING( FEATURE_KILLSTREAKS ) ), - CLEARUIHINT, - IS_ITEM_LOCKED( FEATURE_KILLSTREAKS ) && dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE, ; ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 6 ), 0 0, "@MENU_KILLSTREAKS_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, MEDIUM_GRAY, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE ); ) - CHOICE_NEWICON_VIS( 6, "menu_mp_lobby_new", when( IS_ITEM_NEW( FEATURE_KILLSTREAKS ) && dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) ) - CHOICE_LOCKEDICON_VIS( 6, "menu_mp_lobby_locked", when( IS_ITEM_LOCKED( FEATURE_KILLSTREAKS ) && dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) ) - - - TEMP_CHOICE_BUTTON_FOCUS_VIS( 8, "@MENU_PLAYERCARD_CAPS", - SETUP_ACTION_PLAYERCARD, - SET_HINT_TEXT( "@MPUI_PLAYERCARD_DESC" ), - CLEARUIHINT, - dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) - PREPROC_TEXT_DRAW_VIS( CHOICE_RECT( 8 ), 0 0, "@MENU_PLAYERCARD_CAPS", CHOICE_TEXTSIZE, CHOICE_TEXT_OFFSET_X, 0, CHOICE_TEXTALIGN, MEDIUM_GRAY, when( dvarInt( ui_flyoutHasFocus ) != FLYOUT_NONE ); ) - CHOICE_NEWICON_VIS( 8, "menu_mp_lobby_new", when( ANY_NEW_TRAINING_PLAYERCARD_FEATURE && IS_LOBBY_HOST && dvarInt( ui_flyoutHasFocus ) == FLYOUT_NONE ) ) - - #undef CHOICE_TEXTSIZE - #define CHOICE_TEXTSIZE TEXTSIZE_DEFAULT - - #undef CHOICE_TEXTFONT - #define CHOICE_TEXTFONT UI_FONT_NORMAL - - // Friends button - FRIENDS_BUTTON - - // back button - NEW_FRAME_BACK_BUTTON_ACTION_PC( ON_ESC ) - - #include "ui/safearea.menu" - } - - - #include "ui/framestyle.inc" - #include "ui/frame.inc" - - #undef CHOICE_GROUP - #define CHOICE_GROUP "basictraining_difficulty" - - #undef CHOICE_X_START - #define CHOICE_X_START (-FRAME_DEFAULT_WIDTH/2+15) - - #undef CHOICE_Y_START - #define CHOICE_Y_START ( -FRAME_DEFAULT_HEIGHT / 2 + 15 + NEW_FRAME_BG_Y_OFFSET( FRAME_DEFAULT_HEIGHT ) ) - - #define DIFFICULTY_NAME_X 0 - #define DIFFICULTY_NAME_Y CHOICE_Y_START - - #define ITEM_IMAGE_X DIFFICULTY_NAME_X - #define ITEM_IMAGE_Y (CHOICE_Y_START-5) - #define ITEM_IMAGE_ASPECT_RATIO 1 - #define ITEM_IMAGE_WIDTH (ITEM_IMAGE_HEIGHT * ITEM_IMAGE_ASPECT_RATIO) - #define ITEM_IMAGE_HEIGHT 240 - #define ITEM_IMAGE_SIZE ITEM_IMAGE_WIDTH ITEM_IMAGE_HEIGHT - - #define DIFFICULTY_NAME_SIZE ITEM_IMAGE_WIDTH 30 - - #define DIFFICULTY_DESC_X (ITEM_IMAGE_X + 20) - #define DIFFICULTY_DESC_Y (ITEM_IMAGE_Y + ITEM_IMAGE_HEIGHT - 20) - #define DIFFICULTY_DESC_SIZE 200 75 - - #define DIFFICULTY_INFO \ - /* Name */ \ - PREPROC_TEXT_DRAW( DIFFICULTY_NAME_X DIFFICULTY_NAME_Y DIFFICULTY_NAME_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - localVarString( ui_info_name ), \ - TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_TOP_CENTER, 1 1 1 1 ) \ - /* Image */ \ - PREPROC_SHADER_DRAW( ITEM_IMAGE_X ITEM_IMAGE_Y ITEM_IMAGE_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - localVarString( ui_diff_pic ), 1 1 1 0.9 ) \ - /* Description */ \ - PREPROC_TEXT_DRAW_VIS_EX( DIFFICULTY_DESC_X DIFFICULTY_DESC_Y DIFFICULTY_DESC_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, \ - localVarString( ui_info ), \ - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_CENTER, FRAME_LT_GREY_RGB 1, \ - 1, autowrapped ) - - #define DIFFICULTY_ONFOCUS( descArg, nameArg, imageArg )\ - setLocalVarString ui_info descArg; \ - setLocalVarString ui_info_name nameArg; \ - setLocalVarString ui_diff_pic imageArg - - #define SET_DIFFICULTY( difficulty ) \ - exec set bot_difficulty difficulty; \ - close self; - -#undef CHOICE_SEP_SPACING -#define CHOICE_SEP_SPACING 0 - - menuDef - { - name basictraining_difficulty - rect 0 0 640 480 - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - - onOpen - { - activateBlur; - focusFirst; - play uin_navigation_menu_lg_open; - } - onFocus { } - onClose - { - deactivateBlur; - execNow "updategamerprofile"; - } - onESC - { - close self; - } - execKeyInt BUTTON_B { } - - FRAME_DEFAULT - FRAME_TITLE_DEFAULT( "@MENU_SELECT_DIFFICULTY_CAPS", 1 ) - - //FRAME_SUBTITLE_DEFAULT( "@MENU_SELECT_DIFF_DESC", 1 ) This was commented out in the main basictraining/difficulty menus on all platforms in cl#702108, so there doesn't seem to be a good reason to have it here any longer - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 1, "@MENU_RECRUIT_CAPS", - SET_DIFFICULTY( "easy" ), - DIFFICULTY_ONFOCUS( "@MENU_DIFF_RECRUIT_DESC", "@MENU_RECRUIT_CAPS", "playlist_sp_recr" ), - ;, 1, ; ) - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 2, "@MENU_REGULAR_CAPS", - SET_DIFFICULTY( "normal" ), - DIFFICULTY_ONFOCUS( "@MENU_DIFF_REGULAR_DESC", "@MENU_REGULAR_CAPS", "playlist_sp_reg" ), - ;, 1, ; ) - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 3, "@MENU_HARDENED_CAPS", - SET_DIFFICULTY( "hard" ), - DIFFICULTY_ONFOCUS( "@MENU_DIFF_HARDENED_DESC", "@MENU_HARDENED_CAPS", "playlist_sp_hard" ), - ;, 1, ; ) - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 4, "@MENU_VETERAN_CAPS", - SET_DIFFICULTY( "fu" ), - DIFFICULTY_ONFOCUS( "@MENU_DIFF_VETERAN_DESC", "@MENU_VETERAN_CAPS", "playlist_sp_vet" ), - ;, 1, ; ) - - DIFFICULTY_INFO - } - - - #undef CHOICE_FOCUS_SOUND - #define CHOICE_FOCUS_SOUND "uin_navigation_over" - - #undef CHOICE_Y_SPACING - #define CHOICE_Y_SPACING (CHOICE_SIZE_Y + 2) - - #include "ui_mp/popupstyle.inc" - #include "ui/choices_setup_popmenu.menu" - - #undef POPUP_WIDTH - #define POPUP_WIDTH MEDIUM_POPUP_WIDTH - #undef POPUP_HEIGHT - #define POPUP_HEIGHT MEDIUM_POPUP_HEIGHT - #undef MEDIUM_POPUP_TITLE_X_START - #define MEDIUM_POPUP_TITLE_X_START POPUP_SIDE_PAD - #undef MEDIUM_POPUP_TITLE_Y_START - #define MEDIUM_POPUP_TITLE_Y_START POPUP_SIDE_PAD - #undef CHOICE_SIZE_X - #define CHOICE_SIZE_X ( (MEDIUM_POPUP_WIDTH - (POPUP_SIDE_PAD * 2) ) / 2 ) - - #undef POPUP_BUTTON_COUNT - #define POPUP_BUTTON_COUNT 1 - #undef CHOICE_Y_START - #define CHOICE_Y_START POPUP_Y_START_BOTTOM - menuDef - { - MEDIUM_POPUP_SETUP_VIS( basictraining_msg, ;, close self;, POPUP_GLOW_WHITE, 0, 1 ) - onClose - { - setDvar xblive_basictraining_popup "1"; - open basictraining_difficulty; - } - execkeyint BUTTON_START {} - execKeyInt APAD_UP {} - execKeyInt DPAD_UP {} - execKeyInt APAD_DOWN {} - execKeyInt DPAD_DOWN {} - execKeyInt APAD_LEFT {} - execKeyInt DPAD_LEFT {} - execKeyInt APAD_RIGHT {} - execKeyInt DPAD_RIGHT {} - - PREPROC_TEXT_DRAW_VIS_EX( MEDIUM_POPUP_TITLE_X_START MEDIUM_POPUP_TITLE_Y_START (MEDIUM_POPUP_WIDTH-30) MEDIUM_POPUP_TITLE_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@MPUI_BASICTRAINING_LOBBY_CAPS", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, 1, autowrapped ) - - PREPROC_TEXT_DRAW_VIS_EX( MEDIUM_POPUP_TITLE_X_START (MEDIUM_POPUP_TITLE_Y_START+MEDIUM_POPUP_TITLE_HEIGHT+10) (MEDIUM_POPUP_WIDTH-30) 100 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, - "@MPUI_BASICTRAINING_POPUP_DESC", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, 1, autowrapped ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_CONTINUE", close self;, 1, ; ) - } -} diff --git a/mods/patch_mp/ui_mp/pc_serversettings.menu b/mods/patch_mp/ui_mp/pc_serversettings.menu deleted file mode 100644 index 41353e0..0000000 --- a/mods/patch_mp/ui_mp/pc_serversettings.menu +++ /dev/null @@ -1,190 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" -#include "ui/choices_setup_common.menu" -#include "ui_mp/custom_mode_layout.inc" -#include "ui_mp/custom_mode.inc" - -#undef CHOICE_Y_START -#define CHOICE_Y_START -150 - -#undef CHOICE_X_START -#define CHOICE_X_START -200 - -#ifdef PC -#undef CHOICE_TEXTSIZE -#define CHOICE_TEXTSIZE TEXTSIZE_DEFAULT -#endif //#ifdef PC - -#define SERVERSETTINGS_NAME_X 40 -#define SERVERSETTINGS_NAME_Y (80) -#define SERVERSETTINGS_NAME_SIZE SERVERSETTINGS_IMAGE_WIDTH 30 - -#define SERVERSETTINGS_IMAGE_X SERVERSETTINGS_NAME_X -#define SERVERSETTINGS_IMAGE_Y (CHOICE_Y_START - 170) -#define SERVERSETTINGS_IMAGE_ASPECT_RATIO 1.0 -#define SERVERSETTINGS_IMAGE_WIDTH 180 -#define SERVERSETTINGS_IMAGE_HEIGHT (SERVERSETTINGS_IMAGE_WIDTH * SERVERSETTINGS_IMAGE_ASPECT_RATIO) -#define SERVERSETTINGS_IMAGE_SIZE SERVERSETTINGS_IMAGE_WIDTH SERVERSETTINGS_IMAGE_HEIGHT - -#define SERVERSETTINGS_DESC_X 0 -#define SERVERSETTINGS_DESC_Y (CHOICE_Y_START + 20) -#define SERVERSETTINGS_DESC_SIZE 244 60 - -#undef DEFAULT_SLIDE_IN_SPEED -#define DEFAULT_SLIDE_IN_SPEED 180 - -#undef DEFAULT_SLIDE_OUT_SPEED -#define DEFAULT_SLIDE_OUT_SPEED 180 - -#define CHOICE_BUTTON_NAME "SERVERSETTINGS_" -#define MENUDEF_NAME server_settings - -#define SERVERSETTINGS_FRAME_WIDTH NEW_FRAME_DEFAULT_WIDTH -#define SERVERSETTINGS_FRAME_HEIGHT NEW_FRAME_DEFAULT_HEIGHT - -#undef ON_ESC -#define ON_ESC \ - play uin_navigation_menu_lg_close; \ - close self; - -menuDef -{ - name MENUDEF_NAME - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - - onOpen - { - activateBlur; - play uin_navigation_menu_lg_open; - setdvar invite_visible "0"; - } - onFocus { } - onClose - { - deactivateBlur; - setdvar invite_visible "1"; - } - onESC - { - ON_ESC - } - - NEW_FRAME( SERVERSETTINGS_FRAME_WIDTH, SERVERSETTINGS_FRAME_HEIGHT ) - NEW_FRAME_TITLE( SERVERSETTINGS_FRAME_WIDTH, SERVERSETTINGS_FRAME_HEIGHT, "@MENU_SERVER_SETTINGS_CAPS", 1 ) - - // Server Name - FRAME_CHOICE_DVAREDIT_FOCUS_VIS_EX( 2, "@PATCH_SERVER_NAME_CAPS", - "sv_hostname", 20, 20, - ;, - SET_CHOICE_DESC( "", "@PATCH_SERVER_NAME_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - // Minimum Ping - FRAME_CHOICE_DVAREDIT_NUMERIC_FOCUS_VIS_EX( 4, "@PATCH_MINIMUM_PING_CAPS", - "sv_minping", 4, - ;, - SET_CHOICE_DESC( "", "@PATCH_MINIMUM_PING_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - // Maximum Ping - FRAME_CHOICE_DVAREDIT_NUMERIC_FOCUS_VIS_EX( 5, "@PATCH_MAXIMUM_PING_CAPS", - "sv_maxping", 4, - ;, - SET_CHOICE_DESC( "", "@PATCH_MAXIMUM_PING_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - // Password - FRAME_CHOICE_DVAREDIT_FOCUS_VIS_EX( 6, "@PATCH_PASSWORD1_CAPS", - "g_password", 12, 12, - ;, - SET_CHOICE_DESC( "", "@PATCH_PASSWORD_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - // Voice Chat Enabled - FRAME_CHOICE_DVARYESNO_FOCUS_VIS_EX( 7, "@MENU_VOICECHAT_CAPS", - "sv_voice", - ;, - SET_CHOICE_DESC( "", "@PATCH_VOICECHAT_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - // Team Change Enabled - FRAME_CHOICE_DVARYESNO_FOCUS_VIS_EX( 8, "@PATCH_MP_TEAMCHANGE_ALLOW_CAPS", - "g_allow_teamchange", - ;, - SET_CHOICE_DESC( "", "@PATCH_MP_TEAMCHANGE_ALLOW_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - - // Team Change Keep Balanced - FRAME_CHOICE_DVARYESNO_FOCUS_VIS_EX( 9, "@PATCH_MP_TEAMCHANGE_KEEPBALANCED_CAPS", - "g_teamchange_keepbalanced", - ;, - SET_CHOICE_DESC( "", "@PATCH_MP_TEAMCHANGE_KEEPBALANCED_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - // Team Change Grace Period - FRAME_CHOICE_DVAREDIT_NUMERIC_FOCUS_VIS_EX( 10, "@PATCH_MP_TEAMCHANGE_GRACEPERIOD_CAPS", - "g_teamchange_graceperiod", 4, - ;, - SET_CHOICE_DESC( "", "@PATCH_MP_TEAMCHANGE_GRACEPERIOD_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - // Auto-Balance Enabled - FRAME_CHOICE_DVARYESNO_FOCUS_VIS_EX( 11, "@PATCH_AUTOBALANCE_TEAMS_CAPS", - "scr_teambalance", - ;, - SET_CHOICE_DESC( "", "@PATCH_AUTO_BALANCE_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - - // Voting Enabled - FRAME_CHOICE_DVARYESNO_FOCUS_VIS_EX( 12, "@PATCH_ALLOW_VOTING_CAPS", - "g_allowvote", - ;, - SET_CHOICE_DESC( "", "@PATCH_ALLOW_VOTING_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - // Pre-game enabled - FRAME_CHOICE_DVARYESNO_FOCUS_VIS_EX( 13, "@PATCH_PREGAME_ENABLED_CAPS", - "g_pregame_enabled", - ;, - SET_CHOICE_DESC( "", "@PATCH_PRE_MATCH_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - // Pre-game min players - FRAME_CHOICE_DVAREDIT_NUMERIC_FOCUS_VIS_EX( 14, "@PATCH_PREGAME_MINPLAYERS_CAPS", - "party_minplayers", 3, - ;, - SET_CHOICE_DESC( "", "@PATCH_MINIMUM_PLAYERS_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - // Maximum Players - FRAME_CHOICE_DVAREDIT_NUMERIC_FOCUS_VIS_EX( 15, "@PATCH_MAXIMUM_PLAYERS_CAPS", - "sv_maxclients", 3, - ;, - SET_CHOICE_DESC( "", "@PATCH_MAXIMUM_PLAYERS_DESC", "" ), - CLEAR_CHOICE_DESC, 1, ; ) - - // VAC - FRAME_CHOICE_DVARYESNO_FOCUS_VIS_EX( 16, "@PLATFORM_VAC_CAPS", - "sv_vac", - ;, - SET_CHOICE_DESC( "", "@PATCH_VALVE_ANTI_CHEAT_DESC", "" ), - CLEAR_CHIOCE_DESC, 1, ; ) - - HINT_TEXT_ALL_RECT( CHOICE_X_START, ( (SERVERSETTINGS_FRAME_HEIGHT / 2) - 30 ), ( CHOICE_SIZE_X ), dvarString( ui_choice_desc ), 1 1 1 1, ( MenuHasFocus() && dvarString( ui_choice_desc ) != "" ), ; ) - - NEW_FRAME_BACK_BUTTON_ACTION( SERVERSETTINGS_FRAME_WIDTH, SERVERSETTINGS_FRAME_HEIGHT, ON_ESC ) - - #include "ui/safearea.menu" -} - diff --git a/mods/patch_mp/ui_mp/playercards.menu b/mods/patch_mp/ui_mp/playercards.menu deleted file mode 100644 index dbb7bc8..0000000 --- a/mods/patch_mp/ui_mp/playercards.menu +++ /dev/null @@ -1,1352 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" -#include "ui/frame.inc" - -#undef CHOICE_X_START -#define CHOICE_X_START FRAME_CHOICE_X_START -#undef CHOICE_Y_START -#define CHOICE_Y_START FRAME_CHOICE_Y_START -#define BUTTON_BG_WIDTH FRAME_BUTTON_WIDTH - -#define CHOICE_SEP_OFFSET_X 20 -#define CHOICE_SEP_OFFSET_Y -2 - -#define CHOICE_GROUP "playercard" - -#ifdef XENON - #define SELECT_ICON "ui_button_xenon_3d_a_32x32" -#endif -#ifdef PS3 - #define SELECT_ICON "ui_button_ps3_x_32x32" -#endif - -#include "ui_mp/menustyle.inc" -#include "ui_mp/overlaybg.inc" -#include "ui/choices_setup_common.menu" -#include "ui_mp/popup_player_info.inc" -#include "ui_mp/stats_info.inc" - -#ifndef BASE_LB_TYPES_COUNT -#define BASE_LB_TYPES_COUNT int(tableLookup( "mp/gameTypesTable.csv", 0, "maxnum_gametype", 1 )) -#endif - -#undef CHOICE_TEXTCOLOR -#define CHOICE_TEXTCOLOR NEW_FRAME_COMMON_TEXT_COLOR - -#define PLAYER_EMBLEM_BG_SIZE (190) -#define PLAYER_EMBLEM_SIZE (PLAYER_EMBLEM_BG_SIZE - 20) -#define PLAYER_EMBLEM_X_START 70 -#define PLAYER_EMBLEM_Y_START (CHOICE_Y_START+20) - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X BUTTON_BG_WIDTH -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL - -#undef CHOICE_HORIZONTAL_ALIGN -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER - -#undef CHOICE_VERTICAL_ALIGN -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER - -#define PLAYER_RANK getDStat( "PlayerStatsList", "RANK" ) -#define PLAYER_PRESTIGE getDStat( "PlayerStatsList", "PLEVEL" ) -#define PLAYER_RANKXP getDStat( "PlayerStatsList", "RANKXP" ) - -#define PLAYER_CARD_COMMON_ITEMS \ \ - /* PLAYER NAME */ \ - PLAYER_CLAN_TAG_AND_NAME( PLAYER_EMBLEM_X_START, (PLAYER_EMBLEM_Y_START-18), 1 ) \ - /* BACKGROUND FOR EMBLEM */ \ - PREPROC_SHADER_DRAW_VIS_EX( PLAYER_EMBLEM_X_START PLAYER_EMBLEM_Y_START PLAYER_EMBLEM_BG_SIZE PLAYER_EMBLEM_BG_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "white", 0 0 0 0.4, \ - 1, ; ) \ - /* PLAYER EMBLEM */ \ - PLAYER_EMBLEM_ALL( (PLAYER_EMBLEM_X_START+10), (PLAYER_EMBLEM_Y_START+10), PLAYER_EMBLEM_SIZE, PLAYER_EMBLEM_SIZE, 1 ) - -#define FRIENDS_PLAYER_CARD_COMMON_ITEMS \ - /* PLAYER NAME */ \ - FRIEND_NAME( PLAYER_EMBLEM_X_START, (PLAYER_EMBLEM_Y_START-18), 1 ) \ - /* BACKGROUND FOR EMBLEM */ \ - PREPROC_SHADER_DRAW_VIS_EX( PLAYER_EMBLEM_X_START PLAYER_EMBLEM_Y_START PLAYER_EMBLEM_BG_SIZE PLAYER_EMBLEM_BG_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, \ - "white", 0 0 0 0.4, \ - 1, ; ) \ - /* PLAYER EMBLEM */ \ - FRIEND_EMBLEM_ALL( (PLAYER_EMBLEM_X_START+10), (PLAYER_EMBLEM_Y_START+10), PLAYER_EMBLEM_SIZE, PLAYER_EMBLEM_SIZE, 1 ) - - -#undef CLOSE_CARD_DROPDOWN_CLANTAG -#define CLOSE_CARD_DROPDOWN_CLANTAG \ - play CHOICE_FOCUS_SOUND; \ - setLocalVarBool ui_show_clan_edit 0; \ - execnow ui_animate menu_playercard_self * CloseDropDownList 0; \ - -#undef ON_ESC_ACTION -#define ON_ESC_ACTION \ - if( dvarstring( "ui_in_player_card_popup" ) == "clantag" ) \ - { \ - CLOSE_CARD_DROPDOWN_CLANTAG \ - } \ - else \ - { \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self, MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM, MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM ) ; \ - CLEARUIHINT; \ - deactivateBlur; \ - play uin_navigation_menu_lg_close; \ - if( dvarInt( ui_leaderboardOpen ) == 1 ) \ - { \ - execnow changemenucloseslidedirection menu_playercard_self MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - close self; \ - execnow openmenu (dvarString("leaderboard_menu_name")); \ - } \ - else \ - { \ - close self; \ - setdvar ui_playercard_self_open 0; \ - } \ - } - -#define PLAYER_CARD_DROPDOWN_LIST_NAME "player_card_dropdown_list_" -#define PLAYER_CARD_BUTTON_NAME "playercard_button_" - -#undef NEW_FRAME_BUTTON_NAME -#define NEW_FRAME_BUTTON_NAME "playercard_button_" -#define PLAYER_CARD_SELECTION_FADE_TIME 80 -#define PLAYER_CARD_SELECTION_SLIDE_TIME 80 -#define PLAYER_CARD_SELECTION_UNROLL_TIME 120 - -#define PLAYER_CARD_LISTBOX_RECT (CHOICE_X_START-3) (CHOICE_Y_START+NEW_FRAME_BUTTON_HEIGHT+2) (CHOICE_SIZE_X+4) 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER -#define PLAYER_CARD_LISTBOX_UNROLLED_RECT (CHOICE_X_START-3) (CHOICE_Y_START+NEW_FRAME_BUTTON_HEIGHT+2) (CHOICE_SIZE_X+4) 250 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - -#define CHALLENGES_LOCKED ( IS_ITEM_LOCKED( FEATURE_CHALLENGES ) ) - -{ - menuDef - { - name menu_playercard_self - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - control MENU_CONTROL_OPENER - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - onOpen - { - activateBlur; - setLocalVarBool ui_show_clan_edit 0; - play uin_navigation_menu_lg_open; - } - onFocus { - - } - onClose - {deactivateBlur; } - onESC - { - ON_ESC_ACTION - } - - FRAME_DEFAULT - FRAME_TITLE_DEFAULT( "@MENU_MY_PLAYERCARD_CAPS", when( dvarString( ui_in_player_card_popup ) != "clantag" ) ) - FRAME_TITLE_DEFAULT( "@MPUI_CLAN_TAG_CAPS", when( dvarString( ui_in_player_card_popup ) == "clantag" ) ) - - PLAYER_INFO_VIS( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, 1 ) - - // This is a dummy itemDef to disable controls. - // Used when animating. - itemDef - { - name dummyButton - type ITEM_TYPE_BUTTON_NO_TEXT - rect 0 0 0 0 - visible when( localVarString( "ui_disable_controls" ) == 1 ); - - execKeyInt APAD_UP {} - execKeyInt DPAD_UP {} - execKeyInt APAD_DOWN {} - execKeyInt DPAD_DOWN {} - execKeyInt APAD_LEFT {} - execKeyInt DPAD_LEFT {} - execKeyInt APAD_RIGHT {} - execKeyInt DPAD_RIGHT {} - } - - // This is a dummy itemDef that acts as the central hub for - // animation control in the new playercard - itemDef - { - name anim_controller - style WINDOW_STYLE_SHADER - rect 0 0 0 0 - visible 1 - decoration - - // Open dropdown - state - { - name OpenDropDownList - onEnter - { - execnow ui_animate menu_playercard_self * Transparent PLAYER_CARD_SELECTION_FADE_TIME; - execnow ui_animate menu_playercard_self (PLAYER_CARD_BUTTON_NAME+localVarInt(ui_playercardButton)) Default 0; - execnow ui_animate menu_playercard_self anim_controller OpenDropDownList2 PLAYER_CARD_SELECTION_FADE_TIME; - } - } - state - { - name OpenDropDownList2 - onEnter - { - execnow ui_animate menu_playercard_self (PLAYER_CARD_BUTTON_NAME+localVarInt(ui_playercardButton)) Top PLAYER_CARD_SELECTION_SLIDE_TIME; - execnow ui_animate menu_playercard_self anim_controller OpenDropDownList3 PLAYER_CARD_SELECTION_SLIDE_TIME; - } - } - state - { - name OpenDropDownList3 - onEnter - { - execnow ui_animate menu_playercard_self (PLAYER_CARD_DROPDOWN_LIST_NAME+localVarInt(ui_playercardButton)) Unrolled PLAYER_CARD_SELECTION_UNROLL_TIME; - play uin_navigation_menu_sm_open; - exec updateListboxPos menu_playercard_self; - } - } - - // Close dropdown - state - { - name CloseDropDownList - onEnter - { - setLocalVarInt ui_disable_controls 1; - setFocus dummyButton; - if ( localVarString( ui_playercardListboxCloseOverride ) != "" ) - { - execnow ui_animate menu_playercard_self (anim_controller) (localVarString( ui_playercardListboxCloseOverride )) 0; - } - else - { - execnow ui_animate menu_playercard_self (PLAYER_CARD_DROPDOWN_LIST_NAME+localVarInt(ui_playercardButton)) Default PLAYER_CARD_SELECTION_UNROLL_TIME; - execnow ui_animate menu_playercard_self anim_controller CloseDropDownList2 (PLAYER_CARD_SELECTION_UNROLL_TIME+30); - play uin_navigation_menu_sm_close; - } - } - } - state - { - name CloseDropDownList2 - onEnter - { - execnow "set ui_in_player_card_popup 0"; - execnow ui_animate menu_playercard_self (PLAYER_CARD_BUTTON_NAME+localVarInt(ui_playercardButton)) Default PLAYER_CARD_SELECTION_SLIDE_TIME; - execnow ui_animate menu_playercard_self anim_controller CloseDropDownList3 (PLAYER_CARD_SELECTION_SLIDE_TIME+30); - } - } - state - { - name CloseDropDownList3 - onEnter - { - execnow focusItem (PLAYER_CARD_BUTTON_NAME+localVarInt(ui_playercardButton)); - setLocalVarInt ui_disable_controls 0; - execnow ui_animate menu_playercard_self * Default PLAYER_CARD_SELECTION_FADE_TIME; - } - } - } - - #define PLAYER_CARD_RECT_STATE( nameArg, rectArg ) \ - state \ - { \ - name nameArg \ - rect rectArg \ - } - - #define EMBLEM_EDITOR_BUTTON_ACTION \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ); \ - close self; \ - execnow assertDWConnection; \ - execNow "emblemgetprofile"; \ - execNow emblemSelect 0; \ - open emblem_edit; - - // EMBLEM EDITOR BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 1, "@MENU_EMBLEM_EDITOR_CAPS", - EMBLEM_EDITOR_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_EMBLEM_EDITOR_DESC" ) CLEAR_ITEM_NEW( FEATURE_EMBLEM ), - CLEARUIHINT, - !IS_ITEM_LOCKED( FEATURE_EMBLEM ), ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 1, "@MENU_EMBLEM_EDITOR_CAPS", - SET_HINT_TEXT( GET_UNLOCK_LEVEL_STRING( FEATURE_EMBLEM ) ), - CLEARUIHINT, - IS_ITEM_LOCKED( FEATURE_EMBLEM ), ; ) - CHOICE_NEWICON_VIS( 1, "menu_mp_lobby_new", when( IS_ITEM_NEW( FEATURE_EMBLEM ) ) ) - CHOICE_LOCKEDICON_VIS( 1, "menu_mp_lobby_locked", when( IS_ITEM_LOCKED( FEATURE_EMBLEM ) ) ) - - #define PLAYER_CARD_CLANTAG_BUTTON_ACTION \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ); \ - close self; \ - execnow statsetbyname hasclantag 1; \ - execnow changemenuopenslidedirection menu_playercards_clantag MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; \ - open menu_playercards_clantag; - - // CLAN TAG BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 2, "@MPUI_CLAN_TAG_CAPS", - setdvar lb_prestige 0; PLAYER_CARD_CLANTAG_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_CLAN_TAG_DESC" ) CLEAR_ITEM_NEW( FEATURE_CLAN_TAG ), - CLEARUIHINT, - !IS_ITEM_LOCKED( FEATURE_CLAN_TAG ), PLAYER_CARD_RECT_STATE( Top, CHOICE_RECT( 1 ) ) ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 2, "@MPUI_CLAN_TAG_CAPS", - SET_HINT_TEXT( GET_UNLOCK_LEVEL_STRING( FEATURE_CLAN_TAG ) ), - CLEARUIHINT, - IS_ITEM_LOCKED( FEATURE_CLAN_TAG ), ; ) - CHOICE_NEWICON_VIS( 2, "menu_mp_lobby_new", when( IS_ITEM_NEW( FEATURE_CLAN_TAG ) ) ) - CHOICE_LOCKEDICON_VIS( 2, "menu_mp_lobby_locked", when( IS_ITEM_LOCKED( FEATURE_CLAN_TAG ) ) ) - - #define CHALLENGES_BUTTON_ACTION \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ); \ - close self; \ - open menu_playercard_challenges; - - // CHALLENGES BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 4, "@MENU_CHALLENGES_CAPS", - CHALLENGES_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_CHALLENGES_DESC" ) CLEAR_ITEM_NEW( FEATURE_CHALLENGES ), - CLEARUIHINT, - !CHALLENGES_LOCKED, ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 4, "@MENU_CHALLENGES_CAPS", - SET_HINT_TEXT( GET_UNLOCK_LEVEL_STRING( FEATURE_CHALLENGES ) ), - CLEARUIHINT, - CHALLENGES_LOCKED, ; ) - CHOICE_NEWICON_VIS( 4, "menu_mp_lobby_new", when( ANY_NEW_CHALLENGES ) ) - CHOICE_LOCKEDICON_VIS( 4, "menu_mp_lobby_locked", when( CHALLENGES_LOCKED ) ) - - #define COMBAT_RECORD_BUTTON_ACTION \ - setdvar ui_showFriendsCombatRecord 0; \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ); \ - close self; \ - open menu_cr_career_summary; - - // COMBAT RECORD BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 5, "@MENU_COMBAT_RECORD_CAPS", - COMBAT_RECORD_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_COMBAT_RECORD_DESC" ) CLEAR_ITEM_NEW( FEATURE_COMBAT_RECORD ), - CLEARUIHINT, - !IS_ITEM_LOCKED( FEATURE_COMBAT_RECORD ), ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 5, "@MENU_COMBAT_RECORD_CAPS", - SET_HINT_TEXT( GET_UNLOCK_LEVEL_STRING( FEATURE_COMBAT_RECORD ) ), - CLEARUIHINT, - IS_ITEM_LOCKED( FEATURE_COMBAT_RECORD ), ; ) - CHOICE_NEWICON_VIS( 5, "menu_mp_lobby_new", when( IS_ITEM_NEW( FEATURE_COMBAT_RECORD ) ) ) - CHOICE_LOCKEDICON_VIS( 5, "menu_mp_lobby_locked", when( IS_ITEM_LOCKED( FEATURE_COMBAT_RECORD ) ) ) - - #define LEADERBOARDS_BUTTON_ACTION \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ); \ - close self; \ - setdvar lb_prestige 0; \ - execnow changemenuopenslidedirection menu_playercards_lb MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; \ - open menu_playercards_lb; - - // LEADERBOARDS BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 6, "@MPUI_LEADERBOARDS_CAPS", - LEADERBOARDS_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_LEADERBOARDS_DESC" ), - CLEARUIHINT, - 1, ; ) - - #define FILE_SHARE_BUTTON_ACTION \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ); \ - close self; \ - open menu_fileshare_myshare; - - // FILE SHARE BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 8, "@MENU_FILESHARE_MYSHARE_CAPS", - FILE_SHARE_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_FILE_SHARE_DESC" ), - CLEARUIHINT, - 1, ; ) - - #define RECENT_FILMS_BUTTON_ACTION \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ); \ - close self; \ - open menu_fileshare_myrecentgames; - - // RECENT FILMS BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 9, "@MENU_FILESHARE_MYRECENTGAMES_CAPS", - RECENT_FILMS_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_MY_RECENT_GAMES_DESC" ), - CLEARUIHINT, - 1, ; ) - - #define COMMUNITY_ACTION \ - if ( canShowContentFromUser( 0 ) ) \ - { \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ) ; \ - close self; \ - open menu_fileshare_community; \ - } \ - else \ - { \ - open menu_community_viewwarning; \ - } - - // COMMUNITY BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 10, "@MENU_FILESHARE_COMMUNITY_CAPS", - COMMUNITY_ACTION, - SET_HINT_TEXT( "@MPUI_COMMUNITY_DESC" ), - CLEARUIHINT, - 1, ; ) - - // PRESTIGE BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 12, "@MPUI_PRESTIGE_MODE_CAPS", - open prestige_reset1;, - SET_HINT_TEXT( "@MPUI_PRESTIGE_MODE_DESC" ), - exec "statsetbyname hasprestiged 1"; CLEARUIHINT, - PRESTIGE_AVAIL, ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 12, "@MPUI_PRESTIGE_MODE_CAPS", - SET_HINT_TEXT( "@MPUI_DESC_PRESTIGE2" ), - CLEARUIHINT, - PRESTIGE_AVAIL==0 && PRESTIGE_FINISH==0, ; ) - CHOICE_NEWICON_VIS( 12, "menu_mp_lobby_new", when( PRESTIGE_AVAIL && GetStatByName( "HASPRESTIGED" ) == 0 ) ) - CHOICE_LOCKEDICON_VIS( 12, "menu_mp_lobby_locked", when( PRESTIGE_AVAIL == 0 && PRESTIGE_FINISH == 0 ) ) - - PLAYER_CARD_COMMON_ITEMS - -#define RANKTABLE_COL_MINXP 2 -#define RANKTABLE_COL_XP_TO_NEXT 3 -#define RANKTABLE_COL_MAX_XP 7 - -#define XP_BAR_X (CHOICE_X_START+55) -#define XP_BAR_Y (FRAME_DEFAULT_HEIGHT/2-32) -#define XP_BAR_BG_WIDTH (FRAME_DEFAULT_WIDTH-135) -#define XP_BAR_HEIGHT 20 - -#define XP_TO_NEXT_RANK int( tableLookup( "mp/rankTable.csv", 0, PLAYER_RANK, RANKTABLE_COL_XP_TO_NEXT ) ) -#define MINXP_FOR_CURR_RANK int( tableLookup( "mp/rankTable.csv", 0, PLAYER_RANK, RANKTABLE_COL_MINXP ) ) -#define NEXT_LEVEL ( tablelookup( "mp/ranktable.csv", 0, getDStat( "PlayerStatsList", "RANK" ) + 1, 14 ) ) - -#define XP_BAR_WIDTH ( ( ( PLAYER_RANKXP - MINXP_FOR_CURR_RANK ) / XP_TO_NEXT_RANK ) * XP_BAR_BG_WIDTH ) - -#define XP_NEEDED_TO_LEVEL_UP \ - locString( "MPUI_AAR_XP_NEEDED_CAPS",int( tableLookup( "mp/rankTable.csv", 0, PLAYER_RANK, RANKTABLE_COL_MAX_XP ) - PLAYER_RANKXP ) ) - - /* BACKGROUND FOR XP BAR */ - PREPROC_SHADER_DRAW_VIS_EX( XP_BAR_X XP_BAR_Y XP_BAR_BG_WIDTH XP_BAR_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "white", BG_BACKCOLOR, - when( CAN_RANK_UP ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( XP_BAR_X XP_BAR_Y XP_BAR_BG_WIDTH XP_BAR_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "menu_mp_bar_shadow", 1 1 1 0.2, - when( CAN_RANK_UP ), ; ) - /* XP BAR */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( XP_BAR_X, - XP_BAR_Y, - ( XP_BAR_WIDTH ), - XP_BAR_HEIGHT, - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "menu_mp_combatrecord_bar", BAR_COLOR, - when( CAN_RANK_UP ), - ; ) - /* Tiny arrow at xp bar end */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( XP_BAR_X + XP_BAR_WIDTH - 5 ), - (XP_BAR_Y+XP_BAR_HEIGHT), - 10, - 10, - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "ui_arrow_right", BAR_COLOR, - when( CAN_RANK_UP ), - rotation -90; ) - /* Label for "NEXT LEVEL" */ - PREPROC_TEXT_DRAW( (XP_BAR_X-55) (XP_BAR_Y+4) 10 XP_BAR_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@MPUI_NEXT_LEVEL_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, CHOICE_TEXTCOLOR ) - /* value for XP NEEDED to next level */ - PREPROC_TEXT_DRAW_VIS( (XP_BAR_X+5) (XP_BAR_Y+4) 10 XP_BAR_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, XP_NEEDED_TO_LEVEL_UP, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, CHOICE_TEXTCOLOR, when( CAN_RANK_UP ) ) - /* next level */ - PREPROC_TEXT_DRAW_VIS( (XP_BAR_X+XP_BAR_BG_WIDTH+3) (XP_BAR_Y+2) 17 17 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, int( NEXT_LEVEL ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( CAN_RANK_UP && PRESTIGE_NEXT==0 ) ) - PREPROC_TEXT_DRAW_VIS( (XP_BAR_X+XP_BAR_BG_WIDTH+3) (XP_BAR_Y+2) 17 17 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "1", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( CAN_RANK_UP && PRESTIGE_NEXT ) ) - /* next level rank icon */ - RANK_ICON_ADV( (XP_BAR_X+XP_BAR_BG_WIDTH+6+getTextWidth( NEXT_LEVEL, CHOICE_TEXTFONT, TEXTSIZE_DEFAULT )), (XP_BAR_Y+2), HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - tablelookup( "mp/rankIconTable.csv", 0, PLAYER_RANK+1, PLAYER_PRESTIGE+1 ), - when( CAN_RANK_UP && PRESTIGE_NEXT==0 ) ) - RANK_ICON_ADV( (XP_BAR_X+XP_BAR_BG_WIDTH+6+getTextWidth( "1", CHOICE_TEXTFONT, TEXTSIZE_DEFAULT )), (XP_BAR_Y+2), HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - tablelookup( "mp/rankIconTable.csv", 0, 0, PLAYER_PRESTIGE+2 ), - when( CAN_RANK_UP && PRESTIGE_NEXT ) ) - - HINT_TEXT_ALL( 13, CHOICE_X_START, 8, CHOICE_SIZE_X, dvarString( ui_hint_text ), 1 1 1 1, dvarBool( ui_show_arrow ), ; ) - -#ifdef CONSOLE - NEW_FRAME_BACK_BUTTON_ACTION( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, ON_ESC_ACTION ; ) -#else - NEW_FRAME_BACK_BUTTON_ACTION( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, ON_ESC_ACTION ; ) -#endif - - #include "ui/safearea.menu" - } - - menuDef - { - name menu_playercard_self_basictraining - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - control MENU_CONTROL_OPENER - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - onOpen - { - if( dvarbool(ui_selectlobby) ) - { - activateBlur; - } - play uin_navigation_menu_lg_open; - if( !dvarBool( ui_playercard_self_basictraining_open ) ) - { activateBlur; setdvar ui_playercard_self_basictraining_open "1"; } - } - onFocus { - if( !dvarbool(ui_selectlobby) ) - { - activateBlur; - } - } - onClose - {} - - #undef ON_ESC_ACTION - #define ON_ESC_ACTION \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self_basictraining, MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM, MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM ) ; \ - CLEARUIHINT; \ - deactivateBlur; \ - play uin_navigation_menu_lg_close; \ - close self; \ - setdvar ui_playercard_self_basictraining_open 0; - - onESC - { - ON_ESC_ACTION - } - - FRAME_DEFAULT - FRAME_TITLE_DEFAULT( "@MENU_MY_PLAYERCARD_CAPS", 1 ) - - PLAYER_INFO_VIS( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, 1 ) - - // This is a dummy itemDef to disable controls. - // Used when animating. - itemDef - { - name dummyButton - type ITEM_TYPE_BUTTON_NO_TEXT - rect 0 0 0 0 - visible when( localVarString( "ui_disable_controls" ) == 1 ); - - execKeyInt APAD_UP {} - execKeyInt DPAD_UP {} - execKeyInt APAD_DOWN {} - execKeyInt DPAD_DOWN {} - execKeyInt APAD_LEFT {} - execKeyInt DPAD_LEFT {} - execKeyInt APAD_RIGHT {} - execKeyInt DPAD_RIGHT {} - } - - // This is a dummy itemDef that acts as the central hub for - // animation control in the new playercard - itemDef - { - name anim_controller - style WINDOW_STYLE_SHADER - rect 0 0 0 0 - visible 1 - decoration - - // Open dropdown - state - { - name OpenDropDownList - onEnter - { - execnow ui_animate menu_playercard_self_basictraining * Transparent PLAYER_CARD_SELECTION_FADE_TIME; - execnow ui_animate menu_playercard_self_basictraining (PLAYER_CARD_BUTTON_NAME+localVarInt(ui_playercardButton)) Default 0; - execnow ui_animate menu_playercard_self_basictraining anim_controller OpenDropDownList2 PLAYER_CARD_SELECTION_FADE_TIME; - } - } - state - { - name OpenDropDownList2 - onEnter - { - execnow ui_animate menu_playercard_self_basictraining (PLAYER_CARD_BUTTON_NAME+localVarInt(ui_playercardButton)) Top PLAYER_CARD_SELECTION_SLIDE_TIME; - execnow ui_animate menu_playercard_self_basictraining anim_controller OpenDropDownList3 PLAYER_CARD_SELECTION_SLIDE_TIME; - } - } - state - { - name OpenDropDownList3 - onEnter - { - execnow ui_animate menu_playercard_self_basictraining (PLAYER_CARD_DROPDOWN_LIST_NAME+localVarInt(ui_playercardButton)) Unrolled PLAYER_CARD_SELECTION_UNROLL_TIME; - play uin_navigation_menu_sm_open; - exec updateListboxPos menu_playercard_self_basictraining; - } - } - - // Close dropdown - state - { - name CloseDropDownList - onEnter - { - setLocalVarInt ui_disable_controls 1; - setFocus dummyButton; - if ( localVarString( ui_playercardListboxCloseOverride ) != "" ) - { - execnow ui_animate menu_playercard_self_basictraining (anim_controller) (localVarString( ui_playercardListboxCloseOverride )) 0; - } - else - { - execnow ui_animate menu_playercard_self_basictraining (PLAYER_CARD_DROPDOWN_LIST_NAME+localVarInt(ui_playercardButton)) Default PLAYER_CARD_SELECTION_UNROLL_TIME; - execnow ui_animate menu_playercard_self_basictraining anim_controller CloseDropDownList2 (PLAYER_CARD_SELECTION_UNROLL_TIME+30); - play uin_navigation_menu_sm_close; - } - } - } - state - { - name CloseDropDownList2 - onEnter - { - execnow "set ui_in_player_card_popup 0"; - execnow ui_animate menu_playercard_self_basictraining (PLAYER_CARD_BUTTON_NAME+localVarInt(ui_playercardButton)) Default PLAYER_CARD_SELECTION_SLIDE_TIME; - execnow ui_animate menu_playercard_self_basictraining anim_controller CloseDropDownList3 (PLAYER_CARD_SELECTION_SLIDE_TIME+30); - } - } - state - { - name CloseDropDownList3 - onEnter - { - execnow focusItem (PLAYER_CARD_BUTTON_NAME+localVarInt(ui_playercardButton)); - setLocalVarInt ui_disable_controls 0; - execnow ui_animate menu_playercard_self_basictraining * Default PLAYER_CARD_SELECTION_FADE_TIME; - } - } - } - - // EMBLEM EDITOR BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 1, "@MENU_EMBLEM_EDITOR_CAPS", - EMBLEM_EDITOR_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_EMBLEM_EDITOR_DESC" ) CLEAR_ITEM_NEW( FEATURE_EMBLEM ), - CLEARUIHINT, - !IS_ITEM_LOCKED( FEATURE_EMBLEM ), ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 1, "@MENU_EMBLEM_EDITOR_CAPS", - SET_HINT_TEXT( GET_UNLOCK_LEVEL_STRING( FEATURE_EMBLEM ) ), - CLEARUIHINT, - IS_ITEM_LOCKED( FEATURE_EMBLEM ), ; ) - CHOICE_NEWICON_VIS( 1, "menu_mp_lobby_new", when( IS_ITEM_NEW( FEATURE_EMBLEM ) ) ) - CHOICE_LOCKEDICON_VIS( 1, "menu_mp_lobby_locked", when( IS_ITEM_LOCKED( FEATURE_EMBLEM ) ) ) - - // CLAN TAG BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 2, "@MPUI_CLAN_TAG_CAPS", - setdvar lb_prestige 0; PLAYER_CARD_CLANTAG_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_CLAN_TAG_DESC" ) CLEAR_ITEM_NEW( FEATURE_CLAN_TAG ), - CLEARUIHINT, - !IS_ITEM_LOCKED( FEATURE_CLAN_TAG ), PLAYER_CARD_RECT_STATE( Top, CHOICE_RECT( 1 ) ) ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 2, "@MPUI_CLAN_TAG_CAPS", - SET_HINT_TEXT( GET_UNLOCK_LEVEL_STRING( FEATURE_CLAN_TAG ) ), - CLEARUIHINT, - IS_ITEM_LOCKED( FEATURE_CLAN_TAG ), ; ) - CHOICE_NEWICON_VIS( 2, "menu_mp_lobby_new", when( IS_ITEM_NEW( FEATURE_CLAN_TAG ) ) ) - CHOICE_LOCKEDICON_VIS( 2, "menu_mp_lobby_locked", when( IS_ITEM_LOCKED( FEATURE_CLAN_TAG ) ) ) - -#undef CHALLENGES_BUTTON_ACTION -#define CHALLENGES_BUTTON_ACTION \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self_basictraining, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ); \ - close self; \ - open menu_playercard_challenges; - - // CHALLENGES BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 4, "@MENU_CHALLENGES_CAPS", - CHALLENGES_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_CHALLENGES_DESC" ) CLEAR_ITEM_NEW( FEATURE_CHALLENGES ), - CLEARUIHINT, - !CHALLENGES_LOCKED, ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 4, "@MENU_CHALLENGES_CAPS", - SET_HINT_TEXT( GET_UNLOCK_LEVEL_STRING( FEATURE_CHALLENGES ) ), - CLEARUIHINT, - CHALLENGES_LOCKED, ; ) - CHOICE_NEWICON_VIS( 4, "menu_mp_lobby_new", when( ANY_NEW_CHALLENGES ) ) - CHOICE_LOCKEDICON_VIS( 4, "menu_mp_lobby_locked", when( CHALLENGES_LOCKED ) ) - -#undef COMBAT_RECORD_BUTTON_ACTION -#define COMBAT_RECORD_BUTTON_ACTION \ - setdvar ui_showFriendsCombatRecord 0; \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self_basictraining, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ); \ - close self; \ - open menu_cr_career_summary; - - // COMBAT RECORD BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 5, "@MENU_COMBAT_RECORD_CAPS", - COMBAT_RECORD_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_COMBAT_RECORD_DESC" ) CLEAR_ITEM_NEW( FEATURE_COMBAT_RECORD ), - CLEARUIHINT, - !IS_ITEM_LOCKED( FEATURE_COMBAT_RECORD ), ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 5, "@MENU_COMBAT_RECORD_CAPS", - SET_HINT_TEXT( GET_UNLOCK_LEVEL_STRING( FEATURE_COMBAT_RECORD ) ), - CLEARUIHINT, - IS_ITEM_LOCKED( FEATURE_COMBAT_RECORD ), ; ) - CHOICE_NEWICON_VIS( 5, "menu_mp_lobby_new", when( IS_ITEM_NEW( FEATURE_COMBAT_RECORD ) ) ) - CHOICE_LOCKEDICON_VIS( 5, "menu_mp_lobby_locked", when( IS_ITEM_LOCKED( FEATURE_COMBAT_RECORD ) ) ) - - - // LEADERBOARDS BUTTON - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 6, "@MPUI_LEADERBOARDS_CAPS", - SET_HINT_TEXT( "@MPUI_NOT_APPLICABLE_IN_COMBAT_TRAINING" ), - CLEARUIHINT, - 1, ; ) - CHOICE_LOCKEDICON_VIS( 6, "menu_mp_lobby_locked", 1 ) - -#undef FILE_SHARE_BUTTON_ACTION -#define FILE_SHARE_BUTTON_ACTION \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self_basictraining, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ); \ - close self; \ - open menu_fileshare_myshare; - - // FILE SHARE BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 8, "@MENU_FILESHARE_MYSHARE_CAPS", - FILE_SHARE_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_FILE_SHARE_DESC" ), - CLEARUIHINT, - 1, ; ) - -#undef RECENT_FILMS_BUTTON_ACTION -#define RECENT_FILMS_BUTTON_ACTION \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self_basictraining, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ); \ - close self; \ - open menu_fileshare_myrecentgames; - - // RECENT FILMS BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 9, "@MENU_FILESHARE_MYRECENTGAMES_CAPS", - RECENT_FILMS_BUTTON_ACTION, - SET_HINT_TEXT( "@MPUI_MY_RECENT_GAMES_DESC" ), - CLEARUIHINT, - 1, ; ) -#undef COMMUNITY_ACTION -#define COMMUNITY_ACTION \ - if ( canShowContentFromUser( 0 ) ) \ - { \ - CHANGE_MENU_SLIDE_DIRECTION( menu_playercard_self_basictraining, MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT, MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT ) ; \ - close self; \ - open menu_fileshare_community; \ - } \ - else \ - { \ - open menu_community_viewwarning; \ - } - - // COMMUNITY BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 10, "@MENU_FILESHARE_COMMUNITY_CAPS", - COMMUNITY_ACTION, - SET_HINT_TEXT( "@MPUI_COMMUNITY_DESC" ), - CLEARUIHINT, - 1, ; ) - // PRESTIGE BUTTON - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 12, "@MPUI_PRESTIGE_MODE_CAPS", - open prestige_reset1;, - SET_HINT_TEXT( "@MPUI_PRESTIGE_MODE_DESC" ), - exec "statsetbyname hasprestiged 1"; CLEARUIHINT, - PRESTIGE_AVAIL, ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 12, "@MPUI_PRESTIGE_MODE_CAPS", - SET_HINT_TEXT( "@MPUI_DESC_PRESTIGE2" ), - CLEARUIHINT, - PRESTIGE_AVAIL==0 && PRESTIGE_FINISH==0, ; ) - CHOICE_NEWICON_VIS( 12, "menu_mp_lobby_new", when( PRESTIGE_AVAIL && GetStatByName( "HASPRESTIGED" ) == 0 ) ) - CHOICE_LOCKEDICON_VIS( 12, "menu_mp_lobby_locked", when( PRESTIGE_AVAIL == 0 && PRESTIGE_FINISH == 0 ) ) - - PLAYER_CARD_COMMON_ITEMS - - /* BACKGROUND FOR XP BAR */ - PREPROC_SHADER_DRAW_VIS_EX( XP_BAR_X XP_BAR_Y XP_BAR_BG_WIDTH XP_BAR_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "white", BG_BACKCOLOR, - when( CAN_RANK_UP ), ; ) - PREPROC_SHADER_DRAW_VIS_EX( XP_BAR_X XP_BAR_Y XP_BAR_BG_WIDTH XP_BAR_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "menu_mp_bar_shadow", 1 1 1 0.2, - when( CAN_RANK_UP ), ; ) - /* XP BAR */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( XP_BAR_X, - XP_BAR_Y, - ( XP_BAR_WIDTH ), - XP_BAR_HEIGHT, - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "menu_mp_combatrecord_bar", BAR_COLOR, - when( CAN_RANK_UP ), - ; ) - /* Tiny arrow at xp bar end */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( XP_BAR_X + XP_BAR_WIDTH - 5 ), - (XP_BAR_Y+XP_BAR_HEIGHT), - 10, - 10, - CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, - "ui_arrow_right", BAR_COLOR, - 1, - rotation -90; ) - /* Label for "NEXT LEVEL" */ - PREPROC_TEXT_DRAW( (XP_BAR_X-55) (XP_BAR_Y+4) 10 XP_BAR_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "@MPUI_NEXT_LEVEL_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, CHOICE_TEXTCOLOR ) - /* value for XP NEEDED to next level */ - PREPROC_TEXT_DRAW_VIS( (XP_BAR_X+5) (XP_BAR_Y+4) 10 XP_BAR_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, XP_NEEDED_TO_LEVEL_UP, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, CHOICE_TEXTCOLOR, when( CAN_RANK_UP ) ) - /* next level */ - PREPROC_TEXT_DRAW_VIS( (XP_BAR_X+XP_BAR_BG_WIDTH+3) (XP_BAR_Y+2) 17 17 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, int( NEXT_LEVEL ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( CAN_RANK_UP && PRESTIGE_NEXT==0 ) ) - PREPROC_TEXT_DRAW_VIS( (XP_BAR_X+XP_BAR_BG_WIDTH+3) (XP_BAR_Y+2) 17 17 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, "1", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, when( CAN_RANK_UP && PRESTIGE_NEXT ) ) - /* next level rank icon */ - RANK_ICON_ADV( (XP_BAR_X+XP_BAR_BG_WIDTH+6+getTextWidth( NEXT_LEVEL, CHOICE_TEXTFONT, TEXTSIZE_DEFAULT )), (XP_BAR_Y+2), HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - tablelookup( "mp/rankIconTable.csv", 0, PLAYER_RANK+1, PLAYER_PRESTIGE+1 ), - when( CAN_RANK_UP && PRESTIGE_NEXT==0 ) ) - RANK_ICON_ADV( (XP_BAR_X+XP_BAR_BG_WIDTH+6+getTextWidth( "1", CHOICE_TEXTFONT, TEXTSIZE_DEFAULT )), (XP_BAR_Y+2), HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, - tablelookup( "mp/rankIconTable.csv", 0, 0, PLAYER_PRESTIGE+2 ), - when( CAN_RANK_UP && PRESTIGE_NEXT ) ) - - - HINT_TEXT_ALL( 13, CHOICE_X_START, 8, CHOICE_SIZE_X, dvarString( ui_hint_text ), 1 1 1 1, dvarBool( ui_show_arrow ), ; ) - -#ifdef CONSOLE - NEW_FRAME_BACK_BUTTON( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT ) -#else - NEW_FRAME_BACK_BUTTON_ACTION( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, ON_ESC_ACTION ) -#endif - - #include "ui/safearea.menu" - } - - -#define CAN_JOIN_SESSION \ - ( FRIEND_JOINABLE == IsPlayerJoinable( dvarString( "selectedPlayerXuid" ) ) ) - -#define CAN_AUTOJOIN_SESSION \ - ( FRIEND_AUTOJOINABLE == IsPlayerJoinable( dvarString( "selectedPlayerXuid" ) ) ) - -#define CAN_INVITE_TO_GAME \ - ( IsPlayerInvitable( dvarString( "selectedPlayerXuid" ) ) && ( inLobby() || inPrivateParty() ) ) - -#define CAN_SEND_FRIEND_REQUEST \ - ( getxuid() != dvarstring( "selectedPlayerXuid" ) && !isfriendfromxuid() ) - -#define CAN_MUTE_PLAYER \ - ( getMutedStatus(dvarString( "selectedPlayerXuid" ) ) == 0 ) - -#define COMBAT_RECORD_LOCKED \ - ( GetDisplayLevelByXuid( dvarString( "selectedPlayerXuid" ) ) <= GetItemUnlockLevel( GetItemIndex( FEATURE_COMBAT_RECORD ) ) ) - -#define CAN_KICK_PLAYER \ - ( ( ( !InLobby() && !IsInGame() ) || \ - dvarBool( xblive_privatematch ) || dvarBool( xblive_theater ) || dvarBool( xblive_basictraining ) ) \ - && ( dvarBool( party_host ) || issuperuser() ) && !dvarBool( party_iamhost ) ) - -#define IS_IN_GAME \ - ( IsInGame() ) - -#undef ON_ESC_ACTION -#define ON_ESC_ACTION \ - if( dvarBool(ui_friendsListOpen) ) \ - { \ - execnow changemenucloseslidedirection menu_playercard MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - execnow showmenu menu_friends; \ - } \ - elseif( dvarBool(ui_playerListOpen) ) \ - { \ - execnow changemenucloseslidedirection menu_playercard MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - execnow showmenu menu_players; \ - } \ - elseif( dvarBool(ui_xboxLivePartyListOpen) ) \ - { \ - execnow changemenucloseslidedirection menu_playercard MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - execnow openmenu menu_xboxLiveParty; \ - } \ - elseif( dvarBool(ui_leaderboardOpen) ) \ - { \ - execnow changemenucloseslidedirection menu_playercard MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - execnow openmenu (dvarString("leaderboard_menu_name")); \ - } \ - elseif( dvarBool(ui_ingamePlayersOpen) ) \ - { \ - execnow changemenucloseslidedirection menu_playercard MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - execnow showmenu players; \ - } \ - elseif( dvarBool(ui_aarScoreboardOpen) ) \ - { \ - execnow changemenucloseslidedirection menu_playercard MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - execnow showmenu menu_aar_scoreboard; \ - } \ - elseif( dvarBool(ui_aarWagerScoreboardOpen) ) \ - { \ - execnow changemenucloseslidedirection menu_playercard MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - execnow showmenu menu_aar_wager_scoreboard; \ - } \ - elseif( dvarBool(ui_nemesisPlayercardOpen) ) \ - { \ - execnow changemenucloseslidedirection menu_playercard MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - execnow openmenu menu_aar_summary; \ - execNow set ui_nemesisPlayercardOpen 0; \ - } \ - else \ - { \ - execnow changemenucloseslidedirection menu_playercard MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM; \ - execnow changemenuopenslidedirection menu_playercard MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM; \ - deactivateBlur; \ - } \ - setDvar ui_clearFeederWithoutReset "0"; \ - play uin_navigation_menu_lg_close; \ - close menu_playercard; \ - CLEARUIHINT; - -#undef CHOICE_SIZE_Y -#define CHOICE_SIZE_Y (NEW_FRAME_BUTTON_HEIGHT+2) -#undef CHOICE_X_START -#define CHOICE_X_START (FRAME_CHOICE_X_START-1) -#undef CHOICE_Y_START -#define CHOICE_Y_START (FRAME_CHOICE_Y_START-4) - - menuDef - { - name menu_playercard - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - control MENU_CONTROL_OPENER - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - onOpen - { - if( dvarbool(ui_selectlobby) ) - { - activateBlur; - } - CLEARUIHINT; - play uin_navigation_menu_lg_open; - execNow set ui_playercardOpen 1; - execnow readFileShare; - // This tests if we have to reset the cursor position ( ie. button focus on menu open ) - if( dvarBool( "ui_clearFeederWithoutReset" ) ) - { - execNow raiseFeederEvent ClearWithoutReset; - } - else - { - execNow raiseFeederEvent Clear; - setDvar ui_clearFeederWithoutReset "1"; - } - execNow raiseFeederEvent Populate; - } - onClose - { - play CHOICE_FOCUS_SOUND; - execNow set ui_playercardOpen 0; - } - onFocus { - if( !dvarbool(ui_selectlobby) ) - { - activateBlur; - } - } - onESC - { - ON_ESC_ACTION - } - - FRAME_DEFAULT - FRAME_TITLE_DEFAULT( GetPlayerCardTitle( dvarString("selectedFriendName") ), 1 ) - - FRIEND_INFO_VIS( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, 1 ) - - HINT_TEXT_ALL( 13, CHOICE_X_START, 8, CHOICE_SIZE_X, dvarString( ui_hint_text ), 1 1 1 1, dvarBool( ui_show_arrow ), ; ) - -#ifdef PC - #undef CHOICE_TEXTSIZE - #define CHOICE_TEXTSIZE TEXTSIZE_SMALL - #undef CHOICE_TEXTFONT - #define CHOICE_TEXTFONT UI_FONT_NORMAL - #undef CHOICE_TEXTSTYLE - #define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL -#endif //#ifdef PC - - itemDef - { - DYNAMIC_MENU_COMMON_FIELDS - backgroundItemListbox "white" // omit this if you don't want button background transparency - rect CHOICE_X_START CHOICE_Y_START CHOICE_SIZE_X 275 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - - menuItemsDef - { - maxRows 15 - - // THESE INCLUDE BACKGROUND, HIGHLIGHT AND SELECT BUTTON. DO NOT OMIT THESE ( THE BUTTONS MAY NOT DISPLAY PROPERLY BECAUSE OF COLUMN MISMATCH ). - DYNAMIC_MENU_COMMON_COLUMNS - - menuColDef - { - type MENU_ITEM_TYPE_LOC_TEXT - rect 0 0 CHOICE_SIZE_X CHOICE_SIZE_Y ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - maxChars 50 - } - } - - onEvent InviteToGame { - if( CAN_INVITE_TO_GAME ) - { - if( dvarBool( ui_friendsListOpen ) ) - { - execNow sendInvite ( dvarstring( selectedPlayerXuid ) ) 0; - } - elseif( dvarBool( ui_playerListOpen ) || dvarBool( ui_ingamePlayersOpen ) ) - { - execNow sendInvite ( dvarstring( selectedPlayerXuid ) ) 1; - } - else - { - execNow sendInvite ( dvarstring( selectedPlayerXuid ) ) 0; - } - } - - } - onEvent SendFriendRequest { if( CAN_SEND_FRIEND_REQUEST ) - { - execNow xaddfriend ( dvarstring( selectedPlayerXuid ) ); - } - } - onEvent CombatRecord { - if( !COMBAT_RECORD_LOCKED ) - { - execnow changemenucloseslidedirection menu_playercard MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; - execnow changemenuopenslidedirection menu_playercard MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; - if( getxuid() == dvarstring( selectedPlayerXuid ) ) - { - close self; - setdvar ui_showFriendsCombatRecord "0"; - open menu_cr_career_summary; - } - else - { - setdvar ui_showFriendsCombatRecord "1"; - execnow getServiceRecord ( dvarstring( selectedPlayerXuid ) ); - } - } - } - onEvent JoinSessionPlayers { if( CAN_JOIN_SESSION ) - { - if( IsInGame() ) - { - setDvar ui_keep_friends_bg_up "0"; - execnow set ui_show_friends_list_bg 0; - execnow ui_animate class friends_list_bg default 20; - } - exec JoinsessionInProgress ( dvarString( selectedPlayerXuid ) ); - showmenu menu_players; - close self; - setDvar ui_playerListOpen "0"; - setdvar invite_visible "1"; - exec set menu_xboxlive_buttons_visible 1; - close menu_players; - } - } - onEvent JoinSessionFriends { - if ( CAN_AUTOJOIN_SESSION ) - { - execNow joinSessionInProgress ( dvarString( selectedPlayerXuid ) ); - } - elseif ( CAN_JOIN_SESSION ) - { - if( IsInGame() ) - { - setDvar ui_keep_friends_bg_up "0"; - execnow set ui_show_friends_list_bg 0; - execnow ui_animate class friends_list_bg default 20; - } - execNow JoinsessionInProgress ( dvarstring( selectedPlayerXuid ) ); - showmenu menu_friends; - closeImmediate self; - setDvar ui_friendsListOpen "0"; - setdvar invite_visible "1"; - exec set menu_xboxlive_buttons_visible 1; - close menu_friends; - } - } - onEvent ToggleMute { exec mp_toggleMute( dvarString( selectedPlayerXuid ) ) } - onEvent KickPlayer { close menu_playercard_lobby; getKickPlayerQuestion; } - onEvent ChangeCombatRecordHint { - if( !COMBAT_RECORD_LOCKED ) - { - SET_HINT_TEXT( "@MPUI_COMBAT_RECORD_DESC" ) - } - else - { - SET_HINT_TEXT( ( GetCombatRecordLockedString(dvarString("selectedFriendName")) ) ) - } - } - onEvent RecentGames { - if( canShowContentFromUser( dvarstring( "selectedPlayerXuid" ) ) ) - { - execnow changemenucloseslidedirection menu_playercard MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; - execnow changemenuopenslidedirection menu_playercard MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; - close self; - open menu_fileshare_recentgames; - } - else - { - open menu_recentgames_viewwarning; - } - } - onEvent ReportUser { - execnow openmenu menu_reportuser; - } - onEvent FileShare - { - if( canShowContentFromUser( dvarstring( "selectedPlayerXuid" ) ) ) - { - execnow changemenucloseslidedirection menu_playercard MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; - execnow changemenuopenslidedirection menu_playercard MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; - close self; - open menu_fileshare_share; - } - else - { - open menu_fileshare_viewwarning; - } - } - onEvent ClearHint { - CLEARUIHINT; - } - onEvent Clear { execNow clearFeeder; } - onEvent ClearWithoutReset { execNow clearFeederWithoutResetCursor; } - // Adding buttons to the menu according to the conditions specified. - onEvent Populate - { - if( isInGame() ) /* playercard in-game */ - { - if( dvarBool( ui_friendsListOpen ) ) - { //onAction event //onFocus Event //disable Button Condition //Text on button - execNow addToFeederExtended InviteToGame ClearHint (!CAN_INVITE_TO_GAME) MENU_INVITE_TO_GAME_CAPS; - execNow addToFeederExtended JoinSessionFriends ClearHint (!CAN_JOIN_SESSION) MENU_JOIN_IN_PROGRESS_CAPS; - } - elseif( dvarBool( ui_playerListOpen )) - { - execNow addToFeederExtended InviteToGame ClearHint (!CAN_INVITE_TO_GAME) MENU_INVITE_TO_GAME_CAPS; - execNow addToFeederExtended JoinSessionPlayers ClearHint (!CAN_JOIN_SESSION) MENU_JOIN_IN_PROGRESS_CAPS; - } - elseif( dvarBool( ui_ingamePlayersOpen ) || dvarBool(ui_aarScoreboardOpen) || dvarBool(ui_aarWagerScoreboardOpen) ) - { - execNow addToFeederExtended SendFriendRequest ClearHint (!CAN_SEND_FRIEND_REQUEST) MENU_SEND_FRIEND_REQUEST_CAPS; - execNow if ( CAN_MUTE_PLAYER ) addToFeederExtended ToggleMute ClearHint 0 MENU_MUTE_CAPS; - execNow if ( !CAN_MUTE_PLAYER ) addToFeederExtended ToggleMute ClearHint 0 MENU_UNMUTE_CAPS; - execNow if ( CAN_KICK_PLAYER ) addToFeederExtended KickPlayer ClearHint 0 MENU_KICK_PLAYER_CAPS; -#ifndef PC - execNow addToFeeder noop ""; -#endif //#ifndef PC - execNow addToFeederExtended ReportUser ClearHint 0 MENU_REPORT_USER_CAPS; - } - else - { - execNow addToFeederExtended SendFriendRequest ClearHint (!CAN_SEND_FRIEND_REQUEST) MENU_SEND_FRIEND_REQUEST_CAPS; - } - } - elseif( dvarBool( ui_playerListOpen ) || dvarBool( ui_xboxLivePartyListOpen ) ) /* playercard for anyone selected in the recently met player list */ - { - execNow addToFeederExtended SendFriendRequest ClearHint (!CAN_SEND_FRIEND_REQUEST) MENU_SEND_FRIEND_REQUEST_CAPS; - execNow addToFeederExtended InviteToGame ClearHint (!CAN_INVITE_TO_GAME) MENU_INVITE_TO_GAME_CAPS; -#ifndef PC - execNow addToFeeder noop ""; -#endif //#ifndef PC - execNow addToFeederExtended CombatRecord ChangeCombatRecordHint COMBAT_RECORD_LOCKED MENU_COMBAT_RECORD_CAPS; - execNow addToFeederExtended FileShare ClearHint 0 MENU_FILESHARE_CAPS; - execNow addToFeederExtended RecentGames ClearHint 0 MENU_FILESHARE_RECENTGAMES_CAPS; -#ifndef PC - execNow addToFeeder noop ""; -#endif //#ifndef PC - execNow addToFeederExtended ReportUser ClearHint 0 MENU_REPORT_USER_CAPS; - } - elseif( dvarBool( ui_friendsListOpen ) ) /* playercard for anyone selected in the friends list */ - { - execNow addToFeederExtended InviteToGame ClearHint (!CAN_INVITE_TO_GAME) MENU_INVITE_TO_GAME_CAPS; - - if ( CAN_AUTOJOIN_SESSION ) - { - execNow addToFeederExtended JoinSessionFriends ClearHint (!CAN_AUTOJOIN_SESSION) MENU_AUTOJOIN_CAPS; - } - else - { - execNow addToFeederExtended JoinSessionFriends ClearHint (!CAN_JOIN_SESSION) MENU_JOIN_IN_PROGRESS_CAPS; - } - -#ifndef PC - execNow addToFeeder noop ""; -#endif //#ifndef PC - execNow addToFeederExtended CombatRecord ChangeCombatRecordHint COMBAT_RECORD_LOCKED MENU_COMBAT_RECORD_CAPS; - execNow addToFeederExtended FileShare ClearHint 0 MENU_FILESHARE_CAPS; - execNow addToFeederExtended RecentGames ClearHint 0 MENU_FILESHARE_RECENTGAMES_CAPS; -#ifndef PC - execNow addToFeeder noop ""; -#endif //#ifndef PC - execNow addToFeederExtended ReportUser ClearHint 0 MENU_REPORT_USER_CAPS; - } - elseif( dvarBool( ui_leaderboardOpen ) || dvarbool( ui_nemesisPlayercardOpen ) ) /* playercard for anyone selected in the leaderboards or nemesis in the after action report */ - { - execNow addToFeederExtended SendFriendRequest ClearHint (!CAN_SEND_FRIEND_REQUEST) MENU_SEND_FRIEND_REQUEST_CAPS; - execNow addToFeederExtended InviteToGame ClearHint (!CAN_INVITE_TO_GAME) MENU_INVITE_TO_GAME_CAPS; -#ifndef PC - execNow addToFeeder noop ""; -#endif //#ifndef PC - execNow addToFeederExtended CombatRecord ChangeCombatRecordHint COMBAT_RECORD_LOCKED MENU_COMBAT_RECORD_CAPS; - execNow addToFeederExtended FileShare ClearHint 0 MENU_FILESHARE_CAPS; - execNow addToFeederExtended RecentGames ClearHint 0 MENU_FILESHARE_RECENTGAMES_CAPS; -#ifndef PC - execNow addToFeeder noop ""; -#endif //#ifndef PC - execNow addToFeederExtended ReportUser ClearHint 0 MENU_REPORT_USER_CAPS; - } - else /* playercard for anyone selected in lobby players list */ - { - execNow addToFeederExtended SendFriendRequest ClearHint (!CAN_SEND_FRIEND_REQUEST) MENU_SEND_FRIEND_REQUEST_CAPS; -#ifndef PC - execNow addToFeeder noop ""; -#endif //#ifndef PC - execNow addToFeederExtended CombatRecord ChangeCombatRecordHint COMBAT_RECORD_LOCKED MENU_COMBAT_RECORD_CAPS; - execNow addToFeederExtended FileShare ClearHint 0 MENU_FILESHARE_CAPS; - execNow addToFeederExtended RecentGames ClearHint 0 MENU_FILESHARE_RECENTGAMES_CAPS; -#ifndef PC - execNow addToFeeder noop ""; -#endif //#ifndef PC - execNow addToFeederExtended ReportUser ClearHint 0 MENU_REPORT_USER_CAPS; - - execNow if ( CAN_MUTE_PLAYER ) addToFeederExtended ToggleMute ClearHint 0 MENU_MUTE_CAPS; - execNow if ( !CAN_MUTE_PLAYER ) addToFeederExtended ToggleMute ClearHint 0 MENU_UNMUTE_CAPS; - execNow if ( CAN_KICK_PLAYER ) addToFeederExtended KickPlayer ClearHint 0 MENU_KICK_PLAYER_CAPS; - } - } - onfocus { play CHOICE_FOCUS_SOUND; DYNAMIC_MENU_INIT( menu_playercard ) } - onListboxSelectionChange { play CHOICE_FOCUS_SOUND; } - doubleclick { play CHOICE_FOCUS_SOUND; - execNow raiseFeederEvent; - - } - } - - FRIENDS_PLAYER_CARD_COMMON_ITEMS - -#ifdef CONSOLE - NEW_FRAME_BACK_BUTTON_ACTION( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, ON_ESC_ACTION ) -#else - NEW_FRAME_BACK_BUTTON_ACTION(FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, ON_ESC_ACTION ) -#endif - - #include "ui/safearea.menu" - } -} - -#include "ui_mp/popupstyle.inc" -#include "ui/choices_setup_popmenu.menu" - - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( unmute_error_popup_live, setFocus unmute_error_popup_live2;, ;, 1 ) - priority MENU_PRI_ONTOP - - SYSTEM_POPUP_TITLE_VIS( "@MENU_UNMUTE_ERROR", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_UNMUTE_ERROR_FROM_LIVE", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_CANCEL", close self, 1, name unmute_error_popup_live_2 ) -} - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 1 - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( unmute_error_popup_friends_only, ;, ;, 1 ) - priority MENU_PRI_ONTOP - - SYSTEM_POPUP_TITLE_VIS( "@MENU_UNMUTE_ERROR", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_UNMUTE_ERROR_FRIENDS_ONLY", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self;, 1, ; ) -} - - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( unmute_error_popup_nobody, ;, ;, 1 ) - priority MENU_PRI_ONTOP - - SYSTEM_POPUP_TITLE_VIS( "@MENU_UNMUTE_ERROR", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@MENU_UNMUTE_ERROR_NOBODY", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self;, 1, ; ) -} - - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_fileshare_viewwarning, ;, ;, 1 ) - priority MENU_PRI_ONTOP - - SYSTEM_POPUP_TITLE_VIS( "@MENU_FILESHARE_ACCESSERROR", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@PLATFORM_FILESHARE_ACCESSERROR_MSG", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self;, 1, ; ) -} - - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_community_viewwarning, ;, ;, 1 ) - priority MENU_PRI_ONTOP - - SYSTEM_POPUP_TITLE_VIS( "@MENU_COMMUNITY_ACCESSERROR", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@PLATFORM_FILESHARE_ACCESSERROR_MSG", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self;, 1, ; ) -} - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( menu_recentgames_viewwarning, ;, ;, 1 ) - priority MENU_PRI_ONTOP - - SYSTEM_POPUP_TITLE_VIS( "@MENU_RECENTGAMES_ACCESSERROR", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( "@PLATFORM_FILESHARE_ACCESSERROR_MSG", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", close self;, 1, ; ) -} - - - - -#undef POPUP_BUTTON_COUNT -#define POPUP_BUTTON_COUNT 5 - -//Report User Dialog -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( "menu_reportuser", ;, close self;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( locString( "@MENU_REPORT_USER_CAPS" ) + ":", 1 ) - SYSTEM_POPUP_SUBTITLE_VIS( dvarString( "selectedFriendName" ), 1 ) - - #define REPORT_USER( offence ) \ - execNow reportUser (dvarString("selectedPlayerXuid")) offence 1; \ - close self; - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 1, "@MENU_REPORT_USER_OFFENSIVE_CAPS", REPORT_USER( "offensive" ), setLocalVarString ui_info "@MENU_REPORT_USER_OFFENSIVE_MSG";, ;, 1, ; ) - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 2, "@MENU_REPORT_USER_OFFENSIVE_EMBLEM_CAPS", REPORT_USER( "offensive_emblem" ), setLocalVarString ui_info "@MENU_REPORT_USER_OFFENSIVE_EMBLEM_MSG";, ;, 1, ; ) - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 3, "@MENU_REPORT_USER_CHEATER_CAPS", REPORT_USER( "cheater" ), setLocalVarString ui_info "@MENU_REPORT_USER_CHEATER_MSG";, ;, 1, ; ) - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 4, "@MENU_REPORT_USER_BOOSTER_CAPS", REPORT_USER( "booster" ), setLocalVarString ui_info "@MENU_REPORT_USER_BOOSTER_MSG";, ;, 1, ; ) - - HINT_TEXT_ALL( 5, CHOICE_X_START, 0, CHOICE_SIZE_X, localVarString( ui_info ), 1 1 1 1, 1, ; ) - - SYSTEM_POPUP_BACK_BUTTON -} - diff --git a/mods/patch_mp/ui_mp/playercards_clantag.menu b/mods/patch_mp/ui_mp/playercards_clantag.menu deleted file mode 100644 index 7cd0804..0000000 --- a/mods/patch_mp/ui_mp/playercards_clantag.menu +++ /dev/null @@ -1,355 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" -#include "ui/frame.inc" -#include "ui_mp/menustyle.inc" -#include "ui_mp/overlaybg.inc" -#include "ui/choices_setup_common.menu" -#include "ui_mp/popup_player_info.inc" -#include "ui_mp/stats_info.inc" - -#ifdef PC - #include "ui_mp/popupstyle.inc" - #include "ui/choices_setup_popmenu.menu" - - #undef POPUP_BUTTON_COUNT - #define POPUP_BUTTON_COUNT 3 - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( "pc_editclantag", setdvar ui_clantag_new dvarString( clanName ); setFocus nameEntry;, ;, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MPUI_EDIT_CLAN_TAG_CAPS", 1 ) - - itemDef - { - name nameEntry - TYPE ITEM_TYPE_ALPHANUMERICFIELD - text "@MENU_NAME1" - dvar "ui_clantag_new" - rect CHOICE_RECT( 1 ) - textaligny 2 - maxchars 4 - maxpaintchars 4 - textalign ITEM_ALIGN_MIDDLE_LEFT - textfont UI_FONT_NORMAL - textscale TEXTSIZE_DEFAULT - forecolor .9 .9 .9 1 - style WINDOW_STYLE_FILLED - backcolor 0 0 0 .3 - visible 1 - mouseenter { show keyBindStatus; play CHOICE_FOCUS_SOUND; } - mouseexit { hide keyBindStatus; setfocus ok_button; } - accept { } - } - - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_OK", execnow setclanname; close self;, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MENU_CANCEL", close self;, 1, ; ) - } -#endif - -#define PLAYER_CARD_CLAN_TAG_MENU_HEIGHT NEW_FRAME_DEFAULT_HEIGHT -#define PLAYER_CARD_CLAN_TAG_MENU_WIDTH ( PLAYER_CARD_CLAN_TAG_MENU_HEIGHT * FRAME_ASPECT_RATIO ) -#undef CHOICE_X_START -#define CHOICE_X_START ( -PLAYER_CARD_CLAN_TAG_MENU_WIDTH / 2 + 15 ) -#undef CHOICE_Y_START -#define CHOICE_Y_START ( -PLAYER_CARD_CLAN_TAG_MENU_HEIGHT / 2 + 15 + NEW_FRAME_BG_Y_OFFSET( PLAYER_CARD_CLAN_TAG_MENU_HEIGHT ) ) - -#undef CHOICE_GROUP -#define CHOICE_GROUP "playercard" - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X NEW_FRAME_BUTTON_WIDTH -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL -#undef CHOICE_TEXTCOLOR -#define CHOICE_TEXTCOLOR NEW_FRAME_COMMON_TEXT_COLOR - -#undef CHOICE_HORIZONTAL_ALIGN -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER - -#undef CHOICE_VERTICAL_ALIGN -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER - -#ifdef XENON - #define SELECT_ICON "ui_button_xenon_3d_a_32x32" -#endif -#ifdef PS3 - #define SELECT_ICON "ui_button_ps3_x_32x32" -#endif - -#define SET_CLANTAG_HINT \ - if ( isclantagfeaturelocked( GetCurrentClanTagFeature() ) ) \ - { \ - SET_HINT_TEXT( (locString( CLASS_PRESTIGE_UNLOCK_DESC, GetClanTagFeaturePlevel( GetCurrentClanTagFeature() ) )) ) \ - } \ - else \ - { \ - CLEARUIHINT \ - } -#ifdef PC - #define PLAYER_CARD_LISTBOX_RECT_EDIT (CHOICE_X_START-3) (CHOICE_Y_START+NEW_FRAME_BUTTON_HEIGHT+2) (CHOICE_SIZE_X+3) 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - #define PLAYER_CARD_LISTBOX_RECT (CHOICE_X_START-3) (CHOICE_Y_START+NEW_FRAME_BUTTON_HEIGHT*4+2) (CHOICE_SIZE_X+3) 150 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER -#else //#ifdef PC - #define PLAYER_CARD_LISTBOX_RECT_EDIT (CHOICE_X_START-3) (CHOICE_Y_START+NEW_FRAME_BUTTON_HEIGHT+2) (CHOICE_SIZE_X+3) 250 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - #define PLAYER_CARD_LISTBOX_RECT (CHOICE_X_START-3) (CHOICE_Y_START+NEW_FRAME_BUTTON_HEIGHT*4+2) (CHOICE_SIZE_X+3) 250 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER -#endif //#ifdef PC - -#undef LIST_X_START -#define LIST_X_START ( -PLAYER_CARD_CLAN_TAG_MENU_WIDTH / 2 + 15 ) -#undef LIST_Y_START -#define LIST_Y_START ( -PLAYER_CARD_CLAN_TAG_MENU_HEIGHT / 2 + 15 + NEW_FRAME_BG_Y_OFFSET( PLAYER_CARD_CLAN_TAG_MENU_HEIGHT ) ) -#undef LIST_HEIGHT -#define LIST_HEIGHT (PLAYER_CARD_CLAN_TAG_MENU_HEIGHT-120) -#undef LIST_WIDTH -#define LIST_WIDTH (PLAYER_CARD_CLAN_TAG_MENU_WIDTH/2-40) - -#define PLAYER_EMBLEM_BG_SIZE (190) -#define PLAYER_EMBLEM_SIZE (PLAYER_EMBLEM_BG_SIZE - 20) -#define PLAYER_EMBLEM_X_START 70 -#define PLAYER_EMBLEM_Y_START (CHOICE_Y_START+20) - -#define PLAYER_CARD_COMMON_ITEMS \ \ - /* PLAYER NAME */ \ - PLAYER_CLAN_TAG_AND_NAME( PLAYER_EMBLEM_X_START, (PLAYER_EMBLEM_Y_START-18), 1 ) \ - /* BACKGROUND FOR EMBLEM */ \ - itemDef \ - { \ - rect PLAYER_EMBLEM_X_START PLAYER_EMBLEM_Y_START PLAYER_EMBLEM_BG_SIZE PLAYER_EMBLEM_BG_SIZE CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN \ - style WINDOW_STYLE_SHADER_FRAMED \ - frame 16 0.5 FRAME_SIDE_ALL \ - background "menu_mp_lobby_frame_circle" \ - forecolor 0 0 0 0.4 \ - visible 1 \ - decoration \ - } \ - /* PLAYER EMBLEM */ \ - PLAYER_EMBLEM_ALL( (PLAYER_EMBLEM_X_START+10), (PLAYER_EMBLEM_Y_START+10), PLAYER_EMBLEM_SIZE, PLAYER_EMBLEM_SIZE, 1 ) - -#ifdef CONSOLE -#define CLAN_TAG_SPECIAL_ESC( actionArg ) \ - execKeyInt KEY_ESCAPE \ - { \ - play CHOICE_FOCUS_SOUND; \ - actionArg; \ - } -#else // #ifdef CONSOLE -#define CLAN_TAG_SPECIAL_ESC( actionArg ) -#endif //#ifdef CONSOLE - -#ifdef PC - #define CLAN_TAG_LIST_PC_ACTIONS \ - mouseenter \ - { \ - setfocus "clan_tag_list" \ - } -#else //#ifdef PC - #define CLAN_TAG_LIST_PC_ACTIONS -#endif //#ifdef PC - -#define CLAN_TAG_LIST( feederType, rectArg, execCommand, onActionArg, selectionChangeArgs, visArg, extraArgs ) \ - itemDef\ - { \ - name "clan_tag_list" \ - type ITEM_TYPE_LISTBOX \ - feeder feederType \ - rect rectArg \ - origin 0 0 \ - elementwidth 30 \ - elementheight 19 \ - elementtype LISTBOX_TEXT \ - textstyle ITEM_TEXTSTYLE_NORMAL \ - textfont UI_FONT_NORMAL \ - textscale TEXTSIZE_DEFAULT \ - textalignx 12 \ \ - textaligny 0 \ - forecolor CHOICE_TEXTCOLOR \ - focusColor CHOICE_TEXTCOLOR \ - disableColor CHOICE_TEXTCOLOR \ - noscrollbars \ - selectIcon SELECT_ICON \ - outlineColor 1 1 1 1 \ - elementHighlightColor 0 0 0 1 \ - elementBackgroundColor NEW_FRAME_TRANSPARENCY \ - modal \ - noBlinkingHighlight \ - visible visArg \ - userarea 4 0 0 CHOICE_SIZE_X 17 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* Name */ \ - 20 1 15 15 16 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* Image */ \ - (CHOICE_SIZE_X-60) 0 50 17 24 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* Cost */ \ - (CHOICE_SIZE_X+2) (17/2-LOCK_SIZE/2) LOCK_SIZE LOCK_SIZE 24 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* Lock */ \ - onfocus \ - { \ - play CHOICE_FOCUS_SOUND; \ - SET_CLANTAG_HINT \ - } \ - onListboxSelectionChange \ - { \ - play CHOICE_FOCUS_SOUND; \ - selectionChangeArgs \ - SET_CLANTAG_HINT \ - } \ - doubleclick \ - { \ - if( IsClanTagFeaturePurchased( GetCurrentClanTagFeature() ) ) \ - { \ - execNow setClanTag ( GetCurrentClanTagFeature() ); \ - } \ - elseif( !IsClanTagFeatureLocked( GetCurrentClanTagFeature() ) && ( GetClanTagFeatureCost( GetCurrentClanTagFeature() ) <= GetStatByName( "CODPOINTS" ) ) ) \ - { \ - open PurchaseClanTagFeatureConfirmation; \ - } \ - } \ - execKeyInt BUTTON_X \ - { \ - } \ - CLAN_TAG_SPECIAL_ESC( onActionArg ) \ - CLAN_TAG_LIST_PC_ACTIONS \ - extraArgs \ - } - -#ifdef PC - #define EDIT_CLAN_TAG_ACTION \ - doubleclick \ - { \ - open pc_editclantag; \ - } -#else //#ifdef PC - #define EDIT_CLAN_TAG_ACTION \ - doubleclick \ - { \ - execNow editclanname; \ - } -#endif //#ifdef PC - -#ifdef PC - #define CLAN_TAG_LIST_EDIT_PC_ACTIONS \ - mouseenter \ - { \ - setfocus "clan_tag_list_edit" \ - } -#else //#ifdef PC - #define CLAN_TAG_LIST_EDIT_PC_ACTIONS -#endif //#ifdef PC - -#define CLAN_TAG_LIST_EDIT( feederType, rectArg, execCommand, onActionArg, selectionChangeArgs, visArg, extraArgs ) \ - itemDef\ - { \ - name "clan_tag_list_edit" \ - type ITEM_TYPE_LISTBOX \ - feeder feederType \ - rect rectArg \ - origin 0 0 \ - elementwidth 30 \ - elementheight 19 \ - elementtype LISTBOX_TEXT \ - textstyle ITEM_TEXTSTYLE_NORMAL \ - textfont UI_FONT_NORMAL \ - textscale TEXTSIZE_DEFAULT \ - textalignx 22 \ - textaligny 0 \ - forecolor CHOICE_TEXTCOLOR \ - focusColor CHOICE_TEXTCOLOR \ - disableColor CHOICE_TEXTCOLOR \ - noscrollbars \ - selectIcon SELECT_ICON \ - outlineColor 1 1 1 1 \ - elementHighlightColor 0 0 0 1 \ - elementBackgroundColor NEW_FRAME_TRANSPARENCY \ - modal \ - noBlinkingHighlight \ - visible visArg \ - onfocus \ - { \ - play CHOICE_FOCUS_SOUND; \ - setdvar ui_show_arrow "0"; \ - } \ - onListboxSelectionChange \ - { \ - play CHOICE_FOCUS_SOUND; \ - selectionChangeArgs \ - setdvar ui_show_arrow "0"; \ - } \ - EDIT_CLAN_TAG_ACTION \ - execKeyInt BUTTON_X \ - { \ - } \ - CLAN_TAG_SPECIAL_ESC( onActionArg ) \ - CLAN_TAG_LIST_EDIT_PC_ACTIONS \ - extraArgs \ - } - -#undef ON_ESC -#define ON_ESC \ - execnow "uploadstats"; \ - execnow changemenucloseslidedirection menu_playercards_clantag MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT; \ - close self; \ - open menu_playercard_self; - - menuDef - { - name menu_playercards_clantag - rect 0 0 640 480 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - control MENU_CONTROL_OPENER - priority MENU_PRI_ONTOP - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - popup - onOpen - { - setLocalVarString ui_choicegroup CHOICE_GROUP; - focusFirst; - } - onEsc - { - ON_ESC - } - onFocus - { - setLocalVarString ui_choicegroup CHOICE_GROUP; - activateBlur; - } - onClose - { - deactivateBlur; - } - - NEW_FRAME( PLAYER_CARD_CLAN_TAG_MENU_WIDTH, PLAYER_CARD_CLAN_TAG_MENU_HEIGHT ) - - // Title - NEW_FRAME_TITLE( PLAYER_CARD_CLAN_TAG_MENU_WIDTH, PLAYER_CARD_CLAN_TAG_MENU_HEIGHT, "@MPUI_CLAN_TAG_CAPS", 1 ) - PLAYER_INFO_VIS( PLAYER_CARD_CLAN_TAG_MENU_WIDTH, PLAYER_CARD_CLAN_TAG_MENU_HEIGHT, 1 ) - - /* Label for "Edit clan tag" */ - PREPROC_TEXT_DRAW( CHOICE_X_START (CHOICE_Y_START+2) 100 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_EDIT_CLAN_TAG_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_LT_GREY_RGB 1 ) - - // CLAN TAG BUTTON - CLAN_TAG_LIST_EDIT( FEEDER_CLANTAG_FEATURES_EDIT, PLAYER_CARD_LISTBOX_RECT_EDIT, ( dvarString( ui_execString ) );, ;, ;, 1, ; ) - - /* Label for "Clan Tag color" */ - PREPROC_TEXT_DRAW( CHOICE_X_START (CHOICE_Y_START+NEW_FRAME_BUTTON_HEIGHT*3+2) 100 10 CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_CLAN_TAG_COLOR_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_LEFT, NEW_FRAME_LT_GREY_RGB 1 ) - - // CLAN TAG LIST - CLAN_TAG_LIST( FEEDER_CLANTAG_FEATURES, PLAYER_CARD_LISTBOX_RECT, ( dvarString( ui_execString ) );, ;, ;, 1, ; ) - - PLAYER_CARD_COMMON_ITEMS - - HINT_TEXT( 13, CHOICE_X_START, dvarString( ui_hint_text ), dvarBool( ui_show_arrow ) ) - -#ifdef PC - NEW_FRAME_BACK_BUTTON_ACTION( FRAME_DEFAULT_WIDTH, FRAME_DEFAULT_HEIGHT, ON_ESC; ) -#else //#ifdef PC - NEW_FRAME_BACK_BUTTON( PLAYER_CARD_CLAN_TAG_MENU_WIDTH, PLAYER_CARD_CLAN_TAG_MENU_HEIGHT ) -#endif //#ifdef PC - - #include "ui/safearea.menu" -} diff --git a/mods/patch_mp/ui_mp/players.menu b/mods/patch_mp/ui_mp/players.menu deleted file mode 100644 index be7c771..0000000 --- a/mods/patch_mp/ui_mp/players.menu +++ /dev/null @@ -1,166 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" - -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" - -#define LIST_ELEM_HEIGHT 18 -#define MAX_PLAYERS 32 - -#define PLAYERLIST_HEIGHT ((MAX_PLAYERS/2)*LIST_ELEM_HEIGHT) -#define PLAYERLIST_WIDTH 235 -#define PLAYERLIST_SPACING 56 - -#define PLAYERLIST_A_X_START (-PLAYERLIST_WIDTH-(PLAYERLIST_SPACING/2)) -#define PLAYERLIST_B_X_START (PLAYERLIST_SPACING/2) -#define PLAYERLIST_Y_START (-PLAYERLIST_HEIGHT/2) - -#define PLAYERLIST_A_RECT PLAYERLIST_A_X_START PLAYERLIST_Y_START PLAYERLIST_WIDTH PLAYERLIST_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER -#define PLAYERLIST_B_RECT PLAYERLIST_B_X_START PLAYERLIST_Y_START PLAYERLIST_WIDTH PLAYERLIST_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - -#define RANK_BG_WIDTH 33 -#define COLUMN_SCORE_WIDTH 34 -#define MUTE_ICON_WIDTH LIST_ELEM_HEIGHT -#define FRIEND_ICON_WIDTH LIST_ELEM_HEIGHT -#define FRIEND_ICON_START_X ( PLAYERLIST_WIDTH - FRIEND_ICON_WIDTH - 4 ) -#define MUTE_ICON_START_X ( FRIEND_ICON_START_X - MUTE_ICON_WIDTH - 4 ) -#define COLUMN_NAME_START_X 34 -#define COLUMN_NAME_WIDTH ( FRIEND_ICON_START_X - COLUMN_NAME_START_X ) - -#define IN_PREGAME ( dvarbool( ui_pregame ) ) - -#include "ui_mp/menustyle.inc" -#include "ui_mp/choices_setup_teams.menu" - -#undef ON_ESC -#define ON_ESC \ - close self; \ - open class; - -#define AAR_HEIGHT NEW_FRAME_DEFAULT_HEIGHT -#define AAR_WIDTH ( AAR_HEIGHT * FRAME_ASPECT_RATIO ) - -#define AAR_AWARD_IMAGE_COLOR 0.8 0.68 0.47 0.6 -#define AAR_AWARD_IMAGE_COLOR_GREY 1 1 1 0.3 - -#define AAR_BODY_X_START ( -AAR_WIDTH / 2 + 15 ) -#define AAR_BODY_Y_START ( -AAR_HEIGHT / 2 + 15 + NEW_FRAME_BG_Y_OFFSET( AAR_HEIGHT ) ) - -#define AAR_SCOREBOARD_COLUMN_SPACING 70 -#define AAR_SCOREBOARD_COLUMN_4_X 420 -#define AAR_SCOREBOARD_COLUMN_3_X ( AAR_SCOREBOARD_COLUMN_4_X - AAR_SCOREBOARD_COLUMN_SPACING ) -#define AAR_SCOREBOARD_COLUMN_2_X ( AAR_SCOREBOARD_COLUMN_3_X - AAR_SCOREBOARD_COLUMN_SPACING ) -#define AAR_SCOREBOARD_COLUMN_1_X ( AAR_SCOREBOARD_COLUMN_2_X - 50 ) -#define AAR_SCOREBOARD_COLUMN_SCORE_X ( AAR_SCOREBOARD_COLUMN_1_X - 50 ) - -#define AAR_DBLCLICK_ACTION( menuName ) \ - play CHOICE_FOCUS_SOUND; \ - execnow set selectedPlayerXuid ( getfeederdata( "xuid" ) ); \ - execnow set selectedFriendName ( getfeederdata( "name" ) ); \ - if( (getfeederdata( "xuid" ) != getXuid()) && (getfeederdata( "xuid" ) != 0) ) \ - { \ - hideMenu self; \ - if (IsInGame()) \ - { \ - showMenu "pausedbkgnd"; \ - } \ - execnow changemenuopenslidedirection menu_playercard MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT; \ - execNow openMenu menu_playercard; \ - } - - -#define AAR_SCOREBOARD_LISTBOX( scoreboard_name, feederId, x, y, w, h, visArg, extraArgs, menuName ) \ - itemDef \ - { \ - name scoreboard_name \ - type ITEM_TYPE_LISTBOX \ - feeder feederId \ - rect x y w h HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ - origin 0 0 \ - elementwidth 30 \ - elementheight 17 \ - elementtype LISTBOX_TEXT \ - textstyle ITEM_TEXTSTYLE_NORMAL \ - textfont UI_FONT_NORMAL \ - textscale TEXTSIZE_SMALL \ - forecolor 1 1 1 1 \ - focusColor 1 1 1 1 \ - disableColor 1 1 1 1 \ - elementHighlightColor 0 0 0 1 \ - noBlinkingHighlight \ - visible visArg \ - userarea 10 -1 0 (w-16) 19 24 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP /* SCOREBOARD_COLUMN_NEMESIS_BG */ \ - -1 0 40 19 10 ITEM_ALIGN_LEFT ITEM_ALIGN_TOP /* SCOREBOARD_COLUMN_RANK_BG */ \ - 3 0 50 16 10 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_RANK */ \ - 16 1 16 16 32 ITEM_ALIGN_RIGHT ITEM_ALIGN_TOP /* SCOREBOARD_COLUMN_RANK_ICON */ \ - 50 0 100 16 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_NAME */ \ - AAR_SCOREBOARD_COLUMN_SCORE_X 0 100 16 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_SCORE */ \ - AAR_SCOREBOARD_COLUMN_1_X 0 100 16 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_1 */ \ - AAR_SCOREBOARD_COLUMN_2_X 0 100 16 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_2 */ \ - (AAR_SCOREBOARD_COLUMN_3_X+85) 0 16 16 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_3 */ \ - (AAR_SCOREBOARD_COLUMN_4_X+70) 0 16 16 10 ITEM_ALIGN_RIGHT ITEM_ALIGN_MIDDLE /* SCOREBOARD_COLUMN_4 */ \ - \ - doubleclick \ - { \ - AAR_DBLCLICK_ACTION( menuName ) \ - } \ - \ - extraArgs \ - } - -{ - menuDef - { - name "players" - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_EMPTY - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - - onEsc - { - ON_ESC - } - onOpen - { - if (IsInGame()) - { - showMenu "pausedbkgnd"; - } - setdvar ui_friendsListOpen "0"; - setdvar ui_ingamePlayersOpen "1"; - - // TODO: Set Focus to something? - } - onClose - { - if (IsInGame()) - { - hideMenu "pausedbkgnd"; - } - setdvar ui_ingamePlayersOpen "0"; - } - - // ------------------ TREE TITLE ------------------ - CHOICE_MENU_TITLE_ALIGN_VIS( "@MENU_PLAYERS_CAPS", HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP, ITEM_ALIGN_MIDDLE_LEFT, 1 ) - - /* LABEL FOR COLUMN "SCORE" */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+12+AAR_SCOREBOARD_COLUMN_SCORE_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, "@MPUI_SCORE_CAPS", TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - /* LABEL FOR COLUMN 1 */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+12+AAR_SCOREBOARD_COLUMN_1_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "@"+getScoreboardColumnHeader( 0 )+"_CAPS" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - /* LABEL FOR COLUMN 2 */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+12+AAR_SCOREBOARD_COLUMN_2_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "@"+getScoreboardColumnHeader( 1 )+"_CAPS" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - /* LABEL FOR COLUMN 3 */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+12+AAR_SCOREBOARD_COLUMN_3_X) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "MENU_FRIEND" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - /* LABEL FOR COLUMN 4 */ - PREPROC_TEXT_DRAW( (AAR_BODY_X_START+12+AAR_SCOREBOARD_COLUMN_4_X-16) (AAR_BODY_Y_START-15) 100 20 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "MP_MUTED" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_RIGHT, CHOICE_TEXTCOLOR ) - - /* SCOREBOARD */ - AAR_SCOREBOARD_LISTBOX( scoreboard_listbox, FEEDER_AAR_SCOREBOARD, (AAR_BODY_X_START+10), (AAR_BODY_Y_START+5), (AAR_WIDTH-40), (AAR_HEIGHT-65), 1, ;, menu_aar_scoreboard ) - - - // Back button -#ifdef PC - NEW_FRAME_BACK_BUTTON_ACTION_PC_VIS( ON_ESC, when( MenuHasFocus() ); ) -#endif - } -} \ No newline at end of file diff --git a/mods/patch_mp/ui_mp/scriptmenus/callvote.menu b/mods/patch_mp/ui_mp/scriptmenus/callvote.menu deleted file mode 100644 index 8360797..0000000 --- a/mods/patch_mp/ui_mp/scriptmenus/callvote.menu +++ /dev/null @@ -1,844 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/newframe.inc" -#include "ui_mp/common_macro.inc" -#include "ui_mp/menustyle.inc" -#include "ui_mp/choices_setup_teams.menu" - -#define PC_INGAME 1 -#include "ui_mp/overlaybg.inc" - -#define GAME_DESC_VIS_ARG ( dvarInt( "xblive_basictraining" ) || dvarBool( splitscreen ) || dvarBool( systemlink ) || (dvarString("ui_gametype_idx") != "0") ) - -menuDef -{ - name "pausedbkgnd_callvote" - fullScreen 0 - rect 0 0 640 480 - focusColor COLOR_FOCUSED - blurWorld 4.8 - visible 1 - - #define SINGLE_PLAYER 1 - #include "ui_mp/ingamebg.inc" -} - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X 170 - -#define BACKGROUND_COLOR_GRAY_RGB 0.62 0.70 0.70 - -#ifdef PC - #undef CHOICE_X_START - #define CHOICE_X_START 30 - #undef CHOICE_Y_START - #define CHOICE_Y_START -120 - #define CHOICE_SEP_1 5 -#else - #undef CHOICE_X_START - #define CHOICE_X_START 30 - #undef CHOICE_Y_START - #define CHOICE_Y_START -30 - #define CHOICE_SEP_1 3 -#endif - -#undef CHOICE_GROUP -#define CHOICE_GROUP "callvote" - -#undef CHOICE_HORIZONTAL_ALIGN -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_LEFT - -#undef CHOICE_VERTICAL_ALIGN -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER - -#undef BUTTON_BG_X_START -#define BUTTON_BG_X_START 30 -#undef BUTTON_BG_Y_START -#define BUTTON_BG_Y_START 42 - -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL - -#undef CHOICE_TEXTSIZE -#define CHOICE_TEXTSIZE TEXTSIZE_DEFAULT - -{ - menuDef - { - name callvote - fullScreen 0 - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN // Size and position of the menu - focusColor COLOR_FOCUSED // Menu focus color for text and items -#ifdef CONSOLE - blurWorld 7.0 -#endif - onOpen - { - showMenu "pausedbkgnd_callvote"; - } - - onClose - { - hideMenu "pausedbkgnd_callvote"; - } - - onEsc - { - close self; - open "class"; - } - - #define CALLVOTE_SUBTITLE "" - #include "ui_mp/scriptmenus/callvote_buttons.inc" - - NEW_FRAME_BACK_BUTTON_ACTION_PC_VIS( close self;, 1 ) - } - - menuDef - { - name changegametype - fullScreen 0 - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN // Size and position of the menu - focusColor COLOR_FOCUSED // Menu focus color for text and items -#ifdef CONSOLE - blurWorld 7.0 -#endif - onEsc - { - showMenu callvote; - close self; - } - - onOpen - { - setdvar invite_visible "0"; - - setDvar ui_mapname "mp_array"; - setDvar ui_gametype "tdm"; - setdvar ui_gametype_idx "1"; - - setDvar ui_preview dvarString( "ui_mapname" ); - setdvar ui_preview_gt dvarString( "ui_gametype" ); - setdvar ui_preview_gt_idx dvarString( "ui_gametype_idx" ); - setDvar settings_map_selected 1; - execNow movefeeder top gamemode_selection; - execNow movefeeder top maplist; - } - - onClose - { - } - - #undef CALLVOTE_SUBTITLE - #define CALLVOTE_SUBTITLE "@MPUI_CHANGE_GAME_TYPEMAP" - #include "ui_mp/scriptmenus/callvote_buttons.inc" - - #define GAMEMODE_X 210 - #define MAPSELECT_X 430 - #define MAPSELECT_Y 255 - #define GAMEMODE_Y 255 - #define THUMBNAIL_Y 18 - - itemDef - { - name gamemode_image - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect GAMEMODE_X THUMBNAIL_Y 170 135 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - border 0 - bordercolor .5 .5 .5 .5 - origin 0 0 - exp material( tableLookup( "mp/gametypesTable.csv", 0, dvarString( ui_gametype ), 3 ) ); // ui_preview_gt - visible when(GAME_DESC_VIS_ARG); - decoration - } - - itemDef - { - name gamemode_custom_image - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect GAMEMODE_X THUMBNAIL_Y 170 135 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - border 0 - bordercolor .5 .5 .5 .5 - origin 0 0 - exp material( "playlist_infantry" ); - visible when(!GAME_DESC_VIS_ARG); - decoration - } - - itemDef - { - name gamemode_name - type ITEM_TYPE_TEXT - rect GAMEMODE_X 175 170 20 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_NORMAL - textscale 0.4 - forecolor 1 1 1 1 - exp text "@" + tableLookup( "mp/gametypesTable.csv", 0, dvarString( ui_gametype ), 1 ); // ui_preview_gt - visible when(GAME_DESC_VIS_ARG) - decoration - } - - itemDef - { - name gamemode_custom_name - type ITEM_TYPE_TEXT - rect GAMEMODE_X 175 170 20 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_NORMAL - textscale 0.4 - forecolor 1 1 1 1 - text "@CUSTOM_CUSTOM_GAME_MODE_CAPS" - visible when(!GAME_DESC_VIS_ARG) - decoration - } - - itemDef - { - name gamemode_desc - type ITEM_TYPE_TEXT - rect GAMEMODE_X 195 170 35 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_SMALL - textscale 0.3 - forecolor 1 1 1 1 - exp text "@" + tableLookup( "mp/gametypesTable.csv", 0, dvarString( ui_gametype ), 2 ); // ui_preview_gt - visible when(GAME_DESC_VIS_ARG); - autowrapped - decoration - } - - itemDef - { - name gamemode_custom_desc - type ITEM_TYPE_TEXT - rect GAMEMODE_X 195 170 35 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_SMALL - textscale 0.3 - forecolor 1 1 1 1 - text "@CUSTOM_SELECT_FROM_FILESHARE_DESC" - visible when(!GAME_DESC_VIS_ARG); - autowrapped - decoration - } - -#ifdef PC - #define LIST_PARAMS( listName ) \ - usePaging \ - mouseEnter \ - { \ - setFocus listName; \ - } -#else // #ifdef PC - #define LIST_PARAMS( listName ) -#endif // #else // #ifdef PC - - itemDef - { - name gamemode_selection - type ITEM_TYPE_LISTBOX - noBlinkingHighlight - rect GAMEMODE_X GAMEMODE_Y 170 170 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - style WINDOW_STYLE_FILLED - textscale CHOICE_TEXTSIZE - textstyle ITEM_TEXTSTYLE_SHADOWED - textfont UI_FONT_NORMAL - elementtype LISTBOX_TEXT - elementwidth 120 - elementheight 18 - textalignx 6 - textaligny 0 - backcolor 0 0 0 0.2 - border 1 - bordersize 1 - bordercolor 1 1 1 0.15 - outlinecolor 1 1 1 0 - forecolor CHOICE_TEXTCOLOR - focusColor 1 1 1 1 - disableColor 1 1 1 1 - feeder FEEDER_GAMETYPES_INGAME - LIST_PARAMS( gamemode_selection ) - visible 1 - userarea 2 -1 0 155 20 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - 6 0 155 20 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - doubleclick - { - setDvar ui_gametype_idx dvarString( "ui_preview_gt_idx" ); - if( !GAME_DESC_VIS_ARG ) - { - open "custom_select_from_fileshare_1"; - } - else - { - if( dvarString( "ui_preview_gt" ) != dvarString( "ui_gametype" ) ) - { - execNow "resetCustomGametype"; - } - - play CHOICE_ACTION_SOUND; - } - setDvar ui_gametype dvarString( ui_preview_gt ); - } - action - { - setDvar ui_gametype_idx dvarString( "ui_preview_gt_idx" ); - if( !GAME_DESC_VIS_ARG ) - { - open "custom_select_from_fileshare_1"; - } - else - { - if( dvarString( "ui_preview_gt" ) != dvarString( "ui_gametype" ) ) - { - execNow "resetCustomGametype"; - } - - play CHOICE_ACTION_SOUND; - } - setDvar ui_gametype dvarString( ui_preview_gt ); - } - } - - itemDef - { - name mappreview - style WINDOW_STYLE_SHADER - type ITEM_TYPE_IMAGE - rect MAPSELECT_X THUMBNAIL_Y 170 135 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - border 0 - bordercolor .5 .5 .5 .5 - origin 0 0 - exp material( tablelookup("mp/mapsTable.csv",0,dvarString(ui_mapname),4) ); // ui_preview - visible 1 - decoration - } - - itemDef - { - name map_name - type ITEM_TYPE_TEXT - rect MAPSELECT_X 175 170 20 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_NORMAL - textscale 0.4 - forecolor 1 1 1 1 - exp text "@" + tableLookup( "mp/mapsTable.csv", 0, dvarString( ui_mapname ) , 3 ); // ui_preview - visible 1 - decoration - } - - itemDef - { - name map_desc - type ITEM_TYPE_TEXT - rect MAPSELECT_X 195 170 35 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - textstyle ITEM_TEXTSTYLE_SHADOWED - textalign ITEM_ALIGN_LEFT - textfont UI_FONT_SMALL - textscale 0.3 - forecolor 1 1 1 1 - exp text "@" + tableLookup( "mp/mapsTable.csv", 0, dvarString( ui_mapname ) , 6 ); // ui_preview - visible 1 - autowrapped - decoration - } - - itemDef - { - name maplist - rect MAPSELECT_X MAPSELECT_Y 170 170 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - type ITEM_TYPE_LISTBOX - noBlinkingHighlight - style WINDOW_STYLE_FILLED - textscale CHOICE_TEXTSIZE - textstyle ITEM_TEXTSTYLE_SHADOWED - textfont UI_FONT_NORMAL - elementtype LISTBOX_TEXT - elementwidth 120 - elementheight 18 - textalignx 6 - textaligny 0 - backcolor 0 0 0 0.2 - border 1 - bordersize 1 - bordercolor 1 1 1 0.15 - outlinecolor 1 1 1 0 - forecolor CHOICE_TEXTCOLOR - focusColor 1 1 1 1 - disableColor 1 1 1 1 - feeder FEEDER_MAPS - LIST_PARAMS( maplist ) - visible 1 - userarea 2 -1 0 155 20 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* FEEDER_MAPSELECTION_COLUMN_BACKGROUND */ - 6 0 155 20 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE /* FEEDER_MAPSELECTION_COLUMN_NAME */ - - doubleclick { setDvar ui_mapname dvarString( ui_preview ); } - action { setDvar ui_mapname dvarString( ui_preview ); } - } - - itemDef - { - name vote - type ITEM_TYPE_BUTTON - rect MAPSELECT_X (MAPSELECT_Y+170+4) 40 20 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - exp rect W( getTextWidth(locString("@MPUI_VOTE"),UI_FONT_NORMAL,TEXTSIZE_DEFAULT)+8 ) - text "@MPUI_VOTE" - textfont UI_FONT_NORMAL - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_MIDDLE_CENTER - textstyle ITEM_TEXTSTYLE_SHADOWED - style WINDOW_STYLE_FILLED - visible 1 - forecolor 1 1 1 1 - backcolor 1 1 1 0 - border 1 - bordersize 1 - bordercolor CHOICE_BUTTON_BORDER_COLOR_UNSELECTED_RGBA - mouseEnter { setcolor bordercolor CHOICE_BUTTON_BORDER_COLOR_SELECTED_RGBA; play CHOICE_FOCUS_SOUND; } - mouseexit { setcolor bordercolor CHOICE_BUTTON_BORDER_COLOR_UNSELECTED_RGBA; } - action - { - play CHOICE_FOCUS_SOUND; -#ifdef CONSOLE - setDvar ui_gametype dvarString( ui_preview_gt ); - setDvar ui_mapname dvarString( ui_preview ); - uiScript voteTypeMapDVar ui_preview_gt ui_preview; -#else //#ifdef CONSOLE - uiScript voteTypeMapDVar ui_gametype ui_mapname; -#endif //#ifdef CONSOLE - close self; - } - } - - -#define TAB_1_TEXT (locString( "@MPUI_MAPS_CAPS" )) -#define TAB_2_TEXT (locString( "@MPUI_DLC_MAPS_CAPS" )) - -#define TAB_BG_PAD 5 -#define TAB_1_WIDTH ( getTextWidth( TAB_1_TEXT, UI_FONT_NORMAL, TEXTSIZE_DEFAULT ) + (TAB_BG_PAD*2) ) -#define TAB_2_WIDTH ( getTextWidth( TAB_2_TEXT, UI_FONT_NORMAL, TEXTSIZE_DEFAULT ) + (TAB_BG_PAD*2) ) -#define TAB_HEIGHT 15 - -#define MAP_TAB_1_X MAPSELECT_X -#define MAP_TAB_2_X ( MAP_TAB_1_X + TAB_1_WIDTH ) - -#define MAP_TAB_Y ( MAPSELECT_Y - TAB_HEIGHT ) -#define MAPS_TAB_VISIBLE ( 1 ) -#define DLC_TAB_VISIBLE ( dvarBool( "dlc2" ) || dvarBool( "dlc3" ) || dvarBool( "dlc4" ) ) - - itemDef - { - name switch_to_original_maps - type ITEM_TYPE_BUTTON - rect MAP_TAB_1_X MAP_TAB_Y 0 TAB_HEIGHT HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - exp rect W( TAB_1_WIDTH ) - text "@MPUI_MAPS_CAPS" - textfont UI_FONT_NORMAL - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_MIDDLE_CENTER - textstyle ITEM_TEXTSTYLE_SHADOWED - style WINDOW_STYLE_FILLED - visible when( DLC_TAB_VISIBLE ) - forecolor 1 1 1 1 - backcolor 1 1 1 0 - border 1 - bordersize 1 - bordercolor CHOICE_BUTTON_BORDER_COLOR_UNSELECTED_RGBA - mouseEnter { setcolor bordercolor CHOICE_BUTTON_BORDER_COLOR_SELECTED_RGBA; play CHOICE_FOCUS_SOUND; } - mouseexit { setcolor bordercolor CHOICE_BUTTON_BORDER_COLOR_UNSELECTED_RGBA; } - action - { - setDvar ui_showDLCMaps 0; - } - } - - itemDef - { - name switch_to_dlc_maps - type ITEM_TYPE_BUTTON - rect 0 MAP_TAB_Y 0 TAB_HEIGHT HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - exp rect W( TAB_2_WIDTH ) - exp rect X( MAP_TAB_2_X ) - text "@MPUI_DLC_MAPS_CAPS" - textfont UI_FONT_NORMAL - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_MIDDLE_CENTER - textstyle ITEM_TEXTSTYLE_SHADOWED - style WINDOW_STYLE_FILLED - visible when( DLC_TAB_VISIBLE ) - forecolor 1 1 1 1 - backcolor 1 1 1 0 - border 1 - bordersize 1 - bordercolor CHOICE_BUTTON_BORDER_COLOR_UNSELECTED_RGBA - mouseEnter { setcolor bordercolor CHOICE_BUTTON_BORDER_COLOR_SELECTED_RGBA; play CHOICE_FOCUS_SOUND; } - mouseexit { setcolor bordercolor CHOICE_BUTTON_BORDER_COLOR_UNSELECTED_RGBA; } - action - { - setDvar ui_showDLCMaps 1; - } - } - - NEW_FRAME_BACK_BUTTON_ACTION_PC_VIS( exec "wait"; close self;, 1 ) - } - - - menuDef - { - name kickplayer - fullScreen 0 - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN // Size and position of the menu - focusColor COLOR_FOCUSED // Menu focus color for text and items -#ifdef CONSOLE - blurWorld 7.0 -#endif - onEsc - { - showMenu callvote; - close self; - } - - onClose - { - } - - #undef CALLVOTE_SUBTITLE - #define CALLVOTE_SUBTITLE "@MPUI_KICK_PLAYER" - #include "ui_mp/scriptmenus/callvote_buttons.inc" - - itemDef - { - name playerlist - type ITEM_TYPE_LISTBOX - noBlinkingHighlight - visible 1 - rect GAMEMODE_X 90 260 330 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - style WINDOW_STYLE_FILLED - textscale CHOICE_TEXTSIZE - textstyle ITEM_TEXTSTYLE_SHADOWED - textfont UI_FONT_NORMAL - elementtype LISTBOX_TEXT - elementwidth 120 - elementheight 18 - textalignx 6 - textaligny 0 - backcolor 0 0 0 0.2 - border 1 - bordersize 1 - bordercolor 1 1 1 0.15 - outlinecolor 1 1 1 0 - forecolor CHOICE_TEXTCOLOR - focusColor 1 1 1 1 - disableColor 1 1 1 1 - feeder FEEDER_PLAYER_LIST - LIST_PARAMS( playerlist ) - userarea 2 -1 0 244 20 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - 6 0 244 20 32 ITEM_ALIGN_LEFT ITEM_ALIGN_MIDDLE - } - - itemDef - { - name vote - type ITEM_TYPE_BUTTON - rect GAMEMODE_X (90+330+4) 40 20 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP - exp rect W( getTextWidth(locString("@MPUI_VOTE"),UI_FONT_NORMAL,TEXTSIZE_DEFAULT)+8 ) - text "@MPUI_VOTE" - textfont UI_FONT_NORMAL - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_MIDDLE_CENTER - textstyle ITEM_TEXTSTYLE_SHADOWED - style WINDOW_STYLE_FILLED - visible 1 - forecolor 1 1 1 1 - backcolor 1 1 1 0 - border 1 - bordersize 1 - bordercolor CHOICE_BUTTON_BORDER_COLOR_UNSELECTED_RGBA - mouseEnter { setcolor bordercolor CHOICE_BUTTON_BORDER_COLOR_SELECTED_RGBA; play CHOICE_FOCUS_SOUND; } - mouseexit { setcolor bordercolor CHOICE_BUTTON_BORDER_COLOR_UNSELECTED_RGBA; } - action - { - play CHOICE_FOCUS_SOUND; - uiScript voteTempBan; - close self; - } - } - - NEW_FRAME_BACK_BUTTON_ACTION_PC_VIS( close self;, 1 ) - } -} - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X 150 - -#undef CHOICE_X_START -#define CHOICE_X_START 0 -#undef CHOICE_Y_START -#define CHOICE_Y_START 65 - -#undef CHOICE_SEP_OFFSET_Y -#define CHOICE_SEP_OFFSET_Y -2 -#undef CHOICE_SIDEITEM_SPACING -#define CHOICE_SIDEITEM_SPACING -310 - -#undef CHOICE_DVAR_OFFSET_X -#define CHOICE_DVAR_OFFSET_X (CHOICE_SIZE_X+20) -#undef CHOICE_DVAR_TEXTALIGN -#define CHOICE_DVAR_TEXTALIGN ITEM_ALIGN_MIDDLE_LEFT - -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_popmenu.menu" -#include "ui_mp/stats_info.inc" -#include "ui_mp/fileshare.inc" -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" - -#include "ui_mp/popup_player_info.inc" - - -#define GAME_MODE_FILESHARE_UPLOAD_ACTION \ - execNow uploadCustomGametype ( getFeederData( "menu_game_mode_upload_1", "fileShareSlots", "slot" ) ); \ - execNow "set customGameMode 1"; \ - execNow "xupdatepartystate"; \ - if( dvarInt( ui_custom_gobackonupload ) ) \ - { \ - closeimmediate custom_game_create; \ - closeimmediate select_game_mode; \ - } - -#include "ui_mp/popupstyle.inc" - -FILESHARE_SLOT_SELECTOR_EX ( menu_game_mode_upload_1, GAME_MODE_FILESHARE_UPLOAD_ACTION, ;, open custom_game_create;, ; ) - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X 260 - -#undef CHOICE_X_START -#define CHOICE_X_START 0 - -#undef CHOICE_Y_START -#define CHOICE_Y_START 85 -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL - -#undef ON_ESC -#define ON_ESC \ - close self; - -menuDef -{ - name custom_select_from_fileshare_1 - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - control MENU_CONTROL_OPENER - soundloop MENU_MUSIC - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED - openSlideDirection MENU_SLIDE_DIRECTION_RIGHT_TO_LEFT - closeSlideDirection MENU_SLIDE_DIRECTION_LEFT_TO_RIGHT - - onOpen - { -#ifdef PC -// exec readfileshare -#endif - } - onFocus - { - activateBlur; - } - onClose - { - deactivateBlur; - } - onESC - { - ON_ESC - } - - NEW_FRAME( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) - - NEW_FRAME_TITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@CUSTOM_FILESHARE_SELECT_MODE_TITLE", 1 ) - NEW_FRAME_SUBTITLE( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, "@CUSTOM_FILESHARE_SELECT_MODE_DESC", 1 ) - - PLAYER_INFO_VIS( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, 1 ) - - itemDef - { - name fileShareSlots - type ITEM_TYPE_LISTBOX - feeder FEEDER_FILESHARE_MYSLOTS - FILESHARE_COMMON_OPTIONS - origin 0 0 - elementwidth 70 - elementheight 67 - elementtype LISTBOX_TEXT - textalign ITEM_ALIGN_MIDDLE_CENTER - textfont UI_FONT_NORMAL - textscale TEXTSIZE_SUBTITLE - forecolor CHOICE_TEXTCOLOR - modal - doubleclick - { - if ( getFeederData( "slotOccupied" ) && !( FILESHARE_TASKSINPROGRESS ) ) - { - if( getFeederData( "fileType" ) == "customgamemode" ) - { - execNow downloadCustomGametype (getFeederData( "fileID" )) (getFeederData( "fileSize" )); - closeimmediate custom_select_from_fileshare_1; - closeimmediate select_game_mode; - } - } - } - - visible 1 - - FILESHARE_SLOTS_USERAREAS - } - FILESHARE_BOTTOM( fileShareSlots, 1 ) - - /* SLOT OCCUPIED */ -#define SLOT_OCCUPIED_CONDITION \ - ( getFeederData( "fileShareSlots", "slotOccupied" ) && getFeederData( "fileShareSlots", "count" ) > 0.0 ) - -#define SLOT_HAS_GAME_MODE \ - ( getFeederData( "fileShareSlots", "fileType" ) == "customgamemode" ) - -#undef FILESHARE_SELECTOR_TOOLTIP_Y -#ifdef PC - #define FILESHARE_SELECTOR_TOOLTIP_Y FILESHARE_TOOLTIP_PC_Y -#else //#ifdef PC - #define FILESHARE_SELECTOR_TOOLTIP_Y 95 -#endif //#ifdef PC - - - // Tooltip - Occupied Slot with custom game mode - PREPROC_TEXT_DRAW_VIS_EX( -255 FILESHARE_SELECTOR_TOOLTIP_Y 280 36 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "CUSTOM_FILESHARE_CGM_HIGHLIGHTED" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, when( SLOT_OCCUPIED_CONDITION && SLOT_HAS_GAME_MODE ), autowrapped; ) - PREPROC_SHADER_DRAW_VIS_EX( -265 FILESHARE_SELECTOR_TOOLTIP_Y 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "ui_arrow_right", COLOR_BODY_TEXT, when( SLOT_OCCUPIED_CONDITION && SLOT_HAS_GAME_MODE ), ; ) - - // Tooltip - Occupied Slot that is not a custom game mode - PREPROC_TEXT_DRAW_VIS_EX( -255 FILESHARE_SELECTOR_TOOLTIP_Y 280 36 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, locString( "CUSTOM_FILESHARE_CANT_SELECT" ), TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, when( SLOT_OCCUPIED_CONDITION && !SLOT_HAS_GAME_MODE ), autowrapped; ) - PREPROC_SHADER_DRAW_VIS_EX( -265 FILESHARE_SELECTOR_TOOLTIP_Y 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "ui_arrow_right", COLOR_BODY_TEXT, when( SLOT_OCCUPIED_CONDITION && !SLOT_HAS_GAME_MODE ), ; ) - - FILESHARE_SPINNER( 145, -45, when( FILESHARE_TASKSINPROGRESS ), 350 ) - - execKeyInt APAD_UP - { - execnow set fshSelectLastSlotRow 1; - setfocus fileShareSlots; - } - - execKeyInt DPAD_UP - { - execnow set fshSelectLastSlotRow 1; - setfocus fileShareSlots; - } - - execKeyInt APAD_DOWN - { - execnow set fshSelectFirstSlotRow 1; - setfocus fileShareSlots; - } - - execKeyInt DPAD_DOWN - { - execnow set fshSelectFirstSlotRow 1; - setfocus fileShareSlots; - } - /* - execKeyInt BUTTON_X - { - open fileshare_mymovie; - } - -#ifdef CONSOLE - itemDef - { - type ITEM_TYPE_TEXT - rect -210 206 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - text "@PLATFORM_FILESHARE_MYMOVIE" - textfont CHOICE_TEXTFONT - - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_BOTTOM_LEFT - visible 1 - decoration - } -#endif - */ - -#ifndef PC - itemDef - { - type ITEM_TYPE_TEXT - rect -210 206 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - text "@PLATFORM_SELECT" - textfont CHOICE_TEXTFONT - - textscale TEXTSIZE_DEFAULT - textalign ITEM_ALIGN_BOTTOM_LEFT - visible when( getFeederData( "fileShareSlots", "slotOccupied" ) == 1 ) - decoration - } -#endif - - NEW_FRAME_BUTTON_NOICON( 1, 28 0 0 18 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "", execnow "updatemarketplace";, ;, ;, 1, ;, ; ) - //FILESHARE_LIVEBLURB( -271, 50, 290, 100, HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, !IsPremiumSubscriber(), ( localVarInt( ui_highlight ) == 1 ) ) - -#ifdef CONSOLE - itemDef - { - type ITEM_TYPE_TEXT - rect -146 80 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - exp text( int( getFeederData( "fileShareSlots", "slot" ) ) ) - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_SMALL - textalign ITEM_ALIGN_MIDDLE_RIGHT - forecolor 1 1 1 1 - visible 1 - decoration - } - - itemDef - { - type ITEM_TYPE_TEXT - rect -142 80 0 0 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - text "@MENU_FILESHARE_OF18" - textfont CHOICE_TEXTFONT - textscale TEXTSIZE_SMALL - textalign ITEM_ALIGN_MIDDLE_LEFT - forecolor 1 1 1 1 - visible 1 - } - // Top Arrow - PREPROC_SHADER_DRAW_VIS_EX( -114 75 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "ui_arrow_left", COLOR_BODY_TEXT, when( getFeederData( "fileShareSlots", "slot" ) > 6 ), rotation 90; ) - - // Bottom Arrow 1 - PREPROC_SHADER_DRAW_VIS_EX( -107 75 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "ui_arrow_right", COLOR_BODY_TEXT, when( getFeederData( "fileShareSlots", "slot" ) > 6 && getFeederData( "fileShareSlots", "slot" ) < 13 ), rotation 90; ) - - // Bottom Arrow 2 - PREPROC_SHADER_DRAW_VIS_EX( -114 75 11 11 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, "ui_arrow_right", COLOR_BODY_TEXT, when( getFeederData( "fileShareSlots", "slot" ) <= 6 ), rotation 90; ) -#endif //#ifdef CONSOLE - // File details - FILESHARE_DETAILS( 35, (NEW_FRAME_CHOICE_Y_START-1), HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, "custom_select_from_fileshare_1", "fileShareSlots", SLOT_OCCUPIED_CONDITION ) - - FILESHARE_SPINNER( 145, -45, when( FILESHARE_TASKSINPROGRESS ), 350 ) - - -#ifdef PC - NEW_FRAME_BACK_BUTTON_ACTION( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT, ON_ESC ) -#else //#ifdef PC - NEW_FRAME_BACK_BUTTON( FILESHARE_FRAME_WIDTH, FILESHARE_FRAME_HEIGHT ) -#endif //#ifdef PC - - #include "ui/safearea.menu" -} diff --git a/mods/patch_mp/ui_mp/scriptmenus/changeclass.menu b/mods/patch_mp/ui_mp/scriptmenus/changeclass.menu deleted file mode 100644 index a32c524..0000000 --- a/mods/patch_mp/ui_mp/scriptmenus/changeclass.menu +++ /dev/null @@ -1,365 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui_mp/stats_info.inc" -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" - - -#undef CHOICE_X_START -#define CHOICE_X_START 30 -#undef CHOICE_Y_START -#define CHOICE_Y_START -105 - -#ifdef PC - #define PC_INGAME //for background in overlaybg.inc -#endif - -#define CHOICE_SEP_OFFSET_Y -2 -#define CHOICE_SEP_1 5 - -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui_mp/overlaybg.inc" - -#define HIGH_BOUND "1000" - -#undef BUTTON_BG_X_START -#define BUTTON_BG_X_START 30 -#undef BUTTON_BG_Y_START -#define BUTTON_BG_Y_START 42 - -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X 200 - -#undef CHOICE_HORIZONTAL_ALIGN -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_LEFT - -#undef CHOICE_VERTICAL_ALIGN -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER - -// ------ - -#undef ON_ESC -#define ON_ESC scriptMenuResponse "back"; - -{ - menuDef - { - name "changeclass" - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_EMPTY -#ifdef CONSOLE - blurWorld 7.0 -#endif - onOpen - { - if ( IsSplitscreen() ) - { - close self; - if ( IsViewportLarge() ) - { - open "changeclass_splitscreen"; - } - else - { - open "changeclass_splitscreen_small"; - } - } - else - { - // update player's XP - execNow "statGetByNameInDvar RANKXP ui_stat_rankxp"; - - if ( dvarString( ui_custom_name ) == "" ) - { - execnow set ui_custom_name customclass1; - } - - if( dvarString( ui_class ) == "" ) - { - execnow set ui_class class_smg; - } - /*set ui_multi_s "HIGH_BOUND"; set ui_multi_dt 0";*/ - - setfocusbydvar "ui_customclass_selected"; - //focusFirst - } - if (IsInGame()) - { - showMenu "pausedbkgnd"; - } - -#ifdef PC - setLocalVarBool ui_hide_cac_item_info_highlights 1; -#endif // #ifdef PC - } - onClose - { - if (IsInGame()) - { - hideMenu "pausedbkgnd"; - } - -#ifdef PC - setLocalVarBool ui_hide_cac_item_info_highlights 0; -#endif // #ifdef PC - } - onEsc - { - ON_ESC - } - - execkeyint BUTTON_START - { - close self; - } - - -#ifndef PC // background overlay - #include "ui_mp/ingamebg.inc" -#endif // background overlay - - // ------------------ TREE TITLE ------------------ - - CHOICE_MENU_TITLE_ALIGN_VIS( "@MPUI_CHOOSE_CLASS_CAPS", HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP, ITEM_ALIGN_MIDDLE_LEFT, 1 ) - - //========================================================================= - //================ MENU SELECTION FOR ONLINE/OFFLINE GAME ================= - //========================================================================= - - #define IS_ONLINE_GAME ( dvarInt( splitscreen ) == 0 && dvarInt( systemlink ) == 0 ) - #define IS_BASICTRAINING_GAME ( dvarInt( xblive_basictraining ) > 0 ) - - #define FOCUS_CHECK( pnum ) \ - dvartest "ui_customclass_selected" focusdvar { pnum } - - #define ACTION_COMMON( pnum ) \ - setDvar ui_customclass_selected pnum; - - #define SHOW_ONLINE_CLASS_NAME ( IS_ONLINE_GAME && !IS_BASICTRAINING_GAME ) - #define CUSTOM_CLASS_TEXT( online, offline ) \ - Select( SHOW_ONLINE_CLASS_NAME, dvarString( online ), dvarString( offline ) ) - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 1, CUSTOM_CLASS_TEXT( customclass1, offline_customclass1 ), - scriptMenuResponse "custom1,0"; ACTION_COMMON( 6 ), - exec "set ui_custom_name customclass1; set ui_multi_s 0; set ui_multi_dt "HIGH_BOUND;, - ;, - !IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ), FOCUS_CHECK( 6 ) ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 1, CUSTOM_CLASS_TEXT( customclass1, offline_customclass1 ), - ;, - ;, - IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ), decoration ) - - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 2, CUSTOM_CLASS_TEXT( customclass2, offline_customclass2 ), - scriptMenuResponse "custom2,0"; ACTION_COMMON( 7 ), - exec "set ui_custom_name customclass2; set ui_multi_s 0; set ui_multi_dt "HIGH_BOUND;, - ;, - !IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ), FOCUS_CHECK( 7 ) ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 2, CUSTOM_CLASS_TEXT( customclass2, offline_customclass2 ), - ;, - ;, - IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ), decoration ) - - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 3, CUSTOM_CLASS_TEXT( customclass3, offline_customclass3 ), - scriptMenuResponse "custom3,0"; ACTION_COMMON( 8 ), - exec "set ui_custom_name customclass3; set ui_multi_s 0; set ui_multi_dt "HIGH_BOUND;, - ;, - !IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ), FOCUS_CHECK( 8 ) ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 3, CUSTOM_CLASS_TEXT( customclass3, offline_customclass3 ), - ;, - ;, - IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ), decoration ) - - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 4, CUSTOM_CLASS_TEXT( customclass4, offline_customclass4 ), - scriptMenuResponse "custom4,0"; ACTION_COMMON( 9 ), - exec "set ui_custom_name customclass4; set ui_multi_s 0; set ui_multi_dt "HIGH_BOUND;, - ;, - !IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ), FOCUS_CHECK( 9 ) ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 4, CUSTOM_CLASS_TEXT( customclass4, offline_customclass4 ), - ;, - ;, - IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ), decoration ) - - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 5, CUSTOM_CLASS_TEXT( customclass5, offline_customclass5 ), - scriptMenuResponse "custom5,0"; ACTION_COMMON( 10 ), - exec "set ui_custom_name customclass5; set ui_multi_s 0; set ui_multi_dt "HIGH_BOUND;, - ;, - !IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ), FOCUS_CHECK( 10 ) ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 5, CUSTOM_CLASS_TEXT( customclass5, offline_customclass5 ), - ;, - ;, - IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ), decoration ) - - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 6, "@CLASS_CLASS1", - scriptMenuResponse "smg_mp,0"; ACTION_COMMON( 1 ), - exec "set ui_class class_smg; set ui_multi_s "HIGH_BOUND"; set ui_multi_dt 0";, - ;, - ( IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) || IS_ITEM_LOCKED( FEATURE_PRESTIGE_CLASS_1 ) || !IS_ONLINE_GAME ), FOCUS_CHECK( 1 ) ) - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 6, dvarString( prestigeclass1 ), - scriptMenuResponse "prestige1,0"; ACTION_COMMON( 11 ), - exec "set ui_custom_name prestigeclass1; set ui_multi_s 0; set ui_multi_dt "HIGH_BOUND;, - ;, - ( !IS_ITEM_LOCKED( FEATURE_PRESTIGE_CLASS_1 ) && ( !IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) ) && IS_ONLINE_GAME ), FOCUS_CHECK( 1 ) ) - - - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 7, "@CLASS_CLASS2", - scriptMenuResponse "cqb_mp,0"; ACTION_COMMON( 2 ), - exec" set ui_class class_cqb; set ui_multi_s "HIGH_BOUND"; set ui_multi_dt 0";, - ;, - ( IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) || IS_ITEM_LOCKED( FEATURE_PRESTIGE_CLASS_2 ) || !IS_ONLINE_GAME ), FOCUS_CHECK( 2 ) ) - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 7, dvarString( prestigeclass2 ), - scriptMenuResponse "prestige2,0"; ACTION_COMMON( 12 ), - exec "set ui_custom_name prestigeclass2; set ui_multi_s 0; set ui_multi_dt "HIGH_BOUND;, - ;, - ( !IS_ITEM_LOCKED( FEATURE_PRESTIGE_CLASS_2 ) && ( !IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) ) && IS_ONLINE_GAME ), FOCUS_CHECK( 2 ) ) - - - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 8, "@CLASS_CLASS3", - scriptMenuResponse "assault_mp,0"; ACTION_COMMON( 3 ), - exec "set ui_class class_assault; set ui_multi_s "HIGH_BOUND"; set ui_multi_dt 0";, - ;, - ( IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) || IS_ITEM_LOCKED( FEATURE_PRESTIGE_CLASS_3 ) || !IS_ONLINE_GAME ), FOCUS_CHECK( 3 ) ) - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 8, dvarString( prestigeclass3 ), - scriptMenuResponse "prestige3,0"; ACTION_COMMON( 13 ), - exec "set ui_custom_name prestigeclass3; set ui_multi_s 0; set ui_multi_dt "HIGH_BOUND;, - ;, - ( !IS_ITEM_LOCKED( FEATURE_PRESTIGE_CLASS_3 ) && ( !IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) ) && IS_ONLINE_GAME ), FOCUS_CHECK( 3 ) ) - - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 9, "@CLASS_CLASS4", - scriptMenuResponse "lmg_mp,0"; ACTION_COMMON( 4 ), - exec "set ui_class class_lmg; set ui_multi_s "HIGH_BOUND"; set ui_multi_dt 0"; CLEAR_ITEM_NEW( FEATURE_CLOSEASSAULT ), - ;, - ( ( !IS_ITEM_LOCKED( FEATURE_CLOSEASSAULT ) && ( IS_ITEM_LOCKED( FEATURE_PRESTIGE_CLASS_4 ) || ( IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) && !IS_ITEM_LOCKED( FEATURE_PRESTIGE_CLASS_4 ) ) ) ) || !IS_ONLINE_GAME ), FOCUS_CHECK( 4 ) ) - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 9, dvarString( prestigeclass4 ), - scriptMenuResponse "prestige4,0";ACTION_COMMON( 14 ), - exec "set ui_custom_name prestigeclass4; set ui_multi_s 0; set ui_multi_dt "HIGH_BOUND; CLEAR_ITEM_NEW( FEATURE_CLOSEASSAULT ), - ;, - ( !IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) && !IS_ITEM_LOCKED( FEATURE_PRESTIGE_CLASS_4 ) && IS_ONLINE_GAME ), FOCUS_CHECK( 4 ) ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 9, "@CLASS_CLASS4", - ;, - ;, - ( IS_ITEM_LOCKED( FEATURE_CLOSEASSAULT ) && IS_ONLINE_GAME ), decoration FOCUS_CHECK( 4 ) ) - CHOICE_NEWICON_VIS( 9, "menu_mp_lobby_new", when( ( IS_ITEM_NEW( FEATURE_CLOSEASSAULT ) ) && IS_ONLINE_GAME ) ) - - - - - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 10, "@CLASS_CLASS5", - scriptMenuResponse "sniper_mp,0"; ACTION_COMMON( 5 ), - exec" set ui_class class_sniper; set ui_multi_s "HIGH_BOUND"; set ui_multi_dt 0"; CLEAR_ITEM_NEW( FEATURE_SNIPER ), - ;, - ( ( !IS_ITEM_LOCKED( FEATURE_SNIPER ) && ( IS_ITEM_LOCKED( FEATURE_PRESTIGE_CLASS_5 ) || ( IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) && !IS_ITEM_LOCKED( FEATURE_PRESTIGE_CLASS_5 ) ) ) ) || !IS_ONLINE_GAME ), FOCUS_CHECK( 5 ) ) - FRAME_CHOICE_BUTTON_FOCUS_VIS_EX( 10, dvarString( prestigeclass5 ), - scriptMenuResponse "prestige5,0"; ACTION_COMMON( 15 ), - exec "set ui_custom_name prestigeclass5; set ui_multi_s 0; set ui_multi_dt "HIGH_BOUND; CLEAR_ITEM_NEW( FEATURE_SNIPER ), - ;, - ( !IS_ITEM_LOCKED( FEATURE_CREATE_A_CLASS ) && !IS_ITEM_LOCKED( FEATURE_PRESTIGE_CLASS_5 ) && IS_ONLINE_GAME ), FOCUS_CHECK( 5 ) ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 10, "@CLASS_CLASS5", - ;, - ;, - ( IS_ITEM_LOCKED( FEATURE_SNIPER ) && IS_ONLINE_GAME ), decoration FOCUS_CHECK( 5 ) ) - CHOICE_NEWICON_VIS( 10, "menu_mp_lobby_new", when( ( IS_ITEM_NEW( FEATURE_SNIPER ) ) && IS_ONLINE_GAME ) ) - - - #define DATA_TABLE_PRIMARY_GRENADE GetDefaultClassSlot( dvarstring( ui_class ), "primarygrenade" ) - #define DATA_TABLE_PRIMARY GetDefaultClassSlot( dvarstring( ui_class ), "primary" ) - // no default attachments or camo for now - #define DATA_TABLE_PRIMARY_ATTACHMENT 0 - #define DATA_TABLE_PRIMARY_CAMO 0 - #define DATA_TABLE_SECONDARY GetDefaultClassSlot( dvarstring( ui_class ), "secondary" ) - // no default attachments or camo for now - #define DATA_TABLE_SECONDARY_ATTACHMENT 0 - #define DATA_TABLE_SECONDARY_CAMO 0 - #define DATA_TABLE_SPECIALTY1 GetDefaultClassSlot( dvarstring( ui_class ), "specialty1" ) - #define DATA_TABLE_SPECIALTY2 GetDefaultClassSlot( dvarstring( ui_class ), "specialty2" ) - #define DATA_TABLE_SPECIALTY3 GetDefaultClassSlot( dvarstring( ui_class ), "specialty3" ) - #define DATA_TABLE_EQUIPMENT GetDefaultClassSlot( dvarstring( ui_class ), "equipment" ) - #define DATA_TABLE_SPECIAL_GRENADE GetDefaultClassSlot( dvarstring( ui_class ), "specialgrenade" ) - #define DATA_TABLE_BODY GetDefaultClassSlot( dvarstring( ui_class ), "body" ) - #define DATA_TABLE_DEATHSTREAK GetDefaultClassSlot( dvarstring( ui_class ), "deathstreak" ) - #define DATA_TABLE_KILLSTREAK_TIER1 GetDefaultClassSlot( dvarstring( ui_class ), "killstreak1" ) - #define DATA_TABLE_KILLSTREAK_TIER2 GetDefaultClassSlot( dvarstring( ui_class ), "killstreak2" ) - #define DATA_TABLE_KILLSTREAK_TIER3 GetDefaultClassSlot( dvarstring( ui_class ), "killstreak3" ) - - /* ==================================== custom classes ============================================= */ - - #define STATS_PRIMARY getCACItemIndex( ( dvarString( ui_custom_name ) ), "primary" ) - #define STATS_PRIMARY_ATTACHMENT getCACItemIndex( ( dvarString( ui_custom_name ) ), "primaryattachment" ) - #define STATS_PRIMARY_CAMO getCACItemIndex( ( dvarString( ui_custom_name ) ), "primarycamo" ) - #define STATS_SECONDARY getCACItemIndex( ( dvarString( ui_custom_name ) ), "secondary" ) - #define STATS_SECONDARY_ATTACHMENT getCACItemIndex( ( dvarString( ui_custom_name ) ), "secondaryattachment" ) - #define STATS_SECONDARY_CAMO getCACItemIndex( ( dvarString( ui_custom_name ) ), "secondarycamo" ) - #define STATS_PRIMARY_GRENADE getCACItemIndex( ( dvarString( ui_custom_name ) ), "primarygrenade" ) - #define STATS_SPECIALTY1 getCACItemIndex( ( dvarString( ui_custom_name ) ), "specialty1" ) - #define STATS_SPECIALTY2 getCACItemIndex( ( dvarString( ui_custom_name ) ), "specialty2" ) - #define STATS_SPECIALTY3 getCACItemIndex( ( dvarString( ui_custom_name ) ), "specialty3" ) - #define STATS_EQUIPMENT getCACItemIndex( ( dvarString( ui_custom_name ) ), "equipment" ) - #define STATS_SPECIAL_GRENADE getCACItemIndex( ( dvarString( ui_custom_name ) ), "specialgrenade" ) - #define STATS_BODY getCACItemIndex( ( dvarString( ui_custom_name ) ), "body" ) - #define STATS_DEATHSTREAK getCACItemIndex( "cacLoadouts", "deathstreak" ) - #define STATS_KILLSTREAK_TIER1 getCACItemIndex( "cacLoadouts", "killstreak1" ) - #define STATS_KILLSTREAK_TIER2 getCACItemIndex( "cacLoadouts", "killstreak2" ) - #define STATS_KILLSTREAK_TIER3 getCACItemIndex( "cacLoadouts", "killstreak3" ) - - #include "ui/safearea.menu" - - /* ================================================================================= */ - /* ================================ LOADOUT DISPLAY ================================ */ - /* ================================================================================= */ - - - #define STAT_CAC_PRIMARY_GRENADE int(min( STATS_PRIMARY_GRENADE + dvarInt(ui_multi_s), DATA_TABLE_PRIMARY_GRENADE + dvarInt(ui_multi_dt) )) - #define STAT_CAC_PRIMARY int(min( STATS_PRIMARY + dvarInt(ui_multi_s), DATA_TABLE_PRIMARY + dvarInt(ui_multi_dt) )) - #define STAT_CAC_PRIMARY_ATTACHMENT int(min( STATS_PRIMARY_ATTACHMENT + dvarInt(ui_multi_s), DATA_TABLE_PRIMARY_ATTACHMENT + dvarInt(ui_multi_dt) )) - #define STAT_CAC_PRIMARY_CAMO int(min( STATS_PRIMARY_CAMO + dvarInt(ui_multi_s), DATA_TABLE_PRIMARY_CAMO + dvarInt(ui_multi_dt) )) - #define STAT_CAC_SECONDARY int(min( STATS_SECONDARY + dvarInt(ui_multi_s), DATA_TABLE_SECONDARY + dvarInt(ui_multi_dt) )) - #define STAT_CAC_SECONDARY_ATTACHMENT int(min( STATS_SECONDARY_ATTACHMENT + dvarInt(ui_multi_s), DATA_TABLE_SECONDARY_ATTACHMENT + dvarInt(ui_multi_dt) )) - #define STAT_CAC_SECONDARY_CAMO int(min( STATS_SECONDARY_CAMO + dvarInt(ui_multi_s), DATA_TABLE_SECONDARY_CAMO + dvarInt(ui_multi_dt) )) - #define STAT_CAC_SPECIALTY1 int(min( STATS_SPECIALTY1 + dvarInt(ui_multi_s), DATA_TABLE_SPECIALTY1 + dvarInt(ui_multi_dt) )) - #define STAT_CAC_SPECIALTY2 int(min( STATS_SPECIALTY2 + dvarInt(ui_multi_s), DATA_TABLE_SPECIALTY2 + dvarInt(ui_multi_dt) )) - #define STAT_CAC_SPECIALTY3 int(min( STATS_SPECIALTY3 + dvarInt(ui_multi_s), DATA_TABLE_SPECIALTY3 + dvarInt(ui_multi_dt) )) - #define STAT_CAC_EQUIPMENT int(min( STATS_EQUIPMENT + dvarInt(ui_multi_s), DATA_TABLE_EQUIPMENT + dvarInt(ui_multi_dt) )) - #define STAT_CAC_SPECIAL_GRENADE int(min( STATS_SPECIAL_GRENADE + dvarInt(ui_multi_s), DATA_TABLE_SPECIAL_GRENADE + dvarInt(ui_multi_dt) )) - #define STAT_CAC_BODY int(min( STATS_BODY + dvarInt(ui_multi_s), DATA_TABLE_BODY + dvarInt(ui_multi_dt) )) - #define STAT_CAC_DEATHSTREAK int(min( STATS_DEATHSTREAK + dvarInt(ui_multi_s), DATA_TABLE_DEATHSTREAK + dvarInt(ui_multi_dt) )) - #define STAT_CAC_KILLSTREAK_TIER1 STATS_KILLSTREAK_TIER1 - #define STAT_CAC_KILLSTREAK_TIER2 STATS_KILLSTREAK_TIER2 - #define STAT_CAC_KILLSTREAK_TIER3 STATS_KILLSTREAK_TIER3 - #define FIRST_ATTACHMENT_PRIMARY_WEAPON \ - Select( dvarInt( ui_multi_s ) == 0, GetItemEquippedAttachment( dvarString( ui_custom_name ), STAT_CAC_PRIMARY, 0 ), -1 ) - #define SECOND_ATTACHMENT_PRIMARY_WEAPON \ - Select( dvarInt( ui_multi_s ) == 0, GetItemEquippedAttachment( dvarString( ui_custom_name ), STAT_CAC_PRIMARY, 1 ), -1 ) - #define FIRST_ATTACHMENT_SECONDARY_WEAPON \ - Select( dvarInt( ui_multi_s ) == 0, GetItemEquippedAttachment( dvarString( ui_custom_name ), STAT_CAC_SECONDARY, 0 ), -1 ) - #define SECOND_ATTACHMENT_SECONDARY_WEAPON \ - Select( dvarInt( ui_multi_s ) == 0, GetItemEquippedAttachment( dvarString( ui_custom_name ), STAT_CAC_SECONDARY, 1 ), -1 ) - - // Frame setup - #define CAC_HEIGHT NEW_FRAME_DEFAULT_HEIGHT - #define CAC_WIDTH ( CAC_HEIGHT * FRAME_ASPECT_RATIO ) - #define COMMON_ITEM_INFO_X ( -(NEW_FRAME_BUTTON_WIDTH+20) - 30 ) - #define COMMON_ITEM_INFO_Y ( -CAC_HEIGHT/2 + NEW_FRAME_BG_Y_OFFSET( CAC_HEIGHT ) ) - #define COMMON_ITEM_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_RIGHT - - #include "ui_mp/cac_item_info.inc" - - // Back button -#ifdef PC - NEW_FRAME_BACK_BUTTON_ACTION( 640, 480, ON_ESC ) -#else //#ifdef PC - PREPROC_TEXT_DRAW_VIS( CHOICE_X_START -17 50 17 CHOICE_HORIZONTAL_ALIGN VERTICAL_ALIGN_BOTTOM, 0 0, "@PLATFORM_BACK", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, 1 1 1 1, 1 ) -#endif //#ifdef PC - } -} diff --git a/mods/patch_mp/ui_mp/scriptmenus/class.menu b/mods/patch_mp/ui_mp/scriptmenus/class.menu deleted file mode 100644 index 7e25a1f..0000000 --- a/mods/patch_mp/ui_mp/scriptmenus/class.menu +++ /dev/null @@ -1,620 +0,0 @@ -#include "ui/menudef.h" -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" -#include "ui_mp/common_macro.inc" -#include "ui_mp/friendslist.inc" - -// Pause menu background... separate menu so that it can draw behind the objective menu -menuDef -{ - name "pausedbkgnd" - fullScreen 0 - rect 0 0 640 480 - focusColor COLOR_FOCUSED - blurWorld 4.8 - visible 1 - - #define SINGLE_PLAYER 1 - #include "ui_mp/ingamebg.inc" -} - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X 200 - -#define BACKGROUND_COLOR_GRAY_RGB 0.62 0.70 0.70 - -#ifdef PC - #undef CHOICE_X_START - #define CHOICE_X_START 30 - #undef CHOICE_Y_START - #define CHOICE_Y_START -60 - #define CHOICE_SEP_1 5 -#else - #undef CHOICE_X_START - #define CHOICE_X_START 30 - #undef CHOICE_Y_START - #define CHOICE_Y_START -30 - #define CHOICE_SEP_1 3 -#endif - -#ifdef CONSOLE - #define CUSTOM_MATCH ( dvarbool( systemlink ) || dvarbool( xblive_privatematch ) ) - #define NOT_CUSTOM_MATCH ( !dvarbool( systemlink ) && !dvarbool( xblive_privatematch ) ) - #define RANKEDGAME (dvarBool( onlinegame ) && !dvarBool( xblive_privatematch )) - #define ISHOST (dvarBool( sv_running )) - #define TEAMGAME ( team( name ) != "TEAM_FREE") - #define NOTTEAMGAME ( team( name ) == "TEAM_FREE" ) - #define ALLOW_VOTE ( !dvarbool( xblive_basictraining ) && !dvarbool( xblive_wagermatch ) && dvarbool( ui_allowvote ) ) - #define IN_PREGAME ( dvarbool( ui_pregame ) ) -#else - #define CUSTOM_MATCH ( dvarbool( systemlink ) || dvarbool( xblive_privatematch ) ) - #define NOT_CUSTOM_MATCH ( !dvarbool( systemlink ) && !dvarbool( xblive_privatematch ) ) - #define RANKEDGAME ( dvarbool( ui_ranked ) ) - #define ISHOST ( dvarBool( sv_running ) ) - #define TEAMGAME ( team( name ) != "TEAM_FREE") - #define NOTTEAMGAME ( team( name ) == "TEAM_FREE" ) - #define ALLOW_VOTE ( !dvarbool( xblive_basictraining ) && !dvarbool( xblive_wagermatch ) && dvarbool( ui_allowvote ) ) - #define IN_PREGAME ( dvarbool( ui_pregame ) ) -#endif - -// ------------------ preprocessing function definitions ------------------ -#define PAD_LEFT \ - execKeyInt DPAD_LEFT \ - { \ - focusFirst; \ - show selection_left; \ - hide selection_right; \ - } \ - execKeyInt APAD_LEFT \ - { \ - focusFirst; \ - show selection_left; \ - hide selection_right; \ - } - -#include "ui_mp/menustyle.inc" -#include "ui_mp/choices_setup_teams.menu" - -#undef CHOICE_FOCUS_SOUND -#define CHOICE_FOCUS_SOUND "uin_navigation_over" - -#undef CHOICE_GROUP -#define CHOICE_GROUP "class" - -#undef CHOICE_HORIZONTAL_ALIGN -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_LEFT - -#undef CHOICE_VERTICAL_ALIGN -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER - -#undef BUTTON_BG_X_START -#define BUTTON_BG_X_START 30 -#undef BUTTON_BG_Y_START -#define BUTTON_BG_Y_START 42 - -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL - -#define MAP_BACKGROUND_WIDTH 229 -#define MAP_BACKGROUND_HEIGHT 228 - -#ifdef CONSOLE -#define MAP_BG_Y_START -110 -#else // #ifdef CONSOLE -#define MAP_BG_Y_START -120 -#endif // #else #ifdef CONSOLE - -#define MAP_BG_X_START (-MAP_BACKGROUND_WIDTH - 30) - - -/* Grey color box which serve as the background for the map image and the contracts menu */ -#define MAP_BACKGROUND \ - PREPROC_SHADER_DRAW( MAP_BG_X_START MAP_BG_Y_START MAP_BACKGROUND_WIDTH MAP_BACKGROUND_HEIGHT HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_CENTER, "white", BG_BACKCOLOR ) - -#define CHOICE_TAB_TEXTSIZE TEXTSIZE_DEFAULT -#define TAB_1_TEXT (locString( "@MENU_TAB_MAP_CAPS" )) -#define TAB_2_TEXT (locString( "@MENU_TAB_CONTRACTS_CAPS" )) - -#define TAB_BG_PAD 5 -#define TAB_1_WIDTH ( getTextWidth( TAB_1_TEXT, CHOICE_TEXTFONT, CHOICE_TAB_TEXTSIZE ) + (TAB_BG_PAD*2) ) -#define TAB_2_WIDTH ( getTextWidth( TAB_2_TEXT, CHOICE_TEXTFONT, CHOICE_TAB_TEXTSIZE ) + (TAB_BG_PAD*2) ) -#define TAB_HEIGHT 18 - -#define MAP_LIST_TAB_1_X ( MAP_BG_X_START + TAB_BG_PAD ) -#define MAP_LIST_TAB_2_X ( MAP_LIST_TAB_1_X + TAB_1_WIDTH ) - -#define MAP_LIST_TAB_Y ( MAP_BG_Y_START - TAB_HEIGHT ) - -#define MAP_HEADERSTEXT \ - /* highlighted header */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( MAP_LIST_TAB_1_X, \ - MAP_LIST_TAB_Y, \ - TAB_1_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_RIGHT, VERTICAL_ALIGN_CENTER, \ - TAB_1_TEXT, CHOICE_TAB_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - 1 1 1 1, \ - when( dvarInt( showMap ) == 1 );, ; ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( MAP_LIST_TAB_1_X, \ - MAP_LIST_TAB_Y, \ - TAB_1_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_RIGHT, VERTICAL_ALIGN_CENTER, \ - TAB_1_TEXT, CHOICE_TAB_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - BACKGROUND_COLOR_GRAY_RGB .25, \ - when( dvarInt( showMap ) == 0 );, ; ) \ - /* non highlighted header */ \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( MAP_LIST_TAB_2_X, \ - MAP_LIST_TAB_Y, \ - TAB_2_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_RIGHT, VERTICAL_ALIGN_CENTER, \ - TAB_2_TEXT, CHOICE_TAB_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - 1 1 1 1, \ - when( dvarInt( showMap ) == 0 && RANKEDGAME );, ; ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( MAP_LIST_TAB_2_X, \ - MAP_LIST_TAB_Y, \ - TAB_2_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_RIGHT, VERTICAL_ALIGN_CENTER, \ - TAB_2_TEXT, CHOICE_TAB_TEXTSIZE, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - BACKGROUND_COLOR_GRAY_RGB .25, \ - when( dvarInt( showMap ) == 1 && RANKEDGAME );, ; ) - -#define MAP_LIST_TAB_1_ACTION \ - if( RANKEDGAME ) \ - { \ - setDvar showMap 1; \ - } - -#define MAP_LIST_TAB_2_ACTION \ - if( RANKEDGAME ) \ - { \ - setDvar showMap 0; \ - } - -#define MAP_HEADERSBUTTONS \ - TAB_ACTION_BUTTON_ADV( MAP_LIST_TAB_1_X, \ - MAP_LIST_TAB_Y, \ - TAB_1_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_RIGHT, VERTICAL_ALIGN_CENTER, \ - MAP_LIST_TAB_1_ACTION, when( dvarInt( showMap ) == 0 && RANKEDGAME );, ; ) \ - TAB_ACTION_BUTTON_ADV( MAP_LIST_TAB_2_X, \ - MAP_LIST_TAB_Y, \ - TAB_2_WIDTH, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_RIGHT, VERTICAL_ALIGN_CENTER, \ - MAP_LIST_TAB_2_ACTION, when( dvarInt( showMap ) == 1 && RANKEDGAME );, ; ) \ - -/* Tab for Map */ -#define MAP_TAB_1_BG \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER_FRAMED \ - frame 5 0.5 FRAME_OPEN_BOTTOM \ - rect 0 MAP_LIST_TAB_Y 0 TAB_HEIGHT HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_CENTER \ - exp rect X( MAP_LIST_TAB_1_X ) \ - exp rect W( TAB_1_WIDTH ) \ - background "menu_mp_lobby_frame_circle" \ - forecolor BG_BACKCOLOR \ - visible when( dvarInt(showMap) == 1 ); \ - decoration \ - } - -/* Tab for contracts */ -#define MAP_TAB_2_BG \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER_FRAMED \ - frame 5 0.5 FRAME_OPEN_BOTTOM \ - rect 0 MAP_LIST_TAB_Y 0 TAB_HEIGHT HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_CENTER \ - exp rect X( MAP_LIST_TAB_2_X ) \ - exp rect W( TAB_2_WIDTH ) \ - background "menu_mp_lobby_frame_circle" \ - forecolor BG_BACKCOLOR \ - visible when( dvarInt(showMap) == 0 && RANKEDGAME ); \ - decoration \ - } - - menuDef - { - name "class" - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_EMPTY -#ifdef CONSOLE - rect 0 0 640 480 - blurWorld 7.0 -#else - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN -#endif - - -#define ON_ESC scriptMenuResponse "back"; - onOpen - { - if ( IsSplitscreen() ) - { - close self; - open "class_splitscreen"; - } - else - { - focusFirst; - hide selection_right; - setDvar showMap 1; - } - showMenu "pausedbkgnd" - } - onClose - { - hideMenu "pausedbkgnd" - } - onFocus - { - focusFirst; - } - onEsc - { - ON_ESC - } - - #ifndef PC - execkeyint BUTTON_START - { - ON_ESC - } - #endif - - execkeyint BUTTON_X - { - if( RANKEDGAME ) - { - if( dvarInt(showMap) == 0 ) - { - setDvar showMap 1; - } - else - { - setDvar showMap 0; - } - } - } - - PAD_LEFT - MAP_BACKGROUND - MAP_TAB_1_BG - MAP_TAB_2_BG - -#ifdef CONSOLE - #include "ui_mp/ingamebg.inc" -#endif - - // -------- GAME TYPE NAME AND DESCRIPTION -------- - #define MAPNAME tableLookup( "mp/mapstable.csv", 0, dvarString( mapname ), 3 ) - - CHOICE_MENU_TITLE_ALIGN_VIS( ( "@" + MAPNAME + "_CAPS" ), HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP, ITEM_ALIGN_MIDDLE_LEFT, 1 ) - - #undef BUTTON_BG_Y_START - #define BUTTON_BG_Y_START 70 - - CHOICE_MENU_TITLE_ALIGN_VIS( toUpper( gametypename() ), HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP, ITEM_ALIGN_MIDDLE_LEFT, 1 ) - - PREPROC_TEXT_DRAW_VIS_EX( BUTTON_BG_X_START (BUTTON_BG_Y_START+35) 230 60 HORIZONTAL_ALIGN_LEFT VERTICAL_ALIGN_TOP, 0 0, - ( gametypedescription() ), - TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, - 1, autowrapped ) - // Team icon - #define ICON_SIZE 92 - #define ICON_X_START ( MAP_BG_X_START + MAP_BACKGROUND_WIDTH - ICON_SIZE ) - #define ICON_RECT ICON_X_START 20 ICON_SIZE ICON_SIZE HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP - PREPROC_SHADER_DRAW_VIS_EX( ICON_RECT, ( dvarString( "g_TeamIcon_Allies" ) ), 1 1 1 1, when( TEAM_IS_MARINES );, ; ) - PREPROC_SHADER_DRAW_VIS_EX( ICON_RECT, ( dvarString( "g_TeamIcon_Axis" ) ), 1 1 1 1, when( TEAM_IS_OPFOR );, ; ) - - //========================================================= - //===================== MENU SELECTION ==================== - //========================================================= - - #define IS_WAGER_MODE ( dvarInt( "xblive_wagermatch" ) == 1 ) - #define IS_CUSTOM_MODE ( dvarInt( "custom_class_mode" ) == 1 ) - #define IS_BAREBONES_MODE ( dvarInt( "barebones_class_mode" ) == 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_CHOOSE_CLASS_BUTTON_CAPS", scriptMenuResponse "changeclass_barebones", ( IS_BAREBONES_MODE ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_CHOOSE_CLASS_BUTTON_CAPS", scriptMenuResponse "changeclass_custom", ( IS_CUSTOM_MODE ), ; ) - -#ifdef CONSOLE - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_CHOOSE_CLASS_BUTTON_CAPS", scriptMenuResponse "changeclass_wager", ( IS_WAGER_MODE && MAY_CHOOSE_CLASS && !IS_CUSTOM_MODE ), ; ) -#endif // CONSOLE - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_CHOOSE_CLASS_BUTTON_CAPS", scriptMenuResponse "changeclass_marines", ( TEAM_IS_MARINES && MAY_CHOOSE_CLASS && !IS_WAGER_MODE && !IS_CUSTOM_MODE && !IS_BAREBONES_MODE ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_CHOOSE_CLASS_BUTTON_CAPS", scriptMenuResponse "changeclass_opfor", ( TEAM_IS_OPFOR && MAY_CHOOSE_CLASS && !IS_WAGER_MODE && !IS_CUSTOM_MODE && !IS_BAREBONES_MODE ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MPUI_CHOOSE_CLASS_BUTTON_CAPS", scriptMenuResponse "changeclass_opfor", ( dvarInt( scr_oldschool ) == 1 && !IS_WAGER_MODE && !IS_CUSTOM_MODE && !IS_BAREBONES_MODE ), ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 1, "@MPUI_CHOOSE_CLASS_BUTTON_CAPS", ;, ;, ( dvarInt( scr_oldschool ) == 1 ), ; ) - -#ifdef CONSOLE - - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_CHANGE_TEAM_BUTTON_CAPS", scriptMenuResponse "changeteam", ( MAY_CHOOSE_TEAM ), ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 2, "@MPUI_CHANGE_TEAM_BUTTON_CAPS", ;, ;, ( MAY_NOT_CHOOSE_TEAM ), ; ) - - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MENU_OPTIONS_CAPS", close self; open ingameoptions, 1, ; ) - -#define CAN_LEAVE_GAME ( !isVisibilityBitSet( BIT_ROUND_END_KILLCAM ) && !isVisibilityBitSet( BIT_FINAL_KILLCAM ) ) - -#ifdef PUBLIC_BETA - FRAME_CHOICE_BUTTON_VIS_EX( 4, "@MENU_END_GAME_CAPS", open popup_endgame, ( RANKEDGAME == 0 && ISHOST && CAN_LEAVE_GAME ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 4, "@MENU_LEAVE_GAME_CAPS", open popup_leavegameandparty, ( RANKEDGAME == 0 && (ISHOST == 0) && (InPrivateParty() && !PrivatePartyHost() && PrivatePartyHostInLobby()) && CAN_LEAVE_GAME ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 4, "@MENU_LEAVE_GAME_CAPS", open popup_leavegame, ( RANKEDGAME == 0 && (ISHOST == 0) && (!InPrivateParty() || PrivatePartyHost() || !PrivatePartyHostInLobby()) && CAN_LEAVE_GAME ), ; ) - - FRAME_CHOICE_BUTTON_VIS_EX( 4, "@MENU_LEAVE_GAME_CAPS", open popup_endgame_ranked, ( RANKEDGAME && ISHOST && CAN_LEAVE_GAME && ( !HostMigrationWaitingForPlayers() ) ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 4, "@MENU_LEAVE_GAME_CAPS", open popup_leavegameandparty_ranked, ( RANKEDGAME && ISHOST == 0 && (InPrivateParty() && !PrivatePartyHost() && PrivatePartyHostInLobby()) && CAN_LEAVE_GAME ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 4, "@MENU_LEAVE_GAME_CAPS", open popup_leavegame_ranked, ( RANKEDGAME && ISHOST == 0 && (!InPrivateParty() || PrivatePartyHost() || !PrivatePartyHostInLobby()) && CAN_LEAVE_GAME ), ; ) -#else // #ifdef PUBLIC_BETA - //.............................................. - // Dev only. Remove me prior to shipping - //FRAME_CHOICE_BUTTON_VIS_EX( 4, "@MENU_BADSPAWN_CAPS", open popup_badspawn, 1, ; ) - //.............................................. - - FRAME_CHOICE_BUTTON_VIS_EX( 5, "@MENU_END_GAME_CAPS", open popup_endgame, ( RANKEDGAME == 0 && ISHOST && CAN_LEAVE_GAME ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 5, "@MENU_LEAVE_GAME_CAPS", open popup_leavegameandparty, ( RANKEDGAME == 0 && (ISHOST == 0) && (InPrivateParty() && !PrivatePartyHost() && PrivatePartyHostInLobby()) && CAN_LEAVE_GAME ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 5, "@MENU_LEAVE_GAME_CAPS", open popup_leavegame, ( RANKEDGAME == 0 && (ISHOST == 0) && (!InPrivateParty() || PrivatePartyHost() || !PrivatePartyHostInLobby()) && CAN_LEAVE_GAME ), ; ) - - FRAME_CHOICE_BUTTON_VIS_EX( 5, "@MENU_LEAVE_GAME_CAPS", open popup_endgame_ranked, ( RANKEDGAME && ISHOST && CAN_LEAVE_GAME && ( !HostMigrationWaitingForPlayers() ) ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 5, "@MENU_LEAVE_GAME_CAPS", open popup_leavegameandparty_ranked, ( RANKEDGAME && ISHOST == 0 && (InPrivateParty() && !PrivatePartyHost() && PrivatePartyHostInLobby()) && CAN_LEAVE_GAME ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 5, "@MENU_LEAVE_GAME_CAPS", open popup_leavegame_ranked, ( RANKEDGAME && ISHOST == 0 && (!InPrivateParty() || PrivatePartyHost() || !PrivatePartyHostInLobby()) && CAN_LEAVE_GAME ), ; ) -#endif // #else #ifdef PUBLIC_BETA - -#endif // #ifdef CONSOLE -#ifdef PC - #define SQUAD_CAP 12 - #define INVITE_MEMBER 1 - #define KICK_MEMBER 2 - #define SQUAD_BUTTON_START_X -439 - #define SQUAD_BUTTON_START_Y -65 - - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MPUI_CHANGE_TEAM_CAPS", scriptMenuResponse "changeteam", (dvarBool( ui_allow_teamchange )), ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 2, "@MPUI_CHANGE_TEAM_BUTTON_CAPS", ;, ;, ( !dvarBool( ui_allow_teamchange ) ), ; ) - - FRAME_CHOICE_BUTTON_VIS_EX( 3, "@MPUI_CALL_VOTE_CAPS", open callvote; close self;, ( ALLOW_VOTE ), ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 3, "@MPUI_CALL_VOTE_CAPS", ;, ;, ( !ALLOW_VOTE ), ; ) - - // FRAME_CHOICE_BUTTON_VIS_EX( 4, "@MPUI_MUTE_PLAYERS_CAPS", open muteplayer_menu; close self;, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 4, "@MENU_PLAYERS_CAPS", close self; open players;, 1, ; ) - - FRAME_CHOICE_BUTTON_VIS_EX( 5, "@MENU_FRIENDS_CAPS", SETUP_ACTION_INVITE, 1, ; ) - CHOICE_NEWICON_VIS( 5, "menu_mp_lobby_new", when( hasinvites() || haspendingfriends() ); ) - - FRAME_CHOICE_BUTTON_VIS_EX( 6, "@MENU_SETTINGS_CAPS", close self; open options_new_pc; execnow "set ui_allow_graphic_change 0";, 1, ; ) - - FRAME_CHOICE_BUTTON_VIS_EX( 7, "@MENU_ADD_TO_FAVORITES_CAPS", uiscript createFavoriteIngame; open fav_message_popmenu;, ( ISHOST == 0 ), ; ) - FRAME_CHOICE_DBUTTON_FOCUS_VIS_EX( 7, "@MENU_ADD_TO_FAVORITES_CAPS", ;, ;, ( ISHOST ), ; ) - - FRAME_CHOICE_BUTTON_VIS_EX( 8, "@MENU_LEAVE_GAME_CAPS", open popup_endgame, ( ( !RANKEDGAME || IN_PREGAME ) && ISHOST && CAN_LEAVE_GAME ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 8, "@MENU_LEAVE_GAME_CAPS", open popup_leavegame, ( ( !RANKEDGAME || IN_PREGAME ) && !ISHOST ), ; ) - - FRAME_CHOICE_BUTTON_VIS_EX( 8, "@MENU_LEAVE_GAME_CAPS", open popup_endgame_ranked, ( RANKEDGAME && !IN_PREGAME && ISHOST && CAN_LEAVE_GAME ), ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 8, "@MENU_LEAVE_GAME_CAPS", open popup_leavegame_ranked, ( RANKEDGAME && !IN_PREGAME && !ISHOST && CAN_LEAVE_GAME ), ; ) - -#endif // #ifdef PC - -//Showing the ingame Xp bar. -#include "ui_mp/popup_player_info.inc" - -#define SHOW_XP_BAR ( RANKEDGAME || dvarInt( xblive_basictraining ) ) -#define XP_BAR_WIDTH ( Select( dvarInt( widescreen ), 592, 407 ) ) -#define XP_TEXT_WIDTH 65 -#define X_START (-XP_BAR_WIDTH - XP_TEXT_WIDTH - 100) -#define XP_BAR_Y_START 115 - -#define REQUIRED_XP int(getDStat( "PlayerStatsList", "RANKXP" )-int(tablelookup( "mp/ranktable.csv", 0, string(getDStat( "PlayerStatsList", "RANK" )), 2))) -#define REQUIRED_XP_STRING (int(tablelookup( "mp/ranktable.csv", 0, string(getDStat( "PlayerStatsList", "RANK" )), 3 ))-REQUIRED_XP) -#define NEXT_LEVEL ( tablelookup( "mp/ranktable.csv", 0, getDStat( "PlayerStatsList", "RANK" ) + 1, 14 ) ) -#define BAR_FILLED XP_BAR_WIDTH*((getDStat( "PlayerStatsList", "RANKXP" )-int(tablelookup( "mp/ranktable.csv", 0, string(getDStat( "PlayerStatsList", "RANK" )), 2)))/int(tablelookup("mp/ranktable.csv",0,getDStat( "PlayerStatsList", "RANK" ),3))) - - /* BACKGROUND FOR XP BAR */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (X_START+XP_TEXT_WIDTH), - XP_BAR_Y_START, - XP_BAR_WIDTH, - 20, - HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, - "white", BG_BACKCOLOR, - when( CAN_RANK_UP && SHOW_XP_BAR ), ; ) - PREPROC_SHADER_DRAW_ADV_VIS_EX( (X_START+XP_TEXT_WIDTH), - XP_BAR_Y_START, - XP_BAR_WIDTH, - 20, - HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, - "menu_mp_bar_shadow", 1 1 1 0.2, - when( CAN_RANK_UP && SHOW_XP_BAR ), ; ) - /* XP BAR */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( (X_START+XP_TEXT_WIDTH), - XP_BAR_Y_START, - (BAR_FILLED), - 20, - HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, - "menu_mp_combatrecord_bar", BAR_COLOR, - when( CAN_RANK_UP && SHOW_XP_BAR ), - ; ) - /* Tiny arrow at xp bar end */ - PREPROC_SHADER_DRAW_ADV_VIS_EX( ( -5 + (X_START+XP_TEXT_WIDTH) + BAR_FILLED), - (XP_BAR_Y_START+18), - 10, - 10, - HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, - "ui_arrow_right", BAR_COLOR, - when( CAN_RANK_UP && SHOW_XP_BAR );, - rotation -90; ) - /* Label for "NEXT LEVEL" */ - PREPROC_TEXT_DRAW_ADV_VIS_EX( X_START, - XP_BAR_Y_START, - XP_BAR_WIDTH, - 20, - HORIZONTAL_ALIGN_RIGHT, CHOICE_VERTICAL_ALIGN, - "@MPUI_NEXT_LEVEL_CAPS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, - when( SHOW_XP_BAR ), ; ) - /* value for XP NEEDED to next level */ - PREPROC_TEXT_DRAW_ADV_VIS_EX( (X_START+XP_TEXT_WIDTH), - XP_BAR_Y_START, - XP_BAR_WIDTH, - 20, - HORIZONTAL_ALIGN_RIGHT, CHOICE_VERTICAL_ALIGN, - locString( "MPUI_AAR_XP_NEEDED_CAPS", REQUIRED_XP_STRING ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, - when( CAN_RANK_UP && SHOW_XP_BAR ), ; ) - /* next level */ - PREPROC_TEXT_DRAW_ADV_VIS_EX( (X_START+XP_BAR_WIDTH+XP_TEXT_WIDTH+3), - (XP_BAR_Y_START+2), - 15, - 15, - HORIZONTAL_ALIGN_RIGHT, CHOICE_VERTICAL_ALIGN, - int( NEXT_LEVEL ), - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, - when( CAN_RANK_UP && PRESTIGE_NEXT==0 && SHOW_XP_BAR ), ; ) - PREPROC_TEXT_DRAW_ADV_VIS_EX( (X_START+XP_BAR_WIDTH+XP_TEXT_WIDTH+3), - (XP_BAR_Y_START+2), - 15, - 15, - HORIZONTAL_ALIGN_RIGHT, CHOICE_VERTICAL_ALIGN, - "1", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, CHOICE_TEXTCOLOR, - when( CAN_RANK_UP && PRESTIGE_NEXT && SHOW_XP_BAR ), ; ) - /* next level rank icon */ - RANK_ICON_ADV( ( X_START+XP_BAR_WIDTH+XP_TEXT_WIDTH+6+getTextWidth( NEXT_LEVEL, CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) ), (XP_BAR_Y_START+2), HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_CENTER, - tablelookup( "mp/rankIconTable.csv", 0, getDStat( "PlayerStatsList", "RANK" )+1, getDStat( "PlayerStatsList", "PLEVEL" )+1 ), - when( CAN_RANK_UP && PRESTIGE_NEXT==0 && SHOW_XP_BAR ) ) - RANK_ICON_ADV( ( X_START+XP_BAR_WIDTH+XP_TEXT_WIDTH+6+getTextWidth( "1", CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) ), (XP_BAR_Y_START+2), HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_CENTER, - tablelookup( "mp/rankIconTable.csv", 0, 0, getDStat( "PlayerStatsList", "PLEVEL" )+2 ), - when( CAN_RANK_UP && PRESTIGE_NEXT && SHOW_XP_BAR) ) - -//************************************Contracts******************************** -//***************************************************************************** -//Green background -#define BACKGROUND_COLOR_COMPLETED_RGB .34 .9 .34 -//Gray background -#define BACKGROUND_COLOR_PROGRESS_RGB BACKGROUND_COLOR_GRAY_RGB -//Red background -#define BACKGROUND_COLOR_EXPIRED_RGB .9 .16 .24 -// Yellow Background -#define BACKGROUND_COLOR_PROGRESS_STATUS 0.97 0.85 0.03 - -#define CONTRACTS_Y_START ( MAP_BG_Y_START + 5 ) -#define CONTRACTS_X_START ( MAP_BG_X_START + TAB_BG_PAD ) -#define CONTRACTS_WIDTH ( MAP_BACKGROUND_WIDTH - (TAB_BG_PAD*2) ) -#define CONTRACTS_HEIGHT ( MAP_BACKGROUND_HEIGHT - TAB_BG_PAD ) - -#define CONTRACT_INFO( index, visArg ) \ - /* BACKGROUND FOR CONTRACT INFO if completed*/ \ - PREPROC_SHADER_DRAW_VIS_EX( CONTRACTS_X_START ( CONTRACTS_Y_START+(CONTRACTS_HEIGHT/3)*index ) CONTRACTS_WIDTH (CONTRACTS_HEIGHT/3 - 5 ) HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, \ - "white", BACKGROUND_COLOR_COMPLETED_RGB .1, \ - when( visArg && dvarInt(showMap) == 0 && IsContractComplete( GetIndexForActiveContract( index ) ) ), \ - ; ) \ - /* BACKGROUND FOR CONTRACT INFO if in progress*/ \ - PREPROC_SHADER_DRAW_VIS_EX( CONTRACTS_X_START ( CONTRACTS_Y_START+(CONTRACTS_HEIGHT/3)*index ) CONTRACTS_WIDTH (CONTRACTS_HEIGHT/3 - 5 ) HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, \ - "white", BACKGROUND_COLOR_PROGRESS_RGB .1, \ - when( visArg && dvarInt(showMap) == 0 && IsContractInProgress( GetIndexForActiveContract( index ) ) ), \ - ; ) \ - /* BACKGROUND FOR CONTRACT INFO if expired*/ \ - PREPROC_SHADER_DRAW_VIS_EX( CONTRACTS_X_START ( CONTRACTS_Y_START+(CONTRACTS_HEIGHT/3)*index ) CONTRACTS_WIDTH (CONTRACTS_HEIGHT/3 - 5 ) HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, \ - "white", BACKGROUND_COLOR_EXPIRED_RGB .1, \ - when( visArg && dvarInt(showMap) == 0 && IsContractExpired( GetIndexForActiveContract( index ) ) ), \ - ; ) \ - /* CONTRACT NAME */ \ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_X_START ( CONTRACTS_Y_START+(CONTRACTS_HEIGHT/3)*index ) CONTRACTS_WIDTH 20 HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, 0 0, GetContractName( GetIndexForActiveContract( index ) ), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, when( visArg ); autowrapped ) \ - /* CONTRACT DESC */ \ - PREPROC_TEXT_DRAW_VIS( ( CONTRACTS_X_START+2 ) ( CONTRACTS_Y_START+(CONTRACTS_HEIGHT/3)*index + 12 ) ( CONTRACTS_WIDTH-2 ) 20 HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, 0 0, GetContractDesc( GetIndexForActiveContract( index ) ),0.24, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, BACKGROUND_COLOR_PROGRESS_RGB .25, when( visArg ); autowrapped ) \ - /* CONTRACT STATUS WHEN COMPLETED */ \ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_X_START ( CONTRACTS_Y_START+(CONTRACTS_HEIGHT/3)*index + 65 ) CONTRACTS_WIDTH 20 HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, 0 0, "@MPUI_COMPLETE_CAPS", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_CENTER, NEW_FRAME_GREEN_RGB 1, when( IsContractComplete( GetIndexForActiveContract( index ) ) > 0 && visArg ) ) \ - /* CONTRACT PROGRESS TEXT ( YELLOW WHEN CONTRACT IS IN PROGRESS ) */ \ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_X_START ( CONTRACTS_Y_START+(CONTRACTS_HEIGHT/3)*index + 65 ) CONTRACTS_WIDTH 20 HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, 0 0, locString("MPUI_CONTRACT_PROGRESS_WITHBRACES", GetContractProgress( GetIndexForActiveContract( index ) ), GetContractRequiredCount( GetIndexForActiveContract( index ) ) ), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_CENTER, NEW_FRAME_ORANGE_RGB 1, when( IsContractInProgress( GetIndexForActiveContract( index ) ) > 0 && GetContractRequiredCount( GetIndexForActiveContract( index ) ) > 1 && visArg ) ) \ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_X_START ( CONTRACTS_Y_START+(CONTRACTS_HEIGHT/3)*index + 65 ) CONTRACTS_WIDTH 20 HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, 0 0, locString("MPUI_CONTRACT_NOT_COMPLETE"), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_CENTER, NEW_FRAME_ORANGE_RGB 1, when( IsContractInProgress( GetIndexForActiveContract( index ) ) > 0 && GetContractRequiredCount( GetIndexForActiveContract( index ) ) == 1 && visArg ) ) \ - /* CONTRACT STATUS WHEN EXPIRED */ \ - PREPROC_TEXT_DRAW_VIS( CONTRACTS_X_START ( CONTRACTS_Y_START+(CONTRACTS_HEIGHT/3)*index + 65 ) CONTRACTS_WIDTH 20 HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, 0 0, "@MPUI_CONTRACT_EXPIRED_CAPS", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_CENTER, NEW_FRAME_RED_RGB 1, when( IsContractExpired( GetIndexForActiveContract( index ) ) > 0 && visArg ) ) \ - - CONTRACT_INFO( 0, ( GetIndexForActiveContract(0) != -1 && RANKEDGAME && dvarInt(showMap) == 0 ) ) - CONTRACT_INFO( 1, ( GetIndexForActiveContract(1) != -1 && RANKEDGAME && dvarInt(showMap) == 0 ) ) - CONTRACT_INFO( 2, ( GetIndexForActiveContract(2) != -1 && RANKEDGAME && dvarInt(showMap) == 0 ) ) - -#define NO_ACTIVE_CONTRACTS \ - (GetIndexForActiveContract(0) == -1 && GetIndexForActiveContract(1) == -1 && GetIndexForActiveContract(2) == -1) - - PREPROC_TEXT_DRAW_VIS_EX( ( CONTRACTS_X_START+20 ) CONTRACTS_Y_START ( CONTRACTS_WIDTH - 40 ) 40 HORIZONTAL_ALIGN_RIGHT CHOICE_VERTICAL_ALIGN, 0 0, - "@MPUI_AAR_NO_NEW_CONTRACTS", - TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, CHOICE_TEXTCOLOR, - when( NO_ACTIVE_CONTRACTS && RANKEDGAME && dvarInt(showMap) == 0 );, - autowrapped ) - - // Tactical Map - #define SHOULD_SHOW_MAP dvarInt(showMap) - #undef RIGHTITEM_ALIGN - #define RIGHTITEM_ALIGN HORIZONTAL_ALIGN_RIGHT - #define MAP_X ( MAP_BG_X_START + 5 ) - #define MAP_Y ( 101 ) - #include "ui_mp/tactical_map.inc" - - - // ----------------- BEGIN Scroller -------------------------- - #include "ui/scroller.inc" - // ----------------- END Scroller -------------------------- - - #define SETUP_ACTION_OPENFRIENDLIST \ - open menu_friends; - // ------------------ buttons --------------------- - -#ifdef PC - NEW_FRAME_BACK_BUTTON_ACTION_PC_VIS( ON_ESC , when( !dvarInt( ui_show_friends_list_bg ) ) ) -#else - // Back button - PREPROC_TEXT_DRAW_VIS( CHOICE_X_START -17 50 17 CHOICE_HORIZONTAL_ALIGN VERTICAL_ALIGN_BOTTOM, 0 0, "@PLATFORM_BACK", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, 1 1 1 1, when( !dvarInt( ui_show_friends_list_bg ) ) ) -#endif // PC - - // Contracts / Map button -#ifndef PC - PREPROC_TEXT_DRAW_VIS( (MAP_BG_X_START-1) -17 50 17 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_BOTTOM, 0 0, "@PLATFORM_SHOW_CONTRACTS", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, 1 1 1 1, when( dvarInt( showMap ) == 1 && RANKEDGAME && !dvarInt( ui_show_friends_list_bg ) ) ) - PREPROC_TEXT_DRAW_VIS( (MAP_BG_X_START-1) -17 50 17 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_BOTTOM, 0 0, "@PLATFORM_SHOW_MAP", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_BOTTOM_LEFT, 1 1 1 1, when( dvarInt( showMap ) == 0 && RANKEDGAME && !dvarInt( ui_show_friends_list_bg ) ) ) - // Friends list button -#ifdef PS3 - GAMEPAD_BUTTON( -55 -17 70 17 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_BOTTOM, "@PLATFORM_FRIENDLIST", BUTTON_Y { SETUP_ACTION_OPENFRIENDLIST; }, when( !dvarInt( ui_show_friends_list_bg ) && !IS_WAGER_MODE && anySignedInToLiveAndStatsFetched() && canShowContentFromUser( 0 ) ) ) -#else // #ifdef PS3 - GAMEPAD_BUTTON( -55 -17 70 17 HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_BOTTOM, "@PLATFORM_FRIENDLIST", BUTTON_Y { SETUP_ACTION_OPENFRIENDLIST; }, when( !dvarInt( ui_show_friends_list_bg ) && !IS_WAGER_MODE && anySignedInToLiveAndStatsFetched() ) ) -#endif // #ifdef PS3 -#endif - - MAP_HEADERSTEXT - MAP_HEADERSBUTTONS - - - itemDef - { - name friends_list_bg - style WINDOW_STYLE_FILLED - rect -400 -200 10000 10000 - backcolor 0 0 0 0 - visible when( IsInGame() ); - decoration - - state - { - name on - backcolor 0 0 0 0.7 - } - } - - #include "ui/safearea.menu" -} - -#undef CHOICE_GROUP -#define CHOICE_GROUP "popmenu" - -#include "ui_mp/popupstyle.inc" -#include "ui/choices_setup_popmenu.menu" - - - menuDef - { - SYSTEM_POPUP_SETUP_VIS( popup_badspawn, setfocus popup_badspawn_2, ;, 1 ) - - SYSTEM_POPUP_TITLE_VIS( "@MPUI_REPORT_BADSPAWN", 1 ) - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_YES", scriptMenuResponse "badspawn"; close self, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_NO", close self, 1, name popup_badspawn_2 ) - } diff --git a/mods/patch_mp/ui_mp/serverbrowser.menu b/mods/patch_mp/ui_mp/serverbrowser.menu deleted file mode 100644 index f84aaab..0000000 --- a/mods/patch_mp/ui_mp/serverbrowser.menu +++ /dev/null @@ -1,576 +0,0 @@ -#include "ui/menudef.h" -#include "ui_mp/common_macro.inc" -#include "ui/framestyle.inc" -#include "ui_mp/newframe.inc" -#include "ui_mp/serverbrowser.inc"; -#include "ui_mp/menustyle.inc" -#include "ui/choices_setup_common.menu" -#include "ui_mp/item_animate.inc" - -#define SERVER_BROWSER_HEIGHT 420 -#define SERVER_BROWSER_WIDTH TABLE_WIDTH - -#define SERVER_BROWSER_BODY_X_START ( -SERVER_BROWSER_WIDTH / 2 + 15 ) -#define SERVER_BROWSER_BODY_Y_START ( -SERVER_BROWSER_HEIGHT / 2 + 15 + NEW_FRAME_HEADER_HEIGHT ) - - -#undef CHOICE_HORIZONTAL_ALIGN -#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER - -#undef CHOICE_VERTICAL_ALIGN -#define CHOICE_VERTICAL_ALIGN VERTICAL_ALIGN_CENTER - -#define FLYOUT_NONE 0 -#define FLYOUT_BROWSER 3 - -#undef CHOICE_TEXTSTYLE -#define CHOICE_TEXTSTYLE ITEM_TEXTSTYLE_NORMAL - -#define TAB_OPEN( menuName ) \ - execNow closemenuImmediate (dvarstring("ui_serverBrowserMenu")); \ - execNow openMenuImmediate (menuName); \ - -#undef ORIGIN_TITLE -#define ORIGIN_TITLE 10 0 - -#define CHOICE_TAB_TEXTSIZE TEXTSIZE_DEFAULT -#define TAB_1_TEXT ( locString( "@MENU_JOIN_SERVER_RANKED_CAPS" ) ) -#define TAB_2_TEXT ( locString( "@MENU_JOIN_SERVER_UNRANKED_CAPS" ) ) -#define TAB_3_TEXT ( locString( "@MENU_JOIN_SERVER_WAGER_CAPS" ) ) -#define TAB_4_TEXT ( locString( "@MENU_JOIN_SERVER_FRIENDS_CAPS" ) ) -#define TAB_5_TEXT ( locString( "@MENU_JOIN_SERVER_FAVORITES_CAPS" ) ) -#define TAB_6_TEXT ( locString( "@MENU_JOIN_SERVER_HISTORY_CAPS" ) ) - -#define TAB_BG_PAD 5 -#define TAB_1_WIDTH ( getTextWidth( TAB_1_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_2_WIDTH ( getTextWidth( TAB_2_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_3_WIDTH ( getTextWidth( TAB_3_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_4_WIDTH ( getTextWidth( TAB_4_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_5_WIDTH ( getTextWidth( TAB_5_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_6_WIDTH ( getTextWidth( TAB_6_TEXT, CHOICE_TEXTFONT, TEXTSIZE_SMALL ) + (TAB_BG_PAD*2) ) -#define TAB_HEIGHT 15 - -#define SERVER_BROWSER_TAB_1_X 9 -#define SERVER_BROWSER_TAB_2_X ( SERVER_BROWSER_TAB_1_X + TAB_1_WIDTH ) -#define SERVER_BROWSER_TAB_3_X ( SERVER_BROWSER_TAB_2_X + TAB_2_WIDTH ) -#define SERVER_BROWSER_TAB_4_X ( SERVER_BROWSER_TAB_3_X + TAB_3_WIDTH ) -#define SERVER_BROWSER_TAB_5_X ( SERVER_BROWSER_TAB_4_X + TAB_4_WIDTH ) -#define SERVER_BROWSER_TAB_6_X ( SERVER_BROWSER_TAB_5_X + TAB_5_WIDTH ) - -#define SERVER_BROWSER_TAB_Y ( ( -SERVER_BROWSER_HEIGHT / 2 ) + NEW_FRAME_HEADER_HEIGHT - TAB_HEIGHT + 1 ) - - -#define TAB( x, tabWidth, textArg, menuName, selected ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( -SERVER_BROWSER_WIDTH / 2 + x ), \ - SERVER_BROWSER_TAB_Y, \ - tabWidth, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - textArg, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_GRAY_TEXT_COLOR, when( !selected ), TAB_MOUSEOVER_HIGHLIGHT; ) \ - PREPROC_TEXT_DRAW_ADV_VIS_EX( ( -SERVER_BROWSER_WIDTH / 2 + x ), \ - SERVER_BROWSER_TAB_Y, \ - tabWidth, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - textArg, TEXTSIZE_SMALL, 0, 0, ITEM_ALIGN_MIDDLE_CENTER, \ - NEW_FRAME_ORANGE_RGB 1, when( selected ), ; ) \ - TAB_ACTION_BUTTON_ADV( ( -SERVER_BROWSER_WIDTH / 2 + x ), \ - ( -SERVER_BROWSER_HEIGHT / 2 + NEW_FRAME_HEADER_HEIGHT - TAB_HEIGHT ), \ - tabWidth, \ - TAB_HEIGHT, \ - HORIZONTAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER, \ - TAB_OPEN( menuName ), 1, ; ) \ - - -#define SERVER_BROWSER_TAB_BG( px, tabWidth, selected ) \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER \ - frame 16 0.2 FRAME_OPEN_BOTTOM \ - rect 0 SERVER_BROWSER_TAB_Y 0 TAB_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ - exp rect X( ( -SERVER_BROWSER_WIDTH / 2 + px ) ) \ - exp rect W( tabWidth ) \ - background "menu_mp_tab_frame_inner" \ - forecolor 0.5 0.5 0.5 0.5 \ - visible when( selected ) \ - decoration \ - } \ - itemDef \ - { \ - style WINDOW_STYLE_SHADER \ - frame 16 0.2 FRAME_OPEN_BOTTOM \ - rect 0 SERVER_BROWSER_TAB_Y 0 TAB_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER \ - exp rect X( ( -SERVER_BROWSER_WIDTH / 2 + px ) ) \ - exp rect W( tabWidth ) \ - background "menu_mp_tab_frame_inner" \ - forecolor 1 1 1 1 \ - visible when( !selected ) \ - decoration \ - } - -#define ON_ESC \ - if( menuisopen( filter_window ) ) \ - { \ - close filter_window; \ - } \ - else \ - { \ - close self; \ - } - -#define SERVER_BROWSER_MENU_TEMPLATE( menuName, onOpenArg, onCloseArg ) \ - name menuName \ - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN \ - focuscolor COLOR_FOCUSED \ - style WINDOW_STYLE_FILLED \ - priority MENU_PRI_DEFAULT \ - soundloop MENU_MUSIC \ - openSlideSpeed DEFAULT_SLIDE_IN_SPEED \ - closeSlideSpeed DEFAULT_SLIDE_OUT_SPEED \ - openSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM \ - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM \ - onFocus { \ - setDvar ui_flyoutHasFocus FLYOUT_BROWSER; \ - } \ - onOpen { \ - activateBlur; \ - play uin_navigation_menu_lg_open; \ - setdvar ui_serverBrowserMenu menuName; \ - onOpenArg; \ - uiScript PopulateServers; \ - } \ - onClose { \ - execNow ui_animate menuName Browser "Maximized" DEFAULT_SLIDE_OUT_SPEED; \ - deactivateBlur; \ - onCloseArg; \ - setDvar ui_flyoutHasFocus FLYOUT_NONE; \ - execNow closemenuImmediate (filter_window); \ - } \ - onEsc { \ - ON_ESC \ - } \ - execKeyInt 171 { \ - uiScript RefreshServers; \ - } \ - - -#define GLOBAL_SERVER_COUNT \ - PREPROC_TEXT_DRAW( (SERVER_BROWSER_WIDTH/2-7) (-SERVER_BROWSER_HEIGHT/2+2) 1 1 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, ( locString( "@PLATFORM_PLAYERS_ONLINE", GetPlayersRegisteredOnline() ) ), TEXTSIZE_DEFAULT, 0, 1, ITEM_ALIGN_TOP_RIGHT, 1 1 1 1 ) \ - PREPROC_TEXT_DRAW( (SERVER_BROWSER_WIDTH/2-7) (-SERVER_BROWSER_HEIGHT/2+20) 1 1 HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER, 0 0, ( locString( "@PLATFORM_ALL_SERVERS", GetDedicatedServersRegisteredOnline() ) ), TEXTSIZE_DEFAULT, 0, 1, ITEM_ALIGN_TOP_RIGHT, 1 1 1 1 ) - -// Don't let keys fall through to the main menu. -#define MASSIVE_HACK_KEYCATCHER \ - itemDef \ - { \ - style WINDOW_STYLE_EMPTY \ - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN \ - forecolor 1 1 1 0 \ - visible 1 \ - } - -#define SERVER_BROWSER_TAB_COMMON_ITEMS( selectedTabIndex ) \ - MASSIVE_HACK_KEYCATCHER \ - NEW_FRAME( SERVER_BROWSER_WIDTH, SERVER_BROWSER_HEIGHT ) \ - NEW_FRAME_TITLE( SERVER_BROWSER_WIDTH, SERVER_BROWSER_HEIGHT, "@MENU_SERVER_BROWSER_CAPS", 1 ) \ - SERVER_BROWSER_TAB_BG( SERVER_BROWSER_TAB_1_X, TAB_1_WIDTH, ( selectedTabIndex == 1 ) ) \ - SERVER_BROWSER_TAB_BG( SERVER_BROWSER_TAB_2_X, TAB_2_WIDTH, ( selectedTabIndex == 2 ) ) \ - SERVER_BROWSER_TAB_BG( SERVER_BROWSER_TAB_3_X, TAB_3_WIDTH, ( selectedTabIndex == 3 ) ) \ - SERVER_BROWSER_TAB_BG( SERVER_BROWSER_TAB_4_X, TAB_4_WIDTH, ( selectedTabIndex == 4 ) ) \ - SERVER_BROWSER_TAB_BG( SERVER_BROWSER_TAB_5_X, TAB_5_WIDTH, ( selectedTabIndex == 5 ) ) \ - SERVER_BROWSER_TAB_BG( SERVER_BROWSER_TAB_6_X, TAB_6_WIDTH, ( selectedTabIndex == 6 ) ) \ - TAB( SERVER_BROWSER_TAB_1_X, TAB_1_WIDTH, TAB_1_TEXT, server_browser_ranked, ( selectedTabIndex == 1 ) ) \ - TAB( SERVER_BROWSER_TAB_2_X, TAB_2_WIDTH, TAB_2_TEXT, server_browser_unranked, ( selectedTabIndex == 2 ) ) \ - TAB( SERVER_BROWSER_TAB_3_X, TAB_3_WIDTH, TAB_3_TEXT, server_browser_wager, ( selectedTabIndex == 3 ) ) \ - TAB( SERVER_BROWSER_TAB_4_X, TAB_4_WIDTH, TAB_4_TEXT, server_browser_friends, ( selectedTabIndex == 4 ) ) \ - TAB( SERVER_BROWSER_TAB_5_X, TAB_5_WIDTH, TAB_5_TEXT, server_browser_favorites, ( selectedTabIndex == 5 ) ) \ - TAB( SERVER_BROWSER_TAB_6_X, TAB_6_WIDTH, TAB_6_TEXT, server_browser_history, ( selectedTabIndex == 6 ) ) \ - GLOBAL_SERVER_COUNT - - -/////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////// -// server_browser_main acts as a gateway to open the correct sub menu based upon dvar settings - menuDef - { - name server_browser_main - fullScreen 0 - style WINDOW_STYLE_EMPTY - rect 0 0 640 480 HORIZONTAL_ALIGN_FULLSCREEN VERTICAL_ALIGN_FULLSCREEN - - onFocus - { - close self; - exec openmenu (dvarString( "ui_serverBrowserMenu" )); - } - } - -#define FILTER_ACTION \ - if( menuisopen( filter_window ) ) \ - { \ - close filter_window; \ - } \ - else \ - { \ - open filter_window; \ - } - -#define BUTTON_SPACING 20 -#define FILTER_BUTTON_OFFSET ( getTextWidth( locString( "@PLATFORM_BACK" ), CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) + 8 + BUTTON_SPACING ) -#define SERVER_INFO_BUTTON_OFFSET ( FILTER_BUTTON_OFFSET + getTextWidth( locString( "@MENU_FILTER_SERVERS" ), CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) + 8 + BUTTON_SPACING ) -#define JOIN_BUTTON_OFFSET ( 0 ) -#define REFRESH_BUTTON_OFFSET ( -JOIN_BUTTON_OFFSET - getTextWidth( locString( "@MENU_JOIN_SERVER" ), CHOICE_TEXTFONT, TEXTSIZE_DEFAULT ) - 8 - BUTTON_SPACING ) - -#define SERVER_BROWSER_BOTTOM_BUTTONS \ - NEW_FRAME_BUTTON_PC_LEFT_OFFSET( SERVER_BROWSER_WIDTH, SERVER_BROWSER_HEIGHT, FILTER_BUTTON_OFFSET, "@MENU_FILTER_SERVERS", FILTER_ACTION, 1 ) \ - NEW_FRAME_BUTTON_PC_LEFT_OFFSET( SERVER_BROWSER_WIDTH, SERVER_BROWSER_HEIGHT, SERVER_INFO_BUTTON_OFFSET, "@MENU_SERVER_INFO", open newframeserverinfo;, 1 ) \ - NEW_FRAME_BUTTON_PC_RIGHT_OFFSET( SERVER_BROWSER_WIDTH, SERVER_BROWSER_HEIGHT, REFRESH_BUTTON_OFFSET, "@MENU_REFRESH_LIST", uiScript RefreshServers;, 1 ) \ - NEW_FRAME_BUTTON_PC_RIGHT_OFFSET( SERVER_BROWSER_WIDTH, SERVER_BROWSER_HEIGHT, JOIN_BUTTON_OFFSET, "@MENU_JOIN_SERVER", JOIN_SERVER_ACTION;, 1 ) \ - NEW_FRAME_BACK_BUTTON_ACTION( SERVER_BROWSER_WIDTH, SERVER_BROWSER_HEIGHT, ON_ESC ) - - menuDef - { - SERVER_BROWSER_MENU_TEMPLATE( server_browser_ranked, uiscript UpdateNetSource AS_RANKED;, ; ) - PC_TAB_SWITCH_ACTIONS( server_browser_ranked, server_browser_history, server_browser_unranked ) - SERVER_BROWSER_TAB_COMMON_ITEMS( 1 ); - - // buttons - SERVER_BROWSER_BOTTOM_BUTTONS - - // browser - SERVER_BROWSER( browser, FEEDER_SERVERS, 1) - } - - menuDef - { - SERVER_BROWSER_MENU_TEMPLATE( server_browser_unranked, uiscript UpdateNetSource AS_UNRANKED;, ; ) - PC_TAB_SWITCH_ACTIONS( server_browser_unranked, server_browser_ranked, server_browser_wager ) - SERVER_BROWSER_TAB_COMMON_ITEMS( 2 ) - - // buttons - SERVER_BROWSER_BOTTOM_BUTTONS - - // browser listbox with background - SERVER_BROWSER( browser, FEEDER_SERVERS, 1) - } - - menuDef - { - SERVER_BROWSER_MENU_TEMPLATE( server_browser_wager, uiscript UpdateNetSource AS_WAGER;, ; ) - PC_TAB_SWITCH_ACTIONS( server_browser_wager, server_browser_unranked, server_browser_friends ) - SERVER_BROWSER_TAB_COMMON_ITEMS( 3 ) - - // buttons - SERVER_BROWSER_BOTTOM_BUTTONS - - // browser listbox with background - SERVER_BROWSER( browser, FEEDER_SERVERS, 1) - } - - menuDef - { - SERVER_BROWSER_MENU_TEMPLATE( server_browser_friends, uiscript UpdateNetSource AS_FRIENDS;, ; ) - PC_TAB_SWITCH_ACTIONS( server_browser_friends, server_browser_wager, server_browser_favorites ) - SERVER_BROWSER_TAB_COMMON_ITEMS( 4 ) - - // buttons - SERVER_BROWSER_BOTTOM_BUTTONS - - // browser listbox with background - SERVER_BROWSER( browser, FEEDER_SERVERS, 1) - } - - menuDef - { - SERVER_BROWSER_MENU_TEMPLATE( server_browser_favorites, uiscript UpdateNetSource AS_FAVORITES;, ; ) - PC_TAB_SWITCH_ACTIONS( server_browser_favorites, server_browser_friends, server_browser_history ) - SERVER_BROWSER_TAB_COMMON_ITEMS( 5 ) - - // buttons - SERVER_BROWSER_BOTTOM_BUTTONS - - // browser listbox with background - SERVER_BROWSER( browser, FEEDER_SERVERS, 1) - } - - menuDef - { - SERVER_BROWSER_MENU_TEMPLATE( server_browser_history, uiscript UpdateNetSource AS_HISTORY;, ; ) - PC_TAB_SWITCH_ACTIONS( server_browser_history, server_browser_favorites, server_browser_ranked ) - SERVER_BROWSER_TAB_COMMON_ITEMS( 6 ) - - // buttons - SERVER_BROWSER_BOTTOM_BUTTONS - - // browser listbox with background - SERVER_BROWSER( browser, FEEDER_SERVERS, 1) - } - -#undef MENUDEF_NAME -#define MENUDEF_NAME filter_window - -#undef CHOICE_BUTTON_NAME -#define CHOICE_BUTTON_NAME "filter_" - -#define FILTER_WIDTH TABLE_WIDTH -#define FILTER_HEIGHT FILTER_MENU_HEIGHT -#define FILTER_X (TABLE_X - 10) -#define FILTER_Y ( TABLE_Y + (TABLE_HEIGHT - FILTER_HEIGHT) - 2 ) - -#undef CHOICE_TEXT_COLOR_NO_HL -#undef CHOICE_TEXT_COLOR_HL -#undef CHOICE_CAPTION_TEXT_COLOR_NO_HL -#undef CHOICE_CAPTION_TEXT_COLOR_HL - -#define CHOICE_TEXT_COLOR_NO_HL CHOICE_TEXTCOLOR -#define CHOICE_TEXT_COLOR_HL 1 1 1 1 -#define CHOICE_CAPTION_TEXT_COLOR_NO_HL CHOICE_TEXTCOLOR -#define CHOICE_CAPTION_TEXT_COLOR_HL 0 0 0 1 - - -#undef CHOICE_SIZE_X -#define CHOICE_SIZE_X 120 -#undef CHOICE_Y_START -#define CHOICE_Y_START 0 -#undef CHOICE_X_START -#define CHOICE_X_START 0 - -#undef CHOICE_TEXTSIZE -#define CHOICE_TEXTSIZE TEXTSIZE_SMALL - -#undef CHOICE_DVAR_EXTRA_WIDTH -#define CHOICE_DVAR_EXTRA_WIDTH 60 - - menuDef - { - name filter_window - rect FILTER_X FILTER_Y FILTER_WIDTH FILTER_HEIGHT CHOICE_HORIZONTAL_ALIGN CHOICE_VERTICAL_ALIGN - focuscolor COLOR_FOCUSED - style WINDOW_STYLE_FILLED - priority MENU_PRI_ONTOP - openSlideSpeed DEFAULT_SLIDE_IN_SPEED - closeSlideSpeed (DEFAULT_SLIDE_OUT_SPEED*2) - openSlideDirection MENU_SLIDE_DIRECTION_BOTTOM_TO_TOP - closeSlideDirection MENU_SLIDE_DIRECTION_TOP_TO_BOTTOM - visible 1 - - onOpen - { - play uin_navigation_menu_lg_open; - execNow ui_animate (dvarString( "ui_serverBrowserMenu" )) Browser "Reduced" DEFAULT_SLIDE_IN_SPEED; - } - onClose - { - execNow ui_animate (dvarString( "ui_serverBrowserMenu" )) Browser "Maximized" DEFAULT_SLIDE_OUT_SPEED; - } - onEsc - { - close self; - } - leaveFocus - { - close self; - } - - itemDef - { - style WINDOW_STYLE_SHADER_FRAMED - rect -10 -10 ( FILTER_WIDTH + 20 ) ( FILTER_HEIGHT + 20 ) HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - background "menu_mp_lobby_frame_outer" - forecolor 1 1 1 1 - visible when( 1 ); - decoration - frame 26 0.1 FRAME_SIDE_ALL - } - itemDef - { - style WINDOW_STYLE_SHADER_FRAMED - rect 0 0 FILTER_WIDTH FILTER_HEIGHT HORIZONTAL_ALIGN_CENTER VERTICAL_ALIGN_CENTER - background "menu_mp_lobby_frame_inner" - forecolor 1 1 1 1 - visible when( 1 ); - decoration - frame 26 0.1 FRAME_OPEN_TOP - } - - // View empty. - FRAME_CHOICE_DVARFLOATLIST( 1, "@MENU_VIEW_EMPTY", ui_browserShowEmpty, { "@MENU_NO" 0 "@MENU_YES" 1 }, uiScript RefreshFilter; ) - - // View full. - FRAME_CHOICE_DVARFLOATLIST( 2, "@MENU_VIEW_FULL", ui_browserShowFull, { "@MENU_NO" 0 "@MENU_YES" 1 }, uiScript RefreshFilter; ) - - // With password. - FRAME_CHOICE_DVARFLOATLIST( 3, "@MENU_VIEW_PASSWORD", ui_browserShowPassword, { "@MENU_ALL" -1 "@MENU_NO" 0 "@MENU_YES" 1 }, uiScript RefreshFilter; ) - - // mods - FRAME_CHOICE_DVARLIST_VIS( 4, "@MENU_MODS", "", ITEM_TYPE_OD_TEXT_BUTTON, ownerdraw UI_JOINMOD, uiScript RefreshFilter;, 1 ) - - - #undef CHOICE_X_START - #define CHOICE_X_START 180 - - #undef CHOICE_Y_START - #define CHOICE_Y_START -76 - - // Voice chat. - FRAME_CHOICE_DVARFLOATLIST( 5, "@MENU_VOICECHAT", ui_browserVoiceChat, { "@MENU_ALL" -1 "@MENU_NO" 0 "@MENU_YES" 1 }, uiScript RefreshFilter; ) - - // Hardcore. - FRAME_CHOICE_DVARFLOATLIST( 6, "@MPUI_HARDCORE_PRE", ui_browserHardcore, { "@MENU_ALL" -1 "@MENU_NO" 0 "@MENU_YES" 1 }, uiScript RefreshFilter; ) - - // Friendly fire. - FRAME_CHOICE_DVARFLOATLIST( 7, "@MENU_VIEW_FRIENDLY_FIRE", ui_browserFriendlyfire, { "@MENU_ALL" -1 "@MENU_OFF" 0 "@MENU_ON" 1 "@MENU_REFLECT" 2 "@MENU_SHARED" 3 }, uiScript RefreshFilter; ) - - - #undef CHOICE_X_START - #define CHOICE_X_START 360 - - #undef CHOICE_Y_START - #define CHOICE_Y_START -152 - -// Map - FRAME_CHOICE_DVARENUMLIST_VIS( 9, "@MPUI_CHANGE_MAP_LOWER", ui_browserMap, ui_browserMap, uiScript RefreshFilter;, 1 ) - - // Game Mode - #define MODE_LIST { "@MENU_ALL"; 0; "@MPUI_TDM_SHORT_CAPS"; "tdm"; "@MPUI_DM_SHORT_CAPS"; "dm"; "@MPUI_SD_SHORT_CAPS"; "sd"; "@MPUI_DOM_SHORT_CAPS"; "dom"; "@MPUI_KOTH_SHORT_CAPS"; "koth"; "@MPUI_DEM_SHORT_CAPS"; "dem"; "@MPUI_CTF_SHORT_CAPS"; "ctf"; "@MPUI_SAB_SHORT_CAPS"; "sab"; } - FRAME_CHOICE_DVARSTRINGLIST( 10, "@MENU_GAME_MODE_PRE", ui_browserGameMode, MODE_LIST;, uiScript RefreshFilter;) - - // Hide Dlc. - FRAME_CHOICE_DVARFLOATLIST( 11, "@MPUI_DLC_CONTENT", ui_browserHideDlc, { "@MENU_ALL" 0 "@MPUI_PURCHASED" 1 }, uiScript RefreshFilter; ) - - #undef CHOICE_SIZE_X - #define CHOICE_SIZE_X 98 - - #undef CHOICE_X_START - #define CHOICE_X_START 480 - -#undef CHOICE_TEXT_COLOR_NO_HL -#undef CHOICE_TEXT_COLOR_HL -#undef CHOICE_CAPTION_TEXT_COLOR_NO_HL -#undef CHOICE_CAPTION_TEXT_COLOR_HL - -#define CHOICE_TEXT_COLOR_NO_HL CHOICE_TEXTCOLOR -#define CHOICE_TEXT_COLOR_HL 0 0 0 1 -#define CHOICE_CAPTION_TEXT_COLOR_NO_HL CHOICE_TEXTCOLOR -#define CHOICE_CAPTION_TEXT_COLOR_HL 0 0 0 1 - - // Reset - FRAME_CHOICE_BUTTON( 12, "@MENU_RESET", exec "exec default_filter.cfg"; ) - - // Apply - //FRAME_CHOICE_BUTTON( 14, "@MENU_APPLY", uiScript RefreshFilter; ) - } -} - -#undef CHOICE_TEXTSIZE -#define CHOICE_TEXTSIZE TEXTSIZE_DEFAULT - -#include "ui_mp/popupstyle.inc" -#include "ui/choices_setup_popmenu.menu" -#include "ui_mp/popup_player_info.inc" - -#undef CHOICE_FOCUS_SOUND -#define CHOICE_FOCUS_SOUND "uin_navigation_over" - - // Redefinitions for MEDIUM_POPUP_SETUP popups - #undef POPUP_WIDTH - #define POPUP_WIDTH MEDIUM_POPUP_WIDTH - #undef POPUP_HEIGHT - #define POPUP_HEIGHT MEDIUM_POPUP_HEIGHT - #undef CHOICE_SIZE_X - #define CHOICE_SIZE_X CONFIRM_PURCHASE_SIZE_X - #undef CHOICE_Y_START - #define CHOICE_Y_START POPUP_Y_START_TOP - #undef PLAYER_INFO_ALIGN - #define PLAYER_INFO_ALIGN // Purposely set to nothing. The popup setup macro sets the alignment. If items within it set their own aligment, they end up offset incorrectly. - #undef PLAYER_INFO_X_START - #define PLAYER_INFO_X_START( frameWidth ) ( frameWidth - PLAYER_INFO_WIDTH - PLAYER_INFO_PAD ) - #undef PLAYER_INFO_Y_START - #define PLAYER_INFO_Y_START( frameHeight ) ( PLAYER_INFO_PAD * 2 ) - #undef BG_BACKCOLOR - #define BG_BACKCOLOR POPUP_BACKCOLOR - - #define PURCHASE_CONFIRMATION_RIGHT_X ( MEDIUM_POPUP_WIDTH / 2 ) - #define PURCHASE_INFO_WIDTH ( ( MEDIUM_POPUP_WIDTH / 2 ) - POPUP_SIDE_PAD ) - - #define PURCHASE_CONFIRMATION_ITEM_INFO( itemName, itemCost ) \ - CONFIRMATION_ITEM_INFO_VIS( itemName, itemCost, "@MPUI_BALANCE_AFTER_PURCHASE", locString( "@MENU_POINTS", GetStatByName( "CODPOINTS" ) - itemCost ), 1 ) - - #define CONFIRMATION_ITEM_INFO_VIS( itemName, itemCost, balanceHeader, balanceAfter, visArg ) \ - PREPROC_TEXT_DRAW_VIS_EX( (PURCHASE_CONFIRMATION_RIGHT_X) CHOICE_Y( 1 ) PURCHASE_INFO_WIDTH CHOICE_SIZE_Y, 0 0, locString( itemName, itemCost ), TEXTSIZE_LARGE, 0, 0, ITEM_ALIGN_MIDDLE_LEFT, NEW_FRAME_GREEN_RGB 1, visArg, ; ) \ /* Name */ - PREPROC_TEXT_DRAW_VIS_EX( (PURCHASE_CONFIRMATION_RIGHT_X) CHOICE_Y( 7 ) PURCHASE_INFO_WIDTH CHOICE_SIZE_Y, 0 0, "@MPUI_YOUR_BANK", TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_LEFT, MEDIUM_POPUP_GRAY, visArg, ; ) \ /* Currency Available Header */ - PREPROC_TEXT_DRAW_VIS_EX( (MEDIUM_POPUP_WIDTH-75) CHOICE_Y( 7 ) PURCHASE_INFO_WIDTH CHOICE_SIZE_Y, 0 0, locString( "@MENU_POINTS", GetStatByName( "CODPOINTS" ) ), TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, visArg, ; ) \ /* Currency Available */ - PREPROC_TEXT_DRAW_VIS_EX( (PURCHASE_CONFIRMATION_RIGHT_X) CHOICE_Y( 8 ) PURCHASE_INFO_WIDTH CHOICE_SIZE_Y, 0 0, balanceHeader, TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_LEFT, MEDIUM_POPUP_GRAY, visArg, ; ) \ /* Balance After Purchase Header */ - PREPROC_TEXT_DRAW_VIS_EX( (MEDIUM_POPUP_WIDTH-75) CHOICE_Y( 8 ) PURCHASE_INFO_WIDTH CHOICE_SIZE_Y, 0 0, balanceAfter, TEXTSIZE_DEFAULT, 0, 0, ITEM_ALIGN_TOP_LEFT, 1 1 1 1, visArg, ; ) /* Balance After Purchase */ - - #define WAGER_ONFOCUS \ - ; - - #define WAGER_ONESC \ - setDvar ui_joiningwagerfrominvite "0"; \ - close self; - - #define WAGER_ACTION \ - play CHOICE_FOCUS_SOUND; \ - uiScript JoinServer; \ - WAGER_ONESC -menuDef -{ - MEDIUM_POPUP_SETUP_VIS( "WagerConfirmation", setfocus "WagerConfirmation_2";, ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@PLATFORM_CONFIRM_WAGER_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( "@PLATFORM_WAGER_BET", dvarInt("ui_wagerbet") ) - - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_JOIN_GAME_CAPS", WAGER_ACTION, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_CANCEL_CAPS", WAGER_ONESC, 1, name WagerConfirmation_2 ) -} - -#define WAGER_ACTION2 \ - play CHOICE_FOCUS_SOUND; \ - execNow quickmatchconnect; \ - WAGER_ONESC -menuDef -{ - MEDIUM_POPUP_SETUP_VIS( "QuickWagerConfirmation", setfocus "QuickWagerConfirmation_2";, ;, POPUP_GLOW_GREEN, 1, 1 ) - MEDIUM_POPUP_TITLE_VIS( "@PLATFORM_CONFIRM_WAGER_CAPS", 1 ) - PLAYER_INFO_VIS( MEDIUM_POPUP_WIDTH, MEDIUM_POPUP_HEIGHT, 1 ) - PURCHASE_CONFIRMATION_ITEM_INFO( "@PLATFORM_WAGER_BET", dvarInt("ui_wagerbet") ) - - - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_JOIN_GAME_CAPS", WAGER_ACTION2, 1, ; ) - FRAME_CHOICE_BUTTON_VIS_EX( 2, "@MENU_CANCEL_CAPS", close self, 1, name QuickWagerConfirmation_2 ) -} - - #undef CHOICE_Y_START - #define CHOICE_Y_START POPUP_Y_START_CENTER - - #undef POPUP_BUTTON_COUNT - #define POPUP_BUTTON_COUNT 1 -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( WagerDeadBeat, WAGER_ONFOCUS, WAGER_ONESC, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@PLATFORM_WAGER_DEADBEAT_TITLE", 1 ) - - SYSTEM_POPUP_SUBTITLE_VIS( locString( "@PLATFORM_WAGER_DEADBEAT_DESC", dvarInt( "ui_wagerbet" ) ), 1 ) - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", WAGER_ONESC, 1, ; ) -} - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( WagerPlaylistIsOld, WAGER_ONFOCUS, WAGER_ONESC, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_ERROR_CAPS", 1 ) - - SYSTEM_POPUP_SUBTITLE_VIS( locString( "@PATCH_PLAYLISTISOLD" ), 1 ) - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", WAGER_ONESC, 1, ; ) -} - -menuDef -{ - SYSTEM_POPUP_SETUP_VIS( WagerPlaylistIsNew, WAGER_ONFOCUS, WAGER_ONESC, 1 ) - SYSTEM_POPUP_TITLE_VIS( "@MENU_ERROR_CAPS", 1 ) - - SYSTEM_POPUP_SUBTITLE_VIS( locString( "@PATCH_PLAYLISTISNEW" ), 1 ) - FRAME_CHOICE_BUTTON_VIS_EX( 1, "@MENU_OK", WAGER_ONESC, 1, ; ) -} - diff --git a/mods/patch_ui_mp/mod.csv b/mods/patch_ui_mp/mod.csv deleted file mode 100644 index e69de29..0000000 diff --git a/mods/mp_bots/mp/gametypesTable.csv b/mp/gametypesTable.csv similarity index 100% rename from mods/mp_bots/mp/gametypesTable.csv rename to mp/gametypesTable.csv diff --git a/out/Move to root of Black Ops folder/mods/mp_bots/description.txt b/out/Move to root of Black Ops folder/mods/mp_bots/description.txt deleted file mode 100644 index 8245eea..0000000 --- a/out/Move to root of Black Ops folder/mods/mp_bots/description.txt +++ /dev/null @@ -1 +0,0 @@ -Extends functionality of Combat Training. \ No newline at end of file diff --git a/out/Move to root of Black Ops folder/mods/mp_bots/mod.ff b/out/Move to root of Black Ops folder/mods/mp_bots/mod.ff deleted file mode 100644 index ba5d576e28460ee876c7e0783ca10ad7e0b9b7b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93376 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

Q#3Ws?&$B0QjmG_z+#^F7&C#*9fqfqryWr1tSFA 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 w>ia4n!z*fFQGH}Bsn>gW;jRl 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 diff --git a/out/Move to root of Black Ops folder/mods/mp_bots/mp_bots.iwd b/out/Move to root of Black Ops folder/mods/mp_bots/mp_bots.iwd deleted file mode 100644 index 1ef994ca6efb679b51fb9416ba2dec41dd2a7f39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30791 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 z 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 z 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

??S@ zY;Mt`?2#?4Id?Rad_!bpKLLmuciV#6fZ()Q%-_CkPA&YthsP|wgQ{v8e(`*#;cFKspKvfAFwct60H>E|Zx zG>WWRr5Ex%H`+a_EbtL0H z*b(rn-DX^AR4HhWO73cyxa{$yATZxNupr?g>-dv`Xa5|kTA7Q6AmXJ+w#24!PI8Co zy|8qKB0ZjfYfY^OA_RjZ^LHQwx)E%_7(K4NcHdRGeyO}DB~!$(H2nood=iDcoj%q- zvF5FZ+I-F}+<94Q{fC~9hZIX6`p3x+P&&Iuw{)v`?%Iz%B`w`;&j!gR4<|HC+$*B7 z#Ai5cIZ!b_>D^aY!&aW2Lws9%iPDd88tv#8blh!weZY<7CP(amc<*=h8ourrrsjMLw55f<5<6bW7iR*KN5=`cEG5gajPJUfG3HhW^!2XM&>*%w#@rn67 z0EPi#;8x*jCG=#86#QjH1fzJM}tze7eL1elyJI9oQ?VjgTOC-b+MIf zy>jo1f|J+F?A5mu!bp{X{bxhhOV8RqA}3QmxFzS5 zZN2q8g-f(rL3_z6@H$+Anu_`Y*w-3jBMCLzGW|pZ%B3`!-s|TJV9r-iO0`X{a)O9_oR4I?v-)MS=pq-aTHvaS^G1De^hj*Uw3yb3qCpp2>wg9_ z+$upbz;hHuHpl}D6ZpJm_Jr%9XO4K+p&86}mswTw@D;4V=PX}2A9(_&Wz~F{uU&&@ z0Nxs&EAmEaqBPm!!b!tt3?RuJrbZBxLdX+*fKqd4x4>n&*rM-TckY0g!cumvR zd=BUP+w1MlPwDui?>?kBr@71|hZSA(vB-3!MW0dH2=ct%qWFus(>KF&~G z6d|5*(DW?L;2-hI*1^UExaXrv7YpYR0Eqf4px_LVM@SBdo1g?UR)LJOUXmLf#Yx^L z$l45TQm7yQxcZXyj>94`uVOR%IC|zZKUh36{|qY#(U`3QkX5hVd5<3|DWDrq6L(2T zPES`=Gv$Z$O=W*6xUd)CKQ?VTDA4fE4ZQbyZSiR7n4vJNIN`~fwxPQJ!BlMtPw@-$ z>LxwnSfl+9%orQ+k>W>hQ7lG9G4ZzlIaV4G?RKL*C9VJ;{y#3t(_n>NDp(-EpPxXw zJnFjog|f)zX=@&Uyy@joz*+8f-?Xmy9m9N80(EhQmh$c870;n(Se-*)neX6nrN+s? zimNUJ4AC(RXV|<{SPAD%6g1jD1xRgZ{_E;-v0+neG^0@%ocX%O*2Ms|6cM&sVIXF-`3xl zd3dooDUI}X!~5x8zqW&5;5!mYRDR}0M#a5@kAVkqw|>|v1yW$zk46<`{!w>g@X{gy z$hhQ$Y}m40MeGuD^Km0edb*2-@wU&zNR%gC!#5}+BYO@LndN&{Q*q&SY{X!#cir^o z*Ggr&bt)d7e3S6hm}cQ-XZ$o-emg7lLr;N%C3bz~4WS=GRzdJYErWtuZrxqj^%IHP z8Eb{dO3vrC_uj1KT>Nl!$?Jk(ne|}D?fhx)8`GXkGf8Va7^M;A8g9YF6`CZqIqn}* zzzRZfOk{;TwZB7m(-&R1*94ysgS4{f>w?$Mec-i;l7`~;j=;=`E}tj7A#B60<1 z9WUA2r4O6q1WD~uzPJoJ&r(|IW&uaJg{mZsC~Cy&R^866TZQfnaNEL^gIoD<*0O=a z_)#}`gJGo)15@6fM(A1o3IF2qT&Bo3+y#fRU&{9jzG$q371jx8)k&W4aantGXeFCDz7cIy%c ziCOywzEv*vy@r(u=SWs+4TwY&8c4|q)^G}Xx#BU_f_k)yPjTDi* z#?n4{-@uey(kE6i?PML*Q)^TQti3#TDpmN?biPp^VVInmSEYF8aJc`A24CuWsD4Rrx4H((`%|UJ%hu z{VOBxD6=l$62F+iyT!+ST>B3yI`H%g8P`raq$o) z?dDLN@fx&@e*66OHwk8>018+MMtRwZoib-P^ldyN74H1y#$^7peVg-U+M9lR~^YeMchBUn^X{5- zu1D3{aP7$YUk~FgG0}G0wD3Rb$IT|S>+68-tE2z0mWExN==@_!SW$zV@1~+Nx&D7u zn&PWWvXcip)j7YP6S(@nNlR8ytKG*MvI5hc+0qL>gmR%-7->SkCV;YBnrYFK$rC&IM}E4cEY}Ka@fJsXbVepMZ7uPr^%m9j>5}gb+m3x*v50mGESLZG=5DFvfzfz9BD%)gx4hK0@)J+#LBL z%}fn(x->b9iV-lCp({zT5}S3091Cc)T-onT z5|&VV8T3Cn{F|q=F1i>qzaIcIUQaY^jK(LWa(E%nv>sK5g{FB%at=1k1ygE-Z0oEyiB7N z?^P%>5Vi6y`F*a#)(bkE7yDH2UeX$KTc8l0y^eauQROu^txFf}@ zK-+@hRjO;SEuU)is>`?rr_0tiE#Kjokp^1Ru0LIfaqNCr!cy{YE`z zX+5t7GM7=z)x6u?4r5v#muUW+xzQNK$!ZtT7H=#qK=&c9rYa$~ffpTq87Z%(~G-kjEddR>`L`~>6$EdT8Mvbk6+6bbm#>#7{3 zR1{Uc(xad>Fnv@eb)vlz;7&=KP{DkVf#^$VkW>>5QW_4|{YTYqYi45n#N~>}>W1Ek zgokF^7ie<2(r3;K^-@wUyx*rYlUE-w3I8em)0hyFsC_%VbBN*)T05*ue>NuCK z{K6|E7X(>&EdL%|O^3A3XTl^brr7R(5T5a!VgX;nk0Z31;MFrWx2yV=_E#CZ{ntjZ zfxcTUghH>+Nt;P3@y*={tN~J_l7kjTy3(daj9VHXp55z_QJlnvjPK zhGQ+tz$$BjYx2{X%ul~F$;20FWZYnFTD(@Q@G@Ff&h7l8=AXJ2Kiz*t@BVO)Z|*vD z49_oIajB0Qh(y{omq~+47gRnsm6(K@chL>-2yUITp8~3T&Ufry*P@TU@cIU_soaMU zn%9vS)rtG0fHVUdL+BV(Z+fk5=kV-g)yn+(=@`#Tg71ag9CePP*sWTN zpN9p8N#1_fG{ko_#6Qf@GTl&-TDW8XjK?rfuH@-E=99&VZlMA0%Fxm@p#N;0myAyj ztyNUZqg-qrsw?9;X>jY&Qs2zO37V1o0NY*-4J~@qiY2t>4ktj z)qjq6!RYD0g1KKYuA6Npv}B?xs*(1(aytMh} z%1PsefX0-cWZ~_#)=>sr4Fl;3u{hXepmuopar4c^KL2^2UC)P&k1YhU;*@Hi?lz|G zo)NIyO+W3kX9ZsB5gNGXq`TWM8b1t-U{@)_5pWV`-#$=g#i6*q$tj3r6-Do}o@6fX z2hoe?(5_(Y5-1aWmc54DmPUP(n5P@_IH@k!kK$uLU6(tyvYr?CbPAnGljg1T5upXdfNtvcrB(CvUSNF*%y?>+go)|7|onz&|aK>t|EQ z_5BL+j+^HaufndB<>vto+e?a<+^cqYSy+}s`=d#dHx;NaTz4+}-Y}gwhh;u8voNnv zJfKKSzmK-CZmX|$MXhj1pZ7Gj7&12!NWUBKo_;g9x@*Xq=ocfm!-(NwurFpC;_fYj zmBrob&C@?>G{7NG%J7CfZ?c))nLo+>RlI2@E=(YOw;OiD4&0xa&R7{06$5>o-|VPz zzS)WXjqf%w7xI}ki>!$X$jOA(R`3IE={>Ni)kl^MWmU9a91Jrq=W)qh$QwQ$pI zXVn}d)O;kIbgl4N^h7V;C0_E#)KGIWf9HAvm%uN}G6kofqn<6b(d&oOPDKqnT@U-k z>C)`540LHCyRk;1U|rt=tKtgW#hM%=7O45U^4j+7SKqZoP=oJU0OVWKX#MDnald;n z2TzaN7dv^+&%w1ZOWeE ze0;x^*UHM3uI%#Lo&JN;^Pg_v`(W`STLHh~S@JLg=#3FumQK~9PI6SWv*VJwEzLv` zwqlEwL(2+QRiA2XZI)bD-_Tk}Bl}aHaX0+7F+?NX_q-eKvULB9BX9~90mFyoKvC&0 za&!(a9s3VflVoi}2ZLlVT58K?XHGk_EVvKWorWq|UNS|eTb-+ZXUPBGddcw6cg-6S z{G*&Q1hg`mLTrP8QBiXfVZ}^d{Q~k{7VGM^Xko8xltA@I9&jjV!g5QVl>;f%?2 zH@kjWnD~XZf!*Uz5Cl{CNE0qWVUznN$|<$9Ihz=@oeRQ?2AM z8B;}n)Yybebv6A#sB18kak7o)P4%qbj(3g$q9M8|z0XwL(c*CavJ3KL9`1jOkqn!3 zs?sL|P(#-S;kCtHWP_(|=|RObFDjf%Vv&HUg*{q1-|2WRrES7n^2R%$v)Ah#$JPl` z#9A=nf$YZQGArORrrfWvjt}_DpJ6kJc1ccGDh~`Sz>e#cs~Ku1P*-8C2#`R}vBAk; z$6ZL|O^JIXazM!o@nh6K9C)-cE5GD=eyN0IV5)L`%|`xjSZSvBClcOUl;ZCWnj8Di z)604=S+`_Y!Fe*%yyBHaG$!>Q(xWo?I)zaSLUYE;0h!~Cid=-r@(rlry8G}kO&UnH zn{2Fhho}!BlmEN`#vZG_Z8%Bw{9z%Ox4@6v(V*^4jk}0b@J-$v2>goa{=Ez}vL_tG zY>DcsUVC~*iR{G4wU#Bd- zM$t;GVHdw2E}yoPO`H;r%b0>Oq}TVS(X%DZO5gsO^1|DYZN+7*JwXvN1*Pl`?yS^y#T}QleZ7hatjUq$ypfApnX1x*x82Uv*y<3irwL zz)5tHtY3$VJ4d}z_nPiguHZ$sV#vV@lD6+Wz3j=s8H2Hkth+Mdo@7xkYxAdw*uo9t zYEdzz@0+~OlL=Sx%@*3 zx3fD3i6W_dn^=3@d90TMnTi|<~nYeAV$R2|sqLNp;I4zJ`k>N80^gmdX^4eoys8_%Q zo7ip!%BYC)?Rz&ME}(q9ml(WLrP_t}s;s0D7o2_2PokNjC(m-RUZ%}+vS&cb*yA-W z*sd(2vCuS>mY3OSAr79^W#!v}L=Ub}Bo1^EMUOFS_xXIU>#Ar%dxeg(W0zAxzHYI4 zwvq#;$7C6s#+V^cdLDTsuuh$7CiMQ4&pcrzwftzqC@alti}-Pe)ez`1o|}*+4jpjF=MFj-FBmkslAW%5bBk%LFT*s%+9B@$;_<- z{tPZZi2FB5-gHahY9*tYy{}5Q*)$kt9ZLJN1R^fi8(GM;2_{p0;N|N`vi1_MBd4ME zis1vuFevt;ceaJ`ZFKkquf7{JFwhP^cNv`M6uYs}?57v05Q_3y96Ta@_m{vVGErP;ED^B*`C zHkx*la8tpQ0Z+AN#el+Tpwg*;95q}y;ha~>k|=uRM%R7f8`aF;zdtv$xME%n^5<20 z^_C3#FNOGzUG8vNY*z|`eS%=VQn=q{UU=D0vxTDvYHqvU4esi$&i^3&F_@lpJ82(a z2iC|BMZJ!Qr>c`HN0+t;;-w~rjyD+#6I%liY6Xe;6yygp-*-PoFan>a#}g1L1)7;j z_j*ePnR=hI#?0eKN;Vb8tUOrMT9TEAtRkV6lUBL8@Kr1AK#6}c=%sjT-mbB$z7S}* z5xL+_pT)f3rtSo<8?*>o2~toe^i*%2W(^8fNC=}Z4!NB&tRdhtA%R_542lWOt#T(_ z$(SOJH@}#IsCu2C@WSJEg>3X*3*FI239AB?I94cFFVe(%mvZ%<^7d&uRm8Ejogqlk z459pD>aK907B;6?CQ$1z6!``b>^Brz)Wcg7tj_(R*ESG-sMZpU3)Hf%IQo79yK>SQ zoX@Nl7#6_3;JvK!BReT@BeOvjr)r_R_JgNNu`P5Zp;x;$ElHqUm@qH!>>|>r;ddLP zvw8X(9R0AzOYhsuA{H-!lJTJ{F4VCVp7XPxm)d0NLs^1|7DL|FFe95@t{XkG8`yPBO&*mJ_ z*XAjbY-*9b@9WO|w%rqAsgyJy<76mRW?J3+0=BX*_;lx7$7m@*bwThrplOd$bo12l z>!Pucq#yfQKYHkl^iRbT7f0QAjA{kJ5HRHVj{EkI00YVyrfLDrNjrraU5`tm5m%c9 zEA?nqAqgSARo6eogL_s6MN1&*(s@_JP!08PSa9aB$AbDM4V{de2?0gw!V54>B6sGmY;FAH<)Itoy*p*9Kt^*W?7){OY z5LhTmWTFh>c3U!s9oB5!(WJCL`JbzCDe2oVA~5^+25G8v6{jepVni72E>DyB2s3cr zqa@7j#WaA=cz$k;t)8&{rYf_MrL(IL7SEiAIhG*gmgz_lRG&^@uGCqKo|}CEzQNt2 z5c|Ayf}<{?zjj=+#?X>Xr0M)&f&?6{yn|{Jno>3}1Xz(^hk^V+%F~^SgXV@SGqnjb z-W`Ep+HAx!cHd5fUabIXvDxsKv@LF99Il8NXRTJo%F2DTr6NlMdi05H=I(+lnM8_# zqT#Hyfq9ufi2DsUV}mKk|JM?dE=|1M!*Oz1lEJdI}#< zrE0&sV{B^dDDn!8y_1=o$&;q)hRWU^i!I;cEv)1X8|0kZi#4&`NLKzGv}S92v&f9YZa;I zlgE6=ThG14BPUNLSN=?XXlg@=ifRqSZ@d1>v_?XHdLlCadB%&CzbbxTG2SShdYwR; zuK4p3@?=5MgTwq4t}qOdp{f)xYMp0Wr_gypzS`j&1W%fq|Jh%w&7!sD8EDw!r9*`c5rmkenl}#u*6)Iru%ow_jC88?ro)o+Q5a^e{sGnWcXF7`mRWq zUtmU7-Tm!I@A!0?QIuf1(lfJv;M^a=DlV?>eCFk0VPQ>=UoSG;7>sjFcxW#`YUP9E z<+}b_%`y5F798IWzt^kWSHL57LD2{bs4UVvQu$sD?ONLsGMl(B$1x5q6o7g7QIA$% zu2lN7B6Odc0X^PYI#FAVo}{JV{*FnDs((z2&W^X3|%Dw)Gj*CcA^{GI#iv z-G94XZD5~V%Zyv81M$O^OKm*vKTpU`-7k;*&|ZSRlcwcxcV-<&afAHPa>}a#|6i_kXj}eTO$oR< z;akrN0%9_NJ6YvaE4FEH?IJYu_V`jhk6Is{bo|6@3jxC~M-K!z)cPWfj(q~6BMj?z z_ur(t-KDwJMeTI4Asrg+SJfx~l%U-g7F51Pqa9W}bKMjmGC|NOjRnpV9+4zqDM8cr z7oZqb1>nWCvb-iLT~l9Co^T&bk>&43_3Fn{1u%^fIo4p`TttPp*P~H}da;HZ64xxQ z@!2jZ)rMQxdJdUxv$=GP4E@u1li@WV7p7QNo(tpLQah+LWL)e*v8x*>QMI_=__8Hi zVr_e#kT0w-Cf@LpZNmRJFMoWsfl(|~A6?-lK=$eJ6K<|5UodEp9EGC8v9H3UZ{z6T zs0~1Ao}Be#_~A3=j8E^~4?Ec$@dac+T0JC{;@V180$y@AK<=n4i?itI##iAk3_^URYDpF0Ye1|u0 zN-91LO`ca_MyCs8@b=AFcZEC^+OjK;v44r;W;Luyud?)xsHF_dddaXD3wtjuX)Dx_ z1owMrWT&+jwqp|S{au)S;#hyryN_NG)5qgc(mq}hpsHXw=e4q-PvdH_!p-dt79 zoVmI_w>9`ag5gc`vg>EUq_wXa5-I*2@tdh&peUWkED?8sLpsBV_}%$BO=C1YkJga2 zl0C{TPrH@J@)Rkj;B5zXtB|Q!vLft4iG5CI*^d=fb^GI6+4F7eqOLd?U$ZHoKkA2V zj0X~}s1M^hL}7itswxBV5MuoCR9F!p0R2aYma4%W!2VIE(;!&UH>mBU^`NGp%3 z@M}l{;*V9}_nqBJEp~g$Q!az~o+idls&;vy zV4GNRN#5z&9qfDp!AZHmpny_VPC|8Uv%1tCzb7>ATyhEyJiJub}B?~Xh!kFP>EuHzD2~(718LV z&MUorCNgv+dY}`7rJ`}BEAyjkW+d{%C16(m#--t z{jwUU>GE;mb?(|A4b8dR1wXuCGqC&%{Dj<6?9e^mLvMxPlhM8Aq@|RR|4T8_Oi?xP zr-~OUwml4`Twhtq{kCvA=;Id&{J=308D^vV!w^U^2?3AYYbq=hH=eu51PynzKd-33c%F+8c{nZdzN} zJG45rDWJtPM15cXbxU|Hs4S8%jmnH`bKE`Et7ZwCAG-IfDnUE7^i}O5Og6K_I--UZ!rW^cUMcw09!HK*@i&xymfAn+k_p+x?Ag8l9cJT_rS18N5ZN3R>Z>~v^Z3J zN+8wur|*T{k%QP_8}Ki8iUBS2s)+%c{xWw|Bf;6|HZ68vff|$r#S-#zx0K7xH(YNN zj`HUa)bw__P*q#dP+B`Ps}356bgks3Y?cenBKBF58&Bv>L-{+pS;+=g4r0|f+RRw? zcD-16d(_bX_}L7ha|)ZgtKL4a9%c+so{0d3bYvTIRC(4nqThaZBLkM zPTrkXg}-`x|3}IIC5lbyw0%N0pN+zl^pgVq?U#4+#d0|=%7z#CSXulU-69rg%t)JD zl*PTvm#tTouIzkJ`uDD4FjB;h@)y1 zt!}Xp=$^JOVmu;s<1bzG8D~o`yk%P?_io(q ziZH)w{845h8|CO{PuhNZ+?Se|m=&CB?@#)|bEcE!*;5oxe&?Qq4(DEB)39992?gX} zU(aq+^LyyDLz1JtiA}wOwf^$K>-t{hSkvd+swRztp9!5F2^B)fr2n4UCvVH-29oju zjWtQau%lg`H-cMI)cQc)n}d(bE?#*F+jV2lz!z&m(p;#k9VfMz9589%&O*;@A8RA3 zkXkdFyW$>Jnx2v_0DPu?r^(?3CpD>+xkuxjomFEhsRfgj`(c*=l#^b{N#- z4Ksg7HKCkXw38wDaE<_D{f(E2ex1ixEO?53bF$oQH0?F}VAviq0{Cj~z`04@hB5LL z{l-Uh-Iu(?3D;Y+@%OxZoCS7BP(N?F_)J-Zx90YMnCjJ<_#E|@y|Yf{>z1b0koRK- zV?vR@VCy>ZMcc&bn~eF}?{~jh{fPt|otR#8>RvNHoJHL3>)NLqI*&TW%JvP>-;J|d zafS>xveU>#(_LNA3cInSY(~_*Fw`!uO=gB*%nvgoorvvo(pO((7|_flbGf6@l04R-hXHhphJuYbt2lc108v#E6C7 z6agvHdy5DbKtKUOx=QaILQ6mdq<4@SkS4wN5_*TwL+`z&Ku93KhtKoA-`>aGf7YM1 zveq1vWA2%`=De@_1(=7`o*x&zAIMUFT*`nmG75a+si3n;>D7*jP*yAUNCg+Su6^IR zdOYD(@&x@Xc#_C{Ng1k(@i3o$!*PQ9u9W0y@2z7D;oB}-#3)UXLo7E3@9(9}eru+l z+MCH|`{@#r=#N^kKFm0 zVyhp!NiMX~VHGGSLHN=4t+{VyMl=olj~~j52tP?`j_RP$E@qQBE|u}##2*Y0`P@5c zqQ|oMyv@V2@$JYo_!J&+Rdn=v-(>p#^Fu*L+$}NrMy*Qto%p~1FHdVi#)m`ZWK{j> zuM68Su|=Q#-kQ>ulQ>&u7_N{i@uzbCmkaUxjH|zhz(QeSRG6;1>x08Sd-SWu4E%yW zK}2|!seb^TwWlYxDf#;BB*E-M=bRApfNh68?LB(g%}V){8T9CPuj4T4tE>HHK&pYZ z>ylUW8=D_(Zsp;&txV($x9%l&bwjD%Bm^K86$Z8$%QsZlQeA>npx*AE`SC5l1QvVF*y zt&}co-<&Hohv%mjJ8%bJ>8{2NjH_RgDY@|exk!Yd-z8gIMf3T5b6!3#4C0RW8(KYo zCVj#pWx0Kj93eT8uIY0uHdUU!6c^;;+wNqnPq`p_eqffKbFZ6N7i7r$M~^byN!7(u zkWbEf`^3ugI4W zjt)-9vVo7^O#|C&x5lVJ+^lPoOyQW|ySgI(q- z?(h6uk3>x_$>b=}c-_PEa}XEjo38nWjX$D7a)mp+k7NvB_R@T?b%G%iO+ZuSBr?8f zn*BKduG#g(`nRQLFE;KcnzzLsRT+_ktI3ly0KZ5>a3yz`opLTq?tv$m>g=C3-2^dQ zKIT=;D%;+`qpE9%s)izw?Ng-aaYHV#&FDwb%qwy@N~Xua*GsL|i450K>uzhfVOQ}!~#$%;}V1Z>X9}*=>EprYMsY7zAf@%Dma~aV7K!(Gv7tA zNZRz@M`9^ycK}W*$+eHhK{O9$R6Byp-J}O3^CajQu^TX3>HGfRaa~f$sLfIdk>EKDhV4>BHt-Nq$pRnq*!_6@=zWI}* zrYc|3G0=v!n|2`6k6b!nbu@oQ+5BTw$8z$68;cU;x4p)Zl@K=P zwLf}!_bdlJCwECYBxSkQ_r>pB-tSny^(3c50fH%9&!|{)2~wnvUl~=}VC{(SpW8Jj z4?+5`_lftAS>EW5G6qlFe1KJJtvOGu4mVoD5k}s7aWXNVE0V@__3Yd!)OKoi2+s#eY&hqfPE%pzFFO&M=U(42Aoxe1j+7zlnm{V(lw85 zcaF99j=4P!sy+!mGuS!}nY7nu$}up%#27WSkR598%eg1T5;Z*Z7KJC@m+m6?V>5{R zN<9rt#oM`3oc-el)=-_~zq~H;GZ#OFB2NlZ2MsGc`{d8|^v}MW#snSDrWhNAdC;&N z%^4VOuJE*9;u_W?Ptl79=(Fm`F%A1Bv3K~1b1?K2K~<{lM&toJM60K_B9y)EjGI-5 zH$fdef~l|dpDWfu>-8K!XTEfIvczGM?WtIp>!3y$pQXoYxz=wi@($8S-`Z%<*~&=N zO(dQ5BAWgPCJTJLfFu7AZeC&yWBpxCa$n|j;%g?f`ZSfR_?88&kWrFWY=ZPI+jZ6e zEi`FSOvHVpyi~n&v505P7xBT*&h)=W3ozax?&lEe&c9bKzVjC-v|)9rOyb}F zT3EsT3(X@+lBY67WL(4C32GZEIakBnTOa^f-{XjEiqMkUPdcX%IbkLa>bHF#e8_a2B*%^=PH*DL5J5J=TZ=#KYK>g53F@1e3bm; zafg^}KxHNBVq+q)>ZM)BY0ZYS2x>5N@h!^*z}m8EQn5j6<6~eyO0=E41mOB<_&_u$ zDzGgf+}B9-wSG&jX_ZZ8+GN_0n_ofz7jt6$YtbJb6d|CpJ4RYPt%WP~t0CNjOSB`9 z^vA7w0``XA?i#1F-s?2&6d%Hms5nks^wpM>CXWkG!M=ekLTn2U)Vo(_;DG{Nxw4li zhb{39g4RnJ(C$|r>8RZIyrN8Z^>*Xb48$Eh;q5I5(lgIVgq8ubSE4B>T7oy_B>*pEgdv*?9un&s5-~a^A73Sb_r9Z@nLpI{9mmNp zV$!eL&QN(BMt8u+B&N|Mz#EZ$(5GBma}39Dru(qf72A$y-o4k@j3aMM(UzTagdolA zaO_Q!ibQmJfxLLN+??ey##Oz9Ia`QEyHv;!lbNX1#|qArKECC|Ll~Eu(hh*EFWpKb zI!eU`v+VhAzKfuh=j-7bAJM@ts-Ad$-vh$;(4M9$YCp@PcwXxPA+NQ&Z!>br`fhSS z)BjF44XLGcdOiyfyUDh)KJw@i11ZNm!1lM4SPzHx-&^uoy6jkuu=B3WK;rYsOKMo~m=BG$Ph zg3U%qN-G~30=ZODPsfb$vvQ*En@CW$S@-?MR&GwTd45~oEMw|~pWSRa^E0x(Wn!>L zj-h+p=RzsFZgtrxXmW8fRrV$DF0o^ZMxA(gJDoD$-VyMW7&{P2q?s^9zR-V$f^SsF zS~kt(Gdg&yObMm*4U7lB*y|OOPEH?KGQoIQ@v5y@-&- z8<{5H;JE)LWcTW>`SNPB4sIfkRL>9zK@#QB?I_oN_oZ{44@gNou3xYKtAOL{1K z4(lO~#iY4EaM=X7nqK3ycEi?atQS}bb8i25d++fg1<3z&efb~P6tZOOa}n%c-vS;1 zMd4JBPw1|4k6lC5MiHFe#N!REeQmId3B)OU^UM<+tZxLx@<|%0*+}=Dl8m1vJJ)ia zO9r^}EG`?+62Rrvif+Zp?`S@Lu_Mc?n?9Io0iSx8lpc9DIs5ojVEEQ5hM8bgs4aYz z`8pgHb(t#fcbV$*oyTJuIF|O5(%#NJ(W)@A#Q=VM@7nIO%NOHc^m4) z2InMet2e=$V%nkef}h+B<=jjL1Q3Z5dD5tKZ^Qa6ZhVuVr8W8H?_#Wrv#Q53J;!NF zRJ48YepTFjQQxCu>Q?wGzH6H4vI-+%ro!G3dpFHr&-(Cf>lI5SO#i* zAJG!9;}$_nh^>|g#4nbv%x#lXTW8r9Hnv`4Zxgv zS*a`S_0En`wHx&L?}tUVFtQBR#o@uI!K*L)YWFv+U-eS~t`mnF$rzq^F#Ll~}Ln4{Ea$D%{iPc=DzpM<1;DqQVxRqa8Try=PKp+ zBgsmChVh7shLw^leST=OAQV33(vfWEo3||BL#l{VILA72!oqjE+=mUta7U?ykfgo9 zjze#a#)cIn2V$S(*rMa~VXn2%)HOutmvvgcVfrr=@O_D?fjNWGI~gf`-1G{2Bo2-S z%eRz*$Vcu^(Vfm$VAF(vDUESUZ%top~-a=O&Da39D%Ujt_?dY&yrC}`D z8)yA7=!4U_Q0$hPn@50M?;i1$#-71urpTphQSxyJ1TxWuouxWik^ow+$)`2>&srUo zb{-uZaxb8p|2t5FG2tUh&57+0F){p-6aryQNEy4n>`gdar#PI=Le|_iuli3;-p&mi zX&N!h_Q3(!Cnv$qyq-C`)>ksKDA<9%Q7Ot^>EA{DAF6bg>}ry9O|qViK%}tCr_Mgj zlgA<_&Lzy}bc_>yGo>6*cZ*S}Bh_^b<4}WF2KJg)`Z^8HKwM0Hp=_C_^`=jk^xj|e z+H-$870o7{Mwpsb`%=Fu@mcOa1HPxBageD?X^r*b?e9frR_^^Eic1GnHJdq7F;bdB z^N06uF=AwsH3ENcdkubj%j@xq4Bd{UKQ`*SC)nJ=Cti47!gpY8WBLc}zibqP3)EHg zX&00{*XL%u;$n}jfyx*25Y#wtJh{&eBu;|d*E>q~N+rjrppO(tdjttBy#uR&5pTbh zb)l9p=9+1{N<*x}96jq^!Ke;SiugB?vZrI|4>Zn zn4OE?xTU>U5q$#;f6Bu!hG(hRlSZkYZtuSh1&61SE~2UzEEE`eOy;H-`P6b}%z(CD z>2ucI{~PDEjdwOGpx1zsnuKO;Uya+-#K@vPQ}!NiMc(K)xVt)W`Xpd(NqhC5fcoUC zk}x52`r>cpVU#4RqInLEbO9O_(|f1hmxD7od(Jwk`>(0&%bm7~F@8qIyojW+Y6(H; z9yOFzEfw=kS>hcQ<2^mBk*0t7cB^J@g}S7Vt>$ny>H2OZKc7HDk2CYP)<1MC0oL!A zZypRsPe0>=;`^W*p4i(#lClHU$tL7l^$MJ|)n;%XInKLd zPu)vS-P2n~v`G1U$ogW!|5AF~gRlQ&d4+d> z>HI^Gpk(1UgXAfHj^UYbFeY~iW>ancaL)g7f7C$K{vq7!Cd94d$ntUXk=~lfb6XX_ z>)Xv8KR7OCv$i8F;ntU_BWrxaC(Ec=9|yhSLA&9*DwoZZcJ%4k>*G*EJs1P+>r%|m zb47Jrg*jEl>k44xKdQ;xvp2PtgHKHs$I>#e|1k711m_|UQAfkUl%?9Wa@F|}Y_@`% z*(v88`=;DS54Qh(X}KU&$1!hx>;8?>Q}EB7EMQ)2sinN`Smjn0-uKuLa_%hIw5QqJ zU_BILp5f%+0Xn+&A{n4mOfntbN!8YaS4-w)xu-Sptr&1%06UmU;GEdp{VDnQ{^bV% zSIo3M-;?Fa-ZSXwDDGZ}E5< zDV;d`zSEsres(H)NGuW$DeB*t{FJd&qsAk-a+6 zGLekvsf4Z$JRRY+W(&W2np4cW)yXGdD6|W@DouM5XM~KC`l36Pr9zBv%n1hc9j<6(BkDhpe zmiJ;|(-v#K4prhnk~dDSpW-6Ceb?p;5hV4iKGDC*m8f~-4Ljjt7OaD{D>$?QUOMvZ&?l0*U+akT} z4n^`#+wHtm4d`reDl-t6c;&WEI5#gURo7xI>hoZg8G9P;r8Ermm^$OC@9)J&zT4>~ zy}mKRSFSI!$l9ER@}DxS2|bQjr)cg-C&gRP8>`G`$n5vsiDSBGPbURA7#_W#ko>eH zRb9dNg1EUumTXCiGGeYQ&U345#@bja9>f>XT8{mvUW?|s9d>{hsU~ci=EHodcu#BpHH(yJ? zzUBwBB=+#3x6xO7!K7ne$v z>QxO4UFsKaKmE=%6`J0Ly~}I|-iEe0UL%%TE|^in8a*HPCOIAR9%E_b<#nn^07dgX zf}Bww`Abw*B(g*5hBcY5Ff&l3%Fp#&ODZ(_%``I_RR;TeQtz<`>TfKqkqr_f>dzZ& zo2y13p^>v8Cey-e4*-tR@z;A|d*g&_vPrgd!P(^NIP_`&VduFlcI_1)wb|shGM>^G zU7IHXG-ifdPdBdK-C()*f=8^oFE{5u0f&1^J2Pb)FqFhWVw66o^9GZ!$#qPGzcu~o zXVTRTLKx-RYXg7my7hD^gG%J5>wzChc{HV9gfV;dZ}tu2rpq$Isb3DCptOJDQv@W@ z6_;U@2mWFq-9Bsfn=nR>v{y_v4&AzYg5gre!}3YJw!Y73dD=_&9gl)+&Kx1z?cVe7 zroZQoi9UY>Vr&H823c>IHxx?>>nk2?X_Lm{;_IM%5z6&RU#WV{c%b=&<&38+Ej@ho zpfj}V=k}JOKR)l)d-7PBS(;ma=d4yLV7KfW;Gqg(QPC2Jd*vJMu%v6B(CZP|cnvz5QxY&dYnQ74`MVBAuhC#t-4$uA5eIt17%| zVu0|v*-CHb0{c7tx(3c6)3k$ym8Xm6enkF-F}a4&corsT(b3`i*~s=F<0EH!l0|8L z@K-bN_pjj9R$21FLDdfclTr7G1L$vhM*5V>d!&Gfp#|G=`;zeK{2m+Fszna^az$z5 zp}Ss`Nd3#+qVTP9&%3X#g=6>4*Ay@AbjIDCMka~_y5;*W@xo}0AL7ZQx0sbEAU=|j zkX_i2{VZ?|o*mP83|Gmf|wtS>CmU2T;O!i=x}vuTob8 z@ulbqp-YYQcDC>m-wbC?;<;Z8e$i(t|MNy$^BKWOfzUe1SG=|Ngpwl2^a|hK?Fuc` z1l#>2W#7uz1S9K_x4Z)jE;9GczCQe_!;5_MZSB_RkXm4&OZ_`u2waOm7i;$c5}$wB zbrXX#VBiWH1|0J;?+yxbSbEd8z9|8AOt@3BJh7upvdb@S2U5ujcCbo16+T@}Ez z+kJDX^h~R4!RBKxyL&x5me^CiCm2ZV0RbaPY+Nwi1O?c~5#Od!r zA*)yAgF!ea2&W2Lw}iCJnm98%k{}GzSu(-0(+-U4i4cDr6 z(pe@ZvWvzp3xj<9Vd%XK4)lZF*G9w}t9#z|2R!|1mU_j*-Jmk-GVjL^ppGUdA>5nc zq(AiWQ~`yMJ>%35YvTiuB%gGDsO0kJz9(QJ)Xf!#fDT(~*f6@acD-ZqJ>D`FxoJS0 z)k?P@Y3wi3P&`^JMCOvPw<8ue*L60j{mp*E0XgP`KfGGgphL$ml>Ne79JA$Vu1?9` zFYDd$kbZmu&x>A4j73xD=r#C2-j*Lv9X=A?hAh)^f|e z>oms+Hz3ce&p zYc=}^!r`6WaL++UVo9kM7x0^~PwD7!Y)8$&&V3$PQ(;pMj&2PlGCIowf&K-}^e#tJ zOFFo6%X$|m3L=Cp8q0A;)zPac_ma?Ur*Gbo3#-l8LLTY<*1=%b8wNUmp_ zg=Nx%r+j$L8V@y#3}~w<`M%&2RQCE}<3V&+@gnh3}^~_;F7CF?3WQY0~RM@h@+6to;AeidVcEoJ{_SPTO%1 z&DXpdp@@E1|>)Z(--#eU$`BM#Rr^j>30x*|u zp+6U^PV0LbCByTo8!rs>w%tpY*4w?LIeo9z>N&fh*~F`YH$@5IYpeWDH*TGm;Z;id z#~2h-+Mp0t!K?uB^6R@=y-kmB^5 zFHq&TjY-aWC>}If)!38HLdJt_vVOA?=tUBt-B)$re3$e^WKcb0VofjDFm`FP-q1T_ z?ry1PlCD13mcQYK5u#Z`H)vRPzG=~f@vL{#%=^>EcCkJfBg3*&^T)dwg=AJE8!25F zK8b6bPF19<&Kz&f00399KSbA=r|``zCgeKfvk9I=yCgshxMjlWdP3V{wUC}B>rN|T z!sQ2Ef74y7tQcK&BZMg_oBunK6jKUXZ!>41mfp*7Q+|8BJZrq_RPn_;x#XoD-td9f zLT}*uZ6GFYiToxVOqd0%jsf2gS144gA)$nzGBLH~+YZ~EbVJ@q zie3noai22A8;-PcW13m`QY;%bu`68(zD=g5Kfsf_$EH{>zU?VK(J6PQx$-xdjKn1t zA#fNK=KRC}<{D61c-rvHNZGBig=$FHo^yX;LboDC0+GmgZb>?_WB8HVKyGI6gcu63 zqjzO72J`jq#cE-NJcveZZ29ioM;)n+qvu}!_kZZ1aXmvIPC9`TlE>k}C+sytt;oK* z`!8AF>DreR%g?QKvV1bkRhOO;C&k(^Hh>HcPI4t&A*KaVQhrms2+1nFq=z|(&D>YP zXr~Do_%AGeUi1087T%5B!2`{RvFh7C6*c!M_CCT$IVFp{xtW=?;{`W27CyIg{F+KA12el95;uFS|VnLe00665-n_*Q;g~?v8{vCi^0vr z^rTod9(^%^a`*3c1Jmul1H^bd$q|8mP@3tFd~T0s>MKLDJA3xbuur8+N>T!1VnW(y zm}A_{pB2zIh41Q)sk9&a3AMGAOE1iS;o>zvr#m#ye|9Kl|Md8*Tm7vk+cEcHS%jnY zy;V@a8cx-Y$JV5rXcGj-m1+#km+pVZu590M)Bk2u{W3}D`KhxCh$ z=Nda)dB3l1xG#EPSm$$)6OZzUH)l7vHa!A12f;L08G>i2$6L}Y@5+9NC;PY9@u_M_ zT;HiWvy(nxOY7W9pTb>)=SeKwyb>9Ac3lE-dFs}Z%X#vue(ZF=?p5Tos0L=DrvC3A z0-sfe3E&4W@GTay>?4=DUUdeT=%MVj^0Ge6PD%<&$7B^C2#Ks#DSo~WRY-XFLP;ao z(dn%5p(RX0?%W!j^$Xizi!E#HXkQZDL&;Hhx!iFXJ}Hg_)Eaw!kboqeTK$nB)UfSV zT73)q4|dWiFlBi$0+95$>|By{d7T$$8&8>kD=kB<(7DV|3yH~I+!@zcCumelk=6VL zrf%HDEfucx4agA3#m?QO;{S+WR_v*>oUt?{hNM(%t$n||k6(p-v+*p}v*1%BqlvV` zrwFQ>_K0uaxph{1Ng|dY)Q!|$f_Q!wbe`Os^ICdyR&ms5=zu%sI(U41J_&CgJ#ENb zG(>Canv?hx7}jhlv8&gsOHYRLzMp)mPn-VCR>?gN6oMX+0yOhp9S*>FKl;Q4L(L_Q zRio;=4wsuWs5S0>=G2-+J&iLia{cJQd@=K89O!z}e9bsbe7ltcIgH;28P)S|CSp_HF^sh4n2GP@}=0{Rzhz{iP!MU>a2uy zRHZr6Kp9dNfo()L?E=z(UxB>U?pAi+Q=z}efw$HnX9ws&%w1V_!gGd;6)$2emn_oW zD0#?LI6?LmOcU~pHT*0T2+I^jVVs}$R%O23Sjj`viv>T*(G;u`{OIO2mY5^CjSsSt zAYf>(xaY?Y6bdE(O!J0j0i1g`MvYnWORP$;6`K^i{pfrH-Pp_bS0|cc z!qC~UNWhIbJo;O2+d;rlFQJ+5U{r2%4FKao0~S0jLpVYtEw(kkF2;BrjO%P6dz@| z4@I;X+t{@#4FpmI=xX(X=bSVl&twi>vvGbRBx%}9fktvA3ahbRc{8^@Yp!9gR+|dg zIqE{xpKopsbrT7kzI-6dw%Lhq2#lasGn&{M2QQ9|QTd8%M&&+oXfX&DuuPZSpI+5t zr?QiFLE0u&yK9tP+@rtG%HID~-}(`}b8%KdQ@AF-DobPBi{p^&Byg7<8`xj_@&m)X zR_MHV*=a<1z3n)8!ia#TMwhUVHCHp=&y-vv&6DV7w9k)m)684O+tdT{w6YYJw`gPK zM<=!v3J~|24h8RrnArx1T^h9SFRMs|pHSqEClWlCtDjZ+2e5c73+zxyW_Yf00%jh- zqg7p3Z`Sp8ukZx|I$MdBqbYnFH2JmzU&`A@9~X4Fxh`%QeBKb zzczQ{fj|Zosx^-y*>37Sc`${h2I6$)&MDK&x=}dTm=AmCLE}%arI*%>T4U#Hzp-Om zC*8^Knsyy=Z9U@cBg!tG-8h--`ok|d=*UPdE+d)}&Bb-du1T4Cy;UXhsV&ah<#na4 zp#RqwJ(a-ERY8ig*vvt`&~BHQGi#hqNH4ZoK6+g23s0WcS8wt%bD@kOJ9SF796a^!Q5 z*80+J;!sR_Z3QOnmx>!Y4DT$t1XL-Y!Rd~vfZBmb*;2yw+Ku-s=^OBFEBv=NuK;_e zmn=imw=I>qxAqJkbK7%o1Kkem9FKFaIS3l?UT?zaN@iN4b)5Dq?%vnqh! z(-s1Ur~fJ44t{g5I1}M@K$*hL_-#1lCJtx=amXw#^1zs}G_|*F#BXXxBtwJ%#@!m% zHNtHmJiN&k;1DEy-7N&TH)>CYVOw-v8@!R}Q^I$yQIvX5^2wH~duvMNkgNFf3H2`zh&_Bmnw zt3k0hx*5)-pCe+=sL8uidU?qCxxL6+#-dWE^i^=^xUniXz)W@{ipiPoDhYS69U!6N zF-fvoMXz8er%!!AY4JJCt45~48eR2uQNw;?ewkxwZEM2}XqkEUjK#hqxGQo?cd3*9 zAHw)Qpc}WR2iW_-R%pfpJXTQDg^Mni0ecKfafvZG8(jsrM-GZ1S*3p&`IKrdx2Z7~ z{|D=1rhT|L{`>$a;qnJTs=vV{g9sr7YG#R9u2j#&#*q%}bv_DWJ}-VG15B6<762}S zyOLFHCW6(bT%KWTYaancZQeBtF@Q=*b4aCmaTlVB_WKGhcdqvV@)u=|@QVKIwZG>B z5HF=k#FaF;MKN)@Fyync{}t(`c5;XI?Z$2TK*ZDw4_6+J;q%mibKe1FkDCPPqP`oG zpM5m`?$LET<)-7XxhC@isE0Q@hrStxc`SDXNJnj*w8RVWz19ea>i%CyAi&MnwsI`Or-BKSk*L|SnR+dHDj)B&#&JaR8@S* zTe@FmMe9PmD$J>$`u5v4xyAj?tLdyr_S#S&4`}IYak&p=|VeJ$Yo~-VsCCoQ2Zn>g>?PuG6Z~srt@FRPsG<&xOuEahIq$NBioPZvu(Hs z?4^VjW`C(#z(KuTPYM0opprSE3Tqb&5M0!&t=!sVE5g8wut(8IxAHkp)7_}NMCp@n z!PgXp&nA@Bz!38S)h_Orxn-mccT$$eG$&pbnW#<$Ku-R&+WAw-9$XCp5~9+3@;L5! z{7mHRee+ymZ^K+QKao@aL@+>)zi)GyXj0j*oM4|~bn^YjU&H$yIM0{AH+rPwc5cZ0 zO%&~Q8A${NTHQ?_#>I*)3^9AYb2FX)r|Mp|OSyaUIU-*;?y^M}?0_D&-!QcZfAM(} zq&}~Le$A$G=MVoz$arUPLEb(pyYHP7?;k^SPfu*8UqPs>frr_$!WeNuq9~D)a^q!u zPW!;kcAxV@w>&ufX`Q~uqPUatU0cPZ)lXKld%3(BCf5JE5{vX0Pe0Vyob^O=|Yu`KSlp4#N~$C9Z#5 zD|;+CfRRt*WsB5g!bcwL@a+CkTaxs0Ov`Z#Pa9`Wdtz|_Cpl0~r5Nkw*)$_DGJ;)5 z0T)2ZHY@oykFevyKMNjFWgEB@-y^pgvznxi*07|)7X`vicY7w3y_3!Q zI;gENk4UjITSN;=he}UVdf94u5Vb7sGl16Y+g_;KUqVt%TW(~{4fF=wW_B+}hMGuv zk2V%+%>gax$4Z2G7ev+QvWl=km#`XIH#IZ%`~D zo7!E>bo??r^}@#0m@Z5>i=#QPNTiTZ89y!?4XOE|`hD|E?mXD4 z4iY%X=|sETrpwz-ZI1@b%5n62u3OQzAsF?Bpv9doF@AOiMe=#lN<<@JJ(wg=9Io41 z&+~MqU;7GAjJU*|FIDZV02$^c;Bc+)XRaOQgLK<>jYuwIcPgKZ3K@t003M)?3ur(O zeV1A=l8y75_gIhGkW0{`u9I>EfuHMOThPRCH^yM5sI4aN^`bapH@6; zoS5^@ezMpk@?~ME_&A1CAv*3KhdzAgnnQ0U*qI8*{*lpr)JmRrVRyMe=H2<*Sxe7{ z-+t46Ghp&!peZ68^ z1i754fi3G+OK4`Xu%iY2d~XNmu+k^-4s=W9)92KSZFL;cIk!SYy=0GdM*6__jLbtm zc&Rxye1SZIw&T4QOGT?BgVa1XZ_j?y+de^O)?R^scydPiDBQR*-yfwxU)(ajlYYq` z7^AqD#0Cq_Z`P___p=;6JI7nEDPQe4&%Fp6-@XBsd>!z(h-^sj?mg6U2db4c5LBiT zSl1(3n@@op^o0p!2*=YT-uNaXuV4O}=7(F=_d7tXD^yg-A4hmP6jvKL(4>0Wp-Q-W%kyNfx+OC<@n$#PLD}QS-_~hIX~$_8-h0_N0K&peuCQTnAJ7o$MLQ?UyIx)=!9&$ zKQI#$pGkIM5+}0#L-?|lZ%Ab{=274-(bBp%iF)0g+R`p` zoRYUqFAZrLi4nPhU#8H6orhlgA@gj9t-HtopR>&K<-~E2g zA9~c?zxx4s);-@N&RX z2vrhpP7=1;o#%IHMs5)64c5_M?WLY*42M&vHS0tb*v&TNQGINrETZ{^ ziRuxPgpgwNj}@Cr2^U+Vb(J zUriaF^XiL$&Z9fC8$U0cjVs?S;Qv;?KCSDr0e9199Mpion|X(`EzVvjz7>}CG+6q~X7bJ*o)3Np?YOtx{2Yo^ey%GfcQlY_kXnqZ&z zCQ49ANi)Ba|9xuzA=8rN5#P9a{@5o+i;4YQ9Mh?vhO~6c!s3z^GZp*cs)qf9JRA@iW6!V}HzsN}|%?;~+q92}>eI2exA1#wj_fmRJw|`vGI%k}p!mQ`} zTyCI2c5?wDIjTBy@{c;Kn(V~Lbmxsu@zgMWpZ0S}%Sxs`@_;w0e$BTsjjN+63F^>@ zbR2jk<*Vhf2D&)=E}FIQ)k_h71hXqDWwX|!xJ1y+guGBPH2))Qv;m!*MHJX}%AhLo zZcHmh^41W~w?r16eep1-BK79OX*TT^6Xl$lsGCXHwIyZ8z8stbk6EY;HG!=>rIiDw zf!-Rpw&~D8czU8j+AW;Ut(BWPXNem-CxH>do&#Z-nbIF-Xw+=9_%pXD7TB~eV<<*x zMHToK)$<7r^nZjGD_#du^L9OGKHo&kA9n)9VY3GhMr$|dgW|clpv@Tuk=-#5H8S@9}w{arF?Y`mOEUA^HxVZ z$d0USdl2W;cwv&!QL{z$_z8zKM&I?(TKl8pS3>FK%JNy9=z(_t+p|r0TJw&EJw7*y z2Q@J0a+k9R_v}f~VjSlmk72&H_&mmo0_pP5MUrV3YGm+F!i1mE0ZX&P2&SLH?;Y~0 z3co}Bt^hjo#DsWG-iJ{bqGTS6F#0C!rNOIQ3Nkfh-?*d6uBTHG@cU6&!23tF@A&F} z5%aWeE$ug{XM;f@?>ji8rZq)zN%JWh_3J_~3(-k6MsmV3sQ89jy09=hxqo26 zrKGEDSDA~^nA1?Xi~ODB|K<`jbt`j{rmSo0AZOpo3kJ6L0S+qhiy#wZU^Klw-GWSo zIlP8`sbX#^#ondpK81F&>MPyN-LDT}G2kg*)JIrxmm&+(FV_F=i|!fS$bS^2X2i5U zix5C>Hv}#{`9{9Db;t`fIOLN{Q@AVVnkKduk-#|C7`KI~)mZ;+Q>{=WRkg`ev zh4+ezcD*WezwgRb+nZzqFrBFYmU9(n zm=R(*Uhd3ctAz?e+2Xea9}9QGXf+Lc@Bb5J^6y=de6VzUaDVWz%q#A#dQY-ABSjrwcY&={I+8?_Az2fiCSf3#R@vgXUub~+@GlI z@=^50e;w`F$Uk$ia_WrK31!6TblYW8WC!t0knB^T481992o$BpEqpBM+CxM{{S#@fBhy)>DJXfopV;EUx~2vE7wK}0w2?}#!_YP zUs4{r7S2=RcX6Wk^tu%?bvhR_ z2@}W&`qTZ{^5$>KT%ED^Kf;>#pCwwcq852I=%Xbz-VA5lJ-*S3$mA2;LeMLVQJ;Jt zDxVNM9fjT{cs(1K7XyP)BF(sZy(Fp1fWhFce0dgH6gsCq+NJl}$KbfUh?B2^JH+8t4?b?5hlt{ zQ%)D?aNzwgFROREx(IV$r#Z>Z;LI26KYSk|2D7JS=cTG)`aLhtK#^+(zjy& zC$bA;>WS?Wc@3O}gHkU_#cCwaY16as`8s71`-E<}AeWaFSG!`bg+S3L5~;RQN}r?{ za>1ryrudyXmdj0X;*(&p5SPT#P&8;6GWq6>Lzb|83&THZ=n&@X6 zVD?dM&qvz7w)_5T9L@IT3B4DYcIh-BNRNiM5(ksfT>ms75K19tye=}PF(*L-Wh+%9 z*0iyq>0Ky$?Ik855#QXb=|r~(WNDPP##lD7#~%8@Zok3g?>qF_!nVd$*W+X}2AUT# zz$;cQUn4$39Y0g!a%PEZ3Iyr>&l10bBYV=%h}2>YhmOn-^}J;a&A{e7mP@mQmL@mQ zpcH2_5uZm?`j>HfiO-$zy0jLlKUFzZVyora_Gg)5c6{a9BN2<+In8pAl&6*4Hh}l# z6(Z}RTQB_OTAmv_dct^rt$F`;`CoRpONA~>}SGbn}~oWFiP0U$V8RF8~2`xOMwz|`f6_YrntcZDEdQP<;&NBd!x@x4xUxq z*(*5@`QARHOZk5|JMW;T+GyP)D5x|Q1f+_n^xkU}L=*%B1f)yvAiaiwNN>`S-jUvW zlNNgKp@iN8frOAyZ}`4*&OLMH-kCf1&+P2k`<*rK-g~|4eb)0+tuGR&&2d%#k}A<0 z&ng{A`0GWkor5LYoWT~^W}#j-nPC@D@Ubea%;3w!7iCG=tE%`v!CTFrvhUXF$h@#I zX4*fa70AvhX4{Jh1Mt~Le)gjvs}8jD3a8Gc%{fIQ>7sdzh(7g6@Vd8r@itDbeejpi zWBhJ~+1)K&Jmn6B2J83VGQ$e`@yKA@^s}#XYabLkY!!~;N9;TmV4T+ZgJB~JP;SRC z&{bQD!8~B!^BfzlMYSHMe@ZGI{yVf`z`4aL<$BaQ&znuFHsUt_`TCxL3W>hfqoCdP z1>KhmqmQ~DJO!U6>LbCk{rk8ae)Q(ZoZt8z!?ltxxtqBu{cdly*`hLga zI%F08bmtc)fSCk9s$gvERh2ulFMZ-ul;9SIsU^a_Y0(Vg>u2Xw)F)+QknjN$CpHZg zl1C^%PM5I!Dm55}avp%nO3Igi0rDfrPMbF;)TTeSAEso8RE$#i z5f_V=TEUnOwhijb9`@cTZ8)J;*j{f3>Gy3ru!3~$Vp3{DRu5Gcg zU&*1dZ)@hrcg#Y=2G0y@v*L?h0;7vA!N65!o7^pys9ogoLRW|-oZU<8YB0yrsqz^q zokme(UwP)6{jV$c@oJW29?D6q7Ze`BVXH4Se*HG{BwuAMpiMJ*J#ZWGvc~&qP0_E8 zg}KH;+e4U^PLji55i~%nz)fLF@ztXj^idZDl{R^Jtb}w_^)h_Szdg2ueup)?Ejq7L zfD}}8ZRzvxwD}6^@LoE~)O>73MXtPoCBX7+ug-g>1!G*0kR7+aSe*USX zV9Fwmx6{}XXoNu5P}d8bCPF_S{A^eA&e&rxz8l9&zV7;A%Vb*;P4X;M_-IZ@g0IEJ zLiqyxBB111m^Ii4O+4GA{uLyiuuKk1sr-}CrzHqpdrJ2#tW`B`(3-!s)*MBCn2bLQKH{Nn?7DA~Dy7c7>k?6+f4^8?cl;FjxgGRetW5>-H3o+x!p8FD;#Did=6cXp@4vISqw6ayK`jj@ zVeM-|8Mc;p(|bpYk9|`0k*}im0(y&ugK{j#bT1DVaITM!I8A0@h|=23;PNo|!0Z9n z%~~!QkQ(9b)Q%hIaJN&WP73)(oJu&J6R;izD(D|x8Of6D(vgGmId}D~5t8wF+{wg| z5q#h)mCQ_%IX+mpF&(JShMBa&{W!0Wv%#%;QsdX5qcc{@xuendgNvwpPxRFZIC92m zSV+y>DXc#4kC4ms|3g&4yQbPaRhRpkW_FC6`;AkJC#`_{`;B27#A?FTgk!$C&c4$s^^X8vgF@AFWsQdctR~s0;qN30kn7h>sVuWV0XM$Iku4V)^v~*b_}(Xc;Z8U5SUVTG+*a* zF;>dd3^AzvOe9M(kLOjYwPu}wepuOUZSSZN#p+`!m+$VSmJwo!`#ELMI@C@4^p%*p z9PcSk>D24vq&3!BjF&;bq63m{(=e2j{_7&Sfyd;*U{wC_pqYdKt2tXV-(S_=iS^np zHXc@<#p)RW#!jX;P0`PF~=jP92-6`@NpDgnY9xqoV<`#caZrrdT zg$TaQVxNuaLB1gBuI&}E(9jT~0!*Ai?&f_0quL-;d>Sh_pBMlmp1`NhGIsfVTYT{& z3k*ZM*~c86Y6jE^&`+>;K5LaqXPgBt>_7#r9UTbcWZcOHC5#|{UIQvsv)x43Y)7@k z=eYDst2n3GeyP=bBXEOsK}cBs0KOsE-l(qbP65y6O869Vo^07{2H`5ST!7!pZi6U; z5_b;QwIor8DPmP_3n}I)(|3|K>)o2u%qOoNejRoxMRK!-A&)xjx8y=dMmJE09FlzUCXGfGpz4M2pIa-c?CNpvs{T3yq1402Yx1Ik;*DO z_jXu-y)(9emecg+-*++{5$9+XbN*w)=Vg-Mw+aW}lm}n@UKP`y2una;o#Uqbi7ov) zU^zJ4}#M5HBVj2lKBS!jdufOljlQ; z!}1_hjl=K5??gRI;8`Ic2ZbZT0~p>*!MnH=`a ze$%4lWB_R`WS~RJ^_cFd5Wzs^e5?{?g}VT8)lEW2Q|FQmsP0|9yT71eb4OpG|EfG zKa=^<#-CHscaX=*)KfBmzZsV66w6qU3iW)I?dS_PZWTeH&OFzWcU|(21MR3iD~;G4 z+6PV&(hQ7FUfMSmLKjRl=MP%35|?kDYh?lB{$!Iu2dYqivQ^v^n>-0A;Yv3vL!Sp_ zJ09Z(sRjXW=sgGb2QT>Yb*{E{pIi*W#XNX^skU5uL5aiEk{-R!lW?}oThX239|?Yf zceXH=Zz~W|P~TK@ez6;1#lKv{HD<6UAcc>;(owFaRVOrr4_JMO% zZbVW1YlZM?rQ{WR3CoFP5gC88uRb}sWS9`sKaB=={3Y)6O&Ps^0AraLU14yzl(wXQ z*;POH_(^}oL@ytQzCu4-Uhv(aPt!O&>nLr9TDf|${ZdG}zUlRmLUlP2X$&Dv)>G2X zE;#w7A(Qu1>-@1NjIkd6q`Z`(6@`XgLR56l8N!5lL*Zkb#1RswQ=k-R&2dMu5b(0N zUbmUtb^Ep?EoMh-JSjM%{?o5v>7R}D=@?P)sG@{;&>MKje z5q}mUHH!liw=XNW^4TRw-r)sZ@OD9;{kbY!gcsED2-vl*9DUKN!DHc%?{>@=V&q4c zd#>%z5~$ajo9qOR+X~yw3rWDclG)!3JBTROe{YA zSii8^d=gGrxG&Kcbr`e0;yu z;~iVDI%Hr+qx&(fZyU#_a5~zwIC zzOGCU0`vLD4`fOzU`rZ5GHsn?y_OUg>Vu+c)|0Y^Q`{mJTWl>xKfox-*X}L^x-EYF z<#Lf8ttYHK0v>H&Wh#s;xZc^HO}b%{F#syjaZ=BC+o7Y040? zI^WGvfC2lu^~lyI`Q1+Z<%}oQ2zn{j7}_9@*w={hP8pOTmG)4afVuX8n49mDo15Gl zM`f{-r&9S8@@pMr!x2*pPKlf)?5S4NobJxj7eavs4Isw{`<^{ndHb`iVN-cb%MD8t zk9>$;zd@9CVk^g)gUNo!x^0s@UvDl-RcbgjzOPL-3_FOeRn}e|;+!Y*1s#kRl?Ds_ zv!pVMA^hh9tG6r7ui?+jIWQ64NX+j(vGYzL%OLvMrD_-x5TMa?+@L}lrO}iOvIo6L z+Ltv}|5=~?@cEWkMB3sHo3PC3>o0s@a7uUU%EcGS6$^sTX44AdR0PK{m)TeTV5W{F zYDgQfcj0~gf%`(lf*VmILs6()G_C$QOQXflP zd~dLESKaDne?YVFs+`>*FMoe;l&uz1w($)ixc-dw0BrWnCebZk%rYX|w(81PkOWtMXT%N1wu3aWYEo5E-er1 z*IO_2Md)ZJeb~s2WAvJ1&koFvX6w|M!3~xhV`eJjw{W}L9NlSAdk#+EJaqk#ans~o zJMj0jex3GJKa$nl_Hg`9d^RpvzkHgF?Rl-XEqKyroCHMT_c6h#783ICO)$>&#S}BSOd$chGHL; zbMVt@7S0=|*S6g9G-8c)EV9j;VH0uh<#5(}!+O@Pk=ZpjF4!a2v+>;WlP;&`DiCjL zcOF>saky&ZJq@XJ1s5Loq8Xv#8ml}1c+V^v4g7AAtzo^*i-wzGN%t(>R2~jD@dlYj zYqZy)vytA#VMuoDWrm=o;IZU%9Pp4m*clM`1vhPi;`>)5M%I!WEj3FRvI@#>*ot*v8`srz3bxG9rxPeHiknz!Z%lr7Y)EWYpb;yrPb*^S7|T z#&QB#X2Jh`np?44mser(1aLHonyAT&wN_B8(PFNJ;^%463HJWSF`a+mDjAl}t}Teg8;H&>odvc2jG zOx}#=-lAI-ciQz&2t~8L(wL}ArGGghqmQ-P@TR`>Xfnz;>1J)ZD$ze3jhuI5@PZzf zT}^t)3C0ln&wX{+d6e-IzA+Y_C>T@F(Th_lMOH)0qp-k)jsP{dRK|qf=ahbh(6r~n zzpfqj09h42apzSv7PTGE;kACdGm|0Gs{JTF=i+VD9s`NyldCfFmBdi`vo<@+-SIx| zVaI4v>1Pa=t66z1=%0C)HSu9AcWT8ozK1gD|1#~n7CV&q&8N&^k={2UL4Cd4`hocwG)!H;K%UGuv}+ehQSMcd}H~hrp9T^ zMi(Y^xdlWnX1g}NccBQ2zKY(*anDG;)wcc9TB-Ym;B(M7Xd6Q@VZ%V@E8>SwKxPh0 zTO4Hz-4i)SA~h8}{E|24g}cWk?*!Ahp!T4(r|T=k;`R`;ZKrzsc8}ilXbwWq2PNA9 z+{oyXFW0dVdr~yh^TWBTtYGu#5J32vq|j#2qG8-s-|MQlH=8g^C8BA8qTx!>K<77+ z58D2*W%S%s^zEg;$^?F-d}G?7XH#n(9NdGgl$96fTiy(*ERo94;3u2EsUrkt8^9_Tmx5FI^edIK)rMsBN zDS~i;>kr!z9@%Q7J$TN4fFLTvp{xADFcd?T7Q1CXnC{CX)H=gilgNAzZZ2U5J8^p) z)qDC@{P_@7&zV@k#wXis2K3Q|T3ejV6(ZE!Vm5u8CeT&YU14me@Mo1yqys6!3qQa2 zFbM*v;}PVi64ES=JXL(RVl(Il!AAA5}fu{!rFgg3L^GMumXM9q~F5ubBM=5zieZ#x*Gv>1fu zRXsv?7+4m!peke%CgNCWF;oD{=7HJPfM3}JRdJn(d1`0;ip> z*3~5JW)|<>W&bA1`BMqq9NfE3!uS5oGeX9H#>@ZBv%D^%#bpOvA0FOjx)T^ZE?Iv_ zYv~5?i#a#u_?eNKdfUfQ3H1qbTs@o*X$s&;&$9K(iu9PpmR;vEl9KqpT=j&T>2{T7 zUj;gzN&T@u_K_)nY3WfKVkh|RS3DBR7xPZ3BqZ+T)sncQHSTqRL`lfxOgnI#9i$mp zcZI>Vei6VeuCP_3&u0CDK{&>2(E4a3Swz43ewU9-DE*K;tGAXIXRF|yw1k1=6=Ld> zik6voR^Fk#!w98A10U;bvg^Yj!N<3CPwTY=K%(IB4AzF1ZmAKtGZU>R%1G$_J%l?e zO5>fs!y^<`GH0-_Lq3?T{>1?BkB*5fQvOH6Z0L>#;%S9lU?9j(10{0&^)c&%rd_?p zr+#-;=ry|e6FIMEj4-ta(H-)eGlnB^U)bcTCZ#RzEyN36az1Doe)!^Rf)a>gvdX8f zK>64({nd|msAJsP!z|_3{2Ic2ZNaw&po84sqs3;gk(;Zv`Q_`W z>@(_a3+plUNFVEs9|yuAn7FaTb$(v1DOnwSSmTuYa4ON?W4@Z@a*FaP0 z1UDR`gi!zO?WfGdq^-YCMU|iH*>xm*pP{6=fXoGfjYBvI<=^8k59CO2_c(YIRY^fS z9XKl?bS9aVch@8~DkH8CmK&qkx3ui8r|UtLAx7^!(`4~0oquj4R{Gz2jG6!*(HT48 z-Kt$UKZP&z3Ia?S#)xei;sncO?HFTXU5u+I>tuN~kk3EYYYUt7ukh zSvAvv4>pnr3Nib4Un{!qBYu6GQmR)9=l*m+xAGUam)EYwz+6Pcskgf=B&4;Dw~B{f z{EZ5MIZA2j$-;xkwHl2rze3EtIwdP+ldEremx_3QoJ#okOZaXgnbovSw3Y7D8G2NB zMzu?wx5c|$KFtYw@Z+OjWdN9^*Nb>Gw}Vmr^$W#`mAmK;cE!K^QpIP_i@|chPmM8t zB1*`xO=}Smg?3GAgGR+rRB+EaK zVxYor%Fn!MxBp260FDvgBnIFnsmPRrod{)O0zB6+OxF+go!DCcl2J*@C>ms_%X{{v zCk3?!AIFkvwc)B7@*@_pfP77tuwN#ofw@v!cTQsT!$Nx?Ue|}B#Z_2l%t--Q(Y62g-`C2u<bY z0n#xBW?jMdaZj7au_ILwEO#v?q`sJ>V(U`d_@>Xo+_+bW^!qq1_Z$9lb#q!A zM(3|ph_Ld$ynBwjL-G9QNjocTWq6Ru^>TpEq#PaNQA?z(Lhrd99VJm8;SJZ0mTc!kDtQseXzaC6 zGxYhQaGLJj&$_gKD95p0;NfDdC-+?8DsysTw0Ma=^D#DVrRW6)E3G!*3JT1LWV>#@ zL|8Fj>UFO>90??tZcR7Pg|`FH&iX0)>Jy3BI91?jw85^@HE&M+z~|CS*nmN|7D<&k zk6Iw5TzwZ42kh8*8QsQfLOkkbKC3>)K5sAWxl?l>%rP$u?guUGs*xPaxzDggdp>=C z?Xe+c8h3aB+qDW9pAvGM>x;6^2=B7EnR?=aD9iMbFx^|3yAF9Md!77rceH*yP613a z8u6BE?!_-ofwSR+KzI+zLX0s&pFLSPr751$CGdvY%kCx&jIaqD_y9*HD)$exJbFiL zL2B~+NESs~*Mgqc$kKPJY5~FDS&&+q3`D>FGyd!Srml_q$oTKr&8slH0<%+T?Ewu; zLtLJh#}@4G$PYa}Azog+kP)G2{Rb44Ump8xRzaApuL8}sO7RRcBma09>84GCNr$GLq5_%#FAyUj1&`()% zl(3+x`Mt-K#&WMsTftvwlGq@1O7gm~+$5+h_ao7CckSqp+M@5x811ZcA~%3brZbiRId7SI#Fh<9V^ z@XBozq@~+GPLEUXCePIqT^yx$Gh{KL@M`vHSE$xA4%WscrUkhJ^Qy81(}zb*whMBu z_H+QNv=`jHR9Sul3SZ~Qkpy!muzVUhkV~7mi&-IcxLcv%b0DHGr#{3Y3L8;o{tpF&G?{9|u=^1~)2_H=*lMK4{ zGi~1sX#`scn!^(|T9p5WiM@!u@u!F7;FWxR15KiVtFmCn$-LW#aWff2y)wp42Ey#^FNo}m}xpUiQfQ{8mMfBN@y@0g-mwPt2%q@3QL zMk!-?dk3kAV*Twg`|-PC!CdGpG6C-hMo=z=hJ-_$jL+qkz{aZ*krQ2;sEoDCWVL2( zs`MmTHaGZ!LHja3fMGdQN@C$#yQgp^PwMG4XDy*O#XfBNNGb2XfH=~K3vdcpOlh+2K{d8+A`@MoBTi>^A-yBgX}4aro$UEKyV zxdm~%iO$z=_-^j%*Z3((;98tMR3JDs@`9L-nP*&|pO!+P#DhRE#8k0JW~WQj7OVu@ zqFkjBcGwFrMUmTk->pPZwjCOkV+!b3CC6f!@6{Nv4}WR-{;#j}0p3KiQJ?Ecc_nYS z+sQfy5x+t+fnxb*4#igyfecGI0z32*IG!G#^syElrmO0pr_R$oTjmTyKBysW!FKZ@ zsh2)i=u0}ASeh3LQV(nmlT@3tWZl_C9uOsh4C{B`uM|R}kzv@Iw)b`kL#ErFL=e3z zH6f~4(q6WTTB%eP93Z1JeUnl1HkSh*rOZi;4ukpKiF=(G`&_xR3kSU}`J-$6y@eFI zuvXYVqf@8jEb@eC+vkq{d+Fz=0J`=m%ee7ffH{2i_!D*@mP>ufDvR>;t`! zmKX#Z=IJa(3?7+;eB!jDQ{@++*6hXb<(3Ne^|f23vh%B_6!J_>|J?#>HU<{^yz&!P ze|E;7^XXCbT0L!gNo#Y$gLPT8_v1K^NxP5lq^x6j7eo|gzFtKhnThqN7UC{`SGMa? zE{%|YTnj25)t|Q_moX?-UZ_C(8+^cO>H4@>cNYkC$B*F`woBqUPq;31=!Wlr}W?MqUK6lg~NyK8bx)d)C_{R zHQe^zC&`0*kA!^gnFUz@l=E=yM_@BBUh6BiBVGnTK3X`>WhNGQekF_guxun@O*+xt+vu&&DfLmt>oX&cDNK^bM-)`H zGD^dq7MhwOi*^{}TnJJu*&^U7wPi?NwF*>`H?rv6i%A0TI-b2Z3SVobpkR_{Z>$Uc z`y6dhWtXcz$^X3jCc3Bo3DpGf;RwHPbPIfHOpDfs{x!i*+Lwj^(crhgXct|qpkrhTS6tZ9v!2psHFfd{SP86k*u%gbgi6V$7chPTRR$cxAE zD=Cc%>()Fgy}L&WeZ#b%3pN$W8Oma&%?Uy}Xc$<$H=m+nCE0GL`t?-i@qoPHV6&lK zbivtvun3p3`b=-Cw-P6>Ps^X`|5Eiw1C&!xPxJPt<5MwuGjs;MS}37j`(a^j-sx8T zM!#V1m(`x!1}#UBX*bM^B6%y>y^zYkr0Ik>PA*_{$?_njpcJzFe)p(@1e!{doPzG^ zq&aPn^3+fln-nK<@V#dBmeLcbBRk!L%57F&wY-$CQPx|@qo`5v+DY9SCzou(u2R*$ z{2rt<7R%EhG2Oij9MCs=tDTOnqWDB6V?Jq){j1h<1&vosaDw}fW@xya-qTA3O9P+6 zbq3hQNqc#y{&nwO$EW-Iui}oOVi+w#XL$M$@+=?-T|70@J2Obyqr$* z-x$m4PYfP>I_=svX!aggV}b?MQICq;Lq>QM(da!&JnFKNVNZVn#OBBn$PpOmH$y3R z)6kFGDuUa&Lt&;%5k59qtr8zETUMcI9dys!XW4ISiu`tcK#^q9xJ5L`XOby zt!~i(K`$hy;(#qZwx^ZQUX>p5bf)3H8e+ey#{96!u`vj<_7_?sTpoi>L7QALMna!B zZ+H^0qhU1O*`Bs@d8^w-T1;H(9*Q*e2tBD%$WHHfs|wqij?Z#~G=Jc*HOO&GaBHPD zSjpoJO#BZc44-7pVq%09V5bI&u&Spl3u%8P4FCQZBqKM$S-v#4+@R$|R`Fj+CxKu> zsq=HwEWCABp6lzAp5kk3F9h4};7GA`A~%?6me!0zFx`RU|1_K=O=YkC`Gvmv6YTOK zak6yEBVIFmjC$Gc5cglZ#WgCxaB=;t%iaBHpE1kbZS|d+FZ=3g&R>^3YFi!r36c#l zw_&+0LtJ+t-mues(AxRiK-ZVL%)1KEO?)Q*$v=_zHVK~PGWaw(X`EFGo?JiX5A@N8 zX;5}=UQ|HFLJK|^Bowejd7P%(bGDJTqK7|%w8lh z8==}*q0E!&&l*5p`svIP9XGp>4^AI)5%6J&n-YnaV2BXpd^q(~P}zL~A}3Xl<)3r8LM4-+#Bl-l_- z`4?lR;Ew#vnuF~{H z)!2dG@5CD z{bj?p#DpQY8-@(k+FX~0KJUD9%1!b5E^o@2lWCgIDChDmab?j+^DQ#b3(B zUHjv?=T!@R4Cl7;hOmr|*xr&N{sVgJ3u*K*W9OaEBiDL1XQ3B|l8ugEI4i}y>_jw2 zXC04fzy%yqDy$=fQsD8MAo~IPRr58|A5`^#28jbd3&+8Ub`It8QI`+?>K{BuYM+2d zfB%?c6NroG;+_{tHC%@qrMv+xMaWPq)9>#SCK}N$0}=fKBQeJN_*5OQGX5Nf5 zX)I>|E>Pts5j<;ub7VN(<(83S~GsjION?0F9-`jl4eU8mSXKX}z>r zW!L|m$g0y9V_uW$4P#gto`-=&lpW=m@Y@w*ns9@nJId5Pg@I{8 zTeKaoGBC2$g+6;m-61ypg?w*N8L~xKkokn3<~x7 z2k#ndr<&AyV&HPw?jIT0$7uqC9}oqz&Hwd8>N)&0+a~QYT^!k5Fj9IlBGll-T0_k!C6DAQlAleanPZz9UoHc zm~}A?9R@Kz!F(1gEv!rnofwRKL29r3QO@(=R>l0Ifh+!_1eOM6BPqRNn4WMkO@Drj_Gq*f5|6*hUdi3e8+y@(6)G_kv->mD5*#kvFUR@MoAV+r(U1i* z$d()!RoFgkYa34!g$e14!dfTDZ9D;7S|~*jaEog6D_M7oRX)SE)|3#@AJi+oE4ydv zvKGXF*MbjQt?mEUHNvco5POdO{{%us0h;s4Xk6CJs>xPsyJR9o5MnoyQ(+m#Bx#; zaKOMYPTxkD9RcrT0zE2={zOUm2+HOY8xLi>78=Y*yWy>mVY$&A#Qq$6ag4M@t*)VDGBl3InCX=J2Z`5e z^Q?M16uPwfUtFt;uT{I6f(}1p9MprH)1d4c?G7Gsu4$N2(C#@~gFz+1lBp8@jy!y* zdgrg&5M2!c-3Om(1Y6f*jd^5%qlZMg`yGdJfZ&w4)#En(c>mUSts9J2E?kl*TKB&N zv-(tCCPQ5~9?-)RK2r0?sNU`Pj20jJ!zHfrlT|iJSoqmiaKZ9fbIU=1FM+o{YU{ol z_k}->2No4&)(2t8NUTjd@u{h6mtG!iXbDgGyAAA{VCM$@RraXylNc-aL|hRY(;>*$ z6|~dcOP=OSO5k2n&O#^=sSvrPHPH!x=|%0l-_8%UnH+?%+uZn03GpTER$~EvGq$CB z`^z*4(&eq0Uz%H+tEIhZuXTeSLbeq)`q#d8A9o+W$6Z{cL(b~>IRM^(yBRRm?&)K! zpQnk4D@eT%#-4wT9BBuis*Na?5XhZN>-aN_|23(`YM4VAJ6bP z7vn7~ihs8dz`t+{i<&iG4=iME>MG;ap)O)ApA(N4j=vT!|1_Jo$?Aav@pG5Do?Shq z*SW81?r;J8t(`t`{dUk=iSEm5t~a9kdM8DUSh!F&-k$VcN#Sx<3wKSt#FP%k)u~lg zJooLDrF95j>%-=$%~RW787->jaaoR8Q4n7Smq3yAQG>H~tLh~L;7j46kPUQf%D_W| zO%`3{Xc#~BoR(7Kk0hlwJQt@ea-TRrXCu2fh%gOqhkXzIMnlBFmrXh&eglUOrDW%H8;*zkT4 zTWep$=CP3iOWGfapLcG-gM*S%|A~rn8Tb!QRB7W^(d5|Qh}H=Bk9`@vIDU(!Am`&t z4jM+g0xTqIBkR)Z36>G%`~S~~>gNBK5f#Q6o>3{%#ud&gbh^sD1yF(O)FM|3{VU;* zqH61z=qnw+v_T)jJx35=88E55vL5|kW5R^WH076#zW96MTsXt65mB&ItZ(=P{F{sn z_jCH3Bce@-OyuttkbRau3Fb?r3B@z=&-wMo%z(2FPyP6hG&r3bl1CVZp*jwhBRJ&` z20Cf2+z!&e#wWL!NkS}U5(xF;82l=9cf-h^XpZ(7(T_*JE~O*y42NI-3bFmk@b2ZW zXpX4TJ0JOHy83bjg2wJfOTUQ8=l%G>^eixn^`n)PqFTMMWv^q*UR_|Q(972k&PZ%M z%N^CUCzoqpTlQUn&cxd1Z>mSM%~2jh76MM!i23T7^P|(t@|%A^llQV+3+FQpya(v} z!spMZQtgwvf>dEQI=0a!twak7Upg#W3S0U%o^MJ{2YyH5y^$jva8WJ90;`e;%K3fv z+kZv{2OIn$mGq-kV?f)t6>p?L_A>cb(gX{Bltg`{6*VL2P>577$O`pz^fVey9Hy}hS z-L%R%BRFq&8Y7Td(@Cy$w)VLWPn>CILk5{m^WH74$q<&TDqO+~$kAM?fI&&F@R5H& zibjgDuZMCj@x2{)14Y`m(l61rx&7s>9^USoA%kTehL{~Ksr#l*7}yLg3j^buXArUL z(h9871Iwxczty$A>;8V9FpPS`L@bCj4|2mztOcre;Ycu?c(b@o&NY%#vjrYJ?=?V$ zG)g*7=bcKoSNWV@s?IPRb&-l#%283_Ni@XF-XGMPiMDqq$0U^KOyP*Ojg-Z4DzC~E zqHYvq+9)RzNFk%`&f9zVPCo$#UJk5Kn)8ay0s{dgV&Pyvv~H92_sA{|74JO-nHlWK z2+t@M-upU-rdPqSr<356)^nKhWkgm<`CY9en?cdD=&DWD77;O$#6a)%&ZbvdYNQ|W z&1I&+h#wRtk@L`q=Qh5LmBKho$c(Ys-7Qq1K(_Rx!o#w$!bSNYgePdiZIO!Hh8 zdBzr8L*xOwKZx7e_^7+RwM4M}#BYKUcpWoADY>VAvFkdD*=UNl&6v2n4hU~kT3z~C z|4tLX{h~Eq=@Ofw%bmradoJa*?(Z}HZ%!5AWK;LR3N&D9HY0=U^pt+x!J9VS`e@hq z=-cQ+0N~fmY-+P2W|pOSL}+80|{ASJ+1@ybhH6fMIBKEI|I zEX#FgXpZSDxB30YO7j;T#&PbPZ99%xN)-|>So4kk zanU%&_y$AbgK0B19+Y<TLf zpgdKFy@*i9KF)-?zt8CW{)3xz1j3%{v|B0G-WhMS_Lp%}i2iZa;pkV-r3#=LIGxx< z=I!Vd|F<1No^AGppl|kZM~wL+Ub*ml^G|LPz)p=l-ojRojzqndR-jJlK4Fu@TQbNZ z8fuyLtg)QyrC!h2*F2TZcx{)`E!z^t2o}TW^zo)U5@O3|iXIQ*qaMA{tem03WOSXS z0>1s!8FI_PKTda2n#pJ>iaT8gqVMp_XxYaWY_ja9K_j%Kj-9<`q zM=g}IZ+gv)kRh!Gm2K(IF_o>lktduPcfF!Y@Zg^=gcTB^O1Sem8M?hjM75xXd;=|& zy_#NHM^$ZywlZ1<52}{u6G)+Cvf*NPs_--U@1@y@dQN2!BeB81L7i~KCLXbQeP`Fx z&tgA0UnJH(swx-QFgP~hBEQk!;d5St>U*nTBZxfB1BxvNaYLwd=25J}M}ymRS$XGr z4{w$i>)eoKvi?^h0^?WHrZ2Uf zomkX{I(isR#m!GDv3@wyPJe>sQITSV3v=nJbb!NR6Xm2%N0A=ar$>>JAcey6{rqxE zP>SAF>J`Lia%|R4PiH2jT@WRsV_h4zWFN5!pB`BeuPeN|G?(H(<9rvD!M!|aAJN*+ z_H?w+XTo>lp_&L5)9r~$9eeT*h${Ub5S3(=i;vGXkrZa$yi^#WQ-cGSu-?Yai~>;V z9;*B_-`gl4g~){N{uZY!;ZN15!I_rn>+!jwUQkY_l6_j*Y#*eblw&H8^B4HeY6aypXAuSHS02B5^TFkOT5_^ zJbBmM#&mG}M2x1sV@r)MQ}i`4ODRvlWUI(eWt?5*H9`-e!?=ES+w2Q-{rL<2x@Y2= zas~^?D{BqmKL+Lw(;D(nCIT?SjJOpfs0Y9Ov$Tmr9OH-t_21S6=VebMl^= zrI*$StE88+9F9mF43Ow`y-dr~jnsuS>k56!f7bPxOF?T~H=VWd9mOtQ6-#5ypF2X1 zm{ghhZ%m=4;R2tDX0H@h7hws1wnhinGBXeuesgB1`oP*JhN=ckWR1OdJ}M$esH)}^ z9%sU9%ajDQA=b8&hXyA7PFVT_t$EB#N1pi4^@vw zQL9mOt@{VZy%Q~s-XlpI>XJL7A0!PgJ0*}OL%=@kKfm&h^%2qti1glDQ2H*~OF`1T zg;Y|+sExncABGsUNmy$VC?!Z7osS6E8ZPpBJvM)Fi=$$KLYwJnPpD&rru;v@9gSW6 zIBLC=P6jc%491eKT9tTh3kHa3r)$kMGD*%hRs+KN zX|NlIyz1$b&oI?+Jti>G-y6?Exn$mRC$Y_Bp^aCdW1{FG{0;lctDIt*jgDFM);`U> z#?thUF&W$GQHxp=)dQkwvBRgdrg!${Xmw)ij0a?DsL3n-?5{q7U!>p^s!K` zuU6R~o4|X98$k>?C|9UirZ#3FtuQ|?*lxM%Ro@8JUAHQyG zr){fs{;f^bnth!Ji{rJR+>iIMG?-bYjy*@BvL+kz+=0jO_IJJbji#kU)AbEFmQ(pP z+bt3L47R5kR0x3b+UVmueS8E{YQ?2oBH>iKi|WO{f%DmeC#JT=1{!uq!-uw_6Jwlr!=;I@M|Byh;n<9g9V3{QffkM zUF%ows@LjfwWP7Tw-CIN;f+qG{S8A${WIa8-gOP6KH+ie*`(A=mQVsDoyhshTNnj& z-ELqp*mUe!3$#v}#tmQVu5z4-;&n;^%{!ssx5%{TI8hnTWy z;zNvRU;lJ*j&~g1OSdpq%^DiSv5lHpLvK>!ig8577@~3wUb*q`zX(*a)|3mfz?EqB zHFzr|+kPwo8La2U2b}cu_ueA~;{P2Nmga&?X!m71ZOeD4MLCOj_%)CcvToND_`KL& za6Ns!4fW~Y!*{9e{5+zw8?9uytmb$Am?P|kZbYO#`Ikk|Q1-yaPoHeJ9NX>I$ zogX(+iIv5{TWsq0MWbe|;30{ifoS|SG1Ufo2qwwN#1}_)n@~?u5 z1utTdW2Y;BU2*`!<{G_bX+l>bkfW;hk{t%ATtDT!Ic8{c7$j>yd0p)`*J8Ii+smSY zDrl8(VptHo)I0tu{|i4(gKB+aaw7lmF$h^TO}z8^Tt?@hI~YSr!Firkty87GgE#PC zW8Lru=a5%!h|o6TQHBol^>ql6b`!4P73p60`dqsP=l0<@*0qb2I``V-pWRjzwvKd7 z<}Bdaa`@#WV2~D(zsP$u@gQ#8Ne=zxf@nzGX+#zfy?`V7Y-lwR)x!PL=G+6?)|`3< z^E%IP!!TFc@X5)Ql=8^sFHq;`SYyBX;15sQ$1xkXYf}*Ey2?iqPHZSla2|;qM={4v0`lz3^VlEGMXgn-6J>LV1 zo1pZQPM$|)LHnAt>5G6i(5y@>>4BJlXf5b+W!39U@c$DnNcRpMwpqHgt?wtB2vE8A$b{h4U1jt8@ZmXnHcMlJ}M1QtMA0a$04?uth z)2`T*dT$h|>s)98inoqxQfc5##;QBm%?+ysw% zk8yf>GZN2jvGc$9de5jPyKn86BA_BfML|G_h>A!r(jg!!O7Fc$lMd2r0*Zo47Z8vV z5$Pq;Yl8INdnl1mLNB3)B;>^B+5f%wdB=Os$Bf(=$;g~*-D_U+ch4&e+qrbz!5b92 zE72aICWN^8@-1TwAcUAnccKnn^INJ2%1i9j%=`m_%RXdV!TEJ$KWuK*(&s<<^9&=Y zAF+3)R-CZIG}RnZHuwEStpgVEN#O-1QmN??%cFErz7Dm zyTN`Ob(_O)dx(H>fL848g4pBwVDwjNy~up;FAsgKuk)4}B^x~Pl`1FCGaeA>KJ_^NX^qZw%6|~__mn5s^ z_Ez#u>E~uBl+tMXavY&Gvi90k#^KUnv1W`Av-h6)$NH!2A}M|0sobxZDYXL8e_o0K zZ;=}VqqN5UD*;LC&Rug-HHDiPkayvL+KKjx-g}X4Rw21nGp3=y+xt?`9c7`lrxv%S z!cKgGG+M8)rnTC;o!MV;TE6VD2Vw`C&32O|*Bs&vj_9DH9MJTtA^b zDzIlID-V^mZnB@M8tDh7Ksi@LbY&GDi@q7&N$ruVq+PaGn1dZdk@~jgtz%*c%-Axu zTx`H)7L1N5_@S?9yzjh`MZGlcjBn5*0BLntbijUGFt~OORiTd2lCg}~skCh^j=5UI z!^!SbOu$kS?9r&+NFM zjY@(|{~B_why~6aT{Sy_L^cbDt@_AY6cbTATNluirrQwAn_^^<_2Mo5HNkUK_m#Pm zt3Lv|W5|niZYuFJ1}ktVsNiiBcyP?;pM)R2@}tP7le(;-Flc6df+6{XVtZrqS02FE zNCl#@_{1#lxMnVLaD}MPLL~G8^K%=Z5X1Qp68d-&S1bcaUzj)5^ywKhyu&`h2O}%);x^2W)g4yV8_;3R>+O##Rvnub#C^jo ziR|DBg;GR{crB&;@WU;I0?UBIA7sR$HT`yZonK*#)nt1ja6XKnDrsCrf&6=@u;q(W)Se}!#^s)yIXylH9_JQEezASFOQ;hXsGt@cd@-^0`)u)XmA`4ov)nrGi zs#>xmRT{O0RbEk7RpM0P`+pp%*7*8u8p)1S?jQEfs*mHYhD`zI*|G%LMVw{lxde9- z;*`xQa=SGN_eQm8;!~pJ%)4)Rb+rg@=mPow`3<@1xnx75N7+W_It;n$1E{aPhirl+ zf9;G^bBc)D&+>u-8-{L=@dQAwistSIO5YVs|DevW^6;2EPH8>H;VB-s(p{Uc3;zJ` z)oG{}c9*XfAU-*gv~X77Z|X`WPs*>+;61+wygGI5*J5ahkR~^s;vS$aQ4=@!#~{V^ z9++dg+T&@`RGj1eD*d`v8LPU!(kB$kn)c8z=8xaJ!h!l20CgbHJ#rH?PyN_UnDe9aZ*k=$A7Z zKtC16W{_U*tK^ynm&iFpsRsUDc$W(DuS1o42?z8b)RvVWKe=g&Nb%i#vO~k+AFQd5}? z-F9f>n%at`HZgp~GCpNM+@kL>GN?~+rYKkm zqs#U-8$Xa;!b)2$)$}mffqSf*Jwo6lXQQ^w(Dk%K5h{~V_w_%G2FBEgWY`s7}WwBF`0#9lRr6-lK)zc^jaJ?BU+wQ?N4e?I&ePE%iA` z&p(|Ok$xs;pZi_(jK)#=&FJ$UIFtYOjPEOS8C)-tk+~q8x$(z2EuJsEp;e)Aj9|$o zFz*gT7kOa8_2}-!b^I2+^H?L}?V!^?Tv0RgHZS(Y%-4B4*O%;=i7i&{EaH(_WE+X% zgF@)4%52`wd^J8?4^PeD+)-?mh(Fetlk9PrODbIHbJyX-U!QB=QC{5i2r+ie(()a# z*zCAng>at?IpJ4cM^}2$!=ZcUpj$gUNt+3eg6e`n0RQg5D z6mAr>cK7(IGhHucyk7pjrVDU`uHdsvU1XT*(a`*;XrplO#r2w0DCBpaYXRnK{rmtqpdeuf;?3`yvaoFh`=z6F#AFk18>Cvl+9MjSJ|vlXB%T$D0MGmM%Syc+bud zub&^ul2g1^&V2jCv`dA9cWs> z`V$1A8gBHs&t&)-+RNGHmLMZdY6c&Sn3nGnlMY2-ktqwtE`*&q|7TtSz0)GUQbNd5 z%7S~dl#Hqj#iJ6R4mwZu!^K9kmFEJuy=S#auyfLn8Ieu1*&GL*u@r7bg-+|s&<2Nd zkGr-JVRxJH5uyS5d|fZ=Rc@c8ihDw!+zLNlKTMB=Rs{xp8fc3e=nokjAfrL7+5YNBUS#hs$%J>@qg^xJFpWTnSXQG{WKJcq9qgXkQdS zo$hs*LAJkoq*{&Qy)JX2RVjnSjwR1<@KSyD)|VdGm(*`V;fgYur62+)mYz-?2EV&^ zao^u8L!_Lcu1jI@*_=?W3V-J4OwtilDG2+b-YsCprB`OcsLygZ_DouoGD}MIxrO2! za3}CiD525K^xW2=AVqE(ii0d|_J(4YR`tLzH?tN%?38Fgu_$$EQ{Gvxu%0WY_|hNM zx0vd2@M1UJf2o(_glDsC&nqd4=q>U0(-l{>r8?|)7ZVanPv(428r^}-xXD@f2AA2j zOvxCO@0gpU8$6hB>^~ncb~<0X0G`!&*3mzt6=RW+0lk5k$$UEO1abCWdU0dxqv@jq zZqC4j&C;41N=|~Q&}P&LVJ=|I!YnG{d}o)qV|*35$)E$YEvoklxZFbPbZcugUSb@o z9~|FayrIHfQE&xEk$baK>IM6h5}vdLg3i9`ht;TUB*>&z+=AwqF>1;8WoD&HIx@f^ z{eZ$4M>PQ^dhsx@q3|ZKgNF zi;gu3r_f6%i*Dnekfkrf_FRFf*`HQL=GW9dXYCSxe=u{28F)SvRfA=x_~F0^j4M=+ z%6j`79+HA6DUQ}LD=2U0{rUsbxBVbsh3g(eK*pYkV2UBI>179)Dbpad#OUFPNaMxi zsoLzIZ2S>vdydv=PG(sdS0$cOd_iGQ%k+2RqYW<5&MnV5Qzi4sbWZcf$rD4uUAXl) zMetp_U=ufvMxMIds^EUe8H?P?YrhY5XEYkabaQlGAt~hkZ6Qf59BB30g2|&G<-e7T zA1RnFNrXp{3&hS{5~QESsR!TB5K@7>r(0AB&?a2Wq=s4GdNt2_)o<#1B9o6<$ETrTx3QpP~O>;n%z)LtctLnWTajnxgRK1sk=43&?MB1pG zntH1v)sz8BdIQk27i`+5)|c~xJuhxka9YsI%si`ks}BMwrTDbZy1^hiS|@Bk=2YWewp>MLvgQXWMHi)a&^p4%ItNPrb1X}|mzO~{;G zHz|+1kmrh|{PWp<);9+GB&!>N2PY_N?@P);nhL-Q&Y%(WhYvtpIdBD(bL*gH&n2UjD0~PK_Cas)G2-u+XIEe2` zETWk7nGa@PTnY;Hr6vqbe_*Wm{%2cKa(~H>$%2+so8$EUsQtKiWuFk~;h<1s=Q)#K z3_c0m%%?`ALVYE0_c{wG&Cpqx95-A*lpHra>|3A;e2Dinl9&>dNC{55seN2oR&v$` zMwOw0^@vGCp0cg=*P-Z&qDVjJso!);KF5(tFgJ!RRu9RJIzRFkh4qs>jJY90(1tpd zS@U*-<}>>>^a2$1Z8eg9fpxE6mY~>3v2p}i1nU8j&Hm0);DcuC?zd<&k1Ik94=fe= zEk!d3zu?zzEj)@|Xx|KZVglMSM9ilIdJjeQ%I|^=xM=T2c2gIA_Vhaf7!cBJtH;%D zSBGY`Lvtd`kl9(I@9Ay=1bz3d+h=RmD&%$@3w!UU%4k59S#&z1F7doq&|+`?Xdhy^ zL(Qoo_iFZUoy=BY#Ny={di-vJ0edPT0Y9GWv@n7_+MClOS+cDxael|Mn9fb<&H0f2 z(V#K2_iuJ@lLhD>%LaE2?||I1^}j!(r_h2FUcibn?{WKOQwjW4pWUsuWfw=NoIXhf ztSGhTQaKqNnN@vE1js#7@up||i2u`7aOR|DdjW(0ZZ8bpQv`PR1xTiwsWo!@y&NFb z%*(y*GhK8t5|T2jiQU7ol(|ZM*0p=Hmb==qfyy-r-lJhDZs>Oz3p3M) zENkrE8kyXFpLqCXc%X+d_us$Sh&xkfJ!Dk7cofq_g_3+T?fn(VO%fYtJ+T%!8cYNs z(-&~aj$(F+_ZKG>EQ;ao#qcm0=h?DJ?1;m@jLv7Lca3d!24rhRddgR}>hF z)sh}nG*|goRjJdyNbjAWX98*(-YJFzO10h%@g6G|_J=pbiavk;t>5=hwB zkj@9+vx1mFHl75k-Y=0?AxB5HFip~nZfcJ>^O2pzHk9e=nZk15;@0xD8n4Ha%mQKm z;Zv?QP^*1XSqOIeQ+;jI=q6{{3`6Hy}M(kA*dh4zc)T`N0?V&(@kH`n=?{ZF8>3M2g#I-}gMc=D9;T?H48ok@dv5 z%pP5fqpMcPzjEZMgVG$cYG2d{J1g{d+s@7l-RI$Pm9#B3In@!|@tkm$4w>n?Yu491 zTE-!3iNXTO?#8up`+Odv!I1--%n)$&b^B0cpV&#cMH}j-R>6h8)P;y?%TKN5GFVai?d0caP*`yPwSy;S+^~ojTlc77AZbFT2@Rj3zx7vk@ZHdMm#QJl-QNfa+nomqh_w{!&CD@KG zFPXti=I;P-lq*6EPM=f?3W1lL-I6)|%0B_w^gpgb{2C00V6SX4V6RJB= z5E)@xyMFHgz8^K8u>vGor+(#*=tw>q^aXW3x3)nZ%(Xn z_)A(1RBydif{#k4vtG0BxTkdG1~XUtyBBfOj8Qaws@BA8h7w@jQ)?Z%!~H8OHz&Kh z#w-WCRui?FJ$>5@b8I^w^F&+oyGjZ1MV?qzUGrhw%TsN8?Q4Rx@@A!D+mG0eb9-lH zTkR4%arIw9$3W*G@>dP`$%13Nn4LzXXF(+4{Hh^$d6Xg~gSEGl?i+!NUs{aZrE#jR zKHzzG!U6IV~YAgy0jY`|hqm{3YMSot9+J&F4Q$x55=k&49W%9R(@&2WR#~m^qB?|dtx7fv=#%8Z%WkBm(HZJ zyri~|d!jD&Vfg(Jr{uX2PQN?!I2BKYHt*jqY`&<~NYB$yfAB*(>L8IWJ|=J{BN7o; zuMhm3-ggRIy3jlH)#X>#$)DWoK`X!sZAguIYKU3yh)W&0x^`3Kizzy;Wl7txS9vd; zr`6qk$4+%AaW2qGL-cVHcfpMVKaw0ba!5!8A&|Twuw@WCT1sQWdRTT-#{5{^o#i~v zP46?Phwf)@r0n(yx~coZ)sXOo|%a zb1jW6QYds~b%FtExdx@f^$!%AA`h01iN>*>12}@;WS?t%qWjt+&NcfeoU8?%wZLlS zXd3cAsrDK2ZY!_yOah40CRYBpVLyNm^$bATKneJHgI8M}3&@0cBQrum{>3&yl&|-i z-w@O?b~VKWWq9I=GJHt1>U6F?nZCK3u)G(@o<7UH?f?&q`J<}DU&;OY0<0?f5BOX- zs#I#H3l}fB@kjr|&PWZ)4DMy;OO5*oM1-}`x)7a4exMK~D38SG{XY>>S8G>*oVnOY z-E28PoN?n9K>Y+nZ9>MuXx&bwAUUXD>||gUb5YA3Z60lb7jWB-Epv~jYiJ2?XT^8Z zBWGhy9K3@0AG5;@bSREIJM61bKaN0wKc{YB?(uo6G$h4M#m=x!j+kzP&0;FtcZDO# z^wZ=ErdG*6$s2<25$3#M{&0ctd@DQFj&bUTm)onydV3Pp;b%t*)_pnjf4aLoltgZyDK~f2Y^rGpD`Q)sw zP-t4$4T$~FQYENbAG81L*m}r2t88LNGBCshC-T{p(Q1n;r=m91Kn%?Pd+5>B#XL2X zjwQTjsZ_G6Ol#r`z&6m_Lo$~sIqsjE3F8bX@$3tt1KiCaoDipYzB|XZRj(jArXjze zGOToSW5!*E9o}l!r*cOS$hDJy5@&}RdFhg=r35xFS-FuyRO#BgO$%(H3cn3l-81mL z(!^F)3_~E%aLOf&DrM8ngVl+zBCG%0AfpopPF!9g&sTQM=D)kju~-Sq9mWvRU7<4l zyb8Wcyq{h#x9Icv-jrxMeG|s?61#;zYUMX0Mi63OIZCMIXN6Bzlj_HxqjX8dRi{X;d;Q zHV5&`uhHZFhyKd9S@Q+=+9?Cn_o;Lm$6beo6zoA*xycRo)xB(eJju}Po{3P~@pS{? z!%RM!?#+L})(vVIQ|+=uRSxdV7P%KtVY*#NAGzts9b1~CaCpH>o#H%w_tAd-HyP?c zd3Tv`0=FMmSATYj?S#|XkF1QW>2)Ob*sp-6)%*o>c4;ki_~sel=;^?gpQ_f+J#7IR zGSK>_&NyDSbRg@3mCCxImbs6AA&&&Xbx+{WOhk`l110=j)~{EZsE1i&46+bGxFOp{ zM7H~H#COuN#9%t_B1RsW#44psW-K^f-nFpknS42~C-tG-Lefy0} z%5_W1eXCiSN|V=`!QNPS^s;p{ez&7)CH(k6Xx;>gWv!&_H?rr+Lh(|6{bJy9~2sjr3IrskmWm^Zk)WGt#!8oi|1NeE}*fB@yJ=dxe z2g6>m)+)s6oLg_R<|0Q_?b8(6W>~F456s}?#eYCu{1FT&XS}gl-PwmGA1~$92AeI{ z34KlN6`Ml`PD3B%pObEHerbDqo&mNItT*>P77erhI?bl51fRo1||<75Hp& zw)z$OCw?OLKb@+QJyDLniX3OZp!VeWhdVo?)UW32j@?j!8A#{L?I(B^t*nKOr8T^yyi0l{?8+VmLe$JlN$1b1pl-EE9|mj3UF6x+(OhH`q4j zDM!0Kl20&Abn{Ko@bm)M1edKd$Xwzqr=6Cy!BN7}2iUw|0hm zSKALaSOoqzR=rLqympe2V7p;INDLlyAr+1R^TZrO+Xa_X9q70C3bc}r2F7`f+2s_#eI|B|upqE8>ht23U-JHU7d!Gr81`$C@BMzJg1A{He@>{+!z zx;P>$c>}q%K^t%Z-)5x*oIbFthzz<*Qx;lY3R4d#U*63VfmM~wN`@}+q>J7@mf7YVETd1D5m#OyI)*8(5Hh~NxZX!ok%!3_W1hK?rbaR zsB&8#lToruFv=~NT9|7rnbKsmmp_h4$tm%#S!p|Ynz-{xIWOc$v*xyZQ8fi&1?8=9 z1S19P$X^jc860Db8k(LMt<_H+LTPBHv$;sLrpu%#GTv??v+p5?(45liA%14C9R&U9K;Um5(S_21$z(u-@sZI!mO^<&|#(juU07a&m-Rrf*3^Y zGSrSvSuh4(ky`{K;vHwL2-6a)Z~Y}3k6@e1=NhL|yb2sxSjxEj(c@qb2sky^zyAOh z>c7>KB3Bb5A-(k2=Ik38dS{$*{O`j^{C%vOxeRVeB; z6@^0quQj0=uJcmKq-IZ~ar$a)_U%$1>DCn0%(s1uG38%=iBDc+FY)+7>6`f91+>M5 z7opcvcJ7xo+>3&5S)WyU=BryeF>#o0F1gP2UpLd!FOL)$LTuyi-lO;~FWy3iY=2-v zARwOe6PaI;NgWZ6f=d-clD*JUj>g8pjNTYfw zb2cwr(B@aWr}Fpy!~2e#2i2Q*d%Mc^d*o;=d)34_pkyPxSO;@t{!h$Sv^Hcg+x6GA z4pB0s`=4@N{{Um}IXr|Tq*d|=3D}oUb|Lor`$iG_X+eXMRSCJJk@@$coY?C_mc2yW zmhV95+I9g!^>P(uNqwv*vbW|DQ{{^l+2-g?!TYG{${2G62Wv}bpSb@I+;-LI=)ZAW z|E9ZZ;VXVS&e?%(<%1TP;$Vi*N(r`gTQ{FAY^BO>exNrlL&U^!p`^j^ICvUiD14jOTz}H8L)C zrZ7UM^Y_h3G2V~~G5TlsJDP>$57f0Bf*zV5=a*=SoZdP2J4p7^BP{bv?*ur&l z#y58y$B}D>NN*Xr&3or!e&oB>L4Y?=J=0)tJ)?p!j#|%%&GM}fYOmBJP+(IWLfzSm zC$drtC!RmAcTDd?bR@R0NMg>x(Tq3Zrv|KoR%@~XvvyzMJgmv?kyNK%@p8MHhPO>m zaU9s=nfBTG%2a8>s6x&s#sop;&@cZizm`6OkPAag?3Pw%7mr+eD>*;Pr$8Dn!$&WZ zkcVAenpL5@LXjQ<7J1CiVFe_6S^F!Sz3ZBSVx31`1i)cwTzUBY}yV&XDAHjV`S~yjj`Ly-V_rd2u!=L=lHN)b-stHW3dQ8H-^V_IYdwPnY zN$29I$&U$x7S-QyPtANx5GA2cL+f=ZhFU6l7Y=asfPmZkVQyVrxEC(nyz)l_#fFc& zmu9CAk>2e7794wX%AxbF)Ygn43OkeyLr6*A=59L@r=be}Ij2hMW^`H|jdN)aljo_L z!YPjV1lumZaw1oZ$q#V>B zEwx(>16pV8s-lN5`}?Ay!Rk1)Y$b{K=PQGj`vP_bG;MtsIL0+NpOt6%%l(Tprj*|G zd+>HH)dK|Z0nslVEz85GskIG~(rHF7STuqHo)IIEJdY;VXLX6`3qdAJkVeXZmKJAo zNn)oO+h_Xb*{dqevULKR0&y(tYBg_>!!iGx*}Ikg4QVFnw;&dXYCqkvXzbzvXl$`V z=R!$I*__jrQ)S9@o9u3HrmRdg+{Z6wv%P-fQRyRBM>^cOgTJC3K5M-{=5ZyQy<94M ziPJaL)3G=_c$|GoBa>orcc!^+uyFko@rduXS~M_YK{l{^)!)VjRQa;w;WWT_;9(rS zct6)j-a1*x ztEqDUXBxATHL4%P z?<>cZ3<*Lw2O+0FS^+kK4R^!&j6;emnFpwPdr&|7uNpGbv=Ts)&alep3FlCc;=ngK z!eT7@;)uGm(@3H!NlH)1GKTFTo?D$&)GWXG^v$9icPc~U{T6<2n!r1-u4`J0XgSrK zYn08xb)@sDnN;e6GJViE&-i&zqc8(EdD=2&a=&zz?19qg&V~w_U9<3yA#5LUXeGbyR|QF* z3xAnLo`zQL$nAG!?I6dg!PPdkRX&M&NtAfdiM&7C%x+b;#!}AP^RL&8A6{4X3jHwI zfJ4!L5~`rJ86|__HMX~ZHcg&u%yI$(xlVG-!g<7;Jzremyd%WI89Vu_M57v!w*`CL zx8Ugc=~}=pM>!&ov-fiM!A$udKG6Xr%;wvK;L)}#qBg(cBS0~WVt%MpwI-t9HXoch zIcK1EXavqv7kPOcCohO5eg^nz3&neWa-N!qnynALYoCh9$yq*#gE>(t(%)Sas*MuI zrFO=h&+)O1d)8ZQB6wVb$%Nb9uQ=o#5@|pAxBD^+pGg(PO1@Bg+Hs~)au*DNo4|T+ zKBGK|BgpOC;46%+4~kCi)&#DBPLKSqd6mnzP3F_M1^Q(HjZ@`{P97V6^imhHwc8wP zJg6?j@1kVuQOt!Mx_3@bzX}1$wG}l?6(3Tdoih!4ng^J(katE)ZpmEQC$7UAIXe>< zJo=I%9{{I)9le}Mr#tY(js->eYLBZC73&)814FN+_4u1bLyVdSv2)t8yQ|K#%pSEN zh$)o2yGDTdBTFZ3J%Gk-M?Vw%#o8SqW?S!ITHk{z)-O9K-?iV%=X9TskXeO2^Gtx- zsWNgF&F@T&qmimr2hL>$(P%v5uDl)J*jeXAZ&dbKUJQG-owsrLxZQ%&fj+(Iplwm7 zwL;kqVY>1Mn_a58$g7%Q#j9^pPl3gJZ~9(ZfQJNHbjxZzMIdFy7GPMPo`Ho9VBvSC zBwcmPll_IT`xwRT9~)WKrE;V20BUX_)_BRiJTKV<#Dz7>h$de{ftF&mzF`~bvF2Bq z`?HTX*ehuN@()oAz2)8C9k=MUK)d%(^1>UAlCq&q{39QK-La%OQ)05S#Yd^7yejN{ zzWCs=7WigXMbGnF-Y3|ry&a^qN?p$3+J<)}?YQFHMbQ2$^LK$*iCmVz@3D0Y`lbX_ zPo6f5#0Q9v*IUW{5rwL!^TdYVV)TEggpxE~ju_P$1C{vJxan9dua*|cR71~R7o+Ni z&sW(YE29yedJ)|-u#6WT=%0Ji2#@5-it~=y_P~BNj`jz!R`Xp4{TW^KX&BTWU&GI@ zrP+*fSJ1O}9B1NyS2BMoX@wl^%~gmygvSeDxk1BU0))9q z10;YxBtF!oyg8dQgz_<=h6{mOXLBr<-#3iM)K1=1i%`M{XnP< zlQHd`EkC2YMF_-hV3qNeR>_pvRC@5LNm8LbvMH;Q`5 zH~QI^v8|Q$8;o$OcUYt;IhBltOK^H#tx8kYk8KSx=T)3-XDbG}BsnWf9c3pr+!f+H zv}G2g^F5m2IN0qa(52+hTBIcoBwx6k`*{LYUk)fHCAU!rKKHiMb2rM9WmSb;9%}L@ zNT)|B?e>nNMxC|A{Z{1_2M-1oQ_57X5SKNaeBQ4;`n~l2MC$Mg=e}zS=YCpzOn?#X z%thOt0W-#3-akvF*zX)^zt|TVH9o;#q3(JwyQvCcL@XD+cV; zkFM)V^4;&bWnC+{*H2aVo8Df}HNfQ6)+8s**(>b1J>R@~VD7Nrot?}umW zS%;s`6B>%+{`Nr$OdfF(Q%r4- zbku>vPHEhUPmN^Key&Hq#O_$tJ}8_F@nuPdFmLyoXObhv_QZip!c;qPCSm06Ab(F9 z7wNUx9fQZOvUp1zOQ$MDjf`fKXF~kQSIZAuq!kCxCbK4W%2YOr5>2^N#pn#iZ`$vF zPl;+c>!w>pCF3sr6P#_0xQidY%qH&}k^*JT+T;#xj#Lm5w~9&2VI>H4COJJSLy&-S z)Cx!Fh>X~pMViXp@E_%TSMqxs$CT`6z67=4j}8wO-s}~G>^$0cm$zAy{AiKpv}ANv zn`FE5mNx&TWjigZ2OZP7t2r`BPJpT<9sCjB? zNu>Jcvx-NJqCUBaFJ&Y!jPD;5uuHtP53^L)9Z=}}S>Z5J*8jNBBF*LUqvi9C=k(4` zlvoAO{ny9eFZO_30*ly$hi({FVaOL0kpmU_H(FxkXt@Nf{ zjR)^>b-EO`ILtSqX$~1YD+FYY-wd2dHWA#|=xvrJk(Z^QR&AqbetP=)!=$;g=-M+C zycD09?44rL`y=bChEN&gVt;T~vs31~)$-8?4DDdDVN19ucG8d>!ag}6p150Q3^qo2 z=dS+$v#JOQl^oI`{RXPFy=`gJ$?MNJbw#tU;eLJA$QE?HOk7*0nu1;1R;C}HhtZpR zK#ZsYIg{v{v?cCG%Md}6D#Mr0x?7$BKN%WiB0Cn6r3ou@W&P{<|HNt{^Zl3DsA|50 zs>jmgObW$~T5&iAXoxH?P2Z%Y-7mJz#A%sPSSwTIlhqoWYdz4!h`7 zUX6WOwIBAXnLxqIA-n32Vrtqw}yF8un@z;6ATU?1!0%(>Y%kpI-V&vGx;I7YBfwA5NqwJSHLffems7M>ngM zoyd;ImXWU=ljac7wfH!z`Nnya!kxxuZ$&?#29hz5)s$?UWo4323m5X1t9Z!PxaB>a zvaU&27;DJZdC0vDBOh~g=g-=QJ+9(K*&P}WJ`KHhZO4mtKmYDDh#FY*78{X)I@nm{ zu>^jU&zf5+n!d5onl~J$sj#R1+UmLJWE8;MDr`)Yyc>Fn(*lF*hA$)g+McC2!nG&J zY7{t4?OeE4sO_R2lumQeY$|m5;_xGf*6V^_=W!L)6T2QogOWqhk#gNP4u)#&T?QrA zPmG39R9Jjms_FwDXwV-HN*vKN5fHn9a29?^jeCbVEG=*soygx zyf>3JN3r>gD^Ouh--AOZ>3Yu{&mFZ~{mAWnKJ}a;Bl8C9$kM3i-=ImDHmvT&@j1q% zWA&F#L1UkIy-mGJnP`WSj$Fn}wcwx9MDy=UHf^KL*4fp0Th@Nwk24J|GJT_?2i|~K z^+M{}AyUQYn(>)xz79-UFmAzfbEu)p?fJgO(nTjLnOFty{`dN|*5445!n?!oX{=p# zig=B6-m#~=%_MMTL)?tbo3)AonMrgw@7^W$P!OT+`tfsg9NgTlqbIQ_i_B0Gl$=vsrbTT>D;n(4uEIzz7Xdd6%!o9#E0|pm6z1v+347mDHBkgv8 z`b+}*6BBG(cv44nw73S7J-nyFjy@g;)z14wScv;JAF^MH2*WZBR!uHnhbJ z3--jgxMd%0c#jpCNSi$Pelj!F1YhPI0O8=W9a43Fl!(THa@~aRe1QRwy*$7RMeP)z ztssk&2b?vvCtH!H1~TEx&8wq^%A~RbJ_UsB;B@YrwRIezfZ}GIXBQz@a%&%akC!i$#dPY;0jud#6@L~kOGrGdpD zqSVd}Cg|@jXr;ARqG}{RJo%(R?Nc8*@aS9EXOLaRCn&9S6r|^;(GY^r)7$Xy2Bi7{ z7Q+X5%(Nhl&m=%%vQoZF#XhCXOuBO7iPckGjk0YC3TWtw`Js_z}rllb7bLS%x{uP5`$7A!_?q%hc zNM`X{cEl|w9K?wUyETyo50qKy%qDH65Dn-q^n>qN)E%a7UMWGhX`AVmC4#-*?h)8Y z4mSQ1vuBWIy>CP%+*Z8(nJ4YPqNJEKwsjCU2xm>x)5MrrVwZwGvR;Nwfj4_$7qY}9 zyDFHYMGEFWY7v*bP9P46tgl|2b=-gb%aL8#`TlQtMO&^5HgQ&bZ{O7RYkd=q=D5SS zgTqp;Bg`2>5H^8a+cM+aykcp(N3=RJ@=@BWm+cIRDPg@S&-5%Uu zy{uVt3DITK8m{Qtx7?CQlCC`qr{j&P6kWP4>rqKQYQ#5>LB@SjW=}TzJ?(aowY!aD z{u8UA`}KsKR=W;EoJ4#b|!8I?{kL;V1N#<28?^A7Fxb> z443PkUc2I-)3))&rI*9p&i;2U->KP!N@2kGuQCBEbW|HHE-R$V^I9ZEKOE{ZlhwJd!z7{vi# z&UD4s1}uPRAFmKke#AFxtH{)Qa5p~h~m3wZIx!XKQ!pLx~{{;xDeA@arH z3HJFH0_F5ng>3}t+xSbc!Fh5D-?#B@lKN9$4sj;zeP|r6k&$!GH()or*X)$=sK=!0 z!;lBUr}Bdk2(|r3l6QPo@cjE>cbf0swFQVPD>^y+k?Q*jDYAbVb|lnn2d&2NXB=b` z%d~Q}Fhj4ob7ur%&?vpVaT_@>E(q}_Sh}%HJt(*owbC6rhTQay@@EmY|3>@A?!`vFw_mWmY zt4f_MGyv!Go}s_{H*SaALhS|vevVXP=X-X+LC};s?B*JSTZf9rINg)=>u5?Zm(JUk zE9f`-gwv@0uepR%%R`;dT1yED%hVaxH+}S(>|mFSiEQs(&HPsqTBf&J20q=$`W4%!2zrjijeP!ZcMQ@Y44W z7C?{u_jB!^Xz*Ra7D(hR#A;+Xz@ z#I{xfP&y1K@GyYX9?CCi19XC%zLoPj|D&|eO`r$q0%BFRVZFBZ{)A1Nq6r^l7eTmR zUsWtX#ZrE=9?r>J8`&OVXW<8t%3K&NEkMn}FZ+vh2Uu@fR5SluG1M!ge$St8SHm#xZqXTxB;~uNDdlN?!%{VBL0`$@VI1G;h@DXIx78EVg(7#w%|$CRFyWm;)2M{%h7dP|o2jD1@`aNwOpD zgOB*;d-g^3-l~_8aP}*fci65|EuV~1g5@8E4!~^*Px>gb5ZAm$pbS=LOZAxHul(lT z*d*W80J+HguQ&J?u3ya35O^Cj(wjws73Oz7jtu`vv7ElELu+BpW&lS&e1xuiy+zEq z!h5$dnL;(d`nx#%Z9OIW@bcRW-MeYi>7RWEX|S!rw)DV>G_jkqLkz)y585+RljCI< zL?v!kn)PFxzs=NJGqNb(Xp2_%4FoLY{^H%>^pbfTNuH;55;kxb`KVm- z>b!1lc5&z?J@RD9;V1HHEQBKShQLV&^+z!xwMxj;I@U8z|GvUNLOSPco?QI|^u&qN ze}fM*<{HvMP#7p@xw4QyBXa1pYB>1?1qor>aExrq5SUawn4K()+P)rI9QW_@DBbTR zkB&;=jeyy2_6ZsRKobE&%QUdwKH^LTvRViQ>jhYCyIT>bWz%F0+wU(QIx#l;OnH;{ zg|Yz4m((k%%KV*5JU%E9@A+;@A^j0>W%a1)W?^o= zb3HPj`6*4h&yi66xYw!qN+8CioLQR4hMMdCEe2HNvF`#8xRh)mu$Yx4L0;Jbps(#A zuvX>rxX#2HwCclUd-}-1Om-}$)tf#G(;$B4;?DPYX?RUc%^-6)K7|xjeG$j!vf1JH zGIUr%k?mq3HuN$bAShD|4=y!K9xY#@1%0jl8XUe^Qi83Oa@Qy>65SJxy`@=jdNv-I z+xC&^v$^%mq6+;Lub@YfFd2_Ev46$(?KoLs57;lhEC6}Hp$QY$v&#h)0eeAD z-Gpl`<1)M&dO%n1Hm~*yamwwUc7(4AtY$71k2WnyYMKV9aJWSrQZ88Ue?Nc2cQX_{ zi7nv{q*^|`|F^;JS{+V*)Td51qaIw}eRghZ`B^1b{P2RzjM7Fc<0xR&#FuI6HE=)1 zTh#T_h4`+6Yd9yXEcs{MOaBj3e;F6m7qtPy3IYNW1|ThhqEbqCDu_r(N+TW8%+Nzh zcS;T*Fi1+rz|h?}Fm&h8Gt@A=^S|%=d7tOY`JFlE!|b)=+SgfYuWQl7iZIr&{|TZ~ zhAJA~L)Gu*&};$Jv|@cK{iqcAc?d1;s8>A$fU`$9H4Y>#A9dya&YK4o3AVKiAjw|_ z&+7b)XrCT2ndar&9z(a5D<9oHpJ+tGZW#Kb9jnSe#>e_uJsSDYBUO*qV&yf=F%G_Y zjb^TchxJ^jEP5YxuHUdrYSJ6t{91=X?n-xrMPO#|#_oY7!Z4M8cKO;oT}6Ex*!Vjt z)fm6x+L_Lq3l$`GrOUV0HA=~0!TF*#>G$P%h?354WmZHsl&(Q(b*R}V2A7=Nl zn(g9iyv6uLEsyX;ZpvgkDjQp}nhr$d3f#pL{ueFjZ4R({_Vc0#K`+kWx{(!YU!C*Y z3e3#lIfgd!zG-2qsXvWl&RL`>Yi!QNmCmUZLiIg;D_m=%{9PhziJFtN_u28sHzg7@ zk<@XNZeNg;pX+Y_R~*`BG%Vd!B4;6~YfE9MK8sX0z| zOT9U@Q)jauo9tY_^g(=Xl=bUQxI3o#%-nV9j%V_Ue2?Rq6_uYLuao1K?3kqTxI<1 z_x8^}f4=*bCv&5~OpW;bzC0co>8ZK5g6-c8$4@pEY(*c4a@E?HrS=x6Ge?oJ?QQlw z>!6lmiHm(8rr6_Z%EnB)n)DnX&P$aUkxijQ_GLbM4sLmk;*XluHJR~ODNeaL0OxBW zw~gIAgXX&aq*Qg4h}e)sxj4yERal-~op}qW8VI-Q@YxelOqJ_wsOPnK2q-LkZ+;13 z++knO0lE^(T;-y^plw%Dfo&y7H>F|B(-RHe6&xx|ee0#aypfsr#FT%>Y-jKEs3?&?d$-RDC3R={{XzLEWfsvHxEgYKK<5@3t~Z~zBlVv-n4C;=g!+(VMfA( zCN*v-RHiD%9vJAK&{U+}yxcK4Q{Z!f6qMWRlfDAoq=Tp42hwN+3Povl+2!iPLwxyX zwI{=BJa9@l*?Oc@$?hl~D+|~E5c-J28fMTq;<3|~jJLDS?0~ZK{XeAy;Kp=w55nP= zqocXJUVH+WF16RQH~RZJmwXEvF>UN>bfoP!3{{H!-n}Qarnx@0$EQ@LEo^cLP7UhT z`&BAn?`G#x9pt=60o8Senxs&5?Z^2y2Mu z01Q|NBmz``aZUe%&VxL)7rScb6`Da1^VuiFFJiY@PbXmp-Vr!F{-#1Cz$&`cfS7B)p>~PoS00p z)%4h7&F1*#-|Z;9{aC7|UxUJ3TK$x81J8$m88Jt0qhAV@Q@UI@25?>EJ7w85>NgnR1N^ESO`a@M@LBoIw-E0jJ#CasMf+ zl-YKzKa+ZZF?q%UxZTw%p$}#{wZAf0?3Hq?VoJ5OFKOOC>6&x`(i6GO1(O{-f&O;y zdD!Yb%_EY^@S-zI^G@pO@Sj95NU2{0WpG?KQ4>e_u(j!JQUT~McJ#YJm2x(%POBTO zOC-0(GTZ2H5{Vj_4|#)qXE}!cV0hu*HwX9m zQ>X|S`n(&MeyT@&w@bQiDn1q{{DTKA%^wgF*gbP|E@SqMdF8&-n6h}k#Cb!nol!&m z!hI}$N<9p8H(7zL9L*}4UaFa{V^c`8+nNR0zYe0nsF~Z`xLckB^o3r2{M`*?#uwM6 z%JZJ(Jr*w)cGGpFsT#kgCgR2}_1`{S*NIkT{*AbkR&pL}DV515dzoOB_HQ1!n7-8i z#2~%c9<@aNDoBZM@!2mi*2n#;uJ*jx_Q;1@VH^ZQvFNuZNBAkbpMc?;TJmQ_HL{x; zZ+zZ;{OC_AtA@Fo-~;=FCKSuvHcUA@4E=3*1)&k@Q(Az2=F1r5`?T~cey(|m(66ac z?z8UE%d3Kc>fud#&*n(YyCt{V-ye4(A~m66oRe?%4cQt$HQ>8MI#p~?ufFW(nn1*h zLXdc28rsltR%)U)zidCkv1E3J1NopeVw3gjs!=R)jsjLFXlWFEzNO_&qzmIuXUH*kJA^^M~gg~#%!#$Q5fh}^rtD# zc~nw2{fTwB6jt_2GeioocAVnqbGgRV3LF$#Vv727;ad>=Tu6(~@?zjP%tDW3AP&S? z#~ZBD=Asr-ZTLp+nVt$Q=p^KyWK1%PTLSOGl4i)832F$v*4?o7`mT)I7j^XjwW7aize_(Dd7UM1Nb(cB5~y=nl7*bDn0 zQrTnOFN;!6JRoGD6!&5~i70zl6DJGB7oNruHIu&pTZLI=K-Ak^@6Bz$lDgpweg~~i zyAueJt`G1NxqGyt|JBM1wnHRs-0<6YD^fT{>?TiI+#RDQ+wc^d z2yW!wnwLHGP7?(=^y4$BiuhxUW@fT3`iB?fW@501>_Qx|sRB+LZ_T5F@1s0)IpUO? zai{z(;%m3L-|Ua}BXHu+r%Ewly{`WM}`=6ozVNVK7Um<7VUxQ&Pq!sk=0#`pXgl#*w;C6@l-TLh%`hh&ZW7>Py zE2vQ$yHrWFRzWWkC?@7uTjE+lQVxSD`7zoNcQJ^3qSkuU+Ead0^NOB424kcnwIt3# zxqdqL3UqHc{6zl+76PQP&CH@KEkAHrB1buz<;2!QwdVJd z%a;x%fiGJWvO9TF7Rk&yN7ujHKU;@GTW!;ftY|#IVEz^7u3s8`Od^0sF0nqZ=9%1H zz-5u~8bYwZ86RpckM0}M#q#mcGl9!1Q=@w)L0geE=)N?C4b0qyRGs~1Ir3E0{k>q% z!=IEhK&^Qa3$I(|8DLp~0K9DW#oz>LLs6~~BKjtMtPl}B-z8{bX3n~H^Tm}}O)uAp zr1Aqh(h^deWt^&}BC2`XnZ4J^_GqUb?w%RCt&Mx$^W_rlJ?Ksn6P@Z^45I+4QW=(C z-y$69IuPYp*i7wWd-#8Xgw-@-5%nZF5q>2vk_&s)K5A+r#t7WJ=>3iUc%}z)oK{1X zt_gsOXRfR|qfyZbH}~u{s8uYIKQk1|eIg}kP<>45i`A$z)r6{jdvc#jE132*h40Ky zr%`yPZ-6kKfs|w7t$#8k#)I?xzIaU@Mc{8%b+Z8SmG#P>VaHR07`=Z7I03OAIu(G1 zydQ1X>^3b2CdmMzVdKK^&3W5lxcwKXmz2+ml;1lPP?nDQI?-W&$QtWr{N*QZcgQAC z<^Hu(%A=1s6FyO>AO(LibaXZ!TCU%yA{!0g@J5N^1L|X=p8jpTRA1ZqWNsN6 zPBC$5kkN--vACBtl8m?2Tk-F|0X0wc(6iu={lcLs`KtpWdrqmgiNeR#tTQa8N$YO` zy`Qh?-8fl_IoL-DUfOS^%_3#d%|fp-Lb)=5o*3?EunGnxCt6*M{`Jl511GTNVB}Bt1fDT;lwYU33dC3+$)-w8~V;?!PyFB$aRTk7^ zA|W1=P+73&?LEEzrJ?7b&Ap~fl`wnX3$!F)O|Z;rt?p-F(}U$1*}W!^DvRCsHKhXI zFz%D4!`Oo@^)bM?StWqc4KHrA+7QloBn!{2XqpC$DK;G{PC9mtCmO+{pM#3_P46I; z1^?kT`z1gN^{#q`@v^R_&a?N|vTFzD#hcUvI!BuP6C8qfHf?0cM}Sm0)f6D??A6Lr zikhiIFKF)N`iUOhK8o$F!0S7@10=$<^ezQJN)Sfy@%+mK!n3R zB+5e0ra`hQlKhfhkH(&1UMv%Sqn{csxO!R6&b}c-jalI8nkO)tp+I41sNVdOXKYm&cySClt*f^f{ z`Gr;W0s1waw9>x1Mo|_0nSAcbZz6#B>YnTo1@iZs z-nA3hol(7))Zf(sFFJK?esNzv-B!q|3pz1}?;cr02+;jf`#$Dh=8Nx!bBoQ4d&@o2 z0)9;&mS;>3%B2>=q~fcfB0d7pdBo`9h4m*2x5jg?A^oA)`wP7P1;M(JRhq%W5NCjyJN)@1`bPUc4)YxU z2lF1%c-h8zmreDjx<4dp5t7WTXdg{g*0?`JqhlLABK~rJ)X(IVl;80FLi_A<)_*ep zKKvinp*8)EcbRXhRihCqCeAkHb~s0m4dS;7{}`Rb2tHG$Z1$>=m8=@TUO~j1kTJrC z(n=L@9kdJRXANOjotBt3zTG`73sflFHlEL_s*TyZu!H`g7-_A`sKWtW`IQm@?o{J! z>pm>p)Z=Ahw2AJ2dyHKgO;CHJ?{wWYYirE!tjn__#_G}ZIlzR(mo$)Q^k{9kw{NN7 zjxjPMx>3Dt;gTz>Ubp9$q-jVW3Fa~NH6GKnj1+fmgHuuPf-_>9Jn3CWq)2g)^B?&c zhIeO|7EQ}bMU7q zv)=eX`Wu5Uh_&$w>u&Yg$>ITL1V9kDw<^q4lQ3uZJ=1fNK@WG@57+YY!G2J4@FA#V zW-uz|cLD0_g7(G6g*{h(`ToUhmOLS|OM!pmNt446FE@dqf)uqrJY2qSd#-%nQlVsD zwC)y%1IJI!^A6;zS^ozJ?1kn(OaUtIs^9n8xHgq*h0Z%`!F<2x{%LR+eTdb9e6Zm%At!|C;v3{68+0e zR0TSDnO$BJYo_-S*Hub~OS!WdqWf`K4%`;17Ifk=g6k+3 zhtYT!5u&o1%nXs{1jEeCgI=Xl8P4tEy6#eUA|$s;c^QKw+^D474$zIunb!*dH>y+e zY=ip#KmBv!a`4#l3p*({R(= zk0r$wM+-nC2*4sw)@P}#!PV3)ml)&;QFMT@1KW=gaf{D5*%<@jU&VhWT@L3$zeq*7 z^gS9BxuRuEb*&$2#dXsTy$c#^%#rHa$7B!C8_5zh4i@L6sqI!-uIXOdjV6-Fnsjkk zYwt{)MB_Jymip{OONs6NUGZ*YD9Sm>KD*W;D+=H48x2`IiJm1WHQ@RUCkZlM)VAjs zQmnY^+(U1KpA+ig`nYU*o&K5fid^}#oL?A1?Bl_Pao)g-E5-k9--$0+p3wgt1;=hE zyr*x-1K%mXaw?VkJ-S9OHIjGfi22E9@1RTKzqApnQ>oferKMeY zdN8ABI4`BCM<>NodKoZ_*WYBaikSnpPUa9boWonakC+Rk6E$yFp0iS`NHb$p@I6k$ zn7S&RM2*9KP4e8xh=b;0#fL~);9-$8XQr(ORz-M8p`zjV!5+%ND^~@=YooK>o&uyK zeZG-TV)b&Ajb(4u87`i)15StKWy?vCh##n@y-&9d9R_6lKyPDswajO#vQTZp0W0C# zZoExGuqOJZipW%m|S!%i3 zE;Za}qHzRuE@S9b+8RVZRRKc*e@N0#A+#@&PVH;w zbG8?9l^uyBB;i|W#zekD&qmb$$(;X5B=f?osuKb2f|&j~Nx!K7qbal)qjK0ySazj< zHlL#*$i2s0IXIuQ8%2h&2I$QQ(!15zur{#MKdT7JcIO|OdvV>dX+Nf?B=w<2rnaD& z+_Xi&fQa_-qf^1Y{S6PYk4<97z}!VbfNcpB*oU0g`%FJ&%K?Ri%fFV$!)aMEx6-&z z@$wMRf0PoP%dyHLKbRqu@HRWz&(U+`nv5h9RsX@rpP);`SYLHe(6yf5A(~MqI+`@iF71{}))YQ}4&&eetaqYM(7A!LM-A8u#2o}|r zRaI!2!OBd6mhR4zk22_NuuKCQJ0#|bj)agCrL(^t zmZRNBU#iz~8CTtSP{!YYu|1(uQraca&r-kVYU9>#VOZPJo%aS)_{$&E+kWQ7qN0op zG9Qa{@`C97Z&=*(*0s;RyK~P}WWS?`VYsqB8pQnBniv~h&^`+SI%Y&iHX1w93}Uvt z?}aignTNeMI2!lhy>#Fv;ItdA)W zGB`2X>xoU?w|z7^Fbxzb`$y@G!!gqtXb>9k?f*cs&d#uvYh-ERhz_5Jz+OR0)CL;j z&Ale^y5Et#_ar_erEvYZ9dr;RC0u%DBj!fFO=T&SJ>%HxC%&>OI?lcXDY-*d{ZwiF zmR;8jG6Ns}u8l-@XVCA}C&8;J9pyIMlonEyzod?pFE2SpB2;4w(7qFw1&u|>kA&i+ zFGg51WvOfLdV<^Lk2}B~uQBA@CjtsORnem-BuUXopRdS08~cNe%Zl2vJyfAf2$ix# zb!B2Fk20;l-yP4o@!f)wSx7IgGyn-i4d8~Dl_7k?Bhv0*!ffs*I=5{Ftr-PhQ$)5_ zb~acJS&rBr7+8d%Kc%q;9c{V12}M*K9~dld1yh!&UlAcTG10sh`o@NX)YIV(kU@LT9PbV@f>caPz= z(&cX_d-Ccp5033QOC~oBhre_?T6@D|Y7U~JBEah=7} zsaKbE)atES;boap0)$2+*U=!i3CG$k^n=qKUpCx0=s4f_-3*&P{mu2{E+X5nc7z#) zLh)?ywSiFctPWy5j#}WVGV{uYou`hQ49@36yFzhicm+;V?R*5kyrIHW)naAvvHzQyY><-B|yqZbV z?P0pf*Y7bhJf<$5mC`>qKVCE-H#cdEa&L(G_2fjcr&;g$R6?|15M3#P`juB`4xwuH zXRut~sw*<<%Hp80r}?)7&hdv+J&a}L&g{5^sa8+jcdB@>lwU*+e6Xv)F61b(7YABw zUiX9W^DGU|&+vrhq5D1Xt4 z9@60+i%)lq1Be@t&p3j`+wnENcy%d`eg^67q#l2>ZB4DM}_w2y48{$*6zSW_2qu~Lms{q6JYCb!UL1tNm44jn*K%3bi5=VjN;tnbp3y6l z)GJ|R?(T6W5Kig>vrNTRyf89se~v_;vmrL?m5U9L|tPZLgrR{i2H zzV+*1!@AgZXd*0GzYFsv>fw>c6r+r|9?RT zibKiwBDh)zI1P^fH&oQ%4nL%DISS$YyZ(CW{Jp`_GvUizyPk@s3KJ%?;*%h#JCbK< zLc$G~8W=PQJ*fXqA>g@{iAbg)0{+q&5!vp*^>UeaT52IJUVoKR zgO0AXu|O#orqOqaFCKx$%e6v8;9Xh`|J9sm@OD}Lh$J<>><|HNGeBe2@F*_+bTQ+NI2~Vae{d7n1wgzG#W*=(W zBz({v8LU9bK$E`ygQ*wP++34jY{U}gQOs+XF$Y%KJOJdwuWH|`~4 zGR7s*nBg=}g8i4pn&{vtMRs=H;Wn-A7`OQgIZl8&b?wFWmZ*{ygQv*5n|O`7;Qg$s zb(OhOI*UF5q-d*Ts+A_QeId_ztRyG7ifEy)J_Bd!`Q#LfuNZ3f)TBQ52j?eXXd7S3 z%X+!5tIS3~pa^B#DeR-^$)u@*kmkXTtIK`i*Cw@pR7nq6`rZ3Fi=O#u#2gKrxQbAd zQZGEgKFnmx= zatQA=%&(--F(C2l`XceYT~*t6%kfXiMiX&br1#&& z!c#FN$3hszqL*D}Xzn0Qi2UpBR_*3V>mY|s?pp70o^|#V!kzWC_bm+zk26gtCT8R! zQ^2AG61(Jz^v;n++*JBiSQBSjiLUH%u@kj}N}x4kTTfkJR@m%W#M zRR+vg73&=rHmjkr3D>FfXho^0vX%Z;Hjk~O(1L98UF@!-)U72y_L3(=s^$AuvH>Nh z9v!E^w#8}HX0HkqG+$-nd7P~Z+fT7*?{DwtF#;S_ndlyOPD-JoElg>2u;*Y{Bd74& z%bjE>Ghg-6$4YmT2De4?4}dl34iydRqReQ~@n=e%2{iGQr((~Qpe-)HZhiZLoVurX zl+`fJl;y!jI;9K!23MIxddXdB2~7(x@5^{xK@35!!ZJ6?G2kC(?yzre>RYm!Oh;fP zIng{N)m;I}?n>sE3S+=%6N(w+5&PWY)_3|^fi!Ww8`c6pq(6*|)@YWTr}(D%O@^lU zB=4M9`bJwAKEnVh>{X^e9y?-Q$ltATP504~42LJXM=oK1xEoN*rupmKhM)aaVmeXM zaM5WwNOJk|jX;9+^o?I5``=|55}4s>18NhQtYBbVjLhSGnDzuF0k28@%3$~sah*$< zi$vejbtg4ao`hYD7C28n_62;|#UyB73Gm%MP%@_ELSxbwFrgOU-eIY<6H%{KBe>Lr zm=Mg#2aD0+w zc#|wT;NO&r$gJERBSSpn?~^r?)`QllDC$tx?dSKmdliV3p7J7TB0H-D%q}b0Lr5Xz za6?Q-m7X{tVAAWA&4j2~L)9P){$BO|9Ok>tvVWN7`=|71njV*Rd{!bh>0!ecfEm0! zx4~h+be?bgm^4Yl1_;3uD?q!Xl1LO;l?T%LqQIs;sJ#xB8ZD2ldG&D8@mESgRx;Bo zVXgc!amr>AHCRLi zK`n^ypZ^s2!se)_lFc=!Mi9uBoTFT{N}gMwOaXgW9&+AQrZe9KP&XfVL*#=kkxOsut74QA%Z&^FTw0f@TL_eeNZkx_`&sTpRULzo} zN*woI$@zjm3{KAZzL_}a1<{`CfxdhZ z;cs)_koI0#zxLZ8Hv;NM-K8epM?A{rt1lfJB-&6La}F-lAWvl%j*)i=`Ub`Ww1rlK z{G)JQn@OgQH%!9^3r)`Rhs_JreU3GBrDFC2GO4D7TePq!3!6ih>3yLE z-uRS^>UBzpI&q#>X$|=zajmX2;Zs3QwZIm7(;{lFkd@`aZ}ucqX8}w1<3}6v&%7X< zZHE<^d*qzB(`Y(h&S;3sgtg>*WSfs~`+Vc?dEI-gsQ!c(X@>p|e^Nw1QLd^RL3^>o zT-$E^RRt-CAwTh?@cnA+QENX`q2m>;+Bfgwa9ZiC3$+6+*{^r)(5a34Gzy}`+mqHz zU{aGzlH1$X*S(H9r1wV;Dk1W)0cK+=9B@<%4h`2q?8#!-b5ea?>qRHfQL-yjgB_QTC5@1OfW52K??th7s~OK7qSzQN~Tnr<7K(;i71 zTZiVGiXHUY#D12>o<`h^n(a_BbCdt46)>jFT*f|HY#*l9#c6AWl)Eq6h4~Fp1%F-U z$(1)P7|YZcy-Y?HDsafw{Pyc*=Ou$npdS36q7Wg@vI@wZ?ZR}yV?xmv9kZHGMj+$O z$%;Ng%f3BdJ%23N1%F2c@7E2qH|n9KMCtmftxaQI-g!5@4ds3~ahwv$^7ne3u%|3u z!gu8}-gQY8WV9kFgfF0o;hgT&e+zZ6oOKmFDL4IL?OGvDFfAbb z{ap-cw7oMt`;|rcwX(?6)5ZnN?pQ%@@;l}-MlU_W2A`FRO5#f*zu_L2!cg)2ko@X^=nDn@!C!rNPd-ul8_IXcN=nRjOWv;cSWJCUv%z0-|i`C9YQt*lk+wOWN(!gc|PC;jPh zQA>IiS;4B455<3#JZAA05on@v4)}Thqd|g3`L@YG`|GJa6v=-UW(NN`TKT2bhETK5 zwrg`P8s?K7GiF6M>SVjki}4yTjLr{V<;F{rSy_H*8-{MlKk!L+o26m!l#Vc6S*K*; z(MO7RhPXW(z1@AiNs=!@DTwzvx)G{^I%GPV(tP0_98Eje|ERAU^2svyHgM(*r7)2*2+t||)%5rgp$qLiz9)?*#j zC062COyGP%fOsG{B9NkOD*AEBV_AreKwYO_8*Bu-QzQwQl2Gtwuocg zO{V%aNt+XF{#jz@|1?C?`vV4?3%_Vd`A(!;l891aPP^F4yor=rww(9!6>xVXoi`CP zk($jULYFBs3#A}}AO8mqDSIq#zj zj7wmhJ#kNs0eR1M?#ZT2-TBJkDEFV)ONk_AP!BuUrN>f{&fB~2YQvma?0Kp zy!0c$S#Un%nF6n=-lhd0u+HRgk@b;XH8%1 zwML1l4K8<(`YDO=8?Dk!>^Um7u2B3j336f1aqgWdfG{$+vJ1!emc5n_K|D?~a06i! z893^%p7QYTXOxO3+*ytrmuIT@h0}~FTt4RE1mm9s+HoMygXXq`^KEkt>0e}67|gyr z^`-Zep8vDW#vs|Z*d2^Kz( zz%Ru+E5vPA8{h74U~H2~5AgBVvJSYGa1@NR@zV_JZdUi&(8u#^bAw;4ugAS#I!@=1 zv~?KdqdVNQS&26TH`2YM!8-dfz&JWl0&TPO`l3B7DBl0otIB9ohUqR zff6GppqSO%+X?>qcY%|CimvjM^0I_B|I}<$>Twb>Aa|X2bb`e~lVnQH)8(^4bb6N! z+ECG-6c%49v}Kq$zC{MGTio+8DCsu+8h}w;uU6np;Js`%*&W``35~U@-F#N^OMBim zv{T{axY=e*(xrp(=HXub_>P{?FJ+hN1nqmn^KT5M*5lCk>0RA5=+dTr#8CTV&FF}e zEi{qeB=EHj(RyLCB6R$Ab&Ps7{=pbju=qSgmELORbf)j3D8}s1ALgi^BemnwJGD|c z3Quo{$_-np9e+DlrkW@964OYXMX*qdDgxo0+`-9P89xF$%gJmqe6F>JvjWz=`2{=W2UWiABdobCxEI#PpsrR{B)3FT2FnXq4Pzw? zlRu}j#K2BIKlog?_r`=?+*xjoQ1KFtVgtR*Yy5&Q%ttQIzMtKeTUF-<7Q0O7D#KFf z*P3=0C|4yM2tdKFyt5NANmJ-C&6VAB?c?S*rNBkymK#i#%Ir#0bIm{VZm|515Ty#2 z_GgR#%(LW{zkXMD`1ajpV`$GQFMiYQu+&y^^!y*&{KS3by0P-jbGuI>eu~9YPSX4A z6xK$gio)lJEL)0DuVI05!zSQLNTux`NeSL{I!u53Bx?pRb@K4poTogBN!Y9YZD!SK zP;^J)m?XRSrg;a8dxZEigoK5|4Me5d-amG2)iri(QhP7L1k1@Y9#5mxi>YL%_~=`Q zqkE;t>j6&@4TDM%&px|8*ZuNPj*hk@CdUqSeS*xDIz{o98Np+rUV0-da7_j4>Qji3 zj_ND@`_{rcJfKYeYk|GsG;U@cRTQW!PUrlwk>&+A_}xb09{k%896@^-nwbZofElttAszj zsE6*VEv2`edny{}+ZKDZ6_c0%C(~mVS9CRz>y^EmKk(t(!%U1sM^5Z1XE+v`&+DaI zwAn)n<5LmQ`@JXk&j7G?8qJ_q0_JZu95Gv2du5l?VI@2i)5nc{GJqL$9kx*{gLB?b z3}3fyO^3Avdw^E%BlPZj;y6-xYc@H1{3HAW02X=Bimjy5CZ>!X^w|1BaTBHcA8oA> z(oOxjur8@H6P9Itz;CD#$D(G(6hL$K5Gl=*BxEDRP2aM(M~+Fj=LOd`^g^`fI@4Bt z(;ud5Z9eioSxy`=!ki}jId#*faOU>STLxyu;RsRC+{Nfk!AVq5O#QC>?+fRoSF1Z> z9ve<|3{j1H62e!N_CK7QHl#taOLnGy-#EYDyHQTip_43Om_N#hX9W$UQv5%=#M8<- zxgS4+zE1k^S&Wq+;~Xr00uO7^Y1TbYmIlDph|(U*=&0O(ivA50+0jir%xwsP8=&h!Q8T8?UvLwl` zOz<14w+qR3o=>RYJr5-5(V+23c=nmTp1--J_?pLz=GNmgjR%@Yu&(qvefL9+4qyyo zDQ<8#7bbCOwg=DkG=DgC3O?@en;<{<{yo-Ov(!7-z|$ zo0@#1@Oq(s{uS9rM4JWU3pi3}>)jsU_K_OjDDw+xgFCcw))I>E(T$>uHzPRM@TrZ@GO}7!rUr zE+MME(w~x#67G+?&5qa6DLWbF^HnFv&JyQ(#<|T?PNw7e%-~KPD7U-DQ*QS?vv{Kh?hCrn&0-~Xqp_>CaHqk- z_(swB%lAfyt4dbaJ}oB<>t}dB_6M`XSKvGAaZd#?ac7gQHAqhLd%iOshlNkuLekLT z+dDLsFLKPtMr8Fe!6EQ{3}4d+s6IjTY;^@6sDi)Zbl}PSIC=DTLw3ywPyU6^6hg#8 zapmUO&fnJf_uQXP-UeJ`W}mwIez7`4!_CQd5iN7aJM$BQ^rEqBj)H8ftlnX|NIB#C!}}t{3bgAH!(c9jeD_&kg80O-?&ih_#SHW3T7XQ8>jRfH_gA31etgg- zZfd_*a3cKIQX>**@3~Vo^7ulmPG~XRc$RMI7!D9y-$FEJ&F|9-U24lM==5%*dU~Qo ztt&=&Kv{i@i!=5gTW>4RaO5k-g4!5aA9Mm?x|Z>h7MwfKd06kb+hn^=zHMfwXE>4e zx`DH*>04`Ltxiv6@;}|za>fkwsmWW!HSb~nPJTI;M6q~UH5!txTV{PvAbiIi`9XTH zL%9Dr3{Y+OyyQb0MW`odXNQM_@Q{m6oW}(VF?g%ZDWYF=qP%pvnPGKSyajQ? zDf+aq5d0+vI#ZEw!3hl-K^Dl)y`^`#(7O6| zDa6Xu=+1I;r*CJ&8sy{h*(kunS55r;0V9)0Ts1`}IaMfoxJM6>l5aO`;(Mig9zSm; ze%28)2UX}zkE^(Mp^l8wkIXeKbyv{?CXmV;SJv)!AuWDAtZRJ81+tpggI}yIlDN@d zWq6;8ZfS^ZB_ydmo`?vnN5-knFcw?nid&6JO-VTbn{QiZh=wes5n&+6Zo{%z&$A+d(6&gCE=M9k z_x_BLckB9}RTq74UW-gWsQpmj$ab9{*cFz4`k`wNSrq>*uj&NjbRrF^ffM(R#E+7m z%E;W%LwwDCjR&YZE`kpW58*QALO9D{@N>2T#Zg`@XZ*X_zjJRNAM#Kr7#d7)Y320!O%EMq_(QdoUBwfJI;-BFF``Nf~!y+x4&+$a@Q_Bei(n?(bu%p z*$s}+F`Dyeo_N>!#i*%{!^mdFrio+^QvIA7PFcZ5J41RD#`LlK`AYBU(eXt^xsS(Q z+E&g7jP2)G@A+DSQ*v4w#Fm)hssHj8TjtR{9p87?zdYT1^-K~%z|i}oyk@6p3mK-c z>z^8uDoB=#@J5<{V}jR&JLaF-Oh4F|C5P1OXx&8pxaXAYl<0HIxb}geCtHFK#QDdUVEKA5o_H&g$%LV8A`4! zhFVi7wp5J^h-$NiJo0L)+pPb2(BxunAeMSGyK}+X>EG zg7PIqWtN{RviiDjRB>GTo#)G46%Cu#QnhFpF%{o|-(Rb0^**dFANzW0NXbV?d- z=&4+z3wMcjrSo`io?DwY&w*lhZ66yHPUbcFj`j2rHR^3#=iC%5mAas+ z#Eap*50iVgiJWm9gfIZdkx17kj%_9(Qm+p+m773C7pr#J|FABLQ&=#8cr4;@& zt|Z8@_c6Q^qL4V)9aBkA(yM?Yu^b3i`#MI9%_E52YxO3EmSUDL^4G29H$;dPm!z|* z9gs7DaG+d2fxQH{_)U5)-8riNw(9${2So+vNve=@E7It99|ET0Q-_YEiy2is$_Z7E z;!o^RCM%3|v={&g^WV6+9q?>@GQzhC z36AdRYT@vhwBj@hX^$dZpFEJ9lK@8s{?@xOpW5B;6PRF{e!R#or$CMFkJA>Q>}t3% zkDlcdFBZ`;drp%xgTdq3qCvFJzH^*#P^-OmWNit8P>exIc?&L31+-un4MMOw))+be zcrcbKq=F00^-&kb`&%3Vq1$PS5H za_}gw6WY&ZCT`)(2Ee>_8tI%{bb8WHG)DUx@HXyeL}FjB`W!V3q%G<{cFwhO4|D%0 zq#R5wPdv51BsP041f(Z544IMDOG?IBJWgWR#rTLhnA1XogLtfEjA z!MjxUwgX2;0n=?5md$M_#|;yA8C}n^7Q4+CveVwYNGs3^*G8U!X>ki`6#+!}eS9Y~nm~CwAfkvn<53MdfTq zN4+tJ1IE~*23rY0c09!Fx_pP;qkrJX_PM+IM*h0{)JhZaF`fC_POJ-?jVaYJ#wg+v zkD+Z8L3Jn7%hV(*-ny>$%Ihn*lEdxXzd2M6B>s()oV25(A=9AJ|I>rkGgWl%Uu`#1 zEU12j(m=gM%6kChu}b*X>i32@!nM6uCrOcG4Dc~h_&#ERi$6jkvrroAui>Nf8}@O8 zu3V;Q%_k*aD^s2-6a7NvtsuZx`8b~{sTHb=rh`a`Yi>=vlUSv*K~x)FCTh!0)P(X8 zQIy#<$j?t0B*ON8SFUHAc$J;XY+hN4pBi%$U9#n5digk=IiI`_yY{1N73gFmvqvrzjx?ycWRL>gXI`slGpQ)!aA>E zR)I$i*S88hw}<;PW!p~RmuidsUh?iD3HP9GzP-i~Rhz+-%}T0F|3%jr1j#9udvut} z(Trn_u+A2ht5OminH{aCU9PlIy75sEd9)or_w|yzm1iob6w8%aqIh?e@P|n< z3QLqDaz@kd3KhHi{}J`w(QthK-x5I(Bm~ieAbO&AK|&B#?@RRF%W6xM5IuVDErQ+X zz4zWN%j&(XURQbc^ZottoHPIInK^sz+(Md|yhh`6^mFy^#a%#$ZBf~>~*6r#H> z;TmukkWF z5HCag7tJ@<^QQE+dR30s-_mNdgtj&L9^hFYv;Mt`E1Sdgya25vW?eo#W;uj_76qF2 zY3fGKjXLakg*+!MMlq@(k1k-r&GFnmIW5@-t`U~Cqx#=a{Vvoc2o$EV=9oGPW6a)vK&kf-Sf)cN-Rv=?e>Y7e7-V;f;w zEjUnC!~UWRlP$4ixu1zlMjjdG=4R9s;14h3=?R{LeCbmk=GBTWK0$v67ZZqZ34Ybv z?I=FP%rV7a0nuU5sJ|U}B3XlPwl<0bq$haLK75*Wm_annWix`KZWMmWun5Mm{`&-e zFp7hYiV^AZ#dwPYlK3IP;)-o9@xdVh^*bbHN9RiJtfPxgx5Y5Vg7&t+aHjANS9< z(^Dx3 zU(D8QC1!6~a1S8;7I(l%@fFMH-IC zIm!_ur1z(V**yVu=(2?%t^2;a{a{a%0Mo%Y{|Z*Kr~Zkg<`PzIRcnlm^L6=9g-4gk zx999O$s;JC!FVU6y8~tBlghbQheFy`iIO5NM-!yx!W1-sbZu6g9FQqqrsW&K8Cw%P zcz4I$GHFq+^F`W8Ft(Vt61on-u5%Hk%*{n(MP!pjhWFdkeQR(4`O29aN?KoN2j3OT z`gZc>`)ls6wNH-&d(W9N*mv;J5kxy_uS6{%DtARr_E<}axSQ0OE-z(D!1W&!UiV-u z_q=KHVc4*yGlgtIpsqv4*oOuu?$tOuahSR<8FNYY@QXH3z(Af4FyEZLDT2wyj4A=; zh>oXnpsMcgY$WHyQ5_ng7Hrr)36DafO&MNB0*+ z9!zDWpDud1zjn#FRY`)x7^Hn__`ZT`Yoo++yu?{ntA{0dX)zu?(Q{(w)9h*Im^V-P zmNjL4P3KN>tnxnLTOEg}r0J6*jszd`Eti_Eq6}#w^jcxSbVke{-c!g4s=(j9_UTOz=3>Hc(rj&c`eT3c^zVNvQlr(ZK6~9YTkNa@`b+2Ld_JfmS^5stJZ?7`m#WSh4 zYJxbvPqdT>@<7=Dk49TM@*@a%jyy1?E&I6sIlkA;E!0;?U0GbBU==;#vWKGOi`~Zr zZIUw=;PI^FPQ*L!Uq z_0A2ZyOKRNvqhF{4f=k()hr!5Gj1KP*v{B;HF!L@rS9R4MrVfCE|M0V2s@NPd_?ij zzPw|%d)biLe};AFXlD3(=-YBCxrmX?I@k3M_*o`*&Kdp4W0U8F<3kNnq6(pJ0U6Iv z6T!zusp_BZo-`pP&YWNA@Y+)Qa)@QIkTyt&bB1*EJSnf-F)F>K>+pa5r2zoVt%|cUjzi$7fD<d4+JJ?`u3hRc)8a@}-$Jk!@(aFh}Gi3X}!>ewc}nq>sELroOb^iTq_FS^}=ju1Xt zxIq#2=^BW z3xYV05$~mWZF#roJagnOhCA4v&B()A4ch+J{%8wK!fb;xg+8r)Li<=$!GAs{>Ur*a z!8pN7HrG@u%3>}8m?Q$xG7&lc*G-T#xeivdR5_gPzKK?gZB-bw;jHnNAD&PsE|;b= zR$?@DFS++ws|+fSd7jvn>C<04qOYbw0dqH5nESo=#Jt@gz0N?~1NJK>)RoBIV{@Ez zYeIF#)VE^q#2~v43EHx*nV~AU$2(`WS9Z6~Vm%`>UGBdNE~`(fSs`hYKv168Utx7T zg7}{MHElygm#3l-9|)z;?|Bnp88Q^f2*6Qz9jS;yp4pqD>`sC$T1TA^(gHXPJB_tLXer z3Xdd3gdOkVpu7xl%Sf*B67}T3?|<2?qa)U1zZ3tP6?x|@Nk;MPwv5xViB_@E!kc=L zqt6CjAUq0`+$A0VAEcu^bXQdyAf(peKa1Hs8sGS!syBM90)BU|cGE?XT1pgehGpRW zC2(EEd-5<%Qd1D=*&-o|nneY!u*(Il{LQM5E?BK0e-MUS^nGn*`iT2)+j>Gj$l z^XqGi@MX1qu{T4LwK?lNO*w%6x^yK*x03e|gy$C>f!XmFuhu~&q$oh50mmBvi3;^!m};$qo{l8 zHE@(I=nuEGcTxyBbJ$CmWX1kPOzTbL1<2^(PuV`a*uRa#e##kU5r@ME-F}ymbYq#A zoW%+)^hc5lYdjic9ZR(dx!y7RKNG58(NrwX@k+g0Ej$0Ko*9@g(VOauq;pt){r9#O zDB9@lu~~OizjjJP1wszD`JF+O5P|S|^&N&E`K33X*H#SPN@i}!1*tIe;ctMhYa zeyz{{%qv-VzO{s5?J-wDSwy0(uhH9hiXg4su;}6i?(^X0wt*L%jRjKzUPT*bnetth zQ%oSKC5X}%7BHN)(pjdiOrmd3W@G=~s~IN$cnY}3?xdX^5BJXG@NQh&fLJD1k02gn z+v~nkbg0H!$vnbLHW}Wano>JgMDxI0CF=NA__RhK73`f@yJl(nP}VKi#4q8!4{iea zZ=cDh4-a@A{`8ODj}|SK=P;a)ynv>0K`RyV7(<)|Qy0obt<#5f-HT_Lt1f-GdJJb8 zgZzcziPZxckpRjsPABe*=%(;mxEj;QiEj9FNcfLNxPD0RYlmlUhsdoFIbG{K>jw95t{hXUO8?X9$%c%`-n|U)YxH4?X%*78pcdI& z`PKkU7tz|uDFRbA3@7mCw>@MX2R<;&)IW^&W*r+uGcAf6yQxcEOwY`h`E(*{tSf>i zr{QRkl&nb@sx7vep*Ov!e= z3XaWv>b9W?cnvj$Me~=>&ftkpTsGZH1O70gvYg^Z3wCt`fG)7HLpX`yc;W5kiEp;L zVshmXZk=JWg(<*OD%nE$zn}WR@S}TKw2x8y@M7!)+%oTZ{05kY@6%b`wM^o%O^}&v zbBK#NXR~kd5ZD4l#b7VJJj7jg-)3)&zYLB)f#W|?!)QRtwy-RxCU+KlfKVwCeLoT( z-L~yrBv&KyL}!R-S=Pas6TZGQf>b`8k@E&~Btl{YtiSX|Kb;f>u zx}VQ&XyiVs4iMyRq8Ssb)Diop75K=P#54-3j~=u`;?7U#%9XwgIG|-(8j_0M8DI zNKe}b3oYRG+N&+Gi4v`g!Px$$eCPKE3*{`camSodH4 zIzLLF?_g)dAnJd^sMIkds$_{E(ej?r-3%je`Zqe^RxWP5IrWvJVr^l-r}KDP*dno; zH;&YE3Vdn)+SVuV?RIk{1A!y-?*o<5*>JD7Fbhq_t`5Txk-Ifcr3ZL(Jd1a*-|#+% zUGlu6uQa-T-^4cqCBs}ekZ0TK-z@L;dEt|O4Z+mN(eaZUIl&43(_<%pt^%=KRUqc} z=tW%A6R}n3{hHom7BrDnvIwOLdTGEZ;^R)_vPp@W%0;Uw%kFMU71)q;g@^_(<~b+tbRsX~Jy-`YxuUCMsMrXSPi1~i@T(3ua#eQzGD@2& zTW!zQ4f?{P7ZC&vOR;`>xV9+D!>9L#u9)|x)x_V}#ff1@&l#q1v}0PdJANk}-6Lxl zFAtv$z3-{$=)CA)Q0*k}@hJake&Sv_y7xTGC$btp zo&jCtiUqHQq;RS8ErAG>Z_)O>FDdib@e{s4g{hejO7@JjA*!1(ngC6QX|)*H8IsxR zR7PB@w!fBY4Qn}=d{9d|ZPl?sjAmZ|B!k?gHLiHNdaI+!zk#C|@2%36y~%j9eIZzM zOhJA>-OYfKYZh1Q|2NN{vOk%l116wop0G|{T4 zl5vIgUa{L!)oCn~X6t3$tm*`{T)tIbk|3=vpO_jYH{>JM;8w*HWVv?gg`%J3?nuvy zOx@C+SQXIl@qbQ)%obC|pdeAXh@RF@NHiz7W?<-l8ljCqmmhpXnMz$tsK+|E@9%kA z+*X$t4s2;;X;0GE#X+2K4M+dl4$wbr)?F2+J5W#SB|(aH4705P||j;4|{n! z7|}(jm*Zpn+K{ag4hkIoYNK4Z3ceZK>x3Zb_!&c$W<@!{ZtFKKTx&S7h0+6A6+d^anZ+$eT!UIN&|WXhj5 z8}kvG_X&kGyq7(sS4-Z|n>LiornkjGn`4yLB{_sMyr9dRHqb4XM*7~ZuyYolbn~y= zA0Zgow=emX?t0X&fjM3u2<9bb1TL&+Wz(@;Hr1JzQS8QV`B=!Lvs0uFgWSd8S9D4? z*=5345Q!d~ojMwWqZ}%MSXx=cgM}jed`U_HqL)_ux9Q66KvvF5prVg))~b{Mc33qS!={ z6jFBxNg5vRe{H+|_34@lXy|MPmj}p2E^&{3x*l4`Z^i1DdMfO1^*e)ZtG`V}&O}JB zt#yP|NIM!^DP>E2QrkByXbFe)N;dV0ajN;%omGFOlqf6Rdrf}UMMsf1rsun%7Hy$H zK7`hke_jpuQj9lI{ww1wZ(o1Z2TEyD5_va{oO_@5x}O>47kjUcsMJHQ>2Sd2z0ung zjb_ctVj^n!m7#~f8uOAs^&U-+Ki9Nq6gYf}&qbA#F6Ch8DvIp(v}a!-|HiPPSO{HW zVW%aj1@nik&8}Fsr~1SAm}O43gu#aiRl-2Ndp4+JBJ!>Fo`W24npZ-vu{MQ#IXSug z{^vF)>%yQd5fm^bs`6$@dn3gC<2KJQ-TMS)7ihDUJ5sZ1mUSvb>#D3xQrkb5s$>oZ#9E>6PY@VAB>EJ^3)iX??!+QLOR>#r^e~ zzUwBxG+-gmucKoNoUukAbuCAG+E^LK(ZWE~-!+|s ziAntjlP{^^7bT9Au6`+izdGSO9a_02;|bimhBraP?^TFA;eQm`EAgo9)tG)48tbd71Xa+Nz{x*odxYsHv{vR|{Y{@T{p3k#mfNH! zi4(7~1d)_^h)1NLcLy;M&7`wTXr9M1SYy@zaq4V2Mp3Z3x%N^gPybiUJ;(?&?u)(M z1l2FLg2h1Qs0RQ;cxe3ynsGxweQx4uI-D$*3Ag<_O~*> zja-(*M3XQzkqPi;vxgoH)sw-3NYa(d^)~hX#K)?^q-jCY3++{o(uPvILP0Rw8}sx* zjEwzcBcr|aH!9d2$?wTl_7F$aM=b?p79v=6WRiMnl;w!1yms;Pt_4F(0&5s6?QMrW zH20?-Y!Fnh9LpYOG5KGET;&IrIhE2_i~lf|-q&uM9X^P&mK7q7exG_*r#s7-^WE0C z4>^i3J;`!bo_b}Ks|scyYAFS6kS0X)dbZ5M918u(pFNcr)7o`8&Nl-Za(e!~Wc&=b zH~u@-YH3}ae&sBsNY!)Vf!&cstNYQ@bJuo`Tt@3AC|?#@J?_5fr{`yJ*`9Ra{S`?3 zg&FfUp-g@DOoO3&I|JCNLTLy!Wbv9UNV0;C%VB}#x~^v35;_{1M-3KKmsoMGIokV- zt=mwpVvi!MgnuGx-3B}61_v;N2$@A`^iQi*PZZ96tgIIPa8R*;kYx2QTx^Xu8ZOPS zLV^tU6PN9xiH@7zolVs^d-Z!6)Q((X8MXb(KNytbl7E&RQXJ&6{Vgfvtn24}A^5bZ zJl6Qkw%FALIyeAt;S;H-5fW?27m^U+5i=al>>_JPVB#sxb?8fcPXOJ_%gI}`mi${0 zPB&ozQ00~*e*0Xzfjd5g_fzYSeoTp&cNu_uFYH%e)f|rh!{Os53E^dTvD-myCjLZl zR_g>ARDmxR5Nl8|c`gkmVe|01A+C`R0M--y*2ai)(cZ`Z{Pi2L_*PXrVa$S#{nXl9 zY^m2N-6TvPFB{23|2U2fVoZa++>obnzGRr14+b(c27S6y39jR`qbsC;hHJJ%0497YNPC%D!gQI%6w=mrWS`Oe{^<7=+-*jnv=D9_g&sr(Z*(@15G>nH4Tu(lHLDh}aT z9NoBp*#%~G6{+73@6ry4(v+b2e`1K-7Pv(=Ef8dSF!V)t{{j=za(!1kBzfJ=TB#M& zzUdB+FHXuQo|jI(;5c-J`*VfEfg70)EfGJ%6 zvUDoPJw;d>+H5Ah%tiaC(Gy5WFyWU><8tVlM0I3l8@|U{up-e^7Qu{3X*DC2jU)tlm54{<+)y|9n3Rev|}pX(KQ zA=K8}0E?>SOp@UzrM>u3V(Yd`9;8WQ^deBuaijgIP~eKC(ZA3hDvfIv-Jy>j$W-sB#I^fgduU|Ol>Z?tpLnDHBO6aT58${nC_5rJG*s{>uK&1b)=G`HC5tZ% zNy0VoBQV|Nd;sWmYwpl$*y0MEsjj6zwf5kIY)(t1eWZB#gh8gq8lDK=o;_?5+y>b# z`t?KuZ;%iI(K=8|mJta?WIw3s;Md|tRDT81#&<*M;Nn&giTip;_#xc9uE66q5OOQl zkzTM5_epkbVGKM6?&=!yGO=je%EO4F`dN3K=gM59CCCTpMlpEW%KK!wfN@%4<^{rY z^T(F#QmM8_giyp=FAH{ztZaf414UYiZ&C*e0|P%!agHR2OMNLPj(*pGDov+sVuG@q z-#uAh^*)w8r=pc_22;B{`$fCa6$HF<-+V!b5wl(wR54%wF%1h6`zLtc_Q^#_loV7{ zXIgb%q)qIkVq{6`M%?1oHQmEn&g*F9m)M}NA@xD>ipQ?`e3Eza^UQ_MK$rUZg7fkv z_oO1fy14EIhR9y;ppdmm?`+?Qa@?2j^#;s9!lx0cH^26?y4dHnwOT z@T&^&%agcy5aeKtKQ81COI+M%ILymJOy#qO6K~$ zRr;)#2p!xomAot}#50+k{f7O;&|yx++VST%4IFr*;*5Hn9C4x!@9}iC3-VLe;A9-}rp88pO)eDB^EsiD1gLvpm0>+5O|@ zSdz>#N;jgh;~dbp>6N=>aVhm^=Bu+F8s%)rEV^%?z0u2WR(0b5op{;KW`It9W^fsh zH!CL{uwWG{hy7Ii{kmhmw!~bwf{uZ+sc-X(vEJ;~CLs$aUtf+cB}X9hH_-DDlXx=7 zW=~);;=|2YygRqBo7%XryBa$9;-C@D?=s*bJ-y_e#D;m7skyn!HdS%rWGW-hNm%J`Kb_Q~cJNA7|un8X;p?eP8hXDq+)y%{=t$lt;tXOT3B; zN7v5fzgX*}99vW5>1^xwj`YeR+7w6rN!2t9<^jj}OKg23E_Y$nGyz}Py1@pc*|DY- z-#ZZ8ILE)JC+prosLYYH?1xk-zhg>I;{6pn+{ubW_8EhjMWY0OwHhBh#|BX-Lf=Fz8=8cD@R3u%+PWwA%Mc(l zFvKmiplSE_PAEmtW?%8=v3D^J&&=fky7$86&EF<@C_|t5Gs1q2rrL^}r)_TSDmj_= z5|!S>W&8rulF@vge7r<0qyGB(a(Ui>xcy90?=Brr&Lpn)%sVDmMCBfLE_x4G!do!A z3ip{KoQK*z8Ct;GKtTF)#?A@M3wl~_deJeam!m}YcEAC*Sia31O1ua%@u5F22f3Nw z?unm$LQHpheICV~N*8!s<8LX2mFw&KZhdp&dAj!Dz)Vg=qT~xn>NnrMGDe%j&&NG`GoCiE|I?@+7a+PL$z;q7rDBVRZ699;u3uh3 z2c`aOZ;)7Xlc zC_w)+pFEhl|LxX7lcYb|A#RB9x47DW`2GiF_p0G*9S4tMW=2%K(y_%wY?znz@%ih3 zG%;FEzsUUx`pF?B-Peov27}Q6U6H^aIn;^w{jB3PU6#6O;?)jfMz)IvP1tgCPMLh>n|%yQJ}Tx$}!yo&LDHJJE`0tMI;{w%k) zO>yHE5n3Pp{oV72nr|QCO2@Iyb$^HYDsyIYRQ|@cT5(ygdIu0asA*E7%E{%55H)c+ z^}LGvej{JxumDwA8cLojE~);$Jt;@Hf$JecyKs_U*fIGDUSnnbkK;EH9j6`{2T@k* z7B34YNjhpWYjY?$Yy`av-9AeSQ}SP_P8Rdmb#ie!O|FZ1hw~-zCU0(G!M|fqn=ANB z$J2V^IYF)8+Le(9+|dIlUFpMPvgN##&+jm_T^_`Rn`g9FfTuB0$0tp@^~2| zp+h9FHL6*MIalXSle@r(QJ+nAZVAU43|n7=b7JR-$qX)d0ft{mN9g`JV_jI?jVw7t z-)e9TVgs3yp{$}MuVdl*4BIW+B&X}T*GayLlTkFcZ{;&cj|deCDeVETR~CxI!~T8d z;`QnzHdxJDN#NP{*l#3L6n|9p^K&Y8zE_Lch-uSy(DpN83SgB4+& zPS)?ow0nukp(po~=IC`M=U2D;yyiC;+0`Xbqq%fG{Mf%F`IV*8}2uPOuJn!)Uh(j(L`Sk;(6Bu<+qo8269<8HPPHJN=iwvR3&~ zx4z<8R9BL8;jc>NI=6+5-wg^{5H+pn#F=nK;_ci>)C14sH+kSb!sCNrZv4bzw;D@Y z`dk(N8VO|*AIyT$aJ>8*gWoc`JL5AmeAsAb+E9CR zS2}8pmXBPW8;+sfVUH(BDji76X*khigy5C7*J{LUnLc{u-9M0y(q8_!I|MKfksaF> zmBsv7(Yh2{vF0Un3h54y2`xgrRl=vQqko>Y^J+B@i{OXm@s8dpasoqfn|Omk!SYA- z`=@EFDoIyK678Zh1S(sBYe8?9B$Gp`Cu5VuUvT_k`{8rDOQ&LxJ7b$B&OY`q&>=M+ zxMq3?F02S^-x-?OYSND5r|ZsH@Yy69!~IRBk1P8Ky$9*RR*Buabv$&6j3^K8>lFfSG0Sb)`yZGSTyo35CsARZ8`0OC~O$b`7+?p(=UKZiRT4g`gC1odvr6M%( zGL{}H$S^TX(&pgvB?T^en?k`Ic|h*+kKcyH{{&Wl`MU1m%zrTPG57KC$iQj;E7w!B zwiZ`|D&nXt0a9^>PdAXbN%ef~#f|f}n?p;5NPYNH&6;bd!!7O%e1wbZ+Ey$SIGXdmu-M1j7}>u^EJC_I^n+cXSsTx`-|ODLv){ZOw0 z7XmSKu(Sw_7XK#d%Hn>t+=3>C3$5_N)i`6Wsh@B?^OYTa@I8VC#Riuqz zU)nak+1;4P$~kW{v7d~(ycS?{rV1_7?|H&v4;@{e8$q~5&DNg1^Q{teIQ2ICN2VV_&ljn$MVOhT^e)Zs-+=PQy7`8|Ws+r5GRd-a>YA%Cy z%|I^pbQg{k3LdHxt(zhJqJ1Y^AdmghC*oFzhv!s1p z9%UpO1zio;@5J28K<;9s8Dmc0h@76DjVl<&rT#FYb1qFQ{^Yq45FxUW<8UlyE|XO) zc4}&vAClpZR{`;0NBxIQ4NUb(sYuhTL$TwC26l z+BWPpOYteWi^zKR)zo>Wnu85FG1$(5adEkU5FUj1@qVyp2-tE?1Ld zr>i!l{GDC=j;nX!CI_)`9h^y9z$t=T515&_Dq(T(A*lTNbQzrmrc@Pq$vNtPqHHY` z@O8Ds&n}Wld5$491M%=nxW$`z5avExH&zn=o;Y)FXr5*Nt9RCc#1iP5xG*VeB#3ZV z+1hUVJduAB94YZ=E|@v>Z8_#MgFJs+_|-dmy_2gN__kl=BHXbCrCVPUqgDOr#XMtV zwBQ@%7!xJfFttD?nb15%m2CR@TlY!Y`XZzyn4`{K&tU|=&Ymptrkj7ubA^P$m0FUj zH^bcYUt+Jpysy3v{V`@gAJ(y@qBj2?0M@`ho1_aJvIBhqm$;%zIqeN@Kl{!vLZY|| zOiXXDZ|PmAoqgZ+Tz+|?OC#rNk1l^+#ENrAjE0olsgX24>jpideB@TKS&q)W4b>e) z2MW~;hL{xcAimk$`u*$zuSN&9A+%nBW_a&ZJ+c z>w-$A>;4$-9C4Y5-bK&wd&jpMe-FTSfcy>ujw9O9NLZjpDomYi}V&T%dt z0Q?0X&HPPmAr<^lxyX^?sk!e!HV#@Qo?+NtNcC&{fB*+-MHUZ^kDBdX;jX#YY%h7X zT;Vng)S8pFdzQQq7IewR=tCQ6ocviN(ARp#AUvkCAEXXgJjz=DR!BYS{B}v9zkVYH`%yxk%;ERG~)Gj4SF;@E%rGK2CG1u$+b` zVsqy`Yr8Hz{)&y92Xw(8@7*>=xO)8W7#iga< zPaeYFxZbtjEwcK#X4=aVo|MR?-&B-s#}o8{o))i-vGNeJuOKlRI*_SFkUmjE0hccV3{fkO`r)aaUKgmi& z7G5fOjly`*E8J}>A5GR{D|88mY3&kD`)F_!M0_G302$bkpB3H+%wAz+T!Ft&uBD?= zMQ;&=O^eC&N|UQ=fNiFCIoAUP?rK#2ef@+!t$-|{)Jx%?hb%|_oSi4D)!96A&cz)o zb5Fw8yI%1YdnovY~m;Kx(S*#dHyL8XJC;7UyO#*j0dQ3g{4LqTokilD%=6Ou1 z&~zoX@!lVEmc+Amjc5~`Y(-(|(yCb%qU6&68X{+h2aVa6%j_!Fw~d>9jIL+J5zbV0 z0IGW*aN&1z-NHXUg{nI_Os&2PmQA|I3(h%6v^sbjYawc5W+Tf>Uz%#!gWE6=9ZG># zQbn!jXVs2*R2>A>OnU5!iX2|Lw-x~xn8ZV`h8Ikzl#r=)g;7-vmVWmxzF&OV-=2~> zH{0?a!WsJa&~BYNuwR!)> zSKHa+S6?FhL(B*1=6N39w^XjIijM%8gQY=@H9IN&TMMwJ{s1CMym#oXmAGElrH!)C!Q^6Kz@Gv)S-#)bg$ z&+$N4*YIqYv895%Y}uqODx$`Wf;o9PEUhT}lPKum4|iO$W4N>9HCmXXM>jE>oR>8* z&~aj-xTK8qjbT6AuCJ_3mKeLD2$*o{6EC&1nPLSv<2Q_Rrg)oZnrCAz4$87qgs^xQ z`>-?H!TSS)7;)eG?~h%jU*)qTvMcwuCi6|Wv`jkH<~eT%lICpR8I049`Zzlw^K!n$ zy#BlW^h~!fY-QQ+(Z>k!@iqk)^w#fxphZx;VD|jsN>tAB|yP zm1ka8D!$S(tl`(g=Y$6@w^KFLv69V5i6orP3Lltj6~v!Aka4H; z_T5cC>^)3?$k{qeV_)8`7I;?mGNp!F;RLtDo31mOT0PXO-cuQM$u1@g2hJSUc|t1J zW!Z4^-s))@)iA1|9v+NHc&%O(so!TmZa;7=TikLd1}ucX%g~nqipX!@+a?VV{Fax> z;*ev!a1Vyj&yWvP+$PfTGT`_l)r%8I{jWpo92t}nhEs!%L=Yz=D4O^3*kehUVlauN zt7(hLveo7wEu)L*O_J>reM^dH1SPGREg}U=Jqj3`jQA zarz@BaLqPzKexQ6k2{FF9@Dh&Bn8gC!LaAXn4=;(Pt@hgV2ZX|1 z|JC8f&q8YA+X8(%Ym=xe$>)YKp6G*%{hZAHvAL~P3V7y22Yo}>`;-2YYg7S_0=NfJ zSOd1f1_matTOz1+DCO=yR9XB$6R1%Pz)*^JmqfH&R{j*w82OOK_u9=gZAQ0ssTl*k za*8mrvzDLq>LsED>{wmD)i56V=xQYYdUIVnd7k874=q)g80XFT|1(jTK@5j|6{7u3 z@83>ys=P`c+N0R`)bFJk{v?YW6`d9rlwAr(IPOO)HOe8WUd6*CV^!VI0H8Pa;);a{ z01juo-*G=pWD_o3LAXeb*?uDYRNuDDnwi)I3w!@EeD-Nn#OB0(gNxgRuDDct?l`=W z19oGNS$28&UY6@yA#PT6Rz(2!*QFWf$>J9C4(zQug0kPjKh|>{qOJC{eX2a&zN~)E zz|k11A<7^vwzON>54=JbdIQn!&`?lvM#gN1;^p78Fq(pUD(09RNY6e-3H>+@n7Ej| zK-uK&t!JUP%tHLsuLxb5Rf@0(vFZqwY<2UuXH1CYHjcaUN0oOSu_VPoaFTK{+K2v~ zTT98iSViG9+!!+X9%}jaIV;a#1%IPoDn`d#;x~G$v5M(Q$~IkK$<{8hms->@MXo!v z$&%{i{$-W#=#vV8DGNmb#R3Z=Nx!J{VCKNda7aH5g1g>Ugw)ac(8yDxYq&qN7R>;k zx@|tV(%XDS9tTL8UL|Cd0GtaR9Xgc<`el5YRxlA*RWFD} zFO_0I6KJQG{zmHTA|sX@&CQ3lI+`s|2F`A;u7@aeF;Q&~wOoKr8RNUavLHjIL20Ul ztaE!Hjro=Vjf{Q>^?rQeLeZn)K=(QYl_*^2sspFC4ElQ}_IOt;o^ zoBS8Quz~|=*gNrX1NhnAU)QLs?7h`7ioS{_4Y?#F>pQ(SEnIV2{$3)a>|-*H_rx&o z^sh6tK=sMeY44>?8hbm~lxg1r7*-?wec$w{;%t4gA=pNyNM66VNqkXZN+W>2>~7~* zLlkn5opXed2=A(ShlVvqeur>MyD?~m9ar=l8QKM9sXJNIiKRvkNoT|zkEi(U+BWAl zG0f;Y@O!Xa8h(zY4Y9isJIz%%+KTeYc>lskloxW`HX>(t2(`ba!@R z`m?oDr=rcskCcZuV6G!&I1W>rs@oegiGC<$v{#JP;Zd(b@$dGNDw37DcEuY4#8Auf z)BPm!^s;;7Y%VZ5(MtcstcvQqrqp#ay3gazYG|iQDeFPD4V}S)Xd+LQxlAS3l%1y# z*nw?l-_3RVd0lk(*Tm-+*(rTJIp@z7wnp^_g!?btlo%aFa&bW){{xCa(Swe+(i@sb zVmo&4l3@P>jlE^@OxKAwqau*4tLKarr$iZ-aodjn0rwtdmfb+sSc#jV1-aU!kj&FR zm!-?gVDuAw&%X^G!F*fP=ytU5M>T^fUjSd$*x^+a;Pu7@Pb_uU>+rXAzhctz?*zpI zs9kT0O}O3QQ6^M}f*=5G{by0RY=f`+=%i{rC_n;4S^XQ)j#dfrMVZ#1$(;_VhEg>S z!iZh%Kw^ajT&d&GtJL-W5~`=d3{i9MJca)r&wKRT@c*W@g+bgiq&)`cLwEm(KGyye z)b)y1Lqad3qUN4_Ow7({8=++*1PuDn6^NeN?R5CIHCz7WzEizyOZTG(^2Vk#QAY%d znjZz^b39Hm$8}}4u?s#~7c;J%bxNSK4uv}YV+5sIjZ-1<2d^&sF+sps3$T>$I4DMI zy~ zTtiAXT8hslcVr6Wxsxf_rQ!z#nO3&zm=9@EQ{GV6RPX=|D{f}lNrFUxeA5c%E~a}0 zIOOk$ladqr7Zg3naLh-T963)q{v!A~Ci%96KLimMf)5jRtc+cncVv_AX#1WYK1-$L z#!CiPQ>?m|*W3ODP4^~jAW~JBKNU%3*#QjHCaxZR_B$TeTfef}=T^Rt$w*T#P~>G* zvy|aAPLeaxvrc1}d9&!EbauL%A$2o8H`T>Bd;B2?Ib7fyx967a5&Qhlo^|qAa$52( z3ma*jpYw}-4-u$>cIRjIjWbF1Z`;|vqYLVG-v~8Ix zUh@>#AS;;n9igmGqO0T+(JX8Yw(yfLy*xbG`t0s(XCih&T6$T2vSsEz|6*{jkxE;+ ziE7a#R8#j-qwEVw`7!cQF?GiCYm;isOkifHa+;iEfP#8ga12R|IV^~``o*1F;gj;1 z*OiOJjuj>YU6}H9U4W+Ao0PM7-uJ9Jb*{8!ZcN`2u+x*rR`I50ZHdb))g`V7`MI;l zMon+TYzw?@d>v?qia)@ceQSHAf6PL3Ef!i2%0MNHu?^FUQDMumH;N66u8LSjs`1m$ z9$0iG?(gpj4rNqH*Pt%~v;_}gsgdNwcKXzh9pP~@IOv!|35W_MRrZ^B?To~bO)={w z^YZGj?Shcqt%#v!S5y)Nm<+5iwe>@xrO2Qy^b}ieaMo_MJ&Vq4^04zel%48Y&JAC# zbnMh;mG`r;O&!jDon3ftn;7eLkzMvhZuKVjrs+;~nvE{h*@I8a+}zw#oj{zDI-_F|wRxXsK~F-|86sr$4i) z;1n%q5oSw$eHTWO_%&HA!0)L=pG!FM=-z2u1z8+ZC6{UiNzERg$10ve1?)2W8sFiA^xYz%V$_yD;qi>}I>CY8Tk-68sqt%)V%4wHVf_p0+ z(*KXCw+xD_3$}(K1WB+ETmr$}-G(Ftm%&{^aCaD-1h)`^+YAH??(XjH?(TyP3-9(exItY-RIOk-D~aMYsDu>Bs6A$+5&IGKl*Xn?rM9@?Y5*`N^p|@{JGu$Q?l|J zhyA&9Rkbh*`@UGh6E*DAc~1S+?UKs8WA&S=Tkn9NQdxdQgoFrA_WJN$@($dD&|in2 z4B;(2Va5K9LA@okkoC1^dvLkc$xwxXerYX+NU)8gHD=MJF59QZ(0$UYzmR(bes@%z zK4np3bfUyu5sFcI(E(HWuGC~B#-CR6cQ30g#_2T|zia&$Lsa@}L&C1jZ*n{Ni+S|* zKYr#9=r@1ydxM@l=l&fWIbiqeu2CalT7%d<$1g8b?-$?s4(D;0i(4`|{z3a|5i}?6Swd6JX3>>;^4MkF3>SGCEO~c^_T(OS% z%9=7I(fC8_;#clWh)Bm}PGi;iTT@jsZ>xj;qV>9J?gsdJmg8j7h?rUrZ?0ew(lypc z+?O3A_=Y&KPhBqZ1@o5=m4pXea>MflG`}{Cd$vkGYo2da8KtCdEfMY}p$o@bPq#@M ztv#w!aK`NKuVT56Hs_EYweJmJNr`fK^P?%5G98hmWY^ihsN3)FWn%Kq`lc27hGby! zYX12G0Nr&dnj2KyS97ULRfQL51@jV)VTC6PK-9rap**6hSB_wjTc1g>nG1#?mlb$uV>w{;j#5(AaZ?!RwrcOLgS z)z;dSgxHD3x(yAZ$D-{Gn+abfYL=B#?G+s|+yULC#&sXy*VDKG=Z6K5jLOX4e$aO% zCv&mHw}ZuI{A4J|A*%kg{dL(-tGk3yCF|8_2`uE zA|@tf*i&xOzBjpsWH#{PvCLBL@BE75>ah}V8oME3jf)B94T}9gK{FncTKc z@yr;{f&0kGVLQARO=*k`scgIGJFIF+@tJ6~v$|udgy}s?Cs5>D3ZkhCy)!WXoMy&u zfiI!{d1{#}9kSmFfXKcFYe*JM7rbHU4gDW!t(PI*a{CHBtIEf4IY@}Akz!0u_bk%~ zqupLo|A!fd!$cQ498UQ^=d4(AS@FbaR{H&BT@uzS3I3Dio(b7rWfU2tCNaS=?^E?& zzY)9i@{0G6qNX8^`yYw5Ov8|W4!~fOia-ogbvYr3^i?>Xl?Ju{1*)Ny9^gVj9pk7W zV8Bl{=8${v+w?`)H`~GTZpc zg+6IbdtwgpmyW2J?` zX{+3^_4HuddZia7f7|%lzL!AXx-uEtQ@_Vs!$8mW4j%pJ=@gl?0&=1@i@5|q+jtQ` zo6=lUlJkJW|0O8X@Njx?iOO%Iii zmnSJ`7nusRcV47mk`lfNd(gZq(SP0yyECwX8$>C%llpev5@Pz@MkNr^hZkiWB`KXy z>gEn}&k}OWb;}UszD+C<5z-)c3JZ5L-2imvtg0&S7~l3;pHaVcp3!cd0{i*TEB#U= zKv~?CF%rOU|0rDWA%CX56k|+7{i!1S4tJM?(AhQkcWClfuROkJaSGvLONt+Nhpv>g z@9P@15tMkp`8y5|^eg71%4{q-`r$th&PSo64^@cZ1>|3Tjk~J~$d?|K-JZgEp`A8uRm+ zOnWrn3Z}dyg==s0ljCFnkvL#`?gmHNk8469N@_-$Q zHNWn=C~*f1 zl%wCqkFb0NTvVMVPvw&FXMh^(ZqaCy<*NR|NM?Y9|Mhsgo4JS(`VeXPOYL|k4MKei z9&Egwa|D*JayEa@uZ0s~SSlOe0RqQ+`!%7i0f#KM!@WP+4}~=-z#~+@*VPHGpu&H@ ze-r%t+)9JuiGNMm=~D7L;AqM4{$ms(;4z3(n)+O>5c{Ofn((#|3qgZK`;dX)1GjNiwUN)JI2y#&{D`}*0 z2QO~d{_%eI03;*^9@%wc8^U3qH3iJ9F49ZTZZRWOdOE%2pKWG;S3`}h6KK052rM7s zd~Be0cu2k2sza5#{kB1beEC@2IP}=I+-EV|XJpaBqcHVr=eW~#*^)(lxAu5Gshq>m z-N8}Qt93WId}xu%c&6wzyPd;v&x)^BoXb_ylE}zxp8B-K62&;R8Ni=Aa<)vUcsU5Si1&DW{xoL@E&E8oK&)$Y4 zK$8`p(@MSNFam5b90{0M*@4lX)f>Dn=c3>Xc~&i)q3d2jh;bri*B$}#&G7d6?SN?P z3a?vJEvE632%oHP8BNQSjob0^j_bL8KxWwlAclLXvu2rLbm~YZT?Ho)Tl1AsN%DIA z;5gZPvbSN+mj1_u*!Iw>Ok>bTX*f*_)W%KQ3Rmd>*HJLpf7`me9E^vS#eNPXCkO*{ zk*Dp^o!*MU<pNpTvai99pC3r||yJ=eJRgqZjF-)wwA%gX~s+%?@0#>8WJS=d56Y3urZ#;uhjw*jdn8JL8&NNw{M_Au( zL`|`D<*+5od*X(E-cJsb-KOxDp9MmFCU@y=<2`j!qS2`BKt?Qy?8+zi9Z1eyMkO}y zjpZ$cJA)LK&;(U+q_!_I#0`*!O#L2zKSzZjt~5PzuDh=g?BMps`>Uh<>3uojc<5}w zb7|Lpw!!e_{9Rtk`h4nsuanx@qdz75_IzoqY4PxH;zn7@y4^NQL#wq{jU~HY3RPuJx>gJ za{m=YNADNsyHjeV#8gZ9_?C4jaMMb(D}YbUv8x_83{5^yn=GJO^iG8*HQ#p*7dt@x zwd1bFk9entH)1MmvEsOkmO&ELvuj8g$-A2ANX-0=6G^OS6GUFon0{-PKbS=C0AhE6 z{hPQ8(!KzSyCR;U=0L-7Si8q!5lh+l_6c@zQS-^Gb)0{XTgN&SN76dF%F}q98(w)#Q@3+%P4D zER(F+ek-Z+KH{)&@^G1@+5*VKs>0j+&hC>-XWg*J(f!aur}s9;II`((H<54F3?prM zD66R^zWY;^fj81nQ8t=HZeHqO&OIj22Rod!!%7`+01lyG=SzE$G1$P={ z#_MoPP%%eaq{H|6_!U07K6AGWUhlY)E0_X?7omJuGB_OXFMZ>uK$I=4BMLJfc# zOY7o_@RJz27)}7C z4A~qb=Am4M&&f}5{LjK7yrTAw93v44uftK~a2IIllmPlv+wVOkwO%wD7effXH2pL- zpPvR?&al9UmqLzz_-J6sRa5auOht3`BjQ7^dz9>KB^Sh8u}}IZC6EK zrk5ll1OpBwjPCO0TThp?S9#q=Qb00#>te}HxC`4N1KS%l_C&894oIKw0yrt=fjhp< zfx{?=D^{{rWo}TDhV~w6zorfAbDCeXu=Br+o9WIa`=t&-NiA6+!2aaa{ZUZOzmZXp z+tqlK%s3a|u>)_KCbWS^Jj;8*?k}FNkCX(u2;ZN&w+kFRAORx!(D1eFxGS)jD2NefcoHu7E@>XdQi)7^kk{2?9?^8u~ zXm-39($qNV$3M%8t+#z)KI?@)YBivJVbI#t%O8}|gTQ(P{*T1iJBmVi1~fN(i;Q9@ zg3cW|b}8{4S0}_`&NtjXlqJ;)AU)J)Qjbn|m|T49V)x?4eM+nFn_w-h(!&@M(KAf< zokqd$|BMo1Y7+hb=se_j<7wY~Av+=Tt{9ZPZl0PhiXnn0ByvP}Vec@#=DSrLhSGR%^qr8Sh^SeT&|AR+F zo@6u9ctw=ZIo}=niJHjXDT&d>_upZGVoZYOnvl;fmN{wyk)$H3*MxwJFB{s%VTz0N z(y~;{e*xVD8h&VP*O5YZxwzOfmK~Fp9qIxP(GR%euU14gSnS2828z%59?viUIn`hCB@jMx_6lMkQoJ{i47@3?`g zx!^5P6GteJa3tEV#)i&XJK-Y2Eyx|oSrTsnzo8c>q`2+N7qb}tUcQ7+IAm1%Tm z*!2R&FQkHYF@YR<@y!Y)n0MHj31{}0CmUfKYE0D`rW4bC6B%Zludmo^dPizPNc#DK zot2>Y)68Tt(EV2E@!siv|B2Fj?{j1r(DLJ=?_(tUa-IF62jbvjFCup`)IGs2vDd~yF|(Qdz#i2J-E|mqjE=&d^8DP@HNh-Zwc?SQ5Zc?ocOh|4ib!n!~zDL zy3g2Y$(xh0bhwfjIfIdz=8{e~L^eZ`b-tmAa5fAE`Fw;JV~ z=(vQ2p4FP$pvFIg{oAQY=;^Z0pCSS+`94Mqzky8#a&^HcJM`C5bpH_3qC3k$qI`xr zWrNb~D^}VAN}L1o2+t})D3~&lA_bMORoIIt(WalyN?WcUYiFtIY9_Y_`ZLn3j^?M( zyeb0Xe`JUuK?jorN(%MtOG}=<_`2ulRWu>DV?-u6UXn!?YPUsTI?7$Ch)h{HwZ3P2 zLN(5P9ThN$`9uh!*V(<4=h_S>AJBRvpAxOC*8&(Et)LzSL_!`9wR|@rpX%$$t?9p%^WixzFi*UnBe1Kl`pwMvPv}+O8&D ztlhn7G}Is({ibC<1AN)dj%sq3NOB$QZd9A z2NBJLQ&&u`(CU++D=9{?hpGgCJc^!scaA9A+I?IVNfFw`-;R1gm@+7#!oY4@!>3z+ zOZAGuzKl!iQAwz)W4(%E=N`&>i1P*}%lh^@W>)$6Vz(1y5o_DQ+l4a3y25{(7dAE8 zvr{W_18*SKdBr>KcaEJaDUAGB1OXwUWq4^J=f&W?$YlpATB66% z*}@1bq~*iS?&dT(Se~GGKJ?gBGaibc^u4?jqlsf1E(;V;Z{EevdcN^lp#)yNj8w0v zcMoCv(Qk+K7A${1BRmyc#gRS`xJ)2f#lg-PfWMa#bc>$X%{K+Lj z#G`%KX4&wa-_Xc(x^1MAn^-@qnexInq%}T&86nB>Rq}w1U$?<1f?FE zCOW~WbB$qZnM!Uab!frJ@AuZoaKyeL8Ch=YoZ_OSV z`eg!G#VH4g$N3N{bk6fqQI2vIiCS=sHqHhlKT#&6i-gZ_(u0OGUemcXQkQkXJE!N7 z!O%}2W*970cJo#6O*}3$Y(h4kB~ON8DD>y})%2;F$PaDc%4soTM-#LsDNTOB0PcjW z|B`CJCG!ude?>)jHK!k@m?~;F|B)CfaPh=R_ViLVkpHT*+x9R-%+DH6%Cg5@|0toF zK`%hS2la0X=hu68vOHqmskLCN`*odh_hFz1c$03KCmi+D8Sz9m7)j$noPy(`zwE7; zCU+F%Tm;__eIuFYWz zL4B-r-klCLKID~tjlN}ix$APmdl3SowJX9vUyF?$JxeFAvxE-uK*pr^i<^( zZ`SKu|9ME~=NP3Mh0aXLrOnUbmJe17Oh=&Sc!$d&1zhkyK}RGD3Cbb3v=W7_PieK9 zFHTYk0CcLcZTM}-&&$c7wut+hQhAX}u$`aB=;PaB8!na~`1{7*QbJQPJ|THUxQ{9w z5J&$Qt8F6LY63n^Yovm7Dr}?(?04;?EpyQ8ai4pnZndK1a{Q(r`vewnV&IJ|it6QIU_m{c-iA<)iVO<7ZLtM1#SJj?mP#b#f0z}9B z&O9?+#AwDt;Z&0*geB2PunTn@z3n-9oi(xHRa;V}*MVtFR%$qyVEn6q-9n)3DJF%t zFLk9^;pt>eRuIs@?ef1G>0S1)yBlVP29@MNx&JZp5eFJ11nX2-3vBP_7$m$v-l8!8 z^1GSe4YI}UMElQnVsS3TySlJ370}Sni=KNrw@M)sEje5a8|IQOp0_55K9z}AJkY47b9}xVJp*Q&l~*3MKNxeEeqiRTj7^U zh7_~OewICFF$I5E!-!9z9KN28g|LPtU)b&0=2pjG%;qNJWc8(W=wZTnRZ1$*d_bf9 z0fliOXrkr~XY}rJ@ILq!MeuB)+T6`-J83niTOYkX=8RHt-RaGnNv2~fB-*Fd+SvAB zwEG?v+O}|6K6#IP_!9zNK27MR4Mqd)``y)!UTgfu#Ms65U%gvm0*o&G?pO72Xc%#c zhRx{7t`VSB5N>L3HEd$%*ar#zqB9Ox`1uo^z~ijr`gB*H)e}ca@pL({CEPN|@p@*p zF(f^HeDUylbqX2YWhbdYK61wxbbno%Bgi>24g~6Y%Z<&^K}O0>20)hvOxjF~*E1V1 zkh%1}UEbxg%SLHC=SFFc>e^3d@@)UC%W=_7daCoO&M~yKD0V1I^NfM~FuuIdim#A( zkfHBB7OeL#zS~u@{AAlQb|#n9?(sTDW)`lc*7mE3NAd2@ag=-#L%#zpgX7;2O6a`> zA>Bz@uf*)hkiP18R*qyWo1#9m;muBqM>=FyGFZZ{rnHcD#S(F>f5-W(&nbGm%qBM6 zZ?zAG_QBPys0NkM{y4xy*ZZW*e|mg+7k4u0NHHP%!gnq0oj%`?^3!jx855n#(c{># zZoN0!&#Y&0eDczO{sJmTuMhp$PZVX@R%a+z8sO350+H06k+{K!*79%Lm_RWhSBaA= z^V{E_(CcRVF-;x@lZ+g1=nuf`)|8dOKs*Vh-3hd(fK;y`7oN9+%8JblCV#+F7S$$xy@e-NJ!1{iP$O0;5~ zgtkY4#2}ERs#GjGcC&A76i2Q{ytvOp=mKH7V;38Bn{lQ0Eo5hdD>4qA8U9PFFj#mbsKgw5dysl++dq!k)paoq zo8dRheS55u@tDYMjwSGxNU+t3;h6AKq_J1QB4(fibC*pJFWeHInwRQ^$=G;G`T z9y|K`9)-qm@73~rfM4L_#)MCQyQ`--6)WR8;5OAx z%6`DRIkA+1gg}{Zy4BzUIxKY{UcsmzLInzVw{x!vvNn+e)!U4Ve+m1%^YjdE4fg~_ z?whAhS=O~Dz<6kWG#x-8buW$m(k6U#@4C3`!xm^u#}MMrwzOHx8NgH9J#~sp_1rnO zyvf|h=mj{J2?%UQyybnwT8B8ygxjpFaHdO?R7LVvq|8vETKxK<1GIfGLU@R7NA_yrnX3E6?e=U8!fHnXDtU zq}@W~!$Gl$v^pHKdChj-B^s!8*==~(G*fyh*dp*fBs5gs*xza#gc}>2NqdtnEqiPq z`}m|{6hD8&Zb=8*Eu~RVwJ%`Rf?G6?AI%?RVK-3uwctx z&8FIoe9nGqw?C~eo{_t?n-mbQLE@T@KQCpRS9;u1|KkOK?LSgAb`xsiR?Y(=jRAZV zVJ&Sjpk4zmg%nrF<7*#w^=tcG?XcV(yt&48egCZlbv(t0z-U_(Z(+9NBKjPL-;9on z4fSGH0(0N8mI;jPbh~n@q&gw*hOo9P+Z0fuc#I)~+|ZEHKurXfhIjxux`%2$*kl0N zr`}-g|9jV8Bs;FQF^%|Fxh1BOj-O>Fu;qY1Vu7VHbRB29w(3>bz^o^1VoX-+(xxI)_KwnOdi1F3#DUcp}r9<}Eu)s5UW!lWc zJsyke=Oo22H{3%#jlbF1jDBqXodOqSs(!mdZ10z)-Y%a7Z8s(2Y*5qKcqe^NWaG_M z`!pBqx%csHbvF$AnfP?7iO_j+H_&(Gys<&sUnoj}?A4>e$e>v<^{8Wd394gg6P;mg zyql2Zycw^5Cw956aR-WX%NBo=f+Wso^;*c#z<=0;I|ICHSc`0%{nKKb=2%D`!jp+O zkLs662*Vajz%yccR!yPmz`Vd~LBcJ<*<;@bIc4U&h*&&9%_TR&?~hle&;lVhS*?Yi zc3gGMw-JMo+hD|3(;VgX3b*)67YAWq0w|H5RdkloVima=k+&x6a@8Lo$gv-8ADf?U z!dpeH?O$%Rf7J?Rw4pd!z9?%Ky%I6(lqQdzeXEcvPW5mxAzMcfI}U$?-t!+p)jG7X zujj2D{jyF0vnuSEknZP6rNurztMTe6j`n4%XJTo1r^&OHIUd+|YbNk^5z{wSiNY7u zclBLGsF9k^{pRN8k~yHfh7mh&(1#?)gRTEy=jHgyEB5l=?{c+MOKbERS%Rn} zBKw97iBh=Luo>FtHKE6;%k>WHq<}+dHt7*tV0wj?37uckawBnn*i>FC(f`{l0T;qH9CbIRttmNH*I zbAOPDM;#A8WJ^Hv#B`#X(C6A0CrsW&jk!j`CoxYREujmJow(tJw(+308kh7oj56Dc z$%GFV;e5r5TiYLDcXy?=SjQAL$6U$#Jw7YHN{%kA|5u2v&*HZ-HRJNl!$JgpHG2OZ zqYz2=Rt@f|6^F_{_8V#fso=AkMyZ9LdpM4Nl}2O7w9iuNlQJ_X%QIhFi28Y)lC4&{ zn$4fF&&NieE!MfiFBD`1f1QwVv@>n~>R@5kKS?QB(Mq)&6?}6}S3X=ok*q$zp(K2~ zPHFt&0*ph9{p1Q;A!DD4tft_c*LFDVs1w((|MhF7!Ss&xW=*aI<5pe{ZtqBaL!(?Q zd;T0Xf+WL_VLVgj2y?V8c0=Rn+UgUDcGT`7jI%!(wJjbM$)#VXZt-Fw@mjb}Bt4SP zqw!URhL0#(V|N#SwQUt*m!}RTKK(wP6`!DW5D~wP z$tmSTzdWnNtW+W|rb-t?1`BRwBTQxF>1UE{ZCPxs;z`i@p=O7&t_m9a|bpv5NT9Ljj;Q)FF}F6Zz?uA_45FGaaQ65E2j zV;~pT(N^>%B~!r)oxz`G>4jE-$&!R68l>h9)jHO`te!p8~NqE(@OD>-cNK!{K0t+ea+pqedogv zMr}`f3=p_ew7l-?_o-ot`2;KjtUnRo9yWG=acPrut4gb+d3OdS;619JexXT?M;a$s zBj=@aUSM#lXGad3*i63IAjDQDhAKJelO+Sr*uvkTg|?xS1N+3q`^&?@!$o09 zWi9Eu^A|v_P*$?yd--FqQSR9N`KdMFd962Zb2Uhk0(OZ{XDS5y1J`^3w_KjI{>{pj z>)NT9I(E&Xc{nmAo+HZb3>oj8w^K4N{ACUW{kH{`>&}#9MZ}!o*C#t|*O&ILIposw z$qpGLkW6s;nxjQ*<~XP0O2uV<@lf+0k%X`U+%ZK(EsJ4oL*K();`SYSZNrweK)2JN z$$~PDO#gog`Y83CDO*}fH7il;!Hze%Gmc;Kn^)g8ny1U~4c@TfPW@R<%@}P?8!}+9{7ayzF;IsKdqS3K5k5p(=UW_qdeCe)B58g)8 zJBeen{$bA;sM6elyMRh(;JUpqQpQbUS?3n1lm?W4>bgp$TvEE$f`2-XmuF!O4uMkEa#VAQNa z$}iAj|J}~zdarnH-M3evY$5rY;7C5U65!#q_vfE&6*7rj>K@NW51nHjGWRBlqS~9mxV%9sK$0H3w_V53GSd8b_SZ2IY;V|B_ zLxt@|I4Kcj#mC#;YPu904!FRYdE4%SX9J%1}9oS zCBpWf2&2KyVQ8J)VMvnV@9!>E~y`zms1 zA-Z&MWJK?Z(fFe^2GIy%x5vTRiH^(HrkK^k!)APR+$Ci=In@#y~;~{8T`3zxAodV7Lo#BA&>6QN|X|^)T9^tio}XDNw!Nd6vWbF>(DQ5 z{QGpN!7%QJJ!RGvL2f~hYHQc+>07*%!@HS*f0t4?mleWyh-ji-|XD`>rN6W-es$DW)z_XLZULB2$$>EgyA=Fls zvF;|mY(N`yIn@2xqC3a`)iw|!5_eyl`4UsWkQ`_ss;X=^Je~MI;Ezxs^s57k;u2~l zz2V^t@atZdVyv@&GCLq=(=EisN|9iw_Bw-)bdQm20PScq0s#XdCZC$#nZ9cJEi4Cq zNz0A;;?)*FytNZ(khgf!Be3?W?_*~=gatS`XeR}V(nDHchqpU_y@@n`3-mH-UVe2i zpp~KA=h8dayv1KKgi|tx+_Qc`wj0>iHHdpkdcGNVjUARr8`LZ#jefrdu|J@oT&Wxe zTUHh#ygcwwB&HrBHcv7>s-i1*ak}CgnByOzF3YAbRN9N4uB;>#BBqJ*VSH`)m7@Ve zN3=PHYK_FWuE9^H4@eLUjOu)UA35fQ||OljVB$FrQy3>LEWrg0Dq6; zDR} zIinX>LUb^4Pr<&e@5jf2XF9v_kG_-yl*v)f-4NJKtxWawfb1~JCL$#V%K9M_CY4r+ zpOl2}_#{}ot+t^w6t}MgOAydC)s7a#&a6RPKOy4r)h+my`@&R5_QXV}VTli&0l2s! zaqo<7T5RjxKY>8R$(VlEgFWSrbq^eKByYrjc$hKoegb&wrtNEk73y+ZgnvP&G9=m6 zUfFE60CLrcGN)g-cU5_UuqWGQCl@0qizCyn%m75WJ2DMmK-pg{_G^+Ig64HBwvuv- z%r4dz?jQvks$4lN1fz|=VCYLqck~8Ji-_S~uZD&RDPP;Q*TM7R4wH@bQXnegXQTH@ zpY*`(xM`*nA4ASZ%=2>>)c_1)4gU+DNg%xkx^81ucmU&q6QgUa*H0_(Ipcz2V(&kC zvfRURZ6xBv@DmvclwYkJiOH-92*zmQ-1Ayf0VjOpC2oId zgsVSebp@>DL=`)i`Q5y2Kj4v+c9FusybCpfxa@IC;9vix2(ETZxDVUCb0xp|cx+`g zmHs8IuUn{Y_o!T;01EVxUTi!GQ-Wx8E^>^Ny-PA)NKDv_=JBJIHbYx4O^5oxSI}wp zy1xtb8=NPuT6S3SDRB=!k&0NK!Q0nj`X6X2fwxJVSkik7gxtOl_9VdnEP zu7(bxcoK71@9GTl#9{xBq}~mh>l&*29lQLFI!s7nw0s&g6)zGK7V}5wQyG(zW43$v ztZvJ`8|iro$M$8LQGt6k)0=;gX)1vwDPs)amw;E}Lb8xAd)Nz7kSfIMdu?oaO9zo0 zn^@7%7B=iRvN$Zl>j4*>IR9|@6Oa2uZ z|JK&SZ)XxzV+bO)H@<_dE^IA5;7BaUUpJ~y9#+sUYCebG*y9bY<5ESuglN@WL* zXyYt3JHZQN7*8_WCKn_0aYmBsPbeFm-G=LwmSqI79Viy7?A_)amW6fNuBU$Pu_-5% zQu+bijLjWdGQXy`PZmr6SO`4kJ}jR4Ybxxe-n3ozR~xh26MgCTcc1)|#G%2Vw(np1 zdv8AcN#L#a_}1&|75|~5(!6L|gQt_-nrul_c-g|_`;dUtih#3%3!4oH?tZqxR9>3D z?}kRx=MQJ4Avd~kXqI_E>tA2k@Jg)CXrpeoUh)V_Sk0jK)6IB#R4R5UKrGsJUAqPh z=zqnpOaA2*kJvjD{WIiPpQC99iuO1c3MygUmpZ=cCM_RK(GxwG?fLpy%e!AVPGhz0 z#Qxgh9I<+Rvj$$fKl^TV+|WLE7hkt4+1BilsyJudTBXI5vz-yQ9~HXhp342!x~-zc zM7%(}pD*D)@aP_CuLJ^Z~B~ zPHl7j$=nWd^DissuWW)nTE}}d()+={yXihAtfxFAC9KEbA9-l0h2>SRxeDXPfD5rn zY!(>XMz7S{Qnq!fI_&c4qY$RsiK*P_Gvm>t%h_V;d84#JXe%RhW1`NpdD+7Y6R#Ee+-B#Mfa!mmxF9Y@^-EDrTIBRN;%7RA_|9*o zNS}FV<3q28=fW<eKTJ_ z*tuQ+Y*$Y<4j$gSl=cVz2Jbr>rKGHcIY}3;^NBYPcR5yjRqmkC#~*7;|MYB4 za2;b;f6Fq)WTRiwKkFtcY7LlS#zT@TWg7)tN2;`}tjv#&E+sIH!h|yO(?0PoJZ62E z7Bth(3O()1L^Td}G>BIEBj>+G&I*P240hGuQuj7~4-7u*fAw?9V&;!KR7t=HBGu&}ib|$5}1ua3dKE(GMOLCH2%l1?1x26xETA#h(v7 z-l`P3{kxql%+1woW1S9{ILs}fOvObJdqFZ>7Qczh5a&bRnx~1(f_c0!m?U@wS5lr{ zq_L#$Tsq%$aHA{KKDnK0Q|FYikgd)9!+Add`P?Nwxc$m<+0x>=kkov61iO;x{4Oje zgX-yF>1ac6PV2en^(8pKK;Q3L-?kY4xuwqg$n!|96_h9B&wPwczQmoe>$bfy#=a~q z?PoYo@ifK}eZDXC@%IMjDSGqQFF4J{nadz-%3*#jN7q08 zXYE+I!~lTlc-f;y9d%+VrE_YDZ4Q9EXYrq-@~f5w1(J)mQInrIeN_aIEIT-K_eaw= zI@IgU7gATW z(Aec@NnuHc%*VbRYe1V_-=FGM65(?NiEDLl6ODQn*7IBguRV$UyMfkt1x&`oqBg}u zh_2^Z(bOFkYS?40Yz;l9bB`H6gZ3cM;99{Yt7uCD?I{b`b*)ltj^F zsNLYkb(&76hO`y;v;U3WXfp1L;|Xh`1Iq!g6wGPjv#AK;oHxdc@B3HW8`9Dd`0vaK z6eAzsS=3pQ@;C<2CE1YK%~PADM|Yo=^M1_rqcfpy@O0hQwrdP8O5SZvAz~{jU7KF8`gs z&#Mn1Ve|@Og(34R?n)L$URc+l6&MLo#0sYS81mcw`y<(-S9CC9J@i?B8cO#WbAvJF zd%#_ zgA8&tIaF3C;$P!^&A>i#SE5=M%JkUQOsk8BUU1mVftmU9}cgJw1AL9R<7$-{B(+PjV@YHW3sydS}Dq$nD@3k+2db8^q1Q#olne97dXyYI4_ zOU@GTRLhjQ%pZfD8z@?^k(!8r5GIj|(l^58xdCp1O*ze_m#lxN{#7@N7NR48X}Ob3$(C65;g(UAaI=uR zWgX+j`%i#B8$+Vv-=`rxYKsl*pF;S(Ea^Sf2G8J*yom6Yl_mSV=}tZc{B}#B3~7MX z6H37ER6A=Uj(qKK^~a26I(61LcPFI7-?Vo@9)mOTB&m84>4LROIw|n1Z|uyNttZHT zkaYy3Qh70a@N)F~)E~=@Jmi!BUQX&rgbCr^Po=88xo!&iLec!}nsJt4>A#*3$PzWz9CbL;YaYNU;;~bZ{ zL6oY~)Sejw%9Yj2ao6pii-1y|*=q<57CF+jDBQB_0N5Z+&?++#Sb(-H(C5>g3yQ$w zTkV~xJERA6dF1vIkBwLI3W$|E{QE-mCs#mDEXwIZWAEJmBkQY!+H9M5ODV2};@%>~ z8r-!&akpZj6!+pD9E!Vpfl@TMOL2F1cL^>Da`L|4ch2veIWw8bKbbr;&%L|%wY%3| zn`p=n4Ug-jSZ*-Q`AH*%z_>l{FV;MN)tcdJ$62uB6Aaa!Iynt0l^4kPm?Qc8Y&u?{ zed?|x)%q$=4HxZo9?GA|zp{nHM5C0m;?Ew=0em9-?4Z)MlW&(M1mwWf-HCTV$O1G0VNht>XV_z4 z-mT=%ZD(ctR(qemenb&XyL&IsP*-iTd$6y^Qlg$d`UhQgEe>=f=>3q9P8OZJPMg$Qw_7u9Y$d(GzkDuD4)i|(Nu9p*Imn% zzD|F&s}r0H(g?|%UUlopsE(-fYcI@dr||rH@+M)hljhI^&GQVn%Fiau4s0@Y^)#Y) z+?v?pE+wc}z=#~B%*>|1n(9Yy`jxqFmUx5y2ibL8zWfPOQZMeWx=Be zSjs%{hnwO%4Y60_cQNo7Gfvyb{VJg#b&_;OoFG;;N=n~3B+b5Q@fNNzj<F!Ku_RAFZ9gr1gbNlsUhiX=_HnzuVV@Gj8`$Hs`~f1OR`UHuS9qr! zDCNE-)8B1~qhn~7=x{@`+!ojmXSOfjw|mdPH*&oWxZ7;{uLXt{h=aN|ea9L1>7H<3 z8bmV||DsAz8Cr`lBtqct)h3j6#J_Y3^9&P!w1ZvS0L!u^NbRkT~^!>i3sgoo=+#>Ww-buUCv7slo0 zxchZm9S6SFrh~t?ds+(P%UVs%_3*ygbEvDg8;19zXNwGjgxgnY5h)cts%Lg>4*J8bS$(0ZZ#!?J6W z*gRyBr`hWqx@3GNZAZQ&;AmW)t+ir`bI#&-VoM(Zr8B4gSl#f{>S_J@D1`kg>&|CW z#-^7hgrUFjL@M;UnwMFxA!J=CD)VJoz^Fru{FA&VZMxD!3}@IjcUH>_o1R1N-E`m; zGxo8fTA(!Sb60x8H8uFgdqf97Yh-#EG*#d;)3q`6eUHT}H`}i^n~wpxCgOeaD401u}Avo;Av~(>UAs7jO{uObj@ugCwlQ@-5<4h830`x zy8PVoBrilugzkn?4okWGdy3V3YIvb9;Ss%m`TE1M+E-vMIfy*oaC;_Nbn3F}lNV7` zO;(iar`Q(WFPJ95n_;n4Xi~n z%rRr`Nmq50eytMIZ?Ks|Fw;g{F%|3q|=tOhH!6 z?=_Kzh5Y*Q(wBT!9;(w>5hl=g$*pjN(`{S-$mBMQ-hZ7VRfo_PeFN>bXW`G&kvvC> zNIuVDo1ziDNo5Mz1@ca@X|mRd`1fd|#^FD8ooV#_o=hZc0PDg63NF zc8ZQ!={e7Xo&hgk%jCp_5mtu@lq%M(+G!5eFoV5b*2@GvyCFx;4^cC@s0M8I_if#Z zz{7x`!WJl6MWm{;G-e0-_BwIbIrAgRx+hT65SAX@J4b^;r4C>L|tfRtrUOaUnGi$Z81fv z6y zNcVPOA8mH0pxJ%F)_NOnneIN)(C>JyuH5;(RCsNxVWH&bxOJ5#OOE!-Z1%|4sZtm1 z$7Kb|P7ILdYnS{K#@Nfqrufy-8Okk71+fY>5x6#X9b=gsW}0Dj_TijZXUQAmR}Kh$ zc$ecD-^YHKk%KYH6&iANU;JF()y509UA94T%1y*YudGhNSnMJc z@mZJz85wN{M}50pr%yCdBqo@qg8HTPa5!-)M%SV^YF*Go5DgqM_4q)pi3j;~V(0C! zB#QIQ5Xt0*Bf{Op&laSv^f;>wU%Jz5GztuqnZFWKET_QL8Yj`^D;NDrWj3-ql%3P9 zXqi-qVN);EO?Dbim2LQad>E1bp4D!k^!Y(LzPfKK^wCtaSoaZnonWI4N>|$`7?^Gy z7+9D7_3qdALvZ!P8m2=+#*!E3n{J_$5D#boHGhXqYRWZ6&0c5GUN-Osq1{#1%U%!0 zXEG?9ju{`d6_{_O&;HVYJqI zppA8>mLpE|<%112LE{o8x~#Z{Oqije40<*|XdLNzF_&iclaRJRtyH@~*AC#}+rEjZ zjq48($Ob;cF}=bgEL!FJ-J9hhAZzr6N0(xV7qDVkG>fftO6GCe)iV(`W^GLQ| z^v^&^;frJUV^-c^M5h7V=NpoQru46n4i((4^T_Z4`!(H~L7c6FVtj49kZcM3ZRwpY z$J1IWCV-F@_v2t!zy;T{Z=LmC;o|rG4sXZ~llz+e^mm4SrjG8lKdSnKT#_^0Aw~Yf z)^02#OC%Uh1cG|bFFj?8jwd}BsZIENjqPnftYGhEMK6;(829#EqFIiDomMOZ~U7<1@Oisj;Rhwb7`MGTBadhlCewu zhk(k5Ttw5~$S|N98*9V92>i)F_E)M>wz-k(DgH8VWp-rcV;eh({ir7Q zq>^|sWi;L*t4gKs?AGB+CY`%c=q{!pu!j3p(5etcJGiH^n-n__7s}-&8HsKF@EVm5 z@pnDiy*llCVaPY~;ZN3vsJ$-U1dqutL?s^dQp@_Dh3e=2zIFm&AlJ`!2>oFL5(@2M zMgj>>d}s$qkLs%#5QmUlYJGGz9&ml{CUgm}0pPjnzx%U3Sw9!cS$^)5T6hcHndGvw z1PhZSBI>*Xe`bD|tUbqh47)WsM`~jY)RS&mOAuF6ll_5Eeg3`=GI;*pjGjRGC$S_! zuY~Pke>SE}EH80w4MQOG>)UvNdts70!Qs$blY5iGZ|@l(CP=9R7u_aGcn&(d+aUN`TRB3shOY#?>ChY6jUlI9B;SL^_cTL^1~ z;K`YCY#sZo>84mc`155tWUNxne}lfk&#Ak9b};=&fGN3 zyzZ54MTY@R)3zp=C*${N%QZDy+!bUNFA@hcc7?9YVssnam*;TYSov!WUGrBEtAGG* zN=}~5ILdr~x6e^*?srA1!CSo>7X_C7fisjR~d&Tx3%V)Qd4RLnMhr9rER?)3Im6z3R(#nvM8ExUH{cNQ4N7H>sYguCw|~4t*R_x{Jxe7r2YE zd}-^^DZ8f&&aFP==9=P5zm^PDacOe$o29To)SSFCOP9q6Bm z{c6wEI+eE{nfTN?1L!>-;^fr)Ia;9-%%vL>e^589{5|b56OKovRvn9nCap+|el)i2 z6G-dsMoZoeG)qTw+nYsXzv=iC;&vEBIJzUM6|3i;Rf%mEl?z&THXM?X#!51sR# zZt?uDI!K|_2(&0a^oC!Lhu&0+AJ!e$CnG%#m)5bId(`O#x;NUHiVM|=ZErWBNB32} z)9PeIseUCAtabT8;$q#%M=(=??Xp@}&vk{b+SYB~94{8NOJ1GyiayLssvGRhGJzdL@Vkw7CNXah?-qN*f>*1VXtu{;3sbqgY*$#UhU9isZ zWh<)Ef~LLuSk+0D{*6)%Q0L~;_Yy*Pcb&?Gl5oR99h;lZ{kjFKI5-|JkuzI4aFJ3f zqi*`+1?j>7-Jp3a4cGP-W!+iV8cW*O9Z{%ju3Z||Xxa~2|CTvcw5FEYspQR~?(amD z`kiny_O6;k3cXf0(r}P`Ma!{ByZ!E|CW+<199V9uZ=ZN`6A&#`x-4}c+v1rAkbint zoPq@BQh1VRV}9&N5!@FzT?u6%hZoP`MGQwOott)YZg3O?%N^bL#qbpk6m0 zuyhTTd?*q%Pefm;bd9&ESmfqCHvVToZQ>XBd;66{K*NY)S=E7 zn1zKG%rlhg(G&bp1RZ^W5D4`Ot?X;J(GlQ{_R1oOMqQPz$skRQ#Aw8$gSe;xZQFy+ zjf-iIhb^D4@ROP*|dV6X7?K9f0I)eby7}FZd>8cJeHLLMSaqJV}4p|v!AD^r1jg5y>N1DtaOD#*vp*nz}^;W`;+ue z^-aWNKizo947L)aG?5ubzsH|n#^H5!-7ZL>1A`vETBxMLxNXl!dKS{F3}rQ9Uo@}O zcGn78O|N=C9KGsY#_&wh%S%=>JE9A@O&im!ZE|SaI6#nF?s3s;vCYe$sSSs*_xg(u*K_19} zaVxluaXa9Uls|B!?&wsV^pN>y)|W^GzczjRX6UZnw>}=}X{59+@;IuZ9XL^KVbqRF z<){s~HZ9H>zo|~%S3foBgadG;d#)Z%%1}dh{WJK;hqfOe$dkjl{oA;{RPe_U+B>me zskDMFVvoP7gcYed^CoU5sC{&=g-u>ZR6^>h^gq2Rc|#6Yf@Std4e?Du@_wI%gJ)(C z&Ja1WM8)%>n!&KNEm?en@g2wa)6Ov3sP=DU=BdtaNUZ0^l~%4S4vr#juHH3Sn^~fr zByKlpC5@FyD_nqdNC zZpuaanGs4mX+tOFJp39aS4wcw+mLrbw0d0wxsU}Xk4S`BQ6(UfCn&pi+^^+o%gB%^ z$)5TL?weNrI^@ecTqVC3|8>lIm7l0y2_XwDbhdximL3lE?9$2-`@0eD@=kcDvfF)} z&0Lq1>>ziodWH7G2K*DRIm*3<@>$LJ`}_||JO*%H9$?=0W_MNBhnH)fvMCHvZy;qU zkrqE+v(D7F)P>f*!4o7^kL}<1NHpIfl5VU1Hk*CtK-S0$&Hp2n5ncTGhiw@5Rz(AR zt>dw0PvJ_5A!y`L9lv}ci32~{``ihkF+$bwK%L9X)1l*`YNUD9X5`vs1V?cFzMPFU za&~f_L;&?1=C~6|5ggIvQDXpJ4>kH&D3qvai+?q(6dDDbf#)NMO}poOz2{%geTXA1 zq;f)wUj#6vM#x|-i)mlt%6HKIlsH4YwTqyYwPh{ZPo8Fv5Lff`fyb=%(Pr<-A~n?I z(=o0vY>}kTKE({H;y0$|>5?e!jK@Fe%iabVo0AR+eEizYyrnj$+Vhqoh~ZP|a3%8Q zq1;|A7PH{=61`?W!ltR1R?KcQ=c&ZJAvf`I8ezADq|kaAgO}K zNAo55cwkJ_rI8>gV`)P0NnYw2h_Jr64MfKQ0SICVflTgRg$1vThV0NG1g!9Yxj+k3 zwo#JUU_zPUd=BpqH)rs5K`a+uoJ4go2N)B=xzo|mD{*k}mcBt`KU0n1thfwla znc-p@vMHi7Jw{KUW0KsyowZJ`(2i?%==a)Wq#?ux-UBVd9w)3_{%pbN3996-F|MJ! zI7;2Y7|dSZfjx}HwcKHW^|UXqQ9o&5>-z<@4Q;x?x7l3&@HBZBfP^5GCxgPhcLlJ6 z3`gcPUtO0-$@(dUh01;)7+2O>hM$#>OrXGhmL&?h>u+}1o;Amc#jhVl#rS{X2y4*8 z;rlZ8^x;@-N+YYrXuCpuE8mZ_b&KSn>{11-zI|rc7lxw#TSdS~%$TCmc#5^)^wE3r zt1L@@7_@^^F@nKo)e+hE#&|dlA}YN~!hTNHx^3&3-5;5SN6EUyo=qga=IV0v`xd&y zO*mGxcqU$Ugc!a&1Dsvp$5vQz{5Dnbz_9|!rW$57x13|v8=Lt_(R}Wgd$TjhOqj(? z1d8bS&de?X?$sLe20m%0asGHH~((u5dSQ%fC)R)5VV*Q9n` zAB~&ojnRVB{$v?JF&H`KyqvHd$%Rx*#+v38>$T|NU_Ii3IW2Hm?(F*i4U^UIFj-|` zt@Bo7rvi8|tR|{@Y#Oy#v^1DpL#A+Mk-aeuui5@1W_3R7V=}xb|Cb0}n23H#=44tq zdwu@|9;wgNoYwsP__`4u63?CfX#*%vCYA^ z%m%X^n43C>@pR$N(YgX!NtLKpdSe!NiKa*Mr?1^Rj)(p7p=xGF)=C`T?t}Nc4M*rF zO8}e202d7(ANbxzaG04W;a^MRDNVAB2HUTT8*hrWc=+l@+4|Y2s~K<}I_Z6LaMn*m zl0}}T$T|=73J})FI%9LL`OEKanmdc}A3)czYAmG))^({5N4~8)ULD8F72bwf(MCa{ zsykk5GBd}>4EOQ%<|6?_jc2XSnwp@^#f@u%hEBBhowPpJcEO^`o?hkVhguK%jm0Ky zQHDY5s0SazYj@~-v3qF%);g2N?}x%+eW_o?pAdniRz<`>S zMpvfBu-5bWmCPiB2eI_TJa37KqK}AtpN1;Wq&r%AThUOJNn8sy)4pL`KH$Npq>?+v zE|K~QJxo=%Sa2Xoww6q=jEj zv&MYe9rELW^eYeuIXkQHYO({1IV};NI`UHEel%xj=rI<<_dYXLWV00PVXqiUN11Xd z1(HbcA8&Kxw7-Y^GvWgK9cR!|Z?n$RSU2-?%VSW7W7^aY&ig*C$MAKp=HLI4dhCSE-BAw9WCQ9(zMKp>-$((uxIJj`p1iztr@_`Yr-i{daA= za@&-@0ay!Kj*HwosXf}LWu>wbG&(ML7v}_mevW71eJnFG@Ep_nY$b7s#voMTcl}hf zIuqwnan2Totl7oMsM=n=jSO1EMYS!O7 z-g7wyxm*vcNIczN(r8ick1VmfV%Ik%w2GZr!MlJ0DnD*CvLDNDnYh%tsIAW zVW$rS4$GXvU#S`WB_m~#vh&9_s0Ujqbk+RX%pYY4f7{6=$RTZY#qB5pQ_apfC1Db0 zXZI1*sw#S@MK0#pP0O*hRK*K{rZ_X|xghfWW9Tdx4p-mUnkH%StpKm$HJh_MAG}*G zL{F`an2lHfWmD`z548-O7Krf9>VG1#(SIUxdJ5+3%*RNRiGolzAjgWWeGAjs_8d<< zCSAg-c+7ab1JdVML0L2?iY1F%EcsvC|3KFerNf#3si;^g9(BW!>yi4TLGH!HirmlV z%6Ij6YH;MLBK;3?^|GBAug9}H@Mfk#qbA2?X%qui=JugNkcQVX0;FiG&{O?>so<%! z+0hkjJq%h2>Y)`YmzO0dD+W;~2Zbuy{`v>ECa9O|D?XY&Ia88~;k*gr4>P>Btff&< zIL%q(Hj)NkDEV$1bFyQ?S&@KI5LU?QUGFIyc9oF4>`Na(W&^ zfY6qN<==XWkIoT;RoltldGW85hhVCg$V;!LD>+`}fzS_S{hKHZ8zR+7=W^%4D#{_o z9Z9k1#%+0ciNU1@ELjYS)IW?zJYGT;Gt2&niAwUO2q##l7R(53&Nji5}t zSh^_3w{bEHDm;$l5@I%}mW+$8$J^@1lk!nXE~XmdxJwVJ^Ga6gIL5HmFdRB$wFfb8 zM$dG8ai2{&pP4V2u1ty*2)J`O>DT(alK|w-DwH$Vs!M)3zR9L1$)45*NQZR2^o$gS>@^Z`Erv0~>?rutEriSicbQb%;XrYX`*l%X>;*!ma zw$+SJ22~b`Hi*~9(jH;+Da5Kn+MffV$H3jQUfTb$iH)W@PuH}sFgVAKh^&M+3iE8O z#>vEadgFW`x|4O;l|fmG6Qj1w-xHk{W$WoZv6*C~od@tjkEHwGY}W+yzu7K?|Ei1W z3mD#Qb-%P!-kU&vK57kG9muRjGaiZ2SP5@lK3T%-4+BNl2h(?b^2tu*Yx2nqYOBbDpGoz1f)n#7E&{s& z0;z5~f%gavb>tU9`T%VKIyGzlsg73N;kP;3Mcl*eIda1zHq$?+Y2bA(ML6G6p& z-?mWp{)7307nD@Y@RRPy2a3IjL`42y&bvk6Ezxg2pj>gfpY{Q2q~o&F(`~C?XkJ!s zS!vC6lIA@}Bggd;zrW{A-rE&*HsX#MkB}{S6Na16s2_`7h)vx}6a_41PHQqWYPGmF zvj&hB&d`ujDM_(x;W}W14H7vl9|J$7vx}bEn*)eyE8o+)-1c{gV^sYGmU1f6UA?w} z9jbpSyCmNr;R=kt?+mNBUv*7XiV1EhnFUtt+{#fQJekQ#8LU}S9Q?7sHiMHHQ zuD^t`#2P`z0A^KCSkyMM&uFCc$p3NeGChqV&G5U7aFp71Y~nJ z7=Fa5{zz^f9JJthu2oYJ+uy@di*ue{;(?9K_&+{2+*7Z0+tSr|o^rO^H^hJVC)M{pi5hDMt`4#E4SxCdI(v}i zrB!d+tSF>4jM9|QF^|eI$T`+FbaiBk?1ol4wfqwS|CVVPfwfNHjtn!&R@ek94s%rR z+58ZSn**$l_Z4z}#&`>bFYgnSMLyN_>adhT7`vlu@Kn2l-WD1L8Qz`2gq8O#F6eQAsp<9z61(s4AJerrUKS=Nd}SGtgDxEX&Ua$SC%gmM+9Ad+beOwW zS6J(JaSXS7j2RHv6#fA$)R(0|!dE(5%xg+AyVlwTG(3MK8aq)DhY8iu;{I`4GJ}`t zgJ{%NQE<+!#QE3@wz#-ZYSK_3N}6TK}TgG#>1r;`6%Wm%euVl-bGK*>+pWpMBv}5Xxh3E zNz^M7hzxs(JnGj5w{kCWdEFzK(_I31ZJUTj_4>UvJjJ3bT;3-?D!2RsfDk`u91_Ei z`w?{BG)kOa#!rjl=~t+K!S{5<7Q@}o(&;d*`S z-tAm?ca362_VIBzY2reU?xOHuU>Wj@*Z)ns&YdEY)%uX`eh zJ*kx@ve`Qg=Znl1|Qnnlvg`QBA(N#^nBcs>2j@5FcbRCA0Ij0M*0 zJ#u-k)CpRF$^+CZ&4d)@N57fY_qxBS6fij!3+&A1HU6Yc4E`~`SyXGq=b&Y#=Z`6W z(vaOCv3Xfj`rl$dpBmTl=RLfB=KFK9A)BWb((UPl>6*fAZbXSS3!#EmeWsQ>PQ;c& z`9)Q-1D^;XMEUrbwqdq5wj7(JqRfM8pjioa1iQF8jM0!@{5Izx7=G~hTw8yzYr7lj z4Zmtqgwq?&G%OF!=Rt7#?^*f>=f5e9>rLWpR_wh3AP#Ga7T6IPfbQUmaXQ_%-|wl3 zo+3+8ae8NRF6O&0430em2~PBxac?enw*BiD^V{!QLqj4a22uHRGU(`+!C5@*e zps7wnW@~Eg*1)&4A9uaG3L(R3>nML3sYtP17A;VZ(8Urs*XwxVh7u7rNFG4TS=Tt& z^546GSpw*Kxu#e@&|(J?0zgEl6FDy5r{r!kYO}QMcYMFajPe3r22tb-so*NFJPR&; zxa3`$L4dKhq$}3LPFr=)6G1bH-$m?~`T!3%Ov;ysFt4OefGFse)4pBH=pzQ`nrg`C zh1&y3*hl%x);YO1Be!mU*Ew-3Hin^+8RhzvpZ5=N_14>i*r_ybu-2!?YbR zOMQJ`YE`bVgMvv@*=wTjFAdqY6;y$}{iCvlO2PQMUdt$mC0&Jh(sC1#yp%+QvWlzO@f*$FF zF^LW0%4rY=uKM{j!guBv=svo4&|nt?SVwKvdG<0XGh)RQXbG_ViH+u$1+F_`FcnB} z5o#o2TTOKHFrtj_)Ka*}9T7>U2m~|b2l5pt3F`!ZabP%7{6-w+Po6{Ivf~Y0al@1) zzxNnEizAb6uvxBM9jjjEt2SLes91$x8gk=J_lYG7Z8}>InlCWWNtacz1|^GTjupoN zQuhtVA5_CcL`}hVj)Rv&Rb+x$OmBsill7MsU8nHppJYRmQH><`!_=OwjThfvJE+$` zwf+p-rn7rIv6WhxI1-m;Jd^f#E4J-|oIOrS+)}v&0%k>!?Mk&ZCo%VM5C1;o0dO>3 zzG+spwbP7*^l43#Q21DcNd42+7Hxnw-k68%s(@LL|NC;ynn!!?uQf`RsXxjr#Ef5( zHP3Y(^D@WGy9QCel9LH?85d;cht^Wz`9~J|{b5TqZ9-&4Vq3Q8%e&!>Ui*XR>8J{z zIbEYeDOLg7d0l2T=zmpwS3E^UfmV|!QNfTgh2INU&Gud(er!#o-ESxG;_*4%1>p5DfW16K|hzicU`sDJl`e?7a-WTV^vDfd?Yjhh& zVZtJK;XlpI;DiiIN*I&Vw(VC<4K{O4{uPUQ^xr`A{RTdoS0aeOf4O%HyWwT9e6#o zgw#KnzjJ^Mg&ulLQmLK~W6J}`*`qn`Xm~|gx&W&Wn>o5Kp!$pYo&*p44a$i&{mmT? zIH$7*i4TgFC3Pu&B{6X%8YJ7JR6^+A(GA@@FikNOZ$uUku+!)k6jx*TmdSShx(@^I z4QAR0%=YhD?a99*BJ5~eiD;K<7uaqxBAUf*(%&f#x(?vX3If@$rTecIo3o0_bPV3 zh`O2gTjeRDAyc!4#DOol1Q_Y}Qw})pt zJl-kZH$={)^+kZo5!(}w@&gH|3(QISnKzLw(nJ}k^L6G9mKS8|^C6?OZ%0-HJZ72) zrFkmX(;-f*On~nkSXLm!rX}+3G%e9W039+JNk?_w^kx;HAL4Mm{uh0!cFBAI2MH&S zA%;o#ZoOAvOp-rfIZz?w&RfMU>bMUhzj$>3Tcj)Sz0vzbcT<}q0me?~b4xRHMAO-c zx&yiny2qTnmI*y4hUBq=BJU=YZOzt9v1ag5J@p-OPC6*(;a9@&CvM^!-SldCx|7jS z6H8-(nN_lr4jat1$;5j zi#XM^(Gv`bPP627^0(bYbqFqe?HM21?E(r?v@Ig6kbxWnizDcF;wspJ7R5?q9vNv< zYRxP8Ef3tIF!g0#cN?<-nVnq?9W~T`?Mjn)4tr5n_?MHWGID{7;k{vU`iMTO@ z7Iz3Rgx#v+a@K^_C1~$EDtV|j*zG4Su0>^F?C4_}N)jFY@SaD0UL@AP5;v5q>ws6( z{>@4Oi#t1+&1c)i`WTX=eero!P2Y8 zL?V~tdgG24qU3)I9R$+c^b;C-Oc$At5bz8g9lGswuJZpsZpy#>^`9cM(xmX&MmX zzB&Zk!^7?AP>~=cN#&`+(I03SKIiIY2OrLFf<;~%^29K-4`KSunC#G;JD(rohn!of z2d~q{G!3PAUv4&qrs$uW9v5bd#opY^24U+Xc&6ORg*jpGr08X)e0JWi7&!4X#eC3V zSK~=oJbI}e%unG-StNdjD=G?Qn-aAa3Qd+i3Lo~LVP*N5VDd8IKfg~q?M~piL?lt6 zt%)Of4XEKZyBHa!1sD^`o5_zoaIg?8mQ{N+(*$^ zI0jxz$1#a=0MdFiknI&*;P4C43m3;zVHXdkD)++XSv)J;z9o6Re`!L zr)Lb>N%6IV+u<(?pIj2<8M4skoIA0R^TFSIhREN&D1P%^=4-=s5P1uIzL{6x^j!4v zt5rPTA@qq>5Ko9K@x6K()6E60T}SNFWI}zIKg0}OI7j?xm&)l(Rn)zITDgq%lIT5V zBn5!0hpg?o`X(M%-Yj7*6gp%@_1yi?a0t3 z`FjwWvN15ego3f5GqJ0%hqo7v6LAF*mHbH@DwKQ98+rZ~#{Y>c90h-rA4FJv%}wHL ze|{AYsm;(ff52VZuS@0FfeT^I`y9HM8{Fj`cbK%I7&IeZn6mKLZkrBJ5Lz$};0{$; zaO{w5u2`QSSHEDU8aiKcNIs>Q55%gWaJ=E4D8{V%h{f^dq2|4W?r2ZpSO zIzJn9c=iz6#73|OV6-uZG)UL6WBUqU8{(*X99^Ngd5~OcN#vLlxl?6(!P$fu3`7(G zTqf4km=9iUc~G~-U-kXdQV3mMKA#2NKzr7%S77G4#G)YlnEMTGP>vPqA?`SjsQV#d zx&#%ZS|<)K_e6hWyAUU@e_$*QP~_V*Hm$<5D1>F25fU>BZLS}QOc#kINr!H z6&3taGaA3XK<->zkjczYLu*n%^(x(s;O3<_)vYc?TWzGmH(=~~nSLIdqDnHPj8bW> z_rl~iXg<|}9YNB4*L7To@?7Wc6~+oN83Z1bo8VNxaQIHC1>lG za`Ll4Yvl21Q@q>lb>pzg(5pWq48JnJE9fo`WN{gD*qJ+)G{Pr1ev0;-UGrWK=cW+s zYXa~EMq;hS3Dblu~;x^x!_eB#igz7oE zaq3?--o>hl{Z{6_-N)6aXK0ek!=E26{!XI0{vs&59y+=+g9TpXC7)gmKQC~!+0pn2 zXx3GW1BE& zj`4``TKtHZds%9;V*M zCC1RITH;B_&}`N1y&z?^%&0T@sj)vLyd!#AuKHp$=2B#^0&61PtP(a_e~;7A5CWsB zjBq^S-!#4pQSuXd!-RjQ{Z*23@=K$Bfy>PGCnvlOcz{z6uUPE9g5j9rAVN-sH;}6N zjkHrn!^}m%%}=rGBex1?>hGJ*r{XjykAl2!OmWLCIh9dz04@YS?KWuV(U@Cu=aAm5 z%@5COyNZ_|Gd{+ohSpv=s|W<8oJR4@NN?r^LJ3XrP;Rq{Noh{WZ8kQUYa3<0p&v3*e)%r%y3)NXZ6^r zz}AGJ)K|?{nlG0!a}1P~Y1h<5+qgtt z&fnd=YH3{@u4BPEi(@qrJo%Zg&;B#~Gi70B+_p`{(bl>AHIKya_y+9|_W*wvg5hR5$$p}rHxiuVo^Rf?{a8aejwC* z1O8scqQ?9|uPhXc|GeBuU>7^5!~HttyURYZ#~oUNwY}#nod%5p^MLQ8>&N;u9~_mTAQc zE-TA=;Nb5~2PwEQcO{Hh#i{3gIl!A@eoYT6^l8Pis$=A8JDa45G8Xog#M%C3KkS;| z+aI|9AFmAq&Xw6DBB&52MR|=;=2Kg}h0#VD19Me?tcTz#orcIp>$A-<-C>Zu9+T505Ef#SPhitPXVYq)hmuYToy23xT^JpDBVeRRP@KUxZA2 zqTH{U*QsVv4r8hfDnnRc_8=@0Qilg_6H!o2hJJVWb&0_7!T zAc@*c(WOt})$^8z>apm>bH;dt)*+@hFoIFS(*R$+d;?Bz-!UDCMbby-2y$de#$5C= zyW1B!d0M_FbyNsp3q8~bnfOvm;J}S@VLjm4{$Ap!-@0%4-|Md2M8*eLD`&oO^*Lna zJpJ;ALJXiQVcBtR`(Z<$Qy6sR#@V)6A(2K2UnD3h5V1FhPWWbvkdr~|-A7-HAU?UYEl04i&m71$i-bCrbodgZ19%^7x>1c-bdohz z%SlH4xU8;GB6^OqwUlGbzWr`FJQR;-mnBL5dK>nAH*-}o)>vpDLwKv~^do;I^Oiej z(!|NfwY(UXx5dMbjL13};tjK-vOXi&Pjc*lI4EC?0Dk>bqzh0uiC#riE z;BtrJU1tfRsdoy+&ici6Uf+ga4k{awN`-ory>KIy;gdmILsc7&(sKBvKw?|XY)CB> zy=_|3UOby$?Untb{@-!EKG{l|8DkBe9ffDsuQn2r4E7RR?zT5z?FJe_khk2HXFpB8 z7%v&epLX{)?5hjQHajZL>oxk9ij7cm){E_F_cgvSkkFMo6_?ce3TC0J#7)w3zNxOm zG7f=0{~+O%#;3{{@`E||R_PmKY6-n8o*XEapfE=NJ0KR)NKWf`M3KH3nCJBU?7 z8o&-@d|7b^yCuB8u}bhU24+GAxCYd&jt$$w}PNYvJT#a{vg=vZKh}rA^RD=Bxhz! zQOe|_X=wHjBzqH1^}FB?RJqn!!P9AVp&dp%p>F8X&}l==j%69BD$J~NU0Y}Q29x5I zb8dnHrhw?~VJNnSZ;EgAo%4jh@}e8;#im}%+63is_ul?xoGZIQ;TJY_M~C(0G0gf1 z{mmz>X@sGJ+UF2#6?!h{>3#&{U^?zmC^eN&hIKRo)BI*3smkU2AO2 zq_LL#1)aW@T6~3`|a@UYO;UhCKOakMM_FUX&7AtrXnCx0@C%+(w!SEppr_1j0UAf zcSx6Xj2Ku{Yh(NwM-LPvN-i6ZUT$nH zn+eOAdISp84HUPC$VGgS4<74sVE&~VH%L^S$NMB_+g1|k>M5;R&v0jfZ*-aoW3;@Ht1d-b(@%p;OY`MbyxyN3 z>#YY!`5$ck$#S&}(_4^*d^U$=YHs4ZE4&rcG20T#E0aiFiQT_9)ltAg$F%Yuxd2pK zRm%83M#XJIsT1rMKDG178Y7pfso_p`Jt^(6-fB zZ)BzClDFDRQf*J$K6@@+J=Sp|Ys#qN$29x+Ex4a2^<1Ve1ML?=WjpFVXw1<%n$lbv z)%_-&zrWo)HRjWIDfS*babVJ#(69)t>D}kuSLSWIjww6O_qv{Jj+q9JQO7>{!w6zM zCg%8=uu}3NPW^m+uTdaRC9jS%CCJCTxkc9RdcqqlypO$iQHLzae<3kD=DqNEZ~h2r zlf373UGCWmG;ejfk5xrwhkR z?UTN-M$09|PA`I=ETl{u8aB&Ke2BfqZ#M3A-DgQ{j z1wEPJZeh#%QA?IT9QGnZ;~h&|zU%jX`Q}PTqMB&$P?uS@CVgQQj~Fq@lax29Eaj~Q zRYQENGq0X@fLp!LzGiKuv{=GJbD<~dUz+g4Dk*^d0D`{POH+a60ZYCtOkUcOY|B03 zEik*yri0`Qy~i=sLub92SCmV(u^qBkhb9e}^6-W8gRDkWEV$BHr*w69ey29P zpr;@_W+Ndv$TB0nXVOMjKqA)frm$vg19S?`w7JkcLS`G40OP%TXZvbV8`2Kj*? z`VFKML3KY)Sv2ZXCV^T`>sX$7xCfank8_tg?%iJ zr+)kW{abfhFK6}bzEErE!bUee?Jj(v!ZoO`;>r6^SeS+C5A()LqZF~<35#^o6pLSy zFsHv`rW5KHKG`9^*KRnK4k`|4ah=>9Jo+8_4^2G!QR?XmRDzA0b@h?9&gH|bxGe(6 zox`{{Nxy+ztO%v=Byn8DfLg1eZb~>ye-@Su#Cn+(VG<=^khRGX1i4jap@fjOM(tGv zF2J<|SWyL31#M`9;^Gl@_}!b?yo?&UR&KJuU$H^)8Z)l^a+<85i4O~ZZdbqRSr-qF zeQnYL)y8c3jYd-VrLBT)p{!2stdapXJ_%bm@W)6#`A86^3}QBk*p$@^I)up@mEiIK zQ}%$-`B%=dRZ@dTH`p1`>PqX9p)x6OLQ;@LxW@sa<6qknK8alo zCslWGob4W;zuXgGOKz)3^LE|56X23RP-uJ6RVr9y z)n@KH_`@+CLD5CEp8>{nUN8CZFM6QgY`K4)q(e!4|C}i$_GPb8iYX zOp?C(?~`0z%TT%ATzHgW+3w3rQgkDI=E}(N$Cik)Rd^58xqPXDB=Mlovci3gxQBg~ z_ihv@W~Lmt8niSa(@CgaEmEA9Q&k694SH~9?(B)0h5=ItVeVFi+5D2biWx7&lNV=R z0SRdlL&I^j0iK7MFDlb@gXmCve`tR?bC*wW-%L+kNATCW*iP zB}Ne%bd=r@-IV$vtCoR@3d*0s4zJ+SWJT3SzeVf`)^){Iz(0z~r@KnX?Akh(gmm&m zbQt8(prZ%WBuhDs96w|=$Xm+@{qA%^H)>)@Gn26PV%$1kkzOk+tM1^5oAPDE79#wB zMX}`UHY{qs~4gt*QX7 zA>5*A!uT($Ut9Irhu*m*u*ab0zH(@0DP+P@Kx=bzvQ%mhryiDn_rN zd&^r}|4Y)C5E%Fr@vpUQb3O)--^QMs8I8+1R#ke5Md#Sn)2;~6m27)v3}Kq#njczh z|DtKN5}esv%#*cMcQs4f`~sN#XrMf2T5umqlMv$D-F$&2xZE2e{=_F|n^u3!I)C5O zgN1Y&H_MVtB@JBY;we4Cr#vUVD-NK5y;0o!K0lMru1>O2RcaHJOUuaxka|r#pD2c4~zwq$H^T^#)il2!rk_5Fx{U9R$`G~5`BD_NT&l} zdP_FUMu=&9s-AXr+uL$Y>DV%n{7m~PEYwOUiEP=o?--R%%Wr{nTfo* zk*^H+ldj@CDy6z7%`Q%+?JO&H+anVB!85a*!R!=_+qEb4o)eJ^xt(<&B{gxZLWsj^? zR>x?#zth(46 zr!HP961QKi=x-Hd1`;^3p^3o~#fnfu^(D9$ioCh3QP=e8Ww^wh>kPh_k|Es7tCMc3 z&tFN51t^aiEH#2$Qa{aF+d)xxSZjPPuiC5B<~J7JUbcU9OxZ5qa`M?=E>Vf%TyAa% z9PMp7&T36o>C=q^@FUvV>={#9KF;DtK*CDvfF>IrGr*zsHFgQdR^wml#kR8!mt$+k zF&Vpbqlg0PlA>gxYktS`al+7ie-3^Z_4tg+MR%h753_KG;-Ve)w_8dM2; zvwzQ5^QXwuCCXI6z`t)-hJ8!?nr|-m_))GaRUng5lGqVW?L`Ukb`b5s1Rj`IfIn-mh*#eLmFD`+1PTWNLZpF!IEA94aB= z5Ua-NElf^B`4eKtqwV!Pt9Q z_6(Bi<&Jx*B_k)SQ3wL9GwvWX7PvVhz$v-A5sCdWL%7bL>h*h8skv}Nn}lU?#6Ww;Jm zo$(bUd1?fjPj^oKyX1p!LR(_Uz1(2i3iRGQl<&DmzIi>M`cG$`z#*V(g-psrMlM=? zzA^7n>Wh;8;{gpwF6?*so=uZR#}_H?g`B6S#ekYWL*87rA3f1|A17MnL7ux?^-Lc{ zwoekym3}Iw1+=&q-VZQE3-Lr3-5=!HjqZV-NqbMi|j-hXHq4VTVydd_gP2ffK1XqpPyGxmsumVaLJ zMcuUtNzxF2!^&=b1AN%Y4xdVg?Rhhn(|c;-DMsB@11IU4%MSqG@QD1T(ncxhg1Q{6J@pu`uu6Q(=r6}94VdhwO7&`y|s_xB`~m5>h2 zb7>>8V!`h904F~q_Frx8LA5=|4F0TlodzeQEGh4Up8E@|GZY4(wXfPpaA&-U!KW(3 zkgxfV;%4P2CSctgR}RxT2?5XB`GOrEOHRZE?Cx?rJyisbc@E}LfuF1md&w%2I$Z_>$1_Fk(Otq^|DI>MWq01-h&-mFV_wx??%J?w9 zw(l%mv$cH$X{5((I>cVbsp2mUIZR385HjCTVzo>d8BEq~SBH3ApA z3iZr~c5<2@!|WA~EpGqOk%*svzfg(1kYh9_PGOr@Ry#Z z@sT41$)i`v+@o}YtEib$tU$m~NC+HaX8>|&1K*Zd45x^*ug(T41KK#`cnjyQO1;zY z1P50Aee+tc{a;!Yt)GB4#97y*KvX6NFP|6XrL6t8Qk@w{B)`CY^hd)JG2uiQR!jN8 zA&u~|8a5r}f}6A$rsIfnAExs+2V9uGJttat6z68GEifxhWw(D1yMD-g6K9@Wvd_yh zl-^|(G{P|1mI5U)(BZ`~_2?+Oqyv9w8aUe z?)oQP)wC)oD!t|eanf%>-;|ZymI(vsC+*^;ytgOq4rbs#TbPiUn8O&Cwi|p!(0OL&+0mMHF)jmI-Xz-N@qF5DySdtq>yxDE4V6kp5{w@9m2qi zR|tzoUK0NU07HU31db6K>b0OmzxPaFA)2) z0?B)_9?gDtD(D0DTzJ{9M?7O&RmYOLDA}hfp#}C={Zg#F$P5Nx6OVFHIg;C9!Z3cRH8ip>MSfSSnnPf!hieeyt@1Yo3Pz4`DM1r~<8>i)wJGjPC1XF;IZ)OsFZ4X>4XgM(somJ4zHW?u6!$MIz8v+7Tba2jdyrs4Db zEVaYjgELFx8vb6GQN8Qla$~hGZ~RVTrW2_?^Yxk=KoIp} zuX~OEsfOR_KcwaRa#<>-v5v^E^EFg3Ez>-S{2j6>+M~Hg}Mj_3pHh51aG*e+Q^jhIT#QQG~9N%@+m_IFUfCQCE zdp@>8>(N*Zc5xk6a({w$9VG=+iUsC1RDX#oB|Lh-Le2DxZVQhUHw|*OPGSB%TSCk# zM5q8sRNh$HAhm2=JM@AaOz5LEPb1-NOxD1`+oj*4_8q^n@1UYbVUQcGYtn+ZL4ZZA z0o4QWb%Kt?Af0p8C9tQHUzKI3(@C_u0G>}Or(NZ0bair2>B{)8wc*hHtV(-8RWm7g z_HEd_7&TYqQh)G&?M(y!wyvT^MBHTag6?VJ-~18b@Z(nD#;6mw7(OB$?*$8R%XPvz zS^Zs&Y~1N#T_)}PRrrGLJf^Nf$Ek^o`@Y~{xY4+rHSy_<>4uz>%lC23F*}FCyOz>U z(>2d(*6C3-J}!`i#Tsaz2tWPF@PhU>!`>KrZCfSvBZhgbo1KOSKd^YzJGku2`KXvu`j^uMHr(D_prZqf z-2D$GjnVr~1R&AJfm6PZg-_d#^oGNhmZ1#S^eGTa`OCSNOB@dwEG}iMN66~t-r6?p zNYTm>W$wQa1ym;lR-W%QI+4FDy!DrT5u}6SKWgRjD8WC|8voel)IAIM9-8(zn}|_M zkWYL)VScXfjcUgBJ|IZ@KjSf`v2}R;L?B|*EWX$_HZOnDFQj zAT<#CQA2q8IP>uKQH*u~9Vmdet}9==7#w*R*i)BnCAfN8Wni z|G`7ou~OFbM)`_nA(V5n)dI+0gW;_!t3f#_kS*DfZmQJ^GTJmSH5flx~VW z01K8$Fx{n6%UwH;s%7uXPskB@rbDN-56=&-(8~4CY}hpc)kDL zF@t1Bdku|GRmTRzzk@c2v+-G5=|V0lQR&vJ$829N36F_O7*^tmrQYCONxl0tn(goM zUi1kQwXVs1bs+Hff4AB|1riN(aE^^E0xyXdPCje86Ht62mV1wlLnQ z*mj9({|~M&`qp7QeTk9Ekd`+opumLfB5!T&6{uF`M4B>0K}e^s79=gZfMY?s8bD(_ z=cpG?K8W|APPo+4j(mGZS{o?43|mbMO~6(=pASaN3{9l`A-MIm-s9<{kQ4_yHPBG) zXzJ_7-!=r~K$B&h4j+7_r{wf2L8O7*{m|3>P6i-{~d3J*M+-h_RRO|f8v z&9SId3LSuVKo%Vm!qzL+O^skMUk_!1`tP=;6SppZaWNB_zLB_Oc(Whcc~mTb`(rC5^U!&7U}e&~&Du zNy#}R1gCK6wa9)jdJ=bhV`yhUH~M{id?4;l)%Vb1O|0?DP-E31{6@NAKoE(p6#>6g zFVGFxN){)C@J~V|E|QMa+=MF;BbFWoE0~X>`frl{_?K*IaFH3jH-N4T&4X zrHHc8#5+U&EIVSa11RET1d?vvo*MU0HZy1>F>`QCAmToQcZ!PfchqPSs|iHth2*fLCygJ{cLIyrttKd*Gs@7c^!%SHjI_Z;-!|^>=Io#8W+e zWq8lJhIpwFUVty0=iov80=r56%7c||d`JS*FA-ZVH#@(KwV76X<=RzunIhLpv9Hud zO!3A;94G@~uRA(_YebglyEq_@rgXG42JPf}+QBHE|BsO~citRZYy*C)Pt5mi3~DF_ z9i=M)94?_D;!DSu|HX%d>_KV4 z0fz^0(bnh>ESadZMZ`}>WKDJY=TgG8V>Xq3*I??;#s?!OAM_Hc?0%5aX$ZK;RMp8` z*S?&e8J(Y)*XfymoXIO3+xE-DI@$N9gG$1L0J}Wdr=u5G`^FuCwX3>B_rBeUwXYa~ zazu4yAY`LMI;_*Oq%S4e#mr2$l{O+atzr>MHpHcyu4PqLH6iNgrX0VuU985f%O)S` z#aYZrdy*DQ-kL7A(75Z=3x~ib0)K!`Z%V_0JoA}W9D;7EFT={ zGE2ArPUt&NT(K2laVz_h>5!&{+&9;(M@n~U*EvoHA@l^5=3nT=4u&*^GTRXIw2Vu| zo}qG?ZPju?t8j$1f$%dxpXBDRHxz=-lg&&tCuMrrSU;vu6E}1$gqej8{&U#_040;z z{a@A36M}rRq@SbpG6TOYOk#<5lQ({OYtObVCTzzIIrY#$^D+Z3~KE;#0ZYVMUX(c_6gqJR}v|p}_ z63R%SkSlH(ljbmC7Ok4>l@3+lr8OdO(IhIo7?Pzb)As411!O7Ny$|Vwh%ZDXG4AHl zWMx?|Xp=5qy%o7M$ZGn>BI=&VQ1q`KiegjWW5EITc<24XE@Zr1gN^Q_#G%gEOZ%Xg zw`(hsABJ)diBC`;v^KB0WxH;IP@ zh-aIY>Fr!7o+;W>$}OVKsLOXWf#m&{2(U-JN;=ES^OH-W((pF%P)iWjPYyoMAN?T? zBY^hfM}n*jv|qnT?ZvL~je5+Usg|94R3G>rYFdzoQF{0-v*tiPt?aBI-s4C&zHTcv z@-x<`Gl6PX&1RCF3tnHfk+U2XToDZ(rK^(p-R5Wpk$Q7IJUvjsmwadTV4x(2`yY?z zC!m3wF|ZZ|rGBFi6N60!4fgOYm$tHb#Welc+Gq=ev$dH+t>a*&LLzC3#5n-KYGB&# zA*6(ZlBSW0NiIFL{_+2am$3h3P{$xu1uuQja6mm9E=z{OnjZ-N=ZoPrt zVvNhqF{%KnSvQ-_$MWuX9Q+Q9fyv(Yhl6fFRI(2``0% zRU`|IuC*+Z7Ox>8#w7#3JwyivSDOm}yU-JqFRolA17pm3G>F)VmO$6@bz$CaT-dIV zp>hQ%fDZsKrl@4hH16EoW%4@poiM8*j+<9!5X6steh)nQl_QZbb*ExdG|$BQGtj4g z&?-9|BOb*a7kl@m%X47ucg0%l;dLuC(oLsfD<_LP6H)PIm1^SxtyA9jon<#sU3|5S zW_cgDzN&gO#&z!<`@-Wl0U-@?wmOg=uE$UNq4bM1Fqb||%aStzb)xCe7glni_etA?mk}OFl58U*`r=GWZ-s`u_ ze!XY*DKay^G-bJTWNFgwvJf1h%sJJJ&2JpSIY8 zZBV2o1P!yn0Ap*lkErS7iY!X z*k{nss(Go4*j>lI2m6aHpSXfc)sXAzSER2q5LM@r)03tXBi$O}Us&h6sl2N*4v=yW zc}@S+A@P6bkaMj2+Lj+!13(R`%zDF&yGV7w&UA(?q+JL-mwZKeahD<3^Ih%j2ENR2 z9Eq=s7p!g>SBSJx_yV0mN9(`VbXRZ$&itoFa0DLz$vQT!Fgz0(VyAM}vh~9gz>3SX z^mBZphiYl`y`zJs74Q2jG_AF4XDuG_((+22E!D|+z`wG47z9E3YyKD-*V|R#<`g}q zED(dem+S-2dMO;}lM*A&!F3jnVjD@L)91!$JcP-vBrEPP)y@yyzF;EE%0Yv6{bU6A zsvp)Vtfc6?p(+8w&4O@c@2ULDZ(W6qJUbpNr11~REE?&1uV1WlmhVT+kh<7sR;nL! zPj)#&oMIyn)L6Ney>JigJ4{=I<(9~{l4dl#RZ^g2(J)Saad;MJ87+T3$0zDy z77$O@bXgW{dz0H%ONr?p)q9@)Y3w;Pr^@yU_q97UtA&&RHGObx-6OF&_1ff*2!hk6 z&}Z2OV1G4fj|z*yTswiYABSERo(UfbZaTsIAD`5hYUSdyy8|-fMB;a5tHkg`rOWoK zjiK~h91^Q2a#-+evkcwWvXL(Q((LkqGDr9xu-+!7^DHyKw z_GRI5z$dzr!Dlvt0tmAb%FK`9*GnI*Q#M|oa#JN-bwmHDdI)xLXQT@mP|Nsp+{^)B z1o(?Jp1&jO-aPDqFvd#wq&CbhhQINL57^h7n&@rM8}gW}=IX)k7*ggYOeC}_O_VF+ zB02lSLb8zVYHg=IfO*G{k|dS&{hEf!^Ck&_r!NjsgKsI@h%@*3t<7D2lltdZDTCqb z`f=r7(LR&Y#pMH*2*=DF##)Wz9kZrFyBA*wGK7H(a?>3%zf`v7kFDJW1Fx=aXM}y( z150v@iJNAm!jUY(5v8aqc^N8gg}m&^nFZ5r(RVEmw!`8&8G<*Lm86i40M8d$i{2Am zPiYM`4d!?fL{NEhwZqb<0tlI9${e$)CkV+12(I5JExPX@%=;Bh^HVsn|LuA}b4D&M z%4OUY$SaKPJNb64<7Bf49qEz+mGp9Li(efVIF9PpUDU^qdd~Pnx{dxia4BfgW0*7n z^{19gFeY1>)^WSEST?$G*Y1J{~D*MK*vP|_Ukg5v}{tYOnEJb!>lH>zIG@H z^uA8&Z8p9BW*$&f?P=lX7T{)S>9&)qHsV-X>dXZ4huBGi(W~wjbV#F3P(SHG!W&#^$??s()YWTv&6U$zA*x;06xNOX>(70$g97Lco@T}Fv4So zCO1-DD;K%a`GV_%YdAG93_a^XzxhQJcSghjFT8I43BKJABmG3$O1;mx;UiT=ppV}d zQ2M%s;03SStpBSCeG&r-J_n?dsL^B@CT-uu_}>&#EMA*kf$b=Ocx$emT7ju}ze01zkS#ue%>7-%lz1G5PyLjWV8_Mm?&RBsTft6!du^aDb^=(=0@dd}f5pt} zmRlsK&{UL{58H?5vaZsyasx8Aik`gZl04>Ae-e288&|SNDv_+Q2^x$CETE1P^v(b;QzJ(51Bow3 z+qaaezrKa8tF?qbKGmIIB3L)7q`IHNElOtU-oi8BEb$}LwBAXO5$Xt^2`UZDd?W_B z_hy{xr(EFLJ%huF4|cr?VD(bx3cF{8u3wI8AXcm0yKCR4CmG3#_$+(z>w6y+Gu`S` ze}=!X=I+>S#@JLR@w??#p>%(h2V7P*SQszqm!HV?bxy2Jy!mpW8>A9&*uDFEV_`-Q z?raqBDg1m2W0P0(I}Ov~9Pc-3J~vyIg^70Be-@Cp&gYeE=v7rI!^zG@Ofa&b??Rr6 zk-4H?+LA4pK^{cf+AhF>MV8D{L;X}wg=Ae;sDjG~J9UmF!jS?p-|KJAenw8VQ9hlt zduS3W*Dqm9ke*T&<{k%`e1Xtix)Y5U#izJKRx-}nzHlTW~xrOx?8k3p5ovR^NW=SbsxT00HaGrySFVcQS!Tj%DXc zTl-`UjfMx?OkNw?%)-qg6TxxKC-1$gXckZY>G+UvaN?I(=<9o3-3$CgAQxoqjmF9Z z>hFDZD1xWN@&E9|f=J{tr&|!EtK7ymWGr?~3 zZc#QXDw0aYQhqojXq;VPfXCrWS8}}mlH)JtKx4T%bod_5=8LXvYPzyPU%<$E9yWc; z9zTq=(T?Kfk?pNdrPbFO$LSvhjua!Nb3Zn;8#BM9@KKo+yd3f*jX!>QMJ?U7CQY_4 z@3wg=YWo0ELY*&2lt=mUA)Y*p<(}cHy?a#_g4}>RRC%>~CARyQ>s|$T+*#gX4v7eO zD#qI~xZ+3{-v(D_-dR71Yk09#Pb{43)5ZoB}3 zzwKEbDr!5&wx1MlHRw}#!hC{mGz6TAhu5gAk{1w4)o8X_%yFyp{ z1(9O0Po9P4C7P$7YXT+fC(Fn|E}qxBQVYVLPEU^Y1INop#Xr|SZw}sOxObg|SOk~E z{!`s7W9ptU@#gCRgVyOa+Ys%ZH2jtEn+J4T8E?A^)X>MxM%$#m1g!+H`_8V3s1u}080pb*602FdXb2rP{1LELb|`>Q zJqKF0;q?U(4uV}zDPwgsmc2UG-fXvadbHhMMU6f&vxSenea*&iSJAqDOj@S!Bc{|3 z>lKY3v0Y@lR_(jFam){@pRbnbT)2YqS}ASx${=FV{k{Z#Z%LHd;|SwBMxi1xl^%}N zqoem=iyK=}T^zaa&|>jpAuxeK*m?gv4H%%#Q0h!wA14z#&*AS^YENzH2MO%sP!vB7 zU*uQ|0%u$dNErnWx^_rNSdS1csdt^z123O3&Q<_|O3w7=DqNoKy&^?lH_K4%r0|!? zjHcq)aird#OcQO7H-azbPz|;YF1*kJazZ=GUaJfDeC`tn^wvhjK|bxJ$n6i2SIgcv z0p8-LQI+J^!&(ge4;-#U7;w);V*&)qLmCFTjejb^$0(omw`6O#_t&TKWJ$N)j4E*| zO-1(j4s@={z7~kTyM7PK9%fIxUBh=BX-s?5l$j~}2|8fSw&K?&vfod1I^LkU*SZoP z?h?q^PlW%K6aYC3(whd~hV%36TZ%5T1`Y^wG}KZXF97#_Ck1$#F;O{? zMn^JMchdO{X_d*eV8LzfLy=~f86(8$vCFLFcQB673*RDgncJ8+6|njrke{ey)~a_` za1V%Xxv~aBBZCHn9Vnx(#u!<&NEqjHWbMw#@)^DV$a}_#%G796respHaz%B?MGM~i zOrw#L_qwj`V(n+Y5wxKl&BpK8xo(OE-TQh$Of@caeCLLqCsL7p>?YWVHm*@Oi}+w1E)0olKvUq*3Oj(p*yCpi9$&`w!m$G4uBI_;8NZ`_kU z5l50auwDR`vUO~`8As07>(=A4;89p&ig4{qt#_#>oQ@I@gb8M;RS@X$ZgX$L0QrMC zWK*V3(?QNoW;=^6M`rn~H$;N2fO4o3Ux~9#^zB=ZI$1;c(KzbrP3ms8HJDv(eNyegf(*JJU|0 zcQ!vETL#7z3Gr2C5~+Foof7oz6AXo~ERnBNcZ>&yasTkCnIjC#V@7I+x$p{pqZEs# zN-KU#m&BG|eZxER;j>;%o-P6WRRhmWq3dF}DPD>N9m$i3`KI0#e-^kc+OLNiE83-` zN4r%po}I zwwE)|&W(RY^GTfE(nDm1Qqxth!}*YN;A7Tv{L<~nt_Tw`4LQ)+TDD_W;pWttN_%DV z{lFCFsRi{6j(ak>Lktt|?sgWghDRpT!S_`l2Q~r=?vBkxE~B}%N*T>V^(-mYpYJcXhT^|WYdIhmiWhrEoip(f<_QZhe1ut2{kis?o@GuCKYffF8`_2I)`1*Fr7rV z9UU$=&-{BbY9##SHSV8enL_)gf&S3Tt@x1HQ}PMxiz;LdzD#s_6unL}mlwG5?)LK5 zON|;gZ%r!w&Tmff_cfyxy2fz~q6EgUEv?U$p`fWsQA>P_fX#6Wh=I>I4?EJe{igU4 zm0^@b^56eN$N$R9NO#{0w7 zRv_WHA>`=ZwiPiq86!PhUYax0?VGdLAr&2Csd8T`#g#A%~=Ysr=-#?1pxPpX!&*~^-7oeq$rn2@; zmcKx-R9$fZo4=LKKc#-LXSdLY0&lr|!;?#KgREwgR=OYkI(7^ubV7XM^-y0a7%?5M zRW`zHtRoIiY(#&PcB;r7ul$W0ZZ{HLo^Uh2YY+;k;V&dSE8@?(3Uf$TedGT$K0+W= zUGzAwFO|bz&TD!1k(sopBFfahn7@OU8TG~G13+x4JXk?Jc#OM%Got~(AWzvMXX4~d zkcP)9v-rm9BN%R`NCHR?S_AugNZ5~wpz}Po8Fm5{Au>g_)885GC(D0{#H+JjDT994 z1?B`;^?gBMY!{ASr*JjX^n%v9eEpVx1s*-XH_>u4VY2hKPyc?|dE!Ynzw_asI19{t z{JKap_M!zMue2>iiKV>mAvxzj*bT-7b;IKzV1^XpO-lzp<1A;V*l@2`oRj^$f-!Dq z`QNk(y2Sl*^@r*{gZnmjolx?xzZFYAX}KJGIb2GC&C(ogy_tZS{QIoVo4;T61+Tp> zi`-K9S^nHvMw`P~;?{2a>mymK&*<&1d$*PtsPA?1V4rU4{xco;pF6}ZCjVpSad&=S zI`jh5zUQu6eBN-&k7Ul@CGOMsDOp?D)^ZV&6H$_DK>q$2)$>8k4IdZi#qVbmpVzY! zHl+Bf-_mhXasF^Xy`8sy9D!?=NSG*ZsLZ3%J3CZ+eVn-`NTgTr$?&D?bcOX@gELPj zD&wTW*F_I?r@p&$KB}ry_j^|ogid>&PvhPV=Np?p(X7EpPPoY}^=%TQZU9=?AdgNs zREAi3+B>PK?5(R=h7ahxzxfZS;8U3N%)=RGXcl{No@~?ox|lC(^s2*-&y|i|>L-0r z`!^Ntl^!?sln%-xIl9Wq+>F;1%1ot?SwO&|pA+{pl7@yvzX1*WdP&jpQ_bvMNortN zKZCQFcW27$ON$3~Fa2$DHPJ6E(xgu=y^`N zJ}_j{$-tD|f%es{RFBWt(%}47yQx^dp zbsVWH`Hxd8b{kAA`-;s=rhL#NRTVlhS(JNXpUEc{i`xE*eY7FNRU_QYOGfl>V}@13 z8Hq+y$<1O#t>vt%)Glp+M;oFXe^RJj&3so&HGXDpR_JskhJ9r)OkY`bUGYCIF<f*xAXl}#8fEZIGvB~gRyn6hQG5|rCtgK9X-7H!g5~dXj*5(JXKaXrAfF$;`Fh66V^`9t z81SuWtGME5x_`W-*a4(*WB~q?uzOUDZF%#>aloJ`|ac5&Do9`-^AGc(96e+Cz=PKWF9o97b(s`61r^qp^{$Q@$=v`6XS%zcK!7rb` zj(wjLDt##}bhRv=8`B)WaM3x=m+}7lv;E~49t)#7pCr8MMa;Y_uCrQa{98-(wG(@O zR-Is#O|ap=#A9zqWY9lB-4bYX#Xrc2PsLq77-BtK-6AyF-8`4Z;zm_1np`QYhP{F; zm^_PlFxz*qk^Gp%`&3e7GE}wQ@+l*asW3I&)ac0qOs__3(V5JRKr3s&7r*)W!nOCO zWfKM3R2OAc$`0+Ioz@Kbwp>VoFV%JFh8w{jaG*cFT;t|>_HFNbk9s4ndzUzhlhTc^IyKd-aA6WtI=-`&X;VEsXX-Io@So1hr4 z^f*?m_4@bWmGgJVayxS=x04HLsa>Tlm}$9(T5-kPmu`*I=}FeAk>dang+D5$c+7=q z`R*y>TTDDkd4|+?cA)uQs~PH=-2LG#bGy%YoLoO~w%E6P&AJUSXSX4-PJ)kapkG`h zS^&<2FeVuxZMnQZU{?_ILRGNSdrs4?q>0st`GaM%&wkibx(h=R9jh4Iomt?(Q$MRC zAuEkD`g!|Qk)J;tYKP%v8Eot>^ylL3V=VLb_#NYKO#O_FzvAZ(GVj`#lxO}IXb1z#ZH4J#5o`;RlL z@#8D--YnFN;JWxRmWSm8Ez^b!S=2R;{FP#r?Uvwu*K==+1Blj91*1rfJVdr5&vUi; zZ$)!-7jE}OmD;}Ti1tgGdL~7?tECf5P2RzIe}m9Wx;&Ip!D=P?2r0BZmMxnr7%N#W zeDEXsIV!X&^S&)#^%n2W0X_D8jS?k@xz<3m`2E#KhOq;SZxFEu{`PQI^pz&?Mc*2} zDFSZBgnbb7XR83@5WW+O|2SO*BRjmXL+d*p%URs3hi{#MWjf&acg$+`swq~D{NkJJ zP5#^tx*XzbP^s1GvXjh885Rr^+S~rBqsm_(8&1?-xBANw-t%-$VUarcS*W13>x-dW zvKwKPwey3ZG*J&%$X%DBQrHm+eY*4&ayNXC(9q8x`;*&`$t#f##hR$#xAP*df1Ktp z3S7&d41ieHCLJ?iMKSl~MnDwkFQXd3F_nq87G#1;-y`bgIi6F6R`u&ulFQjpeL3$} zN7lV*6X0M-6d1P|c!vJcD)0|@0Qt))H>IywTqwCu#DlI#CV8P7e^#1>w~mxJuN=#b zz1MDXG0c$+*xkDe+}|jk?Z$7);naTN(Udp78%r_10lc#r^v@h=59oC`cVm?V z`r_#E1oM4(7h%sGhr2@&5>>5{+Vy&rxuV$JD&apSoHIm4=0T_87oKOg^9A|I!MT{C z`5!Wr?{KmB1lYf*wuE}VWH2LPKlj}wSep4a;~2%?*Nm2Gb|2-5QeF)S)TYMz6d33T zPqYD^Q=aCI=^(!slu`Cjrn<4a>^{E z6|e--U~RMd$?;0Qe!V{8p38&O-<7<%pa-+e1FenWqy1!7UwSLlGi@!QKIRF=rD_Dt z3Zn-kbHiMFN6houtsqEO#X8HHZV6hCW!e5Po&I50UP_j2Csvs7JSqwlybLewSz$!| zH19QVwpE->ZO*iv?mp_~I0+ysMg7@aW`#b4Ekl>{1WrndDWaE$mwHz(QZFLNIR0ys zl4vOXq}L};nQ#2RWB)6iOV=@tz{M$OYon1RV~56>ig?i>292;B=ic~7T@BueG&cAaJ%yt7EHRnA5vUhGS0Y778!{Kg0ZKmC<3RV5U+ zSV|PZ$^PArP_7bP{F`wC{bVjK{+x?YsX@W`OJGGv+H_&N@lEb8N#>h`ms`*N(c$!S zOL=QM`AgE4>t5FgF3uYariS#vexL208(Qx%eH;WCGcSZn2))i^JYRO92k-T=laYWJ z-XNB?r#&G(Sr=xC@as<%pUiLc?PghSkTrhp?8Kk=HEAv&Kp6*3 z`Jz89R9SD2*+AuVhAkJo8I-_w4dlVNOmMBup*HL#Z+MiwO7M%N>_6qVSXCJx9nT8> zobO*_P{>%y-i^+wBhb0C%#or6aDII_z}%hWnkHUV=I&sKUqc7;P`)}@4XYd5-qx_D z0o$$ipxXnQs;`YH0c5Z*QgNC{!fD#Jr_U;Xt?b7E?X<_{X`CzPcb^V+lRYGGwgPZ1 zRr(!{Plp}Z#p`a#KD4_pXz2`XU{{1mxCwnahJ-`MTsvFa66Lf@Ma)V4%tsvNqli7= z9Y2SnBOT*;sJ*8W>=o``7mv&yvQ%;%$YCBq9Ul-fT=%-wmG%~Fk`669-xmpU_`a}8 zEAoEGzQ=XJcHgt&_Qu2W^InQ;|jirQNzbR>XDRGbEhVo~0uv;ol=2 z7_E5}#3qwdD{6MqBmV_gL~S(QAefVsX^?3Wsa<)C`g?=_LH*^u$CB%Yf%CE>m8xec z&-)(a?`$F%yjc}}Nmamw0myd>sv_2#(K4&&BWbTQ(a)q51iHRF9uPB^?LK#648i*v z?e&>Kn^_7FVfr($xNYA{lRG;{UyB_M5TIb$f{PIKMYdzd@xhk!@~jiVCz)f5qAPFr zAufqo=nkhg%iw=Bl?_W%o1XJLxO$Nl%XgsEOMZIUzG!2o0qx)X$!nUOaW?IPX%^P6 zLa+kuS2;E@b7egwG7r+_6Vz^7Hhiwb-WH$xZ@vXWAJY7 zdQ(w&ksiB!^9^5X)b7(5naaF@8;`$c7Py~tyz+@n&W(P;c^|l!7vqtI&%+SUg{w^n zzEpfi}<|MdPGk_k&8U;hud*#m^kmuBk8QSJw zBU_&OzP4gmFU1)?-z;x9h+xJ)`%(5kMAvhxI1`8s=@7WF*94Ez$FRmqfP=reC#>Fv z|GAa0lvl+KOL>(Twbxf|^$;Jb4t*I3XeVZ)R;mv@vYc_ zjbKw8J_m|o4pvv@>aA!cSyp|97WT`EYFx31lUQ)7Rmlg zl$QqoOO&N%-Tb+wF+PC@G5{aoQjq;Ga;N3*x@7OouT3=0m~6ElG=XQ=P9q3rUZBG! zk@@YMHDQBi=fUL`A{)f@FU5`lK7gfOS6v;E3#v!16(j?U;4LX`06XKikwm@p7e+bp=IK>;B;*{8Q17i|ri3a_GDKasS7m??TQd`~~kU#SP-lY#ZEW?|RJp1#RPw ziO+HLw&_ZD!E>kPRS#y`g_2sz7^U1^iDfB?TMZH=%^$1C(SXyOLNV%sZJ!7Yj0`+B zrek$IpR`aMbWv2YleE8hVb2i%h-m8>0n2}EMt5T{>i99}DLqGs%?7y{<3T_x-74eCYLZ4T_V1GQf(e@a!`J5Agm?g^V$hCWHO{$o@1?g3$m=Zl}Y%g@gj$2moX@K!Ya z9)LGQpBq347R7;s(IU^8I4mUa8oB1hD+yna%MP4FVeSePZ(hF%sRmqMKQ#Rzl6CX$ z%b?o1%)13KMg9KMKs6|n&L`4$dKt32t(l%umETzyYFECqe5hPt*hhortyk~u&lG3& z>}Tl%b~6pZ*RM1EOV%5oy#GKH!zk1K5E+LDb?sjDoQtLcFtXuh+dF+1DgtaYz-7C@ zeW?P|9ut(#gH?o`Uy{mTrDiiIQyaO0m(&5ee+xuIUe@*LJkh;Z?9Vf+-~kcZY2$>)qn zDf{xz*$vvfX@q?f51M95C)S<)NoeI{Qsy=Qm01i2+NMz&cb|?L z2#O8nvqnzM+)rHe2i|`zw|xI>)FKK#^W7 zp{~4JsKO~A1&VPLV0@{=V7Z0Nbk9*~jHJfaf+c$N@~pLy(LgoDE(MUS={aD~r&0@9$^VdH;fM{>KAajr>TaXoQZboTeeUOujNnkUU? z6`dYUUjSFF@4cI@EE>h8LcyPfY*(N8hJMHVI_RJIN&fH@zcSEzTH=6PF`BV4FSy$y zk+=^ASO70tI%N2<1kx*FU+7lh_?MsI$wV=i#rp>QmDTSoQ39{O#p`9Ka>K0LX2z*h zAUnf4HZuH6cxlH?Zu5^YKEudza;E+Kb-sC}io+?Go3-vYs#<~_Y{{9BMKIY>?Y2B- z2NPoLqxtv_NiR$xWx$R9HRHzpJVAW}u3C3@ub91V9`#N_)rJ?Y6O97X*>gB)l&4(}Gdi+w_fgl?aZg?0yoK3hVyxG~T&B%CaCv2sALu)}?k{N$B2Zx2>1TvLvHG0XyZ}9Jf@Xw+OkZUCK#Q7A^NU91LFv zC=RZHvg!6K=WJI$O$y|3FtRI;eZDrFbQ#JbvRNP_v*c2mS&mI}+No?3$&(fI4UF&| z97>|oNST=5dW)Pv1@dA{7zAt{u8&S>KIkDB?wxQ*>upr3c8ObUbx~!2?kq<3HkyeC zzfTyw>_1tl7kw>r6436?fpWRpdGB*7pl}i{QoS*KTD9K&J9Cb1ilNH-lT7uZ69Qt! zbK~eU2!a-pyf1n{{fm^IUVG9-IVv$m`FZrBCC~jRw?hH2-(VTD$JE&y&nGe`?|V&< zSvEh$YUtf@hD}68%e9#+hSqXV2~8V!F^Ts(llkSY4J{06q4u-#iwku%xXPl`D0fNm zXA?<==RsT|O-IMS>m(9R18MdZly`P}cV%WeQjx5hLn-DkRafBRA>q5ub3!32%s zWZoGD$@ik%+H0r{?Z4ySp+8w-$iUh)%cxzaMU8a-@IP!3?~-8kOwXG=>r`G#88D4< zNM}ADDRSqu&O-a73aK7#>&r~iA-8`WiA@~8j&hqwF4T+UFJ5-A5X3>wa2(K03k~)b zp8Dw9T{Wfk7c^xZ_!I^yB4QQS_~S@Pu$Md}r@oHTZwI58Hcnm0HqVHw`1HV0!fSS{ZbS@-PyOwa^NPM7q%Ms!|$D zZ}~L-+EJLC!_1QONld_zQr`1{uYh2#ii1bkwZlcLd2;Nfcb8$FBr)$`D+VY29S|s> z+xHMloIzKg*QF&lOO02JNzI5UlCFa^A@}GH(r9jPP7g6`-}E$V8liUFKL2k=hZ$7f z@sj+ty1pp}CNu1DXvJgSz>F=Dl*jlsvqh(W}`+X|GK>TpRwOx(C)I z9M#9pv$4BTTJ1f+Md=+-vq~n~Sfg9+Q+73@3gN4f-6%ViIZfp7vsq{Yx=*2LttdXs z@Ia2FZtu)Da-QX~2QsIra+g_Q3|Aw(d%ln7PrBt1oS95yGXsnyCv7)NDk$DiE7xPk zH5l~BoW*rLX47OHn=m=1O8NP(N(s9K)qLWeR@;N~Hx*Gs>!|kYgx>M0+c|*bRj_Pg zcDi9aA@ntn+YMsl5W9n`AT%^$+T&+j&As@=gTm&v-9TC4Uz-N>nw4cA?q@Ou}l4Ddk5ELZZi_&~gRkRZ1f34^7|z9U3b5v4QH~tEwHi;ytlb z@EOZ+X4zodsf(EtwkFiX@iAZCRkY%mxE0~LOMT4Zy18{#Nov8kzV*?e;rMw%K6X%D z)WiAAo#2k`_|WIhqh!Cd$fN4}R#-t*3E)#2H?;_ndvt|Ew!nJW$fDEQd5(%}#XIYR z!&(#)rSLM3r+@EGpJ#PeT<5(Qs>gq0P}7x5#;}#`I%g}Mhs@FY-dJNV`O6m}!GPhw z5gvap6A+J1iws@0{|ijgm@3gJ+A$v!>1B2}`n#s}yobayXw_O2&dd|U&g2^@BTw@c z%RLAAx(3S>v6)cMo|(=4PD6?jYl&%P*{=U1s)SG~fqMY#+K{r#<~t5rI*I63nfbs4 zQwJHb!?$sMWk{@Lnx}Q;}on*i_k;vMk&NHCUb&>3MP0>bhi( z;X4gB$o{B{s^9>=Joj1B-tT)}Ll@e6u=-JL4I$T)b`_m{?r;S8PB|bOr3o&^^SpK2 zg|>ROoC&VCDI*9P9pchhvkd4y5Wr_BExNB>17FIvXdUOh2z)N{x9=v}=y1u{(Z}J{lZANrqKuPt+oB26^(p zAE})$@pfhR%YjYkw;im?sIC4&@YHYmMg4-^x%{-NkS+A*CshJD8Is4rra^ey2qE+lpniEgB;3kcaqV*wM^SGPZ#h6pNlSBhOIUu9(@5Q~K*h z_lW4{>4$XKY5)UwU-55$7Kq=mwmjEz#F=F#BRmv{R9V~S+gqM~P5btidwTTORH+fX zo*%kz#rbMwBgNKjWaQO>Sph_j=XUhX(ZXt_Fp~qO?t=A4#9%LKq50q5o9Go}6g~u@ zAI_eyLl-{*%r4i3S`#qdIpP&bW0w6`+{;*A~Xc9m{M@>)liOzZ*;gSL%_~> z-JeMFa+2u-2nIw)e+&^wJhkdsxJ{@^ub>nOt4>Q}qDM%JNC$*OtTy<9I3?2Z>G?6w zZor~j$d!f^^RHd=DyPiz_T8~Ix{FTgo4=Ob{}|u2f7Sf9r7%6ycB?5f8p!Bfv~##= zBClk05srQ`R2tZh+sTqDh~W4!u zaJYjJ$qM^{Q5X9;32@gQqdNVUT*p~J*Xs@oHpd=FgD*ke;ey-9Yt*<;G z8*7eV#|}P4_6@u1O7Bt8ZimRzN`^T}WK}i?e|PvC>|`%+Q(dN(P2|PAx(RZO{AG_<^P%d)x#L@JwocyFGEN=+Y5# z8;#UXvEcHuEVefNc7yfEpqO$g4B(x+>oldh9N}#d5Lt^gFP6_@L_E zlT|$ha;^``CV9j>hC31rYO5cmui`RH4H(MD=MH1AUo`kRf;o_Hsz#fy@KzqZ6;m6Z z;)@;o^ZY+~)RQB(%@`f#WnPPPGNE*dWC+d52&7lG z9_QPV`OtVS-;xx&Z&r11k8e8r?Vqq|yq<>w`2Ek+3lC=Z)n=0K!`#Shr$ zKPQp@10u=|daYDZ|B*t$y*FYG}FEF@~R|e zL@jx5w;UIm#F&3{w1~U2`7KW=HI0q%16P!R9E9^($w8ZTnvm!KIak0dJbXoj+A!&_ zN2@qpq`XT~x00x51+%u0XK4`FhpyGpr6_Z_@pxa zm95srfe+IXe)-p5#Mwj9({^W;Q1EkxHARKgQq((7UjLB84W0UhtDogTR3&fk+`@s! z4p}AZ6~&2+<5zVzA?!)8#Aqg#_)TsEFzJK!^|rxM-bW-JQ>A!b6>6kmU6s;}Q&!h! zZXwtsY^XlDZp`6<+}d)MHpHVCQAWv_SGul0fG3bK7)wzQ)o5D!(=mFK(SH_xK~J_2 zuu7-qukl>LrOs^h>j?_%chjGUsr>h0{%6g1|B)umXq(qxGIsWwR%U&kjejS#S*3iX zIvD)i8#_|;k`}VHwO|bwo_um;y@^xlnML32U~mQs2LvxtzM3q@MWKk~;8lOm*VA>L78tG}Nw8uAg{- z>43fBo(tSPqlA8XEc>-x5-;Jb21dR1>a#d4eoaCc6WQupT6~xgh5Wn{LDQiyfa->R zh%-5UsLARxJB59L6A1~fg&e#5b(cP!scc0~!V2@Q@wa3zt;%&9(eU}h1WY4v!pe^B zudEJ-c0oNis|}1z0rxe_Dnwv^QnNWcVr{S#1g?3Tn>d*X(A2oOO$xwvLEJ`oO8krx~s-N48jXb7>hXbB@ zd@puZS~PO3JI!!#{JmEaZ?dHaEEsku5FqQWJR-74HG5UxDdhAp#ckGGGRZt+n{R_y zFO_m`W$n|=?h4{4i z*>w%+MZ_CuqZ{9J8=2ufJgsa&8nU&DibqTDszPCtEBS+i5I}X_rhd&bIoN2$a)To{ z$hQ61P$&6cbJl0nJyq4ZeP55no_h>FD{M3V7==^4o=jZ4mx}5=Wx3FvO%0MI5#1W3 z5vTfQUDqN$<~#Z0M0ox?q6E~N~UG}ba^uz>&P94TV1t@bWLBZyuN(x z=ETn|5>0eJSeyzvY zu`YP?9G*3B!XVacGxn!jQ`4%XF;nM&%|L?xPSS_=N~Q1L?LG%zG5P#7Zh7|t{wF4Q zeUU`{K|Az{=QjKaxR~MsCI!oR9Pt^Y&4NwCV{0{1iW_9*W6rqRV=2dFkE?rxR4{Qo zud|K+ynUMsRb97Ft8h_t!^C;qNR!{-gO289gKRS^ik+e7Zve6Qf8f!bkO=&?J{T)I zm;obyUMZv@H?MIp>wmi8(PyK#VA2fW~5n7o{|+}tB$!>SaTWOE@ODzn45`5snjr3 zBNZ{DMVd`ppzX0mIhVf>R(eRQgc2An+2t3{I>UV(VxgQ=5`B2{ndl_*SNTnL1B@yPm zHO7!wQN&O+k5;PX+Ft9;Qtfm=$X||{TdZ!b zI%fD{0ULX$xbAW-!ju(qVI4;Ua6YKa6C~qy6ylam6u$?iEhEMzrbcav@(~@~JGdrc z-Vd}zF&_-eu$3#&72_d8oxwjLZ(nfESv*neHKQ zd%30YD5SF@Qa$zgKx@2$s14iUqQSj$u4?Q(7mdqo{3?i0eW_(3iG=rB9*fVT;@5rt zmp{+AddR(oIv?Jcs+vl?X*#%{vR|$F#7jJO1{#pFz0a}K@{A||j*}2w;(TuK>R^oS zMheiM6c4};LC)o}G7d(Jnq%d`PDtHoytMc+GdEeQ8j@3#kMKm3_&LK~IUnE!S!0a2 zAiHAAv-xoE=bjD^CnEOs#jT#=GKM3CCPmU5{}d1PKPX9FU7t8l{{NT62NbE>l>pQA zusg>HM8U_jxPmDpX%|YsaGEM`y_qE{`dV;8eyHKwcE&0>AB~SZ;j9(K>}6E4M|J}) z-RtJbi!(uej{;H;hZ(z}A@69f5`SrzB_uk*2v%NOWB6gKqv^-R7_Ev~0sp{Z{Ne6r`5Qy)RKtDwR(; z`rvlGm-il6(f1I2aDZ7^Ts*g2fiYM;A>{hRTpf@@U8ZMcF1;T*wPW%&F|1X$s!2|y zs~--dk;wSHk;Ko{@^3Qwhglb!Wa9h=^^=y&%WT;&U@T6m%eGYCy?5*B^>~8y^h&9e z_bFsZ#}C)SDJ2I44!%8a$oK|7t$-y~@l;CedlC(GLKc;aH16g;Y;l5Ov!2p}LaN_A zyF9nmZ!^B$jC^<7K2|x-#%T@xih^A_AkFSqw2A!3L!>zed{UFALq`Q-KQtg+FVjIA z%*?8tF2AOw$oo;X)1e`2|5!uLbLsLGIYYY6r;3k_I0sjLKVmiV zG_yHtfOL<98G!r(Cd%?1Nv4V@KQ8v*+?W`hRM(2O=Zy)~+uyQ9*=Aw9l$F~uBU?cv z?YxDWXlM)V{(s`gY5x;PZoVKZv6M4UOcJ4J$*EoQ62JNEwA@F=#Z^>@EgIAEI%uWn zOYyuD0yk>`G~Ie`Oi?T4AqNwk)=!(VO6gCXJq%nwEo%f>c;x?#Jov2sG6O*8f0(up zGB`b>^WVFy=O&=Td4ME+I%=eEP6ut{*O1tHN-Kj6Ct`yjZjIyxkPpUjR+sZ0Ib%X} z_#2h#&^zUK#JU&R?p~h^3Yw(TckQ!b38a3PT9!VMPJLagXV7!?rTk1v@oYFESEq_X z=V?j6O39Y|7q4H=7uJ7K%8<>;V$1x&PPcd?&G_+5PgRK*y7uG6=^Qc-9#YRAlUi}A z?mtv=-dIVCj4Q7Bsi4B3w~yI(*>~@@O~eEYXW0bn|NZSgxbii-Oz`X(?!nrNuRmL` ze%boPs(*gjoIlHqf|5Q(I0n&l#m01}f%G26=PP)uvC64ho+fTy*cu*-xY!R7D$v&% zf~nWEEis)A!IHKgT@u#1Kr0C4tQl+;gx=lwUmfRBhTw^5qyu5((&ez>2joZcD!G*~ zLn8S?JM8|$azWvwjXwHnQa|YlO?Y@#eFO&Q4elb|DQF@5WA(44bYaZ&*k-VA6Xb1GrWI{l)t-Oj_~C2Ba}@NkBCSX#jYK{-~*hzL`|2NN^>3nQq{P<{xb(o+!R`U8gIGFUYi`LX8X(jiq ze>P)MX7?jDK|I8Q+$5%*zSc;aIcCmO){ej`UvHAP% zOBj|n>N6A|IM6%yvHmqfzNsJ}23*X-3d?H;d+?;Te9l zg|!<<k>>NYkkCnbliE&8P&D@a7m_Z_F~32+xF3|_TH>xd3m$y(?PGmJ>4nS z^&R@ly)U)KYhIUoP{`kkk$a-)d0eAi8Wq#ZkZ38yyO+JJF|cXOPeFsx$D)S3W{+?* z-!bJ&=DJ_WIDcB97(8KsHh*`oo~U9A5P(Ionv(M`-1j^Hpvd_L*)0IlF#p5g z@R5XoGreL0n)F~PDK`UqT+#V9N7Vd|qcgU%i|9`k@J{t)OOLir+7Axs`I;AX(;JGt zN7(44y;wno&Xa)D6lU{|TgU85XnT@K*67U8(vzXcmMwvVTCs5^b3d|`Nu?4ldR;(O zvKN~{%kO3UXs23EExVs8E)J?P^SCCja513*V8St8l>MbCI2&!YPj!v>8=r}ma%&zMaKMV z|D6!wUjGge$M80XFo>t<40uB7KfkPvnSA;G2N4-6`m+#{oiN+V-}HBEyQZbElSloo zs_81H5IK)5dg<9clb3F^8a&0XR2NR`#hZSs@8PRNp2`woISvJ6AS;gFOC<}rT~FVx zKs=@c*6-MS&C|*I&%)@I=AC<~KZ(+1X<^NpBBB}lb?I!DAYDJ{?5cm?R&mMQen=AN zp$F-Tzhl7G9arKY20bc0t>;Y9`ZBHMd9Ze@VB&9HIJu}m!apdg(8&2`SvQOhc% zrr|vc{EzluK&~qtNs6DLt!qlOOJ^AUmCK|sMXU!E<1C|}>6ECxnp08vvhx)BQGwAV zbkad2+SWZMR&~ohjkh-etyp?9p!-v?^dmG46=N1Ohz-=Nl^$qO;mE61-`CK%m-m*T z84Wn2>UWFE8D-}l8lNv2FSDUvJjd2_{G!L7l97EXYSwG^fSrEPE-+o)TS_cf3>0FC zAlqHVh(ihj(r?puily8s7^`aV6j{mpvjZd>1}McitQO1tyR5P5Cve8fvw9!E2Tgo|HL0(2}Fo~B(S?`U{r4V8%|Z~Xpju)OWz)5aaG(Ic?KB}MH4`yD!2?FUL_1EH>U8VyFJw@7PvX5 zQ{idZ@>{`HWcZM4Ij)Lh+7ynb@b`;Y(2t_|zcVaT=hNXgMl*Ls6{vgSRnaoypJNnD z&&=9q@6ISff0fVQ^*A#ryH6>cxnK8Gpj9cK-J*(0JmYY#xxQPPF7^J!Y^l@S*{d5| z?YEx^(2lPhi&Pf!+$ajc@q*lLMhXO&o1G@2WK&JObq`|c%%A|#U%?MP*Z8`8>>zze z+!gMg9c6P*HYuAsQ^`5!;)UKPuKa?-cXp&7-o7QE!N31{N@C=0*q9L5*3&L;GZZQ0 z%WGd8+TSj^+y53X>x=I)p0m^1&7Aek;Pt-qiMaXx;V%(&y&L6Sgmp<%>do=Z%><;V zYElH%$J8Penu>*jVz!yP9%06yd1sO&Ja3|ZcWSMFHaoHMMW(uDBn1bL_bOs zdN}YT@!>`3irFNsKX^aiFoXY}C zUm!9R-UL^PV8pcmIxnA2sY(TXhRB#b5npZiF|6)~$-gPF-usg$;UtS5pxAH-#ZD!cctKJFl$;Kz>T1^kT+V4v%U;Qq0b(Vn1Huhtjv`J2j zZW-}by`H+5y_mBm+8$t*q1=rQH6a`4SaS_+=Se(VOWXTJBRTU`bnp1Mx-}h4*_R6` z&ZP1y$*0N=1eM+_AD>*OH&9Bl zFeW`sumHr&63;xVS3_;9ce1Mx{(y> z)peUspCcIw(i%{mK;3C&F~8s5B*MSbt|&^53q`LTE=9HQ4f|qJ8lD3(fiS|# zj_#Z6X@}a@S4E;xX3I9aeY@ja(9=3v?)~4o{bSx>GF#d0Uc5xlhCNh~=bm&wYjX!J zK^l94UpRL!wZUp@%kI(gA@>c|sIcg#jCWe+v=?xea8J3nrQTgPnwaPQIhS%@vr1zp z&2yV5Y$s~~7)FPr85g!IaEGWz6952lgL6;uf#)s+=Q7^&MsX`s$@fwHuBI1v5*-Eq zeBqqNTT=)sJzKZ5PHW(PkSc$=7zal7)(lgoTodNipkYJZ7`kHyM_9M1N57cB2+QfT zI(uJ&_i(^99m!F9UnK_&Mc0LuqceP@zWeGgzwp-GN{X9R;b^!9FC?g7G&HRu0y zx+yj*2!Pq5+U8x3My}x7JG{K7D=`_w`Gkh0+s{|X0X-JCxwg}I4>$H1W27R3-L9+@G^h_)sFH&W*wid4^=RR!+|1(W3v?{6lk#N}X7?z=de>4R%wQ zMXcL&#NS){9@ECL2arT6Un7-`yA4wtxGm8H3=V6zWFe$<^%-2(Wv@$xYVs6Y>Q$MB zD`>gLUD)YWoYKIpK>hY4=24@6esY5kNTA3{H>d^%N~J)ABPiXasziU zmMa(_uw$qy7@3!N6W7M!3me*fO9g-Sc+K~fg4fySb{?Sbnl&jS-kL~zf3MQ*F|=}H z{dM0=ohGDnzXd~>devr~dO87gKbM}WoBK)mut_l2RbKL9XZL5hqaZ0YUI-$bk7b9k zvAe17+LE-;iq>Y;Q83$f?yQj-lyfcz_up~clb+Qu*hjqHlvkV|&XH{x7Hr7j6Q*`D z+fMmaHnO|C&H-2Y`z|hEM!aCGjZYq7ICpmQ17lXLJY7$*i^pinyF4-dv`yrY2Z1m* z4t=v9azS0IC>os-rqZb~1#fuZXh#-5FNo$e)mY-YZ-Z!2BciU??^Q#c@r$U}p z=I}oC4?Un+8|PJB7iEP_q%-0Al^E2b&TTJ{9B~$-Y3EHHTuOfq}k!c zxcjb|6vs1!x#Q)y_ez68*YbmWj)J2CdtnP>h*l?s;NNY{`vz48VcTlE{lCYTtq*0^ zq5SLZF4UrqMz41GE7Wp?phnZstf@KAE0n*wXyDRR8J`x7$xuf`!`g(6wt=ozv*S<) z%76NNxqCu0)+}y4HqnK1{G|&(>hZG=jgFwzGb_>PU3n{W(@Suq6Qw4UKW|UVw%D@Z zpktL5(m(D3fVb(Ae%yX$L1q0D3myD^-44Gp`LpA+NT0ZjK?%zzX10LEvF+r>ESS&{ zfAb)Lqt7ed9tfC7<%rxHAe*EG1^@R-|dnNh5b&7=4~`) z?;t$;G8nP@`4nHj5=$%lw!iyus3J%{H2dt3eGg(PM(cZ^4hl^YRb zSIUbFz-HC4d1)S#ku)a&&KHV#iq>=(>}uqH|4S_ zmx0V|7O>06fQgMzK`y|{U5Z?}AX%ULn|82z>EY2&BZmIwcwWGVk0PVNs%r0Fq0Q!_ z&>)oLo96vAvp|h!{NDD0xA>EGT<9@dkIrj)hA4n%JhAVV^%Oa55+qo;6I1z2Au;bJ zL;TU3Jv#P}a?4&8QvDuVl!uj!NO?`pZ?rv=V$CsRMM39&5j@1=vU1^qoGYQQkBjpz zB9%;Q^UoYKOuj}S>zpk7&n(9|b8ew0+>VbIzKiF#%~%fmgC|R95jCmJeCE>GL{C=q zaR2wA(P#4^DwMSMtZ_>w-@**`y`5}lzhR*f^EFd1g$2yt0}fl`#HV0nMSmFXJ(v7) zAf&8&Is8-QfUZueS!_u3T%$`_z~ZI>yUJIXp&2L2BrcD#F^8Z}M;#^-C%E4Q%pJ+p z#-;4tFIDoi0v?BmV1X)7@(n;h<>YcyB)aPUaRx~NozC;Cpmt-fC{n*Bh34MBb<=&d z!j(T@V>=TOaqIho8BgqfB`?IR$B}8jfMp@mcXxfuNf2{b{lh)K>2u6DM{G&C5M03#4dD?hOdXWW+NrQtO^mtqsm{IO)GCRUGZ1} z%@IeUkBnn`N|R#K2sHGSwJ}?DnP+B|RMesU~1RNNV@>`S+|M0eG`c3%ZM~ys_bEfp#Q--BI5~GC>VO* zFN3h>a;tOH*;#bf!hdMES+Y7cPZEe8op%gKq_GZ&p(Jl#@x$%q2amDpY`0d9gc}X< z%J-o7&!sDjQzV@wA(*AN?y=$?4VgQ`KVKRjjB#X+!e$;qMw80r9lwUGWe8-8SxUAk zAh5iHb(5-%kf7osxKUf2KVDDB=(&`ETbJ1*Gqj`dz&_qR!S(oS^~-1`mkWB|>Ka-Fi7E}#*Wv33$D;ww8;e237AB$Pw)s zG+B$zg(!gJIoc&)%meYE=^XjRR@_q@ByCH2yL6xVdO8L!xFvWVLhW>An~Q4kE6cSe=Rf+IN9HxO^EYgA5Lvz-;Kf@rIH*A1n8S9M z%s9HFhLF1gbUV#jbUWQ0`)XDuToar6E8@I7DW6N1sY)=i?&xiWjb%xpKpa(UY@!V1 z+C&nM?2e_EWFd4H%#K}RiGM^3w?Y~GQs?-fY+CeEG_J?poR)54&&58SuhrN1?`O-jx3#%t8E$I>m0*e-?50ivP}U6jN|?vGNs08)Bi&zXFrA- z?*`{;YVjmn=UemK)^Hi!<%82lL(R3d$loP24YVI4sh?3(J;p`l*?S`TBa0KJ<R z(DjZ2vsl=2(&$b^Sb5~Zpc*jGe%AaQu0}X?NM_R=IGZILwtP}|K574S9!*ZmI9pa) z%~#W0T0SdulX<9PiXTjrYp#A5H`hT&PwG=$esV8>yo9t^%nS_mcU#dcc|Z4zF-m zj=sH^;Fbb(v%0ol$bM1bXPh403l>i8nsxn0YO5wtL-|m6wnJP>ze;~F`cRlHkI#y3 zPxh+%jGCUTSxhtwZ(uf*S7fQ`eK?f!`aSQmov-S3C^XpBN~}RMP6%o4)X`Wn7SkzW z#x8fyyO&rTHOG@w;^FxwZG`-=7vdYIANW&=_Vm))Hmv^hsw{OySB8WtU*@z!L?`Hq?+GIQ8J9X|!&%x@_UQ2Kx}W<|F|Vn(E3fw7 zz(GnmogpT{FyAc3zqkkBRWO#CI*M$|g9KSWBOR40ZOkOd?Q)d8=F*D(n?13nsIeOk z-deXn=%woF;M?EqZVZR_t$FsvbSdZNqIM+^1K6wS_-?UcH_bj`Sastr%t3n5d|u#l zhRivFtrO~K??G!w6&0PIC;QV)lbX0H0pH%{*Sej~?>Epn;B9a3aaZf4Z>y7)b4`fm z&1rttub(ddSEfQ43UJB}D*|OI3pPSsx6#kORaV!jI<6RkT9&*t{XYyqg!k(!R z(Yaij8k!-k^z$Rx{4#&BzQ%g1(lAnKm>l##Ib|)xQ5|QtvvN;#{p9y@>ddrqicRjq zAlx}IYv^-3_Mw`;6Q*8BF-6^3W8(6gET-w3P~o?KFwmiY!w}csFf=#QNNnO@M2-`9 zw&-pjwV&psY372L8P=2>?)^i%Da5-g`=8LnZXF-7Rk;^DZP{`E`}3wR*}7)_r}o0z zy7Y(1EGEEOBMN2ar-IsYTb$S=POGNan4jiB-4y~5;!1S*=WAjf;#@Ga-?&(>#jM+` zkHAQ8joGt=1U2yef;j5(?PjmoSE&_A*vYukrCD0Y@!C;|WWnQ3W-!c39(Z z%U|{lIa445W_~;gYLMC4PIkH?VZo>M%^rLO(M*o3u@1cM#?fGA@vqrsX0Z`VjW=NH z-e2YouF$lNuRaS$k4a++K}{@ zXdB=3-ujQ1|EZyw@y_U)+wWe|>{lX!FDu-AAbUVxQ4`~e998JFZ3+z0mbbqrO|v_H zY2|k9$@;AtPOni>R&49-tn=@`Qo=!nB@q{I>TEo6$jj8Y{=|>v<~i95c`&hdq1xmuw@BJYW>Rij(c2ihv)KKJ?h5Nyn1-ic|IVo|T9 zoL*hZK}C(~38y_zBla#c4yNm>+~-?5~M@CjXV`cUvN32VcLf#0o`<8eA{ z8t?jC;wP@v7jO)fc)+;Rp6!Y375MtuK3+QTtTHP`FdQrQE%VNtNuIYDry+09v!IAW z&yA`FbhfvSp}Wa}Ot=e7Vd|}#6v0cBsnPWmjv4a58OjaUZ9;Mw@|N3r`>bJ;+O7ra zi%`G30`FsY=-Wq0HqWwKRU(B=uPB8G&u{*ccBmhx03bWOZS@F6NI}MhoKaOVLP>$zZO+o-Gixr z1r-n_tWz&Z^53V~OuBI(YPNR*=qEHBOY(o{s*U*CP@HPXqHvn{FY-x^*D4)jQ7Qq2 zFT5b#8<~CX_mq8A%ct`Xj0W-w+Tjf7rIx;Jf}_pWfnKW!vXY|H!K-(hy&=}`8-6w0 zasfKEeR)y&eb9CJPtupJyV zzHm?W$B2S>5m^?PMeiI$zWu$s&S=zSZdg{_EH8ItB}eg}Mbdt9;qp)SPYq{tqHBZr z;!vZgs%?0lg%&sXJ%FWoNKDbr<+G~1MXA6-VcTjwx!U)Yekl6$(8W7&3M?x69Q5I3 zSElAE+~aPv-XNGzYmkx2&lga7WMIP^@M_^_l(M?tbXz~f`zVq^^sJb!%)ZCimUU{` z9#-o*zD#;PDhZ{UbNUC|oMp<}RLB;uK^3qo7q3mI1%K)z4c}Vl>Ljm8Z`FO%H>cbD z7P+|aH@gFHnSbsEy}Yg7u1+EGoS$&^UpaPWTE0T|BMXA6RIez+ER>Z8qzw3&KbsPw z{nG+9y|u?`cWj@$i1^>B9iQ8j)J__IiwUG+ggZ-V+Wa+W9-g;(#=T$9IoKe>oPplk zoRxN6FK?o2D1==}y`MMOPaeQ@~`#3H?U8{0iYdqfES}Ov z-gy8txcOR8J5&5ItMKmKf7t(%cZzt1`9WXx)Igg-0+1vmYDEYaS)<D5v}lGtqy8 zAiFTJzahodxgh()`7|dU_6|5{>bjN7gbYnwzxuK_U*i_RayPhXhc+eLJsv7U2{+Hv zqnCAvzcXM>8xdKGVS>IH3wZhnmMltba&iCdoPSXcUKK^Yjm$r5LvH38RuFAjq0KF~ zJm#7Fi@0kvb1anI47{^*QW?}2blRqs>)SutyQ93KokE+V(?2-KvfSJ#u8ziC3s&i@ zR?*E3{A2QC=m97A?Ku46tPKyHKl^Fpq;PpDm7WIgT30X9Ipv5>80{We;Q}#bwd1ld zO$AxP>fHi7tLl24pZFcoYYV*s}A;?t$z6{L&?~wdnuB7Bco7|r^tnhzpTAS zPM@1l;DnZWDK$7U@t8eU>;0wUe&G8{iYwsh&}WS(`%#0?h4q}siKZUQtR){%c8o8B zeymMPownQ3*;7te`L;0N>O|Lp!t5RwVlbo7hGH4!O2n@uY^AO1sz7aJLQrmA-GNF! zZpYT}dD%T-zik+{k~M5f?#7D;`MP43+xzKEZg!;n1w^cx(()@4zXHXavzY*q7*SaB z@lPL8jPB$9yr26mQ9#l62?ve7Zzy00ELvRS^NNzmb+|jUHNLrHa8$Fq>2Qii%BqDS z-xlm&sLRJmtAydFmz7nnXLkYCxq{ky%B|azu-uu;e}83Aj9>2ezP0M;FI*Y#Bk_K< z;ca>zzd)g9*ze4Fxemx5|7L=M&@yLIuGssb5B;wCqI^-7C$#PlDzZi#{x=R1XqTPa2t+eTPyluE4h3=G zKM(oW`gd$o!);QK2An?F37K6Qc)VvTMALzY-&0en{wFv@@Xb^Y{7J3{TBiE9OV_*K zTiWOhLVIL_?CkmZb6&y;&CEeY^Xcyq{5yu_R%EgngE%0^=(z)qnbe-dfJ_2|L+hcWN-XQA0m#=Sz3mm~Da1n)9-V4-il+bf2{$X=KOxEFD zvfCYYHyuG~S!s$skza2=*P~Kd@WaQ;HIMwM`soCe!p)S8w6B|WW+(lSHJp#`EfzEy z1I>XmPMz141qU@vE`-tdyT(6 zSF|`7L|9Cg8HNf{YoASU+j%0I@u7WnWfZ$de5k-Yx^`Rp0+LZB?T|fJiYPC48iHc; ziwc;aUv|Ook?-{Gf~3Hw>LJ)pC;5iU{(4^QvY&d<+m_1N)av&StT{qQzPqL>MDK!X zc%$`x(A7wuX*%b`SxRR6F0x#PbQ>nc+5bn=Kp$kFHSRaKZ`;Be9jf2;`?HYQduvta zNhY>atKrk9mT73l@-7<~Vg?St65G?|?uwzQymX%K;C-Kr0KVQhT@Zb)*vy02=2dvy zDY6s{S|azG{y(u#Z%Qaip)2!^6EMy=jzS{B5a%6Uu$x=)DhU*~r6VJ`zV6eVHpICm zUeG%5Hk_i|pmX$hC-yEbT?sZn2$_PgB30W5lMyz1?t6XveM!ekwkF0IL)8DxvN4|N zyz8?UG;wzhayjU)n(JAxH<^H!d&^F||At>Q?m#n(qAC#mOi>k_XD)ePpmXJRHh&TF3z^%tRrj)3 zPj;wJm}jLV{W=_mYE2&hqq=J-QopA927#i#&eSey-SAId23DIxartjP$fGq3U<%?s z(DZIq6GUKra!*Gf?6-jn?}_Fe$&getJNPw;XbqZ?TSa3J%Ax;(Jmis2 z7fXL33XxruCZ`9v7N#ogib?=EfFs|Pnw6Q1Xta2-7baRfCZeqPz2@zz_2O#pv;DnJ zA;*Tcns37OU%3tNZa(Lg=cD6K)?WOZ6IxJendjjk3?B}O(I4MT$z5<4$NsDadd(i^ zNEIy}#8o&8Wxr)dtu9vC$R5^_Yx4)`Zc@5J5}3bhtGBqI%zWL49zFt1%FkjE}(c(4@cI2A_5>6>MwMFYDQnRs-LsSO8%CQ~@q8o|;(3748x1e@dz4itLxK%@<1B8^% zx&&a#6(V^_l$XRPeLpy7wkr=y9v%7E%%?3ga25@J{J4KE%>IiKK_J?CF!@z$5X6lJ zDY2m|zhZaCyG^teDS`J%u>g9BLIZC>hu#mW+NO&fF@TgvxeWrPBkxuIi+JE?&_Kls zz~OMy4y{uK#a@;WUBzles(7b~`-xq9R|u_`;;q`BLt-tj1Qs=<^e~rTtxDI(=FD6i zXINp*=eXIuyn|&zdj+WPN&|}dX4p~L?S_H92C!U!rn+SiwvQ{J`j(|{PKx3tiyV}D zL3H384ZS{8oTtvA-%Z^;s)`<4|7N=@bhAFR`f5S8FR+&zbv) z^v{dgw9d0O*e0C);+_|(4i7jL&Ty(wPO(KpN)1e>?}VmF^JMd=>{+fCdZXItU0%{l zJlf%NgyT+IosO5+-o_~x)5hDaFuS_itlhVI18N9DUOWw)$m_9#zR{iQyJqNs*dipP zTp`OgAcY^iSfH_d>)^$%o>3)!Micl5}yUf=e~6UJ#v za#1Laq^~@nLP9v|szT(#C;R>sChs_I(kh~SG8*v{V|$GqK}cFR-U9*x*fuV*5g1oC zZ>j$2W%8A;gT5Ch3r4Hl&+~eNT;OS8gq@1QhK31yJN1c!Z%~w?@Qi9>EvAz>rvEdA+G2H3N=(dB4Du% z2_q%J{qV4gW@DzALcIOMuOO4d59N}A{e2Q%F@gT&Cr{BaO>2>R1Klf2?v6uV@jBM3Z<@uQl(}#S?w|{jCPQRu&RPtL7c@x@0Ro| z>v1L;PhNhA)tB~QuM(oaSm=r)nc8g^L{PL?5qW*L)`F=DyVW&_4Jv~W@5UzF=R>V! z)^-fP3*fi&7_E`yb1qTI=Xx%J6YGM1bp}Qm_793G@Fwehj`Qj-eB(q-?-^)zQ@YVO zQX1S~DD@{D-0K-ilh50IwHnLrAts9wWDy)Y|CXPWL+7j6sp6SfSW<#zN!#S4G`@uK zG;NG43yFuaj$1F$D%#?h%tKKVD_mMa?o=KyE zE>n#=;jfJDP{_F;5u+hg*dDi-q*jolP8uIj;x8ci;v4#2U0)-p_54Ls^ZH2K3fe(> z_$H>-VDqX4Jz>$@J5cI!?&0?$HGP)>g?8K+-dkEix8nq zkd{?)_r@=gG`!QhWEtb#H2x57!x~!y?m$qQX?zMT;-2LF6X%%Ld$L-g`4Jh8F|^ln zu3*N`ifv+E8EB;OG45Pt_Y^g&Wo2k2t?7FN$#tIJ1FBB!0P8oipxO&jNNrNz)#13B zlAvT;Ou#&?`(;(h$^!7o6&mglpy}3gBpUxKtUWqj*gDtt_4TGE&4KTa(z{Z& zb7Bl$YVg=4?w3huRi}L?_S0l949dDw7yKh(PBHxXRhZfu_0K9vC}wPEW{W*cBN99R zV0!b%M-8j>LOh5K&<^J{1YiY4=TEHheXQVClNLdG?juGmxbA1Xec<=fbHDnx*DQ8Y zNg>!+ZtiM#<{foC!UA_*b<9 z_Z(<6q&7VCW4*-|+u<`MR5e(Y6BvYw4+vMs3BeQ?kL`l$v9ax|f+9PSQ9_6=NI*q0RaQE$g5lL~&sY)K_1!}cfnoEdQvq=blLc<;Y9QRJ|&>RK>1t73B& zw?H5`o)N74neq0x>AABE8<1x*ACmD+6~T~onemd7Pu5Z!rFLaI-|ACKZc{|Jyc%q~`I`*09%lSU*ndjYO@sW5x1|apX^-n`ttP`s9 zE1wAErZ>oVoroN-$(lpV+O!2po~iIb8Pbub$^wLpJlXZ`AStZ5~5w+=q?8UNE6`hs=a zehL^*)~dK(KTzAGA}HoqnfTeh*Sh;N*c^irSx$8~V>}JHMJqTZ=poR)Th%jUZM|hO zT4Jdha^@R-OMTgM6Y~&^3AG2Jb!Nyp#5_}SqfnDbv7qysWC)tncR~F@-%pA4qK2$z z^ef*ap9CDU@DevTS={`p6hpfa)~`Bl%ztZD4*djBVi{*wr$C{8CvU^-pnn89NAiy} zNY`^o?GJ``8K_$^Z&Ku)(O-!j^mof~cutFat+B=?b1&)x@Hc`S zy0ZoV*i;=H_Kk4MS+v0k*5nV(AE+xV)+%uM{?~j38eJ{5ZRdN>&yh7BgLj1-JThj~ zO$6!fj%C|D#It88j$rqnd%#_;2@-yu`W7PZ^mWPePi(ni&)g!FbaG;Z`$50Aj$4ms z4Fm$YW!LYVq_sCZg?1#8P8EQoLHp-893jEDN9{CC#_MEmXzSnfPQkPYI3&yOZ$bIU{g4!4wEsA|mzOVidM^Bnl3S~t&?`4r*%NO9k9T~XG{ zi(BklT6kK#8Rw=~^J!X;Gk$l$zrq>TJ01)iHZWlB?OtD*srNMoR-A|A2cc?w1!Q*X z4yK>^HRf%2-5W_@-?&wORp-}3?9F$->zv0w{o&k+@W!a&jKcx~6|lX(!orZ|nDC!E zo8HaNh{JF~54dMx)O(%wx_nB7V8Ea2m+P@Qq*LUDtz*<6dN8a6pBPQ22mawMy11V< zZ8GA4qgD_cb;RriW1F|!^POd;;jjU~P5MFnJ7V4PXF>A##kfMkM`UT7&fm2rPVU;? zE7`o$@S$z%`=!#j+)HC`7S7DOE(!*UfD%wy1lYMD0+%y0MPZp(}igOLnw1aTnRj*R^r6>DEw3ur#x7qdJ8<= zz^2o)XC@T<_5Jxqy0icrdO7jJMMeUfg58aq$&m`Or!8-6a+S?n&sl6B3+b_!{$BC@W|ku`uNN>&Bp@5UoN|x$kEN zF7<8!2+ufhncs1JXiD-j$Bh`Ho*R+lpLvw_T%J0BXjxwYTP+3ZeTwMrMvZ3~muRV0 z3^O783*0T?PC32MjOc35>3#sH^iP=edujNcY#wBoSx~dhP%IUW4}jApt1B^c!uP4j zBb+OD50|rJ={~DeogY|@WT?)cBhFH{xk$S(xLl8b=n3@H=kR2W4Ur-33rn-hrM+Rd zW?io7vd=Q2(yi>2hmSZqSFY^~vF6$hGyIb?9;Ppeq9@Y;*@JFe#Sxf3rs3SeVGPnxxXQ|@3 z92;}ig_->@rW(+fH!!QU@=z>D- zd$8{*9b&?8M|t@>$AkOT7c*BEdMXmHv!=NX|@4Kjx?b}I@T{*Pq*w4r7NQ{wU#ks{8E|}2X$v<}pmi8F?M%WjTOL_> z{jpsKrgNUEje`UG21I&r_UsU`wN9k`HR~D;6YS);19X zswEK>9QqJW&wh`@kV~WOR^u7xwcnap&I_}y!!2vLUS*) zub?s5`(%rc+ZU%B#|hpxgtct!V-|Yz7z#Ly@PC43-xZu%2fiXRFQB&X63w0Z5~xTd zC9zX5#->ldwY`zSnDyzJ&H*nWhLb^#N?`xVx29URtO#ev?7cW7b4Tp1@6=G(@4vVE zblLbPoNT%wVu_fp9G>&cOhvjxq2g+{N^HssAwW1~;iKaf`pu`8!O6QeMX)P6y&NIjXS1Jb*KqL+A+SEV z=~Z9mqk}kGktc!BXER&^BXl>Zls10~1A@%o*httP>jLkAv4P_p0Yf9wCr=vr$q!9B ziKPqN`li}p$aQQoyBs11Eh^{IYs0*Jqa8(hiI#Ul1Thvyh?rK2>Q6FWWFM-s#@OUg z{sntir@pA`?C3LNGVzLAztNN0Xl|Oefs1;t9}xn5{%hhWH{;Ifl*h4DS#^48jw7P) z`o|QCDEC2cZ`=9TsvECYs^Wai->&Vl*PN)xE>B-4F_lI~cX6R(&*)`4zaBi_rk$i= zr|!7`F`12Cs+5G91d{NriU+-g^9aYyp;&Cn)>V@8p&Z{itC;TV3l7piz5j1ulv

`R?BQ(mXOPjp<|fH&U-O>mHof0Ocr=%=rn8*akZ@wn zC^@>bS2+|Ewd6xieapA89U5K8={42c>p|a^v4r{ff!iA9>qI!oP^@z8b6M=@Rm9{} z{^9-a-<#!S!^MvFEy|lhs*3OTY6gQ&1q3E)=2Sncy7I&Fe>d9}OaK7n%*)Q?p|j@< zj`Xs^`br7)!S!RQ%?GA`?sD9Q#X}EE=~^c~Mk{ZG;dAug0TxxT4Db!2&_3cpa=2BU zoO1}hM*=LsvU?l)`!kTxudfTk{Z^kSpdQf3a3^+ZslIbR^vR_lHCR4npOs{!UkW|QLuY~+k8-v%6eT9XhNA&TMUz1ScGr^LEE2vLHKm2^mGSR90QakFKIz0S?8qN^3UqaopVA2}>(`ADXh) z(bqTj&jHPY*)=~X-N20_4sg|rvfuy$P#4~76`-roJlEvu;r<)tx>v?p@1t~nWLE7d zUO5nBSVqm)I4Aa4ud1tNN>0{G0GCK5L^+vLvKR|?aPs<*FC?e78h5m$Pzy$cQ(OI%Vj7wku=Thl>pJDwERZ=9sO>k~emRc*#ey1kO**vSm z@;hcn`^F>&m-(F_Gg$8MK7&#UJV11&ZnmHTBH9kpo8HhlRU92+%fFAMz>;H|3DWRj zX}d4^cwd&=tbNggjrgs~I=AYpn@3l&wp`FreTWArbuElqrT2K1tv53+5T(3 z3ltOjhpg;wD7Oq>0QBT$3JC{Z^~^1uOl$Vcg$I}zt9BMCFG9qJ#ma&f2#bXMrIDto zqzz`Vhba&No>$GW$K7>jBWJn|=FKo2nUKM}^@qIgAj?`*g8-8;5F1FPK!k%F~qpdMFOtV!hLUKr)SNP z(d0RYV>x$|ql@z@rn7`O-CJ(v9fZ@O$=@2;Z4`|bez#I%>;+11t37o*yO`CfFU8Rk zt|L4EPHD=YS>_IWa<;NLBqC`GSnJ&Ke(N;AeW z755b=y_a(5l&zhzfeP)ds#W%@xJ{gAI9zvkENzmXG3CjCsb_M=c_~~>gxgGhJk#QD ze&>T|(`+VCKgmZ{Frtn(^I)3oDmSyB?j>fW{MSLzV&+dY;15|?bQ7~n82G|9AD zo^Ghlooo+h%>stOAd&36`+N?#mSGDc0i}=z9tD<1ms$poJ}-znf0nBCG-uE5x${9} zcY1WmHvMF<(XWS)FY1RA+PKR(`1rLcr?R)Oi5xa^$deSOWA?#${9th>pA>cB%uXm6YJF(QTCEPDY7!rVzSKKbKc=qYkSZ9 z4V^b_;v2?FKlPORT1i>Z<*d7dV*XnXNz#$}`h>KRNPnwwv?7Y2B#m9+6mWVaNNpwh z{#J6eI{KuKMn`9akLF}?x?^cYu@jr?KIAPcY5X@K*~e5Spj=(~&f-t!;PK_<8jsT) zW^F~cFLp&eJc=y|YUu*6zR#0k#qZyTYve^N(8jYHZ*DOGRT{j0IbBnq{T~|NOx!!O z(=A8cIRnG=yENZZn&-Y3vi_4;el7KV%vjP_?7K=nFMHQ(&<37_H@ue$hx6;tjyIPs z9~J8h+}*Vr#f`;o))Lv9VRO0NmjuNKS% zmo*+FH;T9KDt!I+KyWJH($0JHAB}mz0IO8cFQV|7zRERU?8!Ci739Q>qR>tPRi4{% zW*#(qMjIFH-{qUdoSuMIESkx)c;SvZ`+C~@1|8G0sX}L%>)7=h{@u!#yl63!*1g`| z)YL8ko6VHCx)VF01xyL^ZoY9Rl=kCLz;=>q@NjXSX3hmb`X&#Rq5a|`247(jJKsHO z^^`MZ_lf+XIQX(ZN;se9Qffg{2T!UtL0;u`#@ba@+%2#HRhD0`&sR;-zbb{zP8A0ndwCj>?s)!UrwEETWs||i+RYdGrAlU z5Ey9Zd*-Gn1-zIN=n^F+`LzjP_G^&=Ci{A!ifxkhVPw-s{?Raxn<#jGG4obe%~fyH zc8#Sk$3_H8??Ek=q?`L4kYiV3&v?G*T^?g~i2HK&i9EGfyk=A`v_=NSeJ6$#t`Fml zd1;UO#}1!0V_%6;8Oq{&iCHOg_7}M~ekvXdXLlwEO~r1k=}fpgQg2O9GrwrHVN8)$ zvlC}FRQl*=XLr+3Jc~uq+TB#kNlf?x&-iiX>;HHI@Gj|u>MJu#x7fV;*Xq5hd z-+N&~cv9Sw?Fs2x(O&|%{`9dpJYnzjC7+lr7o6|;*junfU)Xk^nz70SpE-AkEZMn4 zU!aVuRL0ppKfh8^?kp2DTBlwG)5tG}&wlgrA(p`Ny;y*On5l{i1pV-fJ~vg`z(?8n z45g+z?Qy3yAckY2@?rslm$b5A@|qNQ)hRUqyk@+)hZ)>U0eIVB2U9PYF5+YMl{^4v zNAhh+8>dA0!fpWZtQP8Mkub;pN4*dr|3cT--zK;HAnJe)hgLhPYjjy@CA1T3NEP89+bKZ$zah7xZv$i|4m6tV56DToTrmgyWc=SmoXmI=< z=S>H9$+&xF-&EBQz@Ci`rs^4IUNPaPVF(r{(bW&CG9=mJjn2x75Xpv3^^rLrQbp^C z?XD6RLw!*~-7WCyZ9~iHL`yI6n5iL?R-x-!ct2A-GgE&<)#{D^(a&fzM{EiYXEWs0 z#y%WWV;^KVw^wa$xq{q5wncGZHYDc0Ew1PXQZ@)~KU>(+ty>JS%!_$^b3DJiK2X$* zlTSoF89Q|T6^QIu1XN6fCi1y-0WbnNbW_H8`l*d{sIb9#I`B6y|Cy5-8qbP;K(`PM z@%)_4nN>7mZbW}W{Q4zC+aWRL3XZB}_3RI8#KeQ+$gXWu!fGjFTzk!isY8x`Vi(e& zAdsM3;^CBn6}IR!2XI%i&7nz9>^$fLO4%W$w>SiQ!ayye!4v||TiZ%&%XZXbZp*@S z>^D@l?Pp@p46R>Ue}hl2Z0b^)=(!Hi$fb(&BIIDmy#%+HT)2yEYvqk6SCkn^l>GQ! z#%uO2VBV3kusAW9(-lB2Dy&1Vwh3fImnNb{h8U6Z8l=B?$TL z%Nsw7858tm+w?LC9e4R^$>(6RD!t$3yBWpXAwYkJHo=7F6^#1(+uilM0;H)_$_d{* zt#_*4Mjljqw?pMm`O=<4C&K0I6%D5KC#S9<^fR6A>~$xBC6|epJ*m#wK?9gIJgucK zuX120?pkl;)=K~?Z_1kkcWuzXNZ`%CBYQckMg*-M0Ys+5gTYO?j0*!^IE#cHwV5K3 z@W&TH--Xt$4PHogi26)KmjdDEjGIZblawZYnYeZ}w?USR?A-p>UZy>T4YG6=A`ke- z^>67;+_UJVTWn&Hdz%qg!L9BjFo&HnZg7p|9F+XI??Zc9t!_3r-Am`0zzK3>F!NeQ z`@0uKr`^<@>VltU8g2NU1|$~iMZTx;j!N8{c-D}O;~6}S5h zSGIL>2}Oy^?fZFyg0ikedS=-_(97u;r_Z%d>ZlN|4CTkZdLvnW14*f{5-uHIFZYOBNg+DO z0>gqHa0D{0R5IjoyZYp-bM#VOukd}^`{9RtIW){Rps+EBYdmEHu0Hr~h5lwrYid|x z28!Qh*A-XRA)0Z2Q#)-j32PS5FT-_=sWVm_2)#b|pHi0-vGy+g{-HIRc2Iu3GA~VG zR;l39Yt8z9n=tZ8J@A#W=j)$GbAwW&C&RD!gvT-6nt+ozkmbIl5m?@C~&@&A0JOz1ZirzC+|@;P_Jb0gx2` zAKe*cTM6^N;coWBg~*G}cm|aU96?0u#XMjT;Cb5q=KL#YBKFGqH`%}aFLo2ZX1p}T z#O)|^-NsWUua=KSLUT=XlfG3XfCRo``bdm4zgWAFu|H0@h6_0U{2iXKneF4As?))( zTV?im+2`2k8&by8A;la}72T;n#RLNz69QS&W!t5nUB#yA2^;pS-5T zALqw>9Fzhi8vq8fm;hZ~2_kZbfd)R>2ee>NntK6jOD<~*E`1GBWYjvlCkbLKJ~Ee9 z^Ze+a5B_;Ev-%F*0r>7MC9Eb3%)yM%O=h1MSv*neM^EglIxrtQ$>mBdCu5=h%20g5 zFSJFkD11RG8$8(=OrxZX1dhUvUa4g32U>+~U8|)1Bnl!;_$iYuXkdI>pZD$-6&Cwg znv60K=jh>bZ$<&9TT05@iCfHMI~6C>$|I#&DVF+xlgLw_AQCVM9WVn#x}=@DKhJ$= zSC0khW;~p;oY4JP@z8V|7Ps|7TKs#{1*e)k^BsWvKx3$XoO4-aYuHJt{}CN|!^BI= zB}W1{pWbMAE&mz4`#$Kwu7mCW-%x)iE99EeV<(YdSO%Xw})k?5Xm+z*rf?)7w|JALTNo_3~<3YpIed0OU!cxx^F8Tp* zyx{UgMFnNXsm)0vneN-^VuD2EAI+YvWc&KM^kJum_7wW$$}N$|xRk7_V>gQ|La9l` zubehW22)VyjV|02Id=H#l`J8&ct*WX7Ae#~kttUy<}Jt1>$P@& z0nTcGazb%sQs6l$*JoWRW%6M^>{05~54RgAs3?*U$3MUX4*{QJ(?s66F?9+luY8<< zx{g6sv|#p>X9_EfMvA3uz@%@xm7vMLQk-LA09!k(K>r>2R^?N#z?tjt<;=JFz4wn) zj~e>{zNSaw;uE;(cz>9W_WeZu#6oEu51Hg0HB_~9${)j5q1Dprq+AWPcVBsq@FwC{ z4{C-MYZ;I{`8ug+SZffwCFxH8LJfRYPr|W_AlJV^S~~d*!n_iip9ChWKgWekg*O+s zyPh=CkrS@`TnJrt&-6;#LSWZT-f&7EI|L5;_@ktcak@&_1Y*7;hP$Eiqu$=!BrDjX zte8kdJ%B|*wMha3kqZsOuqZ_B#>a*8xQaywgyMle)?{O2hp4~VXI86E&O0-@Zt2~n z)K=t9W}_K4dQwGllkm47ias+58rKSxF1Bw&dV;gB+@+rsE(KSBF7EYq_3BBLq;V4t z1eV=#QRn-rYk@XU)US@_*4hWxZl0TvJyUJ6q#7hrQvQgh?CV0B;LV4f$!*2Ydjjv^ zx_n;9a4fz2VCOw2XNN?IC$OW;&I=2zTJq~Gmcs=!&d*x)tnAjj4!GsCNezH0Iz(6s z^J%~+4Xn1Ot@6#NG`)>hwiY1J-F9Vm@gVX!F%!xe&84Ra6H_3O`%(G%{)Gv_GcKJwBX;Giy|T`yNb*IjBp7E?}VBThH79AZJ2gznKLS`nYizZZ@--3@IB$1&1(- zPcU4a?mt{`v^_rvwm%q2NiK;eVSuU+v(2Sk-z#7xC-{1EmucZ_yYriz?tRQN6R!zD5o*iT zM9iiIjrS>D?T+6hfOt@uFti4ob0knsw@mO!W; z{z6<&HR3;C%U_xoIJa@!f!BMUSWLS`!wF%iwUE8Ig#t;#8o+kw3n>uRl%r`X(1r=m z2e4&YLqdXiv*jYgxwq6gI#D(9Zo=Ffjuni%$rS)G-cb{j|58%LVE?#akPtN>G8gwi z#O}E7ArtDcPGw#feD(eH#72_6Ya&D6(lPz+Q$SWkFR=A~py)&|KztL-q_tq-ktv3~ z3E`nVU8OgWLw({oJtr&>;Hwh1dBE`C)ttyHZh1$?Y>Nb8WXOl@>PHiNre_&1d-_w= z${QFB_)M#G0W}M zNtgCh&X+_nM*ruxwb!2Zv|Nh}!E@`MrI!JXDe~-br&D2Lp>uYrCFG#DOI~E6OIe#luUpJK}@YkM4AUcWZ9eT08uW@^7);|9>qI3{;DXx}{CUmk)ew)-Pf z>g8q2#y%)7zi$ob1(}GT3l)0;l?<(4jHvb<^bq|HsLo_o5r zPn?7EybV(eXFJN9BVdx z&p$7X`wr4T_v;U|kAIt0P^VZ))-+h+TW^=Z{9%3;nP$Hltb&5nRr@Wg4sNW!(1{w~ z`=Ng}7312p0apoP2IO+Tn7#k2N;F^@KXB$1ke~17qtY?r+BkXXoU1VSY*sA<6$tBG zLrSXIbt2Y2H3;azq-%7P={fXJpNI4DC+F1yzdkcErFdVX&(re1W_F_eLVTIH*#=yy zzIW^8Yt#cSHO8lQ2CsKF0j9^TnBmn4vygMX_nk(1v5@dy2MYV8tF=A7C|=36POk6bOLf0j{uH+yK_XK z63MR5{z+I|b32LxY&_D`P=@>%!G`>Rx)m*U=ezuH*(l|^)JMLT(IDXLqc*<^@%ia? z6hqSqAL^Ed4i+f*FjyLC4;7Zxf1B7ewNp!(i@0N>W2$7xG?-I+svP09Ie`fpE|=c4;!W>hb$y4_LI}oph9ME=q7H|c$b%P z0JH3HRm#hpBb#xX>46VCl(DN@|Ccg;B~@i9k+Hd@8jp;Y36%RqE4D9~t3CvG!g_B3 zy)9|Z9xnsDfX*we2%yF7RbLpdcc#m+>951>mQP77>5iqGo_exe7LDlb9~NguY9ylQ zo+HhW_c#u%Wx}+Xpy|3^bXm_kXB*?|8Pq_kFyr)~Hq0 z7By0>8r51=Go-4hU7OlfRLxj15~@~hN~vA7_pH5F?9`@45QJDkNUZp!ulMKs$M2tb z9(j(F=i{9FzV7Q>_kBP=8Me_!Zp6 z^R>^7QBvN5xbL}v0H-J^NOCFz&8D!i%s#S{KJQj9LO&DsGIc^EfxM-1K5Xz!>}c-7 zH(ZOJi^Rf&M#?^~9vEU%wlu#{_$1_wK|MbE-;%#opT*I!_fZ6AmCC_m%k?K+w=T<& zMyHL>$9&c7LMm^*C@{;;w;*kV*l!cn9GwZZ%{yB>m@Z);xO7%rV8mB<^Y`hZ z!`%UdN?aSIxIwxe@4@Ti@4cR_29sb!pdX2`h7lWs}_UHvEgA**~2{x-zov3BTjekPE0-TKVw~z~jmIrQBcWM6pJOzsH9qMB8~);$H@i z&(sPcFV7A$ASQ30GSWkPtan(P7XuCS#t!V_L3i?ptDVu76jflz5B~aP%5Lm2C_nGXeP(`pIRrmfw)-bs+Mb=re|k`BQxZR{Lnj3(hUVz_97F!X%RPP`1`b&g zYOKW9K5s}bQ(Ru830ik(O6?t8uj`d+8lrXj#&P(V30CG+idqd@`AtV6<2;SGBvPYu z`^0x6?m%o?yMI()4KjJzGNno}$s`!jf>tFju17?ie8ZnFQXoXXv5PaQ`Ihh=@<5J) z(;xQ>ah06V$kqjNxRA2&Nb)yrYOl&0-N;b%|B0baHSe$Tfad98n{IP%?3uORsw*p( z?MQlQOV8BzK9>~fAgRF~AlIpL9oH_RNhsez{k3H?@v@2we3<~BW8l#~yCFj%c&B&kL}zd0yd|T~@97-h>r)(ACpCg>Y<}eR znf#m{;u7=1oQag8M!ZPwOs~H|tbtUT#sZAJ8a5!q^}DAVb*V0NBDF84D)BK=bMyXl zxCCS0m-LjHZ5ulm5!x+H?dQ2|n$@2%d&AOUN+zwHYa_vaJ23w#z?lcb5kAK|l^Qjz zKzI33?4H)FA(PfAZk$xU(#}{jmmM;z;IGN{VZmuGqkw0k7EiqfETIl(xfrNesoS}@ z>CLCnMw-&U>y8eAMei2_(_j@R)mG{{+ky z8at<_%w873#20-Aw}&P=jNdfH_HlT9Y|dxq_#hkG9C|&O{toM5hm$e`kgMR658Q3O zW$%R>hyR1CKeC?WPz}+X&XR3o(A5;*Q>E;`cH|52l$0bm{}sUOr9K|X&qQ!QTZz@7 zQYUn%Y6^2Y5Uoxw8#a=VP1x>8;um+=9u+WmQ}&aL5^){%%PAa83(M41|7Q~ZolS8$ zD}Q&fDDA(K?PJ9NN4E5>X(UTfZYD&qrSFV~n5R5zc=&utFAm6Q-i$xULldega(Ar1 zd2$@v(r5Sw)*Kdqe6jz}0+60L-JsD{y%kKd0GMiuel*Df2zZrTv}XV{y66Smul@6n zr|-4u5F9J@Kz>K}$kv6+kuQsUj<`C9Q`cMUo$Gu9Ne6M_d%URy#*&zguV{8}50vSw z;u>j5tl=cvlk51j@*t|W;ZV;s@+zJOlA~+qdk|qF3903&#!Jj)&^XT@uchzwYd0LT z%LMpnww+kIUvM^=UjrP)E|44>r*G}N>;@0zry%B}HAH&t{@@PIAW*IC4NldL;=~a+>3Poc z^LjtqB08(-)&<9yW#*nf1>Vu%dKrsgFw z30_piZ*H+rW7UxA?`}b2$cSznQ8y@2;LoD3n^DO`c83mHI<=fZ;)d+ZE9qFl8Ep^8 z-2eny)2!I%J?llG^(42rbR5yfP|Q~g%Sbn?{HY&-9WE2!Gs;|I^1ILKhcgDb@k=Qp zKBcqW78lPX4t*|HH{5I?{)wtS%Xdm{+2?NCP*t~^`VmD+C4EkD6y%d^@g+wnh-C+- zMv@fL&|A~&pT6h_cN?a!CiyJ{D=geKdDIH^o9%FVMiM=ZE~Ri%d~lm8{G@30jI7hRl<7NLW?vGGrF|ISj<J9)Yf3+$S&g{tRJ6wf%#G?ndOj@4>1cL--Fc{&ChMF|P=S2KoTzK5o_7&zSsd8N?}Z(z>0a97CmfuKNcfBuDscMh$2WVg?Kq zlQCx0Knt0`7aA(0uZ_&QgMr+AwA_?{J|^fAyVLH39#Hf@eVDbFd~$}*EW+xwDfviNocyo*?KGpPNThceFU@PtjB&@c(p)5R2y%3wp};-;%22(zks1Q(6V4*c96R z$!4axnn;9BF1+c|r}3ge^A*)%y}>73Hs$xbRe94^<>9h>Y?BeF|sF_qbU916n8@7m`)w^D37jR7J0l8fE|R73o&4Q*i+i zZMIm=j$j_Z@0yQ-3|@L%nl&tz&CQ#V#5*Q-@Ezc`W{1orxgA=||K{$XQGU93k)z^1 zUwye-x}PoPOvIaQGJokC!t#L0G}bgo7J5GEopw(wn=zK2I!~3tdwR#s=AOQjNkeLk zX?*Z^l)e2i)geS2t#6R%{La+e(5N*7@OI!Lp&6t4x0THU#EN(PtB!=SbnVH#hzUY^ zq*P>nlB!rVxoJKB9Bk_bv-w1xN%pVm*^Fk_Ub4h{5dU|-wk96k{h8B&vF(F-ZMQFb zIfAJ(EseDmqII5oyQ?QfRCP0=jD%$!HWd!#OUxXNS&?8*)UbG8J~pFnLFoNzv&>YQ zxsj~Mr`_HLcWhm>#t#Aavu9N&4Y_ymo4^#5zJXgNfss@V;;fqM32fr>y+M^DK?_tg zig%9gV6`v(pWtGFJh-e)lANXvEFr6x-05}x=&95;JZ^*2GI1y6d_N+7T&mp)Yb5cU zBtI}Fd++41C<9(-Ei|TIXhta3mpArLm2Aasmq>wYKN)(_NBLy*moxqQB)JFgyzS>J za-h=0p*P1zByFQQ5Fy$(U#%(asYCa*QgIf@=sbb+k?FW7lAk>$+vGo-rvMDBJDr~% zD*!NQ^ose(_@7U43q;B*AbLG9L<^p$>clw);FodcCtkjaZs@qZR*YaNOv;S^n~W9< zp^1xiE?^?k6xnky`k)XNcX6Z;2y`E^s@iGd83H1jwrvG?Ot(4-1v6jw|5I*hac%Rn z4h3Kcw}9&EKC70r263klHfbV&vXqQJ@)tX2#g|nW3 zmH97a_OxuQucs9q^{2b6E#VDE*SMvgyAu4qn zWg_lm9xF%Jj!f^7$8yV%C&lD4s$QwibdgHC4_jXltNP)RQiJW@5nEpEn1fui4q4?$ z#XVFfPgsn-;}xH@_tKTUGn&(Go`oao(K^k$CT3D4oUV`9xQ`v0fA0|D+g8h~pR%me zY+0$e#}$8lKh)5F?Lg}$QMUQ-=-INq#6k!4*aOhX@|33TlHUxukEd#<7mC&&ml({w zd}Fyqj?(Oh!R=|Qjxf9=*${aKHmN>djHSoaTKGR3J_=9jx3>5UP&-0q#@&NKkDAG? zNc)EOZB4M)FYpQcO)4JBWP|G=ooc_(7dhw1UD!b|;b(5heZ28R^01N_vRS~}zg#uy zTX0%+o+`!wf*WSGzmCXKLrSfQ1hECT>h<%lF790pCe?IcCvC&UnLSVA4JunZ$dGN; zxfsaphTWh|e2ObH!df-ey1|yT?(D*!w%Z5t+~pH*NUnDC7g2M%ofPwoGA7+u+*;zr!U-&0ir`maJ;@R|KiW}O>f=vep2?+42BAb(>*eRMt63_MBKNzp^9PaB`% z*ExX-vY+Lzmed*bpJLf|}OA{K%Cz$5EGPU{B(n*$d!0ZMaF>@gu&JV-sFTL#)Q z_T5u;<%BAQv78pTn(j4neOSkBHU!@9D{{8ta`+X;vGw^M{dnrP@L$G}LQ&b61bjGi6*OK&O?U;13PKbBe! z46W*Smrbc}PwDjH^?exZzUa*xpDJ~8s*lMqo2@?Jg;%-Qi~k12QEx%Vkyhk(l$NYu z4`y#sQ1LGMUd20m-8?><@RMQ*eL?dNnm&x7xsK=V+Zn zq{gca{aL(QPB-p4Y4$%9KWc{sSZdAWdmpwM(+|zJhnAT7Ifl}Nty@NL@!pPwNc^Ux zLUGbZ{Are2+4TSiXaw)a;#a#kFS>o){%ms6Z|IuPd&gWrzoxb)QpX1ZtDX2ju@vqr zA-@?x=^c;%*qJGx$PA^|Jo321v7yUM?`HPlx}%{3_G|sb)~mW4a`)SzB3IJ&k|qXf zqaR+|Pt;JA>Q6mqxSPQjgOpNf8bCTPdt=a@G0X#F_+R(X2rdQbd!LCvA! z?_u8B=u@fbO~~RI>L1OrRj}&z<6MF1Ls1qzBHZO&eWb=q*{44Q&b~l!{jHh?CI?t! zirLqCq*WK!x!yY@VcOVVabKeybG8G=zvZnm?u4p)p7Rgpp2A4cmJYitekQtp%EY{a z{eu(IypBE0ZsV%><8|%A8o~X?Wl-s}+b5s+rOTKWaZQ2@S1fNW-F@PjUE-eT7yD)D z*XMrMO4=$>zb*?*qo6SR)IwFYI798d+vlN*GIcAUT;`+saFW?{Vt!f>dg2gdG*4UNMv*f*jV{R4OWP4e#NGcmv^`m)BKkdq^6t+L@ zDOG=#e~$^}?D3eLn;a^Ljart+ix9$+p12L?Yud!K`mOXJUhH|S;TZ+>)>8z}H%oRo z#z|*>2hb77ksV@_roaID3BbxOkEQ2&3S%wJ4&aphsIyDX18Jq}3}h?ukuCSze;eZ2 z$~DAq>$QPAYEm?W$T*DLSuuWQ^>+x3c)oh!GN=i0cVuQ(klNVmM%Wmx?%#}jNW<8p zq>9Cq9OA(pygdthV|cF{iVPuCljDV{2VRi}gzTe=X$H7Zc)juohG4_)D-gQCmItPkkDQW+JyVUJGID&OC#6yjSuRmrqx&4tDc?y=&&c*1sB01vK*8SXO#?g$ za9EB!<=?F%LXT(l`J)D<2_3op{PU}1Yy^MvF*vOB$2OM!O&9nvuYuH)vE z^!-f0>tta03Aw5`F9($W1S2NOBXH~Y%na)m)GT}w*O_D>_vEW+(_ zbYBPUODKCCP;7}Raz_H@5@EV7mQsma0$!?q-AA=6{h}~;K=Wfk%!v`xA}VKF)8$}E z@WXO&orS_I^NF(YpSo#f7NEvW=ddk!9|wIfg?fZxf{c|KdYi!rHw~L(|jyiMj zEthRcZakVQOui`p3qh5hpR;gH{*o*RdA$Vje_}ic&#VwFWil$frPEt*Ygq9ILiV<9 zXWI9#5(C-VLC@H}`n+ms1a&}v=oio*ahh4^mhTFZ^0d}Zn?sNn);fR_*C}+^CvKMM z>b7w)Fkbv?;of-k!k1pB1pqiFoAi!~&#Vl-xyM=dtcF(a{@m5Yeky9p*=te-mDFP& z86}~c2CFQ4boiR_FG?!v^%Ll}lf8J|H5WqeQmBU9U6J;{E#w09(=KM8nj=k%QnS^* zWqTQBl|}8+h`%;#-I{07=W<~A3&P#I&tt+~$4oqVaQ1>=I;C4CHAIW6K$tc@p~(MkX;lBAXonT>@or#$?<* zu23Edf7#TB_om`BW+9yx=@{3nE`R6nIzR3o`&^GAJMU0zeU0EFu7*}YJEZ#Q_d103 zk!f=&B#x0<6UcZv$(}npsG(DDIe+$hoQwWMq}!{ry6qsV7I&bk6d%gLZW-QD6Qa@ctGc=@7fYAPZnsHO@;8(eSi|}i27eM4` zPwa|`ytkNJ5o7A=R*6gJ_3!cj#8?zatht{x1b6dQosYVQHr)q#@0BS-dOTxc>HCpa z4u#N}r_NV-kVwTv>BdN9Knu;F98c5v zQl&wDEP`6Agp}mH47oY`@`d>bQCcWKSL@kTQ_xjPX8QMr_trQ;SB>j50xHz5cy8VK zapg{*Rd<D4$9AeIg3m2y>G;3QbHCK`QM?qR`=*xjQ4rkHU6}5e>P|`2c zFDbT2*fXehJ(AuugM2v=&?%9NmNIc#l<|e9T=Z^l@4%<04H9k3-!uvh9VP0pI+p=z zoz(AIBgH-iDMO!_mdmZZRXt~URe{N&qQ;nt906bB;Bts?fK?4!2N4)%^Sj45t69}+T zN%&J|tNpL@1tCnQ`9OtmsFsu0RkK1Gj%3aclG`lrtEMx8pF~T^_IyQq{Vn6 zrc)KrLU{5KkXo~CWw7rb03gjg5NSzXHS^D)nZ3(@^gn4C{vuClv@%3|!DW2-h+dqF z^CmgAf9Vk!J(L-`K6y2TKJTZZ$rW8oAU55z9es6z)%HrkiqDdL4t3}iiYrAz9EAIA zKdu6$h^1!H&%1Dn|XC9-Xeyd_o1t8edziM&lLitx7% zWqn9_h5wI+h;N(m`PXj6{Js<1&Sk}!+;RNSapM{tPI2n>qESuBD z;Ieg*isaJcbM~I)kX94o=RC7DpELgfvDXErd^|fmMzIceeivdyBfDrxICeRt1+z3L z6;5h2klP(<0Z2D6QX)?z4laeVsvr=TYMvGM53ZZt?PqlC^?}o@Me)KzUHuk zUL1GMnv<>stIra&P4`?ZsAc*0$PtgzbUd+6jYG+!ewp_J-~@kxu6~%7$no>hKVoZ8 zXf1sz6&zo-vQp+#zkGMsMSd~~m!J;{Wjz(!F+hfZNw-sChZS|9KZUZ6kdn5_N*W$r zFJ=S(=w=y{3l%6;fwQL=)<7J0*&shaySEl`zVn<>wZVk+1fJi?xcBt+~()Le-$Gmxy>WrdHppwyr-3D9K9IdC0o9NYdj&jQPBRk zQfFG9-DJ#9StSHfW3HP~Fi?%|?7yXi3h*GenOAmeL)VB*YPvUXkM+Y-99lLuO-8}1 z%|*;kMa?IcTLBeZ9qKR1nt9eE0%DNaS2bb=0Z?cy==}U^9KxE~%ulvg^L2S6l`ROM zWBt&le7Nat8}rQhYupWeB`@Nq&hnq$yY_yer%F8KJ*?Q8G)PDy-)4Z*$!7E-Em?L>Tiy4i zyUYsA>z@ItV0tyIm&Y1t#AOIIY1zfwBZFD-X}*?C*#+F{&Yp#q!g-wyg{M^s)3Y}e zm&yG{^4wZ1qBFOS>hl}S2KL~RDO-0X zt?Lq1qZrM6_Vz{?yqJ{!NnXNVJ$x*kIt+*XS>~$G$H`2kYjpi=>y&Z1GOyzm;}JUE z<5QtgujI9C_THRjm#+-on5a5#wXhjl?eW|>)w@LcN1k#cHdWQlpuS(cSLP5?u|FaO z6qKIBR`Y?v1kYCkc^j6$yTm{tBVr|ANMQ7ZL#U5cI)cA@6Yt+!togU`wPupoe5!s{jbEwg&UJX@?UacguF*HdM~|zr zXY_x)v=rrNnNpKU(NcV5oM-&wdS_A79X3PH;mprB0r!G)O_}by{CqphsSuo3@BdNV zPR_bcA(%GDl(eI}d*+@DUL23lz%Sx2-(>Ft$I^Xw-4Na*NHiqlaNcc?)y^)E&39^0 zxoCQ26~8Ij$QM^j8Xy}&^xbNZS3Y2rPU0hIGnLU!$Z<( zW{vzLxLs}RRVOcvYejU;Q^O2z)tm85hWYzlumjyQC6|BowoaGB#5)TbAF*6)i}s{; zd+SQ8qq3@LBr{xglx(-<$`m`|!LqNr2pQKi-iqV8g;#NN@frb~PSTPgCWM9W=_qE` z9=42s&29eiZ{kNweU9JQG{4RTb0SSFDZPG4L~|OboW=S^bKVT(>|_+W4zwJi)btek zfZi!$rh9SSY$?6Y7$=u_#zWbVjQ_m+lhg^h-|80jllQDBk>Zi=tx&VS~SUrREUGl84Q?7?tbjB%< z_+ExfbRaV_&PXb5vyNf$i7TNgW#kgQGS)~elkWU|B?c>U$ z20zXrc1X#|LofGcZSU9&ooE9X z7adcFEVDOi_#L+%mUojBtsHmrVSCS!JydoN3L_GHjNXv0GP-Q zoJU!n*^OKKzm1`r%C&CQ{ag4W<}Msk2hJqRr?xF<2b^(bu|3})<=$m>saW>?iEvhf8+ty>e5qI!}wuTasv+I4-(@;?wL75K>j zGC)h;23}C8O=suU{EZD>0Lyi2VNxtjtwsu~Sdw7uLvyUk76AK+BD-vwtd2YKzUCf_ z_%AJCl}%{`Rq;`KDP!hX%LpORRQMRBx}T(35Ll2IjEbKO}eq%SQbv z7d{=7J`5fHp3rsl+7cs2IQf%}lkDok%i#L3=E7VpSPf4OSN6S%!!LTPXfH@}ch$8$ z2eNOdg~1R=bZVQWSh7pCVc>U94#&fj+Y}viE;`mO&C<3fQj7f~kDk>R)Zc(G<7I)eOZKPXoEP+F&pBfAE3<{pEtp^^bKxBG z9(=j7%q4z@KSaxR%sy@HB=X>{JYu@-y@Xn8JRv+QsSDooV9nxuyft%4Y!)_zfK(F_UBC+{@uH31MT@U=bYxZxLwZdBN@7h z-kKEu_u%qFp~I2Ty|P}E4Xo#_+a}js(*E8dy1eZ-BS|K@aeWos;lB9*k5fw)a{Zo& z{b?=?Ehe3Kq>%9;iu8l_#SgPVus?XFRVGXz{;<>;Ej|@2k_h zPiWi*s!2Y0I>YUJ6C!#zFc7Rnn8xQB5soQUt@Z^#_`**&b~L+2E?PcCR0FS_j8`Q2 zRj6!nFyaNwt0i_F!GdA=-;+MP-8%sLrl1!SRWA*Ev_tC@%x?cJ>uPeaTbNrhyIpsE zzNtj4gSB(KLgMbuc19BWo=B;P0U1`N5c-KA#?Hv^!T2&^kdQHQ?YXh$c zdm^#TSaB)y89mbXL-z2zAtX)75SZT4tZZ?|_0L5_h(g(3v{u<(*ZTxis;?_M(uuY? z7r4aAe7ED8_6dh@gUzN zntG=EUjoq{kR-#KQ&jjj{J?(4=kP{b275FilZBF@sjXTB zwTZZz*a7k>KDC8lUxikrE5>Qvy)$<1Agmg8`HSqWe+jF3`DFM-<;bCS(dbC_dsCPb z6{05aim|p*wK5US0ggv{UtVg@<(1%lA9bdn2PEVI`0RZN~;ixSn~j=07AUJzwPn)5q~p zNbog3F0BhI_uq^5d@C7TR}(fDFwaCq@8$qBeE-xtpe|B<;4++`xJ)UqkkzJT=ulL6 zDaz^d-8UF?GJ@HpKUKOMEteI~2H_l+?-Gss`G@L94a1gR>h?W5WajNqXA7$hIvs{} z5>};|InX+d6K^lpTSuBhoJ|n+2X5wT$c?9HtmCf~VH@`NZnPS5)eR}(**ZAV^@L1f zS`-h?N6y1j`^OZf?x6h&QXb7Cefiw)c*nXh!&+|b^HI-i5zR9BGtWZ5t7Y<+x4hkl zm2Dg9oCiLMMtlz};fppjg_cdQP1~!3hu1&CpJ4_%ObR8VW#6X$p@TcnuDRu|OMFw& zXw7qx?0h9Of*wwPapReUv|FGPFWzp)IAPfO zi5snCOof+Jwr_m9)auW(regyl1-u33-&BQW$D4@(-5tEeDl}#eyu0+^jdVc1ofFAT?x`2iLYl{g!rS>^z($ zUw0*l7VYxFK+@{_++dDLjd8Dyr}EJ}CTF88zOltx*bixfeL}4~0X!45GGH1bA?a@6 z4@kVh%nEZAV(Ori5yt?GgTiAEb4xpAFdcDoT#^~L#Nn~Q+V~Fnx^y=AT>)?m?*Aa< z08NIFO%RVXvvw$F8Gn#cK9PCFJ1T>oPpK#N)I_JnIVY1b^#eaNCDye*+*&GnKNI0-*)iOzLLbfQE9A_g#Jcr=~Wmz4hqcY7W~JQ zO0v7v3*P=eqBKuca`i@ZfMjQ-9MYuG4y0ahMC=OlPpO!v8{k-ye&-z4<{Vj?* zO8Kue;vfBYd7h1vAY}!EQ)7}ODm-`Ynx&MtLp-IHW zw7p8bj5gVRUssT+cv4!^Wm&>HcLSB8Fe5|(I(98xeHRq!m-*`YMKIkQidW8GI5eZb z)Bep?9y5t{H+ zT*pl5l>vU(rQx`O`0lMtEad#XJB`zPK54ixTb zWOG-WJ`1@W)C})LQ-{Yqd(iZmP+#lmuGjciCNDeei;1RErhKgKCgy>6+{Hxy#_^(2Kp^C;w#=M$GB3Q+T*4BW4}jMHk;@DJ{|8*Ht6ik z!bi$Vd+5XbRI^?M!%qTK*5*x|lLz+MDGKL1eEGl2KU=O2TB5mnwG301Scc)aZi^~(K^A4R6w^@XN&inx^QH0Qp_aoA$k z@>*AQ@bjn=kv(9C>v)UCniQwCu7@^2e-Tae<{K_R3j#fCPj<$4n^S&!oeDb5mIfY2BT3WpP-IZK&_105P^GTyXW_5BvQT#g7LGf_<%g?w!$ zO_JK0ZoPNG9RgS`4TX2`SldBs3g(AEPQPd#5uJ9%1E!Myg?vS8{&i&@sl4ewL>$PD z;J2oSEps8gfV=Wixf@R=&lF`lI@M-xYF6-uZiRJjFf7~3W;l2bYFw#~5hp_oLCBp21+*c(*(*B#$=xWqKGeH#f5BM023vAiv3 z60iUIU1*L~ZvPFgtB&D_GHHjCow_>9W$oHhs23i+R*L ztz77Ud3R$`%$HUDkVqbZ*HE~Zd7}n0vx4!Y(`vF!H= z^mv4jzl77x80Q!vFy{(%U%b^leQPgLUe!RhAMfzgdHIof9`}Kp&U3?HwoG}U7t8W} zOSg_06VoW~*}>>$P5oYfhW;K+BM_4>`1iYG_azxA1k1~Y)1R*Xk?r{VPrysebDX@B zjmhV75VPR}jHE^wIem$-*^T*Pgk(PYg=o$&kso>VG-G6gW)KAyrk>qsMokEJQNs(V zAJg4Nf-x#HWeF68TU>HKXvyAv3e$q&)gx}&+{&!gn3HIa{jTW?R!f$i8% z$MISjw{tjld&`?m#yH(`?don-c^OqWom~8-&yVTK0{M2)@pp@!b4H_5SGpij)(@pE zTNb&f==f;or5u+f?J(8g*17xU`;}cE<^r6Vh)%!57I%b-Le#Lde`C$pgQ3e@mT+Zw z-MALV80ocNLAs{V=rgtM(A5#XR_^0aB;1kKG>_jOg!py3T&-7OZ4a+AkXGp z0#jz1rT8}fMsKeikYtVV5j^Ordno0pf%u(CnRNRj`9b@1wos zWeW-$TEZzO$_>J5vrFLDi^y&N9G}}1P95T3cXxzs>m_vPETjn+@=Q3J-De7f(Jnfh zVTSApo=45xAVEFNa_K?IlpVDl(etfOD#+EtF^O6?Q;roax`OHEZdhT}7M10&D$pl! z;C(&-3bC&9B;0%TJ&vNmdHFnF8b&>@)QYf@y(9p|zNY&ansd%g@1?9mF&_o_if`TVS%-`Iiigxm6t4A7HHP> zyf)U@Cfi)Ip;V~%3E0(>uJ0pKX6*j0RgUcC(G*joPD^2_z|I1mFM_NrCH3$9D3>(_ zFVP9J6XBU>AoC~Fw-P#boGcU0K-4Bxwnoy-ccVPh`8aj`BM;t36~%lTMcC*xE2k;_ zo+a<%#d}BER7ZW$>hg1s@yyAT%nnVpRx*u#A>;k?ELwFd#2{J~k=mxid_&;HtQOO& z=!!TfCB7>AU9Nvk68j6izcx$Xgo@g84_Kmv!p{qm<}{i}I<>Wou}?c?Rp5{}Te2f= zq_I1JFFLv6>d%9U6~RW5vtZyPcYB{LsdrlL#Rq?rgXV-!q}+vi-Av<7juQ#wzOny$ zI&xpn*>BnraDktmgiCIVDI9@e=}*esDNR|X;SEhVcKtDF`HdfQ@51Sk!j2CBwj~WY zsOYGw^orl@iaiZ)-!q)jiD`?FN2J-=1LBzths-G!R_(f#3;6lz_JPaU{#1t7Jq< zN45rNruC5;kcA|>p^+aHe5AX48R>;rYk9&}5=e8P#a;;_=I@!r96x;%^*B^zm-T{> zS$OH1uh~cADMg9gm_Y8~qV6Tr5NvIKVTdV%^*^_%_xu?3Y|Y3#QxpzKV_8ct;(Ww4 z+UBK>L+?{1_AI7`aW^)yMgjVL-4HXzyWrgHGM=D?O+M3Z!#0NzX^79S?18!T48-3q z5iwl`iWAw&lb}_`xd*+c6Zu8T#r=jzgZIjxB0e3w_2!GwbZ{!k1nH^^$yOF-`m$_| zuZzwKPfh+!^_^myMvO|9wUX)+ceR7sE)}#?{!wihDcE1AT9s6kLqsdo@99SVd-!A=O?R)aQfc<_3wSk>F8> zEG-uc$OJzi6QfivZP_!PTq#S%_EOAerO|(A9Xx%ZnuQ7%JiEF8a%zl$k&4ZnO{-8m z#^+QwbVd8VEjvS`?ow0y!Lw21ob@3`FLpiN;(Y^Zjz3PA<4yAw2jvSDCt8KDh3Av;_zk+uV2`9Dh(PCAe^D|7xRMR;({OdJaot`&4Xb5AK_9e#+Ix~ko z!b?ljfDIGNB{ySc!g$d703%~l6Im9feP7I>Euy3}EnFR%|F_53etEBvRO*K2YDyhp zMb|wd#Yp~v6YXpF$6f9}`^3GuFjPn43vAk<;yO^H-?P{qZ*`7VesO)K`Ve#n@2cLC_`{HvVeuOpAm@PzkcRdQITSwD0o{>KSjKdL-4#b`n!;n@*I#SYSu3hEaX_ z^Q~&vA9X|AoEuHbEK?*E>oceyz0v$Z=2k-WXuc$#k3#XuGjE1GK`QwK14k{P+I;|q zDr-(%Dz*re432#2?u%{iwLe#>6C75X^t1cdjdIb2UBXz-X6@FqM)kR$fU>%#7+qB% z_!k%`A@QB&>vQ&nytOjH$HSfrWdKqkEbF&TDs>e7_RYsH>yQ^a=Es|beCz1Ivsv5j znbnUg;%LfNy{$mjBPWET*2~l3!9qWG4$=UWY}=b20>>URF?h1R5fQ~(jYlZ?`U$i~ zFy#Mov`($A+Z+JBks9$+clivhkTE;W@28t#vUIruyi51GA{I5{dJdSHyWV9%eb_ih z`-G>=W}qhyaj|<%8;bG3#_2L)a)000`Gfl??c~@8GN>gx4l?-@1eRl@mkgW{C7Q*8 z9zs$TeQOVVvV^|A4N?4}nve3tJj%zMe1Lluxd|%}e_vn3*o) z;X^9*otyjIzIdmB#|BZ8^!LzSfm3;TYWe~1>VDy6!t+efsV`W6=z+_OU^NTRm#h(@#2X5b^T1g$Nq0i zlfJ2|1Z;HHxH#xv_D=f|R)Gi~U097KO1*50#y7 z#OTI;*BRPi^GM}}yGA!@bjiy&O}9w!awr?fCwsg&(6p=>ZoJH?{mx$-ia#4;8)Bp9 zeGqy=_~xC=E>RY&L?t6)&dnSyR37{h<#p(x`uWXnS2PLU0>UJTdOt{kKCQDi?u zh_a5EI@A?FW84d$)2djjp1q@btv0jmrcILppqw$H8^o#dqeg~vAu z@*wEE9y-VYI_~v@fs*DcocIUJVVyZQjO)1t;qik3QCQ9~zS7R7$e1+lnEv0lt-=Hy z7(yPXTK2|tN_&k-=0gO4Ir5_xkF@=PS{x{=!2&OB^WVB0j-Pu~vme3dPjN>ky=F3g zkAW_l!nFex(i`o!3uN)(5wb5gRN4gZy``IG?DSzsz?O~a%W1PSz$@SEFH7IE6qLiV zM|=-{WuTIDzX+reJ^eFdx9>MXWmDdxIViLUP<%T# zc4aft?>)p+Mt_#4HP6_;(oY@ITod=l-tvwQtzsOb6sjIV{MZATeiM_Ql_{Z|WmKm^^&l9uG?~lv1jLNbZ42Uri(@ffq;LqUV&BVFJ~b#pppf7V zte}qck?kt8xa%!xwsZRO$#Z;PJXy0gb21^jUO;Hd1+kCWjg@Cxp>Fz`X~pDq1F-!| z1A`<1%Q1<)7=yB;e>9WV+W*l^#s6rg-`wmFrKAIkZM)VxnzpAr=JB;FHnOslF)I1h z1aIg9{<+V!EPhm(G9=0G;Fa!hCfn8>K&#cl1N*TBK#BXj@OY(DQMUkQ>Iw3`9I`_# zT&XpjeyV?wZ0p@+L8o!u@EfI6yE>-jSAH|aL2-gZT-!f34JmATcfP!VU!9_Q9yc45 z9PMF|H}F7mRrSYyFq@ED^>lMQ(U6@O6DO;0up5oq`KgZsIlgTAq^98V;JpLQFAy2k z+)7*!)5UrqxDqklMf&@X=6p$_IS=K2AMZXzZ@A^S*OlerG-UyiR&7&joE&SP+oSSM zK1(}nY^-IkJ~PL%|9?!KcQjmW)b{g4qC^WKgkge2i7-R@_ zEwg0AWDjjX?h0nnaZ8_VQ>aEZm!tF9RAyT>ltsO9FI}ums{RalFNI!Twpb; z@70ITd*ax#zL;LLZ&c%%Pli)nvafbr+NTKha51$85<+RrJ~bkLg%>1agh~8=!ej%x zgY{B8{Odpj2G*hHsIF^2UrcsgYVsu;O}y@S+LM={UvN=^Thf}xc(YqOYYE*9Uy6lB%1=#pO2JF|au4dFVbPr__G9Pm$E-Q*RP2X?6r?CUahMPj^Y^GooJ%qKiu1(&dtAkj&4~GpR%z5zlhxjn zB0MIV`iXH&)f5BhmKnJ;OkxQeuCwg++VJ{Api> zZ*MsQD2`x7^R`6WgM~7y)HZJVG3i(ZP^hV(OgdIp19bAIH&W05AY6q}2Fy4UmP9LF zErJiyGo471QCERYQkoJn7ftfEn`yrG+pv5%0_=wph8WP^{ zA7Xh=lWzMs-(#Lffwe7zobT_roZRX=pNt6w>XujiFzO9B_O@35gLn<1jc~QHP~RB{ zelDwc5FW;8qdoX*ltP<-(HzSb;dGB<);<64x`X#^ZR_+nMRHK}c`Z#FZs*Lf4z>|X zHIG7lo{a*C-|N95rO8Ov#iB5o`*i_fc$0cUkZUZ~Za~GtQBVacD=VzaQQM=X;_NTt@t+ohW3twvXHf{ z7q*Kah|_6bS>M!dC!nW$b^blCq?o{N9+6`+7k&FB>VH-{`MBNtYAxyNEBcB7=A`W? zgk-6?@o2?AS(I)N=8zCrb6phzHNFHJ5?NudO8EqQ4WmI@FfiiudLfHTh(uA`_7xQwVi&ph|r;?+Mj(#dKhYN6zwB*3{H80}>0(M(FaDKV%` zYakL{hN8-cPT}}P-bq&eOuxV`XDP~1M4rw_!#Q1?4fh!=3ZoCG&qO=}(%f!Vye{@X zj3lFm1jn!^sn(>Mu}OW!>q zCVQ>F@Aq~KidHCc0QQTv``{TAa?trMR!j7fc&nut!d*Ptr(Y!9I0`@TkhppyI#OQ7 z^g*&|IMI6a>@D?+P8rdQM}}5me%WG)9L*a7S;B-`>f4y5GI1t)_M*sD&79t{jMnAU(?{_!LZ0$ZB0X``XNaIgZEb^g7=J+ zl(`ac#8R2q%>1&VwsFk;OT?>Ri)Zh_bW^TPcDA}SE^og?@ME?Cf7w>tlq(F2I=tv6 zJKRQ8&}M^oNx;L^xaNwIX&+eS0z2VNJ59FhLHLd(mAc(Bd5PnJoVhm>$!`3jdOw$j*6*ESWg z(8;vJ&-^IQ>v{6GW_i9Mi6{3QEvz7!@M*O0O!PkUbz*#@^31AOFek1v+9!Rn4Sphh zx0$LR&zmdz|w!x4%eSzRe~ug&k5h zFcf7Paer>>>S<_mysg8CZIj1H)*;5AaHpu-5Tg9!4WV3eA(P6YtddZ+x)vk$B}+^4 zs|HENle~s_zRt@^f0MMQ(%6#RihrA}s98tks|usM0?(?DC2kS{p{A>K_^$occ(*f(T1qLM|mq=W)S|tpX7;YxetDHOtdZOkiSX_ zCO-6d@z)C=U_ZW$*7u6g7Y`^>uKivQjGzlKA>DX4UCS8JKH+y^OLeHmWw}$UKM_mP0HAu`Th6nPdhLz+6i217bizG(t4>_ zU;nof{A0d03t0s4j|tSDLTdXHINoc^Wa~w0#uIMmpi<1mf6ixs_8>>Vu1_U0%J@P} zJeN+EBePu_vm13x6iUNIY=QqYB8@$uN_%Nji5GLLahP)W%aI~lZGFpBy%aqyk-E}n zJ=%MR!#9z?i`d!IU-hHg``2JM>%0B4<3-?8$I}X>sx8Hmw+tno#o(4kZo^8y#B<@E?8Q$|+H( zli-@DeeJEW2g_L8pyUA4+}7Iv&oc6b>ez;RyHqZzq#Uu-^Vt&d4mb;|D&?iOv3!#E z+FfM|i)F9Uzwi6fsBzIKo%;6Etj({bNzo@QVg)3kp>06ciKzwiY#5|Q=tCx;=CSJ zcBl9J%~GQx>_P4F#~(bOi-D^z%Ql zia7mD7I^o{Agny|f=GRuN`Kb6N$qn8kvjfszyoz(wh8i?P*pm}A1t*Z?MC3Ne?$qu(7y$IoKzKI|P2TN`H@KKt^*<2*-~iwOxu zS(89=NO$Ope>$n(DlDAUtW5>|d5xKhb4n{!F*30Gi?i!(z$@BH?i-ZU5MDDe9pZPl;fbkNMuflfN8C6IOIy(OEHGV8?v{SkZyUywC82NqH~r5-EOZF3Zsq`U%t@=Lx~+0H27m%95;H~IDI zw_p+%yI+sq46Wqb4FAAX{nhLODFQuTFO9$s|Dz|;yy+N7ex0vz`xla1e8-;HkX>F^ z9T(XAkDo9r;Oz75rzNfM)&=wOlG_?2Xoux{?a#BKT!^ve!bO5b`hd)fCWTfx83yEe zE2@b~;-YbcUkV_c+>L!|%QquryBLCEf`yba@Xrx#e3InLXkGxRa^CyV?<^06c65$x zQ&+|v+bw)ld`O%KZOA7hzP-z1kEh;Hq@>7fWiS0Qtr7r*Yxa2mZs+VNOrR)0*_`8M zrr{=X#YB6zt>b#TyNQD)J4c!_Fr6Lf>RYw=n=k?;$Hj)R1Bcj!;|^3zjbImxE95hAetvqffv;a=_7)&8?|9sn*onJHf)KpOWVd`=n{&RG5P! z{3b97qiiP;2JLY$Ho^V)F2+HXJ0ZECvFm&uK{XHItc zt0rf8NB*r-CRQ33D<>U{K=JC;!Szt8{f7^`u$8c@XX^Vcc8;D~R=avl)rTN}i=!`{ zW`AR-odLs1UV_nFWt~rSTeK0?4COw3k1-!=S-bbMK59$5^Cr zX*n9TwwwROQnjB#h$~)siw-yT*t4*O; zDLo$MPTgs2J3BFHT%OLVSJO@u#}ume^!$A1AT)6w$4H2d)E?$8iH$R!+&(d?aA9h+ zY*kvHQ$rJzsxb?Y=)t%=d=OJkq?B5=5`K>4*cdwyv?P4(BjpxW<65 zI+de#of7!lS^@9zHR2ma3>oQT#E`_lVyOC$fxyaP=l@_59)jD=gUtWZ)QR?D|I0~4 zk0DwTDM<5~^0>?7pD{i9TFL z*JR!Z+cZ#O^TwX(*fb2w;AQTJCURWtmND+wG!wZibSALJ(C%j6C|s)a?}Chg5}MtM zsjh9CdlI@AOg)5MK}WUG{okF&>?Li4ovt##($IxkwJ$`Ug>7_$&lBvh(5qf>YKnm> z$}2xHj3c3$^vcy)T={RK2m*d9AN*GJ;~o_2=P!VpW{#iPuuT^U0>RgWFTK`RI zlAtFXUj=t@&xS}~fW4ysNE)u33oK_k zU2N*U?*x|!Wpuz%HY|tQ`C~$BM_Qq~5q;?g)B(KvN+{>WluOV@T5{7LS{Sw`ZC zO<7{ZqJ1N2Eoo&$?P1vhCWYYX`2CjJ~VnDj-)C9|2a65Jp})phl)jy4cQKt zIeOY<>Lcsep8OaA@AfqAhvqtZEtiZ+exQ!PZ6JJw5kMZd??bH|`2bYX3CEfiD{mDt63T9yEKSztjm&NawA(_``8h8CeB9dj!(ChX;S3p4g6tx99fLj;l=>EPMmLKZ^<$;@2o3v-Md6qP0cLLE zIL|895B_3!!=1r6#zlWTbmV5uc(|BHBido}A^Y(T!i%kMCWtY@BjMg2e5l7}ZvlOBScYv=0C267Uz5iUUsa1v;ElOm)CemVBU=VGj z`MnnbMeJ4~l*E4T4YCTEen2*kT}PxV&Qyqj6CIZ2!I<8|$ZPAARFU!#m?+b}Sistk zHNN=M6xs(Pf`(8S)1*hmFC)s=ea-a?q zh#fz9_?ylPG>`jRu&LhF!sdKO6QwyZ7Wvc3@&%jl75SHnP3O%x2jKY;k^3ur+4!*t z3F3Rs*n>b?)45aD0Vd~TqlPt^Yjxk{>o0dnhGf9s1vR2VV0pNC=3zd-`F_Puxm3gW zt;nYrwSi7W6|O?u$w)O+5;)*Iw>`o8)n|gN>E8oZ;9KLQki?x0^36N7I?dq3dA7)e z{qaXOZo1sf9!VzZD~1;3Z_w1M6CELY`WgW`uWmIsCI-O#nuz@8ZW~h}8XOi({TY+t zK`-R8QsGS>QYI<>bGz*3JJt{}>io0_R6hSeT97;Zp9q>^RG=K|WGZPZH9_YNXBrF$ zELnD=UzG;%^`ET6Rw7YwCj8g>B+Do3+I0>OFe3@I%RayneW%&5LkwpQkR1pOutYkD z)LEFz=2kx0Lj75%al4bRnj@*^Sq(u6yK-GEI-Hf|iKW%1{VR4(vPAj&yMm}+1nkI? z=qIix%3g+2OWys{uzSKfWZA4kq+>F(=wRNxU2TN?lB4~a`n6kJeR?2W*g5Hj9hmO- zr6}IfP5$m}mI$yo1W_G<$rHYn7@IluX)Q2~#uh$i9e+beMAp4En!FBIw%v{&~MkQ?9#`Sg1}V8N%n-nF;gwt7!1Y z$^0VmF+scHFMHViANF8icw4-tY(1*HU%X>Rdp)QV@*jA8aoc$~2Q4mFf+@J%rB9UX z=<64jexMA{_fuYvK`hxIgbzt5`t6mRDQat2?POi)!|9vTW-hOvrOoSwj*xj7K2t(P z6Vg@e;I&LSP1x5=>N!)O0vE~uW)TY39V0np%GlYLK`e7cFimnn*w;7zl8D=vxF=VG z&m4kB63)ptam0BvAbS0uAUzv@FV^!8c3Xetb2TnL>W069po_gmN~YpOx~*6i{bRIt zMrwZ36;_ngYwzs@cJXq7<}M!qO4#GAC18dWCyx6M zOIG~!Vjt7M$E*LI*`C4^sA|M4utWruO?4phMt^cEo(J z&T7-H2^hxs#T>mBn?%^_AH5dIyMIpNfc-f}|Am7>0ctyK{%ihQJRo4t_{az9614bX zHe~My%l?~Eb`Dkh=O1;5JaM=YYAcaze$evE(xGAMrFv^=A!7^E=|D88X0&%z=ODe6 z=(`>v4zkZrxdd8;3>nWY+T}4ntC~askgo?(5=1}hW-XVLz1gyM=ABSt(pP*mMxphm zjDNbeCFj05XVV1!OufpOml0&YxN@&uhW$yL<^U(G{f(B03#wc&x#J25OW9x2uwwgv zNCPHV8o^mO;s+jA05EpyE71MVCyt(}k#KrqdL<-iDsRK_aVfz<!^l;yH6oNjSy%H4mpxuHc5ziFOtZZBK_)fqS!l;$Ns z9Olx%tX_u+B6r*!x9??QQg<&7hv$~63{TtfimnlH2?lD5vEf7AtQ#Ge@}PdtrH(Fj~*scxV4NRNa=|wP$fZBcH>iBts(DZqO{I{|tG|LP3wewC3_9}eje3Sw# z09V1%01g4WB|G&K$9qKahz8}}o=ky107D*5kz#Ug%8Pax z!5mKeZo9wsuKb+t)+99Y5Nhy2IX-I|PKQkRIWT^26d(qt+v>1YXFO_+3K&b50)zPe z1q-hTRtM?+B@0~?Va-?Z&?=Ww>K%MwU7e@O8M*a0B?~&c1iqOQSzc!sdr8DE3|MgP zIu_X5`*n8_zctx_hPr@Dln;u8>hLu8rVV!VJqx^acWm@Tu9@ST|?CxxywCe_9#B(p+CfMp@NQ-lJMYTaP#%3n?JeI7GvWvq;5u2 zG&fWJ4oxB|R3u1q)p=r?v=V@VKkj+x@*zxN-F3D4$Fc7jCb#@@781awaa|hiI0RF) z31ca;3%6X8JY!weQ&#LRb`JT=l8CLs7(G7_awKv_ytN8zJEbbQDq~a8R|P3f-mOXT zrvo77?uRX|tL}$F`>^TN!mq*t>~GQU-HSV$3u(YWTR>!Tz0Sy9&utc(G`42!^lzvf zxb1emCUWY$Sb_m2$&Qcq3V1tfJ+|W_H-UOLiFbX|Pm6*dh(#ux)`HT8(-?_Wi9UEh zaT}~(y(q`SzC8~M%WkH)c{$)l<2`{E%KGDVlUd;E~+8UxV7m!rC?a#jcx@25WD`BX>dCOvBB zX3ixsMcj&}pI&Dx4o%p_`1`?q_oU18YYw~P#=nGNt16MwHS^+P;rS4qh{}K+;SPp` zIz4YW#O%SC?p8gq#4~VDs~(V+2n&Rxs3JN=pE;*(&=v8QF#xdCK|M{U*@S)IHHY<) zeSe?cvnC|mBSG$W&f#}SSbICTy<~z{AM}<=vxg?^dR5<4f0R!0`@dvC5=b5C;&%$^ z+TM&=)X+ynR0PR5Cr8@1-xX5ALCxKcUSx-^uzkTf(kt3!``jH(PSLxBrN;l@f-3rr z^o;lMsLrgu|Kf$i{>$QE4w)1A{K}@*hc!*Zx1;@-H$Tk*gq<(0vo0^j_z(7==E%Kn zcTdIJ{pP&R7nqRQ`IYcTzVV25qI-pK@lph){R@$ExX@;arcn2@SlEEy?&hecs`}QW&07AZjNOB1MpI}-J z`3ILLc99=Z$j0F;C1YsEia&aE&nb`R0|@Q zG5 z0{?T^{_9=1JaSI`u#J9r6x3kJzy>AOP#y-AHL{!XC9lDjebmxC{KOZ#?j1RodIzRm zrJ4;Zlp(WLrWB@ITbrio{~Bo1^t5#Kll3gqby$(WufL;?hCWV^y}7vOSy3oRo|i%( z%s>Qtm6zR?v;LXhXXBjTAt_1jJwC@xN2Uw*jjPt@=uJTWCAX?OsIDR1yr!7Kd(u0;Rb_Zn zhf%~Hr?VCJ#m2vWISQzpR*P5u68vB@CbKkC_;Po4C+j%jq+3}gb~!zjHq3X@@cBuG zZlJ4BI>x!iCLi%oDta?Bwe+oajmRo-;q779cXjC8KGlp3AJA zd>nHcJb&2nqC||;6VmnPEcTNQ|0$t<(!%L**$8(kZn}R82mjtvuDsV-kKQP6wP(A_ z{Z3v^VPJ+Dz2)rpKj&g6<(V!j$Hpn^WR^iM|A}EwWn<$+jaUC#Xp7MY+np}UnbC{1 zmFJC@z^c<@O*lX3chr>WJjYXNEjGQF)_IP}1-#eX-RahT-U52UH{4GoFA+GB=x?I5 zKx+u$waU5UPT((MEcU8IPSg^X?U@Rt4~}9E-8xwAz8v|qj__oxrC5W0hU~0tAJ3N9 z*v52s;>vyT!}-X$*O^AXRj|9~UZv*W>Z3Tq6Q;}Q`KODR<+W`jDq_DbiNSH4TO@9&NlFJV@js*D3E*hr zV-GGn)fejfpOB1xowE+mW?=@VFG0SHZEXJ-^{bN6Q@Raj4;y~=kCzq-QCL)+I`0MF z5p@%p@0R-BJiTcYM*N!-v7X-Y+_RYO zQMtJ}cjsZMsz)O4OvnD#f~~3T%{j&00`>}BF+4K*>(Z<-S- zt#ruoJlgHw@z6}u76k-aSlaHT{rWA>yyU7DkN9I`PDWu!9v+Iqe|R{2M)8QliZ^8O zbI!=A`1A5*KJT9T_I??Y;Q7br{nPvuTUT#xx3@+{j@$7fO)-bO=5<$%;;y=r>@wfg z`zf%4v!?=BRPuYpqOoiSw37yB4} zmFE{{bCbi){@JQo?&ys3Zq)R%6JxqSO7-H;fs>hzA+TVMXmapo8v)7bp>v3D}4nL)E&UG3t#3!EE z6Wyr1_(MP_?4ol+E98zk-uEP?bvyIB+-I>05%H^+u)?7|_kZG1)>ceK@!X85Mp*O; z2a-N(=R)&pERwcLPPA50Z*b%2qx1eTgtfhf+tqQ&f6TuX9Nm*0!O zUg-byrmPX%n6mat?Ky(#F{N`Z8XsI+Dr9Om=+mCXS?;`b>&VmvKvyl>#O@p$mOI{D zIsvp0exC;qh*R}Mz%4v3oATz{?141N^FL=a|MT9*-RCg{SzArgJzN@j!?!AxO6N)0bOPm86|*q^-_n zgWueWQp-ksgi|Fq*Tj@xILmHYB#WDy`-{b{ImA0{-ZEyP))j3Stju%Gpi$-0>^IjJ zS8{Gs&RF$VN#DP?CwTl=8$SblvS$zbptTs8Qepq+){orfFQ{%Q6A*S-?l^KYzSx!w zTJ~50UoHv@pKkB3Ue+vix`*}y^x(Bh02{Gc{f}X9fBah$qn_~gb}X*SckPq?-QuXb z+>3hC%on21&rNt}>bHiW1$6ZC?O?xYq`ma&q=l_%0c5Zbt3 z3~`%Xbl3Dcsy!+`r_P4B38UAr)FDbLg8DA^dV3vb#J7UXqumome^C66BD;9jnn6#Y za-ip4yIuMDw>aCZ*9n;+N+};5$JMXrcb>MpO}e=*)Z2N&N_{fn%q?Q?M94^Z)7@cf z;=>FnwL73`M@vh`Q~VS6)wx6qCQAO@4=Ztp)=Okvk%vu|dRK*{4_Y)eRxYNSJ<&K` zPIqzl4M`6~{+5`5#5k{Ty!thv2QI_&z9lZLsygTdRhMTkgLS)J??Z%*=wAa-?x+v| z0mJ%n755yyuT%x9npag7Sgi8(3JjLvDMm$bCx&pXGkh zl-TO%IXf<2?ikm3!ZFsNY77+xY^;8@Tvi+E7>_*~UZ$RW7_JIWakx~$T$-1A=xLU{ zb?)Ni1%+)~^O?A8DdH3RbE<76!s`s)?>0}%>!OJ0HLvnhQUp8iCH%#JZka(fJ*(JY z*Bg(w#bb2*2}9sKfgYeSsTXE$3!|ak7tJf1X-IHs0~CNyL4fb+7i^Tw@!i?U%2Cij zXMw%H02M2KRO9D1A!#z+Z0E`zWEot+7yQz6uGDQ6l70OgX#^4Af&jgdo~vz3FE>~z zCJTLkdah2$LGrS{b#7#U$r(Wb=1R?DG`YW0^zR%m3g?#68kRqIY2HK~#mP;ItT^aL z9KW0sKVj*Z=u@&9RNnjB>7ifkxQ-&WW~*%k9T(x??s3Q~nDD%%CTa(o1-?v^b!+ps zStSbqAU_GWF5fiV^*7Yzfaw$`9 zz2T^EHh$d*S@qeT!TW^JN`(tVK5Ljc?Nyk^UOItKrHvPsZCRY}fLHT{X7zdN=m00zFgJ9Q$D7V(1qLjpVPfP#TEP^GeII~ zfggA*j=-1jQa$#G3f6wQBj6cbgZ2oUojpW`CB| z`}TCLt>t1d4h9;z^44oBs_C0(kv;eZc=_JJ`L>XU?GK~x({+3aGcqQ2!EH#;(-PsQ z5=r{d`*l#07mXn5023k}S`!j~(s!OZK@P=07s(d!*pt z=5T`Ud*tCyx5i2&^!`Q0k`n9smwk63wa=7-LX+=4pNCTy<#eaJ)*?xjpFHXC(U9a4 zp{&x4k-p>{B!{m^YX=ynu=7glzgs&BMO=v`N-ujymRiEbD_*h%pS}IC&F#4%86=#( zuI9=&$W7C~&$G=I>JN8`$p+O$_N)hSgO6i% z-#5+w#EdZ1&tJONPdYiSvp5!$_P04lmd}K(5v>s;%BC% zDLRc^)n9v$TnW4E0t7@(dl@QZXq%6sWr)Fc5UW`h%AmvhmHnnmu*1uP*%L-3 z4;T2%Ce3_$jQi_Kad?VdBOK0JP78GN4O8WHvEo|AnR zwF>2O(b-aZOMzmvZd@W}{AuklIw2V zO-;&9i!Cnm@>E9wBFH@(mZ21(D|sRXR{YjL9+ZDoc~qQM^S##Y@{E#Nn~yjJ)z$zF zncokUD+wc^g$=bZw*(Pheia3x!?uAd3!&k+Jj@;Ex@NHlB0E*s3LN=Wf%UH;mbz$u zeuE;z174(qq!E%gm-Plz@6|zM^xJOneI`40~=JG)cz; zvpJ!8F(c17o6jkLQ@Ct^dF)4I*j4|4V&`e4%l?_ZPw&Tmr8E@7^AzV4w=tyzdp(@+ z!wZ{lgjzfoS%l(qhAM#>*Nps+a&0r{YDdi&bo{7NA(uhUzuPF$I!S*F^2)LIerFDq zW5-ROmtupuhQsRh@E6e&hV2|j&D6GpURLs!cKJ<>0ZZ$%_Wy9zPnkMUK)6&~L^ZeS z6N2{6xcRSiy*cX+ zwSMd0esEw`jiE7g%p9og^?HEHLRtY(?Lbw=1Km%%i8MgyV6nD zyq6}}p8vHn#y#m{`C(dUOXTd)i-|~&N;lR!jtksOk4mOX-iui2`Yg*s2Fd9wPd%AR zUn=Mk#rMN2*Vk<_YZ>x>+q9n3*Il~-<;e<{c@4IR#(8}q$EFCg$I6iDbVKOKInL)w z?rTK-)-`A`jQKH1I@eY`PD>Z2CxxqDN%x+-ZcL;tc!|7(iA07AS2Zx9oq7<}048#U z`oD#zq_n6*QMN%}KDacZw@EP-bArU4lHHnf;9c-OY~{3K1Sd)CM>;QKV)~1iGaU4y zCTsX%)Ttc#G9=Vk^d*}^T1e&hOo|U~EXYIC?`UEvkzL7qbNPbdV{>9XvYwLDn|ip} zV;^xUop9k%8TxmL{=A)Z2gQZvv|$FE=^dH?*QYayr?PwQg^eo>OBQ6r=!SvnFasR> zNCu{@7;o^R);to&CmH7h~(N5xqk8Y{GE}|WM74rNz6N>UuXrFW%FR3ans*_ z?xCBD89s}5z{!ys+M7V+9zUj`Jup$#(~K3!DjH~sOmBJ7S_d*mxj*EjHm5=@^TsMKqkLKkDl zsnK7B<8~!*TG!f>xcP95i{g`FI{sR@U(`T!%xSc;lIXB2?V5~dsF&^tf23T?wZKgo zUO2aL6jOO$lVMiofLK}Ttt!|cT~HbH zID7iJV_i2VtZ$*QtSb_!>t$%M>q7G*$ztdaEr64i|2Qm}*PBu%2Bu2HQ2A0VVFIK%H0z zU%9Q0Koyj$|0u&Q^lJHu+`V*o0xL*f!P7B36G|1w};S`z;)Gj zOG!xZu4?w`-h27!OQo1!tQ>3olbGrNg8*9L}K%%-RGP)Y`h6=tw4+^--yZ|UH2NL#am z_wjXrbjxQz9hX%{bFa2YI$htR+Vu^4T?g-AyZqzASTExB{cB=bue;T^b}TlwPbsBf z!5qt8nTP%@jCZ}nOTNma&;_g1ddgGL*^L8Posi{G(0%b*VJf~zr1K}3tx}I&S1yhJ zYGp2m?tv;(Pfy4tzP&lu`by2K@RWg;ANwz^rM%=&m<%IA55>ly6@`M(Y9v3b*rh4U1^-TTqr5f zcySgZ_MP>}yg5?Pr{0IqBV=a3?VmsVGHxn2OJh-wQXCr&C&^l6jsHmZ=2)AroZgEX z${lhGf32_fBaSPQs2DXBy;~hk6GoLnkN*+bk0hR1hob&;0ttXZw<@UTf!V7kt2Ocu zfKkzij_e;{FXjbB7pQ8*i~a=Az-HQTx*sCezm@^9JA#e~VFDKtTAtj1a46ihV6L@A zANA?kFJ`$nO7#~lb+^alKj#s}8`0uky%_n`7Cw(?^_tQay-UQk5{fClrQ)^`WnH!)-O{qj zPNn>_%h!)XO<%@b3a(*o=4HaHJWayG_@&-Q;Q#NX!YjgcT(v`MycFKwl| zN-b+*zm=)7Zl~|6yE)B2TB0GidJdsj6`#sZn|90wAit!1xZAmph4G+XzhK%(7(5@1 z7#=ty{n`oZD)8Ms)CrkrTJSTQ`y#8O3#}oSv$f%r7j6Dt?M;^M1jwV2vu&@nP8}H& z){@c&b<{!f1BowX{RVd;)jzHNflg+ud88Hh+tID(5xi|u4-89}GwkmkqyAvPtUi%- zt$=>>`e)H2JP6q?T3wkjzv5&6-x485+Nf^?o>IwQExOXrE%U9FArXmyHw#5B>$bUG z(Vu+*bLeapBG^lx<_rjcw6O$SB2H@^Mf`p?iPqXxUzBL$IqRcNpfM+r574#uto$Fb zwFY*xy=Uj{d}}X*IBYm~3uUND2rQ_K6wt9By=%s1Zszd9!N!e@Z*uJuBRPS@+0}g*g6KJdIw842!GKb=kQ{5}f;qA~JGA@14nwllJl0>*^0(p1#W-x7NVSd8@x)eqrH_9)c;a42lvFRkoeBPVoQVPc|#O3jB5(-Cf_}Ad6EtF@Wk|+Zs>Z3O^sI>Rk|o&EisArQ`Pn1 z7X5>AX3}_XwaxZd@canN?zp{xNW(LFC8fE6jmi&hjVbO)c*{MQ30`u&>k;%pmU(ms)) zk(%g&cFy-(+u5>49zm_f@^|jFt^^ywO$1Azk?tQ`X*Jv?&GU@$jDkxb3)Z>u8a>xU zJ$N_`^4#m^+br>6cAb)&>adXnvgqqn)KxY9dizL?p27Yf5VyTrGm!Sy^D4}oHE++A zOpJ7z)H1*{=ZrxTAx0{n_zB}fkdW~lXgwmlbrOb{2jgItRw(Uo!!)j~=Gjfp)NA~d z3;?Cj+9+^N1^t>XxGb_UnD0C#qRRG74NZr)s8e)vJ(y@C0x*p?O}Fz1;j*e3vmC+J z+e-&NXiv=K_|lFm**wKYLU6r{rK(y)@dZ1W)BewKb4UyHr9XDPb;2qmj=&QR~lTk0=>epNV^&SthNQ{}zDe*E?O?T6;r2sb|t6D)i@ z)#}rYM)BE~s2Pfedneuz6kldodI`GPfDYkbHvQ(r!D83aDCJ#v%)kY6Ziv{7zzLhQ zzbb79n#PN|t$~R{F-n}8Gtf+j3gtSxX~kfWl1JzgutZ`qR{tBu#EIP+b!W7~OK6mV z`Bh3v?lNphX>mMhb0Y+Ln~T=Tx`#bB<@9R|xBBi{hX)Rby^#D% z{DN-IiK%Z2!y;2LFgwxHfzw(;wh5Jav*%F*2Y#Lyi#S@0V;gITWjNAvPg+t39eN!1 zj!IT=;}8KnT{l~COo;~pZdqpPV@(%KG4ty7K?f%jV6y{nv+ZdiuaA?rm))0pLDe5x zRN#$}<>S$;s$JGO+j7rZ)~|Cy>qQ8cOZ~M4l&DCB)OD1@x+iLJxoXxERUat&8)3UB zD$?*jZ^I+4zXC-mZ#7N-;XT3G>kvC%n{~Nu2VNJrcrIhLJUznsm6=I$iX}tCc~m=j zbM|~kvj0Rlvo$u-p-?Q$y%YGk$(6g*2`O+~=Cq5Nw(5$28IwY2zo$oX(2|ZxSTsDW z@fICw;sD)w$H@dta@vPD>b$^7L`Jz@twQ)l&S;)PmcI1AYko5?u~T(3x3WX>@}fPi z98U5UsR45fyH`0rc}_+F5?xyR3$r4B4;7^*3aO$!zu23z1T2fyI8}q8zrZ!scAHBT zg<%6sk!j`(^-&OP*4RvP zw)J|XHg&E-{TjmQsosgbd&ORVh#AN!pe&@gGyi3AwxoNxFHxJHZe-?c7-lZFlE(Ar z%7p=OsCjoRJnX5If%|M^nMH)O&3GH=5qXlTX=0`z6dhY|a}+V1ae z=@eViA>G8?oG23qNy7JZ>`wdEwa#^@M{e=Ww-c2frH$=74@A!ZaF!ks;2`hN*mxiW zPZ+qbGi>x9;W!sW{Icm9?L4Ao330@HDyXK{^(P<(0J159`-1Qf>d4F;e&znq!|R|l1R*$f-RZ#)V=pyCl`mKo_akc=GcfT@_81J$hI!`QMBE| zls3g}rTLClBF&_iDcl=nF8zl{kICGQGTFE&u#PVPK85FQe;aAFeIW` zRlS9%WOoDHUR7cT3ZLy@+Eg4$wK_`INqsVMg`8C-5#p+;udc1GB?Y;b%dLP+J!K^S z{91B3PCEO4OucnjlmGX?jiR6u6Y1Ir1*KDJ3;_WFVJe+dy1Ta#A|N0wC0)|pE#2Ln zqkF)}@$mWnp6j`uKX+}{y>rg}e&6@|)a%%eCrfR(oJ`$;49`_9!mgTW!hN@xP~lic zrEiBrnZbY|uoF`CI15j$V9oXIzcbYi{=0)B=OJ;8jzdtnuf}Ff6id4Eka6St&eI~y zi-v)*x;jD4F%=4hFLFs$V;6AH7vL|KkPGlsg9`Q_E-A7PV;TMJd0__KsDROP>|#n? zz8hX1^`{$Ab`w>yEb&p#zcA}hWulN*xn}HdW`YgRH|K9|W+rMcv*VA4%PGq|((Mr^e)~{Y8cX)og!b zWXFsigo5b2)5L4kf|+|MQCw3rIGXY#c))jqWBv0h9O*>G6*^((t0Iex=?up(&dMdQ z*G5mSLEGr98~~J@ByzO{XXa}End|G%^4}Awnv~C`y{!orT$CL69hLFJ@-?^P|DK=P z^fc`pf9b$hkq8gJ{ZxB4kF7RX&ZKTPDs>8V4+wDuFypy~t?pepdJGghwr_m{G0SFz zL_kGl@lFJ1Uxz`(Det5_9zTfkzM#9EhmvHO>Zt;M;JAvb8(l{}FpE88>dj3h*Hy5v*;Jq~!)!0?dYNW*ulVo-_U`!&`fn-rS-jV1 z7tDOjQm=cQ-QstP#P*uQO%x;uN`EGwvZ_{b5(PQB%!DQe@zvi)OD?b2t*?8Fe=-IX zZ+{V5pV#)(3Q~G@^`~g|t&MH?>aJy7gGKk0)5_Qe)5&eS7Zj<0bS7x3zWi=If69y=kkz_N?L_z7|3N ztqqPlav2WZG?@t4@aQiaqRiP}+Dl+2btYF1gQY28kAiEC2!c}+Ki8@^9Zh*TdN88o zn1A_^XMZ=Mj-;ee@8N)e{*G|df2-B0m|Z_hWg%%MsI(F z?=Rl-^K?SEu@&c42X7o0r^5U^7>|o@OV>TZzS;wTS)ZP&F&$urRyZT1xkc-4<|gY8 zZ9(%Ek8N_f8Id|IMPyecR;f(dBQ|McS*%j^MzqwCh{ zlniQO&;tKI0$5_r!hc+%TYMs7K78UOA@q^ezy5w7U%(>f6NovmYzlc545lWSUm{GD zgkEhPOC8VxVwhjBp)eYTLDHKnb%rp1<*fV5AS_&zw`?tOxSyyVZ zc`1@|`ddSow55oT(2^>b9*_4|H}t)zYx!%~#ldW(B;L}3oUXJ;%9Yg7g81XGt2OoX z+oxkyU7l}mU$evBf8T6Bi|t4|A3{e){6SA(j}|KZz{I_&80XixYh)1P>068aDk9nE zh+dxCJXI6jkKKMlnmYG{`dnR2Ujv7trR>;^WSf1F`WkRO7_+|GBjS=jPz0XQUl^;) zo%u+VQMr>hU*I;*Cg$cQ*48$jjF9+hmkn&R+TtqrEb#}6ie&jB>9ipu5K7&Hh4OC%Hh^m`kNk)~3{`%4m#`@%jV_9RfBR>U}#SHNJk|(=6Va zM|(r50J(iuFv^vgZIh|dym3kA!Qm;vw`%_!>h3^cKa|4e*7SWv5-sz8g-W8v1%0s& z?S-pAj7(!M z<746;(m&cnrwSJiS9O<+$+sbqDb34JjIKPSt@JGWUk0wjCW99~Qv zyMDQ?(6SEU;*)zi#5A4ORW~?S*TXR}CXtMTX&VAG7tu(7bZQLgNo~R%atZ?#XBgce zMP25_FH5nuP4ll{oPai?U~76bdp0mZCqd78sJI~6jUOh%^-QjPSLqOYjzL~kg<(7H zbDK?W-UA;9WkXj2@n1xrC_9U%Qt78>r|P-H61G12e4bddIj$-Zwzi_13}a75vyjMg zIT(O{%s}9EjaL`FJGr%}OBV#4*xq$izGL=Z{Yo+SO7hw_YcRwT=Wbng&3^GhJ$B?1 zbihLD^8q~0$*Jk0T84_?htp9pwi-YmNKn-^Mu?eEBGl>E&ikVNupgrL1ODc5_8|#tUX>rTt9G^(L&2IAy87*U}f! z^&_J>gKch%5%e)X3MzWCoV*j+NAowi+ky$zfow%9vYXE4CT(i0B^c!IpR;L3h9qeo zcAy_n{OXV@-OKsf=v8`424ESiINu9VGmj{o)tt_Ac`4yG9>Eha0c@`oC!Wcf_g$X) zc0D>DUnw`MxPMuB9?0B*BjVz6+)lQ;7+|nK`zn~Znch;Px2|-fkn&5B?e6<5pR4Bt z>rLrFnjK$ib3WV;%Uo`@d^gdLLhkP3!9QjBYj}9=sW|Q4gE3fv@i09t?N;8BP0kCN zb>%0>BprP)`8B)Ff?;NB>|`>jDKyE$18SKoJ*l%sqDDyK?fvB)n@n^0>N$-zq(6L9 zn!p*=^ueBY`zgWi(A$Y%{No>FoIbn0$G5{XDk}0&4|P#-&pyQuZ@PVG+=MkBFDZ81 z+BS-FI-I=7c+_6VZlBxkXo)7E_x9q$+nF89UhDH#d~iE*p+q8N;!jkpysj#}gSQYF zN_LMf99tXCRoN#E{uS2WNT$zWIq{B?CWb7hC;21lA68d8qak2+bJ9TCGP}U;6Zvx` zA4c+;B`tfjekMu;$OaE6Sv}to%*x*t9NoM$`+?v(`K)>QA!cWoeMvt_cWd4h8+lG10UB08eRCT2C-d z&|9BBvmBf32kezZX!{FF*Vz&mi=nO%*yh?Nm&(qVF6(FPMV%|V%uL`F#%(h7d3{pA zx%hE&1Gp=fr+vPFvGD^bvnTnDW+saIA>#EAyZsn!k#r|E7DyVoT4{_p88y^Cd6ClP zhK>8QZwHU(Qhr<-$_(rM$IQX70ifq`JfqG}bi zoKrle!EyMP2ur^Y4NT9^L$CZ)?JIVj?>QPqGU*N+i0(^$L+IH zyMxm&G*3TiR2-oalXdjKA;@zi3+4w z1C^t~>DCVVOBXZ;op@WvcIcbCU;HB=CIC0o=8RffD&!e4TZTGre!I9Fe}*JOengAe z`m(4pZHCs=FJal_oT)8Ym$9uy?3&q}kNcFS$5BzQ$iM{^9yN-5nly}58Sj%2lX5Bq z+ZNjIIL+*sth~viB@`}(cd)43hg(|)w!kyXxXYPe9^Vh+E6=20q1lhJFXQ|0!9?a? z%U>f^fKF6@Z{C*~$~@(+a2(46gyp8&`U;jo`uj>-2?JN#li8aCd=SfwIxR(sptiBP zje@cu?$^=EvR+l@ugp5di?(2v4F7MyO;of}vz}ues zAf56vnFd}ep;WZbhiB|uD#seJ{(lJ@q%d|T!hb3H#cYp+7 zMiF?MXC=s~d^+brt6nIQ(RS18s8FpLp7hlAqmFYJd)`3F*o0HedDGSSQK!%bT5EA< z{Snp3!ygkti)G_g=2~eN&V@xZM{eb8#>c~x1o0AxnV-Gok)c1gFJE??%DyL=h@a00 za-LYxpJzMxY@Ac|6J$1&6bi6*F-jVUY>SC#X#Dkhhr#%i&l2bJfxg~%-8$oCF86Rb z`~ASl*vpaKz8hf$WFr;=b17V2Y6E;MD6HB{rpgC??q4BS4MxHfHM3JL?UZ}vLwzHE zYZUT*5bbad@nP+d@ox=M9NPZ}|GpuaY&GUTs%*P?=&tej(6%P~+1Oxs7i#wUTmE;x zAt6eQK^F@xaUPXd_&(pf<5~6}J4A}{bQ9t37>*zReSFTl1D3ZtoI3oKmc~;3jnyBx z|87RtSg+CXEc#pN%F_dWk#S?On@7inpQRKYex8;5VBctR^hmb*lcqf@ujKj$PFX~s zq^7%r%ZocHo~O)m@AJ94{Ofpz{AVwn+4NQFT~WEHcoZo<#ld%i5kLyl9yP0hhC6~7$zhvQ#!zIWG-_PK7VmWB(TTzE_*T+Fsf>hG<5 z($^>xr&!&M0(wm7tRa58A8c(04mtdZ=+&~}IHfc*nwIE90o9tqu$Jef?3OyHCvh1%MGd?daiU>|YZ|TeFeqIy?mhVdA3tYs9Xbop4U zuZA3dOZi=rN`z@A-DCZv`R=PnXaqV!QgpBvc8}^X#@W1VJdVf%-It)iK+(~)7uTSo z(a7cC6A#T|cmj_%_Y6 zuj{;PNvxI^df#-L9Ngh55e@1_Y>rsWHyt8xuc7AD=oCbS0&T3GA>krJX3CqXX}Xso zs~+yl=84SG-#U`olq@qbbGhgNc5Xt&iN2-wHEw~x9Wiy-}K}M*+4p}a4RFDo3zW45{^^j zo|FfCzp@M!W&cFTF>{F6Px7{WwPAQyLYfdvx+(QS?5VC>>1{iFWl^*4TOehE+{s6) z8X<18g=ligqhQ?NO0u%ZhTC1p-PrYbE@aGfqd&mJV`yi4N3TB5WxvsK>R?B7A<|U% zZ{0p7bOwu90$%A{5yUUJ>|mPgEY&H*2yY2%m~fyfM7sw!ig2R#%Ye42ck7K1#`S9! zrQr}jSP&BeT6uI&`%2H0Tlyw%RK8a#HsybDq|NtRy!3#Pt|C)J$WyD2o5u?9jKr82yn@72ueSzk;$*;aQTcKg7+>;JgwP0p*m=@8N_0&yFqbJsVJH(Y9|rAEPP_r7yI4l|r9+PV5@JqcAv~4O4zurnZ+PZLS9p2l-riaX zEDgtsi^UBY)uS&*J~V~6Ea5B5=|o|CDCLmL1VVb6puQ}?FL6?>^L9lF)@lgf;@L*_ zy`W8aM_~nxVN6hnf*V40ac$*4>D~u*Jdk+s{QoZ;DLxl`6|`$uJ2SQKflm1i8UDy| zsP8sI3JSUUmkshbdq<7`*HC3hq9(GKw1^ax!`GBNivO37>k1_CU>O%}U2zSu6P-6gS4xwvVqoV6T^~<3Y_(~V#E}=?&mx$S7w7e7`L?U<~FMGE=Jq99NaR1sl}xR z-wr3!)r*S0^L#a5{Sf!VaJw7 zv~M`^SwFSP(#WhH`Lo=P8wr>&3=!^pBD^5zZ{BO6DplT19Kw0xM&h_8-k5OGG&ky& zAiLtaEwFe>;(jZyvB=;c)o|F(8{f#;$iBdRu9am_3}ip;$TUzxAw6?ZYVA{(w#3JL z2>p^Vsg3};oBVc~6gmr}Q2Z@f`S#lTtI_Ab6>UD^r6Ivxko=}smsEndkyD=4zDHtB zzY4bIBZW9vJPq5r@%xSEYfNVo@xDi>Tqb#Fr*SDW8;1{xsrlMIOnCbyk%0e= z`rWl4*}_ocWw3(#zr-iO1(*3F=7!ZP2{fbzkPZ zqf*w%$vc;%6e;_{=beSR*BO=XS*c#S!W+Fasn*uyGgiz7EDu1=?Wy$8^neYWb3NBV zs(n|l3fHqT-+Xn6t5!~pY$Qvz@F(tZ#5;Stxvk}@^*$0`_`c!3bOt_KHpR_pLtYx& z=*EbfnAf>X5T}|nuerYAR-?G$k@a&{TL@LTDIwS-HB)w@kFqM%;Nghv)NwE;{j)!o zvizn$aBm~-htyeS>!vChM@~|X?9+a)*3taDjNVGmRkU-xO2faKID32cW62Pz*;39( zdW8c$4OmM>YDGcbFjN~w5;xb#i#$NJT_Kv*AJH4DHupL%nBT5q)|(+&{;uj0IsEE( zic6wdveXL&aBTbCtvboYVI$}D>+uKqp!&dxVr)1*z~L1dLVDW){nQCy)>SmbN>7x4bVL*s z4#QnZ2LogDGGAcW#1(gV6~>h68%4&o6=p45=p%|t1)DBr_KHs0DdC53&5q=q9Avzc z+0?T2M57@bZShQk`^Ds_M{JY^X=54S_$_jz0(jp{_H7S>`*%U;pbc z@V2#Aw$iNb?!_JVg{2VAW#vvSj^0~!{babs_~s;x#?~Um%{oG;VoqDR>rCYD9}2(7 zAR0$H^ecl?*swJDmv1=~MOhT_Ua_jf7Y#60mG@1=EE;<6pOWVB{#S+lej&PLC@>l4~3^IPAj_X|=Y zoqucON?K^#7Fgqn%Rl%fl4_G9?X_m;)9?p=&t=3&9su2#Du2im@bHOLE3iq8Kc86G zX1&0(1zr8?-Wn|3`5LrU)_-CBz#)O0FBsuhtY$)z?%$v8>N;6(z(8G5&Kr{*9&ctk z-su3@8)qx0YxSRBOhJkcPg1$;=h+;V#jiNtNH0>8C)|UY!W-1gK9~7-SLH@ZZnSa* z?+TDoG9{3!Q_SyFJY!>s1CsDQVEC)Wn7$lSsP_JWr1X1I$CI6MXNhgEUBW#ZSVnxv z+`swxkZTvxo6+~os-y2EU$#5|WzT6vmA;DFYKNu|yMH2U)r!E+_b&YPW9TL_VIY}8 z6!>L-p~NwklW=-Yd;e{Hljl=o^!~0GQJO_l-6&IfTtQg5yPG~Z4 zL>HyuPK@ZBYr$5RDhUsDeli<^|B)iX@l*b}fh%X{4?RV8c?CZuREya0e%kG|EKS<@ zP-QA#mgpjbO4()q!4~V<LTUX1uIJNxJd?IDM@0HT_x#O~Lzl3lU&j^X(!!Ru;W z_YJ&CW^IA8%{+b~fzIhX_Ng)TX=3Nk{gR_0d5FCR$DWfvU6v2z z!50k;6=rQsfp@iBZA7*fF=>n9+_mdH18Xv3Fk`COm0A`$qla!Hm5RYGO}#u7ZE}j# zEbJUjdqTPEDLeX=$8Ga-;eOkPYTAQN*5c zY=|ab@lfzyTeIgxEf46xw}mviWl%9@>Sg({5kou!{{?wPRAA?v8=ubs?9Q@k?5imf zAJ;joixTmU`LZ>I+p)73B}hRats^}+JoBb#^Ig+8J8eedtS_egj$`fiS2cHWX|H;w zcqM=n{P5d?KG(XdMfob4iT%3X>(4^hr&uc`gg5&`ZNz?NqFD#P0hbkMreQvk?saH; z<3@@knLF9H14%XV&ZR4RHz*(Mzs|t^xXs|Y>S)x#YMd? zuDcPuBCFVCHr_UkfUL5%Yb;IVro=sgB||TX+|KxpMDOY2=&x6jkcEJH@Bx$~Sqqo6uAmIw(k-cbgRAY?Zy>rrIdenX$Px z=`*v&3Wgmv{=N20Pr9KxbjK3TT=VW*@54Lq-KR9}hf6$6SA=9~0kRdzAiLEEG+8o= z&8)kIQeH|6<9(9a)(+bi3qsNpJ$^dIaMA_e$T54wE?>Sy*n$!Sz4xeXlceKWM6Y z+HHPVH4>p$CFp7(nc<6z?GgC4%wJp54UVZOCK zNa~^9Sm8lE3UYqwKcvR!_|i?MO8`jyTPV@?x74M}Me$bjOQhptQ3(40Waymcon zbo;b3w-_4D)MmJ%w!mkci{v?(#OE)oVLz<;+`sp0!kO0mzL0and`ZqqD?Z<<}J(+j7qa$O3J2a1J+C_5UP!)`N)j#bwCbrq>opNI>jNAFe4 zvI0{-->*B9GS`uBR!+;sK{MVL?)@*&;%}uuqdI1DmQ54l335we&4rgeoLBXCV(|m6 zJD5Q`xWMp!EL+~*3H#CtC;&zjs6X>GkA7g+4RbLYasP+ zp6i!($JsHPO<=w|<1gC}IqrMj8&XZLU?QR}ElHLuxG5dbsrb8yicO_RjPPjsnAYXA zh+#BqLgww^@ScORuMxQzbhA&E8|&0$tsWUG=`2TdTE4}8bjX*C$j^odU%Q>&j0hD8 zzHPk>xEapo_e?JF^nn=#bbfzDx;02+YDmId#`Bv~|2Mnj`C?r6uEVHn6^A{6juLlh zTzVI8)rW>gkL&Q;POG38jqEzC$SvP!{vK!GrK8J*lz7O-;LyddbnNJqvPcmcG2&+H zenZbrd&LCviX&dyySVRmgF+$$-C}L`Psu|`-I8_o3e&wV<7Zd}o(7jcdY!TALno|c zu|`eqlVrxr<1PP1XZpqa!RFzAgV%d|QPJxeT>TWdj@-mbTKspayRo#1Zf!NHp^m=yeca zyGA|MJ=n(^`Y+ORJ2J{L5lPFw=%ir1oAo9cOhlS&4HrGZL4{!yw{Z>Hd*|05ImW*U z;rNs&GMoV^9k8?9s!XP6Jby?f>Rv^hT&cXs`$(AqJaldzfPA!!vm;Baim8r(S7&is2&n2Dov<`^dGah7(xUwF0|Fo==uk%e zOQT}*Mo#yDcjd5GJdeQj5*^EuxkvGQ~Glda#Y>w%~cH@1Y z*DJG+-rt}3k;tTm9e$3!O1JoKb|ti1!a%VAktzFnof9e>pkZ+cZg4{F7UhmNz4h*K zTwi%(ShUjrzo3i)DgmjR?HzokD3R7ju6K;~q2;TN*68KFJ^CrSQ8g_1e3GPX1Y>IR zaiNPzF~fAvi1v<9xQE;>X}Fm;V^do|VU0`Ge_uN7n&)@V^^_98^bb(~KS%3Y8DI}K zE-2211^^H0%pu#~&O-x=8`2!bZ}7{bh6ii$N*DpWx{GfAk{^T+4bn}!9MTRddcNzs zNCWfa?_b}LY891F=|k)7JWy;ph~w|*MHw1eHQlJ`QuG*WStF!u>wWC*+%7utx=xSp zu5$I5-rg)!2x4!xw3C5p@I0d|7Pqi}>Q0I~BU2!N<^3fTHzeKM^FMw31nN3%apw)5 zB*V`QL*`T_WWXQiaU1QXuXQ~PqyZ*6D##fTeG72G)r$=2*s@B^CcEJWb(13gD*A3Qh1*>{XE&WxU-ZfZ zjb0~?c6&z9Pk%V{9}vOMT0i{z;oj3p_fn>7d&Bny{1U! z7y!}mw)QW=;sx#gljJ>4cET^c-PCDTL|+tHe4k-cw=1QiieAy;suRlzCsLp8PwI{X zjd=vNL~t1;j(%q3(888t1TCusbm(6#H%t)^t&D3jPi_M&E2QIo3XV1pf2qN1-H=W! zu&yio95Xyf)A*{rU}V#f(X_!ph6s7TVVsFV4eJU<{wTcLXL~7gA63KqtA!=~cs8muq3Q%EL6IN@&$-zQBo^ zg!wI72+yxqyf_}6V5fU9`DTr=V8;XuRbfaTR&+u54R86{fNtOVI7&fShnAe+o!OT!EjJvn2O9mT5s>hp{Y#l$CeQrvt-3oF^aeS5mVQ{ti|5)$7! znnp?M$*9~`N>>z>&>4Pd1uDWM3-XWcw6OjOU@v>IY}0FAc~Nnt9;G4dACc8*?=Ccn zwIS3R_-oJRc{8nho@0+Gv&^cec3dReRn}(pDARlW#;OGJ4wS+jXUW zMg_mt>%NfAT=-7R$F29llq<8&&O|B<{~_h~gGV*}e5bF09!KWc!`Tdqm(lm1qyc*m zUYE5#_XqxNEB1idPxcWkJqCVlaCrXA9#8oC)0U!G@&|o@-0Sh{=CU&Pn;hj6p*eic z8kWX2RQ+W6Ct?Z9g`ln_y_y_6rDFQAT05`x(Tz{te{8)ePQ@iqZR4uo6Q!&}HpAp$ z4JUNfQ%iQF#!grSE(5I2#klG4`(JCqnDO7(4E>4y;ip{wLuS)Bk(h*^M)_Z4XC|mcEp7Q@`!zoX<>yh~O;j34>5V1N{!Lb{{%Bs5vd2Ph6?y)^Ewy-jd-Idq<1lao$Ksb} z*_6eD3Pyh z0=SxAwGk8k4xv}n#y*kg1Lr`>72(Yl{y!VMbA`x`Q#FsCSp}78lrByAw>ts6KHda* z6G({GTSi`&Qm;W3aTDK=*thsl!j0azGw8{2?uqo4RJhQPMQlXpkyVQ6HUP5NMZw?r z6yOPLHZs|`{e?K&|R+q;ySjoQ`& zJhlD|{^+dhWGCZ_pgCb*V* zk~#uPvaz2E*K_Ga1Zb`AT4T}+TxHKs9w zq~4d%aLl~Q^;?u?uzsjT0`s=lTSzW zD=z%*tCY}IBx_lwMS-L}z_sTu1KhEqXBWr9DPZWF{8gL_#(Kkz zU!pB()YgfP2etmXvEs_W838xHFh z>htGZi9^)jqIX5}>5Pe;EhVvhR~3fa->438O3d@9%7=U_Pg>Sc z>iRIlNfSAZqST*t)Zhs1W!3z)x|%;ORHvP15xC8u!NWK$?lo{ZvB!o=wO-y zS#>MbV)P@dRb6=VmaVhw#nBo?d;j%bLcTOy)*ln2Trb!!qxCMYZt$*}zzdytE;C7J z-5VIIIGHb_^FMm>oMZroU~>reXU)iyj`ML*&2 zBJd-Hup^FP+>?(+FWz8cK60JNK?!w1K11utM#pPOmj%}^p5C~MsBk9|`po%k1iN9c@?K*+n3(%+C3@ zk}IW%6lpLj0O0u&_vgbZXS zo@`BQZE==1y>J|zWle!eD?E=gZ65u+>+UkWt$O{*HaqEJ7%ZmuY1VvIXbn=awED>k z?bBoeqUkb>`bHQ%vprvfF$j%--Vd7Gg_VVjokokqT<66u*>B(#r5$5T|F}x14v`{X z1?V5I+^TMPJJ7X9igAfK`tFcm+1f}!>3~&n5a>#?rR)XG5V}q*c5_QSG&}TO$dn(1 znf%8+f~l5ChQcU6QzN1VHt|q`TMjw}&)W(0x_Bd2w|tR-7K4Mm$0*dQ(Eb6(X>vVAwP@`dhMk`8Ezy zr{`ksQCvCwVO{QIvi{^q6)I*Q=MLNJ`tJ6=)4Rx-*nX6tOciKe$jenGz?TWW_*Av^ zILRzg9_IhYaW`ZkoZpeqLDmLTv39I7WNig4?fWYNpqZp9^_r>l1-^|`aNVKTMSAI?ogPg09&7jZJIE3S8D7>3mUFP?6YaW=Ea=j z_dxRtrcN|EFq_q%>~-=FeFvpUT2B8TELOo(UzVq6n-io{jy`jzz7@8#6|uf_iFh@2 z>MJNa+CE*tYk_@;zka{=Ae`ja5@LH!c~edeNmcb4#QUcg)LBUzGr9M=Db2j0h?!lU z*XoM50PP?(KZCC9qtLCRZ=*J)qtI!NUCPYe)-HQ4VD++T zFut10Vq){(UX4T?=i64%fNGLv>?NrVfs89=)+eM}fB5OPzF16r@<<^f{1qu|*%=;u z$*>h~D~L^twMp^ZI`@&m+$}$!Qys_qXTr!@pk)>~hRQb@m3fJ<^D%@SOZrP3BP zdUoS>jST9O$-Q(LPix%U>f3v)lg_#K*i!+{%Q!9xk(}Be?B@Alb3u8^{OK1D2|S`u zsa=1P*yudnqlEI}&A!ZRJUyD^>NyYWYwVac_jOX^a@#s=xob{Qw8Y&!}O_I45f$1O*=oMOtccKP(g zrzG@wwY3q(TH4SzW5Sv_V-CN|C3HW}U*=EIE4({8=2MZ1G?8a|IZ8JQaetdST+Ecc zA>&&A=W=S!R6FvZT)r-uojimvEBPo?>w7pTMN@hVZ7l9gS4HSCXNXs84drK;d&mI1 zB%1R!gMfX_NTa!?`;;dWpZ2KAWnHC`uQyd-QrnGG|M6e}Mgy=%MYGtHFFIR3s?Y6~ zxu{=26t*i1kJW;YGBAr2j8#v`Um44Bgcxq8O@*Hs(p$hsZY4@dbavNLIq<^+H0a+% zW5XyVEh-$i@SuqG(?6T69FOl*zy|nJ8n&QaT6+3gF{_3&nP!&>sqqKjlRa0$Mq_y+ zJx51r+D4fS86cq@+3q(S>v?!4cp_hXu~r@_ zFool6_|B3tvtA_a7*88+dY(B*yA@iO@3%;s^Xo-M#Eleg$Lnz}S$P`VSuef1D`*qb z>m3PoTY~zUJCOd4;{L08_+XpP$amr=y=2On+eZ&b$xd1*R+1}Hh{Iq>qDjuKKw-pI zSMhfB#A7iJ8VrxS+fGp14V9^9wOmcBw=R__D7YIaZl)k}zP-~zG-a*HU*nEkDzq%3 zrrVlp5RBOK9g;x2{u>EK=+b}P3{bf7-2+D>MpeHDpSHEs^AX|u2f7+Bo_$s?dO9UX zqcK^}qICZ@)lC_1SX0Z`ZTxOK?IaC*@m-s+H}$$BQF1D%I>_;>r&&#RDtuVr*LtIW zR;hkl#y9hgRC5lkMnzRVH?%WtwSQZ&+SBbL%Z^R6&SA8)h>ZVI+h4lhThU_!D**gDkj!hO?KD;AS!NtDuPdVIqvzmfM3tVNZrUa^wMw~A>$ZE5D zHszOff4IISmet{cJKN<AqDdZ&e*L_nNPkfoFg10nefOtOh|s3-Ti>6i`DrJwo0*K*?pGjin=Fdf@TItNCTi`D zpGjyh3bLyo!6|+3bkNf_z_&toww8(c`~J%u@tPe~Id$R7x^8tHTE#=qM;(68jGwVa zerl#6v9P+j;f7r_^n^sS0RNg;p18a9q@RH$=$sFw*#*540fyBFVy{>j1|P?>z}nwG@o9jz#6x(UL}pV>q>-VQ=JN9Gd2)Z zXeA>Z0!PMVP(rAqM1}zS+OdotyD9A%U(&ToGjgGJh5y#b?RNg>j2b(-V3gnS;rQY1 zI?eLlt}5tX8|~D1Zb0NXHRLxL5#W_PW;QJ#df4%f-)=32)AB9xe4R7;Pl(X8b5?7K zGNp}n0Gu#|EC_2^#Wo-|Bl6!S7r*xtBI9lH+4$z07fot1Ms)PyHn$}61IVeO8NQmd zLw}!2-(wPxj;djM*AXvuR*lI*|0c;@;Cu#lHYJ4;6^1P{+reP%E}30z1yL^TW3=A6%*N^6icwfYxNC&HJ^F9R%&LaP zP2scdwjtLJGHNofU9z^+3uZAOB;WZ{LA~Scio*VlkMok3{XdEDp*H4gk8x!_?~B!O zQ=q$1>s&GK>rkq%X3w0oLXm#Azt@yxpDd0!61mZB-$!$e+K0nKmCBZHIfGeXN7xut zx2!Ae`ddQo2CfCU9?mBZB9kJkPR`+9xc}8Io&R9_xyr%7*E2PT|&k>=rLR${5zP#m+puZe7FzSZ*kK2TRTHygl#{K-Qx8w<$ku^9j)MoxOVJuGErYqZwHAco*m26iJl-nGnU($8 z3iK6U+taU`f9qJ@71J@gAxONi$xynol+gn1fp0=eDi)j5FPkn3xTZy%hc#?BgPVWP zh`3uQ3jM3AN|zVW;|3HV8)KporwRPa&08+G2-+v<1q1Xn zf71A3z_~$bU*3Jk*QId6F#FNPQO&<8T)=mr;yc;9WgibP;C>8uaeCtI{G{O&&c%{W z%7DD54ca)k-?~Z9`IXhw9Z%<7jHDwi`o76S6A1p&%v)u254Zg8!Y4|lk7*swTz&7yIYArzHMA@TC7?P!E+O^K;UExy zQst{k-q}=6Vym_3_&0YlhAd7UjP+$k1jG1eW2PQp=XS<=p|~5}lXb?~qkVtt)x%n$ zeI;*eUkdO>mlb(cf11y!;t;3d2SpY9| ze3vz)?#E`oPpE)0)h3P`f({#Nd2h#JIDr}X?gAElcB7a*49Aj#{xxq#i9Y(pe$0JG zaR0>-Pw?FL%EuY7IUvyPuR%+MwQ z?>bOBYPG}xyLpbowoVMltaMQE8aYc{?|z?E4O~4D_P%<|3%=BMP2b#eo>D1()G(EF z5plra%Q9qwxJ??AClF1HT7LZG`s9@k9r@yre6$DnJ?utv*Gc&c$XxoZij#7kv698m zd>8K4$dLSvcjlK}>YQmHVY7a80F*5dn*bu%x{45DIx0=w;MqtKlHI8Ey0t)yzd%hb zxLd29--lt^znK_AQ@BeYP!`}%410$G`W?wkTNiDJ`qkGx1Zr4IP^|KdS^PQGyTe;b z?2{*5H@IA#r&t2f3*-NXxBHB0;_VxKkD#K0L_|Sp5fM-j5D}1;popk65drBX^cJK^ zO8^m2sz|S)BfW!kDbgYI-dkvagg^)h<%EB^pMCb;&pv0Zv(|aTtB{q<49PIp=l7kS zB5BT$+qa<`zFZL=vV{>J*Wjli;Je`ErXoIf;1zy~`Y;xZ{GyS367?$JkaJb^D4aYA zr*iNdatF8oF%gV7-uKvi%PswSJrXF$urtIo9sB3L8hXg1Phq9s&bG48AqcKwf@s+8 zW5ZuOr0LBLFvt&H;_@BE^^l_E%zkYK3x$|tJN|PiA*Azy04FlLg?dSSA3}12UiQMS z_Ou=U(!vmJJV_t7+P?tBiZeeddQjT4w%WW20KJ3)E)+ctAZS4DV$W>{Ov~Hke{c!f zIY<2ka!gkJ6$NvnMsxkUA4aFoC6}4mK0=?9e-yo7W;=9&88{W)m}FU@z|7A6 z(!3kiKqz&?<1=d!-ccFsUXAvcP{DhyyFbHxOQ^nQ2~t>II@t0u=C_od;_QV@&}oM0 zaqn>`73>_0aj5-S?(gM7%s?8h-|o~L1bbWGsqZ>zx7V_Bydq9TGpM!;Mw+)!DnSj1DdfJ`);1Hu1Kq&FT(WY zGm!~;Ae9q0Rw?iby;DGWZRK->grVMCxY{in9^hR75zAgz=o%S z&}6B_?VI&sKXk=OZtsv1aXfOe1|p(yk|JPXW!xm!Y8tCE!R1&wH%ufy?=?%gM;&~} zyfe$iIjN^=`}X3lV`)(U+6xu6$yF<+b8auqdX>`aDzwCU^4yWT_^ zu->AMB$o`ktBrFiHs%f*VG^R4N`J#r6U)DH&$^4`43Q4XJTV1FwZZ#ejm~pfZ*Q%=UNS22rSBiUz zo5Atyl|=oEm*MT3@7SajY6=A>|AYb#2$AdU!}d{-h8SV8rn zQl||D?&3P*f)n?Se}p`X7!!m_HW;i(YclGj_;yY^YGJu$faEW_y1naz_F@NttvcT$ z&_;?w1;cWW8fLyHlRqQ5zz{0i#|OGSnZxuAk|IcuY0Dyw-h2Si%a##Hz}~HPz%Th# zU#HkP_8z@@OK?{3nY<1`|B!1k%D`AxSTl{s6X2LhbZOAz6G$ln+09EVG+la8WX%`t zjS!Yn>7Y!uU;rw`mv(%9@{tNOseJi65AismRNV6MM_-d?GaYwrAAs!$Ca`*d#PWG? zr<5&-jdkC?NRjytf=Y|eZhjKkRAr-xc<_jtDwj4taYDgQqKdz7NRfLKlgFZvHs-jI(K$qoxA{|?h)|~=94QSCHgB{!kyHyww=0Q zJJOXyGo&Jsb3W79{xH4Ux;ZF%!qKnV+Kj>e)z_sJnwYUjM*ig8Dd!_&g#Zfafv4W* zQ@lRHL?NF63+=Y9X>`b;CS1(e&xjV>jlT1d3^LiETo6J z@!xnpHy@Vl_&QynR?!}lRmxG+f5Rt?vAn&Oy?ZO%U9f6Ec1ot!#S>%+qOAP5Y}fE& zbcmd`j9yl-Jwx0c(fJ>Kz_YjF0kk1zH#X%f>%BHb^{<)C(dICyjufk#j?iA+nU;Q{ zfxi9eX#e3v1N2~w6-00Vku zbzpZfGISsW!L8z z&I0 zMLg$~1e+Pv5D{Lv!Ok$6%VHP@$vOMiN}K^wnVEO(g)ZT2(ylXKlF!mNQ1XNa(#i`F2fzuql(I zLMCt|fAvpR_zo73T>b1N+>_9?Kg?3;8?Ls>Wi4;HMmzFd)YAK?&ZQ!Q-CFEHA`XiB zvFfetnBdy+VDt;4?YLN{abdT8OG3OUL5-Wug!0Md++IHmR35FYq*PU;(RE2bP)5jQ z_2-hF<^K@jl~t2FF_3CYfz4LBI4T~#mY@x13*}T;=8EK0Z`et4kdWNr_vChU%2m}3 z6v(1oF#F)nG_?@Q>Yx3ZtI>Xb4m3!RbHSJ3@pp<2Gqum?-$Y2G7a;h*lPzi&U5$eZC zdlBoLU=u^#xf0ONLXV<1?OyqS$n?66-LY|UPXqWs0UR_=1%K|jua`vp_6@Ug7&+&y zStMVCE7H*!^y_+VaQ=z1{R&iEqcc$A0mlvOW)vs%q|VAqU&J?FC4n>h|C-?pqJZSkvQ{?*)U6}^_(!MMd&Jw zp5RYEVE&f?-9PeX0QBGI*CtA90U3y!I;X}*uFbgJSiMJ;Ir0=<8}c7c|IEEw^1r4s zcfUOj{_)cF)BuSFeW0d@N-`_Hr^{`fyvu2b`1Zm526r@ibWd3b7$bHhd>@L`!Rr zkr;Qk=F2LjWX4dM=?id_XuoyO!?N*jmBY&G2g(l{4;GUOu(N$9J$7UQdpaBw^+$up z3OD}#a+y3Olb4m7?YbHet$xwCWUw^)X5fLD++1e`w#yS& zNB#%7NwWk3m<=x$bmE{djdA+{x>rFXZA-Sf7C(lJ?O( zTKAmVGSk_^{WZCYbDf?um2!($117?x+)sviLP8!z=bgYd~SKR8TeN|!so;^G9tqT<{Z-($pK73Xda=Kz}1`L~Rd(L8>bT!fG zNirQ4O|hqskaA=OJofKmZqE<%18ecY4j7 zKoHfaTaTO^RVa&dz&zSL)TBFVR4UQAIEb3mVW zmIF$SvnduU{q0U);rQ9g-cg>Kz48lN_YtR z-m5HZ^F}j?bB9F@%-fZQq7pM{;4TVo1TR)e3mNzpl2^2Dg*Jd4Arh-hTFlZA&MAWV z?@m(mmy?j&^=(p5mY*S{81k~+>=;AcWaH|*X7=o}))z#^-t#u@>|JYDYa_Z7oz@l# z6ILVG&30S~T`Uq~zE{6RSBu@IjbH^ZQ!R}Dt^~pjYEFHy>4$C_QwN7UrMl)t^~o*^ zdtK_4gx;ntF{(i8=V05c2~00f{C`;R`F$`+&q5UmYx^TgU67x89j0fms=@QrXSrQE)tF=T{08N7GDekg zL#y0XYQPK7`{uw`5o|7kJj}DuRF4aIU5b1x*#bW$51N!!uzG6q;u|MM-y67uM%@Nx zH?-a#$h6^)7G!lIFUN;2L^36tT2Dd^kOuq`BY*0dD*fsFIFGRr8pGd@?@F3*MnA#o zT9i`b_nx(f%h1g(PH1K!_=@(wJ&7vu;nKIf{6Ea-S{J+(fgbTUu6+S{mOr7;_Vy%fRkYxQMJfY;m;jMU4#igdnt=tAE|n3E zL%C99rjn<=s!Y1*AQpY-xn(3e$&PQ={en*Aq0psr@YG9&^*IB7){9;}9A+pTvLpTO zoaET@tCW|zD>KGQ5L=|j=;rBRCKY-mia}VzPJaZK5=-P#zVzsLBmP6gD7&>WUp?p+ zF91x3;NLUQ(RW`yoYeg;iBb<8M^@@}0Q+ zjRel`>Q4pNss-G}Ipu3V=qGkzS#xMDW+ z^d=ZSJH0gv>?O<_Dxa~xHl1Tj!eDw|co^{D-lx<+odQV8CUuFC3SdR$#6Ii<= zmrOrb_o(eU4p>$a?E-UT*8oqlV;YR@de?tS2A3!pgcA#o#a2mIj&yEAZiERD$Tt{N zE0#Wt(nKxGQaKT&6dWgBARhE{FExYZF`LnA2wyi_iBX4wxW{deZr?Aw1flJ0Z@<}p zrLMt5VcvviO%-ud(U|=}e7Y`H-ucI=Hw@xyJt(Q)z&By=yY{m>qYkl_hG~Rskz2rC z@1-$!C{S)gCtttimq^XFg+&R4-J9J&EGN8~Q*V=6aNSxxrf2->bswh5OTFw<$I$40 ze9!n1Z!XpD$|Vi}VxT0TW#@s_r5ag-wQKt+cV+jILG0bu zEZb8*fX|se*STqU1U&IKCrK%IVX&ae*v<+jldE8ATlR7_$|3QcfEp&iS~4Ve_4s%v zw0$UQ%ogY5T*8iQJghtKcc&IH6wGk4VOb5uEv1w?-A=pkNf%=Y%EjRkZD z$qGD1F7E7fKfUK%5f2ovnnD6Zp3H_J_wah-52IcYD-F zZBbBM(d}%WcZnAdQlW9{(r`=}nTfZsJWATMTo`{P9!va%?I@VRmPnQHExnW)-a05b zQ>khSK*_4bmwP(I@!_uU7RAHy3sufz?a?2%dWhrp$cG0^6gb2kXuaxx%;-|tnHjAW z&A3gJfW~BqyMprSt#qw{%&us4h`~Xqz>atoZ?;GwT{|zDN}uil_a8TL!ZBLPfbqrz z!Ua=5gFUPhrq=I94VTTKx9{Jqaa=d zzmrX7yR&ppB|kqYs^}ryS~U98$|17JIT^vadT6~yc4|q+I#>?9*?mW3LyhHJ78J6= z&u7(;cy#csrty}?d#^0VqeJN*CG~i<3bEof0v|CXo~Oa_O$)mTPw8c28T(+?(2yXV zM!A=)a5pvt`TmdNx3Xu8*=B(CCi@SrCW#DuHGNHmp5zMsGWVf2ve%bt$BvyvNMds3 z42D|9TfPC`)4LlZ1%AK%DN&cTGw};Q=qNc38w3vp3 zmW@=D2J3w2gJc!t#I+|+j7fxHdk5tX8eQ)nn;o>rH%zd#wCGrv&%eX$a597n)iz*f z3u$#8`q?_Rdb@o^eI>h&?u4S>9ufs?1IfFuzz&~?wy#c)R+~_bqX>8mZrA5cX10On z>Vjo<>~sz8Nd2ha?$Vx;gBoH%3C1Wr_V|K}D+!qd!)caET;YHu(w&#dU zW@Xp1C*Hfhq6%9u@&DCmwjkW*VVjsgI45wWRQ;S_SJ~wOoyV_nwhxSfg)NoC=DXto zX{EuI_8j%6AWo@o>=J|Jndav*_F*rHsWAC1XT4%h9kqUDwPfklg@Sn2ST>hj)Ozx3 zn@eOrBc%H(-Fm%eY8}~Neh=H!aAq`**(ATi8l@8DbHvIo*nj>np}7vR@>Kw6K4iDv zPc1lGXmJ@|CELrbXDI}4>j}62BAUnl2cikXCJ!p(U>1#kQpZ=RV7;Ixq3zr)w|L9c z8rl1kp56er&{G|azHcRUya9z*Htq{fB)=sX7OHILZTD?;%^@sjkG~JBAH3)vOKjZR z3k2+lF$2n5o;|ESjp>_Caq(;H!n6jg`Tjz-2Y@t+^S`v=>bCn<#NES|ayaSAT6j39 z))hS+u9D|>ZYjGh+}5JPhmbCoCrEx%dk?N$+E=_Vd_XVB7?1uf{G{6sxlLv4&QKq& z-BXrRSQWM}7B==Y`SHj5`~JE&aCL)&`cT1R4~bP-wlpy(f{|oDi)C9>n`cqxZQPnD zD^9J4TE5>}-wK0sPeOi_Uo&-H%hkNI`|h^Z=!C7<^P z95g9X?wX%Ww%=*~(o0KqxZq25*(=Qd9uQb>_6z7$kD@$-3QEDrUq*^fX@7A|_$o+zqucJ*!I9Y2-^#ew4y=H)vwSCQ}u$MVI2#4O4oR+mHXS*x4 zPg&M_tn@1bKfIgFF`zkc$rX8NqvjImmnr)6)9A-6GRy>O355rkzlks#!^eagRo6{7u+SKXHt(P?Tfr# z^D?$vvQ3q2u(tW-Qb+%iM_%XwuorH8c{ zo0NBlb`X{K?8%~wk8m}xgv;-(t&-(UXvw1CmO#dU$Ya1WlJoC8fzh`MoUEq@%YwzNgBY z&4BVsIY|mrX|S71_+Lx0eCP`$PF8|zYTkCg@I(#(tGuL#DytB^hnt~+nc(RJz^EHFlp~`g1t7G^PN3;6u{?&`rGL>3`&A=jwOb2t+)u$1@=1D$Qh^orjj| z9h@NH(IFE7i+7j=Vs#QGH)wWFt7N0Pl6~H+l)OAL&WKXk)1+(1@cj8=zWpM>&uBB@d@zo=@sCv--}Vpquq?m z9B2vK?rDDjQRqFTdJuoV?TsT8z)V6 zAXf)S!ZoebbEV+@AumJAKg_#x{pkqO>B31vEZmse**wd30vDEQ&Pjsz)LK6kgb)f@b|m?*davHV?Prq4rp8@6+S&%ld%Uv^8jQn4 zhESEBn#dizZX`7K<~iSjEqoBp*KxVASlwnosJCFrN5Wz1rYTfT1&*}Yb(n{43!3NM z8fZY6kGTexy%WPDwMMv*v8#5|PA&8CAqjSMF6em?m{{y}+7vwBzEzx5noQwsbytaV zPZy-651Y$)6^W{nM{Mk9pZ46RK?)d(X!||(T65)x8I{aZ^6bfvbA6qJO;o-iJn$2F z#{-I*M{kZ=-=v(=diBtNyp8oXSr;*$37nJ1WS<%lUeR&ouB_qA!H$II9*>uygGXtY zEctBaf!YhZoES*?dWs3^4&0b){lKXs#AU5)8GnNIopPZK3B9^KQ2~WE-x{phG~lDk zxpDgIb)b-x-ocqrUM0eUxK|~^GGE8Zk#X-9(ZQsP`jBI zq-0j$5VW9Bo!JFVW{qzNw0Yc#N$s4zFF1K={RKyMb{RQ?*BijoEfBd_!e{=hDhaW% zk8=K0SoQs&VjmmZ$pP5u{&C{RczB7UdW|*up^K7t6TR>H_pnLzBB$O7YC-m}t!?5) z7x9B_v?VS1u?-aiw@SMyqioWW!XDSpZtYRgONK1T#+i+E*qK2AE-Ec(pGJ}HT4`^< zs$?7eF30iGnEvE-na>D*F-imY&Mq?uHgJrPHc4Q$4L-!)Y#$N>h*bm&u2|`=KlC&= z-x+H8kwkn*c}$=89jzL9;isDU%21a5GEIg-O%GpCGm99e(VQBkw)K1L$843O{Zz*` z+3}8UPfLnAw6FDV`@quE$LP?7p={%7BA+!Vm7GRHlG~YG_dK(t}MS z(63h}7w*XJq}K&W;fGM%D*6zC#}8~y-vh=n#NPnFJ_)3PTzCaDOb)Tq#-kQ(zeMH$ z5{Z9B^9)r&0l`b_=Ic~3W9*(Mk^#m>#_XW-Fmkg`=-PYu4pCq{#he-|Tp$6WU zv_w%gRy%nDf4YA+TBnj#;B^T>P+)uxMR^-h$UhrlstbRo0B-|bu?(N&V213;4ekjx z+oYpvrjuzD62{F)y}FRFVgemCf5hWm&mrbh1s-JZoha7*2_nBx#KUXUx$O5;iNC*1 zQ2kT(v+!W30{?0~EAj1FKL%kO5vS|K4_S>`tmLyEXeK~c-(w+*>sSaF8z67TzUm7w z>7}zkQEBqCfa%^#533VpGWx~mc_=&${|);6^)!A70{P@P;Ms2x&z@w8obpQpJpur= z(ViHe)-)MOpzCNt+ksDRKn;28-;kg_I`0kWsT$ZO{a&{Sf-ALAZ<8B-FUaqaeLV(b z?}lCv(3ie;w&_ww`lx{&I&(fQAbWH|`~T@F$d$fza;%V*yj8;C>r_}DO%&nxQ&9ON zdDl(YT`I@<(9AwQ+jswYAKt^%s}pPQ3BPloCaqj+j-|t_hdaBw)jJ{6)mAT^-1{Vo3JQt04Qd>2_GAMJ0aOT9j*7 z3>BuXkZVjD`8FYM;l9}R4M%1kpIlXmx+ZQERq{9m{&|?W{s_h6Ddo2WFeWWJLc91extv#Bnfzn zIS)@xz)d>JtvIkmJh|{QXM6$`!CqB;^ND$nKF%jq74oaEpBPS_JE*aBG8rpOYWcMH z@b%Z9R^vpY7qTsqpID&MOCcM{TvG?=S(xE#WMLLj;I*7lfgRK;%3wu3p#9q9MH~|g zn%aFyESz(&H+=-K#X3<{rDsYWXBnL)_wLuwoawazJ%E)577%AIoyz>cdd?Qv+KbS< zZMLZdO`79cqqWN9n{MYH*`5#S6Wn|zqtpI!pt&@e>*_IW@L5Fe+Y@K#Yvdn%3@5<- z?az(B2UUYK6|=87Ab&?UB^2s7;>f*)v(5o6UH;Bgjk7&2T4YDJ%(S=7M?{Cs{BMU~ ze&F2?dd zKeCs+?e9XEc;_EcDVw&^Ik_OWFL9Lkv)t3X_HbaX{Bc&X&-dA#4~FcSC(AE)bGBYy zm%0}1r}1_Dp~ftSQeIF+xo@GGmlzbGlFHCz5Y z-$gvYc9S{I(rDtxx8PlqG^}W{VhX8SvP^D0396&N`9ciCefTcadVeK2s@vLy3W3?e zmVlVGD8D6B9lk5F33eZ5uREO~3C|*3NxShg&u>_Txm#RwYv#N*ie7mR=W+1S_tZC8 zhe>jKDJUjkt{^DJ`5@dYfzUW(qN{2ojA`SAz@0f=BWbZ#dOdeQ0a_-&n-8&;qPg$=zw4r%L=Sum z*(VXRp!w;JA-+~#<`A|iOEGqJXgGH5@Rze8o^TmC=25iXfUw{Jw|OLkW$|!D4;@l6 z_I9Y{TF`H?;IAMmxwTaK0u*(ktM^OGfx(?lVr;*`9Fb|Mogq1QoL_3NcQ`h*!4zUu+2_+tuR7WPYmwW%2&CY128eo0Y_F(vhExu(*I_9 z#9pu~w|RJu9M@7iQv>G;(7D@GULp-Wt-_}4WwIx1aL@c4=gYD@LR@>(NGrX&8D8U~ zS5huu-1^J>F@zrj%e|S?zP?n=rOgqjF}`vE`oS`RbNngJmnYxVmOCG9+w}Sbte2nD z|9EfxLX(8dKb@{@010TT|4GKnoV8;MPuy%DLsXRn;LZPyb?HN2jB~yH!p?kFoZ~QG zSF;?r>pQrUSsF22Tpa-y{|hUmH%5}d1h)-UFz4R+w<`443W#a9^xU(_$IH}Jmix!E z-&PLjPR#P=B=a@}8DYHUG?39HZR4v-a!VPqpg z($#WeBF3c=>waI#{4f6?1s|{&at!<%RiL32WK3~vXofrc1wAbr=QPo<%RzU z-PYuma4}3|PyRTHsLA`ymweTBjR`S#<>*Iyqew+mnp)2lk~YfK6yNC5u5E#Fv$6g1 z>E2rR>oj(GZ6^snASp8}U--wWoBAurPw~q?)VF#Bw{Yk*oPk3H!~7paUsdn0##EF* zvOGBGr1?Z(sdLP8!?!F<9tngkX+t=JM{>R9YPdTIZp}o$8NpInNYjs{=8zWiVX1+C z`NNPGUFVOJ%LkJCPSe2W6SS$G+7C$ts(S4-KY%|6B=18fFMFBzvz{$D;>g3ng14<$Kl0BWG0`DJr0OouU)7%U6PvsV zorCKT^VDT4`~*)Qm3ee(>}CnrFP3zK)xhQ~VoP`FG1(2_G1N0Bs$x>ZcEQ_eE8n+{-a=9AgRE~i)tyr)9`DUu7NZu-{}!8o+wgeqN(1T9p(pOkRYw zc?IIjKX-bojim>bI=9UHH45<2?Qao*nJxobPpjp^7mdg;!cR7tFD66uIniBVh-cIT zdf4k^v(|9IvxrRyp)_HxYg0DS7WEH|$TsHKy$42LUW^y_sqy{}+?A3kI+o|ntAE`i zJpVM-D|GmPS(Vzozn;>Amtxf6tkR{y`eustYz`y!Zx<2649II}UF-i}Ttq& z2$znme{=W=;WeMtS*WX&ULoF9;K>A)$7hk)r)MN$lK5@HwLp-+{q!yVCSh0prS>D| znJQ#{h<5H8<82CZ?4mV?ZcCykJ$P5k}Kt?$@?T01MVrtldDE|sW#_A+Tim~_v}sg{%2pknF0^WN4n z>r@P?9ds2jSsV!W=Z7W zbSk%j$IsW+0FjcLg7?bQo}Ug|3NJ+f8&F;QyY>3q7%tEC2pw3JO+71(qxnPDYB8^e zj|#iR(_Hf%!aMnbA(#iuVk@iz@K70z9!|J^zoXu6u{_->_qj26-=G3tT-i^B?_%cR zDs0P}$G{9X{|;Rlwy?SIUahlumg6XYVYR(2{8`u!Y-T?1PcX{LiiN*Q&pPq%bH!c(u0MHsSWQ6U0lIH zK!t|ES6(?@!>vu+9|Nrpup$UzO|sdZgUdx$WwRd&A+g>Y*N8laS%aUVgjAlg*SdLq zITSKem>b!sbvfF&XIxDD745mg#3m6=9>^Rh4rn=zuC-JNSW%+I)RJuyz|SKPvy|$! z$b4z@>%wzpJ;<2%sUDM~aiG#v2I${xmihmj&BDj6F|&K>1YV9(@vus8e-ajf$K|Yk zbRC%0>#`#Evp@_sKSclTXZ?>JLLQNLVRESXL}K@zJVr)w)KXa+;CwR#_?~CQQsGXr zIMt#sl=dCK6F-^Spr)}yFa_k0aq32TAEwH9b~c6KZHy~@s3SWl-IBd*W^zZtATuVv z;EA7JU#1WXUIkLjS{7%rIuvUPq;I%EGN)D9kG+al?jyO4f)VZ6U4T@YXR}gy^|H(@ zWw7K-Fu@h5Ly(5-#rYoE)!+x3ko*U|J$1m1*$=OOcc*sLJj=$NU=zn{hunY@P1fQ& zNSl22N!6Z!jOeK28039e$MUGm_kGVj4iflQqZi^Q;K9=OxP1<|%Cqc`9de=Dzi1Q7hs(c{*+TgR;C7)3-%@$pzU7IQarVbaonAU@=k7<-#OM%} zRqM9(Z#S}=U~4*NE%14^Rmb_Ov3)3ue__O{7|;A>bZ?JjEHLBuT zKPg*|`)<7uZK{9z^d((;+n<8DyPR~5b)iVo%rl!{HRyQgc9?!CG19*;-lDZM!^Z`E zUA`Hbuh+HOsvOuVbax){7r<2)H+8n1y z68s~&h$%?nP2+gAfv(VdqMT(#WL!~I5 z11zmZN@9fP?hSnqz{fL*sXT?(r|%7QXm~fCcbZvuy9=+GHh5G`xXC6Y>d7h|;eq}W zb`Vo$3>c&BWf87uG;HGOa+9qbN4qT%7aV3~DnC1o#?HE>d%`vPSf<+}k;p7m5=gkh zd=a~Q!t=3A?c*t~r(x7B7#b~5bNWYiU91*NzIpNXE%w#jK97S!z$#^zJ%>WoU)Xn2$h!sHa(3M3#WIrmyy)V zxUsg#Vup%gtK5Xsb=fa3@aJ8g&2D3!lTmm1w8dJzHdU0XWxnOayTvMQMSCacEmJE0 z^9Xa?qVr5r5%bSsjkrW4dvO(Bv_T{xK(l&O*rC@$(1aLVai(pC$KRUDut(sYr-ui> z==;xDBX+(K$2aA#;oQmNS3|V$!u@)X#x=71rYN>#ve6>jmt`pPuP;xW>{dulq z^hSAGqfXnY^rR6HhBs9 zVEj~L((EH}(kjdi&&O7gY#xwAe#pMdw%}|8stLv8w)Aq=C*Ef`oYs=iN!~fp4T6L?`!2bBQbwL z)Nm0@?q1{(RP59B?4NL(_RYBFGwM*x=IU=YB0B+-QG}+6y$f;^9ofg1oUCG*+ts+~ zGH1UBEn+pbCpXcVUMlULKV|p)>A*JB?wq~924i`lcfVo$kD4= zcTM)$z&h<4OsiOavD%G`wZ0ohfe1*Y-83^vP@=9Wrenfz#WPy37 z*5?>cXFGn?^Rl+NLK*UmMv0%2>3t5$b^om!@w4}*lb1htocHrI=1XoSZ3ephY%dbC zk_wk+Zup8l@?2d1#&IE#r-Jd7*68t9j?~Ljcl~b=_S>kZCnNql=x|E$`mJI+jQtMOT61Fyw z{*_ouPm!1l=PY((1siRvoZb-fiLot@(sOS`C?&fU<9@T?ecCrO~@1}h3Ou9M_pYigTs*IK7u z@!(D6A`Uci`r2bM=F;0<{x;&AZLrAu8p3+0Hu1_cNf@d(oQw3C_~`XW$L5PO9h4J( zjN_?f4BXzXklh4-tB+MCgKR88E`6!+0^8}EH#_Z(8zsEF#H9QSrh zX-oboC1v^-aY*97Z>`je`x^XjTI}U2heacu>&PEwUe7N}rw!8PV=0iW!?`{SFt-~8 z+K@^9L=C@v-kx<&>ELATEiQ;FLWu4vVM!y}iM-q{60_;Sg_&<0az9ENt+b#{$w%=Z z1$Hs7xdyy4>+eJ>qc6a&^j{s*2QT|9S(pn3a&j9B(!`kIKl2YT;wizI^|9AB?jTY& zUCd2xJr_HoA=0mj%`lWOO-#PnTA5FH?4c?>PIDBAzl%0;eC6M%q7+r10yu}efL5%k zf2flF6n@OkWx0$8pDev6!=^JlZt}q-&wFn)(7Fys!=1v~l*g>70z}v4K;h;(68>)e)D;_H6Xhu6 zy2zP5CIvQnU?LWU=aoLJi2EL(T)3`~Jo83noWDerxL)B~=KUlftfJa%`clyc(u71o z()AQui+(n9x-IBJdK?tOrb2Lhc$I&XCVwUIcxA$t&)mz&W&DbD^31KFvR;j11sgdC zQ0Mgm0HDq*4Ku4qWNEya_kI_{8-!p47jP()=x%4yj?STFTcS-2t5Ay9q$7Pd6P?6g)yJdt zyE;KB(kl-_^ulM2tY6jUwU91;+POU~;xJ`PeX$D7I#ZdaU4&BsXf>aYqrC8xH%iL$ z$L+%yu$J_}RvCk+s7!nKuY_jWTxiV=0Q@6?oN-Mvx_2FPMN3zPqn<@{&UI#< zs016csloa;`84$EZ1%#68{fGd#=TjQ?i5#(XK(n{-8Bs))hY^@v*nftA4?rgvy;GV zLKQ=z4F#+1a4QZ#{B(o0OVo2SO*dCnf7GE+&vDsiol(QXyB^ctF))c9k| z^gG@@14kqIk~lT}5cw)>Awfh4{E|o+A@{Ufco0IUmL8nDUQ&4!-q3Fn+1%-}SS;P- zAG8qB)6wXV!Fhvwuj-`<5V)Q&X5%)d0q#IZ*>tOM6C9~8tqYqjFL1iQdfVGo{B^^M zjqwUo!!f{`Cs);kVRhh{oaQAXxjW|vWU2q5cUn?}sX(bJ8sM}<4%}qJVCmH_h2#0u zRJ*kbC%O0)@8qhz54;yF?5FBoejc47XQyPQT-2SD$G$|~rA(!{ZxNLkb4lq~vJqRM_6DJ+M zS&yG(VF^&0OA>);wgTcDznxS=(>GOo@09JW=4H;v9wg~K)*1bDQkkQd^?e;=OOI|5 zk)8WCY)5D~euK1CYu*7Q=!)~meke@ry|(%kMrXu#7b|!rSdpE01R2Xfl~nmjHN3%* zR&Y%4*^ zw<`Oc6y-H0OK*!N1tgNk3=T~l2`-9&fz}hXU&k9`^&6{sMX-@Usl=q61df6(g?88d zIB*e;FdQl04U0=c4!J2IZiZl4(*-q`>db;q<7E#ap6p;G-MmtzH{+Mvn|%kU0I56( zO)$31kDnj}3R4NfSxhiy3Bhkyovr~49*40lWt#392`3ooup>vna4Fk~G<3+d zVHzs8BtAyL=R{|~5FI2Hxronn{N;_XzT{JFLjy@{5!4E|hAv~qW_v$Q?ibY%Cpn?6 zxCO2v3;MTHw7w-0L&@WENA5}DZQrC{n2%Q9k`Jwk5Kd~)=D~MUqVgP#4Hz#TmT6`S<6&(}+N}n9ISU)ID#@86C+jB?lNbEBzsT@_(rK|ZN^6GX7Q&FkofXuQL#D}P?l zM)Q}_ z^9=9i7Q~Sz^V2Y`HL<#7$4|;AER!F4!l${c_C7>$)RttY58Hld(Wt*wzh41yH(1TqM~$&fE1+(N{2-0N{NV4q(r25 zkzNv1s`TC=nynh&Bu8g(jDp|*Mp4TG)ocy+SDP2u}tq`5U5--Uopj85M_x=_#5M*k^Ba1|6bySNikJiCo_9 zRNbP~W_$1}jR@KLLn1kPnO|^aw>AiCm=NfO8UzXx7wJuMJEeh@ivS7}Z=oQon8={N zr4r3GR3K4u50sg~5WeW|qWK1*a<_qh22$DS@OaAwtFO{UYudl{JdrekushvZxAmv8AYY&NzR2vclYJeZdpSrJcQ* zX5u=XBYdtBYU74SMbCg|p)->ONc#oYM|1=-V-^T(IIRe^EM45FcAS~+dDFPwv9mzH z&$w&Ox+2S09Q7Y&<*#JszwVzrFm-oKpU#NS@U9HqlZ4{taK^F?wgqL0tW@`T-p!Z4 zUCSJkk(oh&MeOJ9WxT2P+}{0p2odSCpIb`bsb!OK!e>;(xYan)x{Bz{dVWOj7O&Jg zl1G15Yw#oxUYXbPRyobUG6$DE`)qcwm$p(+wF`9Hq zn2qK3iMHBKy@#9iDgT`&oe{_Bd1=z}55#ZQ_omaEI^IGLSitjl?3Sa-pNtCh+d4w> z)?EiC2bbt@{X#&-QEs>5YkqX>*C)TUz6e;NLqDu?M3wsq@q#vgRhnOm(-?BP^E|YU z9m8q2pt-eO;d$&Y;`)7W48j=k-Q!O^*Ml2nTX*4A-Pg4u<`j<`hNf5PJwfB!aC4 z+YvoeLmH0Yw%SpUJtGseH(l@Ujb5HgH*mLG_~es7!zLKAlRMle6F(8$%~&^kqB!6} z?##|}QLxvuE?fWH2;JZ(X_U3gIV&G2HHV!Z%k$cRYrY!T{9Al&{bbnTtCjdKGxAqY zLYfHVV*x*<`CSt7)ncfmK#{Z9xL@X%K{s8>8XNazN>pFeL>S%sbNuFa-D=(U>h{hi zHv10=1LTJsWo$;Y7fN`|7h7+D%0CGgvfhbnP+Ff=<=*4t4?k8tImfe~Z2oCmE6{cu z5xO+A1$Ecgfc9 z%u=Oa#xUjEzboYIa^-YgH+F6#-Liha3~JcBXTdseDjB%6v!BPy#*;rYWUg%P{cWD+ ztBw86evA@Rigx~6lXRRpHoNInmf$LG)AhJRWL>Kl{djYdw}PMHG-^ogy;geR!-S{7 zE@FyC!smTOLIOj>;2nKT#GZvNlAR7wLFp4@H5L#F`P~{3I2S=UsTLf0I3_@WUoGzYyOcx~hG{q^g zm+XABW7h9o?QWPPl?MeBWh@-T>bHO{@An}qHh%x8mOe97HFzeTTb(0HAO2mWzHKnK z5J0Tia-uY{VePf`>-9qLk740QHTK=gX>R!fEQ#z=n)*ui4~5Mq%E`MZdt8re^Hvn; zeifxLOMIgUfL_dG3LOU=#x&Dx%7*vkRVleCH5s!XiIT>&ftGyBO^y10krEUs>D!=B z$Dh#BCz;p}gp@jGwwXsVfOih**pc3Yb%nyGntH!3daCCl>CEvfKEljH!%cE|#l=ve z?#&_VQDi1KP_c^XXKco^SGH?kd6`tR%SK0cYfQrcr3>d)Vi{!>X_R*c?R)QVz^9k` zT8?5LIqdsPD+5oeLN(%!9BE(^PLPE{7!S+S8pk4sNV85I;K5L3W89u=iFDx!oPsjy z*3VakEC1bjUfHOd$@RmXpBQi7+V_?*$+DJhKMvSD1t#MloMm(ZD)@?q`crPzTO#Yx z?0`01s42eqVM*)Ki)Nt%DGTELL$%YRtIa*aFN}UB);CM4El7nAeQl^6zXp+vc><%v zD-hT13Gd*$gX`AqQ@+0p0Yvw9a?u9j;9k)#s3&B=cS}7%LJ@~zY?MCgkD`!!?m8N) zY+Wq7KU|5|Hpx{YAFE5;()4OyH$HRL2X#ewN6y06sFlQOt_^bGDYMd~bE<4^iBp1! znoNK3+cSti3HK)0&dQu^dn1|(eK{&;P)>WbzQDdzOVj$o>W z+?*Jjz+T$?0*#6L|MG$zXNIp594z~{KedfW?TM~7IQE^#;}fituoHXD;CpDvoVt@o z?!pkn4twgC!)9}QhuRyvkK1(^mO*ecC}q9(3FU=H>L37N33oT#+>L+m^}vV`{mq!2 z%$BCLO^5O+Y}=I&RnwEgTDjT2jgFDsu`k#9%CfNef)ACK-%1tplPlfxM_kJFE5+H=s{@q-I0l&DLV9`m> zoavfye0QP9pJ(IZ5%;x_k#D)^Ttls5r;|1WmPJ0o6YGw~R-HCEr*zJotU(#sNHpYP zh1RjZ)cf=-@semOvEEWmn2zEEdbXXNAMM+e={nfSx``dcogYU-NB&&$sK-$|AyrNX z54)K0%!hYZ4I1WwpN7)IEfha+;1!tsyeQQ7XsRwBk7;eaOC3 zD`NQ~^|~|2;cn33p|`PCniI>PeWAdE1HhSEz&oG^qm-&JJHGLJd0d&o*OFq4=e!9( zW%|^_sP^_emBDZ?Aa*E7-y@pL4G{#|MdX6**!G5H)Q^yw~zihUUqV74r3PGn2%qTE|1J#K|gWL)&ReTMZf1R$&`UPn*z7M^L{V z;(2eZU7MA$c+h)FZoIzkmO|5NHuqv)=|TVA%@h-d3hCB83CNvSy&+ldNqKn42m z%qrYq;264ZG3bQ|STR&FybSL|KlN~a$4$`Ui8*As1?Qw>5`r?D{O%| zIsGE(-z?yn(M8?-XelxpjNlE^+U--)Ep!ol;HhIi8zoDx`-wf2qH+mw+n8HO;4g@6 zH(furh)Vdr3446cfx8@kr<#9c2GsVmeOp6vd}1>p7H#y5cgO-I(DhoXdpKwhdNKt1 zoLv^)*^^n{gNwLJzlz`u*BC>InXrR&Ts)zq;sT($Dbkqg1O;Y@G&*{@*>v|_!-J!~ z^@3n{t|_(32=7*GwUYj5@a+{519lObGchGnore!6&6((-2QYkj<95Z6s|fFp*(%N6 zF}>ja$ACF~0F`sfbk65T=nCEpV9O&re~$QESDp|qzhbqd*N6hJt9Hb?Q=1!bLN-DG zMP3o5>kQRyp<5fFMVX$vR|Pq`EEnCz%XEkkhz!;~X);qSBS5BMLz8n5)-A z!Jvw*W%Br!u&uid#38|eEU;c-(s~}iQ0Ohw%cAh6uNNj}p>C=w1L*!G9cY)f=|+|O zsk_cJ_!x&+j#6tY`&hci%Ni3=nF5$fEJpK+Sz{!d|FRVWvF-{#V0o4U>X`ZX_{F;A zMjzla&*JkgED2^Q>9(w)?r4%v#PXU(*NiUlOmCmb`WxhQDzC{gwSiTpodd- z7z#eF-z#uUWp?IeO|=QbI=7YYz-<*$VMUd0)(1J0KU>G7pPk3PFPucAIIpsd0=9?V zZ3PvvV7 z2__EM1H%^xu27Ma{1YnAiz%@fPum?rJ-IRNypRx{LQ5PuYdCoz6Rokh=Z{Ekcf)>d zTHw4M1o^edAm<+C9-&=Qs)AGj`ybxpG0OkQ(04bmck8AKr=xMxs$iCPi}%@Vx0*_m zU4{UJYv6N=HR~HlR$`Wu)%!gZjfyBQ_sLnNQ#K;9m-@0lifldx6yZO7o%BMXbpnX&C9T~b(A~F}K8wf)BPd$-b~bA{ zc8IC)(!JxVZR2q=S+QTUME-z*CTXSgB-O{e&~HQN`DtziP^PaLzjPWS(=Xjau8W`I+2;{5^3SwIAaQGGw^nA5i{r*vUTiLD0O4qRUUF# zanP;r#U7ofMJY?a`Fzz~^npwN9=9KHu+%QK>am(>%wC~8q|#@8e3QR7m$vjg6^kAp z^008CH#waJC;9-Jpl}WxPaN<@?2`o;8R0h0^BoUDFDR?AiX{W=*fPYIjEaqD9MAQ> z=1-c1VLH=QNQj@XJrbqhj8O;U=HM)iE2C z#e!)*Tl>eZ;bP=2n?iYmJ8{Y^^_aBzM9-|{O#Cl*F-+B-$oRB%KjV9|yrHw$9?ek1 zu_LpQ7ywp}rud6lVz;IY>@14u|ue87%&~I;g!26=xG~Cuj{SvUD z)^D&Ow6-#^xGTw@X52C+_DWrN%Ccd-U8te1^=h!bbT8p8Z)8v_^eBtIT8F{c5m(t35z^+hv zMz%M9`ji^rzc}fklkxmzJaXCoH(w6*i)=785y#5rKJyWF@4Z~Iy?787d54ggeyj4V z`L*#3LvLR>XUoSsaM=V0r6m7n8B>z7_REMJQ)0N$w5&$9aD?$OW>v-*)yStaq;!$O z*}OH?keHF{v8hXFlG^&jr@@UsLggYnhp4|V&Qx`9^l_yju-5kysgAPq?V9rdd~hES zV-30Z3L(UcFE0Xs7~~a~V|?>a_7UVk#S-qiLQEI(X5c-2-xV!CU3;TA{x@tGtWVf@ zs8IA*kv{-jCQrnH%3ZV+>~GB?mCm2(&hOcvtQUZ6wt42r-g(W-veu+;2~9gzvuH*W z{2c?-klSMb*FR5KHCEz8F7W+KzD(eS)i8F-no6U~b}r9aJg_9PrTm`LD0{#wb9?NgRZpQYG`#6 z!YKGDd8qF;9n(prXN%ooOhR~LTL?$e{-Sd@pO321Un@a3_(#Fr*tVAbtqSDY((5<$ z=+u(FmzO00cH8T*cBU*FKZ7@J<(GipER;T^#lt3jUqKBzIC{sb<(x+KSiYAFAKK1A zKSnMj!6KPiGTH4qrWsr(%A-lHV|9Tm*0&@id=Xt{8g=Xodvq$l+2HOUj@3Dlhm+*Z z3^}AK_LT1#*-f2~DkP)%LMdfF<1$BgA@GA(SWA%yn)ic>}f6=>~*{%NU0Fvj1xozY3<5xdjlC28lDnpNVXRn&-vHF zA+@)vVgk8us|{;nG!HE6>v~6=Iu$DXJuvEKiB?+^A^C=RRGxd@4_pHt1O@!fn$0(A zJ5AF%XMV2U&eD=Bx7+pXx!0+zygD$@hfA|qWx3zF?rmbchJ6kOCwmm2TcKjSm|<2{ z!4Z3Ua9(WxVv8YS&FZV%p&zX!SjgW&s0aJ`Wioc2TgE9^1${ zXPfQQotdTQuRu(058u@aqgaIb7PW6Gj+{_FUFK}dG3|=|3zaRp_3d>so00Y|{^Ijr zYa=9&B$c3(-J%XZd{F7AGQOv_ku9|K60@_l;%->$ia43R2j$Wg(r7+=0urpz# zc*SuFMl2}So~e|n*_)MyA`7Nkr}!;OQEZKNluE^C9SG382Mk;MYsq7$OZGEz&6z*L zkrff5SabHVy@8XK)7oHdo=N?oasf`(+~K}x&YL@8T`2&k3gFpB#f#wx^XuL3EzX$5 zDzi!Hc~0Yoreb8Ge@R0Jx98tq@i&$8ed)z>W5LgzXq8>&{$7bQ-%+4*{U9tS{IQk7 zGpPw>d-C`?m-;D(wfw6gMSIeO;>x4rEG+%aSaHIRyx4#9Zw`TZn(9ziUpX%Q}dvK^h z!K0;A3>eIo{i*z-nOupRmU9CqO>sSf6-U~TtCPF9coMC!gdOK=(IH_Iw`Ohch&N8CA?)|Ne-8{U0 z>tkn^6_-zf9M!CJL{&OIM(}t<*FP|kc@iRs{(4&lc=|!~2y>9ds$bO zgWk12=Y};ixc!=#y=}81Ty8&NsF@C(#T?kb(A{us6MAGpTBXnJ>@cyg{8qvk^;I9X zte>L0PK~A;Lkq*hCQ#-+ayq7o>Q@)!(+e@T9y2?-kS$x@6@Q~qTQwI|!0MSw5)#vt zA&NP~L?u+b)r7+sWELU=jKl$$uDy>lqGWEFdk2T`S$G4^iS?kDOAvaO!| z#B&o6X^p82e+8CSb=v71Gd^#W!-{o?RjKYFxip!ge4crE1e<=SK>O|{I|uAM{ls3X zMLYC+YTNzryCd52=T`P4z_IZ)r- zb!7er>c?!}s<|03lxs6PJZ$Z>uaA)zP|y%ne$~vX8mUEUk&GfeRH*Nz$xcFSjt%in z2j`P45e@)!YX?i)p4^;lY7($RXM3b0BlQU1pxM}T;_PdDcH-2h6l?tX33R?H> zYkfZZyXS=Hhj*jcQQ3)llKX@QQAT*z-ZN_}$hkn)8Pw6EBX06==_%V-^^0%F{`x1= zJpKAE_QPbng|L%)hsW%c_%a-FlI^VXbg(=CCtuwhVb8fDlcvsa-nP|q zs?4jc&ANS{n02zsi^Yx7P9@|9Q=1d(C3sC!a5&Mu_S%B)3JEHDvO57tkDe%xaYtgM zTk(DKFOdDAA2sB>+z0oO#y%$O=ap@yj@(+mO-F@K)kUMplJDV?Vq{Mw5A&%x>OyNN zX2i!m7p{9M#;LJ9%s#bIxc}p=*Ql0e3=s1!qtm`HP%L_+mo=)A*17!WKnT&7aHc}EVPR9Tq% zoLUl{9>^&#!GyUEEbis1@RGKvWGoS+X>gHTEB=H;`}-{Z*-cN5{R!G~Us--fC;0RJ zrZH^T&|{kg=`NSm*1^5_A}bt;RuV&}{#kAX;gO!r2Cp7-RlIUz!}Hvv_Z}Ul-wZiA z;jTXUWljhi3ZTtH`ZQh+e4Jzms>6S?6?eI*)oexo=e{lzZY4Vr!;w_=U2dn0kvT(E z`bOXTSzpnOztTUr)9r$*#g;DK(kiutVa=Z{U6@16NtxyshR%P{s*?3FjAS6*T>K-O&S# zT4O{D+@&qWU#ZPxu~xipp=9iD_TFp^LfWeabgx>?M&@_}c+2&^Q6UAg5+0=C9~PIn zvg{r}Ku4~wT$$I7t**J`v*Y|C}%lm$s=JO zRoo3e005-8FtrUhJC)*5A7Tf9+`4htU*uWE z7AZSMyrw)A_hZ|CQ<_7r{p8{!N3}>@LqhT{EvZ0#G@JCPgf3;%sa~`DNST7Pc#8>U z^WynW-hFupjy$Apb6RVH^VQ+lU_niLhUqbz)WN;%9{GWA%T# z6o)o}%FYa!x^@T`zg-5RjJ3f?s(!|^XGTxekyIAF`hR^C858r{m&N2uZbieABO0fM(38j~uzGeNlPCzWI*H_OUBxi*Lf0qh_Oy%*OM57dxEHSmKV* zQf=p*$!*x$`h+=|gG`9ltnake+D6^-TUyG=yEXfDRt2EV8+nwWe7c|Nzi-1!)?#|x z4t~CH-|o#TwyPqvUJ3?8KbO7Z)8MaC7W?eC=CpNUZd4?);I}TI-Ou=TjcoH#@lm6f z5|2`|E6;SYipcGs1N&bbkoNj+EYM*Fjis0UhhgPrVNMM+JlTG{1QX9L!i5LZvNOAg zPK9TMkBqQDUZu9L+r$1B;h;M<+XJuE6;Pgu+P?FR>ckY114W9Pyp<`q{FY(OmM`<= zH1#{$g)&iR#=B+Bh93Q%{idHIbKVH~_A;>(!3OI910$sI9pI@?lz}}}tG|^RoljYJ z2I_{nC|a8y9~~k8gky<}v(i8IA_|PAJExTBfYRp=pyX-au8_T{<{c#baQ=K;F{s`w zj<@166?0&OblJ>4`4%=(#}Qku!S}P26k;rs{fb}Lt!{M)Yq#@MoC)fpHXORe`*w-U zA(tb2bc|-%rVrLi-EVJKPmfIVSaRG0%`VQ!LxzRR>oQ+1XfZtWAyY0}t0JC9?vsm4 zFGWh9W~YjTkW?-}-zdlNRTzM{6sg`NZtBLuRCs_m71ddZykq9#Ojxb$9xM}w2O8cy z*TT^O=N(6QFFw%FWpWu^b~V$$O61#&u~|5SQz?VfmGVW>`fux6qdkto&GF%7szAoA z3i}Zsb^Tdq6EH9}Ls#*pj(ki!QP!NhMG1DR*OaR%_>lLU!yeNjhc#k}E4J~=O=iI~ z#>c1N@9Oki9$+4@5;=TH1CSzV-CY*U?9RVxbT&Ue_+%v`*)RN^9+uTFZ43GRj&rG{ zN0>9bYQ|Y;U5i!7`hxO(4g_R4Y6v(|(#G5iQtOHqp-H5An4O9(By#QyO07j)1zex% za?W@Kb+09kABU!?)!iVN3Nh?hwouq7efsY88G7QGbiBIxhG$%gM3)-;pz&9T&pI7 zzFiDci%R?gx3hHb<$zL%2lSgmo_`qcv~75JW-sZV5FRaDu8PuMg^BycqxGt#4X5t8F%7Dn)IlN7}x(o^x> zhu*~5-&s)DpL%+x6au}_PR_e0_cC;RR0V9z=>qSNjfyNK-=IrAR;;2nY9qab&#GvP zZeXK+^t|Ui40S1usF*Httq|2tuwpCcbIWZ`E#u42OTu?$;nn$0NK1ykyNXB3t*+t` zrK@;EV44(#{6xy9U>{ zg?3w+>zwIWOx+NliQhY{S88e-7>$<`{%-`a+W5$;vt<=C?e+*aQpWA}<@VQg6TiKM z&4*0Cvqw4XD`4*$c)pmfdcH@Aw?9qu@3Dm-tsxDO3&uH(iyy+%n@cK}<}_YK7X4Hc ze`U1#)yMci>IZUzD~}kq*AtnyMra)8mIqFFcQwY`14K-#G2>I@N>AbE-C>K5;!SaX zm*q-5nsqX4zDs+9u0As?mP;-5%jZ8|%)v@KQ z4O~O}XmwUMfJzr-gYe8_aS9azWkX)w3&|Trf6!NTh@5^PKmQ?3R`M18q2?~UWb_uT zHQ1BBJ=!6?tih#s9=K-%>h$JW)H?d~z>eO%S+Zk-K~`6uS=Ib*MgaB2V^epZwHUb@ zvEm~_GkaA9G;S?>3+gCn+iuuw-!l{38qOr4^xBd@m7aCmuGI~%j^g9=GVh-ZFsT(A zh?*u!PCM;Z=f;8I@7>eA;qUM0oJgi*XdV&Pwflj6I#ZmlM7$5D-Z<#onL}s%P$0|j z^h23AYOd7tZ`sf#`J=S$JEpke5nkgSjj$kPXJ8Sk@Ww0ztS4{P797rL?X9@20; zU;t^bOFillvqH63BJZZ&TJZdU#6K+Y*~!T>BrS<|xSa^StGmsuaA*VpdJ@qtk7AuI z=`lf1%;lGz0e=uUgyCc9=SN|2k2Lgr+we;>zh|uo4;*0l<1>fq;V{QUB#iA;|ASqKYL0UEM#f;kq2L^>-zk+ zC!7RNl;Vco=2U1E&|lI={KyfBx*ddKINRLw765F6ZSC$(aMvr;78yxlW$1R{pL}f? zTz#2n`>fiCbi2Y8+!%{CVtt-=POc3sj-7WFl0VES=QRs9hCHcLWb9Kn$b0GP!0iK(piH&5RV`z|6S(W;fAh!hkSbJCM6eSsa|;hz?kD zaa$gW@K60crec3x?|INs;xjt$b|adf&GdbT%Z~=qC&@5DACk2_=?q}8fKU6@wbljzbBjrwrd-b!Qaz;#`_PvR zv`Nk9#Rp*}B7YvJNSNOHQ+Fk@sAPjIg{rC&bROMuiPZlc%8I9a8Zs6Q^9Zj-+_v4XL*}x~aE!FtomAG1Vg~|KDiBTkN9yU+d!2Y4#cU zc@hiiFt~>HD`*Q3%3$+XU*e~i&d|RJCjSF!*`QA^FFe|bd3NcW zM_MzOc`6clRqS6Pn*2F{4}VmLdqN-iM*2E*tq2*v>D9|V>INH{izjDWgSM>>*n)Ey z%p5+0UfEX<{U~CNkXN2l$!g-{uRQwQ%zqg%@f24UbC>a z<4S)Wi;5#jSGo@>Q^-N0G4snVKB_fy)^3uEum<2_ROzaVyc5Qi?Th-g+0<}u43a3b zf&;224CQXnuQh+XLunB4U8&e^^p;0w%zhXItT^*qb{}n`4cxh2IMJkh80ueJP&)9Q zm%p;paXVP4od0;vUrD=P|7b>nej?Pk9Nk==zh&cxC6U;u8zn)%Bj43rZpFpKHpt&H zgko24Dh>K351lQzhhpta6m1Z#PIeq7LNW?bW3d5U2gJD0BD0NL<| z-Ecb+{id<#eHT){ra$#q*d6 zdQXBLc^qVmzg?1F<6v8>RMDxP`dBL7-1mA_s97Q>F(V97tSzovtxjXi~ww)D-TlNHCmkX97h z)~&Yv^C5OjKIIk{q^{sUj20qfLCuuJw_@ZTpj$g-czujVLoq7$Al3}AcPz(Q#EQo5 zJTHKR=Z=c~PTyf(5~Yy%%i_jVFh6F^ogI@ zpArvZm!YP(*GAtsddp-alU!ckp{cnT@r)5A-eDij5I3Mw`T4GEcacB(6R#5{z!YOz zPH6pxer4Rqr(I`w@`5c(pQ1?G4MG1<=5sc$_`jIOJykDq&xk?7jzYvFI3u)>{&Ts} z#9x+F0@;)eVBtpL3Ome?O|fDBxu?Zfl-o^SHsn)|ME~hVu98Vt$g>=^c84D9y|hdW zo@?c)Qm}t*XrHi`?7`L|v-w*ZYT_QcSzy_=%fb?QX?zh>VsVQ|(GX-MU%Brsv~)ZG zMl87+F?cmP95fwQ8~A{YDKeT8BpFMXVy-W#G<)_U7--Ip4y&ERT)`VGkqt$Zglu~cj1n(zKfw#4~Oh4AN3X)B$eTI8AI{(G-GISG##rS zaEY#q*IV@TOS{k#Llc&*Q59AeJ?R=1m56(v06L2W5vr) znrkDgwZWZ$xv;6D&ed8~*C~tL(9!JFnZg5=N#qD`TF~f98f$6lNJt3(rvw|upFuH;U@ex`8CUBkbNKH zsUKNKv$L6L`TX+pZrg=KjEeb}q%Nn=&x#{iCF{oZ}6~?p7L`J%RX> zhA}5n<)}!YOP>n$0G#SB=TvsjnGKoFxeAec4{)Xa-m~1?_>)yw9DV&IA16 zU&@s?t$Cf|k!BG;h(+1ez_^-=2h|hv?fPP@xy?9SZ&ClND~oS11x$~D^q%D_MXW<7l_S>}Z5}dZKZzr`sNOE33BGwa;7N|74g+tyAi*#>_jae zeqob?YGrSHg8jO$0*Kzb`oQQ-g6f67i*VBzq)man?=Ej~nH>dB&PAZ(&^7+b(bq8D z=Duxt{qAh{YXuIr&Xu27n@9aWe4f7t?bGzTHFOj;BcoY>Z5Hq_}#MgiyZqpXwAw?8f~z zG?VZc$Y*WPwvad;uK9n#AJawJ_x9bDZb=iIxj`q{l9lk~Bj2^^a-*R> zkx{?z!sj4f49y^#?QD$swsL(O4`%+niT9DiU&<3-hGApdp_C1le?^iKXq{^?_boAwg=&*Hk|{;?hm8v*4qb%AdA)FEoLhjMg~n-~WXIS(pzOA*%3 z8MY{*+3)O)rRONj)1}JWxH{P~@x#+2LjCeFp{<&_=3Dv(%grhzEOl~A0~s)nbQm*$ z$e3#ZH(htG4H>JkUbs)m++yU7V~5DBj`bl2MS9;(|3eGJBVtZUq1 znm-)h-{hA37o!Ww{SNmUti9w!&o?!u+&zts};go}iD= zvIje_S$wH-t>C&UDvg|%YDF_DX9QkO1a{gL5wu3w8dIwrBSY3+)o8L%ss zX8E2^dqukUs7QAwa%7Nvxa7khj#CyX3V;v7WqvyhK4JT7EYz+3E={fF;z=_fZO`lC zREYcU_KM*ziKY9Y%~IEm72URZX+|~;YWOmFoSIj)s2psb@;q3tFSd2KdM`iX`L53* zk`N|xG1_W28&qeV?+y=if{}h!dVD>y9lr`p-Z^s|NaLo&@+#Ix@2-iWMIx*9x%vn{ zp1DtZXTwRg-ERkuErF?X3x?H%J*Cs%wcO7HHxqeIzcdb$C|Qh|GZdykjIcaYgN*?W z^?~MkEFv$FLaH*@e3BIXY4x<`^(!%l?kyX-taJ_Z>Y+Q6fZBvIz}~Egq(jq8d-TFt zl%qsQUlpyP{Kv?F%toCxPJfVCS0r7a9R)mP)Ymhk3x7+0Nl`xFYVB$f5Z`s>8K3?k z;83?0i32$7+rNn15T=)S*6Q=W2}!fAC3Zoo>Xcu+vS;tlJ&*lLN|1v{3G%S1t1bXm z`t-s<%26W&JA@?|xaE{f#(KI@!T0{Y%A8{j)prm^rdaS|W6R+4q~j9W?o5#8a$#c_!#%pbA=|wYK-&#g>sb{tqZgYO}CVBY$9) zeT78KNbxJPTHX8V{7HuwVfOv^{GBAvN6s6dg_r&YF`Q_0$uQw($) z`S!2mJf7=ViXoYt?cCRUHrCH=T2u+xh`U$OljN1BJlFj0H@7R16Ma{x^#s#UniQF= zy+deHH5H*Vi9UAL3(NIPuLwL0eV~nL80Im|$}pURvh#dp2vSRlG_tbzN0cfKyxW~h zlr$8L2qVec2TXHmErWFreIG8f>z^3*90|_!OSJhIq77=ij6VkN1zFph8bf*)+Mniy zaff)%1~i^X?mR3J4G;;A+@yVDup^iDu3f8}f_|krwn^9G$`wYFT;WdtdR#zDpmfyt z@UjhSjt9^fV}HzT>z#%KJL9&TY^tR}~HpN<74Lr_z#i3u|F@xR`0Ko|+4%A(R~y1PTRk(u@X7{ZEOndMe= zObu;WZkounwB4sI8;7+F%cbCVLXsVLoes;Pq;+^U%b`IHy^I%AE6;~l;N@-ORnk=+ zr{znnfc<{g9@?#XNxgHW8%uWs)c$X#_{!&PfkA3QVeHhY$H{{VtiZj}cv7-+f6-56 zVy~(P|86JckBDgYmaQek%6w_*zseB?ZNg^MTZOL5vP{wjZm?epZz_3R%6X!dHJcy{ zNLwr?eA+`?Ht(lbp5xSy>0`Y)L|?g#`4fgILBZM{M=3X)t5^ZYfC3BQfXkaHb!g1q zOaQTaZ>r)K~5!L)3rW$He*S*Onxh{-%aD<*9k7dau?pM&Nas8nRigw4=$#BR~Vm zc+DtyK}$}*=5Hh~Ow+P;3m@_9wrj8j#~;4&HPQ7+>aij6fuvnVC_ zzf}RDI4(Ex)M1+H7f#jsw)cZe|8%RhW&i#5gLLRp6xOhPm)sA2UyhX`)reg5mQ!Tk zbz81Ta0@N8_~oS>vv^6nBKG!|1#V*yUGuS8GU_E;W68FBByz^5??eYXsN6-ln(5=S za~ofaWdBD_zAA0RvkM}i#>ES3Nj_(BPDgF&$k!2vuXsuNVPsrXgePId|CqO^#ZE+@ zsv)_o`Ft_i_@jc>6&o|XOphc@h~{EhGLqA`c=uF_Xz6pX_8cJQ-^7j z?ihd58t`&5Q9QwxeIG6#tz;mfvPJkb16y`c)x|UM3>rAE-yllx<(&mBU5pEDU5Eln z$0R`#Vy1>7@soFUZ^sl=GSr#?l}R#~lGO*I9>NcileK5_UyG5*@8>XkxlL$8u!85= z(k7~W#XUpv^UUO6bf0@-Cu*5u+qL*T8AsB&`+CIwP|o6{K*#-<8D zGIwVMNW1&j)RkH2Q<^}2);E^R{q@wzPw+-H{F}LE?xl6#(i3-~n4;O@Q%;}7nQ!M+ zxs<@yGnO1*NY3uq|GTq$W=oxrYx5t91gZ~~U%`~Cdt-goW;Ut^#dB{0so4c{QV0ws zaWqu7F~iC`QOJ*E=x!y#zu|Z4`MM%|er2MAORrZxawEkDq z6~>scAvDTY85ziVv{>!{nq2pq?>NyXv<2K6V~1Dq2&lQ8Xn~p4Mgs$m4Nyn}?UEAT z27Hkr+qu&TxV{xoBRERALy43~_nDlWM<(qD6*)pr(zHnyH%OGNiYc39ar^$q;=byH z{(p40@0ISpxYFIVB-8m{-Axk&O7U%TB*EP15>ct3G74y8*^U5-Pu}qTbkW%iTWtdk zK_&&x6_Z^>xUDmLgk!cc3n7D@vLU22C_-qu99H*#XnW7Frq*t4bh*%lN{NC}q=^WK zGy_N{s7RBhA_CHcP(*r_9+4&z2)#&?A|NgFUZjQ|I-yH%p$7;OvaDJ?H%D)%%!*HwG`nGpJ_-1=k;(kkQp|IF^tM2hqRT4?7{+p!D`%jV<^Z!cHrgD%-T2wMBVxVz3=f6qX)bg8j41b3> z8Wn%`=SQ`s1A;9EDasEb+|{nz&=w{J742DSoQdj0pWd0XS+^=3?d-A!&q$iQ zz&`U9GafL*u0a80^nOj{xy2NcTPP}y1oEQ4vGGqV896Xlw?}~guPIWvF{7E!z|s*# zt5IsMs{QAKg3ss_aIdVQ*rJ6E|8J5u3q6sA)UK?0PUN00wun;G#g@N!yUsX5XG*7= zFd~3W%P~%W= znf0$1Yu9x1jYbNu{9;&3rK>nznK!Kd7tdNKnOg2GJrapHXpPrVpdC#u@`>Oy7NZ@FW2;kA89BWt zqps8VJPi!s;#tY90T$-XfT$ymQF4kw>T=`e6J4VXN%Eu-b2U-PEJ|agk^Y#}vqjot z9oQRa)caeB3g`I-)jL=c)}>C!PaCzPgudFJ`x8Q}uhb@xF6zCpr~?U1i5?)W+-EXOSh5tphVEEdnY^!Q)u|eJYLRX4XcbR{lU-NFJ=aXf8Yy6q(G#x#9fyI)$ z63B`BN!JCEHJmW8;yx8E?f#&B^3TQ$r@$S)j%VKf<8p%!J+fpJL9M&+iU{Ia42-~^p+~3@4N2VJC3ikI1&SkTQ#l2?eQ)*n74~b&8$@|StSh> zTiY4SwcF5^9Go};I8?-Lr=IO&d}%#3Ky57-Vl%dqR~Iht5ATt~QEWZfeJIOWX{}c5K+F6rSbZp#7*QU2jW-OJy^oE3Ce6(z4W`TI+J z?x9gXk%N5pqFq*c^>MlF8}gF^{G^1U(6CxQ>Rc8&JrqXFr(1E zu2>SgWPQtu14_~|<^I-gzwZH3m0Z6?hmG+WOsZ`GMl#x zD_T#u{n@JmE1p*O81y)KzoqUnCkxT(DXs>ANs8{596bY>+c^|86=WG0#|aa62eD)FW&*rmh>X>37q;OYboz;nOH4))>$P4bFW#9RjY&WcpH7T%5>f8d{e znMYD@+fdeovH~9hcRie|zLBKe)LDQovJvxLEw7{wUTKc+rS`ujDss{F2ceS@X7^nK z+w8?Lm~_$Aa&O%!CPQL`pmORZX!NtGsLa5960c&dClaU0Ee@C29Ma$LmTgsT@nIEx zF;LGiOE;+Lli&E%F|x7G8@x!bjBdU^2YQW0@?wcew zzw+lIk}69vh$0twT0r#_4W#sFT|13#_2~y1uF*Fi8fqlWE{%tH?Um+Bxk?O0%$iwa zpU9#bY?qpL#BVcf0qoGmYc5qk(IZ)hvy}mV%UEv~@KNMH`y5XR(3)ax>~|hfc#Fso z_s0<^LN#6?SLqOQ`@&{`ymZ!&4TMD811gVFBw-qT#!xQr!*arAVn-Co57qj5W$5nx zHkH^3M`+iCpIoGhok_s@VAF^9B^^Bw`kP zy0m1liM0G1C|IcK>-J^Giil$7BTq)u03dlj0@et1Z)%$)vR7|+oRTH+DKKV6?x{v= zBwWnC4A97Y0sW-Arjv&Jkp7W^$H=qj@`3Fc!8V1BT7Hve40Nql6k;AipqJ-bny|V# zXF1WFCHgEI8#0>5diLamlDa`JMAxY9o?^UDHX57b$Yn$&ED;$pOg1LWtn)1s=Bm$0gZF6->jA{aQ{(3een6^(bImUma`8wXokT^XU>lUVFu33sbg#wm zyaR;>5B~5vuQm-M)a^X22@3C^^E!=gvG@u)H_6g)o9Bh6Fp3p{-8zJ)+1^I0S=Ok> z7t%IcMyTj0*?37Aa4)W3GmmD?-tbq)i5qb9Vye2HVr`3tfC2q1rRv zky!;ZCrS1l^8m>{t^upnpdL?D3;h1t-QZf4^6&`JSNHF;gF-ltMlR{qiX!yNyIg zC!PT}UNarEz`vXQQ9R3!`cDJG=bE@zf0Dx4R)J3f+E)jRgr$#H_uSPvd&Gch?Abm- z_gV=shf3h2*3F1Q(xlK?YG_&3O zL0WR~A_Cja0PNwG6f?H?$Ld8_L%aXnH_VHh^4&)d3HR;_Zr@>2`*Ebct5ZJO1 z*P&d>&gKSZuV5hig9DJN~kL)awEs zquA@cVi`a=(;K}KzJ*5~&Y0X&-Iudtz0OL7q-0~>Xtdyl0|O&;EE>TM)y4}NWniq1 z@Cb=#`_V{xrgfV0<2@UFC;t7+jv0bHostfSQeNMZn6l?jae0S3*z4hBKyg;7Bk;M%)m%nvl3|tzWCr3xN{KKytDIxQvF*N7X_#JveOQMFBky`mNo6BYSbqIhnT!~D)wo1TAz{GA8m z!i7lOm_obbw>7g@p}PbCvdGi~Nh^H2keT%HK{oRX4&)+RPS`2H+zxG7R|D*#J`klGWIMbm1>0 zSM!-E2GskW>8dq)wxSQsbNKB-Mg zuqyq2Dttb(oCg4-8G!Co4j_n`No!U3Ak)5YW(NIWaWCZNQC5C8PfH=3-oQl39h3?b zt5}<6o@tymVV$X?{qS+*xUhFLZ;tO zpdW!_`V>6I=zW~nGnla#P8T`-?Ssmmq2}wvxStNaPZ&#hM+PdhW69m#<&DW*XJcf? z4Y!MV;8p{Mx_uct=w5|c4T#6fG3_n`S3KGWtqaV&H`O-C$2=GlyT^ew(%&#E`x;D9 z3E&iP4|oYJ@TIEJZiZ~BM9F6)n9`Rb!IUdAqfDXqEF0+HwuY15p-$6eII27oRpBLx zUZ?`BP2#xFWwH9nK56xF_obJOJ6DZsSGShZUM{=Nu{L+GPsvrsif7@PyP365E^^0s zovN9Qle?eo%zFLu*yTx7b5n6lcJB@lXqX?5F5{t?9 zw=Ha*Es6IF1|rxNu=p2YWZnj886<&wiI4rae@mpvND^sg@klr|G-lz^f9Tu8$WVX^ zi#&`Y1Ld1!*Fc_NL}D?QsZ!hLe-@5@n)LAY?wIAIp7Q>-ToMEO7RZxGb#Qr*k_vs7 z?0L|R&qoW_N9+N6`rF3nSZH_=M{dlWWCVtvv z2C>ytytA^%O3D3F?U`c0{H!B0W_r)5l^^9hJtA*KX!12|cRL;IFuQTkryvMblLL1G z85U;pKbu$wc&Xj*ZoCr4{Pwk&#eq#MZqE#?uy6By&synPwW$%BCH85*8e$DKqUiF6 zbXmeGrNh0ZZUXK)-Q2s02eEd;kmgU)geI}~Y{ra(VsCIc&#oJtw5q4Ajk*MCbrsKjGJclcp5uTI*75?UTGb<>I{rfB0Ac3FMzw1prVQ~K?hb6dC z${(mB((b;u#kCykDrhkj=IvgY%X={8Xb}1}(KNlDh^N;rtetJRB23+v-)x_;Ixv@U zA2=-wj}BK&fg8{chLE}T@M2!dxY>;)%>ijX?~dClXO_KXz?{nSZO~DB(NDVKGCb^qq3E=?A8Xgq~H4y(MsN z=BqF=BF!EitbR06)al5)x)FJEY&MTnMo5kOx1iLWlt!XvR#pfq?s5Q5L<7rxGY*mp zX5l9(>*))Chr{ia#1nbX<-etjmUjcRocSg##O;k_1BJXtI5%DrQWz=v^8G-5P4_TJ zA@S0XzijkQTzA&){9QmNJ>RK>1bK_{ zt0)H9t{i4^*UFE~4&4rKNoBhva{y*-6meuw1Epb$4;4I|8SKT~(}*aqZ=ORMuk$78!;o%1fBC+M0K|vY6p+ z287!03eOlsNgf1XTVfE7y1?6D05~Ad#X$w2hJ$qY!_*=a_a2V1e{bzz2vP&y33OVTd4(WE7cu0_H-mvfU!94RTLE@_K5EGWY62E& zH>m;xFR*24BYYpSFDOunJdXdFl;z$#rgHAQW`tXs6yKK`Zj-y`N=?rF{E%o|`e(D> zlnAH|+*#6{GTRnbQS6`%VejO9sW(a`S5b|I`*0btW<2|C=5GUL-Wf@i$cOT65YTlX z)~~0V5q|+D{Wm-@lNScUm&EPwGP1PaM*;Tj#5E`ScOlb%8hW)critTM#IIYz%vEe` zPu3>ljvhYdfm^ySr3-E#c}@z!HL;D#7_)cG3PkI-T#LqfF3jd*1YOnfN4M39t}-gD>SX&~=){Ve|7?Us%=U}P6}3QID4mS<%hqf=vqpCD=?wF4de0?9 z<@J6E+O#HWN{D{fAE8AY=f4suV6$E~vlg%biU_=-^S+?~yIul#_u#9ECk+*Jbo8W( zJg9^y3*g&ZO9H-qqB=S;|7@R&?X2D*Ma=!z2VpjL9pB#B49I>()r#6XidfJUP3q#; zfT^Cz@Oc?7#}HSM6Iw%OGK<>h`q!p5XnY`J_oQmo8b zOwtGH#X8)^USBf8p_PF&7HLl-sM%r&^!2PzK6?q9Xj1I-V5)>QZX-0f?Y}KJQm*eu zPh-_o!}3a^mzcZDpsc|O{r>tj#4*eIygRK_kRRP<^sbEj2^i3aSm5ihH3`#n%nqtD9&v~_*tP(h%{EBm?%wy9dFuUjrJF;rCOJhcg06Np z`yLWs$$aio`8p|9>-a*ghb@w-qGoNYd!>QC=!NJzUBF$4i={a#tWdl|{Map&+m82U zl8IetjKHlHX-S*`q}spjI0^>X@u2heh+^K;Y>57h(~O1B&%!>jqQKJ|-3Q+n+I)7& z-srzwfweymn`RR==ADo@zEDbNAPj)S>CWmnFw`p{M@MQtkNR@W?kjv;iy-+fZyYj# zLp?om^WnB6Tq}$W2uQ?>BJ4Ukb(YAjr33-WjD&NDKR({Vp1T(J=>Nlak+15R|G9MV z!-bDSHne^Q$HOpG)9Sl{tGg0U^8~hWSQl(BVl(7zV2|LOv$8&r0eR2GNM_+Wy?@P~ zc7)EuTrPKvNdTQyV1qjavI7viJE!W&d0vPKh@HvgV5MEzYIWot2=Of{evQ@Ti^?(o zAL~!{Z|koudz3?pqoQfPkrXzX&lClK1M`AZDZsO*1lc4HADC-!Bpn$pw(8%Ah{__p z$v@Vg7q+jrtYi{=9Mc=MH0chNFj&sOzAs2G_)uL46jT82PO$e&wmER4-Cm(A!-{)U zMrxOr|JzG*q9HBI+n+sW{42g`zPrMamA|Ns)_u+vA1UKq6g~6y*@G-oAPae!>E>)j z+x&y2?_Lw>q~OCQ(K)`_x9YQWy|?zR!9Fv3qNGVC*3bfF47!#i(DM-hT3_g1PdMc)r-(v zb<(CcAmRDZoXijX1=0WW(3!Y1N2$L%_h}9PaIw0W{iNgYhyAyeyi~cp)-x{V4#udL zfOWKLTW~ zF|hEcPi)q&2TAJvr_+{QEMBx(LmgwYaZ|%{ahrymRmx{2n4{8Wlezk|BUn?h@&om3 zxy$yU`bz49t$A>?)<=s+mqksDTliKBwE`_%8NUU5^{&PDM_sODa?p1_e5IMXTnz*n z6KmibA_E|B5@7ZDu(nqu3V4G80Ega_;0w4^ZaO)JKvkIp5M%s4p1(s3pm&61hZZTq z*geq z%s?!I5)9Q>7=qsO%&(7N{f)~F$fM8CJ6E6lht>KMR!B*;`0@a({AV_hb+s8j3S6MV zoHL2s*cqoS;_^Qm-2~qNB8#ladb!z}3Pjp%(8|TV{1PC}2o%Z$&YnZm9mtrxD?Gv0 zKzI-kh^zU{$FkDj{u5!m_p%df9|8(ze*jTo65!D6y(s*|3ZN1Y!~(3c^*Z6Jn=q*( z4**B(*K+cj7WF=i5u758~U5VTVR2nZPG{Pp)6NqWLoAJ0$knLQg9m#+JU)w);-3x;=P=R&Gqhi@ip749;Xq9N5|PMe6>oP$*3?JKQ`Lm zC$e8K2Dreo-s~cK0PcXU0Ef*WIs65F^U|Z70TvRrohq}Eunk|@Df8a>lPwn|&qmIS z@FB2A1F^Pil992{j^CciTP46V3AA=b4*~ohTY6mago4)>V8v14zr%qYU5P-PkO#jO zis`op%uWh_0ZJ(Y6%N1BfQnba>gO%Q3MOSh$004@1_e%K2j&Nv?7;bw+k%|!?Zv=O zFO~mgHBLcIMYWleO2trN^ex%I=biEU*+O}PPZzZ~0WR-sm)_Gd4MNlv;``jdI=@Sw zn^Bk*9$9xpL?Ncct2r6Jy}Tb3JW` z|6Br%epvK*gQ5-Fxo)ZM{|VZ8NKgHe6tqXPolG8hI%oCTtO;4salKoQedV)Wgz-I& zgGT8&9`ldWZEq@8F6v-h990|x4>Wp=08f&=R!>Mnr5kMe+mn2d3H;Xt5l1cg8qUcY zWm1SPM~aHkT>xhaKGV1PpX{iCafhUBXJKsIr(&Qi6F5MXnYN6`7O2>-S0sN9D%L!W zU20^S;I?9`9T$Y?5-_1{tKJ0D5LP75{Dw!!nau)|455$0?yFY@Jd!77Vd5J$jP=U5 zOh^4m;7I4Q0elx6RUZ8pklO4Lo6rKPTma%L{erWFnA`3R&fn}8o$f@pA`eN!SWYsI zRwU#2CR6FeiPQ!@bbN$~$)eC)z*yy7LqhlYRW<2naa`0D-Sl5w`hgji`=bM6`rr9G zb~aVy6D~8P17`Fr@tnC`hT&7qKo?#JTK?GZofY@=#&F_#c6iU);~0w z&kJfxbd$poy;x2Yihf*KF}^OhyL)F&(A+&HrEc)1yG5$T zkp1a+h=<_SxorR5$n|8R)_Yh7Z0DTN5sJA0QcEUoAf}XLf5=9}h#zBS=)1D0MY~tx zKSQ_AYsxk|9-TWf%diW({DATJ)rhtP_Y`NJ;k%ca>96S-hrw{SiNrYL**ce_3XO&vaa)YMPj7Jq=c#s@p?#117b?9@ z$i|={^Z{y4l$NKM8#-5%LGa*A4naaM(!>6ZZ$JrsvoL!Uh0Vc3hjp_YJ?+(e zrI!XG1<7$~h49`3pe@R9chQ7UmSNz{C@|0?M7v!HO4-RYo)HB;5Xz5*9~%aaL=Jc| zLJrDjC68n}{>AR|Cf1g|DrR54S0Qau7arGyju4euyZ!H$BV!49Jlq=8&M0uXAAVUa zXx6PILJp}Xe#f@zctml=xrK>_!6a{*Do?*K#9HR9Jd?J;Gi24(lWn<=6(3dj&GCph z)3N!*>sN&B`2{|q+k}6}!5gnM~C|!tj zJ=OQ)d|*cp>3et<9$`K^C8_O8OK-H?R`*yo1A2w|lN-hR3He{jl3)(azOjOSRO*nq zkI;{j&6s;=yY>E8x`RcM1Mxcd!Xo+|W~|x?|Ng+`jJe^B&@y^%mU&BF-|-z3>hqAv ziF~qM;ks-smue(G(e&uf6J2ey$(QLlN?hm}Yxt-SHMfjc;#Yvf^#>Z_K|a>x`97?C znVk$vfId8b33_^~_I}(k-KX>KjZ(4+vk4(+f2$9BXU>>KvX2PRqgIEGvF^Hbk7_Zh zm=S`R=JxU>-FhGXzs>HDnO*lW!{kt${2~0T^J(lkL6%ThL`tp&bWNHemct1fn@cP5l?zBwlVAJ1holMmHjlB1y3F!|rXl zX%FgV9%lyXCax`XcHfAlW;MC-tiQc|8L;QvAg~6|D!CK7LN(8LbMDJ>1)qC~WXUzr zMTbjgFuZQA$d)_vk@Vcv^Q*KT!p$p+LFxsU=&7-mRswrmiN zciVlH0%?kNSm#vrD0~b!jPvu8R{h;n=S{L5khi-7m(IzI(M1JyrEGOOTpl5=YZGD@ zqdX@n=;t1Hq@uE=FDGo`EGCuWomF9jWS;owD{18OLRJ3N?XqRG_ZwwH|Bn9~JF3s) zpi%NL=yF-!;lrGk)3Pnt$@Uhd&cQy&#`?4afOymg@3-=&CZYX-TjYk;x~|(BS(|i! z*Gp1fODf&5c|)oo?^`$)`LfdacH1n6uU&odmrtBql9jCe9-~v&9ew95$0QF13JDAO z!3#D+IvqOA3|S&clbJ&pWjA5##W@DgP~(noD`2<2x#C~vS8M%W(OU)G-h1Qz1)Kgk z^+qH?c%0&Wa5?>nVkV@L*aAKg=H&Kc9tG|sl6?}Y!V(=L0Ha>Hh zH|QeMuo_tvT;DMY{E)J6Lk=_ck~^2@3p(eAr`AkcohwKBrMvd5u;dgk>ia+BOXBLdQ+YlXUmf)Fp9yvX z3eU7@46^5pK*n8CMdAuN_~t{6x7@h#@RXHItrC4wwUuj21>@Vq<9zAEdW zKWUpa_%p}{&*L;fYFJKPXYgGvOs)YgouZcEGpGp17IPU-yfCd?=f=Js>r7-=K@-zg6*M zR%={K>7{a>IWOiyMYB&{nj;35WNXkuNIS^UJ)lMe#Vm)5(Wyd^E+ zBg1Sl>1kc<9UY+t!k925n;Z z2Q7B40F%N9375_vU2Z%wGTR=%JaCsyM-Ly23u+XqUFHtW7L4xjr~W~jd^ltGC;^y! zSSxTj!L)l=Ub6hf()fbEw|lF+|0dzG^>LDv`;yAczR&roMCJM`L9>@Bg6F{+*;Y|I z5tuz?Q%5$s5>y@*t3jX_SysvUkCrujN{@J`~Mhpw__(2T(l z>#PS?sbW{XP?FRzV8x*b+U2n6UhWx4tp#Bii!0`+OsyhR6lfxWS%|HDEJ&GZZ!gzf zv#Bu(MIR&wSrBYc>PZdR zW%-+xDG*m7k-6cBp(E>hGfxMYlZLLC9n7d&RS}VVm8#Cib7Oc~k2~a9nu8st#^x|G z{o-e48f?XBfN+pyoW)tSVfoQ>!docbmcmifyS>k`CjG1F5L* zQ>Kb%r@O37q{Xp+#8rJ_^k7d-S-7Krr?pxwds6c!Q#H_DtBd|h-%EOX+PyX3Yj=KS zt^aLHlO|1po$cQSc^V?pcQ}|(N+<;#ufyk2 z4$vb{gShc+7X#^9r;V^prZDv2g-orcX6BE`~dG@Aa=g~2Piyd(Z_m2$M zaZ@GR88tA+&>k+W;qL)VqIk>c6)N5;VfYG}wBvpdS@}84ppLRjL`pd@-76MZ)?hQ( zRLX8DG^LlT!?m1Hj5}36|O^7t}Y~b-`nM{|C>2>++YYXRkL#0s}3KX>3Kd`U-+f{>33uXFIK0uh>d@$6?0i{w%f255Z_{_uNBC4d@Z`h z-?!(29Mclt;)S_rQ*37LMu>G@zEbCmlep74q&u6tUt8V>sqOobyMHuOJ4PHXFvuI7 z@!TvQGbCu&uD@!Eq8|QHW?HOrYr|c(_-r0(kX-C@8rs`_Qm}y%8(nh>^{b{jXqRjl zvXai7y1y{6;jq-c7EEi16ibyk6(8vKfghE)1#S}K4;v24))>Pq7xVfTxSl4a-QVj_ z8r>k%ki4ByW@>r#4a@}}(}oPPX}B3|6_d>=$$Wg5 z-=pYd(DCKeBVd%Xxke{0yl#{;N9Ew<7*TOiuKa;0no888M>WP=75bi$9@bV^}J zK@SDmcuH+#oHx`XcaBvAH)mmkH&YwimdaZM*!;8u!i3qee`!T1DwG(qx#7N_Xj*of z_}w^iob0s4PYs=G&XKt+%uop+Z;oKd85D7}PbIXJO5RgIeosJrrsB!~37*5s)T3a_VLGa)t;4A> zSde}uG5nSDEIF}vR%B?hx^h#!#k zv7lDhlWXoLv?fXRXyryeU;2#xS&frb-1z$?S=U308S0P`3VhUI&++<^PUFu7=^H8N z>gm(xVNkEXztm%VK{ZZ&W7i4qWa9k~j0F`TN)8F-(U@b^j7_Wc2b%t=oDqb=SIi9Vh>$UMd_GOuCwgM0l3M+)dm8!*c7s#Vx7LpDg?L5X5k z$DE0%dh-5^u^4*#zQR$>5jMrRb%XhO6vJ7{@ff$lji+z1j+ zl^z}CKn;Mz>Ku3uT5w@OXrdC)2Y+Edsvj*8xWldiHXL{BKmCFf78Q|Qm@JUmTd`!6 zO$y4IXf&z_-;}IB^Jwi{D9`iSO#$6#WV}{*WdZl(aI7|#-?_G-Mh0Epmu`gF!}s@c zySDzIwe$MbBx51tzVBe+y?&r^OJGi4xH;%XX*11dgpUkeU6U7UyINS9&RMv&tLjwX z&%JaMYdz8BS)SL<1CQH+tcTLx@>?94g5@GMCiO>=hnRjBic^=0HWN{IHhawSPvnip zA0Ed%Ku?keib1V$J9dye5w z&!yHkTdErtY&6v0ZGmIsK0mx>bsvdAIUOtvQdckx#O;-1+;_wMob$cm*-mqY4eb+= z8OPwvl0_@bbLqitSkqU!3M2DGuhvNOl&Idr{)2r%ax}FHKG4DlhsmIiN9=!+d-0CI zh}%oN$h(auObitGG{5l+24)x*U&w@R%B6JuM7B6B4!Do9nyf_lt`|miGw4#%6?%7+F+dpPKk5jfkoIJ!@!F=9$gOU?M zc4SVjd=k^(EH3PkrT3&9E*0HBwB%mQZVB`CJ7HfBXjoYQdG{)Kks&YwQm^ZG4)`8! z{Hz00Fy6!2b)^*&Ceb<;E5MhiQQ^_IyoZ+p?Ni<{2EupH#i>K(TOj8 zbdB`uYqK=%IbmS@@?!=~c+7*q@kdVYkmdT;F%J}cd7r@932yqn2J)HXKc#ELx{6WK z9)Z#=(x}va`u!Z$2k5hf4+cNMYc}L|Re!;oYCi?Ut=2Y5x$9CSxKtdM+s63Wz5)5K zxI|Ibyogm=a-w9DNapT69z`y1+~43U*yB%#C<-6T#`@qlmVDtc3)c93BjpSpvN54UHw6A*2$@z-D&x`_{V0EsWndr6J+knbhqDL zBAtd|*S&RO)fDRbY^1JxG~?Op9s-l&ovuiM`C`EZdZA>fs}7nl`1(NQg?37_ApKB0 z)nqpKYrC~^!gmq#CaKn!r>S7+bug2(RQ2MDE)13upGz8G*tM)HBb5o3-UJ31vbTF$ z&mr|Jg_-uJt5P!LQb&<$<})C|%&X3h$;XGj+(~}kcUx*6PrJjGTO6Ieu1lt&dtiVwf$Wk?MSEMcv$|@F&lURX z*Ry1^%)*w=uF!vv7iAD=&TN%IsBshFyeE9+@vb`@EuofIveiVhjy;22942^s&VxI@ zI9$n2cno)@D(ScX>U`v8Ify2Mw&ZQa_jtS!7cBybyq|LGOl}D-uK5r@I+P{bzMP_U zs;#O9c6FFj@Q9C(HL-oOwbk!b6sKI_&j;DBbkG#EEC)2;_5b< zuwGamWOaL@h^qou+(-D1ii&buW+t{Dd%Y2V{ex}KwO{78TT6{by@wJw^~3Tv?dFjo zw*7)cNhL6(?bJW71@m{HA4>QE&+-a7jE7qIvwA5N;qpE(Os|jJ2Wb(>eRCgqzG^@E z^2UA;FyByDY*$ri+iXbpTO3(~e7aN-3%%Q=M8IvrcwJz%Et_+@6D0Zch`In^R6^rFu9`eT12 zMw~u{Jl6k|Eox9!N6<60el?{Tvz$<>oa9J1xb)tQxT zt0hA@xPS?V?Cubk51L=()>W)E>4FCL!~EuymhS>6Ym}<0k3-Y8nl$Ci&o5UR>^YTr zC)=<>1JJ73RXVZ)h2vl6)2m0MucN-XEA&34^>Y0(@;Djj<^A=&t+NRWFzqk^Pq{*D z1Sg1ZZpVcRtJ_V)&WogkG{(*?x8o0Nc+{bK*LP_K9j3jb#FJA587Lb8LW>H)!F{Zs zi`(6Gyp=L1DW2xuGV8>&QMVf=V%I?*Bx9#v!_muxc^!?uwU8_}NGuhxvu9b@?k)AX zA~-GEz4`Mb%xF@gz$P`o`5fD4H6(35EgHFzN`B~!21Xh>kK2&5_B4)rd!oc@p-(=B<_ zvO67h?-5M9`KT0P4XO%*x~z5Dxe;Brr)OzP_|{2hkY=s3OJjUU0+LK%aMDHLj$j07t|Fp zU~0+{>_oYyLtxNYX|8v^cbcR?^ z2~gx8=LG#j>tOd}Z%1jLx1=wttS`T+5F6A z@!0xI_yn>OEQ%kE?>a4p+qFgaJL7?IhMt_e>>c|`D7Q3t*oei925g?*)f|k8(?V&i zHI|=S`LHNSCMoiW;R4!Lv+-Q6X4ozbeu*f;udX0-N`wol-xlzsL|7Um))~6o=&!KZ z^8w`~y#@3iP|r_omuD6eN1*R2Wn+&8vqFcQ@oPEIoTDL0a9NLrpt8@`wq7^N>9^uH zW~Uk(gag};@n)aXt{SmGs5$#gi?eb}A@WnVF3nhky->~E;y$Z(yXHYzrjx1Al1l3Z*xC`Ft4q0bHqv?8f%z?=X&>~@10_Wsw8Q9V3wi5QizGW|4M^XFd^KNv& zcr!5Da2A+tSY6`M2Kcqo1_45hJSoRew~1C{C9-x#9NzFVutBilY<9bE#vlY8vOZC5 zU7rOCSs5r@kNvr}np>^W&yj5*h(9@f03COV%VMW&vV z+iz#Tfwqb*WxMHY`Gr`pSPX-QQAN369MOEGmnYDC_sx-Io!x6hS_n!*kwvaP^>t_( zeod83U!lVO?BF2ET)-4!(Bb6mPC5O&Wb4LCA|oB~;a2geg7GV_j4qFb*~+oI5wMv- zJlrS<&nwjqYn?qMzjV0o-nhMYr(40$SYE|k8n4fBmF;ERV7}a^n+bvg*-PttV@t00 zc`4Y&TqO2DFrhJ<;sRxANB++RU7s61<`yci6Ji#dW>7Feqse)ObZLW0Cpi2lLh?-B zhiDigbTk9Ar(Ig$!0uk(HX7DyQ!G63_qyBAr&}TLzAdibS)WZc1X0vC2Msqm_nH|6 zrX1>751nv(tEB!kvY4DevrRpnZ65QYJKWSt?OY<_wIyP0%$F?e$}Ke6VD{$A%b~); zf;=f|{Bu!3k_(I5@;7OK*z#T>=JPv{9=s@d^q$E|n;i9E@gY0n0DV3{_x%T8VPV!p zcK(STVP(vat4*!}QID)j>||-8MoOD?rBTki%KyXJdq*|3w*9)x56;4ETo|5F(P%PO z5diA!3SMb?L_cMHY$VdbvK9YbUkHS?g)rtxzMZXnLDFfJwbUzK%6NkI1&m@HKaI8O zSf_h7(3$Z=a@;9WTj(V$#JYLkdi*R(TUmr3Y?Br-~`{fQ1LCFd|Sk5L}}@xG~SK8u~SFK*idP@>BmJ> zJTK~vhrVU_61HUHBVp;!9VMO>J&&CykHhp6ya!Ks1SEqf)mFSX`wUJ>moZ;#Kyl{Zi4V{U7x6`l zJ$~_1ji>U&=)p~*SKi}Jj6@I_%Ea?{39+3jN0zRtEGl?ebdUZWRXTifIZmu&;lbbC zAn`u|r`QMi5Om|dKtk)>%PeSdj0fLn(p{PKT}o+e`^#9ZoA{BE64k!k6PjCILGN9% zyjKP!E+^uCJ?PC_ zL6}&TW!?_ol%4$gVuKcbW??U$NBn@ZO|N$ks4}n3ZoxtigM|}x{oZ!>nlVir94EmZ z-`1BFz5ENs@?u6h=n?51ulE~sv7F8YHz}{i!8#jQofC}>Dws3oda|b>Lao!eU0ak- zC=od{u&@P28^@gp%2={IG8u)iGr%1| zn-OKemCkQGKG3JRrSER4mK!6d0CDlV(vg~P{aK=%SW>DRUP=Jw=A~SQe%4%S_i^I3&pGzMt$(dZBOpqR!7`1`ha^@ zWfe9u6SCDCW8{2x2mWk9rT3Q zo{FsHbha;Bx~eA70twZ=I@Oe={k7`P5bMRAS%mD9#PB4J(7B z_aO*srZk!@QASu_9nEqRM(dpATp3@B?TB~8CMTmgKS8cq3s^e}n%J3qeYqOW%J!-Z zn?ht4!U_ezUZjQOKeN4Y(VV{3FN7^T45J$ zM#!TO?iJgeWJA%&^GIUd-7S4|wVuVO&V!`Cl)Is`!-O)G&coa13*~!R>T8t6PAe^P z9&&I$uaVa!bfKTsahd*l#;ae4^-@Lu(YG3$6JRjgYB{+cd}y07UJ3je>yxeq-&yp= z;0Yhw*q8aAkhFxb9cOKlg-h}sGd^Y;GVis|wxaY@nza_RfaJdj3fk=NA; zpKBG6yB^SqsGO=!)-=if^4TPsklkV;a@>mRmmqg-d<77VKKtw&m zKu&^U?tp|n0naFQL}5Rg?Fg#srJm;Z8~50xTRv-gt+9Kd_u%?^!q7A)xq0~xur2l+u)~(YVoPKR|Bg@;iJwskbETfLL0H!ua=F^ zx0)y~fFDpgu@}NaRm%K<){M+-S!lIaB)g5Xx66;txI*nj(B29xG*L>uvNDZ7&QBGf zKO(t+pA-3spGh{Kf)sH9-&eYgdf`*C6+>llNyjhE zqYp$~LW(`kjdsOnq-a(tn~_;4lt2G=Lp(}wMpMyR!36F3IO-eHIhc{z zUhI!v^#r&ye@Rk%XSnz#p4Yv^EgH_WQ_uLmg8A+?!5r*XgAPOG7VZuC`)codRtFC! zrY=@EVtsKjb`@Sz@b#X&%5JX-_{7kv8?Ux9di$bDtWdg7V9B>jwijkVRf9bFO#xf; zjBn}XkG98)zEe9D;6%YFx2SccPOiS8wP=QKrN9yHl((1(eQEhy6Mf4-Iz!Q=6qe4o zB&Zc<_9|`c%MJt9=L8dtx&^4vs%%j)qVI&+H|}I_o@X!r6ex1JU!QOr=0wE<%|pcp zl2CQKY}l$q2X(|BM0m%d=ZE^eey>P>$}4v6y#cZb#M&S3N@{@xE#=f@7Pj5bBwOy{ zL^fm@anJC@arzT?i-I}7%{PQth(*0K$B~OiG?1QF$izm zTI5wZS8&s4*;KW^^?9F$p1dia(ZSjP$B^}XF{lT(`2eq6N91S?gzj$_i0^L2P3DBI zbr)8-;{Au$?UX&5de7{43|cu^EnF3|^d2ws7#@$EfQ|zL`@__-6vu)cusdK?5w8i! z+QrFgI59&cByo4BU~|0MgT7H6FrpOp$;IJHWo6~f%_>)GTgS70)S=2QOsVl71||ET71sPXnegA8Y>)%pbl}_ zUB8`(I9hR6#te2L@tVfaDJA#m=*yjrbpcN@{sMpH4mujPbM5fSt$Y3l6fFf|wC~(?DDKd>uyyd=>7+N0XtG6~29uWf(^KE38x%bYfacdO z0z`;EQ)0>~Ynik-XL@Yq#`sQRL2X6;XsIu`qS_(JzSe(gyzopJbRxKW9H#9`daHb` zL_&6VH*;m>{>6R&3SCvzi3WSaO8ACYi@l*Bh1wp-MO-@NFSvYQO=vkIio7O%oz0Uy zaEt5sJ@4{}MegR((U`x^{bjxu%ZJIyE}Ty5TR9b^Oq-1{tkB`ic5j=8mFy~b_&zQ0 zy~de?-n?3wBwx7iNf?~IO^#ZdIhZXO-q?OTw<=E75rNVbV`I%;qL3IavW=Ht7I$itFXxxz; z0HxcM(WG*k87@z7uu|jPzChxQG*V~C^yQv@=&s@~eO)4rOGELUqmzTEgoMLId`V?3 zE;LP_Z%nbvt=(9IZE0eU*zpCdpWfR3K*QmVBT?{smQ4CKosI98V zBLvp(zIIr>&A0D}A|Ps)$nT4m>k?bk9ES)i?(qsyCIbgDA)^#)q}8$n!@eSz?Lo&$ zdVbY7?eVgsW}z#T^CU(H_ZB5w7O{xr)5-xE)c@8}vSXT$E`MkF!_ppqN*cEFIp_cf z(SYpI!E8=>XFl&OqsA2Yk5sW@`Ji+}GG?z1ZG+q{DeSSq&P-hu;WW+wOxfh(uktRc z4T!8J=L`qkueNOcJUrJC)6Xwm=LiLcP<%cmF@-i=ws{D2<#qVFd%vn^f17nC&g8Y4 zzU6#eT>dauhTpZD?(KaW*CED2MMa@mpp31W@uuevWp`tbFb86b85RJ%kA7RO*F40m zcI1XF`{q_&PsE-B<;?}xuJkFaZr>R&Y?d5VmjD>E_unUgT>o4;^gkORqUD={A5pju z50b9kfW)oZ78t$S$u~O3eUc=D-ixe9J{Wfo;|hbd5Yxa#KWlEt;A{RWefwJmDRnH_ zpJ@4TFv@e_z<;BHLS)h#p&S(iM4yVRQ~o8JIJ)XlB<~xD3%AD- zh)vb*%G33#>@Q2W8lTN5w8BoGqEp&)&QacaEB(J*97F=JxM!uB6!&t}qtMbUGK5=h zV}dL);R9vD!={E}LO65j4ICN8U-5I;HyAe4V$){g0d zm*EfM{b&?4{1MG>7brlh+5mh*(e}=lqyukcuwDsCkFWMBYD~At?2_YwTJVYoR8%@M zrLt*pWr!A|x*u#~cW9k*fM)FBkN`4KG=A7)jm6Opi4!xoLVMO1Bc6%Q@!wqwJBr7s z;G{6IS3v=f_uswLv3`ErCTZ{43~b07LX^xk`}TAVN-O%Em&-LnqJsp_5@D&a+-Ns;-{I{oW1aIy7c#@8xt4C zzN$4AkyQJX6mcsYS0w4TD{}eYu88iHel2q5`&{pj_6kvy0wejMpTl=;e4`BsfT{}sQm4ELXinOignunIXAJ?y zvwQV2NbhDu-CL_#b?|NB99P736I_DO7^BU6DRXm04DacunTdO>#?387h)h-`(42yC zO+-W%0>t>6dV7f|s!w^FD^%pE^BB>B6&Cq`-d-n)_n@^OGMQ$`n(pFDO zqlOE2TFj6oK~~@@spx+0QSj!2il6JWm3p=0}f18UBCU%%Rq(*9@B7_fRTPlT%dto8z6dSqM}7gJN~G@MHRG zIx2T3{7+Gn{B0x9y>4lr@m3%!9S@wwi=yNvSPZ8?&1CfnE-JR#yWu|AY3A0Pwr=jv z%?SQ&iQH1(zx#zxix%{fC%CYzdsX%9RFfdn_5Dzm6vmLQhn*HWmd6L%De$3Z(CU*m zsR$G`1B3z@f8LxycNtK`nSV8;=AJ&NYSG5G7u{J0A3K^32;dPN;4@d;)de6!#}A^; z@tN(NBJc93a{Q2#jsW2>mI-jBudF*Q_ZlT@&r@}z1KF`#W@s!Wg?_v`7+Ifb(rl(& ztsT%g+;3x}1DVmJ|9Jgd4w?EN zwqWsKbD>S8lI@gd7n|}kZ7>pLalfBp;%h~w^ryXVU3};(fCy*jmZT64gveOwcowY< z3GMoRdDJKR0L}{!6ISTX3^FarF!)dsfi2nePj|`9eUf$u0D{uKYmPOyju)6=eb1sA>tdq}^Y0K^aS04s4Z81u|oGiKb~k(^#0Ds?4Bwi@O^^A2oGbB3Y30 zEyqNrZ(44#uizq0be#`vD>y~32)%@IUyN?}A_EYV_1>-Ea|@GetZJw}VQqh~%!Grl zNawhG)|62h=ebBa&` zRpCnkhMgy+?A@^0PY|~{A?({3VP3Y~My#9Gn!Re@RUdhEADPgcBiLhe{J6U| zH=_kRmXbC9+`+CoPqtUX(i3uRUQb>E)P~`0pNikB&KlMU@mtj++|s`kb@eD%O^X6) zeFMq?4tlkZ;WgZWUcsB;6}^0vi+lPyZU%O;{rKgjV`!ZZ{R*1CAH23?BkFJA%eO+s zh>r{@ce{qDDRrV9-y#9`rKn$xE~ayONSAr?+~eh3)FxiiMU(ZNs#&vkDsm{5rm096 zQs4B3ZJ&Y8z6(Py$G3}j6$T#rhLBz9u%IkBpDlBu_a!@wK@#^K&I+;cLgIVL$1~FH zcS!kIu3N^IqMsCRxRCNQ#QKCdlamtnPt567Z28J~xk4}^!@hn?z7O?Ch!Jwmotu-q zrF=RwqH7YuL&sNo=n+ZzA_M8<60zVc7_!txclWamPl@-+xt8eD`iJcfHVhdlhv(DK za~>!Y$gRfn@iFIFDKBa?=1+?pWCa6f-s%iIK|I2~9Wp0E#zLgZ#81(jy}SP;ML*G< z|G^c`-(L)FG`R6<8RfpCupSn5≻<(8+8z1D6wzVCgiu8_DMsFsGkF9yGeg$GFds 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 z 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�rztDMvw>g02_NCR5%W? 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

9s;cD#_ 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 z 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


-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 =NxX3tWhT3JBs&*Y)`v$M<{R_wP7< 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%0Ah?R$36^BRwqUOPYBx^|P@XxjD)K+5RA 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 q@a` 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¿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 F0swDg$lw3~ diff --git a/out/Others/patch_ui_mp.ff b/out/Others/patch_ui_mp.ff deleted file mode 100644 index f93802420e849a8c6c0b53cd160adee9bd90db9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 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 %t}i&Wueq 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

Fsmj3e)o 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