From 697e7d0936afe9d25009a73805a2064508d65d42 Mon Sep 17 00:00:00 2001 From: hendricks266 Date: Sun, 22 Feb 2015 22:15:20 +0000 Subject: [PATCH] CON: Add "definevolumeflags", currently equipped to hide an episode from the single player and/or multiplayer screens. enum { EF_HIDEFROMSP = 1<<0, EF_HIDEFROMMP = 1<<1, }; git-svn-id: https://svn.eduke32.com/eduke32@5033 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/source/gamedef.c | 29 +++++++++++++++ polymer/eduke32/source/gamedef.h | 2 ++ polymer/eduke32/source/global.c | 2 ++ polymer/eduke32/source/global.h | 7 ++++ polymer/eduke32/source/lunatic/defs.ilua | 1 + polymer/eduke32/source/lunatic/dynsymlist | 1 + polymer/eduke32/source/lunatic/lunacon.lua | 14 ++++++++ polymer/eduke32/source/menus.c | 42 +++++++++++++--------- 8 files changed, 81 insertions(+), 17 deletions(-) diff --git a/polymer/eduke32/source/gamedef.c b/polymer/eduke32/source/gamedef.c index 45fc3ff47..baecfb0b3 100644 --- a/polymer/eduke32/source/gamedef.c +++ b/polymer/eduke32/source/gamedef.c @@ -98,6 +98,7 @@ static struct { uint32_t keyw; uint32_t date; } g_keywdate[] = { CON_SETMUSICPOSITION, 20150116 }, { CON_UNDEFINELEVEL, 20150208 }, { CON_IFCUTSCENE, 20150210 }, + { CON_DEFINEVOLUMEFLAGS, 20150222 }, }; #endif @@ -559,6 +560,7 @@ const char *keyw[] = "undefinelevel", // 377 "startcutscene", // 378 "ifcutscene", // 379 + "definevolumeflags", // 380 "" }; #endif @@ -2228,6 +2230,13 @@ void C_DefineGameType(int32_t idx, int32_t flags, const char *name) } #endif +void C_DefineVolumeFlags(int32_t vol, int32_t flags) +{ + Bassert((unsigned)vol < MAXVOLUMES); + + EpisodeFlags[vol] = flags; +} + void C_UndefineVolume(int32_t vol) { Bassert((unsigned)vol < MAXVOLUMES); @@ -5416,6 +5425,26 @@ repeatcase: EpisodeNames[j][i] = '\0'; continue; + case CON_DEFINEVOLUMEFLAGS: + g_scriptPtr--; + C_GetNextValue(LABEL_DEFINE); + g_scriptPtr--; + j = *g_scriptPtr; + C_GetNextValue(LABEL_DEFINE); + g_scriptPtr--; + k = *g_scriptPtr; + + if (EDUKE32_PREDICT_FALSE((unsigned)j > MAXVOLUMES-1)) + { + initprintf("%s:%d: error: volume number exceeds maximum volume count.\n",g_szScriptFileName,g_lineNumber); + g_numCompilerErrors++; + C_NextLine(); + continue; + } + + C_DefineVolumeFlags(j, k); + continue; + case CON_DEFINEGAMEFUNCNAME: g_scriptPtr--; C_GetNextValue(LABEL_DEFINE); diff --git a/polymer/eduke32/source/gamedef.h b/polymer/eduke32/source/gamedef.h index d73c0bb36..6c3baa98a 100644 --- a/polymer/eduke32/source/gamedef.h +++ b/polymer/eduke32/source/gamedef.h @@ -111,6 +111,7 @@ extern vmstate_t vm; void G_DoGameStartup(const int32_t *params); void C_DefineMusic(int32_t vol, int32_t lev, const char *fn); +void C_DefineVolumeFlags(int32_t vol, int32_t flags); void C_UndefineVolume(int32_t vol); void C_UndefineSkill(int32_t skill); void C_UndefineLevel(int32_t vol, int32_t lev); @@ -984,6 +985,7 @@ enum ScriptKeywords_t CON_UNDEFINELEVEL, // 377 CON_STARTCUTSCENE, // 378 CON_IFCUTSCENE, // 379 + CON_DEFINEVOLUMEFLAGS, // 380 CON_END }; // KEEPINSYNC with the keyword list in lunatic/con_lang.lua diff --git a/polymer/eduke32/source/global.c b/polymer/eduke32/source/global.c index de8e96704..b12de4f78 100644 --- a/polymer/eduke32/source/global.c +++ b/polymer/eduke32/source/global.c @@ -38,6 +38,8 @@ int32_t g_spriteGravity=176; int16_t g_spriteDeleteQueueSize = 64; char EpisodeNames[MAXVOLUMES][33] = { "L.A. Meltdown", "Lunar Apocalypse", "Shrapnel City" }; +int32_t EpisodeFlags[MAXVOLUMES]; // all initialize to zero + char SkillNames[MAXSKILLS][33] = { "Piece Of Cake", "Let's Rock", "Come Get Some", "Damn I'm Good" }; char GametypeNames[MAXGAMETYPES][33] = { "DukeMatch (Spawn)", "Cooperative Play", "DukeMatch (No Spawn)", "Team DM (Spawn)", "Team DM (No Spawn)" }; diff --git a/polymer/eduke32/source/global.h b/polymer/eduke32/source/global.h index 40e75353e..3dcd61af4 100644 --- a/polymer/eduke32/source/global.h +++ b/polymer/eduke32/source/global.h @@ -144,6 +144,7 @@ extern const char *s_buildDate; extern int32_t g_spriteGravity; extern int16_t g_spriteDeleteQueueSize; extern char EpisodeNames[MAXVOLUMES][33]; +extern int32_t EpisodeFlags[MAXVOLUMES]; extern char SkillNames[MAXSKILLS][33]; extern char GametypeNames[MAXGAMETYPES][33]; extern int32_t GametypeFlags[MAXGAMETYPES]; @@ -168,6 +169,12 @@ extern char CheatKeys[2]; extern char setupfilename[BMAX_PATH]; #endif +enum +{ + EF_HIDEFROMSP = 1<<0, + EF_HIDEFROMMP = 1<<1, +}; + #ifdef __cplusplus } #endif diff --git a/polymer/eduke32/source/lunatic/defs.ilua b/polymer/eduke32/source/lunatic/defs.ilua index acc9608b3..552c9adb0 100644 --- a/polymer/eduke32/source/lunatic/defs.ilua +++ b/polymer/eduke32/source/lunatic/defs.ilua @@ -741,6 +741,7 @@ int32_t C_DefineSound(int32_t sndidx, const char *fn, int32_t args [5]); void C_DefineMusic(int32_t vol, int32_t lev, const char *fn); void C_DefineQuote(int32_t qnum, const char *qstr); void C_DefineVolumeName(int32_t vol, const char *name); +void C_DefineVolumeFlags(int32_t vol, int32_t flags); void C_UndefineVolume(int32_t vol); void C_DefineSkillName(int32_t skill, const char *name); void C_UndefineSkill(int32_t skill); diff --git a/polymer/eduke32/source/lunatic/dynsymlist b/polymer/eduke32/source/lunatic/dynsymlist index 7438474d5..5ea8cda04 100644 --- a/polymer/eduke32/source/lunatic/dynsymlist +++ b/polymer/eduke32/source/lunatic/dynsymlist @@ -143,6 +143,7 @@ C_DefineSound; C_DefineMusic; C_DefineQuote; C_DefineVolumeName; +C_DefineVolumeFlags; C_UndefineVolume; C_DefineSkillName; C_UndefineSkill; diff --git a/polymer/eduke32/source/lunatic/lunacon.lua b/polymer/eduke32/source/lunatic/lunacon.lua index dad25c4d2..83746ade0 100644 --- a/polymer/eduke32/source/lunatic/lunacon.lua +++ b/polymer/eduke32/source/lunatic/lunacon.lua @@ -1272,6 +1272,17 @@ function Cmd.definevolumename(vol, name) g_data.volname[vol] = name end +function Cmd.definevolumeflags(vol, flags) + if (not (vol >= 0 and vol < conl.MAXVOLUMES)) then + errprintf("volume number is negative or exceeds maximum volume count.") + return + end + + if (ffi) then + ffiC.C_DefineVolumeFlags(vol, flags) + end +end + function Cmd.undefinevolume(vol) if (not (vol >= 0 and vol < conl.MAXVOLUMES)) then errprintf("volume number is negative or exceeds maximum volume count.") @@ -1898,6 +1909,9 @@ local Couter = { music = sp1 * tok.define * match_until(sp1 * tok.filename, sp1 * conl.keyword * sp1) / Cmd.music, + definevolumeflags = cmd(D,D) + / Cmd.definevolumeflags, + undefinelevel = cmd(D,D) / Cmd.undefinelevel, undefineskill = cmd(D) diff --git a/polymer/eduke32/source/menus.c b/polymer/eduke32/source/menus.c index 229ddc213..866aa474e 100644 --- a/polymer/eduke32/source/menus.c +++ b/polymer/eduke32/source/menus.c @@ -1030,6 +1030,7 @@ static char *MenuSkillNone = "None"; static char *MEOSN_NetGametypes[MAXGAMETYPES]; static char *MEOSN_NetEpisodes[MAXVOLUMES+1]; +static int32_t MEOSV_NetEpisodes[MAXVOLUMES+1]; static char *MEOSN_NetLevels[MAXVOLUMES][MAXLEVELS]; static char *MEOSN_NetSkills[MAXSKILLS+1]; @@ -1045,8 +1046,9 @@ static MenuEntry_t *MEL_NETHOST[] = { static MenuOptionSet_t MEOS_NETOPTIONS_GAMETYPE = MAKE_MENUOPTIONSET( MEOSN_NetGametypes, NULL, 0x0 ); static MenuOption_t MEO_NETOPTIONS_GAMETYPE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_GAMETYPE, &ud.m_coop ); static MenuEntry_t ME_NETOPTIONS_GAMETYPE = MAKE_MENUENTRY( "Game Type", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_GAMETYPE, Option ); -static MenuOptionSet_t MEOS_NETOPTIONS_EPISODE = MAKE_MENUOPTIONSET( MEOSN_NetEpisodes, NULL, 0x0 ); -static MenuOption_t MEO_NETOPTIONS_EPISODE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_EPISODE, NULL ); +static MenuOptionSet_t MEOS_NETOPTIONS_EPISODE = MAKE_MENUOPTIONSET( MEOSN_NetEpisodes, MEOSV_NetEpisodes, 0x0 ); +static int32_t NetEpisode; +static MenuOption_t MEO_NETOPTIONS_EPISODE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_EPISODE, &NetEpisode ); static MenuEntry_t ME_NETOPTIONS_EPISODE = MAKE_MENUENTRY( "Episode", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_EPISODE, Option ); static MenuOptionSet_t MEOS_NETOPTIONS_LEVEL[MAXVOLUMES]; static MenuOption_t MEO_NETOPTIONS_LEVEL = MAKE_MENUOPTION( &MF_Bluefont, NULL, &ud.m_level_number ); @@ -1293,18 +1295,25 @@ void M_Init(void) // prepare episodes - k = -1; + k = 0; for (i = 0; i < g_numVolumes; ++i) { if (EpisodeNames[i][0]) { - MEL_EPISODE[i] = &ME_EPISODE[i]; - ME_EPISODE[i] = ME_EPISODE_TEMPLATE; - ME_EPISODE[i].name = EpisodeNames[i]; + if (!(EpisodeFlags[i] & EF_HIDEFROMSP)) + { + MEL_EPISODE[i] = &ME_EPISODE[i]; + ME_EPISODE[i] = ME_EPISODE_TEMPLATE; + ME_EPISODE[i].name = EpisodeNames[i]; + } - MEOSN_NetEpisodes[i] = EpisodeNames[i]; + if (!(EpisodeFlags[i] & EF_HIDEFROMMP)) + { + MEOSN_NetEpisodes[k] = EpisodeNames[i]; + MEOSV_NetEpisodes[k] = i; - k = i; + k++; + } } // prepare levels @@ -1316,12 +1325,13 @@ void M_Init(void) } MEOS_NETOPTIONS_LEVEL[i].optionNames = MEOSN_NetLevels[i]; } - ++k; - M_EPISODE.numEntries = g_numVolumes+2; // k; + M_EPISODE.numEntries = g_numVolumes+2; MEL_EPISODE[g_numVolumes] = &ME_Space4; MEL_EPISODE[g_numVolumes+1] = &ME_EPISODE_USERMAP; - MEOS_NETOPTIONS_EPISODE.numOptions = g_numVolumes + 1; // k+1; - MEOSN_NetEpisodes[g_numVolumes] = MenuUserMap; + MEOS_NETOPTIONS_EPISODE.numOptions = k + 1; + MEOSN_NetEpisodes[k] = MenuUserMap; + MEOSV_NetEpisodes[k] = MAXVOLUMES; + NetEpisode = MEOSV_NetEpisodes[0]; MMF_Top_Episode.pos.y = (48-(g_numVolumes*2))<<16; if (g_numSkills == 0) MEO_EPISODE.linkID = MENU_NULL; @@ -1590,12 +1600,12 @@ static void M_PreMenu(MenuID_t cm) break; case MENU_NETOPTIONS: - if (MEO_NETOPTIONS_EPISODE.currentOption == MEOS_NETOPTIONS_EPISODE.numOptions-1) + if (MEOSV_NetEpisodes[MEO_NETOPTIONS_EPISODE.currentOption] == MAXVOLUMES) MEL_NETOPTIONS[2] = &ME_NETOPTIONS_USERMAP; else { MEL_NETOPTIONS[2] = &ME_NETOPTIONS_LEVEL; - MEO_NETOPTIONS_LEVEL.options = &MEOS_NETOPTIONS_LEVEL[MEO_NETOPTIONS_EPISODE.currentOption]; + MEO_NETOPTIONS_LEVEL.options = &MEOS_NETOPTIONS_LEVEL[MEOSV_NetEpisodes[MEO_NETOPTIONS_EPISODE.currentOption]]; } MEL_NETOPTIONS[4] = (GametypeFlags[ud.m_coop] & GAMETYPE_MARKEROPTION) ? &ME_NETOPTIONS_MARKERS : &ME_NETOPTIONS_MARKERS_DISABLED; MEL_NETOPTIONS[5] = (GametypeFlags[ud.m_coop] & (GAMETYPE_PLAYERSFRIENDLY|GAMETYPE_TDM)) ? &ME_NETOPTIONS_FRFIRE : &ME_NETOPTIONS_MAPEXITS; @@ -2550,7 +2560,7 @@ static int32_t M_MenuEntryOptionModify(MenuEntry_t *entry, int32_t newOption) CONTROL_MapAnalogAxis(M_JOYSTICKAXES.currentEntry, newOption, controldevice_joystick); else if (entry == &ME_NETOPTIONS_EPISODE) { - if (newOption < g_numVolumes) + if ((unsigned)newOption < g_numVolumes) ud.m_volume_number = newOption; } else if (entry == &ME_NETOPTIONS_MONSTERS) @@ -2814,8 +2824,6 @@ static int32_t M_MenuEntryOptionSource(MenuEntry_t *entry, int32_t currentValue) #endif else if (entry == &ME_SOUND_DUKETALK) return ud.config.VoiceToggle & 1; - else if (entry == &ME_NETOPTIONS_EPISODE) - return (currentValue < g_numVolumes ? ud.m_volume_number : g_numVolumes); else if (entry == &ME_NETOPTIONS_MONSTERS) return (ud.m_monsters_off ? g_numSkills : ud.m_player_skill);