This raises the max number of levels per episode to 32 and alters the game to use dynamically allocated memory for level and music names and filenames. No null pointer checks yet.

git-svn-id: https://svn.eduke32.com/eduke32@381 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2006-12-04 22:05:30 +00:00
parent 3a811040af
commit 57042cd9a7
7 changed files with 71 additions and 50 deletions

View file

@ -77,6 +77,7 @@ extern int conversion, shareware, gametype;
#define FOURSLEIGHT (1<<8)
#define MAXVOLUMES 7
#define MAXLEVELS 32
#include "types.h"
#include "file_lib.h"
@ -473,8 +474,8 @@ extern long *actorLoadEventScrptr[MAXTILES];
extern char actortype[MAXTILES];
extern char *music_pointer;
extern char music_fn[MAXVOLUMES+1][11][13],music_select;
extern char env_music_fn[MAXVOLUMES+1][13];
extern char *music_fn[MAXVOLUMES+1][MAXLEVELS],music_select;
extern char env_music_fn[MAXVOLUMES+1][BMAX_PATH];
extern short camsprite;
// extern char gotz;
@ -527,14 +528,14 @@ extern char screencapt;
extern short soundps[NUM_SOUNDS],soundpe[NUM_SOUNDS],soundvo[NUM_SOUNDS];
extern char soundpr[NUM_SOUNDS],soundm[NUM_SOUNDS];
extern long soundsiz[NUM_SOUNDS];
extern char level_names[MAXVOLUMES*11][33];
extern long partime[MAXVOLUMES*11],designertime[MAXVOLUMES*11];
extern char *level_names[MAXVOLUMES*MAXLEVELS];
extern long partime[MAXVOLUMES*MAXLEVELS],designertime[MAXVOLUMES*MAXLEVELS];
extern char volume_names[MAXVOLUMES][33];
extern char skill_names[5][33];
extern int framerate;
#define MAXGAMETYPES 32
#define MAXGAMETYPES 16
extern char gametype_names[MAXGAMETYPES][33];
extern int gametype_flags[MAXGAMETYPES];
extern char num_gametypes;
@ -562,7 +563,7 @@ enum gametypeflags {
#define GTFLAGS(x) (gametype_flags[ud.coop] & x)
extern char level_file_names[MAXVOLUMES*11][BMAX_PATH];
extern char *level_file_names[MAXVOLUMES*MAXLEVELS];
extern char num_volumes;
extern int32 SoundToggle,MusicToggle;

View file

@ -580,7 +580,7 @@ void getpackets(void)
voting = packbuf[2];
vote_episode = packbuf[3];
vote_map = packbuf[4];
Bsprintf(tempbuf,"%s^00 HAS CALLED A VOTE TO CHANGE MAP TO %s (E%dL%d)",ud.user_name[(unsigned char)packbuf[2]],level_names[(unsigned char)(packbuf[3]*11 + packbuf[4])],packbuf[3]+1,packbuf[4]+1);
Bsprintf(tempbuf,"%s^00 HAS CALLED A VOTE TO CHANGE MAP TO %s (E%dL%d)",ud.user_name[(unsigned char)packbuf[2]],level_names[(unsigned char)(packbuf[3]*MAXLEVELS + packbuf[4])],packbuf[3]+1,packbuf[4]+1);
adduserquote(tempbuf);
Bsprintf(tempbuf,"PRESS F1 TO VOTE YES, F2 TO VOTE NO");
adduserquote(tempbuf);
@ -3360,7 +3360,7 @@ void displayrest(long smoothratio)
else a = 182;
minitext(1,a+6,volume_names[ud.volume_number],0,2+8+16);
minitext(1,a+12,level_names[ud.volume_number*11 + ud.level_number],0,2+8+16);
minitext(1,a+12,level_names[ud.volume_number*MAXLEVELS + ud.level_number],0,2+8+16);
}
}
}
@ -7839,9 +7839,9 @@ void nonsharedkeys(void)
{
if (i == 5 && ps[myconnectindex].fta > 0 && ps[myconnectindex].ftq == 26)
{
i = (VOLUMEALL?num_volumes*11:6);
i = (VOLUMEALL?num_volumes*MAXLEVELS:6);
music_select++;
while (!music_fn[0][(unsigned char)music_select][0] && music_select < i)
while ((music_fn[0][(unsigned char)music_select] == NULL) && music_select < i)
music_select++;
if (music_select == i)
music_select = 0;
@ -8739,7 +8739,7 @@ void checkcommandline(int argc,char **argv)
case 'L':
ud.warp_on = 1;
c++;
ud.m_level_number = ud.level_number = (atol(c)-1)%11;
ud.m_level_number = ud.level_number = (atol(c)-1)%MAXLEVELS;
break;
case 'm':
case 'M':
@ -9087,6 +9087,16 @@ void freeconmem(void)
{
int i;
for (i=0;i<MAXLEVELS*MAXVOLUMES;i++)
{
if (level_names[i] != NULL)
Bfree(level_names[i]);
if (level_file_names[i] != NULL)
Bfree(level_file_names[i]);
if (music_fn[0][i] != NULL)
Bfree(music_fn[0][i]);
}
for (i=0;i<MAXQUOTES;i++)
{
if (fta_quotes[i] != NULL)
@ -10059,7 +10069,7 @@ MAIN_LOOP_RESTART:
{
Bsprintf(tempbuf,"%s^00 HAS CALLED A VOTE FOR MAP",ud.user_name[voting]);
gametext(160,40,tempbuf,0,2+8+16);
Bsprintf(tempbuf,"%s (E%dL%d)",level_names[vote_episode*11 + vote_map],vote_episode+1,vote_map+1);
Bsprintf(tempbuf,"%s (E%dL%d)",level_names[vote_episode*MAXLEVELS + vote_map],vote_episode+1,vote_map+1);
gametext(160,48,tempbuf,0,2+8+16);
gametext(160,70,"PRESS F1 TO VOTE YES, F2 TO VOTE NO",0,2+8+16);
}
@ -11378,7 +11388,7 @@ void dobonus(char bonusonly)
if (!lastmapname) lastmapname = Bstrrchr(boardfilename,'/');
if (!lastmapname) lastmapname = boardfilename;
}
else lastmapname = level_names[(ud.volume_number*11)+ud.last_level-1];
else lastmapname = level_names[(ud.volume_number*MAXLEVELS)+ud.last_level-1];
bonuscnt = 0;
@ -11689,7 +11699,7 @@ FRAGBONUS:
if (PLUTOPAK) // JBF 20030804
rotatesprite((260)<<16,36<<16,65536L,0,PLUTOPAKSPRITE+2,0,0,2+8,0,0,xdim-1,ydim-1);
gametext(160,58+2,"MULTIPLAYER TOTALS",0,2+8+16);
gametext(160,58+10,level_names[(ud.volume_number*11)+ud.last_level-1],0,2+8+16);
gametext(160,58+10,level_names[(ud.volume_number*MAXLEVELS)+ud.last_level-1],0,2+8+16);
gametext(160,165,"PRESS ANY KEY TO CONTINUE",0,2+8+16);
@ -11803,11 +11813,11 @@ FRAGBONUS:
totalclock = 0;
tinc = 0;
playerbest = CONFIG_GetMapBestTime(level_file_names[ud.volume_number*11+ud.last_level-1]);
playerbest = CONFIG_GetMapBestTime(level_file_names[ud.volume_number*MAXLEVELS+ud.last_level-1]);
if (ps[myconnectindex].player_par < playerbest || playerbest < 0)
{
CONFIG_SetMapBestTime(level_file_names[ud.volume_number*11+ud.last_level-1], ps[myconnectindex].player_par);
CONFIG_SetMapBestTime(level_file_names[ud.volume_number*MAXLEVELS+ud.last_level-1], ps[myconnectindex].player_par);
// if(playerbest != -1)
// playerbest = ps[myconnectindex].player_par;
}
@ -11819,11 +11829,11 @@ FRAGBONUS:
clockpad = max(clockpad,ij);
if (!(ud.volume_number == 0 && ud.last_level-1 == 7))
{
for (ii=partime[ud.volume_number*11+ud.last_level-1]/(26*60), ij=1; ii>9; ii/=10, ij++) ;
for (ii=partime[ud.volume_number*MAXLEVELS+ud.last_level-1]/(26*60), ij=1; ii>9; ii/=10, ij++) ;
clockpad = max(clockpad,ij);
if (!NAM)
{
for (ii=designertime[ud.volume_number*11+ud.last_level-1]/(26*60), ij=1; ii>9; ii/=10, ij++) ;
for (ii=designertime[ud.volume_number*MAXLEVELS+ud.last_level-1]/(26*60), ij=1; ii>9; ii/=10, ij++) ;
clockpad = max(clockpad,ij);
}
}
@ -11945,16 +11955,16 @@ FRAGBONUS:
if (!(ud.volume_number == 0 && ud.last_level-1 == 7))
{
Bsprintf(tempbuf,"%0*ld:%02ld",clockpad,
(partime[ud.volume_number*11+ud.last_level-1]/(26*60)),
(partime[ud.volume_number*11+ud.last_level-1]/26)%60);
(partime[ud.volume_number*MAXLEVELS+ud.last_level-1]/(26*60)),
(partime[ud.volume_number*MAXLEVELS+ud.last_level-1]/26)%60);
gametext((320>>2)+71,yy+9,tempbuf,0,2+8+16);
yy+=10;
if (!NAM)
{
Bsprintf(tempbuf,"%0*ld:%02ld",clockpad,
(designertime[ud.volume_number*11+ud.last_level-1]/(26*60)),
(designertime[ud.volume_number*11+ud.last_level-1]/26)%60);
(designertime[ud.volume_number*MAXLEVELS+ud.last_level-1]/(26*60)),
(designertime[ud.volume_number*MAXLEVELS+ud.last_level-1]/26)%60);
gametext((320>>2)+71,yy+9,tempbuf,0,2+8+16);
yy+=10;
}

View file

@ -2370,6 +2370,8 @@ char parsecommand(void)
if (*textptr == 0) break;
}
j = 0;
if (music_fn[k][i] == NULL)
music_fn[k][i] = Bcalloc(BMAX_PATH,sizeof(char));
while (isaltok(*(textptr+j)))
{
music_fn[k][i][j] = textptr[j];
@ -2377,7 +2379,7 @@ char parsecommand(void)
}
music_fn[k][i][j] = '\0';
textptr += j;
if (i > 9) break;
if (i > MAXLEVELS-1) break;
i++;
}
}
@ -2393,6 +2395,7 @@ char parsecommand(void)
if (*textptr == 0) break;
}
j = 0;
while (isaltok(*(textptr+j)))
{
env_music_fn[i][j] = textptr[j];
@ -2401,7 +2404,7 @@ char parsecommand(void)
env_music_fn[i][j] = '\0';
textptr += j;
if (i > 9) break;
if (i > MAXVOLUMES-1) break;
i++;
}
}
@ -4506,7 +4509,7 @@ repeatcase:
while (*textptr != 0x0a && *textptr != 0) textptr++;
break;
}
if (k < 0 || k > 10)
if (k < 0 || k > MAXLEVELS-1)
{
initprintf("%s:%ld: error: level number exceeds maximum number of levels per episode.\n",compilefile,line_number);
error++;
@ -4515,9 +4518,13 @@ repeatcase:
}
i = 0;
if (level_file_names[j*MAXLEVELS+k] == NULL)
level_file_names[j*MAXLEVELS+k] = Bcalloc(BMAX_PATH,sizeof(char));
while (*textptr != ' ' && *textptr != '\t' && *textptr != 0x0a)
{
level_file_names[j*11+k][i] = *textptr;
level_file_names[j*MAXLEVELS+k][i] = *textptr;
textptr++,i++;
if (i >= BMAX_PATH)
{
@ -4527,18 +4534,18 @@ repeatcase:
break;
}
}
level_names[j*11+k][i] = '\0';
level_file_names[j*MAXLEVELS+k][i] = '\0';
while (*textptr == ' ' || *textptr == '\t') textptr++;
partime[j*11+k] =
partime[j*MAXLEVELS+k] =
(((*(textptr+0)-'0')*10+(*(textptr+1)-'0'))*26*60)+
(((*(textptr+3)-'0')*10+(*(textptr+4)-'0'))*26);
textptr += 5;
while (*textptr == ' ' || *textptr == '\t') textptr++;
designertime[j*11+k] =
designertime[j*MAXLEVELS+k] =
(((*(textptr+0)-'0')*10+(*(textptr+1)-'0'))*26*60)+
(((*(textptr+3)-'0')*10+(*(textptr+4)-'0'))*26);
@ -4547,19 +4554,22 @@ repeatcase:
i = 0;
if (level_names[j*MAXLEVELS+k] == NULL)
level_names[j*MAXLEVELS+k] = Bcalloc(32,sizeof(char));
while (*textptr != 0x0a && *textptr != 0x0d && *textptr != 0)
{
level_names[j*11+k][i] = toupper(*textptr);
level_names[j*MAXLEVELS+k][i] = toupper(*textptr);
textptr++,i++;
if (i >= (signed)sizeof(level_names[j*11+k])-1)
if (i >= 32)
{
initprintf("%s:%ld: error: level name exceeds limit of %ld characters.\n",compilefile,line_number,sizeof(level_names[j*11+k])-1);
initprintf("%s:%ld: error: level name exceeds limit of %ld characters.\n",compilefile,line_number,sizeof(level_names[j*MAXLEVELS+k])-1);
error++;
while (*textptr != 0x0a && *textptr != 0x0d && *textptr != 0) textptr++;
break;
}
}
level_names[j*11+k][i] = '\0';
level_names[j*MAXLEVELS+k][i] = '\0';
return 0;
case CON_DEFINEQUOTE:

View file

@ -53,8 +53,8 @@ short mirrorwall[64], mirrorsector[64], mirrorcnt;
int current_menu;
char level_names[MAXVOLUMES*11][33],level_file_names[MAXVOLUMES*11][BMAX_PATH];
long partime[MAXVOLUMES*11],designertime[MAXVOLUMES*11];
char *level_names[MAXVOLUMES*MAXLEVELS],*level_file_names[MAXVOLUMES*MAXLEVELS];
long partime[MAXVOLUMES*MAXLEVELS],designertime[MAXVOLUMES*MAXLEVELS];
char volume_names[MAXVOLUMES][33] = { "L.A. MELTDOWN", "LUNAR APOCALYPSE", "SHRAPNEL CITY" };
char skill_names[5][33] = { "PIECE OF CAKE", "LET'S ROCK", "COME GET SOME", "DAMN I'M GOOD" };
@ -120,8 +120,8 @@ long script[MAXSCRIPTSIZE+16];
char display_mirror,typebuflen,typebuf[141];
char music_fn[MAXVOLUMES+1][11][13],music_select;
char env_music_fn[MAXVOLUMES+1][13];
char *music_fn[MAXVOLUMES+1][MAXLEVELS],music_select;
char env_music_fn[MAXVOLUMES+1][BMAX_PATH];
char rtsplaying;

View file

@ -909,7 +909,7 @@ void menus(void)
gametext(90+60,60,gametype_names[ud.m_coop],0,26);
minitext(90+60,60+8, volume_names[ud.m_volume_number],0,26);
minitext(90+60,60+8+8, level_names[11*ud.m_volume_number+ud.m_level_number],0,26);
minitext(90+60,60+8+8, level_names[MAXLEVELS*ud.m_volume_number+ud.m_level_number],0,26);
if (ud.m_monsters_off == 0 || ud.m_player_skill > 0)
minitext(90+60,60+8+8+8, skill_names[ud.m_player_skill],0,26);
else minitext(90+60,60+8+8+8, "NONE",0,28);
@ -1012,7 +1012,7 @@ void menus(void)
gametext(c+70,57+16-7-9,volume_names[ud.m_volume_number],0,2+8+16);
gametext(c+70,57+16+16-7-9,&level_names[11*ud.m_volume_number+ud.m_level_number][0],0,2+8+16);
gametext(c+70,57+16+16-7-9,&level_names[MAXLEVELS*ud.m_volume_number+ud.m_level_number][0],0,2+8+16);
if (ud.m_monsters_off == 0 || ud.m_player_skill > 0)
gametext(c+70,57+16+16+16-7-9,skill_names[ud.m_player_skill],0,2+8+16);
@ -4700,7 +4700,7 @@ VOLUME_ALL_40x:
gametext(c+70,57+16-7-9,volume_names[ud.m_volume_number],MENUHIGHLIGHT(1),2+8+16);
}
gametext(c+70,57+16+16-7-9,&level_names[11*ud.m_volume_number+ud.m_level_number][0],MENUHIGHLIGHT(2),2+8+16);
gametext(c+70,57+16+16-7-9,&level_names[MAXLEVELS*ud.m_volume_number+ud.m_level_number][0],MENUHIGHLIGHT(2),2+8+16);
gametext(c+70,57+16+16+16-7-9,ud.m_monsters_off == 0 || ud.m_player_skill > 0?skill_names[ud.m_player_skill]:"NONE",MENUHIGHLIGHT(3),2+8+16);

View file

@ -1491,7 +1491,7 @@ void dofrontscreens(char *statustext)
else
{
menutext(160,90,0,0,"ENTERING");
menutext(160,90+16+8,0,0,level_names[(ud.volume_number*11) + ud.level_number]);
menutext(160,90+16+8,0,0,level_names[(ud.volume_number*MAXLEVELS) + ud.level_number]);
}
if (statustext) gametext(160,180,statustext,0,2+8+16);
@ -1616,7 +1616,7 @@ int enterlevel(char g)
Bstrcpy(levname, boardfilename);
Bsprintf(apptitle," - %s",levname);
}
else Bsprintf(apptitle," - %s",level_names[(ud.volume_number*11)+ud.level_number]);
else Bsprintf(apptitle," - %s",level_names[(ud.volume_number*MAXLEVELS)+ud.level_number]);
Bstrcat(tempbuf,apptitle);
wm_setapptitle(tempbuf);
@ -1657,16 +1657,16 @@ int enterlevel(char g)
if (!loadmaphack(levname)) initprintf("Loaded map hack file %s\n",levname);
}
}
else if (loadboard(level_file_names[(ud.volume_number*11)+ud.level_number],0,&ps[0].posx, &ps[0].posy, &ps[0].posz, &ps[0].ang,&ps[0].cursectnum) == -1)
else if (loadboard(level_file_names[(ud.volume_number*MAXLEVELS)+ud.level_number],0,&ps[0].posx, &ps[0].posy, &ps[0].posz, &ps[0].ang,&ps[0].cursectnum) == -1)
{
initprintf("Map %s not found!\n",level_file_names[(ud.volume_number*11)+ud.level_number]);
initprintf("Map %s not found!\n",level_file_names[(ud.volume_number*MAXLEVELS)+ud.level_number]);
//gameexit(tempbuf);
return 1;
}
else
{
char *p;
strcpy(levname, level_file_names[(ud.volume_number*11)+ud.level_number]);
strcpy(levname, level_file_names[(ud.volume_number*MAXLEVELS)+ud.level_number]);
p = Bstrrchr(levname,'.');
if (!p) strcat(levname,".mhk");
else
@ -1683,14 +1683,14 @@ int enterlevel(char g)
else
{
l = strlen(level_file_names[(ud.volume_number*11)+ud.level_number]);
copybufbyte(level_file_names[(ud.volume_number*11)+ud.level_number],&levname[0],l);
l = strlen(level_file_names[(ud.volume_number*MAXLEVELS)+ud.level_number]);
copybufbyte(level_file_names[(ud.volume_number*MAXLEVELS)+ud.level_number],&levname[0],l);
levname[l] = 255;
levname[l+1] = 0;
if (loadboard(levname,1,&ps[0].posx, &ps[0].posy, &ps[0].posz, &ps[0].ang,&ps[0].cursectnum) == -1)
{
initprintf("Map %s not found!\n",level_file_names[(ud.volume_number*11)+ud.level_number]);
initprintf("Map %s not found!\n",level_file_names[(ud.volume_number*MAXLEVELS)+ud.level_number]);
//gameexit(tempbuf);
return 1;
}
@ -1729,7 +1729,7 @@ int enterlevel(char g)
if (ud.recstat != 2)
{
music_select = (ud.volume_number*11) + ud.level_number;
music_select = (ud.volume_number*MAXLEVELS) + ud.level_number;
playmusic(&music_fn[0][(unsigned char)music_select][0]);
}

View file

@ -353,7 +353,7 @@ int loadplayer(signed char spot)
clearsoundlocks();
cacheit();
music_select = (ud.volume_number*11) + ud.level_number;
music_select = (ud.volume_number*MAXLEVELS) + ud.level_number;
playmusic(&music_fn[0][(unsigned char)music_select][0]);
ps[myconnectindex].gm = MODE_GAME;