projects
/
rocksndiamonds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
added checking for invalid/malicious packet size in network protocol
[rocksndiamonds.git]
/
src
/
game_mm
/
mm_files.c
diff --git
a/src/game_mm/mm_files.c
b/src/game_mm/mm_files.c
index 31e566335f4aa9ae9f106bcee46731457d48d95d..fa47d1f4da7656997ab583ded1f973585abf1ded 100644
(file)
--- a/
src/game_mm/mm_files.c
+++ b/
src/game_mm/mm_files.c
@@
-30,6
+30,16
@@
#define SCORE_COOKIE "MIRRORMAGIC_SCORE_FILE_VERSION_1.4"
#define SCORE_COOKIE "MIRRORMAGIC_SCORE_FILE_VERSION_1.4"
+int default_score[LEVEL_SCORE_ELEMENTS] =
+{
+ [SC_COLLECTIBLE] = 10,
+ [SC_PACMAN] = 50,
+ [SC_KEY] = 10,
+ [SC_TIME_BONUS] = 1,
+ [SC_LIGHTBALL] = 10,
+};
+
+
/* ========================================================================= */
/* level file functions */
/* ========================================================================= */
/* ========================================================================= */
/* level file functions */
/* ========================================================================= */
@@
-87,18
+97,21
@@
void setLevelInfoToDefaults_MM()
native_mm_level.encoding_16bit_field = FALSE; /* default: only 8-bit elements */
native_mm_level.encoding_16bit_field = FALSE; /* default: only 8-bit elements */
-
lev_fieldx =
native_mm_level.fieldx = STD_LEV_FIELDX;
-
lev_fieldy =
native_mm_level.fieldy = STD_LEV_FIELDY;
+ native_mm_level.fieldx = STD_LEV_FIELDX;
+ native_mm_level.fieldy = STD_LEV_FIELDY;
for (x = 0; x < MAX_LEV_FIELDX; x++)
for (y = 0; y < MAX_LEV_FIELDY; y++)
for (x = 0; x < MAX_LEV_FIELDX; x++)
for (y = 0; y < MAX_LEV_FIELDY; y++)
- native_mm_level.field[x][y] =
Feld[x][y] =
Ur[x][y] = EL_EMPTY;
+ native_mm_level.field[x][y] = Ur[x][y] = EL_EMPTY;
native_mm_level.time = 100;
native_mm_level.kettles_needed = 0;
native_mm_level.auto_count_kettles = TRUE;
native_mm_level.amoeba_speed = 0;
native_mm_level.time = 100;
native_mm_level.kettles_needed = 0;
native_mm_level.auto_count_kettles = TRUE;
native_mm_level.amoeba_speed = 0;
- native_mm_level.time_fuse = 0;
+ native_mm_level.time_fuse = 25;
+ native_mm_level.time_bomb = 75;
+ native_mm_level.time_ball = 75;
+ native_mm_level.time_block = 75;
native_mm_level.laser_red = FALSE;
native_mm_level.laser_green = FALSE;
native_mm_level.laser_blue = TRUE;
native_mm_level.laser_red = FALSE;
native_mm_level.laser_green = FALSE;
native_mm_level.laser_blue = TRUE;
@@
-114,9
+127,8
@@
void setLevelInfoToDefaults_MM()
for (i = 0; i < LEVEL_SCORE_ELEMENTS; i++)
native_mm_level.score[i] = 10;
for (i = 0; i < LEVEL_SCORE_ELEMENTS; i++)
native_mm_level.score[i] = 10;
- native_mm_level.field[0][0] =
Feld[0][0] =
Ur[0][0] = EL_MCDUFFIN_RIGHT;
+ native_mm_level.field[0][0] = Ur[0][0] = EL_MCDUFFIN_RIGHT;
native_mm_level.field[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] =
native_mm_level.field[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] =
- Feld[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] =
Ur[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] = EL_EXIT_CLOSED;
}
Ur[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] = EL_EXIT_CLOSED;
}
@@
-145,12
+157,16
@@
static int LoadLevel_MM_HEAD(File *file, int chunk_size,
int i;
int laser_color;
int i;
int laser_color;
- lev
_fieldx = lev
el->fieldx = getFile8Bit(file);
- lev
_fieldy = lev
el->fieldy = getFile8Bit(file);
+ level->fieldx = getFile8Bit(file);
+ level->fieldy = getFile8Bit(file);
level->time = getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN);
level->kettles_needed = getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN);
level->time = getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN);
level->kettles_needed = getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN);
+ // one time unit was equivalent to four seconds in level files up to 2.0.x
+ if (level->file_version <= MM_FILE_VERSION_2_0)
+ level->time *= 4;
+
for (i = 0; i < MAX_LEVEL_NAME_LEN; i++)
level->name[i] = getFile8Bit(file);
level->name[MAX_LEVEL_NAME_LEN] = 0;
for (i = 0; i < MAX_LEVEL_NAME_LEN; i++)
level->name[i] = getFile8Bit(file);
level->name[MAX_LEVEL_NAME_LEN] = 0;
@@
-158,10
+174,20
@@
static int LoadLevel_MM_HEAD(File *file, int chunk_size,
for (i = 0; i < LEVEL_SCORE_ELEMENTS; i++)
level->score[i] = getFile8Bit(file);
for (i = 0; i < LEVEL_SCORE_ELEMENTS; i++)
level->score[i] = getFile8Bit(file);
+ // scores were 0 and hardcoded in game engine in level files up to 2.0.x
+ if (level->file_version <= MM_FILE_VERSION_2_0)
+ for (i = 0; i < LEVEL_SCORE_ELEMENTS; i++)
+ if (level->score[i] == 0)
+ level->score[i] = default_score[i];
+
level->auto_count_kettles = (getFile8Bit(file) == 1 ? TRUE : FALSE);
level->amoeba_speed = getFile8Bit(file);
level->time_fuse = getFile8Bit(file);
level->auto_count_kettles = (getFile8Bit(file) == 1 ? TRUE : FALSE);
level->amoeba_speed = getFile8Bit(file);
level->time_fuse = getFile8Bit(file);
+ // fuse time was 0 and hardcoded in game engine in level files up to 2.0.x
+ if (level->file_version <= MM_FILE_VERSION_2_0)
+ level->time_fuse = 25;
+
laser_color = getFile8Bit(file);
level->laser_red = (laser_color >> 2) & 0x01;
level->laser_green = (laser_color >> 1) & 0x01;
laser_color = getFile8Bit(file);
level->laser_red = (laser_color >> 2) & 0x01;
level->laser_green = (laser_color >> 1) & 0x01;
@@
-209,7
+235,7
@@
static int LoadLevel_MM_BODY(File *file, int chunk_size,
for (y = 0; y < level->fieldy; y++)
for (x = 0; x < level->fieldx; x++)
for (y = 0; y < level->fieldy; y++)
for (x = 0; x < level->fieldx; x++)
- native_mm_level.field[x][y] =
Feld[x][y] =
Ur[x][y] =
+ native_mm_level.field[x][y] = Ur[x][y] =
checkLevelElement(level->encoding_16bit_field ?
getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN) :
getFile8Bit(file));
checkLevelElement(level->encoding_16bit_field ?
getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN) :
getFile8Bit(file));