Bit of a random one today, but the branch approaches completion...

* Bomb sphere! Paraloopable hazard. Replaces MT_SPECIALSPIKEBALL.
* Blueberry bushes, both normal and Xmas, from patch.dta.
* BSZ tulips, also from patch.dta!
* Frozen Hillside badniks - Penguinator and Pophat.
* Frozen Hillside ice decoration!
* Fixed some big bugs with the DSZ light beams.
* Made multi-mare special stages work, in a troll way - the Chaos Emerald disappears in a puff of smoke, and the Spinbobert laughter sound plays... >:3c
* Reverted the mobjtype number changes from the source SOC/Lua, which we can do later when doing a final pass of the levels.
* State optimisation.
* Serious cruft-removal of the NiGHTS drone thinker.
* Fix the issues where the player wouldn't curl into jump in waterslides or dropping off rope-hangs.
* Tweak NiGHTS player flashing.
* Add text colour support to the titlecard font.
* Use that to make the PRESS SPIN\nMID-JUMP thing when you get all Chaos Emeralds use the titlecard font for readability.
* Fix the GOT ALL EMERALDS page not lasting the correct, extended amount of time.
* Fix that thing where flying mid-spin didn't enact autobrake.
* Modify graymap a little on Sryder's suggestion.
* [COMPLETELY UNRELATED] fix that thing where the addons menu will fail on files/paths with spaces in [/COMPLETELY UNRELATED]
This commit is contained in:
toaster 2018-06-05 17:22:28 +01:00
parent 6e07631cc9
commit 3725203bcd
16 changed files with 656 additions and 345 deletions

View File

@ -312,7 +312,7 @@ static void CON_SetupColormaps(void)
colset(lgreenmap, 97, 98, 106);
colset(bluemap, 146, 147, 155);
colset(redmap, 210, 32, 39);
colset(graymap, 8, 10, 15);
colset(graymap, 6, 8, 14);
colset(orangemap, 51, 52, 57);
colset(skymap, 129, 130, 133);
colset(purplemap, 160, 161, 163);

View File

@ -3853,13 +3853,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_UNIDUS_BALL",
// Boss Explosion
"S_BPLD1",
"S_BPLD2",
"S_BPLD3",
"S_BPLD4",
"S_BPLD5",
"S_BPLD6",
"S_BPLD7",
"S_BOSSEXPLODE",
// S3&K Boss Explosion
"S_SONIC3KBOSSEXPLOSION1",
@ -4368,6 +4362,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_BLUESPHEREBONUS",
"S_BLUESPHERESPARK",
// Bomb Sphere
"S_BOMBSPHERE1",
"S_BOMBSPHERE2",
"S_BOMBSPHERE3",
"S_BOMBSPHERE4",
// NiGHTS Chip
"S_NIGHTSCHIP",
"S_NIGHTSCHIPBONUS",
@ -4720,18 +4720,14 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_ARROWBONK",
// Trapgoyle Demon fire
"S_DEMONFIRE1",
"S_DEMONFIRE2",
"S_DEMONFIRE3",
"S_DEMONFIRE4",
"S_DEMONFIRE5",
"S_DEMONFIRE6",
"S_DEMONFIRE",
// GFZ flowers
"S_GFZFLOWERA",
"S_GFZFLOWERB",
"S_GFZFLOWERC",
"S_BLUEBERRYBUSH",
"S_BERRYBUSH",
"S_BUSH",
@ -5016,8 +5012,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_LAMPPOST2", // with snow
"S_HANGSTAR",
// Xmas GFZ bushes
"S_XMASBLUEBERRYBUSH",
"S_XMASBERRYBUSH",
"S_XMASBUSH",
// FHZ
"S_FHZICE1",
"S_FHZICE2",
// Halloween Scenery
// Pumpkins
@ -6070,6 +6070,22 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
// Secret badniks and hazards, shhhh
"S_PENGUINATOR_LOOK",
"S_PENGUINATOR_WADDLE1",
"S_PENGUINATOR_WADDLE2",
"S_PENGUINATOR_WADDLE3",
"S_PENGUINATOR_WADDLE4",
"S_PENGUINATOR_SLIDE1",
"S_PENGUINATOR_SLIDE2",
"S_PENGUINATOR_SLIDE3",
"S_PENGUINATOR_SLIDE4",
"S_PENGUINATOR_SLIDE5",
"S_POPHAT_LOOK",
"S_POPHAT_SHOOT1",
"S_POPHAT_SHOOT2",
"S_POPHAT_SHOOT3",
"S_HIVEELEMENTAL_LOOK",
"S_HIVEELEMENTAL_PREPARE1",
"S_HIVEELEMENTAL_PREPARE2",
@ -6344,7 +6360,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
// Collectible Items
"MT_RING",
"MT_FLINGRING", // Lost ring
"MT_BLUESPHERE", // Blue sphere replacement for special stages
"MT_BLUESPHERE", // Blue sphere for special stages
"MT_BOMBSPHERE",
"MT_REDTEAMRING", //Rings collectable by red team.
"MT_BLUETEAMRING", //Rings collectable by blue team.
"MT_TOKEN", // Special Stage Token
@ -6382,7 +6399,6 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_BUBBLES", // Bubble source
"MT_SIGN", // Level end sign
"MT_SPIKEBALL", // Spike Ball
"MT_SPECIALSPIKEBALL",
"MT_SPINFIRE",
"MT_SPIKE",
"MT_WALLSPIKE",
@ -6475,8 +6491,11 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_GFZFLOWER1",
"MT_GFZFLOWER2",
"MT_GFZFLOWER3",
"MT_BLUEBERRYBUSH",
"MT_BERRYBUSH",
"MT_BUSH",
// Trees (both GFZ and misc)
"MT_GFZTREE",
"MT_GFZBERRYTREE",
@ -6601,8 +6620,12 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_LAMPPOST2", // with snow
"MT_HANGSTAR",
// Xmas GFZ bushes
"MT_XMASBLUEBERRYBUSH",
"MT_XMASBERRYBUSH",
"MT_XMASBUSH",
// FHZ
"MT_FHZICE1",
"MT_FHZICE2",
// Halloween Scenery
// Pumpkins
@ -6814,6 +6837,10 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_SHLEEP", // almost-decorative sleeping enemy
// Secret badniks and hazards, shhhh
"MT_PENGUINATOR",
"MT_POPHAT",
"MT_POPSHOT",
"MT_HIVEELEMENTAL",
"MT_BUMBLEBORE",

View File

@ -294,6 +294,7 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_FWR4
&lspr[NOLIGHT], // SPR_BUS1
&lspr[NOLIGHT], // SPR_BUS2
&lspr[NOLIGHT], // SPR_BUS3
// Trees (both GFZ and misc)
&lspr[NOLIGHT], // SPR_TRE1
&lspr[NOLIGHT], // SPR_TRE2
@ -357,6 +358,7 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_XMS3
&lspr[NOLIGHT], // SPR_XMS4
&lspr[NOLIGHT], // SPR_XMS5
&lspr[NOLIGHT], // SPR_FHZI
// Halloween Scenery
&lspr[RINGLIGHT_L], // SPR_PUMK
@ -368,7 +370,13 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_BSZ1
&lspr[NOLIGHT], // SPR_BSZ2
&lspr[NOLIGHT], // SPR_BSZ3
&lspr[NOLIGHT], // SPR_BSZ4
//&lspr[NOLIGHT], -- SPR_BSZ4
&lspr[NOLIGHT], // SPR_BST1
&lspr[NOLIGHT], // SPR_BST2
&lspr[NOLIGHT], // SPR_BST3
&lspr[NOLIGHT], // SPR_BST4
&lspr[NOLIGHT], // SPR_BST5
&lspr[NOLIGHT], // SPR_BST6
&lspr[NOLIGHT], // SPR_BSZ5
&lspr[NOLIGHT], // SPR_BSZ6
&lspr[NOLIGHT], // SPR_BSZ7
@ -506,6 +514,8 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_SHLP
// Secret badniks and hazards, shhhh
&lspr[NOLIGHT], // SPR_PENG
&lspr[NOLIGHT], // SPR_POPH,
&lspr[NOLIGHT], // SPR_HIVE
&lspr[NOLIGHT], // SPR_BUMB,
&lspr[NOLIGHT], // SPR_BBUZ

View File

@ -183,6 +183,7 @@ char sprnames[NUMSPRITES + 1][5] =
"FWR4",
"BUS1", // GFZ Bush w/ berries
"BUS2", // GFZ Bush w/o berries
"BUS3", // GFZ Bush w/ BLUE berries
// Trees (both GFZ and misc)
"TRE1", // GFZ
"TRE2", // Checker
@ -251,6 +252,7 @@ char sprnames[NUMSPRITES + 1][5] =
"XMS3", // Snowman
"XMS4", // Lamppost
"XMS5", // Hanging Star
"FHZI", // FHZ ice
// Halloween Scenery
"PUMK", // Pumpkins
@ -262,7 +264,13 @@ char sprnames[NUMSPRITES + 1][5] =
"BSZ1", // Tall flowers
"BSZ2", // Medium flowers
"BSZ3", // Small flowers
"BSZ4", // Tulip
//"BSZ4", -- Tulips
"BST1", // Red tulip
"BST2", // Purple tulip
"BST3", // Blue tulip
"BST4", // Cyan tulip
"BST5", // Yellow tulip
"BST6", // Orange tulip
"BSZ5", // Cluster of Tulips
"BSZ6", // Bush
"BSZ7", // Vine
@ -400,6 +408,8 @@ char sprnames[NUMSPRITES + 1][5] =
"SHLP", // Shleep
// Secret badniks and hazards, shhhh
"PENG",
"POPH",
"HIVE",
"BUMB",
"BBUZ",
@ -1083,13 +1093,7 @@ state_t states[NUMSTATES] =
{SPR_UNID, 1, 1, {A_UnidusBall}, 1, 0, S_UNIDUS_BALL}, // S_UNIDUS_BALL
// Boss Explosion
{SPR_BOM2, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BPLD2}, // S_BPLD1
{SPR_BOM2, FF_FULLBRIGHT|1, 5, {NULL}, 0, 0, S_BPLD3}, // S_BPLD2
{SPR_BOM2, FF_FULLBRIGHT|2, 5, {NULL}, 0, 0, S_BPLD4}, // S_BPLD3
{SPR_BOM2, FF_FULLBRIGHT|3, 5, {NULL}, 0, 0, S_BPLD5}, // S_BPLD4
{SPR_BOM2, FF_FULLBRIGHT|4, 5, {NULL}, 0, 0, S_BPLD6}, // S_BPLD5
{SPR_BOM2, FF_FULLBRIGHT|5, 5, {NULL}, 0, 0, S_BPLD7}, // S_BPLD6
{SPR_BOM2, FF_FULLBRIGHT|6, 5, {NULL}, 0, 0, S_NULL}, // S_BPLD7
{SPR_BOM2, FF_FULLBRIGHT|FF_ANIMATE, (5*7), {NULL}, 6, 5, S_NULL}, // S_BOSSEXPLODE
// S3&K Boss Explosion
{SPR_BOM3, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_SONIC3KBOSSEXPLOSION2}, // S_SONIC3KBOSSEXPLOSION1
@ -1597,9 +1601,15 @@ state_t states[NUMSTATES] =
// Blue Sphere for special stages
{SPR_SPHR, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_BLUESPHERE
{SPR_SPHR, FF_FULLBRIGHT|FF_RANDOMANIM|FF_ANIMATE, -1, {NULL}, 1, 4, S_NULL}, // S_BLUESPHEREBONUS
{SPR_SPHR, FF_FULLBRIGHT|FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 1, 4, S_NULL}, // S_BLUESPHEREBONUS
{SPR_SPHR, 0, 20, {NULL}, 0, 0, S_NULL}, // S_BLUESPHERESPARK
// Bomb Sphere
{SPR_SPHR, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_BOMBSPHERE2}, // S_BOMBSPHERE1
{SPR_SPHR, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_BOMBSPHERE3}, // S_BOMBSPHERE2
{SPR_SPHR, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_BOMBSPHERE4}, // S_BOMBSPHERE3
{SPR_SPHR, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_BOMBSPHERE1}, // S_BOMBSPHERE4
// NiGHTS Chip
{SPR_NCHP, FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 15, 2, S_NULL}, // S_NIGHTSCHIP
{SPR_NCHP, FF_FULLBRIGHT|FF_ANIMATE|16, -1, {NULL}, 15, 2, S_NULL}, // S_NIGHTSCHIPBONUS
@ -1946,20 +1956,16 @@ state_t states[NUMSTATES] =
{SPR_AROW, 0, -1, {NULL}, 0, 0, S_NULL}, // S_ARROW
{SPR_AROW, FF_ANIMATE, TICRATE, {A_ArrowBonks}, 7, 2, S_NULL}, // S_ARROWBONK
{SPR_CFIR, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_DEMONFIRE2}, // S_DEMONFIRE1
{SPR_CFIR, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_DEMONFIRE3}, // S_DEMONFIRE2
{SPR_CFIR, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_DEMONFIRE4}, // S_DEMONFIRE3
{SPR_CFIR, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_DEMONFIRE5}, // S_DEMONFIRE4
{SPR_CFIR, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_DEMONFIRE6}, // S_DEMONFIRE5
{SPR_CFIR, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_DEMONFIRE1}, // S_DEMONFIRE6
{SPR_CFIR, FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 5, 2, S_NULL}, // S_DEMONFIRE
// GFZ flowers
{SPR_FWR1, FF_ANIMATE, -1, {NULL}, 7, 3, S_NULL}, // S_GFZFLOWERA
{SPR_FWR2, FF_ANIMATE, -1, {NULL}, 19, 3, S_NULL}, // S_GFZFLOWERB
{SPR_FWR3, FF_ANIMATE, -1, {NULL}, 11, 4, S_NULL}, // S_GFZFLOWERC
{SPR_BUS1, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BERRYBUSH
{SPR_BUS2, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BUSH
{SPR_BUS3, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BLUEBERRYBUSH
{SPR_BUS1, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BERRYBUSH
{SPR_BUS2, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BUSH
// Trees
{SPR_TRE1, 0, -1, {NULL}, 0, 0, S_NULL}, // S_GFZTREE
@ -2257,8 +2263,12 @@ state_t states[NUMSTATES] =
{SPR_XMS4, 1, -1, {NULL}, 0, 0, S_NULL}, // S_LAMPPOST2
{SPR_XMS5, 0, -1, {NULL}, 0, 0, S_NULL}, // S_HANGSTAR
// Xmas GFZ bushes
{SPR_BUS3, 1, -1, {NULL}, 0, 0, S_NULL}, // S_XMASBLUEBERRYBUSH
{SPR_BUS1, 1, -1, {NULL}, 0, 0, S_NULL}, // S_XMASBERRYBUSH
{SPR_BUS2, 1, -1, {NULL}, 0, 0, S_NULL}, // S_XMASBUSH
// FHZ
{SPR_FHZI, 0, -1, {NULL}, 0, 0, S_NULL}, // S_FHZICE1
{SPR_FHZI, 1, -1, {NULL}, 0, 0, S_NULL}, // S_FHZICE2
// Halloween Scenery
// Pumpkins
@ -2324,12 +2334,12 @@ state_t states[NUMSTATES] =
{SPR_BSZ3, 3, -1, {NULL}, 0, 0, S_NULL}, // S_BSZSHORTFLOWER_CYAN
{SPR_BSZ3, 4, -1, {NULL}, 0, 0, S_NULL}, // S_BSZSHORTFLOWER_YELLOW
{SPR_BSZ3, 5, -1, {NULL}, 0, 0, S_NULL}, // S_BSZSHORTFLOWER_ORANGE
{SPR_BSZ4, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BSZTULIP_RED
{SPR_BSZ4, 1, -1, {NULL}, 0, 0, S_NULL}, // S_BSZTULIP_PURPLE
{SPR_BSZ4, 2, -1, {NULL}, 0, 0, S_NULL}, // S_BSZTULIP_BLUE
{SPR_BSZ4, 3, -1, {NULL}, 0, 0, S_NULL}, // S_BSZTULIP_CYAN
{SPR_BSZ4, 4, -1, {NULL}, 0, 0, S_NULL}, // S_BSZTULIP_YELLOW
{SPR_BSZ4, 5, -1, {NULL}, 0, 0, S_NULL}, // S_BSZTULIP_ORANGE
{SPR_BST1, FF_ANIMATE, -1, {NULL}, 11, 4, S_NULL}, // S_BSZTULIP_RED
{SPR_BST2, FF_ANIMATE, -1, {NULL}, 11, 4, S_NULL}, // S_BSZTULIP_PURPLE
{SPR_BST3, FF_ANIMATE, -1, {NULL}, 11, 4, S_NULL}, // S_BSZTULIP_BLUE
{SPR_BST4, FF_ANIMATE, -1, {NULL}, 11, 4, S_NULL}, // S_BSZTULIP_CYAN
{SPR_BST5, FF_ANIMATE, -1, {NULL}, 11, 4, S_NULL}, // S_BSZTULIP_YELLOW
{SPR_BST6, FF_ANIMATE, -1, {NULL}, 11, 4, S_NULL}, // S_BSZTULIP_ORANGE
{SPR_BSZ5, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BSZCLUSTER_RED
{SPR_BSZ5, 1, -1, {NULL}, 0, 0, S_NULL}, // S_BSZCLUSTER_PURPLE
{SPR_BSZ5, 2, -1, {NULL}, 0, 0, S_NULL}, // S_BSZCLUSTER_BLUE
@ -3366,6 +3376,22 @@ state_t states[NUMSTATES] =
{SPR_SHLP, 3, 400, {A_SetObjectFlags}, MF_SLIDEME|MF_ENEMY|MF_BOUNCE|MF_NOCLIP|MF_NOCLIPHEIGHT, 0, S_NULL}, // S_SHLEEPBOUNCE3
// Secret badniks and hazards, shhhh
{SPR_PENG, 0, 2, {A_Look}, 0, 0, S_PENGUINATOR_LOOK}, // S_PENGUINATOR_LOOK
{SPR_PENG, 0, 2, {A_Chase}, 0, 0, S_PENGUINATOR_WADDLE2}, // S_PENGUINATOR_WADDLE1
{SPR_PENG, 1, 2, {A_Chase}, 0, 0, S_PENGUINATOR_WADDLE3}, // S_PENGUINATOR_WADDLE2
{SPR_PENG, 0, 2, {A_Chase}, 0, 0, S_PENGUINATOR_WADDLE4}, // S_PENGUINATOR_WADDLE3
{SPR_PENG, 2, 2, {A_Chase}, 0, 0, S_PENGUINATOR_WADDLE1}, // S_PENGUINATOR_WADDLE4
{SPR_PENG, 0, 0, {A_FaceTarget}, 0, 0, S_PENGUINATOR_SLIDE2}, // S_PENGUINATOR_SLIDE1
{SPR_PENG, 3, 5, {A_BunnyHop}, 4, 10, S_PENGUINATOR_SLIDE3}, // S_PENGUINATOR_SLIDE2
{SPR_PENG, 4, 90, {A_PlayAttackSound}, 0, 0, S_PENGUINATOR_SLIDE4}, // S_PENGUINATOR_SLIDE3
{SPR_PENG, 3, 5, {A_Thrust}, 0, 1, S_PENGUINATOR_SLIDE5}, // S_PENGUINATOR_SLIDE4
{SPR_PENG, 0, 5, {A_FaceTarget}, 0, 0, S_PENGUINATOR_LOOK}, // S_PENGUINATOR_SLIDE5
{SPR_POPH, 0, 2, {A_Look}, (2048<<16)|1, 0, S_POPHAT_LOOK}, // S_POPHAT_LOOK
{SPR_POPH, 1, 2, {A_LobShot}, MT_POPSHOT, (70<<16)|60, S_POPHAT_SHOOT2}, // S_POPHAT_SHOOT1
{SPR_POPH, 2, 1, {NULL}, 0, 0, S_POPHAT_SHOOT3}, // S_POPHAT_SHOOT2
{SPR_POPH, 0, 57, {NULL}, 0, 0, S_POPHAT_LOOK}, // S_POPHAT_SHOOT3
{SPR_HIVE, 0, 5, {A_Look}, 1, 1, S_HIVEELEMENTAL_LOOK}, // S_HIVEELEMENTAL_LOOK
{SPR_HIVE, 0, 14, {A_PlaySound}, sfx_s3k76, 1, S_HIVEELEMENTAL_PREPARE2}, // S_HIVEELEMENTAL_PREPARE1
{SPR_HIVE, 0, 6, {A_PlaySound}, sfx_s3k8c, 1, S_HIVEELEMENTAL_SHOOT1}, // S_HIVEELEMENTAL_PREPARE2
@ -3513,22 +3539,22 @@ state_t states[NUMSTATES] =
{SPR_NULL, 0, 1, {A_RockSpawn}, 0, 0, S_ROCKSPAWN}, // S_ROCKSPAWN
{SPR_ROIA, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEA}, // S_ROCKCRUMBLEA
{SPR_ROIB, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEB}, // S_ROCKCRUMBLEB
{SPR_ROIC, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEC}, // S_ROCKCRUMBLEC
{SPR_ROID, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLED}, // S_ROCKCRUMBLED
{SPR_ROIE, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEE}, // S_ROCKCRUMBLEE
{SPR_ROIF, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEF}, // S_ROCKCRUMBLEF
{SPR_ROIG, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEG}, // S_ROCKCRUMBLEG
{SPR_ROIH, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEH}, // S_ROCKCRUMBLEH
{SPR_ROII, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEI}, // S_ROCKCRUMBLEI
{SPR_ROIJ, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEJ}, // S_ROCKCRUMBLEJ
{SPR_ROIK, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEK}, // S_ROCKCRUMBLEK
{SPR_ROIL, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEL}, // S_ROCKCRUMBLEL
{SPR_ROIM, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEM}, // S_ROCKCRUMBLEM
{SPR_ROIN, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEN}, // S_ROCKCRUMBLEN
{SPR_ROIO, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEO}, // S_ROCKCRUMBLEO
{SPR_ROIP, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_ROCKCRUMBLEP}, // S_ROCKCRUMBLEP
{SPR_ROIA, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEA
{SPR_ROIB, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEB
{SPR_ROIC, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEC
{SPR_ROID, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLED
{SPR_ROIE, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEE
{SPR_ROIF, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEF
{SPR_ROIG, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEG
{SPR_ROIH, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEH
{SPR_ROII, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEI
{SPR_ROIJ, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEJ
{SPR_ROIK, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEK
{SPR_ROIL, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEL
{SPR_ROIM, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEM
{SPR_ROIN, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEN
{SPR_ROIO, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEO
{SPR_ROIP, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEP
#ifdef SEENAMES
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK
@ -4024,7 +4050,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
},
{ // MT_CRUSHSTACEAN
126, // doomednum
610, //126, // doomednum
S_CRUSHSTACEAN_ROAM1, // spawnstate
1, // spawnhealth
S_NULL, // seestate
@ -4538,7 +4564,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
{ // MT_BOSSEXPLODE
-1, // doomednum
S_BPLD1, // spawnstate
S_BOSSEXPLODE, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
@ -5143,7 +5169,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_BPLD1, // deathstate
S_BOSSEXPLODE, // deathstate
S_NULL, // xdeathstate
sfx_cybdth, // deathsound
48*FRACUNIT, // speed
@ -5278,7 +5304,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_BPLD1, // deathstate
S_BOSSEXPLODE, // deathstate
S_NULL, // xdeathstate
sfx_bexpld, // deathsound
10*FRACUNIT, // speed
@ -5440,7 +5466,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_BPLD1, // deathstate
S_BOSSEXPLODE, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
10*FRACUNIT, // speed
@ -5467,7 +5493,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_BPLD1, // deathstate
S_BOSSEXPLODE, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
10*FRACUNIT, // speed
@ -5779,6 +5805,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_BLUESPHEREBONUS // raisestate
},
{ // MT_BOMBSPHERE
520, // doomednum
S_BOMBSPHERE1, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
MT_NULL, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_BOSSEXPLODE, // deathstate
S_NULL, // xdeathstate
sfx_cybdth, // deathsound
38*FRACUNIT, // speed
16*FRACUNIT, // radius
24*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_SLIDEME|MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags
S_NULL // raisestate
},
{ // MT_REDTEAMRING
308, // doomednum
S_TEAMRING, // spawnstate
@ -6637,33 +6690,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_SPECIALSPIKEBALL
521, // doomednum
S_SPIKEBALL1, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
10*FRACUNIT, // speed
12*FRACUNIT, // radius
24*FRACUNIT, // height
0, // display offset
100, // mass
1, // damage
sfx_None, // activesound
MF_SPECIAL|MF_NOGRAVITY, // flags
S_NULL // raisestate
},
{ // MT_SPINFIRE
-1, // doomednum
S_SPINFIRE1, // spawnstate
@ -8664,7 +8690,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
{ // MT_DEMONFIRE
-1, // doomednum
S_DEMONFIRE1, // spawnstate
S_DEMONFIRE, // spawnstate
1, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
@ -8770,6 +8796,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_BLUEBERRYBUSH
803, // doomednum
S_BLUEBERRYBUSH, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
0, // speed
16*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
S_NULL // raisestate
},
{ // MT_BERRYBUSH
804, // doomednum
S_BERRYBUSH, // spawnstate
@ -9311,7 +9364,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
},
{ // MT_BIGGARGOYLE
1011, // doomednum
1009, // doomednum
S_BIGGARGOYLE, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
@ -9581,7 +9634,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
},
{ // MT_DSZ2STALAGMITE
1009, // doomednum
999, // doomednum
S_DSZ2STALAGMITE, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
@ -9630,7 +9683,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
4, // mass
0, // damage
sfx_None, // activesound
MF_SCENERY|MF_NOBLOCKMAP|MF_NOGRAVITY, // flags
MF_SCENERY|MF_NOBLOCKMAP|MF_NOGRAVITY, // flags
S_NULL // raisestate
},
@ -11524,6 +11577,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_XMASBLUEBERRYBUSH
1859, // doomednum
S_XMASBLUEBERRYBUSH, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
0, // speed
16*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
S_NULL // raisestate
},
{ // MT_XMASBERRYBUSH
1857, // doomednum
S_XMASBERRYBUSH, // spawnstate
@ -11578,6 +11658,60 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_FHZICE1
4028, // doomednum
S_FHZICE1, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
0, // speed
8*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
S_NULL // raisestate
},
{ // MT_FHZICE2
4029, // doomednum
S_FHZICE1, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
0, // speed
8*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
S_NULL // raisestate
},
{ // MT_JACKO1
3520, // doomednum
S_JACKO1, // spawnstate
@ -12387,7 +12521,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
100, // mass
0, // damage
sfx_None, // activesound
MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
S_NULL // raisestate
},
@ -12414,7 +12548,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
100, // mass
0, // damage
sfx_None, // activesound
MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
S_NULL // raisestate
},
@ -12441,7 +12575,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
100, // mass
0, // damage
sfx_None, // activesound
MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
S_NULL // raisestate
},
@ -12468,7 +12602,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
100, // mass
0, // damage
sfx_None, // activesound
MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
S_NULL // raisestate
},
@ -12495,7 +12629,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
100, // mass
0, // damage
sfx_None, // activesound
MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
S_NULL // raisestate
},
@ -12522,7 +12656,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
100, // mass
0, // damage
sfx_None, // activesound
MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
S_NULL // raisestate
},
@ -14457,9 +14591,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
sfx_None, // painsound
S_ORBITEM1, // meleestate
S_ORBIDYA1, // missilestate
S_NULL, // deathstate
S_XPLD1, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
sfx_s3k8a, // deathsound
8, // speed
8*FRACUNIT, // radius
16*FRACUNIT, // height
@ -16454,7 +16588,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
{ // MT_SHLEEP
1601, // doomednum
S_SHLEEP1, // spawnstate
1, // spawnhealth
1, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
0, // reactiontime
@ -16478,6 +16612,87 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_PENGUINATOR
2017, // doomednum
S_PENGUINATOR_LOOK, // spawnstate
1, // spawnhealth
S_PENGUINATOR_WADDLE1, // seestate
sfx_None, // seesound
0, // reactiontime
sfx_s3k8a, // attacksound
S_NULL, // painstate
200, // painchance
sfx_None, // painsound
S_PENGUINATOR_SLIDE1, // meleestate
S_PENGUINATOR_SLIDE1, // missilestate
S_XPLD_FLICKY, // deathstate
S_NULL, // xdeathstate
sfx_pop, // deathsound
5, // speed
24*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
16, // mass
0, // damage
sfx_None, // activesound
MF_SPECIAL|MF_SHOOTABLE|MF_ENEMY|MF_SLIDEME, // flags
S_NULL // raisestate
},
{ // MT_POPHAT
2018, // doomednum -- happy anniversary!
S_POPHAT_LOOK, // spawnstate
1, // spawnhealth
S_POPHAT_SHOOT1, // seestate
sfx_None, // seesound
1, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
200, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_XPLD_FLICKY, // deathstate
S_NULL, // xdeathstate
sfx_pop, // deathsound
0, // speed
24*FRACUNIT, // radius
64*FRACUNIT, // height
0, // display offset
16, // mass
0, // damage
sfx_None, // activesound
MF_SPECIAL|MF_SHOOTABLE|MF_ENEMY, // flags
S_NULL // raisestate
},
{ // MT_POPSHOT
-1, // doomednum
S_ROCKCRUMBLEI, // spawnstate
1, // spawnhealth
S_NULL, // seestate
sfx_cannon, // seesound
0, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
200, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_XPLD1, // deathstate
S_NULL, // xdeathstate
sfx_pop, // deathsound
0, // speed
16*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
0, // mass
0, // damage
sfx_None, // activesound
MF_NOBLOCKMAP|MF_MISSILE, // flags
S_NULL // raisestate
},
{ // MT_HIVEELEMENTAL
3190, // doomednum
S_HIVEELEMENTAL_LOOK, // spawnstate

View File

@ -402,6 +402,7 @@ typedef enum sprite
SPR_FWR4,
SPR_BUS1, // GFZ Bush w/ berries
SPR_BUS2, // GFZ Bush w/o berries
SPR_BUS3, // GFZ Bush w/ BLUE berries
// Trees (both GFZ and misc)
SPR_TRE1, // GFZ
SPR_TRE2, // Checker
@ -470,6 +471,7 @@ typedef enum sprite
SPR_XMS3, // Snowman
SPR_XMS4, // Lamppost
SPR_XMS5, // Hanging Star
SPR_FHZI, // FHZ Ice
// Halloween Scenery
SPR_PUMK, // Pumpkins
@ -481,7 +483,13 @@ typedef enum sprite
SPR_BSZ1, // Tall flowers
SPR_BSZ2, // Medium flowers
SPR_BSZ3, // Small flowers
SPR_BSZ4, // Tulip
//SPR_BSZ4, -- Tulips
SPR_BST1, // Red tulip
SPR_BST2, // Purple tulip
SPR_BST3, // Blue tulip
SPR_BST4, // Cyan tulip
SPR_BST5, // Yellow tulip
SPR_BST6, // Orange tulip
SPR_BSZ5, // Cluster of Tulips
SPR_BSZ6, // Bush
SPR_BSZ7, // Vine
@ -619,6 +627,8 @@ typedef enum sprite
SPR_SHLP, // Shleep
// Secret badniks and hazards, shhhh
SPR_PENG,
SPR_POPH,
SPR_HIVE,
SPR_BUMB,
SPR_BBUZ,
@ -1210,13 +1220,7 @@ typedef enum state
S_UNIDUS_BALL,
// Boss Explosion
S_BPLD1,
S_BPLD2,
S_BPLD3,
S_BPLD4,
S_BPLD5,
S_BPLD6,
S_BPLD7,
S_BOSSEXPLODE,
// S3&K Boss Explosion
S_SONIC3KBOSSEXPLOSION1,
@ -1725,6 +1729,12 @@ typedef enum state
S_BLUESPHEREBONUS,
S_BLUESPHERESPARK,
// Bomb Sphere
S_BOMBSPHERE1,
S_BOMBSPHERE2,
S_BOMBSPHERE3,
S_BOMBSPHERE4,
// NiGHTS Chip
S_NIGHTSCHIP,
S_NIGHTSCHIPBONUS,
@ -2074,18 +2084,14 @@ typedef enum state
S_ARROWBONK,
// Trapgoyle Demon fire
S_DEMONFIRE1,
S_DEMONFIRE2,
S_DEMONFIRE3,
S_DEMONFIRE4,
S_DEMONFIRE5,
S_DEMONFIRE6,
S_DEMONFIRE,
// GFZ flowers
S_GFZFLOWERA,
S_GFZFLOWERB,
S_GFZFLOWERC,
S_BLUEBERRYBUSH,
S_BERRYBUSH,
S_BUSH,
@ -2370,8 +2376,12 @@ typedef enum state
S_LAMPPOST2, // with snow
S_HANGSTAR,
// Xmas GFZ bushes
S_XMASBLUEBERRYBUSH,
S_XMASBERRYBUSH,
S_XMASBUSH,
// FHZ
S_FHZICE1,
S_FHZICE2,
// Halloween Scenery
// Pumpkins
@ -3423,6 +3433,22 @@ typedef enum state
S_SHLEEPBOUNCE3,
// Secret badniks and hazards, shhhh
S_PENGUINATOR_LOOK,
S_PENGUINATOR_WADDLE1,
S_PENGUINATOR_WADDLE2,
S_PENGUINATOR_WADDLE3,
S_PENGUINATOR_WADDLE4,
S_PENGUINATOR_SLIDE1,
S_PENGUINATOR_SLIDE2,
S_PENGUINATOR_SLIDE3,
S_PENGUINATOR_SLIDE4,
S_PENGUINATOR_SLIDE5,
S_POPHAT_LOOK,
S_POPHAT_SHOOT1,
S_POPHAT_SHOOT2,
S_POPHAT_SHOOT3,
S_HIVEELEMENTAL_LOOK,
S_HIVEELEMENTAL_PREPARE1,
S_HIVEELEMENTAL_PREPARE2,
@ -3717,7 +3743,8 @@ typedef enum mobj_type
// Collectible Items
MT_RING,
MT_FLINGRING, // Lost ring
MT_BLUESPHERE, // Blue sphere replacement for special stages
MT_BLUESPHERE, // Blue sphere for special stages
MT_BOMBSPHERE,
MT_REDTEAMRING, //Rings collectable by red team.
MT_BLUETEAMRING, //Rings collectable by blue team.
MT_TOKEN, // Special Stage token for special stage
@ -3755,7 +3782,6 @@ typedef enum mobj_type
MT_BUBBLES, // Bubble source
MT_SIGN, // Level end sign
MT_SPIKEBALL, // Spike Ball
MT_SPECIALSPIKEBALL,
MT_SPINFIRE,
MT_SPIKE,
MT_WALLSPIKE,
@ -3848,8 +3874,11 @@ typedef enum mobj_type
MT_GFZFLOWER1,
MT_GFZFLOWER2,
MT_GFZFLOWER3,
MT_BLUEBERRYBUSH,
MT_BERRYBUSH,
MT_BUSH,
// Trees (both GFZ and misc)
MT_GFZTREE,
MT_GFZBERRYTREE,
@ -3974,8 +4003,12 @@ typedef enum mobj_type
MT_LAMPPOST2, // with snow
MT_HANGSTAR,
// Xmas GFZ bushes
MT_XMASBLUEBERRYBUSH,
MT_XMASBERRYBUSH,
MT_XMASBUSH,
// FHZ
MT_FHZICE1,
MT_FHZICE2,
// Halloween Scenery
// Pumpkins
@ -4187,6 +4220,10 @@ typedef enum mobj_type
MT_SHLEEP, // almost-decorative sleeping enemy
// Secret badniks and hazards, shhhh
MT_PENGUINATOR,
MT_POPHAT,
MT_POPSHOT,
MT_HIVEELEMENTAL,
MT_BUMBLEBORE,

View File

@ -5222,7 +5222,7 @@ static void M_HandleAddons(INT32 choice)
case EXT_SOC:
case EXT_WAD:
case EXT_PK3:
COM_BufAddText(va("addfile %s%s", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING));
COM_BufAddText(va("addfile \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING));
addonsresponselimit = 5;
break;
default:

View File

@ -5346,7 +5346,7 @@ void A_RotateSpikeBall(mobj_t *actor)
return;
#endif
if (actor->type == MT_SPECIALSPIKEBALL) // don't remove this, these spikeballs share the same states as the rotating spikeballs
if (actor->type == MT_SPIKEBALL) // don't remove this, these spikeballs share the same states as the rotating spikeballs
return;
if (!((!locvar1 && (actor->target)) || (locvar1 && (actor->tracer))))// This should NEVER happen.
@ -11323,21 +11323,20 @@ void A_LightBeamReset(mobj_t *actor)
return;
#endif
P_SetScale(actor, FRACUNIT + P_SignedRandom()*FRACUNIT/256);
actor->destscale = actor->scale;
actor->destscale = FRACUNIT + P_SignedRandom()*FRACUNIT/256;
P_SetScale(actor, actor->destscale);
if (!actor->spawnpoint)
return; // this can't work properly welp
actor->momx = P_SignedRandom()*FINECOSINE((actor->spawnpoint->angle*ANG1)>>ANGLETOFINESHIFT)/128;
actor->momy = P_SignedRandom()*FINESINE((actor->spawnpoint->angle*ANG1)>>ANGLETOFINESHIFT)/128;
actor->momz = P_SignedRandom()*FRACUNIT/128;
actor->momx = -(P_SignedRandom()*FINESINE(((actor->spawnpoint->angle*ANG1)>>ANGLETOFINESHIFT) & FINEMASK))/128;
actor->momy = (P_SignedRandom()*FINECOSINE(((actor->spawnpoint->angle*ANG1)>>ANGLETOFINESHIFT) & FINEMASK))/128;
actor->momz = (P_SignedRandom()*FRACUNIT)/128;
P_UnsetThingPosition(actor);
actor->x = actor->spawnpoint->x*FRACUNIT + P_SignedRandom()*FINECOSINE((actor->spawnpoint->angle*ANG1)>>ANGLETOFINESHIFT)/2;
actor->y = actor->spawnpoint->y*FRACUNIT + P_SignedRandom()*FINESINE((actor->spawnpoint->angle*ANG1)>>ANGLETOFINESHIFT)/2;
actor->z = actor->spawnpoint->z*FRACUNIT + P_SignedRandom()*FRACUNIT/2;
P_SetThingPosition(actor);
P_TeleportMove(actor,
actor->spawnpoint->x*FRACUNIT - (P_SignedRandom()*FINESINE(((actor->spawnpoint->angle*ANG1)>>ANGLETOFINESHIFT) & FINEMASK))/2,
actor->spawnpoint->y*FRACUNIT + (P_SignedRandom()*FINECOSINE(((actor->spawnpoint->angle*ANG1)>>ANGLETOFINESHIFT) & FINEMASK))/2,
actor->spawnpoint->z*FRACUNIT + (P_SignedRandom()*FRACUNIT)/2);
}
// Function: A_MineExplode

View File

@ -474,7 +474,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
case MT_FLINGRING:
case MT_COIN:
case MT_FLINGCOIN:
if (!(P_CanPickupItem(player, false)))
case MT_NIGHTSSTAR:
if (!(P_CanPickupItem(player, false)) && !(special->flags2 & MF2_NIGHTSPULL))
return;
special->momx = special->momy = special->momz = 0;
@ -484,39 +485,31 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
P_DoNightsScore(player);
break;
case MT_BLUESPHERE:
if (!(P_CanPickupItem(player, false)))
return;
special->momx = special->momy = special->momz = 0;
P_GivePlayerSpheres(player, 1);
special->destscale = ((player->powers[pw_carry] == CR_NIGHTSMODE) ? 4 : 2)*special->scale;
if (states[special->info->deathstate].tics > 0)
special->scalespeed = FixedDiv(FixedDiv(special->destscale, special->scale), states[special->info->deathstate].tics<<FRACBITS);
else
special->scalespeed = 4*FRACUNIT/5;
if (maptol & TOL_NIGHTS)
P_DoNightsScore(player);
break;
case MT_NIGHTSCHIP:
if (!(P_CanPickupItem(player, false)))
if (!(P_CanPickupItem(player, false)) && !(special->flags2 & MF2_NIGHTSPULL))
return;
special->momx = special->momy = special->momz = 0;
P_GivePlayerSpheres(player, 1);
if (special->type == MT_BLUESPHERE)
{
special->destscale = ((player->powers[pw_carry] == CR_NIGHTSMODE) ? 4 : 2)*special->scale;
if (states[special->info->deathstate].tics > 0)
special->scalespeed = FixedDiv(FixedDiv(special->destscale, special->scale), states[special->info->deathstate].tics<<FRACBITS);
else
special->scalespeed = 4*FRACUNIT/5;
}
if (maptol & TOL_NIGHTS)
P_DoNightsScore(player);
break;
case MT_NIGHTSSTAR:
if (!(P_CanPickupItem(player, false)))
case MT_BOMBSPHERE:
if (!(P_CanPickupItem(player, false)) && !(special->flags2 & MF2_NIGHTSPULL))
return;
special->momx = special->momy = special->momz = 0;
if (maptol & TOL_NIGHTS)
P_DoNightsScore(player);
P_DamageMobj(toucher, special, special, 1, 0);
break;
case MT_AUTOPICKUP:
case MT_BOUNCEPICKUP:
@ -755,6 +748,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
case MT_NIGHTSDRONE:
{
boolean spec = G_IsSpecialStage(gamemap);
boolean cangiveemmy = false;
if (player->bot)
return;
if (player->exiting)
@ -776,7 +770,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
return;
// Well no one has an emerald, so exit anyway!
}
P_GiveEmerald(false);
cangiveemmy = true;
// Don't play Ideya sound in special stage mode
}
else
@ -815,7 +809,21 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
while ((hnext = hnext->hnext))
P_SetTarget(&hnext->target, toucher);
}
return;
}
if (!cangiveemmy)
return;
if (player->exiting)
P_GiveEmerald(false);
else if (player->mo->tracer && player->mare)
{
P_KillMobj(toucher->tracer, NULL, NULL, 0); // No emerald for you just yet!
S_StartSound(NULL, sfx_ghosty);
special->flags2 |= MF2_DONTDRAW;
}
return;
}
case MT_NIGHTSLOOPHELPER:
@ -922,9 +930,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
}
}
if (!(mo2->type == MT_RING || mo2->type == MT_COIN || mo2->type == MT_BLUESPHERE
if (!(mo2->type == MT_RING || mo2->type == MT_COIN
|| mo2->type == MT_BLUESPHERE || mo2->type == MT_BOMBSPHERE
|| mo2->type == MT_NIGHTSCHIP || mo2->type == MT_NIGHTSSTAR
|| ((mo2->type == MT_EMBLEM) && (mo2->reactiontime & GE_NIGHTSPULL))))
|| ((mo2->type == MT_EMBLEM) && (mo2->reactiontime & GE_NIGHTSPULL))))
continue;
// Yay! The thing's in reach! Pull it in!
@ -942,6 +951,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if (player->powers[pw_carry] == CR_NIGHTSMODE && !toucher->target)
return;
if (toucher->tracer)
return; // Don't have multiple ideya
if (player->mare != special->threshold) // wrong mare
return;

View File

@ -2133,7 +2133,7 @@ void P_XYMovement(mobj_t *mo)
if (mo->flags & MF_NOCLIPHEIGHT)
return; // no frictions for objects that can pass through floors
if (mo->flags & MF_MISSILE || mo->flags2 & MF2_SKULLFLY || mo->type == MT_SHELL || mo->type == MT_VULTURE)
if (mo->flags & MF_MISSILE || mo->flags2 & MF2_SKULLFLY || mo->type == MT_SHELL || mo->type == MT_VULTURE || mo->type == MT_PENGUINATOR)
return; // no friction for missiles ever
if (player && player->homing) // no friction for homing
@ -2514,6 +2514,7 @@ static boolean P_ZMovement(mobj_t *mo)
case MT_RING: // Ignore still rings
case MT_COIN:
case MT_BLUESPHERE:
case MT_BOMBSPHERE:
case MT_NIGHTSCHIP:
case MT_NIGHTSSTAR:
case MT_REDTEAMRING:
@ -7747,109 +7748,79 @@ void P_MobjThinker(mobj_t *mobj)
}
break;
case MT_NIGHTSDRONE:
// GOAL mode?
if (mobj->state >= &states[S_NIGHTSDRONE_SPARKLING1] && mobj->state <= &states[S_NIGHTSDRONE_SPARKLING16])
{
mobj->flags2 &= ~MF2_DONTDRAW;
mobj->z = mobj->floorz + mobj->height + (mobj->spawnpoint->options >> ZSHIFT) * FRACUNIT;
mobj->angle = 0;
INT32 i;
boolean bonustime = false;
if (!mobj->target)
{
mobj_t *goalpost = P_SpawnMobj(mobj->x, mobj->y, mobj->z + FRACUNIT, MT_NIGHTSGOAL);
CONS_Debug(DBG_NIGHTSBASIC, "Adding goal post\n");
goalpost->angle = mobj->angle;
P_SetTarget(&mobj->target, goalpost);
}
for (i = 0; i < MAXPLAYERS; i++)
if (playeringame[i] && players[i].bonustime && players[i].powers[pw_carry] == CR_NIGHTSMODE)
{
bonustime = true;
break;
}
if (G_IsSpecialStage(gamemap))
{ // Never show the NiGHTS drone in special stages. Check ANYONE for bonustime.
INT32 i;
boolean bonustime = false;
for (i = 0; i < MAXPLAYERS; i++)
if (playeringame[i] && players[i].bonustime)
{
bonustime = true;
break;
}
if (!bonustime)
{
/*mobj->flags &= ~MF_NOGRAVITY;
P_SetMobjState(mobj, S_NIGHTSDRONE1);*/
mobj->flags2 |= MF2_DONTDRAW;
}
}
else if (mobj->tracer && mobj->tracer->player)
if (!bonustime)
{
if (!(mobj->tracer->player->powers[pw_carry] == CR_NIGHTSMODE))
{
mobj->flags &= ~MF_NOGRAVITY;
mobj->flags2 &= ~MF2_DONTDRAW;
P_SetMobjState(mobj, S_NIGHTSDRONE1);
}
else if (!mobj->tracer->player->bonustime)
{
mobj->flags &= ~MF_NOGRAVITY;
P_SetMobjState(mobj, S_NIGHTSDRONE1);
}
CONS_Debug(DBG_NIGHTSBASIC, "Removing goal post\n");
P_RemoveMobj(mobj->target);
P_SetTarget(&mobj->target, NULL);
mobj->flags &= ~MF_NOGRAVITY;
mobj->flags2 |= MF2_DONTDRAW;
P_SetMobjState(mobj, S_NIGHTSDRONE1);
}
}
// Invisible/bouncing mode.
else
{
if (G_IsSpecialStage(gamemap))
{ // Never show the NiGHTS drone in special stages. Check ANYONE for bonustime.
INT32 i;
INT32 i;
boolean bonustime = false;
boolean bonustime = false;
for (i = 0; i < MAXPLAYERS; i++)
if (playeringame[i] && players[i].bonustime)
{
bonustime = true;
break;
}
if (bonustime)
{
P_SetMobjState(mobj, S_NIGHTSDRONE_SPARKLING1);
mobj->flags |= MF_NOGRAVITY;
}
else
{
if (mobj->target)
{
CONS_Debug(DBG_NIGHTSBASIC, "Removing goal post\n");
P_RemoveMobj(mobj->target);
P_SetTarget(&mobj->target, NULL);
}
mobj->flags2 |= MF2_DONTDRAW;
}
}
else if (mobj->tracer && mobj->tracer->player)
{
if (mobj->target)
{
CONS_Debug(DBG_NIGHTSBASIC, "Removing goal post\n");
P_RemoveMobj(mobj->target);
P_SetTarget(&mobj->target, NULL);
}
if (mobj->tracer->player->powers[pw_carry] == CR_NIGHTSMODE)
{
if (mobj->tracer->player->bonustime)
{
P_SetMobjState(mobj, S_NIGHTSDRONE_SPARKLING1);
mobj->flags |= MF_NOGRAVITY;
}
else
mobj->flags2 |= MF2_DONTDRAW;
}
else // Not NiGHTS
mobj->flags2 &= ~MF2_DONTDRAW;
}
// Bouncy bouncy!
mobj->angle += ANG10;
if (mobj->flags2 & MF2_DONTDRAW)
mobj->momz = 0;
else if (mobj->z <= mobj->floorz)
mobj->momz = 5*FRACUNIT;
for (i = 0; i < MAXPLAYERS; i++)
if (playeringame[i] && players[i].bonustime && players[i].powers[pw_carry] == CR_NIGHTSMODE)
{
bonustime = true;
break;
}
if (bonustime)
{
mobj->z = mobj->floorz + mobj->height;
mobj->angle = mobj->momz = 0;
if (mobj->spawnpoint)
mobj->z += (mobj->spawnpoint->options >> ZSHIFT)<<FRACBITS;
CONS_Debug(DBG_NIGHTSBASIC, "Adding goal post\n");
P_SetTarget(&mobj->target, P_SpawnMobjFromMobj(mobj, 0, 0, FRACUNIT, MT_NIGHTSGOAL));
mobj->flags2 &= ~MF2_DONTDRAW;
mobj->flags |= MF_NOGRAVITY;
P_SetMobjState(mobj, S_NIGHTSDRONE_SPARKLING1);
}
else if (!G_IsSpecialStage(gamemap))
{
for (i = 0; i < MAXPLAYERS; i++)
if (playeringame[i] && players[i].powers[pw_carry] != CR_NIGHTSMODE)
{
bonustime = true; // variable reuse
break;
}
if (bonustime)
mobj->flags2 &= ~MF2_DONTDRAW;
else
mobj->flags2 |= MF2_DONTDRAW;
}
}
break;
case MT_PLAYER:
@ -7882,6 +7853,7 @@ void P_MobjThinker(mobj_t *mobj)
case MT_RING:
case MT_COIN:
case MT_BLUESPHERE:
case MT_BOMBSPHERE:
case MT_NIGHTSCHIP:
case MT_NIGHTSSTAR:
case MT_REDTEAMRING:
@ -8713,6 +8685,10 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
case MT_EXTRALARGEBUBBLE:
mobj->fuse += 30 * TICRATE;
break;
case MT_NIGHTSDRONE:
if (G_IsSpecialStage(gamemap))
mobj->flags2 |= MF2_DONTDRAW;
break;
case MT_EGGCAPSULE:
mobj->extravalue1 = -1; // timer for how long a player has been at the capsule
break;
@ -9869,7 +9845,7 @@ void P_SpawnMapThing(mapthing_t *mthing)
ss->sector->floorheight) + ((mthing->options >> ZSHIFT) << FRACBITS);
else if (i == MT_AXIS || i == MT_AXISTRANSFER || i == MT_AXISTRANSFERLINE)
z = ONFLOORZ;
else if (i == MT_SPECIALSPIKEBALL || P_WeaponOrPanel(i) || i == MT_EMERALDSPAWN || i == MT_TOKEN)
else if (i == MT_BOMBSPHERE || i == MT_SPIKEBALL || P_WeaponOrPanel(i) || i == MT_EMERALDSPAWN || i == MT_TOKEN)
{
if (mthing->options & MTF_OBJECTFLIP)
{
@ -11063,10 +11039,11 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
else if (mthing->type == mobjinfo[MT_BLUESPHERE].doomednum)
ringthing = MT_BLUESPHERE;
if (ringthing != MT_BLUESPHERE && ultimatemode)
return; // No rings in Ultimate!
if ((maptol & TOL_NIGHTS) && !G_IsSpecialStage(gamemap))
ringthing = ((ringthing == MT_BLUESPHERE) ? MT_NIGHTSCHIP : MT_NIGHTSSTAR);
else if (ringthing != MT_BLUESPHERE && ultimatemode)
return; // No rings in Ultimate!
// Set proper height
if (mthing->options & MTF_OBJECTFLIP)
@ -11130,10 +11107,11 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
if (mthing->type == 601)
dist = 128*FRACUNIT;
if (ultimatemode)
return; // No rings in Ultimate!
if ((maptol & TOL_NIGHTS) && !G_IsSpecialStage(gamemap))
ringthing = MT_NIGHTSSTAR;
else if (ultimatemode)
return; // No rings in Ultimate!
for (r = 1; r <= 5; r++)
{
@ -11181,10 +11159,11 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
if (mthing->type == 603)
iterations = 10;
if (ultimatemode)
return; // No rings in Ultimate!
if ((maptol & TOL_NIGHTS) && !G_IsSpecialStage(gamemap))
ringthing = MT_NIGHTSSTAR;
else if (ultimatemode)
return; // No rings in Ultimate!
closestangle = FixedAngle(mthing->angle*FRACUNIT);
fa = (closestangle >> ANGLETOFINESHIFT);
@ -11274,10 +11253,11 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
break;
}
if (ringthing != MT_BLUESPHERE && ultimatemode)
continue; // No rings in Ultimate!
if ((maptol & TOL_NIGHTS) && !G_IsSpecialStage(gamemap))
ringthing = ((ringthing == MT_BLUESPHERE) ? MT_NIGHTSCHIP : MT_NIGHTSSTAR);
else if (ringthing == MT_RING && ultimatemode)
continue; // No rings in Ultimate!
fa = i*FINEANGLES/numitems;
v[0] = FixedMul(FINECOSINE(fa),size);

View File

@ -826,7 +826,8 @@ void P_ReloadRings(void)
}
continue;
}
if (!(mo->type == MT_RING || mo->type == MT_COIN || mo->type == MT_BLUESPHERE
if (!(mo->type == MT_RING || mo->type == MT_COIN
|| mo->type == MT_BLUESPHERE || mo->type == MT_BOMBSPHERE
|| mo->type == MT_NIGHTSCHIP || mo->type == MT_NIGHTSSTAR))
continue;

View File

@ -7656,7 +7656,6 @@ void T_Pusher(pusher_t *p)
thing->player->pflags |= jumped;
thing->player->pflags |= PF_SLIDING;
P_SetPlayerMobjState (thing, thing->info->painstate); // Whee!
thing->angle = R_PointToAngle2 (0, 0, xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR));
if (!demoplayback || P_AnalogMove(thing->player))

View File

@ -6953,12 +6953,17 @@ static void P_MovePlayer(player_t *player)
if ((player->powers[pw_carry] == CR_NIGHTSMODE)
&& (player->exiting
|| !(player->mo->state >= &states[S_PLAY_NIGHTS_TRANS1]
&& player->mo->state < &states[S_PLAY_NIGHTS_TRANS6])))
&& player->mo->state < &states[S_PLAY_NIGHTS_TRANS6]))) // Note the < instead of <=
{
skin_t *skin = ((skin_t *)(player->mo->skin));
if (skin->flags & SF_SUPER && player->mo->color < MAXSKINCOLORS)
if (skin->flags & SF_SUPER)
{
player->mo->color = skin->supercolor
+ ((player->nightstime == player->startedtime)
? 4
: abs((((signed)leveltime >> 1) % 9) - 4)); // This is where super flashing is handled.
G_GhostAddColor(GHC_SUPER);
player->mo->color = (skin->flags & SF_SUPER) ? skin->supercolor + abs((((signed)(player->startedtime - player->nightstime) >> 1) % 9) - 4) : player->mo->color; // This is where super flashing is handled.
}
}
if (!player->capsule && !player->bonustime)
@ -7961,17 +7966,18 @@ static void P_DoRopeHang(player_t *player)
if (player->cmd.buttons & BT_USE && !(player->pflags & PF_STASIS)) // Drop off of the rope
{
P_SetTarget(&player->mo->tracer, NULL);
player->pflags |= P_GetJumpFlags(player);
P_SetPlayerMobjState(player->mo, S_PLAY_JUMP);
P_SetTarget(&player->mo->tracer, NULL);
player->powers[pw_carry] = CR_NONE;
if (!(player->pflags & PF_SLIDING) && (player->pflags & PF_JUMPED)
&& !(player->panim == PA_JUMP))
P_SetPlayerMobjState(player->mo, S_PLAY_JUMP);
return;
}
if (player->mo->state-states != S_PLAY_RIDE)
P_SetPlayerMobjState(player->mo, S_PLAY_RIDE);
// If not allowed to move, we're done here.
if (!speed)
return;
@ -8062,10 +8068,7 @@ static void P_DoRopeHang(player_t *player)
if (player->mo->tracer->flags & MF_SLIDEME)
{
player->pflags |= P_GetJumpFlags(player);
if (!(player->pflags & PF_SLIDING) && (player->pflags & PF_JUMPED)
&& !(player->panim == PA_JUMP))
P_SetPlayerMobjState(player->mo, S_PLAY_JUMP);
P_SetPlayerMobjState(player->mo, S_PLAY_JUMP);
}
P_SetTarget(&player->mo->tracer, NULL);
@ -9737,7 +9740,8 @@ void P_PlayerThink(player_t *player)
mo2 = (mobj_t *)th;
if (!(mo2->type == MT_RING || mo2->type == MT_COIN || mo2->type == MT_BLUESPHERE
if (!(mo2->type == MT_RING || mo2->type == MT_COIN
|| mo2->type == MT_BLUESPHERE || mo2->type == MT_BOMBSPHERE
|| mo2->type == MT_NIGHTSCHIP || mo2->type == MT_NIGHTSSTAR))
continue;
@ -9774,8 +9778,6 @@ void P_PlayerThink(player_t *player)
ticmiss++;
P_DoRopeHang(player);
if (player->mo->state-states != S_PLAY_RIDE)
P_SetPlayerMobjState(player->mo, S_PLAY_RIDE);
P_DoJumpStuff(player, &player->cmd);
}
else //if (player->powers[pw_carry] == CR_ZOOMTUBE)
@ -9891,7 +9893,8 @@ void P_PlayerThink(player_t *player)
if (!player->powers[pw_carry]
&& ((player->pflags & (PF_AUTOBRAKE|PF_APPLYAUTOBRAKE)) == (PF_AUTOBRAKE|PF_APPLYAUTOBRAKE))
&& !(cmd->forwardmove || cmd->sidemove)
&& (player->rmomx || player->rmomy))
&& (player->rmomx || player->rmomy)
&& (!player->capsule || (player->capsule->reactiontime != (player-players)+1)))
{
fixed_t acceleration = (player->accelstart + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * player->acceleration) * player->thrustfactor * 20;
angle_t moveAngle = R_PointToAngle2(0, 0, player->rmomx, player->rmomy);
@ -9913,7 +9916,7 @@ void P_PlayerThink(player_t *player)
|| player->climbing
|| player->pflags & (PF_SPINNING|PF_SLIDING))
player->pflags &= ~PF_APPLYAUTOBRAKE;
else if (currentlyonground)
else if (currentlyonground || player->powers[pw_tailsfly])
player->pflags |= PF_APPLYAUTOBRAKE;
}
}
@ -10345,7 +10348,7 @@ void P_PlayerAfterThink(player_t *player)
if (P_IsLocalPlayer(player) && (player->pflags & PF_WPNDOWN) && player->currentweapon != oldweapon)
S_StartSound(NULL, sfx_wepchg);
if (player->pflags & PF_SLIDING)
if ((player->pflags & PF_SLIDING) && ((player->pflags & (PF_JUMPED|PF_NOJUMPDAMAGE)) != PF_JUMPED))
P_SetPlayerMobjState(player->mo, player->mo->info->painstate);
/* if (player->powers[pw_carry] == CR_NONE && player->mo->tracer && !player->homing)

View File

@ -143,12 +143,12 @@ sfxinfo_t S_sfx[NUMSFX] =
{"cannon", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR, "Powerful shot"},
{"cgot" , true, 120, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Got Emerald"}, // Got Emerald! Tails 09-02-2001
{"cybdth", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Explosion"},
{"deton", true, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Ominous beeping"},
{"deton", true, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Threatening beeping"},
{"ding", false, 127, 8, -1, NULL, 0, -1, -1, LUMPERROR, "Ding"},
{"dmpain", false, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Machine damage"},
{"drown", false, 192, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Drowning"},
{"fizzle", false, 127, 8, -1, NULL, 0, -1, -1, LUMPERROR, "Electric fizzle"},
{"gbeep", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Ominous beeping"}, // Grenade beep
{"gbeep", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Threatening beeping"}, // Grenade beep
{"wepfir", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Firing weapon"}, // defaults to thok
{"ghit" , false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Goop splash"},
{"gloop", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Splash"},
@ -244,11 +244,11 @@ sfxinfo_t S_sfx[NUMSFX] =
{"mario2", false, 127, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Koopa shell"},
{"mario3", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Power-up"},
{"mario4", true, 78, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Got coin"},
{"mario5", false, 78, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Boot"},
{"mario5", false, 78, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Boot-stomp"},
{"mario6", false, 60, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Jump"},
{"mario7", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Fire"},
{"mario8", false, 48, 8, -1, NULL, 0, -1, -1, LUMPERROR, "Hurt"},
{"mario9", true, 120, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Emerging"},
{"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"},
{"thwomp", true, 127, 8, -1, NULL, 0, -1, -1, LUMPERROR, "Thwomp"},

View File

@ -1093,7 +1093,8 @@ static void ST_drawInput(void)
((!stplyr->powers[pw_carry]
&& (stplyr->pflags & PF_APPLYAUTOBRAKE)
&& !(stplyr->cmd.sidemove || stplyr->cmd.forwardmove)
&& (stplyr->rmomx || stplyr->rmomy))
&& (stplyr->rmomx || stplyr->rmomy)
&& (!stplyr->capsule || (stplyr->capsule->reactiontime != (stplyr-players)+1)))
? 0 : V_GRAYMAP),
"AUTOBRAKE");
y -= 8;

View File

@ -1624,7 +1624,7 @@ void V_DrawString(INT32 x, INT32 y, INT32 option, const char *string)
{
INT32 w, c, cx = x, cy = y, dupx, dupy, scrwidth, center = 0, left = 0;
const char *ch = string;
INT32 charflags = 0;
INT32 charflags = (option & V_CHARCOLORMASK);
const UINT8 *colormap = NULL;
INT32 spacewidth = 4, charwidth = 0;
@ -1644,8 +1644,6 @@ void V_DrawString(INT32 x, INT32 y, INT32 option, const char *string)
left = (scrwidth - BASEVIDWIDTH)/2;
}
charflags = (option & V_CHARCOLORMASK);
switch (option & V_SPACINGMASK)
{
case V_MONOSPACE:
@ -2154,8 +2152,10 @@ INT32 V_CreditStringWidth(const char *string)
//
void V_DrawLevelTitle(INT32 x, INT32 y, INT32 option, const char *string)
{
INT32 w, c, cx = x, cy = y, dupx, dupy, scrwidth = BASEVIDWIDTH;
INT32 w, c, cx = x, cy = y, dupx, dupy, scrwidth, left = 0;
const char *ch = string;
INT32 charflags = (option & V_CHARCOLORMASK);
const UINT8 *colormap = NULL;
if (option & V_NOSCALESTART)
{
@ -2164,21 +2164,31 @@ void V_DrawLevelTitle(INT32 x, INT32 y, INT32 option, const char *string)
scrwidth = vid.width;
}
else
dupx = dupy = 1;
for (;;)
{
c = *ch++;
if (!c)
dupx = dupy = 1;
scrwidth = vid.width/vid.dupx;
left = (scrwidth - BASEVIDWIDTH)/2;
}
for (;;ch++)
{
if (!*ch)
break;
if (c == '\n')
if (*ch & 0x80) //color parsing -x 2.16.09
{
// manually set flags override color codes
if (!(option & V_CHARCOLORMASK))
charflags = ((*ch & 0x7f) << V_CHARCOLORSHIFT) & V_CHARCOLORMASK;
continue;
}
if (*ch == '\n')
{
cx = x;
cy += 12*dupy;
continue;
}
c = toupper(c) - LT_FONTSTART;
c = toupper(*ch) - LT_FONTSTART;
if (c < 0 || c >= LT_FONTSIZE || !lt_font[c])
{
cx += 16*dupx;
@ -2186,17 +2196,19 @@ void V_DrawLevelTitle(INT32 x, INT32 y, INT32 option, const char *string)
}
w = SHORT(lt_font[c]->width) * dupx;
if (cx + w > scrwidth)
break;
if (cx+left > scrwidth)
break;
//left boundary check
if (cx < 0)
if (cx+left + w < 0)
{
cx += w;
continue;
}
V_DrawScaledPatch(cx, cy, option, lt_font[c]);
colormap = V_GetStringColormap(charflags);
V_DrawFixedPatch(cx<<FRACBITS, cy<<FRACBITS, FRACUNIT, option, lt_font[c], colormap);
cx += w;
}
}
@ -2210,6 +2222,8 @@ INT32 V_LevelNameWidth(const char *string)
for (i = 0; i < strlen(string); i++)
{
if (string[i] & 0x80)
continue;
c = toupper(string[i]) - LT_FONTSTART;
if (c < 0 || c >= LT_FONTSIZE || !lt_font[c])
w += 16;
@ -2265,11 +2279,9 @@ INT32 V_StringWidth(const char *string, INT32 option)
for (i = 0; i < strlen(string); i++)
{
c = string[i];
if ((UINT8)c >= 0x80 && (UINT8)c <= 0x89) //color parsing! -Inuyasha 2.16.09
if (string[i] & 0x80)
continue;
c = toupper(c) - HU_FONTSTART;
c = toupper(string[i]) - HU_FONTSTART;
if (c < 0 || c >= HU_FONTSIZE || !hu_font[c])
w += spacewidth;
else
@ -2307,11 +2319,9 @@ INT32 V_SmallStringWidth(const char *string, INT32 option)
for (i = 0; i < strlen(string); i++)
{
c = string[i];
if ((UINT8)c >= 0x80 && (UINT8)c <= 0x89) //color parsing! -Inuyasha 2.16.09
if (string[i] & 0x80)
continue;
c = toupper(c) - HU_FONTSTART;
c = toupper(string[i]) - HU_FONTSTART;
if (c < 0 || c >= HU_FONTSIZE || !hu_font[c])
w += spacewidth;
else
@ -2346,11 +2356,9 @@ INT32 V_ThinStringWidth(const char *string, INT32 option)
for (i = 0; i < strlen(string); i++)
{
c = string[i];
if ((UINT8)c >= 0x80 && (UINT8)c <= 0x89) //color parsing! -Inuyasha 2.16.09
if (string[i] & 0x80)
continue;
c = toupper(c) - HU_FONTSTART;
c = toupper(string[i]) - HU_FONTSTART;
if (c < 0 || c >= HU_FONTSIZE || !tny_font[c])
w += spacewidth;
else

View File

@ -77,7 +77,7 @@ typedef union
struct
{
char passed1[29]; // KNUCKLES GOT / CRAWLA HONCHO
char passed1[29]; // KNUCKLES GOT / CRAWLA HONCHO
char passed2[17]; // A CHAOS EMERALD? / GOT THEM ALL!
char passed3[15]; // CAN NOW BECOME
char passed4[SKINNAMESIZE+7]; // SUPER CRAWLA HONCHO
@ -315,8 +315,9 @@ void Y_IntermissionDrawer(void)
INT32 xoffset1 = 0; // Line 1 x offset
INT32 xoffset2 = 0; // Line 2 x offset
INT32 xoffset3 = 0; // Line 3 x offset
INT32 xoffset4 = 0; // Bonus line x offset
INT32 xoffset5 = 0; // Score line x offset
INT32 xoffset4 = 0; // Line 4 x offset
INT32 xoffset5 = 0; // Line 5 x offset
INT32 xoffset6 = 0; // Line 6 x offset
UINT8 drawsection = 0;
if (gottoken) // first to be behind everything else
@ -331,39 +332,46 @@ void Y_IntermissionDrawer(void)
if (animatetic && intertic >= animatetic)
{
INT32 animatetimer = (intertic - animatetic);
if (animatetimer <= 12)
if (animatetimer <= 14)
{
xoffset1 = -(animatetimer * 40);
xoffset2 = -((animatetimer-2) * 40);
xoffset4 = -((animatetimer-4) * 40);
xoffset5 = -((animatetimer-6) * 40);
xoffset3 = -((animatetimer-4) * 40);
xoffset4 = -((animatetimer-6) * 40);
xoffset5 = -((animatetimer-8) * 40);
if (xoffset2 > 0) xoffset2 = 0;
if (xoffset3 > 0) xoffset3 = 0;
if (xoffset4 > 0) xoffset4 = 0;
if (xoffset5 > 0) xoffset5 = 0;
}
else if (animatetimer < 28)
else if (animatetimer < 32)
{
drawsection = 1;
xoffset1 = (20-animatetimer) * 40;
xoffset2 = (22-animatetimer) * 40;
xoffset3 = (24-animatetimer) * 40;
xoffset4 = (26-animatetimer) * 40;
xoffset5 = (28-animatetimer) * 40;
xoffset1 = (22-animatetimer) * 40;
xoffset2 = (24-animatetimer) * 40;
xoffset3 = (26-animatetimer) * 40;
xoffset4 = (28-animatetimer) * 40;
xoffset5 = (30-animatetimer) * 40;
xoffset6 = (32-animatetimer) * 40;
if (xoffset1 < 0) xoffset1 = 0;
if (xoffset2 < 0) xoffset2 = 0;
if (xoffset3 < 0) xoffset3 = 0;
if (xoffset4 < 0) xoffset4 = 0;
if (xoffset5 < 0) xoffset5 = 0;
}
else
{
drawsection = 1;
if (animatetimer == 28)
if (animatetimer == 32)
S_StartSound(NULL, sfx_s3k68);
}
}
if (drawsection == 1)
{
const char *ringtext = "\x86" "50 RINGS, NO SHIELD";
const char *tut1text = "\x86" "PRESS " "\x82" "SPIN";
const char *tut2text = "\x86" "MID-" "\x82" "JUMP";
ttheight = 16;
V_DrawLevelTitle(data.spec.passedx1 + xoffset1, ttheight, 0, data.spec.passed1);
ttheight += V_LevelNameHeight(data.spec.passed3) + 2;
@ -371,8 +379,12 @@ void Y_IntermissionDrawer(void)
ttheight += V_LevelNameHeight(data.spec.passed4) + 2;
V_DrawLevelTitle(data.spec.passedx4 + xoffset3, ttheight, 0, data.spec.passed4);
V_DrawCenteredString(BASEVIDWIDTH/2 + xoffset4, 108 - 4, 0, "\x86""50 RINGS, NO SHIELD");
V_DrawCenteredString(BASEVIDWIDTH/2 + xoffset5, 124 - 4, 0, "\x86""PRESS ""\x82""JUMP""\x86"", THEN ""\x82""SPIN");
ttheight = 108;
V_DrawLevelTitle(BASEVIDWIDTH/2 + xoffset4 - (V_LevelNameWidth(ringtext)/2), ttheight, 0, ringtext);
ttheight += V_LevelNameHeight(ringtext) + 2;
V_DrawLevelTitle(BASEVIDWIDTH/2 + xoffset5 - (V_LevelNameWidth(tut1text)/2), ttheight, 0, tut1text);
ttheight += V_LevelNameHeight(tut1text) + 2;
V_DrawLevelTitle(BASEVIDWIDTH/2 + xoffset6 - (V_LevelNameWidth(tut2text)/2), ttheight, 0, tut2text);
}
else
{
@ -389,10 +401,24 @@ void Y_IntermissionDrawer(void)
V_DrawLevelTitle(data.spec.passedx2 + xoffset1, ttheight, 0, data.spec.passed2);
}
V_DrawScaledPatch(152 + xoffset4, 108, 0, data.spec.bonuspatch);
V_DrawTallNum(BASEVIDWIDTH + xoffset4 - 68, 109, 0, data.spec.bonus.points);
V_DrawScaledPatch(152 + xoffset5, 124, 0, data.spec.pscore);
V_DrawTallNum(BASEVIDWIDTH + xoffset5 - 68, 125, 0, data.spec.score);
V_DrawScaledPatch(152 + xoffset3, 108, 0, data.spec.bonuspatch);
V_DrawTallNum(BASEVIDWIDTH + xoffset3 - 68, 109, 0, data.spec.bonus.points);
V_DrawScaledPatch(152 + xoffset4, 124, 0, data.spec.pscore);
V_DrawTallNum(BASEVIDWIDTH + xoffset4 - 68, 125, 0, data.spec.score);
// Draw continues!
if (!multiplayer /* && (data.spec.continues & 0x80) */) // Always draw outside of netplay
{
UINT8 continues = data.spec.continues & 0x7F;
V_DrawScaledPatch(152 + xoffset5, 150, 0, data.spec.pcontinues);
for (i = 0; i < continues; ++i)
{
if ((data.spec.continues & 0x80) && i == continues-1 && (endtic < 0 || intertic%20 < 10))
break;
V_DrawContinueIcon(246 + xoffset5 - (i*12), 162, 0, *data.spec.playerchar, *data.spec.playercolor);
}
}
}
// draw the emeralds
@ -467,20 +493,6 @@ void Y_IntermissionDrawer(void)
}
}
}
// Draw continues!
if (!multiplayer /* && (data.spec.continues & 0x80) */) // Always draw outside of netplay
{
UINT8 continues = data.spec.continues & 0x7F;
V_DrawScaledPatch(152, 150, 0, data.spec.pcontinues);
for (i = 0; i < continues; ++i)
{
if ((data.spec.continues & 0x80) && i == continues-1 && (endtic < 0 || intertic%20 < 10))
break;
V_DrawContinueIcon(246 - (i*12), 162, 0, *data.spec.playerchar, *data.spec.playercolor);
}
}
}
else if (intertype == int_match || intertype == int_race)
{
@ -881,7 +893,7 @@ void Y_Ticker(void)
{
INT32 i;
UINT32 oldscore = data.spec.score;
boolean skip = false;
boolean skip = false, super = false;
if (!intertic) // first time only
{
@ -893,15 +905,22 @@ void Y_Ticker(void)
return;
for (i = 0; i < MAXPLAYERS; i++)
if (playeringame[i] && (players[i].cmd.buttons & BT_USE))
skip = true;
if (playeringame[i])
{
if (players[i].cmd.buttons & BT_USE)
skip = true;
if (players[i].charflags & SF_SUPER)
super = true;
}
if (((data.spec.continues & 0x80) || ALL7EMERALDS(emeralds)) && tallydonetic != -1)
if (tallydonetic != -1 && ((data.spec.continues & 0x80) || (super && ALL7EMERALDS(emeralds))))
{
if ((intertic - tallydonetic) > (3*TICRATE)/2)
{
endtic = intertic + 4*TICRATE; // 4 second pause after end of tally
S_StartSound(NULL, sfx_s3kac); // bingly-bingly-bing!
if (data.spec.continues & 0x80)
S_StartSound(NULL, sfx_s3kac); // bingly-bingly-bing!
}
return;
}
@ -918,7 +937,7 @@ void Y_Ticker(void)
if (!data.spec.bonus.points)
{
tallydonetic = intertic;
if (!(data.spec.continues & 0x80)) // don't set endtic yet!
if (!((data.spec.continues & 0x80) || (super && ALL7EMERALDS(emeralds)))) // don't set endtic yet!
endtic = intertic + 4*TICRATE; // 4 second pause after end of tally
S_StartSound(NULL, (gottoken ? sfx_token : sfx_chchng)); // cha-ching!
@ -1317,7 +1336,7 @@ void Y_StartIntermission(void)
data.spec.passed1[sizeof data.spec.passed1 - 1] = '\0';
strcpy(data.spec.passed2, "GOT THEM ALL!");
if (skins[players[consoleplayer].skin].flags & SF_SUPER)
if (players[consoleplayer].charflags & SF_SUPER)
{
strcpy(data.spec.passed3, "CAN NOW BECOME");
snprintf(data.spec.passed4,