Support fallback default texture packs

This commit is contained in:
UnknownShadow200 2023-07-05 19:35:46 +10:00
parent 265280f8ed
commit 182d3d0644
6 changed files with 61 additions and 34 deletions

View File

@ -53,7 +53,7 @@ cc_bool Game_ClassicMode, Game_ClassicHacks;
cc_bool Game_AllowCustomBlocks;
cc_bool Game_AllowServerTextures;
cc_bool Game_ViewBobbing, Game_HideGui, Game_DefaultZipMissing;
cc_bool Game_ViewBobbing, Game_HideGui;
cc_bool Game_BreakableLiquids, Game_ScreenshotRequested;
struct GameVersion Game_Version;
@ -419,11 +419,10 @@ static void Game_Load(void) {
if (comp->Init) comp->Init();
}
Game_DefaultZipMissing = false;
TexturePack_ExtractCurrent(true);
if (Game_DefaultZipMissing) {
if (TexturePack_DefaultMissing) {
Window_ShowDialog("Missing file",
"default.zip is missing, try downloading resources first.\n\nThe game will still run, but without any textures");
"Both default.zip and classicube.zip are missing,\n try downloading resources first.\n\nClassiCube will still run, but without any textures.");
}
entTaskI = ScheduledTask_Add(GAME_DEF_TICKS, Entities_Tick);

View File

@ -45,7 +45,6 @@ extern cc_bool Game_BreakableLiquids;
/* Whether a screenshot should be taken at the end of this frame */
extern cc_bool Game_ScreenshotRequested;
extern cc_bool Game_HideGui;
extern cc_bool Game_DefaultZipMissing;
enum GAME_VERSION_ {
VERSION_0017 = 27, VERSION_0019 = 28, VERSION_0023 = 29, VERSION_0030 = 30, VERSION_CPE = 31

View File

@ -21,6 +21,7 @@
#include "LBackend.h"
#include "PackedCol.h"
#include "SystemFonts.h"
#include "TexturePack.h"
struct LScreen* Launcher_Active;
cc_bool Launcher_ShouldExit, Launcher_ShouldUpdate;
@ -249,6 +250,8 @@ void Launcher_Run(void) {
Session_Load();
Launcher_LoadTheme();
Launcher_Init();
GameVersion_Load();
Launcher_TryLoadTexturePack();
Http_Component.Init();
@ -443,13 +446,13 @@ static cc_result Launcher_ProcessZipEntry(const cc_string* path, struct Stream*
return 0;
}
static void ExtractTexturePack(const cc_string* path) {
static cc_result ExtractTexturePack(const cc_string* path) {
struct Stream stream;
cc_result res;
res = Stream_OpenFile(&stream, path);
if (res == ReturnCode_FileNotFound) return;
if (res) { Logger_SysWarn(res, "opening texture pack"); return; }
if (res == ReturnCode_FileNotFound) return res;
if (res) { Logger_SysWarn(res, "opening texture pack"); return res; }
res = Zip_Extract(&stream,
Launcher_SelectZipEntry, Launcher_ProcessZipEntry);
@ -457,21 +460,24 @@ static void ExtractTexturePack(const cc_string* path) {
if (res) { Logger_SysWarn(res, "extracting texture pack"); }
/* No point logging error for closing readonly file */
(void)stream.Close(&stream);
return res;
}
void Launcher_TryLoadTexturePack(void) {
static const cc_string defZip = String_FromConst("texpacks/default.zip");
cc_string path; char pathBuffer[FILENAME_SIZE];
cc_string texPack;
/* TODO: Not duplicate TexturePack functionality */
if (Options_UNSAFE_Get(OPT_DEFAULT_TEX_PACK, &texPack)) {
String_InitArray(path, pathBuffer);
String_Format1(&path, "texpacks/%s", &texPack);
ExtractTexturePack(&path);
(void)ExtractTexturePack(&path);
}
/* user selected texture pack is missing some required .png files */
if (!hasBitmappedFont || dirtBmp.scan0 == NULL) ExtractTexturePack(&defZip);
if (!hasBitmappedFont || dirtBmp.scan0 == NULL)
TexturePack_ExtractDefault(ExtractTexturePack);
LBackend_UpdateLogoFont();
}

View File

@ -1,5 +1,5 @@
#include "Resources.h"
#if !defined(CC_BUILD_WEB) && !defined(CC_BUILD_FLATPAK)
#if !defined CC_BUILD_WEB
#include "Funcs.h"
#include "String.h"
#include "Constants.h"
@ -1064,7 +1064,6 @@ void Resources_CheckExistence(void) {
int i;
Resources_Count = 0;
Resources_Size = 0;
GameVersion_Load();
for (i = 0; i < Array_Elems(asset_sets); i++)
{

View File

@ -325,6 +325,7 @@ static char texpackPathBuffer[FILENAME_SIZE];
cc_string TexturePack_Url = String_FromArray(textureUrlBuffer);
cc_string TexturePack_Path = String_FromArray(texpackPathBuffer);
cc_bool TexturePack_DefaultMissing;
void TexturePack_SetDefault(const cc_string* texPack) {
TexturePack_Path.length = 0;
@ -332,6 +333,26 @@ void TexturePack_SetDefault(const cc_string* texPack) {
Options_Set(OPT_DEFAULT_TEX_PACK, texPack);
}
cc_result TexturePack_ExtractDefault(DefaultZipCallback callback) {
cc_result res = ReturnCode_FileNotFound;
const char* defaults[3];
cc_string path;
int i;
defaults[0] = Game_Version.DefaultTexpack;
defaults[1] = "texpacks/default.zip";
defaults[2] = "texpacks/classicube.zip";
for (i = 0; i < Array_Elems(defaults); i++)
{
path = String_FromReadonly(defaults[i]);
res = callback(&path);
if (!res) return 0;
}
return res;
}
static cc_bool SelectZipEntry(const cc_string* path) { return true; }
static cc_result ProcessZipEntry(const cc_string* path, struct Stream* stream, struct ZipEntry* source) {
cc_string name = *path;
@ -371,17 +392,12 @@ static cc_result ExtractFrom(struct Stream* stream, const cc_string* path) {
return res;
}
static cc_result ExtractFromFile(const cc_string* path, cc_bool isDefault) {
static cc_result ExtractFromFile(const cc_string* path) {
struct Stream stream;
cc_result res;
res = Stream_OpenFile(&stream, path);
if (res) {
/* Game shows a dialog if default.zip is missing */
Game_DefaultZipMissing |= isDefault && res == ReturnCode_FileNotFound;
Logger_SysWarn2(res, "opening", path);
return res;
}
if (res) { Logger_SysWarn2(res, "opening", path); return res; }
res = ExtractFrom(&stream, path);
/* No point logging error for closing readonly file */
@ -389,16 +405,21 @@ static cc_result ExtractFromFile(const cc_string* path, cc_bool isDefault) {
return res;
}
static cc_result ExtractDefault(void) {
cc_string defaultPath = String_FromReadonly(Game_Version.DefaultTexpack);
cc_string path = Game_ClassicMode ? defaultPath : TexturePack_Path;
cc_bool isDefault = String_CaselessEquals(&path, &defaultPath);
cc_result res = ExtractFromFile(&defaultPath, true);
/* TODO fallback */
static cc_result ExtractUserTextures(void) {
cc_string path;
cc_result res;
/* override default.zip with user's default texture pack */
if (!isDefault) res = ExtractFromFile(&path, false);
return res;
/* TODO: Log error for multiple default texture pack extract failure */
res = TexturePack_ExtractDefault(ExtractFromFile);
/* Game shows a warning dialog if default textures are missing */
TexturePack_DefaultMissing = res == ReturnCode_FileNotFound;
path = TexturePack_Path;
if (String_CaselessEqualsConst(&path, "texpacks/default.zip")) path.length = 0;
if (Game_ClassicMode || path.length == 0) return res;
/* override default textures with user's selected texture pack */
return ExtractFromFile(&path);
}
static cc_bool usingDefault;
@ -409,7 +430,7 @@ cc_result TexturePack_ExtractCurrent(cc_bool forceReload) {
/* don't pointlessly load default texture pack */
if (!usingDefault || forceReload) {
res = ExtractDefault();
res = ExtractUserTextures();
usingDefault = true;
}
@ -538,9 +559,7 @@ static void OnInit(void) {
TexturePack_Path.length = 0;
if (Options_UNSAFE_Get(OPT_DEFAULT_TEX_PACK, &file)) {
String_Format1(&TexturePack_Path, "texpacks/%s", &file);
} else {
String_AppendConst(&TexturePack_Path, Game_Version.DefaultTexpack);
String_Format1(&TexturePack_Path, "texpacks/%s", &file);
}
/* TODO temp hack to fix mobile, need to properly fix */

View File

@ -53,8 +53,10 @@ CC_VAR extern struct _Atlas1DData {
/* URL of the current custom texture pack, can be empty */
extern cc_string TexturePack_Url;
/* Path to the default texture pack to use */
/* Path to the user selected custom texture pack to use */
extern cc_string TexturePack_Path;
/* Whether the default texture pack and its alternatives were all not found */
extern cc_bool TexturePack_DefaultMissing;
#define Atlas2D_TileX(texLoc) ((texLoc) & ATLAS2D_MASK) /* texLoc % ATLAS2D_TILES_PER_ROW */
#define Atlas2D_TileY(texLoc) ((texLoc) >> ATLAS2D_SHIFT) /* texLoc / ATLAS2D_TILES_PER_ROW */
@ -100,6 +102,9 @@ void TexturePack_CheckPending(void);
/* then asynchronously downloads the texture pack from the given URL. */
CC_API void TexturePack_Extract(const cc_string* url);
typedef cc_result (*DefaultZipCallback)(const cc_string* path);
cc_result TexturePack_ExtractDefault(DefaultZipCallback callback);
struct TextureEntry;
struct TextureEntry {
const char* filename;