- Menu WIP

* implemented single image screens
* implemented skeleton of the image scroller
* added RR-specific definitions to the menus (need to copy and adjust d_menu.cpp)
* added definitions for credits screens.
This commit is contained in:
Christoph Oelckers 2019-11-28 01:02:45 +01:00
parent ef3ad690da
commit 4e5f59a373
18 changed files with 582 additions and 1033 deletions

View file

@ -210,6 +210,8 @@ struct GameInterface
virtual void CustomMenuSelection(int menu, int item) {}
virtual void StartGame(FGameStartup& gs) {}
virtual FSavegameInfo GetSaveSig() { return { "", 0, 0}; }
virtual bool DrawSpecialScreen(const DVector2 &origin, int tilenum) { return false; }
virtual void DrawCenteredTextScreen(const DVector2 &origin, const char *text, int position);
};
extern GameInterface* gi;

View file

@ -38,7 +38,8 @@ bool gHaveNetworking;
FString currentGame;
FString LumpFilter;
TMap<FName, int32_t> NameToTileIndex; // for assigning names to tiles. The menu accesses this list. By default it gets everything from the dynamic tile map in Duke Nukem and Redneck Rampage.
// Todo: Add additional definition file for the other games or textures not in that list so that the menu does not have to rely on indices.
CVAR(Int, cl_defaultconfiguration, 2, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)

View file

@ -7,6 +7,8 @@
#include "zstring.h"
#include "inputstate.h"
#include "gamecvars.h"
#include "tarray.h"
#include "name.h"
EXTERN_CVAR(Int, cl_defaultconfiguration)
@ -14,6 +16,8 @@ extern FString currentGame;
extern FString LumpFilter;
class FArgs;
extern TMap<FName, int32_t> NameToTileIndex;
void D_AddWildFile(TArray<FString>& wadfiles, const char* value);
int CONFIG_Init();

View file

@ -40,6 +40,8 @@
#include "menu.h"
#include "v_draw.h"
#include "baselayer.h"
#include "gamecontrol.h"
#include "build.h"
//=============================================================================
//
@ -619,3 +621,34 @@ int FListMenuItemPatch::GetWidth()
: 0;
}
//=============================================================================
//
// Fullscreen image drawer (move to its own source file!)
//
//=============================================================================
void ImageScreen::Drawer()
{
if (mDesc->mType == 0)
{
auto tileindexp = NameToTileIndex.CheckKey(mDesc->mText);
int tileindex;
if (tileindexp == nullptr)
{
// If this isn't a name, try a literal tile index;
auto c = mDesc->mMenuName.GetChars();
if (*c == '#') tileindex = (int)strtoll(c+1, nullptr, 0);
// Error out if the screen cannot be found, this is always a definition error that needs to be reported.
else I_Error("Invalid menu screen '%s'", mDesc->mMenuName.GetChars());
}
else tileindex = *tileindexp;
if (!gi->DrawSpecialScreen(origin, tileindex)) // allows the front end to do custom handling for a given image.
{
rotatesprite_fs(int(origin.X * 65536) + (160<<16), int(origin.Y * 65536) + (100<<16), 65536L,0,tileindex,0,0,10+64);
}
}
else
{
gi->DrawCenteredTextScreen(origin, mDesc->mText, mDesc->type);
}
}

View file

@ -53,6 +53,7 @@
#include "build.h"
void RegisterDukeMenus();
void RegisterSpecialMenus();
extern bool rotatesprite_2doverride;
bool help_disabled, credits_disabled;
int g_currentMenu; // accessible by CON scripts - contains the current menu's script ID if defined or INT_MAX if none given.
@ -872,6 +873,7 @@ void Menu_Close(int playerid)
void M_Init (void)
{
RegisterSpecialMenus();
RegisterDukeMenus();
timerSetCallback(M_Ticker);
M_ParseMenuDefs();

View file

@ -141,6 +141,7 @@ enum EMenuDescriptorType
{
MDESC_ListMenu,
MDESC_OptionsMenu,
MDESC_ImageScroller,
};
struct FMenuDescriptor
@ -252,7 +253,20 @@ struct FOptionMenuDescriptor : public FMenuDescriptor
}
};
struct FImageScrollerDescriptor : public FMenuDescriptor
{
struct ScrollerItem
{
int type; // 0: fullscreen image; 1: centered text
int scriptID;
FString text;
};
TArray<ScrollerItem> mItems;
};
typedef TMap<FName, FMenuDescriptor *> MenuDescriptorList;
@ -494,11 +508,11 @@ public:
DListMenu(DMenu *parent = NULL, FListMenuDescriptor *desc = NULL);
virtual void Init(DMenu *parent = NULL, FListMenuDescriptor *desc = NULL);
FListMenuItem *GetItem(FName name);
bool Responder (event_t *ev);
bool MenuEvent (int mkey, bool fromcontroller);
bool MouseEvent(int type, int x, int y);
void Ticker ();
void Drawer ();
bool Responder (event_t *ev) override;
bool MenuEvent (int mkey, bool fromcontroller) override;
bool MouseEvent(int type, int x, int y) override;
void Ticker () override;
void Drawer () override;
virtual void SelectionChanged() {}
void SetFocus(FListMenuItem *fc)
{
@ -613,6 +627,33 @@ public:
};
//=============================================================================
//
// ImageScroller
//
//=============================================================================
class DImageScrollerMenu : public DMenu
{
};
//=============================================================================
//
// Show a fullscreen image / centered text screen for an image scroller
//
//=============================================================================
class ImageScreen : public DMenu // Todo: This should be global
{
const FImageScrollerDescriptor::ScrollerItem *mDesc;
ImageScreen(const FImageScrollerDescriptor::ScrollerItem *it)
{
mDesc = it;
}
void Drawer() override;
};
//=============================================================================
//
// Input some text

View file

@ -142,6 +142,8 @@ struct gamefilter
static const gamefilter games[] = {
{ "Duke", GAMEFLAG_DUKE},
{ "Nam", GAMEFLAG_NAM|GAMEFLAG_NAPALM},
{ "NamOnly", GAMEFLAG_NAM}, // for cases where the difference matters.
{ "Napalm", GAMEFLAG_NAPALM},
{ "WW2GI", GAMEFLAG_WW2GI},
{ "Fury", GAMEFLAG_FURY},
{ "Redneck", GAMEFLAG_RR},
@ -150,6 +152,19 @@ static const gamefilter games[] = {
{ "ShadowWarrior", GAMEFLAG_SW},
};
// for other parts that need to filter by game name.
bool validFilter(const char *str)
{
for (auto &gf : games)
{
if (g_gameType & gf.gameflag)
{
if (!stricmp(str, gf.gamename)) return true;
}
}
return false;
}
static bool CheckSkipGameBlock(FScanner &sc)
{
@ -542,6 +557,85 @@ static void ParseListMenu(FScanner &sc)
//
//=============================================================================
static void ParseImageScrollerBody(FScanner &sc, FImageScrollerDescriptor *desc)
{
sc.MustGetStringName("{");
while (!sc.CheckString("}"))
{
sc.MustGetString();
if (sc.Compare("else"))
{
SkipSubBlock(sc);
}
else if (sc.Compare("ifgame"))
{
if (!CheckSkipGameBlock(sc))
{
// recursively parse sub-block
ParseImageScrollerBody(sc, desc);
}
}
else if (sc.Compare("ifoption"))
{
if (!CheckSkipOptionBlock(sc))
{
// recursively parse sub-block
ParseImageScrollerBody(sc, desc);
}
}
else if (sc.Compare("TextItem") || sc.Compare("ImageItem"))
{
FImageScrollerDescriptor::ScrollerItem item;
sc.MustGetString();
item.text = sc.String;
int type = sc.Compare("TextItem");
if (type)
{
sc.MustGetStringName(",");
sc.MustGetNumber();
item.type = sc.Number; // y-coordinate
}
item.scriptID = INT_MAX;
if (sc.CheckString(","))
{
sc.MustGetNumber();
item.scriptID = sc.Number;
}
desc->mItems.Push(item);
}
else
{
sc.ScriptError("Unknown keyword '%s'", sc.String);
}
}
}
//=============================================================================
//
//
//
//=============================================================================
static void ParseImageScroller(FScanner &sc)
{
sc.MustGetString();
FImageScrollerDescriptor *desc = new FImageScrollerDescriptor;
desc->mType = MDESC_ImageScroller;
desc->mMenuName = sc.String;
ParseImageScrollerBody(sc, desc);
bool scratch = ReplaceMenu(sc, desc);
if (scratch) delete desc;
}
//=============================================================================
//
//
//
//=============================================================================
static void ParseOptionValue(FScanner &sc)
{
FName optname;
@ -948,6 +1042,10 @@ void M_ParseMenuDefs()
{
ParseListMenu(sc);
}
if (sc.Compare("ImageScroller"))
{
ParseImageScroller(sc);
}
else if (sc.Compare("DEFAULTLISTMENU"))
{
ParseListMenuBody(sc, &DefaultListMenuSettings);

View file

@ -35,4 +35,5 @@ xx(CustomSubMenu5)
xx(CustomSubMenu6)
xx(CustomSubMenu7)
xx(UsermapMenu)
xx(StartGame)
xx(StartGame)
xx(ImageScroller)

View file

@ -43,6 +43,7 @@
#include "c_cvars.h"
#include "printf.h"
bool validFilter(const char *str);
EXTERN_CVAR(String, language)
CUSTOM_CVAR(Int, cl_gender, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
{
@ -239,12 +240,21 @@ bool FStringTable::ParseLanguageCSV(int lumpnum, const TArray<uint8_t> &buffer)
for (unsigned i = 1; i < data.Size(); i++)
{
auto &row = data[i];
#if 0
#if 1
if (filtercol > -1)
{
auto filterstr = row[filtercol];
auto filter = filterstr.Split(" ", FString::TOK_SKIPEMPTY);
if (filter.Size() > 0 && filter.FindEx([](const auto &str) { return str.CompareNoCase(GameNames[gameinfo.gametype]) == 0; }) == filter.Size())
bool ok = false;
for (auto &entry : filter)
{
if (validFilter(entry))
{
ok = true;
break;
}
}
if (!ok) continue;
continue;
}
#endif

View file

@ -37,6 +37,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "menu/menu.h"
#include "gstrings.h"
#include "version.h"
#include "namesdyn.h"
#include "../../glbackend/glbackend.h"
BEGIN_DUKE_NS
@ -279,6 +280,14 @@ void GameInterface::DrawNativeMenuText(int fontnum, int state, int xpos, int ypo
//----------------------------------------------------------------------------
//
// Implements the native looking menu used for the main menu
// and the episode/skill selection screens, i.e. the parts
// that need to look authentic
//
//----------------------------------------------------------------------------
class DukeListMenu : public DListMenu
{
using Super = DListMenu;
@ -401,149 +410,11 @@ class MainMenu : public DukeListMenu
}
};
class DukeCreditScreen : public DMenu
{
int screen;
void shadowminitext(int32_t x, int32_t y, const char* t, int32_t p)
{
int32_t f = 0;
if (!minitext_lowercase)
f |= TEXT_UPPERCASE;
G_ScreenTextShadow(1, 1, MINIFONT, x, y, 65536, 0, 0, t, 0, p, 2 | 8 | 16 | ROTATESPRITE_FULL16, 0, 4 << 16, 8 << 16, 1 << 16, 0, f, 0, 0, xdim - 1, ydim - 1);
}
void Drawer()
{
if (VOLUMEALL && PLUTOPAK)
{
rotatesprite_fs(int(origin.X * 65536) + (MENU_MARGIN_CENTER << 16), int(origin.Y * 65536) + (100 << 16), 65536L, 0, 2504 + screen, 0, 0, 10 + 64);
return;
}
Menu_DrawBackground(origin);
// On the latest version there's real graphics for this.
int32_t m, l;
switch (screen)
{
case 0:
m = int(origin.X * 65536) + (20 << 16);
l = int(origin.Y * 65536) + (33 << 16);
shadowminitext(m, l, "Original Concept", 12); l += 7 << 16;
shadowminitext(m, l, "Todd Replogle and Allen H. Blum III", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Produced & Directed By", 12); l += 7 << 16;
shadowminitext(m, l, "Greg Malone", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Executive Producer", 12); l += 7 << 16;
shadowminitext(m, l, "George Broussard", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "BUILD Engine", 12); l += 7 << 16;
shadowminitext(m, l, "Ken Silverman", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Game Programming", 12); l += 7 << 16;
shadowminitext(m, l, "Todd Replogle", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "3D Engine/Tools/Net", 12); l += 7 << 16;
shadowminitext(m, l, "Ken Silverman", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Network Layer/Setup Program", 12); l += 7 << 16;
shadowminitext(m, l, "Mark Dochtermann", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Map Design", 12); l += 7 << 16;
shadowminitext(m, l, "Allen H. Blum III", 12); l += 7 << 16;
shadowminitext(m, l, "Richard Gray", 12); l += 7 << 16;
m = int(origin.X * 65536) + (180 << 16);
l = int(origin.Y * 65536) + (33 << 16);
shadowminitext(m, l, "3D Modeling", 12); l += 7 << 16;
shadowminitext(m, l, "Chuck Jones", 12); l += 7 << 16;
shadowminitext(m, l, "Sapphire Corporation", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Artwork", 12); l += 7 << 16;
shadowminitext(m, l, "Dirk Jones, Stephen Hornback", 12); l += 7 << 16;
shadowminitext(m, l, "James Storey, David Demaret", 12); l += 7 << 16;
shadowminitext(m, l, "Douglas R. Wood", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Sound Engine", 12); l += 7 << 16;
shadowminitext(m, l, "Jim Dose", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Sound & Music Development", 12); l += 7 << 16;
shadowminitext(m, l, "Robert Prince", 12); l += 7 << 16;
shadowminitext(m, l, "Lee Jackson", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Voice Talent", 12); l += 7 << 16;
shadowminitext(m, l, "Lani Minella - Voice Producer", 12); l += 7 << 16;
shadowminitext(m, l, "Jon St. John as \"Duke Nukem\"", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Graphic Design", 12); l += 7 << 16;
shadowminitext(m, l, "Packaging, Manual, Ads", 12); l += 7 << 16;
shadowminitext(m, l, "Robert M. Atkins", 12); l += 7 << 16;
shadowminitext(m, l, "Michael Hadwin", 12); l += 7 << 16;
break;
case 1:
m = int(origin.X * 65536) + (20 << 16);
l = int(origin.Y * 65536) + (33 << 16);
shadowminitext(m, l, "Special Thanks To", 12); l += 7 << 16;
shadowminitext(m, l, "Steven Blackburn, Tom Hall", 12); l += 7 << 16;
shadowminitext(m, l, "Scott Miller, Joe Siegler", 12); l += 7 << 16;
shadowminitext(m, l, "Terry Nagy, Colleen Compton", 12); l += 7 << 16;
shadowminitext(m, l, "HASH, Inc., FormGen, Inc.", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "The 3D Realms Beta Testers", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Nathan Anderson, Wayne Benner", 12); l += 7 << 16;
shadowminitext(m, l, "Glenn Brensinger, Rob Brown", 12); l += 7 << 16;
shadowminitext(m, l, "Erik Harris, Ken Heckbert", 12); l += 7 << 16;
shadowminitext(m, l, "Terry Herrin, Greg Hively", 12); l += 7 << 16;
shadowminitext(m, l, "Hank Leukart, Eric Baker", 12); l += 7 << 16;
shadowminitext(m, l, "Jeff Rausch, Kelly Rogers", 12); l += 7 << 16;
shadowminitext(m, l, "Mike Duncan, Doug Howell", 12); l += 7 << 16;
shadowminitext(m, l, "Bill Blair", 12); l += 7 << 16;
m = int(origin.X * 65536) + (160 << 16);
l = int(origin.Y * 65536) + (33 << 16);
shadowminitext(m, l, "Company Product Support", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "The following companies were cool", 12); l += 7 << 16;
shadowminitext(m, l, "enough to give us lots of stuff", 12); l += 7 << 16;
shadowminitext(m, l, "during the making of Duke Nukem 3D.", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Altec Lansing Multimedia", 12); l += 7 << 16;
shadowminitext(m, l, "for tons of speakers and the", 12); l += 7 << 16;
shadowminitext(m, l, "THX-licensed sound system.", 12); l += 7 << 16;
shadowminitext(m, l, "For info call 1-800-548-0620", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Creative Labs, Inc.", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Thanks for the hardware, guys.", 12); l += 7 << 16;
break;
case 2:
mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + (50 << 16), "Duke Nukem 3D is a trademark of\n"
"3D Realms Entertainment"
"\n"
"Duke Nukem 3D\n"
"(C) 1996 3D Realms Entertainment");
if (VOLUMEONE)
{
mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + (106 << 16), "Please read LICENSE.DOC for shareware\n"
"distribution grants and restrictions.");
}
mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + ((VOLUMEONE ? 134 : 115) << 16), "Made in Dallas, Texas USA");
break;
}
}
};
//----------------------------------------------------------------------------
//
// Menu related game interface functions
//
//----------------------------------------------------------------------------
void GameInterface::MenuOpened()
{
@ -638,9 +509,181 @@ FSavegameInfo GameInterface::GetSaveSig()
return { SAVESIG_DN3D, MINSAVEVER_DN3D, SAVEVER_DN3D };
}
//----------------------------------------------------------------------------
//
//
//
//----------------------------------------------------------------------------
static void shadowminitext(int32_t x, int32_t y, const char* t, int32_t p)
{
int32_t f = 0;
if (!minitext_lowercase)
f |= TEXT_UPPERCASE;
G_ScreenTextShadow(1, 1, MINIFONT, x, y, 65536, 0, 0, t, 0, p, 2 | 8 | 16 | ROTATESPRITE_FULL16, 0, 4 << 16, 8 << 16, 1 << 16, 0, f, 0, 0, xdim - 1, ydim - 1);
}
//----------------------------------------------------------------------------
//
// allows the front end to override certain fullscreen image menus
// with custom implementations.
//
// This is needed because the credits screens in Duke Nukem
// are eithrr done by providing an image or by printing text, based on the version used.
//
//----------------------------------------------------------------------------
bool GameInterface::DrawSpecialScreen(const DVector2 &origin, int tilenum)
{
// Older versions of Duke Nukem create the credits screens manually.
// On the latest version there's real graphics for this.
bool haveCredits = VOLUMEALL && PLUTOPAK;
int32_t m, l;
if (!haveCredits)
{
if (tilenum == CREDITSTEXT1)
{
Menu_DrawBackground(origin);
m = int(origin.X * 65536) + (20 << 16);
l = int(origin.Y * 65536) + (33 << 16);
shadowminitext(m, l, "Original Concept", 12); l += 7 << 16;
shadowminitext(m, l, "Todd Replogle and Allen H. Blum III", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Produced & Directed By", 12); l += 7 << 16;
shadowminitext(m, l, "Greg Malone", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Executive Producer", 12); l += 7 << 16;
shadowminitext(m, l, "George Broussard", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "BUILD Engine", 12); l += 7 << 16;
shadowminitext(m, l, "Ken Silverman", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Game Programming", 12); l += 7 << 16;
shadowminitext(m, l, "Todd Replogle", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "3D Engine/Tools/Net", 12); l += 7 << 16;
shadowminitext(m, l, "Ken Silverman", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Network Layer/Setup Program", 12); l += 7 << 16;
shadowminitext(m, l, "Mark Dochtermann", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Map Design", 12); l += 7 << 16;
shadowminitext(m, l, "Allen H. Blum III", 12); l += 7 << 16;
shadowminitext(m, l, "Richard Gray", 12); l += 7 << 16;
m = int(origin.X * 65536) + (180 << 16);
l = int(origin.Y * 65536) + (33 << 16);
shadowminitext(m, l, "3D Modeling", 12); l += 7 << 16;
shadowminitext(m, l, "Chuck Jones", 12); l += 7 << 16;
shadowminitext(m, l, "Sapphire Corporation", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Artwork", 12); l += 7 << 16;
shadowminitext(m, l, "Dirk Jones, Stephen Hornback", 12); l += 7 << 16;
shadowminitext(m, l, "James Storey, David Demaret", 12); l += 7 << 16;
shadowminitext(m, l, "Douglas R. Wood", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Sound Engine", 12); l += 7 << 16;
shadowminitext(m, l, "Jim Dose", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Sound & Music Development", 12); l += 7 << 16;
shadowminitext(m, l, "Robert Prince", 12); l += 7 << 16;
shadowminitext(m, l, "Lee Jackson", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Voice Talent", 12); l += 7 << 16;
shadowminitext(m, l, "Lani Minella - Voice Producer", 12); l += 7 << 16;
shadowminitext(m, l, "Jon St. John as \"Duke Nukem\"", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Graphic Design", 12); l += 7 << 16;
shadowminitext(m, l, "Packaging, Manual, Ads", 12); l += 7 << 16;
shadowminitext(m, l, "Robert M. Atkins", 12); l += 7 << 16;
shadowminitext(m, l, "Michael Hadwin", 12); l += 7 << 16;
return true;
}
else if (tilenum == CREDITSTEXT2__STATIC)
{
Menu_DrawBackground(origin);
m = int(origin.X * 65536) + (20 << 16);
l = int(origin.Y * 65536) + (33 << 16);
shadowminitext(m, l, "Special Thanks To", 12); l += 7 << 16;
shadowminitext(m, l, "Steven Blackburn, Tom Hall", 12); l += 7 << 16;
shadowminitext(m, l, "Scott Miller, Joe Siegler", 12); l += 7 << 16;
shadowminitext(m, l, "Terry Nagy, Colleen Compton", 12); l += 7 << 16;
shadowminitext(m, l, "HASH, Inc., FormGen, Inc.", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "The 3D Realms Beta Testers", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Nathan Anderson, Wayne Benner", 12); l += 7 << 16;
shadowminitext(m, l, "Glenn Brensinger, Rob Brown", 12); l += 7 << 16;
shadowminitext(m, l, "Erik Harris, Ken Heckbert", 12); l += 7 << 16;
shadowminitext(m, l, "Terry Herrin, Greg Hively", 12); l += 7 << 16;
shadowminitext(m, l, "Hank Leukart, Eric Baker", 12); l += 7 << 16;
shadowminitext(m, l, "Jeff Rausch, Kelly Rogers", 12); l += 7 << 16;
shadowminitext(m, l, "Mike Duncan, Doug Howell", 12); l += 7 << 16;
shadowminitext(m, l, "Bill Blair", 12); l += 7 << 16;
m = int(origin.X * 65536) + (160 << 16);
l = int(origin.Y * 65536) + (33 << 16);
shadowminitext(m, l, "Company Product Support", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "The following companies were cool", 12); l += 7 << 16;
shadowminitext(m, l, "enough to give us lots of stuff", 12); l += 7 << 16;
shadowminitext(m, l, "during the making of Duke Nukem 3D.", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Altec Lansing Multimedia", 12); l += 7 << 16;
shadowminitext(m, l, "for tons of speakers and the", 12); l += 7 << 16;
shadowminitext(m, l, "THX-licensed sound system.", 12); l += 7 << 16;
shadowminitext(m, l, "For info call 1-800-548-0620", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Creative Labs, Inc.", 12); l += 7 << 16;
l += 3 << 16;
shadowminitext(m, l, "Thanks for the hardware, guys.", 12); l += 7 << 16;
return true;
}
else if (tilenum == CREDITSTEXT3)
{
Menu_DrawBackground(origin);
mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + (50 << 16), "Duke Nukem 3D is a trademark of\n"
"3D Realms Entertainment"
"\n"
"Duke Nukem 3D\n"
"(C) 1996 3D Realms Entertainment");
if (VOLUMEONE)
{
mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + (106 << 16), "Please read LICENSE.DOC for shareware\n"
"distribution grants and restrictions.");
}
mgametextcenter(int(origin.X * 65536), int(origin.Y * 65536) + ((VOLUMEONE ? 134 : 115) << 16), "Made in Dallas, Texas USA");
return true;
}
}
return false;
}
void GameInterface::DrawCenteredTextScreen(const DVector2 &origin, const char *text, int position)
{
Menu_DrawBackground(origin);
mgametextcenter(int(origin.X * 65536), int((origin.Y + position) * 65536), text);
}
END_DUKE_NS
//----------------------------------------------------------------------------
//
// Class registration
//
//----------------------------------------------------------------------------
static TMenuClassDescriptor<Duke::MainMenu> _mm("Duke.MainMenu");
static TMenuClassDescriptor<Duke::DukeListMenu> _lm("Duke.ListMenu");
static TMenuClassDescriptor<Duke::DukeNewGameCustomSubMenu> _ngcsm("Duke.NewGameCustomSubMenu");

View file

@ -164,6 +164,8 @@ struct GameInterface : ::GameInterface
void CustomMenuSelection(int menu, int item) override;
void StartGame(FGameStartup& gs) override;
FSavegameInfo GetSaveSig() override;
bool DrawSpecialScreen(const DVector2 &origin, int tilenum) override;
void DrawCenteredTextScreen(const DVector2 &origin, const char *text, int position) override;
};

View file

@ -3560,19 +3560,7 @@ DO_DEFSTATE:
initprintf("%s:%d: warning: duplicate dynamicremap statement\n",g_scriptFileName,g_lineNumber);
g_warningCnt++;
}
#ifdef DYNTILEREMAP_ENABLE
#ifdef DEBUGGINGAIDS
else
initprintf("Using dynamic tile remapping\n");
#endif
g_dynamicTileMapping = 1;
#else
else
{
initprintf("%s:%d: warning: dynamic tile remapping is disabled in this build\n",g_scriptFileName,g_lineNumber);
g_warningCnt++;
}
#endif
continue;
case CON_DYNAMICSOUNDREMAP:

View file

@ -1926,35 +1926,6 @@ static void Menu_Pre(MenuID_t cm)
}
static void Menu_PreDrawBackground(MenuID_t cm, const vec2_t origin)
{
switch (cm)
{
case MENU_CREDITS:
case MENU_CREDITS2:
case MENU_CREDITS3:
case MENU_LOAD:
case MENU_SAVE:
if (FURY)
break;
fallthrough__;
case MENU_CREDITS4:
case MENU_CREDITS5:
Menu_DrawBackground(origin);
break;
case MENU_STORY:
rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (100<<16), 65536L,0,TEXTSTORY,0,0,10+64);
break;
case MENU_F1HELP:
rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (100<<16), 65536L,0,F1HELP,0,0,10+64);
break;
}
}
static void Menu_DrawVerifyPrompt(int32_t x, int32_t y, const char * text, int numlines = 1)
{
mgametextcenter(x, y + (90<<16), text);

View file

@ -1,764 +0,0 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 2010 EDuke32 developers and contributors
This file is part of EDuke32.
EDuke32 is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//-------------------------------------------------------------------------
#define SECTOREFFECTOR 1
#define ACTIVATOR 2
#define TOUCHPLATE 3
#define ACTIVATORLOCKED 4
#define MUSICANDSFX 5
#define LOCATORS 6
#define CYCLER 7
#define MASTERSWITCH 8
#define RESPAWN 9
#define GPSPEED 10
#define FOF 13
#define ARROW 20
#define FIRSTGUNSPRITE 21
#define CHAINGUNSPRITE 22
#define RPGSPRITE 23
#define FREEZESPRITE 24
#define SHRINKERSPRITE 25
#define HEAVYHBOMB 26
#define TRIPBOMBSPRITE 27
#define SHOTGUNSPRITE 28
#define DEVISTATORSPRITE 29
#define HEALTHBOX 30
#define AMMOBOX 31
#define GROWSPRITEICON 32
#define INVENTORYBOX 33
#define FREEZEAMMO 37
#define AMMO 40
#define BATTERYAMMO 41
#define DEVISTATORAMMO 42
#define RPGAMMO 44
#define GROWAMMO 45
#define CRYSTALAMMO 46
#define HBOMBAMMO 47
#define AMMOLOTS 48
#define SHOTGUNAMMO 49
#define COLA 51
#define SIXPAK 52
#define FIRSTAID 53
#define SHIELD 54
#define STEROIDS 55
#define AIRTANK 56
#define JETPACK 57
#define HEATSENSOR 59
#define ACCESSCARD 60
#define BOOTS 61
#define MIRRORBROKE 70
#define CLOUDYOCEAN 78
#define CLOUDYSKIES 79
#define MOONSKY1 80
#define MOONSKY2 81
#define MOONSKY3 82
#define MOONSKY4 83
#define BIGORBIT1 84
#define BIGORBIT2 85
#define BIGORBIT3 86
#define BIGORBIT4 87
#define BIGORBIT5 88
#define LA 89
#define REDSKY1 98
#define REDSKY2 99
#define ATOMICHEALTH 100
#define TECHLIGHT2 120
#define TECHLIGHTBUST2 121
#define TECHLIGHT4 122
#define TECHLIGHTBUST4 123
#define WALLLIGHT4 124
#define WALLLIGHTBUST4 125
#define ACCESSSWITCH 130
#define SLOTDOOR 132
#define LIGHTSWITCH 134
#define SPACEDOORSWITCH 136
#define SPACELIGHTSWITCH 138
#define FRANKENSTINESWITCH 140
#define NUKEBUTTON 142
#define MULTISWITCH 146
#define DOORTILE5 150
#define DOORTILE6 151
#define DOORTILE1 152
#define DOORTILE2 153
#define DOORTILE3 154
#define DOORTILE4 155
#define DOORTILE7 156
#define DOORTILE8 157
#define DOORTILE9 158
#define DOORTILE10 159
#define DOORSHOCK 160
#define DIPSWITCH 162
#define DIPSWITCH2 164
#define TECHSWITCH 166
#define DIPSWITCH3 168
#define ACCESSSWITCH2 170
#define REFLECTWATERTILE 180
#define FLOORSLIME 200
#define BIGFORCE 230
#define EPISODE 247
#define MASKWALL9 255
#define W_LIGHT 260
#define SCREENBREAK1 263
#define SCREENBREAK2 264
#define SCREENBREAK3 265
#define SCREENBREAK4 266
#define SCREENBREAK5 267
#define SCREENBREAK6 268
#define SCREENBREAK7 269
#define SCREENBREAK8 270
#define SCREENBREAK9 271
#define SCREENBREAK10 272
#define SCREENBREAK11 273
#define SCREENBREAK12 274
#define SCREENBREAK13 275
#define MASKWALL1 285
#define W_TECHWALL1 293
#define W_TECHWALL2 297
#define W_TECHWALL15 299
#define W_TECHWALL3 301
#define W_TECHWALL4 305
#define W_TECHWALL10 306
#define W_TECHWALL16 307
#define WATERTILE2 336
#define BPANNEL1 341
#define PANNEL1 342
#define PANNEL2 343
#define WATERTILE 344
#define STATIC 351
#define W_SCREENBREAK 357
#define W_HITTECHWALL3 360
#define W_HITTECHWALL4 361
#define W_HITTECHWALL2 362
#define W_HITTECHWALL1 363
#define MASKWALL10 387
#define MASKWALL11 391
#define DOORTILE22 395
#define FANSPRITE 407
#define FANSPRITEBROKE 411
#define FANSHADOW 412
#define FANSHADOWBROKE 416
#define DOORTILE18 447
#define DOORTILE19 448
#define DOORTILE20 449
#define SPACESHUTTLE 487
#define SATELLITE 489
#define VIEWSCREEN2 499
#define VIEWSCREENBROKE 501
#define VIEWSCREEN 502
#define GLASS 503
#define GLASS2 504
#define STAINGLASS1 510
#define MASKWALL5 514
#define SATELITE 516
#define FUELPOD 517
#define SLIMEPIPE 538
#define CRACK1 546
#define CRACK2 547
#define CRACK3 548
#define CRACK4 549
#define FOOTPRINTS 550
#define DOMELITE 551
#define CAMERAPOLE 554
#define CHAIR1 556
#define CHAIR2 557
#define BROKENCHAIR 559
#define MIRROR 560
#define WATERFOUNTAIN 563
#define WATERFOUNTAINBROKE 567
#define FEMMAG1 568
#define TOILET 569
#define STALL 571
#define STALLBROKE 573
#define FEMMAG2 577
#define REACTOR2 578
#define REACTOR2BURNT 579
#define REACTOR2SPARK 580
#define GRATE1 595
#define BGRATE1 596
#define SOLARPANNEL 602
#define NAKED1 603
#define ANTENNA 607
#define MASKWALL12 609
#define TOILETBROKE 615
#define PIPE2 616
#define PIPE1B 617
#define PIPE3 618
#define PIPE1 619
#define CAMERA1 621
#define BRICK 626
#define SPLINTERWOOD 630
#define PIPE2B 633
#define BOLT1 634
#define W_NUMBERS 640
#define WATERDRIP 660
#define WATERBUBBLE 661
#define WATERBUBBLEMAKER 662
#define W_FORCEFIELD 663
#define VACUUM 669
#define FOOTPRINTS2 672
#define FOOTPRINTS3 673
#define FOOTPRINTS4 674
#define EGG 675
#define SCALE 678
#define CHAIR3 680
#define CAMERALIGHT 685
#define MOVIECAMERA 686
#define IVUNIT 689
#define POT1 694
#define POT2 695
#define POT3 697
#define PIPE3B 700
#define WALLLIGHT3 701
#define WALLLIGHTBUST3 702
#define WALLLIGHT1 703
#define WALLLIGHTBUST1 704
#define WALLLIGHT2 705
#define WALLLIGHTBUST2 706
#define LIGHTSWITCH2 712
#define WAITTOBESEATED 716
#define DOORTILE14 717
#define STATUE 753
#define MIKE 762
#define VASE 765
#define SUSHIPLATE1 768
#define SUSHIPLATE2 769
#define SUSHIPLATE3 774
#define SUSHIPLATE4 779
#define DOORTILE16 781
#define SUSHIPLATE5 792
#define OJ 806
#define MASKWALL13 830
#define HURTRAIL 859
#define POWERSWITCH1 860
#define LOCKSWITCH1 862
#define POWERSWITCH2 864
#define ATM 867
#define STATUEFLASH 869
#define ATMBROKE 888
#define BIGHOLE2 893
#define STRIPEBALL 901
#define QUEBALL 902
#define POCKET 903
#define WOODENHORSE 904
#define TREE1 908
#define TREE2 910
#define CACTUS 911
#define MASKWALL2 913
#define MASKWALL3 914
#define MASKWALL4 915
#define FIREEXT 916
#define TOILETWATER 921
#define NEON1 925
#define NEON2 926
#define CACTUSBROKE 939
#define BOUNCEMINE 940
#define BROKEFIREHYDRENT 950
#define BOX 951
#define BULLETHOLE 952
#define BOTTLE1 954
#define BOTTLE2 955
#define BOTTLE3 956
#define BOTTLE4 957
#define FEMPIC5 963
#define FEMPIC6 964
#define FEMPIC7 965
#define HYDROPLANT 969
#define OCEANSPRITE1 971
#define OCEANSPRITE2 972
#define OCEANSPRITE3 973
#define OCEANSPRITE4 974
#define OCEANSPRITE5 975
#define GENERICPOLE 977
#define CONE 978
#define HANGLIGHT 979
#define HYDRENT 981
#define MASKWALL14 988
#define TIRE 990
#define PIPE5 994
#define PIPE6 995
#define PIPE4 996
#define PIPE4B 997
#define BROKEHYDROPLANT 1003
#define PIPE5B 1005
#define NEON3 1007
#define NEON4 1008
#define NEON5 1009
#define BOTTLE5 1012
#define BOTTLE6 1013
#define BOTTLE8 1014
#define SPOTLITE 1020
#define HANGOOZ 1022
#define MASKWALL15 1024
#define BOTTLE7 1025
#define HORSEONSIDE 1026
#define GLASSPIECES 1031
#define HORSELITE 1034
#define DONUTS 1045
#define NEON6 1046
#define MASKWALL6 1059
#define CLOCK 1060
#define RUBBERCAN 1062
#define BROKENCLOCK 1067
#define PLUG 1069
#define OOZFILTER 1079
#define FLOORPLASMA 1082
#define REACTOR 1088
#define REACTORSPARK 1092
#define REACTORBURNT 1096
#define DOORTILE15 1102
#define HANDSWITCH 1111
#define CIRCLEPANNEL 1113
#define CIRCLEPANNELBROKE 1114
#define PULLSWITCH 1122
#define MASKWALL8 1124
#define BIGHOLE 1141
#define ALIENSWITCH 1142
#define DOORTILE21 1144
#define HANDPRINTSWITCH 1155
#define BOTTLE10 1157
#define BOTTLE11 1158
#define BOTTLE12 1159
#define BOTTLE13 1160
#define BOTTLE14 1161
#define BOTTLE15 1162
#define BOTTLE16 1163
#define BOTTLE17 1164
#define BOTTLE18 1165
#define BOTTLE19 1166
#define DOORTILE17 1169
#define MASKWALL7 1174
#define JAILBARBREAK 1175
#define DOORTILE11 1178
#define DOORTILE12 1179
#define VENDMACHINE 1212
#define VENDMACHINEBROKE 1214
#define COLAMACHINE 1215
#define COLAMACHINEBROKE 1217
#define CRANEPOLE 1221
#define CRANE 1222
#define BARBROKE 1225
#define BLOODPOOL 1226
#define NUKEBARREL 1227
#define NUKEBARRELDENTED 1228
#define NUKEBARRELLEAKED 1229
#define CANWITHSOMETHING 1232
#define MONEY 1233
#define BANNER 1236
#define EXPLODINGBARREL 1238
#define EXPLODINGBARREL2 1239
#define FIREBARREL 1240
#define SEENINE 1247
#define SEENINEDEAD 1248
#define STEAM 1250
#define CEILINGSTEAM 1255
#define PIPE6B 1260
#define TRANSPORTERBEAM 1261
#define RAT 1267
#define TRASH 1272
#define FEMPIC1 1280
#define FEMPIC2 1289
#define BLANKSCREEN 1293
#define PODFEM1 1294
#define FEMPIC3 1298
#define FEMPIC4 1306
#define FEM1 1312
#define FEM2 1317
#define FEM3 1321
#define FEM5 1323
#define BLOODYPOLE 1324
#define FEM4 1325
#define FEM6 1334
#define FEM6PAD 1335
#define FEM8 1336
#define HELECOPT 1346
#define FETUSJIB 1347
#define HOLODUKE 1348
#define SPACEMARINE 1353
#define INDY 1355
#define FETUS 1358
#define FETUSBROKE 1359
#define MONK 1352
#define LUKE 1354
#define COOLEXPLOSION1 1360
#define WATERSPLASH2 1380
#define FIREVASE 1390
#define SCRATCH 1393
#define FEM7 1395
#define APLAYERTOP 1400
#define APLAYER 1405
#define PLAYERONWATER 1420
#define DUKELYINGDEAD 1518
#define DUKETORSO 1520
#define DUKEGUN 1528
#define DUKELEG 1536
#define SHARK 1550
#define BLOOD 1620
#define FIRELASER 1625
#define TRANSPORTERSTAR 1630
#define SPIT 1636
#define LOOGIE 1637
#define FIST 1640
#define FREEZEBLAST 1641
#define DEVISTATORBLAST 1642
#define SHRINKSPARK 1646
#define TONGUE 1647
#define MORTER 1650
#define SHRINKEREXPLOSION 1656
#define RADIUSEXPLOSION 1670
#define FORCERIPPLE 1671
#define LIZTROOP 1680
#define LIZTROOPRUNNING 1681
#define LIZTROOPSTAYPUT 1682
#define LIZTOP 1705
#define LIZTROOPSHOOT 1715
#define LIZTROOPJETPACK 1725
#define LIZTROOPDSPRITE 1734
#define LIZTROOPONTOILET 1741
#define LIZTROOPJUSTSIT 1742
#define LIZTROOPDUCKING 1744
#define HEADJIB1 1768
#define ARMJIB1 1772
#define LEGJIB1 1776
#define CANNON 1810
#define CANNONBALL 1817
#define CANNONBALLS 1818
#define OCTABRAIN 1820
#define OCTABRAINSTAYPUT 1821
#define OCTATOP 1845
#define OCTADEADSPRITE 1855
#define INNERJAW 1860
#define DRONE 1880
#define EXPLOSION2 1890
#define COMMANDER 1920
#define COMMANDERSTAYPUT 1921
#define RECON 1960
#define TANK 1975
#define PIGCOP 2000
#define PIGCOPSTAYPUT 2001
#define PIGCOPDIVE 2045
#define PIGCOPDEADSPRITE 2060
#define PIGTOP 2061
#define LIZMAN 2120
#define LIZMANSTAYPUT 2121
#define LIZMANSPITTING 2150
#define LIZMANFEEDING 2160
#define LIZMANJUMP 2165
#define LIZMANDEADSPRITE 2185
#define FECES 2200
#define LIZMANHEAD1 2201
#define LIZMANARM1 2205
#define LIZMANLEG1 2209
#define EXPLOSION2BOT 2219
#define USERWEAPON 2235
#define HEADERBAR 2242
#define JIBS1 2245
#define JIBS2 2250
#define JIBS3 2255
#define JIBS4 2260
#define JIBS5 2265
#define BURNING 2270
#define FIRE 2271
#define JIBS6 2286
#define BLOODSPLAT1 2296
#define BLOODSPLAT3 2297
#define BLOODSPLAT2 2298
#define BLOODSPLAT4 2299
#define OOZ 2300
#define OOZ2 2309
#define WALLBLOOD1 2301
#define WALLBLOOD2 2302
#define WALLBLOOD3 2303
#define WALLBLOOD4 2304
#define WALLBLOOD5 2305
#define WALLBLOOD6 2306
#define WALLBLOOD7 2307
#define WALLBLOOD8 2308
#define BURNING2 2310
#define FIRE2 2311
#define CRACKKNUCKLES 2324
#define SMALLSMOKE 2329
#define SMALLSMOKEMAKER 2330
#define FLOORFLAME 2333
#define ROTATEGUN 2360
#define GREENSLIME 2370
#define WATERDRIPSPLASH 2380
#define SCRAP6 2390
#define SCRAP1 2400
#define SCRAP2 2404
#define SCRAP3 2408
#define SCRAP4 2412
#define SCRAP5 2416
#define ORGANTIC 2420
#define BETAVERSION 2440
#define PLAYERISHERE 2442
#define PLAYERWASHERE 2443
#define SELECTDIR 2444
#define F1HELP 2445
#define NOTCHON 2446
#define NOTCHOFF 2447
#define GROWSPARK 2448
#define DUKEICON 2452
#define BADGUYICON 2453
#define FOODICON 2454
#define GETICON 2455
#define MENUSCREEN 2456
#define MENUBAR 2457
#define KILLSICON 2458
#define FIRSTAID_ICON 2460
#define HEAT_ICON 2461
#define BOTTOMSTATUSBAR 2462
#define BOOT_ICON 2463
#define FRAGBAR 2465
#define JETPACK_ICON 2467
#define AIRTANK_ICON 2468
#define STEROIDS_ICON 2469
#define HOLODUKE_ICON 2470
#define ACCESS_ICON 2471
#define DIGITALNUM 2472
#define DUKECAR 2491
#define CAMCORNER 2482
#define CAMLIGHT 2484
#define LOGO 2485
#define TITLE 2486
#define NUKEWARNINGICON 2487
#define MOUSECURSOR 2488
#define SLIDEBAR 2489
#define DREALMS 2492
#define BETASCREEN 2493
#define WINDOWBORDER1 2494
#define TEXTBOX 2495
#define WINDOWBORDER2 2496
#define DUKENUKEM 2497
#define THREEDEE 2498
#define INGAMEDUKETHREEDEE 2499
#define TENSCREEN 2500
#define PLUTOPAKSPRITE 2501
#define DEVISTATOR 2510
#define KNEE 2521
#define CROSSHAIR 2523
#define FIRSTGUN 2524
#define FIRSTGUNRELOAD 2528
#define FALLINGCLIP 2530
#define CLIPINHAND 2531
#define HAND 2532
#define SHELL 2533
#define SHOTGUNSHELL 2535
#define CHAINGUN 2536
#define RPGGUN 2544
#define RPGMUZZLEFLASH 2545
#define FREEZE 2548
#define CATLITE 2552
#define SHRINKER 2556
#define HANDHOLDINGLASER 2563
#define TRIPBOMB 2566
#define LASERLINE 2567
#define HANDHOLDINGACCESS 2568
#define HANDREMOTE 2570
#define HANDTHROW 2573
#define TIP 2576
#define GLAIR 2578
#define SCUBAMASK 2581
#define SPACEMASK 2584
#define FORCESPHERE 2590
#define SHOTSPARK1 2595
#define RPG 2605
#define LASERSITE 2612
#define SHOTGUN 2613
#define BOSS1 2630
#define BOSS1STAYPUT 2631
#define BOSS1SHOOT 2660
#define BOSS1LOB 2670
#define BOSSTOP 2696
#define BOSS2 2710
#define BOSS3 2760
#define SPINNINGNUKEICON 2813
#define BIGFNTCURSOR 2820
#define SMALLFNTCURSOR 2821
#define STARTALPHANUM 2822
#define ENDALPHANUM 2915
#define BIGALPHANUM 2940
#define BIGPERIOD 3002
#define BIGCOMMA 3003
#define BIGX 3004
#define BIGQ 3005
#define BIGSEMI 3006
#define BIGCOLIN 3007
#define THREEBYFIVE 3010
#define BIGAPPOS 3022
#define BLANK 3026
#define MINIFONT 3072
#define BUTTON1 3164
#define GLASS3 3187
#define RESPAWNMARKERRED 3190
#define RESPAWNMARKERYELLOW 3200
#define RESPAWNMARKERGREEN 3210
#define BONUSSCREEN 3240
#define VIEWBORDER 3250
#define VICTORY1 3260
#define ORDERING 3270
#define TEXTSTORY 3280
#define LOADSCREEN 3281
#define BORNTOBEWILDSCREEN 3370
#define BLIMP 3400
#define FEM9 3450
#define FOOTPRINT 3701
#define FRAMEEFFECT1_13 3999
#define POOP 4094
#define FRAMEEFFECT1 4095
#define PANNEL3 4099
#define SCREENBREAK14 4120
#define SCREENBREAK15 4123
#define SCREENBREAK19 4125
#define SCREENBREAK16 4127
#define SCREENBREAK17 4128
#define SCREENBREAK18 4129
#define W_TECHWALL11 4130
#define W_TECHWALL12 4131
#define W_TECHWALL13 4132
#define W_TECHWALL14 4133
#define W_TECHWALL5 4134
#define W_TECHWALL6 4136
#define W_TECHWALL7 4138
#define W_TECHWALL8 4140
#define W_TECHWALL9 4142
#define BPANNEL3 4100
#define W_HITTECHWALL16 4144
#define W_HITTECHWALL10 4145
#define W_HITTECHWALL15 4147
#define W_MILKSHELF 4181
#define W_MILKSHELFBROKE 4203
#define PURPLELAVA 4240
#define LAVABUBBLE 4340
#define DUKECUTOUT 4352
#define TARGET 4359
#define GUNPOWDERBARREL 4360
#define DUCK 4361
#define HATRACK 4367
#define DESKLAMP 4370
#define COFFEEMACHINE 4372
#define CUPS 4373
#define GAVALS 4374
#define GAVALS2 4375
#define POLICELIGHTPOLE 4377
#define FLOORBASKET 4388
#define PUKE 4389
#define DOORTILE23 4391
#define TOPSECRET 4396
#define SPEAKER 4397
#define TEDDYBEAR 4400
#define ROBOTDOG 4402
#define ROBOTPIRATE 4404
#define ROBOTMOUSE 4407
#define MAIL 4410
#define MAILBAG 4413
#define HOTMEAT 4427
#define COFFEEMUG 4438
#define DONUTS2 4440
#define TRIPODCAMERA 4444
#define METER 4453
#define DESKPHONE 4454
#define GUMBALLMACHINE 4458
#define GUMBALLMACHINEBROKE 4459
#define PAPER 4460
#define MACE 4464
#define GENERICPOLE2 4465
#define XXXSTACY 4470
#define WETFLOOR 4495
#define BROOM 4496
#define MOP 4497
#define LETTER 4502
#define PIRATE1A 4510
#define PIRATE4A 4511
#define PIRATE2A 4512
#define PIRATE5A 4513
#define PIRATE3A 4514
#define PIRATE6A 4515
#define PIRATEHALF 4516
#define CHESTOFGOLD 4520
#define SIDEBOLT1 4525
#define FOODOBJECT1 4530
#define FOODOBJECT2 4531
#define FOODOBJECT3 4532
#define FOODOBJECT4 4533
#define FOODOBJECT5 4534
#define FOODOBJECT6 4535
#define FOODOBJECT7 4536
#define FOODOBJECT8 4537
#define FOODOBJECT9 4538
#define FOODOBJECT10 4539
#define FOODOBJECT11 4540
#define FOODOBJECT12 4541
#define FOODOBJECT13 4542
#define FOODOBJECT14 4543
#define FOODOBJECT15 4544
#define FOODOBJECT16 4545
#define FOODOBJECT17 4546
#define FOODOBJECT18 4547
#define FOODOBJECT19 4548
#define FOODOBJECT20 4549
#define HEADLAMP 4550
#define TAMPON 4557
#define SKINNEDCHICKEN 4554
#define FEATHEREDCHICKEN 4555
#define ROBOTDOG2 4560
#define JOLLYMEAL 4569
#define DUKEBURGER 4570
#define SHOPPINGCART 4576
#define CANWITHSOMETHING2 4580
#define CANWITHSOMETHING3 4581
#define CANWITHSOMETHING4 4582
#define SNAKEP 4590
#define DOLPHIN1 4591
#define DOLPHIN2 4592
#define NEWBEAST 4610
#define NEWBEASTSTAYPUT 4611
#define NEWBEASTJUMP 4690
#define NEWBEASTHANG 4670
#define NEWBEASTHANGDEAD 4671
#define BOSS4 4740
#define BOSS4STAYPUT 4741
#define FEM10 4864
#define TOUGHGAL 4866
#define MAN 4871
#define MAN2 4872
#define WOMAN 4874
#define PLEASEWAIT 4887
#define NATURALLIGHTNING 4890
#define WEATHERWARN 4893
#define DUKETAG 4900
#define SIGN1 4909
#define SIGN2 4912
#define JURYGUY 4943
// These tile positions are reserved!
#define RESERVEDSLOT1 6132
#define RESERVEDSLOT2 6133
#define RESERVEDSLOT3 6134
#define RESERVEDSLOT4 6135
#define RESERVEDSLOT5 6136
#define RESERVEDSLOT6 6137
#define RESERVEDSLOT7 6138
#define RESERVEDSLOT8 6139
#define RESERVEDSLOT9 6140
#define RESERVEDSLOT10 6141
#define RESERVEDSLOT11 6142
#define RESERVEDSLOT12 6143

View file

@ -27,14 +27,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "namesdyn.h"
#include "global.h"
#include "gamecontrol.h"
BEGIN_DUKE_NS
#ifdef DYNTILEREMAP_ENABLE
# define DVPTR(x) &x
#else
# define DVPTR(x) NULL
#endif
int16_t DynamicTileMap[MAXTILES];
@ -170,6 +167,9 @@ LUNATIC_EXTERN struct dynitem g_dynTileList[] =
{ "CRACKKNUCKLES", DVPTR(CRACKKNUCKLES), CRACKKNUCKLES__STATIC },
{ "CRANE", DVPTR(CRANE), CRANE__STATIC },
{ "CRANEPOLE", DVPTR(CRANEPOLE), CRANEPOLE__STATIC },
{ "CREDITSTEXT1", DVPTR(CREDITSTEXT1), CREDITSTEXT1__STATIC },
{ "CREDITSTEXT2", DVPTR(CREDITSTEXT2), CREDITSTEXT2__STATIC },
{ "CREDITSTEXT3", DVPTR(CREDITSTEXT3), CREDITSTEXT3__STATIC },
{ "CROSSHAIR", DVPTR(CROSSHAIR), CROSSHAIR__STATIC },
{ "CRYSTALAMMO", DVPTR(CRYSTALAMMO), CRYSTALAMMO__STATIC },
{ "CYCLER", DVPTR(CYCLER), CYCLER__STATIC },
@ -642,7 +642,7 @@ LUNATIC_EXTERN struct dynitem g_dynTileList[] =
{ "XXXSTACY", DVPTR(XXXSTACY), XXXSTACY__STATIC },
};
#ifdef DYNTILEREMAP_ENABLE
int32_t ACCESS_ICON = ACCESS_ICON__STATIC;
int32_t ACCESSCARD = ACCESSCARD__STATIC;
int32_t ACCESSSWITCH = ACCESSSWITCH__STATIC;
@ -766,6 +766,9 @@ int32_t CRACK4 = CRACK4__STATIC;
int32_t CRACKKNUCKLES = CRACKKNUCKLES__STATIC;
int32_t CRANE = CRANE__STATIC;
int32_t CRANEPOLE = CRANEPOLE__STATIC;
int32_t CREDITSTEXT1 = CREDITSTEXT1__STATIC;
int32_t CREDITSTEXT2 = CREDITSTEXT2__STATIC;
int32_t CREDITSTEXT3 = CREDITSTEXT3__STATIC;
int32_t CROSSHAIR = CROSSHAIR__STATIC;
int32_t CRYSTALAMMO = CRYSTALAMMO__STATIC;
int32_t CYCLER = CYCLER__STATIC;
@ -1237,7 +1240,6 @@ int32_t WOMAN = WOMAN__STATIC;
int32_t WOODENHORSE = WOODENHORSE__STATIC;
int32_t XXXSTACY = XXXSTACY__STATIC;
#if !defined LUNATIC
static hashtable_t h_names = {512, NULL};
void G_ProcessDynamicTileMapping(const char *szLabel, int32_t lValue)
@ -1250,10 +1252,6 @@ void G_ProcessDynamicTileMapping(const char *szLabel, int32_t lValue)
if (i>=0)
{
struct dynitem *di = &g_dynTileList[i];
#ifdef DEBUGGINGAIDS
if (g_scriptDebug && di->staticval != lValue)
OSD_Printf("REMAP %s (%d) --> %d\n", di->str, di->staticval, lValue);
#endif
*di->dynvalptr = lValue;
}
}
@ -1270,8 +1268,6 @@ void freehashnames(void)
{
hash_free(&h_names);
}
#endif
#endif
// This is run after all CON define's have been processed to set up the
// dynamic->static tile mapping.
@ -1280,11 +1276,10 @@ void G_InitDynamicTiles(void)
Bmemset(DynamicTileMap, 0, sizeof(DynamicTileMap));
for (auto & i : g_dynTileList)
#ifdef DYNTILEREMAP_ENABLE
{
DynamicTileMap[*(i.dynvalptr)] = i.staticval;
#else
DynamicTileMap[i.staticval] = i.staticval;
#endif
NameToTileIndex.Insert(i.str, *(i.dynvalptr));
}
g_blimpSpawnItems[0] = RPGSPRITE;
g_blimpSpawnItems[1] = CHAINGUNSPRITE;
@ -1314,10 +1309,5 @@ void G_InitDynamicTiles(void)
WeaponPickupSprites[9] = FREEZESPRITE;
WeaponPickupSprites[10] = HEAVYHBOMB;
WeaponPickupSprites[11] = SHRINKERSPRITE;
// ouch... the big background image takes up a fuckload of memory and takes a second to load!
#ifdef EDUKE32_GLES
MENUSCREEN = LOADSCREEN = BETASCREEN;
#endif
}
END_DUKE_NS

View file

@ -26,9 +26,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_DUKE_NS
#define DYNTILEREMAP_ENABLE
#define SECTOREFFECTOR__STATIC 1
#define ACTIVATOR__STATIC 2
#define TOUCHPLATE__STATIC 3
@ -505,6 +502,9 @@ BEGIN_DUKE_NS
#define INGAMEDUKETHREEDEE__STATIC 2499
#define TENSCREEN__STATIC 2500
#define PLUTOPAKSPRITE__STATIC 2501
#define CREDITSTEXT1__STATIC 2504
#define CREDITSTEXT2__STATIC 2505
#define CREDITSTEXT3__STATIC 2506
#define DEVISTATOR__STATIC 2510
#define KNEE__STATIC 2521
#define CROSSHAIR__STATIC 2523
@ -627,8 +627,6 @@ extern int16_t DynamicTileMap[MAXTILES];
void G_InitDynamicTiles(void);
#ifdef DYNTILEREMAP_ENABLE
void G_ProcessDynamicTileMapping(const char *szLabel, int32_t lValue);
#if !defined LUNATIC
@ -759,6 +757,9 @@ extern int32_t CRACK4;
extern int32_t CRACKKNUCKLES;
extern int32_t CRANE;
extern int32_t CRANEPOLE;
extern int32_t CREDITSTEXT1;
extern int32_t CREDITSTEXT2;
extern int32_t CREDITSTEXT3;
extern int32_t CROSSHAIR;
extern int32_t CRYSTALAMMO;
extern int32_t CYCLER;
@ -1232,22 +1233,6 @@ extern int32_t XXXSTACY;
#define DYNAMICTILEMAP(Tilenum) (DynamicTileMap[Tilenum])
#else /* if !defined DYNTILEREMAP_ENABLE */
#define G_ProcessDynamicTileMapping(x, y) ((void)(0))
#define inithashnames() ((void)0)
#define freehashnames() ((void)0)
#include "names.h"
#undef SPACESHUTTLE
#undef CANNON
#undef CANNONBALLS
#define DYNAMICTILEMAP(Tilenum) (Tilenum)
#endif
END_DUKE_NS
#endif // namesdyn_h__

View file

@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "namesdyn.h"
#include "global.h"
#include "gamecontrol.h"
BEGIN_RR_NS
@ -2965,6 +2966,7 @@ void G_InitDynamicTiles(void)
*(g_dynTileList[i].dynvalptr) = -g_dynTileList[i].staticval_rr;
if (RRRA && *(g_dynTileList[i].dynvalptr) == -UFO1__STATICRR) *(g_dynTileList[i].dynvalptr) = -UFO1__STATICRRRA;
DynamicTileMap[*(g_dynTileList[i].dynvalptr)] = g_dynTileList[i].staticval_rr;
NameToTileIndex.Insert(g_dynTileList[i].str, *(g_dynTileList[i].dynvalptr));
}
for (i = 0; g_dynWeaponList[i].staticval >= 0; i++)
*(g_dynWeaponList[i].dynvalptr) = g_dynWeaponList[i].staticval_rr;
@ -2974,7 +2976,10 @@ void G_InitDynamicTiles(void)
for (i=0; g_dynTileList[i].staticval >= 0; i++)
if (g_dynTileList[i].staticval > 0)
{
DynamicTileMap[*(g_dynTileList[i].dynvalptr)] = g_dynTileList[i].staticval;
NameToTileIndex.Insert(g_dynTileList[i].str, *(g_dynTileList[i].dynvalptr));
}
for (i=0; g_dynWeaponList[i].staticval >= 0; i++)
DynamicWeaponMap[*(g_dynWeaponList[i].dynvalptr)] = g_dynWeaponList[i].staticval;

View file

@ -1,13 +1,13 @@
//-------------------------------------------------------------------------------------------
//
//
// Main Memu
//
//-------------------------------------------------------------------------------------------
LISTMENU "MainMenu"
{
ScriptId 0
ifgame(Duke, Nam, WW2GI, Fury)
ifgame(Duke, Nam, WW2GI, Fury, Redneck, RedneckRides)
{
ifgame(fury)
{
@ -20,7 +20,14 @@ LISTMENU "MainMenu"
centermenu
animatedtransition
}
class "Duke.MainMenu"
ifgame(Duke, Nam, WW2GI, Fury)
{
class "Duke.ListMenu"
}
else
{
class "Redneck.ListMenu"
}
NativeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu"
//NativeTextItem "$MNU_NEWGAME", "m", "MultiMenu" // In EDuke this replaces "New Game" when in networking mode. Kept here as a reminder (I'm not going to support EDuke's C/S implementation)
ifgame(fury)
@ -36,16 +43,6 @@ LISTMENU "MainMenu"
NativeTextItem "$MNU_CREDITS", "c", "CreditsMenu"
NativeTextItem "$MNU_QUITGAME", "q", "QuitMenu"
}
ifgame(Redneck, RedneckRides)
{
NativeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu"
//NativeTextItem "$MNU_NEWGAME", "m", "MultiMenu" // In EDuke this replaces "New Game" when in networking mode. Kept here as a reminder (I'm not going to support EDuke's C/S implementation)
NativeTextItem "$MNU_LOADGAME", "l", "LoadGameMenu"
NativeTextItem "$MNU_OPTIONS", "o", "OptionsMenu"
NativeTextItem "$MNU_HELP", "h", "HelpMenu"
NativeTextItem "$MNU_CREDITS", "c", "CreditsMenu"
NativeTextItem "$MNU_QUITGAME", "q", "QuitMenu"
}
ifgame(Blood)
{
NativeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu"
@ -67,6 +64,11 @@ LISTMENU "MainMenu"
}
}
//-------------------------------------------------------------------------------------------
//
// Ingame Memu (same as above with a few more options)
//
//-------------------------------------------------------------------------------------------
LISTMENU "IngameMenu"
{
@ -84,19 +86,14 @@ LISTMENU "IngameMenu"
centermenu
animatedtransition
}
linespacing 15
class "Duke.MainMenu"
NativeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu"
NativeTextItem "$MNU_SAVEGAME", "s", "SaveGameMenu"
NativeTextItem "$MNU_LOADGAME", "l", "LoadGameMenu"
NativeTextItem "$MNU_OPTIONS", "o", "OptionsMenu"
NativeTextItem "$MNU_HELP", "h", "HelpMenu"
NativeTextItem "$MNU_ENDGAME", "e", "QuitToMenu"
NativeTextItem "$MNU_QUITGAME", "q", "QuitMenu"
}
ifgame(Redneck, RedneckRides)
{
linespacing 15
ifgame(Duke, Nam, WW2GI, Fury)
{
class "Duke.ListMenu"
}
else
{
class "Redneck.ListMenu"
}
NativeTextItem "$MNU_NEWGAME", "n", "EpisodeMenu"
NativeTextItem "$MNU_SAVEGAME", "s", "SaveGameMenu"
NativeTextItem "$MNU_LOADGAME", "l", "LoadGameMenu"
@ -128,24 +125,36 @@ LISTMENU "IngameMenu"
}
}
//-------------------------------------------------------------------------------------------
//
// Episode and skill menu are filled in programmatically
//
//-------------------------------------------------------------------------------------------
LISTMENU "EpisodeMenu"
{
ifgame(Duke, Nam, WW2GI, Fury) // Ion Fury does not use this menu.
ifgame(Duke, Nam, WW2GI, Fury, Redneck, RedneckRides) // Ion Fury does not use this menu.
{
caption "$MNU_SELECTEPISODE"
position 160, 48, 142
centermenu
fixedspacing 5
animatedtransition
class "Duke.ListMenu"
ifgame(Duke, Nam, WW2GI, Fury)
{
class "Duke.ListMenu"
}
else
{
class "Redneck.ListMenu"
}
}
ScriptId 100
}
LISTMENU "SkillMenu"
{
ifgame(Duke, Nam, WW2GI, Fury) // Ion Fury does not use this menu.
ifgame(Duke, Nam, WW2GI, Fury, Redneck, RedneckRides)
{
ifgame(fury)
{
@ -160,13 +169,25 @@ LISTMENU "SkillMenu"
}
caption "$MNU_SELECTSKILL"
fixedspacing 5
class "Duke.ListMenu"
ifgame(Duke, Nam, WW2GI, Fury)
{
class "Duke.ListMenu"
}
else
{
class "Redneck.ListMenu"
}
animatedtransition
}
ScriptId 110
}
//-------------------------------------------------------------------------------------------
//
// The custom menus are only supported by the EDuke32 frontend.
//
//-------------------------------------------------------------------------------------------
LISTMENU "CustomGameMenu"
{
caption "$MNU_NEWGAME"
@ -305,14 +326,27 @@ LISTMENU "CustomSubMenu7"
class "Duke.ListMenu"
}
//-------------------------------------------------------------------------------------------
//
// No multiplayer support for now, but kept as a reminder.
//
//-------------------------------------------------------------------------------------------
LISTMENU "MultiMenu"
{
ifgame(Duke, Nam, WW2GI, Fury) // Ion Fury does not use this menu.
ifgame(Duke, Nam, WW2GI, Fury)
{
position 160, 55, 135
centermenu
fixedspacing 5
class "Duke.ListMenu"
ifgame(Duke, Nam, WW2GI, Fury)
{
class "Duke.ListMenu"
}
else
{
class "Redneck.ListMenu"
}
animatedtransition
}
@ -321,3 +355,106 @@ LISTMENU "MultiMenu"
NativeTextItem "$MNU_JOINGAME", "j", "JoinGameMenu"
NativeTextItem "$MNU_HOSTGAME", "h", "HostGameMenu"
}
//-------------------------------------------------------------------------------------------
//
//
//
//-------------------------------------------------------------------------------------------
ImageScroller "HelpMenu"
{
ifgame(Duke, Nam, WW2GI, Fury)
{
ImageItem "TEXTSTORY", 400
ImageItem "F1HELP", 401
}
ifgame(Redneck, RedneckRides)
{
ImageItem "TEXTSTORY"
ImageItem "F1HELP"
ImageItem "RRTILE1636"
}
}
//-------------------------------------------------------------------------------------------
//
// Credits menu. This is logically highly game specific.
// Note that this has been split into two submenus so that the engine
// credits can be handled in a generic fashion instead of having to define
// them for each game natively.
//
// Engine credits are now in the options menu, i.e. the generic part of the menu.
//
//-------------------------------------------------------------------------------------------
ImageScroller "CreditsMenu"
{
ifgame(Duke, Nam, WW2GI, Fury)
{
ImageItem "CREDITSTEXT1", 990
ImageItem "CREDITSTEXT2", 991
ImageItem "CREDITSTEXT3", 992
}
ifgame(Redneck)
{
// no point putting this into the string table.
TextItem "ORIGINAL CONCEPT, DESIGN AND DIRECTION\n\nDREW MARKHAM", 80
TextItem "PRODUCED BY\n\nGREG GOODRICH", 80
TextItem "GAME PROGRAMMING\n\nRAFAEL PAIZ", 80
TextItem "ART DIRECTORS\n\nCLAIRE PRADERIE MAXX KAUFMAN ", 80
TextItem "LEAD LEVEL DESIGNER\nALEX MAYBERRY\n\nLEVEL DESIGN\nMAL BLACKWELL\nSVERRE KVERNMO", 80
TextItem "SENIOR ANIMATOR AND ARTIST\n\nJASON HOOVER", 80
TextItem "TECHNICAL DIRECTOR\n\nBARRY DEMPSEY", 80
TextItem "MOTION CAPTURE SPECIALIST AND\nCHARACTER ANIMATION\nAMIT DORON\n\nA.I. PROGRAMMING\nARTHUR DONAVAN\n\nADDITIONAL ANIMATION\nGEORGE KARL", 60
TextItem "CHARACTER DESIGN\nCORKY LEHMKUHL\n\nMAP PAINTERS\n"VIKTOR ANTONOV\nMATTHIAS BEEGUER\nSTEPHAN BURLE\n\nSCULPTORS\nGEORGE ENGEL\nJAKE GARBER\nJEFF HIMMEL", 50
TextItem "CHARACTER VOICES\n\nLEONARD\nBURTON GILLIAM\n\nBUBBA, BILLY RAY, SKINNY OL' COOT\nAND THE TURD MINION\nDREW MARKHAM\n\nSHERIFF LESTER T. HOBBES\nMOJO NIXON\n\nALIEN VIXEN\nPEGGY JO JACOBS", 40
TextItem "SOUND DESIGN\nGARY BRADFIELD\n\nMUSIC\nMOJO NIXON\nTHE BEAT FARMERS\nTHE REVEREND HORTON HEAT\nCEMENT POND\n\nADDITIONAL SOUND EFFECTS\nJIM SPURGIN", 50
TextItem "MOTION CAPTURE ACTOR\nJ.P. MANOUX\n\nMOTION CAPTURE VIXEN\nSHAWN WOLFE", 80
TextItem "PRODUCTION ASSISTANCE\nMINERVA MAYBERRY\n\nNUTS AND BOLTS\nSTEVE GOLDBERG\nMARCUS HUTCHINSON\n\nBEAN COUNTING\nMAX YOSHIKAWA\n\nADMINISTRATIVE ASSISTANCE\nSERAFIN LEWIS", 50
TextItem "LOCATION MANAGER, LOUISIANA\nRICK SKINNER\n\nLOCATION SCOUT, LOUISIANA\nBRIAN BENOS\n\nPHOTOGRAPHER\nCARLOS SERRAO", 70
TextItem "ADDITIONAL 3D MODELING BY\n3 NAME 3D\nVIEWPOINT DATALABS INTERNATIONAL\n\nAUDIO RECORDED AT\nPACIFIC OCEAN POST, SANTA MONICA, C.A.\n\nCEMENT POND TRACKS RECORDED AT\nDREAMSTATE RECORDING, BURBANK, C.A.\n\nRECORDING ENGINEER\nDAVE AHLERT", 50
TextItem "3D BUILD ENGINE LICENSED FROM\n3D REALMS ENTERTAINMENT\n\nBUILD ENGINE AND RELATED TOOLS\nCREATED BY KEN SILVERMAN", 80
TextItem "FOR INTERPLAY\n\nLEAD TESTER\nDARRELL JONES\n\nTESTERS\nTIM ANDERSON\nERICK LUJAN\nTIEN TRAN", 60
TextItem "IS TECHS\nBILL DELK\nAARON MEYERS\n\nCOMPATIBILITY TECHS\nMARC DURAN\nDAN FORSYTH\nDEREK GIBBS\nAARON OLAIZ\nJACK PARKER", 60
TextItem "DIRECTOR OF COMPATIBILITY\nPHUONG NGUYEN\n\nASSISTANT QA DIRECTOR\nCOLIN TOTMAN\n\nQA DIRECTOR\nCHAD ALLISON", 70
TextItem "INTERPLAY PRODUCER\nBILL DUGAN\n\nINTERPLAY LINE PRODUCER\nCHRIS BENSON\n\nPRODUCT MANAGER\nJIM VEEVAERT\n\nPUBLIC RELATIONS\nERIKA PRICE", 50
TextItem "SPECIAL THANKS\n\nJIM GAUER\nPAUL VAIS\nSCOTT MILLER\nTODD REPLOGLE\nCHUCK BUECHE\nCARTER LIPSCOMB\nJOHN CONLEY\nDON MAGGI", 60
TextItem "EXTRA SPECIAL THANKS\n\nBRIAN FARGO", 80
TextItem "REDNECK RAMPAGE\n(c) 1997 XATRIX ENTERTAINMENT, INC.\n\nREDNECK RAMPAGE IS A TRADEMARK OF\nINTERPLAY PRODUCTIONS", 60
}
ifgame(RedneckRides)
{
TextItem "ORIGINAL CONCEPT, DESIGN AND DIRECTION\n\nDREW MARKHAM", 80
TextItem "ART DIRECTION AND ADDITIONAL DESIGN\n\nCORKY LEHMKUHL", 80
TextItem "PRODUCED BY\n\nGREG GOODRICH", 80
TextItem "GAME PROGRAMMING\n\nJOSEPH AURILI", 80
TextItem "ORIGINAL GAME PROGRAMMING\n\nRAFAEL PAIZ", 80
TextItem "LEVEL DESIGN\n\nRHETT BALDWIN & AARON BARBER", 80
TextItem "ORIGINAL ART DIRECTION AND SUPPORT\n\nMAXX KAUFMAN & CLAIRE PRADERIE-MARKHAM", 80
TextItem "COMPUTER GRAPHICS SUPERVISOR &\nCHARACTER ANIMATION DIRECTION\n\nBARRY DEMPSEY", 80
TextItem "SENIOR ANIMATOR & MODELER\n\nJASON HOOVER", 80
TextItem "CHARACTER ANIMATION &\nMOTION CAPTURE SPECIALIST\n\nAMIT DORON", 80
TextItem "SOUND DESIGN &\nMUSIC PRODUCTION COORDINATION\n\nGARY BRADFIELD", 80
TextItem "INTRODUCTION ANIMATION\n\nDOMINIQUE DROZDZ", 80
TextItem "ARTIST\n\nMATTHIAS BEEGUER", 80
TextItem "ADDITIONAL ART\n\nVIKTOR ANTONOV", 80
TextItem "PRODUCTION COORDINATOR\n\nVICTORIA SYLVESTER", 80
TextItem "CHARACTER VOICES\n\nLEONARD\nBURTON GILLIAM\n\nDAISY MAE\nTARA CHARENDOFF\n\nBUBBA, BILLY RAY, SKINNY OL' COOT,\nFRANK THE BIKER, THE TURD MINION\n& ALL OTHER VARIOUS RAMBLINGS...\nDREW MARKHAM", 40
TextItem "SPECIAL APPEARENCE BY\n\nSHERIFF LESTER T. HOBBES\nMOJO NIXON\n\nALIEN VIXEN\nPEGGY JO JACOBS", 70
TextItem "REDNECK RAMPAGE TITLE TRACK & CYBERSEX\nWRITTEN & PERFORMED BY\nMOJO NIXON\n\n(c) MUFFIN'STUFFIN' MUSIC (BMI)\nADMINISTERED BY BUG.", 70
TextItem "MUSIC\n\nDISGRACELAND\nTINY D & THE SOFA KINGS\n\nBANJO AND GUITAR PICKIN\nJOHN SCHLOCKER\nHOWARD YEARWOOD", 60
TextItem "RECORDING ENGINEER\nDAVE AHLERT\n\nRECORDING ASSISTANCE\nJEFF GILBERT", 80
TextItem "MOTION CAPTURE ACTOR\nJ.P. MANOUX\n\nMOTION CAPTURE ACTRESS\nSHAWN WOLFE", 80
TextItem "THIS GAME COULD NOT HAVE BEEN MADE WITHOUT\nALEX MAYBERRY\nMAL BLACKWELL\n\nNUTS AND BOLTS\nSTEVE GOLDBERG\n\nBEAN COUNTING\nMAX YOSHIKAWA\n\nADMINISTRATIVE ASSISTANCE\nMINERVA MAYBERRY", 50
TextItem "FOR INTERPLAY\n\nPRODUCER\nBILL DUGAN\n\nLINE PRODUCER\nCHRIS BENSON\n\nLEAD TESTER\nDARRELL JONES", 60
TextItem "TESTERS\n\nTIM ANDERSON\nPRIMO PULANCO\nMARK MCCARTY\nBRIAN AXLINE", 70
TextItem "PRODUCTION BABY\n\nPAULINE MARIE MARKHAM", 80
TextItem "ORIGINAL PRODUCTION BABY\n\nALYSON KAUFMAN", 80
TextItem "3D BUILD ENGINE LICENSED FROM\n3D REALMS ENTERTAINMENT\n\nBUILD ENGINE AND RELATED TOOLS\nCREATED BY KEN SILVERMAN", 80
TextItem "SPECIAL THANKS\n\nSCOTT MILLER\nGEORGE BROUSSARD", 80
TextItem "EXTRA SPECIAL THANKS\n\nBRIAN FARGO", 80
TextItem "REDNECK RAMPAGE RIDES AGAIN\n(c) 1998 XATRIX ENTERTAINMENT, INC.\n\nREDNECK RAMPAGE RIDES AGAIN\nIS A TRADEMARK OF\nINTERPLAY PRODUCTIONS", 70
}
}