#define IS_NEW_FRAME(f, g) (IS_ANIMATED(g) && IS_NEW_DELAY(f, g))
#define IS_NEXT_FRAME(f, g) (IS_NEW_FRAME(f, g) && (f) > 0)
-#define IS_LOOP_SOUND(s) (sound_info[s].loop)
-#define IS_LOOP_MUSIC(s) (music_info[s].loop)
+#define IS_LOOP_SOUND(s) ((s) >= 0 && sound_info[s].loop)
+#define IS_LOOP_MUSIC(s) ((s) < 0 || music_info[s].loop)
#define IS_SPECIAL_GFX_ARG(a) ((a) >= 0 && (a) < NUM_SPECIAL_GFX_ARGS)
#define MAX_ANDROID_ELEMENTS 32
#define MAX_ANDROID_ELEMENTS_OLD 16 // (extended since version 4.2.0.0)
+#define MAX_ISO_DATE_LEN 10
+#define MAX_PLATFORM_TEXT_LEN 16
+#define MAX_VERSION_TEXT_LEN 16
+#define MAX_COUNTRY_CODE_LEN 2
+#define MAX_COUNTRY_NAME_LEN 64
+
// values for elements with content
#define MIN_ELEMENT_CONTENTS 1
#define STD_ELEMENT_CONTENTS 4
enum
{
GFX_SPECIAL_ARG_DEFAULT = 0,
+ GFX_SPECIAL_ARG_LOADING_INITIAL,
GFX_SPECIAL_ARG_LOADING,
GFX_SPECIAL_ARG_TITLE_INITIAL,
GFX_SPECIAL_ARG_TITLE_INITIAL_1,
GFX_SPECIAL_ARG_LEVELS,
GFX_SPECIAL_ARG_LEVELNR,
GFX_SPECIAL_ARG_SCORES,
+ GFX_SPECIAL_ARG_SCOREINFO,
GFX_SPECIAL_ARG_EDITOR,
GFX_SPECIAL_ARG_INFO,
GFX_SPECIAL_ARG_SETUP,
GFX_SPECIAL_ARG_CRUMBLED,
GFX_SPECIAL_ARG_MAINONLY,
GFX_SPECIAL_ARG_NAMESONLY,
+ GFX_SPECIAL_ARG_SCORESONLY,
GFX_SPECIAL_ARG_TYPENAME,
GFX_SPECIAL_ARG_TYPENAMES,
GFX_SPECIAL_ARG_SUBMENU,
// values for game_status (must match special image configuration suffixes)
#define GAME_MODE_DEFAULT GFX_SPECIAL_ARG_DEFAULT
+#define GAME_MODE_LOADING_INITIAL GFX_SPECIAL_ARG_LOADING_INITIAL
#define GAME_MODE_LOADING GFX_SPECIAL_ARG_LOADING
#define GAME_MODE_TITLE_INITIAL GFX_SPECIAL_ARG_TITLE_INITIAL
#define GAME_MODE_TITLE_INITIAL_1 GFX_SPECIAL_ARG_TITLE_INITIAL_1
#define GAME_MODE_LEVELS GFX_SPECIAL_ARG_LEVELS
#define GAME_MODE_LEVELNR GFX_SPECIAL_ARG_LEVELNR
#define GAME_MODE_SCORES GFX_SPECIAL_ARG_SCORES
+#define GAME_MODE_SCOREINFO GFX_SPECIAL_ARG_SCOREINFO
#define GAME_MODE_EDITOR GFX_SPECIAL_ARG_EDITOR
#define GAME_MODE_INFO GFX_SPECIAL_ARG_INFO
#define GAME_MODE_SETUP GFX_SPECIAL_ARG_SETUP
#define GAME_MODE_PSEUDO_CRUMBLED GFX_SPECIAL_ARG_CRUMBLED
#define GAME_MODE_PSEUDO_MAINONLY GFX_SPECIAL_ARG_MAINONLY
#define GAME_MODE_PSEUDO_NAMESONLY GFX_SPECIAL_ARG_NAMESONLY
+#define GAME_MODE_PSEUDO_SCORESONLY GFX_SPECIAL_ARG_SCORESONLY
#define GAME_MODE_PSEUDO_TYPENAME GFX_SPECIAL_ARG_TYPENAME
#define GAME_MODE_PSEUDO_TYPENAMES GFX_SPECIAL_ARG_TYPENAMES
#define GAME_MODE_PSEUDO_SUBMENU GFX_SPECIAL_ARG_SUBMENU
// program information and versioning definitions
#define PROGRAM_VERSION_SUPER 4
#define PROGRAM_VERSION_MAJOR 3
-#define PROGRAM_VERSION_MINOR 1
+#define PROGRAM_VERSION_MINOR 2
#define PROGRAM_VERSION_PATCH 0
#define PROGRAM_VERSION_EXTRA ""
#define PROGRAM_AUTHOR_STRING "Holger Schemel"
#define PROGRAM_EMAIL_STRING "info@artsoft.org"
#define PROGRAM_WEBSITE_STRING "https://www.artsoft.org/"
-#define PROGRAM_COPYRIGHT_STRING "Copyright \xa9""1995-2021 by Holger Schemel"
+#define PROGRAM_COPYRIGHT_STRING "Copyright \xa9""1995-2022 by Holger Schemel"
#define PROGRAM_COMPANY_STRING "A Game by Artsoft Entertainment"
#define PROGRAM_ICON_FILENAME "RocksIcon32x32.png"
struct MenuSetupButtonInfo button;
};
+struct MenuScoresButtonInfo
+{
+ struct MenuPosInfo prev_level;
+ struct MenuPosInfo next_level;
+ struct MenuPosInfo prev_score;
+ struct MenuPosInfo next_score;
+ struct MenuPosInfo play_tape;
+};
+
+struct MenuScoresInfo
+{
+ struct MenuScoresButtonInfo button;
+};
+
struct TitleFadingInfo
{
int fade_mode;
struct InitInfo
{
+ struct MenuPosInfo busy_initial;
struct MenuPosInfo busy;
};
struct MenuMainInfo main;
struct MenuSetupInfo setup;
+ struct MenuScoresInfo scores;
};
struct DoorInfo
char name[MAX_PLAYER_NAME_LEN + 1];
int score;
int time; // time (in frames) or steps played
+
+ // additional score information for score info screen
+ int id;
+ char tape_date[MAX_ISO_DATE_LEN + 1];
+ char platform[MAX_PLATFORM_TEXT_LEN + 1];
+ char version[MAX_VERSION_TEXT_LEN + 1];
+ char country_code[MAX_COUNTRY_CODE_LEN + 1];
+ char country_name[MAX_COUNTRY_NAME_LEN + 1];
};
struct ScoreInfo
int num_entries;
int last_added;
int last_added_local;
+ int last_level_nr;
+ int last_entry_nr;
boolean updated;
boolean uploaded;
+ boolean tape_downloaded;
boolean force_last_added;
struct ScoreEntry entry[MAX_SCORE_ENTRIES];
boolean is_sound;
- struct MusicFileInfo *next;
+ struct MusicFileInfo *prev, *next;
};
struct ElementActionInfo
extern int game_status;
extern int game_status_last_screen;
extern boolean level_editor_test_game;
+extern boolean score_info_tape_play;
extern boolean network_playing;
extern int key_joystick_mapping;
extern int GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern int GfxRandomStatic[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern int GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern int GfxElementEmpty[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern int GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern int GfxDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern int GfxRedraw[MAX_LEV_FIELDX][MAX_LEV_FIELDY];