mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-04-20 01:01:05 +00:00
Merge branch SRB2:next into server-check-files-progress
This commit is contained in:
commit
ce331613a4
36 changed files with 569 additions and 2358 deletions
|
@ -33,9 +33,6 @@ https://discord.gg/b3BGb8A
|
|||
Twitter:
|
||||
https://twitter.com/SonicTeamJr
|
||||
|
||||
Facebook:
|
||||
https://facebook.com/SonicRoboBlast2
|
||||
|
||||
|
||||
COPYRIGHT AND DISCLAIMER
|
||||
|
||||
|
|
|
@ -41,12 +41,13 @@
|
|||
* Last updated 2023 / 09 / 06 - v2.2.12 - patch.pk3
|
||||
* Last updated 2023 / 09 / 09 - v2.2.13 - none
|
||||
* Last updated 2025 / 01 / 16 - v2.2.14 - main assets
|
||||
* Last updated 2025 / 01 / 24 - v2.2.15 - main assets
|
||||
*/
|
||||
#define ASSET_HASH_SRB2_PK3 "c1d9a4b3452b350d4662f41eb301dc6c"
|
||||
#define ASSET_HASH_ZONES_PK3 "2ab758817fff96bc60ee9dec85e0b534"
|
||||
#define ASSET_HASH_CHARACTERS_PK3 "97ce7008d16152731fe037141309aa24"
|
||||
#define ASSET_HASH_SRB2_PK3 "3182ce524acc2072ddaa81acf4b6a9aa"
|
||||
#define ASSET_HASH_ZONES_PK3 "88ff4c300851ccdb0406698eadd89907"
|
||||
#define ASSET_HASH_CHARACTERS_PK3 "5c5936b8a690e007c0939bd0785a41fb"
|
||||
#ifdef USE_PATCH_DTA
|
||||
#define ASSET_HASH_PATCH_PK3 "3c7b73f34af7e9a7bceb2d5260f76172"
|
||||
#define ASSET_HASH_PATCH_PK3 "00000000000000000000000000000000"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1179,7 +1179,7 @@ static void IdentifyVersion(void)
|
|||
// Add the maps
|
||||
D_AddFile(&startupwadfiles, va(pandf,srb2waddir, "zones.pk3"));
|
||||
|
||||
// Add the players
|
||||
// Add the characters
|
||||
D_AddFile(&startupwadfiles, va(pandf,srb2waddir, "characters.pk3"));
|
||||
|
||||
#ifdef USE_PATCH_DTA
|
||||
|
|
|
@ -45,14 +45,15 @@ typedef enum
|
|||
SF_MARIODAMAGE = SF_NOJUMPDAMAGE|SF_STOMPDAMAGE, // The Mario method of being able to damage enemies, etc.
|
||||
SF_MACHINE = 1<<10, // Beep boop. Are you a robot?
|
||||
SF_DASHMODE = 1<<11, // Sonic Advance 2 style top speed increase?
|
||||
SF_FASTEDGE = 1<<12, // Faster edge teeter?
|
||||
SF_MULTIABILITY = 1<<13, // Revenge of Final Demo.
|
||||
SF_NONIGHTSROTATION = 1<<14, // Disable sprite rotation for NiGHTS
|
||||
SF_NONIGHTSSUPER = 1<<15, // Disable super colors for NiGHTS (if you have SF_SUPER)
|
||||
SF_NOSUPERSPRITES = 1<<16, // Don't use super sprites while super
|
||||
SF_NOSUPERJUMPBOOST = 1<<17, // Disable the jump boost given while super (i.e. Knuckles)
|
||||
SF_CANBUSTWALLS = 1<<18, // Can naturally bust walls on contact? (i.e. Knuckles)
|
||||
SF_NOSHIELDABILITY = 1<<19, // Disable shield abilities
|
||||
SF_FASTWAIT = 1<<12, // Faster wait animation?
|
||||
SF_FASTEDGE = 1<<13, // Faster edge teeter?
|
||||
SF_MULTIABILITY = 1<<14, // Revenge of Final Demo.
|
||||
SF_NONIGHTSROTATION = 1<<15, // Disable sprite rotation for NiGHTS
|
||||
SF_NONIGHTSSUPER = 1<<16, // Disable super colors for NiGHTS (if you have SF_SUPER)
|
||||
SF_NOSUPERSPRITES = 1<<17, // Don't use super sprites while super
|
||||
SF_NOSUPERJUMPBOOST = 1<<18, // Disable the jump boost given while super (i.e. Knuckles)
|
||||
SF_CANBUSTWALLS = 1<<19, // Can naturally bust walls on contact? (i.e. Knuckles)
|
||||
SF_NOSHIELDABILITY = 1<<20, // Disable shield abilities
|
||||
|
||||
// free up to and including 1<<31
|
||||
} skinflags_t;
|
||||
|
@ -159,10 +160,6 @@ typedef enum
|
|||
PF_CANCARRY = 1<<29, // Can carry another player?
|
||||
PF_FINISHED = 1<<30, // The player finished the level. NOT the same as exiting
|
||||
|
||||
// True if shield button down last tic
|
||||
// This may be the final flag, but 2.3 could free up the others
|
||||
PF_SHIELDDOWN = 1<<31,
|
||||
|
||||
// up to 1<<31 is free
|
||||
} pflags_t;
|
||||
|
||||
|
|
|
@ -26,23 +26,20 @@
|
|||
// Button/action code definitions.
|
||||
typedef enum
|
||||
{
|
||||
// First 3 bits are weapon change info, DO NOT USE!
|
||||
BT_WEAPONMASK = 0x07, //our first three bits.
|
||||
// First 4 bits are weapon change info, DO NOT USE!
|
||||
BT_WEAPONMASK = 0x0F, //our first four bits.
|
||||
|
||||
BT_SHIELD = 1<<3, // shield or super action
|
||||
BT_WEAPONNEXT = 1<<4,
|
||||
BT_WEAPONPREV = 1<<5,
|
||||
|
||||
BT_WEAPONNEXT = 1<<4, // select next weapon
|
||||
BT_WEAPONPREV = 1<<5, // select previous weapon
|
||||
BT_ATTACK = 1<<6, // shoot rings
|
||||
BT_SPIN = 1<<7,
|
||||
BT_CAMLEFT = 1<<8, // turn camera left
|
||||
BT_CAMRIGHT = 1<<9, // turn camera right
|
||||
BT_TOSSFLAG = 1<<10,
|
||||
BT_JUMP = 1<<11,
|
||||
BT_FIRENORMAL = 1<<12, // Fire a normal ring no matter what
|
||||
|
||||
BT_ATTACK = 1<<6, // shoot rings
|
||||
BT_SPIN = 1<<7, // spin action
|
||||
BT_CAMLEFT = 1<<8, // turn camera left
|
||||
BT_CAMRIGHT = 1<<9, // turn camera right
|
||||
BT_TOSSFLAG = 1<<10, // toss flag or emeralds
|
||||
BT_JUMP = 1<<11, // jump action
|
||||
BT_FIRENORMAL = 1<<12, // fire a normal ring no matter what
|
||||
|
||||
// custom lua buttons
|
||||
BT_CUSTOM1 = 1<<13,
|
||||
BT_CUSTOM2 = 1<<14,
|
||||
BT_CUSTOM3 = 1<<15,
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
/// \brief Lua SOC library
|
||||
|
||||
#include "deh_lua.h"
|
||||
#include "g_input.h"
|
||||
|
||||
// freeslot takes a name (string only!)
|
||||
// and allocates it to the appropriate free slot.
|
||||
|
@ -600,20 +599,12 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
|
|||
return luaL_error(L, "translation '%s' could not be found.\n", word);
|
||||
}
|
||||
|
||||
// TODO: 2.3: Delete these aliases
|
||||
else if (fastcmp(word, "BT_USE"))
|
||||
// TODO: 2.3: Delete this alias
|
||||
if (fastcmp(word, "BT_USE"))
|
||||
{
|
||||
CacheAndPushConstant(L, word, (lua_Integer)BT_SPIN);
|
||||
return 1;
|
||||
}
|
||||
else if (fastcmp(word, "GC_WEPSLOT8") || fastcmp(word, "GC_WEPSLOT9") || fastcmp(word, "GC_WEPSLOT10"))
|
||||
{
|
||||
// Using GC_WEPSLOT7 isn't accurate, but ensures that "if x >= GC_WEPSLOT1 and x <= GC_WEPSLOT10" keeps the intended effect
|
||||
CacheAndPushConstant(L, word, (lua_Integer)GC_WEPSLOT7);
|
||||
if (!mathlib)
|
||||
LUA_Deprecated(L, "GC_WEPSLOT8\"-\"GC_WEPSLOT10", "GC_WEPSLOT1\"-\"GC_WEPSLOT7");
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (i = 0; INT_CONST[i].n; i++)
|
||||
if (fastcmp(word,INT_CONST[i].n)) {
|
||||
|
|
139
src/deh_soc.c
139
src/deh_soc.c
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2024 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2025 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -286,6 +286,7 @@ void readPlayer(MYFILE *f, INT32 num)
|
|||
}
|
||||
if (playertext)
|
||||
{
|
||||
// PLAYERTEXT is really weird, so this doesn't use deh_strlcpy.
|
||||
strlcpy(description[num].notes, playertext, NOTE_SIZE);
|
||||
strlcat(description[num].notes,
|
||||
myhashfgets(playertext, NOTE_SIZE, f), NOTE_SIZE);
|
||||
|
@ -324,7 +325,8 @@ void readPlayer(MYFILE *f, INT32 num)
|
|||
if (fastcmp(word, "PICNAME"))
|
||||
{
|
||||
SLOTFOUND
|
||||
strncpy(description[num].picname, word2, sizeof(description[num].picname)-1);
|
||||
deh_strlcpy(description[num].picname, word2, sizeof description[num].picname,
|
||||
va("Character %d: picname", num));
|
||||
}
|
||||
else if (fastcmp(word, "DISPLAYNAME"))
|
||||
{
|
||||
|
@ -345,7 +347,8 @@ void readPlayer(MYFILE *f, INT32 num)
|
|||
cur = strchr(cur, '#');
|
||||
}
|
||||
|
||||
strlcpy(description[num].displayname, stringvalue, sizeof description[num].displayname);
|
||||
deh_strlcpy(description[num].displayname, stringvalue, sizeof description[num].displayname,
|
||||
va("Character %d: displayname", num));
|
||||
}
|
||||
else if (fastcmp(word, "OPPOSITECOLOR") || fastcmp(word, "OPPOSITECOLOUR"))
|
||||
{
|
||||
|
@ -355,7 +358,8 @@ void readPlayer(MYFILE *f, INT32 num)
|
|||
else if (fastcmp(word, "NAMETAG") || fastcmp(word, "TAGNAME"))
|
||||
{
|
||||
SLOTFOUND
|
||||
strncpy(description[num].nametag, word2, sizeof(description[num].nametag)-1);
|
||||
deh_strlcpy(description[num].nametag, word2, sizeof description[num].nametag,
|
||||
va("Character %d: nametag", num));
|
||||
}
|
||||
else if (fastcmp(word, "TAGTEXTCOLOR") || fastcmp(word, "TAGTEXTCOLOUR"))
|
||||
{
|
||||
|
@ -387,7 +391,8 @@ void readPlayer(MYFILE *f, INT32 num)
|
|||
{
|
||||
// Send to free slot.
|
||||
SLOTFOUND
|
||||
strlcpy(description[num].skinname, word2, sizeof description[num].skinname);
|
||||
deh_strlcpy(description[num].skinname, word2, sizeof description[num].skinname,
|
||||
va("Character %d: skinname", num));
|
||||
strlwr(description[num].skinname);
|
||||
}
|
||||
else if (!failure)
|
||||
|
@ -1196,6 +1201,7 @@ void readgametype(MYFILE *f, char *gtname)
|
|||
}
|
||||
if (descr)
|
||||
{
|
||||
// DESCRIPTION is really weird, so this doesn't use deh_strlcpy.
|
||||
strlcpy(gtdescription, descr, sizeof (gtdescription));
|
||||
strlcat(gtdescription,
|
||||
myhashfgets(descr, sizeof (gtdescription), f),
|
||||
|
@ -1402,7 +1408,7 @@ void readlevelheader(MYFILE *f, INT32 num)
|
|||
{
|
||||
deh_strlcpy(mapheaderinfo[num-1]->lvlttl, word2,
|
||||
sizeof(mapheaderinfo[num-1]->lvlttl), va("Level header %d: levelname", num));
|
||||
strlcpy(mapheaderinfo[num-1]->selectheading, word2, sizeof(mapheaderinfo[num-1]->selectheading)); // not deh_ so only complains once
|
||||
strlcpy(mapheaderinfo[num-1]->selectheading, word2, sizeof(mapheaderinfo[num-1]->selectheading)); // not deh_strlcpy so only complains once
|
||||
continue;
|
||||
}
|
||||
// CHEAP HACK: move this over here for lowercase subtitles
|
||||
|
@ -1445,10 +1451,10 @@ void readlevelheader(MYFILE *f, INT32 num)
|
|||
// Newly allocated
|
||||
modoption = &mapheaderinfo[num-1]->customopts[j];
|
||||
|
||||
strncpy(modoption->option, word, 31);
|
||||
modoption->option[31] = '\0';
|
||||
strncpy(modoption->value, word2, 255);
|
||||
modoption->value[255] = '\0';
|
||||
deh_strlcpy(modoption->option, word, sizeof(modoption->option),
|
||||
va("Level header %d: custom option %d key", num, j));
|
||||
deh_strlcpy(modoption->value, word2, sizeof(modoption->value),
|
||||
va("Level header %d: custom option %d value", num, j));
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1626,7 +1632,7 @@ void readlevelheader(MYFILE *f, INT32 num)
|
|||
else if (fastcmp(word, "KEYWORDS"))
|
||||
{
|
||||
deh_strlcpy(mapheaderinfo[num-1]->keywords, word2,
|
||||
sizeof(mapheaderinfo[num-1]->keywords), va("Level header %d: keywords", num));
|
||||
sizeof(mapheaderinfo[num-1]->keywords), va("Level header %d: keywords", num));
|
||||
}
|
||||
else if (fastcmp(word, "MUSIC"))
|
||||
{
|
||||
|
@ -1675,7 +1681,8 @@ void readlevelheader(MYFILE *f, INT32 num)
|
|||
}
|
||||
else if (fastcmp(word, "FORCECHARACTER"))
|
||||
{
|
||||
strlcpy(mapheaderinfo[num-1]->forcecharacter, word2, SKINNAMESIZE+1);
|
||||
deh_strlcpy(mapheaderinfo[num-1]->forcecharacter, word2, sizeof mapheaderinfo[num-1]->forcecharacter,
|
||||
va("Level header %d: forcecharacter", num));
|
||||
strlwr(mapheaderinfo[num-1]->forcecharacter); // skin names are lowercase
|
||||
}
|
||||
else if (fastcmp(word, "WEATHER"))
|
||||
|
@ -1683,7 +1690,10 @@ void readlevelheader(MYFILE *f, INT32 num)
|
|||
else if (fastcmp(word, "SKYNUM"))
|
||||
mapheaderinfo[num-1]->skynum = (INT16)i;
|
||||
else if (fastcmp(word, "INTERSCREEN"))
|
||||
strncpy(mapheaderinfo[num-1]->interscreen, word2, sizeof(mapheaderinfo[num-1]->interscreen)-1);
|
||||
{
|
||||
deh_strlcpy(mapheaderinfo[num-1]->interscreen, word2, sizeof mapheaderinfo[num-1]->interscreen,
|
||||
va("Level header %d: interscreen", num));
|
||||
}
|
||||
else if (fastcmp(word, "PRECUTSCENENUM"))
|
||||
mapheaderinfo[num-1]->precutscenenum = (UINT8)i;
|
||||
else if (fastcmp(word, "CUTSCENENUM"))
|
||||
|
@ -1985,14 +1995,17 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
|
|||
picid = (UINT8)atoi(word + 3);
|
||||
if (picid > 8 || picid == 0)
|
||||
{
|
||||
deh_warning("CutSceneScene %d: unknown word '%s'", num, word);
|
||||
deh_warning("Cutscene %d, scene %d: pic number %d out of range (1 - %d)",
|
||||
num + 1, scenenum + 1, picid, 8);
|
||||
continue;
|
||||
}
|
||||
--picid;
|
||||
|
||||
if (fastcmp(word+4, "NAME"))
|
||||
{
|
||||
strncpy(cutscenes[num]->scene[scenenum].picname[picid], word2, 8);
|
||||
deh_strlcpy(cutscenes[num]->scene[scenenum].picname[picid], word2,
|
||||
sizeof cutscenes[num]->scene[scenenum].picname[picid],
|
||||
va("Cutscene %d, scene %d, pic %d: name", num + 1, scenenum + 1, picid + 1));
|
||||
}
|
||||
else if (fastcmp(word+4, "HIRES"))
|
||||
{
|
||||
|
@ -2011,12 +2024,13 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
|
|||
cutscenes[num]->scene[scenenum].ycoord[picid] = usi;
|
||||
}
|
||||
else
|
||||
deh_warning("CutSceneScene %d: unknown word '%s'", num, word);
|
||||
deh_warning("Cutscene %d, scene %d: unknown word '%s'", num + 1, scenenum + 1, word);
|
||||
}
|
||||
else if (fastcmp(word, "MUSIC"))
|
||||
{
|
||||
strncpy(cutscenes[num]->scene[scenenum].musswitch, word2, 7);
|
||||
cutscenes[num]->scene[scenenum].musswitch[6] = 0;
|
||||
deh_strlcpy(cutscenes[num]->scene[scenenum].musswitch, word2,
|
||||
sizeof cutscenes[num]->scene[scenenum].musswitch,
|
||||
va("Cutscene %d, scene %d: music", num + 1, scenenum + 1));
|
||||
}
|
||||
else if (fastcmp(word, "MUSICTRACK"))
|
||||
{
|
||||
|
@ -2051,7 +2065,7 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
|
|||
cutscenes[num]->scene[scenenum].fadecolor = (UINT8)i;
|
||||
}
|
||||
else
|
||||
deh_warning("CutSceneScene %d: unknown word '%s'", num, word);
|
||||
deh_warning("Cutscene %d, scene %d: unknown word '%s'", num + 1, scenenum + 1, word);
|
||||
}
|
||||
} while (!myfeof(f)); // finish when the line is empty
|
||||
|
||||
|
@ -2109,11 +2123,10 @@ void readcutscene(MYFILE *f, INT32 num)
|
|||
readcutscenescene(f, num, value - 1);
|
||||
}
|
||||
else
|
||||
deh_warning("Scene number %d out of range (1 - 128)", value);
|
||||
|
||||
deh_warning("Cutscene %d: scene number %d out of range (1 - 128)", num + 1, value);
|
||||
}
|
||||
else
|
||||
deh_warning("Cutscene %d: unknown word '%s', Scene <num> expected.", num, word);
|
||||
deh_warning("Cutscene %d: unknown word '%s', Scene <num> expected.", num + 1, word);
|
||||
}
|
||||
} while (!myfeof(f)); // finish when the line is empty
|
||||
|
||||
|
@ -2234,7 +2247,8 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
|
|||
|
||||
for (picid = 0; picid < MAX_PROMPT_PICS; picid++)
|
||||
{
|
||||
strncpy(textprompts[num]->page[pagenum].picname[picid], textprompts[num]->page[metapagenum].picname[picid], 8);
|
||||
// Doesn't use deh_strlcpy because it's not copying input.
|
||||
strlcpy(textprompts[num]->page[pagenum].picname[picid], textprompts[num]->page[metapagenum].picname[picid], sizeof textprompts[num]->page[pagenum].picname[picid]);
|
||||
textprompts[num]->page[pagenum].pichires[picid] = textprompts[num]->page[metapagenum].pichires[picid];
|
||||
textprompts[num]->page[pagenum].picduration[picid] = textprompts[num]->page[metapagenum].picduration[picid];
|
||||
textprompts[num]->page[pagenum].xcoord[picid] = textprompts[num]->page[metapagenum].xcoord[picid];
|
||||
|
@ -2247,14 +2261,17 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
|
|||
picid = (UINT8)atoi(word + 3);
|
||||
if (picid > MAX_PROMPT_PICS || picid == 0)
|
||||
{
|
||||
deh_warning("textpromptscene %d: unknown word '%s'", num, word);
|
||||
deh_warning("Text prompt %d, page %d: pic number %d out of range (1 - %d)",
|
||||
num + 1, pagenum + 1, picid, MAX_PROMPT_PICS);
|
||||
continue;
|
||||
}
|
||||
--picid;
|
||||
|
||||
if (fastcmp(word+4, "NAME"))
|
||||
{
|
||||
strncpy(textprompts[num]->page[pagenum].picname[picid], word2, 8);
|
||||
deh_strlcpy(textprompts[num]->page[pagenum].picname[picid], word2,
|
||||
sizeof textprompts[num]->page[pagenum].picname[picid],
|
||||
va("Text prompt %d, page %d, pic %d: name", num + 1, pagenum + 1, picid + 1));
|
||||
}
|
||||
else if (fastcmp(word+4, "HIRES"))
|
||||
{
|
||||
|
@ -2273,12 +2290,16 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
|
|||
textprompts[num]->page[pagenum].ycoord[picid] = usi;
|
||||
}
|
||||
else
|
||||
deh_warning("textpromptscene %d: unknown word '%s'", num, word);
|
||||
{
|
||||
deh_warning("Text prompt %d, page %d: unknown word '%s'",
|
||||
num + 1, pagenum + 1, word);
|
||||
}
|
||||
}
|
||||
else if (fastcmp(word, "MUSIC"))
|
||||
{
|
||||
strncpy(textprompts[num]->page[pagenum].musswitch, word2, 7);
|
||||
textprompts[num]->page[pagenum].musswitch[6] = 0;
|
||||
deh_strlcpy(textprompts[num]->page[pagenum].musswitch, word2,
|
||||
sizeof textprompts[num]->page[pagenum].musswitch,
|
||||
va("Text prompt %d, page %d: music", num + 1, pagenum + 1));
|
||||
}
|
||||
else if (fastcmp(word, "MUSICTRACK"))
|
||||
{
|
||||
|
@ -2293,30 +2314,35 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
|
|||
{
|
||||
if (*word2 != '\0')
|
||||
{
|
||||
INT32 j;
|
||||
size_t j;
|
||||
|
||||
// HACK: Add yellow control char now
|
||||
// so the drawing function doesn't call it repeatedly
|
||||
char name[34];
|
||||
char name[32 + 2];
|
||||
name[0] = '\x82'; // color yellow
|
||||
name[1] = 0;
|
||||
strncat(name, word2, 32);
|
||||
name[33] = 0;
|
||||
|
||||
// So that we still get a warning.
|
||||
deh_strlcpy(name + 1, word2, (sizeof(name)) - 1,
|
||||
va("Text prompt %d, page %d: name", num + 1, pagenum + 1));
|
||||
|
||||
// Replace _ with ' '
|
||||
for (j = 0; j < 32 && name[j]; j++)
|
||||
for (j = 1; j < sizeof(name) && name[j]; j++)
|
||||
{
|
||||
if (name[j] == '_')
|
||||
name[j] = ' ';
|
||||
}
|
||||
|
||||
strncpy(textprompts[num]->page[pagenum].name, name, sizeof(textprompts[num]->page[pagenum].name));
|
||||
strlcpy(textprompts[num]->page[pagenum].name, name, sizeof(textprompts[num]->page[pagenum].name));
|
||||
}
|
||||
else
|
||||
*textprompts[num]->page[pagenum].name = '\0';
|
||||
}
|
||||
else if (fastcmp(word, "ICON"))
|
||||
strncpy(textprompts[num]->page[pagenum].iconname, word2, 8);
|
||||
{
|
||||
deh_strlcpy(textprompts[num]->page[pagenum].iconname, word2,
|
||||
sizeof textprompts[num]->page[pagenum].iconname,
|
||||
va("Text prompt %d, page %d: icon", num + 1, pagenum + 1));
|
||||
}
|
||||
else if (fastcmp(word, "ICONALIGN"))
|
||||
textprompts[num]->page[pagenum].rightside = (i || word2[0] == 'R');
|
||||
else if (fastcmp(word, "ICONFLIP"))
|
||||
|
@ -2383,8 +2409,9 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
|
|||
{
|
||||
UINT8 metapagenum = usi - 1;
|
||||
|
||||
strncpy(textprompts[num]->page[pagenum].name, textprompts[num]->page[metapagenum].name, 32);
|
||||
strncpy(textprompts[num]->page[pagenum].iconname, textprompts[num]->page[metapagenum].iconname, 8);
|
||||
// Doesn't use deh_strlcpy because it's not copying input.
|
||||
strlcpy(textprompts[num]->page[pagenum].name, textprompts[num]->page[metapagenum].name, sizeof textprompts[num]->page[pagenum].name);
|
||||
strlcpy(textprompts[num]->page[pagenum].iconname, textprompts[num]->page[metapagenum].iconname, sizeof textprompts[num]->page[pagenum].iconname);
|
||||
textprompts[num]->page[pagenum].rightside = textprompts[num]->page[metapagenum].rightside;
|
||||
textprompts[num]->page[pagenum].iconflip = textprompts[num]->page[metapagenum].iconflip;
|
||||
textprompts[num]->page[pagenum].lines = textprompts[num]->page[metapagenum].lines;
|
||||
|
@ -2399,17 +2426,25 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
|
|||
}
|
||||
}
|
||||
else if (fastcmp(word, "TAG"))
|
||||
strncpy(textprompts[num]->page[pagenum].tag, word2, 33);
|
||||
{
|
||||
deh_strlcpy(textprompts[num]->page[pagenum].tag, word2,
|
||||
sizeof textprompts[num]->page[pagenum].tag,
|
||||
va("Text prompt %d, page %d: tag", num + 1, pagenum + 1));
|
||||
}
|
||||
else if (fastcmp(word, "NEXTPROMPT"))
|
||||
textprompts[num]->page[pagenum].nextprompt = usi;
|
||||
else if (fastcmp(word, "NEXTPAGE"))
|
||||
textprompts[num]->page[pagenum].nextpage = usi;
|
||||
else if (fastcmp(word, "NEXTTAG"))
|
||||
strncpy(textprompts[num]->page[pagenum].nexttag, word2, 33);
|
||||
{
|
||||
deh_strlcpy(textprompts[num]->page[pagenum].nexttag, word2,
|
||||
sizeof textprompts[num]->page[pagenum].nexttag,
|
||||
va("Text prompt %d, page %d: nexttag", num + 1, pagenum + 1));
|
||||
}
|
||||
else if (fastcmp(word, "TIMETONEXT"))
|
||||
textprompts[num]->page[pagenum].timetonext = get_number(word2);
|
||||
else
|
||||
deh_warning("PromptPage %d: unknown word '%s'", num, word);
|
||||
deh_warning("Text prompt %d, page %d: unknown word '%s'", num + 1, pagenum + 1, word);
|
||||
}
|
||||
} while (!myfeof(f)); // finish when the line is empty
|
||||
|
||||
|
@ -2469,11 +2504,11 @@ void readtextprompt(MYFILE *f, INT32 num)
|
|||
readtextpromptpage(f, num, value - 1);
|
||||
}
|
||||
else
|
||||
deh_warning("Page number %d out of range (1 - %d)", value, MAX_PAGES);
|
||||
deh_warning("Prompt %d: page number %d out of range (1 - %d)", num + 1, value, MAX_PAGES);
|
||||
|
||||
}
|
||||
else
|
||||
deh_warning("Prompt %d: unknown word '%s', Page <num> expected.", num, word);
|
||||
deh_warning("Prompt %d: unknown word '%s', Page <num> expected.", num + 1, word);
|
||||
}
|
||||
} while (!myfeof(f)); // finish when the line is empty
|
||||
|
||||
|
@ -2522,7 +2557,8 @@ void readmenu(MYFILE *f, INT32 num)
|
|||
|
||||
if (fastcmp(word, "BACKGROUNDNAME"))
|
||||
{
|
||||
strncpy(menupres[num].bgname, word2, 8);
|
||||
deh_strlcpy(menupres[num].bgname, word2,
|
||||
sizeof menupres[num].bgname, va("Menu %d: backgroundname", num));
|
||||
titlechanged = true;
|
||||
}
|
||||
else if (fastcmp(word, "HIDEBACKGROUND"))
|
||||
|
@ -2565,7 +2601,8 @@ void readmenu(MYFILE *f, INT32 num)
|
|||
}
|
||||
else if (fastcmp(word, "TITLEPICSNAME"))
|
||||
{
|
||||
strncpy(menupres[num].ttname, word2, 9);
|
||||
deh_strlcpy(menupres[num].ttname, word2,
|
||||
sizeof menupres[num].ttname, va("Menu %d: titlepicsname", num));
|
||||
titlechanged = true;
|
||||
}
|
||||
else if (fastcmp(word, "TITLEPICSX"))
|
||||
|
@ -2601,8 +2638,8 @@ void readmenu(MYFILE *f, INT32 num)
|
|||
}
|
||||
else if (fastcmp(word, "MUSIC"))
|
||||
{
|
||||
strncpy(menupres[num].musname, word2, 7);
|
||||
menupres[num].musname[6] = 0;
|
||||
deh_strlcpy(menupres[num].musname, word2,
|
||||
sizeof menupres[num].musname, va("Menu %d: music", num));
|
||||
titlechanged = true;
|
||||
}
|
||||
else if (fastcmp(word, "MUSICTRACK"))
|
||||
|
@ -3590,9 +3627,7 @@ void readmaincfg(MYFILE *f)
|
|||
lumpnum_t lumpnum;
|
||||
char newname[9];
|
||||
|
||||
strncpy(newname, word2, 8);
|
||||
|
||||
newname[8] = '\0';
|
||||
deh_strlcpy(newname, word2, sizeof newname, va("Maincfg: execcfg"));
|
||||
|
||||
lumpnum = W_CheckNumForName(newname);
|
||||
|
||||
|
@ -3800,7 +3835,7 @@ void readmaincfg(MYFILE *f)
|
|||
}
|
||||
else if (fastcmp(word, "TITLEPICSNAME"))
|
||||
{
|
||||
strncpy(ttname, word2, sizeof(ttname)-1);
|
||||
deh_strlcpy(ttname, word2, sizeof ttname, va("Maincfg: titlepicsname"));
|
||||
titlechanged = true;
|
||||
}
|
||||
else if (fastcmp(word, "TITLEPICSX"))
|
||||
|
@ -3910,7 +3945,7 @@ void readmaincfg(MYFILE *f)
|
|||
}
|
||||
else if (fastcmp(word, "CUSTOMVERSION"))
|
||||
{
|
||||
strlcpy(customversionstring, word2, sizeof (customversionstring));
|
||||
deh_strlcpy(customversionstring, word2, sizeof customversionstring, va("Maincfg: customversion"));
|
||||
//titlechanged = true;
|
||||
}
|
||||
else if (fastcmp(word, "BOOTMAP"))
|
||||
|
|
215
src/deh_tables.c
215
src/deh_tables.c
|
@ -1081,11 +1081,11 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_FANG_FIRE1",
|
||||
"S_FANG_FIRE2",
|
||||
"S_FANG_FIRE3",
|
||||
"S_FANG_FIRE4",
|
||||
"S_FANG_FIREREPEAT",
|
||||
"S_FANG_LOBSHOT0",
|
||||
"S_FANG_LOBSHOT1",
|
||||
"S_FANG_LOBSHOT2",
|
||||
"S_FANG_LOBSHOT3",
|
||||
"S_FANG_WAIT1",
|
||||
"S_FANG_WAIT2",
|
||||
"S_FANG_WALLHIT",
|
||||
|
@ -1107,6 +1107,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_FANG_PINCHLOBSHOT2",
|
||||
"S_FANG_PINCHLOBSHOT3",
|
||||
"S_FANG_PINCHLOBSHOT4",
|
||||
"S_FANG_PINCHLOBSHOT5",
|
||||
"S_FANG_DIE1",
|
||||
"S_FANG_DIE2",
|
||||
"S_FANG_DIE3",
|
||||
|
@ -2256,11 +2257,9 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
// FHZ
|
||||
"S_FHZICE1",
|
||||
"S_FHZICE2",
|
||||
"S_ROSY_IDLE1",
|
||||
"S_ROSY_IDLE2",
|
||||
"S_ROSY_IDLE3",
|
||||
"S_ROSY_IDLE4",
|
||||
"S_ROSY_IDLE",
|
||||
"S_ROSY_JUMP",
|
||||
"S_ROSY_FALL",
|
||||
"S_ROSY_WALK",
|
||||
"S_ROSY_HUG",
|
||||
"S_ROSY_PAIN",
|
||||
|
@ -2920,69 +2919,6 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_BHORIZ7",
|
||||
"S_BHORIZ8",
|
||||
|
||||
// Yellow Trampoline
|
||||
"S_YELLOWTRAMPOLINE",
|
||||
"S_YELLOWTRAMPOLINE2",
|
||||
"S_YELLOWTRAMPOLINE3",
|
||||
"S_YELLOWTRAMPOLINE4",
|
||||
"S_YELLOWTRAMPOLINE5",
|
||||
|
||||
// Red Trampoline
|
||||
"S_REDTRAMPOLINE",
|
||||
"S_REDTRAMPOLINE2",
|
||||
"S_REDTRAMPOLINE3",
|
||||
"S_REDTRAMPOLINE4",
|
||||
"S_REDTRAMPOLINE5",
|
||||
|
||||
// Blue Trampoline
|
||||
"S_BLUETRAMPOLINE",
|
||||
"S_BLUETRAMPOLINE2",
|
||||
"S_BLUETRAMPOLINE3",
|
||||
"S_BLUETRAMPOLINE4",
|
||||
"S_BLUETRAMPOLINE5",
|
||||
|
||||
// Horizontal Yellow Trampoline
|
||||
"S_HORIZYELLOWTRAMPOLINE",
|
||||
"S_HORIZYELLOWTRAMPOLINE2",
|
||||
"S_HORIZYELLOWTRAMPOLINE3",
|
||||
"S_HORIZYELLOWTRAMPOLINE4",
|
||||
"S_HORIZYELLOWTRAMPOLINE5",
|
||||
|
||||
// Horizontal Red Trampoline
|
||||
"S_HORIZREDTRAMPOLINE",
|
||||
"S_HORIZREDTRAMPOLINE2",
|
||||
"S_HORIZREDTRAMPOLINE3",
|
||||
"S_HORIZREDTRAMPOLINE4",
|
||||
"S_HORIZREDTRAMPOLINE5",
|
||||
|
||||
// Horizontal Blue Trampoline
|
||||
"S_HORIZBLUETRAMPOLINE",
|
||||
"S_HORIZBLUETRAMPOLINE2",
|
||||
"S_HORIZBLUETRAMPOLINE3",
|
||||
"S_HORIZBLUETRAMPOLINE4",
|
||||
"S_HORIZBLUETRAMPOLINE5",
|
||||
|
||||
// Diagonal Yellow Trampoline
|
||||
"S_DIAGYELLOWTRAMPOLINE",
|
||||
"S_DIAGYELLOWTRAMPOLINE2",
|
||||
"S_DIAGYELLOWTRAMPOLINE3",
|
||||
"S_DIAGYELLOWTRAMPOLINE4",
|
||||
"S_DIAGYELLOWTRAMPOLINE5",
|
||||
|
||||
// Diagonal Red Trampoline
|
||||
"S_DIAGREDTRAMPOLINE",
|
||||
"S_DIAGREDTRAMPOLINE2",
|
||||
"S_DIAGREDTRAMPOLINE3",
|
||||
"S_DIAGREDTRAMPOLINE4",
|
||||
"S_DIAGREDTRAMPOLINE5",
|
||||
|
||||
// Diagonal Blue Trampoline
|
||||
"S_DIAGBLUETRAMPOLINE",
|
||||
"S_DIAGBLUETRAMPOLINE2",
|
||||
"S_DIAGBLUETRAMPOLINE3",
|
||||
"S_DIAGBLUETRAMPOLINE4",
|
||||
"S_DIAGBLUETRAMPOLINE5",
|
||||
|
||||
// Booster
|
||||
"S_BOOSTERSOUND",
|
||||
"S_YELLOWBOOSTERROLLER",
|
||||
|
@ -3255,28 +3191,37 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
|
||||
"S_RINGEXPLODE",
|
||||
|
||||
// Mario-specific stuff
|
||||
"S_COIN",
|
||||
"S_COIN1",
|
||||
"S_COIN2",
|
||||
"S_COIN3",
|
||||
"S_COINSPARKLE1",
|
||||
"S_COINSPARKLE2",
|
||||
"S_COINSPARKLE3",
|
||||
"S_COINSPARKLE4",
|
||||
"S_GOOMBA1",
|
||||
"S_GOOMBA1B",
|
||||
"S_GOOMBA2",
|
||||
"S_GOOMBA3",
|
||||
"S_GOOMBA4",
|
||||
"S_GOOMBA5",
|
||||
"S_GOOMBA6",
|
||||
"S_GOOMBA7",
|
||||
"S_GOOMBA8",
|
||||
"S_GOOMBA9",
|
||||
"S_GOOMBA_DEAD",
|
||||
"S_GOOMBA_DEAD2",
|
||||
"S_GOOMBA_DEAD3",
|
||||
"S_BLUEGOOMBA1",
|
||||
"S_BLUEGOOMBA1B",
|
||||
"S_BLUEGOOMBA2",
|
||||
"S_BLUEGOOMBA3",
|
||||
"S_BLUEGOOMBA4",
|
||||
"S_BLUEGOOMBA5",
|
||||
"S_BLUEGOOMBA6",
|
||||
"S_BLUEGOOMBA7",
|
||||
"S_BLUEGOOMBA8",
|
||||
"S_BLUEGOOMBA9",
|
||||
"S_BLUEGOOMBA_DEAD",
|
||||
"S_BLUEGOOMBA_DEAD2",
|
||||
"S_BLUEGOOMBA_DEAD3",
|
||||
|
||||
// Mario-specific stuff
|
||||
"S_FIREFLOWER1",
|
||||
"S_FIREFLOWER2",
|
||||
"S_FIREFLOWER3",
|
||||
|
@ -3284,13 +3229,6 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_FIREBALL",
|
||||
"S_FIREBALLTRAIL1",
|
||||
"S_FIREBALLTRAIL2",
|
||||
"S_GREENKOOPASPAWN",
|
||||
"S_GREENKOOPA1",
|
||||
"S_GREENKOOPA2",
|
||||
"S_GREENKOOPA3",
|
||||
"S_GREENKOOPA4",
|
||||
"S_GREENKOOPADEATH1",
|
||||
"S_GREENKOOPADEATH2",
|
||||
"S_SHELL",
|
||||
"S_PUMA_START1",
|
||||
"S_PUMA_START2",
|
||||
|
@ -3316,68 +3254,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_MARIOBUSH1",
|
||||
"S_MARIOBUSH2",
|
||||
"S_TOAD",
|
||||
"S_PTZSHROOM",
|
||||
"S_PTZFLAG1",
|
||||
"S_PTZFLAG2",
|
||||
"S_PTZFLAG3",
|
||||
"S_PTZFLAG4",
|
||||
"S_PTZFLAG5",
|
||||
"S_MARIOBUSH",
|
||||
"S_BSBSHROOM",
|
||||
"S_BLBSHROOM",
|
||||
"S_BNWSHROOM",
|
||||
"S_REDMFLOWER",
|
||||
"S_BLUEMFLOWER",
|
||||
"S_YELLOWMFLOWER",
|
||||
"S_WHITEDANDELION",
|
||||
"S_MAR64TREE",
|
||||
|
||||
// Power up mushrooms
|
||||
"S_LIFESHROOM",
|
||||
"S_LIFESHROOM2",
|
||||
"S_LIFESHROOMD",
|
||||
"S_LIFESHROOM_INVISIBLE",
|
||||
"S_LIFESHROOM_INVISIBLE_TOUCH",
|
||||
|
||||
"S_POISONSHROOM",
|
||||
"S_POISONSHROOM2",
|
||||
"S_POISONSHROOMD",
|
||||
|
||||
"S_NUKESHROOM",
|
||||
"S_NUKESHROOM2",
|
||||
"S_NUKESHROOMD",
|
||||
|
||||
"S_FORCESHROOM",
|
||||
"S_FORCESHROOM2",
|
||||
"S_FORCESHROOMD",
|
||||
|
||||
"S_ATTRACTSHROOM",
|
||||
"S_ATTRACTSHROOM2",
|
||||
"S_ATTRACTSHROOMD",
|
||||
|
||||
"S_ELEMENTALSHROOM",
|
||||
"S_ELEMENTALSHROOM2",
|
||||
"S_ELEMENTALSHROOMD",
|
||||
|
||||
"S_CLOUDSHROOM",
|
||||
"S_CLOUDSHROOM2",
|
||||
"S_CLOUDSHROOMD",
|
||||
|
||||
"S_STARMAN",
|
||||
"S_STARMAN1",
|
||||
"S_STARMAN2",
|
||||
"S_STARMAN3",
|
||||
"S_STARMAND",
|
||||
|
||||
"S_SPEEDWINGS",
|
||||
"S_SPEEDWINGSD",
|
||||
|
||||
"S_PARTICLEPICKUP1",
|
||||
"S_PARTICLEPICKUP2",
|
||||
"S_1000SCOREAWARD",
|
||||
"S_POWERUPAWARD",
|
||||
"S_POWERUPAWARD1",
|
||||
"S_POWERUPAWARD2",
|
||||
|
||||
// Nights-specific stuff
|
||||
"S_NIGHTSDRONE_MAN1",
|
||||
|
@ -3680,11 +3557,6 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_REDBRICKDEBRIS",
|
||||
"S_BLUEBRICKDEBRIS",
|
||||
"S_YELLOWBRICKDEBRIS",
|
||||
"S_MARIOBRICKDEBRIS",
|
||||
"S_MARIOBRICKDEBRISS",
|
||||
"S_MARIOBRICKDEBRISB",
|
||||
"S_MARIOBRICKDEBRISC",
|
||||
"S_MARIOBRICKDEBRISM",
|
||||
|
||||
"S_NAMECHECK",
|
||||
|
||||
|
@ -3867,16 +3739,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
|||
"MT_REDHORIZ",
|
||||
"MT_BLUEHORIZ",
|
||||
|
||||
"MT_YELLOWTRAMPOLINE",
|
||||
"MT_REDTRAMPOLINE",
|
||||
"MT_BLUETRAMPOLINE",
|
||||
"MT_HORIZYELLOWTRAMPOLINE",
|
||||
"MT_HORIZREDTRAMPOLINE",
|
||||
"MT_HORIZBLUETRAMPOLINE",
|
||||
"MT_DIAGYELLOWTRAMPOLINE",
|
||||
"MT_DIAGREDTRAMPOLINE",
|
||||
"MT_DIAGBLUETRAMPOLINE",
|
||||
|
||||
"MT_BOOSTERSEG",
|
||||
"MT_BOOSTERROLLER",
|
||||
"MT_YELLOWBOOSTER",
|
||||
|
@ -4377,7 +4239,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
|||
"MT_FIREFLOWER",
|
||||
"MT_FIREBALL",
|
||||
"MT_FIREBALLTRAIL",
|
||||
"MT_GREENKOOPA",
|
||||
"MT_SHELL",
|
||||
"MT_PUMA",
|
||||
"MT_PUMATRAIL",
|
||||
|
@ -4388,30 +4249,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
|||
"MT_MARIOBUSH1",
|
||||
"MT_MARIOBUSH2",
|
||||
"MT_TOAD",
|
||||
"MT_PTZSHROOM",
|
||||
"MT_PTZFLAG",
|
||||
"MT_BSBSHROOM",
|
||||
"MT_BLBSHROOM",
|
||||
"MT_BNWSHROOM",
|
||||
"MT_MARIOBUSH",
|
||||
"MT_REDMFLOWER",
|
||||
"MT_BLUEMFLOWER",
|
||||
"MT_YELLOWMFLOWER",
|
||||
"MT_WHITEDANDELION",
|
||||
"MT_MAR64TREE",
|
||||
|
||||
// Power up mushrooms
|
||||
"MT_LIFESHROOM",
|
||||
"MT_LIFESHROOM_INVISIBLE",
|
||||
"MT_POISONSHROOM",
|
||||
"MT_NUKESHROOM",
|
||||
"MT_FORCESHROOM",
|
||||
"MT_ATTRACTSHROOM",
|
||||
"MT_ELEMENTALSHROOM",
|
||||
"MT_CLOUDSHROOM",
|
||||
"MT_STARMAN",
|
||||
"MT_SPEEDWINGS",
|
||||
"MT_POWERUPAWARD",
|
||||
|
||||
// NiGHTS Stuff
|
||||
"MT_AXIS",
|
||||
|
@ -4509,11 +4346,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
|||
"MT_REDBRICKDEBRIS",
|
||||
"MT_BLUEBRICKDEBRIS",
|
||||
"MT_YELLOWBRICKDEBRIS",
|
||||
"MT_MARIOBRICKDEBRIS",
|
||||
"MT_MARIOBRICKDEBRISS",
|
||||
"MT_MARIOBRICKDEBRISB",
|
||||
"MT_MARIOBRICKDEBRISC",
|
||||
"MT_MARIOBRICKDEBRISM",
|
||||
|
||||
"MT_NAMECHECK",
|
||||
"MT_RAY",
|
||||
|
@ -5426,6 +5258,7 @@ struct int_const_s const INT_CONST[] = {
|
|||
{"SF_MARIODAMAGE",SF_MARIODAMAGE},
|
||||
{"SF_MACHINE",SF_MACHINE},
|
||||
{"SF_DASHMODE",SF_DASHMODE},
|
||||
{"SF_FASTWAIT",SF_FASTWAIT},
|
||||
{"SF_FASTEDGE",SF_FASTEDGE},
|
||||
{"SF_MULTIABILITY",SF_MULTIABILITY},
|
||||
{"SF_NONIGHTSROTATION",SF_NONIGHTSROTATION},
|
||||
|
@ -5774,8 +5607,7 @@ struct int_const_s const INT_CONST[] = {
|
|||
{"ROTAXIS_Z",ROTAXIS_Z},
|
||||
|
||||
// Buttons (ticcmd_t)
|
||||
{"BT_WEAPONMASK",BT_WEAPONMASK}, //our first three bits.
|
||||
{"BT_SHIELD",BT_SHIELD},
|
||||
{"BT_WEAPONMASK",BT_WEAPONMASK}, //our first four bits.
|
||||
{"BT_WEAPONNEXT",BT_WEAPONNEXT},
|
||||
{"BT_WEAPONPREV",BT_WEAPONPREV},
|
||||
{"BT_ATTACK",BT_ATTACK}, // shoot rings
|
||||
|
@ -5934,7 +5766,6 @@ struct int_const_s const INT_CONST[] = {
|
|||
{"JA_DIGITAL",JA_DIGITAL},
|
||||
{"JA_JUMP",JA_JUMP},
|
||||
{"JA_SPIN",JA_SPIN},
|
||||
{"JA_SHIELD",JA_SHIELD},
|
||||
{"JA_FIRE",JA_FIRE},
|
||||
{"JA_FIRENORMAL",JA_FIRENORMAL},
|
||||
{"JOYAXISRANGE",JOYAXISRANGE},
|
||||
|
@ -5956,7 +5787,9 @@ struct int_const_s const INT_CONST[] = {
|
|||
{"GC_WEPSLOT5",GC_WEPSLOT5},
|
||||
{"GC_WEPSLOT6",GC_WEPSLOT6},
|
||||
{"GC_WEPSLOT7",GC_WEPSLOT7},
|
||||
{"GC_SHIELD",GC_SHIELD},
|
||||
{"GC_WEPSLOT8",GC_WEPSLOT8},
|
||||
{"GC_WEPSLOT9",GC_WEPSLOT9},
|
||||
{"GC_WEPSLOT10",GC_WEPSLOT10},
|
||||
{"GC_FIRE",GC_FIRE},
|
||||
{"GC_FIRENORMAL",GC_FIRENORMAL},
|
||||
{"GC_TOSSFLAG",GC_TOSSFLAG},
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2024 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2025 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -209,19 +209,19 @@ typedef struct
|
|||
UINT8 picmode; // sequence mode after displaying last pic, 0 = persist, 1 = loop, 2 = destroy
|
||||
UINT8 pictoloop; // if picmode == loop, which pic to loop to?
|
||||
UINT8 pictostart; // initial pic number to show
|
||||
char picname[MAX_PROMPT_PICS][8];
|
||||
char picname[MAX_PROMPT_PICS][8+1];
|
||||
UINT8 pichires[MAX_PROMPT_PICS];
|
||||
UINT16 xcoord[MAX_PROMPT_PICS]; // gfx
|
||||
UINT16 ycoord[MAX_PROMPT_PICS]; // gfx
|
||||
UINT16 picduration[MAX_PROMPT_PICS];
|
||||
|
||||
char musswitch[7];
|
||||
char musswitch[6+1];
|
||||
UINT16 musswitchflags;
|
||||
UINT8 musicloop;
|
||||
|
||||
char tag[33]; // page tag
|
||||
char name[34]; // narrator name, extra char for color
|
||||
char iconname[8]; // narrator icon lump
|
||||
char tag[32+1]; // page tag
|
||||
char name[32+2]; // narrator name, extra char for color
|
||||
char iconname[8+1]; // narrator icon lump
|
||||
boolean rightside; // narrator side, false = left, true = right
|
||||
boolean iconflip; // narrator flip icon horizontally
|
||||
UINT8 hidehud; // hide hud, 0 = show all, 1 = hide depending on prompt position (top/bottom), 2 = hide all
|
||||
|
@ -233,7 +233,7 @@ typedef struct
|
|||
sfxenum_t textsfx; // sfx_ id for printing text
|
||||
UINT8 nextprompt; // next prompt to jump to, one-based. 0 = current prompt
|
||||
UINT8 nextpage; // next page to jump to, one-based. 0 = next page within prompt->numpages
|
||||
char nexttag[33]; // next tag to jump to. If set, this overrides nextprompt and nextpage.
|
||||
char nexttag[32+1]; // next tag to jump to. If set, this overrides nextprompt and nextpage.
|
||||
INT32 timetonext; // time in tics to jump to next page automatically. 0 = don't jump automatically
|
||||
char *text;
|
||||
} textpage_t;
|
||||
|
@ -287,8 +287,8 @@ typedef struct
|
|||
// (This is not ifdeffed so the map header structure can stay identical, just in case.)
|
||||
typedef struct
|
||||
{
|
||||
char option[32]; // 31 usable characters
|
||||
char value[256]; // 255 usable characters. If this seriously isn't enough then wtf.
|
||||
char option[31+1]; // 31 usable characters
|
||||
char value[255+1]; // 255 usable characters. If this seriously isn't enough then wtf.
|
||||
} customoption_t;
|
||||
|
||||
/** Map header information.
|
||||
|
@ -303,7 +303,7 @@ typedef struct
|
|||
INT16 nextlevel; ///< Map number of next level, or 1100-1102 to end.
|
||||
INT16 marathonnext; ///< See nextlevel, but for Marathon mode. Necessary to support hub worlds ala SUGOI.
|
||||
char keywords[32+1]; ///< Keywords separated by space to search for. 32 characters.
|
||||
char musname[7]; ///< Music track to play. "" for no music.
|
||||
char musname[6+1]; ///< Music track to play. "" for no music.
|
||||
UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore.
|
||||
UINT32 muspos; ///< Music position to jump to.
|
||||
char forcecharacter[16+1]; ///< (SKINNAMESIZE+1) Skin to switch to or "" to disable.
|
||||
|
@ -330,7 +330,7 @@ typedef struct
|
|||
UINT16 levelflags; ///< LF_flags: merged booleans into one UINT16 for space, see below
|
||||
UINT8 menuflags; ///< LF2_flags: options that affect record attack / nights mode menus
|
||||
|
||||
char selectheading[22]; ///< Level select heading. Allows for controllable grouping.
|
||||
char selectheading[21+1]; ///< Level select heading. Allows for controllable grouping.
|
||||
UINT16 startrings; ///< Number of rings players start with.
|
||||
INT32 sstimer; ///< Timer for special stages.
|
||||
UINT32 ssspheres; ///< Sphere requirement in special stages.
|
||||
|
@ -352,9 +352,9 @@ typedef struct
|
|||
|
||||
// Music stuff.
|
||||
UINT32 musinterfadeout; ///< Fade out level music on intermission screen in milliseconds
|
||||
char musintername[7]; ///< Intermission screen music.
|
||||
char musintername[6+1]; ///< Intermission screen music.
|
||||
|
||||
char muspostbossname[7]; ///< Post-bossdeath music.
|
||||
char muspostbossname[6+1]; ///< Post-bossdeath music.
|
||||
UINT16 muspostbosstrack; ///< Post-bossdeath track.
|
||||
UINT32 muspostbosspos; ///< Post-bossdeath position
|
||||
UINT32 muspostbossfadein; ///< Post-bossdeath fade-in milliseconds.
|
||||
|
|
|
@ -1121,11 +1121,11 @@ static const char *credits[] = {
|
|||
"Alice \"Alacroix\" de Lemos",
|
||||
"Logan \"Hyperchaotix\" McCloud",
|
||||
"Alexander \"DrTapeworm\" Moench-Ford",
|
||||
"\"orbitalviolet\"", // summit showdown hehehehe (aka Evertone)
|
||||
"Andrew \"Senku Niola\" Moran",
|
||||
"\"MotorRoach\"",
|
||||
"Phillip \"TelosTurntable\" Robinson",
|
||||
"\"Scizor300\"",
|
||||
"\"Skydusk\"",
|
||||
"Wessel \"sphere\" Smit",
|
||||
"David \"Instant Sonic\" Spencer Jr.",
|
||||
"\"SSNTails\"",
|
||||
|
@ -1173,11 +1173,9 @@ static const char *credits[] = {
|
|||
"Mujamel \"MK\" Khan",
|
||||
"\"Kaito Sinclaire\"",
|
||||
"Alexander \"DrTapeworm\" Moench-Ford",
|
||||
"\"orbitalviolet\"", // summit showdown hehehehe (aka Evertone)
|
||||
"\"Radicalicious\"",
|
||||
"\"Revan\"",
|
||||
"Anna \"QueenDelta\" Sandlin",
|
||||
"\"Skydusk\"",
|
||||
"Wessel \"sphere\" Smit",
|
||||
"\"SSNTails\"",
|
||||
"Aaron \"Othius\" Stojkov",
|
||||
|
|
|
@ -100,7 +100,7 @@ demoghost *ghosts = NULL;
|
|||
// DEMO RECORDING
|
||||
//
|
||||
|
||||
#define DEMOVERSION 0x0012
|
||||
#define DEMOVERSION 0x0011
|
||||
#define DEMOHEADER "\xF0" "SRB2Replay" "\x0F"
|
||||
|
||||
#define DF_GHOST 0x01 // This demo contains ghost data too!
|
||||
|
@ -185,11 +185,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
|||
if (ziptic & ZT_ANGLE)
|
||||
oldcmd.angleturn = READINT16(demo_p);
|
||||
if (ziptic & ZT_BUTTONS)
|
||||
{
|
||||
oldcmd.buttons = (oldcmd.buttons & (BT_CAMLEFT|BT_CAMRIGHT)) | (READUINT16(demo_p) & ~(BT_CAMLEFT|BT_CAMRIGHT));
|
||||
if (demoversion < 0x0012 && oldcmd.buttons & BT_SPIN)
|
||||
oldcmd.buttons |= BT_SHIELD; // Copy BT_SPIN to BT_SHIELD for pre-Shield-button demos
|
||||
}
|
||||
if (ziptic & ZT_AIMING)
|
||||
oldcmd.aiming = READINT16(demo_p);
|
||||
if (ziptic & ZT_LATENCY)
|
||||
|
|
61
src/g_game.c
61
src/g_game.c
|
@ -401,29 +401,27 @@ consvar_t cv_cam_lockonboss[2] = {
|
|||
CVAR_INIT ("cam2_lockaimassist", "Full", CV_SAVE|CV_ALLOWLUA, lockedassist_cons_t, NULL),
|
||||
};
|
||||
|
||||
consvar_t cv_moveaxis = CVAR_INIT ("joyaxis_move", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_sideaxis = CVAR_INIT ("joyaxis_side", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_lookaxis = CVAR_INIT ("joyaxis_look", "X-Rudder-", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_turnaxis = CVAR_INIT ("joyaxis_turn", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_jumpaxis = CVAR_INIT ("joyaxis_jump", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_spinaxis = CVAR_INIT ("joyaxis_spin", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_shieldaxis = CVAR_INIT ("joyaxis_shield", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_fireaxis = CVAR_INIT ("joyaxis_fire", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_firenaxis = CVAR_INIT ("joyaxis_firenormal", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_deadzone = CVAR_INIT ("joy_deadzone", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
|
||||
consvar_t cv_digitaldeadzone = CVAR_INIT ("joy_digdeadzone", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
|
||||
consvar_t cv_moveaxis = CVAR_INIT ("joyaxis_move", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_sideaxis = CVAR_INIT ("joyaxis_side", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_lookaxis = CVAR_INIT ("joyaxis_look", "X-Rudder-", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_turnaxis = CVAR_INIT ("joyaxis_turn", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_jumpaxis = CVAR_INIT ("joyaxis_jump", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_spinaxis = CVAR_INIT ("joyaxis_spin", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_fireaxis = CVAR_INIT ("joyaxis_fire", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_firenaxis = CVAR_INIT ("joyaxis_firenormal", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_deadzone = CVAR_INIT ("joy_deadzone", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
|
||||
consvar_t cv_digitaldeadzone = CVAR_INIT ("joy_digdeadzone", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
|
||||
|
||||
consvar_t cv_moveaxis2 = CVAR_INIT ("joyaxis2_move", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_sideaxis2 = CVAR_INIT ("joyaxis2_side", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_lookaxis2 = CVAR_INIT ("joyaxis2_look", "X-Rudder-", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_turnaxis2 = CVAR_INIT ("joyaxis2_turn", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_jumpaxis2 = CVAR_INIT ("joyaxis2_jump", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_spinaxis2 = CVAR_INIT ("joyaxis2_spin", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_shieldaxis2 = CVAR_INIT ("joyaxis2_shield", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_fireaxis2 = CVAR_INIT ("joyaxis2_fire", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_firenaxis2 = CVAR_INIT ("joyaxis2_firenormal", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_deadzone2 = CVAR_INIT ("joy_deadzone2", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
|
||||
consvar_t cv_digitaldeadzone2 = CVAR_INIT ("joy_digdeadzone2", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
|
||||
consvar_t cv_moveaxis2 = CVAR_INIT ("joyaxis2_move", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_sideaxis2 = CVAR_INIT ("joyaxis2_side", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_lookaxis2 = CVAR_INIT ("joyaxis2_look", "X-Rudder-", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_turnaxis2 = CVAR_INIT ("joyaxis2_turn", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_jumpaxis2 = CVAR_INIT ("joyaxis2_jump", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_spinaxis2 = CVAR_INIT ("joyaxis2_spin", "None", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_fireaxis2 = CVAR_INIT ("joyaxis2_fire", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_firenaxis2 = CVAR_INIT ("joyaxis2_firenormal", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
|
||||
consvar_t cv_deadzone2 = CVAR_INIT ("joy_deadzone2", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
|
||||
consvar_t cv_digitaldeadzone2 = CVAR_INIT ("joy_digdeadzone2", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
|
||||
|
||||
player_t *seenplayer; // player we're aiming at right now
|
||||
|
||||
|
@ -894,9 +892,6 @@ INT32 JoyAxis(joyaxis_e axissel)
|
|||
case JA_SPIN:
|
||||
axisval = cv_spinaxis.value;
|
||||
break;
|
||||
case JA_SHIELD:
|
||||
axisval = cv_shieldaxis.value;
|
||||
break;
|
||||
case JA_FIRE:
|
||||
axisval = cv_fireaxis.value;
|
||||
break;
|
||||
|
@ -970,9 +965,6 @@ INT32 Joy2Axis(joyaxis_e axissel)
|
|||
case JA_SPIN:
|
||||
axisval = cv_spinaxis2.value;
|
||||
break;
|
||||
case JA_SHIELD:
|
||||
axisval = cv_shieldaxis2.value;
|
||||
break;
|
||||
case JA_FIRE:
|
||||
axisval = cv_fireaxis2.value;
|
||||
break;
|
||||
|
@ -1340,10 +1332,10 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
|||
if (PLAYERINPUTDOWN(ssplayer, GC_WEAPONPREV))
|
||||
cmd->buttons |= BT_WEAPONPREV; // Previous Weapon
|
||||
|
||||
#if NUM_WEAPONS > 7
|
||||
"Add extra inputs to g_input.h/gamecontrols_e, and fix conflicts in d_ticcmd.h/ticcmd_t/buttons"
|
||||
#if NUM_WEAPONS > 10
|
||||
"Add extra inputs to g_input.h/gamecontrols_e"
|
||||
#endif
|
||||
//use the three avaliable bits to determine the weapon.
|
||||
//use the four avaliable bits to determine the weapon.
|
||||
cmd->buttons &= ~BT_WEAPONMASK;
|
||||
for (i = 0; i < NUM_WEAPONS; ++i)
|
||||
if (PLAYERINPUTDOWN(ssplayer, GC_WEPSLOT1 + i))
|
||||
|
@ -1362,15 +1354,9 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
|||
if (PLAYERINPUTDOWN(ssplayer, GC_FIRENORMAL) || (usejoystick && axis > 0))
|
||||
cmd->buttons |= BT_FIRENORMAL;
|
||||
|
||||
// Toss flag button
|
||||
if (PLAYERINPUTDOWN(ssplayer, GC_TOSSFLAG))
|
||||
cmd->buttons |= BT_TOSSFLAG;
|
||||
|
||||
// Shield button
|
||||
axis = PlayerJoyAxis(ssplayer, JA_SHIELD);
|
||||
if (PLAYERINPUTDOWN(ssplayer, GC_SHIELD) || (usejoystick && axis > 0))
|
||||
cmd->buttons |= BT_SHIELD;
|
||||
|
||||
// Lua scriptable buttons
|
||||
if (PLAYERINPUTDOWN(ssplayer, GC_CUSTOM1))
|
||||
cmd->buttons |= BT_CUSTOM1;
|
||||
|
@ -2777,7 +2763,6 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
|
|||
p->pflags |= PF_SPINDOWN;
|
||||
p->pflags |= PF_ATTACKDOWN;
|
||||
p->pflags |= PF_JUMPDOWN;
|
||||
p->pflags |= PF_SHIELDDOWN;
|
||||
|
||||
p->playerstate = PST_LIVE;
|
||||
p->panim = PA_IDLE; // standing animation
|
||||
|
|
|
@ -71,8 +71,8 @@ typedef enum {
|
|||
#define P_ControlStyle(player) ((((player)->pflags & PF_ANALOGMODE) ? CS_LMAOGALOG : 0) | (((player)->pflags & PF_DIRECTIONCHAR) ? CS_STANDARD : 0))
|
||||
|
||||
extern consvar_t cv_autobrake, cv_autobrake2;
|
||||
extern consvar_t cv_sideaxis, cv_turnaxis, cv_moveaxis, cv_lookaxis, cv_jumpaxis, cv_spinaxis, cv_shieldaxis, cv_fireaxis, cv_firenaxis, cv_deadzone, cv_digitaldeadzone;
|
||||
extern consvar_t cv_sideaxis2,cv_turnaxis2,cv_moveaxis2,cv_lookaxis2,cv_jumpaxis2,cv_spinaxis2,cv_shieldaxis2,cv_fireaxis2,cv_firenaxis2,cv_deadzone2,cv_digitaldeadzone2;
|
||||
extern consvar_t cv_sideaxis,cv_turnaxis,cv_moveaxis,cv_lookaxis,cv_jumpaxis,cv_spinaxis,cv_fireaxis,cv_firenaxis,cv_deadzone,cv_digitaldeadzone;
|
||||
extern consvar_t cv_sideaxis2,cv_turnaxis2,cv_moveaxis2,cv_lookaxis2,cv_jumpaxis2,cv_spinaxis2,cv_fireaxis2,cv_firenaxis2,cv_deadzone2,cv_digitaldeadzone2;
|
||||
extern consvar_t cv_ghost_bestscore, cv_ghost_besttime, cv_ghost_bestrings, cv_ghost_last, cv_ghost_guest;
|
||||
|
||||
// hi here's some new controls
|
||||
|
@ -100,7 +100,6 @@ typedef enum
|
|||
|
||||
JA_JUMP = JA_DIGITAL,
|
||||
JA_SPIN,
|
||||
JA_SHIELD,
|
||||
JA_FIRE,
|
||||
JA_FIRENORMAL,
|
||||
} joyaxis_e;
|
||||
|
|
|
@ -576,7 +576,9 @@ static const char *gamecontrolname[NUM_GAMECONTROLS] =
|
|||
"weapon5",
|
||||
"weapon6",
|
||||
"weapon7",
|
||||
"shield",
|
||||
"weapon8",
|
||||
"weapon9",
|
||||
"weapon10",
|
||||
"fire",
|
||||
"firenormal",
|
||||
"tossflag",
|
||||
|
@ -691,7 +693,6 @@ void G_DefineDefaultControls(void)
|
|||
gamecontroldefault[gcs_fps][GC_CENTERVIEW ][0] = KEY_LCTRL;
|
||||
gamecontroldefault[gcs_fps][GC_JUMP ][0] = KEY_SPACE;
|
||||
gamecontroldefault[gcs_fps][GC_SPIN ][0] = KEY_LSHIFT;
|
||||
gamecontroldefault[gcs_fps][GC_SHIELD ][0] = KEY_LALT;
|
||||
gamecontroldefault[gcs_fps][GC_FIRE ][0] = KEY_RCTRL;
|
||||
gamecontroldefault[gcs_fps][GC_FIRE ][1] = KEY_MOUSE1+0;
|
||||
gamecontroldefault[gcs_fps][GC_FIRENORMAL ][0] = KEY_RALT;
|
||||
|
@ -712,7 +713,6 @@ void G_DefineDefaultControls(void)
|
|||
gamecontroldefault[gcs_platform][GC_CENTERVIEW ][0] = KEY_END;
|
||||
gamecontroldefault[gcs_platform][GC_JUMP ][0] = KEY_SPACE;
|
||||
gamecontroldefault[gcs_platform][GC_SPIN ][0] = KEY_LSHIFT;
|
||||
gamecontroldefault[gcs_platform][GC_SHIELD ][0] = KEY_LALT;
|
||||
gamecontroldefault[gcs_platform][GC_FIRE ][0] = 's';
|
||||
gamecontroldefault[gcs_platform][GC_FIRE ][1] = KEY_MOUSE1+0;
|
||||
gamecontroldefault[gcs_platform][GC_FIRENORMAL ][0] = 'w';
|
||||
|
@ -728,6 +728,9 @@ void G_DefineDefaultControls(void)
|
|||
gamecontroldefault[i][GC_WEPSLOT5 ][0] = '5';
|
||||
gamecontroldefault[i][GC_WEPSLOT6 ][0] = '6';
|
||||
gamecontroldefault[i][GC_WEPSLOT7 ][0] = '7';
|
||||
gamecontroldefault[i][GC_WEPSLOT8 ][0] = '8';
|
||||
gamecontroldefault[i][GC_WEPSLOT9 ][0] = '9';
|
||||
gamecontroldefault[i][GC_WEPSLOT10 ][0] = '0';
|
||||
gamecontroldefault[i][GC_TOSSFLAG ][0] = '\'';
|
||||
gamecontroldefault[i][GC_CAMTOGGLE ][0] = 'v';
|
||||
gamecontroldefault[i][GC_CAMRESET ][0] = 'r';
|
||||
|
@ -743,34 +746,34 @@ void G_DefineDefaultControls(void)
|
|||
// Gamepad controls -- same for both schemes
|
||||
gamecontroldefault[i][GC_JUMP ][1] = KEY_JOY1+0; // A
|
||||
gamecontroldefault[i][GC_SPIN ][1] = KEY_JOY1+2; // X
|
||||
gamecontroldefault[i][GC_SHIELD ][1] = KEY_JOY1+1; // B
|
||||
gamecontroldefault[i][GC_CUSTOM1 ][1] = KEY_JOY1+3; // Y
|
||||
gamecontroldefault[i][GC_CUSTOM2 ][1] = KEY_JOY1+4; // LB
|
||||
gamecontroldefault[i][GC_CENTERVIEW ][1] = KEY_JOY1+5; // RB
|
||||
gamecontroldefault[i][GC_CUSTOM1 ][1] = KEY_JOY1+1; // B
|
||||
gamecontroldefault[i][GC_CUSTOM2 ][1] = KEY_JOY1+3; // Y
|
||||
gamecontroldefault[i][GC_CUSTOM3 ][1] = KEY_JOY1+8; // Left Stick
|
||||
gamecontroldefault[i][GC_CAMTOGGLE ][1] = KEY_JOY1+9; // Right Stick
|
||||
gamecontroldefault[i][GC_SCORES ][1] = KEY_JOY1+6; // Back
|
||||
gamecontroldefault[i][GC_CAMTOGGLE ][1] = KEY_JOY1+4; // LB
|
||||
gamecontroldefault[i][GC_CENTERVIEW ][1] = KEY_JOY1+5; // RB
|
||||
gamecontroldefault[i][GC_SCREENSHOT ][1] = KEY_JOY1+6; // Back
|
||||
gamecontroldefault[i][GC_SYSTEMMENU ][0] = KEY_JOY1+7; // Start
|
||||
gamecontroldefault[i][GC_VIEWPOINTNEXT][1] = KEY_HAT1+0; // D-Pad Up
|
||||
gamecontroldefault[i][GC_TOSSFLAG ][1] = KEY_HAT1+1; // D-Pad Down
|
||||
gamecontroldefault[i][GC_WEAPONPREV ][1] = KEY_HAT1+2; // D-Pad Left
|
||||
gamecontroldefault[i][GC_WEAPONNEXT ][1] = KEY_HAT1+3; // D-Pad Right
|
||||
gamecontroldefault[i][GC_VIEWPOINTNEXT][1] = KEY_JOY1+9; // Right Stick
|
||||
gamecontroldefault[i][GC_TOSSFLAG ][1] = KEY_HAT1+0; // D-Pad Up
|
||||
gamecontroldefault[i][GC_SCORES ][1] = KEY_HAT1+1; // D-Pad Down
|
||||
|
||||
// Second player controls only have joypad defaults
|
||||
gamecontrolbisdefault[i][GC_JUMP ][1] = KEY_2JOY1+0; // A
|
||||
gamecontrolbisdefault[i][GC_SPIN ][1] = KEY_2JOY1+2; // X
|
||||
gamecontrolbisdefault[i][GC_SHIELD ][1] = KEY_2JOY1+1; // B
|
||||
gamecontrolbisdefault[i][GC_CUSTOM1 ][1] = KEY_2JOY1+3; // Y
|
||||
gamecontrolbisdefault[i][GC_CUSTOM2 ][1] = KEY_2JOY1+4; // LB
|
||||
gamecontrolbisdefault[i][GC_CENTERVIEW ][1] = KEY_2JOY1+5; // RB
|
||||
gamecontrolbisdefault[i][GC_CUSTOM1 ][1] = KEY_2JOY1+1; // B
|
||||
gamecontrolbisdefault[i][GC_CUSTOM2 ][1] = KEY_2JOY1+3; // Y
|
||||
gamecontrolbisdefault[i][GC_CUSTOM3 ][1] = KEY_2JOY1+8; // Left Stick
|
||||
gamecontrolbisdefault[i][GC_CAMTOGGLE ][1] = KEY_2JOY1+9; // Right Stick
|
||||
//gamecontrolbisdefault[i][GC_SCORES ][1] = KEY_2JOY1+6; // Back
|
||||
gamecontrolbisdefault[i][GC_CAMTOGGLE ][1] = KEY_2JOY1+4; // LB
|
||||
gamecontrolbisdefault[i][GC_CENTERVIEW ][1] = KEY_2JOY1+5; // RB
|
||||
gamecontrolbisdefault[i][GC_SCREENSHOT ][1] = KEY_2JOY1+6; // Back
|
||||
//gamecontrolbisdefault[i][GC_SYSTEMMENU ][0] = KEY_2JOY1+7; // Start
|
||||
gamecontrolbisdefault[i][GC_VIEWPOINTNEXT][1] = KEY_2HAT1+0; // D-Pad Up
|
||||
gamecontrolbisdefault[i][GC_TOSSFLAG ][1] = KEY_2HAT1+1; // D-Pad Down
|
||||
gamecontrolbisdefault[i][GC_WEAPONPREV ][1] = KEY_2HAT1+2; // D-Pad Left
|
||||
gamecontrolbisdefault[i][GC_WEAPONNEXT ][1] = KEY_2HAT1+3; // D-Pad Right
|
||||
gamecontrolbisdefault[i][GC_VIEWPOINTNEXT][1] = KEY_2JOY1+9; // Right Stick
|
||||
gamecontrolbisdefault[i][GC_TOSSFLAG ][1] = KEY_2HAT1+0; // D-Pad Up
|
||||
//gamecontrolbisdefault[i][GC_SCORES ][1] = KEY_2HAT1+1; // D-Pad Down
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -74,7 +74,9 @@ typedef enum
|
|||
GC_WEPSLOT5,
|
||||
GC_WEPSLOT6,
|
||||
GC_WEPSLOT7,
|
||||
GC_SHIELD,
|
||||
GC_WEPSLOT8,
|
||||
GC_WEPSLOT9,
|
||||
GC_WEPSLOT10,
|
||||
GC_FIRE,
|
||||
GC_FIRENORMAL,
|
||||
GC_TOSSFLAG,
|
||||
|
|
|
@ -485,15 +485,6 @@ light_t *t_lspr[NUMSPRITES] =
|
|||
&lspr[NOLIGHT], // SPR_SSWY
|
||||
&lspr[NOLIGHT], // SPR_SSWR
|
||||
&lspr[NOLIGHT], // SPR_SSWB
|
||||
&lspr[NOLIGHT], // SPR_MPRY
|
||||
&lspr[NOLIGHT], // SPR_MPRR
|
||||
&lspr[NOLIGHT], // SPR_MPRB
|
||||
&lspr[NOLIGHT], // SPR_MSWY
|
||||
&lspr[NOLIGHT], // SPR_MSWR
|
||||
&lspr[NOLIGHT], // SPR_MSWB
|
||||
&lspr[NOLIGHT], // SPR_MDIY
|
||||
&lspr[NOLIGHT], // SPR_MDIR
|
||||
&lspr[NOLIGHT], // SPR_MDIB
|
||||
&lspr[NOLIGHT], // SPR_BSTY
|
||||
&lspr[NOLIGHT], // SPR_BSTR
|
||||
|
||||
|
@ -552,7 +543,6 @@ light_t *t_lspr[NUMSPRITES] =
|
|||
&lspr[NOLIGHT], // SPR_BGOM
|
||||
&lspr[REDBALL_L], // SPR_FFWR
|
||||
&lspr[SMALLREDBALL_L], // SPR_FBLL
|
||||
&lspr[NOLIGHT], // SPR_MKOP
|
||||
&lspr[NOLIGHT], // SPR_SHLL
|
||||
&lspr[REDBALL_L], // SPR_PUMA
|
||||
&lspr[NOLIGHT], // SPR_HAMM
|
||||
|
@ -623,22 +613,6 @@ light_t *t_lspr[NUMSPRITES] =
|
|||
&lspr[NOLIGHT], // SPR_BRIR
|
||||
&lspr[NOLIGHT], // SPR_BRIB
|
||||
&lspr[NOLIGHT], // SPR_BRIY
|
||||
&lspr[NOLIGHT], // SPR_MBRI
|
||||
&lspr[NOLIGHT], // SPR_MBRS
|
||||
&lspr[NOLIGHT], // SPR_MBRB
|
||||
&lspr[NOLIGHT], // SPR_MBRC
|
||||
&lspr[NOLIGHT], // SPR_MTRI
|
||||
&lspr[NOLIGHT], // SPR_MARS
|
||||
&lspr[NOLIGHT], // SPR_MRFL
|
||||
&lspr[NOLIGHT], // SPR_MAUH
|
||||
&lspr[NOLIGHT], // SPR_MBSA
|
||||
&lspr[NOLIGHT], // SPR_MBSB
|
||||
&lspr[NOLIGHT], // SPR_MBSC
|
||||
&lspr[NOLIGHT], // SPR_MFRE
|
||||
&lspr[NOLIGHT], // SPR_MFYE
|
||||
&lspr[NOLIGHT], // SPR_MFBE
|
||||
&lspr[NOLIGHT], // SPR_MFWD
|
||||
&lspr[NOLIGHT], // SPR_MUS3
|
||||
|
||||
// Gravity Well Objects
|
||||
&lspr[NOLIGHT], // SPR_GWLG
|
||||
|
|
1484
src/info.c
1484
src/info.c
File diff suppressed because it is too large
Load diff
256
src/info.h
256
src/info.h
|
@ -947,15 +947,6 @@ typedef enum sprite
|
|||
SPR_SSWY, // Yellow Side Spring
|
||||
SPR_SSWR, // Red Side Spring
|
||||
SPR_SSWB, // Blue Side Spring
|
||||
SPR_MPRY, // Yellow trampoline
|
||||
SPR_MPRR, // Red trampoline
|
||||
SPR_MPRB, // Blue trampoline
|
||||
SPR_MSWY, // Yellow horizontal trampoline
|
||||
SPR_MSWR, // Red horizontal trampoline
|
||||
SPR_MSWB, // Blue horizontal trampoline
|
||||
SPR_MDIY, // Yellow diagonal trampoline
|
||||
SPR_MDIR, // Red diagonal trampoline
|
||||
SPR_MDIB, // Blue diagonal trampoline
|
||||
SPR_BSTY, // Yellow Booster
|
||||
SPR_BSTR, // Red Booster
|
||||
|
||||
|
@ -1014,7 +1005,6 @@ typedef enum sprite
|
|||
SPR_BGOM,
|
||||
SPR_FFWR,
|
||||
SPR_FBLL,
|
||||
SPR_MKOP,
|
||||
SPR_SHLL,
|
||||
SPR_PUMA,
|
||||
SPR_HAMM,
|
||||
|
@ -1024,29 +1014,6 @@ typedef enum sprite
|
|||
SPR_MUS1,
|
||||
SPR_MUS2,
|
||||
SPR_TOAD,
|
||||
SPR_MARS,
|
||||
SPR_MRFL,
|
||||
SPR_MAUH,
|
||||
SPR_MBSA,
|
||||
SPR_MBSB,
|
||||
SPR_MBSC,
|
||||
SPR_MFRE,
|
||||
SPR_MFYE,
|
||||
SPR_MFBE,
|
||||
SPR_MFWD,
|
||||
SPR_MUS3,
|
||||
|
||||
// Mario powerups
|
||||
SPR_MSIV, // invincibility
|
||||
SPR_MS1P, // 1-up
|
||||
SPR_MSAT, // attract
|
||||
SPR_MSFO, // force
|
||||
SPR_MSAR, // nuke
|
||||
SPR_MSWW, // whirlwind
|
||||
SPR_MSEL, // elemental
|
||||
SPR_MSSP, // speed shoes
|
||||
SPR_MEGH, // poison
|
||||
SPR_UPPB, // particle pickup
|
||||
|
||||
// NiGHTS Stuff
|
||||
SPR_NDRN, // NiGHTS drone
|
||||
|
@ -1108,11 +1075,6 @@ typedef enum sprite
|
|||
SPR_BRIR, // CEZ3 colored bricks
|
||||
SPR_BRIB,
|
||||
SPR_BRIY,
|
||||
SPR_MBRI,
|
||||
SPR_MBRS,
|
||||
SPR_MBRB,
|
||||
SPR_MBRC,
|
||||
SPR_MTRI,
|
||||
|
||||
// Gravity Well Objects
|
||||
SPR_GWLG,
|
||||
|
@ -1194,6 +1156,18 @@ typedef enum playersprite
|
|||
SPR2_TALB,
|
||||
SPR2_TALC,
|
||||
|
||||
// Misc slots
|
||||
SPR2_MSC0,
|
||||
SPR2_MSC1,
|
||||
SPR2_MSC2,
|
||||
SPR2_MSC3,
|
||||
SPR2_MSC4,
|
||||
SPR2_MSC5,
|
||||
SPR2_MSC6,
|
||||
SPR2_MSC7,
|
||||
SPR2_MSC8,
|
||||
SPR2_MSC9,
|
||||
|
||||
SPR2_CNT1, // continue disappointment
|
||||
SPR2_CNT2, // continue lift
|
||||
SPR2_CNT3, // continue spin
|
||||
|
@ -1941,11 +1915,11 @@ typedef enum state
|
|||
S_FANG_FIRE1,
|
||||
S_FANG_FIRE2,
|
||||
S_FANG_FIRE3,
|
||||
S_FANG_FIRE4,
|
||||
S_FANG_FIREREPEAT,
|
||||
S_FANG_LOBSHOT0,
|
||||
S_FANG_LOBSHOT1,
|
||||
S_FANG_LOBSHOT2,
|
||||
S_FANG_LOBSHOT3,
|
||||
S_FANG_WAIT1,
|
||||
S_FANG_WAIT2,
|
||||
S_FANG_WALLHIT,
|
||||
|
@ -1967,6 +1941,7 @@ typedef enum state
|
|||
S_FANG_PINCHLOBSHOT2,
|
||||
S_FANG_PINCHLOBSHOT3,
|
||||
S_FANG_PINCHLOBSHOT4,
|
||||
S_FANG_PINCHLOBSHOT5,
|
||||
S_FANG_DIE1,
|
||||
S_FANG_DIE2,
|
||||
S_FANG_DIE3,
|
||||
|
@ -3116,11 +3091,9 @@ typedef enum state
|
|||
// FHZ
|
||||
S_FHZICE1,
|
||||
S_FHZICE2,
|
||||
S_ROSY_IDLE1,
|
||||
S_ROSY_IDLE2,
|
||||
S_ROSY_IDLE3,
|
||||
S_ROSY_IDLE4,
|
||||
S_ROSY_IDLE,
|
||||
S_ROSY_JUMP,
|
||||
S_ROSY_FALL,
|
||||
S_ROSY_WALK,
|
||||
S_ROSY_HUG,
|
||||
S_ROSY_PAIN,
|
||||
|
@ -3780,69 +3753,6 @@ typedef enum state
|
|||
S_BHORIZ7,
|
||||
S_BHORIZ8,
|
||||
|
||||
// Yellow Trampoline
|
||||
S_YELLOWTRAMPOLINE,
|
||||
S_YELLOWTRAMPOLINE2,
|
||||
S_YELLOWTRAMPOLINE3,
|
||||
S_YELLOWTRAMPOLINE4,
|
||||
S_YELLOWTRAMPOLINE5,
|
||||
|
||||
// Red Trampoline
|
||||
S_REDTRAMPOLINE,
|
||||
S_REDTRAMPOLINE2,
|
||||
S_REDTRAMPOLINE3,
|
||||
S_REDTRAMPOLINE4,
|
||||
S_REDTRAMPOLINE5,
|
||||
|
||||
// Blue Trampoline
|
||||
S_BLUETRAMPOLINE,
|
||||
S_BLUETRAMPOLINE2,
|
||||
S_BLUETRAMPOLINE3,
|
||||
S_BLUETRAMPOLINE4,
|
||||
S_BLUETRAMPOLINE5,
|
||||
|
||||
// Horizontal Yellow Trampoline
|
||||
S_HORIZYELLOWTRAMPOLINE,
|
||||
S_HORIZYELLOWTRAMPOLINE2,
|
||||
S_HORIZYELLOWTRAMPOLINE3,
|
||||
S_HORIZYELLOWTRAMPOLINE4,
|
||||
S_HORIZYELLOWTRAMPOLINE5,
|
||||
|
||||
// Horizontal Red Trampoline
|
||||
S_HORIZREDTRAMPOLINE,
|
||||
S_HORIZREDTRAMPOLINE2,
|
||||
S_HORIZREDTRAMPOLINE3,
|
||||
S_HORIZREDTRAMPOLINE4,
|
||||
S_HORIZREDTRAMPOLINE5,
|
||||
|
||||
// Horizontal Blue Trampoline
|
||||
S_HORIZBLUETRAMPOLINE,
|
||||
S_HORIZBLUETRAMPOLINE2,
|
||||
S_HORIZBLUETRAMPOLINE3,
|
||||
S_HORIZBLUETRAMPOLINE4,
|
||||
S_HORIZBLUETRAMPOLINE5,
|
||||
|
||||
// Diagonal Yellow Trampoline
|
||||
S_DIAGYELLOWTRAMPOLINE,
|
||||
S_DIAGYELLOWTRAMPOLINE2,
|
||||
S_DIAGYELLOWTRAMPOLINE3,
|
||||
S_DIAGYELLOWTRAMPOLINE4,
|
||||
S_DIAGYELLOWTRAMPOLINE5,
|
||||
|
||||
// Diagonal Red Trampoline
|
||||
S_DIAGREDTRAMPOLINE,
|
||||
S_DIAGREDTRAMPOLINE2,
|
||||
S_DIAGREDTRAMPOLINE3,
|
||||
S_DIAGREDTRAMPOLINE4,
|
||||
S_DIAGREDTRAMPOLINE5,
|
||||
|
||||
// Diagonal Blue Trampoline
|
||||
S_DIAGBLUETRAMPOLINE,
|
||||
S_DIAGBLUETRAMPOLINE2,
|
||||
S_DIAGBLUETRAMPOLINE3,
|
||||
S_DIAGBLUETRAMPOLINE4,
|
||||
S_DIAGBLUETRAMPOLINE5,
|
||||
|
||||
// Booster
|
||||
S_BOOSTERSOUND,
|
||||
S_YELLOWBOOSTERROLLER,
|
||||
|
@ -4115,28 +4025,37 @@ typedef enum state
|
|||
|
||||
S_RINGEXPLODE,
|
||||
|
||||
// Mario-specific stuff
|
||||
S_COIN,
|
||||
S_COIN1,
|
||||
S_COIN2,
|
||||
S_COIN3,
|
||||
S_COINSPARKLE1,
|
||||
S_COINSPARKLE2,
|
||||
S_COINSPARKLE3,
|
||||
S_COINSPARKLE4,
|
||||
S_GOOMBA1,
|
||||
S_GOOMBA1B,
|
||||
S_GOOMBA2,
|
||||
S_GOOMBA3,
|
||||
S_GOOMBA4,
|
||||
S_GOOMBA5,
|
||||
S_GOOMBA6,
|
||||
S_GOOMBA7,
|
||||
S_GOOMBA8,
|
||||
S_GOOMBA9,
|
||||
S_GOOMBA_DEAD,
|
||||
S_GOOMBA_DEAD2,
|
||||
S_GOOMBA_DEAD3,
|
||||
S_BLUEGOOMBA1,
|
||||
S_BLUEGOOMBA1B,
|
||||
S_BLUEGOOMBA2,
|
||||
S_BLUEGOOMBA3,
|
||||
S_BLUEGOOMBA4,
|
||||
S_BLUEGOOMBA5,
|
||||
S_BLUEGOOMBA6,
|
||||
S_BLUEGOOMBA7,
|
||||
S_BLUEGOOMBA8,
|
||||
S_BLUEGOOMBA9,
|
||||
S_BLUEGOOMBA_DEAD,
|
||||
S_BLUEGOOMBA_DEAD2,
|
||||
S_BLUEGOOMBA_DEAD3,
|
||||
|
||||
// Mario-specific stuff
|
||||
S_FIREFLOWER1,
|
||||
S_FIREFLOWER2,
|
||||
S_FIREFLOWER3,
|
||||
|
@ -4144,13 +4063,6 @@ typedef enum state
|
|||
S_FIREBALL,
|
||||
S_FIREBALLTRAIL1,
|
||||
S_FIREBALLTRAIL2,
|
||||
S_GREENKOOPASPAWN,
|
||||
S_GREENKOOPA1,
|
||||
S_GREENKOOPA2,
|
||||
S_GREENKOOPA3,
|
||||
S_GREENKOOPA4,
|
||||
S_GREENKOOPADEATH1,
|
||||
S_GREENKOOPADEATH2,
|
||||
S_SHELL,
|
||||
S_PUMA_START1,
|
||||
S_PUMA_START2,
|
||||
|
@ -4176,68 +4088,7 @@ typedef enum state
|
|||
S_MARIOBUSH1,
|
||||
S_MARIOBUSH2,
|
||||
S_TOAD,
|
||||
S_PTZSHROOM,
|
||||
S_PTZFLAG1,
|
||||
S_PTZFLAG2,
|
||||
S_PTZFLAG3,
|
||||
S_PTZFLAG4,
|
||||
S_PTZFLAG5,
|
||||
S_MARIOBUSH,
|
||||
S_BSBSHROOM,
|
||||
S_BLBSHROOM,
|
||||
S_BNWSHROOM,
|
||||
S_REDMFLOWER,
|
||||
S_BLUEMFLOWER,
|
||||
S_YELLOWMFLOWER,
|
||||
S_WHITEDANDELION,
|
||||
S_MAR64TREE,
|
||||
|
||||
// Power up mushrooms
|
||||
S_LIFESHROOM,
|
||||
S_LIFESHROOM2,
|
||||
S_LIFESHROOMD,
|
||||
S_LIFESHROOM_INVISIBLE,
|
||||
S_LIFESHROOM_INVISIBLE_TOUCH,
|
||||
|
||||
S_POISONSHROOM,
|
||||
S_POISONSHROOM2,
|
||||
S_POISONSHROOMD,
|
||||
|
||||
S_NUKESHROOM,
|
||||
S_NUKESHROOM2,
|
||||
S_NUKESHROOMD,
|
||||
|
||||
S_FORCESHROOM,
|
||||
S_FORCESHROOM2,
|
||||
S_FORCESHROOMD,
|
||||
|
||||
S_ATTRACTSHROOM,
|
||||
S_ATTRACTSHROOM2,
|
||||
S_ATTRACTSHROOMD,
|
||||
|
||||
S_ELEMENTALSHROOM,
|
||||
S_ELEMENTALSHROOM2,
|
||||
S_ELEMENTALSHROOMD,
|
||||
|
||||
S_CLOUDSHROOM,
|
||||
S_CLOUDSHROOM2,
|
||||
S_CLOUDSHROOMD,
|
||||
|
||||
S_STARMAN,
|
||||
S_STARMAN1,
|
||||
S_STARMAN2,
|
||||
S_STARMAN3,
|
||||
S_STARMAND,
|
||||
|
||||
S_SPEEDWINGS,
|
||||
S_SPEEDWINGSD,
|
||||
|
||||
S_PARTICLEPICKUP1,
|
||||
S_PARTICLEPICKUP2,
|
||||
S_1000SCOREAWARD,
|
||||
S_POWERUPAWARD,
|
||||
S_POWERUPAWARD1,
|
||||
S_POWERUPAWARD2,
|
||||
|
||||
// Nights-specific stuff
|
||||
S_NIGHTSDRONE_MAN1,
|
||||
|
@ -4540,11 +4391,6 @@ typedef enum state
|
|||
S_REDBRICKDEBRIS, // for CEZ3
|
||||
S_BLUEBRICKDEBRIS, // for CEZ3
|
||||
S_YELLOWBRICKDEBRIS, // for CEZ3
|
||||
S_MARIOBRICKDEBRIS,
|
||||
S_MARIOBRICKDEBRISS,
|
||||
S_MARIOBRICKDEBRISB,
|
||||
S_MARIOBRICKDEBRISC,
|
||||
S_MARIOBRICKDEBRISM,
|
||||
|
||||
S_NAMECHECK,
|
||||
|
||||
|
@ -4748,16 +4594,6 @@ typedef enum mobj_type
|
|||
MT_REDHORIZ,
|
||||
MT_BLUEHORIZ,
|
||||
|
||||
MT_YELLOWTRAMPOLINE,
|
||||
MT_REDTRAMPOLINE,
|
||||
MT_BLUETRAMPOLINE,
|
||||
MT_HORIZYELLOWTRAMPOLINE,
|
||||
MT_HORIZREDTRAMPOLINE,
|
||||
MT_HORIZBLUETRAMPOLINE,
|
||||
MT_DIAGYELLOWTRAMPOLINE,
|
||||
MT_DIAGREDTRAMPOLINE,
|
||||
MT_DIAGBLUETRAMPOLINE,
|
||||
|
||||
MT_BOOSTERSEG,
|
||||
MT_BOOSTERROLLER,
|
||||
MT_YELLOWBOOSTER,
|
||||
|
@ -5258,7 +5094,6 @@ typedef enum mobj_type
|
|||
MT_FIREFLOWER,
|
||||
MT_FIREBALL,
|
||||
MT_FIREBALLTRAIL,
|
||||
MT_GREENKOOPA,
|
||||
MT_SHELL,
|
||||
MT_PUMA,
|
||||
MT_PUMATRAIL,
|
||||
|
@ -5269,30 +5104,6 @@ typedef enum mobj_type
|
|||
MT_MARIOBUSH1,
|
||||
MT_MARIOBUSH2,
|
||||
MT_TOAD,
|
||||
MT_PTZSHROOM,
|
||||
MT_PTZFLAG,
|
||||
MT_BSBSHROOM,
|
||||
MT_BLBSHROOM,
|
||||
MT_BNWSHROOM,
|
||||
MT_MARIOBUSH,
|
||||
MT_REDMFLOWER,
|
||||
MT_BLUEMFLOWER,
|
||||
MT_YELLOWMFLOWER,
|
||||
MT_WHITEDANDELION,
|
||||
MT_MAR64TREE,
|
||||
|
||||
// Power up mushrooms
|
||||
MT_LIFESHROOM,
|
||||
MT_LIFESHROOM_INVISIBLE,
|
||||
MT_POISONSHROOM,
|
||||
MT_NUKESHROOM,
|
||||
MT_FORCESHROOM,
|
||||
MT_ATTRACTSHROOM,
|
||||
MT_ELEMENTALSHROOM,
|
||||
MT_CLOUDSHROOM,
|
||||
MT_STARMAN,
|
||||
MT_SPEEDWINGS,
|
||||
MT_POWERUPAWARD,
|
||||
|
||||
// NiGHTS Stuff
|
||||
MT_AXIS,
|
||||
|
@ -5390,11 +5201,6 @@ typedef enum mobj_type
|
|||
MT_REDBRICKDEBRIS, // for CEZ3
|
||||
MT_BLUEBRICKDEBRIS, // for CEZ3
|
||||
MT_YELLOWBRICKDEBRIS, // for CEZ3
|
||||
MT_MARIOBRICKDEBRIS,
|
||||
MT_MARIOBRICKDEBRISS,
|
||||
MT_MARIOBRICKDEBRISB,
|
||||
MT_MARIOBRICKDEBRISC,
|
||||
MT_MARIOBRICKDEBRISM,
|
||||
|
||||
MT_NAMECHECK,
|
||||
MT_RAY, // General purpose mobj
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2014-2016 by John "JTE" Muniz.
|
||||
// Copyright (C) 2014-2024 by Sonic Team Junior.
|
||||
// Copyright (C) 2014-2025 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -368,7 +368,10 @@ static int lib_numSkinsSprites(lua_State *L)
|
|||
static int lib_getSkinSpriteCompat(lua_State *L)
|
||||
{
|
||||
spritedef_t *sksprites = *(spritedef_t **)luaL_checkudata(L, 1, META_SKINSPRITESCOMPAT);
|
||||
playersprite_t i = luaL_checkinteger(L, 2);
|
||||
INT32 i = luaL_checkinteger(L, 2) & (SPR2F_MASK | SPR2F_SUPER);
|
||||
|
||||
if (i & SPR2F_SUPER)
|
||||
i = (i & ~SPR2F_SUPER) + NUMPLAYERSPRITES;
|
||||
|
||||
if (i < 0 || i >= NUMPLAYERSPRITES*2)
|
||||
return luaL_error(L, "skin sprites index %d out of range (0 - %d)", i, (NUMPLAYERSPRITES*2)-1);
|
||||
|
|
|
@ -1110,9 +1110,9 @@ static mapthing_t *OP_CreateNewMapThing(player_t *player, UINT16 type, boolean c
|
|||
mt->pitch = mt->roll = 0;
|
||||
|
||||
// Ignore offsets
|
||||
if (mt->type == MT_EMBLEM)
|
||||
if (mt->type == mobjinfo[MT_EMBLEM].doomednum)
|
||||
mt->args[1] = 1;
|
||||
else
|
||||
else if (!(mt->type == mobjinfo[MT_METALSONIC_RACE].doomednum || mt->type == mobjinfo[MT_ROSY].doomednum))
|
||||
mt->args[0] = 1;
|
||||
|
||||
return mt;
|
||||
|
|
331
src/m_menu.c
331
src/m_menu.c
|
@ -140,7 +140,6 @@ static char *char_notes = NULL;
|
|||
|
||||
boolean menuactive = false;
|
||||
boolean fromlevelselect = false;
|
||||
tic_t shieldprompt_timer = 0; // Show a prompt about the new Shield button for old configs // TODO: 2.3: Remove
|
||||
|
||||
typedef enum
|
||||
{
|
||||
|
@ -1072,9 +1071,8 @@ static menuitem_t OP_ChangeControlsMenu[] =
|
|||
{IT_CALL | IT_STRING2, NULL, "Move Backward", M_ChangeControl, GC_BACKWARD },
|
||||
{IT_CALL | IT_STRING2, NULL, "Move Left", M_ChangeControl, GC_STRAFELEFT },
|
||||
{IT_CALL | IT_STRING2, NULL, "Move Right", M_ChangeControl, GC_STRAFERIGHT },
|
||||
{IT_CALL | IT_STRING2, NULL, "Jump", M_ChangeControl, GC_JUMP },
|
||||
{IT_CALL | IT_STRING2, NULL, "Spin", M_ChangeControl, GC_SPIN },
|
||||
{IT_CALL | IT_STRING2, NULL, "Shield Ability", M_ChangeControl, GC_SHIELD },
|
||||
{IT_CALL | IT_STRING2, NULL, "Jump", M_ChangeControl, GC_JUMP },
|
||||
{IT_CALL | IT_STRING2, NULL, "Spin", M_ChangeControl, GC_SPIN },
|
||||
{IT_HEADER, NULL, "Camera", NULL, 0},
|
||||
{IT_SPACE, NULL, NULL, NULL, 0}, // padding
|
||||
{IT_CALL | IT_STRING2, NULL, "Look Up", M_ChangeControl, GC_LOOKUP },
|
||||
|
@ -1123,15 +1121,13 @@ static menuitem_t OP_ChangeControlsMenu[] =
|
|||
|
||||
static menuitem_t OP_Joystick1Menu[] =
|
||||
{
|
||||
{IT_STRING | IT_CALL, NULL, "Select Gamepad...", M_Setup1PJoystickMenu, 0},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Move \x17 Axis" , &cv_moveaxis , 20},
|
||||
{IT_STRING | IT_CVAR, NULL, "Move \x18 Axis" , &cv_sideaxis , 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Camera \x17 Axis" , &cv_lookaxis , 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Camera \x18 Axis" , &cv_turnaxis , 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Jump Axis" , &cv_jumpaxis , 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Spin Axis" , &cv_spinaxis , 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Shield Axis" , &cv_shieldaxis , 80},
|
||||
{IT_STRING | IT_CALL, NULL, "Select Gamepad...", M_Setup1PJoystickMenu, 10},
|
||||
{IT_STRING | IT_CVAR, NULL, "Move \x17 Axis" , &cv_moveaxis , 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Move \x18 Axis" , &cv_sideaxis , 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Camera \x17 Axis" , &cv_lookaxis , 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Camera \x18 Axis" , &cv_turnaxis , 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Jump Axis" , &cv_jumpaxis , 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Spin Axis" , &cv_spinaxis , 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Fire Axis" , &cv_fireaxis , 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Fire Normal Axis" , &cv_firenaxis ,100},
|
||||
|
||||
|
@ -1143,15 +1139,13 @@ static menuitem_t OP_Joystick1Menu[] =
|
|||
|
||||
static menuitem_t OP_Joystick2Menu[] =
|
||||
{
|
||||
{IT_STRING | IT_CALL, NULL, "Select Gamepad...", M_Setup2PJoystickMenu, 0},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Move \x17 Axis" , &cv_moveaxis2 , 20},
|
||||
{IT_STRING | IT_CVAR, NULL, "Move \x18 Axis" , &cv_sideaxis2 , 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Camera \x17 Axis" , &cv_lookaxis2 , 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Camera \x18 Axis" , &cv_turnaxis2 , 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Jump Axis" , &cv_jumpaxis2 , 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Spin Axis" , &cv_spinaxis2 , 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Shield Axis" , &cv_shieldaxis2 , 80},
|
||||
{IT_STRING | IT_CALL, NULL, "Select Gamepad...", M_Setup2PJoystickMenu, 10},
|
||||
{IT_STRING | IT_CVAR, NULL, "Move \x17 Axis" , &cv_moveaxis2 , 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Move \x18 Axis" , &cv_sideaxis2 , 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Camera \x17 Axis" , &cv_lookaxis2 , 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Camera \x18 Axis" , &cv_turnaxis2 , 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Jump Axis" , &cv_jumpaxis2 , 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Spin Axis" , &cv_spinaxis2 , 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Fire Axis" , &cv_fireaxis2 , 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Fire Normal Axis" , &cv_firenaxis2 ,100},
|
||||
|
||||
|
@ -3162,7 +3156,6 @@ static void Command_Manual_f(void)
|
|||
if (modeattacking)
|
||||
return;
|
||||
M_StartControlPanel();
|
||||
if (shieldprompt_timer) return; // TODO: 2.3: Delete this line
|
||||
currentMenu = &MISC_HelpDef;
|
||||
itemOn = 0;
|
||||
}
|
||||
|
@ -3342,7 +3335,6 @@ boolean M_Responder(event_t *ev)
|
|||
if (modeattacking)
|
||||
return true;
|
||||
M_StartControlPanel();
|
||||
if (shieldprompt_timer) return true; // TODO: 2.3: Delete this line
|
||||
M_Options(0);
|
||||
// Uncomment the below if you want the menu to reset to the top each time like before. M_SetupNextMenu will fix it automatically.
|
||||
//OP_SoundOptionsDef.lastOn = 0;
|
||||
|
@ -3353,7 +3345,6 @@ boolean M_Responder(event_t *ev)
|
|||
if (modeattacking)
|
||||
return true;
|
||||
M_StartControlPanel();
|
||||
if (shieldprompt_timer) return true; // TODO: 2.3: Delete this line
|
||||
M_Options(0);
|
||||
M_VideoModeMenu(0);
|
||||
return true;
|
||||
|
@ -3365,7 +3356,6 @@ boolean M_Responder(event_t *ev)
|
|||
if (modeattacking)
|
||||
return true;
|
||||
M_StartControlPanel();
|
||||
if (shieldprompt_timer) return true; // TODO: 2.3: Delete this line
|
||||
M_Options(0);
|
||||
M_SetupNextMenu(&OP_MainDef);
|
||||
return true;
|
||||
|
@ -3643,230 +3633,6 @@ void M_Drawer(void)
|
|||
}
|
||||
}
|
||||
|
||||
// Handle the "Do you want to assign Shield Ability now?" pop-up for old configs // TODO: 2.3: Remove this line...
|
||||
static UINT8 shieldprompt_currentchoice = 0; // ...and this line...
|
||||
|
||||
static void M_ShieldPromptUseDefaults(void) // ...and this function
|
||||
{
|
||||
// With a default config from v2.2.10 to v2.2.13, the B button will be set to Custom 1,
|
||||
// and Controls per Key defaults to "One", so it will override the default Shield button.
|
||||
// A default config from v2.2.0 to v2.2.9 has Next Weapon on B, so it suffers from this too.
|
||||
|
||||
// So for "Use default Shield Ability buttons", we should update old configs to mitigate gamepad conflicts
|
||||
// (even with "Several" Controls per Key!), and show a message with the default bindings
|
||||
|
||||
for (setupcontrols = gamecontrol; true; setupcontrols = gamecontrolbis) // Do stuff for both P1 and P2
|
||||
{
|
||||
INT32 JOY1 = (setupcontrols == gamecontrol) ? KEY_JOY1 : KEY_2JOY1; // Is this for P1 or for P2?
|
||||
|
||||
if ((setupcontrols[GC_CUSTOM1][0] == JOY1+1 || setupcontrols[GC_CUSTOM1][1] == JOY1+1)
|
||||
&& (setupcontrols[GC_CUSTOM2][0] == JOY1+3 || setupcontrols[GC_CUSTOM2][1] == JOY1+3)
|
||||
&& (setupcontrols[GC_CUSTOM3][0] == JOY1+8 || setupcontrols[GC_CUSTOM3][1] == JOY1+8))
|
||||
{
|
||||
// If the player has v2.2.13's default gamepad Custom 1/2/3 buttons,
|
||||
// shuffle Custom 1/2/3 around to make room for Shield Ability on B
|
||||
UINT8 shield_slot = (setupcontrols[GC_SHIELD ][0] == KEY_NULL ) ? 0 : 1;
|
||||
UINT8 custom1_slot = (setupcontrols[GC_CUSTOM1][0] == JOY1+1) ? 0 : 1;
|
||||
UINT8 custom2_slot = (setupcontrols[GC_CUSTOM2][0] == JOY1+3) ? 0 : 1;
|
||||
UINT8 custom3_slot = (setupcontrols[GC_CUSTOM3][0] == JOY1+8) ? 0 : 1;
|
||||
|
||||
setupcontrols[GC_SHIELD ][shield_slot ] = JOY1+1; // Assign Shield Ability to B
|
||||
setupcontrols[GC_CUSTOM1][custom1_slot] = JOY1+3; // Move Custom 1 from B to Y
|
||||
setupcontrols[GC_CUSTOM2][custom2_slot] = JOY1+8; // Move Custom 2 from Y to LS
|
||||
setupcontrols[GC_CUSTOM3][custom3_slot] = KEY_NULL; // Unassign Custom 3 from LS...
|
||||
// (The alternative would be to check and update the ENTIRE gamepad layout.
|
||||
// That'd be nice, but it would mess with people that are used to the old defaults.)
|
||||
}
|
||||
else if ((setupcontrols[GC_WEAPONNEXT][0] == JOY1+1 || setupcontrols[GC_WEAPONNEXT][1] == JOY1+1)
|
||||
&& (setupcontrols[GC_WEAPONPREV][0] == JOY1+2 || setupcontrols[GC_WEAPONPREV][1] == JOY1+2))
|
||||
{
|
||||
// Or if the user has a default config from v2.2.0 to v2.2.9,
|
||||
// the B button will be Next Weapon, and X will be Previous Weapon.
|
||||
// It's "safe" to discard one of them, you just have to press X multiple times to select in the other direction
|
||||
UINT8 shield_slot = (setupcontrols[GC_SHIELD ][0] == KEY_NULL ) ? 0 : 1;
|
||||
UINT8 nweapon_slot = (setupcontrols[GC_WEAPONNEXT][0] == JOY1+1) ? 0 : 1;
|
||||
UINT8 pweapon_slot = (setupcontrols[GC_WEAPONPREV][0] == JOY1+2) ? 0 : 1;
|
||||
|
||||
setupcontrols[GC_SHIELD ][shield_slot ] = JOY1+1; // Assign Shield Ability to B
|
||||
setupcontrols[GC_WEAPONNEXT][nweapon_slot] = JOY1+3; // Move Next Weapon from B to X
|
||||
setupcontrols[GC_WEAPONPREV][pweapon_slot] = KEY_NULL; // Unassign Previous Weapon from X
|
||||
}
|
||||
|
||||
if (setupcontrols == gamecontrolbis) // If we've already updated both players, break out
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// Now, show a message about the default Shield Ability bindings
|
||||
if ((gamecontrol[GC_SHIELD][0] == KEY_LALT && gamecontrol[GC_SHIELD][1] == KEY_JOY1+1)
|
||||
|| (gamecontrol[GC_SHIELD][0] == KEY_JOY1+1 && gamecontrol[GC_SHIELD][1] == KEY_LALT))
|
||||
{
|
||||
// Left Alt and the B button are both assigned
|
||||
M_StartMessage(M_GetText("Shield Ability defaults to\nthe \x82""Left Alt\x80"" key on keyboard,\nand the \x85""B button\x80"" on gamepads."
|
||||
"\n\nYou can always reassign it\nin the Options menu later."
|
||||
"\n\n\nPress 'Enter' to continue\n"),
|
||||
NULL, MM_NOTHING);
|
||||
MessageDef.x = 43; // Change the pop-up message's background position/width
|
||||
MessageDef.lastOn = (MessageDef.lastOn & ~0xFF) | 27;
|
||||
}
|
||||
else if (gamecontrol[GC_SHIELD][0] == KEY_LALT || gamecontrol[GC_SHIELD][1] == KEY_LALT)
|
||||
{
|
||||
// Left Alt is assigned, but the B button isn't.
|
||||
M_StartMessage(M_GetText("Shield Ability defaults to\nthe \x82""Left Alt\x80"" key on keyboard.\nThe \x85""B button\x80"" on gamepads was taken."
|
||||
"\n\nYou can always reassign it\nin the Options menu later."
|
||||
"\n\n\nPress 'Enter' to continue\n"),
|
||||
NULL, MM_NOTHING);
|
||||
MessageDef.x = 24; // Change the pop-up message's background position/width
|
||||
MessageDef.lastOn = (MessageDef.lastOn & ~0xFF) | 32;
|
||||
}
|
||||
else if (gamecontrol[GC_SHIELD][0] == KEY_JOY1+1 || gamecontrol[GC_SHIELD][1] == KEY_JOY1+1)
|
||||
{
|
||||
// The B button is assigned, but Left Alt isn't
|
||||
M_StartMessage(M_GetText("Shield Ability defaults to\nthe \x85""B button\x80"" on gamepads.\nThe \x82""Left Alt\x80"" key on keyboard was taken."
|
||||
"\n\nYou can always reassign it\nin the Options menu later."
|
||||
"\n\n\nPress 'Enter' to continue\n"),
|
||||
NULL, MM_NOTHING);
|
||||
MessageDef.x = 8; // Change the pop-up message's background position/width
|
||||
MessageDef.lastOn = (MessageDef.lastOn & ~0xFF) | 36;
|
||||
}
|
||||
else if (gamecontrol[GC_SHIELD][0] == KEY_NULL && gamecontrol[GC_SHIELD][1] == KEY_NULL)
|
||||
{
|
||||
// Neither Left Alt nor the B button are assigned
|
||||
M_StartMessage(M_GetText("Shield Ability is unassigned!\nThe \x82""Left Alt\x80"" key on keyboard and\nthe \x85""B button\x80"" on gamepads were taken."
|
||||
"\n\nYou should assign Shield Ability\nin the Options menu later."
|
||||
"\n\n\nPress 'Enter' to continue\n"),
|
||||
NULL, MM_NOTHING);
|
||||
MessageDef.x = 19; // Change the pop-up message's background position/width
|
||||
MessageDef.lastOn = (MessageDef.lastOn & ~0xFF) | 33;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Neither Left Alt nor the B button are assigned... but something else is???
|
||||
// (This can technically happen if you edit your config or use setcontrol in the console before opening the menu)
|
||||
char keystr[16+16+2+7+1]; // Two 16-char keys + two colour codes + "' and '" + null
|
||||
|
||||
if (gamecontrol[GC_SHIELD][0] != KEY_NULL && gamecontrol[GC_SHIELD][1] != KEY_NULL)
|
||||
STRBUFCPY(keystr, va("%s\x80""' and '\x82""%s",
|
||||
G_KeyNumToName(gamecontrol[GC_SHIELD][0]),
|
||||
G_KeyNumToName(gamecontrol[GC_SHIELD][1])));
|
||||
else if (gamecontrol[GC_SHIELD][0] != KEY_NULL)
|
||||
STRBUFCPY(keystr, G_KeyNumToName(gamecontrol[GC_SHIELD][0]));
|
||||
else //if (gamecontrol[GC_SHIELD][1] != KEY_NULL)
|
||||
STRBUFCPY(keystr, G_KeyNumToName(gamecontrol[GC_SHIELD][1]));
|
||||
|
||||
M_StartMessage(va("Shield Ability is assigned to\n'\x82""%s\x80""'."
|
||||
"\n\nYou can always reassign it\nin the Options menu later."
|
||||
"\n\n\nPress 'Enter' to continue\n",
|
||||
keystr), NULL, MM_NOTHING);
|
||||
MessageDef.x = 23; // Change the pop-up message's background position/width
|
||||
MessageDef.lastOn = (MessageDef.lastOn & ~0xFF) | 32;
|
||||
}
|
||||
}
|
||||
|
||||
static void M_HandleShieldPromptMenu(INT32 choice) // TODO: 2.3: Remove
|
||||
{
|
||||
switch (choice)
|
||||
{
|
||||
case KEY_ESCAPE:
|
||||
if (I_GetTime() <= shieldprompt_timer) // Don't mash past the pop-up by accident!
|
||||
break;
|
||||
|
||||
S_StartSound(NULL, sfx_menu1);
|
||||
noFurtherInput = true;
|
||||
shieldprompt_timer = 0;
|
||||
M_ShieldPromptUseDefaults();
|
||||
break;
|
||||
|
||||
case KEY_ENTER:
|
||||
if (I_GetTime() <= shieldprompt_timer) // Don't mash past the pop-up by accident!
|
||||
break;
|
||||
|
||||
S_StartSound(NULL, sfx_menu1);
|
||||
noFurtherInput = true;
|
||||
shieldprompt_timer = 0;
|
||||
|
||||
if (shieldprompt_currentchoice == 0)
|
||||
{
|
||||
OP_ChangeControlsDef.lastOn = 8; // Highlight Shield Ability in the controls menu
|
||||
M_Setup1PControlsMenu(0); // Set up P1's controls menu and call M_SetupNextMenu
|
||||
}
|
||||
else if (shieldprompt_currentchoice == 1) // Copy the Spin buttons to the Shield buttons
|
||||
{
|
||||
CV_SetValue(&cv_controlperkey, 2); // Make sure that Controls per Key is "Several"
|
||||
|
||||
gamecontrol [GC_SHIELD][0] = gamecontrol [GC_SPIN][0];
|
||||
gamecontrol [GC_SHIELD][1] = gamecontrol [GC_SPIN][1];
|
||||
gamecontrolbis[GC_SHIELD][0] = gamecontrolbis[GC_SPIN][0];
|
||||
gamecontrolbis[GC_SHIELD][1] = gamecontrolbis[GC_SPIN][1];
|
||||
CV_SetValue(&cv_shieldaxis, cv_spinaxis.value);
|
||||
CV_SetValue(&cv_shieldaxis2, cv_spinaxis2.value);
|
||||
|
||||
M_StartMessage(M_GetText("Spin and Shield Ability are now\nthe same button."
|
||||
"\n\nYou can always reassign them\nin the Options menu later."
|
||||
"\n\n\nPress 'Enter' to continue\n"),
|
||||
NULL, MM_NOTHING);
|
||||
MessageDef.x = 36; // Change the pop-up message's background position/width
|
||||
MessageDef.lastOn = (MessageDef.lastOn & ~0xFF) | 29;
|
||||
}
|
||||
else
|
||||
M_ShieldPromptUseDefaults();
|
||||
break;
|
||||
|
||||
case KEY_UPARROW:
|
||||
S_StartSound(NULL, sfx_menu1);
|
||||
shieldprompt_currentchoice = (shieldprompt_currentchoice+2)%3;
|
||||
break;
|
||||
|
||||
case KEY_DOWNARROW:
|
||||
S_StartSound(NULL, sfx_menu1);
|
||||
shieldprompt_currentchoice = (shieldprompt_currentchoice+1)%3;
|
||||
break;
|
||||
}
|
||||
|
||||
MessageDef.prevMenu = &MainDef;
|
||||
}
|
||||
|
||||
static void M_DrawShieldPromptMenu(void) // TODO: 2.3: Remove
|
||||
{
|
||||
INT16 cursorx = (BASEVIDWIDTH/2) - 24;
|
||||
|
||||
V_DrawFill(10-3, 68-3, 300+6, 40+6, 159);
|
||||
// V_DrawCenteredString doesn't centre newlines, so we have to draw each line separately
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, 68, V_ALLOWLOWERCASE, "Welcome back! Since you last played,");
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, 76, V_ALLOWLOWERCASE, "Spin has been split into separate");
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, 84, V_ALLOWLOWERCASE, "\"Spin\" and \"Shield Ability\" controls.");
|
||||
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, 98, V_ALLOWLOWERCASE, "Do you want to assign Shield Ability now?");
|
||||
|
||||
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, 164,
|
||||
(shieldprompt_currentchoice == 0) ? V_YELLOWMAP : 0, "Open Control Setup");
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, 172,
|
||||
(shieldprompt_currentchoice == 1) ? V_YELLOWMAP : 0, "Keep the old behaviour");
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, 180,
|
||||
(shieldprompt_currentchoice == 2) ? V_YELLOWMAP : 0, "Use default Shield Ability buttons");
|
||||
|
||||
switch (shieldprompt_currentchoice)
|
||||
{
|
||||
case 0: cursorx -= V_StringWidth("Open Control Setup", 0)/2; break;
|
||||
case 1: cursorx -= V_StringWidth("Keep the old behaviour", 0)/2; break;
|
||||
default: cursorx -= V_StringWidth("Use default Shield Ability buttons", 0)/2; break;
|
||||
}
|
||||
V_DrawScaledPatch(cursorx, 164 + (shieldprompt_currentchoice*8), 0, W_CachePatchName("M_CURSOR", PU_PATCH));
|
||||
}
|
||||
|
||||
static menuitem_t OP_ShieldPromptMenu[] = {{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleShieldPromptMenu, 0}}; // TODO: 2.3: Remove
|
||||
|
||||
menu_t OP_ShieldPromptDef = { // TODO: 2.3: Remove
|
||||
MN_SPECIAL,
|
||||
NULL,
|
||||
1,
|
||||
&MainDef,
|
||||
OP_ShieldPromptMenu,
|
||||
M_DrawShieldPromptMenu,
|
||||
0, 0, 0, NULL
|
||||
};
|
||||
|
||||
//
|
||||
// M_StartControlPanel
|
||||
//
|
||||
|
@ -3898,15 +3664,6 @@ void M_StartControlPanel(void)
|
|||
currentMenu = &MainDef;
|
||||
itemOn = singleplr;
|
||||
M_UpdateItemOn();
|
||||
|
||||
if (shieldprompt_timer) // For old configs, show a pop-up about the new Shield button // TODO: 2.3: Remove
|
||||
{
|
||||
S_StartSound(NULL, sfx_strpst);
|
||||
noFurtherInput = true;
|
||||
shieldprompt_timer = I_GetTime() + TICRATE; // Don't mash past the pop-up by accident!
|
||||
|
||||
M_SetupNextMenu(&OP_ShieldPromptDef);
|
||||
}
|
||||
}
|
||||
else if (modeattacking)
|
||||
{
|
||||
|
@ -13566,23 +13323,23 @@ static void M_Setup1PControlsMenu(INT32 choice)
|
|||
currentMenu->lastOn = itemOn;
|
||||
|
||||
// Unhide the nine non-P2 controls and their headers
|
||||
//OP_ChangeControlsMenu[19+0].status = IT_HEADER;
|
||||
//OP_ChangeControlsMenu[19+1].status = IT_SPACE;
|
||||
//OP_ChangeControlsMenu[18+0].status = IT_HEADER;
|
||||
//OP_ChangeControlsMenu[18+1].status = IT_SPACE;
|
||||
// ...
|
||||
OP_ChangeControlsMenu[19+2].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[19+3].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[19+4].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[19+5].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[19+6].status = IT_CALL|IT_STRING2;
|
||||
//OP_ChangeControlsMenu[19+7].status = IT_CALL|IT_STRING2;
|
||||
//OP_ChangeControlsMenu[19+8].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[19+9].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[18+2].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[18+3].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[18+4].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[18+5].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[18+6].status = IT_CALL|IT_STRING2;
|
||||
//OP_ChangeControlsMenu[18+7].status = IT_CALL|IT_STRING2;
|
||||
//OP_ChangeControlsMenu[18+8].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[18+9].status = IT_CALL|IT_STRING2;
|
||||
// ...
|
||||
OP_ChangeControlsMenu[29+0].status = IT_HEADER;
|
||||
OP_ChangeControlsMenu[29+1].status = IT_SPACE;
|
||||
OP_ChangeControlsMenu[28+0].status = IT_HEADER;
|
||||
OP_ChangeControlsMenu[28+1].status = IT_SPACE;
|
||||
// ...
|
||||
OP_ChangeControlsMenu[29+2].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[29+3].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[28+2].status = IT_CALL|IT_STRING2;
|
||||
OP_ChangeControlsMenu[28+3].status = IT_CALL|IT_STRING2;
|
||||
|
||||
OP_ChangeControlsDef.prevMenu = &OP_P1ControlsDef;
|
||||
OP_ChangeControlsDef.menuid &= ~(((1 << MENUBITS) - 1) << MENUBITS); // remove second level
|
||||
|
@ -13598,23 +13355,23 @@ static void M_Setup2PControlsMenu(INT32 choice)
|
|||
currentMenu->lastOn = itemOn;
|
||||
|
||||
// Hide the nine non-P2 controls and their headers
|
||||
//OP_ChangeControlsMenu[19+0].status = IT_GRAYEDOUT2;
|
||||
//OP_ChangeControlsMenu[19+1].status = IT_GRAYEDOUT2;
|
||||
//OP_ChangeControlsMenu[18+0].status = IT_GRAYEDOUT2;
|
||||
//OP_ChangeControlsMenu[18+1].status = IT_GRAYEDOUT2;
|
||||
// ...
|
||||
OP_ChangeControlsMenu[19+2].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[19+3].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[19+4].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[19+5].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[19+6].status = IT_GRAYEDOUT2;
|
||||
//OP_ChangeControlsMenu[19+7].status = IT_GRAYEDOUT2;
|
||||
//OP_ChangeControlsMenu[19+8].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[19+9].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[18+2].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[18+3].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[18+4].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[18+5].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[18+6].status = IT_GRAYEDOUT2;
|
||||
//OP_ChangeControlsMenu[18+7].status = IT_GRAYEDOUT2;
|
||||
//OP_ChangeControlsMenu[18+8].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[18+9].status = IT_GRAYEDOUT2;
|
||||
// ...
|
||||
OP_ChangeControlsMenu[29+0].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[29+1].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[28+0].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[28+1].status = IT_GRAYEDOUT2;
|
||||
// ...
|
||||
OP_ChangeControlsMenu[29+2].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[29+3].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[28+2].status = IT_GRAYEDOUT2;
|
||||
OP_ChangeControlsMenu[28+3].status = IT_GRAYEDOUT2;
|
||||
|
||||
OP_ChangeControlsDef.prevMenu = &OP_P2ControlsDef;
|
||||
OP_ChangeControlsDef.menuid &= ~(((1 << MENUBITS) - 1) << MENUBITS); // remove second level
|
||||
|
|
13
src/m_menu.h
13
src/m_menu.h
|
@ -3,7 +3,7 @@
|
|||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 2011-2016 by Matthew "Kaito Sinclaire" Walsh.
|
||||
// Copyright (C) 1999-2024 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2025 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -143,7 +143,7 @@ typedef enum
|
|||
|
||||
typedef struct
|
||||
{
|
||||
char bgname[8]; // name for background gfx lump; lays over titlemap if this is set
|
||||
char bgname[8+1]; // name for background gfx lump; lays over titlemap if this is set
|
||||
SINT8 fadestrength; // darken background when displaying this menu, strength 0-31 or -1 for undefined
|
||||
INT32 bgcolor; // fill color, overrides bg name. -1 means follow bg name rules.
|
||||
INT32 titlescrollxspeed; // background gfx scroll per menu; inherits global setting
|
||||
|
@ -153,13 +153,13 @@ typedef struct
|
|||
SINT8 hidetitlepics; // hide title gfx per menu; -1 means undefined, inherits global setting
|
||||
ttmode_enum ttmode; // title wing animation mode; default TTMODE_OLD
|
||||
UINT8 ttscale; // scale of title wing gfx (FRACUNIT / ttscale); -1 means undefined, inherits global setting
|
||||
char ttname[9]; // lump name of title wing gfx. If name length is <= 6, engine will attempt to load numbered frames (TTNAMExx)
|
||||
char ttname[8+1]; // lump name of title wing gfx. If name length is <= 6, engine will attempt to load numbered frames (TTNAMExx)
|
||||
INT16 ttx; // X position of title wing
|
||||
INT16 tty; // Y position of title wing
|
||||
INT16 ttloop; // # frame to loop; -1 means dont loop
|
||||
UINT16 tttics; // # of tics per frame
|
||||
|
||||
char musname[7]; ///< Music track to play. "" for no music.
|
||||
char musname[6+1]; ///< Music track to play. "" for no music.
|
||||
UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore.
|
||||
boolean muslooping; ///< Loop the music
|
||||
boolean musstop; ///< Don't play any music
|
||||
|
@ -176,7 +176,6 @@ typedef struct
|
|||
extern menupres_t menupres[NUMMENUTYPES];
|
||||
extern UINT32 prevMenuId;
|
||||
extern UINT32 activeMenuId;
|
||||
extern tic_t shieldprompt_timer; // Show a prompt about the new Shield button for old configs // TODO: 2.3: Remove
|
||||
|
||||
void M_InitMenuPresTables(void);
|
||||
UINT8 M_GetYoungestChildMenu(void);
|
||||
|
@ -370,8 +369,8 @@ extern menu_t OP_JoystickSetDef;
|
|||
typedef struct
|
||||
{
|
||||
boolean used;
|
||||
char notes[441];
|
||||
char picname[8];
|
||||
char notes[440+1];
|
||||
char picname[8+1];
|
||||
char skinname[SKINNAMESIZE*2+2]; // skin&skin\0
|
||||
patch_t *charpic;
|
||||
UINT8 prev;
|
||||
|
|
|
@ -560,11 +560,6 @@ void M_FirstLoadConfig(void)
|
|||
COM_BufInsertText(va("exec \"%s\"\n", configfile));
|
||||
// no COM_BufExecute() needed; that does it right away
|
||||
|
||||
// For configs loaded at startup only, check for pre-Shield-button configs // TODO: 2.3: Remove
|
||||
if (GETMAJOREXECVERSION(cv_execversion.value) < 55 // Pre-v2.2.14 configs
|
||||
&& cv_execversion.value != 25) // Make sure that the config exists, too
|
||||
shieldprompt_timer = 1;
|
||||
|
||||
// don't filter anymore vars and don't let this convsvar be changed
|
||||
COM_BufInsertText(va("%s \"%d\"\n", cv_execversion.name, EXECVERSION));
|
||||
CV_ToggleExecVersion(false);
|
||||
|
|
|
@ -824,8 +824,6 @@ void D_RegisterClientCommands(void)
|
|||
CV_RegisterVar(&cv_jumpaxis2);
|
||||
CV_RegisterVar(&cv_spinaxis);
|
||||
CV_RegisterVar(&cv_spinaxis2);
|
||||
CV_RegisterVar(&cv_shieldaxis);
|
||||
CV_RegisterVar(&cv_shieldaxis2);
|
||||
CV_RegisterVar(&cv_fireaxis);
|
||||
CV_RegisterVar(&cv_fireaxis2);
|
||||
CV_RegisterVar(&cv_firenaxis);
|
||||
|
|
|
@ -7837,14 +7837,13 @@ void A_BuzzFly(mobj_t *actor)
|
|||
|
||||
// Function: A_GuardChase
|
||||
//
|
||||
// Description: Modified A_Chase for Egg Guard and Koopa Troopas
|
||||
// Description: Modified A_Chase for Egg Guard
|
||||
//
|
||||
// var1 = shield (0) or no shield (1)
|
||||
// var1 = unused
|
||||
// var2 = unused
|
||||
//
|
||||
void A_GuardChase(mobj_t *actor)
|
||||
{
|
||||
INT32 locvar1 = var1;
|
||||
INT32 delta;
|
||||
|
||||
if (LUA_CallAction(A_GUARDCHASE, actor))
|
||||
|
@ -7853,11 +7852,11 @@ void A_GuardChase(mobj_t *actor)
|
|||
if (actor->reactiontime)
|
||||
actor->reactiontime--;
|
||||
|
||||
if (actor->threshold != 42 || locvar1 == 1) // In formation...
|
||||
if (actor->threshold != 42) // In formation...
|
||||
{
|
||||
fixed_t speed;
|
||||
|
||||
if ((!actor->tracer || !actor->tracer->health) && locvar1 == 0)
|
||||
if (!actor->tracer || !actor->tracer->health)
|
||||
{
|
||||
P_SetTarget(&actor->tracer, NULL);
|
||||
actor->threshold = 42;
|
||||
|
@ -7946,7 +7945,7 @@ void A_GuardChase(mobj_t *actor)
|
|||
// Now that we've moved, its time for our shield to move!
|
||||
// Otherwise it'll never act as a proper overlay.
|
||||
if (actor->tracer && actor->tracer->state
|
||||
&& actor->tracer->state->action.acp1 && locvar1 == 0)
|
||||
&& actor->tracer->state->action.acp1)
|
||||
{
|
||||
var1 = actor->tracer->state->var1, var2 = actor->tracer->state->var2;
|
||||
actor->tracer->state->action.acp1(actor->tracer);
|
||||
|
|
|
@ -289,7 +289,6 @@ void P_RecalcPrecipInSector(sector_t *sector);
|
|||
void P_PrecipitationEffects(void);
|
||||
|
||||
void P_RemoveMobj(mobj_t *th);
|
||||
boolean P_MobjWasRemoved(mobj_t *th);
|
||||
void P_RemoveSavegameMobj(mobj_t *th);
|
||||
boolean P_SetMobjState(mobj_t *mobj, statenum_t state);
|
||||
void P_RunShields(void);
|
||||
|
@ -301,6 +300,12 @@ boolean P_CheckSkyHit(mobj_t *mo, line_t *line);
|
|||
void P_PushableThinker(mobj_t *mobj);
|
||||
void P_SceneryThinker(mobj_t *mobj);
|
||||
|
||||
// This does not need to be added to Lua.
|
||||
// To test it in Lua, check mobj.valid
|
||||
FUNCINLINE static ATTRINLINE boolean P_MobjWasRemoved(mobj_t *mobj)
|
||||
{
|
||||
return mobj == NULL || mobj->thinker.function.acp1 != (actionf_p1)P_MobjThinker;
|
||||
}
|
||||
|
||||
fixed_t P_MobjFloorZ(sector_t *sector, sector_t *boundsec, fixed_t x, fixed_t y, fixed_t radius, line_t *line, boolean lowest, boolean perfect);
|
||||
fixed_t P_MobjCeilingZ(sector_t *sector, sector_t *boundsec, fixed_t x, fixed_t y, fixed_t radius, line_t *line, boolean lowest, boolean perfect);
|
||||
|
|
56
src/p_mobj.c
56
src/p_mobj.c
|
@ -323,8 +323,10 @@ static boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
mobj->state = st;
|
||||
mobj->tics = st->tics;
|
||||
|
||||
// Adjust the player's animation speed to match their velocity.
|
||||
if (player->panim == PA_EDGE && (player->charflags & SF_FASTEDGE))
|
||||
// Adjust the player's animation speed
|
||||
if (mobj->state-states == S_PLAY_WAIT && (player->charflags & SF_FASTWAIT))
|
||||
mobj->tics = 5;
|
||||
else if (player->panim == PA_EDGE && (player->charflags & SF_FASTEDGE))
|
||||
mobj->tics = 2;
|
||||
else if (!(disableSpeedAdjust || player->charflags & SF_NOSPEEDADJUST))
|
||||
{
|
||||
|
@ -7307,7 +7309,7 @@ static void P_RosySceneryThink(mobj_t *mobj)
|
|||
player = &players[i];
|
||||
}
|
||||
|
||||
if (stat == S_ROSY_JUMP || stat == S_ROSY_PAIN)
|
||||
if (stat == S_ROSY_JUMP || stat == S_ROSY_FALL || stat == S_ROSY_PAIN)
|
||||
{
|
||||
if (P_IsObjectOnGround(mobj))
|
||||
{
|
||||
|
@ -7318,16 +7320,16 @@ static void P_RosySceneryThink(mobj_t *mobj)
|
|||
stat = S_ROSY_WALK;
|
||||
P_SetMobjState(mobj, stat);
|
||||
}
|
||||
else if (P_MobjFlip(mobj)*mobj->momz < 0)
|
||||
mobj->frame = mobj->state->frame + mobj->state->var1;
|
||||
else if (P_MobjFlip(mobj)*mobj->momz < 0 && stat == S_ROSY_JUMP)
|
||||
P_SetMobjState(mobj, S_ROSY_FALL);
|
||||
}
|
||||
|
||||
if (!player)
|
||||
{
|
||||
if ((stat < S_ROSY_IDLE1 || stat > S_ROSY_IDLE4) && stat != S_ROSY_JUMP)
|
||||
if (stat != S_ROSY_IDLE && stat != S_ROSY_JUMP && stat != S_ROSY_FALL)
|
||||
{
|
||||
mobj->momx = mobj->momy = 0;
|
||||
P_SetMobjState(mobj, S_ROSY_IDLE1);
|
||||
P_SetMobjState(mobj, S_ROSY_IDLE);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -7341,13 +7343,11 @@ static void P_RosySceneryThink(mobj_t *mobj)
|
|||
|
||||
switch (stat)
|
||||
{
|
||||
case S_ROSY_IDLE1:
|
||||
case S_ROSY_IDLE2:
|
||||
case S_ROSY_IDLE3:
|
||||
case S_ROSY_IDLE4:
|
||||
case S_ROSY_IDLE:
|
||||
dojump = true;
|
||||
break;
|
||||
case S_ROSY_JUMP:
|
||||
case S_ROSY_FALL:
|
||||
case S_ROSY_PAIN:
|
||||
// handled above
|
||||
break;
|
||||
|
@ -7373,8 +7373,7 @@ static void P_RosySceneryThink(mobj_t *mobj)
|
|||
max = pdist;
|
||||
if ((--mobj->extravalue1) <= 0)
|
||||
{
|
||||
if (++mobj->frame > mobj->state->frame + mobj->state->var1)
|
||||
mobj->frame = mobj->state->frame;
|
||||
P_SetMobjState(mobj, S_ROSY_WALK);
|
||||
if (mom > 12*mobj->scale)
|
||||
mobj->extravalue1 = 2;
|
||||
else if (mom > 6*mobj->scale)
|
||||
|
@ -10609,6 +10608,19 @@ static fixed_t P_DefaultMobjShadowScale (mobj_t *thing)
|
|||
}
|
||||
}
|
||||
|
||||
static INT32 P_SetupNPC(mobj_t *mobj, const char *name)
|
||||
{
|
||||
INT32 skinnum = R_SkinAvailable(name);
|
||||
|
||||
if (skinnum != -1)
|
||||
{
|
||||
mobj->skin = skins[skinnum];
|
||||
mobj->color = skins[skinnum]->prefcolor;
|
||||
}
|
||||
|
||||
return skinnum;
|
||||
}
|
||||
|
||||
//
|
||||
// P_SpawnMobj
|
||||
//
|
||||
|
@ -10962,17 +10974,14 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type, ...)
|
|||
nummaprings++;
|
||||
break;
|
||||
case MT_METALSONIC_RACE:
|
||||
mobj->skin = skins[5];
|
||||
/* FALLTHRU */
|
||||
case MT_METALSONIC_BATTLE:
|
||||
mobj->color = skins[5]->prefcolor;
|
||||
sc = 5;
|
||||
sc = P_SetupNPC(mobj, "metalsonic");
|
||||
break;
|
||||
case MT_FANG:
|
||||
sc = 4;
|
||||
sc = P_SetupNPC(mobj, "fang");
|
||||
break;
|
||||
case MT_ROSY:
|
||||
sc = 3;
|
||||
sc = P_SetupNPC(mobj, "amy");
|
||||
break;
|
||||
case MT_CORK:
|
||||
mobj->flags2 |= MF2_SUPERFIRE;
|
||||
|
@ -11273,15 +11282,6 @@ void P_RemoveMobj(mobj_t *mobj)
|
|||
#endif
|
||||
}
|
||||
|
||||
// This does not need to be added to Lua.
|
||||
// To test it in Lua, check mobj.valid
|
||||
boolean P_MobjWasRemoved(mobj_t *mobj)
|
||||
{
|
||||
if (mobj && mobj->thinker.function.acp1 == (actionf_p1)P_MobjThinker)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void P_RemovePrecipMobj(precipmobj_t *mobj)
|
||||
{
|
||||
// unlink from sector and block lists
|
||||
|
|
|
@ -5866,10 +5866,6 @@ static void P_ConvertBinaryLinedefTypes(void)
|
|||
lines[i].args[0] = tag;
|
||||
lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB);
|
||||
break;
|
||||
case 465: // Bounce Player (purely for backwards compatibility with new Pipe Towers)
|
||||
lines[i].args[0] = (FixedHypot(lines[i].dx, lines[i].dy) / 8) >> FRACBITS;
|
||||
lines[i].special = 430;
|
||||
break;
|
||||
case 466: //Set level failure state
|
||||
lines[i].args[0] = !!(lines[i].flags & ML_NOCLIMB);
|
||||
break;
|
||||
|
|
12
src/p_spec.c
12
src/p_spec.c
|
@ -2702,18 +2702,6 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
|||
EV_DoCrush(line->args[0], line, crushBothOnce);
|
||||
break;
|
||||
|
||||
case 430: // Bounce Player
|
||||
if (mo && mo->player)
|
||||
{
|
||||
P_SetObjectMomZ(mo, line->args[0]*FRACUNIT, false);
|
||||
S_StartSound(NULL, sfx_s3k8a);
|
||||
mo->player->pflags |= PF_JUMPED;
|
||||
if (skins[mo->player->skin]->flags & SF_NOJUMPSPIN)
|
||||
P_SetMobjState(mo, S_PLAY_SPRING);
|
||||
else
|
||||
P_SetMobjState(mo, S_PLAY_JUMP);
|
||||
}
|
||||
break;
|
||||
case 432: // Enable/Disable 2D Mode
|
||||
if (mo && mo->player)
|
||||
{
|
||||
|
|
115
src/p_user.c
115
src/p_user.c
|
@ -669,7 +669,7 @@ static void P_DeNightserizePlayer(player_t *player)
|
|||
player->powers[pw_carry] = CR_NIGHTSFALL;
|
||||
|
||||
player->powers[pw_underwater] = 0;
|
||||
player->pflags &= ~(PF_SPINDOWN|PF_JUMPDOWN|PF_ATTACKDOWN|PF_SHIELDDOWN|PF_STARTDASH|PF_GLIDING|PF_STARTJUMP|PF_JUMPED|PF_NOJUMPDAMAGE|PF_THOKKED|PF_SPINNING|PF_DRILLING|PF_TRANSFERTOCLOSEST);
|
||||
player->pflags &= ~(PF_SPINDOWN|PF_JUMPDOWN|PF_ATTACKDOWN|PF_STARTDASH|PF_GLIDING|PF_STARTJUMP|PF_JUMPED|PF_NOJUMPDAMAGE|PF_THOKKED|PF_SPINNING|PF_DRILLING|PF_TRANSFERTOCLOSEST);
|
||||
player->secondjump = 0;
|
||||
player->homing = 0;
|
||||
player->climbing = 0;
|
||||
|
@ -802,7 +802,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
|||
if (mapheaderinfo[gamemap-1]->nightstimer[newmare] > 0)
|
||||
nighttime = mapheaderinfo[gamemap-1]->nightstimer[newmare];
|
||||
|
||||
player->pflags &= ~(PF_SPINDOWN|PF_JUMPDOWN|PF_ATTACKDOWN|PF_SHIELDDOWN|PF_STARTDASH|PF_GLIDING|PF_JUMPED|PF_NOJUMPDAMAGE|PF_THOKKED|PF_SHIELDABILITY|PF_SPINNING|PF_DRILLING);
|
||||
player->pflags &= ~(PF_SPINDOWN|PF_JUMPDOWN|PF_ATTACKDOWN|PF_STARTDASH|PF_GLIDING|PF_JUMPED|PF_NOJUMPDAMAGE|PF_THOKKED|PF_SHIELDABILITY|PF_SPINNING|PF_DRILLING);
|
||||
player->homing = 0;
|
||||
player->mo->fuse = 0;
|
||||
player->speed = 0;
|
||||
|
@ -1362,6 +1362,8 @@ void P_DoSuperTransformation(player_t *player, boolean giverings)
|
|||
if (!(mapheaderinfo[gamemap-1]->levelflags & LF_NOSSMUSIC) && P_IsLocalPlayer(player))
|
||||
P_PlayJingle(player, JT_SUPER);
|
||||
|
||||
S_StartSound(NULL, sfx_supert); //let all players hear it -mattw_cfi
|
||||
|
||||
player->mo->momx = player->mo->momy = player->mo->momz = player->cmomx = player->cmomy = player->rmomx = player->rmomy = 0;
|
||||
|
||||
// Transformation animation
|
||||
|
@ -1378,11 +1380,8 @@ void P_DoSuperTransformation(player_t *player, boolean giverings)
|
|||
player->powers[pw_sneakers] = 0;
|
||||
}
|
||||
|
||||
if (G_CoopGametype())
|
||||
S_StartSound(player->mo, sfx_supert); //only hear it near yourself in co-op
|
||||
else
|
||||
if (!G_CoopGametype())
|
||||
{
|
||||
S_StartSound(NULL, sfx_supert); //let all players hear it -mattw_cfi
|
||||
HU_SetCEchoFlags(0);
|
||||
HU_SetCEchoDuration(5);
|
||||
HU_DoCEcho(va("%s\\is now super.\\\\\\\\", player_names[player-players]));
|
||||
|
@ -1417,7 +1416,7 @@ void P_DoSuperDetransformation(player_t *player)
|
|||
if (!G_CoopGametype())
|
||||
player->powers[pw_flashing] = flashingtics-1;
|
||||
|
||||
if (player->mo->sprite2 & SPR2F_SUPER)
|
||||
if (player->mo->sprite2 & FF_SPR2SUPER)
|
||||
P_SetMobjState(player->mo, player->mo->state-states);
|
||||
|
||||
// Inform the netgame that the champion has fallen in the heat of battle.
|
||||
|
@ -4211,7 +4210,6 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
if (player->pflags & PF_ATTACKDOWN || player->climbing || (G_TagGametype() && !(player->pflags & PF_TAGIT)))
|
||||
return;
|
||||
|
||||
// Fire a fireball if we have the Fire Flower powerup!
|
||||
if (((player->powers[pw_shield] & SH_STACK) == SH_FIREFLOWER) && !(player->weapondelay))
|
||||
{
|
||||
player->pflags |= PF_ATTACKDOWN;
|
||||
|
@ -4223,7 +4221,6 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
return;
|
||||
}
|
||||
|
||||
// No ringslinging outside of ringslinger!
|
||||
if (!G_RingSlingerGametype() || player->weapondelay)
|
||||
return;
|
||||
|
||||
|
@ -4402,7 +4399,34 @@ static void P_DoSuperStuff(player_t *player)
|
|||
// If you're super and not Sonic, de-superize!
|
||||
if (!(ALL7EMERALDS(emeralds) && player->charflags & SF_SUPER))
|
||||
{
|
||||
P_DoSuperDetransformation(player);
|
||||
player->powers[pw_super] = 0;
|
||||
P_SetMobjState(player->mo, S_PLAY_STND);
|
||||
if (P_IsLocalPlayer(player))
|
||||
{
|
||||
music_stack_noposition = true; // HACK: Do not reposition next music
|
||||
music_stack_fadeout = MUSICRATE/2; // HACK: Fade out current music
|
||||
}
|
||||
P_RestoreMusic(player);
|
||||
P_SpawnShieldOrb(player);
|
||||
|
||||
// Restore color
|
||||
if ((player->powers[pw_shield] & SH_STACK) == SH_FIREFLOWER)
|
||||
{
|
||||
player->mo->color = SKINCOLOR_WHITE;
|
||||
G_GhostAddColor(GHC_FIREFLOWER);
|
||||
}
|
||||
else
|
||||
{
|
||||
player->mo->color = P_GetPlayerColor(player);
|
||||
G_GhostAddColor(GHC_NORMAL);
|
||||
}
|
||||
|
||||
if (!G_CoopGametype())
|
||||
{
|
||||
HU_SetCEchoFlags(0);
|
||||
HU_SetCEchoDuration(5);
|
||||
HU_DoCEcho(va("%s\\is no longer super.\\\\\\\\", player_names[player-players]));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4429,31 +4453,28 @@ static void P_DoSuperStuff(player_t *player)
|
|||
|
||||
// Ran out of rings while super!
|
||||
if (player->rings <= 0 || player->exiting)
|
||||
{
|
||||
P_DoSuperDetransformation(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// P_SuperReady
|
||||
//
|
||||
// Returns true if player is ready to transform or detransform
|
||||
// Returns true if player is ready to turn super, duh
|
||||
//
|
||||
boolean P_SuperReady(player_t *player)
|
||||
{
|
||||
if (player->mo
|
||||
&& (player->rings >= 50)
|
||||
&& ALL7EMERALDS(emeralds)
|
||||
if (!player->powers[pw_super]
|
||||
&& !player->powers[pw_invulnerability]
|
||||
&& !player->powers[pw_tailsfly]
|
||||
&& (player->charflags & SF_SUPER)
|
||||
&& (player->pflags & PF_JUMPED)
|
||||
&& !player->powers[pw_super]
|
||||
&& !player->powers[pw_invulnerability]
|
||||
&& !(player->powers[pw_shield] & SH_NOSTACK)
|
||||
&& !player->powers[pw_tailsfly]
|
||||
&& !player->powers[pw_carry]
|
||||
&& !P_PlayerInPain(player)
|
||||
&& !player->climbing
|
||||
&& !(player->pflags & (PF_JUMPSTASIS|PF_THOKKED|PF_STARTDASH|PF_GLIDING|PF_SLIDING|PF_SHIELDABILITY))
|
||||
&& !(maptol & TOL_NIGHTS))
|
||||
&& !(maptol & TOL_NIGHTS)
|
||||
&& ALL7EMERALDS(emeralds)
|
||||
&& (player->rings >= 50))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -5158,7 +5179,7 @@ static boolean P_PlayerShieldThink(player_t *player, ticcmd_t *cmd, mobj_t *lock
|
|||
{
|
||||
mobj_t *lockonshield = NULL;
|
||||
|
||||
if ((player->powers[pw_shield] & SH_NOSTACK) && !player->powers[pw_super] && !(player->pflags & PF_SHIELDDOWN)
|
||||
if ((player->powers[pw_shield] & SH_NOSTACK) && !player->powers[pw_super] && !(player->pflags & PF_SPINDOWN)
|
||||
&& ((!(player->pflags & PF_THOKKED) || (((player->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP || (player->powers[pw_shield] & SH_NOSTACK) == SH_ATTRACT) && player->secondjump == UINT8_MAX) ))) // thokked is optional if you're bubblewrapped / 3dblasted
|
||||
{
|
||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_ATTRACT && !(player->charflags & SF_NOSHIELDABILITY))
|
||||
|
@ -5188,7 +5209,7 @@ static boolean P_PlayerShieldThink(player_t *player, ticcmd_t *cmd, mobj_t *lock
|
|||
}
|
||||
}
|
||||
}
|
||||
if ((!(player->charflags & SF_NOSHIELDABILITY)) && (cmd->buttons & BT_SHIELD && !LUA_HookPlayer(player, HOOK(ShieldSpecial)))) // Shield button effects
|
||||
if ((!(player->charflags & SF_NOSHIELDABILITY)) && (cmd->buttons & BT_SPIN && !LUA_HookPlayer(player, HOOK(ShieldSpecial)))) // Spin button effects
|
||||
{
|
||||
// Force stop
|
||||
if ((player->powers[pw_shield] & ~(SH_FORCEHP|SH_STACK)) == SH_FORCE)
|
||||
|
@ -5277,7 +5298,7 @@ static boolean P_PlayerShieldThink(player_t *player, ticcmd_t *cmd, mobj_t *lock
|
|||
//
|
||||
// Handles player jumping
|
||||
//
|
||||
static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd, boolean spinshieldhack)
|
||||
static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
|
||||
{
|
||||
mobj_t *lockonthok = NULL, *visual = NULL;
|
||||
|
||||
|
@ -5310,12 +5331,12 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd, boolean spinshieldhac
|
|||
;
|
||||
else if (P_PlayerShieldThink(player, cmd, lockonthok, visual))
|
||||
;
|
||||
else if (cmd->buttons & BT_SPIN)
|
||||
else if ((cmd->buttons & BT_SPIN))
|
||||
{
|
||||
if (spinshieldhack && !(player->pflags & PF_SPINDOWN) && P_SuperReady(player))
|
||||
if (!(player->pflags & PF_SPINDOWN) && P_SuperReady(player))
|
||||
{
|
||||
// If you're using two-button play, can turn Super and aren't already,
|
||||
// and you don't have a shield, then turn Super!
|
||||
// If you can turn super and aren't already,
|
||||
// and you don't have a shield, do it!
|
||||
P_DoSuperTransformation(player, false);
|
||||
}
|
||||
else if (!LUA_HookPlayer(player, HOOK(JumpSpinSpecial)))
|
||||
|
@ -5418,6 +5439,12 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd, boolean spinshieldhac
|
|||
}
|
||||
else if (player->pflags & PF_SLIDING || ((gametyperules & GTR_TEAMFLAGS) && player->gotflag) || player->pflags & PF_SHIELDABILITY)
|
||||
;
|
||||
/*else if (P_SuperReady(player))
|
||||
{
|
||||
// If you can turn super and aren't already,
|
||||
// and you don't have a shield, do it!
|
||||
P_DoSuperTransformation(player, false);
|
||||
}*/
|
||||
else if (player->pflags & PF_JUMPED)
|
||||
{
|
||||
if (!LUA_HookPlayer(player, HOOK(AbilitySpecial)))
|
||||
|
@ -8070,7 +8097,6 @@ void P_MovePlayer(player_t *player)
|
|||
{
|
||||
ticcmd_t *cmd;
|
||||
INT32 i;
|
||||
boolean spinshieldhack = false; // Hack: Is Spin and Shield bound to the same button (pressed on the same tic)?
|
||||
|
||||
fixed_t runspd;
|
||||
|
||||
|
@ -8692,13 +8718,10 @@ void P_MovePlayer(player_t *player)
|
|||
&& !(player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER)))
|
||||
P_ElementalFire(player, false);
|
||||
|
||||
if ((cmd->buttons & (BT_SPIN|BT_SHIELD)) == (BT_SPIN|BT_SHIELD) && !(player->pflags & (PF_SPINDOWN|PF_SHIELDDOWN)))
|
||||
spinshieldhack = true; // Spin and Shield is bound to the same button (pressed on the same tic), so enable two-button play (Jump and Spin+Shield)
|
||||
|
||||
P_DoSpinAbility(player, cmd);
|
||||
|
||||
// jumping
|
||||
P_DoJumpStuff(player, cmd, spinshieldhack);
|
||||
P_DoJumpStuff(player, cmd);
|
||||
|
||||
// If you're not spinning, you'd better not be spindashing!
|
||||
if (!(player->pflags & PF_SPINNING) && player->powers[pw_carry] != CR_NIGHTSMODE)
|
||||
|
@ -8786,21 +8809,10 @@ void P_MovePlayer(player_t *player)
|
|||
P_PlayerFlagBurst(player, true);
|
||||
}
|
||||
|
||||
// Check for fire and shield buttons
|
||||
// check for fire
|
||||
if (!player->exiting)
|
||||
{
|
||||
P_DoFiring(player, cmd);
|
||||
|
||||
// Shield button behavior
|
||||
// Check P_PlayerShieldThink for actual shields!
|
||||
if ((cmd->buttons & BT_SHIELD) && !(player->pflags & PF_SHIELDDOWN) && !spinshieldhack)
|
||||
{
|
||||
// Transform into super if we can!
|
||||
if (P_SuperReady(player))
|
||||
P_DoSuperTransformation(player, false);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
boolean atspinheight = false;
|
||||
fixed_t oldheight = player->mo->height;
|
||||
|
@ -11540,6 +11552,9 @@ void P_DoMetalJetFume(player_t *player, mobj_t *fume)
|
|||
return;
|
||||
}
|
||||
|
||||
if (player->skidtime) // Rotate during metal sonic's new skid animation
|
||||
angle += ANGLE_90;
|
||||
|
||||
if (underwater) // No fume underwater; spawn bubbles instead!
|
||||
{
|
||||
fume->movedir += FixedAngle(FixedDiv(2 * player->speed, 3 * mo->scale));
|
||||
|
@ -12056,7 +12071,7 @@ void P_PlayerThink(player_t *player)
|
|||
ticmiss++;
|
||||
|
||||
P_DoRopeHang(player);
|
||||
P_DoJumpStuff(player, &player->cmd, false); // P_DoRopeHang would set PF_SPINDOWN, so no spinshieldhack here
|
||||
P_DoJumpStuff(player, &player->cmd);
|
||||
}
|
||||
else //if (player->powers[pw_carry] == CR_ZOOMTUBE)
|
||||
{
|
||||
|
@ -12330,12 +12345,6 @@ void P_PlayerThink(player_t *player)
|
|||
player->pflags &= ~PF_SPINDOWN;
|
||||
}
|
||||
|
||||
// Check for Shield button
|
||||
if (cmd->buttons & BT_SHIELD)
|
||||
player->pflags |= PF_SHIELDDOWN;
|
||||
else
|
||||
player->pflags &= ~PF_SHIELDDOWN;
|
||||
|
||||
// IF PLAYER NOT HERE THEN FLASH END IF
|
||||
if (player->quittime && player->powers[pw_flashing] < flashingtics - 1
|
||||
&& !(G_TagGametype() && !(player->pflags & PF_TAGIT)) && !player->gotflag)
|
||||
|
|
|
@ -968,7 +968,9 @@ UINT8 *R_GetTranslationForThing(mobj_t *mobj, skincolornum_t color, UINT16 trans
|
|||
if (color != SKINCOLOR_NONE)
|
||||
{
|
||||
// New colormap stuff for skins Tails 06-07-2002
|
||||
if (mobj->colorized)
|
||||
if ((mobj->state-states == S_METALSONIC_DASH || mobj->state-states == S_METALSONIC_BOUNCE) && (((leveltime/2) & 1))) // Metal boss doing attack
|
||||
skinnum = TC_DASHMODE;
|
||||
else if (mobj->colorized)
|
||||
skinnum = TC_RAINBOW;
|
||||
else if (mobj->player && mobj->player->dashmode >= DASHMODE_THRESHOLD
|
||||
&& (mobj->player->charflags & SF_DASHMODE)
|
||||
|
|
|
@ -284,8 +284,6 @@ sfxinfo_t S_sfx[NUMSFX] =
|
|||
{"mario8", false, 48, SF_X4AWAYSOUND, -1, NULL, 0, -1, -1, LUMPERROR, "Hurt"},
|
||||
{"mario9", true, 120, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Emerging power-up"},
|
||||
{"marioa", true, 192, 0, -1, NULL, 0, -1, -1, LUMPERROR, "One-up"},
|
||||
{"mariob", true, 127, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Spring"},
|
||||
{"marioc", true, 127, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Crumbling"},
|
||||
{"thwomp", true, 127, SF_X4AWAYSOUND, -1, NULL, 0, -1, -1, LUMPERROR, "Thwomp"},
|
||||
|
||||
// Black Eggman
|
||||
|
|
|
@ -332,8 +332,6 @@ typedef enum
|
|||
sfx_mario8,
|
||||
sfx_mario9,
|
||||
sfx_marioa,
|
||||
sfx_mariob,
|
||||
sfx_marioc,
|
||||
sfx_thwomp,
|
||||
|
||||
// Black Eggman
|
||||
|
|
|
@ -1176,10 +1176,8 @@ static void ST_drawInput(void)
|
|||
V_DrawFill(x+16+(xoffs), y+(yoffs)-offs, 10, 10, col);\
|
||||
V_DrawCharacter(x+16+1+(xoffs), y+1+(yoffs)-offs, hudinfo[HUD_INPUT].f|symb, false)
|
||||
|
||||
drawbutt( 4,-3, BT_JUMP, 'J' );
|
||||
drawbutt(15,-3, BT_SPIN, 'S' );
|
||||
drawbutt(26,-3, BT_SHIELD, '\0'); // Instead of a wide 'J' or 'S', we'll draw a thin "SH" for Shield
|
||||
V_DrawThinString(x+16+26, y+2+(-3)-offs, hudinfo[HUD_LIVES].f, "SH");
|
||||
drawbutt( 4,-3, BT_JUMP, 'J');
|
||||
drawbutt(15,-3, BT_SPIN, 'S');
|
||||
|
||||
V_DrawFill(x+16+4, y+8, 21, 10, hudinfo[HUD_INPUT].f|20); // sundial backing
|
||||
if (stplyr->mo)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#define SRB2VERSION "2.2.14"/* this must be the first line, for cmake !! */
|
||||
#define SRB2VERSION "2.2.15"/* this must be the first line, for cmake !! */
|
||||
|
||||
// The Modification ID; must be obtained from a Master Server Admin ( https://mb.srb2.org/members/?key=ms_admin ).
|
||||
// DO NOT try to set this otherwise, or your modification will be unplayable through the Master Server.
|
||||
|
@ -9,7 +9,7 @@
|
|||
// it's only for detection of the version the player is using so the MS can alert them of an update.
|
||||
// Only set it higher, not lower, obviously.
|
||||
// Note that we use this to help keep internal testing in check; this is why v2.2.0 is not version "1".
|
||||
#define MODVERSION 55
|
||||
#define MODVERSION 56
|
||||
|
||||
// Define this as a prerelease version suffix (pre#, RC#)
|
||||
//#define BETAVERSION "pre4"
|
||||
|
|
|
@ -581,7 +581,7 @@ void Y_IntermissionDrawer(void)
|
|||
if (LUA_HudEnabled(hud_intermissiontitletext))
|
||||
{
|
||||
const char *ringtext = "\x82" "50 rings, no shield";
|
||||
const char *tut1text = "\x82" "press " "\x80" "shield";
|
||||
const char *tut1text = "\x82" "press " "\x80" "spin";
|
||||
const char *tut2text = "\x82" "mid-" "\x80" "jump";
|
||||
ttheight = 8;
|
||||
V_DrawLevelTitle(data.spec.passedx1 + xoffset1, ttheight, 0, data.spec.passed1);
|
||||
|
|
Loading…
Reference in a new issue