added support for level stories in "docs/stories/XXX.txt"
authorHolger Schemel <holger.schemel@virtion.de>
Fri, 15 Nov 2024 23:28:30 +0000 (00:28 +0100)
committerHolger Schemel <holger.schemel@virtion.de>
Fri, 15 Nov 2024 23:28:30 +0000 (00:28 +0100)
By placing a text file into "docs/stories/XXX.txt" inside the level
set directory, it will be shown before starting the game.

src/libgame/setup.c
src/libgame/setup.h
src/libgame/system.h
src/screens.c

index c4be3482e867b23c378ff159e5dbccc879f672bd..f2680ef55204c1e2237cfc8eb797a635dd1bfcc1 100644 (file)
@@ -879,6 +879,15 @@ static char *getLevelInfoBasename(int level_nr)
   return basename;
 }
 
+static char *getLevelStoryBasename(int level_nr)
+{
+  static char basename[32];
+
+  sprintf(basename, "%03d.txt", level_nr);
+
+  return basename;
+}
+
 char *getLevelSetInfoFilename(int nr)
 {
   char *basename = getLevelSetInfoBasename(nr);
@@ -951,6 +960,25 @@ char *getLevelInfoFilename(int level_nr)
   return NULL;
 }
 
+char *getLevelStoryFilename(int level_nr)
+{
+  char *basename = getLevelStoryBasename(level_nr);
+  static char *stories_subdir = NULL;
+  static char *filename = NULL;
+
+  if (stories_subdir == NULL)
+    stories_subdir = getPath2(DOCS_DIRECTORY, STORIES_DIRECTORY);
+
+  checked_free(filename);
+
+  // look for story file in the current level set's "docs/stories" sub-directory
+  filename = getPath3(getCurrentLevelDir(), stories_subdir, basename);
+  if (fileExists(filename))
+    return filename;
+
+  return NULL;
+}
+
 static char *getLevelSetTitleMessageBasename(int nr, boolean initial)
 {
   static char basename[32];
index 396eff31d5d8a329202c6cb4a3e1ba2dd07144f5..bb0dd84221bfe01c7979f719acb0a90a7b1bb447 100644 (file)
@@ -286,6 +286,7 @@ char *getHelpAnimFilename(void);
 char *getHelpTextFilename(void);
 char *getLevelSetInfoFilename(int);
 char *getLevelInfoFilename(int);
+char *getLevelStoryFilename(int);
 char *getLevelSetTitleMessageFilename(int, boolean);
 char *getCreditsFilename(int, boolean);
 char *getProgramInfoFilename(int);
index 84d401cef7d39f2eb54204205b41e9a928b68631..277046f19d6c8e6d80897732ec59d58060557ec3 100644 (file)
 #define PROGRAM_INFO_DIRECTORY         "program"
 #define LEVELSET_INFO_DIRECTORY                "levelset"
 #define LEVEL_INFO_DIRECTORY           "levels"
+#define STORIES_DIRECTORY              "stories"
 #define CACHE_DIRECTORY                        "cache"
 #define CONF_DIRECTORY                 "conf"
 #define NETWORK_DIRECTORY              "network"
index 43e922c49965c54d1484be997ff823b39f849d54..82cb0d44f09923a917184ecf7498a0cb48656b11 100644 (file)
@@ -1101,6 +1101,18 @@ static char *getLevelInfoBuffer(void)
   return NULL;
 }
 
+static char *getLevelStoryBuffer(void)
+{
+  if (level.game_engine_type != GAME_ENGINE_TYPE_BD ||
+      level.native_bd_level->cave == NULL)
+    return NULL;
+
+  if (level.native_bd_level->cave->story != NULL)
+    return getInfoTextBuffer_BD(level.native_bd_level->cave->story);
+
+  return NULL;
+}
+
 static boolean hasLevelSetInfo(void)
 {
   return (getLevelSetInfoFilename(0) != NULL ||
@@ -1113,6 +1125,12 @@ static boolean hasLevelInfo(void)
           getLevelInfoBuffer() != NULL);
 }
 
+static boolean hasLevelStory(void)
+{
+  return (getLevelStoryFilename(level_nr) != NULL ||
+          getLevelStoryBuffer() != NULL);
+}
+
 static int getTitleScreenGraphic(int nr, boolean initial)
 {
   return (initial ? IMG_TITLESCREEN_INITIAL_1 : IMG_TITLESCREEN_1) + nr;
@@ -4197,11 +4215,11 @@ static int getInfoScreenBackgroundMusic_Generic(void)
 
 static char *getInfoScreenFilename_Generic(int nr, boolean global)
 {
-  return (info_mode == INFO_MODE_CREDITS  ? getCreditsFilename(nr, global) :
-         info_mode == INFO_MODE_PROGRAM  ? getProgramInfoFilename(nr)     :
-         info_mode == INFO_MODE_LEVELSET ? getLevelSetInfoFilename(nr)    :
-         info_mode == INFO_MODE_LEVEL    ? getLevelInfoFilename(level_nr) :
-         info_mode == INFO_MODE_STORY    ? getLevelInfoFilename(level_nr) :
+  return (info_mode == INFO_MODE_CREDITS  ? getCreditsFilename(nr, global)  :
+         info_mode == INFO_MODE_PROGRAM  ? getProgramInfoFilename(nr)      :
+         info_mode == INFO_MODE_LEVELSET ? getLevelSetInfoFilename(nr)     :
+         info_mode == INFO_MODE_LEVEL    ? getLevelInfoFilename(level_nr)  :
+         info_mode == INFO_MODE_STORY    ? getLevelStoryFilename(level_nr) :
          NULL);
 }
 
@@ -4209,7 +4227,7 @@ static char *getInfoScreenBuffer_Generic(void)
 {
   return (info_mode == INFO_MODE_LEVELSET ? getLevelSetInfoBuffer() :
          info_mode == INFO_MODE_LEVEL    ? getLevelInfoBuffer()    :
-         info_mode == INFO_MODE_STORY    ? getLevelInfoBuffer()    :
+         info_mode == INFO_MODE_STORY    ? getLevelStoryBuffer()   :
          NULL);
 }
 
@@ -4632,7 +4650,7 @@ void DrawInfoScreen_FromInitGame(int nr)
 
 boolean ShowStoryScreen_FromInitGame(void)
 {
-  if (!hasLevelInfo())
+  if (!hasLevelStory())
     return FALSE;
 
   if (setup.show_level_story == STATE_FALSE ||