mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-02-22 03:51:11 +00:00
- sync menu branch with trunk
SVN r2809 (menu)
This commit is contained in:
parent
29cd8f3357
commit
bae1456499
24 changed files with 413 additions and 193 deletions
|
@ -657,7 +657,6 @@ add_executable( zdoom WIN32
|
|||
m_cheat.cpp
|
||||
m_joy.cpp
|
||||
m_misc.cpp
|
||||
m_options.cpp
|
||||
m_png.cpp
|
||||
m_random.cpp
|
||||
md5.cpp
|
||||
|
|
|
@ -586,7 +586,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_BFGSpray)
|
|||
damage += (pr_bfgspray() & 7) + 1;
|
||||
|
||||
thingToHit = linetarget;
|
||||
P_DamageMobj (thingToHit, self->target, self->target, damage, NAME_BFGSplash);
|
||||
P_DamageMobj (thingToHit, self->target, self->target, damage, spray->DamageType);
|
||||
P_TraceBleed (damage, thingToHit, self->target);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -233,7 +233,7 @@ void G_DeferedInitNew (const char *mapname, int newskill)
|
|||
|
||||
void G_DeferedInitNew (FGameStartup *gs)
|
||||
{
|
||||
playerclass = gs->PlayerClass;
|
||||
if (gs->PlayerClass != NULL) playerclass = gs->PlayerClass;
|
||||
d_mapname = AllEpisodes[gs->Episode].mEpisodeMap;
|
||||
d_skill = gs->Skill;
|
||||
CheckWarpTransMap (d_mapname, true);
|
||||
|
|
|
@ -104,12 +104,16 @@ DMenu::DMenu(DMenu *parent)
|
|||
|
||||
bool DMenu::Responder (event_t *ev)
|
||||
{
|
||||
bool res = false;
|
||||
if (ev->type == EV_GUI_Event)
|
||||
{
|
||||
if (ev->subtype == EV_GUI_LButtonDown)
|
||||
{
|
||||
MouseEventBack(MOUSE_Click, ev->data1, ev->data2);
|
||||
if (MouseEvent(MOUSE_Click, ev->data1, ev->data2))
|
||||
res = MouseEventBack(MOUSE_Click, ev->data1, ev->data2);
|
||||
// make the menu's mouse handler believe that the current coordinate is outside the valid range
|
||||
if (res) ev->data2 = -1;
|
||||
res |= MouseEvent(MOUSE_Click, ev->data1, ev->data2);
|
||||
if (res)
|
||||
{
|
||||
SetCapture();
|
||||
}
|
||||
|
@ -120,8 +124,9 @@ bool DMenu::Responder (event_t *ev)
|
|||
BackbuttonTime = BACKBUTTON_TIME;
|
||||
if (mMouseCapture || m_use_mouse == 1)
|
||||
{
|
||||
MouseEventBack(MOUSE_Move, ev->data1, ev->data2);
|
||||
return MouseEvent(MOUSE_Move, ev->data1, ev->data2);
|
||||
res = MouseEventBack(MOUSE_Move, ev->data1, ev->data2);
|
||||
if (res) ev->data2 = -1;
|
||||
res |= MouseEvent(MOUSE_Move, ev->data1, ev->data2);
|
||||
}
|
||||
}
|
||||
else if (ev->subtype == EV_GUI_LButtonUp)
|
||||
|
@ -129,8 +134,9 @@ bool DMenu::Responder (event_t *ev)
|
|||
if (mMouseCapture)
|
||||
{
|
||||
ReleaseCapture();
|
||||
MouseEventBack(MOUSE_Release, ev->data1, ev->data2);
|
||||
return MouseEvent(MOUSE_Release, ev->data1, ev->data2);
|
||||
res = MouseEventBack(MOUSE_Release, ev->data1, ev->data2);
|
||||
if (res) ev->data2 = -1;
|
||||
res |= MouseEvent(MOUSE_Release, ev->data1, ev->data2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -205,13 +211,14 @@ bool DMenu::MouseEventBack(int type, int x, int y)
|
|||
{
|
||||
if (m_show_backbutton&1) x -= screen->GetWidth() - tex->GetScaledWidth() * CleanXfac;
|
||||
if (m_show_backbutton&2) y -= screen->GetHeight() - tex->GetScaledHeight() * CleanYfac;
|
||||
mBackbuttonSelected = (x >= 0 && x < tex->GetScaledWidth() * CleanXfac && y < tex->GetScaledHeight() * CleanYfac);
|
||||
mBackbuttonSelected = ( x >= 0 && x < tex->GetScaledWidth() * CleanXfac &&
|
||||
y >= 0 && y < tex->GetScaledHeight() * CleanYfac);
|
||||
if (mBackbuttonSelected && type == MOUSE_Release)
|
||||
{
|
||||
if (m_use_mouse == 2) mBackbuttonSelected = false;
|
||||
MenuEvent(MKEY_Back, true);
|
||||
}
|
||||
return true;
|
||||
return mBackbuttonSelected;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
@ -343,6 +350,7 @@ void M_SetMenu(FName menu, int param)
|
|||
GameStartupInfo.Skill = -1;
|
||||
GameStartupInfo.Episode = -1;
|
||||
GameStartupInfo.PlayerClass =
|
||||
param == -1000? NULL :
|
||||
param == -1? "Random" : PlayerClasses[param].Type->Meta.GetMetaString (APMETA_DisplayName);
|
||||
break;
|
||||
|
||||
|
@ -665,29 +673,30 @@ void M_Ticker (void)
|
|||
{
|
||||
DMenu::MenuTime++;
|
||||
if (DMenu::CurrentMenu != NULL && menuactive != MENU_Off)
|
||||
{
|
||||
DMenu::CurrentMenu->Ticker();
|
||||
|
||||
for (int i = 0; i < NUM_MKEYS; ++i)
|
||||
{
|
||||
if (MenuButtons[i].bDown)
|
||||
for (int i = 0; i < NUM_MKEYS; ++i)
|
||||
{
|
||||
if (MenuButtonTickers[i] > 0 && --MenuButtonTickers[i] <= 0)
|
||||
if (MenuButtons[i].bDown)
|
||||
{
|
||||
MenuButtonTickers[i] = KEY_REPEAT_RATE;
|
||||
DMenu::CurrentMenu->MenuEvent(i, MenuButtonOrigin[i]);
|
||||
if (MenuButtonTickers[i] > 0 && --MenuButtonTickers[i] <= 0)
|
||||
{
|
||||
MenuButtonTickers[i] = KEY_REPEAT_RATE;
|
||||
DMenu::CurrentMenu->MenuEvent(i, MenuButtonOrigin[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (BackbuttonTime > 0)
|
||||
{
|
||||
if (BackbuttonAlpha < FRACUNIT) BackbuttonAlpha += FRACUNIT/10;
|
||||
BackbuttonTime--;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (BackbuttonAlpha > 0) BackbuttonAlpha -= FRACUNIT/10;
|
||||
if (BackbuttonAlpha < 0) BackbuttonAlpha = 0;
|
||||
if (BackbuttonTime > 0)
|
||||
{
|
||||
if (BackbuttonAlpha < FRACUNIT) BackbuttonAlpha += FRACUNIT/10;
|
||||
BackbuttonTime--;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (BackbuttonAlpha > 0) BackbuttonAlpha -= FRACUNIT/10;
|
||||
if (BackbuttonAlpha < 0) BackbuttonAlpha = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -749,13 +749,13 @@ static void ParseOptionMenuBody(FScanner &sc, FOptionMenuDescriptor *desc)
|
|||
sc.MustGetStringName(",");
|
||||
sc.MustGetFloat();
|
||||
double step = sc.Float;
|
||||
bool showvalue = true;
|
||||
int showvalue = 1;
|
||||
if (sc.CheckString(","))
|
||||
{
|
||||
sc.MustGetNumber();
|
||||
showvalue = !!sc.Number;
|
||||
showvalue = sc.Number;
|
||||
}
|
||||
FOptionMenuItem *it = new FOptionMenuSliderCVar(text, action, min, max, step, showvalue? 1:-1);
|
||||
FOptionMenuItem *it = new FOptionMenuSliderCVar(text, action, min, max, step, showvalue);
|
||||
desc->mItems.Push(it);
|
||||
}
|
||||
else if (sc.Compare("screenresolution"))
|
||||
|
@ -1006,7 +1006,15 @@ static void BuildPlayerclassMenu()
|
|||
// center the menu on the screen if the top space is larger than the bottom space
|
||||
int totalheight = posy + (numclassitems+1) * ld->mLinespacing - topy;
|
||||
|
||||
if (totalheight <= 190 || numclassitems == 1)
|
||||
if (numclassitems <= 1)
|
||||
{
|
||||
// create a dummy item that auto-chooses the default class.
|
||||
FListMenuItemText *it = new FListMenuItemText(0, 0, 0, 'p', "player",
|
||||
ld->mFont,ld->mFontColor, NAME_Episodemenu, -1000);
|
||||
ld->mAutoselect = ld->mItems.Push(it);
|
||||
success = true;
|
||||
}
|
||||
else if (totalheight <= 190)
|
||||
{
|
||||
int newtop = (200 - totalheight + topy) / 2;
|
||||
int topdelta = newtop - topy;
|
||||
|
@ -1051,10 +1059,6 @@ static void BuildPlayerclassMenu()
|
|||
ld->mItems.Push(it);
|
||||
}
|
||||
}
|
||||
if (n < 2)
|
||||
{
|
||||
ld->mAutoselect = ld->mSelectedItem;
|
||||
}
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
|
@ -1327,7 +1331,11 @@ void M_StartupSkillMenu(FGameStartup *gs)
|
|||
}
|
||||
if (AllEpisodes[gs->Episode].mNoSkill || AllSkills.Size() == 1)
|
||||
{
|
||||
ld->mAutoselect = MIN(2u, AllEpisodes.Size()-1);
|
||||
ld->mAutoselect = firstitem + MIN(2u, AllEpisodes.Size()-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
ld->mAutoselect = -1;
|
||||
}
|
||||
success = true;
|
||||
}
|
||||
|
|
|
@ -66,47 +66,6 @@ void M_DrawConText (int color, int x, int y, const char *str)
|
|||
TAG_DONE);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
//
|
||||
// Draw a slider. Set fracdigits negative to not display the current value numerically.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
void M_DrawSlider (int x, int y, double min, double max, double cur,int fracdigits)
|
||||
{
|
||||
double range;
|
||||
|
||||
range = max - min;
|
||||
double ccur = clamp(cur, min, max) - min;
|
||||
|
||||
if (CleanXfac > CleanXfac_1)
|
||||
{
|
||||
M_DrawConText(CR_WHITE, x, y, "\x10\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x12");
|
||||
M_DrawConText(CR_ORANGE, x + int((5 + ((ccur * 78) / range)) * CleanXfac_1), y, "\x13");
|
||||
|
||||
if (fracdigits >= 0)
|
||||
{
|
||||
char textbuf[16];
|
||||
mysnprintf(textbuf, countof(textbuf), "%.*f", fracdigits, cur);
|
||||
screen->DrawText(SmallFont, CR_DARKGRAY, x + (12*8 + 4) * CleanXfac_1, y, textbuf, DTA_CleanNoMove_1, true, TAG_DONE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// On 320x200 we need a shorter slider
|
||||
M_DrawConText(CR_WHITE, x, y, "\x10\x11\x11\x11\x11\x11\x12");
|
||||
M_DrawConText(CR_ORANGE, x + int((5 + ((ccur * 38) / range)) * CleanXfac_1), y, "\x13");
|
||||
|
||||
if (fracdigits >= 0)
|
||||
{
|
||||
char textbuf[16];
|
||||
mysnprintf(textbuf, countof(textbuf), "%.*f", fracdigits, cur);
|
||||
screen->DrawText(SmallFont, CR_DARKGRAY, x + (7*8 + 4) * CleanXfac_1, y, textbuf, DTA_CleanNoMove_1, true, TAG_DONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
IMPLEMENT_CLASS(DOptionMenu)
|
||||
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
|
||||
|
||||
void M_DrawConText (int color, int x, int y, const char *str);
|
||||
void M_DrawSlider (int x, int y, double min, double max, double cur,int fracdigits);
|
||||
void M_SetVideoMode();
|
||||
|
||||
|
||||
|
@ -551,6 +550,8 @@ class FOptionMenuSliderBase : public FOptionMenuItem
|
|||
double mMin, mMax, mStep;
|
||||
int mShowValue;
|
||||
int mDrawX;
|
||||
int mSliderShort;
|
||||
|
||||
public:
|
||||
FOptionMenuSliderBase(const char *label, double min, double max, double step, int showval)
|
||||
: FOptionMenuItem(label, NAME_None)
|
||||
|
@ -560,17 +561,63 @@ public:
|
|||
mStep = step;
|
||||
mShowValue = showval;
|
||||
mDrawX = 0;
|
||||
mSliderShort = 0;
|
||||
}
|
||||
|
||||
virtual double GetValue() = 0;
|
||||
virtual void SetValue(double val) = 0;
|
||||
|
||||
//=============================================================================
|
||||
//
|
||||
// Draw a slider. Set fracdigits negative to not display the current value numerically.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
void DrawSlider (int x, int y, double min, double max, double cur,int fracdigits, int indent)
|
||||
{
|
||||
char textbuf[16];
|
||||
double range;
|
||||
int maxlen = 0;
|
||||
int right = x + (12*8 + 4) * CleanXfac_1;
|
||||
|
||||
range = max - min;
|
||||
double ccur = clamp(cur, min, max) - min;
|
||||
|
||||
if (fracdigits >= 0)
|
||||
{
|
||||
mysnprintf(textbuf, countof(textbuf), "%.*f", fracdigits, max);
|
||||
maxlen = SmallFont->StringWidth(textbuf) * CleanXfac_1;
|
||||
}
|
||||
|
||||
mSliderShort = right + maxlen > screen->GetWidth();
|
||||
|
||||
if (!mSliderShort)
|
||||
{
|
||||
M_DrawConText(CR_WHITE, x, y, "\x10\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x12");
|
||||
M_DrawConText(CR_ORANGE, x + int((5 + ((ccur * 78) / range)) * CleanXfac_1), y, "\x13");
|
||||
}
|
||||
else
|
||||
{
|
||||
// On 320x200 we need a shorter slider
|
||||
M_DrawConText(CR_WHITE, x, y, "\x10\x11\x11\x11\x11\x11\x12");
|
||||
M_DrawConText(CR_ORANGE, x + int((5 + ((ccur * 38) / range)) * CleanXfac_1), y, "\x13");
|
||||
right -= 5*8*CleanXfac_1;
|
||||
}
|
||||
|
||||
if (fracdigits >= 0 && right + maxlen <= screen->GetWidth())
|
||||
{
|
||||
mysnprintf(textbuf, countof(textbuf), "%.*f", fracdigits, cur);
|
||||
screen->DrawText(SmallFont, CR_DARKGRAY, right, y, textbuf, DTA_CleanNoMove_1, true, TAG_DONE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================
|
||||
int Draw(FOptionMenuDescriptor *desc, int y, int indent, bool selected)
|
||||
{
|
||||
drawLabel(indent, y, selected? OptionSettings.mFontColorSelection : OptionSettings.mFontColor);
|
||||
mDrawX = indent + CURSORSPACE;
|
||||
M_DrawSlider (mDrawX, y + OptionSettings.mLabelOffset, mMin, mMax, GetValue(), mShowValue);
|
||||
DrawSlider (mDrawX, y + OptionSettings.mLabelOffset, mMin, mMax, GetValue(), mShowValue, indent);
|
||||
return indent;
|
||||
}
|
||||
|
||||
|
@ -609,7 +656,7 @@ public:
|
|||
}
|
||||
|
||||
int slide_left = mDrawX+8*CleanXfac_1;
|
||||
int slide_right = slide_left + 10*8*CleanXfac_1; // 12 char cells with 8 pixels each.
|
||||
int slide_right = slide_left + (10*8*CleanXfac_1 >> mSliderShort); // 12 char cells with 8 pixels each.
|
||||
|
||||
if (type == DMenu::MOUSE_Click)
|
||||
{
|
||||
|
|
|
@ -424,14 +424,18 @@ void FListMenuItemPlayerDisplay::SetPlayerClass(int classnum, bool force)
|
|||
|
||||
bool FListMenuItemPlayerDisplay::UpdatePlayerClass()
|
||||
{
|
||||
int classnum;
|
||||
FName seltype = mOwner->mItems[mOwner->mSelectedItem]->GetAction(&classnum);
|
||||
if (mOwner->mSelectedItem >= 0)
|
||||
{
|
||||
int classnum;
|
||||
FName seltype = mOwner->mItems[mOwner->mSelectedItem]->GetAction(&classnum);
|
||||
|
||||
if (seltype != NAME_Episodemenu) return false;
|
||||
if (PlayerClasses.Size() == 0) return false;
|
||||
if (seltype != NAME_Episodemenu) return false;
|
||||
if (PlayerClasses.Size() == 0) return false;
|
||||
|
||||
SetPlayerClass(classnum);
|
||||
return true;
|
||||
SetPlayerClass(classnum);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
|
|
@ -162,6 +162,7 @@ void FPlayerNameBox::Drawer(bool selected)
|
|||
{
|
||||
size_t l = strlen(mEditName);
|
||||
mEditName[l] = (gameinfo.gametype & (GAME_DoomStrifeChex)) ? '_' : '[';
|
||||
mEditName[l+1] = 0;
|
||||
|
||||
screen->DrawText (SmallFont, CR_UNTRANSLATED, x + mFrameSize, mYpos, mEditName,
|
||||
DTA_Clean, true, TAG_DONE);
|
||||
|
@ -297,7 +298,7 @@ bool FValueTextItem::MenuEvent (int mkey, bool fromcontroller)
|
|||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return (mkey == MKEY_Enter); // needs to eat enter keys so that Activate won't get called
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
@ -898,11 +899,11 @@ void DPlayerMenu::ClassChanged (FListMenuItem *li)
|
|||
if (li->GetValue(0, &sel))
|
||||
{
|
||||
players[consoleplayer].userinfo.PlayerClass = sel-1;
|
||||
PickPlayerClass();
|
||||
|
||||
cvar_set ("playerclass",
|
||||
sel == 0 ? "Random" : PlayerClass->Type->Meta.GetMetaString (APMETA_DisplayName));
|
||||
|
||||
PickPlayerClass();
|
||||
UpdateSkins();
|
||||
UpdateColorsets();
|
||||
UpdateTranslation();
|
||||
|
|
|
@ -2547,6 +2547,8 @@ enum
|
|||
APROP_Notrigger = 23,
|
||||
APROP_DamageFactor = 24,
|
||||
APROP_MasterTID = 25,
|
||||
APROP_TargetTID = 26,
|
||||
APROP_TracerTID = 27
|
||||
};
|
||||
|
||||
// These are needed for ACS's APROP_RenderStyle
|
||||
|
@ -2786,6 +2788,8 @@ int DLevelScript::GetActorProperty (int tid, int property)
|
|||
}
|
||||
case APROP_Score: return actor->Score;
|
||||
case APROP_MasterTID: return DoGetMasterTID (actor);
|
||||
case APROP_TargetTID: return (actor->target != NULL)? actor->target->tid : 0;
|
||||
case APROP_TracerTID: return (actor->tracer != NULL)? actor->tracer->tid : 0;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
@ -2817,6 +2821,8 @@ int DLevelScript::CheckActorProperty (int tid, int property, int value)
|
|||
case APROP_JumpZ:
|
||||
case APROP_Score:
|
||||
case APROP_MasterTID:
|
||||
case APROP_TargetTID:
|
||||
case APROP_TracerTID:
|
||||
return (GetActorProperty(tid, property) == value);
|
||||
|
||||
// Boolean values need to compare to a binary version of value
|
||||
|
@ -5040,7 +5046,7 @@ int DLevelScript::RunScript ()
|
|||
}
|
||||
else if (activator)
|
||||
{
|
||||
work += RUNTIME_TYPE(activator)->TypeName.GetChars();
|
||||
work += activator->GetTag();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -5834,15 +5840,22 @@ int DLevelScript::RunScript ()
|
|||
case PCD_GETACTORY:
|
||||
case PCD_GETACTORZ:
|
||||
{
|
||||
AActor *actor = SingleActorFromTID (STACK(1), activator);
|
||||
|
||||
if (actor == NULL)
|
||||
if(STACK(1) == 0)
|
||||
{
|
||||
STACK(1) = 0;
|
||||
STACK(1) = (&activator->x)[pcd - PCD_GETACTORX];
|
||||
}
|
||||
else
|
||||
{
|
||||
STACK(1) = (&actor->x)[pcd - PCD_GETACTORX];
|
||||
AActor *actor = SingleActorFromTID (STACK(1), activator);
|
||||
|
||||
if (actor == NULL)
|
||||
{
|
||||
STACK(1) = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
STACK(1) = (&actor->x)[pcd - PCD_GETACTORX];
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -5850,50 +5863,77 @@ int DLevelScript::RunScript ()
|
|||
case PCD_GETACTORFLOORZ:
|
||||
case PCD_GETACTORCEILINGZ:
|
||||
{
|
||||
AActor *actor = SingleActorFromTID (STACK(1), activator);
|
||||
|
||||
if (actor == NULL)
|
||||
if(STACK(1) == 0)
|
||||
{
|
||||
STACK(1) = 0;
|
||||
}
|
||||
else if (pcd == PCD_GETACTORFLOORZ)
|
||||
{
|
||||
STACK(1) = actor->floorz;
|
||||
if (pcd == PCD_GETACTORFLOORZ)
|
||||
{
|
||||
STACK(1) = activator->floorz;
|
||||
}
|
||||
else if(STACK(1) == 0)
|
||||
{
|
||||
STACK(1) = activator->ceilingz;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
STACK(1) = actor->ceilingz;
|
||||
}
|
||||
AActor *actor = SingleActorFromTID (STACK(1), activator);
|
||||
|
||||
if (actor == NULL)
|
||||
{
|
||||
STACK(1) = 0;
|
||||
}
|
||||
else if (pcd == PCD_GETACTORFLOORZ)
|
||||
{
|
||||
STACK(1) = actor->floorz;
|
||||
}
|
||||
else
|
||||
{
|
||||
STACK(1) = actor->ceilingz;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PCD_GETACTORANGLE:
|
||||
{
|
||||
AActor *actor = SingleActorFromTID (STACK(1), activator);
|
||||
|
||||
if (actor == NULL)
|
||||
if(STACK(1) == 0)
|
||||
{
|
||||
STACK(1) = 0;
|
||||
STACK(1) = activator->angle >> 16;
|
||||
}
|
||||
else
|
||||
{
|
||||
STACK(1) = actor->angle >> 16;
|
||||
AActor *actor = SingleActorFromTID (STACK(1), activator);
|
||||
|
||||
if (actor == NULL)
|
||||
{
|
||||
STACK(1) = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
STACK(1) = actor->angle >> 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PCD_GETACTORPITCH:
|
||||
{
|
||||
AActor *actor = SingleActorFromTID (STACK(1), activator);
|
||||
|
||||
if (actor == NULL)
|
||||
if(STACK(1) == 0)
|
||||
{
|
||||
STACK(1) = 0;
|
||||
STACK(1) = activator->pitch >> 16;
|
||||
}
|
||||
else
|
||||
{
|
||||
STACK(1) = actor->pitch >> 16;
|
||||
AActor *actor = SingleActorFromTID (STACK(1), activator);
|
||||
|
||||
if (actor == NULL)
|
||||
{
|
||||
STACK(1) = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
STACK(1) = actor->pitch >> 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -851,6 +851,48 @@ static int FindGLNodesInFile(FileReader * f, const char * label)
|
|||
|
||||
bool P_LoadGLNodes(MapData * map)
|
||||
{
|
||||
|
||||
if (map->MapLumps[ML_GLZNODES].Size != 0)
|
||||
{
|
||||
const int idcheck = MAKE_ID('Z','G','L','N');
|
||||
const int idcheck2 = MAKE_ID('Z','G','L','2');
|
||||
const int idcheck3 = MAKE_ID('X','G','L','N');
|
||||
const int idcheck4 = MAKE_ID('X','G','L','2');
|
||||
int id;
|
||||
|
||||
map->Seek(ML_GLZNODES);
|
||||
map->file->Read (&id, 4);
|
||||
if (id == idcheck || id == idcheck2 || id == idcheck3 || id == idcheck4)
|
||||
{
|
||||
try
|
||||
{
|
||||
subsectors = NULL;
|
||||
segs = NULL;
|
||||
nodes = NULL;
|
||||
P_LoadZNodes (*map->file, id);
|
||||
return true;
|
||||
}
|
||||
catch (CRecoverableError &)
|
||||
{
|
||||
if (subsectors != NULL)
|
||||
{
|
||||
delete[] subsectors;
|
||||
subsectors = NULL;
|
||||
}
|
||||
if (segs != NULL)
|
||||
{
|
||||
delete[] segs;
|
||||
segs = NULL;
|
||||
}
|
||||
if (nodes != NULL)
|
||||
{
|
||||
delete[] nodes;
|
||||
nodes = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!CheckCachedNodes(map))
|
||||
{
|
||||
wadlump_t gwalumps[4];
|
||||
|
|
|
@ -844,16 +844,23 @@ bool PIT_CheckThing (AActor *thing, FCheckPosition &tm)
|
|||
|
||||
if (tm.FromPMove)
|
||||
{
|
||||
fixed_t newdist = P_AproxDistance(thing->x - tm.x, thing->y - tm.y);
|
||||
fixed_t olddist = P_AproxDistance(thing->x - tm.thing->x, thing->y - tm.thing->y);
|
||||
|
||||
// Both actors already overlap. To prevent them from remaining stuck allow the move if it
|
||||
// takes them further apart.
|
||||
if (newdist > olddist)
|
||||
// takes them further apart or the move does not change the position (when called from P_ChangeSector.)
|
||||
if (tm.x == tm.thing->x && tm.y == tm.thing->y)
|
||||
{
|
||||
// ... but not if they did not overlap in z-direction before but would after the move.
|
||||
unblocking = !((tm.thing->x >= thing->x + thing->height && tm.x < thing->x + thing->height) ||
|
||||
(tm.thing->x + tm.thing->height <= thing->x && tm.x + tm.thing->height > thing->x));
|
||||
unblocking = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
fixed_t newdist = P_AproxDistance(thing->x - tm.x, thing->y - tm.y);
|
||||
fixed_t olddist = P_AproxDistance(thing->x - tm.thing->x, thing->y - tm.thing->y);
|
||||
|
||||
if (newdist > olddist)
|
||||
{
|
||||
// ... but not if they did not overlap in z-direction before but would after the move.
|
||||
unblocking = !((tm.thing->z >= thing->z + thing->height && tm.z < thing->z + thing->height) ||
|
||||
(tm.thing->z + tm.thing->height <= thing->z && tm.z + tm.thing->height > thing->z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4512,6 +4519,11 @@ bool P_AdjustFloorCeil (AActor *thing, FChangePosition *cpos)
|
|||
int flags2 = thing->flags2 & MF2_PASSMOBJ;
|
||||
FCheckPosition tm;
|
||||
|
||||
if ((thing->flags2 & MF2_PASSMOBJ) && (thing->flags3 & MF3_ISMONSTER))
|
||||
{
|
||||
tm.FromPMove = true;
|
||||
}
|
||||
|
||||
if (cpos->movemidtex)
|
||||
{
|
||||
// From Eternity:
|
||||
|
|
|
@ -2005,36 +2005,10 @@ IMPLEMENT_CLASS (AAmbientSound)
|
|||
void AAmbientSound::Serialize (FArchive &arc)
|
||||
{
|
||||
Super::Serialize (arc);
|
||||
arc << bActive;
|
||||
|
||||
if (SaveVersion < 1902)
|
||||
arc << bActive << NextCheck;
|
||||
if (SaveVersion < 2798)
|
||||
{
|
||||
arc << NextCheck;
|
||||
NextCheck += gametic;
|
||||
if (NextCheck < 0) NextCheck = INT_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (arc.IsStoring())
|
||||
{
|
||||
if (NextCheck != INT_MAX)
|
||||
{
|
||||
int checktime = NextCheck - gametic;
|
||||
arc << checktime;
|
||||
}
|
||||
else
|
||||
{
|
||||
arc << NextCheck;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
arc << NextCheck;
|
||||
if (NextCheck != INT_MAX)
|
||||
{
|
||||
NextCheck += gametic;
|
||||
}
|
||||
}
|
||||
NextCheck += level.maptime;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2048,7 +2022,7 @@ void AAmbientSound::Tick ()
|
|||
{
|
||||
Super::Tick ();
|
||||
|
||||
if (!bActive || gametic < NextCheck)
|
||||
if (!bActive || level.maptime < NextCheck)
|
||||
return;
|
||||
|
||||
FAmbientSound *ambient;
|
||||
|
@ -2176,7 +2150,7 @@ void AAmbientSound::Activate (AActor *activator)
|
|||
amb->periodmin = Scale(S_GetMSLength(sndnum), TICRATE, 1000);
|
||||
}
|
||||
|
||||
NextCheck = gametic;
|
||||
NextCheck = level.maptime;
|
||||
if (amb->type & (RANDOM|PERIODIC))
|
||||
SetTicker (amb);
|
||||
|
||||
|
|
|
@ -2618,15 +2618,27 @@ CCMD (idmus)
|
|||
|
||||
CCMD (changemus)
|
||||
{
|
||||
if (argv.argc() > 1)
|
||||
{
|
||||
if (PlayList)
|
||||
{
|
||||
delete PlayList;
|
||||
PlayList = NULL;
|
||||
}
|
||||
S_ChangeMusic (argv[1], argv.argc() > 2 ? atoi (argv[2]) : 0);
|
||||
}
|
||||
if (argv.argc() > 1)
|
||||
{
|
||||
if (PlayList)
|
||||
{
|
||||
delete PlayList;
|
||||
PlayList = NULL;
|
||||
}
|
||||
S_ChangeMusic (argv[1], argv.argc() > 2 ? atoi (argv[2]) : 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
const char *currentmus = mus_playing.name.GetChars();
|
||||
if(currentmus != NULL && *currentmus != 0)
|
||||
{
|
||||
Printf ("currently playing %s\n", currentmus);
|
||||
}
|
||||
else
|
||||
{
|
||||
Printf ("no music playing\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
|
|
@ -256,7 +256,7 @@ static void I_CheckNativeMouse ()
|
|||
== (SDL_APPINPUTFOCUS|SDL_APPACTIVE);
|
||||
bool fs = (SDL_GetVideoSurface ()->flags & SDL_FULLSCREEN) != 0;
|
||||
|
||||
bool wantNative = !focus || !use_mouse || (!fs && (GUICapture || paused || demoplayback || !inGame()));
|
||||
bool wantNative = !focus || (!fs && (!use_mouse || GUICapture || paused || demoplayback || !inGame()));
|
||||
|
||||
if (wantNative != NativeMouse)
|
||||
{
|
||||
|
|
|
@ -1485,6 +1485,12 @@ bool V_DoModeSetup (int width, int height, int bits)
|
|||
{
|
||||
CleanXfac_1 = MAX(CleanXfac - 1, 1);
|
||||
CleanYfac_1 = MAX(CleanYfac - 1, 1);
|
||||
// On larger screens this is not enough so make sure it's at most 3/4 of the screen's width
|
||||
while (CleanXfac_1 * 320 > screen->GetWidth()*3/4 && CleanXfac_1 > 2)
|
||||
{
|
||||
CleanXfac_1--;
|
||||
CleanYfac_1--;
|
||||
}
|
||||
}
|
||||
CleanWidth_1 = width / CleanXfac_1;
|
||||
CleanHeight_1 = height / CleanYfac_1;
|
||||
|
|
|
@ -412,7 +412,8 @@ public:
|
|||
virtual void WipeEndScreen();
|
||||
virtual bool WipeDo(int ticks);
|
||||
virtual void WipeCleanup();
|
||||
virtual int GetPixelDoubling() const { return 1; }
|
||||
virtual int GetPixelDoubling() const { return 0; }
|
||||
virtual int GetTrueHeight() { return GetHeight(); }
|
||||
|
||||
uint32 GetLastFPS() const { return LastCount; }
|
||||
|
||||
|
|
|
@ -158,6 +158,7 @@ LPDIRECTINPUT g_pdi3;
|
|||
|
||||
BOOL AppActive = TRUE;
|
||||
int SessionState = 0;
|
||||
int BlockMouseMove;
|
||||
|
||||
CVAR (Bool, k_allowfullscreentoggle, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
||||
|
||||
|
@ -319,9 +320,15 @@ bool GUIWndProcHook(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESU
|
|||
else if (message == WM_MOUSEMOVE)
|
||||
{
|
||||
ev.subtype = EV_GUI_MouseMove;
|
||||
if (BlockMouseMove > 0) return true;
|
||||
}
|
||||
|
||||
{
|
||||
int shift = screen? screen->GetPixelDoubling() : 0;
|
||||
ev.data1 = LOWORD(lParam) >> shift;
|
||||
ev.data2 = HIWORD(lParam) >> shift;
|
||||
if (screen) ev.data2 -= (screen->GetTrueHeight() - screen->GetHeight())/2;
|
||||
}
|
||||
ev.data1 = LOWORD(lParam) >> screen->GetPixelDoubling();
|
||||
ev.data2 = HIWORD(lParam) >> screen->GetPixelDoubling();
|
||||
|
||||
if (wParam & MK_SHIFT) ev.data3 |= GKM_SHIFT;
|
||||
if (wParam & MK_CONTROL) ev.data3 |= GKM_CTRL;
|
||||
|
@ -802,6 +809,7 @@ void I_GetEvent ()
|
|||
//
|
||||
void I_StartTic ()
|
||||
{
|
||||
BlockMouseMove--;
|
||||
ResetButtonTriggers ();
|
||||
I_CheckGUICapture ();
|
||||
I_CheckNativeMouse (false);
|
||||
|
|
|
@ -114,6 +114,7 @@ extern HWND Window;
|
|||
extern LPDIRECTINPUT8 g_pdi;
|
||||
extern LPDIRECTINPUT g_pdi3;
|
||||
extern bool GUICapture;
|
||||
extern int BlockMouseMove;
|
||||
|
||||
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||
|
||||
|
@ -283,6 +284,7 @@ void I_CheckNativeMouse(bool preferNative)
|
|||
NativeMouse = want_native;
|
||||
if (want_native)
|
||||
{
|
||||
BlockMouseMove = 3;
|
||||
Mouse->Ungrab();
|
||||
}
|
||||
else
|
||||
|
|
|
@ -162,6 +162,7 @@ public:
|
|||
void SetVSync (bool vsync);
|
||||
void NewRefreshRate();
|
||||
HRESULT GetHR ();
|
||||
virtual int GetTrueHeight() { return TrueHeight; }
|
||||
|
||||
void Blank ();
|
||||
bool PaintToWindow ();
|
||||
|
@ -265,6 +266,7 @@ public:
|
|||
bool WipeDo(int ticks);
|
||||
void WipeCleanup();
|
||||
HRESULT GetHR ();
|
||||
virtual int GetTrueHeight() { return TrueHeight; }
|
||||
|
||||
private:
|
||||
friend class D3DTex;
|
||||
|
|
|
@ -587,6 +587,7 @@ ACTOR BFGExtra
|
|||
+NOGRAVITY
|
||||
RenderStyle Add
|
||||
Alpha 0.75
|
||||
DamageType "BFGSplash"
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
|
|
|
@ -331,6 +331,8 @@ OptionMenu "OptionsMenu"
|
|||
Submenu "Gameplay Options", "GameplayOptions"
|
||||
Submenu "Compatibility Options", "CompatibilityOptions"
|
||||
Submenu "Automap Options", "AutomapOptions"
|
||||
Submenu "HUD Options", "HUDOptions"
|
||||
Submenu "Miscellaneous Options", "MiscOptions"
|
||||
Submenu "Sound Options", "SoundOptions"
|
||||
Submenu "Display Options", "VideoOptions"
|
||||
Submenu "Set video mode", "VideoModeMenu"
|
||||
|
@ -615,6 +617,48 @@ OptionValue Contrast
|
|||
2.0, "Smooth"
|
||||
}
|
||||
|
||||
OptionMenu "VideoOptions"
|
||||
{
|
||||
Title "DISPLAY OPTIONS"
|
||||
|
||||
Submenu "Message Options", "MessageOptions"
|
||||
Submenu "Scoreboard Options", "ScoreboardOptions"
|
||||
StaticText " "
|
||||
Slider "Screen size", "screenblocks", 3.0, 12.0, 1.0, 0
|
||||
Slider "Brightness", "Gamma", 1.0, 3.0, 0.1
|
||||
Option "Vertical Sync", "vid_vsync", "OnOff"
|
||||
Option "Column render mode", "r_columnmethod", "ColumnMethods"
|
||||
|
||||
StaticText " "
|
||||
Option "Screen wipe style", "wipetype", "Wipes"
|
||||
|
||||
IfOption(Windows)
|
||||
{
|
||||
Option "Show ENDOOM screen", "showendoom", "Endoom"
|
||||
//Option "DirectDraw palette hack", "vid_palettehack", "OnOff"
|
||||
//Option "Use attached surfaces", "vid_attachedsurfaces", "OnOff"
|
||||
}
|
||||
|
||||
Option "Stretch short skies", "r_stretchsky", "OnOff"
|
||||
Option "Use fuzz effect", "r_drawfuzz", "YesNo"
|
||||
Slider "Lost Soul translucency", "transsouls", 0.25, 1.0, 0.05, 2
|
||||
Option "Use fake contrast", "r_fakecontrast", "Contrast"
|
||||
Option "Rocket Trails", "cl_rockettrails", "RocketTrailTypes"
|
||||
Option "Blood Type", "cl_bloodtype", "BloodTypes"
|
||||
Option "Bullet Puff Type", "cl_pufftype", "PuffTypes"
|
||||
Slider "Number of particles", "r_maxparticles", 100, 10000, 100, 0
|
||||
Option "Show player sprites", "r_drawplayersprites", "OnOff"
|
||||
Option "Death camera", "r_deathcamera", "OnOff"
|
||||
Option "Teleporter zoom", "telezoom", "OnOff"
|
||||
Option "Interpolate monster movement", "nomonsterinterpolation", "NoYes"
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
//
|
||||
// HUD menu
|
||||
//
|
||||
//-------------------------------------------------------------------------------------------
|
||||
|
||||
OptionValue DisplayTagsTypes
|
||||
{
|
||||
0.0, "None"
|
||||
|
@ -654,40 +698,89 @@ OptionValue Crosshairs
|
|||
// will be filled in from the XHAIRS lump
|
||||
}
|
||||
|
||||
OptionMenu "VideoOptions"
|
||||
OptionMenu "HUDOptions"
|
||||
{
|
||||
Title "DISPLAY OPTIONS"
|
||||
Submenu "Message Options", "MessageOptions"
|
||||
Submenu "Scoreboard Options", "ScoreboardOptions"
|
||||
Title "HUD Options"
|
||||
Submenu "Alternative HUD", "AltHudOptions"
|
||||
StaticText " "
|
||||
Slider "Screen size", "screenblocks", 3.0, 12.0, 1.0
|
||||
Slider "Brightness", "Gamma", 1.0, 3.0, 0.1
|
||||
Option "Vertical Sync", "vid_vsync", "OnOff"
|
||||
Option "Column render mode", "r_columnmethod", "ColumnMethods"
|
||||
|
||||
Option "Default Crosshair", "crosshair", "Crosshairs"
|
||||
Option "Force default crosshair", "crosshairforce", "OnOff"
|
||||
Option "Grow crosshair when picking up items", "crosshairgrow", "OnOff"
|
||||
ColorPicker "Crosshair color", "crosshaircolor"
|
||||
Option "Crosshair shows health", "crosshairhealth", "OnOff"
|
||||
Option "Scale crosshair", "crosshairscale", "OnOff"
|
||||
StaticText " "
|
||||
Option "Crosshair", "crosshair", "Crosshairs"
|
||||
Option "Display nametags", "displaynametags", "DisplayTagsTypes"
|
||||
Option "Nametag color", "nametagcolor", "TextColors", "displaynametags"
|
||||
Option "Stretch status bar", "st_scale", "OnOff"
|
||||
Option "Alternative HUD", "hud_althud", "OnOff"
|
||||
Option "Screen wipe style", "wipetype", "Wipes"
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
//
|
||||
// Alternative HUD
|
||||
//
|
||||
//-------------------------------------------------------------------------------------------
|
||||
|
||||
OptionValue "AMCoordinates"
|
||||
{
|
||||
0, "Player"
|
||||
1, "Map"
|
||||
}
|
||||
|
||||
OptionMenu "AltHUDOptions"
|
||||
{
|
||||
Title "Alternative HUD"
|
||||
//Indent 220
|
||||
Option "Enable alternative HUD", "hud_althud", "OnOff"
|
||||
Option "Show secret count", "hud_showsecrets", "OnOff"
|
||||
Option "Show monster count", "hud_showmonsters", "OnOff"
|
||||
Option "Show item count", "hud_showitems", "OnOff"
|
||||
Option "Show stamina and accuracy", "hud_showstats", "OnOff"
|
||||
Slider "Red ammo display below %", "hud_ammo_red", 0, 100, 1, 0
|
||||
Slider "Yellow ammo display below %", "hud_ammo_yellow", 0, 100, 1, 0
|
||||
Slider "Red health display below", "hud_health_red", 0, 100, 1, 0
|
||||
Slider "Yellow health display below", "hud_health_yellow", 0, 100, 1, 0
|
||||
Slider "Green health display below", "hud_health_green", 0, 100, 1, 0
|
||||
Slider "Red armor display below", "hud_armor_red", 0, 100, 1, 0
|
||||
Slider "Yellow armor display below", "hud_armor_yellow", 0, 100, 1, 0
|
||||
Slider "Green armor display below", "hud_armor_green", 0, 100, 1, 0
|
||||
StaticText " "
|
||||
StaticText "Alternative Automap HUD", 1
|
||||
option "Map title color", "hudcolor_titl", "TextColors"
|
||||
option "Hub time color", "hudcolor_time", "TextColors"
|
||||
option "Map time color", "hudcolor_ltim", "TextColors"
|
||||
option "Total title color", "hudcolor_ttim", "TextColors"
|
||||
option "Coordinate color", "hudcolor_xyco", "TextColors"
|
||||
option "Coordinate mode", "map_point_coordinates", "AMCoordinates"
|
||||
option "Map title color", "hudcolor_titl", "TextColors"
|
||||
option "Statistics name color", "hudcolor_statnames", "TextColors"
|
||||
option "Statistics color", "hudcolor_stats", "TextColors"
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
//
|
||||
// Misc menu
|
||||
//
|
||||
//-------------------------------------------------------------------------------------------
|
||||
|
||||
OptionMenu "MiscOptions"
|
||||
{
|
||||
Title "Miscellaneous Options"
|
||||
//Indent 220
|
||||
IfOption(Windows)
|
||||
{
|
||||
Option "Show ENDOOM screen", "showendoom", "Endoom"
|
||||
//Option "DirectDraw palette hack", "vid_palettehack", "OnOff"
|
||||
//Option "Use attached surfaces", "vid_attachedsurfaces", "OnOff"
|
||||
Option "Merge left+right Alt/Ctrl/Shift", "k_mergekeys", "OnOff"
|
||||
Option "Alt-Enter toggles fullscreen", "k_allowfullscreentoggle", "OnOff"
|
||||
Option "Show IWAD selection dialog", "queryiwad", "OnOff"
|
||||
StaticText " "
|
||||
}
|
||||
|
||||
Option "Enable cheats from all games", "allcheats", "OnOff"
|
||||
Option "Enable autosaves", "disableautosave", "OffOn"
|
||||
Slider "Number of autosaves", "autosavecount", 1, 32, 1, 0
|
||||
StaticText " "
|
||||
Option "Stretch short skies", "r_stretchsky", "OnOff"
|
||||
Option "Use fuzz effect", "r_drawfuzz", "YesNo"
|
||||
Option "Use fake contrast", "r_fakecontrast", "Contrast"
|
||||
Option "Rocket Trails", "cl_rockettrails", "RocketTrailTypes"
|
||||
Option "Blood Type", "cl_bloodtype", "BloodTypes"
|
||||
Option "Bullet Puff Type", "cl_pufftype", "PuffTypes"
|
||||
Option "Interpolate monster movement", "nomonsterinterpolation", "NoYes"
|
||||
Option "Cache nodes", "gl_cachenodes", "OnOff"
|
||||
Slider "Time threshold for node caching", "gl_cachetime", 0.0, 2.0, 0.1
|
||||
SafeCommand "Clear node cache", "clearnodecache"
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------
|
||||
|
@ -941,7 +1034,7 @@ OptionValue JumpCrouch
|
|||
OptionMenu GameplayOptions
|
||||
{
|
||||
Title "GAMEPLAY OPTIONS"
|
||||
Indent 222
|
||||
//Indent 222
|
||||
Option "Teamplay", "teamplay", "OnOff"
|
||||
Slider "Team damage scalar", "teamdamage", 0, 1, 0.05
|
||||
StaticText " "
|
||||
|
@ -1185,9 +1278,9 @@ OptionMenu SoundOptions
|
|||
Option "MIDI device", "snd_mididevice", "MidiDevices"
|
||||
StaticText " "
|
||||
Option "Underwater reverb", "snd_waterreverb", "OnOff"
|
||||
Slider "Underwater cutoff", "snd_waterlp", 0, 2000, 50
|
||||
Slider "Underwater cutoff", "snd_waterlp", 0, 2000, 50, 0
|
||||
Option "Randomize pitches", "snd_pitched", "OnOff"
|
||||
Slider "Sound channels", "snd_channels", 8, 256, 8
|
||||
Slider "Sound channels", "snd_channels", 8, 256, 8, 0
|
||||
StaticText " "
|
||||
Command "Restart sound", "snd_reset"
|
||||
StaticText " "
|
||||
|
|
Loading…
Reference in a new issue