/***********************************************************
* Rocks'n'Diamonds -- McDuffin Strikes Back! *
*----------------------------------------------------------*
-* ©1995 Artsoft Development *
-* Holger Schemel *
-* 33659 Bielefeld-Senne *
-* Telefon: (0521) 493245 *
-* eMail: aeglos@valinor.owl.de *
-* aeglos@uni-paderborn.de *
-* q99492@pbhrzx.uni-paderborn.de *
+* (c) 1995-98 Artsoft Entertainment *
+* Holger Schemel *
+* Oststrasse 11a *
+* 33604 Bielefeld *
+* phone: ++49 +521 290471 *
+* email: aeglos@valinor.owl.de *
*----------------------------------------------------------*
* files.h *
***********************************************************/
#include "files.h"
#include "tools.h"
#include "misc.h"
+#include "tape.h"
+#include "joystick.h"
BOOL CreateNewScoreFile()
{
FILE *file;
sprintf(filename,"%s/%s/%s",
- SCORE_PATH,leveldir[leveldir_nr].filename,SCORE_FILENAME);
+ level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
if (!(file=fopen(filename,"w")))
return(FALSE);
strncpy(empty_alias,EMPTY_ALIAS,MAX_NAMELEN-1);
fputs(SCORE_COOKIE,file); /* Formatkennung */
- for(i=0;i<LEVELDIR_SIZE(leveldir[leveldir_nr]);i++)
+ for(i=0;i<leveldir[leveldir_nr].levels;i++)
{
for(j=0;j<MAX_SCORE_ENTRIES;j++)
{
if (mode==PLAYER_LEVEL)
sprintf(filename,"%s/%s/%s",
- NAMES_PATH,leveldir[leveldir_nr].filename,NAMES_FILENAME);
+ level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
else
sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
char cookie[MAX_FILENAME];
FILE *file;
- sprintf(filename,"%s/%s",LEVEL_PATH,LEVDIR_FILENAME);
+ sprintf(filename,"%s/%s",level_directory,LEVDIR_FILENAME);
if (!(file=fopen(filename,"r")))
{
{
fscanf(file,"%s",leveldir[i].filename);
fscanf(file,"%s",leveldir[i].name);
- fscanf(file,"%d",&leveldir[i].num_ready);
- fscanf(file,"%d",&leveldir[i].num_free);
+ fscanf(file,"%d",&leveldir[i].levels);
+ fscanf(file,"%d",&leveldir[i].readonly);
if (feof(file))
break;
FILE *file;
sprintf(filename,"%s/%s/%d",
- LEVEL_PATH,leveldir[leveldir_nr].filename,level_nr);
+ level_directory,leveldir[leveldir_nr].filename,level_nr);
if (!(file=fopen(filename,"r")))
{
{
fgets(cookie,LEVEL_COOKIE_LEN,file);
fgetc(file);
+
if (strcmp(cookie,LEVEL_COOKIE)) /* ungültiges Format? */
{
fprintf(stderr,"%s: wrong format of level file '%s'!\n",
level.edelsteine = (fgetc(file)<<8) | fgetc(file);
for(i=0;i<MAX_LEVNAMLEN;i++)
level.name[i] = fgetc(file);
- for(i=0;i<MAX_SC_ENTRIES;i++)
+ level.name[MAX_LEVNAMLEN-1] = 0;
+ for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
level.score[i] = fgetc(file);
- level.amoebe_inhalt = fgetc(file);
for(i=0;i<4;i++)
for(y=0;y<3;y++)
for(x=0;x<3;x++)
level.tempo_amoebe = fgetc(file);
level.dauer_sieb = fgetc(file);
level.dauer_ablenk = fgetc(file);
+ level.amoebe_inhalt = fgetc(file);
- for(i=0;i<19;i++) /* Rest reserviert / Headergröße 80 Bytes */
+ for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
fgetc(file);
for(y=0;y<MAX_LEV_FIELDY;y++)
level.time = 100;
level.edelsteine = 0;
strncpy(level.name,"Nameless Level",MAX_LEVNAMLEN-1);
- for(i=0;i<MAX_SC_ENTRIES;i++)
+ for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
level.score[i] = 10;
- level.amoebe_inhalt = EL_DIAMANT;
for(i=0;i<4;i++)
for(y=0;y<3;y++)
for(x=0;x<3;x++)
level.tempo_amoebe = 10;
level.dauer_sieb = 10;
level.dauer_ablenk = 10;
+ level.amoebe_inhalt = EL_DIAMANT;
for(y=0;y<STD_LEV_FIELDY;y++)
for(x=0;x<STD_LEV_FIELDX;x++)
char filename[MAX_FILENAME];
char cookie[MAX_FILENAME];
FILE *file;
+ BOOL levelrec_10 = FALSE;
+#ifndef MSDOS
sprintf(filename,"%s/%s/%d.tape",
- LEVEL_PATH,leveldir[leveldir_nr].filename,level_nr);
+ level_directory,leveldir[leveldir_nr].filename,level_nr);
+#else
+ sprintf(filename,"%s/%s/%d.tap",
+ level_directory,leveldir[leveldir_nr].filename,level_nr);
+#endif
if ((file=fopen(filename,"r")))
{
fgets(cookie,LEVELREC_COOKIE_LEN,file);
fgetc(file);
- if (strcmp(cookie,LEVELREC_COOKIE)) /* ungültiges Format? */
+ if (!strcmp(cookie,LEVELREC_COOKIE_10)) /* old 1.0 tape format */
+ levelrec_10 = TRUE;
+ else if (strcmp(cookie,LEVELREC_COOKIE)) /* unknown tape format */
{
fprintf(stderr,"%s: wrong format of level recording file '%s'!\n",
progname,filename);
tape.level_nr = level_nr;
tape.counter = 0;
+ tape.changed = FALSE;
+
tape.recording = FALSE;
tape.playing = FALSE;
tape.pausing = FALSE;
for(i=0;i<tape.length;i++)
{
- if (i>=MAX_TAPELEN)
+ int j;
+
+ if (i >= MAX_TAPELEN)
break;
- tape.pos[i].joystickdata = fgetc(file);
- tape.pos[i].delay = fgetc(file);
+
+ for(j=0; j<MAX_PLAYERS; j++)
+ {
+ if (levelrec_10 && j>0)
+ {
+ tape.pos[i].joystickdata[j] = MV_NO_MOVING;
+ continue;
+ }
+ tape.pos[i].joystickdata[j] = fgetc(file);
+ }
+
+ tape.pos[i].delay = fgetc(file);
+
if (feof(file))
break;
}
+ fclose(file);
+
if (i != tape.length)
fprintf(stderr,"%s: level recording file '%s' corrupted!\n",
progname,filename);
- fclose(file);
-
- master_tape = tape;
+ tape.length_seconds = GetTapeLength();
}
void LoadScore(int level_nr)
FILE *file;
sprintf(filename,"%s/%s/%s",
- SCORE_PATH,leveldir[leveldir_nr].filename,SCORE_FILENAME);
+ level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
if (!(file=fopen(filename,"r")))
{
FILE *file;
char *login_name = GetLoginName();
struct PlayerInfo default_player, new_player;
+ int version_10_file = FALSE;
if (mode==PLAYER_LEVEL)
sprintf(filename,"%s/%s/%s",
- NAMES_PATH,leveldir[leveldir_nr].filename,NAMES_FILENAME);
+ level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
else
sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
default_player.handicap = 0;
default_player.setup = DEFAULT_SETUP;
default_player.leveldir_nr = 0;
+ default_player.level_nr = 0;
new_player = default_player;
if (file)
{
fgets(cookie,NAMES_COOKIE_LEN,file);
- if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
+ if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
+ version_10_file = TRUE;
+ else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
{
fprintf(stderr,"%s: wrong format of names file '%s'!\n",
progname,filename);
if (!file)
{
- player = default_player;
- level_nr = default_player.handicap;
+ *local_player = default_player;
+ level_nr = default_player.level_nr;
return;
}
new_player.handicap = fgetc(file);
new_player.setup = (fgetc(file)<<8) | fgetc(file);
new_player.leveldir_nr = fgetc(file);
+ if (!version_10_file)
+ {
+ new_player.level_nr = fgetc(file);
+ for(i=0;i<10;i++) /* currently unused bytes */
+ fgetc(file);
+ }
+ else
+ new_player.level_nr = new_player.handicap;
if (feof(file)) /* Spieler noch nicht in Liste enthalten */
{
fputc(new_player.setup / 256,file);
fputc(new_player.setup % 256,file);
fputc(new_player.leveldir_nr,file);
+ if (!version_10_file)
+ {
+ fputc(new_player.level_nr,file);
+ for(i=0;i<10;i++) /* currently unused bytes */
+ fputc(0,file);
+ }
}
break;
}
if (mode==PLAYER_SETUP)
{
- player = new_player;
- if (player.leveldir_nr < num_leveldirs)
- leveldir_nr = player.leveldir_nr;
+ *local_player = new_player;
+ if (local_player->leveldir_nr < num_leveldirs)
+ leveldir_nr = local_player->leveldir_nr;
else
leveldir_nr = 0;
}
else
- player.handicap = new_player.handicap;
+ {
+ local_player->handicap = new_player.handicap;
+ local_player->level_nr = new_player.level_nr;
+ }
- level_nr = player.handicap;
+ level_nr = local_player->level_nr;
fclose(file);
}
FILE *file;
sprintf(filename,"%s/%s/%d",
- LEVEL_PATH,leveldir[leveldir_nr].filename,level_nr);
+ level_directory,leveldir[leveldir_nr].filename,level_nr);
if (!(file=fopen(filename,"w")))
{
for(i=0;i<MAX_LEVNAMLEN;i++)
fputc(level.name[i],file);
- for(i=0;i<MAX_SC_ENTRIES;i++)
+ for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
fputc(level.score[i],file);
- fputc(level.amoebe_inhalt,file);
for(i=0;i<4;i++)
for(y=0;y<3;y++)
for(x=0;x<3;x++)
fputc(level.tempo_amoebe,file);
fputc(level.dauer_sieb,file);
fputc(level.dauer_ablenk,file);
+ fputc(level.amoebe_inhalt,file);
- for(i=0;i<19;i++) /* Rest reserviert / Headergröße 80 Bytes */
+ for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
fputc(0,file);
for(y=0;y<lev_fieldy;y++)
FILE *file;
BOOL new_tape = TRUE;
+#ifndef MSDOS
sprintf(filename,"%s/%s/%d.tape",
- LEVEL_PATH,leveldir[leveldir_nr].filename,level_nr);
+ level_directory,leveldir[leveldir_nr].filename,level_nr);
+#else
+ sprintf(filename,"%s/%s/%d.tap",
+ level_directory,leveldir[leveldir_nr].filename,level_nr);
+#endif
/* Testen, ob bereits eine Aufnahme existiert */
if ((file=fopen(filename,"r")))
fputs(LEVELREC_COOKIE,file); /* Formatkennung */
fputc(0x0a,file);
- tape = master_tape;
-
fputc((tape.random_seed >> 24) & 0xff,file);
fputc((tape.random_seed >> 16) & 0xff,file);
fputc((tape.random_seed >> 8) & 0xff,file);
for(i=0;i<tape.length;i++)
{
- fputc(tape.pos[i].joystickdata,file);
+ int j;
+
+ for(j=0; j<MAX_PLAYERS; j++)
+ fputc(tape.pos[i].joystickdata[j],file);
+
fputc(tape.pos[i].delay,file);
}
chmod(filename, LEVREC_PERMS);
+ tape.changed = FALSE;
+
if (new_tape)
AreYouSure("tape saved !",AYS_CONFIRM);
}
FILE *file;
sprintf(filename,"%s/%s/%s",
- SCORE_PATH,leveldir[leveldir_nr].filename,SCORE_FILENAME);
+ level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
if (!(file=fopen(filename,"r+")))
{
char cookie[MAX_FILENAME];
FILE *file;
struct PlayerInfo default_player;
+ int version_10_file = FALSE;
if (mode==PLAYER_LEVEL)
sprintf(filename,"%s/%s/%s",
- NAMES_PATH,leveldir[leveldir_nr].filename,NAMES_FILENAME);
+ level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
else
sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
}
fgets(cookie,NAMES_COOKIE_LEN,file);
- if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
+ if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
+ version_10_file = TRUE;
+ else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
{
fprintf(stderr,"%s: wrong format of names file '%s'!\n",
progname,filename);
default_player.handicap = fgetc(file);
default_player.setup = (fgetc(file)<<8) | fgetc(file);
default_player.leveldir_nr = fgetc(file);
+ if (!version_10_file)
+ {
+ default_player.level_nr = fgetc(file);
+ for(i=0;i<10;i++) /* currently unused bytes */
+ fgetc(file);
+ }
+ else
+ default_player.level_nr = default_player.handicap;
if (feof(file)) /* Spieler noch nicht in Liste enthalten */
break;
else /* prüfen, ob Spieler in Liste enthalten */
- if (!strncmp(default_player.login_name,player.login_name,MAX_NAMELEN-1))
+ if (!strncmp(default_player.login_name,
+ local_player->login_name, MAX_NAMELEN-1))
{
- fseek(file,-(2*MAX_NAMELEN+1+2+1),SEEK_CUR);
+ fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
break;
}
}
+ local_player->level_nr = level_nr;
+
for(i=0;i<MAX_NAMELEN;i++)
- fputc(player.login_name[i],file);
+ fputc(local_player->login_name[i],file);
for(i=0;i<MAX_NAMELEN;i++)
- fputc(player.alias_name[i],file);
- fputc(player.handicap,file);
- fputc(player.setup / 256,file);
- fputc(player.setup % 256,file);
- fputc(player.leveldir_nr,file);
+ fputc(local_player->alias_name[i],file);
+ fputc(local_player->handicap,file);
+ fputc(local_player->setup / 256,file);
+ fputc(local_player->setup % 256,file);
+ fputc(local_player->leveldir_nr,file);
+ if (!version_10_file)
+ {
+ fputc(local_player->level_nr,file);
+ for(i=0;i<10;i++) /* currently unused bytes */
+ fputc(0,file);
+ }
fclose(file);
}
if (joystick_status==JOYSTICK_OFF)
return;
+#ifndef MSDOS
if (!(file=fopen(JOYDAT_FILE,"r")))
return;
fclose(file);
CheckJoystickData();
+#else
+ load_joystick_data(JOYDAT_FILE);
+#endif
}
void SaveJoystickData()
if (joystick_status==JOYSTICK_OFF)
return;
+#ifndef MSDOS
CheckJoystickData();
if (!(file=fopen(JOYDAT_FILE,"w")))
fclose(file);
chmod(JOYDAT_FILE, JOYDAT_PERMS);
+#else
+ save_joystick_data(JOYDAT_FILE);
+#endif
+
}