#pragma strict
@script AddComponentMenu("Shooter Engine/GUI/Pause Menu")
enum Page {
None,
Main,
LoadLevels,
Options,
Credits
}
var isMainMenu : boolean = false;
private var currentPage : Page;
private var gameStatus : GameStatus;
private var player : Player;
private var pauseEffect : MonoBehaviour;
private var savedTimeScale : float;
private var toolbarInt : int = 0;
private var toolbarStrings : String[] = ["Audio", "Graphics", "Game", "System"];
private var scrollPosition : Vector2;
private var hideScripts : HideGuiWhenPaused[];
private var ingameMenu : boolean = false;
private var wasLocked : boolean = false;
private var levelName : boolean = false;
function Start () {
Time.timeScale = 1.0;
if (Screen.fullScreen)
GameStatus.fullscreenMode = true;
GameStatus.savedRes.width = Screen.width;
GameStatus.savedRes.height = Screen.height;
gameStatus = FindObjectOfType(GameStatus);
player = FindObjectOfType(Player);
scrollPosition = Vector2(gameStatus.mainMenu.menuWidth, gameStatus.mainMenu.menuHeight * 0.5);
if (isMainMenu)
PauseGame();
else
Screen.lockCursor = true;
ShowLevelName();
}
function LateUpdate () {
if (Input.GetKeyDown("escape")) {
switch (currentPage) {
case Page.None:
PauseGame();
break;
case Page.Main:
if (!isMainMenu)
UnPauseGame();
break;
default:
currentPage = Page.Main;
}
}
if (Input.GetMouseButton (0) && !IsGamePaused())
Screen.lockCursor = true;
if (!Screen.lockCursor && wasLocked) {
if (!IsGamePaused())
PauseGame();
wasLocked = false;
} else if (Screen.lockCursor && !wasLocked) {
if (IsGamePaused())
UnPauseGame();
wasLocked = true;
}
}
function OnGUI () {
if (gameStatus.mainMenu.guiSkin != null)
GUI.skin = gameStatus.mainMenu.guiSkin;
GUI.color = gameStatus.mainMenu.guiColor;
if (isMainMenu) {
GUI.Label (Rect(0, Screen.height * 0.05, Screen.width, Screen.height * 0.1), gameStatus.mainMenu.gameTitle, gameStatus.mainMenu.titlesGuiStyle);
} else if (IsGamePaused()) {
if (pauseEffect == null && gameStatus.mainMenu.alternateBackground != null) {
var backgroundStyle : GUIStyle = new GUIStyle();
backgroundStyle.normal.background = gameStatus.mainMenu.alternateBackground;
GUI.Label (Rect(0, 0, Screen.width, Screen.height), "", backgroundStyle);
}
GUI.Label (Rect(0, Screen.height * 0.05, Screen.width, Screen.height * 0.1), "Paused", gameStatus.mainMenu.titlesGuiStyle);
} else {
if (ingameMenu)
ShowInGameMenu();
if (levelName)
GUI.Label (Rect(0, Screen.height - Screen.height * 0.1, Screen.width, Screen.height * 0.1), GameStatus.currentLevelName, gameStatus.mainMenu.textGuiStyle);
}
if (IsGamePaused() && !GameStatus.isLoading) {
switch (currentPage) {
case Page.Main:
PauseMenu();
break;
case Page.LoadLevels:
ShowLevels();
break;
case Page.Options:
ShowToolbar();
break;
case Page.Credits:
ShowCredits();
break;
}
}
ShowLegal();
}
function PauseMenu () {
BeginPage(gameStatus.mainMenu.menuWidth * 0.75, gameStatus.mainMenu.menuHeight);
GUILayout.BeginVertical ();
GUILayout.FlexibleSpace();
if (GUILayout.Button (isMainMenu ? "New Game" : "Continue")) {
UnPauseGame();
if (isMainMenu)
gameStatus.LoadLevelWithProgress(gameStatus.levels[0].level, gameStatus.levels[0].loadFadeTexture);
}
if (/*IsBrowser() && */!isMainMenu && GUILayout.Button ("Restart Level")) {
UnPauseGame();
// Application.OpenURL(restartUrl);
// Application.LoadLevel(Application.loadedLevel);
if (gameStatus.currTexture != null)
LevelLoadFade.FadeAndLoadLevel(Application.loadedLevelName, gameStatus.currTexture, gameStatus.mainMenu.fadeTime);
else
LevelLoadFade.FadeAndLoadLevel(Application.loadedLevelName, gameStatus.mainMenu.fadeColor, gameStatus.mainMenu.fadeTime);
}
if (gameStatus.levels.Length > 1 && gameStatus.levels[0].levelDone && GUILayout.Button ("Load Game")) {
currentPage = Page.LoadLevels;
}
if (!isMainMenu && GUILayout.Button ("Main Menu")) {
UnPauseGame();
gameStatus.ResetGame();
// Application.LoadLevel(gameStatus.mainMenuLevel);
if (gameStatus.mainMenu.fadeTexture != null)
LevelLoadFade.FadeAndLoadLevel(gameStatus.mainMenuLevel, gameStatus.mainMenu.fadeTexture, gameStatus.mainMenu.fadeTime);
else
LevelLoadFade.FadeAndLoadLevel(gameStatus.mainMenuLevel, gameStatus.mainMenu.fadeColor, gameStatus.mainMenu.fadeTime);
}
if (GUILayout.Button ("Options")) {
currentPage = Page.Options;
}
if (GUILayout.Button ("Credits")) {
currentPage = Page.Credits;
}
if (!IsBrowser() && GUILayout.Button ("Quit")) {
Application.Quit();
}
GUILayout.FlexibleSpace();
GUILayout.EndVertical();
EndPage();
}
function InGameMenu () {
ingameMenu = (player != null && player.gameObject.active) ? !ingameMenu : false;
}
function ShowInGameMenu () {
if (player == null || !player.gameObject.active)
return;
GUILayout.BeginArea(Rect((Screen.width - gameStatus.ingameMenu.ingameWidth) * 0.5, Screen.height * 0.05, gameStatus.ingameMenu.ingameWidth, gameStatus.ingameMenu.ingameHeight), "", gameStatus.ingameMenu.backGuiStyle);
GUILayout.BeginVertical ();
GUILayout.FlexibleSpace();
GUILayout.BeginHorizontal();
GUILayout.BeginVertical ();
GUILayout.Label ("Player controls:");
GUILayout.BeginHorizontal();
if (player.tpsCam != null) {
if (player.tpsCam.startThirdPerson && GUILayout.Button (GUIContent(gameStatus.ingameMenu.fpsView), gameStatus.ingameMenu.buttonsGuiStyle))
player.tpsCam.startThirdPerson = false;
else if (!player.tpsCam.startThirdPerson && GUILayout.Button(GUIContent(gameStatus.ingameMenu.tpsView), gameStatus.ingameMenu.buttonsGuiStyle))
player.tpsCam.startThirdPerson = true;
}
if ((player.tpsCam != null ? !player.tpsCam.downSight : !player.fpsCam.downSight) && GUILayout.Button (GUIContent(gameStatus.ingameMenu.inSight), gameStatus.ingameMenu.buttonsGuiStyle)) {
if (player.tpsCam != null)
player.tpsCam.downSight = true;
else
player.fpsCam.downsight = true;
} else if ((player.tpsCam != null ? player.tpsCam.downSight : player.fpsCam.downSight) && GUILayout.Button(GUIContent(gameStatus.ingameMenu.outOfSight), gameStatus.ingameMenu.buttonsGuiStyle)) {
if (player.tpsCam != null)
player.tpsCam.downSight = false;
else
player.fpsCam.downsight = false;
}
if ((player.tpsAnim != null ? !player.tpsAnim.crouch : !player.fpsAnim.crouch) && GUILayout.Button (GUIContent(gameStatus.ingameMenu.crouched), gameStatus.ingameMenu.buttonsGuiStyle)) {
if (player.tpsAnim != null)
player.tpsAnim.Crouch();
else
player.fpsAnim.Crouch();
} else if ((player.tpsAnim != null ? player.tpsAnim.crouch : player.fpsAnim.crouch) && GUILayout.Button(GUIContent(gameStatus.ingameMenu.standing), gameStatus.ingameMenu.buttonsGuiStyle)) {
if (player.tpsAnim != null)
player.tpsAnim.Crouch();
else
player.fpsAnim.Crouch();
}
GUILayout.EndHorizontal();
GUILayout.EndVertical();
GUILayout.FlexibleSpace();
if (player.weapons[0].hasWeapon || player.currentWeapon != 0) {
GUILayout.BeginVertical ();
GUILayout.Label ("Weapon controls:");
GUILayout.BeginHorizontal();
if (player.weapons[player.currentWeapon].weapon.switchModes) {
if (player.weapons[player.currentWeapon].weapon.burstMode == BurstMode.Auto && GUILayout.Button (GUIContent(gameStatus.ingameMenu.singleFireMode), gameStatus.ingameMenu.buttonsGuiStyle))
player.weapons[player.currentWeapon].weapon.burstMode = BurstMode.Single;
else if (player.weapons[player.currentWeapon].weapon.burstMode == BurstMode.Single && GUILayout.Button(GUIContent(gameStatus.ingameMenu.burstFireMode), gameStatus.ingameMenu.buttonsGuiStyle))
player.weapons[player.currentWeapon].weapon.burstMode = BurstMode.Burst;
else if (player.weapons[player.currentWeapon].weapon.burstMode == BurstMode.Burst && GUILayout.Button(GUIContent(gameStatus.ingameMenu.autoFireMode), gameStatus.ingameMenu.buttonsGuiStyle))
player.weapons[player.currentWeapon].weapon.burstMode = BurstMode.Auto;
}
if (!player.primary && GUILayout.Button (GUIContent(gameStatus.ingameMenu.privaryMode), gameStatus.ingameMenu.buttonsGuiStyle)) {
for (var switchWeapon : SwitchWeapons in player.switchWeapons) {
if (switchWeapon.primaryIndex == player.currentWeapon || switchWeapon.secondaryIndex == player.currentWeapon)
switchWeapon.SwitchWeapon();
}
} else if (player.primary && GUILayout.Button(GUIContent(gameStatus.ingameMenu.secondaryMode), gameStatus.ingameMenu.buttonsGuiStyle)) {
for (var switchWeapon : SwitchWeapons in player.switchWeapons) {
if (switchWeapon.primaryIndex == player.currentWeapon || switchWeapon.secondaryIndex == player.currentWeapon)
switchWeapon.SwitchWeapon();
}
}
if (GUILayout.Button(GUIContent(gameStatus.ingameMenu.previousWeapon), gameStatus.ingameMenu.buttonsGuiStyle))
PlayerWeapons.PreviousWeapon();
if (GUILayout.Button (GUIContent(gameStatus.ingameMenu.nextWeapon), gameStatus.ingameMenu.buttonsGuiStyle))
PlayerWeapons.NextWeapon();
if (GUILayout.Button(GUIContent(gameStatus.ingameMenu.dropWeapon), gameStatus.ingameMenu.buttonsGuiStyle))
player.Drop(player.currentWeapon, true);
GUILayout.EndHorizontal();
GUILayout.EndVertical();
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label ("Go to pause menu:");
GUILayout.FlexibleSpace();
if (GUILayout.Button(GUIContent(gameStatus.ingameMenu.pauseMenu), gameStatus.ingameMenu.buttonsGuiStyle)) {
ingameMenu = false;
PauseGame();
}
GUILayout.EndHorizontal();
GUILayout.FlexibleSpace();
GUILayout.EndVertical();
GUILayout.EndArea();
}
function PauseGame () {
savedTimeScale = Time.timeScale;
Screen.lockCursor = false;
currentPage = Page.Main;
if (!isMainMenu) {
Time.timeScale = 0.0;
AudioListener.pause = true;
pauseEffect = Camera.main.GetComponent(GameStatus.pauseEffect) as MonoBehaviour;
if (pauseEffect != null)
pauseEffect.enabled = true;
hideScripts = FindObjectsOfType(HideGuiWhenPaused) as HideGuiWhenPaused[];
for (var hideScript : HideGuiWhenPaused in hideScripts)
hideScript.DidPause(true);
}
}
function UnPauseGame () {
if (GameStatus.fullscreenMode)
Screen.SetResolution(GameStatus.savedRes.width, GameStatus.savedRes.height, true);
currentPage = Page.None;
if (!isMainMenu) {
// Time.timeScale = savedTimeScale;
Time.timeScale = 1.0;
Screen.lockCursor = true;
AudioListener.pause = false;
pauseEffect = Camera.main.GetComponent(GameStatus.pauseEffect) as MonoBehaviour;
if (pauseEffect != null)
pauseEffect.enabled = false;
hideScripts = FindObjectsOfType(HideGuiWhenPaused) as HideGuiWhenPaused[];
for (var hideScript : HideGuiWhenPaused in hideScripts)
hideScript.DidPause(false);
PlayerPrefs.SetFloat("mouseSensitivityX", GameStatus.mouseSensitivityX);
PlayerPrefs.SetFloat("mouseSensitivityY", GameStatus.mouseSensitivityY);
}
}
function BeginPage (width : float, height : float) {
GUILayout.BeginArea(Rect((Screen.width - width) * 0.01, (Screen.height - height) * 0.01, width, height), "", gameStatus.mainMenu.backGuiStyle);
}
function ShowBackButton () {
if (GUILayout.Button ("Back")) {
currentPage = Page.Main;
}
}
function EndPage () {
if (currentPage != Page.Main) {
ShowBackButton();
}
GUILayout.EndArea();
}
function ShowLevels () {
BeginPage(gameStatus.mainMenu.menuWidth, gameStatus.mainMenu.menuHeight);
GUILayout.Box ("Select level to load:");
var i : int;
var currLevel : int = 0;
for (i=0; i<gameStatus.levels.Length-1; i++) {
if (gameStatus.levels[i].levelDone)
currLevel = i+1;
}
if (currLevel >1 && !gameStatus.levels[currLevel].levelDone)
ShowHorizontal(currLevel, "Load current", 120);
scrollPosition = GUILayout.BeginScrollView (scrollPosition);
for (i=0; i<gameStatus.levels.Length-1; i++) {
if (gameStatus.levels[i].levelDone)
ShowHorizontal(i+1, "Load", 60);
}
GUILayout.EndScrollView ();
EndPage();
}
function ShowHorizontal (index : int, text : String, buttonWidth : int) {
GUILayout.BeginHorizontal("box");
if (gameStatus.levels[index].levelThumbnail != null)
GUILayout.Label (gameStatus.levels[index].levelThumbnail);
if (gameStatus.levels[index].levelDescription != "")
GUILayout.Label (gameStatus.levels[index].levelDescription);
else
GUILayout.Label (gameStatus.levels[index].level);
if (GUILayout.Button(text, GUILayout.Width(buttonWidth))) {
UnPauseGame();
gameStatus.LoadLevelWithProgress(gameStatus.levels[index].level, gameStatus.levels[index].loadFadeTexture);
}
GUILayout.EndHorizontal();
}
function ShowToolbar () {
BeginPage(gameStatus.mainMenu.menuWidth, gameStatus.mainMenu.menuHeight);
toolbarInt = GUILayout.Toolbar (toolbarInt, toolbarStrings);
switch (toolbarInt) {
case 0:
VolumeControl();
break;
case 1:
Qualities();
QualityControl();
break;
case 2:
GameSettings();
break;
case 3:
ShowDevice();
break;
}
EndPage();
}
function VolumeControl () {
GUILayout.Label ("Volume: "+AudioListener.volume.ToString("f1"));
AudioListener.volume = GUILayout.HorizontalSlider (AudioListener.volume, 0.0, 1.0);
}
function Qualities () {
var resolutions : Resolution[] = Screen.resolutions;
if (resolutions.length > 1 || Application.isEditor) {
if (!Screen.fullScreen)
GUILayout.Label ("Select fullscreen resolution:");
else
GUILayout.Label ("Select resolution:");
scrollPosition = GUILayout.BeginScrollView (scrollPosition);
for (var res in resolutions) {
if (GUILayout.Button (res.width+"x"+res.height)) {
if (Screen.fullScreen || IsBrowser()) {
Screen.SetResolution (res.width, res.height, true);
GameStatus.fullscreenMode = true;
} else {
Screen.SetResolution (res.width, res.height, false);
GameStatus.fullscreenMode = false;
}
GameStatus.savedRes = res;
}
}
GUILayout.EndScrollView ();
if (Screen.fullScreen || GameStatus.fullscreenMode) {
GUILayout.Label ("Fullscreen mode: "+GameStatus.savedRes.width+"x"+GameStatus.savedRes.height);
if (GUILayout.Button ("Exit fullscreen mode")) {
GameStatus.fullscreenMode = false;
if (Screen.fullScreen)
Screen.fullScreen = false;
}
} else {
GUILayout.Label("Window mode: "+Screen.width+"x"+Screen.height);
if (!IsBrowser() && GUILayout.Button("Switch to fullscreen mode")) {
GameStatus.fullscreenMode = true;
Screen.SetResolution (GameStatus.savedRes.width, GameStatus.savedRes.height, true);
}
}
}
switch (QualitySettings.currentLevel) {
case QualityLevel.Fastest:
GUILayout.Label("Quality: Fastest");
break;
case QualityLevel.Fast:
GUILayout.Label("Quality: Fast");
break;
case QualityLevel.Simple:
GUILayout.Label("Quality: Simple");
break;
case QualityLevel.Good:
GUILayout.Label("Quality: Good");
break;
case QualityLevel.Beautiful:
GUILayout.Label("Quality: Beautiful");
break;
case QualityLevel.Fantastic:
GUILayout.Label("Quality: Fantastic");
break;
}
}
function QualityControl () {
GUILayout.BeginHorizontal();
if (GUILayout.Button("Decrease")) {
QualitySettings.DecreaseLevel();
}
if (GUILayout.Button("Increase")) {
QualitySettings.IncreaseLevel();
}
GUILayout.EndHorizontal();
}
function GameSettings () {
if (GameStatus.gameType == GameType.ThirdPerson) {
GameStatus.combinedControls = GUILayout.Toggle(GameStatus.combinedControls, "Use combined controls for Player");
#if !UNITY_IPHONE && !UNITY_ANDROID
GameStatus.scrollSelectsWeapons = GUILayout.Toggle(GameStatus.scrollSelectsWeapons, "Select weapons with mouse scroll");
#endif
}
if (gameStatus.showRadarMenu) {
GameStatus.showRadar = GUILayout.Toggle(GameStatus.showRadar, "Show Radar");
GUILayout.Label ("Radar Map Scale: "+Radar.radarScale.ToString("f2"));
Radar.radarScale = GUILayout.HorizontalSlider(Radar.radarScale, 0.25, 4.0);
}
GUILayout.Label ("Mouse Sensitivity X: "+gameStatus.mouseSensitivityX.ToString("f1"));
gameStatus.mouseSensitivityX = GUILayout.HorizontalSlider(gameStatus.mouseSensitivityX, 1.0, 20.0);
GUILayout.Label ("Mouse Sensitivity Y: "+gameStatus.mouseSensitivityY.ToString("f1"));
gameStatus.mouseSensitivityY = GUILayout.HorizontalSlider(gameStatus.mouseSensitivityY, 0.5, 10.0);
#if !UNITY_IPHONE && !UNITY_ANDROID
GUILayout.Label ("Max number of blood projectors: "+gameStatus.maxProjectors);
gameStatus.maxProjectors = GUILayout.HorizontalSlider (gameStatus.maxProjectors, 0, 20);
#endif
}
function ShowDevice () {
GUILayout.Label ("Unity player version: "+Application.unityVersion);
GUILayout.Label ("Graphics: "+SystemInfo.graphicsDeviceName+" "+
SystemInfo.graphicsMemorySize+"MB\n"+
SystemInfo.graphicsDeviceVersion+"\n"+
SystemInfo.graphicsDeviceVendor);
GUILayout.Label ("Shadows: "+SystemInfo.supportsShadows);
GUILayout.Label ("Image Effects: "+SystemInfo.supportsImageEffects);
GUILayout.Label ("Render Textures: "+SystemInfo.supportsRenderTextures);
}
function ShowCredits () {
BeginPage(gameStatus.mainMenu.menuWidth, gameStatus.mainMenu.menuHeight);
GUILayout.Box ("Credits:");
for (var credit : String in gameStatus.mainMenu.credits) {
GUILayout.Label (credit);
}
GUILayout.BeginHorizontal();
for (var credit : Texture in gameStatus.mainMenu.creditIcons) {
GUILayout.Label (credit);
}
GUILayout.EndHorizontal();
EndPage();
}
function ShowLegal () {
if (!IsLegal()) {
GUI.Label (Rect(Screen.width - 130, Screen.height - 30, 130, 30), "the3daction.com");
}
}
function ShowLevelName () {
yield Time.timeSinceLevelLoad > 0.0;
while (LevelStatus.introDuration > 0.0) {
yield;
}
yield WaitForSeconds(1.0);
levelName = true;
yield WaitForSeconds(5.0);
levelName = false;
}
function IsGamePaused () {
if (!isMainMenu)
return Time.timeScale == 0.0;
return true;
}
function IsLegal () {
return !IsBrowser() || Application.absoluteURL.StartsWith("http://the3daction.com/");
}
static function IsDashboard () {
return Application.platform == RuntimePlatform.OSXDashboardPlayer;
}
static function IsBrowser () {
return (Application.platform == RuntimePlatform.WindowsWebPlayer ||
Application.platform == RuntimePlatform.OSXWebPlayer);
}
function OnMouseDown () {
if (!IsGamePaused())
Screen.lockCursor = true;
}
function OnApplicationPause (pause : boolean) {
if (IsGamePaused()) {
AudioListener.pause = pause;
}
}