mirror of
				https://github.com/KartKrewDev/RingRacers.git
				synced 2025-10-30 08:01:28 +00:00 
			
		
		
		
	Merge branch 'double-bonus' into 'master'
Multiple BonusGame support See merge request KartKrew/Kart!781
This commit is contained in:
		
						commit
						e34b4f031b
					
				
					 3 changed files with 33 additions and 8 deletions
				
			
		| 
						 | 
					@ -3095,9 +3095,25 @@ void readcupheader(MYFILE *f, cupheader_t *cup)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else if (fastcmp(word, "BONUSGAME"))
 | 
								else if (fastcmp(word, "BONUSGAME"))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				Z_Free(cup->levellist[CUPCACHE_BONUS]);
 | 
									while (cup->numbonus > 0)
 | 
				
			||||||
				cup->levellist[CUPCACHE_BONUS] = Z_StrDup(word2);
 | 
									{
 | 
				
			||||||
				cup->cachedlevels[CUPCACHE_BONUS] = NEXTMAP_INVALID;
 | 
										cup->numbonus--;
 | 
				
			||||||
 | 
										Z_Free(cup->levellist[CUPCACHE_BONUS + cup->numbonus]);
 | 
				
			||||||
 | 
										cup->levellist[CUPCACHE_BONUS + cup->numbonus] = NULL;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									tmp = strtok(word2,",");
 | 
				
			||||||
 | 
									do {
 | 
				
			||||||
 | 
										if (cup->numbonus >= MAXBONUSLIST)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											deh_warning("%s Cup: reached max bonus list (%d)\n", cup->name, MAXBONUSLIST);
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										cup->levellist[CUPCACHE_BONUS + cup->numbonus] = Z_StrDup(tmp);
 | 
				
			||||||
 | 
										cup->cachedlevels[CUPCACHE_BONUS + cup->numbonus] = NEXTMAP_INVALID;
 | 
				
			||||||
 | 
										cup->numbonus++;
 | 
				
			||||||
 | 
									} while((tmp = strtok(NULL,",")) != NULL);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else if (fastcmp(word, "SPECIALSTAGE"))
 | 
								else if (fastcmp(word, "SPECIALSTAGE"))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -343,8 +343,9 @@ typedef struct
 | 
				
			||||||
// Keep in mind that it may encourage people making overly long cups just because they "can", and would be a waste of memory.
 | 
					// Keep in mind that it may encourage people making overly long cups just because they "can", and would be a waste of memory.
 | 
				
			||||||
#define MAXLEVELLIST 5
 | 
					#define MAXLEVELLIST 5
 | 
				
			||||||
#define CUPCACHE_BONUS MAXLEVELLIST
 | 
					#define CUPCACHE_BONUS MAXLEVELLIST
 | 
				
			||||||
#define CUPCACHE_SPECIAL MAXLEVELLIST+1
 | 
					#define MAXBONUSLIST 2
 | 
				
			||||||
#define CUPCACHE_MAX CUPCACHE_SPECIAL+1
 | 
					#define CUPCACHE_SPECIAL (CUPCACHE_BONUS+MAXBONUSLIST)
 | 
				
			||||||
 | 
					#define CUPCACHE_MAX (CUPCACHE_SPECIAL+1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct cupheader_s
 | 
					typedef struct cupheader_s
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -354,6 +355,7 @@ typedef struct cupheader_s
 | 
				
			||||||
	char *levellist[CUPCACHE_MAX];			///< List of levels that belong to this cup
 | 
						char *levellist[CUPCACHE_MAX];			///< List of levels that belong to this cup
 | 
				
			||||||
	INT16 cachedlevels[CUPCACHE_MAX];		///< IDs in levellist, bonusgame, and specialstage
 | 
						INT16 cachedlevels[CUPCACHE_MAX];		///< IDs in levellist, bonusgame, and specialstage
 | 
				
			||||||
	UINT8 numlevels;						///< Number of levels defined in levellist
 | 
						UINT8 numlevels;						///< Number of levels defined in levellist
 | 
				
			||||||
 | 
						UINT8 numbonus;							///< Number of bonus stages defined
 | 
				
			||||||
	UINT8 emeraldnum;						///< ID of Emerald to use for special stage (1-7 for Chaos Emeralds, 8-14 for Super Emeralds, 0 for no emerald)
 | 
						UINT8 emeraldnum;						///< ID of Emerald to use for special stage (1-7 for Chaos Emeralds, 8-14 for Super Emeralds, 0 for no emerald)
 | 
				
			||||||
	SINT8 unlockrequired;					///< An unlockable is required to select this cup. -1 for no unlocking required.
 | 
						SINT8 unlockrequired;					///< An unlockable is required to select this cup. -1 for no unlocking required.
 | 
				
			||||||
	struct cupheader_s *next;				///< Next cup in linked list
 | 
						struct cupheader_s *next;				///< Next cup in linked list
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										13
									
								
								src/g_game.c
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								src/g_game.c
									
										
									
									
									
								
							| 
						 | 
					@ -3747,11 +3747,16 @@ static void G_GetNextMap(void)
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			INT32 lastgametype = gametype;
 | 
								INT32 lastgametype = gametype;
 | 
				
			||||||
 | 
								// 5 levels, 2 bonus stages: after rounds 2 and 4 (but flexible enough to accomodate other solutions)
 | 
				
			||||||
 | 
								UINT8 bonusmodulo = (grandprixinfo.cup->numlevels+1)/(grandprixinfo.cup->numbonus+1);
 | 
				
			||||||
 | 
								UINT8 bonusindex = (grandprixinfo.roundnum / bonusmodulo) - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// If we're in a GP event, don't immediately follow it up with another.
 | 
								// If we're in a GP event, don't immediately follow it up with another.
 | 
				
			||||||
			// I also suspect this will not work with online GP so I'm gonna prevent it right now.
 | 
								// I also suspect this will not work with online GP so I'm gonna prevent it right now.
 | 
				
			||||||
			// The server might have to communicate eventmode (alongside other GP data) in XD_MAP later.
 | 
								// The server might have to communicate eventmode (alongside other GP data) in XD_MAP later.
 | 
				
			||||||
			if (netgame || grandprixinfo.eventmode != GPEVENT_NONE)
 | 
								if (netgame)
 | 
				
			||||||
 | 
									;
 | 
				
			||||||
 | 
								else if	(grandprixinfo.eventmode != GPEVENT_NONE)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				grandprixinfo.eventmode = GPEVENT_NONE;
 | 
									grandprixinfo.eventmode = GPEVENT_NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3789,11 +3794,13 @@ static void G_GetNextMap(void)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else if (grandprixinfo.roundnum == (grandprixinfo.cup->numlevels+1)/2) // 3 for a 5-map cup
 | 
								else if ((grandprixinfo.cup->numbonus > 0)
 | 
				
			||||||
 | 
									&& (grandprixinfo.roundnum % bonusmodulo) == 0
 | 
				
			||||||
 | 
									&& bonusindex < MAXBONUSLIST)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				// todo any other condition?
 | 
									// todo any other condition?
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					const INT32 cupLevelNum = grandprixinfo.cup->cachedlevels[CUPCACHE_BONUS];
 | 
										const INT32 cupLevelNum = grandprixinfo.cup->cachedlevels[CUPCACHE_BONUS + bonusindex];
 | 
				
			||||||
					if (cupLevelNum < nummapheaders && mapheaderinfo[cupLevelNum]
 | 
										if (cupLevelNum < nummapheaders && mapheaderinfo[cupLevelNum]
 | 
				
			||||||
						&& mapheaderinfo[cupLevelNum]->typeoflevel & (TOL_BOSS|TOL_BATTLE))
 | 
											&& mapheaderinfo[cupLevelNum]->typeoflevel & (TOL_BOSS|TOL_BATTLE))
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue