Save block definitions in reverse order for .cw maps

This means when saving maps with over 256 custom blocks, software that only reads the byte ID field still picks the correct first 255 custom blocks
This commit is contained in:
UnknownShadow200 2019-04-20 14:29:10 +10:00
parent fc17dd184c
commit 4ab1359f85
5 changed files with 57 additions and 6 deletions

View File

@ -1149,7 +1149,9 @@ ReturnCode Cw_Save(struct Stream* stream) {
if ((res = Stream_Write(stream, tmp, sizeof(cw_meta_cpe) + len))) return res;
if ((res = Stream_Write(stream, cw_meta_defs, sizeof(cw_meta_defs)))) return res;
for (b = 1; b < BLOCK_COUNT; b++) {
/* Write block definitions in reverse order so that software that only reads byte 'ID' */
/* still loads correct first 256 block defs when saving a map with over 256 block defs */
for (b = BLOCK_MAX_DEFINED; b >= 1; b--) {
if (!Block_IsCustomDefined(b)) continue;
if ((res = Cw_WriteBockDef(stream, b))) return res;
}

View File

@ -593,7 +593,13 @@ ReturnCode File_Write(FileHandle file, const uint8_t* buffer, uint32_t count, ui
}
ReturnCode File_Close(FileHandle file) {
#ifndef CC_BUILD_WEB
return close(file) == -1 ? errno : 0;
#else
int ret = close(file) == -1 ? errno : 0;
EM_ASM( FS.syncfs(false, function(err) { if (err) console.log(err); }); );
return ret;
#endif
}
ReturnCode File_Seek(FileHandle file, int offset, int seekType) {
@ -1373,9 +1379,24 @@ ReturnCode Socket_Connect(SocketHandle socket, const String* ip, int port) {
}
ReturnCode Socket_Read(SocketHandle socket, uint8_t* buffer, uint32_t count, uint32_t* modified) {
#ifdef CC_BUILD_WEB
/* recv only reads one WebSocket frame at most, hence call it multiple times */
int recvCount = 0, pending;
*modified = 0;
while (count && !Socket_Available(socket, &pending) && pending) {
recvCount = recv(socket, buffer, count, 0);
if (recvCount == -1) return Socket__Error();
*modified += recvCount;
buffer += recvCount; count -= recvCount;
}
return 0;
#else
int recvCount = recv(socket, buffer, count, 0);
if (recvCount != -1) { *modified = recvCount; return 0; }
*modified = 0; return Socket__Error();
#endif
}
ReturnCode Socket_Write(SocketHandle socket, uint8_t* buffer, uint32_t count, uint32_t* modified) {
@ -1929,5 +1950,11 @@ void Platform_Init(void) {
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
}
#elif defined CC_BUILD_WEB
void Platform_Init(void) { }
void Platform_Init(void) {
EM_ASM(
FS.mkdir('/classicube');
FS.mount(IDBFS, {}, '/classicube');
FS.syncfs(true, function(err) { if (err) console.log(err); });
);
}
#endif

View File

@ -44,10 +44,12 @@ static void Program_RunGame(void) {
String title; char titleBuffer[STRING_SIZE];
int width, height;
#ifndef CC_BUILD_WEB
if (!File_Exists(&defPath)) {
Window_ShowDialog("Missing file",
"default.zip is missing, try downloading resources first.\n\nThe game will still run, but without any textures");
}
#endif
width = Options_GetInt(OPT_WINDOW_WIDTH, 0, Display_Bounds.Width, 0);
height = Options_GetInt(OPT_WINDOW_HEIGHT, 0, Display_Bounds.Height, 0);
@ -65,12 +67,16 @@ static void Program_RunGame(void) {
/* Attempts to set current/working directory to the directory exe file is in */
static void Program_SetCurrentDirectory(void) {
#ifndef CC_BUILD_WEB
String path; char pathBuffer[FILENAME_SIZE];
int i;
ReturnCode res;
String_InitArray(path, pathBuffer);
#ifdef CC_BUILD_WEB
String_AppendConst(&path, "/classicube");
res = Platform_SetCurrentDirectory(&path);
if (res) { Logger_Warn(res, "setting current directory"); return; }
#else
res = Process_GetExePath(&path);
if (res) { Logger_Warn(res, "getting exe path"); return; }
@ -134,9 +140,9 @@ int main(int argc, char** argv) {
argsCount = Platform_GetCommandLineArgs(argc, argv, args);
/* NOTE: Make sure to comment this out before pushing a commit */
/* String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); */
String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565");
/* String rawArgs = String_FromConst("UnknownShadow200"); */
/* argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4); */
argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4);
if (argsCount == 0) {
#ifdef CC_BUILD_WEB

View File

@ -640,6 +640,15 @@ void TexturePack_ExtractZip_File(const String* filename) {
struct Stream stream;
ReturnCode res;
/* TODO: This is an ugly hack to load textures from memory. */
/* We need to mount /classicube to IndexedDB, but texpacks folder */
/* should be read from memory. I don't know how to do that, */
/* since mounting /classicube/texpacks to memory doesn't work.. */
#ifdef CC_BUILD_WEB
String memPath = String_FromConst("/");
Platform_SetCurrentDirectory(&memPath);
#endif
String_InitArray(path, pathBuffer);
String_Format1(&path, "texpacks/%s", filename);
@ -651,6 +660,11 @@ void TexturePack_ExtractZip_File(const String* filename) {
res = stream.Close(&stream);
if (res) { Logger_Warn2(res, "closing", &path); }
#ifdef CC_BUILD_WEB
String idbPath = String_FromConst("/classicube");
Platform_SetCurrentDirectory(&idbPath);
#endif
}
ReturnCode TexturePack_ExtractTerrainPng(struct Stream* stream) {

View File

@ -2573,7 +2573,9 @@ static void Window_CorrectFocus(void) {
}
static EM_BOOL Window_MouseWheel(int type, const EmscriptenWheelEvent* ev, void* data) {
Mouse_SetWheel(Mouse_Wheel - ev->deltaY);
/* On my laptop, wheel movement of '1' is reported as '6.666666507' */
/* TODO: Verify this is the case on other platforms */
Mouse_SetWheel(Mouse_Wheel - ev->deltaY / 6.666666507f);
Window_CorrectFocus();
return true;
}