mirror of
https://github.com/OpenDriver2/REDRIVER2.git
synced 2024-11-25 11:52:32 +01:00
- get rid of PC Filesystem spooling micro-freezes on slow hard drives
This commit is contained in:
parent
662bf3a049
commit
ca9f797df0
@ -524,8 +524,6 @@ void SetPleaseWait(char *buffer)
|
|||||||
ResetCityType();
|
ResetCityType();
|
||||||
|
|
||||||
#else
|
#else
|
||||||
ResetCityType();
|
|
||||||
|
|
||||||
PsyX_EndScene();
|
PsyX_EndScene();
|
||||||
#endif // PSX
|
#endif // PSX
|
||||||
|
|
||||||
|
@ -406,12 +406,7 @@ void LoadGameLevel(void)
|
|||||||
sector = citylumps[GameLevel][CITYLUMP_DATA1].x / CDSECTOR_SIZE;
|
sector = citylumps[GameLevel][CITYLUMP_DATA1].x / CDSECTOR_SIZE;
|
||||||
nsectors = citylumps[GameLevel][CITYLUMP_DATA1].y / CDSECTOR_SIZE;
|
nsectors = citylumps[GameLevel][CITYLUMP_DATA1].y / CDSECTOR_SIZE;
|
||||||
|
|
||||||
#ifdef PSX
|
|
||||||
loadsectors((char*)_primTab1, sector, nsectors);
|
loadsectors((char*)_primTab1, sector, nsectors);
|
||||||
#else
|
|
||||||
extern char g_CurrentLevelFileName[64];
|
|
||||||
loadsectorsPC(g_CurrentLevelFileName, (char*)_primTab1, sector, nsectors);
|
|
||||||
#endif // PSX
|
|
||||||
|
|
||||||
sector += nsectors;
|
sector += nsectors;
|
||||||
|
|
||||||
@ -428,12 +423,8 @@ void LoadGameLevel(void)
|
|||||||
malloc_lump = D_MALLOC(nsectors * CDSECTOR_SIZE);
|
malloc_lump = D_MALLOC(nsectors * CDSECTOR_SIZE);
|
||||||
D_MALLOC_END();
|
D_MALLOC_END();
|
||||||
|
|
||||||
#ifdef PSX
|
|
||||||
loadsectors(malloc_lump, sector, nsectors);
|
loadsectors(malloc_lump, sector, nsectors);
|
||||||
#else
|
|
||||||
extern char g_CurrentLevelFileName[64];
|
|
||||||
loadsectorsPC(g_CurrentLevelFileName, malloc_lump, sector, nsectors);
|
|
||||||
#endif // PSX
|
|
||||||
sector += nsectors;
|
sector += nsectors;
|
||||||
|
|
||||||
// CITYLUMP_DATA2 - in-memory lump
|
// CITYLUMP_DATA2 - in-memory lump
|
||||||
|
@ -406,7 +406,7 @@ void ControlMap(void)
|
|||||||
region_to_unpack = region_x + region_z * regions_across;
|
region_to_unpack = region_x + region_z * regions_across;
|
||||||
|
|
||||||
if (current_region == -1)
|
if (current_region == -1)
|
||||||
UnpackRegion(region_to_unpack, region_x & 1U | (region_z & 1U) * 2); // is that ever valid for 'target_barrel_region'?
|
UnpackRegion(region_to_unpack, region_x & 1U | (region_z & 1U) * 2);
|
||||||
|
|
||||||
current_region = region_to_unpack;
|
current_region = region_to_unpack;
|
||||||
|
|
||||||
|
@ -118,10 +118,7 @@ SPOOLQ spooldata[48];
|
|||||||
#if USE_PC_FILESYSTEM
|
#if USE_PC_FILESYSTEM
|
||||||
|
|
||||||
#define SIMPLE_SPOOL
|
#define SIMPLE_SPOOL
|
||||||
|
|
||||||
extern int gContentOverride;
|
extern int gContentOverride;
|
||||||
extern char g_CurrentLevelFileName[64];
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_DEBUG) || defined(PSX)
|
#if defined(_DEBUG) || defined(PSX)
|
||||||
@ -357,7 +354,7 @@ void RequestSpool(int type, int data, int offset, int loadsize, char *address, s
|
|||||||
|
|
||||||
next->type = type;
|
next->type = type;
|
||||||
next->data = data;
|
next->data = data;
|
||||||
next->sector = (SpoolLumpOffset / 2048) + offset;
|
next->sector = (SpoolLumpOffset / CDSECTOR_SIZE) + offset;
|
||||||
next->nsectors = loadsize;
|
next->nsectors = loadsize;
|
||||||
next->addr = address;
|
next->addr = address;
|
||||||
next->func = func;
|
next->func = func;
|
||||||
@ -744,7 +741,6 @@ void CheckLoadAreaData(int cellx, int cellz)
|
|||||||
else if (/*spoolptr->super_region == 0xFF ||*/ nAreas == 0)
|
else if (/*spoolptr->super_region == 0xFF ||*/ nAreas == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// [A] Rev 1.1 patch
|
|
||||||
#define BOUNDARY_MIN 15
|
#define BOUNDARY_MIN 15
|
||||||
#define BOUNDARY_MAX 17
|
#define BOUNDARY_MAX 17
|
||||||
|
|
||||||
@ -806,14 +802,14 @@ void ClearRegion(int target_region)
|
|||||||
ushort *cell_ptrs_s;
|
ushort *cell_ptrs_s;
|
||||||
int loop;
|
int loop;
|
||||||
|
|
||||||
loop = 1024;
|
|
||||||
cell_ptrs_s = cell_ptrs + target_region * 1024;
|
cell_ptrs_s = cell_ptrs + target_region * 1024;
|
||||||
pvsptr = (int *)PVS_Buffers[target_region];
|
pvsptr = (int *)PVS_Buffers[target_region];
|
||||||
|
|
||||||
do {
|
for (loop = 0; loop < 1024; loop++)
|
||||||
|
{
|
||||||
*cell_ptrs_s++ = 0xffff;
|
*cell_ptrs_s++ = 0xffff;
|
||||||
*pvsptr++ = 0;
|
*pvsptr++ = 0;
|
||||||
} while (--loop != 0);
|
}
|
||||||
|
|
||||||
ClearMem(PVS_Buffers[target_region]-4, pvsSize[target_region]);
|
ClearMem(PVS_Buffers[target_region]-4, pvsSize[target_region]);
|
||||||
|
|
||||||
@ -1016,7 +1012,7 @@ void ready_cb_textures(unsigned char intr, unsigned char *result)
|
|||||||
{
|
{
|
||||||
CdGetSector(target_address, SECTOR_SIZE);
|
CdGetSector(target_address, SECTOR_SIZE);
|
||||||
|
|
||||||
target_address += 2048;
|
target_address += CDSECTOR_SIZE;
|
||||||
sectors_this_chunk--;
|
sectors_this_chunk--;
|
||||||
current_sector++;
|
current_sector++;
|
||||||
sectors_to_read--;
|
sectors_to_read--;
|
||||||
@ -1067,7 +1063,7 @@ void ready_cb_regions(unsigned char intr, unsigned char *result)
|
|||||||
{
|
{
|
||||||
CdGetSector(target_address, SECTOR_SIZE);
|
CdGetSector(target_address, SECTOR_SIZE);
|
||||||
|
|
||||||
target_address += 2048;
|
target_address += CDSECTOR_SIZE;
|
||||||
sectors_this_chunk--;
|
sectors_this_chunk--;
|
||||||
current_sector++;
|
current_sector++;
|
||||||
sectors_to_read--;
|
sectors_to_read--;
|
||||||
@ -1182,7 +1178,7 @@ void ready_cb_misc(unsigned char intr, unsigned char *result)
|
|||||||
{
|
{
|
||||||
CdGetSector(target_address, SECTOR_SIZE);
|
CdGetSector(target_address, SECTOR_SIZE);
|
||||||
|
|
||||||
target_address += 2048;
|
target_address += CDSECTOR_SIZE;
|
||||||
sectors_to_read--;
|
sectors_to_read--;
|
||||||
current_sector++;
|
current_sector++;
|
||||||
|
|
||||||
@ -1403,149 +1399,159 @@ void GotRegion(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// [D] [T]
|
#if defined(SIMPLE_SPOOL)
|
||||||
void UpdateSpool(void)
|
extern char g_CurrentLevelFileName[64];
|
||||||
{
|
extern char* g_CurrentLevelSpoolData;
|
||||||
#if USE_PC_FILESYSTEM && defined(SIMPLE_SPOOL)
|
|
||||||
if(strlen(g_CurrentLevelFileName) > 0)
|
|
||||||
{
|
|
||||||
FILE* fp = fopen(g_CurrentLevelFileName, "rb");
|
|
||||||
|
|
||||||
if (!fp)
|
int UpdateSpoolPC(void)
|
||||||
{
|
{
|
||||||
#if !defined(__EMSCRIPTEN__)
|
if (g_CurrentLevelFileName[0] == 0)
|
||||||
char errPrint[1024];
|
return 0;
|
||||||
sprintf(errPrint, "Cannot open '%s'\n", g_CurrentLevelFileName);
|
|
||||||
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "ERROR", errPrint, NULL);
|
// read entire spool data
|
||||||
#endif
|
if (g_CurrentLevelSpoolData == NULL)
|
||||||
return;
|
{
|
||||||
|
int SpoolLumpSize;
|
||||||
|
SpoolLumpSize = 16 * 1024 * 1024; // allocate 16 MB of RAM for spoolable data
|
||||||
|
g_CurrentLevelSpoolData = (char*)malloc(16 * 1024 * 1024);
|
||||||
|
|
||||||
|
loadsectors(g_CurrentLevelSpoolData, SpoolLumpOffset / CDSECTOR_SIZE, SpoolLumpSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; spoolpos_reading < spoolcounter; spoolpos_reading++)
|
||||||
|
{
|
||||||
|
char* spoolDataPtr;
|
||||||
|
SPOOLQ* current;
|
||||||
|
current = &spooldata[spoolpos_reading];
|
||||||
|
|
||||||
|
#define SPL_READ(dest, nsectors) \
|
||||||
|
{ \
|
||||||
|
int readSize = (nsectors)*CDSECTOR_SIZE; \
|
||||||
|
memcpy(dest, spoolDataPtr, readSize); \
|
||||||
|
spoolDataPtr += readSize; \
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; spoolpos_reading < spoolcounter; spoolpos_reading++)
|
|
||||||
{
|
|
||||||
SPOOLQ* current = &spooldata[spoolpos_reading];
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
char* nameType;
|
char* nameType;
|
||||||
switch (current->type)
|
switch (current->type)
|
||||||
{
|
{
|
||||||
case 0: // regions
|
case 0: // regions
|
||||||
nameType = "REGION";
|
nameType = "REGION";
|
||||||
break;
|
break;
|
||||||
case 1: // textures
|
case 1: // textures
|
||||||
nameType = "TPAGE";
|
nameType = "TPAGE";
|
||||||
break;
|
break;
|
||||||
case 2: // sbk
|
case 2: // sbk
|
||||||
nameType = "SBK";
|
nameType = "SBK";
|
||||||
break;
|
break;
|
||||||
case 3: // misc
|
case 3: // misc
|
||||||
nameType = "MISC";
|
nameType = "MISC";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
SPOOL_WARNING("spool type=%s cb=%d sec=%d cnt=%d id=%d\n", nameType, current->func ? 1 : 0, current->sector, current->nsectors, spoolpos_reading);
|
SPOOL_WARNING("spool type=%s cb=%d sec=%d cnt=%d id=%d\n", nameType, current->func ? 1 : 0, current->sector, current->nsectors, spoolpos_reading);
|
||||||
#endif // _DEBUG
|
#endif // _DEBUG
|
||||||
|
|
||||||
// seek to required sector
|
// seek to required sector
|
||||||
fseek(fp, current->sector * 2048, SEEK_SET);
|
spoolDataPtr = g_CurrentLevelSpoolData - SpoolLumpOffset + current->sector * CDSECTOR_SIZE;
|
||||||
|
|
||||||
switch (current->type)
|
switch (current->type)
|
||||||
|
{
|
||||||
|
case 0: // regions
|
||||||
|
case 3: // misc
|
||||||
|
SPL_READ(current->addr, current->nsectors);
|
||||||
|
|
||||||
|
if (current->func)
|
||||||
|
current->func();
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 1: // textures
|
||||||
|
|
||||||
|
// read cluts
|
||||||
|
nTPchunks = 0;
|
||||||
|
SPL_READ(current->addr + CDSECTOR_SIZE * 2 * 4, 1);
|
||||||
|
SendTPage();
|
||||||
|
|
||||||
|
nTPchunks++;
|
||||||
|
|
||||||
|
// read tpage (4 sectors 4 times = 16)
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
case 0: // regions
|
SPL_READ(current->addr + (loadbank_write & 1U) * 256 * 32, 4);
|
||||||
fread(current->addr, 2048, current->nsectors, fp);
|
|
||||||
|
|
||||||
if (current->func)
|
|
||||||
current->func();
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 1: // textures
|
|
||||||
|
|
||||||
// read cluts
|
|
||||||
nTPchunks = 0;
|
|
||||||
fread(current->addr + 0x4000, 2048, 1, fp);
|
|
||||||
SendTPage();
|
SendTPage();
|
||||||
|
|
||||||
nTPchunks++;
|
nTPchunks++;
|
||||||
|
|
||||||
// read tpage (4 sectors 4 times = 16)
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
fread(current->addr + (loadbank_write & 1U) * 256 * 32, 2048, 4, fp);
|
|
||||||
SendTPage();
|
|
||||||
|
|
||||||
nTPchunks++;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 2: // sbk
|
|
||||||
// nothing to do with this
|
|
||||||
break;
|
|
||||||
case 3: // misc
|
|
||||||
fread(current->addr, 2048, current->nsectors, fp);
|
|
||||||
|
|
||||||
if (current->func)
|
|
||||||
current->func();
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
spoolcounter = 0;
|
#undef SPL_READ
|
||||||
spoolpos_reading = 0;
|
|
||||||
spoolactive = 0;
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spoolcounter = 0;
|
||||||
|
spoolpos_reading = 0;
|
||||||
|
spoolactive = 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// [D] [T]
|
||||||
|
void UpdateSpool(void)
|
||||||
|
{
|
||||||
CdlLOC pos;
|
CdlLOC pos;
|
||||||
|
SPOOLQ* current;
|
||||||
|
|
||||||
SPOOLQ *current = &spooldata[spoolpos_reading];
|
#if defined(SIMPLE_SPOOL)
|
||||||
|
if (UpdateSpoolPC())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!XAPrepared())
|
if (XAPrepared())
|
||||||
|
return;
|
||||||
|
|
||||||
|
current = &spooldata[spoolpos_reading];
|
||||||
|
target_address = current->addr;
|
||||||
|
|
||||||
|
if (current->type == 0) // SPOOLTYPE_REGIONS
|
||||||
{
|
{
|
||||||
target_address = current->addr;
|
sectors_this_chunk = current->nsectors;
|
||||||
|
sectors_to_read = spool_regioninfo[spool_regionpos].nsectors;
|
||||||
|
|
||||||
if (current->type == 0) // SPOOLTYPE_REGIONS
|
CdDataCallback(data_cb_regions);
|
||||||
{
|
CdReadyCallback(ready_cb_regions);
|
||||||
sectors_this_chunk = current->nsectors;
|
|
||||||
sectors_to_read = spool_regioninfo[spool_regionpos].nsectors;
|
|
||||||
|
|
||||||
CdDataCallback(data_cb_regions);
|
|
||||||
CdReadyCallback(ready_cb_regions);
|
|
||||||
}
|
|
||||||
else if (current->type == 1) // SPOOLTYPE_TEXTURES
|
|
||||||
{
|
|
||||||
nTPchunks_reading = 0;
|
|
||||||
nTPchunks_writing = 0;
|
|
||||||
sectors_to_read = 17;
|
|
||||||
ntpages = tsetcounter;
|
|
||||||
sectors_this_chunk = 1;
|
|
||||||
|
|
||||||
CdDataCallback(data_cb_textures);
|
|
||||||
CdReadyCallback(ready_cb_textures);
|
|
||||||
|
|
||||||
target_address += 0x4000;
|
|
||||||
}
|
|
||||||
else if (current->type == 3) // SPOOLTYPE_MISC
|
|
||||||
{
|
|
||||||
sectors_to_read = (current->nsectors);
|
|
||||||
|
|
||||||
CdDataCallback(data_cb_misc);
|
|
||||||
CdReadyCallback(ready_cb_misc);
|
|
||||||
}
|
|
||||||
|
|
||||||
current_sector = current->sector;
|
|
||||||
|
|
||||||
endchunk = 0;
|
|
||||||
|
|
||||||
switch_spooltype = 0;
|
|
||||||
|
|
||||||
// run sector reading
|
|
||||||
CdIntToPos(current_sector, &pos);
|
|
||||||
CdControlF(CdlReadS, (u_char*)&pos);
|
|
||||||
}
|
}
|
||||||
|
else if (current->type == 1) // SPOOLTYPE_TEXTURES
|
||||||
|
{
|
||||||
|
nTPchunks_reading = 0;
|
||||||
|
nTPchunks_writing = 0;
|
||||||
|
sectors_to_read = 17;
|
||||||
|
ntpages = tsetcounter;
|
||||||
|
sectors_this_chunk = 1;
|
||||||
|
|
||||||
|
CdDataCallback(data_cb_textures);
|
||||||
|
CdReadyCallback(ready_cb_textures);
|
||||||
|
|
||||||
|
target_address += 0x4000;
|
||||||
|
}
|
||||||
|
else if (current->type == 3) // SPOOLTYPE_MISC
|
||||||
|
{
|
||||||
|
sectors_to_read = (current->nsectors);
|
||||||
|
|
||||||
|
CdDataCallback(data_cb_misc);
|
||||||
|
CdReadyCallback(ready_cb_misc);
|
||||||
|
}
|
||||||
|
|
||||||
|
current_sector = current->sector;
|
||||||
|
endchunk = 0;
|
||||||
|
switch_spooltype = 0;
|
||||||
|
|
||||||
|
// run sector reading
|
||||||
|
CdIntToPos(current_sector, &pos);
|
||||||
|
CdControlF(CdlReadS, (u_char*)&pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
// [D] [T]
|
// [D] [T]
|
||||||
@ -1616,14 +1622,16 @@ int RoadMapRegions[4];
|
|||||||
// [D] [T]
|
// [D] [T]
|
||||||
void UnpackRegion(int region_to_unpack, int target_barrel_region)
|
void UnpackRegion(int region_to_unpack, int target_barrel_region)
|
||||||
{
|
{
|
||||||
if (loading_region[target_barrel_region] == -1)
|
if (loading_region[target_barrel_region] != -1)
|
||||||
{
|
{
|
||||||
if (LoadRegionData(region_to_unpack, target_barrel_region))
|
return;
|
||||||
spool_regioncounter++;
|
|
||||||
|
|
||||||
regions_unpacked[target_barrel_region] = region_to_unpack;
|
|
||||||
RoadMapRegions[target_barrel_region] = region_to_unpack;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (LoadRegionData(region_to_unpack, target_barrel_region))
|
||||||
|
spool_regioncounter++;
|
||||||
|
|
||||||
|
regions_unpacked[target_barrel_region] = region_to_unpack;
|
||||||
|
RoadMapRegions[target_barrel_region] = region_to_unpack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1710,7 +1718,7 @@ void CleanModelSpooled(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// memcpy
|
// memcpy
|
||||||
while (loadaddr < (int*)(specLoadBuffer + 2048))
|
while (loadaddr < (int*)(specLoadBuffer + CDSECTOR_SIZE))
|
||||||
*modelMemory++ = *loadaddr++;
|
*modelMemory++ = *loadaddr++;
|
||||||
|
|
||||||
mem = (int*)((int)gCarCleanModelPtr[4] + gCarCleanModelPtr[4]->poly_block); // [A] pls check, might be invalid
|
mem = (int*)((int)gCarCleanModelPtr[4] + gCarCleanModelPtr[4]->poly_block); // [A] pls check, might be invalid
|
||||||
@ -1759,7 +1767,7 @@ void DamagedModelSpooled(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// memcpy
|
// memcpy
|
||||||
while (loadaddr < (int*)(specLoadBuffer + 2048))
|
while (loadaddr < (int*)(specLoadBuffer + CDSECTOR_SIZE))
|
||||||
*modelMemory++ = *loadaddr++;
|
*modelMemory++ = *loadaddr++;
|
||||||
|
|
||||||
mem = (int*)((int)gCarDamModelPtr[4] + gCarDamModelPtr[4]->poly_block); // [A] pls check, might be invalid
|
mem = (int*)((int)gCarDamModelPtr[4] + gCarDamModelPtr[4]->poly_block); // [A] pls check, might be invalid
|
||||||
@ -1771,7 +1779,7 @@ void DamagedModelSpooled(void)
|
|||||||
{
|
{
|
||||||
// [A] vertices
|
// [A] vertices
|
||||||
LoadCarModelFromFile((char*)gCarDamModelPtr[4], MissionHeader->residentModels[4], CAR_MODEL_DAMAGED);
|
LoadCarModelFromFile((char*)gCarDamModelPtr[4], MissionHeader->residentModels[4], CAR_MODEL_DAMAGED);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
specBlocksToLoad = 0;
|
specBlocksToLoad = 0;
|
||||||
@ -1806,7 +1814,7 @@ void LowModelSpooled(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// memcpy
|
// memcpy
|
||||||
while (loadaddr < (int*)(specLoadBuffer + 2048))
|
while (loadaddr < (int*)(specLoadBuffer + CDSECTOR_SIZE))
|
||||||
*modelMemory++ = *loadaddr++;
|
*modelMemory++ = *loadaddr++;
|
||||||
|
|
||||||
mem = (int*)((int)gCarLowModelPtr[4] + gCarLowModelPtr[4]->poly_block); // [A] pls check, might be invalid
|
mem = (int*)((int)gCarLowModelPtr[4] + gCarLowModelPtr[4]->poly_block); // [A] pls check, might be invalid
|
||||||
@ -1850,7 +1858,7 @@ void CleanSpooled(void)
|
|||||||
int size_2 = ((int *)specmallocptr)[1];
|
int size_2 = ((int *)specmallocptr)[1];
|
||||||
int size_3 = ((int *)specmallocptr)[2];
|
int size_3 = ((int *)specmallocptr)[2];
|
||||||
|
|
||||||
lastCleanBlock = size_1 + 2048 + 11;
|
lastCleanBlock = size_1 + CDSECTOR_SIZE + 11;
|
||||||
lastCleanBlock >>= 11;
|
lastCleanBlock >>= 11;
|
||||||
|
|
||||||
firstDamBlock = size_1 + 12;
|
firstDamBlock = size_1 + 12;
|
||||||
@ -1859,17 +1867,17 @@ void CleanSpooled(void)
|
|||||||
firstLowBlock = size_1 + size_2 + 12;
|
firstLowBlock = size_1 + size_2 + 12;
|
||||||
firstLowBlock >>= 11;
|
firstLowBlock >>= 11;
|
||||||
|
|
||||||
int lastDamBlock = size_1 + size_2 + 2048 + 11;
|
int lastDamBlock = size_1 + size_2 + CDSECTOR_SIZE + 11;
|
||||||
lastDamBlock >>= 11;
|
lastDamBlock >>= 11;
|
||||||
|
|
||||||
lengthDamBlock = lastDamBlock - firstDamBlock;
|
lengthDamBlock = lastDamBlock - firstDamBlock;
|
||||||
damOffset = size_1 - (firstDamBlock * 2048 - 12);
|
damOffset = size_1 - (firstDamBlock * CDSECTOR_SIZE - 12);
|
||||||
|
|
||||||
int lastLowBlock = size_1 + size_2 + size_3 + 2048 + 11;
|
int lastLowBlock = size_1 + size_2 + size_3 + CDSECTOR_SIZE + 11;
|
||||||
lastLowBlock >>= 11;
|
lastLowBlock >>= 11;
|
||||||
|
|
||||||
lengthLowBlock = lastLowBlock - firstLowBlock;
|
lengthLowBlock = lastLowBlock - firstLowBlock;
|
||||||
lowOffset = size_1 + size_2 - (firstLowBlock * 2048 - 12);
|
lowOffset = size_1 + size_2 - (firstLowBlock * CDSECTOR_SIZE - 12);
|
||||||
}
|
}
|
||||||
|
|
||||||
model = (MODEL *)(specmallocptr + 12);
|
model = (MODEL *)(specmallocptr + 12);
|
||||||
@ -2030,7 +2038,7 @@ void SpecialStartNextBlock(void)
|
|||||||
specialState++;
|
specialState++;
|
||||||
}
|
}
|
||||||
|
|
||||||
fileSector = 0x1400 + (citystart[GameLevel] - SpoolLumpOffset / 2048) + (specspooldata[2]-1) * 42;
|
fileSector = 0x1400 + (citystart[GameLevel] - SpoolLumpOffset / CDSECTOR_SIZE) + (specspooldata[2]-1) * 42;
|
||||||
|
|
||||||
switch (specialState)
|
switch (specialState)
|
||||||
{
|
{
|
||||||
@ -2052,12 +2060,12 @@ void SpecialStartNextBlock(void)
|
|||||||
case 5:
|
case 5:
|
||||||
spoolFunc = CleanSpooled;
|
spoolFunc = CleanSpooled;
|
||||||
fileSector += (41 - specBlocksToLoad);
|
fileSector += (41 - specBlocksToLoad);
|
||||||
loadaddr = specmallocptr + (7 - specBlocksToLoad) * 2048;
|
loadaddr = specmallocptr + (7 - specBlocksToLoad) * CDSECTOR_SIZE;
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
spoolFunc = LowSpooled;
|
spoolFunc = LowSpooled;
|
||||||
fileSector += ((firstLowBlock + lengthLowBlock) - specBlocksToLoad) + 34;
|
fileSector += ((firstLowBlock + lengthLowBlock) - specBlocksToLoad) + 34;
|
||||||
loadaddr = specmallocptr + (lengthLowBlock - specBlocksToLoad) * 2048;
|
loadaddr = specmallocptr + (lengthLowBlock - specBlocksToLoad) * CDSECTOR_SIZE;
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
spoolFunc = CleanModelSpooled;
|
spoolFunc = CleanModelSpooled;
|
||||||
|
@ -170,6 +170,7 @@ XYPAIR citylumps[8][4];
|
|||||||
#ifndef PSX
|
#ifndef PSX
|
||||||
int gContentOverride = 1; // use unpacked filesystem?
|
int gContentOverride = 1; // use unpacked filesystem?
|
||||||
char g_CurrentLevelFileName[64];
|
char g_CurrentLevelFileName[64];
|
||||||
|
char* g_CurrentLevelSpoolData = NULL;
|
||||||
#endif // !PSX
|
#endif // !PSX
|
||||||
|
|
||||||
// TODO: to game vars
|
// TODO: to game vars
|
||||||
@ -373,7 +374,7 @@ int LoadfileSeg(char* name, char* addr, int offset, int loadsize)
|
|||||||
int remainingOffset;
|
int remainingOffset;
|
||||||
int sector;
|
int sector;
|
||||||
u_char result[8];
|
u_char result[8];
|
||||||
char sectorbuffer[2048];
|
char sectorbuffer[CDSECTOR_SIZE];
|
||||||
CdlLOC pos;
|
CdlLOC pos;
|
||||||
|
|
||||||
sprintf(namebuffer, "\\%s%s;1", gDataFolder, name);
|
sprintf(namebuffer, "\\%s%s;1", gDataFolder, name);
|
||||||
@ -395,7 +396,7 @@ int LoadfileSeg(char* name, char* addr, int offset, int loadsize)
|
|||||||
remainingBytes = loadsize;
|
remainingBytes = loadsize;
|
||||||
|
|
||||||
// seek to the sector
|
// seek to the sector
|
||||||
sector = offset / 2048 + CdPosToInt(¤tfileinfo.pos);
|
sector = offset / CDSECTOR_SIZE + CdPosToInt(¤tfileinfo.pos);
|
||||||
|
|
||||||
// start reading sectors from CD
|
// start reading sectors from CD
|
||||||
while(remainingBytes > 0)
|
while(remainingBytes > 0)
|
||||||
@ -405,7 +406,7 @@ int LoadfileSeg(char* name, char* addr, int offset, int loadsize)
|
|||||||
|
|
||||||
// if we don't have offset or we have more than 2048 bytes
|
// if we don't have offset or we have more than 2048 bytes
|
||||||
// - we can read into buffer directly (which is faster)
|
// - we can read into buffer directly (which is faster)
|
||||||
if (remainingBytes >= 2048 && remainingOffset == 0)
|
if (remainingBytes >= CDSECTOR_SIZE && remainingOffset == 0)
|
||||||
sectorPtr = addr;
|
sectorPtr = addr;
|
||||||
else
|
else
|
||||||
sectorPtr = sectorbuffer;
|
sectorPtr = sectorbuffer;
|
||||||
@ -428,7 +429,7 @@ int LoadfileSeg(char* name, char* addr, int offset, int loadsize)
|
|||||||
|
|
||||||
// copy bytes
|
// copy bytes
|
||||||
while (remainingBytes > 0 &&
|
while (remainingBytes > 0 &&
|
||||||
readPtr - sectorbuffer < 2048) // don't leave boundary
|
readPtr - sectorbuffer < CDSECTOR_SIZE) // don't leave boundary
|
||||||
{
|
{
|
||||||
*addr++ = *readPtr++;
|
*addr++ = *readPtr++;
|
||||||
remainingBytes--;
|
remainingBytes--;
|
||||||
@ -438,8 +439,8 @@ int LoadfileSeg(char* name, char* addr, int offset, int loadsize)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
addr += 2048;
|
addr += CDSECTOR_SIZE;
|
||||||
remainingBytes -= 2048;
|
remainingBytes -= CDSECTOR_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// go to next sector
|
// go to next sector
|
||||||
@ -499,7 +500,7 @@ void sector_ready(u_char intr, u_char* result)
|
|||||||
// read sector data
|
// read sector data
|
||||||
CdGetSector(current_address, SECTOR_SIZE);
|
CdGetSector(current_address, SECTOR_SIZE);
|
||||||
|
|
||||||
current_address += 2048;
|
current_address += CDSECTOR_SIZE;
|
||||||
current_sector++;
|
current_sector++;
|
||||||
sectors_left--;
|
sectors_left--;
|
||||||
|
|
||||||
@ -528,6 +529,44 @@ void sector_ready(u_char intr, u_char* result)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if USE_PC_FILESYSTEM
|
||||||
|
|
||||||
|
// It has to be this way
|
||||||
|
int loadsectorsPC(char* addr, int sector, int nsectors)
|
||||||
|
{
|
||||||
|
char namebuffer[64];
|
||||||
|
strcpy(namebuffer, g_CurrentLevelFileName);
|
||||||
|
FS_FixPathSlashes(namebuffer);
|
||||||
|
|
||||||
|
FILE* fp = fopen(namebuffer, "rb");
|
||||||
|
|
||||||
|
if (fp)
|
||||||
|
{
|
||||||
|
// constrain nsectors to the maximum that can be read from the file
|
||||||
|
int maxSectors;
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
maxSectors = (ftell(fp) - (sector * CDSECTOR_SIZE)) / CDSECTOR_SIZE;
|
||||||
|
nsectors = MIN(nsectors, maxSectors);
|
||||||
|
|
||||||
|
fseek(fp, sector * CDSECTOR_SIZE, SEEK_SET);
|
||||||
|
fread(addr, CDSECTOR_SIZE, nsectors, fp);
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
ShowLoading();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef __EMSCRIPTEN__
|
||||||
|
char errPrint[512];
|
||||||
|
sprintf(errPrint, "loadsectorsPC: failed to open '%s'\n", namebuffer);
|
||||||
|
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "ERROR", errPrint, NULL);
|
||||||
|
#endif // !__EMSCRIPTEN__
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // USE_PC_FILESYSTEM
|
||||||
|
|
||||||
// [D] [T]
|
// [D] [T]
|
||||||
void loadsectors(char* addr, int sector, int nsectors)
|
void loadsectors(char* addr, int sector, int nsectors)
|
||||||
{
|
{
|
||||||
@ -537,6 +576,11 @@ void loadsectors(char* addr, int sector, int nsectors)
|
|||||||
if (nsectors == 0)
|
if (nsectors == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#if USE_PC_FILESYSTEM
|
||||||
|
if (loadsectorsPC(addr, sector, nsectors))
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
load_complete = 0;
|
load_complete = 0;
|
||||||
endread = 0;
|
endread = 0;
|
||||||
|
|
||||||
@ -561,39 +605,6 @@ void loadsectors(char* addr, int sector, int nsectors)
|
|||||||
ShowLoading();
|
ShowLoading();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_PC_FILESYSTEM
|
|
||||||
|
|
||||||
// It has to be this way
|
|
||||||
void loadsectorsPC(char* filename, char* addr, int sector, int nsectors)
|
|
||||||
{
|
|
||||||
char namebuffer[64];
|
|
||||||
strcpy(namebuffer, filename);
|
|
||||||
FS_FixPathSlashes(namebuffer);
|
|
||||||
|
|
||||||
FILE* fp = fopen(namebuffer, "rb");
|
|
||||||
|
|
||||||
if (fp)
|
|
||||||
{
|
|
||||||
fseek(fp, sector * CDSECTOR_SIZE, SEEK_SET);
|
|
||||||
fread(addr, CDSECTOR_SIZE, nsectors, fp);
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
ShowLoading();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#if USE_CD_FILESYSTEM
|
|
||||||
// try using CD
|
|
||||||
loadsectors(addr, sector, nsectors);
|
|
||||||
#elif !defined(__EMSCRIPTEN__)
|
|
||||||
char errPrint[512];
|
|
||||||
sprintf(errPrint, "loadsectorsPC: failed to open '%s'\n", namebuffer);
|
|
||||||
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "ERROR", errPrint, NULL);
|
|
||||||
#endif // USE_CD_FILESYSTEM
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // USE_PC_FILESYSTEM
|
|
||||||
|
|
||||||
// [D] [T]
|
// [D] [T]
|
||||||
void EnableDisplay(void)
|
void EnableDisplay(void)
|
||||||
{
|
{
|
||||||
@ -854,6 +865,11 @@ void ResetCityType(void)
|
|||||||
{
|
{
|
||||||
lasttype = (CITYTYPE)-1;
|
lasttype = (CITYTYPE)-1;
|
||||||
lastcity = -1;
|
lastcity = -1;
|
||||||
|
|
||||||
|
#ifndef PSX
|
||||||
|
free(g_CurrentLevelSpoolData);
|
||||||
|
g_CurrentLevelSpoolData = NULL;
|
||||||
|
#endif // PSX
|
||||||
}
|
}
|
||||||
|
|
||||||
// [A]
|
// [A]
|
||||||
@ -872,6 +888,8 @@ void SetCityType(CITYTYPE type)
|
|||||||
if (type == lasttype && GameLevel == lastcity)
|
if (type == lasttype && GameLevel == lastcity)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
ResetCityType();
|
||||||
|
|
||||||
lastcity = GameLevel;
|
lastcity = GameLevel;
|
||||||
lasttype = type;
|
lasttype = type;
|
||||||
|
|
||||||
@ -903,11 +921,11 @@ void SetCityType(CITYTYPE type)
|
|||||||
// store level name as it's required by loadsectorsPC
|
// store level name as it's required by loadsectorsPC
|
||||||
strcpy(g_CurrentLevelFileName, filename);
|
strcpy(g_CurrentLevelFileName, filename);
|
||||||
|
|
||||||
|
// spool position is forced to 0
|
||||||
citystart[GameLevel] = 0;
|
citystart[GameLevel] = 0;
|
||||||
|
|
||||||
// skip LUMP type (37) and size, it's already hardcoded
|
// skip LUMP type (37) and size, it's already hardcoded
|
||||||
fseek(levFp, 8, SEEK_CUR);
|
fseek(levFp, 8, SEEK_CUR);
|
||||||
|
|
||||||
fread(citylumps[GameLevel], 1, sizeof(citylumps[GameLevel]), levFp);
|
fread(citylumps[GameLevel], 1, sizeof(citylumps[GameLevel]), levFp);
|
||||||
|
|
||||||
fclose(levFp);
|
fclose(levFp);
|
||||||
@ -963,7 +981,7 @@ void SetCityType(CITYTYPE type)
|
|||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
citylumps[GameLevel][i].x = data[0] + sector * 2048;
|
citylumps[GameLevel][i].x = data[0] + sector * CDSECTOR_SIZE;
|
||||||
citylumps[GameLevel][i].y = data[1];
|
citylumps[GameLevel][i].y = data[1];
|
||||||
|
|
||||||
data += 2;
|
data += 2;
|
||||||
|
@ -136,11 +136,7 @@ extern int LoadfileSeg(char *name, char *addr, int offset, int loadsize); // 0x0
|
|||||||
|
|
||||||
extern void ReportMode(int on); // 0x0007F8B8
|
extern void ReportMode(int on); // 0x0007F8B8
|
||||||
|
|
||||||
#ifdef PSX
|
|
||||||
extern void loadsectors(char *addr, int sector, int nsectors); // 0x0007F904
|
extern void loadsectors(char *addr, int sector, int nsectors); // 0x0007F904
|
||||||
#else
|
|
||||||
extern void loadsectorsPC(char* filename, char *addr, int sector, int nsectors);
|
|
||||||
#endif // PSX
|
|
||||||
|
|
||||||
extern void EnableDisplay(); // 0x0007F984
|
extern void EnableDisplay(); // 0x0007F984
|
||||||
extern void DisableDisplay(); // 0x0007F9F0
|
extern void DisableDisplay(); // 0x0007F9F0
|
||||||
|
@ -484,11 +484,7 @@ void LoadPermanentTPages(int *sector)
|
|||||||
for (i = 0; i < nperms; i++)
|
for (i = 0; i < nperms; i++)
|
||||||
nsectors += (permlist[i].y + 2047) / CDSECTOR_SIZE;
|
nsectors += (permlist[i].y + 2047) / CDSECTOR_SIZE;
|
||||||
|
|
||||||
#ifdef PSX
|
|
||||||
loadsectors(tpagebuffer, *sector, nsectors);
|
loadsectors(tpagebuffer, *sector, nsectors);
|
||||||
#else
|
|
||||||
loadsectorsPC(g_CurrentLevelFileName, tpagebuffer, *sector, nsectors);
|
|
||||||
#endif // PSX
|
|
||||||
|
|
||||||
*sector += nsectors;
|
*sector += nsectors;
|
||||||
|
|
||||||
@ -532,12 +528,7 @@ void LoadPermanentTPages(int *sector)
|
|||||||
for (i = 0; i < nspecpages; i++)
|
for (i = 0; i < nspecpages; i++)
|
||||||
nsectors += (speclist[i].y + 2047) / CDSECTOR_SIZE;
|
nsectors += (speclist[i].y + 2047) / CDSECTOR_SIZE;
|
||||||
|
|
||||||
#ifdef PSX
|
|
||||||
loadsectors(tpagebuffer, *sector, nsectors);
|
loadsectors(tpagebuffer, *sector, nsectors);
|
||||||
#else
|
|
||||||
loadsectorsPC(g_CurrentLevelFileName, tpagebuffer, *sector, nsectors);
|
|
||||||
#endif // PSX
|
|
||||||
|
|
||||||
|
|
||||||
*sector += nsectors;
|
*sector += nsectors;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user