mirror of
https://gitlab.com/skmp/dca3-game.git
synced 2025-04-28 13:07:59 +03:00
Merge branch 'skmp/ph3nom-miami-saves-working' into 'main'
miami: Game Save + Load From VMU See merge request skmp/dca3-game!44
This commit is contained in:
commit
c70dce8a6e
6 changed files with 119 additions and 42 deletions
BIN
miami/GTAVCSF8.b
Normal file
BIN
miami/GTAVCSF8.b
Normal file
Binary file not shown.
|
@ -180,9 +180,9 @@ $(TARGET): $(OBJS)
|
|||
run: $(TARGET)
|
||||
$(KOS_LOADER) $(TARGET)
|
||||
|
||||
# $(REPACK_GTA_DIR)/GTA3SF8.b: GTA3SF8.b
|
||||
# mkdir -p $(@D)
|
||||
# cp $< $@
|
||||
$(REPACK_GTA_DIR)/GTAVCSF8.b: GTAVCSF8.b
|
||||
mkdir -p $(@D)
|
||||
cp $< $@
|
||||
|
||||
1ST_READ.BIN: $(TARGET)
|
||||
rm -f $(TARGET).bin
|
||||
|
@ -199,20 +199,20 @@ IP.BIN:
|
|||
rm -f IP.BIN
|
||||
$(KOS_BASE)/utils/makeip/makeip ip.txt IP.BIN
|
||||
|
||||
$(PROJECT_NAME).iso: IP.BIN 1ST_READ.BIN $(REPACK_DIR)/repacked # $(REPACK_GTA_DIR)/GTA3SF8.b
|
||||
$(PROJECT_NAME).iso: IP.BIN 1ST_READ.BIN $(REPACK_DIR)/repacked $(REPACK_GTA_DIR)/GTAVCSF8.b
|
||||
rm -f $(PROJECT_NAME).iso
|
||||
rm -f $(REPACK_GTA_DIR)/1ST_READ.BIN
|
||||
cp 1ST_READ.BIN $(REPACK_GTA_DIR)
|
||||
mkisofs -C 0,11702 -V $(PROJECT_NAME) -G IP.BIN -r -J -l -o $(PROJECT_NAME).iso $(REPACK_GTA_DIR)
|
||||
|
||||
$(PROJECT_NAME)-no-repack.iso: IP.BIN 1ST_READ.BIN # $(REPACK_GTA_DIR)/GTA3SF8.b
|
||||
$(PROJECT_NAME)-no-repack.iso: IP.BIN 1ST_READ.BIN $(REPACK_GTA_DIR)/GTAVCSF8.b
|
||||
rm -f $(PROJECT_NAME)-no-repack.iso
|
||||
rm -f $(REPACK_GTA_DIR)/1ST_READ.BIN
|
||||
cp 1ST_READ.BIN $(REPACK_GTA_DIR)
|
||||
mkisofs -C 0,11702 -V $(PROJECT_NAME) -G IP.BIN -r -J -l -o $(PROJECT_NAME)-no-repack.iso $(REPACK_GTA_DIR)
|
||||
|
||||
|
||||
$(PROJECT_NAME).ds.iso: IP.BIN 1ST_READ.BIN $(REPACK_DIR)/repacked # $(REPACK_GTA_DIR)/GTA3SF8.b
|
||||
$(PROJECT_NAME).ds.iso: IP.BIN 1ST_READ.BIN $(REPACK_DIR)/repacked $(REPACK_GTA_DIR)/GTAVCSF8.b
|
||||
rm -f $(PROJECT_NAME).ds.iso
|
||||
rm -f $(REPACK_GTA_DIR)/1ST_READ.BIN
|
||||
cp $(TARGET).bin $(REPACK_GTA_DIR)/1ST_READ.BIN
|
||||
|
@ -223,7 +223,7 @@ $(PROJECT_NAME).ds.iso: IP.BIN 1ST_READ.BIN $(REPACK_DIR)/repacked # $(REPACK_GT
|
|||
$(KOS_BASE)/utils/scramble/scramble $(TARGET)-prebuilt.bin 1ST_READ_PREBUILT.BIN
|
||||
mkdir -p $(REPACK_GTA_DIR)
|
||||
|
||||
$(PROJECT_NAME)-prebuilt.iso: IP.BIN 1ST_READ_PREBUILT.BIN $(REPACK_DIR)/repacked # $(REPACK_GTA_DIR)/GTA3SF8.b
|
||||
$(PROJECT_NAME)-prebuilt.iso: IP.BIN 1ST_READ_PREBUILT.BIN $(REPACK_DIR)/repacked $(REPACK_GTA_DIR)/GTAVCSF8.b
|
||||
rm -f $(REPACK_GTA_DIR)/1ST_READ.BIN
|
||||
cp 1ST_READ_PREBUILT.BIN $(REPACK_GTA_DIR)/1ST_READ.BIN
|
||||
mkisofs -C 0,11702 -V $(PROJECT_NAME) -G IP.BIN -r -J -l -o $(PROJECT_NAME).iso $(REPACK_GTA_DIR)
|
||||
|
@ -242,15 +242,15 @@ $(PROJECT_NAME)-prebuilt.cdi: $(PROJECT_NAME)-prebuilt.iso
|
|||
rm 1ST_READ_PREBUILT.BIN
|
||||
@echo && echo && echo "*** CDI Baked Successfully ($@) ***" && echo && echo
|
||||
else
|
||||
$(PROJECT_NAME).cdi: $(TARGET) $(REPACK_DIR)/repacked # $(REPACK_GTA_DIR)/GTA3SF8.b
|
||||
$(PROJECT_NAME).cdi: $(TARGET) $(REPACK_DIR)/repacked $(REPACK_GTA_DIR)/GTAVCSF8.b
|
||||
mkdcdisc -e $(TARGET) -o $(PROJECT_NAME).cdi -d $(REPACK_GTA_DIR)/ $(MKDCDISC_PAD_OPTION) -n $(PROJECT_NAME) -a $(TEAM_NAME) -s $(DISC_SERIAL) -r $(RELEASE_DATE)
|
||||
@echo && echo && echo "*** CDI Baked Successfully ($@) ***" && echo && echo
|
||||
|
||||
$(PROJECT_NAME)-no-repack.cdi: $(TARGET) # $(REPACK_GTA_DIR)/GTA3SF8.b
|
||||
$(PROJECT_NAME)-no-repack.cdi: $(TARGET) $(REPACK_GTA_DIR)/GTAVCSF8.b
|
||||
mkdcdisc -e $(TARGET) -o $(PROJECT_NAME)-no-repack.cdi -d $(REPACK_GTA_DIR)/ $(MKDCDISC_PAD_OPTION) -n $(PROJECT_NAME) -a $(TEAM_NAME) -s $(DISC_SERIAL) -r $(RELEASE_DATE)
|
||||
@echo && echo && echo "*** CDI Baked Successfully ($@) ***" && echo && echo
|
||||
|
||||
$(PROJECT_NAME)-prebuilt.cdi: $(REPACK_DIR)/repacked # $(REPACK_GTA_DIR)/GTA3SF8.b
|
||||
$(PROJECT_NAME)-prebuilt.cdi: $(REPACK_DIR)/repacked $(REPACK_GTA_DIR)/GTAVCSF8.b
|
||||
mkdcdisc -e $(TARGET) -o $(PROJECT_NAME).cdi -d $(REPACK_GTA_DIR)/ $(MKDCDISC_PAD_OPTION) -n $(PROJECT_NAME) -a $(TEAM_NAME) -s $(DISC_SERIAL) -r $(RELEASE_DATE)
|
||||
@echo && echo && echo "*** CDI Baked Successfully ($@) ***" && echo && echo
|
||||
endif
|
||||
|
|
|
@ -305,7 +305,7 @@ enum Config {
|
|||
#define FIX_BUGS // fixes bugs that we've came across during reversing. You can undefine this only on release builds.
|
||||
#define MORE_LANGUAGES // Add more translations to the game
|
||||
#define COMPATIBLE_SAVES // this allows changing structs while keeping saves compatible, and keeps saves compatible between platforms
|
||||
#define FIX_INCOMPATIBLE_SAVES // try to fix incompatible saves, requires COMPATIBLE_SAVES
|
||||
// #define FIX_INCOMPATIBLE_SAVES // try to fix incompatible saves, requires COMPATIBLE_SAVES
|
||||
#define LOAD_INI_SETTINGS // as the name suggests. fundamental for CUSTOM_FRONTEND_OPTIONS
|
||||
|
||||
#define NO_MOVIES // add option to disable intro videos
|
||||
|
|
|
@ -41,6 +41,8 @@
|
|||
#include "Timecycle.h"
|
||||
#include "Fluff.h"
|
||||
|
||||
#include "vmu/vmu.h"
|
||||
|
||||
#define BLOCK_COUNT 22
|
||||
#define SIZE_OF_SIMPLEVARS 0xE4
|
||||
|
||||
|
@ -94,11 +96,10 @@ PopulateRadioStationPositionList()
|
|||
|
||||
#define LoadSaveDataBlock()\
|
||||
do {\
|
||||
if (!ReadDataFromFile(file, (uint8 *) &size, 4))\
|
||||
return false;\
|
||||
size = align4bytes(size);\
|
||||
if (!ReadDataFromFile(file, work_buff, size))\
|
||||
return false;\
|
||||
size = C_PcSave::PcClassLoadRoutine(file, work_buff); \
|
||||
if (!size) {\
|
||||
return false; \
|
||||
} \
|
||||
buf = work_buff;\
|
||||
} while (0)
|
||||
|
||||
|
@ -299,12 +300,14 @@ GenericLoad()
|
|||
CheckSum = 0;
|
||||
CDate dummy; // unused
|
||||
CPad::ResetCheats();
|
||||
if (!ReadInSizeofSaveFileBuffer(file, size))
|
||||
return false;
|
||||
size = align4bytes(size);
|
||||
ReadDataFromFile(file, work_buff, size);
|
||||
|
||||
file = CFileMgr::OpenFile(LoadFileName, "rb");
|
||||
assert(file != 0);
|
||||
size = C_PcSave::PcClassLoadRoutine(file, work_buff);
|
||||
assert(size != 0);
|
||||
buf = (work_buff + 0x40);
|
||||
ReadDataFromBufferPointer(buf, saveSize);
|
||||
|
||||
#ifdef MISSION_REPLAY // a hack to keep compatibility but get new data from save
|
||||
qs = saveSize >> 24;
|
||||
#endif
|
||||
|
@ -526,7 +529,7 @@ void
|
|||
MakeValidSaveName(int32 slot)
|
||||
{
|
||||
ValidSaveName[0] = '\0';
|
||||
sprintf(ValidSaveName, "%s%i", DefaultPCSaveFileName, slot + 1);
|
||||
sprintf(ValidSaveName, "%s%i", slot==7?"GTAVCSF":DefaultPCSaveFileName, slot + 1);
|
||||
strncat(ValidSaveName, ".b", 5);
|
||||
}
|
||||
|
||||
|
@ -555,20 +558,19 @@ CheckDataNotCorrupt(int32 slot, char *name)
|
|||
eLevelName level = LEVEL_GENERIC;
|
||||
CheckSum = 0;
|
||||
uint32 bytes_processed = 0;
|
||||
#if !defined(RW_DC)
|
||||
sprintf(filename, "%s%i%s", DefaultPCSaveFileName, slot + 1, ".b");
|
||||
#else
|
||||
sprintf(filename, "%s%i%s", slot==7?"GTAVCSF":DefaultPCSaveFileName, slot + 1, ".b");
|
||||
#endif
|
||||
int file = CFileMgr::OpenFile(filename, "rb");
|
||||
if (file == 0)
|
||||
return false;
|
||||
strcpy(name, filename);
|
||||
while (SIZE_OF_ONE_GAME_IN_BYTES - sizeof(uint32) > bytes_processed && blocknum < 40) {
|
||||
int32 blocksize;
|
||||
if (!ReadDataFromFile(file, (uint8*)&blocksize, sizeof(blocksize))) {
|
||||
CloseFile(file);
|
||||
return false;
|
||||
}
|
||||
if (blocksize > align4bytes(sizeof(work_buff)))
|
||||
blocksize = sizeof(work_buff) - sizeof(uint32);
|
||||
if (!ReadDataFromFile(file, work_buff, align4bytes(blocksize))) {
|
||||
blocksize = C_PcSave::PcClassLoadRoutine(file, work_buff);
|
||||
if (blocksize == 0) {
|
||||
CloseFile(file);
|
||||
return false;
|
||||
}
|
||||
|
@ -606,14 +608,16 @@ CheckDataNotCorrupt(int32 slot, char *name)
|
|||
bool
|
||||
RestoreForStartLoad()
|
||||
{
|
||||
uint8 buf[999];
|
||||
|
||||
int file = CFileMgr::OpenFile(LoadFileName, "rb");
|
||||
if (file == 0) {
|
||||
PcSaveHelper.nErrorCode = SAVESTATUS_ERR_LOAD_OPEN;
|
||||
return false;
|
||||
}
|
||||
ReadDataFromFile(file, buf, sizeof(buf));
|
||||
|
||||
uint32_t size = C_PcSave::PcClassLoadRoutine(file, work_buff);
|
||||
assert(size != 0);
|
||||
uint8 *buf = work_buff;
|
||||
|
||||
if (CFileMgr::GetErrorReadWrite(file)) {
|
||||
PcSaveHelper.nErrorCode = SAVESTATUS_ERR_LOAD_READ;
|
||||
if (!CloseFile(file))
|
||||
|
|
|
@ -12,6 +12,11 @@
|
|||
#include "PCSave.h"
|
||||
#include "Text.h"
|
||||
|
||||
#include "minilzo.h"
|
||||
#include "main.h"
|
||||
|
||||
#include "vmu/vmu.h"
|
||||
|
||||
const char* _psGetUserFilesFolder();
|
||||
|
||||
C_PcSave PcSaveHelper;
|
||||
|
@ -19,7 +24,11 @@ C_PcSave PcSaveHelper;
|
|||
void
|
||||
C_PcSave::SetSaveDirectory(const char *path)
|
||||
{
|
||||
#if defined(RW_DC)
|
||||
sprintf(DefaultPCSaveFileName, "%s/%s", path, "GTAVCsf");
|
||||
#else
|
||||
sprintf(DefaultPCSaveFileName, "%s\\%s", path, "GTAVCsf");
|
||||
#endif
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -65,14 +74,39 @@ C_PcSave::SaveSlot(int32 slot)
|
|||
bool
|
||||
C_PcSave::PcClassSaveRoutine(int32 file, uint8 *data, uint32 size)
|
||||
{
|
||||
CFileMgr::Write(file, (const char*)&size, sizeof(size));
|
||||
if (CFileMgr::GetErrorReadWrite(file)) {
|
||||
nErrorCode = SAVESTATUS_ERR_SAVE_WRITE;
|
||||
strncpy(SaveFileNameJustSaved, ValidSaveName, sizeof(ValidSaveName) - 1);
|
||||
void* wrkmem = malloc(LZO1X_1_MEM_COMPRESS);
|
||||
uint8* compressed = (uint8*)malloc(size*2);
|
||||
lzo_uint compressed_size;
|
||||
int crv = lzo1x_1_compress(data, size, compressed, &compressed_size, wrkmem);
|
||||
free(wrkmem);
|
||||
|
||||
if (crv == LZO_E_OK) {
|
||||
uint32_t compressed_size32 = compressed_size | 0x80000000;
|
||||
CFileMgr::Write(file, (const char*)&compressed_size32, sizeof(compressed_size32));
|
||||
if (CFileMgr::GetErrorReadWrite(file)) {
|
||||
free(compressed);
|
||||
nErrorCode = SAVESTATUS_ERR_SAVE_WRITE;
|
||||
strncpy(SaveFileNameJustSaved, ValidSaveName, sizeof(ValidSaveName) - 1);
|
||||
return false;
|
||||
}
|
||||
|
||||
CFileMgr::Write(file, (const char*)compressed, compressed_size);
|
||||
free(compressed);
|
||||
} else if (crv == LZO_E_NOT_COMPRESSIBLE) {
|
||||
free(compressed);
|
||||
uint32_t compressed_size32 = size;
|
||||
CFileMgr::Write(file, (const char*)&compressed_size32, sizeof(compressed_size32));
|
||||
if (CFileMgr::GetErrorReadWrite(file)) {
|
||||
nErrorCode = SAVESTATUS_ERR_SAVE_WRITE;
|
||||
strncpy(SaveFileNameJustSaved, ValidSaveName, sizeof(ValidSaveName) - 1);
|
||||
return false;
|
||||
}
|
||||
CFileMgr::Write(file, (const char*)data, align4bytes(size));
|
||||
} else {
|
||||
free(compressed);
|
||||
return false;
|
||||
}
|
||||
|
||||
CFileMgr::Write(file, (const char*)data, align4bytes(size));
|
||||
CheckSum += (uint8) size;
|
||||
CheckSum += (uint8) (size >> 8);
|
||||
CheckSum += (uint8) (size >> 16);
|
||||
|
@ -89,6 +123,44 @@ C_PcSave::PcClassSaveRoutine(int32 file, uint8 *data, uint32 size)
|
|||
return true;
|
||||
}
|
||||
|
||||
uint32_t C_PcSave::PcClassLoadRoutine(int32 file, uint8 *data) {
|
||||
uint32 size;
|
||||
CFileMgr::Read(file, (char*)&size, sizeof(size));
|
||||
|
||||
|
||||
assert(data == work_buff);
|
||||
|
||||
if (!(size & 0x80000000)) {
|
||||
assert(align4bytes(size) == size);
|
||||
CFileMgr::Read(file, (char*)data, align4bytes(size));
|
||||
if (CFileMgr::GetErrorReadWrite(file)) {
|
||||
return 0;
|
||||
}
|
||||
return size;
|
||||
} else {
|
||||
size &= ~0x80000000;
|
||||
uint8* compressed = (uint8*)malloc(size);
|
||||
CFileMgr::Read(file, (const char*)compressed, size);
|
||||
if (CFileMgr::GetErrorReadWrite(file)) {
|
||||
free(compressed);
|
||||
return 0;
|
||||
}
|
||||
|
||||
lzo_uint decompressed_size = 0;
|
||||
auto crv = lzo1x_decompress(compressed, size, data, &decompressed_size, NULL);
|
||||
free(compressed);
|
||||
if (crv != LZO_E_OK) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (align4bytes(decompressed_size) != decompressed_size) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return decompressed_size;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
C_PcSave::PopulateSlotInfo()
|
||||
{
|
||||
|
@ -103,16 +175,16 @@ C_PcSave::PopulateSlotInfo()
|
|||
#else
|
||||
char savename[52];
|
||||
#endif
|
||||
struct {
|
||||
int size;
|
||||
struct header_t {
|
||||
wchar FileName[24];
|
||||
SYSTEMTIME SaveDateTime;
|
||||
} header;
|
||||
sprintf(savename, "%s%i%s", DefaultPCSaveFileName, i + 1, ".b");
|
||||
sprintf(savename, "%s%i%s", i==7?"GTAVCSF":DefaultPCSaveFileName, i + 1, ".b");
|
||||
int file = CFileMgr::OpenFile(savename, "rb");
|
||||
if (file != 0) {
|
||||
CFileMgr::Read(file, (char*)&header, sizeof(header));
|
||||
if (strncmp((char*)&header, TopLineEmptyFile, sizeof(TopLineEmptyFile)-1) != 0) {
|
||||
if (C_PcSave::PcClassLoadRoutine(file, (uint8*)work_buff)) {
|
||||
header = *(header_t*)work_buff;
|
||||
|
||||
Slots[i] = SLOT_OK;
|
||||
memcpy(SlotFileName[i], &header.FileName, sizeof(header.FileName));
|
||||
|
||||
|
@ -163,4 +235,4 @@ C_PcSave::PopulateSlotInfo()
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -34,6 +34,7 @@ public:
|
|||
bool DeleteSlot(int32 slot);
|
||||
int8 SaveSlot(int32 slot);
|
||||
bool PcClassSaveRoutine(int32 file, uint8 *data, uint32 size);
|
||||
static uint32_t PcClassLoadRoutine(int32 file, uint8 *data);
|
||||
static void SetSaveDirectory(const char *path);
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue