mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-16 01:12:03 +00:00
561 lines
14 KiB
Text
561 lines
14 KiB
Text
/*
|
|
** playermenu.cpp
|
|
** The player setup menu
|
|
**
|
|
**---------------------------------------------------------------------------
|
|
** Copyright 2001-2010 Randy Heit
|
|
** Copyright 2010-2017 Christoph Oelckers
|
|
** All rights reserved.
|
|
**
|
|
** Redistribution and use in source and binary forms, with or without
|
|
** modification, are permitted provided that the following conditions
|
|
** are met:
|
|
**
|
|
** 1. Redistributions of source code must retain the above copyright
|
|
** notice, this list of conditions and the following disclaimer.
|
|
** 2. Redistributions in binary form must reproduce the above copyright
|
|
** notice, this list of conditions and the following disclaimer in the
|
|
** documentation and/or other materials provided with the distribution.
|
|
** 3. The name of the author may not be used to endorse or promote products
|
|
** derived from this software without specific prior written permission.
|
|
**
|
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
**---------------------------------------------------------------------------
|
|
**
|
|
*/
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
class OptionMenuItemPlayerNameField : OptionMenuItemTextField
|
|
{
|
|
OptionMenuItemTextField Init(String label)
|
|
{
|
|
Super.Init(label, "", null);
|
|
mEnter = null;
|
|
return self;
|
|
}
|
|
|
|
override bool, String GetString (int i)
|
|
{
|
|
if (i == 0)
|
|
{
|
|
return true, players[consoleplayer].GetUserName();
|
|
;
|
|
}
|
|
return false, "";
|
|
}
|
|
|
|
override bool SetString (int i, String s)
|
|
{
|
|
if (i == 0)
|
|
{
|
|
PlayerMenu.PlayerNameChanged(s);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
class OptionMenuItemPlayerTeamItem : OptionMenuItemOptionBase
|
|
{
|
|
OptionMenuItemPlayerTeamItem Init(String label, Name values)
|
|
{
|
|
Super.Init(label, 'none', values, null , false);
|
|
return self;
|
|
}
|
|
|
|
//=============================================================================
|
|
override int GetSelection()
|
|
{
|
|
int Selection = -1;
|
|
int cnt = OptionValues.GetCount(mValues);
|
|
if (cnt > 0)
|
|
{
|
|
int myteam = players[consoleplayer].GetTeam();
|
|
let f = double(myteam == Team.NoTeam? 0 : myteam + 1);
|
|
for(int i = 0; i < cnt; i++)
|
|
{
|
|
if (f ~== OptionValues.GetValue(mValues, i))
|
|
{
|
|
Selection = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return Selection;
|
|
}
|
|
|
|
override void SetSelection(int Selection)
|
|
{
|
|
int cnt = OptionValues.GetCount(mValues);
|
|
if (cnt > 0)
|
|
{
|
|
PlayerMenu.TeamChanged(Selection);
|
|
}
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
class OptionMenuItemPlayerColorItem : OptionMenuItemOptionBase
|
|
{
|
|
OptionMenuItemPlayerColorItem Init(String label, Name values)
|
|
{
|
|
Super.Init(label, 'none', values, null , false);
|
|
return self;
|
|
}
|
|
|
|
//=============================================================================
|
|
override int GetSelection()
|
|
{
|
|
int Selection = -1;
|
|
int cnt = OptionValues.GetCount(mValues);
|
|
if (cnt > 0)
|
|
{
|
|
int mycolorset = players[consoleplayer].GetColorSet();
|
|
let f = double(mycolorset);
|
|
for(int i = 0; i < cnt; i++)
|
|
{
|
|
if (f ~== OptionValues.GetValue(mValues, i))
|
|
{
|
|
Selection = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return Selection;
|
|
}
|
|
|
|
override void SetSelection(int Selection)
|
|
{
|
|
int cnt = OptionValues.GetCount(mValues);
|
|
if (cnt > 0)
|
|
{
|
|
let val = int(OptionValues.GetValue(mValues, Selection));
|
|
PlayerMenu.ColorSetChanged(val);
|
|
let menu = NewPlayerMenu(Menu.GetCurrentMenu());
|
|
if (menu) menu.UpdateTranslation();
|
|
}
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
class OptionMenuItemPlayerColorSlider : OptionMenuSliderBase
|
|
{
|
|
int mChannel;
|
|
|
|
OptionMenuItemPlayerColorSlider Init(String label, int channel)
|
|
{
|
|
Super.Init(label, 0, 255, 16, false, 'none');
|
|
mChannel = channel;
|
|
return self;
|
|
}
|
|
|
|
override double GetSliderValue()
|
|
{
|
|
Color colr = players[consoleplayer].GetColor();
|
|
if (mChannel == 0) return colr.r;
|
|
else if (mChannel == 1) return colr.g;
|
|
else return colr.b;
|
|
}
|
|
|
|
override void SetSliderValue(double val)
|
|
{
|
|
Color colr = players[consoleplayer].GetColor();
|
|
int r = colr.r;
|
|
int g = colr.g;
|
|
int b = colr.b;
|
|
if (mChannel == 0) r = int(val);
|
|
else if (mChannel == 1) g = int(val);
|
|
else b = int(val);
|
|
PlayerMenu.ColorChanged(r, g, b);
|
|
let menu = NewPlayerMenu(Menu.GetCurrentMenu());
|
|
if (menu) menu.UpdateTranslation();
|
|
}
|
|
|
|
override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected)
|
|
{
|
|
int mycolorset = players[consoleplayer].GetColorSet();
|
|
if (mycolorset == -1)
|
|
{
|
|
return super.Draw(desc, y, indent, selected);
|
|
}
|
|
return indent;
|
|
}
|
|
|
|
override bool Selectable()
|
|
{
|
|
int mycolorset = players[consoleplayer].GetColorSet();
|
|
return (mycolorset == -1);
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
class OptionMenuItemPlayerClassItem : OptionMenuItemOptionBase
|
|
{
|
|
OptionMenuItemPlayerClassItem Init(String label, Name values)
|
|
{
|
|
Super.Init(label, 'none', values, null , false);
|
|
return self;
|
|
}
|
|
|
|
//=============================================================================
|
|
override int GetSelection()
|
|
{
|
|
int Selection = -1;
|
|
int cnt = OptionValues.GetCount(mValues);
|
|
if (cnt > 0)
|
|
{
|
|
double f = players[consoleplayer].GetPlayerClassNum();
|
|
for(int i = 0; i < cnt; i++)
|
|
{
|
|
if (f ~== OptionValues.GetValue(mValues, i))
|
|
{
|
|
Selection = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return Selection;
|
|
}
|
|
|
|
override void SetSelection(int Selection)
|
|
{
|
|
|
|
int cnt = OptionValues.GetCount(mValues);
|
|
if (cnt > 1)
|
|
{
|
|
let val = int(OptionValues.GetValue(mValues, Selection));
|
|
let menu = NewPlayerMenu(Menu.GetCurrentMenu());
|
|
if (menu)
|
|
{
|
|
menu.PickPlayerClass(val);
|
|
PlayerMenu.ClassChanged(val, menu.mPlayerClass);
|
|
menu.mPlayerDisplay.SetValue(ListMenuItemPlayerDisplay.PDF_CLASS, players[consoleplayer].GetPlayerClassNum());
|
|
menu.UpdateSkins();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
class OptionMenuItemPlayerSkinItem : OptionMenuItemOptionBase
|
|
{
|
|
OptionMenuItemPlayerSkinItem Init(String label, Name values)
|
|
{
|
|
Super.Init(label, 'none', values, null , false);
|
|
return self;
|
|
}
|
|
|
|
//=============================================================================
|
|
override int GetSelection()
|
|
{
|
|
int Selection = 0;
|
|
int cnt = OptionValues.GetCount(mValues);
|
|
if (cnt > 1)
|
|
{
|
|
double f = players[consoleplayer].GetSkin();
|
|
for(int i = 0; i < cnt; i++)
|
|
{
|
|
if (f ~== OptionValues.GetValue(mValues, i))
|
|
{
|
|
Selection = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return Selection;
|
|
}
|
|
|
|
override void SetSelection(int Selection)
|
|
{
|
|
|
|
int cnt = OptionValues.GetCount(mValues);
|
|
if (cnt > 1)
|
|
{
|
|
let val = int(OptionValues.GetValue(mValues, Selection));
|
|
let menu = NewPlayerMenu(Menu.GetCurrentMenu());
|
|
PlayerMenu.SkinChanged(val);
|
|
if (menu)
|
|
{
|
|
menu.mPlayerDisplay.SetValue(ListMenuItemPlayerDisplay.PDF_SKIN, val);
|
|
menu.UpdateTranslation();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
class OptionMenuItemPlayerGenderItem : OptionMenuItemOptionBase
|
|
{
|
|
OptionMenuItemPlayerGenderItem Init(String label, Name values)
|
|
{
|
|
Super.Init(label, 'none', values, null , false);
|
|
return self;
|
|
}
|
|
|
|
//=============================================================================
|
|
override int GetSelection()
|
|
{
|
|
return players[consoleplayer].GetGender();
|
|
}
|
|
|
|
override void SetSelection(int Selection)
|
|
{
|
|
PlayerMenu.GenderChanged(Selection);
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
class OptionMenuItemAutoaimSlider : OptionMenuSliderBase
|
|
{
|
|
OptionMenuItemAutoaimSlider Init(String label)
|
|
{
|
|
Super.Init(label, 0, 35, 1, false, 'none');
|
|
return self;
|
|
}
|
|
|
|
override double GetSliderValue()
|
|
{
|
|
return players[consoleplayer].GetAutoaim();
|
|
}
|
|
|
|
override void SetSliderValue(double val)
|
|
{
|
|
PlayerMenu.AutoaimChanged(val);
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
class OptionMenuItemPlayerSwitchOnPickupItem : OptionMenuItemOptionBase
|
|
{
|
|
OptionMenuItemPlayerSwitchOnPickupItem Init(String label, Name values)
|
|
{
|
|
Super.Init(label, 'none', values, null , false);
|
|
return self;
|
|
}
|
|
|
|
//=============================================================================
|
|
override int GetSelection()
|
|
{
|
|
return players[consoleplayer].GetNeverSwitch()? 1:0;
|
|
}
|
|
|
|
override void SetSelection(int Selection)
|
|
{
|
|
PlayerMenu.SwitchOnPickupChanged(Selection);
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
class NewPlayerMenu : OptionMenu
|
|
{
|
|
PlayerClass mPlayerClass;
|
|
int mRotation;
|
|
PlayerMenuPlayerDisplay mPlayerDisplay;
|
|
|
|
const PLAYERDISPLAY_X = 170;
|
|
const PLAYERDISPLAY_Y = 60;
|
|
const PLAYERDISPLAY_W = 144;
|
|
const PLAYERDISPLAY_H = 160;
|
|
const PLAYERDISPLAY_SPACE = 180;
|
|
|
|
override void Init(Menu parent, OptionMenuDescriptor desc)
|
|
{
|
|
Super.Init(parent, desc);
|
|
let BaseColor = gameinfo.gametype == GAME_Hexen? 0x200000 : 0x000700;
|
|
let AddColor = gameinfo.gametype == GAME_Hexen? 0x800040 : 0x405340;
|
|
mPlayerDisplay = new("PlayerMenuPlayerDisplay");
|
|
mPlayerDisplay.init(BaseColor, AddColor);
|
|
PickPlayerClass();
|
|
|
|
PlayerInfo p = players[consoleplayer];
|
|
mRotation = 0;
|
|
|
|
mPlayerDisplay.SetValue(ListMenuItemPlayerDisplay.PDF_ROTATION, 0);
|
|
mPlayerDisplay.SetValue(ListMenuItemPlayerDisplay.PDF_MODE, 1);
|
|
mPlayerDisplay.SetValue(ListMenuItemPlayerDisplay.PDF_TRANSLATE, 1);
|
|
mPlayerDisplay.SetValue(ListMenuItemPlayerDisplay.PDF_CLASS, p.GetPlayerClassNum());
|
|
UpdateSkins();
|
|
}
|
|
|
|
override int GetIndent()
|
|
{
|
|
return Super.GetIndent() - 75*CleanXfac_1;
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
void UpdateTranslation()
|
|
{
|
|
Translation.SetPlayerTranslation(TRANSLATION_Players, MAXPLAYERS, consoleplayer, mPlayerClass);
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
static int GetPlayerClassIndex(int pick = -100)
|
|
{
|
|
int pclass = 0;
|
|
// [GRB] Pick a class from player class list
|
|
if (PlayerClasses.Size () > 1)
|
|
{
|
|
pclass = pick == -100? players[consoleplayer].GetPlayerClassNum() : pick;
|
|
|
|
if (pclass < 0)
|
|
{
|
|
pclass = (MenuTime() >> 7) % PlayerClasses.Size ();
|
|
}
|
|
}
|
|
return pclass;
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
void PickPlayerClass(int pick = -100)
|
|
{
|
|
let PlayerClassIndex = GetPlayerClassIndex(pick);
|
|
mPlayerClass = PlayerClasses[PlayerClassIndex];
|
|
UpdateColorsets(mPlayerClass);
|
|
UpdateSkinOptions(mPlayerClass);
|
|
UpdateTranslation();
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
void UpdateSkins()
|
|
{
|
|
PlayerInfo p = players[consoleplayer];
|
|
if (mPlayerClass != NULL && !(GetDefaultByType (mPlayerClass.Type).bNoSkin) && p.GetPlayerClassNum() != -1)
|
|
{
|
|
mPlayerDisplay.SetValue(ListMenuItemPlayerDisplay.PDF_SKIN, p.GetSkin());
|
|
}
|
|
UpdateTranslation();
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
override bool OnUIEvent(UIEvent ev)
|
|
{
|
|
if (ev.Type == UIEvent.Type_Char && ev.KeyChar == 32)
|
|
{
|
|
// turn the player sprite around
|
|
mRotation = 8 - mRotation;
|
|
mPlayerDisplay.SetValue(ListMenuItemPlayerDisplay.PDF_ROTATION, mRotation);
|
|
return true;
|
|
}
|
|
return Super.OnUIEvent(ev);
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
override void Ticker()
|
|
{
|
|
mPlayerDisplay.Ticker();
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
override void Drawer()
|
|
{
|
|
Super.Drawer();
|
|
mPlayerDisplay.Drawer(false);
|
|
|
|
int x = screen.GetWidth()/(CleanXfac_1*2) + PLAYERDISPLAY_X + PLAYERDISPLAY_W/2;
|
|
int y = PLAYERDISPLAY_Y + PLAYERDISPLAY_H + 5;
|
|
String str = Stringtable.Localize("$PLYRMNU_PRESSSPACE");
|
|
screen.DrawText (NewSmallFont, Font.CR_GOLD, x - NewSmallFont.StringWidth(str)/2, y, str, DTA_VirtualWidth, CleanWidth_1, DTA_VirtualHeight, CleanHeight_1, DTA_KeepRatio, true);
|
|
str = Stringtable.Localize(mRotation ? "$PLYRMNU_SEEFRONT" : "$PLYRMNU_SEEBACK");
|
|
y += NewSmallFont.GetHeight();
|
|
screen.DrawText (NewSmallFont, Font.CR_GOLD,x - NewSmallFont.StringWidth(str)/2, y, str, DTA_VirtualWidth, CleanWidth_1, DTA_VirtualHeight, CleanHeight_1, DTA_KeepRatio, true);
|
|
|
|
}
|
|
}
|