#include "tape.h"
#include "joystick.h"
+static char *getUserdataDir()
+{
+ static char *userdata_dir = NULL;
+
+ if (!userdata_dir)
+ {
+ char *home_dir = getHomeDir();
+ char *data_dir = USERDATA_DIRECTORY;
+
+ userdata_dir = checked_malloc(strlen(home_dir) + strlen(data_dir) + 2);
+ sprintf(userdata_dir, "%s/%s", home_dir, data_dir);
+ }
+
+ return userdata_dir;
+}
+
+static char *getSetupDir()
+{
+ return getUserdataDir();
+}
+
+static char *getTapeDir(char *level_subdir)
+{
+ static char *tape_dir = NULL;
+ char *data_dir = getUserdataDir();
+ char *tape_subdir = TAPEDATA_DIRECTORY;
+
+ if (tape_dir)
+ free(tape_dir);
+
+ tape_dir = checked_malloc(strlen(data_dir) + strlen(tape_subdir) +
+ strlen(level_subdir) + 3);
+ sprintf(tape_dir, "%s/%s%s%s", data_dir, tape_subdir,
+ (strlen(level_subdir) > 0 ? "/" : ""), level_subdir);
+
+ return tape_dir;
+}
+
+static void createDirectory(char *dir, char *text)
+{
+ if (access(dir, F_OK) != 0)
+ if (mkdir(dir, USERDATA_DIR_MODE) != 0)
+ Error(ERR_WARN, "cannot create %s directory '%s'", text, dir);
+}
+
+void InitUserdataDirectory()
+{
+ createDirectory(getUserdataDir(), "user data");
+}
+
+static void InitTapeDirectory(char *level_subdir)
+{
+ createDirectory(getTapeDir(""), "main tape data");
+ createDirectory(getTapeDir(level_subdir), "level tape data");
+}
+
boolean LoadLevelInfo()
{
int i;
FILE *file;
boolean levelrec_10 = FALSE;
-#ifndef MSDOS
- sprintf(filename,"%s/%s/%d.tape",
- level_directory,leveldir[leveldir_nr].filename,level_nr);
-#else
- sprintf(filename,"%s/%s/%d.tap",
- level_directory,leveldir[leveldir_nr].filename,level_nr);
-#endif
+ sprintf(filename, "%s/%d.%s",
+ getTapeDir(leveldir[leveldir_nr].filename),
+ level_nr, TAPEFILE_EXTENSION);
- if ((file=fopen(filename,"r")))
+ if ((file = fopen(filename, "r")))
{
- fgets(cookie,LEVELREC_COOKIE_LEN,file);
+ fgets(cookie, LEVELREC_COOKIE_LEN, file);
fgetc(file);
- if (!strcmp(cookie,LEVELREC_COOKIE_10)) /* old 1.0 tape format */
+ if (!strcmp(cookie, LEVELREC_COOKIE_10)) /* old 1.0 tape format */
levelrec_10 = TRUE;
- else if (strcmp(cookie,LEVELREC_COOKIE)) /* unknown tape format */
+ else if (strcmp(cookie, LEVELREC_COOKIE)) /* unknown tape format */
{
Error(ERR_WARN, "wrong format of level recording file '%s'", filename);
fclose(file);
tape.playing = FALSE;
tape.pausing = FALSE;
- for(i=0;i<tape.length;i++)
+ for(i=0; i<tape.length; i++)
{
int j;
for(j=0; j<MAX_PLAYERS; j++)
{
- if (levelrec_10 && j>0)
+ if (levelrec_10 && j > 0)
{
tape.pos[i].action[j] = MV_NO_MOVING;
continue;
tape.pos[i].delay = fgetc(file);
+ if (levelrec_10)
+ {
+ /* eliminate possible diagonal moves in old tapes */
+ /* this is only for backward compatibility */
+
+ byte joy_dir[4] = { JOY_LEFT, JOY_RIGHT, JOY_UP, JOY_DOWN };
+ byte action = tape.pos[i].action[0];
+ int k, num_moves = 0;
+
+ for (k=0; k<4; k++)
+ {
+ if (action & joy_dir[k])
+ {
+ tape.pos[i + num_moves].action[0] = joy_dir[k];
+ if (num_moves > 0)
+ tape.pos[i + num_moves].delay = 0;
+ num_moves++;
+ }
+ }
+
+ if (num_moves > 1)
+ {
+ num_moves--;
+ i += num_moves;
+ tape.length += num_moves;
+ }
+ }
+
if (feof(file))
break;
}
FILE *file;
boolean new_tape = TRUE;
-#ifndef MSDOS
- sprintf(filename,"%s/%s/%d.tape",
- level_directory,leveldir[leveldir_nr].filename,level_nr);
-#else
- sprintf(filename,"%s/%s/%d.tap",
- level_directory,leveldir[leveldir_nr].filename,level_nr);
-#endif
+ sprintf(filename, "%s/%d.%s",
+ getTapeDir(leveldir[leveldir_nr].filename),
+ level_nr, TAPEFILE_EXTENSION);
+
+ InitTapeDirectory(leveldir[leveldir_nr].filename);
/* Testen, ob bereits eine Aufnahme existiert */
- if ((file=fopen(filename,"r")))
+ if ((file = fopen(filename, "r")))
{
new_tape = FALSE;
fclose(file);
- if (!Request("Replace old tape ?",REQ_ASK))
+ if (!Request("Replace old tape ?", REQ_ASK))
return;
}
- if (!(file=fopen(filename,"w")))
+ if (!(file = fopen(filename, "w")))
{
Error(ERR_WARN, "cannot save level recording file '%s'", filename);
return;
}
- fputs(LEVELREC_COOKIE,file); /* Formatkennung */
- fputc(0x0a,file);
+ fputs(LEVELREC_COOKIE, file); /* Formatkennung */
+ fputc(0x0a, file);
fputc((tape.random_seed >> 24) & 0xff,file);
fputc((tape.random_seed >> 16) & 0xff,file);
fputc((tape.length >> 8) & 0xff,file);
fputc((tape.length >> 0) & 0xff,file);
- for(i=0;i<tape.length;i++)
+ for(i=0; i<tape.length; i++)
{
int j;
for(j=0; j<MAX_PLAYERS; j++)
- fputc(tape.pos[i].action[j],file);
+ fputc(tape.pos[i].action[j], file);
- fputc(tape.pos[i].delay,file);
+ fputc(tape.pos[i].delay, file);
}
fclose(file);
#define SETUP_TOKEN_FADING 8
#define SETUP_TOKEN_AUTORECORD 9
#define SETUP_TOKEN_QUICK_DOORS 10
-#define SETUP_TOKEN_ALIAS_NAME 11
-
-#define SETUP_TOKEN_USE_JOYSTICK 12
-#define SETUP_TOKEN_JOY_DEVICE_NAME 13
-#define SETUP_TOKEN_JOY_XLEFT 14
-#define SETUP_TOKEN_JOY_XMIDDLE 15
-#define SETUP_TOKEN_JOY_XRIGHT 16
-#define SETUP_TOKEN_JOY_YUPPER 17
-#define SETUP_TOKEN_JOY_YMIDDLE 18
-#define SETUP_TOKEN_JOY_YLOWER 19
-#define SETUP_TOKEN_JOY_SNAP 20
-#define SETUP_TOKEN_JOY_BOMB 21
-#define SETUP_TOKEN_KEY_LEFT 22
-#define SETUP_TOKEN_KEY_RIGHT 23
-#define SETUP_TOKEN_KEY_UP 24
-#define SETUP_TOKEN_KEY_DOWN 25
-#define SETUP_TOKEN_KEY_SNAP 26
-#define SETUP_TOKEN_KEY_BOMB 27
-
-#define NUM_SETUP_TOKENS 28
+#define SETUP_TOKEN_TEAM_MODE 11
+#define SETUP_TOKEN_ALIAS_NAME 12
+
+#define SETUP_TOKEN_USE_JOYSTICK 13
+#define SETUP_TOKEN_JOY_DEVICE_NAME 14
+#define SETUP_TOKEN_JOY_XLEFT 15
+#define SETUP_TOKEN_JOY_XMIDDLE 16
+#define SETUP_TOKEN_JOY_XRIGHT 17
+#define SETUP_TOKEN_JOY_YUPPER 18
+#define SETUP_TOKEN_JOY_YMIDDLE 19
+#define SETUP_TOKEN_JOY_YLOWER 20
+#define SETUP_TOKEN_JOY_SNAP 21
+#define SETUP_TOKEN_JOY_BOMB 22
+#define SETUP_TOKEN_KEY_LEFT 23
+#define SETUP_TOKEN_KEY_RIGHT 24
+#define SETUP_TOKEN_KEY_UP 25
+#define SETUP_TOKEN_KEY_DOWN 26
+#define SETUP_TOKEN_KEY_SNAP 27
+#define SETUP_TOKEN_KEY_BOMB 28
+
+#define NUM_SETUP_TOKENS 29
#define FIRST_GLOBAL_SETUP_TOKEN SETUP_TOKEN_SOUND
#define LAST_GLOBAL_SETUP_TOKEN SETUP_TOKEN_ALIAS_NAME
{ TYPE_SWITCH, &si.fading, "screen_fading" },
{ TYPE_SWITCH, &si.autorecord, "automatic_tape_recording" },
{ TYPE_SWITCH, &si.quick_doors, "quick_doors" },
+ { TYPE_SWITCH, &si.team_mode, "team_mode" },
{ TYPE_STRING, &si.alias_name, "alias_name" },
/* for each player: */
si->autorecord = FALSE;
si->quick_doors = FALSE;
- strncpy(si->login_name, GetLoginName(), MAX_NAMELEN-1);
+ strncpy(si->login_name, getLoginName(), MAX_NAMELEN-1);
si->login_name[MAX_NAMELEN-1] = '\0';
- strncpy(si->alias_name, GetLoginName(), MAX_NAMELEN-1);
+ strncpy(si->alias_name, getLoginName(), MAX_NAMELEN-1);
si->alias_name[MAX_NAMELEN-1] = '\0';
for (i=0; i<MAX_PLAYERS; i++)
/* always start with reliable default setup values */
setSetupInfoToDefaults(&setup);
- sprintf(filename, "%s/%s", SETUP_PATH, SETUP_FILENAME);
+ sprintf(filename, "%s/%s", getSetupDir(), SETUP_FILENAME);
setup_file_list = loadSetupFileList(filename);
char filename[MAX_FILENAME_LEN];
FILE *file;
- sprintf(filename, "%s/%s", SETUP_PATH, SETUP_FILENAME);
+ sprintf(filename, "%s/%s", getSetupDir(), SETUP_FILENAME);
if (!(file = fopen(filename, "w")))
{
leveldir_nr = 0;
level_nr = 0;
- sprintf(filename, "%s/%s", SETUP_PATH, LEVELSETUP_FILENAME);
+ sprintf(filename, "%s/%s", getSetupDir(), LEVELSETUP_FILENAME);
if (level_setup_list)
freeSetupFileList(level_setup_list);
setTokenValue(level_setup_list,
leveldir[leveldir_nr].filename, int2str(level_nr, 0));
- sprintf(filename, "%s/%s", SETUP_PATH, LEVELSETUP_FILENAME);
+ sprintf(filename, "%s/%s", getSetupDir(), LEVELSETUP_FILENAME);
if (!(file = fopen(filename, "w")))
{