mirror of
https://git.rip/DMCA_FUCKER/re3.git
synced 2024-11-06 04:35:56 +00:00
Merge branch 'miami' into lcs
* miami: wtf fix small cleanup Fix gOneShotCol Fix garage messages position Fix font on green screen counter Add MPG123_QUIET to mp3 files Make opus available alongside other formats Fix pickup text Fix char in stats Add missing GXT line fail minor refactoring Fix 16KHz track GET_WHEELIE_STATS fix Cleanup and fixes for new decoders Fixes for CVbFile Small fixes for new wav decoder Remove fastmath from premake's config Implementing our own WAV decoder to replace SndFile
This commit is contained in:
commit
0e2af13656
Binary file not shown.
|
@ -125,11 +125,9 @@ workspace "reLCS"
|
|||
|
||||
filter { "platforms:*x86*" }
|
||||
architecture "x86"
|
||||
floatingpoint "Fast"
|
||||
|
||||
filter { "platforms:*amd64*" }
|
||||
architecture "amd64"
|
||||
floatingpoint "Fast"
|
||||
|
||||
filter { "platforms:*arm*" }
|
||||
architecture "ARM"
|
||||
|
@ -192,11 +190,9 @@ project "librw"
|
|||
|
||||
filter { "platforms:*x86*" }
|
||||
architecture "x86"
|
||||
floatingpoint "Fast"
|
||||
|
||||
filter { "platforms:*amd64*" }
|
||||
architecture "amd64"
|
||||
floatingpoint "Fast"
|
||||
|
||||
filter "platforms:win*"
|
||||
staticruntime "on"
|
||||
|
|
|
@ -219,7 +219,9 @@ static const int32 gOneShotCol[] = {SFX_COL_TARMAC_1,
|
|||
SFX_TYRE_BUMP,
|
||||
SFX_COL_CARDBOARD_1,
|
||||
SFX_COL_TARMAC_1,
|
||||
SFX_COL_GATE};
|
||||
SFX_COL_GATE,
|
||||
SFX_COL_SAND_1,
|
||||
SFX_COL_TARMAC_1 };
|
||||
|
||||
void
|
||||
cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
|
||||
|
|
|
@ -4,16 +4,23 @@
|
|||
#include "stream.h"
|
||||
#include "sampman.h"
|
||||
|
||||
#ifdef AUDIO_OPUS
|
||||
#include <opusfile.h>
|
||||
#else
|
||||
#ifdef _WIN32
|
||||
#ifdef AUDIO_OAL_USE_SNDFILE
|
||||
#pragma comment( lib, "libsndfile-1.lib" )
|
||||
#endif
|
||||
#ifdef AUDIO_OAL_USE_MPG123
|
||||
#pragma comment( lib, "libmpg123-0.lib" )
|
||||
#endif
|
||||
#endif
|
||||
#ifdef AUDIO_OAL_USE_SNDFILE
|
||||
#include <sndfile.h>
|
||||
#endif
|
||||
#ifdef AUDIO_OAL_USE_MPG123
|
||||
#include <mpg123.h>
|
||||
#endif
|
||||
#ifdef AUDIO_OAL_USE_OPUS
|
||||
#include <opusfile.h>
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32
|
||||
#include "crossplatform.h"
|
||||
|
@ -77,7 +84,315 @@ public:
|
|||
|
||||
CSortStereoBuffer SortStereoBuffer;
|
||||
|
||||
#ifndef AUDIO_OPUS
|
||||
class CImaADPCMDecoder
|
||||
{
|
||||
const uint16 StepTable[89] = {
|
||||
7, 8, 9, 10, 11, 12, 13, 14,
|
||||
16, 17, 19, 21, 23, 25, 28, 31,
|
||||
34, 37, 41, 45, 50, 55, 60, 66,
|
||||
73, 80, 88, 97, 107, 118, 130, 143,
|
||||
157, 173, 190, 209, 230, 253, 279, 307,
|
||||
337, 371, 408, 449, 494, 544, 598, 658,
|
||||
724, 796, 876, 963, 1060, 1166, 1282, 1411,
|
||||
1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024,
|
||||
3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484,
|
||||
7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
|
||||
15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794,
|
||||
32767
|
||||
};
|
||||
|
||||
int16 Sample, StepIndex;
|
||||
|
||||
public:
|
||||
CImaADPCMDecoder()
|
||||
{
|
||||
Init(0, 0);
|
||||
}
|
||||
|
||||
void Init(int16 _Sample, int16 _StepIndex)
|
||||
{
|
||||
Sample = _Sample;
|
||||
StepIndex = _StepIndex;
|
||||
}
|
||||
|
||||
void Decode(uint8 *inbuf, int16 *_outbuf, size_t size)
|
||||
{
|
||||
int16* outbuf = _outbuf;
|
||||
for (size_t i = 0; i < size; i++)
|
||||
{
|
||||
*(outbuf++) = DecodeSample(inbuf[i] & 0xF);
|
||||
*(outbuf++) = DecodeSample(inbuf[i] >> 4);
|
||||
}
|
||||
}
|
||||
|
||||
int16 DecodeSample(uint8 adpcm)
|
||||
{
|
||||
uint16 step = StepTable[StepIndex];
|
||||
|
||||
if (adpcm & 4)
|
||||
StepIndex += ((adpcm & 3) + 1) * 2;
|
||||
else
|
||||
StepIndex--;
|
||||
|
||||
StepIndex = clamp(StepIndex, 0, 88);
|
||||
|
||||
int delta = step >> 3;
|
||||
if (adpcm & 1) delta += step >> 2;
|
||||
if (adpcm & 2) delta += step >> 1;
|
||||
if (adpcm & 4) delta += step;
|
||||
if (adpcm & 8) delta = -delta;
|
||||
|
||||
int newSample = Sample + delta;
|
||||
Sample = clamp(newSample, -32768, 32767);
|
||||
return Sample;
|
||||
}
|
||||
};
|
||||
|
||||
class CWavFile : public IDecoder
|
||||
{
|
||||
enum
|
||||
{
|
||||
WAVEFMT_PCM = 1,
|
||||
WAVEFMT_IMA_ADPCM = 0x11,
|
||||
WAVEFMT_XBOX_ADPCM = 0x69,
|
||||
};
|
||||
|
||||
struct tDataHeader
|
||||
{
|
||||
uint32 ID;
|
||||
uint32 Size;
|
||||
};
|
||||
|
||||
struct tFormatHeader
|
||||
{
|
||||
uint16 AudioFormat;
|
||||
uint16 NumChannels;
|
||||
uint32 SampleRate;
|
||||
uint32 ByteRate;
|
||||
uint16 BlockAlign;
|
||||
uint16 BitsPerSample;
|
||||
uint16 extra[2]; // adpcm only
|
||||
|
||||
tFormatHeader() { memset(this, 0, sizeof(*this)); }
|
||||
};
|
||||
|
||||
FILE *m_pFile;
|
||||
bool m_bIsOpen;
|
||||
|
||||
tFormatHeader m_FormatHeader;
|
||||
|
||||
uint32 m_DataStartOffset; // TODO: 64 bit?
|
||||
uint32 m_nSampleCount;
|
||||
uint32 m_nSamplesPerBlock;
|
||||
|
||||
// ADPCM things
|
||||
uint8 *m_pAdpcmBuffer;
|
||||
int16 **m_ppPcmBuffers;
|
||||
CImaADPCMDecoder *m_pAdpcmDecoders;
|
||||
|
||||
void Close()
|
||||
{
|
||||
if (m_pFile) {
|
||||
fclose(m_pFile);
|
||||
m_pFile = nil;
|
||||
}
|
||||
delete[] m_pAdpcmBuffer;
|
||||
delete[] m_ppPcmBuffers;
|
||||
delete[] m_pAdpcmDecoders;
|
||||
}
|
||||
|
||||
uint32 GetCurrentSample() const
|
||||
{
|
||||
// TODO: 64 bit?
|
||||
uint32 FilePos = ftell(m_pFile);
|
||||
if (FilePos <= m_DataStartOffset)
|
||||
return 0;
|
||||
return (FilePos - m_DataStartOffset) / m_FormatHeader.BlockAlign * m_nSamplesPerBlock;
|
||||
}
|
||||
|
||||
public:
|
||||
CWavFile(const char* path) : m_bIsOpen(false), m_DataStartOffset(0), m_nSampleCount(0), m_nSamplesPerBlock(0), m_pAdpcmBuffer(nil), m_ppPcmBuffers(nil), m_pAdpcmDecoders(nil)
|
||||
{
|
||||
m_pFile = fopen(path, "rb");
|
||||
if (!m_pFile) return;
|
||||
|
||||
#define CLOSE_ON_ERROR(op)\
|
||||
if (op) { \
|
||||
Close(); \
|
||||
return; \
|
||||
}
|
||||
|
||||
tDataHeader DataHeader;
|
||||
|
||||
CLOSE_ON_ERROR(fread(&DataHeader, sizeof(DataHeader), 1, m_pFile) == 0);
|
||||
CLOSE_ON_ERROR(DataHeader.ID != 'FFIR');
|
||||
|
||||
// TODO? validate filesizes
|
||||
|
||||
int WAVE;
|
||||
CLOSE_ON_ERROR(fread(&WAVE, 4, 1, m_pFile) == 0);
|
||||
CLOSE_ON_ERROR(WAVE != 'EVAW')
|
||||
CLOSE_ON_ERROR(fread(&DataHeader, sizeof(DataHeader), 1, m_pFile) == 0);
|
||||
CLOSE_ON_ERROR(DataHeader.ID != ' tmf');
|
||||
|
||||
CLOSE_ON_ERROR(fread(&m_FormatHeader, Min(DataHeader.Size, sizeof(tFormatHeader)), 1, m_pFile) == 0);
|
||||
CLOSE_ON_ERROR(DataHeader.Size > sizeof(tFormatHeader));
|
||||
|
||||
switch (m_FormatHeader.AudioFormat)
|
||||
{
|
||||
case WAVEFMT_XBOX_ADPCM:
|
||||
m_FormatHeader.AudioFormat = WAVEFMT_IMA_ADPCM;
|
||||
case WAVEFMT_IMA_ADPCM:
|
||||
m_nSamplesPerBlock = (m_FormatHeader.BlockAlign / m_FormatHeader.NumChannels - 4) * 2 + 1;
|
||||
m_pAdpcmBuffer = new uint8[m_FormatHeader.BlockAlign];
|
||||
m_ppPcmBuffers = new int16*[m_FormatHeader.NumChannels];
|
||||
m_pAdpcmDecoders = new CImaADPCMDecoder[m_FormatHeader.NumChannels];
|
||||
break;
|
||||
case WAVEFMT_PCM:
|
||||
m_nSamplesPerBlock = 1;
|
||||
if (m_FormatHeader.BitsPerSample != 16)
|
||||
{
|
||||
debug("Unsupported PCM (%d bits), only signed 16-bit is supported (%s)\n", m_FormatHeader.BitsPerSample, path);
|
||||
Close();
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
debug("Unsupported wav format 0x%x (%s)\n", m_FormatHeader.AudioFormat, path);
|
||||
Close();
|
||||
return;
|
||||
}
|
||||
|
||||
while (true) {
|
||||
CLOSE_ON_ERROR(fread(&DataHeader, sizeof(DataHeader), 1, m_pFile) == 0);
|
||||
if (DataHeader.ID == 'atad')
|
||||
break;
|
||||
fseek(m_pFile, DataHeader.Size, SEEK_CUR);
|
||||
// TODO? validate data size
|
||||
// maybe check if there no extreme custom headers that might break this
|
||||
}
|
||||
|
||||
m_DataStartOffset = ftell(m_pFile);
|
||||
m_nSampleCount = DataHeader.Size / m_FormatHeader.BlockAlign * m_nSamplesPerBlock;
|
||||
|
||||
m_bIsOpen = true;
|
||||
#undef CLOSE_ON_ERROR
|
||||
}
|
||||
|
||||
~CWavFile()
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
bool IsOpened()
|
||||
{
|
||||
return m_bIsOpen;
|
||||
}
|
||||
|
||||
uint32 GetSampleSize()
|
||||
{
|
||||
return sizeof(uint16);
|
||||
}
|
||||
|
||||
uint32 GetSampleCount()
|
||||
{
|
||||
return m_nSampleCount;
|
||||
}
|
||||
|
||||
uint32 GetSampleRate()
|
||||
{
|
||||
return m_FormatHeader.SampleRate;
|
||||
}
|
||||
|
||||
uint32 GetChannels()
|
||||
{
|
||||
return m_FormatHeader.NumChannels;
|
||||
}
|
||||
|
||||
void Seek(uint32 milliseconds)
|
||||
{
|
||||
if (!IsOpened()) return;
|
||||
fseek(m_pFile, m_DataStartOffset + ms2samples(milliseconds) / m_nSamplesPerBlock * m_FormatHeader.BlockAlign, SEEK_SET);
|
||||
}
|
||||
|
||||
uint32 Tell()
|
||||
{
|
||||
if (!IsOpened()) return 0;
|
||||
return samples2ms(GetCurrentSample());
|
||||
}
|
||||
|
||||
#define SAMPLES_IN_LINE (8)
|
||||
|
||||
uint32 Decode(void* buffer)
|
||||
{
|
||||
if (!IsOpened()) return 0;
|
||||
|
||||
if (m_FormatHeader.AudioFormat == WAVEFMT_PCM)
|
||||
{
|
||||
// just read the file and sort the samples
|
||||
uint32 size = fread(buffer, 1, GetBufferSize(), m_pFile);
|
||||
if (m_FormatHeader.NumChannels == 2)
|
||||
SortStereoBuffer.SortStereo(buffer, size);
|
||||
return size;
|
||||
}
|
||||
else if (m_FormatHeader.AudioFormat == WAVEFMT_IMA_ADPCM)
|
||||
{
|
||||
// trim the buffer size if we're at the end of our file
|
||||
uint32 nMaxSamples = GetBufferSamples() / m_FormatHeader.NumChannels;
|
||||
uint32 nSamplesLeft = m_nSampleCount - GetCurrentSample();
|
||||
nMaxSamples = Min(nMaxSamples, nSamplesLeft);
|
||||
|
||||
// align sample count to our block
|
||||
nMaxSamples = nMaxSamples / m_nSamplesPerBlock * m_nSamplesPerBlock;
|
||||
|
||||
// count the size of output buffer
|
||||
uint32 OutBufSizePerChannel = nMaxSamples * GetSampleSize();
|
||||
uint32 OutBufSize = OutBufSizePerChannel * m_FormatHeader.NumChannels;
|
||||
|
||||
// calculate the pointers to individual channel buffers
|
||||
for (uint32 i = 0; i < m_FormatHeader.NumChannels; i++)
|
||||
m_ppPcmBuffers[i] = (int16*)((int8*)buffer + OutBufSizePerChannel * i);
|
||||
|
||||
uint32 samplesRead = 0;
|
||||
while (samplesRead < nMaxSamples)
|
||||
{
|
||||
// read the file
|
||||
uint8 *pAdpcmBuf = m_pAdpcmBuffer;
|
||||
if (fread(m_pAdpcmBuffer, 1, m_FormatHeader.BlockAlign, m_pFile) == 0)
|
||||
return 0;
|
||||
|
||||
// get the first sample in adpcm block and initialise the decoder(s)
|
||||
for (uint32 i = 0; i < m_FormatHeader.NumChannels; i++)
|
||||
{
|
||||
int16 Sample = *(int16*)pAdpcmBuf;
|
||||
pAdpcmBuf += sizeof(int16);
|
||||
int16 Step = *(int16*)pAdpcmBuf;
|
||||
pAdpcmBuf += sizeof(int16);
|
||||
m_pAdpcmDecoders[i].Init(Sample, Step);
|
||||
*(m_ppPcmBuffers[i]) = Sample;
|
||||
m_ppPcmBuffers[i]++;
|
||||
}
|
||||
samplesRead++;
|
||||
|
||||
// decode the rest of the block
|
||||
for (uint32 s = 1; s < m_nSamplesPerBlock; s += SAMPLES_IN_LINE)
|
||||
{
|
||||
for (uint32 i = 0; i < m_FormatHeader.NumChannels; i++)
|
||||
{
|
||||
m_pAdpcmDecoders[i].Decode(pAdpcmBuf, m_ppPcmBuffers[i], SAMPLES_IN_LINE / 2);
|
||||
pAdpcmBuf += SAMPLES_IN_LINE / 2;
|
||||
m_ppPcmBuffers[i] += SAMPLES_IN_LINE;
|
||||
}
|
||||
samplesRead += SAMPLES_IN_LINE;
|
||||
}
|
||||
}
|
||||
return OutBufSize;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef AUDIO_OAL_USE_SNDFILE
|
||||
class CSndFile : public IDecoder
|
||||
{
|
||||
SNDFILE *m_pfSound;
|
||||
|
@ -146,12 +461,11 @@ public:
|
|||
return size;
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifdef AUDIO_OAL_USE_MPG123
|
||||
// fuzzy seek eliminates stutter when playing ADF but spams errors a lot (nothing breaks though)
|
||||
#define MP3_USE_FUZZY_SEEK
|
||||
#endif // _WIN32
|
||||
|
||||
|
||||
class CMP3File : public IDecoder
|
||||
{
|
||||
|
@ -177,7 +491,7 @@ public:
|
|||
if ( m_pMH )
|
||||
{
|
||||
#ifdef MP3_USE_FUZZY_SEEK
|
||||
mpg123_param(m_pMH, MPG123_FLAGS, MPG123_FUZZY | MPG123_SEEKBUFFER | MPG123_GAPLESS, 0.0);
|
||||
mpg123_param(m_pMH, MPG123_FLAGS, MPG123_FUZZY | MPG123_SEEKBUFFER | MPG123_GAPLESS | MPG123_QUIET, 0.0);
|
||||
#endif
|
||||
long rate = 0;
|
||||
int channels = 0;
|
||||
|
@ -260,6 +574,55 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
class CADFFile : public CMP3File
|
||||
{
|
||||
static ssize_t r_read(void* fh, void* buf, size_t size)
|
||||
{
|
||||
size_t bytesRead = fread(buf, 1, size, (FILE*)fh);
|
||||
uint8* _buf = (uint8*)buf;
|
||||
for (size_t i = 0; i < size; i++)
|
||||
_buf[i] ^= 0x22;
|
||||
return bytesRead;
|
||||
}
|
||||
static off_t r_seek(void* fh, off_t pos, int seekType)
|
||||
{
|
||||
fseek((FILE*)fh, pos, seekType);
|
||||
return ftell((FILE*)fh);
|
||||
}
|
||||
static void r_close(void* fh)
|
||||
{
|
||||
fclose((FILE*)fh);
|
||||
}
|
||||
public:
|
||||
CADFFile(const char* path)
|
||||
{
|
||||
m_pMH = mpg123_new(nil, nil);
|
||||
if (m_pMH)
|
||||
{
|
||||
#ifdef MP3_USE_FUZZY_SEEK
|
||||
mpg123_param(m_pMH, MPG123_FLAGS, MPG123_FUZZY | MPG123_SEEKBUFFER | MPG123_GAPLESS | MPG123_QUIET, 0.0);
|
||||
#endif
|
||||
long rate = 0;
|
||||
int channels = 0;
|
||||
int encoding = 0;
|
||||
|
||||
FILE* f = fopen(path, "rb");
|
||||
|
||||
m_bOpened = mpg123_replace_reader_handle(m_pMH, r_read, r_seek, r_close) == MPG123_OK
|
||||
&& mpg123_open_handle(m_pMH, f) == MPG123_OK && mpg123_getformat(m_pMH, &rate, &channels, &encoding) == MPG123_OK;
|
||||
m_nRate = rate;
|
||||
m_nChannels = channels;
|
||||
|
||||
if (IsOpened())
|
||||
{
|
||||
mpg123_format_none(m_pMH);
|
||||
mpg123_format(m_pMH, rate, channels, encoding);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
#define VAG_LINE_SIZE (0x10)
|
||||
#define VAG_SAMPLES_IN_LINE (28)
|
||||
|
||||
|
@ -287,7 +650,7 @@ public:
|
|||
static short quantize(double sample)
|
||||
{
|
||||
int a = int(sample + 0.5);
|
||||
return short(clamp(int(sample + 0.5), -32768, 32767));
|
||||
return short(clamp(a, -32768, 32767));
|
||||
}
|
||||
|
||||
void Decode(void* _inbuf, int16* _outbuf, size_t size)
|
||||
|
@ -331,64 +694,68 @@ public:
|
|||
|
||||
class CVbFile : public IDecoder
|
||||
{
|
||||
FILE* pFile;
|
||||
size_t m_FileSize;
|
||||
size_t m_nNumberOfBlocks;
|
||||
CVagDecoder* decoders;
|
||||
FILE *m_pFile;
|
||||
CVagDecoder *m_pVagDecoders;
|
||||
|
||||
uint32 m_nSampleRate;
|
||||
uint8 m_nChannels;
|
||||
bool m_bBlockRead;
|
||||
uint16 m_LineInBlock;
|
||||
size_t m_CurrentBlock;
|
||||
size_t m_FileSize;
|
||||
size_t m_nNumberOfBlocks;
|
||||
|
||||
uint8** ppTempBuffers;
|
||||
uint32 m_nSampleRate;
|
||||
uint8 m_nChannels;
|
||||
bool m_bBlockRead;
|
||||
uint16 m_LineInBlock;
|
||||
size_t m_CurrentBlock;
|
||||
|
||||
uint8 **m_ppVagBuffers; // buffers that cache actual ADPCM file data
|
||||
int16 **m_ppPcmBuffers;
|
||||
|
||||
void ReadBlock(int32 block = -1)
|
||||
{
|
||||
// just read next block if -1
|
||||
if (block != -1)
|
||||
fseek(pFile, block * m_nChannels * VB_BLOCK_SIZE, SEEK_SET);
|
||||
fseek(m_pFile, block * m_nChannels * VB_BLOCK_SIZE, SEEK_SET);
|
||||
|
||||
for (int i = 0; i < m_nChannels; i++)
|
||||
fread(ppTempBuffers[i], VB_BLOCK_SIZE, 1, pFile);
|
||||
fread(m_ppVagBuffers[i], VB_BLOCK_SIZE, 1, m_pFile);
|
||||
m_bBlockRead = true;
|
||||
}
|
||||
|
||||
public:
|
||||
CVbFile(const char* path, uint32 nSampleRate = 32000, uint8 nChannels = 2) : m_nSampleRate(nSampleRate), m_nChannels(nChannels)
|
||||
CVbFile(const char* path, uint32 nSampleRate = 32000, uint8 nChannels = 2) : m_nSampleRate(nSampleRate), m_nChannels(nChannels), m_pVagDecoders(nil), m_ppVagBuffers(nil), m_ppPcmBuffers(nil),
|
||||
m_FileSize(0), m_nNumberOfBlocks(0), m_bBlockRead(false), m_LineInBlock(0), m_CurrentBlock(0)
|
||||
{
|
||||
pFile = fopen(path, "rb");
|
||||
if (pFile) {
|
||||
fseek(pFile, 0, SEEK_END);
|
||||
m_FileSize = ftell(pFile);
|
||||
fseek(pFile, 0, SEEK_SET);
|
||||
m_nNumberOfBlocks = m_FileSize / (nChannels * VB_BLOCK_SIZE);
|
||||
decoders = new CVagDecoder[nChannels];
|
||||
m_CurrentBlock = 0;
|
||||
m_LineInBlock = 0;
|
||||
m_bBlockRead = false;
|
||||
ppTempBuffers = new uint8 * [nChannels];
|
||||
for (uint8 i = 0; i < nChannels; i++)
|
||||
ppTempBuffers[i] = new uint8[VB_BLOCK_SIZE];
|
||||
}
|
||||
m_pFile = fopen(path, "rb");
|
||||
if (!m_pFile) return;
|
||||
|
||||
fseek(m_pFile, 0, SEEK_END);
|
||||
m_FileSize = ftell(m_pFile);
|
||||
fseek(m_pFile, 0, SEEK_SET);
|
||||
|
||||
m_nNumberOfBlocks = m_FileSize / (nChannels * VB_BLOCK_SIZE);
|
||||
m_pVagDecoders = new CVagDecoder[nChannels];
|
||||
m_ppVagBuffers = new uint8*[nChannels];
|
||||
m_ppPcmBuffers = new int16*[nChannels];
|
||||
for (uint8 i = 0; i < nChannels; i++)
|
||||
m_ppVagBuffers[i] = new uint8[VB_BLOCK_SIZE];
|
||||
}
|
||||
|
||||
~CVbFile()
|
||||
{
|
||||
if (pFile)
|
||||
if (m_pFile)
|
||||
{
|
||||
fclose(pFile);
|
||||
delete decoders;
|
||||
fclose(m_pFile);
|
||||
|
||||
delete[] m_pVagDecoders;
|
||||
for (int i = 0; i < m_nChannels; i++)
|
||||
delete ppTempBuffers[i];
|
||||
delete ppTempBuffers;
|
||||
delete[] m_ppVagBuffers[i];
|
||||
delete[] m_ppVagBuffers;
|
||||
delete[] m_ppPcmBuffers;
|
||||
}
|
||||
}
|
||||
|
||||
bool IsOpened()
|
||||
{
|
||||
return pFile != nil;
|
||||
return m_pFile != nil;
|
||||
}
|
||||
|
||||
uint32 GetSampleSize()
|
||||
|
@ -416,15 +783,18 @@ public:
|
|||
{
|
||||
if (!IsOpened()) return;
|
||||
uint32 samples = ms2samples(milliseconds);
|
||||
int32 block = samples / NUM_VAG_SAMPLES_IN_BLOCK;
|
||||
|
||||
// find the block of our sample
|
||||
uint32 block = samples / NUM_VAG_SAMPLES_IN_BLOCK;
|
||||
if (block > m_nNumberOfBlocks)
|
||||
{
|
||||
samples = 0;
|
||||
block = 0;
|
||||
}
|
||||
if (block != m_CurrentBlock)
|
||||
ReadBlock(block);
|
||||
m_bBlockRead = false;
|
||||
|
||||
// find a line of our sample within our block
|
||||
uint32 remainingSamples = samples - block * NUM_VAG_SAMPLES_IN_BLOCK;
|
||||
uint32 newLine = remainingSamples / VAG_SAMPLES_IN_LINE / VAG_LINE_SIZE;
|
||||
|
||||
|
@ -432,8 +802,8 @@ public:
|
|||
{
|
||||
m_CurrentBlock = block;
|
||||
m_LineInBlock = newLine;
|
||||
for (int i = 0; i < GetChannels(); i++)
|
||||
decoders[i].ResetState();
|
||||
for (uint32 i = 0; i < GetChannels(); i++)
|
||||
m_pVagDecoders[i].ResetState();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -449,44 +819,48 @@ public:
|
|||
{
|
||||
if (!IsOpened()) return 0;
|
||||
|
||||
if (m_CurrentBlock >= m_nNumberOfBlocks) return 0;
|
||||
|
||||
// cache current ADPCM block
|
||||
if (!m_bBlockRead)
|
||||
ReadBlock(m_CurrentBlock);
|
||||
|
||||
if (m_CurrentBlock == m_nNumberOfBlocks) return 0;
|
||||
int size = 0;
|
||||
|
||||
int numberOfRequiredLines = GetBufferSamples() / GetChannels() / VAG_SAMPLES_IN_LINE;
|
||||
// trim the buffer size if we're at the end of our file
|
||||
int numberOfRequiredLines = GetBufferSamples() / m_nChannels / VAG_SAMPLES_IN_LINE;
|
||||
int numberOfRemainingLines = (m_nNumberOfBlocks - m_CurrentBlock) * NUM_VAG_LINES_IN_BLOCK - m_LineInBlock;
|
||||
int bufSizePerChannel = Min(numberOfRequiredLines, numberOfRemainingLines) * VAG_SAMPLES_IN_LINE * GetSampleSize();
|
||||
|
||||
if (numberOfRequiredLines > numberOfRemainingLines)
|
||||
numberOfRemainingLines = numberOfRemainingLines;
|
||||
|
||||
int16* buffers[2] = { (int16*)buffer, &((int16*)buffer)[bufSizePerChannel / GetSampleSize()] };
|
||||
// calculate the pointers to individual channel buffers
|
||||
for (uint32 i = 0; i < m_nChannels; i++)
|
||||
m_ppPcmBuffers[i] = (int16*)((int8*)buffer + bufSizePerChannel * i);
|
||||
|
||||
int size = 0;
|
||||
while (size < bufSizePerChannel)
|
||||
{
|
||||
for (int i = 0; i < GetChannels(); i++)
|
||||
// decode the VAG lines
|
||||
for (uint32 i = 0; i < m_nChannels; i++)
|
||||
{
|
||||
decoders[i].Decode(ppTempBuffers[i] + m_LineInBlock * VAG_LINE_SIZE, buffers[i], VAG_LINE_SIZE);
|
||||
buffers[i] += VAG_SAMPLES_IN_LINE;
|
||||
m_pVagDecoders[i].Decode(m_ppVagBuffers[i] + m_LineInBlock * VAG_LINE_SIZE, m_ppPcmBuffers[i], VAG_LINE_SIZE);
|
||||
m_ppPcmBuffers[i] += VAG_SAMPLES_IN_LINE;
|
||||
}
|
||||
size += VAG_SAMPLES_IN_LINE * GetSampleSize();
|
||||
m_LineInBlock++;
|
||||
|
||||
// block is over, read the next block
|
||||
if (m_LineInBlock >= NUM_VAG_LINES_IN_BLOCK)
|
||||
{
|
||||
m_CurrentBlock++;
|
||||
if (m_CurrentBlock >= m_nNumberOfBlocks)
|
||||
if (m_CurrentBlock >= m_nNumberOfBlocks) // end of file
|
||||
break;
|
||||
m_LineInBlock = 0;
|
||||
ReadBlock();
|
||||
}
|
||||
}
|
||||
|
||||
return bufSizePerChannel * GetChannels();
|
||||
return bufSizePerChannel * m_nChannels;
|
||||
}
|
||||
};
|
||||
#else
|
||||
#ifdef AUDIO_OAL_USE_OPUS
|
||||
class COpusFile : public IDecoder
|
||||
{
|
||||
OggOpusFile *m_FileH;
|
||||
|
@ -582,64 +956,16 @@ public:
|
|||
};
|
||||
#endif
|
||||
|
||||
class CADFFile : public CMP3File
|
||||
{
|
||||
static ssize_t r_read(void* fh, void* buf, size_t size)
|
||||
{
|
||||
size_t bytesRead = fread(buf, 1, size, (FILE*)fh);
|
||||
uint8* _buf = (uint8*)buf;
|
||||
for (size_t i = 0; i < size; i++)
|
||||
_buf[i] ^= 0x22;
|
||||
return bytesRead;
|
||||
}
|
||||
static off_t r_seek(void* fh, off_t pos, int seekType)
|
||||
{
|
||||
fseek((FILE*)fh, pos, seekType);
|
||||
return ftell((FILE*)fh);
|
||||
}
|
||||
static void r_close(void* fh)
|
||||
{
|
||||
fclose((FILE*)fh);
|
||||
}
|
||||
public:
|
||||
CADFFile(const char* path)
|
||||
{
|
||||
m_pMH = mpg123_new(nil, nil);
|
||||
if (m_pMH)
|
||||
{
|
||||
#ifdef MP3_USE_FUZZY_SEEK
|
||||
mpg123_param(m_pMH, MPG123_FLAGS, MPG123_FUZZY | MPG123_SEEKBUFFER | MPG123_GAPLESS, 0.0);
|
||||
#endif
|
||||
long rate = 0;
|
||||
int channels = 0;
|
||||
int encoding = 0;
|
||||
|
||||
FILE* f = fopen(path, "rb");
|
||||
|
||||
m_bOpened = mpg123_replace_reader_handle(m_pMH, r_read, r_seek, r_close) == MPG123_OK
|
||||
&& mpg123_open_handle(m_pMH, f) == MPG123_OK && mpg123_getformat(m_pMH, &rate, &channels, &encoding) == MPG123_OK;
|
||||
m_nRate = rate;
|
||||
m_nChannels = channels;
|
||||
|
||||
if (IsOpened())
|
||||
{
|
||||
mpg123_format_none(m_pMH);
|
||||
mpg123_format(m_pMH, rate, channels, encoding);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void CStream::Initialise()
|
||||
{
|
||||
#ifndef AUDIO_OPUS
|
||||
#ifdef AUDIO_OAL_USE_MPG123
|
||||
mpg123_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
void CStream::Terminate()
|
||||
{
|
||||
#ifndef AUDIO_OPUS
|
||||
#ifdef AUDIO_OAL_USE_MPG123
|
||||
mpg123_exit();
|
||||
#endif
|
||||
}
|
||||
|
@ -672,17 +998,22 @@ CStream::CStream(char *filename, ALuint *sources, ALuint (&buffers)[NUM_STREAMBU
|
|||
|
||||
DEV("Stream %s\n", m_aFilename);
|
||||
|
||||
#ifndef AUDIO_OPUS
|
||||
if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".mp3")], ".mp3"))
|
||||
m_pSoundFile = new CMP3File(m_aFilename);
|
||||
else if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".wav")], ".wav"))
|
||||
if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".wav")], ".wav"))
|
||||
#ifdef AUDIO_OAL_USE_SNDFILE
|
||||
m_pSoundFile = new CSndFile(m_aFilename);
|
||||
#else
|
||||
m_pSoundFile = new CWavFile(m_aFilename);
|
||||
#endif
|
||||
#ifdef AUDIO_OAL_USE_MPG123
|
||||
else if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".mp3")], ".mp3"))
|
||||
m_pSoundFile = new CMP3File(m_aFilename);
|
||||
else if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".adf")], ".adf"))
|
||||
m_pSoundFile = new CADFFile(m_aFilename);
|
||||
#endif
|
||||
else if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".vb")], ".VB"))
|
||||
m_pSoundFile = new CVbFile(m_aFilename, overrideSampleRate);
|
||||
#else
|
||||
if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".opus")], ".opus"))
|
||||
#ifdef AUDIO_OAL_USE_OPUS
|
||||
else if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".opus")], ".opus"))
|
||||
m_pSoundFile = new COpusFile(m_aFilename);
|
||||
#endif
|
||||
else
|
||||
|
@ -979,12 +1310,15 @@ void CStream::Update()
|
|||
|
||||
// Relying a lot on left buffer states in here
|
||||
|
||||
//alSourcef(m_pAlSources[0], AL_ROLLOFF_FACTOR, 0.0f);
|
||||
alGetSourcei(m_pAlSources[0], AL_SOURCE_STATE, &sourceState[0]);
|
||||
alGetSourcei(m_pAlSources[0], AL_BUFFERS_PROCESSED, &buffersProcessed[0]);
|
||||
//alSourcef(m_pAlSources[1], AL_ROLLOFF_FACTOR, 0.0f);
|
||||
alGetSourcei(m_pAlSources[1], AL_SOURCE_STATE, &sourceState[1]);
|
||||
alGetSourcei(m_pAlSources[1], AL_BUFFERS_PROCESSED, &buffersProcessed[1]);
|
||||
do
|
||||
{
|
||||
//alSourcef(m_pAlSources[0], AL_ROLLOFF_FACTOR, 0.0f);
|
||||
alGetSourcei(m_pAlSources[0], AL_SOURCE_STATE, &sourceState[0]);
|
||||
alGetSourcei(m_pAlSources[0], AL_BUFFERS_PROCESSED, &buffersProcessed[0]);
|
||||
//alSourcef(m_pAlSources[1], AL_ROLLOFF_FACTOR, 0.0f);
|
||||
alGetSourcei(m_pAlSources[1], AL_SOURCE_STATE, &sourceState[1]);
|
||||
alGetSourcei(m_pAlSources[1], AL_BUFFERS_PROCESSED, &buffersProcessed[1]);
|
||||
} while (buffersProcessed[0] != buffersProcessed[1]);
|
||||
|
||||
ALint looping = AL_FALSE;
|
||||
alGetSourcei(m_pAlSources[0], AL_LOOPING, &looping);
|
||||
|
|
|
@ -240,7 +240,7 @@ public:
|
|||
extern cSampleManager SampleManager;
|
||||
extern uint32 BankStartOffset[MAX_SFX_BANKS];
|
||||
|
||||
#ifdef AUDIO_OPUS
|
||||
#if defined(OPUS_AUDIO_PATHS)
|
||||
static char StreamedNameTable[][25] = {
|
||||
"AUDIO\\HEAD.OPUS", "AUDIO\\CLASS.OPUS", "AUDIO\\KJAH.OPUS", "AUDIO\\RISE.OPUS", "AUDIO\\LIPS.OPUS", "AUDIO\\GAME.OPUS",
|
||||
"AUDIO\\MSX.OPUS", "AUDIO\\FLASH.OPUS", "AUDIO\\CHAT.OPUS", "AUDIO\\HEAD.OPUS", "AUDIO\\POLICE.OPUS", "AUDIO\\CITY.OPUS",
|
||||
|
@ -275,8 +275,7 @@ static char StreamedNameTable[][25] = {
|
|||
"AUDIO\\h5_b.OPUS", "AUDIO\\h5_c.OPUS", "AUDIO\\ammu_a.OPUS", "AUDIO\\ammu_b.OPUS", "AUDIO\\ammu_c.OPUS", "AUDIO\\door_1.OPUS",
|
||||
"AUDIO\\door_2.OPUS", "AUDIO\\door_3.OPUS", "AUDIO\\door_4.OPUS", "AUDIO\\door_5.OPUS", "AUDIO\\door_6.OPUS", "AUDIO\\t3_a.OPUS",
|
||||
"AUDIO\\t3_b.OPUS", "AUDIO\\t3_c.OPUS", "AUDIO\\k1_b.OPUS", "AUDIO\\cat1.OPUS"};
|
||||
#else
|
||||
#ifdef PS2_AUDIO
|
||||
#elif defined(PS2_AUDIO_PATHS)
|
||||
static char StreamedNameTable[][40] =
|
||||
{
|
||||
"AUDIO\\MUSIC\\WILD.VB",
|
||||
|
@ -1610,5 +1609,4 @@ static char StreamedNameTable[][25] =
|
|||
"AUDIO\\BUST_26.WAV",
|
||||
"AUDIO\\BUST_27.WAV",
|
||||
"AUDIO\\BUST_28.WAV",
|
||||
};
|
||||
#endif
|
||||
};
|
|
@ -30,7 +30,7 @@
|
|||
#include "MusicManager.h"
|
||||
#include "Frontend.h"
|
||||
#include "Timer.h"
|
||||
#ifdef AUDIO_OPUS
|
||||
#ifdef AUDIO_OAL_USE_OPUS
|
||||
#include <opusfile.h>
|
||||
#endif
|
||||
|
||||
|
@ -83,7 +83,7 @@ char SampleBankDescFilename[] = "audio/sfx.SDT";
|
|||
char SampleBankDataFilename[] = "audio/sfx.RAW";
|
||||
|
||||
FILE *fpSampleDescHandle;
|
||||
#ifdef AUDIO_OPUS
|
||||
#ifdef OPUS_SFX
|
||||
OggOpusFile *fpSampleDataHandle;
|
||||
#else
|
||||
FILE *fpSampleDataHandle;
|
||||
|
@ -396,7 +396,7 @@ set_new_provider(int index)
|
|||
static bool
|
||||
IsThisTrackAt16KHz(uint32 track)
|
||||
{
|
||||
return track == STREAMED_SOUND_RADIO_KCHAT || track == STREAMED_SOUND_RADIO_VCPR || track == STREAMED_SOUND_AMBSIL_AMBIENT;
|
||||
return track == STREAMED_SOUND_RADIO_KCHAT || track == STREAMED_SOUND_RADIO_VCPR || track == STREAMED_SOUND_RADIO_POLICE;
|
||||
}
|
||||
|
||||
cSampleManager::cSampleManager(void)
|
||||
|
@ -1245,7 +1245,7 @@ cSampleManager::LoadSampleBank(uint8 nBank)
|
|||
return false;
|
||||
}
|
||||
|
||||
#ifdef AUDIO_OPUS
|
||||
#ifdef OPUS_SFX
|
||||
int samplesRead = 0;
|
||||
int samplesSize = nSampleBankSize[nBank] / 2;
|
||||
op_pcm_seek(fpSampleDataHandle, 0);
|
||||
|
@ -1350,7 +1350,7 @@ cSampleManager::LoadPedComment(uint32 nComment)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef AUDIO_OPUS
|
||||
#ifdef OPUS_SFX
|
||||
int samplesRead = 0;
|
||||
int samplesSize = m_aSamples[nComment].nSize / 2;
|
||||
op_pcm_seek(fpSampleDataHandle, m_aSamples[nComment].nOffset / 2);
|
||||
|
@ -2007,7 +2007,7 @@ cSampleManager::InitialiseSampleBanks(void)
|
|||
fpSampleDescHandle = fcaseopen(SampleBankDescFilename, "rb");
|
||||
if ( fpSampleDescHandle == NULL )
|
||||
return false;
|
||||
#ifndef AUDIO_OPUS
|
||||
#ifndef OPUS_SFX
|
||||
fpSampleDataHandle = fcaseopen(SampleBankDataFilename, "rb");
|
||||
if ( fpSampleDataHandle == NULL )
|
||||
{
|
||||
|
@ -2025,7 +2025,7 @@ cSampleManager::InitialiseSampleBanks(void)
|
|||
fpSampleDataHandle = op_open_file(SampleBankDataFilename, &e);
|
||||
#endif
|
||||
fread(m_aSamples, sizeof(tSample), TOTAL_AUDIO_SAMPLES, fpSampleDescHandle);
|
||||
#ifdef AUDIO_OPUS
|
||||
#ifdef OPUS_SFX
|
||||
int32 _nSampleDataEndOffset = m_aSamples[TOTAL_AUDIO_SAMPLES - 1].nOffset + m_aSamples[TOTAL_AUDIO_SAMPLES - 1].nSize;
|
||||
#endif
|
||||
fclose(fpSampleDescHandle);
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include "Physical.h"
|
||||
#include "ColStore.h"
|
||||
#include "VarConsole.h"
|
||||
#include "Pools.h"
|
||||
|
||||
CPool<ColDef,ColDef> *CColStore::ms_pColPool;
|
||||
#ifndef MASTER
|
||||
|
@ -184,7 +185,18 @@ CColStore::LoadCollision(const CVector2D &pos)
|
|||
wantThisOne = true;
|
||||
}else{
|
||||
for (int j = 0; j < MAX_CLEANUP; j++) {
|
||||
CPhysical* pEntity = CTheScripts::MissionCleanup.DoesThisEntityWaitForCollision(j);
|
||||
CPhysical* pEntity = nil;
|
||||
cleanup_entity_struct* pCleanup = &CTheScripts::MissionCleanUp.m_sEntities[i];
|
||||
if (pCleanup->type == CLEANUP_CAR) {
|
||||
pEntity = CPools::GetVehiclePool()->GetAt(pCleanup->id);
|
||||
if (!pEntity || pEntity->GetStatus() == STATUS_WRECKED)
|
||||
continue;
|
||||
}
|
||||
else if (pCleanup->type == CLEANUP_CHAR) {
|
||||
pEntity = CPools::GetPedPool()->GetAt(pCleanup->id);
|
||||
if (!pEntity || ((CPed*)pEntity)->DyingOrDead())
|
||||
continue;
|
||||
}
|
||||
if (pEntity && !pEntity->bDontLoadCollision && !pEntity->bIsFrozen) {
|
||||
if (GetBoundingBox(i).IsPointInside(pEntity->GetPosition(), -80.0f))
|
||||
wantThisOne = true;
|
||||
|
|
|
@ -1414,11 +1414,7 @@ void CGarages::PrintMessages()
|
|||
CFont::SetDropShadowPosition(2);
|
||||
CFont::SetDropColor(CRGBA(0, 0, 0, 255));
|
||||
|
||||
#if defined(GTA_PS2) || defined (FIX_BUGS)
|
||||
float y_offset = SCREEN_HEIGHT / 3 - SCREEN_SCALE_Y(40.0f); // THIS is PS2 calculation
|
||||
#else
|
||||
float y_offset = SCREEN_HEIGHT / 2 - SCREEN_SCALE_Y(84.0f); // This is PC and results in text being written over some HUD elements
|
||||
#endif
|
||||
float y_offset = SCREEN_SCALE_Y(140.0f);
|
||||
|
||||
if (MessageNumberInString2 >= 0) {
|
||||
CMessages::InsertNumberInString(TheText.Get(MessageIDString), MessageNumberInString, MessageNumberInString2, -1, -1, -1, -1, gUString);
|
||||
|
|
|
@ -93,6 +93,7 @@ VALIDATE_SIZE(CStoredCar, 0x28);
|
|||
|
||||
class CGarage
|
||||
{
|
||||
public:
|
||||
uint8 m_eGarageType;
|
||||
uint8 m_eGarageState;
|
||||
uint8 m_nMaxStoredCars;
|
||||
|
@ -189,9 +190,6 @@ class CGarage
|
|||
|
||||
int32 FindMaxNumStoredCarsForGarage() { return Min(NUM_GARAGE_STORED_CARS, m_nMaxStoredCars); }
|
||||
|
||||
friend class CGarages;
|
||||
friend class cAudioManager;
|
||||
friend class CCamera;
|
||||
};
|
||||
|
||||
class CGarages
|
||||
|
@ -199,6 +197,7 @@ class CGarages
|
|||
enum {
|
||||
MESSAGE_LENGTH = 8,
|
||||
};
|
||||
public:
|
||||
static int32 BankVansCollected;
|
||||
static bool BombsAreFree;
|
||||
static bool RespraysAreFree;
|
||||
|
@ -218,7 +217,6 @@ class CGarages
|
|||
static CStoredCar aCarsInSafeHouses[TOTAL_HIDEOUT_GARAGES][NUM_GARAGE_STORED_CARS];
|
||||
static bool bCamShouldBeOutisde;
|
||||
|
||||
public:
|
||||
static void Init(void);
|
||||
#ifndef PS2
|
||||
static void Shutdown(void);
|
||||
|
@ -259,7 +257,6 @@ public:
|
|||
static void SetFreeResprays(bool bValue) { RespraysAreFree = bValue; }
|
||||
static void SetMaxNumStoredCarsForGarage(int16 garage, uint8 num) { aGarages[garage].m_nMaxStoredCars = num; }
|
||||
|
||||
private:
|
||||
static bool IsCarSprayable(CVehicle*);
|
||||
static float FindDoorHeightForMI(int32);
|
||||
static void CloseHideOutGaragesBeforeSave(void);
|
||||
|
@ -296,7 +293,4 @@ private:
|
|||
}
|
||||
static bool IsThisGarageTypeSafehouse(uint8 type) { return FindSafeHouseIndexForGarageType(type) >= 0; }
|
||||
|
||||
friend class cAudioManager;
|
||||
friend class CReplay;
|
||||
friend class CGarage;
|
||||
};
|
||||
|
|
|
@ -1336,7 +1336,7 @@ CPickups::RenderPickUpText()
|
|||
#ifdef FIX_BUGS
|
||||
const float MAX_SCALE = SCREEN_WIDTH / DEFAULT_SCREEN_WIDTH;
|
||||
#else
|
||||
const float MAX_SCALE = RsGlobal.width / DEFAULT_SCREEN_WIDTH;
|
||||
float MAX_SCALE = RsGlobal.width / DEFAULT_SCREEN_WIDTH;
|
||||
#endif
|
||||
|
||||
float fScaleY = aMessages[i].m_dist.y / 30.0f;
|
||||
|
@ -1345,11 +1345,7 @@ CPickups::RenderPickUpText()
|
|||
float fScaleX = aMessages[i].m_dist.x / 30.0f;
|
||||
if (fScaleX > MAX_SCALE) fScaleX = MAX_SCALE;
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
CFont::SetScale(SCREEN_SCALE_X(fScaleX), SCREEN_SCALE_Y(fScaleY));
|
||||
#else
|
||||
CFont::SetScale(fScaleX, fScaleY);
|
||||
#endif
|
||||
CFont::SetScale(fScaleX, fScaleY); // this shouldn't be scaled
|
||||
CFont::SetCentreOn();
|
||||
CFont::SetCentreSize(SCREEN_WIDTH);
|
||||
CFont::SetJustifyOff();
|
||||
|
|
|
@ -85,7 +85,7 @@ uint16 CTheScripts::NumScriptDebugLines;
|
|||
uint16 CTheScripts::NumberOfIntroRectanglesThisFrame;
|
||||
uint16 CTheScripts::NumberOfIntroTextLinesThisFrame;
|
||||
uint8 CTheScripts::UseTextCommands;
|
||||
CMissionCleanup CTheScripts::MissionCleanup;
|
||||
CMissionCleanup CTheScripts::MissionCleanUp;
|
||||
CUpsideDownCarCheck CTheScripts::UpsideDownCars;
|
||||
CStuckCarCheck CTheScripts::StuckCars;
|
||||
uint16 CTheScripts::CommandsExecuted;
|
||||
|
@ -1693,17 +1693,6 @@ void CMissionCleanup::AddEntityToList(int32 id, uint8 type)
|
|||
m_nCount++;
|
||||
}
|
||||
|
||||
static void PossiblyWakeThisEntity(CPhysical* pEntity, bool ifColLoaded = false)
|
||||
{
|
||||
if (!pEntity->bIsStaticWaitingForCollision)
|
||||
return;
|
||||
if (!ifColLoaded || CColStore::HasCollisionLoaded(pEntity->GetPosition())) {
|
||||
pEntity->bIsStaticWaitingForCollision = false;
|
||||
if (!pEntity->GetIsStatic())
|
||||
pEntity->AddToMovingList();
|
||||
}
|
||||
}
|
||||
|
||||
void CMissionCleanup::RemoveEntityFromList(int32 id, uint8 type)
|
||||
{
|
||||
for (int i = 0; i < MAX_CLEANUP; i++){
|
||||
|
@ -1711,23 +1700,38 @@ void CMissionCleanup::RemoveEntityFromList(int32 id, uint8 type)
|
|||
switch (m_sEntities[i].type) {
|
||||
case CLEANUP_CAR:
|
||||
{
|
||||
CVehicle* v = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id);
|
||||
if (v)
|
||||
PossiblyWakeThisEntity(v);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id);
|
||||
if (pVehicle) {
|
||||
if (pVehicle->bIsStaticWaitingForCollision) {
|
||||
pVehicle->bIsStaticWaitingForCollision = false;
|
||||
if (!pVehicle->GetIsStatic())
|
||||
pVehicle->AddToMovingList();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CLEANUP_CHAR:
|
||||
{
|
||||
CPed* p = CPools::GetPedPool()->GetAt(m_sEntities[i].id);
|
||||
if (p)
|
||||
PossiblyWakeThisEntity(p);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(m_sEntities[i].id);
|
||||
if (pPed) {
|
||||
if (pPed->bIsStaticWaitingForCollision) {
|
||||
pPed->bIsStaticWaitingForCollision = false;
|
||||
if (!pPed->GetIsStatic())
|
||||
pPed->AddToMovingList();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CLEANUP_OBJECT:
|
||||
{
|
||||
CObject* o = CPools::GetObjectPool()->GetAt(m_sEntities[i].id);
|
||||
if (o)
|
||||
PossiblyWakeThisEntity(o);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(m_sEntities[i].id);
|
||||
if (pObject) {
|
||||
if (pObject->bIsStaticWaitingForCollision) {
|
||||
pObject->bIsStaticWaitingForCollision = false;
|
||||
if (!pObject->GetIsStatic())
|
||||
pObject->AddToMovingList();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -1746,23 +1750,44 @@ void CMissionCleanup::CheckIfCollisionHasLoadedForMissionObjects()
|
|||
switch (m_sEntities[i].type) {
|
||||
case CLEANUP_CAR:
|
||||
{
|
||||
CVehicle* v = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id);
|
||||
if (v)
|
||||
PossiblyWakeThisEntity(v, true);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id);
|
||||
if (pVehicle) {
|
||||
if (pVehicle->bIsStaticWaitingForCollision) {
|
||||
if (CColStore::HasCollisionLoaded(pVehicle->GetPosition())) {
|
||||
pVehicle->bIsStaticWaitingForCollision = false;
|
||||
if (!pVehicle->GetIsStatic())
|
||||
pVehicle->AddToMovingList();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CLEANUP_CHAR:
|
||||
{
|
||||
CPed* p = CPools::GetPedPool()->GetAt(m_sEntities[i].id);
|
||||
if (p)
|
||||
PossiblyWakeThisEntity(p, true);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(m_sEntities[i].id);
|
||||
if (pPed) {
|
||||
if (pPed->bIsStaticWaitingForCollision) {
|
||||
if (CColStore::HasCollisionLoaded(pPed->GetPosition())) {
|
||||
pPed->bIsStaticWaitingForCollision = false;
|
||||
if (!pPed->GetIsStatic())
|
||||
pPed->AddToMovingList();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CLEANUP_OBJECT:
|
||||
{
|
||||
CObject* o = CPools::GetObjectPool()->GetAt(m_sEntities[i].id);
|
||||
if (o)
|
||||
PossiblyWakeThisEntity(o, true);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(m_sEntities[i].id);
|
||||
if (pObject) {
|
||||
if (pObject->bIsStaticWaitingForCollision) {
|
||||
if (CColStore::HasCollisionLoaded(pObject->GetPosition())) {
|
||||
pObject->bIsStaticWaitingForCollision = false;
|
||||
if (!pObject->GetIsStatic())
|
||||
pObject->AddToMovingList();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -1771,21 +1796,6 @@ void CMissionCleanup::CheckIfCollisionHasLoadedForMissionObjects()
|
|||
}
|
||||
}
|
||||
|
||||
CPhysical* CMissionCleanup::DoesThisEntityWaitForCollision(int i)
|
||||
{
|
||||
if (m_sEntities[i].type == CLEANUP_CAR) {
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id);
|
||||
if (pVehicle && pVehicle->GetStatus() != STATUS_WRECKED)
|
||||
return pVehicle;
|
||||
}
|
||||
else if (m_sEntities[i].type == CLEANUP_CHAR) {
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(m_sEntities[i].id);
|
||||
if (pPed && !pPed->DyingOrDead())
|
||||
return pPed;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
void CMissionCleanup::Process()
|
||||
{
|
||||
CPopulation::m_AllRandomPedsThisType = -1;
|
||||
|
@ -1878,10 +1888,16 @@ void CUpsideDownCarCheck::Init()
|
|||
|
||||
bool CUpsideDownCarCheck::IsCarUpsideDown(int32 id)
|
||||
{
|
||||
CVehicle* v = CPools::GetVehiclePool()->GetAt(id);
|
||||
return v->GetUp().z <= -0.97f &&
|
||||
v->GetMoveSpeed().Magnitude() < 0.01f &&
|
||||
v->GetTurnSpeed().Magnitude() < 0.02f;
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(id);
|
||||
return IsCarUpsideDown(pVehicle);
|
||||
}
|
||||
|
||||
bool CUpsideDownCarCheck::IsCarUpsideDown(CVehicle* pVehicle)
|
||||
{
|
||||
assert(pVehicle);
|
||||
return pVehicle->GetUp().z <= UPSIDEDOWN_UP_THRESHOLD &&
|
||||
pVehicle->GetMoveSpeed().Magnitude() < UPSIDEDOWN_MOVE_SPEED_THRESHOLD &&
|
||||
pVehicle->GetTurnSpeed().Magnitude() < UPSIDEDOWN_TURN_SPEED_THRESHOLD;
|
||||
}
|
||||
|
||||
void CUpsideDownCarCheck::UpdateTimers()
|
||||
|
@ -1904,7 +1920,7 @@ void CUpsideDownCarCheck::UpdateTimers()
|
|||
bool CUpsideDownCarCheck::AreAnyCarsUpsideDown()
|
||||
{
|
||||
for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){
|
||||
if (m_sCars[i].m_nVehicleIndex >= 0 && m_sCars[i].m_nUpsideDownTimer > 1000)
|
||||
if (m_sCars[i].m_nVehicleIndex >= 0 && m_sCars[i].m_nUpsideDownTimer > UPSIDEDOWN_TIMER_THRESHOLD)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -1915,8 +1931,10 @@ void CUpsideDownCarCheck::AddCarToCheck(int32 id)
|
|||
uint16 index = 0;
|
||||
while (index < MAX_UPSIDEDOWN_CAR_CHECKS && m_sCars[index].m_nVehicleIndex >= 0)
|
||||
index++;
|
||||
#ifdef FIX_BUGS
|
||||
if (index >= MAX_UPSIDEDOWN_CAR_CHECKS)
|
||||
return;
|
||||
#endif
|
||||
m_sCars[index].m_nVehicleIndex = id;
|
||||
m_sCars[index].m_nUpsideDownTimer = 0;
|
||||
}
|
||||
|
@ -1935,7 +1953,7 @@ bool CUpsideDownCarCheck::HasCarBeenUpsideDownForAWhile(int32 id)
|
|||
{
|
||||
for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){
|
||||
if (m_sCars[i].m_nVehicleIndex == id)
|
||||
return m_sCars[i].m_nUpsideDownTimer > 1000;
|
||||
return m_sCars[i].m_nUpsideDownTimer > UPSIDEDOWN_TIMER_THRESHOLD;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -1985,7 +2003,10 @@ void CStuckCarCheck::AddCarToCheck(int32 id, float radius, uint32 time)
|
|||
int index = 0;
|
||||
while (index < MAX_STUCK_CAR_CHECKS && m_sCars[index].m_nVehicleIndex >= 0)
|
||||
index++;
|
||||
/* Would be nice to return if index >= MAX_STUCK_CAR_CHECKS... */
|
||||
#ifdef FIX_BUGS
|
||||
if (index >= MAX_STUCK_CAR_CHECKS)
|
||||
return;
|
||||
#endif
|
||||
m_sCars[index].m_nVehicleIndex = id;
|
||||
m_sCars[index].m_vecPos = pv->GetPosition();
|
||||
m_sCars[index].m_nLastCheck = CTimer::GetTimeInMilliseconds();
|
||||
|
@ -2217,7 +2238,7 @@ void CTheScripts::Init()
|
|||
ScriptsArray[i].Init();
|
||||
ScriptsArray[i].AddScriptToList(&pIdleScripts);
|
||||
}
|
||||
MissionCleanup.Init();
|
||||
MissionCleanUp.Init();
|
||||
UpsideDownCars.Init();
|
||||
StuckCars.Init();
|
||||
CFileMgr::SetDir("data");
|
||||
|
@ -2345,7 +2366,7 @@ void CTheScripts::Process()
|
|||
float timeStep = CTimer::GetTimeStepInMilliseconds();
|
||||
UpsideDownCars.UpdateTimers();
|
||||
StuckCars.Process();
|
||||
MissionCleanup.CheckIfCollisionHasLoadedForMissionObjects();
|
||||
MissionCleanUp.CheckIfCollisionHasLoadedForMissionObjects();
|
||||
DrawScriptSpheres();
|
||||
if (FailCurrentMission)
|
||||
--FailCurrentMission;
|
||||
|
@ -3669,7 +3690,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
|
|||
ScriptParams[0] = CPools::GetPedPool()->GetIndex(ped);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_DELETE_CHAR:
|
||||
|
@ -3678,7 +3699,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
|
|||
CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
CTheScripts::RemoveThisPed(ped);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CHAR_WANDER_DIR:
|
||||
|
@ -3899,7 +3920,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
|
|||
ScriptParams[0] = handle;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(handle, CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(handle, CLEANUP_CAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_DELETE_CAR:
|
||||
|
@ -3912,7 +3933,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
|
|||
delete car;
|
||||
}
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CAR_GOTO_COORDINATES:
|
||||
|
@ -4227,7 +4248,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
|
|||
{
|
||||
if (!m_bIsMissionScript)
|
||||
return 0;
|
||||
CTheScripts::MissionCleanup.Process();
|
||||
CTheScripts::MissionCleanUp.Process();
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_STORE_CAR_CHAR_IS_IN:
|
||||
|
@ -4250,7 +4271,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
|
|||
pOld->bIsLocked = false;
|
||||
CCarCtrl::NumRandomCars++;
|
||||
CCarCtrl::NumMissionCars--;
|
||||
CTheScripts::MissionCleanup.RemoveEntityFromList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4261,14 +4282,14 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
|
|||
CCarCtrl::NumMissionCars++;
|
||||
CCarCtrl::NumRandomCars--;
|
||||
CTheScripts::StoreVehicleWasRandom = true;
|
||||
CTheScripts::MissionCleanup.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
|
||||
break;
|
||||
case PARKED_VEHICLE:
|
||||
pCurrent->VehicleCreatedBy = MISSION_VEHICLE;
|
||||
CCarCtrl::NumMissionCars++;
|
||||
CCarCtrl::NumParkedCars--;
|
||||
CTheScripts::StoreVehicleWasRandom = true;
|
||||
CTheScripts::MissionCleanup.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
|
||||
break;
|
||||
case MISSION_VEHICLE:
|
||||
case PERMANENT_VEHICLE:
|
||||
|
@ -4301,7 +4322,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
|
|||
pOld->bIsLocked = false;
|
||||
CCarCtrl::NumRandomCars++;
|
||||
CCarCtrl::NumMissionCars--;
|
||||
CTheScripts::MissionCleanup.RemoveEntityFromList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4312,14 +4333,14 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
|
|||
CCarCtrl::NumMissionCars++;
|
||||
CCarCtrl::NumRandomCars--;
|
||||
CTheScripts::StoreVehicleWasRandom = true;
|
||||
CTheScripts::MissionCleanup.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
|
||||
break;
|
||||
case PARKED_VEHICLE:
|
||||
pCurrent->VehicleCreatedBy = MISSION_VEHICLE;
|
||||
CCarCtrl::NumMissionCars++;
|
||||
CCarCtrl::NumParkedCars--;
|
||||
CTheScripts::StoreVehicleWasRandom = true;
|
||||
CTheScripts::MissionCleanup.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(CTheScripts::StoreVehicleIndex, CLEANUP_CAR);
|
||||
break;
|
||||
case MISSION_VEHICLE:
|
||||
case PERMANENT_VEHICLE:
|
||||
|
@ -4468,7 +4489,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
|
|||
ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pObj);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_DELETE_OBJECT:
|
||||
|
@ -4481,7 +4502,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
|
|||
delete pObj;
|
||||
}
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT);
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_ADD_SCORE:
|
||||
|
@ -4697,7 +4718,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
|
|||
ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_WARP_PLAYER_FROM_CAR_TO_COORD:
|
||||
|
@ -4747,81 +4768,6 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
|
|||
return -1;
|
||||
}
|
||||
|
||||
|
||||
void CRunningScript::Save(uint8*& buf)
|
||||
{
|
||||
#ifdef COMPATIBLE_SAVES
|
||||
SkipSaveBuf(buf, 8);
|
||||
for (int i = 0; i < 8; i++)
|
||||
WriteSaveBuf<char>(buf, m_abScriptName[i]);
|
||||
WriteSaveBuf<uint32>(buf, m_nIp);
|
||||
#ifdef CHECK_STRUCT_SIZES
|
||||
static_assert(MAX_STACK_DEPTH == 6, "Compatibility loss: MAX_STACK_DEPTH != 6");
|
||||
#endif
|
||||
for (int i = 0; i < MAX_STACK_DEPTH; i++)
|
||||
WriteSaveBuf<uint32>(buf, m_anStack[i]);
|
||||
WriteSaveBuf<uint16>(buf, m_nStackPointer);
|
||||
SkipSaveBuf(buf, 2);
|
||||
#ifdef CHECK_STRUCT_SIZES
|
||||
static_assert(NUM_LOCAL_VARS + NUM_TIMERS == 18, "Compatibility loss: NUM_LOCAL_VARS + NUM_TIMERS != 18");
|
||||
#endif
|
||||
for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++)
|
||||
WriteSaveBuf<int32>(buf, m_anLocalVariables[i]);
|
||||
WriteSaveBuf<bool>(buf, m_bIsActive);
|
||||
WriteSaveBuf<bool>(buf, m_bCondResult);
|
||||
WriteSaveBuf<bool>(buf, m_bIsMissionScript);
|
||||
WriteSaveBuf<bool>(buf, m_bSkipWakeTime);
|
||||
WriteSaveBuf<uint32>(buf, m_nWakeTime);
|
||||
WriteSaveBuf<uint16>(buf, m_nAndOrState);
|
||||
WriteSaveBuf<bool>(buf, m_bNotFlag);
|
||||
WriteSaveBuf<bool>(buf, m_bDeatharrestEnabled);
|
||||
WriteSaveBuf<bool>(buf, m_bDeatharrestExecuted);
|
||||
WriteSaveBuf<bool>(buf, m_bMissionFlag);
|
||||
SkipSaveBuf(buf, 2);
|
||||
#else
|
||||
WriteSaveBuf(buf, *this);
|
||||
#endif
|
||||
}
|
||||
|
||||
void CRunningScript::Load(uint8*& buf)
|
||||
{
|
||||
#ifdef COMPATIBLE_SAVES
|
||||
SkipSaveBuf(buf, 8);
|
||||
for (int i = 0; i < 8; i++)
|
||||
m_abScriptName[i] = ReadSaveBuf<char>(buf);
|
||||
m_nIp = ReadSaveBuf<uint32>(buf);
|
||||
#ifdef CHECK_STRUCT_SIZES
|
||||
static_assert(MAX_STACK_DEPTH == 6, "Compatibility loss: MAX_STACK_DEPTH != 6");
|
||||
#endif
|
||||
for (int i = 0; i < MAX_STACK_DEPTH; i++)
|
||||
m_anStack[i] = ReadSaveBuf<uint32>(buf);
|
||||
m_nStackPointer = ReadSaveBuf<uint16>(buf);
|
||||
SkipSaveBuf(buf, 2);
|
||||
#ifdef CHECK_STRUCT_SIZES
|
||||
static_assert(NUM_LOCAL_VARS + NUM_TIMERS == 18, "Compatibility loss: NUM_LOCAL_VARS + NUM_TIMERS != 18");
|
||||
#endif
|
||||
for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++)
|
||||
m_anLocalVariables[i] = ReadSaveBuf<int32>(buf);
|
||||
m_bIsActive = ReadSaveBuf<bool>(buf);
|
||||
m_bCondResult = ReadSaveBuf<bool>(buf);
|
||||
m_bIsMissionScript = ReadSaveBuf<bool>(buf);
|
||||
m_bSkipWakeTime = ReadSaveBuf<bool>(buf);
|
||||
m_nWakeTime = ReadSaveBuf<uint32>(buf);
|
||||
m_nAndOrState = ReadSaveBuf<uint16>(buf);
|
||||
m_bNotFlag = ReadSaveBuf<bool>(buf);
|
||||
m_bDeatharrestEnabled = ReadSaveBuf<bool>(buf);
|
||||
m_bDeatharrestExecuted = ReadSaveBuf<bool>(buf);
|
||||
m_bMissionFlag = ReadSaveBuf<bool>(buf);
|
||||
SkipSaveBuf(buf, 2);
|
||||
#else
|
||||
CRunningScript* n = next;
|
||||
CRunningScript* p = prev;
|
||||
*this = ReadSaveBuf<CRunningScript>(buf);
|
||||
next = n;
|
||||
prev = p;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef MISSION_REPLAY
|
||||
|
||||
bool CRunningScript::CanAllowMissionReplay()
|
||||
|
@ -4856,7 +4802,7 @@ void RetryMission(int type, int unk)
|
|||
else if (type == 2) {
|
||||
doingMissionRetry = false;
|
||||
AllowMissionReplay = 6;
|
||||
CTheScripts::MissionCleanup.Process();
|
||||
CTheScripts::MissionCleanUp.Process();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,26 +21,31 @@ extern int32 ScriptParams[32];
|
|||
void FlushLog();
|
||||
#define script_assert(_Expression) FlushLog(); assert(_Expression);
|
||||
|
||||
#define PICKUP_PLACEMENT_OFFSET 0.5f
|
||||
#define PED_FIND_Z_OFFSET 5.0f
|
||||
#define COP_PED_FIND_Z_OFFSET 10.0f
|
||||
#define PICKUP_PLACEMENT_OFFSET (0.5f)
|
||||
#define PED_FIND_Z_OFFSET (5.0f)
|
||||
#define COP_PED_FIND_Z_OFFSET (10.0f)
|
||||
|
||||
#define SPHERE_MARKER_R 252
|
||||
#define SPHERE_MARKER_G 138
|
||||
#define SPHERE_MARKER_B 242
|
||||
#define SPHERE_MARKER_A 228
|
||||
#define UPSIDEDOWN_UP_THRESHOLD (-0.97f)
|
||||
#define UPSIDEDOWN_MOVE_SPEED_THRESHOLD (0.01f)
|
||||
#define UPSIDEDOWN_TURN_SPEED_THRESHOLD (0.02f)
|
||||
#define UPSIDEDOWN_TIMER_THRESHOLD (1000)
|
||||
|
||||
#define SPHERE_MARKER_R (252)
|
||||
#define SPHERE_MARKER_G (138)
|
||||
#define SPHERE_MARKER_B (242)
|
||||
#define SPHERE_MARKER_A (228)
|
||||
#define SPHERE_MARKER_PULSE_PERIOD 2048
|
||||
#define SPHERE_MARKER_PULSE_FRACTION 0.1f
|
||||
|
||||
#ifdef USE_PRECISE_MEASUREMENT_CONVERTION
|
||||
#define METERS_IN_FOOT 0.3048f
|
||||
#define FEET_IN_METER 3.28084f
|
||||
#define METERS_IN_FOOT (0.3048f)
|
||||
#define FEET_IN_METER (3.28084f)
|
||||
#else
|
||||
#define METERS_IN_FOOT 0.3f
|
||||
#define FEET_IN_METER 3.33f
|
||||
#define METERS_IN_FOOT (0.3f)
|
||||
#define FEET_IN_METER (3.33f)
|
||||
#endif
|
||||
|
||||
#define KEY_LENGTH_IN_SCRIPT 8
|
||||
#define KEY_LENGTH_IN_SCRIPT (8)
|
||||
|
||||
//#define GTA_SCRIPT_COLLECTIVE
|
||||
|
||||
|
@ -96,7 +101,7 @@ struct intro_text_line
|
|||
m_bBackground = false;
|
||||
m_bBackgroundOnly = false;
|
||||
m_fWrapX = 182.0f;
|
||||
m_fCenterSize = 640.0f;
|
||||
m_fCenterSize = DEFAULT_SCREEN_WIDTH;
|
||||
m_sBackgroundColor = CRGBA(128, 128, 128, 128);
|
||||
m_bTextProportional = true;
|
||||
m_bTextBeforeFade = false;
|
||||
|
@ -149,10 +154,10 @@ enum {
|
|||
|
||||
class CMissionCleanup
|
||||
{
|
||||
public:
|
||||
cleanup_entity_struct m_sEntities[MAX_CLEANUP];
|
||||
uint8 m_nCount;
|
||||
|
||||
public:
|
||||
CMissionCleanup();
|
||||
|
||||
void Init();
|
||||
|
@ -161,10 +166,9 @@ public:
|
|||
void RemoveEntityFromList(int32, uint8);
|
||||
void Process();
|
||||
void CheckIfCollisionHasLoadedForMissionObjects();
|
||||
CPhysical* DoesThisEntityWaitForCollision(int i);
|
||||
};
|
||||
|
||||
struct CUpsideDownCarCheckEntry
|
||||
struct upsidedown_car_data
|
||||
{
|
||||
int32 m_nVehicleIndex;
|
||||
uint32 m_nUpsideDownTimer;
|
||||
|
@ -172,11 +176,12 @@ struct CUpsideDownCarCheckEntry
|
|||
|
||||
class CUpsideDownCarCheck
|
||||
{
|
||||
CUpsideDownCarCheckEntry m_sCars[MAX_UPSIDEDOWN_CAR_CHECKS];
|
||||
upsidedown_car_data m_sCars[MAX_UPSIDEDOWN_CAR_CHECKS];
|
||||
|
||||
public:
|
||||
void Init();
|
||||
bool IsCarUpsideDown(int32);
|
||||
bool IsCarUpsideDown(CVehicle*);
|
||||
void UpdateTimers();
|
||||
bool AreAnyCarsUpsideDown();
|
||||
void AddCarToCheck(int32);
|
||||
|
@ -194,7 +199,7 @@ struct stuck_car_data
|
|||
bool m_bStuck;
|
||||
|
||||
stuck_car_data() { }
|
||||
inline void Reset();
|
||||
void Reset();
|
||||
};
|
||||
|
||||
class CStuckCarCheck
|
||||
|
@ -273,6 +278,7 @@ enum {
|
|||
|
||||
class CTheScripts
|
||||
{
|
||||
public:
|
||||
static uint8 ScriptSpace[SIZE_SCRIPT_SPACE];
|
||||
static CRunningScript ScriptsArray[MAX_NUM_SCRIPTS];
|
||||
static intro_text_line IntroTextLines[MAX_NUM_INTRO_TEXT_LINES];
|
||||
|
@ -286,7 +292,7 @@ class CTheScripts
|
|||
static CStoredLine aStoredLines[MAX_NUM_STORED_LINES];
|
||||
static bool DbgFlag;
|
||||
static uint32 OnAMissionFlag;
|
||||
static CMissionCleanup MissionCleanup;
|
||||
static CMissionCleanup MissionCleanUp;
|
||||
static CStuckCarCheck StuckCars;
|
||||
static CUpsideDownCarCheck UpsideDownCars;
|
||||
static int32 StoreVehicleIndex;
|
||||
|
@ -319,11 +325,10 @@ class CTheScripts
|
|||
static int16 CardStack[CARDS_IN_STACK];
|
||||
static int16 CardStackPosition;
|
||||
#endif
|
||||
public:
|
||||
static bool bPlayerIsInTheStatium;
|
||||
static uint8 RiotIntensity;
|
||||
static bool bPlayerHasMetDebbieHarry;
|
||||
public:
|
||||
|
||||
static void Init();
|
||||
static void Process();
|
||||
|
||||
|
@ -377,8 +382,6 @@ public:
|
|||
return Read4BytesFromScript(&tmp);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
static CRunningScript* StartNewScript(uint32);
|
||||
|
||||
static void CleanUpThisVehicle(CVehicle*);
|
||||
|
@ -436,18 +439,11 @@ public:
|
|||
static void SetObjectiveForAllPedsInCollective(int, eObjective);
|
||||
#endif
|
||||
|
||||
friend class CRunningScript;
|
||||
friend class CHud;
|
||||
friend void CMissionCleanup::Process();
|
||||
friend class CColStore;
|
||||
#ifdef FIX_BUGS
|
||||
friend void RetryMission(int, int);
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
enum {
|
||||
MAX_STACK_DEPTH = 6, // 4 PS2
|
||||
MAX_STACK_DEPTH = 6,
|
||||
NUM_LOCAL_VARS = 16,
|
||||
NUM_TIMERS = 2
|
||||
};
|
||||
|
@ -474,6 +470,7 @@ class CRunningScript
|
|||
ORS_8
|
||||
};
|
||||
|
||||
public:
|
||||
CRunningScript* next;
|
||||
CRunningScript* prev;
|
||||
char m_abScriptName[8];
|
||||
|
@ -512,7 +509,6 @@ public:
|
|||
|
||||
static const uint32 nSaveStructSize;
|
||||
|
||||
private:
|
||||
void CollectParameters(uint32*, int16);
|
||||
int32 CollectNextParameterWithoutIncreasingPC(uint32);
|
||||
int32* GetPointerToScriptVariable(uint32*, int16);
|
||||
|
@ -580,7 +576,6 @@ private:
|
|||
|
||||
static bool ThisIsAValidRandomCop(int32 mi, bool cop, bool swat, bool fbi, bool army, bool miami);
|
||||
|
||||
friend class CTheScripts;
|
||||
};
|
||||
|
||||
#ifdef USE_DEBUG_SCRIPT_LOADER
|
||||
|
|
|
@ -1048,7 +1048,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
|
|||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
CTheScripts::CleanUpThisPed(pPed);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_MARK_CAR_AS_NO_LONGER_NEEDED:
|
||||
|
@ -1057,7 +1057,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
|
|||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||
CTheScripts::CleanUpThisVehicle(pVehicle);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_MARK_OBJECT_AS_NO_LONGER_NEEDED:
|
||||
|
@ -1066,7 +1066,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
|
|||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
CTheScripts::CleanUpThisObject(pObject);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT);
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_DONT_REMOVE_CHAR:
|
||||
|
@ -1074,7 +1074,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
|
|||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pPed);
|
||||
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_DONT_REMOVE_CAR:
|
||||
|
@ -1082,7 +1082,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
|
|||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pVehicle);
|
||||
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_DONT_REMOVE_OBJECT:
|
||||
|
@ -1090,7 +1090,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
|
|||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pObject);
|
||||
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT);
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CREATE_CHAR_AS_PASSENGER:
|
||||
|
@ -1157,7 +1157,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command)
|
|||
ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CHAR_OBJ_KILL_CHAR_ON_FOOT:
|
||||
|
|
|
@ -325,11 +325,11 @@ int8 CRunningScript::ProcessCommands500To599(int32 command)
|
|||
CollectParameters(&m_nIp, 1);
|
||||
UpdateCompareFlag(CGarages::HasCarBeenDroppedOffYet(ScriptParams[0]));
|
||||
return 0;
|
||||
/*
|
||||
case COMMAND_SET_FREE_BOMBS:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CGarages::SetFreeBombs(ScriptParams[0] != 0);
|
||||
return 0;
|
||||
#ifdef GTA_PS2
|
||||
case COMMAND_SET_POWERPOINT:
|
||||
{
|
||||
CollectParameters(&m_nIp, 7);
|
||||
|
@ -363,8 +363,6 @@ int8 CRunningScript::ProcessCommands500To599(int32 command)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif // GTA_PS2
|
||||
/*
|
||||
case COMMAND_SET_ALL_TAXI_LIGHTS:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CAutomobile::SetAllTaxiLights(ScriptParams[0] != 0);
|
||||
|
@ -1279,7 +1277,7 @@ int8 CRunningScript::ProcessCommands600To699(int32 command)
|
|||
ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pObj);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT);
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
|
@ -1834,7 +1832,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
|
|||
pPed->bRespondsToThreats = false;
|
||||
++CPopulation::ms_nTotalMissionPeds;
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
}
|
||||
ScriptParams[0] = ped_handle;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
|
@ -1889,7 +1887,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
|
|||
pPed->bRespondsToThreats = false;
|
||||
++CPopulation::ms_nTotalMissionPeds;
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
}
|
||||
ScriptParams[0] = ped_handle;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
|
|
|
@ -68,7 +68,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
|
|||
CPed* pLeader = CWorld::Players[ScriptParams[1]].m_pPed;
|
||||
script_assert(pPed);
|
||||
script_assert(pLeader);
|
||||
UpdateCompareFlag(pPed->m_leader == pLeader);
|
||||
UpdateCompareFlag(pPed->m_leader == pLeader && !pPed->bWaitForLeaderToComeCloser);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_EXPLODE_CHAR_HEAD:
|
||||
|
@ -92,7 +92,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
|
|||
CollectParameters(&m_nIp, 2);
|
||||
CBoat* pBoat = (CBoat*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pBoat && pBoat->m_vehType == VEHICLE_TYPE_BOAT);
|
||||
pBoat->m_bIsAnchored = (ScriptParams[1] == 0);
|
||||
pBoat->m_bIsAnchored = (ScriptParams[1] != 0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_ZONE_GROUP:
|
||||
|
@ -155,7 +155,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
|
|||
++CCarCtrl::NumMissionCars;
|
||||
--CCarCtrl::NumRandomCars;
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(handle, CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(handle, CLEANUP_CAR);
|
||||
}
|
||||
ScriptParams[0] = handle;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
|
@ -188,7 +188,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
|
|||
++CCarCtrl::NumMissionCars;
|
||||
--CCarCtrl::NumRandomCars;
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(handle, CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(handle, CLEANUP_CAR);
|
||||
}
|
||||
ScriptParams[0] = handle;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
|
@ -609,7 +609,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
|
|||
}
|
||||
}
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CHAR_STAY_IN_SAME_PLACE:
|
||||
|
@ -1056,7 +1056,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
|
|||
ScriptParams[0] = CPools::GetPedPool()->GetIndex(ped);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CHAR_OBJ_STEAL_ANY_CAR:
|
||||
|
|
|
@ -2251,6 +2251,80 @@ VALIDATESAVEBUF(size)
|
|||
|
||||
#undef SCRIPT_DATA_SIZE
|
||||
|
||||
void CRunningScript::Save(uint8*& buf)
|
||||
{
|
||||
#ifdef COMPATIBLE_SAVES
|
||||
SkipSaveBuf(buf, 8);
|
||||
for (int i = 0; i < 8; i++)
|
||||
WriteSaveBuf<char>(buf, m_abScriptName[i]);
|
||||
WriteSaveBuf<uint32>(buf, m_nIp);
|
||||
#ifdef CHECK_STRUCT_SIZES
|
||||
static_assert(MAX_STACK_DEPTH == 6, "Compatibility loss: MAX_STACK_DEPTH != 6");
|
||||
#endif
|
||||
for (int i = 0; i < MAX_STACK_DEPTH; i++)
|
||||
WriteSaveBuf<uint32>(buf, m_anStack[i]);
|
||||
WriteSaveBuf<uint16>(buf, m_nStackPointer);
|
||||
SkipSaveBuf(buf, 2);
|
||||
#ifdef CHECK_STRUCT_SIZES
|
||||
static_assert(NUM_LOCAL_VARS + NUM_TIMERS == 18, "Compatibility loss: NUM_LOCAL_VARS + NUM_TIMERS != 18");
|
||||
#endif
|
||||
for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++)
|
||||
WriteSaveBuf<int32>(buf, m_anLocalVariables[i]);
|
||||
WriteSaveBuf<bool>(buf, m_bIsActive);
|
||||
WriteSaveBuf<bool>(buf, m_bCondResult);
|
||||
WriteSaveBuf<bool>(buf, m_bIsMissionScript);
|
||||
WriteSaveBuf<bool>(buf, m_bSkipWakeTime);
|
||||
WriteSaveBuf<uint32>(buf, m_nWakeTime);
|
||||
WriteSaveBuf<uint16>(buf, m_nAndOrState);
|
||||
WriteSaveBuf<bool>(buf, m_bNotFlag);
|
||||
WriteSaveBuf<bool>(buf, m_bDeatharrestEnabled);
|
||||
WriteSaveBuf<bool>(buf, m_bDeatharrestExecuted);
|
||||
WriteSaveBuf<bool>(buf, m_bMissionFlag);
|
||||
SkipSaveBuf(buf, 2);
|
||||
#else
|
||||
WriteSaveBuf(buf, *this);
|
||||
#endif
|
||||
}
|
||||
|
||||
void CRunningScript::Load(uint8*& buf)
|
||||
{
|
||||
#ifdef COMPATIBLE_SAVES
|
||||
SkipSaveBuf(buf, 8);
|
||||
for (int i = 0; i < 8; i++)
|
||||
m_abScriptName[i] = ReadSaveBuf<char>(buf);
|
||||
m_nIp = ReadSaveBuf<uint32>(buf);
|
||||
#ifdef CHECK_STRUCT_SIZES
|
||||
static_assert(MAX_STACK_DEPTH == 6, "Compatibility loss: MAX_STACK_DEPTH != 6");
|
||||
#endif
|
||||
for (int i = 0; i < MAX_STACK_DEPTH; i++)
|
||||
m_anStack[i] = ReadSaveBuf<uint32>(buf);
|
||||
m_nStackPointer = ReadSaveBuf<uint16>(buf);
|
||||
SkipSaveBuf(buf, 2);
|
||||
#ifdef CHECK_STRUCT_SIZES
|
||||
static_assert(NUM_LOCAL_VARS + NUM_TIMERS == 18, "Compatibility loss: NUM_LOCAL_VARS + NUM_TIMERS != 18");
|
||||
#endif
|
||||
for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++)
|
||||
m_anLocalVariables[i] = ReadSaveBuf<int32>(buf);
|
||||
m_bIsActive = ReadSaveBuf<bool>(buf);
|
||||
m_bCondResult = ReadSaveBuf<bool>(buf);
|
||||
m_bIsMissionScript = ReadSaveBuf<bool>(buf);
|
||||
m_bSkipWakeTime = ReadSaveBuf<bool>(buf);
|
||||
m_nWakeTime = ReadSaveBuf<uint32>(buf);
|
||||
m_nAndOrState = ReadSaveBuf<uint16>(buf);
|
||||
m_bNotFlag = ReadSaveBuf<bool>(buf);
|
||||
m_bDeatharrestEnabled = ReadSaveBuf<bool>(buf);
|
||||
m_bDeatharrestExecuted = ReadSaveBuf<bool>(buf);
|
||||
m_bMissionFlag = ReadSaveBuf<bool>(buf);
|
||||
SkipSaveBuf(buf, 2);
|
||||
#else
|
||||
CRunningScript* n = next;
|
||||
CRunningScript* p = prev;
|
||||
*this = ReadSaveBuf<CRunningScript>(buf);
|
||||
next = n;
|
||||
prev = p;
|
||||
#endif
|
||||
}
|
||||
|
||||
void CTheScripts::ClearSpaceForMissionEntity(const CVector& pos, CEntity* pEntity)
|
||||
{
|
||||
static CColPoint aTempColPoints[MAX_COLLISION_POINTS];
|
||||
|
|
|
@ -703,7 +703,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
|
|||
ScriptParams[0] = CPools::GetVehiclePool()->GetIndex(pVehicle);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_START_BOAT_FOAM_ANIMATION:
|
||||
|
@ -1272,7 +1272,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command)
|
|||
pPed->bRespondsToThreats = false;
|
||||
++CPopulation::ms_nTotalMissionPeds;
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
}
|
||||
ScriptParams[0] = ped_handle;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
|
@ -1320,7 +1320,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command)
|
|||
pPed->bRespondsToThreats = false;
|
||||
++CPopulation::ms_nTotalMissionPeds;
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
}
|
||||
ScriptParams[0] = ped_handle;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
|
|
|
@ -576,11 +576,11 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command)
|
|||
CollectParameters(&m_nIp, 1);
|
||||
CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]];
|
||||
ScriptParams[0] = pPlayerInfo->m_nLastTimeCarSpentOnTwoWheels;
|
||||
ScriptParams[1] = *(int*)&pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels;
|
||||
*(float*)&ScriptParams[1] = pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels;
|
||||
ScriptParams[2] = pPlayerInfo->m_nLastTimeSpentOnWheelie;
|
||||
ScriptParams[3] = *(int*)&pPlayerInfo->m_nLastDistanceTravelledOnWheelie;
|
||||
*(float*)&ScriptParams[3] = pPlayerInfo->m_nLastDistanceTravelledOnWheelie;
|
||||
ScriptParams[4] = pPlayerInfo->m_nLastTimeSpentOnStoppie;
|
||||
ScriptParams[5] = *(int*)&pPlayerInfo->m_nLastDistanceTravelledOnStoppie;
|
||||
*(float*)&ScriptParams[5] = pPlayerInfo->m_nLastDistanceTravelledOnStoppie;
|
||||
StoreParameters(&m_nIp, 6);
|
||||
pPlayerInfo->m_nLastTimeCarSpentOnTwoWheels = 0;
|
||||
pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels = 0.0f;
|
||||
|
@ -1201,7 +1201,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
|
|||
ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CREATE_RANDOM_CHAR_AS_PASSENGER:
|
||||
|
@ -1231,7 +1231,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
|
|||
ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CHAR_IGNORE_THREATS_BEHIND_OBJECTS:
|
||||
|
|
|
@ -283,7 +283,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
|||
pPed->bRespondsToThreats = false;
|
||||
++CPopulation::ms_nTotalMissionPeds;
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
}
|
||||
ScriptParams[0] = ped_handle;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
|
|
|
@ -3639,7 +3639,7 @@ CMenuManager::ExportStats()
|
|||
char *statValue = UnicodeToAscii(gUString2);
|
||||
for (int j = 0; statValue[j] != '\0'; ++j) {
|
||||
if (statValue[j] == '_')
|
||||
statValue[j] = 0xBA; // This is degree symbol, but my editors keeps messing up with it so I wrote hex representation
|
||||
statValue[j] = '\xBA'; // This is degree symbol, but my editors keeps messing up with it so I wrote hex representation
|
||||
}
|
||||
if (statValue)
|
||||
fprintf(txtFile, "%s\n\n", statValue);
|
||||
|
@ -3701,7 +3701,7 @@ CMenuManager::ExportStats()
|
|||
char *statValue = UnicodeToAscii(gUString2);
|
||||
for (int l = 0; statValue[l] != '\0'; ++l) {
|
||||
if (statValue[l] == '_')
|
||||
statValue[l] = 0xBA; // This is degree symbol, but my editors keeps messing up with it so I wrote hex representation
|
||||
statValue[l] = '\xBA'; // This is degree symbol, but my editors keeps messing up with it so I wrote hex representation
|
||||
}
|
||||
if (statValue)
|
||||
fprintf(htmlFile, "%s", statValue);
|
||||
|
|
|
@ -338,6 +338,11 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually
|
|||
#define USE_BASIC_SCRIPT_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#ifdef MASTER
|
||||
#undef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
|
||||
#undef USE_BASIC_SCRIPT_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
// Replay
|
||||
//#define DONT_FIX_REPLAY_BUGS // keeps various bugs in CReplay, some of which are fairly cool!
|
||||
//#define USE_BETA_REPLAY_MODE // adds another replay mode, a few seconds slomo (caution: buggy!)
|
||||
|
@ -359,8 +364,21 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually
|
|||
|
||||
// Audio
|
||||
#define AUDIO_CACHE // cache sound lengths to speed up the cold boot
|
||||
//#define PS2_AUDIO // changes audio paths for cutscenes and radio to PS2 paths, needs vbdec to support VB with MSS
|
||||
//#define PS2_AUDIO_PATHS // changes audio paths for cutscenes and radio to PS2 paths (needs vbdec on MSS builds)
|
||||
//#define AUDIO_OAL_USE_SNDFILE // use libsndfile to decode WAVs instead of our internal decoder
|
||||
#define AUDIO_OAL_USE_MPG123 // use mpg123 to support mp3 files
|
||||
|
||||
#ifdef AUDIO_OPUS
|
||||
#define AUDIO_OAL_USE_OPUS // enable support of opus files
|
||||
//#define OPUS_AUDIO_PATHS // (not supported on VC yet) changes audio paths to opus paths (doesn't work if AUDIO_OAL_USE_OPUS isn't enabled)
|
||||
//#define OPUS_SFX // enable if your sfx.raw is encoded with opus (doesn't work if AUDIO_OAL_USE_OPUS isn't enabled)
|
||||
|
||||
#ifndef AUDIO_OAL_USE_OPUS
|
||||
#undef OPUS_AUDIO_PATHS
|
||||
#undef OPUS_SFX
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef LIBRW
|
||||
// these are not supported with librw yet
|
||||
|
|
|
@ -186,7 +186,7 @@ CSpecialFX::Render2DFXs(void)
|
|||
CFont::SetCentreOff();
|
||||
CFont::SetPropOn();
|
||||
CFont::SetColor(CRGBA(0, 255, 0, 200));
|
||||
FONT_LOCALE(FONT_STANDARD);
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
|
||||
sprintf(gString, "%d", CTimer::GetFrameCounter() & 0x3F); // mb % 63
|
||||
AsciiToUnicode(gString, gUString);
|
||||
CFont::PrintString(SCREEN_WIDTH * 8 / 10, SCREEN_HEIGHT * 8 / 10, gUString);
|
||||
|
@ -211,7 +211,7 @@ CSpecialFX::Render2DFXs(void)
|
|||
CFont::SetCentreOff();
|
||||
CFont::SetPropOn();
|
||||
CFont::SetColor(CRGBA(100, 100, 100, 200));
|
||||
FONT_LOCALE(FONT_STANDARD);
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
|
||||
CFont::PrintString(SCREEN_WIDTH * 8 / 10, SCREEN_HEIGHT * 8 / 10, gUString);
|
||||
for (int32 i = 0; i < SCREEN_HEIGHT; i += 4) {
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
|
||||
|
|
|
@ -14394,6 +14394,9 @@ XBOX
|
|||
[FEC_IVP]
|
||||
INVERT PAD VERTICALLY
|
||||
|
||||
[FEM_NON]
|
||||
NONE
|
||||
|
||||
{ end of file }
|
||||
[DUMMY]
|
||||
THIS LABEL NEEDS TO BE HERE !!!
|
||||
|
|
Loading…
Reference in a new issue