- everything compiles and mostly works again.

This commit is contained in:
Christoph Oelckers 2017-02-12 14:04:48 +01:00
parent ee1217c8c7
commit bb6def820f
12 changed files with 119 additions and 77 deletions

View file

@ -848,7 +848,6 @@ set( FASTMATH_PCH_SOURCES
menu/menuinput.cpp
menu/messagebox.cpp
menu/optionmenu.cpp
menu/playerdisplay.cpp
menu/playermenu.cpp
menu/readthis.cpp
menu/videomenu.cpp

View file

@ -1985,7 +1985,7 @@ void PDynArray::DestroyValue(void *addr) const
void PDynArray::SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *special) const
{
memset((char*)base + offset, 0, sizeof(FArray)); // same as constructing an empty array.
if (base != nullptr) memset((char*)base + offset, 0, sizeof(FArray)); // same as constructing an empty array.
if (special != nullptr)
{
special->Push(std::make_pair(this, offset));
@ -3047,6 +3047,10 @@ DObject *PClass::CreateNew() const
else
memset (mem, 0, Size);
if (ConstructNative == nullptr)
{
I_Error("Attempt to instantiate abstract class %s.", TypeName.GetChars());
}
ConstructNative (mem);
((DObject *)mem)->SetClass (const_cast<PClass *>(this));
InitializeSpecials(mem, Defaults);
@ -3165,10 +3169,7 @@ void PClass::InitializeDefaults()
{
// Copy parent values from the parent defaults.
assert(ParentClass != nullptr);
ParentClass->InitializeSpecials(Defaults, ParentClass->Defaults);
if (Defaults != nullptr)
{
if (Defaults != nullptr) ParentClass->InitializeSpecials(Defaults, ParentClass->Defaults);
for (const PField *field : Fields)
{
if (!(field->Flags & VARF_Native))
@ -3178,7 +3179,6 @@ void PClass::InitializeDefaults()
}
}
}
}
//==========================================================================
//

View file

@ -278,4 +278,4 @@ void DListMenu::Drawer ()
// base class for menu items
//
//=============================================================================
IMPLEMENT_CLASS(DMenuItemBase, true, false)
IMPLEMENT_CLASS(DMenuItemBase, false, false)

View file

@ -1130,9 +1130,6 @@ DEFINE_FIELD(DOptionMenuDescriptor, mIndent)
DEFINE_FIELD(DOptionMenuDescriptor, mPosition)
DEFINE_FIELD(DOptionMenuDescriptor, mDontDim)
//DEFINE_FIELD(DMenuItemBase, mLabel)
//DEFINE_FIELD(DMenuItemBase, mCentered)
DEFINE_FIELD(DOptionMenu, CanScrollUp)
DEFINE_FIELD(DOptionMenu, CanScrollDown)
DEFINE_FIELD(DOptionMenu, VisBottom)
@ -1272,7 +1269,7 @@ DMenuItemBase * CreateOptionMenuItemControl(const char *label, FName cmd, FKeyBi
DMenuItemBase * CreateListMenuItemPatch(int x, int y, int height, int hotkey, FTextureID tex, FName command, int param)
{
auto c = PClass::FindClass("ListMenuItemPatch");
auto c = PClass::FindClass("ListMenuItemPatchItem");
auto p = c->CreateNew();
VMValue params[] = { p, x, y, height, tex.GetIndex(), hotkey, command.GetIndex(), param };
auto f = dyn_cast<PFunction>(c->Symbols.FindSymbol("InitDirect", false));
@ -1282,7 +1279,7 @@ DMenuItemBase * CreateListMenuItemPatch(int x, int y, int height, int hotkey, FT
DMenuItemBase * CreateListMenuItemText(int x, int y, int height, int hotkey, const char *text, FFont *font, PalEntry color1, PalEntry color2, FName command, int param)
{
auto c = PClass::FindClass("ListMenuItemText");
auto c = PClass::FindClass("ListMenuItemTextItem");
auto p = c->CreateNew();
VMValue params[] = { p, x, y, height, hotkey, text, font, int(color1.d), int(color2.d), command.GetIndex(), param };
auto f = dyn_cast<PFunction>(c->Symbols.FindSymbol("InitDirect", false));
@ -1314,7 +1311,7 @@ void DMenuItemBase::Ticker()
void DMenuItemBase::Drawer(bool selected)
{
IFVIRTUAL(DMenuItemBase, Ticker)
IFVIRTUAL(DMenuItemBase, Drawer)
{
VMValue params[] = { (DObject*)this, selected };
GlobalVMStack.Call(func, params, countof(params), nullptr, 0, nullptr);

View file

@ -384,12 +384,12 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc)
}
auto TypeCVar = NewPointer(NewNativeStruct("CVar", nullptr));
for (unsigned i = 1; i < args.Size(); i++)
for (unsigned i = start; i < args.Size(); i++)
{
sc.MustGetString();
if (args[i] == TypeString)
{
params.Push(sc.String);
params.Push(FString(sc.String));
}
else if (args[i] == TypeName)
{
@ -401,7 +401,21 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc)
}
else if (args[i] == TypeFont)
{
params.Push(FFont::FindFont(sc.String));
auto f = FFont::FindFont(sc.String);
if (f == nullptr)
{
sc.ScriptError("Unknown font %s", sc.String);
}
params.Push(f);
}
else if (args[i] == TypeTextureID)
{
auto f = TexMan.CheckForTexture(sc.String, FTexture::TEX_MiscPatch);
if (!f.isValid())
{
sc.ScriptError("Unknown texture %s", sc.String);
}
params.Push(f.GetIndex());
}
else if (args[i]->IsKindOf(RUNTIME_CLASS(PInt)))
{
@ -459,12 +473,11 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc)
break;
}
}
/*
DMenuItemBase *item = (DMenuItemBase*)cls->CreateNew();
params[0] = item;
GlobalVMStack.Call(func->Variants[0].Implementation, &params[0], params.Size(), nullptr, 0);
desc->mItems.Push((DMenuItemBase*)item);
*/
if (cls->IsDescendantOf("ListMenuItemSelectable"))
{
desc->mYpos += desc->mLinespacing;
@ -477,11 +490,6 @@ static void ParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc)
{
sc.ScriptError("Unknown keyword '%s'", sc.String);
}
}
{
sc.ScriptError("Unknown keyword '%s'", sc.String);
}
}
for (auto &p : desc->mItems)
@ -664,21 +672,6 @@ static void ParseOptionSettings(FScanner &sc)
//
//=============================================================================
static EColorRange ParseOptionColor(FScanner &sc, DOptionMenuDescriptor *desc)
{
EColorRange cr = OptionSettings.mFontColor;
if (sc.CheckString(","))
{
sc.MustGetString();
cr = V_FindFontColor(sc.String);
if (cr == CR_UNTRANSLATED && !sc.Compare("untranslated") && isdigit(sc.String[0]))
{
if (strtoll(sc.String, nullptr, 0)) cr = OptionSettings.mFontColorHeader;
}
}
return cr;
}
static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc)
{
sc.MustGetStringName("{");
@ -745,7 +738,6 @@ static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc)
bool success = false;
FStringf buildname("OptionMenuItem%s", sc.String);
// Handle one special case: MapControl maps to Control with one parameter different
FKeyBindings *bind = sc.Compare("MapControl") ? &AutomapBindings : &Bindings;
PClass *cls = PClass::FindClass(buildname);
if (cls != nullptr && cls->IsDescendantOf("OptionMenuItem"))
{
@ -757,13 +749,12 @@ static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc)
params.Push(0);
auto TypeCVar = NewPointer(NewNativeStruct("CVar", nullptr));
auto TypeBind = NewPointer(NewNativeStruct("KeyBindings", nullptr));
for (unsigned i = 1; i < args.Size(); i++)
{
sc.MustGetString();
if (args[i] == TypeString)
{
params.Push(sc.String);
params.Push(FString(sc.String));
}
else if (args[i] == TypeName)
{
@ -786,6 +777,8 @@ static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc)
// todo: check other data types that may get used.
sc.ScriptError("Integer expected, got %s", sc.String);
}
// Color ranges need to be marked for option menu items to support an older feature where a boolean number could be passed instead.
v |= 0x12340000;
}
if (args[i] == TypeBool) v = !!v;
params.Push(v);
@ -822,12 +815,6 @@ static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc)
}
else
{
if (args[i + 1] == TypeBind)
{
// Bindings are not parsed, they just get tacked on.
params.Push(bind);
i++;
}
if (i < args.Size() - 1 && !(func->Variants[0].ArgFlags[i + 1] & VARF_Optional))
{
sc.ScriptError("Insufficient parameters for %s", cls->TypeName.GetChars());
@ -835,12 +822,12 @@ static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc)
break;
}
}
/*
DMenuItemBase *item = (DMenuItemBase*)cls->CreateNew();
params[0] = item;
GlobalVMStack.Call(func->Variants[0].Implementation, &params[0], params.Size(), nullptr, 0);
desc->mItems.Push((DMenuItemBase*)item);
*/
success = true;
}
}

View file

@ -55,6 +55,7 @@
#include "r_sky.h"
#include "v_font.h"
#include "v_video.h"
#include "c_bind.h"
#include "menu/menu.h"
static TArray<FPropertyInfo*> properties;
@ -797,6 +798,12 @@ void InitThingdef()
PField *plrclsf = new PField("PlayerClasses", plrcls, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&PlayerClasses);
Namespaces.GlobalNamespace->Symbols.AddSymbol(plrclsf);
auto bindcls = NewNativeStruct("KeyBindings", nullptr);
PField *binding = new PField("Bindings", bindcls, VARF_Native | VARF_Static, (intptr_t)&Bindings);
Namespaces.GlobalNamespace->Symbols.AddSymbol(binding);
binding = new PField("AutomapBindings", bindcls, VARF_Native | VARF_Static, (intptr_t)&AutomapBindings);
Namespaces.GlobalNamespace->Symbols.AddSymbol(binding);
// set up a variable for the DEH data
PStruct *dstruct = NewNativeStruct("DehInfo", nullptr);
PField *dehf = new PField("deh", dstruct, VARF_Native | VARF_Static, (intptr_t)&deh);

View file

@ -98,7 +98,7 @@ class ListMenuItemStaticPatch : ListMenuItem
}
}
class ListMenuItemStatucPatchCentered : ListMenuItemStaticPatch
class ListMenuItemStaticPatchCentered : ListMenuItemStaticPatch
{
void Init(int x, int y, TextureID patch)
{
@ -119,7 +119,16 @@ class ListMenuItemStaticText : ListMenuItem
int mColor;
bool mCentered;
void Init(int x, int y, String text, Font font, int color, bool centered = false)
void Init(ListMenuDescriptor desc, int x, int y, String text, int color = Font.CR_UNTRANSLATED)
{
Super.Init(x, y);
mText = text;
mFont = desc.mFont;
mColor = color >= 0? color : desc.mFontColor;
mCentered = false;
}
void InitDirect(int x, int y, String text, Font font, int color = Font.CR_UNTRANSLATED, bool centered = false)
{
Super.Init(x, y);
mText = text;
@ -149,11 +158,12 @@ class ListMenuItemStaticText : ListMenuItem
}
}
class ListMenuItemStatucTextCentered : ListMenuItemStaticText
class ListMenuItemStaticTextCentered : ListMenuItemStaticText
{
void Init(int x, int y, String text, Font font, int color)
void Init(ListMenuDescriptor desc, int x, int y, String text, int color = -1)
{
Super.Init(x, y, text, font, color, true);
Super.Init(desc, x, y, text, color);
mCentered = true;
}
}
@ -237,7 +247,7 @@ class ListMenuItemTextItem : ListMenuItemSelectable
mFont = desc.mFont;
mColor = desc.mFontColor;
mColorSelected = desc.mFontcolor2;
mHotkey = hotkey.CharAt(0);
mHotkey = hotkey.CharCodeAt(0);
}
void InitDirect(int x, int y, int height, String hotkey, String text, Font font, int color, int color2, Name child, int param = 0)
@ -247,7 +257,7 @@ class ListMenuItemTextItem : ListMenuItemSelectable
mFont = font;
mColor = color;
mColorSelected = color2;
mHotkey = hotkey.CharAt(0);
mHotkey = hotkey.CharCodeAt(0);
}
override void Drawer(bool selected)
@ -274,14 +284,14 @@ class ListMenuItemPatchItem : ListMenuItemSelectable
void Init(ListMenuDescriptor desc, TextureID patch, String hotkey, Name child, int param = 0)
{
Super.Init(desc.mXpos, desc.mYpos, desc.mLinespacing, child, param);
mHotkey = hotkey.CharAt(0);
mHotkey = hotkey.CharCodeAt(0);
mTexture = patch;
}
void InitDirect(int x, int y, int height, TextureID patch, String hotkey, Name child, int param = 0)
{
Super.Init(x, y, height, child, param);
mHotkey = hotkey.CharAt(0);
mHotkey = hotkey.CharCodeAt(0);
mTexture = patch;
}

View file

@ -33,6 +33,7 @@ class MenuItemBase : Object native
virtual bool MouseEvent(int type, int x, int y) { return false; }
virtual bool CheckHotkey(int c) { return false; }
virtual int GetWidth() { return 0; }
virtual int GetIndent() { return 0; }
virtual int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected) { return indent; }
void OffsetPositionY(int ydelta) { mYpos += ydelta; }
@ -41,3 +42,8 @@ class MenuItemBase : Object native
void SetX(int x) { mXpos = x; }
}
// this is only used to parse font color ranges in MENUDEF
enum MenudefColorRange
{
NO_COLOR = -1
}

View file

@ -32,11 +32,10 @@
**
*/
class OptionMenuItem : MenuItemBase native
class OptionMenuItem : MenuItemBase
{
native String mLabel;
native bool mCentered;
String mLabel;
bool mCentered;
void Init(String label, String command, bool center = false)
{
@ -67,7 +66,7 @@ class OptionMenuItem : MenuItemBase native
return true;
}
virtual int GetIndent()
override int GetIndent()
{
if (mCentered) return 0;
return SmallFont.StringWidth(Stringtable.Localize(mLabel));
@ -145,7 +144,7 @@ class OptionMenuItemSafeCommand : OptionMenuItemCommand
String mPrompt;
void Init(String label, Name command, String prompt)
void Init(String label, Name command, String prompt = "")
{
Super.Init(label, command);
mPrompt = prompt;
@ -420,7 +419,7 @@ IMPLEMENT_CLASS(DEnterKey, true, false)
//
//=============================================================================
class OptionMenuItemControl : OptionMenuItem
class OptionMenuItemControlBase : OptionMenuItem
{
KeyBindings mBindings;
int mInput;
@ -487,6 +486,22 @@ class OptionMenuItemControl : OptionMenuItem
}
}
class OptionMenuItemControl : OptionMenuItemControlBase
{
void Init(String label, Name command)
{
Super.Init(label, command, Bindings);
}
}
class OptionMenuItemMapControl : OptionMenuItemControlBase
{
void Init(String label, Name command)
{
Super.Init(label, command, AutomapBindings);
}
}
//=============================================================================
//
//
@ -497,10 +512,19 @@ class OptionMenuItemStaticText : OptionMenuItem
{
int mColor;
void Init(String label, int cr = -1, bool header = false)
// this function is only for use from MENUDEF, it needs to do some strange things with the color for backwards compatibility.
void Init(String label, int cr = -1)
{
Super.Init(label, 'None', true);
mColor = cr >= 0? cr : header ? OptionMenuSettings.mFontColorHeader : OptionMenuSettings.mFontColor;
mColor = OptionMenuSettings.mFontColor;
if ((cr & 0xffff0000) == 0x12340000) mColor = cr & 0xffff;
else if (cr > 0) mColor = OptionMenuSettings.mFontColorHeader;
}
void InitDirect(String label, int cr)
{
Super.Init(label, 'None', true);
mColor = cr;
}
override int Draw(OptionMenuDescriptor desc, int y, int indent, bool selected)
@ -528,7 +552,19 @@ class OptionMenuItemStaticTextSwitchable : OptionMenuItem
String mAltText;
int mCurrent;
void Init(String label, String label2, Name command, int cr)
// this function is only for use from MENUDEF, it needs to do some strange things with the color for backwards compatibility.
void Init(String label, String label2, Name command, int cr = -1)
{
Super.Init(label, command, true);
mAltText = label2;
mCurrent = 0;
mColor = OptionMenuSettings.mFontColor;
if ((cr & 0xffff0000) == 0x12340000) mColor = cr & 0xffff;
else if (cr > 0) mColor = OptionMenuSettings.mFontColorHeader;
}
void InitDirect(String label, String label2, Name command, int cr)
{
Super.Init(label, command, true);
mColor = cr;

View file

@ -68,7 +68,7 @@ class ListMenuItemPlayerDisplay : ListMenuItem
//
//
//=============================================================================
void Init(ListMenuDescriptor menu, Name command, int x, int y, Color c1, Color c2, bool np = false)
void Init(ListMenuDescriptor menu, int x, int y, Color c1, Color c2, bool np = false, Name command = 'None' )
{
Super.Init(x, y, command);
mOwner = menu;

View file

@ -59,8 +59,8 @@ class ListMenuItemPlayerNameBox : ListMenuItemSelectable
{
Super.Init(desc.mXpos, desc.mYpos, desc.mLinespacing, command);
mText = text;
mFont = font;
mFontColor = color;
mFont = desc.mFont;
mFontColor = desc.mFontColor;
mFrameSize = frameofs;
mPlayerName = "";
mEntering = false;
@ -72,7 +72,7 @@ class ListMenuItemPlayerNameBox : ListMenuItemSelectable
//
//=============================================================================
void Init(int x, int y, int height, int frameofs, String text, Font font, int color, Name command)
void InitDirect(int x, int y, int height, int frameofs, String text, Font font, int color, Name command)
{
Super.Init(x, y, height, command);
mText = text;
@ -371,7 +371,7 @@ class ListMenuItemSlider : ListMenuItemSelectable
//
//=============================================================================
void Init(ListMenuItemDescriptor desc, String text, Name command, int min, int max, int step)
void Init(ListMenuDescriptor desc, String text, Name command, int min, int max, int step)
{
Super.Init(desc.mXpos, desc.mYpos, desc.mLinespacing, command);
mText = text;