mirror of
https://github.com/halpz/re3.git
synced 2026-06-16 17:54:00 +00:00
Merge branch 'miami' into lcs-dev
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
if(${REVC_AUDIO} STREQUAL "OAL")
|
||||
find_package(OpenAL REQUIRED)
|
||||
find_package(MPG123 REQUIRED)
|
||||
find_package(SndFile REQUIRED)
|
||||
endif()
|
||||
|
||||
file(GLOB_RECURSE Sources "*.cpp" "*.h")
|
||||
|
||||
MACRO(HEADER_DIRECTORIES return_list)
|
||||
FILE(GLOB_RECURSE new_list *.cpp)
|
||||
SET(dir_list "animation"
|
||||
"audio"
|
||||
"collision"
|
||||
"control"
|
||||
"core"
|
||||
"entities"
|
||||
"extras"
|
||||
"fakerw"
|
||||
"math"
|
||||
"modelinfo"
|
||||
"objects"
|
||||
"peds"
|
||||
"render"
|
||||
"rw"
|
||||
"save"
|
||||
"skel"
|
||||
"text"
|
||||
"vehicles"
|
||||
"weapons")
|
||||
FOREACH(file_path ${new_list})
|
||||
GET_FILENAME_COMPONENT(dir_path ${file_path} PATH)
|
||||
SET(dir_list ${dir_list} ${dir_path})
|
||||
ENDFOREACH()
|
||||
LIST(REMOVE_DUPLICATES dir_list)
|
||||
SET(${return_list} ${dir_list})
|
||||
ENDMACRO()
|
||||
|
||||
HEADER_DIRECTORIES(header_list)
|
||||
include_directories(${header_list})
|
||||
|
||||
|
||||
add_executable(reVC ${Sources})
|
||||
target_link_libraries(reVC librw)
|
||||
target_link_libraries(reVC Threads::Threads)
|
||||
|
||||
if(${REVC_AUDIO} STREQUAL "OAL")
|
||||
target_link_libraries(reVC ${OPENAL_LIBRARY})
|
||||
target_link_libraries(reVC ${MPG123_LIBRARIES})
|
||||
target_link_libraries(reVC ${SNDFILE_LIBRARIES})
|
||||
endif()
|
||||
|
||||
target_include_directories(reVC
|
||||
INTERFACE
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
|
||||
)
|
||||
|
||||
target_compile_definitions(reVC
|
||||
PRIVATE
|
||||
"$<IF:$<CONFIG:DEBUG>,DEBUG,NDEBUG>"
|
||||
PUBLIC
|
||||
"RW_${REVC_PLATFORM}"
|
||||
)
|
||||
|
||||
target_compile_definitions(reVC PRIVATE LIBRW=1 AUDIO_OAL=1)
|
||||
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
||||
target_compile_options(reVC
|
||||
PRIVATE
|
||||
"-Wall"
|
||||
)
|
||||
if (NOT REVC_PLATFORM_PS2)
|
||||
target_compile_options(reVC
|
||||
PRIVATE
|
||||
"-Wextra"
|
||||
"-Wdouble-promotion"
|
||||
"-Wpedantic"
|
||||
)
|
||||
endif()
|
||||
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||
target_compile_options(reVC
|
||||
PUBLIC
|
||||
/wd4996 /wd4244
|
||||
)
|
||||
endif()
|
||||
|
||||
set_target_properties(reVC
|
||||
PROPERTIES
|
||||
C_STANDARD 11
|
||||
C_EXTENSIONS OFF
|
||||
C_STANDARD_REQUIRED ON
|
||||
CXX_STANDARD 11
|
||||
CXX_EXTENSIONS OFF
|
||||
CXX_STANDARD_REQUIRED ON
|
||||
PREFIX ""
|
||||
)
|
||||
|
||||
if(REVC_INSTALL)
|
||||
target_include_directories(reVC
|
||||
INTERFACE
|
||||
$<INSTALL_INTERFACE:${REVC_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
install(
|
||||
TARGETS reVC
|
||||
EXPORT reVC-targets
|
||||
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
||||
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||
)
|
||||
endif()
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "RpAnimBlend.h"
|
||||
#include "AnimManager.h"
|
||||
#include "AnimBlendAssociation.h"
|
||||
#include "RwHelper.h"
|
||||
#include "MemoryMgr.h"
|
||||
|
||||
//--MIAMI: file done
|
||||
|
||||
@@ -139,11 +139,15 @@ CAnimBlendAssociation::SetCurrentTime(float time)
|
||||
}
|
||||
|
||||
CAnimManager::UncompressAnimation(hierarchy);
|
||||
if(hierarchy->compressed2){
|
||||
#ifdef ANIM_COMPRESSION
|
||||
// strangely PC has this but android doesn't
|
||||
if(hierarchy->keepCompressed){
|
||||
for(i = 0; i < numNodes; i++)
|
||||
if(nodes[i].sequence)
|
||||
nodes[i].SetupKeyFrameCompressed();
|
||||
}else{
|
||||
}else
|
||||
#endif
|
||||
{
|
||||
for(i = 0; i < numNodes; i++)
|
||||
if(nodes[i].sequence)
|
||||
nodes[i].FindKeyFrame(currentTime);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "common.h"
|
||||
|
||||
#include "AnimBlendClumpData.h"
|
||||
#include "RwHelper.h"
|
||||
#include "MemoryMgr.h"
|
||||
|
||||
//--MIAMI: file done
|
||||
|
||||
|
||||
@@ -12,24 +12,18 @@ struct AnimBlendFrameData
|
||||
VELOCITY_EXTRACTION = 8,
|
||||
VELOCITY_EXTRACTION_3D = 0x10,
|
||||
UPDATE_KEYFRAMES = 0x20,
|
||||
UNK_COMPRESSED = 0x40,
|
||||
COMPRESSED = 0x40
|
||||
};
|
||||
|
||||
uint8 flag;
|
||||
RwV3d resetPos;
|
||||
#ifdef PED_SKIN
|
||||
union {
|
||||
RwFrame *frame;
|
||||
RpHAnimStdInterpFrame *hanimFrame;
|
||||
};
|
||||
int32 nodeID;
|
||||
#else
|
||||
RwFrame *frame;
|
||||
#endif
|
||||
};
|
||||
#ifndef PED_SKIN
|
||||
VALIDATE_SIZE(AnimBlendFrameData, 0x14);
|
||||
#endif
|
||||
VALIDATE_SIZE(AnimBlendFrameData, 0x18);
|
||||
|
||||
|
||||
class CAnimBlendClumpData
|
||||
@@ -44,8 +38,6 @@ public:
|
||||
CAnimBlendClumpData(void);
|
||||
~CAnimBlendClumpData(void);
|
||||
void SetNumberOfFrames(int n);
|
||||
#ifdef PED_SKIN
|
||||
void SetNumberOfBones(int n) { SetNumberOfFrames(n); }
|
||||
#endif
|
||||
void ForAllFrames(void (*cb)(AnimBlendFrameData*, void*), void *arg);
|
||||
};
|
||||
|
||||
@@ -65,10 +65,10 @@ CAnimBlendHierarchy::CalcTotalTimeCompressed(void)
|
||||
continue;
|
||||
#endif
|
||||
|
||||
totalLength = Max(totalLength, sequences[i].GetKeyFrameCompressed(sequences[i].numFrames-1)->deltaTime/60.0f);
|
||||
totalLength = Max(totalLength, sequences[i].GetKeyFrameCompressed(sequences[i].numFrames-1)->GetDeltaTime());
|
||||
for(j = sequences[i].numFrames-1; j >= 1; j--){
|
||||
KeyFrame *kf1 = sequences[i].GetKeyFrameCompressed(j);
|
||||
KeyFrame *kf2 = sequences[i].GetKeyFrameCompressed(j-1);
|
||||
KeyFrameCompressed *kf1 = sequences[i].GetKeyFrameCompressed(j);
|
||||
KeyFrameCompressed *kf2 = sequences[i].GetKeyFrameCompressed(j-1);
|
||||
kf1->deltaTime -= kf2->deltaTime;
|
||||
}
|
||||
}
|
||||
@@ -94,6 +94,12 @@ CAnimBlendHierarchy::RemoveAnimSequences(void)
|
||||
void
|
||||
CAnimBlendHierarchy::Uncompress(void)
|
||||
{
|
||||
#ifdef ANIM_COMPRESSION
|
||||
int i;
|
||||
assert(compressed);
|
||||
for(i = 0; i < numSequences; i++)
|
||||
sequences[i].Uncompress();
|
||||
#endif
|
||||
compressed = 0;
|
||||
if(totalLength == 0.0f){
|
||||
RemoveQuaternionFlips();
|
||||
@@ -104,6 +110,22 @@ CAnimBlendHierarchy::Uncompress(void)
|
||||
void
|
||||
CAnimBlendHierarchy::RemoveUncompressedData(void)
|
||||
{
|
||||
// useless
|
||||
#ifdef ANIM_COMPRESSION
|
||||
int i;
|
||||
assert(!compressed);
|
||||
for(i = 0; i < numSequences; i++)
|
||||
sequences[i].RemoveUncompressedData();
|
||||
#endif
|
||||
compressed = 1;
|
||||
}
|
||||
|
||||
#ifdef USE_CUSTOM_ALLOCATOR
|
||||
void
|
||||
CAnimBlendHierarchy::MoveMemory(bool onlyone)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < numSequences; i++)
|
||||
if(sequences[i].MoveMemory() && onlyone)
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
|
||||
#include "templates.h"
|
||||
|
||||
#ifdef MoveMemory
|
||||
#undef MoveMemory // windows shit
|
||||
#endif
|
||||
|
||||
class CAnimBlendSequence;
|
||||
|
||||
// A collection of sequences
|
||||
@@ -11,8 +15,8 @@ public:
|
||||
char name[24];
|
||||
CAnimBlendSequence *sequences;
|
||||
int16 numSequences;
|
||||
bool compressed; // not really used
|
||||
bool compressed2; // not really used
|
||||
bool compressed;
|
||||
bool keepCompressed;
|
||||
float totalLength;
|
||||
CLink<CAnimBlendHierarchy*> *linkPtr;
|
||||
|
||||
@@ -25,6 +29,7 @@ public:
|
||||
void RemoveAnimSequences(void);
|
||||
void Uncompress(void);
|
||||
void RemoveUncompressedData(void);
|
||||
void MoveMemory(bool onlyone = false);
|
||||
bool IsCompressed() { return !!compressed; };
|
||||
};
|
||||
|
||||
|
||||
@@ -47,6 +47,44 @@ CAnimBlendNode::Update(CVector &trans, CQuaternion &rot, float weight)
|
||||
return looped;
|
||||
}
|
||||
|
||||
bool
|
||||
CAnimBlendNode::UpdateCompressed(CVector &trans, CQuaternion &rot, float weight)
|
||||
{
|
||||
bool looped = false;
|
||||
|
||||
trans = CVector(0.0f, 0.0f, 0.0f);
|
||||
rot = CQuaternion(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
|
||||
if(association->IsRunning()){
|
||||
remainingTime -= association->timeStep;
|
||||
if(remainingTime <= 0.0f)
|
||||
looped = NextKeyFrameCompressed();
|
||||
}
|
||||
|
||||
float blend = association->GetBlendAmount(weight);
|
||||
if(blend > 0.0f){
|
||||
KeyFrameTransCompressed *kfA = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(frameA);
|
||||
KeyFrameTransCompressed *kfB = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(frameB);
|
||||
float t = kfA->deltaTime == 0 ? 0.0f : (kfA->GetDeltaTime() - remainingTime)/kfA->GetDeltaTime();
|
||||
if(sequence->type & CAnimBlendSequence::KF_TRANS){
|
||||
CVector transA, transB;
|
||||
kfA->GetTranslation(&transA);
|
||||
kfB->GetTranslation(&transB);
|
||||
trans = transB + t*(transA - transB);
|
||||
trans *= blend;
|
||||
}
|
||||
if(sequence->type & CAnimBlendSequence::KF_ROT){
|
||||
CQuaternion rotA, rotB;
|
||||
kfA->GetRotation(&rotA);
|
||||
kfB->GetRotation(&rotB);
|
||||
rot.Slerp(rotB, rotA, theta, invSin, t);
|
||||
rot *= blend;
|
||||
}
|
||||
}
|
||||
|
||||
return looped;
|
||||
}
|
||||
|
||||
bool
|
||||
CAnimBlendNode::NextKeyFrame(void)
|
||||
{
|
||||
@@ -84,6 +122,43 @@ CAnimBlendNode::NextKeyFrame(void)
|
||||
return looped;
|
||||
}
|
||||
|
||||
bool
|
||||
CAnimBlendNode::NextKeyFrameCompressed(void)
|
||||
{
|
||||
bool looped;
|
||||
|
||||
if(sequence->numFrames <= 1)
|
||||
return false;
|
||||
|
||||
looped = false;
|
||||
frameB = frameA;
|
||||
|
||||
// Advance as long as we have to
|
||||
while(remainingTime <= 0.0f){
|
||||
frameA++;
|
||||
|
||||
if(frameA >= sequence->numFrames){
|
||||
// reached end of animation
|
||||
if(!association->IsRepeating()){
|
||||
frameA--;
|
||||
remainingTime = 0.0f;
|
||||
return false;
|
||||
}
|
||||
looped = true;
|
||||
frameA = 0;
|
||||
}
|
||||
|
||||
remainingTime += sequence->GetKeyFrameCompressed(frameA)->GetDeltaTime();
|
||||
}
|
||||
|
||||
frameB = frameA - 1;
|
||||
if(frameB < 0)
|
||||
frameB += sequence->numFrames;
|
||||
|
||||
CalcDeltasCompressed();
|
||||
return looped;
|
||||
}
|
||||
|
||||
// Set animation to time t
|
||||
bool
|
||||
CAnimBlendNode::FindKeyFrame(float t)
|
||||
@@ -132,7 +207,7 @@ CAnimBlendNode::SetupKeyFrameCompressed(void)
|
||||
frameA = 0;
|
||||
remainingTime = 0.0f;
|
||||
}else
|
||||
remainingTime = sequence->GetKeyFrameCompressed(frameA)->deltaTime/60.0f;
|
||||
remainingTime = sequence->GetKeyFrameCompressed(frameA)->GetDeltaTime();
|
||||
|
||||
CalcDeltasCompressed();
|
||||
return true;
|
||||
@@ -157,9 +232,17 @@ CAnimBlendNode::CalcDeltasCompressed(void)
|
||||
{
|
||||
if((sequence->type & CAnimBlendSequence::KF_ROT) == 0)
|
||||
return;
|
||||
KeyFrame *kfA = sequence->GetKeyFrameCompressed(frameA);
|
||||
KeyFrame *kfB = sequence->GetKeyFrameCompressed(frameB);
|
||||
float cos = DotProduct(kfA->rotation, kfB->rotation);
|
||||
KeyFrameCompressed *kfA = sequence->GetKeyFrameCompressed(frameA);
|
||||
KeyFrameCompressed *kfB = sequence->GetKeyFrameCompressed(frameB);
|
||||
CQuaternion rotA, rotB;
|
||||
kfA->GetRotation(&rotA);
|
||||
kfB->GetRotation(&rotB);
|
||||
float cos = DotProduct(rotA, rotB);
|
||||
if(cos < 0.0f){
|
||||
rotB *= -1.0f;
|
||||
kfB->SetRotation(rotB);
|
||||
}
|
||||
cos = DotProduct(rotA, rotB);
|
||||
if(cos > 1.0f)
|
||||
cos = 1.0f;
|
||||
theta = Acos(cos);
|
||||
@@ -183,6 +266,26 @@ CAnimBlendNode::GetCurrentTranslation(CVector &trans, float weight)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendNode::GetCurrentTranslationCompressed(CVector &trans, float weight)
|
||||
{
|
||||
trans = CVector(0.0f, 0.0f, 0.0f);
|
||||
|
||||
float blend = association->GetBlendAmount(weight);
|
||||
if(blend > 0.0f){
|
||||
KeyFrameTransCompressed *kfA = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(frameA);
|
||||
KeyFrameTransCompressed *kfB = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(frameB);
|
||||
float t = kfA->deltaTime == 0 ? 0.0f : (kfA->GetDeltaTime() - remainingTime)/kfA->GetDeltaTime();
|
||||
if(sequence->type & CAnimBlendSequence::KF_TRANS){
|
||||
CVector transA, transB;
|
||||
kfA->GetTranslation(&transA);
|
||||
kfB->GetTranslation(&transB);
|
||||
trans = transB + t*(transA - transB);
|
||||
trans *= blend;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendNode::GetEndTranslation(CVector &trans, float weight)
|
||||
{
|
||||
@@ -195,3 +298,19 @@ CAnimBlendNode::GetEndTranslation(CVector &trans, float weight)
|
||||
trans = kf->translation * blend;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendNode::GetEndTranslationCompressed(CVector &trans, float weight)
|
||||
{
|
||||
trans = CVector(0.0f, 0.0f, 0.0f);
|
||||
|
||||
float blend = association->GetBlendAmount(weight);
|
||||
if(blend > 0.0f){
|
||||
KeyFrameTransCompressed *kf = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(sequence->numFrames-1);
|
||||
if(sequence->type & CAnimBlendSequence::KF_TRANS){
|
||||
CVector pos;
|
||||
kf->GetTranslation(&pos);
|
||||
trans = pos * blend;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,13 +20,17 @@ public:
|
||||
|
||||
void Init(void);
|
||||
bool Update(CVector &trans, CQuaternion &rot, float weight);
|
||||
bool UpdateCompressed(CVector &trans, CQuaternion &rot, float weight);
|
||||
bool NextKeyFrame(void);
|
||||
bool NextKeyFrameCompressed(void);
|
||||
bool FindKeyFrame(float t);
|
||||
bool SetupKeyFrameCompressed(void);
|
||||
void CalcDeltas(void);
|
||||
void CalcDeltasCompressed(void);
|
||||
void GetCurrentTranslation(CVector &trans, float weight);
|
||||
void GetCurrentTranslationCompressed(CVector &trans, float weight);
|
||||
void GetEndTranslation(CVector &trans, float weight);
|
||||
void GetEndTranslationCompressed(CVector &trans, float weight);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "common.h"
|
||||
|
||||
#include "AnimBlendSequence.h"
|
||||
#include "MemoryHeap.h"
|
||||
|
||||
//--MIAMI: file done
|
||||
|
||||
@@ -10,9 +11,7 @@ CAnimBlendSequence::CAnimBlendSequence(void)
|
||||
numFrames = 0;
|
||||
keyFrames = nil;
|
||||
keyFramesCompressed = nil;
|
||||
#ifdef PED_SKIN
|
||||
boneTag = -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
CAnimBlendSequence::~CAnimBlendSequence(void)
|
||||
@@ -67,3 +66,137 @@ CAnimBlendSequence::RemoveQuaternionFlips(void)
|
||||
last = frame->rotation;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendSequence::Uncompress(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(numFrames == 0)
|
||||
return;
|
||||
|
||||
PUSH_MEMID(MEMID_ANIMATION);
|
||||
|
||||
float rotScale = 1.0f/4096.0f;
|
||||
float timeScale = 1.0f/60.0f;
|
||||
float transScale = 1.0f/1024.0f;
|
||||
if(type & KF_TRANS){
|
||||
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameTrans));
|
||||
KeyFrameTransCompressed *ckf = (KeyFrameTransCompressed*)keyFramesCompressed;
|
||||
KeyFrameTrans *kf = (KeyFrameTrans*)newKfs;
|
||||
for(i = 0; i < numFrames; i++){
|
||||
kf->rotation.x = ckf->rot[0]*rotScale;
|
||||
kf->rotation.y = ckf->rot[1]*rotScale;
|
||||
kf->rotation.z = ckf->rot[2]*rotScale;
|
||||
kf->rotation.w = ckf->rot[3]*rotScale;
|
||||
kf->deltaTime = ckf->deltaTime*timeScale;
|
||||
kf->translation.x = ckf->trans[0]*transScale;
|
||||
kf->translation.y = ckf->trans[1]*transScale;
|
||||
kf->translation.z = ckf->trans[2]*transScale;
|
||||
kf++;
|
||||
ckf++;
|
||||
}
|
||||
keyFrames = newKfs;
|
||||
}else{
|
||||
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrame));
|
||||
KeyFrameCompressed *ckf = (KeyFrameCompressed*)keyFramesCompressed;
|
||||
KeyFrame *kf = (KeyFrame*)newKfs;
|
||||
for(i = 0; i < numFrames; i++){
|
||||
kf->rotation.x = ckf->rot[0]*rotScale;
|
||||
kf->rotation.y = ckf->rot[1]*rotScale;
|
||||
kf->rotation.z = ckf->rot[2]*rotScale;
|
||||
kf->rotation.w = ckf->rot[3]*rotScale;
|
||||
kf->deltaTime = ckf->deltaTime*timeScale;
|
||||
kf++;
|
||||
ckf++;
|
||||
}
|
||||
keyFrames = newKfs;
|
||||
}
|
||||
REGISTER_MEMPTR(&keyFrames);
|
||||
|
||||
RwFree(keyFramesCompressed);
|
||||
keyFramesCompressed = nil;
|
||||
|
||||
POP_MEMID();
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendSequence::CompressKeyframes(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(numFrames == 0)
|
||||
return;
|
||||
|
||||
PUSH_MEMID(MEMID_ANIMATION);
|
||||
|
||||
float rotScale = 4096.0f;
|
||||
float timeScale = 60.0f;
|
||||
float transScale = 1024.0f;
|
||||
if(type & KF_TRANS){
|
||||
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameTransCompressed));
|
||||
KeyFrameTransCompressed *ckf = (KeyFrameTransCompressed*)newKfs;
|
||||
KeyFrameTrans *kf = (KeyFrameTrans*)keyFrames;
|
||||
for(i = 0; i < numFrames; i++){
|
||||
ckf->rot[0] = kf->rotation.x*rotScale;
|
||||
ckf->rot[1] = kf->rotation.y*rotScale;
|
||||
ckf->rot[2] = kf->rotation.z*rotScale;
|
||||
ckf->rot[3] = kf->rotation.w*rotScale;
|
||||
ckf->deltaTime = kf->deltaTime*timeScale + 0.5f;
|
||||
ckf->trans[0] = kf->translation.x*transScale;
|
||||
ckf->trans[1] = kf->translation.y*transScale;
|
||||
ckf->trans[2] = kf->translation.z*transScale;
|
||||
kf++;
|
||||
ckf++;
|
||||
}
|
||||
keyFramesCompressed = newKfs;
|
||||
}else{
|
||||
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameCompressed));
|
||||
KeyFrameCompressed *ckf = (KeyFrameCompressed*)newKfs;
|
||||
KeyFrame *kf = (KeyFrame*)keyFrames;
|
||||
for(i = 0; i < numFrames; i++){
|
||||
ckf->rot[0] = kf->rotation.x*rotScale;
|
||||
ckf->rot[1] = kf->rotation.y*rotScale;
|
||||
ckf->rot[2] = kf->rotation.z*rotScale;
|
||||
ckf->rot[3] = kf->rotation.w*rotScale;
|
||||
ckf->deltaTime = kf->deltaTime*timeScale + 0.5f;
|
||||
kf++;
|
||||
ckf++;
|
||||
}
|
||||
keyFramesCompressed = newKfs;
|
||||
}
|
||||
REGISTER_MEMPTR(&keyFramesCompressed);
|
||||
|
||||
POP_MEMID();
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendSequence::RemoveUncompressedData(void)
|
||||
{
|
||||
if(numFrames == 0)
|
||||
return;
|
||||
CompressKeyframes();
|
||||
RwFree(keyFrames);
|
||||
keyFrames = nil;
|
||||
}
|
||||
|
||||
#ifdef USE_CUSTOM_ALLOCATOR
|
||||
bool
|
||||
CAnimBlendSequence::MoveMemory(void)
|
||||
{
|
||||
if(keyFrames){
|
||||
void *newaddr = gMainHeap.MoveMemory(keyFrames);
|
||||
if(newaddr != keyFrames){
|
||||
keyFrames = newaddr;
|
||||
return true;
|
||||
}
|
||||
}else if(keyFramesCompressed){
|
||||
void *newaddr = gMainHeap.MoveMemory(keyFramesCompressed);
|
||||
if(newaddr != keyFramesCompressed){
|
||||
keyFramesCompressed = newaddr;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
|
||||
#include "Quaternion.h"
|
||||
|
||||
#ifdef MoveMemory
|
||||
#undef MoveMemory // windows shit
|
||||
#endif
|
||||
|
||||
// TODO: put them somewhere else?
|
||||
struct KeyFrame {
|
||||
CQuaternion rotation;
|
||||
@@ -12,6 +16,43 @@ struct KeyFrameTrans : KeyFrame {
|
||||
CVector translation;
|
||||
};
|
||||
|
||||
struct KeyFrameCompressed {
|
||||
int16 rot[4]; // 4096
|
||||
int16 deltaTime; // 60
|
||||
|
||||
void GetRotation(CQuaternion *quat){
|
||||
float scale = 1.0f/4096.0f;
|
||||
quat->x = rot[0]*scale;
|
||||
quat->y = rot[1]*scale;
|
||||
quat->z = rot[2]*scale;
|
||||
quat->w = rot[3]*scale;
|
||||
}
|
||||
void SetRotation(const CQuaternion &quat){
|
||||
rot[0] = quat.x * 4096.0f;
|
||||
rot[1] = quat.y * 4096.0f;
|
||||
rot[2] = quat.z * 4096.0f;
|
||||
rot[3] = quat.w * 4096.0f;
|
||||
}
|
||||
float GetDeltaTime(void) { return deltaTime/60.0f; }
|
||||
void SetTime(float t) { deltaTime = t*60.0f + 0.5f; }
|
||||
};
|
||||
|
||||
struct KeyFrameTransCompressed : KeyFrameCompressed {
|
||||
int16 trans[3]; // 1024
|
||||
|
||||
void GetTranslation(CVector *vec) {
|
||||
float scale = 1.0f/1024.0f;
|
||||
vec->x = trans[0]*scale;
|
||||
vec->y = trans[1]*scale;
|
||||
vec->z = trans[2]*scale;
|
||||
}
|
||||
void SetTranslation(const CVector &vec){
|
||||
trans[0] = vec.x*1024.0f;
|
||||
trans[1] = vec.y*1024.0f;
|
||||
trans[2] = vec.z*1024.0f;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// The sequence of key frames of one animated node
|
||||
class CAnimBlendSequence
|
||||
@@ -24,9 +65,7 @@ public:
|
||||
int32 type;
|
||||
char name[24];
|
||||
int32 numFrames;
|
||||
#ifdef PED_SKIN
|
||||
int16 boneTag;
|
||||
#endif
|
||||
void *keyFrames;
|
||||
void *keyFramesCompressed;
|
||||
|
||||
@@ -40,21 +79,17 @@ public:
|
||||
&((KeyFrameTrans*)keyFrames)[n] :
|
||||
&((KeyFrame*)keyFrames)[n];
|
||||
}
|
||||
KeyFrame *GetKeyFrameCompressed(int n) {
|
||||
KeyFrameCompressed *GetKeyFrameCompressed(int n) {
|
||||
return type & KF_TRANS ?
|
||||
&((KeyFrameTrans*)keyFramesCompressed)[n] :
|
||||
&((KeyFrame*)keyFramesCompressed)[n];
|
||||
&((KeyFrameTransCompressed*)keyFramesCompressed)[n] :
|
||||
&((KeyFrameCompressed*)keyFramesCompressed)[n];
|
||||
}
|
||||
bool HasTranslation(void) { return !!(type & KF_TRANS); }
|
||||
// TODO? these are unused
|
||||
// void Uncompress(void);
|
||||
// void CompressKeyframes(void);
|
||||
// void RemoveUncompressedData(void);
|
||||
void Uncompress(void);
|
||||
void CompressKeyframes(void);
|
||||
void RemoveUncompressedData(void);
|
||||
bool MoveMemory(void);
|
||||
|
||||
#ifdef PED_SKIN
|
||||
void SetBoneTag(int tag) { boneTag = tag; }
|
||||
#endif
|
||||
};
|
||||
#ifndef PED_SKIN
|
||||
VALIDATE_SIZE(CAnimBlendSequence, 0x2C);
|
||||
#endif
|
||||
VALIDATE_SIZE(CAnimBlendSequence, 0x30);
|
||||
|
||||
@@ -287,6 +287,7 @@ AnimAssocDesc aStripAnimDescs[] = {
|
||||
{ ANIM_STRIP_F, ASSOC_REPEAT | ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||
{ ANIM_STRIP_G, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||
};
|
||||
#ifdef PC_PLAYER_CONTROLS
|
||||
AnimAssocDesc aStdAnimDescsSide[] = {
|
||||
{ ANIM_WALK, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION | ASSOC_WALK },
|
||||
{ ANIM_RUN, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION | ASSOC_WALK },
|
||||
@@ -294,7 +295,7 @@ AnimAssocDesc aStdAnimDescsSide[] = {
|
||||
{ ANIM_IDLE_STANCE, ASSOC_REPEAT },
|
||||
{ ANIM_WALK_START, ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION },
|
||||
};
|
||||
|
||||
#endif
|
||||
char const* aStdAnimations[] = {
|
||||
"walk_civi",
|
||||
"run_civi",
|
||||
@@ -834,6 +835,7 @@ char const* aSkateAnimations[] = {
|
||||
"skate_sprint",
|
||||
"skate_idle",
|
||||
};
|
||||
#ifdef PC_PLAYER_CONTROLS
|
||||
char const* aPlayerStrafeBackAnimations[] = {
|
||||
"walk_back",
|
||||
"run_back",
|
||||
@@ -897,7 +899,7 @@ char const* aChainsawStrafeRightAnimations[] = {
|
||||
"idle_csaw",
|
||||
"walkst_csaw_right",
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#define awc(a) ARRAY_SIZE(a), a
|
||||
const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_GROUPS] = {
|
||||
@@ -953,6 +955,7 @@ const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_
|
||||
{ "jogwoman", "ped", MI_COP, awc(aJoggerWomanAnimations), aStdAnimDescs },
|
||||
{ "panicchunky", "ped", MI_COP, awc(aPanicChunkyAnimations), aStdAnimDescs },
|
||||
{ "skate", "skate", MI_COP, awc(aSkateAnimations), aStdAnimDescs },
|
||||
#ifdef PC_PLAYER_CONTROLS
|
||||
{ "playerback", "ped", MI_COP, awc(aPlayerStrafeBackAnimations), aStdAnimDescs },
|
||||
{ "playerleft", "ped", MI_COP, awc(aPlayerStrafeLeftAnimations), aStdAnimDescsSide },
|
||||
{ "playerright", "ped", MI_COP, awc(aPlayerStrafeRightAnimations), aStdAnimDescsSide },
|
||||
@@ -962,6 +965,7 @@ const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_
|
||||
{ "csawback", "ped", MI_COP, awc(aChainsawStrafeBackAnimations), aStdAnimDescs },
|
||||
{ "csawleft", "ped", MI_COP, awc(aChainsawStrafeLeftAnimations), aStdAnimDescsSide },
|
||||
{ "csawright", "ped", MI_COP, awc(aChainsawStrafeRightAnimations), aStdAnimDescsSide },
|
||||
#endif
|
||||
};
|
||||
#undef awc
|
||||
|
||||
@@ -992,7 +996,7 @@ CAnimManager::Shutdown(void)
|
||||
void
|
||||
CAnimManager::UncompressAnimation(CAnimBlendHierarchy *hier)
|
||||
{
|
||||
if(hier->compressed2){
|
||||
if(hier->keepCompressed){
|
||||
if(hier->totalLength == 0.0f)
|
||||
hier->CalcTotalTimeCompressed();
|
||||
}else{
|
||||
@@ -1255,13 +1259,10 @@ CAnimManager::CreateAnimAssocGroups(void)
|
||||
group->firstAnimId = def->animDescs[0].animId;
|
||||
group->CreateAssociations(def->blockName, clump, def->animNames, def->numAnims);
|
||||
for(j = 0; j < group->numAssociations; j++)
|
||||
|
||||
// GetAnimation(i) in III (but it's in LoadAnimFiles), GetAnimation(group->animDesc[j].animId) in VC
|
||||
group->GetAnimation(def->animDescs[j].animId)->flags |= def->animDescs[j].flags;
|
||||
#ifdef PED_SKIN
|
||||
if(IsClumpSkinned(clump))
|
||||
RpClumpForAllAtomics(clump, AtomicRemoveAnimFromSkinCB, nil);
|
||||
#endif
|
||||
RpClumpDestroy(clump);
|
||||
}
|
||||
}
|
||||
@@ -1278,7 +1279,7 @@ CAnimManager::LoadAnimFile(const char *filename)
|
||||
|
||||
//--MIAMI: done
|
||||
void
|
||||
CAnimManager::LoadAnimFile(RwStream *stream, bool compress, char (*somename)[32])
|
||||
CAnimManager::LoadAnimFile(RwStream *stream, bool compress, char (*uncompressedAnims)[32])
|
||||
{
|
||||
#define ROUNDSIZE(x) if((x) & 3) (x) += 4 - ((x)&3)
|
||||
struct IfpHeader {
|
||||
@@ -1323,16 +1324,22 @@ CAnimManager::LoadAnimFile(RwStream *stream, bool compress, char (*somename)[32]
|
||||
RwStreamRead(stream, buf, name.size);
|
||||
hier->SetName(buf);
|
||||
|
||||
// Unimplemented uncompressed anim thing
|
||||
if (somename) {
|
||||
for (int i = 0; somename[i][0]; i++) {
|
||||
if (!CGeneral::faststricmp(somename[i], hier->name))
|
||||
#ifdef ANIM_COMPRESSION
|
||||
bool compressHier = compress;
|
||||
#else
|
||||
bool compressHier = false;
|
||||
#endif
|
||||
if (uncompressedAnims) {
|
||||
for (int i = 0; uncompressedAnims[i][0]; i++) {
|
||||
if (!CGeneral::faststricmp(uncompressedAnims[i], hier->name)){
|
||||
debug("Loading %s uncompressed\n", hier->name);
|
||||
compressHier = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
hier->compressed = false;
|
||||
hier->compressed2 = false;
|
||||
hier->compressed = compressHier;
|
||||
hier->keepCompressed = false;
|
||||
|
||||
// DG info has number of nodes/sequences
|
||||
RwStreamRead(stream, (char*)&dgan, sizeof(IfpHeader));
|
||||
@@ -1352,69 +1359,86 @@ CAnimManager::LoadAnimFile(RwStream *stream, bool compress, char (*somename)[32]
|
||||
ROUNDSIZE(anim.size);
|
||||
RwStreamRead(stream, buf, anim.size);
|
||||
int numFrames = *(int*)(buf+28);
|
||||
#ifdef PED_SKIN
|
||||
seq->SetName(buf);
|
||||
if(anim.size == 44)
|
||||
seq->SetBoneTag(*(int*)(buf+40));
|
||||
#endif
|
||||
seq->SetName(buf);
|
||||
if(numFrames == 0)
|
||||
continue;
|
||||
|
||||
bool hasScale = false;
|
||||
bool hasTranslation = false;
|
||||
RwStreamRead(stream, &info, sizeof(info));
|
||||
if(strncmp(info.ident, "KR00", 4) == 0){
|
||||
seq->SetNumFrames(numFrames, false, false);
|
||||
KeyFrame *kf = seq->GetKeyFrame(0);
|
||||
if (strstr(seq->name, "L Toe"))
|
||||
debug("anim %s has toe keyframes\n", hier->name); // , seq->name);
|
||||
|
||||
for(l = 0; l < numFrames; l++, kf++){
|
||||
RwStreamRead(stream, buf, 0x14);
|
||||
kf->rotation.x = -fbuf[0];
|
||||
kf->rotation.y = -fbuf[1];
|
||||
kf->rotation.z = -fbuf[2];
|
||||
kf->rotation.w = fbuf[3];
|
||||
kf->deltaTime = fbuf[4]; // absolute time here
|
||||
}
|
||||
if(strncmp(info.ident, "KRTS", 4) == 0){
|
||||
hasScale = true;
|
||||
seq->SetNumFrames(numFrames, true, compressHier);
|
||||
}else if(strncmp(info.ident, "KRT0", 4) == 0){
|
||||
seq->SetNumFrames(numFrames, true, false);
|
||||
KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(0);
|
||||
if (strstr(seq->name, "L Toe"))
|
||||
debug("anim %s has toe keyframes\n", hier->name); // , seq->name);
|
||||
hasTranslation = true;
|
||||
seq->SetNumFrames(numFrames, true, compressHier);
|
||||
}else if(strncmp(info.ident, "KR00", 4) == 0){
|
||||
seq->SetNumFrames(numFrames, false, compressHier);
|
||||
}
|
||||
if(strstr(seq->name, "L Toe"))
|
||||
debug("anim %s has toe keyframes\n", hier->name); // BUG: seq->name
|
||||
|
||||
for(l = 0; l < numFrames; l++, kf++){
|
||||
RwStreamRead(stream, buf, 0x20);
|
||||
kf->rotation.x = -fbuf[0];
|
||||
kf->rotation.y = -fbuf[1];
|
||||
kf->rotation.z = -fbuf[2];
|
||||
kf->rotation.w = fbuf[3];
|
||||
kf->translation.x = fbuf[4];
|
||||
kf->translation.y = fbuf[5];
|
||||
kf->translation.z = fbuf[6];
|
||||
kf->deltaTime = fbuf[7]; // absolute time here
|
||||
}
|
||||
}else if(strncmp(info.ident, "KRTS", 4) == 0){
|
||||
seq->SetNumFrames(numFrames, true, false);
|
||||
KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(0);
|
||||
if (strstr(seq->name, "L Toe"))
|
||||
debug("anim %s has toe keyframes\n", hier->name); // , seq->name);
|
||||
|
||||
for(l = 0; l < numFrames; l++, kf++){
|
||||
for(l = 0; l < numFrames; l++){
|
||||
if(hasScale){
|
||||
RwStreamRead(stream, buf, 0x2C);
|
||||
kf->rotation.x = -fbuf[0];
|
||||
kf->rotation.y = -fbuf[1];
|
||||
kf->rotation.z = -fbuf[2];
|
||||
kf->rotation.w = fbuf[3];
|
||||
kf->translation.x = fbuf[4];
|
||||
kf->translation.y = fbuf[5];
|
||||
kf->translation.z = fbuf[6];
|
||||
// scaling ignored
|
||||
kf->deltaTime = fbuf[10]; // absolute time here
|
||||
CQuaternion rot(fbuf[0], fbuf[1], fbuf[2], fbuf[3]);
|
||||
rot.Invert();
|
||||
CVector trans(fbuf[4], fbuf[5], fbuf[6]);
|
||||
|
||||
if(compressHier){
|
||||
KeyFrameTransCompressed *kf = (KeyFrameTransCompressed*)seq->GetKeyFrameCompressed(l);
|
||||
kf->SetRotation(rot);
|
||||
kf->SetTranslation(trans);
|
||||
// scaling ignored
|
||||
kf->SetTime(fbuf[10]); // absolute time here
|
||||
}else{
|
||||
KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(l);
|
||||
kf->rotation = rot;
|
||||
kf->translation = trans;
|
||||
// scaling ignored
|
||||
kf->deltaTime = fbuf[10]; // absolute time here
|
||||
}
|
||||
}else if(hasTranslation){
|
||||
RwStreamRead(stream, buf, 0x20);
|
||||
CQuaternion rot(fbuf[0], fbuf[1], fbuf[2], fbuf[3]);
|
||||
rot.Invert();
|
||||
CVector trans(fbuf[4], fbuf[5], fbuf[6]);
|
||||
|
||||
if(compressHier){
|
||||
KeyFrameTransCompressed *kf = (KeyFrameTransCompressed*)seq->GetKeyFrameCompressed(l);
|
||||
kf->SetRotation(rot);
|
||||
kf->SetTranslation(trans);
|
||||
kf->SetTime(fbuf[7]); // absolute time here
|
||||
}else{
|
||||
KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(l);
|
||||
kf->rotation = rot;
|
||||
kf->translation = trans;
|
||||
kf->deltaTime = fbuf[7]; // absolute time here
|
||||
}
|
||||
}else{
|
||||
RwStreamRead(stream, buf, 0x14);
|
||||
CQuaternion rot(fbuf[0], fbuf[1], fbuf[2], fbuf[3]);
|
||||
rot.Invert();
|
||||
|
||||
if(compressHier){
|
||||
KeyFrameCompressed *kf = (KeyFrameCompressed*)seq->GetKeyFrameCompressed(l);
|
||||
kf->SetRotation(rot);
|
||||
kf->SetTime(fbuf[4]); // absolute time here
|
||||
}else{
|
||||
KeyFrame *kf = (KeyFrame*)seq->GetKeyFrame(l);
|
||||
kf->rotation = rot;
|
||||
kf->deltaTime = fbuf[4]; // absolute time here
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
hier->RemoveQuaternionFlips();
|
||||
hier->CalcTotalTime();
|
||||
if(!compressHier){
|
||||
hier->RemoveQuaternionFlips();
|
||||
hier->CalcTotalTime();
|
||||
}
|
||||
}
|
||||
if(animIndex > ms_numAnimations)
|
||||
ms_numAnimations = animIndex;
|
||||
|
||||
@@ -57,6 +57,7 @@ enum AssocGroupId
|
||||
ASSOCGRP_JOGWOMAN,
|
||||
ASSOCGRP_PANICCHUNKY,
|
||||
ASSOCGRP_SKATE,
|
||||
#ifdef PC_PLAYER_CONTROLS
|
||||
ASSOCGRP_PLAYERBACK,
|
||||
ASSOCGRP_PLAYERLEFT,
|
||||
ASSOCGRP_PLAYERRIGHT,
|
||||
@@ -66,6 +67,7 @@ enum AssocGroupId
|
||||
ASSOCGRP_CHAINSAWBACK,
|
||||
ASSOCGRP_CHAINSAWLEFT,
|
||||
ASSOCGRP_CHAINSAWRIGHT,
|
||||
#endif
|
||||
|
||||
NUM_ANIM_ASSOC_GROUPS
|
||||
};
|
||||
@@ -136,7 +138,7 @@ public:
|
||||
static CAnimBlendAssociation *BlendAnimation(RpClump *clump, AssocGroupId groupId, AnimationId animId, float delta);
|
||||
static void LoadAnimFiles(void);
|
||||
static void LoadAnimFile(const char *filename);
|
||||
static void LoadAnimFile(RwStream *stream, bool compress, char (*somename)[32] = nil);
|
||||
static void LoadAnimFile(RwStream *stream, bool compress, char (*uncompressedAnims)[32] = nil);
|
||||
static void CreateAnimAssocGroups(void);
|
||||
static void RemoveLastAnimFile(void);
|
||||
static CAnimBlendAssocGroup* GetAnimAssocGroups(void) { return ms_aAnimAssocGroups; }
|
||||
|
||||
@@ -291,12 +291,15 @@ CCutsceneMgr::SetupCutsceneToStart(void)
|
||||
if (ms_pCutsceneObjects[i]->m_pAttachTo != nil) {
|
||||
pAnimBlendAssoc->flags &= (~ASSOC_HAS_TRANSLATION);
|
||||
} else {
|
||||
KeyFrameTrans* keyFrames;
|
||||
if (pAnimBlendAssoc->hierarchy->IsCompressed())
|
||||
keyFrames = ((KeyFrameTrans*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrameCompressed(0));
|
||||
else
|
||||
keyFrames = ((KeyFrameTrans*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrame(0));
|
||||
ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + keyFrames->translation);
|
||||
if (pAnimBlendAssoc->hierarchy->IsCompressed()){
|
||||
KeyFrameTransCompressed *keyFrames = ((KeyFrameTransCompressed*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrameCompressed(0));
|
||||
CVector trans;
|
||||
keyFrames->GetTranslation(&trans);
|
||||
ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + trans);
|
||||
}else{
|
||||
KeyFrameTrans *keyFrames = ((KeyFrameTrans*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrame(0));
|
||||
ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + keyFrames->translation);
|
||||
}
|
||||
}
|
||||
pAnimBlendAssoc->SetRun();
|
||||
} else {
|
||||
@@ -331,7 +334,7 @@ CCutsceneMgr::SetCutsceneAnim(const char *animName, CObject *pObject)
|
||||
}
|
||||
|
||||
if (pNewAnim->hierarchy->IsCompressed())
|
||||
pNewAnim->hierarchy->compressed2 = true;
|
||||
pNewAnim->hierarchy->keepCompressed = true;
|
||||
|
||||
CStreaming::ImGonnaUseStreamingMemory();
|
||||
pNewAnim = ms_cutsceneAssociations.CopyAnimation(animName);
|
||||
@@ -344,8 +347,8 @@ CCutsceneMgr::SetCutsceneAnim(const char *animName, CObject *pObject)
|
||||
pAnimBlendClumpData = *RPANIMBLENDCLUMPDATA(pObject->m_rwObject);
|
||||
pAnimBlendClumpData->link.Prepend(&pNewAnim->link);
|
||||
|
||||
if (pNewAnim->hierarchy->compressed2)
|
||||
pAnimBlendClumpData->frames->flag |= AnimBlendFrameData::UNK_COMPRESSED;
|
||||
if (pNewAnim->hierarchy->keepCompressed)
|
||||
pAnimBlendClumpData->frames->flag |= AnimBlendFrameData::COMPRESSED;
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -19,6 +19,9 @@ void FrameUpdateCallBackSkinned(AnimBlendFrameData *frame, void *arg);
|
||||
void FrameUpdateCallBackWithVelocityExtractionSkinned(AnimBlendFrameData *frame, void *arg);
|
||||
void FrameUpdateCallBackWith3dVelocityExtractionSkinned(AnimBlendFrameData *frame, void *arg);
|
||||
|
||||
void FrameUpdateCallBackNonSkinnedCompressed(AnimBlendFrameData *frame, void *arg);
|
||||
void FrameUpdateCallBackSkinnedCompressed(AnimBlendFrameData *frame, void *arg);
|
||||
|
||||
void
|
||||
FrameUpdateCallBackNonSkinned(AnimBlendFrameData *frame, void *arg)
|
||||
{
|
||||
@@ -446,3 +449,222 @@ FrameUpdateCallBackOffscreen(AnimBlendFrameData *frame, void *arg)
|
||||
if(frame->flag & AnimBlendFrameData::VELOCITY_EXTRACTION && gpAnimBlendClump->velocity)
|
||||
FrameUpdateCallBackWithVelocityExtractionSkinned(frame, arg);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
FrameUpdateCallBackNonSkinnedCompressed(AnimBlendFrameData *frame, void *arg)
|
||||
{
|
||||
CVector vec, pos(0.0f, 0.0f, 0.0f);
|
||||
CQuaternion q, rot(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
float totalBlendAmount = 0.0f;
|
||||
CVector trans(0.0f, 0.0f, 0.0f);
|
||||
CVector cur(0.0f, 0.0f, 0.0f);
|
||||
CVector end(0.0f, 0.0f, 0.0f);
|
||||
bool looped = false;
|
||||
RwMatrix *mat = RwFrameGetMatrix(frame->frame);
|
||||
CAnimBlendNode **node;
|
||||
AnimBlendFrameUpdateData *updateData = (AnimBlendFrameUpdateData*)arg;
|
||||
|
||||
if(frame->flag & AnimBlendFrameData::VELOCITY_EXTRACTION &&
|
||||
gpAnimBlendClump->velocity){
|
||||
if(updateData->foobar)
|
||||
for(node = updateData->nodes; *node; node++)
|
||||
if((*node)->sequence && (*node)->association->IsPartial())
|
||||
totalBlendAmount += (*node)->association->blendAmount;
|
||||
|
||||
for(node = updateData->nodes; *node; node++)
|
||||
if((*node)->sequence && (*node)->sequence->HasTranslation()){
|
||||
if((*node)->association->HasTranslation()){
|
||||
(*node)->GetCurrentTranslationCompressed(vec, 1.0f-totalBlendAmount);
|
||||
cur += vec;
|
||||
}
|
||||
}
|
||||
|
||||
for(node = updateData->nodes; *node; node++){
|
||||
if((*node)->sequence){
|
||||
bool nodelooped = (*node)->UpdateCompressed(vec, q, 1.0f-totalBlendAmount);
|
||||
#ifdef FIX_BUGS
|
||||
if(DotProduct(rot, q) < 0.0f)
|
||||
rot -= q;
|
||||
else
|
||||
#endif
|
||||
rot += q;
|
||||
if((*node)->sequence->HasTranslation()){
|
||||
pos += vec;
|
||||
if((*node)->association->HasTranslation()){
|
||||
trans += vec;
|
||||
looped |= nodelooped;
|
||||
if(nodelooped){
|
||||
(*node)->GetEndTranslationCompressed(vec, 1.0f-totalBlendAmount);
|
||||
end += vec;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
++*node;
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_ROTATION) == 0){
|
||||
RwMatrixSetIdentity(mat);
|
||||
rot.Normalise();
|
||||
rot.Get(mat);
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
|
||||
*gpAnimBlendClump->velocity = trans - cur;
|
||||
if(looped)
|
||||
*gpAnimBlendClump->velocity += end;
|
||||
mat->pos.x = (pos - trans).x + frame->resetPos.x;
|
||||
mat->pos.y = (pos - trans).y + frame->resetPos.y;
|
||||
mat->pos.z = (pos - trans).z + frame->resetPos.z;
|
||||
}
|
||||
RwMatrixUpdate(mat);
|
||||
}else{
|
||||
if(updateData->foobar)
|
||||
for(node = updateData->nodes; *node; node++)
|
||||
if((*node)->sequence && (*node)->association->IsPartial())
|
||||
totalBlendAmount += (*node)->association->blendAmount;
|
||||
|
||||
for(node = updateData->nodes; *node; node++){
|
||||
if((*node)->sequence){
|
||||
(*node)->UpdateCompressed(vec, q, 1.0f-totalBlendAmount);
|
||||
if((*node)->sequence->HasTranslation())
|
||||
pos += vec;
|
||||
#ifdef FIX_BUGS
|
||||
if(DotProduct(rot, q) < 0.0f)
|
||||
rot -= q;
|
||||
else
|
||||
#endif
|
||||
rot += q;
|
||||
}
|
||||
++*node;
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_ROTATION) == 0){
|
||||
RwMatrixSetIdentity(mat);
|
||||
rot.Normalise();
|
||||
rot.Get(mat);
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
|
||||
mat->pos.x = pos.x;
|
||||
mat->pos.y = pos.y;
|
||||
mat->pos.z = pos.z;
|
||||
mat->pos.x += frame->resetPos.x;
|
||||
mat->pos.y += frame->resetPos.y;
|
||||
mat->pos.z += frame->resetPos.z;
|
||||
}
|
||||
RwMatrixUpdate(mat);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
FrameUpdateCallBackSkinnedCompressed(AnimBlendFrameData *frame, void *arg)
|
||||
{
|
||||
CVector vec, pos(0.0f, 0.0f, 0.0f);
|
||||
CQuaternion q, rot(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
float totalBlendAmount = 0.0f;
|
||||
CVector trans(0.0f, 0.0f, 0.0f);
|
||||
CVector cur(0.0f, 0.0f, 0.0f);
|
||||
CVector end(0.0f, 0.0f, 0.0f);
|
||||
bool looped = false;
|
||||
RpHAnimStdInterpFrame *xform = frame->hanimFrame;
|
||||
CAnimBlendNode **node;
|
||||
AnimBlendFrameUpdateData *updateData = (AnimBlendFrameUpdateData*)arg;
|
||||
|
||||
if(frame->flag & AnimBlendFrameData::VELOCITY_EXTRACTION &&
|
||||
gpAnimBlendClump->velocity){
|
||||
if(updateData->foobar)
|
||||
for(node = updateData->nodes; *node; node++)
|
||||
if((*node)->sequence && (*node)->association->IsPartial())
|
||||
totalBlendAmount += (*node)->association->blendAmount;
|
||||
|
||||
for(node = updateData->nodes; *node; node++)
|
||||
if((*node)->sequence && (*node)->sequence->HasTranslation()){
|
||||
if((*node)->association->HasTranslation()){
|
||||
(*node)->GetCurrentTranslationCompressed(vec, 1.0f-totalBlendAmount);
|
||||
cur += vec;
|
||||
}
|
||||
}
|
||||
|
||||
for(node = updateData->nodes; *node; node++){
|
||||
if((*node)->sequence){
|
||||
bool nodelooped = (*node)->UpdateCompressed(vec, q, 1.0f-totalBlendAmount);
|
||||
#ifdef FIX_BUGS
|
||||
if(DotProduct(rot, q) < 0.0f)
|
||||
rot -= q;
|
||||
else
|
||||
#endif
|
||||
rot += q;
|
||||
if((*node)->sequence->HasTranslation()){
|
||||
pos += vec;
|
||||
if((*node)->association->HasTranslation()){
|
||||
trans += vec;
|
||||
looped |= nodelooped;
|
||||
if(nodelooped){
|
||||
(*node)->GetEndTranslationCompressed(vec, 1.0f-totalBlendAmount);
|
||||
end += vec;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
++*node;
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_ROTATION) == 0){
|
||||
rot.Normalise();
|
||||
xform->q.imag.x = rot.x;
|
||||
xform->q.imag.y = rot.y;
|
||||
xform->q.imag.z = rot.z;
|
||||
xform->q.real = rot.w;
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
|
||||
*gpAnimBlendClump->velocity = trans - cur;
|
||||
if(looped)
|
||||
*gpAnimBlendClump->velocity += end;
|
||||
xform->t.x = (pos - trans).x + frame->resetPos.x;
|
||||
xform->t.y = (pos - trans).y + frame->resetPos.y;
|
||||
xform->t.z = (pos - trans).z + frame->resetPos.z;
|
||||
}
|
||||
}else{
|
||||
float transBlendAmount = 0.0f;
|
||||
|
||||
if(updateData->foobar)
|
||||
for(node = updateData->nodes; *node; node++)
|
||||
if((*node)->sequence && (*node)->association->IsPartial())
|
||||
totalBlendAmount += (*node)->association->blendAmount;
|
||||
|
||||
for(node = updateData->nodes; *node; node++){
|
||||
if((*node)->sequence){
|
||||
(*node)->UpdateCompressed(vec, q, 1.0f-totalBlendAmount);
|
||||
if((*node)->sequence->HasTranslation()){
|
||||
pos += vec;
|
||||
transBlendAmount += (*node)->association->blendAmount;
|
||||
}
|
||||
if(DotProduct(rot, q) < 0.0f)
|
||||
rot -= q;
|
||||
else
|
||||
rot += q;
|
||||
}
|
||||
++*node;
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_ROTATION) == 0){
|
||||
rot.Normalise();
|
||||
xform->q.imag.x = rot.x;
|
||||
xform->q.imag.y = rot.y;
|
||||
xform->q.imag.z = rot.z;
|
||||
xform->q.real = rot.w;
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
|
||||
xform->t.x = transBlendAmount*pos.x;
|
||||
xform->t.y = transBlendAmount*pos.y;
|
||||
xform->t.z = transBlendAmount*pos.z;
|
||||
xform->t.x += (1.0f-transBlendAmount)*frame->resetPos.x;
|
||||
xform->t.y += (1.0f-transBlendAmount)*frame->resetPos.y;
|
||||
xform->t.z += (1.0f-transBlendAmount)*frame->resetPos.z;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "AnimBlendClumpData.h"
|
||||
#include "AnimBlendHierarchy.h"
|
||||
#include "AnimBlendAssociation.h"
|
||||
#include "AnimManager.h"
|
||||
#include "RpAnimBlend.h"
|
||||
#include "PedModelInfo.h"
|
||||
|
||||
@@ -443,6 +444,9 @@ RpAnimBlendNodeUpdateKeyframes(AnimBlendFrameData *frames, AnimBlendFrameUpdateD
|
||||
}
|
||||
}
|
||||
|
||||
// TODO:
|
||||
// CAnimBlendClumpData::LoadFramesIntoSPR
|
||||
// CAnimBlendClumpData::ForAllFramesInSPR
|
||||
void
|
||||
RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta, bool doRender)
|
||||
{
|
||||
@@ -466,7 +470,7 @@ RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta, bool doRender)
|
||||
assoc = CAnimBlendAssociation::FromLink(link);
|
||||
if(assoc->UpdateBlend(timeDelta)){
|
||||
if(assoc->hierarchy->sequences){
|
||||
//CAnimManager::UncompressAnimation(v6->hierarchy)
|
||||
CAnimManager::UncompressAnimation(assoc->hierarchy);
|
||||
if(i < 11)
|
||||
updateData.nodes[i++] = assoc->GetNode(0);
|
||||
if(assoc->flags & ASSOC_MOVEMENT){
|
||||
@@ -486,6 +490,14 @@ RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta, bool doRender)
|
||||
|
||||
updateData.nodes[i] = nil;
|
||||
|
||||
#ifdef ANIM_COMPRESSION
|
||||
if(clumpData->frames[0].flag & AnimBlendFrameData::COMPRESSED){
|
||||
if(IsClumpSkinned(clump))
|
||||
clumpData->ForAllFrames(FrameUpdateCallBackSkinnedCompressed, &updateData);
|
||||
else
|
||||
clumpData->ForAllFrames(FrameUpdateCallBackNonSkinnedCompressed, &updateData);
|
||||
}else
|
||||
#endif
|
||||
if(doRender){
|
||||
if(clumpData->frames[0].flag & AnimBlendFrameData::UPDATE_KEYFRAMES)
|
||||
RpAnimBlendNodeUpdateKeyframes(clumpData->frames, &updateData, clumpData->numFrames);
|
||||
|
||||
@@ -43,3 +43,6 @@ extern CAnimBlendClumpData *gpAnimBlendClump;
|
||||
void FrameUpdateCallBackNonSkinned(AnimBlendFrameData *frame, void *arg);
|
||||
void FrameUpdateCallBackSkinned(AnimBlendFrameData *frame, void *arg);
|
||||
void FrameUpdateCallBackOffscreen(AnimBlendFrameData *frame, void *arg);
|
||||
|
||||
void FrameUpdateCallBackNonSkinnedCompressed(AnimBlendFrameData *frame, void *arg);
|
||||
void FrameUpdateCallBackSkinnedCompressed(AnimBlendFrameData *frame, void *arg);
|
||||
|
||||
@@ -71,31 +71,33 @@ cAudioManager::GetCollisionOneShotRatio(int32 a, float b) const
|
||||
case SURFACE_TARMAC:
|
||||
case SURFACE_PAVEMENT:
|
||||
case SURFACE_STEEP_CLIFF:
|
||||
case SURFACE_TRANSPARENT_STONE: result = GetCollisionRatio(b, 10.f, 60.f, 50.f); break;
|
||||
case SURFACE_TRANSPARENT_STONE:
|
||||
case SURFACE_CONCRETE_BEACH: result = GetCollisionRatio(b, 10.f, 60.f, 50.f); break;
|
||||
case SURFACE_GRASS:
|
||||
case SURFACE_GRAVEL:
|
||||
case SURFACE_MUD_DRY:
|
||||
case SURFACE_CARDBOARDBOX: result = GetCollisionRatio(b, 0.f, 2.f, 2.f); break;
|
||||
case SURFACE_GRAVEL: result = GetCollisionRatio(b, 0.f, 2.f, 2.f); break;
|
||||
case SURFACE_MUD_DRY: result = GetCollisionRatio(b, 0.f, 2.f, 2.f); break;
|
||||
case SURFACE_CAR: result = GetCollisionRatio(b, 6.f, 50.f, 44.f); break;
|
||||
case SURFACE_GLASS: result = GetCollisionRatio(b, 0.1f, 10.f, 9.9f); break;
|
||||
case SURFACE_GLASS:
|
||||
case SURFACE_METAL_CHAIN_FENCE: result = GetCollisionRatio(b, 0.1f, 10.f, 9.9f); break;
|
||||
case SURFACE_TRANSPARENT_CLOTH:
|
||||
case SURFACE_THICK_METAL_PLATE: result = GetCollisionRatio(b, 30.f, 130.f, 100.f); break;
|
||||
case SURFACE_GARAGE_DOOR: result = GetCollisionRatio(b, 20.f, 100.f, 80.f); break;
|
||||
case SURFACE_CAR_PANEL: result = GetCollisionRatio(b, 0.f, 4.f, 4.f); break;
|
||||
case SURFACE_SCAFFOLD_POLE:
|
||||
case SURFACE_METAL_GATE: result = GetCollisionRatio(b, 1.f, 10.f, 9.f); break;
|
||||
case SURFACE_METAL_GATE:
|
||||
case SURFACE_LAMP_POST: result = GetCollisionRatio(b, 1.f, 10.f, 9.f); break;
|
||||
case SURFACE_FIRE_HYDRANT: result = GetCollisionRatio(b, 1.f, 15.f, 14.f); break;
|
||||
case SURFACE_GIRDER: result = GetCollisionRatio(b, 8.f, 50.f, 42.f); break;
|
||||
case SURFACE_METAL_CHAIN_FENCE: result = GetCollisionRatio(b, 0.1f, 10.f, 9.9f); break;
|
||||
case SURFACE_PED: result = GetCollisionRatio(b, 0.f, 20.f, 20.f); break;
|
||||
case SURFACE_SAND: result = GetCollisionRatio(b, 0.f, 10.f, 10.f); break;
|
||||
case SURFACE_WATER: result = GetCollisionRatio(b, 0.f, 10.f, 10.f); break;
|
||||
case SURFACE_SAND:
|
||||
case SURFACE_WATER:
|
||||
case SURFACE_RUBBER:
|
||||
case SURFACE_WHEELBASE:
|
||||
case SURFACE_SAND_BEACH: result = GetCollisionRatio(b, 0.f, 10.f, 10.f); break;
|
||||
case SURFACE_WOOD_CRATES: result = GetCollisionRatio(b, 1.f, 4.f, 3.f); break;
|
||||
case SURFACE_WOOD_BENCH: result = GetCollisionRatio(b, 0.1f, 5.f, 4.9f); break;
|
||||
case SURFACE_WOOD_SOLID: result = GetCollisionRatio(b, 0.1f, 40.f, 39.9f); break;
|
||||
case SURFACE_RUBBER:
|
||||
case SURFACE_WHEELBASE: result = GetCollisionRatio(b, 0.f, 10.f, 10.f); break;
|
||||
case SURFACE_PLASTIC: result = GetCollisionRatio(b, 0.1f, 4.f, 3.9f); break;
|
||||
case SURFACE_HEDGE: result = GetCollisionRatio(b, 0.f, 0.5f, 0.5f); break;
|
||||
case SURFACE_CONTAINER: result = GetCollisionRatio(b, 4.f, 40.f, 36.f); break;
|
||||
@@ -135,8 +137,8 @@ cAudioManager::SetLoopingCollisionRequestedSfxFreqAndGetVol(const cAudioCollisio
|
||||
m_sQueueSample.m_nSampleIndex = SFX_BOAT_WATER_LOOP;
|
||||
m_sQueueSample.m_nFrequency = 6050.f * ratio + 16000;
|
||||
vol = 30.f * ratio;
|
||||
} else if(surface1 == SURFACE_GRAVEL || surface2 == SURFACE_GRAVEL || surface1 == SURFACE_MUD_DRY ||
|
||||
surface2 == SURFACE_MUD_DRY || surface1 == SURFACE_SAND || surface2 == SURFACE_SAND) {
|
||||
} else if(surface1 == SURFACE_GRAVEL || surface2 == SURFACE_GRAVEL || surface1 == SURFACE_MUD_DRY || surface2 == SURFACE_MUD_DRY ||
|
||||
surface1 == SURFACE_SAND || surface2 == SURFACE_SAND || surface1 == SURFACE_SAND_BEACH || surface2 == SURFACE_SAND_BEACH) {
|
||||
ratio = GetCollisionRatio(audioCollision.m_fIntensity2, 0.0001f, 0.09f, 0.0899f);
|
||||
m_sQueueSample.m_nSampleIndex = SFX_GRAVEL_SKID;
|
||||
m_sQueueSample.m_nFrequency = 6000.f * ratio + 10000;
|
||||
@@ -156,12 +158,12 @@ cAudioManager::SetLoopingCollisionRequestedSfxFreqAndGetVol(const cAudioCollisio
|
||||
void
|
||||
cAudioManager::SetUpLoopingCollisionSound(const cAudioCollision &col, uint8 counter)
|
||||
{
|
||||
bool distCalculated = false;
|
||||
if(col.m_fIntensity2 > 0.0016f) {
|
||||
uint8 emittingVol = SetLoopingCollisionRequestedSfxFreqAndGetVol(col);
|
||||
if(emittingVol) {
|
||||
m_sQueueSample.m_fDistance = Sqrt(col.m_fDistance);
|
||||
m_sQueueSample.m_nVolume =
|
||||
ComputeVolume(emittingVol, CollisionSoundIntensity, m_sQueueSample.m_fDistance);
|
||||
CalculateDistance(distCalculated, m_sQueueSample.m_fDistance);
|
||||
m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, CollisionSoundIntensity, m_sQueueSample.m_fDistance);
|
||||
if(m_sQueueSample.m_nVolume) {
|
||||
m_sQueueSample.m_nCounter = counter;
|
||||
m_sQueueSample.m_vecPos = col.m_vecPosition;
|
||||
@@ -266,7 +268,7 @@ cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
|
||||
m_sQueueSample.m_nSampleIndex += m_anRandomTable[3] % 4;
|
||||
break;
|
||||
case SFX_COL_PED_1:
|
||||
m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] % 5;
|
||||
m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] % 2;
|
||||
break;
|
||||
case SFX_COL_WOOD_CRATES_1:
|
||||
m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] % 4;
|
||||
|
||||
+1174
-792
File diff suppressed because it is too large
Load Diff
@@ -20,7 +20,7 @@ const int allChannels = channels + 2;
|
||||
cAudioManager::cAudioManager()
|
||||
{
|
||||
m_bIsInitialised = false;
|
||||
field_1 = 1;
|
||||
m_bReverb = true;
|
||||
m_fSpeedOfSound = 6.86f;
|
||||
m_nTimeSpent = 50;
|
||||
m_nActiveSamples = NUM_SOUNDS_SAMPLES_SLOTS;
|
||||
@@ -128,7 +128,7 @@ cAudioManager::CreateEntity(eAudioType type, void *entity)
|
||||
for (uint32 i = 0; i < ARRAY_SIZE(m_asAudioEntities); i++) {
|
||||
if (!m_asAudioEntities[i].m_bIsUsed) {
|
||||
m_asAudioEntities[i].m_bIsUsed = true;
|
||||
m_asAudioEntities[i].m_nStatus = 0;
|
||||
m_asAudioEntities[i].m_bStatus = false;
|
||||
m_asAudioEntities[i].m_nType = type;
|
||||
m_asAudioEntities[i].m_pEntity = entity;
|
||||
m_asAudioEntities[i].m_awAudioEvent[0] = SOUND_NO_SOUND;
|
||||
@@ -163,11 +163,11 @@ void
|
||||
cAudioManager::SetEntityStatus(int32 id, uint8 status)
|
||||
{
|
||||
if (m_bIsInitialised && id >= 0 && id < NUM_AUDIOENTITIES && m_asAudioEntities[id].m_bIsUsed)
|
||||
m_asAudioEntities[id].m_nStatus = status;
|
||||
m_asAudioEntities[id].m_bStatus = status;
|
||||
}
|
||||
|
||||
void
|
||||
cAudioManager::PlayOneShot(int32 index, int16 sound, float vol)
|
||||
cAudioManager::PlayOneShot(int32 index, uint16 sound, float vol)
|
||||
{
|
||||
static const uint8 OneShotPriority[] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 2, 5, 5, 3, 5, 2, 2, 1, 1, 3, 1, 3, 3, 1, 1, 1, 1, 4, 4, 4, 3, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 3, 4, 2, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0,
|
||||
@@ -426,7 +426,8 @@ cAudioManager::CheckForAnAudioFileOnCD() const
|
||||
uint8
|
||||
cAudioManager::GetCDAudioDriveLetter() const
|
||||
{
|
||||
return SampleManager.GetCDAudioDriveLetter();
|
||||
if(m_bIsInitialised) return SampleManager.GetCDAudioDriveLetter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -456,7 +457,7 @@ cAudioManager::ServiceSoundEffects()
|
||||
ClearActiveSamples();
|
||||
}
|
||||
m_nActiveSampleQueue = m_nActiveSampleQueue == 1 ? 0 : 1;
|
||||
ProcessReverb();
|
||||
if(m_bReverb) ProcessReverb();
|
||||
ProcessSpecial();
|
||||
ClearRequestedQueue();
|
||||
InterrogateAudioEntities();
|
||||
@@ -802,7 +803,7 @@ cAudioManager::AddReleasingSounds()
|
||||
if (sample.m_nReleasingVolumeModificator < 20)
|
||||
++sample.m_nReleasingVolumeModificator;
|
||||
}
|
||||
sample.m_bReleasingSoundFlag = 0;
|
||||
sample.m_bReleasingSoundFlag = false;
|
||||
}
|
||||
memcpy(&m_sQueueSample, &sample, sizeof(tSound));
|
||||
AddSampleToRequestedQueue();
|
||||
|
||||
+106
-85
@@ -49,7 +49,7 @@ public:
|
||||
eAudioType m_nType;
|
||||
void *m_pEntity;
|
||||
bool m_bIsUsed;
|
||||
uint8 m_nStatus;
|
||||
uint8 m_bStatus;
|
||||
int16 m_awAudioEvent[NUM_AUDIOENTITY_EVENTS];
|
||||
float m_afVolume[NUM_AUDIOENTITY_EVENTS];
|
||||
uint8 m_AudioEvents;
|
||||
@@ -144,21 +144,39 @@ public:
|
||||
bool m_bDistanceCalculated;
|
||||
float m_fDistance;
|
||||
CPed *m_pPed;
|
||||
|
||||
cPedParams()
|
||||
{
|
||||
m_bDistanceCalculated = false;
|
||||
m_fDistance = 0.0f;
|
||||
m_pPed = nil;
|
||||
}
|
||||
};
|
||||
|
||||
class cVehicleParams
|
||||
{
|
||||
public:
|
||||
eVehicleType m_VehicleType;
|
||||
int32 m_VehicleType;
|
||||
bool m_bDistanceCalculated;
|
||||
float m_fDistance;
|
||||
CVehicle *m_pVehicle;
|
||||
cTransmission *m_pTransmission;
|
||||
int32 m_nIndex;
|
||||
float m_fVelocityChange;
|
||||
|
||||
cVehicleParams()
|
||||
{
|
||||
m_VehicleType = -1;
|
||||
m_bDistanceCalculated = false;
|
||||
m_fDistance = 0.0f;
|
||||
m_pVehicle = nil;
|
||||
m_pTransmission = nil;
|
||||
m_nIndex = 0;
|
||||
m_fVelocityChange = 0.0f;
|
||||
}
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(cVehicleParams, 0x18);
|
||||
VALIDATE_SIZE(cVehicleParams, 0x1C);
|
||||
|
||||
enum {
|
||||
REFLECTION_NORTH = 0,
|
||||
@@ -176,7 +194,7 @@ class cAudioManager
|
||||
{
|
||||
public:
|
||||
bool m_bIsInitialised;
|
||||
uint8 field_1; // unused
|
||||
uint8 m_bReverb; // unused
|
||||
bool m_bFifthFrameFlag;
|
||||
uint8 m_nActiveSamples;
|
||||
uint8 field_4; // unused
|
||||
@@ -256,8 +274,8 @@ public:
|
||||
uint8 ComputeVolume(uint8 emittingVolume, float soundIntensity, float distance) const; // done
|
||||
int32 CreateEntity(eAudioType type, void *entity); // done
|
||||
|
||||
void DestroyAllGameCreatedEntities(); // done ? I don't seed pEntity = nil;
|
||||
void DestroyEntity(int32 id); // done (inlined in vc) ? I not seen id checks
|
||||
void DestroyAllGameCreatedEntities(); // done
|
||||
void DestroyEntity(int32 id); // done (inlined in vc)
|
||||
void DoPoliceRadioCrackle(); // done
|
||||
|
||||
// functions returning talk sfx,
|
||||
@@ -359,38 +377,39 @@ public:
|
||||
uint32 GetGenericFemaleTalkSfx(CPed *ped, int16 sound); // todo names (inlined in vc)
|
||||
// end of functions returning talk sfx
|
||||
|
||||
void GenerateIntegerRandomNumberTable(); // done
|
||||
char *Get3DProviderName(uint8 id) const;
|
||||
uint8 GetCDAudioDriveLetter() const;
|
||||
int8 GetCurrent3DProviderIndex() const;
|
||||
int8 AutoDetect3DProviders() const; // done
|
||||
float GetCollisionLoopingRatio(uint32 a, uint32 b, float c) const; // not used
|
||||
float GetCollisionOneShotRatio(int32 a, float b) const;
|
||||
float GetCollisionRatio(float a, float b, float c, float d) const;
|
||||
float GetDistanceSquared(const CVector &v) const; // done (inlined in vc)
|
||||
int32 GetJumboTaxiFreq() const;
|
||||
uint8 GetMissionAudioLoadingStatus(uint8 slot) const; // done
|
||||
int8 GetMissionScriptPoliceAudioPlayingStatus() const;
|
||||
uint8 GetNum3DProvidersAvailable() const; // done
|
||||
uint32 GetPedCommentSfx(CPed *ped, int32 sound);
|
||||
void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset) const;
|
||||
float GetVehicleDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, float gasPedalAudio, cTransmission* transmission, float velocityChange); // done
|
||||
float GetVehicleNonDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, cTransmission* transmission, float velocityChange); // done
|
||||
void GenerateIntegerRandomNumberTable(); // done
|
||||
char *Get3DProviderName(uint8 id) const; // done
|
||||
uint8 GetCDAudioDriveLetter() const; // done
|
||||
int8 GetCurrent3DProviderIndex() const; // done
|
||||
int8 AutoDetect3DProviders() const; // done
|
||||
float GetCollisionLoopingRatio(uint32 a, uint32 b, float c) const; // not used
|
||||
float GetCollisionOneShotRatio(int32 a, float b) const; // done
|
||||
float GetCollisionRatio(float a, float b, float c, float d) const; // done (inlined in vc)
|
||||
float GetDistanceSquared(const CVector &v) const; // done (inlined in vc)
|
||||
int32 GetJumboTaxiFreq() const; // done (inlined in vc)
|
||||
uint8 GetMissionAudioLoadingStatus(uint8 slot) const; // done
|
||||
int8 GetMissionScriptPoliceAudioPlayingStatus() const; // done
|
||||
uint8 GetNum3DProvidersAvailable() const; // done
|
||||
uint32 GetPedCommentSfx(CPed *ped, int32 sound); // done
|
||||
void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset) const; // done
|
||||
float GetVehicleDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission,
|
||||
float velocityChange); // done
|
||||
float GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, cTransmission *transmission, float velocityChange); // done
|
||||
|
||||
bool HasAirBrakes(int32 model) const; // done
|
||||
|
||||
void Initialise(); // done
|
||||
void InitialisePoliceRadio(); //done
|
||||
void InitialisePoliceRadioZones(); //done
|
||||
void InterrogateAudioEntities(); // done
|
||||
bool IsAudioInitialised() const; // done
|
||||
void Initialise(); // done
|
||||
void InitialisePoliceRadio(); // done
|
||||
void InitialisePoliceRadioZones(); // done
|
||||
void InterrogateAudioEntities(); // done (inlined)
|
||||
bool IsAudioInitialised() const; // done
|
||||
bool IsMissionAudioSampleFinished(uint8 slot); // done
|
||||
bool IsMP3RadioChannelAvailable() const; // done
|
||||
bool IsMP3RadioChannelAvailable() const; // done
|
||||
|
||||
bool MissionScriptAudioUsesPoliceChannel(int32 soundMission) const; //done
|
||||
|
||||
void PlayLoadedMissionAudio(uint8 slot); // done
|
||||
void PlayOneShot(int32 index, int16 sound, float vol); // done
|
||||
void PlayOneShot(int32 index, uint16 sound, float vol); // done
|
||||
void PlaySuspectLastSeen(float x, float y, float z); // done
|
||||
void PlayerJustGotInCar() const; // done
|
||||
void PlayerJustLeftCar() const; // done
|
||||
@@ -403,7 +422,7 @@ public:
|
||||
void ProcessActiveQueues(); // done
|
||||
bool ProcessAirBrakes(cVehicleParams& params); // done
|
||||
bool ProcessBoatEngine(cVehicleParams& params);
|
||||
bool ProcessBoatMovingOverWater(cVehicleParams& params);
|
||||
bool ProcessBoatMovingOverWater(cVehicleParams& params); //done
|
||||
#ifdef GTA_BRIDGE
|
||||
void ProcessBridge(); // done(bcs not exists in VC)
|
||||
void ProcessBridgeMotor(); // done(bcs not exists in VC)
|
||||
@@ -412,7 +431,7 @@ public:
|
||||
#endif
|
||||
bool ProcessCarBombTick(cVehicleParams& params); // done
|
||||
void ProcessCarHeli(cVehicleParams& params); // done
|
||||
void ProcessCesna(cVehicleParams& params); //
|
||||
void ProcessCesna(cVehicleParams& params); // done
|
||||
//void ProcessCrane(); // done(bcs not exists in VC)
|
||||
bool ProcessEngineDamage(cVehicleParams& params); // done
|
||||
void ProcessEntity(int32 sound); // done
|
||||
@@ -420,7 +439,7 @@ public:
|
||||
void ProcessFireHydrant(); // done
|
||||
void ProcessFires(int32 entity); // done
|
||||
void ProcessFrontEnd(); // done
|
||||
void ProcessGarages(); //
|
||||
void ProcessGarages(); // done
|
||||
void ProcessJumbo(cVehicleParams& params); // done
|
||||
void ProcessJumboAccel(CPlane *plane); // done
|
||||
void ProcessJumboDecel(CPlane *plane); // done
|
||||
@@ -428,14 +447,14 @@ public:
|
||||
void ProcessJumboLanding(CPlane *plane); // done
|
||||
void ProcessJumboTakeOff(CPlane *plane); // done
|
||||
void ProcessJumboTaxi(); // done
|
||||
void ProcessLoopingScriptObject(uint8 sound); //
|
||||
void ProcessMissionAudio(); //
|
||||
void ProcessMissionAudioSlot(uint8 slot); //
|
||||
void ProcessLoopingScriptObject(uint8 sound); // done
|
||||
void ProcessMissionAudio(); // done
|
||||
void ProcessMissionAudioSlot(uint8 slot); // done
|
||||
void ProcessModelHeliVehicle(cVehicleParams& params); // done
|
||||
void ProcessModelVehicle(cVehicleParams& params); // done
|
||||
void ProcessOneShotScriptObject(uint8 sound); //
|
||||
void ProcessPed(CPhysical *ped); // done
|
||||
void ProcessPedOneShots(cPedParams *params); //
|
||||
void ProcessPedOneShots(cPedParams ¶ms); //
|
||||
void ProcessPhysical(int32 id); // done
|
||||
void ProcessPlane(cVehicleParams& params); // done
|
||||
void ProcessPlayerMood(); // done
|
||||
@@ -450,15 +469,15 @@ public:
|
||||
bool ProcessTrainNoise(cVehicleParams *params); //done(bcs not exists in VC)
|
||||
#endif
|
||||
void ProcessVehicle(CVehicle *vehicle); // done
|
||||
bool ProcessVehicleDoors(cVehicleParams& params); // done
|
||||
void ProcessVehicleEngine(cVehicleParams& params); // done
|
||||
void ProcessVehicleFlatTyre(cVehicleParams& params); // done
|
||||
bool ProcessVehicleHorn(cVehicleParams& params); // done
|
||||
void ProcessVehicleOneShots(cVehicleParams& params); // done
|
||||
bool ProcessVehicleReverseWarning(cVehicleParams& params); // done
|
||||
bool ProcessVehicleRoadNoise(cVehicleParams& params); // done
|
||||
bool ProcessVehicleSirenOrAlarm(cVehicleParams& params); // done
|
||||
bool ProcessVehicleSkidding(cVehicleParams& params); // done
|
||||
bool ProcessVehicleDoors(cVehicleParams ¶ms); // done
|
||||
void ProcessVehicleEngine(cVehicleParams ¶ms); // done
|
||||
void ProcessVehicleFlatTyre(cVehicleParams ¶ms); // done
|
||||
bool ProcessVehicleHorn(cVehicleParams ¶ms); // done
|
||||
void ProcessVehicleOneShots(cVehicleParams ¶ms); // done
|
||||
bool ProcessVehicleReverseWarning(cVehicleParams ¶ms); // done
|
||||
bool ProcessVehicleRoadNoise(cVehicleParams ¶ms); // done
|
||||
bool ProcessVehicleSirenOrAlarm(cVehicleParams ¶ms); // done
|
||||
bool ProcessVehicleSkidding(cVehicleParams ¶ms); // done
|
||||
void ProcessWaterCannon(int32); // done
|
||||
void ProcessWeather(int32 id); // done
|
||||
bool ProcessWetRoadNoise(cVehicleParams& params); // done
|
||||
@@ -474,52 +493,54 @@ public:
|
||||
void ResetPoliceRadio(); // done
|
||||
void ResetTimers(uint32 time); // done
|
||||
|
||||
void Service(); //done
|
||||
void ServiceCollisions(); //done
|
||||
void ServicePoliceRadio();
|
||||
void ServicePoliceRadioChannel(uint8 wantedLevel);
|
||||
void ServiceSoundEffects();
|
||||
int8 SetCurrent3DProvider(uint8 which);
|
||||
void SetDynamicAcousticModelingStatus(uint8 status);
|
||||
void SetEffectsFadeVol(uint8 volume) const;
|
||||
void SetEffectsMasterVolume(uint8 volume) const;
|
||||
void SetMP3BoostVolume(uint8 volume) const;
|
||||
void SetEntityStatus(int32 id, uint8 status); //done
|
||||
uint32 SetLoopingCollisionRequestedSfxFreqAndGetVol(const cAudioCollision &audioCollision);
|
||||
void SetMissionAudioLocation(uint8 slot, float x, float y, float z);
|
||||
void SetMissionScriptPoliceAudio(int32 sfx) const;
|
||||
void SetMonoMode(uint8 mono);
|
||||
void SetMusicFadeVol(uint8 volume) const;
|
||||
void SetMusicMasterVolume(uint8 volume) const;
|
||||
void SetSpeakerConfig(int32 conf) const;
|
||||
void SetUpLoopingCollisionSound(const cAudioCollision &col, uint8 counter);
|
||||
void SetUpOneShotCollisionSound(const cAudioCollision &col);
|
||||
bool SetupCrimeReport();
|
||||
bool SetupJumboEngineSound(uint8 vol, uint32 freq);
|
||||
bool SetupJumboFlySound(uint8 emittingVol);
|
||||
bool SetupJumboRumbleSound(uint8 emittingVol);
|
||||
bool SetupJumboTaxiSound(uint8 vol);
|
||||
bool SetupJumboWhineSound(uint8 emittingVol, uint32 freq);
|
||||
void SetupPedComments(cPedParams *params, uint32 sound); // done
|
||||
void Service(); // done
|
||||
void ServiceCollisions(); // done
|
||||
void ServicePoliceRadio(); // done
|
||||
void ServicePoliceRadioChannel(uint8 wantedLevel); // done
|
||||
void ServiceSoundEffects(); // done
|
||||
int8 SetCurrent3DProvider(uint8 which); // done
|
||||
void SetDynamicAcousticModelingStatus(uint8 status); // done
|
||||
void SetEffectsFadeVol(uint8 volume) const; // done
|
||||
void SetEffectsMasterVolume(uint8 volume) const; // done
|
||||
void SetMP3BoostVolume(uint8 volume) const; // done
|
||||
void SetEntityStatus(int32 id, uint8 status); // done
|
||||
uint32 SetLoopingCollisionRequestedSfxFreqAndGetVol(const cAudioCollision &audioCollision); // done
|
||||
void SetMissionAudioLocation(uint8 slot, float x, float y, float z); // done
|
||||
void SetMissionScriptPoliceAudio(int32 sfx) const; // inlined and optimized
|
||||
void SetMonoMode(uint8 mono); // done
|
||||
void SetMusicFadeVol(uint8 volume) const; // done
|
||||
void SetMusicMasterVolume(uint8 volume) const; // done
|
||||
void SetSpeakerConfig(int32 conf) const; // done
|
||||
void SetUpLoopingCollisionSound(const cAudioCollision &col, uint8 counter); // done
|
||||
void SetUpOneShotCollisionSound(const cAudioCollision &col); // done
|
||||
bool SetupCrimeReport(); // done
|
||||
bool SetupJumboEngineSound(uint8 vol, uint32 freq); // done
|
||||
bool SetupJumboFlySound(uint8 emittingVol); // done
|
||||
bool SetupJumboRumbleSound(uint8 emittingVol); // done
|
||||
bool SetupJumboTaxiSound(uint8 vol); // done
|
||||
bool SetupJumboWhineSound(uint8 emittingVol, uint32 freq); // done
|
||||
void SetupPedComments(cPedParams ¶ms, uint16 sound); // done
|
||||
void SetupSuspectLastSeenReport();
|
||||
|
||||
void Terminate(); //done
|
||||
void TranslateEntity(Const CVector *v1, CVector *v2) const; //done
|
||||
void Terminate(); // done
|
||||
void TranslateEntity(Const CVector *v1, CVector *v2) const; // done
|
||||
|
||||
void UpdateGasPedalAudio(CVehicle* veh, int vehType); // done
|
||||
void UpdateReflections(); //done
|
||||
bool UsesReverseWarning(int32 model) const; //done
|
||||
bool UsesSiren(cVehicleParams& params) const; //done
|
||||
bool UsesSirenSwitching(cVehicleParams& params) const; //done
|
||||
void UpdateGasPedalAudio(CVehicle *veh, int vehType); // done
|
||||
void UpdateReflections(); // done
|
||||
bool UsesReverseWarning(int32 model) const; // done
|
||||
bool UsesSiren(cVehicleParams ¶ms) const; // done
|
||||
bool UsesSirenSwitching(cVehicleParams ¶ms) const; // done
|
||||
|
||||
CVehicle *FindVehicleOfPlayer(); //done
|
||||
void SetPedTalkingStatus(CPed *ped, uint8 status);
|
||||
void SetPlayersMood(uint8 mood, uint32 time);
|
||||
CVehicle *FindVehicleOfPlayer(); // done
|
||||
void SetPedTalkingStatus(CPed *ped, uint8 status); // done
|
||||
void SetPlayersMood(uint8 mood, uint32 time); // done
|
||||
|
||||
float Sqrt(float v) const { return v <= 0.0f ? 0.0f : ::Sqrt(v); }
|
||||
|
||||
#ifdef GTA_PC
|
||||
// only used in pc
|
||||
void AdjustSamplesVolume();
|
||||
uint8 ComputeEmittingVolume(uint8 emittingVolume, float intensity, float dist);
|
||||
void AdjustSamplesVolume(); // done (inlined)
|
||||
uint8 ComputeEmittingVolume(uint8 emittingVolume, float intensity, float dist); // done (inlined)
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
enum eSfxSample : uint32 {
|
||||
enum eSfxSample
|
||||
{
|
||||
SFX_CAR_HORN_JEEP = 0,
|
||||
SFX_CAR_HORN_BMW328,
|
||||
SFX_CAR_HORN_BUS,
|
||||
|
||||
@@ -223,8 +223,8 @@ void
|
||||
cMusicManager::SetRadioChannelByScript(uint32 station, int32 pos)
|
||||
{
|
||||
if (m_bIsInitialised) {
|
||||
if (station == USERTRACK)
|
||||
station = RADIO_OFF;
|
||||
if (station == STREAMED_SOUND_RADIO_MP3_PLAYER)
|
||||
station = STREAMED_SOUND_CITY_AMBIENT;
|
||||
if (station <= STREAMED_SOUND_RADIO_POLICE) {
|
||||
m_bRadioSetByScript = true;
|
||||
m_nRadioStation = station;
|
||||
@@ -512,7 +512,7 @@ cMusicManager::ServiceGameMode()
|
||||
gRetuneCounter = 0;
|
||||
field_2 = false;
|
||||
} else if (ped) {
|
||||
if (ped->m_objective != OBJECTIVE_WAIT_ON_FOOT_AT_ICE_CREAM_VAN && ped->m_objective != OBJ_55) {
|
||||
if(!ped->DyingOrDead()) {
|
||||
#ifdef GTA_PC
|
||||
if (SampleManager.IsMP3RadioChannelAvailable()
|
||||
&& vehicle->m_nRadioStation < USERTRACK
|
||||
@@ -564,8 +564,8 @@ cMusicManager::ServiceGameMode()
|
||||
gRetuneCounter = 0;
|
||||
return;
|
||||
}
|
||||
if (m_nAnnouncement == NO_TRACK)
|
||||
{
|
||||
if(m_nAnnouncement == NO_TRACK) {
|
||||
m_nStreamedTrack = NO_TRACK;
|
||||
m_nFrontendTrack = GetCarTuning();
|
||||
field_2 = false;
|
||||
gRetuneCounter = 0;
|
||||
|
||||
@@ -67,7 +67,7 @@ cAudioManager::InitialisePoliceRadio()
|
||||
for (int32 i = 0; i < ARRAY_SIZE(m_sPoliceRadioQueue.crimes); i++)
|
||||
m_sPoliceRadioQueue.crimes[i].type = CRIME_NONE;
|
||||
|
||||
SampleManager.SetChannelReverbFlag(policeChannel, 0);
|
||||
SampleManager.SetChannelReverbFlag(policeChannel, false);
|
||||
gSpecialSuspectLastSeenReport = false;
|
||||
for (int32 i = 0; i < ARRAY_SIZE(gMinTimeToNextReport); i++)
|
||||
gMinTimeToNextReport[i] = m_FrameCounter;
|
||||
|
||||
@@ -1274,7 +1274,7 @@ enum AudioEntityHandle {
|
||||
AEHANDLE_ERROR_BADAUDIOTYPE = -1,
|
||||
};
|
||||
|
||||
enum eAudioType : int32
|
||||
enum eAudioType
|
||||
{
|
||||
AUDIOTYPE_PHYSICAL = 0,
|
||||
AUDIOTYPE_EXPLOSION,
|
||||
|
||||
@@ -3,6 +3,14 @@
|
||||
|
||||
#ifdef AUDIO_OAL
|
||||
|
||||
/*
|
||||
* When linking to a static openal-soft library,
|
||||
* the extension function inside the openal library conflict with the variables here.
|
||||
* Therefore declare these re3 owned symbols in a private namespace.
|
||||
*/
|
||||
|
||||
namespace re3_openal {
|
||||
|
||||
LPALGENEFFECTS alGenEffects;
|
||||
LPALDELETEEFFECTS alDeleteEffects;
|
||||
LPALISEFFECT alIsEffect;
|
||||
@@ -37,6 +45,9 @@ LPALGETFILTERIV alGetFilteriv;
|
||||
LPALGETFILTERF alGetFilterf;
|
||||
LPALGETFILTERFV alGetFilterfv;
|
||||
|
||||
}
|
||||
|
||||
using namespace re3_openal;
|
||||
|
||||
void EFXInit()
|
||||
{
|
||||
|
||||
@@ -11,6 +11,8 @@ void EFX_Set(ALuint effect, const EAXLISTENERPROPERTIES *props);
|
||||
void EAX3_SetReverbMix(ALuint filter, float mix);
|
||||
void SetEffectsLevel(ALuint uiFilter, float level);
|
||||
|
||||
namespace re3_openal {
|
||||
|
||||
extern LPALGENEFFECTS alGenEffects;
|
||||
extern LPALDELETEEFFECTS alDeleteEffects;
|
||||
extern LPALISEFFECT alIsEffect;
|
||||
@@ -44,4 +46,9 @@ extern LPALGETFILTERI alGetFilteri;
|
||||
extern LPALGETFILTERIV alGetFilteriv;
|
||||
extern LPALGETFILTERF alGetFilterf;
|
||||
extern LPALGETFILTERFV alGetFilterfv;
|
||||
|
||||
}
|
||||
|
||||
using namespace re3_openal;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -10,13 +10,15 @@
|
||||
#ifdef _WIN32
|
||||
#pragma comment( lib, "libsndfile-1.lib" )
|
||||
#pragma comment( lib, "libmpg123-0.lib" )
|
||||
#else
|
||||
#include "crossplatform.h"
|
||||
#endif
|
||||
#include <sndfile.h>
|
||||
#include <mpg123.h>
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32
|
||||
#include "crossplatform.h"
|
||||
#endif
|
||||
|
||||
#ifndef AUDIO_OPUS
|
||||
class CSndFile : public IDecoder
|
||||
{
|
||||
|
||||
@@ -1380,7 +1380,7 @@ cSampleManager::Terminate(void)
|
||||
bool
|
||||
cSampleManager::CheckForAnAudioFileOnCD(void)
|
||||
{
|
||||
#if !defined(GTA3_STEAM_PATCH) && !defined(NO_CDCHECK)
|
||||
#if !defined(NO_CDCHECK) // TODO: check steam, probably GTAVC_STEAM_PATCH needs to be added
|
||||
char filepath[MAX_PATH];
|
||||
|
||||
strcpy(filepath, m_MiscomPath);
|
||||
@@ -1406,7 +1406,7 @@ cSampleManager::CheckForAnAudioFileOnCD(void)
|
||||
|
||||
#else
|
||||
return true;
|
||||
#endif // #if !defined(GTA3_STEAM_PATCH) && !defined(NO_CDCHECK)
|
||||
#endif // #if !defined(NO_CDCHECK)
|
||||
}
|
||||
|
||||
char
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
enum eSound : uint16
|
||||
enum eSound
|
||||
{
|
||||
SOUND_CAR_DOOR_CLOSE_BONNET = 0,
|
||||
SOUND_CAR_DOOR_CLOSE_BUMPER,
|
||||
@@ -201,14 +201,14 @@ enum eSound : uint16
|
||||
SOUND_FRONTEND_AUDIO_TEST,
|
||||
SOUND_INJURED_PED_MALE_OUCH,
|
||||
SOUND_INJURED_PED_FEMALE,
|
||||
SOUND_SET_202,
|
||||
SOUND_SHIRT_WIND_FLAP,
|
||||
SOUND_SET_203,
|
||||
SOUND_TOTAL_SOUNDS = 204,
|
||||
SOUND_NO_SOUND = 205,
|
||||
};
|
||||
|
||||
|
||||
enum eScriptSounds : uint16 {
|
||||
enum eScriptSounds {
|
||||
SCRIPT_SOUND_BANK_ALARM_LOOP = 0,
|
||||
SCRIPT_SOUND_PART_MISSION_COMPLETE,
|
||||
SCRIPT_SOUND_POLICE_CELL_DOOR_SLIDING_LOOP,
|
||||
|
||||
@@ -27,14 +27,14 @@ IsBuildingPointerValid(CBuilding* pBuilding)
|
||||
if (!pBuilding)
|
||||
return false;
|
||||
if (pBuilding->GetIsATreadable()) {
|
||||
int index = CPools::GetTreadablePool()->GetJustIndex((CTreadable*)pBuilding);
|
||||
int index = CPools::GetTreadablePool()->GetJustIndex_NoFreeAssert((CTreadable*)pBuilding);
|
||||
#ifdef FIX_BUGS
|
||||
return index >= 0 && index < CPools::GetTreadablePool()->GetSize();
|
||||
#else
|
||||
return index >= 0 && index <= CPools::GetTreadablePool()->GetSize();
|
||||
#endif
|
||||
} else {
|
||||
int index = CPools::GetBuildingPool()->GetJustIndex(pBuilding);
|
||||
int index = CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert(pBuilding);
|
||||
#ifdef FIX_BUGS
|
||||
return index >= 0 && index < CPools::GetBuildingPool()->GetSize();
|
||||
#else
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "ColModel.h"
|
||||
#include "Collision.h"
|
||||
#include "Game.h"
|
||||
#include "MemoryHeap.h"
|
||||
#include "Pools.h"
|
||||
|
||||
CColModel::CColModel(void)
|
||||
@@ -65,10 +66,15 @@ CColModel::RemoveCollisionVolumes(void)
|
||||
void
|
||||
CColModel::CalculateTrianglePlanes(void)
|
||||
{
|
||||
PUSH_MEMID(MEMID_COLLISION);
|
||||
|
||||
// HACK: allocate space for one more element to stuff the link pointer into
|
||||
trianglePlanes = (CColTrianglePlane*)RwMalloc(sizeof(CColTrianglePlane) * (numTriangles+1));
|
||||
REGISTER_MEMPTR(&trianglePlanes);
|
||||
for(int i = 0; i < numTriangles; i++)
|
||||
trianglePlanes[i].Set(vertices, triangles[i]);
|
||||
|
||||
POP_MEMID();
|
||||
}
|
||||
|
||||
void
|
||||
@@ -198,4 +204,4 @@ CColModel::operator=(const CColModel &other)
|
||||
vertices = nil;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,7 +173,7 @@ CColStore::LoadCollision(const CVector2D &pos)
|
||||
|
||||
if(GetBoundingBox(i).IsPointInside(pos) ||
|
||||
bLoadAtSecondPosition && GetBoundingBox(i).IsPointInside(secondPosition, -119.0f) ||
|
||||
CGeneral::faststrcmp(GetColName(i), "yacht") == 0){
|
||||
strcmp(GetColName(i), "yacht") == 0){
|
||||
wantThisOne = true;
|
||||
}else{
|
||||
for (int j = 0; j < MAX_CLEANUP; j++) {
|
||||
@@ -499,7 +499,7 @@ CCollision::TestLineOfSight(const CColLine &line, const CMatrix &matrix, CColMod
|
||||
// transform line to model space
|
||||
Invert(matrix, matTransform);
|
||||
CVuVector newline[2];
|
||||
TransformPoints(newline, 2, matTransform, (RwV3d*)&line.p0, sizeof(CColLine)/2);
|
||||
TransformPoints(newline, 2, matTransform, &line.p0, sizeof(CColLine)/2);
|
||||
|
||||
// If we don't intersect with the bounding box, no chance on the rest
|
||||
if(!TestLineBox(*(CColLine*)newline, model.boundingBox))
|
||||
@@ -1321,7 +1321,7 @@ CCollision::ProcessLineOfSight(const CColLine &line,
|
||||
// transform line to model space
|
||||
Invert(matrix, matTransform);
|
||||
CVuVector newline[2];
|
||||
TransformPoints(newline, 2, matTransform, (RwV3d*)&line.p0, sizeof(CColLine)/2);
|
||||
TransformPoints(newline, 2, matTransform, &line.p0, sizeof(CColLine)/2);
|
||||
|
||||
if(mindist < 1.0f)
|
||||
newline[1] = newline[0] + (newline[1] - newline[0])*mindist;
|
||||
@@ -1456,7 +1456,7 @@ CCollision::ProcessVerticalLine(const CColLine &line,
|
||||
// transform line to model space
|
||||
Invert(matrix, matTransform);
|
||||
CVuVector newline[2];
|
||||
TransformPoints(newline, 2, matTransform, (RwV3d*)&line.p0, sizeof(CColLine)/2);
|
||||
TransformPoints(newline, 2, matTransform, &line.p0, sizeof(CColLine)/2);
|
||||
|
||||
if(mindist < 1.0f)
|
||||
newline[1] = newline[0] + (newline[1] - newline[0])*mindist;
|
||||
@@ -1655,16 +1655,16 @@ CCollision::ProcessColModels(const CMatrix &matrixA, CColModel &modelA,
|
||||
matAB *= matrixA;
|
||||
|
||||
CVuVector bsphereAB; // bounding sphere of A in B space
|
||||
TransformPoint(bsphereAB, matAB, *(RwV3d*)modelA.boundingSphere.center); // inlined
|
||||
TransformPoint(bsphereAB, matAB, modelA.boundingSphere.center); // inlined
|
||||
bsphereAB.w = modelA.boundingSphere.radius;
|
||||
if(!TestSphereBox(*(CColSphere*)&bsphereAB, modelB.boundingBox))
|
||||
return 0;
|
||||
|
||||
// transform modelA's spheres and lines to B space
|
||||
TransformPoints(aSpheresA, modelA.numSpheres, matAB, (RwV3d*)&modelA.spheres->center, sizeof(CColSphere));
|
||||
TransformPoints(aSpheresA, modelA.numSpheres, matAB, &modelA.spheres->center, sizeof(CColSphere));
|
||||
for(i = 0; i < modelA.numSpheres; i++)
|
||||
aSpheresA[i].w = modelA.spheres[i].radius;
|
||||
TransformPoints(aLinesA, modelA.numLines*2, matAB, (RwV3d*)&modelA.lines->p0, sizeof(CColLine)/2);
|
||||
TransformPoints(aLinesA, modelA.numLines*2, matAB, &modelA.lines->p0, sizeof(CColLine)/2);
|
||||
|
||||
// Test them against model B's bounding volumes
|
||||
int numSpheresA = 0;
|
||||
@@ -1681,7 +1681,7 @@ CCollision::ProcessColModels(const CMatrix &matrixA, CColModel &modelA,
|
||||
matBA *= matrixB;
|
||||
|
||||
// transform modelB's spheres to A space
|
||||
TransformPoints(aSpheresB, modelB.numSpheres, matBA, (RwV3d*)&modelB.spheres->center, sizeof(CColSphere));
|
||||
TransformPoints(aSpheresB, modelB.numSpheres, matBA, &modelB.spheres->center, sizeof(CColSphere));
|
||||
for(i = 0; i < modelB.numSpheres; i++)
|
||||
aSpheresB[i].w = modelB.spheres[i].radius;
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ CTempColModels::Initialise(void)
|
||||
colmodel.numSpheres = ARRAY_SIZE(sphrs);\
|
||||
colmodel.spheres = sphrs;\
|
||||
colmodel.level = LEVEL_GENERIC;\
|
||||
colmodel.ownsCollisionVolumes = false;\
|
||||
colmodel.ownsCollisionVolumes = false;
|
||||
|
||||
int i;
|
||||
|
||||
|
||||
@@ -109,9 +109,9 @@ void CAutoPilot::Load(uint8*& buf)
|
||||
m_nNextDirection = ReadSaveBuf<int8>(buf);
|
||||
m_nCurrentLane = ReadSaveBuf<int8>(buf);
|
||||
m_nNextLane = ReadSaveBuf<int8>(buf);
|
||||
m_nDrivingStyle = (eCarDrivingStyle)ReadSaveBuf<uint8>(buf);
|
||||
m_nCarMission = (eCarMission)ReadSaveBuf<uint8>(buf);
|
||||
m_nTempAction = (eCarTempAction)ReadSaveBuf<uint8>(buf);
|
||||
m_nDrivingStyle = ReadSaveBuf<uint8>(buf);
|
||||
m_nCarMission = ReadSaveBuf<uint8>(buf);
|
||||
m_nTempAction = ReadSaveBuf<uint8>(buf);
|
||||
m_nTimeTempAction = ReadSaveBuf<uint32>(buf);
|
||||
m_fMaxTrafficSpeed = ReadSaveBuf<float>(buf);
|
||||
m_nCruiseSpeed = ReadSaveBuf<uint8>(buf);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
class CVehicle;
|
||||
struct CPathNode;
|
||||
|
||||
enum eCarMission : uint8
|
||||
enum eCarMission
|
||||
{
|
||||
MISSION_NONE,
|
||||
MISSION_CRUISE,
|
||||
@@ -35,7 +35,7 @@ enum eCarMission : uint8
|
||||
MISSION_BLOCKPLAYER_FORWARDANDBACK
|
||||
};
|
||||
|
||||
enum eCarTempAction : uint8
|
||||
enum eCarTempAction
|
||||
{
|
||||
TEMPACT_NONE,
|
||||
TEMPACT_WAIT,
|
||||
@@ -50,7 +50,7 @@ enum eCarTempAction : uint8
|
||||
TEMPACT_SWERVERIGHT
|
||||
};
|
||||
|
||||
enum eCarDrivingStyle : uint8
|
||||
enum eCarDrivingStyle
|
||||
{
|
||||
DRIVINGSTYLE_STOP_FOR_CARS,
|
||||
DRIVINGSTYLE_SLOW_DOWN_FOR_CARS,
|
||||
@@ -76,9 +76,9 @@ public:
|
||||
int8 m_nNextDirection;
|
||||
int8 m_nCurrentLane;
|
||||
int8 m_nNextLane;
|
||||
eCarDrivingStyle m_nDrivingStyle;
|
||||
eCarMission m_nCarMission;
|
||||
eCarTempAction m_nTempAction;
|
||||
uint8 m_nDrivingStyle;
|
||||
uint8 m_nCarMission;
|
||||
uint8 m_nTempAction;
|
||||
uint32 m_nTimeTempAction;
|
||||
float m_fMaxTrafficSpeed;
|
||||
uint8 m_nCruiseSpeed;
|
||||
|
||||
@@ -647,7 +647,7 @@ void CCarAI::TellCarToBlockOtherCar(CVehicle* pVehicle, CVehicle* pTarget)
|
||||
pVehicle->AutoPilot.m_nCruiseSpeed = Max(6, pVehicle->AutoPilot.m_nCruiseSpeed);
|
||||
}
|
||||
|
||||
eCarMission CCarAI::FindPoliceCarMissionForWantedLevel()
|
||||
uint8 CCarAI::FindPoliceCarMissionForWantedLevel()
|
||||
{
|
||||
switch (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_pWanted->m_nWantedLevel){
|
||||
case 0:
|
||||
@@ -661,7 +661,7 @@ eCarMission CCarAI::FindPoliceCarMissionForWantedLevel()
|
||||
}
|
||||
}
|
||||
|
||||
eCarMission CCarAI::FindPoliceBoatMissionForWantedLevel()
|
||||
uint8 CCarAI::FindPoliceBoatMissionForWantedLevel()
|
||||
{
|
||||
switch (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_pWanted->m_nWantedLevel) {
|
||||
case 0:
|
||||
|
||||
+2
-2
@@ -22,8 +22,8 @@ public:
|
||||
static void TellOccupantsToFleeCar(CVehicle*);
|
||||
static void TellCarToRamOtherCar(CVehicle*, CVehicle*);
|
||||
static void TellCarToBlockOtherCar(CVehicle*, CVehicle*);
|
||||
static eCarMission FindPoliceCarMissionForWantedLevel();
|
||||
static eCarMission FindPoliceBoatMissionForWantedLevel();
|
||||
static uint8 FindPoliceCarMissionForWantedLevel();
|
||||
static uint8 FindPoliceBoatMissionForWantedLevel();
|
||||
static int32 FindPoliceCarSpeedForWantedLevel(CVehicle*);
|
||||
static void MellowOutChaseSpeed(CVehicle*);
|
||||
static void MellowOutChaseSpeedBoat(CVehicle*);
|
||||
|
||||
+13
-23
@@ -464,6 +464,11 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
pVehicle->GetRight() = CVector(forwardY, -forwardX, 0.0f);
|
||||
pVehicle->GetUp() = CVector(0.0f, 0.0f, 1.0f);
|
||||
|
||||
float currentPathLinkForwardX = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirX();
|
||||
float currentPathLinkForwardY = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirY();
|
||||
float nextPathLinkForwardX = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirX();
|
||||
float nextPathLinkForwardY = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirY();
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
CCarPathLink* pCurrentLink;
|
||||
CCarPathLink* pNextLink;
|
||||
@@ -474,11 +479,6 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
float directionNextLinkX;
|
||||
float directionNextLinkY;
|
||||
if (positionBetweenNodes < 0.5f) {
|
||||
float currentPathLinkForwardX = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirX();
|
||||
float currentPathLinkForwardY = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirY();
|
||||
float nextPathLinkForwardX = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirX();
|
||||
float nextPathLinkForwardY = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirY();
|
||||
|
||||
pCurrentLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo];
|
||||
pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo];
|
||||
positionOnCurrentLinkIncludingLane = CVector(
|
||||
@@ -508,11 +508,6 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
pVehicle->AutoPilot.m_nTimeEnteredCurve = CTimer::GetTimeInMilliseconds() -
|
||||
(uint32)((positionBetweenNodes - 0.5f) * pVehicle->AutoPilot.m_nTimeToSpendOnCurrentCurve);
|
||||
|
||||
float currentPathLinkForwardX = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirX();
|
||||
float currentPathLinkForwardY = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirY();
|
||||
float nextPathLinkForwardX = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirX();
|
||||
float nextPathLinkForwardY = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirY();
|
||||
|
||||
pCurrentLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo];
|
||||
pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo];
|
||||
positionOnCurrentLinkIncludingLane = CVector(
|
||||
@@ -1917,7 +1912,6 @@ void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle)
|
||||
}
|
||||
if (pVehicle->AutoPilot.m_bStayInFastLane)
|
||||
pVehicle->AutoPilot.m_nNextLane = 0;
|
||||
#ifdef FIX_BUGS
|
||||
CVector positionOnCurrentLinkIncludingLane(
|
||||
pCurLink->GetX() + ((pVehicle->AutoPilot.m_nCurrentLane + pCurLink->OneWayLaneOffset()) * LANE_WIDTH)
|
||||
#ifdef FIX_BUGS
|
||||
@@ -1932,16 +1926,6 @@ void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle)
|
||||
#endif
|
||||
,pNextLink->GetY() - ((pVehicle->AutoPilot.m_nNextLane + pNextLink->OneWayLaneOffset()) * LANE_WIDTH) * nextPathLinkForwardX,
|
||||
0.0f);
|
||||
#else
|
||||
CVector positionOnCurrentLinkIncludingLane(
|
||||
pCurLink->GetX() + ((pVehicle->AutoPilot.m_nCurrentLane + pCurLink->OneWayLaneOffset()) * LANE_WIDTH),
|
||||
pCurLink->GetY() - ((pVehicle->AutoPilot.m_nCurrentLane + pCurLink->OneWayLaneOffset()) * LANE_WIDTH) * currentPathLinkForwardX,
|
||||
0.0f);
|
||||
CVector positionOnNextLinkIncludingLane(
|
||||
pNextLink->GetX() + ((pVehicle->AutoPilot.m_nNextLane + pNextLink->OneWayLaneOffset()) * LANE_WIDTH) * nextPathLinkForwardY,
|
||||
pNextLink->GetY() - ((pVehicle->AutoPilot.m_nNextLane + pNextLink->OneWayLaneOffset()) * LANE_WIDTH) * nextPathLinkForwardX,
|
||||
0.0f);
|
||||
#endif
|
||||
float directionCurrentLinkX = pCurLink->GetDirX() * pVehicle->AutoPilot.m_nCurrentDirection;
|
||||
float directionCurrentLinkY = pCurLink->GetDirY() * pVehicle->AutoPilot.m_nCurrentDirection;
|
||||
float directionNextLinkX = pNextLink->GetDirX() * pVehicle->AutoPilot.m_nNextDirection;
|
||||
@@ -2898,7 +2882,13 @@ void CCarCtrl::SteerAICarWithPhysicsFollowPath(CVehicle* pVehicle, float* pSwerv
|
||||
case DRIVINGSTYLE_STOP_FOR_CARS:
|
||||
case DRIVINGSTYLE_SLOW_DOWN_FOR_CARS:
|
||||
case DRIVINGSTYLE_STOP_FOR_CARS_IGNORE_LIGHTS:
|
||||
speedStyleMultiplier = FindMaximumSpeedForThisCarInTraffic(pVehicle) / pVehicle->AutoPilot.m_nCruiseSpeed;
|
||||
speedStyleMultiplier = FindMaximumSpeedForThisCarInTraffic(pVehicle);
|
||||
#ifdef FIX_BUGS
|
||||
if (pVehicle->AutoPilot.GetCruiseSpeed() != 0)
|
||||
speedStyleMultiplier /= pVehicle->AutoPilot.GetCruiseSpeed();
|
||||
#else
|
||||
speedStyleMultiplier /= pVehicle->AutoPilot.m_nCruiseSpeed;
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
speedStyleMultiplier = 1.0f;
|
||||
@@ -3242,7 +3232,7 @@ void CCarCtrl::GenerateEmergencyServicesCar(void)
|
||||
float distance = 30.0f;
|
||||
CFire* pNearestFire = gFireManager.FindNearestFire(FindPlayerCoors(), &distance);
|
||||
if (pNearestFire) {
|
||||
if (CountCarsOfType(MI_FIRETRUCK) < 2 && CTimer::GetTimeInMilliseconds() > LastTimeFireTruckCreated + 30000){
|
||||
if (CountCarsOfType(MI_FIRETRUCK) < 2 && CTimer::GetTimeInMilliseconds() > LastTimeFireTruckCreated + 35000){
|
||||
CStreaming::RequestModel(MI_FIRETRUCK, STREAMFLAGS_DEPENDENCY);
|
||||
CStreaming::RequestModel(MI_FIREMAN, STREAMFLAGS_DONT_REMOVE);
|
||||
if (CStreaming::HasModelLoaded(MI_FIRETRUCK) && CStreaming::HasModelLoaded(MI_FIREMAN)){
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include "Vehicle.h"
|
||||
#include "GameLogic.h"
|
||||
|
||||
//--MIAMI: file done except TODO
|
||||
//--MIAMI: file done
|
||||
|
||||
#define FRENZY_ANY_PED -1
|
||||
#define FRENZY_ANY_CAR -2
|
||||
@@ -295,11 +295,16 @@ CDarkel::StartFrenzy(eWeaponType weaponType, int32 time, uint16 kill, int32 mode
|
||||
CPlayerPed *player = FindPlayerPed();
|
||||
if (fixedWeapon < WEAPONTYPE_TOTALWEAPONS) {
|
||||
InterruptedWeaponSelected = player->GetWeapon()->m_eWeaponType;
|
||||
#if (defined FIX_BUGS || !defined GTA_PS2)
|
||||
player->RemoveWeaponAnims(InterruptedWeaponSelected, -1000.0f);
|
||||
#endif
|
||||
InterruptedWeaponType = player->GetWeapon(player->GetWeaponSlot(fixedWeapon)).m_eWeaponType;
|
||||
AmmoInterruptedWeapon = player->GetWeapon(player->GetWeaponSlot(fixedWeapon)).m_nAmmoTotal;
|
||||
if (InterruptedWeaponType)
|
||||
CModelInfo::GetModelInfo(CWeaponInfo::GetWeaponInfo((eWeaponType)InterruptedWeaponType)->m_nModelId)->AddRef();
|
||||
#if (!defined FIX_BUGS && defined GTA_PS2)
|
||||
player->RemoveWeaponAnims(InterruptedWeaponSelected, -1000.0f);
|
||||
#endif
|
||||
player->GiveWeapon(fixedWeapon, 30000);
|
||||
player->SetCurrentWeapon(fixedWeapon);
|
||||
player->MakeChangesForNewWeapon(player->m_nSelectedWepSlot);
|
||||
@@ -403,6 +408,6 @@ CDarkel::DealWithWeaponChangeAtEndOfFrenzy()
|
||||
FindPlayerPed()->m_nSelectedWepSlot = WEAPONSLOT_UNARMED;
|
||||
player->SetCurrentWeapon(FindPlayerPed()->m_nSelectedWepSlot);
|
||||
player->MakeChangesForNewWeapon(player->m_currentWeapon);
|
||||
//player->RemoveDriveByAnims(); // TODO(MIAMI)
|
||||
player->RemoveDrivebyAnims();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "ColStore.h"
|
||||
#include "Automobile.h"
|
||||
#include "MBlur.h"
|
||||
#include "screendroplets.h"
|
||||
|
||||
uint8 CGameLogic::ActivePlayers;
|
||||
uint8 CGameLogic::ShortCutState;
|
||||
@@ -153,6 +154,9 @@ CGameLogic::Update()
|
||||
}
|
||||
}
|
||||
CEventList::Initialise();
|
||||
#ifdef SCREEN_DROPLETS
|
||||
ScreenDroplets::Initialise();
|
||||
#endif
|
||||
CMessages::ClearMessages();
|
||||
CCarCtrl::ClearInterestingVehicleList();
|
||||
CWorld::ClearExcitingStuffFromArea(pPlayerInfo.GetPos(), 4000.0f, 1);
|
||||
@@ -259,6 +263,9 @@ CGameLogic::Update()
|
||||
}
|
||||
}
|
||||
CEventList::Initialise();
|
||||
#ifdef SCREEN_DROPLETS
|
||||
ScreenDroplets::Initialise();
|
||||
#endif
|
||||
CMessages::ClearMessages();
|
||||
CCarCtrl::ClearInterestingVehicleList();
|
||||
CWorld::ClearExcitingStuffFromArea(pPlayerInfo.GetPos(), 4000.0f, 1);
|
||||
@@ -311,6 +318,9 @@ CGameLogic::Update()
|
||||
}
|
||||
}
|
||||
CEventList::Initialise();
|
||||
#ifdef SCREEN_DROPLETS
|
||||
ScreenDroplets::Initialise();
|
||||
#endif
|
||||
CMessages::ClearMessages();
|
||||
CCarCtrl::ClearInterestingVehicleList();
|
||||
CWorld::ClearExcitingStuffFromArea(pPlayerInfo.GetPos(), 4000.0f, 1);
|
||||
|
||||
+249
-154
@@ -4,9 +4,7 @@
|
||||
#include "main.h"
|
||||
|
||||
#include "Bike.h"
|
||||
#ifdef FIX_BUGS
|
||||
#include "Boat.h"
|
||||
#endif
|
||||
#include "DMAudio.h"
|
||||
#include "General.h"
|
||||
#include "Font.h"
|
||||
@@ -47,7 +45,7 @@
|
||||
|
||||
// Distances
|
||||
#define DISTANCE_TO_CALL_OFF_CHASE (10.0f)
|
||||
#define DISTANCE_FOR_MRWHOOP_HACK (4.0f)
|
||||
#define DISTANCE_FOR_MRWHOOP_HACK (0.5f)
|
||||
#define DISTANCE_TO_ACTIVATE_GARAGE (8.0f)
|
||||
#define DISTANCE_TO_ACTIVATE_KEEPCAR_GARAGE (17.0f)
|
||||
#define DISTANCE_TO_CLOSE_MISSION_GARAGE (30.0f)
|
||||
@@ -126,8 +124,8 @@ uint32 CGarages::MessageEndTime;
|
||||
uint32 CGarages::NumGarages;
|
||||
bool CGarages::PlayerInGarage;
|
||||
int32 CGarages::PoliceCarsCollected;
|
||||
CStoredCar CGarages::aCarsInSafeHouses[TOTAL_HIDEOUT_GARAGES][CGarages::MAX_NUM_CARS_IN_HIDEOUT_GARAGE];
|
||||
int32 CGarages::AudioEntity = AEHANDLE_NONE;
|
||||
CStoredCar CGarages::aCarsInSafeHouses[TOTAL_HIDEOUT_GARAGES][NUM_GARAGE_STORED_CARS];
|
||||
int32 hGarages = AEHANDLE_NONE;
|
||||
CGarage CGarages::aGarages[NUM_GARAGES];
|
||||
bool CGarages::bCamShouldBeOutisde;
|
||||
|
||||
@@ -148,41 +146,47 @@ void CGarages::Init(void)
|
||||
for (int i = 0; i < TOTAL_COLLECTCARS_GARAGES; i++)
|
||||
CarTypesCollected[i] = 0;
|
||||
LastTimeHelpMessage = 0;
|
||||
for (int i = 0; i < TOTAL_HIDEOUT_GARAGES; i++) {
|
||||
for (int j = 0; j < MAX_NUM_CARS_IN_HIDEOUT_GARAGE; j++)
|
||||
aCarsInSafeHouses[i][j].Init();
|
||||
for (int i = 0; i < NUM_GARAGE_STORED_CARS; i++) {
|
||||
for (int j = 0; j < TOTAL_HIDEOUT_GARAGES; j++)
|
||||
aCarsInSafeHouses[j][i].Init();
|
||||
}
|
||||
AudioEntity = DMAudio.CreateEntity(AUDIOTYPE_GARAGE, (void*)1);
|
||||
if (AudioEntity >= 0)
|
||||
DMAudio.SetEntityStatus(AudioEntity, 1);
|
||||
hGarages = DMAudio.CreateEntity(AUDIOTYPE_GARAGE, (void*)1);
|
||||
if (hGarages >= 0)
|
||||
DMAudio.SetEntityStatus(hGarages, true);
|
||||
}
|
||||
|
||||
void CGarages::Shutdown(void)
|
||||
{
|
||||
NumGarages = 0;
|
||||
if (AudioEntity < 0)
|
||||
if (hGarages < 0)
|
||||
return;
|
||||
DMAudio.DestroyEntity(AudioEntity);
|
||||
AudioEntity = AEHANDLE_NONE;
|
||||
DMAudio.DestroyEntity(hGarages);
|
||||
hGarages = AEHANDLE_NONE;
|
||||
}
|
||||
|
||||
void CGarages::Update(void)
|
||||
{
|
||||
static int GarageToBeTidied = 0;
|
||||
#ifndef PS2
|
||||
static uint32 GarageToBeTidied = 0;
|
||||
if (CReplay::IsPlayingBack())
|
||||
return;
|
||||
#endif
|
||||
bCamShouldBeOutisde = false;
|
||||
TheCamera.pToGarageWeAreIn = nil;
|
||||
TheCamera.pToGarageWeAreInForHackAvoidFirstPerson = nil;
|
||||
#ifdef FIX_BUGS
|
||||
for (uint32 i = 0; i < NumGarages; i++) {
|
||||
#else
|
||||
for (int i = 0; i < NUM_GARAGES; i++) {
|
||||
#endif
|
||||
if (aGarages[i].IsUsed())
|
||||
aGarages[i].Update();
|
||||
}
|
||||
if ((CTimer::GetFrameCounter() & 0xF) != 0xC)
|
||||
return;
|
||||
#ifdef FIX_BUGS
|
||||
if (++GarageToBeTidied >= NumGarages)
|
||||
#else
|
||||
if (++GarageToBeTidied >= NUM_GARAGES)
|
||||
#endif
|
||||
GarageToBeTidied = 0;
|
||||
if (!aGarages[GarageToBeTidied].IsUsed())
|
||||
return;
|
||||
@@ -192,7 +196,7 @@ void CGarages::Update(void)
|
||||
aGarages[GarageToBeTidied].TidyUpGarage();
|
||||
}
|
||||
|
||||
int16 CGarages::AddOne(float X1, float Y1, float Z1, float X2, float Y2, float X3, float Y3, float Z2, eGarageType type, int32 targetId)
|
||||
int16 CGarages::AddOne(float X1, float Y1, float Z1, float X2, float Y2, float X3, float Y3, float Z2, uint8 type, int32 targetId)
|
||||
{
|
||||
if (NumGarages >= NUM_GARAGES) {
|
||||
assert(0);
|
||||
@@ -293,7 +297,7 @@ int16 CGarages::AddOne(float X1, float Y1, float Z1, float X2, float Y2, float X
|
||||
return NumGarages++;
|
||||
}
|
||||
|
||||
void CGarages::ChangeGarageType(int16 garage, eGarageType type, int32 mi)
|
||||
void CGarages::ChangeGarageType(int16 garage, uint8 type, int32 mi)
|
||||
{
|
||||
CGarage* pGarage = &aGarages[garage];
|
||||
pGarage->m_eGarageType = type;
|
||||
@@ -339,6 +343,43 @@ void CGarage::Update()
|
||||
}
|
||||
if (m_bDeactivated && m_eGarageState == GS_FULLYCLOSED)
|
||||
return;
|
||||
if (m_bRotatedDoor) {
|
||||
#ifdef GTA_PS2
|
||||
if (m_eGarageState == GS_OPENING) {
|
||||
if (m_pDoor1) {
|
||||
if (FindPlayerPed()->m_pCurrentPhysSurface == m_pDoor1)
|
||||
m_pDoor1->bUsesCollision = false;
|
||||
}
|
||||
if (m_pDoor2) {
|
||||
if (FindPlayerPed()->m_pCurrentPhysSurface == m_pDoor2)
|
||||
m_pDoor2->bUsesCollision = false;
|
||||
}
|
||||
}
|
||||
else if (m_eGarageState == GS_OPENED) {
|
||||
if (m_pDoor1)
|
||||
m_pDoor1->bUsesCollision = true;
|
||||
if (m_pDoor2)
|
||||
m_pDoor2->bUsesCollision = true;
|
||||
}
|
||||
#else
|
||||
if (m_eGarageState == GS_OPENING || m_eGarageState == GS_OPENED) {
|
||||
if (m_pDoor1) {
|
||||
if (FindPlayerPed()->m_pCurrentPhysSurface == m_pDoor1 || FindPlayerPed()->GetPedState() == PED_JUMP || FindPlayerPed()->GetPedState() == PED_FALL || !FindPlayerPed()->bIsStanding)
|
||||
m_pDoor1->bUsesCollision = false;
|
||||
}
|
||||
if (m_pDoor2) {
|
||||
if (FindPlayerPed()->m_pCurrentPhysSurface == m_pDoor2 || FindPlayerPed()->GetPedState() == PED_JUMP || FindPlayerPed()->GetPedState() == PED_FALL || !FindPlayerPed()->bIsStanding)
|
||||
m_pDoor2->bUsesCollision = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (m_pDoor1)
|
||||
m_pDoor1->bUsesCollision = true;
|
||||
if (m_pDoor2)
|
||||
m_pDoor2->bUsesCollision = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
switch (m_eGarageType) {
|
||||
case GARAGE_RESPRAY:
|
||||
switch (m_eGarageState) {
|
||||
@@ -378,7 +419,7 @@ void CGarage::Update()
|
||||
if (m_fDoorPos == 0.0f) {
|
||||
m_eGarageState = GS_FULLYCLOSED;
|
||||
m_nTimeToStartAction = CTimer::GetTimeInMilliseconds() + TIME_TO_RESPRAY;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
CStats::CheckPointReachedSuccessfully();
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
@@ -482,7 +523,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == m_fDoorHeight) {
|
||||
m_eGarageState = GS_OPENEDCONTAINSCAR;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -526,7 +567,7 @@ void CGarage::Update()
|
||||
if (m_fDoorPos == 0.0f) {
|
||||
m_eGarageState = GS_FULLYCLOSED;
|
||||
m_nTimeToStartAction = CTimer::GetTimeInMilliseconds() + TIME_TO_SETUP_BOMB;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
if (m_eGarageType == GARAGE_BOMBSHOP3)
|
||||
@@ -539,14 +580,18 @@ void CGarage::Update()
|
||||
case GARAGE_BOMBSHOP1: DMAudio.PlayFrontEndSound(SOUND_GARAGE_BOMB1_SET, 1); break;
|
||||
case GARAGE_BOMBSHOP2: DMAudio.PlayFrontEndSound(SOUND_GARAGE_BOMB2_SET, 1); break;
|
||||
case GARAGE_BOMBSHOP3: DMAudio.PlayFrontEndSound(SOUND_GARAGE_BOMB3_SET, 1); break;
|
||||
default: break;
|
||||
}
|
||||
m_eGarageState = GS_OPENING;
|
||||
if (!CGarages::BombsAreFree)
|
||||
CWorld::Players[CWorld::PlayerInFocus].m_nMoney = Max(0, CWorld::Players[CWorld::PlayerInFocus].m_nMoney - BOMB_PRICE);
|
||||
if (FindPlayerVehicle() && (FindPlayerVehicle()->IsCar() || FindPlayerVehicle()->IsBike())) {
|
||||
#if (!defined GTA_PS2 || defined FIX_BUGS)
|
||||
FindPlayerVehicle()->m_bombType = CGarages::GetBombTypeForGarageType(m_eGarageType);
|
||||
FindPlayerVehicle()->m_pBombRigger = FindPlayerPed();
|
||||
#else // PS2 version contained a bug: CBike was casted to CAutomobile, but due to coincidence it didn't corrupt memory
|
||||
((CAutomobile*)(FindPlayerVehicle()))->m_bombType = CGarages::GetBombTypeForGarageType(m_eGarageType);
|
||||
((CAutomobile*)(FindPlayerVehicle()))->m_pBombRigger = FindPlayerPed();
|
||||
#endif
|
||||
if (m_eGarageType == GARAGE_BOMBSHOP3)
|
||||
CGarages::GivePlayerDetonator();
|
||||
CStats::KgsOfExplosivesUsed += KGS_OF_EXPLOSIVES_IN_BOMB;
|
||||
@@ -584,7 +629,6 @@ void CGarage::Update()
|
||||
case GARAGE_BOMBSHOP3:
|
||||
CHud::SetHelpMessage(TheText.Get("GA_8"), false); // Use the detonator to activate the bomb.
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_GARAGE);
|
||||
FindPlayerPed()->m_pWanted->m_bIgnoredByCops = false;
|
||||
@@ -598,7 +642,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == m_fDoorHeight) {
|
||||
m_eGarageState = GS_OPENEDCONTAINSCAR;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -616,13 +660,17 @@ void CGarage::Update()
|
||||
switch (m_eGarageState) {
|
||||
case GS_OPENED:
|
||||
if (((CVector2D)FindPlayerCoors() - CVector2D(GetGarageCenterX(), GetGarageCenterY())).MagnitudeSqr() > SQR(DISTANCE_TO_CLOSE_MISSION_GARAGE)) {
|
||||
if ((CTimer::GetFrameCounter() & 0x1F) == 0 && !IsAnyOtherCarTouchingGarage(nil)) {
|
||||
if ((CTimer::GetFrameCounter() & 0x1F) == 0
|
||||
#ifndef GTA_PS2
|
||||
&& (!m_pTarget || IsEntityTouching3D(m_pTarget))
|
||||
#endif
|
||||
) {
|
||||
m_eGarageState = GS_CLOSING;
|
||||
m_bClosingWithoutTargetCar = true;
|
||||
}
|
||||
}
|
||||
else if (!FindPlayerVehicle() && m_pTarget && IsEntityEntirelyInside3D(m_pTarget, 0.0f) &&
|
||||
!IsAnyOtherCarTouchingGarage(m_pTarget) && IsEntityEntirelyOutside(FindPlayerPed(), 2.0f)) {
|
||||
IsEntityEntirelyOutside(FindPlayerVehicle() ? (CEntity*)FindPlayerVehicle() : (CEntity*)FindPlayerPed(), 2.0f)) {
|
||||
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_GARAGE);
|
||||
FindPlayerPed()->m_pWanted->m_bIgnoredByCops = true;
|
||||
m_eGarageState = GS_CLOSING;
|
||||
@@ -634,7 +682,7 @@ void CGarage::Update()
|
||||
ThrowCarsNearDoorOutOfGarage(m_pTarget);
|
||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == 0.0f) {
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
if (m_bClosingWithoutTargetCar)
|
||||
m_eGarageState = GS_FULLYCLOSED;
|
||||
else {
|
||||
@@ -664,7 +712,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == m_fDoorHeight) {
|
||||
m_eGarageState = GS_OPENED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -717,7 +765,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == 0.0f) {
|
||||
m_eGarageState = GS_FULLYCLOSED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
if (m_pTarget) {
|
||||
MarkThisCarAsCollectedForCraig(m_pTarget->GetModelIndex());
|
||||
DestroyVehicleAndDriverAndPassengers(m_pTarget);
|
||||
@@ -757,7 +805,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == m_fDoorHeight) {
|
||||
m_eGarageState = GS_OPENED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -778,7 +826,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == 0.0f) {
|
||||
m_eGarageState = GS_FULLYCLOSED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
}
|
||||
if (!IsGarageEmpty())
|
||||
m_eGarageState = GS_OPENING;
|
||||
@@ -789,7 +837,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == m_fDoorHeight) {
|
||||
m_eGarageState = GS_OPENED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -823,7 +871,7 @@ void CGarage::Update()
|
||||
ThrowCarsNearDoorOutOfGarage(m_pTarget);
|
||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == 0.0f) {
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
if (m_bClosingWithoutTargetCar)
|
||||
m_eGarageState = GS_FULLYCLOSED;
|
||||
else {
|
||||
@@ -852,7 +900,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == m_fDoorHeight) {
|
||||
m_eGarageState = GS_OPENED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -872,7 +920,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == m_fDoorHeight) {
|
||||
m_eGarageState = GS_OPENED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -892,7 +940,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == 0.0f) {
|
||||
m_eGarageState = GS_FULLYCLOSED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -900,7 +948,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == m_fDoorHeight) {
|
||||
m_eGarageState = GS_OPENED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -932,8 +980,8 @@ void CGarage::Update()
|
||||
// Close car doors either if player is far, or if he is in vehicle and garage is full,
|
||||
// or if player is very very far so that we can remove whatever is blocking garage door without him noticing
|
||||
if ((distance > SQR(DISTANCE_TO_CLOSE_HIDEOUT_GARAGE_IN_CAR) ||
|
||||
!FindPlayerVehicle() && distance > SQR(DISTANCE_TO_CLOSE_HIDEOUT_GARAGE_ON_FOOT) &&
|
||||
!IsAnyCarBlockingDoor()))
|
||||
!FindPlayerVehicle() && distance > SQR(DISTANCE_TO_CLOSE_HIDEOUT_GARAGE_ON_FOOT)) &&
|
||||
!IsAnyCarBlockingDoor())
|
||||
m_eGarageState = GS_CLOSING;
|
||||
else if (FindPlayerVehicle() &&
|
||||
CountCarsWithCenterPointWithinGarage(FindPlayerVehicle()) >=
|
||||
@@ -951,7 +999,7 @@ void CGarage::Update()
|
||||
if (!IsPlayerOutsideGarage())
|
||||
m_eGarageState = GS_OPENING;
|
||||
else if (m_fDoorPos == 0.0f) {
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
m_eGarageState = GS_FULLYCLOSED;
|
||||
StoreAndRemoveCarsForThisHideout(CGarages::aCarsInSafeHouses[CGarages::FindSafeHouseIndexForGarageType(m_eGarageType)], NUM_GARAGE_STORED_CARS);
|
||||
}
|
||||
@@ -982,7 +1030,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + HIDEOUT_DOOR_SPEED_COEFFICIENT * (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == m_fDoorHeight) {
|
||||
m_eGarageState = GS_OPENED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -1009,7 +1057,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == 0.0f) {
|
||||
m_eGarageState = GS_FULLYCLOSED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -1025,7 +1073,7 @@ void CGarage::Update()
|
||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == m_fDoorHeight) {
|
||||
m_eGarageState = GS_OPENED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -1036,8 +1084,8 @@ void CGarage::Update()
|
||||
break;
|
||||
}
|
||||
break;
|
||||
//case GARAGE_COLLECTORSITEMS:
|
||||
//case GARAGE_60SECONDS:
|
||||
//case GARAGE_COLLECTORSITEMS:
|
||||
//case GARAGE_60SECONDS:
|
||||
case GARAGE_FOR_SCRIPT_TO_OPEN_FOR_CAR:
|
||||
switch (m_eGarageState) {
|
||||
case GS_OPENED:
|
||||
@@ -1046,20 +1094,23 @@ void CGarage::Update()
|
||||
m_eGarageState = GS_CLOSING;
|
||||
m_bClosingWithoutTargetCar = false;
|
||||
}
|
||||
break;
|
||||
case GS_CLOSING:
|
||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == 0.0f) {
|
||||
m_eGarageState = GS_FULLYCLOSED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_GARAGE);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
case GS_FULLYCLOSED:
|
||||
break;
|
||||
case GS_OPENING:
|
||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||
if (m_fDoorPos == m_fDoorHeight) {
|
||||
m_eGarageState = GS_OPENED;
|
||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||
}
|
||||
UpdateDoorsHeight();
|
||||
break;
|
||||
@@ -1074,28 +1125,6 @@ void CGarage::Update()
|
||||
}
|
||||
}
|
||||
|
||||
void CGarage::ThrowCarsNearDoorOutOfGarage(CVehicle* pException)
|
||||
{
|
||||
uint32 i = CPools::GetVehiclePool()->GetSize();
|
||||
while (i--) {
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i);
|
||||
if (!pVehicle || pVehicle == pException)
|
||||
continue;
|
||||
if (!IsEntityTouching3D(pVehicle))
|
||||
continue;
|
||||
CColModel* pColModel = pVehicle->GetColModel();
|
||||
for (int i = 0; i < pColModel->numSpheres; i++) {
|
||||
CVector pos = pVehicle->GetMatrix() * pColModel->spheres[i].center;
|
||||
float radius = pColModel->spheres[i].radius;
|
||||
if (!IsPointInsideGarage(pos, 0.0f)) {
|
||||
CVector vecDirectionAway(pVehicle->GetPosition().x - GetGarageCenterX(), pVehicle->GetPosition().y - GetGarageCenterY(), 0.0f);
|
||||
vecDirectionAway.Normalise();
|
||||
pVehicle->AddToMoveSpeed(vecDirectionAway * CTimer::GetTimeStepInSeconds());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CGarage::IsStaticPlayerCarEntirelyInside()
|
||||
{
|
||||
if (!FindPlayerVehicle())
|
||||
@@ -1160,7 +1189,7 @@ bool CGarage::IsPointInsideGarage(CVector pos, float m_fMargin)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CGarage::IsEntityEntirelyInside3D(CEntity * pEntity, float fMargin)
|
||||
bool CGarage::IsEntityEntirelyInside3D(CEntity* pEntity, float fMargin)
|
||||
{
|
||||
if (pEntity->GetPosition().x < m_fInfX - fMargin || pEntity->GetPosition().x > m_fSupX + fMargin ||
|
||||
pEntity->GetPosition().y < m_fInfY - fMargin || pEntity->GetPosition().y > m_fSupY + fMargin ||
|
||||
@@ -1212,12 +1241,12 @@ bool CGarage::IsPlayerOutsideGarage()
|
||||
return IsEntityEntirelyOutside(FindPlayerPed(), 0.0f);
|
||||
}
|
||||
|
||||
bool CGarage::IsEntityTouching3D(CEntity * pEntity)
|
||||
bool CGarage::IsEntityTouching3D(CEntity* pEntity)
|
||||
{
|
||||
float radius = pEntity->GetBoundRadius();
|
||||
if (pEntity->GetPosition().x - radius < m_fInfX || pEntity->GetPosition().x + radius > m_fSupX ||
|
||||
pEntity->GetPosition().y - radius < m_fInfY || pEntity->GetPosition().y + radius > m_fSupY ||
|
||||
pEntity->GetPosition().z - radius < m_fInfZ || pEntity->GetPosition().z + radius > m_fSupZ)
|
||||
if (m_fInfX - radius > pEntity->GetPosition().x || m_fSupX + radius < pEntity->GetPosition().x ||
|
||||
m_fInfY - radius > pEntity->GetPosition().y || m_fSupY + radius < pEntity->GetPosition().y ||
|
||||
m_fInfZ - radius > pEntity->GetPosition().z || m_fSupZ + radius < pEntity->GetPosition().z)
|
||||
return false;
|
||||
CColModel* pColModel = pEntity->GetColModel();
|
||||
for (int i = 0; i < pColModel->numSpheres; i++) {
|
||||
@@ -1261,6 +1290,28 @@ bool CGarage::IsAnyOtherCarTouchingGarage(CVehicle * pException)
|
||||
return false;
|
||||
}
|
||||
|
||||
void CGarage::ThrowCarsNearDoorOutOfGarage(CVehicle* pException)
|
||||
{
|
||||
uint32 i = CPools::GetVehiclePool()->GetSize();
|
||||
while (i--) {
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i);
|
||||
if (!pVehicle || pVehicle == pException)
|
||||
continue;
|
||||
if (!IsEntityTouching3D(pVehicle))
|
||||
continue;
|
||||
CColModel* pColModel = pVehicle->GetColModel();
|
||||
for (int i = 0; i < pColModel->numSpheres; i++) {
|
||||
CVector pos = pVehicle->GetMatrix() * pColModel->spheres[i].center;
|
||||
float radius = pColModel->spheres[i].radius;
|
||||
if (!IsPointInsideGarage(pos, 0.0f)) {
|
||||
CVector vecDirectionAway(pVehicle->GetPosition().x - GetGarageCenterX(), pVehicle->GetPosition().y - GetGarageCenterY(), 0.0f);
|
||||
vecDirectionAway.Normalise();
|
||||
pVehicle->AddToMoveSpeed(vecDirectionAway * CTimer::GetTimeStepInSeconds());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CGarage::IsAnyOtherPedTouchingGarage(CPed * pException)
|
||||
{
|
||||
uint32 i = CPools::GetPedPool()->GetSize();
|
||||
@@ -1328,7 +1379,9 @@ void CGarage::RemoveCarsBlockingDoorNotInside()
|
||||
if (!pVehicle->bIsLocked && pVehicle->CanBeDeleted()) {
|
||||
CWorld::Remove(pVehicle);
|
||||
delete pVehicle;
|
||||
return; // WHY?
|
||||
#ifndef FIX_BUGS
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1337,43 +1390,34 @@ void CGarage::RemoveCarsBlockingDoorNotInside()
|
||||
void CGarages::PrintMessages()
|
||||
{
|
||||
if (CTimer::GetTimeInMilliseconds() > MessageStartTime && CTimer::GetTimeInMilliseconds() < MessageEndTime) {
|
||||
CFont::SetScale(SCREEN_SCALE_X(1.2f), SCREEN_SCALE_Y(1.5f)); // BUG: game doesn't use macro here.
|
||||
CFont::DrawFonts();
|
||||
CFont::SetScale(SCREEN_SCALE_X(1.2f), SCREEN_SCALE_Y(1.5f));
|
||||
CFont::SetPropOn();
|
||||
CFont::SetJustifyOff();
|
||||
CFont::SetBackgroundOff();
|
||||
CFont::SetCentreSize(SCREEN_SCALE_X(590.0f));
|
||||
CFont::SetCentreOn();
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
|
||||
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
||||
CFont::SetColor(CRGBA(27, 89, 130, 255));
|
||||
CFont::SetDropShadowPosition(2);
|
||||
CFont::SetDropColor(CRGBA(0, 0, 0, 255));
|
||||
|
||||
#if defined(PS2) || defined (FIX_BUGS)
|
||||
float y_offset = SCREEN_HEIGHT / 3; // THIS is PS2 calculation
|
||||
#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
|
||||
|
||||
if (MessageNumberInString2 < 0) {
|
||||
if (MessageNumberInString < 0) {
|
||||
CFont::PrintString(SCREEN_WIDTH / 2 - SCREEN_SCALE_X(2.0f), y_offset - SCREEN_SCALE_Y(2.0f), TheText.Get(MessageIDString));
|
||||
|
||||
CFont::SetColor(CRGBA(27, 89, 130, 255));
|
||||
CFont::PrintString(SCREEN_WIDTH / 2, y_offset, TheText.Get(MessageIDString));
|
||||
}
|
||||
else {
|
||||
CMessages::InsertNumberInString(TheText.Get(MessageIDString), MessageNumberInString, -1, -1, -1, -1, -1, gUString);
|
||||
|
||||
CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), y_offset - SCREEN_SCALE_Y(40.0f) + SCREEN_SCALE_Y(2.0f), gUString);
|
||||
|
||||
CFont::SetColor(CRGBA(27, 89, 130, 255));
|
||||
CFont::PrintString(SCREEN_WIDTH / 2, y_offset - SCREEN_SCALE_Y(40.0f), gUString);
|
||||
}
|
||||
if (MessageNumberInString2 >= 0) {
|
||||
CMessages::InsertNumberInString(TheText.Get(MessageIDString), MessageNumberInString, MessageNumberInString2, -1, -1, -1, -1, gUString);
|
||||
CFont::PrintString(SCREEN_WIDTH / 2, y_offset - SCREEN_SCALE_Y(30.0f), gUString);
|
||||
}
|
||||
else if (MessageNumberInString >= 0) {
|
||||
CMessages::InsertNumberInString(TheText.Get(MessageIDString), MessageNumberInString, -1, -1, -1, -1, -1, gUString);
|
||||
CFont::PrintString(SCREEN_WIDTH / 2, y_offset - SCREEN_SCALE_Y(30.0f), gUString);
|
||||
}
|
||||
else {
|
||||
CMessages::InsertNumberInString(TheText.Get(MessageIDString), MessageNumberInString, MessageNumberInString2, -1, -1, -1, -1, gUString);
|
||||
CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), y_offset - SCREEN_SCALE_Y(40.0f) + SCREEN_SCALE_Y(2.0f), gUString);
|
||||
|
||||
CFont::SetColor(CRGBA(27, 89, 130, 255));
|
||||
CFont::PrintString(SCREEN_WIDTH / 2, y_offset - SCREEN_SCALE_Y(40.0f), gUString);
|
||||
CFont::PrintString(SCREEN_WIDTH / 2, y_offset, TheText.Get(MessageIDString));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1390,7 +1434,9 @@ bool CGarages::IsCarSprayable(CVehicle * pVehicle)
|
||||
case MI_BARRACKS:
|
||||
case MI_DODO:
|
||||
case MI_COACH:
|
||||
#ifndef GTA_PS2
|
||||
case MI_FBIRANCH:
|
||||
#endif
|
||||
return false;
|
||||
default:
|
||||
break;
|
||||
@@ -1462,41 +1508,54 @@ void CGarage::UpdateCrusherShake(float X, float Y)
|
||||
m_pDoor2->GetMatrix().GetPosition().y -= Y;
|
||||
}
|
||||
|
||||
// This is dumb but there is no way to avoid goto. What was there originally even?
|
||||
static bool DoINeedToRefreshPointer(CEntity * pDoor, bool bIsDummy, uint8 nIndex)
|
||||
{
|
||||
bool bNeedToFindDoorEntities = false;
|
||||
if (pDoor) {
|
||||
if (bIsDummy) {
|
||||
if (CPools::GetDummyPool()->IsFreeSlot(CPools::GetDummyPool()->GetJustIndex((CDummy*)pDoor)))
|
||||
return true;
|
||||
if (nIndex != (CPools::GetDummyPool()->GetIndex((CDummy*)pDoor) & 0x7F))
|
||||
bNeedToFindDoorEntities = true;
|
||||
if (!CGarages::IsModelIndexADoor(pDoor->GetModelIndex()))
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
if (CPools::GetObjectPool()->IsFreeSlot(CPools::GetObjectPool()->GetJustIndex((CObject*)pDoor)))
|
||||
return true;
|
||||
if (nIndex != (CPools::GetObjectPool()->GetIndex((CObject*)pDoor) & 0x7F))
|
||||
bNeedToFindDoorEntities = true;
|
||||
if (!CGarages::IsModelIndexADoor(pDoor->GetModelIndex()))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return bNeedToFindDoorEntities;
|
||||
}
|
||||
|
||||
void CGarage::RefreshDoorPointers(bool bCreate)
|
||||
{
|
||||
bool bNeedToFindDoorEntities = true;
|
||||
if (!bCreate && !m_bRecreateDoorOnNextRefresh)
|
||||
bNeedToFindDoorEntities = false;
|
||||
bool bNeedToFindDoorEntities = bCreate || m_bRecreateDoorOnNextRefresh;
|
||||
m_bRecreateDoorOnNextRefresh = false;
|
||||
if (DoINeedToRefreshPointer(m_pDoor1, m_bDoor1IsDummy, m_bDoor1PoolIndex))
|
||||
bNeedToFindDoorEntities = true;
|
||||
if (DoINeedToRefreshPointer(m_pDoor2, m_bDoor2IsDummy, m_bDoor2PoolIndex))
|
||||
bNeedToFindDoorEntities = true;
|
||||
if (m_pDoor1) {
|
||||
if (m_bDoor1IsDummy) {
|
||||
if (CPools::GetDummyPool()->IsFreeSlot(CPools::GetDummyPool()->GetJustIndex_NoFreeAssert((CDummy*)m_pDoor1)))
|
||||
bNeedToFindDoorEntities = true;
|
||||
else {
|
||||
if (m_bDoor1PoolIndex != (CPools::GetDummyPool()->GetIndex((CDummy*)m_pDoor1) & 0x7F))
|
||||
bNeedToFindDoorEntities = true;
|
||||
if (!CGarages::IsModelIndexADoor(m_pDoor1->GetModelIndex()))
|
||||
bNeedToFindDoorEntities = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (CPools::GetObjectPool()->IsFreeSlot(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert((CObject*)m_pDoor1)))
|
||||
bNeedToFindDoorEntities = true;
|
||||
else {
|
||||
if (m_bDoor1PoolIndex != (CPools::GetObjectPool()->GetIndex((CObject*)m_pDoor1) & 0x7F))
|
||||
bNeedToFindDoorEntities = true;
|
||||
if (!CGarages::IsModelIndexADoor(m_pDoor1->GetModelIndex()))
|
||||
bNeedToFindDoorEntities = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (m_pDoor2) {
|
||||
if (m_bDoor2IsDummy) {
|
||||
if (CPools::GetDummyPool()->IsFreeSlot(CPools::GetDummyPool()->GetJustIndex_NoFreeAssert((CDummy*)m_pDoor2)))
|
||||
bNeedToFindDoorEntities = true;
|
||||
else {
|
||||
if (m_bDoor2PoolIndex != (CPools::GetDummyPool()->GetIndex((CDummy*)m_pDoor2) & 0x7F))
|
||||
bNeedToFindDoorEntities = true;
|
||||
if (!CGarages::IsModelIndexADoor(m_pDoor2->GetModelIndex()))
|
||||
bNeedToFindDoorEntities = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (CPools::GetObjectPool()->IsFreeSlot(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert((CObject*)m_pDoor2)))
|
||||
bNeedToFindDoorEntities = true;
|
||||
else {
|
||||
if (m_bDoor2PoolIndex != (CPools::GetObjectPool()->GetIndex((CObject*)m_pDoor2) & 0x7F))
|
||||
bNeedToFindDoorEntities = true;
|
||||
if (!CGarages::IsModelIndexADoor(m_pDoor2->GetModelIndex()))
|
||||
bNeedToFindDoorEntities = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bNeedToFindDoorEntities)
|
||||
FindDoorsEntities();
|
||||
}
|
||||
@@ -1520,7 +1579,7 @@ void CGarages::TriggerMessage(const char* text, int16 num1, uint16 time, int16 n
|
||||
MessageNumberInString2 = num2;
|
||||
}
|
||||
|
||||
void CGarages::SetTargetCarForMissonGarage(int16 garage, CVehicle * pVehicle)
|
||||
void CGarages::SetTargetCarForMissonGarage(int16 garage, CVehicle* pVehicle)
|
||||
{
|
||||
assert(garage >= 0 && garage < NUM_GARAGES);
|
||||
if (pVehicle) {
|
||||
@@ -1663,10 +1722,10 @@ void CGarage::FindDoorsEntities()
|
||||
{
|
||||
m_pDoor1 = nil;
|
||||
m_pDoor2 = nil;
|
||||
int xstart = Max(0, CWorld::GetSectorIndexX(m_fInfX));
|
||||
int xend = Min(NUMSECTORS_X - 1, CWorld::GetSectorIndexX(m_fSupX));
|
||||
int ystart = Max(0, CWorld::GetSectorIndexY(m_fInfY));
|
||||
int yend = Min(NUMSECTORS_Y - 1, CWorld::GetSectorIndexY(m_fSupY));
|
||||
int xstart = Max(0, CWorld::GetSectorIndexX(GetGarageCenterX() - 100.0f));
|
||||
int xend = Min(NUMSECTORS_X - 1, CWorld::GetSectorIndexX(GetGarageCenterX() + 100.0f));
|
||||
int ystart = Max(0, CWorld::GetSectorIndexY(GetGarageCenterY() - 100.0f));
|
||||
int yend = Min(NUMSECTORS_Y - 1, CWorld::GetSectorIndexY(GetGarageCenterY() + 100.0f));
|
||||
assert(xstart <= xend);
|
||||
assert(ystart <= yend);
|
||||
|
||||
@@ -1779,8 +1838,8 @@ void CStoredCar::StoreCar(CVehicle* pVehicle)
|
||||
m_bExplosionproof = pVehicle->bExplosionProof;
|
||||
m_bCollisionproof = pVehicle->bCollisionProof;
|
||||
m_bMeleeproof = pVehicle->bMeleeProof;
|
||||
if (pVehicle->IsCar())
|
||||
m_nCarBombType = ((CAutomobile*)pVehicle)->m_bombType;
|
||||
if (pVehicle->IsCar() || pVehicle->IsBike())
|
||||
m_nCarBombType = ((CAutomobile*)pVehicle)->m_bombType; // NB: cast to CAutomobile is original behaviour
|
||||
}
|
||||
|
||||
CVehicle* CStoredCar::RestoreCar()
|
||||
@@ -1817,9 +1876,7 @@ CVehicle* CStoredCar::RestoreCar()
|
||||
pVehicle->m_currentColour2 = m_nSecondaryColor;
|
||||
pVehicle->m_nRadioStation = m_nRadioStation;
|
||||
pVehicle->bFreebies = false;
|
||||
#ifdef FIX_BUGS
|
||||
if (pVehicle->IsCar())
|
||||
#endif
|
||||
{
|
||||
((CAutomobile*)pVehicle)->m_bombType = m_nCarBombType;
|
||||
#ifdef FIX_BUGS
|
||||
@@ -1882,7 +1939,11 @@ bool CGarage::RestoreCarsForThisHideout(CStoredCar* aCars)
|
||||
|
||||
bool CGarages::IsPointInAGarageCameraZone(CVector point)
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
for (uint32 i = 0; i < NumGarages; i++) {
|
||||
#else
|
||||
for (int i = 0; i < NUM_GARAGES; i++) {
|
||||
#endif
|
||||
switch (aGarages[i].m_eGarageType) {
|
||||
case GARAGE_NONE:
|
||||
break;
|
||||
@@ -1909,8 +1970,13 @@ bool CGarages::CameraShouldBeOutside()
|
||||
|
||||
void CGarages::GivePlayerDetonator()
|
||||
{
|
||||
FindPlayerPed()->GiveWeapon(WEAPONTYPE_DETONATOR, 1);
|
||||
FindPlayerPed()->GetWeapon(FindPlayerPed()->GetWeaponSlot(WEAPONTYPE_DETONATOR)).m_eWeaponState = WEAPONSTATE_READY;
|
||||
CPlayerPed* pPed = FindPlayerPed();
|
||||
int slot = CWeaponInfo::GetWeaponInfo(WEAPONTYPE_DETONATOR)->m_nWeaponSlot;
|
||||
pPed->GiveWeapon(WEAPONTYPE_DETONATOR, 1);
|
||||
pPed->GetWeapon(pPed->GetWeaponSlot(WEAPONTYPE_DETONATOR)).m_eWeaponState = WEAPONSTATE_READY;
|
||||
pPed->m_nSelectedWepSlot = slot;
|
||||
if (pPed->m_storedWeapon != WEAPONTYPE_UNIDENTIFIED)
|
||||
pPed->m_storedWeapon = WEAPONTYPE_DETONATOR;
|
||||
}
|
||||
|
||||
float CGarages::FindDoorHeightForMI(int32 mi)
|
||||
@@ -1923,12 +1989,12 @@ void CGarage::TidyUpGarage()
|
||||
uint32 i = CPools::GetVehiclePool()->GetSize();
|
||||
while (i--) {
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i);
|
||||
if (!pVehicle || !pVehicle->IsCar())
|
||||
continue;
|
||||
if (IsPointInsideGarage(pVehicle->GetPosition())) {
|
||||
if (pVehicle->GetStatus() == STATUS_WRECKED || pVehicle->GetUp().z < 0.5f) {
|
||||
CWorld::Remove(pVehicle);
|
||||
delete pVehicle;
|
||||
if (pVehicle && (pVehicle->IsCar() || pVehicle->IsBike())) {
|
||||
if (IsPointInsideGarage(pVehicle->GetPosition())) {
|
||||
if (pVehicle->GetStatus() == STATUS_WRECKED || pVehicle->GetUp().z < 0.5f) {
|
||||
CWorld::Remove(pVehicle);
|
||||
delete pVehicle;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1939,9 +2005,9 @@ void CGarage::TidyUpGarageClose()
|
||||
uint32 i = CPools::GetVehiclePool()->GetSize();
|
||||
while (i--) {
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i);
|
||||
if (!pVehicle || !pVehicle->IsCar())
|
||||
if (!pVehicle)
|
||||
continue;
|
||||
if (!pVehicle->IsCar() || pVehicle->GetStatus() != STATUS_WRECKED || !IsEntityTouching3D(pVehicle))
|
||||
if ((!pVehicle->IsCar() && !pVehicle->IsBike()) || pVehicle->GetStatus() != STATUS_WRECKED || !IsEntityTouching3D(pVehicle))
|
||||
continue;
|
||||
bool bRemove = false;
|
||||
if (m_eGarageState != GS_FULLYCLOSED) {
|
||||
@@ -1966,7 +2032,11 @@ void CGarage::TidyUpGarageClose()
|
||||
void CGarages::PlayerArrestedOrDied()
|
||||
{
|
||||
static int GarageToBeTidied = 0; // lol
|
||||
#ifdef FIX_BUGS
|
||||
for (uint32 i = 0; i < NumGarages; i++) {
|
||||
#else
|
||||
for (int i = 0; i < NUM_GARAGES; i++) {
|
||||
#endif
|
||||
if (aGarages[i].m_eGarageType != GARAGE_NONE)
|
||||
aGarages[i].PlayerArrestedOrDied();
|
||||
}
|
||||
@@ -2061,20 +2131,24 @@ void CGarage::CenterCarInGarage(CVehicle* pVehicle)
|
||||
|
||||
void CGarages::CloseHideOutGaragesBeforeSave()
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
for (uint32 i = 0; i < NumGarages; i++) {
|
||||
#else
|
||||
for (int i = 0; i < NUM_GARAGES; i++) {
|
||||
#endif
|
||||
if (!IsThisGarageTypeSafehouse(aGarages[i].m_eGarageType))
|
||||
continue;
|
||||
if (aGarages[i].m_eGarageState != GS_FULLYCLOSED) {
|
||||
aGarages[i].m_eGarageState = GS_FULLYCLOSED;
|
||||
aGarages[i].StoreAndRemoveCarsForThisHideout(aCarsInSafeHouses[FindSafeHouseIndexForGarageType(aGarages[i].m_eGarageType)], NUM_GARAGE_STORED_CARS);
|
||||
aGarages[i].RemoveCarsBlockingDoorNotInside();
|
||||
aGarages[i].m_fDoorPos = 0.0f;
|
||||
aGarages[i].UpdateDoorsHeight();
|
||||
}
|
||||
aGarages[i].m_fDoorPos = 0.0f;
|
||||
aGarages[i].UpdateDoorsHeight();
|
||||
}
|
||||
}
|
||||
|
||||
int32 CGarages::CountCarsInHideoutGarage(eGarageType type)
|
||||
int32 CGarages::CountCarsInHideoutGarage(uint8 type)
|
||||
{
|
||||
int32 total = 0;
|
||||
for (int i = 0; i < NUM_GARAGE_STORED_CARS; i++) {
|
||||
@@ -2085,11 +2159,24 @@ int32 CGarages::CountCarsInHideoutGarage(eGarageType type)
|
||||
|
||||
bool CGarages::IsPointWithinHideOutGarage(Const CVector& point)
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
for (uint32 i = 0; i < NumGarages; i++) {
|
||||
#else
|
||||
for (int i = 0; i < NUM_GARAGES; i++) {
|
||||
#endif
|
||||
switch (aGarages[i].m_eGarageType) {
|
||||
case GARAGE_HIDEOUT_ONE:
|
||||
case GARAGE_HIDEOUT_TWO:
|
||||
case GARAGE_HIDEOUT_THREE:
|
||||
case GARAGE_HIDEOUT_FOUR:
|
||||
case GARAGE_HIDEOUT_FIVE:
|
||||
case GARAGE_HIDEOUT_SIX:
|
||||
case GARAGE_HIDEOUT_SEVEN:
|
||||
case GARAGE_HIDEOUT_EIGHT:
|
||||
case GARAGE_HIDEOUT_NINE:
|
||||
case GARAGE_HIDEOUT_TEN:
|
||||
case GARAGE_HIDEOUT_ELEVEN:
|
||||
case GARAGE_HIDEOUT_TWELVE:
|
||||
if (aGarages[i].IsPointInsideGarage(point))
|
||||
return true;
|
||||
default: break;
|
||||
@@ -2100,7 +2187,11 @@ bool CGarages::IsPointWithinHideOutGarage(Const CVector& point)
|
||||
|
||||
bool CGarages::IsPointWithinAnyGarage(Const CVector& point)
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
for (uint32 i = 0; i < NumGarages; i++) {
|
||||
#else
|
||||
for (int i = 0; i < NUM_GARAGES; i++) {
|
||||
#endif
|
||||
switch (aGarages[i].m_eGarageType) {
|
||||
case GARAGE_NONE:
|
||||
continue;
|
||||
@@ -2114,7 +2205,11 @@ bool CGarages::IsPointWithinAnyGarage(Const CVector& point)
|
||||
|
||||
void CGarages::SetAllDoorsBackToOriginalHeight()
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
for (uint32 i = 0; i < NumGarages; i++) {
|
||||
#else
|
||||
for (int i = 0; i < NUM_GARAGES; i++) {
|
||||
#endif
|
||||
switch (aGarages[i].m_eGarageType) {
|
||||
case GARAGE_NONE:
|
||||
continue;
|
||||
|
||||
+15
-17
@@ -7,7 +7,7 @@
|
||||
class CVehicle;
|
||||
class CCamera;
|
||||
|
||||
enum eGarageState : int8
|
||||
enum eGarageState
|
||||
{
|
||||
GS_FULLYCLOSED,
|
||||
GS_OPENED,
|
||||
@@ -18,7 +18,7 @@ enum eGarageState : int8
|
||||
GS_AFTERDROPOFF,
|
||||
};
|
||||
|
||||
enum eGarageType : int8
|
||||
enum eGarageType
|
||||
{
|
||||
GARAGE_NONE,
|
||||
GARAGE_MISSION,
|
||||
@@ -93,8 +93,8 @@ VALIDATE_SIZE(CStoredCar, 0x28);
|
||||
|
||||
class CGarage
|
||||
{
|
||||
eGarageType m_eGarageType;
|
||||
eGarageState m_eGarageState;
|
||||
uint8 m_eGarageType;
|
||||
uint8 m_eGarageState;
|
||||
uint8 m_nMaxStoredCars;
|
||||
bool field_2; // unused
|
||||
bool m_bClosingWithoutTargetCar;
|
||||
@@ -148,8 +148,8 @@ class CGarage
|
||||
return Abs(TheCamera.GetPosition().x - GetGarageCenterX()) > SWITCH_GARAGE_DISTANCE_CLOSE ||
|
||||
Abs(TheCamera.GetPosition().y - GetGarageCenterY()) > SWITCH_GARAGE_DISTANCE_CLOSE;
|
||||
#else
|
||||
return Abs(TheCamera.GetPosition().x - m_fX1) > SWITCH_GARAGE_DISTANCE_CLOSE ||
|
||||
Abs(TheCamera.GetPosition().y - m_fY1) > SWITCH_GARAGE_DISTANCE_CLOSE;
|
||||
return Abs(TheCamera.GetPosition().x - m_fInfX) > SWITCH_GARAGE_DISTANCE_CLOSE ||
|
||||
Abs(TheCamera.GetPosition().y - m_fInfY) > SWITCH_GARAGE_DISTANCE_CLOSE;
|
||||
#endif
|
||||
}
|
||||
void TidyUpGarageClose();
|
||||
@@ -187,7 +187,7 @@ class CGarage
|
||||
bool IsPointInsideGarage(CVector, float);
|
||||
void ThrowCarsNearDoorOutOfGarage(CVehicle*);
|
||||
|
||||
int32 FindMaxNumStoredCarsForGarage() { return Max(NUM_GARAGE_STORED_CARS, m_nMaxStoredCars); }
|
||||
int32 FindMaxNumStoredCarsForGarage() { return Min(NUM_GARAGE_STORED_CARS, m_nMaxStoredCars); }
|
||||
|
||||
friend class CGarages;
|
||||
friend class cAudioManager;
|
||||
@@ -198,7 +198,6 @@ class CGarages
|
||||
{
|
||||
enum {
|
||||
MESSAGE_LENGTH = 8,
|
||||
MAX_NUM_CARS_IN_HIDEOUT_GARAGE = 4
|
||||
};
|
||||
static int32 BankVansCollected;
|
||||
static bool BombsAreFree;
|
||||
@@ -216,8 +215,7 @@ class CGarages
|
||||
static bool PlayerInGarage;
|
||||
static int32 PoliceCarsCollected;
|
||||
static CGarage aGarages[NUM_GARAGES];
|
||||
static CStoredCar aCarsInSafeHouses[TOTAL_HIDEOUT_GARAGES][MAX_NUM_CARS_IN_HIDEOUT_GARAGE];
|
||||
static int32 AudioEntity;
|
||||
static CStoredCar aCarsInSafeHouses[TOTAL_HIDEOUT_GARAGES][NUM_GARAGE_STORED_CARS];
|
||||
static bool bCamShouldBeOutisde;
|
||||
|
||||
public:
|
||||
@@ -227,8 +225,8 @@ public:
|
||||
#endif
|
||||
static void Update(void);
|
||||
|
||||
static int16 AddOne(float X1, float Y1, float Z1, float X2, float Y2, float X3, float Y3, float Z2, eGarageType type, int32 targetId);
|
||||
static void ChangeGarageType(int16, eGarageType, int32);
|
||||
static int16 AddOne(float X1, float Y1, float Z1, float X2, float Y2, float X3, float Y3, float Z2, uint8 type, int32 targetId);
|
||||
static void ChangeGarageType(int16, uint8, int32);
|
||||
static void PrintMessages(void);
|
||||
static void TriggerMessage(const char* text, int16, uint16 time, int16);
|
||||
static void SetTargetCarForMissonGarage(int16, CVehicle*);
|
||||
@@ -265,9 +263,9 @@ private:
|
||||
static bool IsCarSprayable(CVehicle*);
|
||||
static float FindDoorHeightForMI(int32);
|
||||
static void CloseHideOutGaragesBeforeSave(void);
|
||||
static int32 CountCarsInHideoutGarage(eGarageType);
|
||||
static int32 GetBombTypeForGarageType(eGarageType type) { return type - GARAGE_BOMBSHOP1 + 1; }
|
||||
static int32 GetCarsCollectedIndexForGarageType(eGarageType type)
|
||||
static int32 CountCarsInHideoutGarage(uint8);
|
||||
static int32 GetBombTypeForGarageType(uint8 type) { return type - GARAGE_BOMBSHOP1 + 1; }
|
||||
static int32 GetCarsCollectedIndexForGarageType(uint8 type)
|
||||
{
|
||||
switch (type) {
|
||||
case GARAGE_COLLECTCARS_1: return 0;
|
||||
@@ -278,7 +276,7 @@ private:
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
static int32 FindSafeHouseIndexForGarageType(eGarageType type)
|
||||
static int32 FindSafeHouseIndexForGarageType(uint8 type)
|
||||
{
|
||||
switch (type) {
|
||||
case GARAGE_HIDEOUT_ONE: return 0;
|
||||
@@ -296,7 +294,7 @@ private:
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
static bool IsThisGarageTypeSafehouse(eGarageType type) { return FindSafeHouseIndexForGarageType(type) >= 0; }
|
||||
static bool IsThisGarageTypeSafehouse(uint8 type) { return FindSafeHouseIndexForGarageType(type) >= 0; }
|
||||
|
||||
friend class cAudioManager;
|
||||
friend class CReplay;
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
#include "common.h"
|
||||
#include "NameGrid.h"
|
||||
|
||||
// TODO: reverse mobile code
|
||||
|
||||
CPlayerName::CPlayerName()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerName::DisplayName(int)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
CRow::CRow()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
void
|
||||
CRow::SetLetter(int, wchar *)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
CGrid::CGrid()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
void
|
||||
CGrid::ProcessAnyLeftJustDown()
|
||||
{
|
||||
unk_int2--;
|
||||
}
|
||||
|
||||
void
|
||||
CGrid::ProcessAnyRightJustDown()
|
||||
{
|
||||
unk_int2++;
|
||||
}
|
||||
|
||||
void
|
||||
CGrid::ProcessAnyUpJustDown()
|
||||
{
|
||||
unk_int1--;
|
||||
}
|
||||
|
||||
void
|
||||
CGrid::ProcessAnyDownJustDown()
|
||||
{
|
||||
unk_int1++;
|
||||
}
|
||||
|
||||
void
|
||||
CGrid::AllDoneMakePlayerName()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
void
|
||||
CGrid::ProcessDPadCrossJustDown()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
void
|
||||
CGrid::DisplayGrid()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
void
|
||||
CGrid::ProcessControllerInput()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
void
|
||||
CGrid::Process()
|
||||
{
|
||||
ProcessControllerInput();
|
||||
DisplayGrid();
|
||||
playerName.DisplayName(2 * playerName.unk_4c);
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
#pragma once
|
||||
|
||||
// TODO: reverse mobile code
|
||||
|
||||
class CPlayerName
|
||||
{
|
||||
friend class CGrid;
|
||||
|
||||
float x;
|
||||
float y;
|
||||
wchar unk_8[34];
|
||||
int unk_4c;
|
||||
public:
|
||||
CPlayerName();
|
||||
void DisplayName(int);
|
||||
};
|
||||
|
||||
class CRow
|
||||
{
|
||||
friend class CGrid;
|
||||
|
||||
int unk_0;
|
||||
int unk_4;
|
||||
wchar unk_8[20];
|
||||
int unk_30;
|
||||
public:
|
||||
CRow();
|
||||
void SetLetter(int, wchar *);
|
||||
};
|
||||
|
||||
class CGrid
|
||||
{
|
||||
CRow rows[5];
|
||||
int unk_int1;
|
||||
int unk_int2;
|
||||
int unk_int3;
|
||||
float unk_float1;
|
||||
float unk_float2;
|
||||
CPlayerName playerName;
|
||||
char unk2[4];
|
||||
char unk3[4];
|
||||
public:
|
||||
CGrid();
|
||||
void ProcessAnyLeftJustDown();
|
||||
void ProcessAnyRightJustDown();
|
||||
void ProcessAnyUpJustDown();
|
||||
void ProcessAnyDownJustDown();
|
||||
void AllDoneMakePlayerName();
|
||||
void ProcessDPadCrossJustDown();
|
||||
void DisplayGrid();
|
||||
void ProcessControllerInput();
|
||||
void Process();
|
||||
};
|
||||
@@ -286,6 +286,8 @@ CPathFind::AllocatePathFindInfoMem(int16 numPathGroups)
|
||||
DetachedInfoForTilePeds = new CPathInfoForObject[12*NUMDETACHED_PEDS];
|
||||
memset(DetachedInfoForTilePeds, 0, 12*NUMDETACHED_PEDS*sizeof(CPathInfoForObject));
|
||||
|
||||
delete[] TempExternalNodes;
|
||||
TempExternalNodes = nil;
|
||||
TempExternalNodes = new CTempNodeExternal[NUMTEMPEXTERNALNODES];
|
||||
memset(TempExternalNodes, 0, NUMTEMPEXTERNALNODES*sizeof(CTempNodeExternal));
|
||||
NumTempExternalNodes = 0;
|
||||
@@ -1766,10 +1768,18 @@ CPathFind::TestCoorsCloseness(CVector target, uint8 type, CVector start)
|
||||
DoPathSearch(type, start, -1, target, pNodeList, &DummyResult, 32, nil, &dist, 999999.88f, -1);
|
||||
else
|
||||
DoPathSearch(type, start, -1, target, nil, &DummyResult2, 0, nil, &dist, 50.0f, -1);
|
||||
#ifdef FIX_BUGS
|
||||
// dist has GenerationDistMultiplier as a factor, so our reference dist should have it too
|
||||
if(type == PATH_CAR)
|
||||
return dist < 150.0f*TheCamera.GenerationDistMultiplier;
|
||||
else
|
||||
return dist < 100.0f*TheCamera.GenerationDistMultiplier;
|
||||
#else
|
||||
if(type == PATH_CAR)
|
||||
return dist < 150.0f;
|
||||
else
|
||||
return dist < 100.0f;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -58,7 +58,7 @@ CPhoneInfo::Update(void)
|
||||
} else {
|
||||
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PHONE);
|
||||
if (player->m_nPedState == PED_MAKE_CALL)
|
||||
player->m_nPedState = PED_IDLE;
|
||||
player->SetPedState(PED_IDLE);
|
||||
}
|
||||
}
|
||||
bool notInCar;
|
||||
@@ -105,7 +105,7 @@ CPhoneInfo::Update(void)
|
||||
player->m_fRotationCur = angleToFace;
|
||||
player->m_fRotationDest = angleToFace;
|
||||
player->SetHeading(angleToFace);
|
||||
player->m_nPedState = PED_MAKE_CALL;
|
||||
player->SetPedState(PED_MAKE_CALL);
|
||||
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_PHONE);
|
||||
TheCamera.SetWideScreenOn();
|
||||
playerInfo->MakePlayerSafe(true);
|
||||
@@ -308,7 +308,7 @@ INITSAVEBUF
|
||||
|
||||
// Convert entity pointer to building pool index while saving
|
||||
if (phone->m_pEntity) {
|
||||
phone->m_pEntity = (CEntity*) (CPools::GetBuildingPool()->GetJustIndex((CBuilding*)phone->m_pEntity) + 1);
|
||||
phone->m_pEntity = (CEntity*) (CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert((CBuilding*)phone->m_pEntity) + 1);
|
||||
}
|
||||
}
|
||||
VALIDATESAVEBUF(*size)
|
||||
@@ -333,7 +333,7 @@ PhonePutDownCB(CAnimBlendAssociation *assoc, void *arg)
|
||||
ped->bUpdateAnimHeading = true;
|
||||
|
||||
if (ped->m_nPedState == PED_MAKE_CALL)
|
||||
ped->m_nPedState = PED_IDLE;
|
||||
ped->SetPedState(PED_IDLE);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
+112
-16
@@ -140,18 +140,12 @@ ModifyStringLabelForControlSetting(char *str)
|
||||
}
|
||||
}
|
||||
|
||||
inline bool
|
||||
IsWeaponSlotAmmoMergeable(uint32 slot)
|
||||
{
|
||||
return slot == WEAPONSLOT_SHOTGUN || slot == WEAPONSLOT_SUBMACHINEGUN || slot == WEAPONSLOT_RIFLE;
|
||||
}
|
||||
|
||||
void
|
||||
CPickup::ExtractAmmoFromPickup(CPlayerPed *player)
|
||||
{
|
||||
eWeaponType weaponType = CPickups::WeaponForModel(m_pObject->GetModelIndex());
|
||||
|
||||
if (m_eType == PICKUP_IN_SHOP || !IsWeaponSlotAmmoMergeable(CWeaponInfo::GetWeaponInfo(weaponType)->m_nWeaponSlot))
|
||||
if (m_eType == PICKUP_IN_SHOP || !CWeaponInfo::IsWeaponSlotAmmoMergeable(CWeaponInfo::GetWeaponInfo(weaponType)->m_nWeaponSlot))
|
||||
return;
|
||||
|
||||
uint32 ammo = m_nQuantity;
|
||||
@@ -374,14 +368,14 @@ CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
||||
eWeaponType plrWeaponSlot = FindPlayerPed()->GetWeapon(slot).m_eWeaponType;
|
||||
if (plrWeaponSlot != weaponType) {
|
||||
if (CStreaming::ms_aInfoForModel[m_pObject->GetModelIndex()].m_loadState == STREAMSTATE_LOADED) {
|
||||
if (plrWeaponSlot == WEAPONTYPE_UNARMED || (FindPlayerPed()->GetWeapon(slot).m_nAmmoTotal == 0 && !IsWeaponSlotAmmoMergeable(slot))) {
|
||||
if (plrWeaponSlot == WEAPONTYPE_UNARMED || (FindPlayerPed()->GetWeapon(slot).m_nAmmoTotal == 0 && !CWeaponInfo::IsWeaponSlotAmmoMergeable(slot))) {
|
||||
if (CTimer::GetTimeInMilliseconds() - FindPlayerPed()->m_nPadDownPressedInMilliseconds < 1500) {
|
||||
CPickups::PlayerOnWeaponPickup = 6;
|
||||
isPickupTouched = false;
|
||||
}
|
||||
} else {
|
||||
CPickups::PlayerOnWeaponPickup = 6;
|
||||
if (IsWeaponSlotAmmoMergeable(slot)) {
|
||||
if (CWeaponInfo::IsWeaponSlotAmmoMergeable(slot)) {
|
||||
if (m_eType == PICKUP_ONCE_TIMEOUT || m_eType == PICKUP_ONCE || m_eType == PICKUP_ON_STREET) {
|
||||
ExtractAmmoFromPickup(player);
|
||||
FindPlayerPed()->GetWeapon(slot).Reload();
|
||||
@@ -602,7 +596,10 @@ CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
||||
bool explode = false;
|
||||
if (CTimer::GetTimeInMilliseconds() > m_nTimer)
|
||||
explode = true;
|
||||
else {// added else here since vehicle lookup is useless
|
||||
#ifdef FIX_BUGS
|
||||
else// added else here since vehicle lookup is useless
|
||||
#endif
|
||||
{
|
||||
for (int32 i = CPools::GetVehiclePool()->GetSize()-1; i >= 0; i--) {
|
||||
CVehicle *vehicle = CPools::GetVehiclePool()->GetSlot(i);
|
||||
if (vehicle != nil && vehicle->IsSphereTouchingVehicle(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z, 1.5f)) {
|
||||
@@ -625,11 +622,11 @@ CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
||||
|
||||
m_pObject->GetMatrix().UpdateRW();
|
||||
m_pObject->UpdateRwFrame();
|
||||
if (CWaterLevel::GetWaterLevel(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z + 5.0f, &waterLevel, 0) && waterLevel >= m_pObject->GetPosition().z)
|
||||
if (CWaterLevel::GetWaterLevel(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z + 5.0f, &waterLevel, false) && waterLevel >= m_pObject->GetPosition().z)
|
||||
m_eType = PICKUP_FLOATINGPACKAGE_FLOATING;
|
||||
break;
|
||||
case PICKUP_FLOATINGPACKAGE_FLOATING:
|
||||
if (CWaterLevel::GetWaterLevel(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z + 5.0f, &waterLevel, 0))
|
||||
if (CWaterLevel::GetWaterLevel(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z + 5.0f, &waterLevel, false))
|
||||
m_pObject->GetMatrix().GetPosition().z = waterLevel;
|
||||
|
||||
m_pObject->GetMatrix().UpdateRW();
|
||||
@@ -858,7 +855,7 @@ CPickups::GenerateNewOne(CVector pos, uint32 modelIndex, uint8 type, uint32 quan
|
||||
|
||||
if (slot >= NUMPICKUPS) return -1;
|
||||
|
||||
aPickUps[slot].m_eType = (ePickupType)type;
|
||||
aPickUps[slot].m_eType = type;
|
||||
aPickUps[slot].m_bRemoved = false;
|
||||
aPickUps[slot].m_nQuantity = quantity;
|
||||
aPickUps[slot].m_nMoneySpeed = rate;
|
||||
@@ -1384,7 +1381,7 @@ void
|
||||
CPickups::RemoveAllPickupsOfACertainWeaponGroupWithNoAmmo(eWeaponType weaponType)
|
||||
{
|
||||
uint32 weaponSlot = CWeaponInfo::GetWeaponInfo(weaponType)->m_nWeaponSlot;
|
||||
if (IsWeaponSlotAmmoMergeable(weaponSlot)) {
|
||||
if (CWeaponInfo::IsWeaponSlotAmmoMergeable(weaponSlot)) {
|
||||
for (int slot = 0; slot < NUMPICKUPS; slot++) {
|
||||
if (aPickUps[slot].m_eType == PICKUP_ONCE || aPickUps[slot].m_eType == PICKUP_ONCE_TIMEOUT || aPickUps[slot].m_eType == PICKUP_ONCE_TIMEOUT_SLOW) {
|
||||
if (aPickUps[slot].m_pObject) {
|
||||
@@ -1464,9 +1461,9 @@ INITSAVEBUF
|
||||
CPickup *buf_pickup = WriteSaveBuf(buf, aPickUps[i]);
|
||||
if (buf_pickup->m_eType != PICKUP_NONE) {
|
||||
if (buf_pickup->m_pObject != nil)
|
||||
buf_pickup->m_pObject = (CObject*)(CPools::GetObjectPool()->GetJustIndex(buf_pickup->m_pObject) + 1);
|
||||
buf_pickup->m_pObject = (CObject*)(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(buf_pickup->m_pObject) + 1);
|
||||
if (buf_pickup->m_pExtraObject != nil)
|
||||
buf_pickup->m_pExtraObject = (CObject*)(CPools::GetObjectPool()->GetJustIndex(buf_pickup->m_pExtraObject) + 1);
|
||||
buf_pickup->m_pExtraObject = (CObject*)(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(buf_pickup->m_pExtraObject) + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1578,3 +1575,102 @@ void
|
||||
CPacManPickups::ResetPowerPillsCarriedByPlayer()
|
||||
{
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPed::CreateDeadPedMoney(void)
|
||||
{
|
||||
if (!CGame::nastyGame)
|
||||
return;
|
||||
|
||||
int mi = GetModelIndex();
|
||||
|
||||
if ((mi >= MI_COP && mi <= MI_FIREMAN) || (CharCreatedBy == MISSION_CHAR && !bMoneyHasBeenGivenByScript) || bInVehicle)
|
||||
return;
|
||||
|
||||
int money = m_nPedMoney;
|
||||
if (money < 10)
|
||||
return;
|
||||
|
||||
CVector pickupPos = GetPosition();
|
||||
CPickups::CreateSomeMoney(pickupPos, money);
|
||||
m_nPedMoney = 0;
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPed::CreateDeadPedWeaponPickups(void)
|
||||
{
|
||||
CVector pickupPos;
|
||||
|
||||
if (bInVehicle)
|
||||
return;
|
||||
|
||||
for(int i = 0; i < TOTAL_WEAPON_SLOTS; i++) {
|
||||
|
||||
eWeaponType weapon = GetWeapon(i).m_eWeaponType;
|
||||
int weaponAmmo = GetWeapon(i).m_nAmmoTotal;
|
||||
if (weapon == WEAPONTYPE_UNARMED || weapon == WEAPONTYPE_DETONATOR || (weaponAmmo == 0 && !GetWeapon(i).IsTypeMelee()))
|
||||
continue;
|
||||
|
||||
int quantity = Min(weaponAmmo, AmmoForWeapon_OnStreet[weapon] / 2);
|
||||
CreateDeadPedPickupCoors(&pickupPos.x, &pickupPos.y, &pickupPos.z);
|
||||
pickupPos.z += 0.3f;
|
||||
if (!CPickups::TryToMerge_WeaponType(pickupPos, weapon, PICKUP_ONCE_TIMEOUT, quantity, false)) {
|
||||
CPickups::GenerateNewOne_WeaponType(pickupPos, weapon, PICKUP_ONCE_TIMEOUT, Min(weaponAmmo, quantity));
|
||||
}
|
||||
}
|
||||
ClearWeapons();
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPed::CreateDeadPedPickupCoors(float *x, float *y, float *z)
|
||||
{
|
||||
bool found = false;
|
||||
CVector pickupPos;
|
||||
|
||||
#define NUMBER_OF_ATTEMPTS 32
|
||||
for (int i = 0; i < NUMBER_OF_ATTEMPTS; i++) {
|
||||
|
||||
pickupPos = GetPosition();
|
||||
pickupPos.x = 1.5f * Sin((CGeneral::GetRandomNumber() % 256)/256.0f * TWOPI) + GetPosition().x;
|
||||
pickupPos.y = 1.5f * Cos((CGeneral::GetRandomNumber() % 256)/256.0f * TWOPI) + GetPosition().y;
|
||||
pickupPos.z = CWorld::FindGroundZFor3DCoord(pickupPos.x, pickupPos.y, pickupPos.z, &found) + 0.5f;
|
||||
|
||||
if (!found)
|
||||
continue;
|
||||
|
||||
CVector pedPos = GetPosition();
|
||||
pedPos.z += 0.3f;
|
||||
|
||||
CVector pedToPickup = pickupPos - pedPos;
|
||||
float distance = pedToPickup.Magnitude();
|
||||
|
||||
// outer edge of pickup
|
||||
distance = (distance + 0.4f) / distance;
|
||||
CVector pickupPos2 = pedPos;
|
||||
pickupPos2 += distance * pedToPickup;
|
||||
|
||||
if ((pickupPos - FindPlayerCoors()).Magnitude2D() > 2.0f || i > NUMBER_OF_ATTEMPTS / 2) {
|
||||
|
||||
if (i > NUMBER_OF_ATTEMPTS / 2 || !CPickups::TestForPickupsInBubble(pickupPos, 1.3f)) {
|
||||
|
||||
if (CWorld::GetIsLineOfSightClear(pickupPos2, pedPos,
|
||||
true, i < NUMBER_OF_ATTEMPTS / 2, false, i < NUMBER_OF_ATTEMPTS / 2, false, false, false)) {
|
||||
|
||||
if (i > NUMBER_OF_ATTEMPTS / 2 || !CWorld::TestSphereAgainstWorld(pickupPos, 1.2f, nil, false, true, false, false, false, false)) {
|
||||
*x = pickupPos.x;
|
||||
*y = pickupPos.y;
|
||||
*z = pickupPos.z;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*x = GetPosition().x;
|
||||
*y = GetPosition().y;
|
||||
*z = GetPosition().z + 0.4f;
|
||||
#undef NUMBER_OF_ATTEMPTS
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
#include "Weapon.h"
|
||||
|
||||
enum ePickupType : uint8
|
||||
enum ePickupType
|
||||
{
|
||||
PICKUP_NONE = 0,
|
||||
PICKUP_IN_SHOP,
|
||||
@@ -43,7 +43,7 @@ public:
|
||||
int16 m_eModelIndex;
|
||||
uint16 m_nIndex;
|
||||
char m_sTextKey[8];
|
||||
ePickupType m_eType;
|
||||
uint8 m_eType;
|
||||
bool m_bRemoved;
|
||||
uint8 m_bWasAmmoCollected:1;
|
||||
uint8 m_bWasControlMessageShown:1;
|
||||
|
||||
@@ -57,9 +57,7 @@ public:
|
||||
static void RestoreInfoForMatrix(CMatrix&, CCarStateEachFrame*);
|
||||
static void RestoreInfoForCar(CAutomobile*, CCarStateEachFrame*, bool);
|
||||
static void ProcessControlCars(void);
|
||||
#if (defined(GTA_PS2) || defined(FIX_BUGS))
|
||||
static bool ShouldThisPadBeLeftAlone(uint8 pad);
|
||||
#endif
|
||||
static void GiveUsACar(int32, CVector, float, CAutomobile**, uint8, uint8);
|
||||
static void StartChaseScene(float);
|
||||
static void CleanUpChaseScene(void);
|
||||
|
||||
+33
-16
@@ -1,5 +1,5 @@
|
||||
#include "common.h"
|
||||
|
||||
#ifdef GTA_REPLAY
|
||||
#include "AnimBlendAssocGroup.h"
|
||||
#include "AnimBlendAssociation.h"
|
||||
#include "Bike.h"
|
||||
@@ -794,10 +794,19 @@ void CReplay::StoreBikeUpdate(CVehicle* vehicle, int id)
|
||||
vp->matrix.CompressFromFullMatrix(vehicle->GetMatrix());
|
||||
vp->health = vehicle->m_fHealth / 4.0f; /* Not anticipated that health can be > 1000. */
|
||||
vp->acceleration = vehicle->m_fGasPedal * 100.0f;
|
||||
#ifdef FIX_BUGS // originally it's undefined behaviour - different fields are copied on PC and mobile
|
||||
for (int i = 0; i < 2; i++)
|
||||
vp->wheel_rotation[i] = 128.0f / PI * bike->m_aWheelRotation[i];
|
||||
for (int i = 0; i < 2; i++)
|
||||
vp->wheel_rotation[i + 2] = 128.0f / PI * bike->m_aWheelSpeed[i];
|
||||
for (int i = 0; i < 4; i++)
|
||||
vp->wheel_susp_dist[i] = 50.0f * bike->m_aSuspensionSpringRatio[i];
|
||||
#else
|
||||
for (int i = 0; i < 4; i++) {
|
||||
vp->wheel_susp_dist[i] = 50.0f * bike->m_aSuspensionSpringRatio[i];
|
||||
vp->wheel_rotation[i] = 128.0f / PI * bike->m_aWheelRotation[i];
|
||||
}
|
||||
#endif
|
||||
vp->velocityX = 8000.0f * Max(-4.0f, Min(4.0f, vehicle->GetMoveSpeed().x)); /* 8000!? */
|
||||
vp->velocityY = 8000.0f * Max(-4.0f, Min(4.0f, vehicle->GetMoveSpeed().y));
|
||||
vp->velocityZ = 8000.0f * Max(-4.0f, Min(4.0f, vehicle->GetMoveSpeed().z));
|
||||
@@ -902,12 +911,19 @@ void CReplay::ProcessBikeUpdate(CVehicle* vehicle, float interpolation, CAddress
|
||||
vehicle->m_vecMoveSpeed = CVector(vp->velocityX / 8000.0f, vp->velocityY / 8000.0f, vp->velocityZ / 8000.0f);
|
||||
vehicle->m_fSteerAngle = vp->wheel_state / 50.0f;
|
||||
vehicle->bEngineOn = true;
|
||||
#ifdef FIX_BUGS
|
||||
for (int i = 0; i < 2; i++)
|
||||
bike->m_aWheelRotation[i] = vp->wheel_rotation[i] / (128.0f / PI);
|
||||
for (int i = 0; i < 2; i++)
|
||||
bike->m_aWheelSpeed[i] = vp->wheel_rotation[i + 2] / (128.0f / PI);
|
||||
for (int i = 0; i < 4; i++)
|
||||
bike->m_aSuspensionSpringRatio[i] = vp->wheel_susp_dist[i] / 50.0f;
|
||||
#else
|
||||
for (int i = 0; i < 4; i++) {
|
||||
bike->m_aSuspensionSpringRatio[i] = vp->wheel_susp_dist[i] / 50.0f;
|
||||
bike->m_aWheelRotation[i] = vp->wheel_rotation[i] / (128.0f / PI);
|
||||
// NB: technically last assignment overflows - there are 2 wheels of bike
|
||||
// however it saves two useful fields; this looks like unrolled loop, not sequential assignments
|
||||
}
|
||||
#endif
|
||||
bike->m_fLeanLRAngle = vp->lean_angle / 50.0f;
|
||||
bike->m_fWheelAngle = vp->wheel_angle / 50.0f;
|
||||
bike->bLeanMatrixClean = false;
|
||||
@@ -1218,10 +1234,10 @@ void CReplay::ProcessReplayCamera(void)
|
||||
TheCamera.GetUp() = CVector(0.0f, 1.0f, 0.0f);
|
||||
TheCamera.GetRight() = CVector(1.0f, 0.0f, 0.0f);
|
||||
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
||||
pm->pos = *(RwV3d*)&TheCamera.GetPosition();
|
||||
pm->at = *(RwV3d*)&TheCamera.GetForward();
|
||||
pm->up = *(RwV3d*)&TheCamera.GetUp();
|
||||
pm->right = *(RwV3d*)&TheCamera.GetRight();
|
||||
pm->pos = TheCamera.GetPosition();
|
||||
pm->at = TheCamera.GetForward();
|
||||
pm->up = TheCamera.GetUp();
|
||||
pm->right = TheCamera.GetRight();
|
||||
break;
|
||||
}
|
||||
case REPLAYCAMMODE_FIXED:
|
||||
@@ -1237,10 +1253,10 @@ void CReplay::ProcessReplayCamera(void)
|
||||
TheCamera.GetMatrix().GetUp() = up;
|
||||
TheCamera.GetMatrix().GetRight() = right;
|
||||
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
||||
pm->pos = *(RwV3d*)&TheCamera.GetMatrix().GetPosition();
|
||||
pm->at = *(RwV3d*)&TheCamera.GetMatrix().GetForward();
|
||||
pm->up = *(RwV3d*)&TheCamera.GetMatrix().GetUp();
|
||||
pm->right = *(RwV3d*)&TheCamera.GetMatrix().GetRight();
|
||||
pm->pos = TheCamera.GetMatrix().GetPosition();
|
||||
pm->at = TheCamera.GetMatrix().GetForward();
|
||||
pm->up = TheCamera.GetMatrix().GetUp();
|
||||
pm->right = TheCamera.GetMatrix().GetRight();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -1447,7 +1463,7 @@ void CReplay::RestoreStuffFromMem(void)
|
||||
ped->m_rwObject = nil;
|
||||
ped->m_modelIndex = -1;
|
||||
ped->SetModelIndex(mi);
|
||||
ped->m_pVehicleAnim = 0;
|
||||
ped->m_pVehicleAnim = nil;
|
||||
ped->m_audioEntityId = DMAudio.CreateEntity(AUDIOTYPE_PHYSICAL, ped);
|
||||
DMAudio.SetEntityStatus(ped->m_audioEntityId, true);
|
||||
CPopulation::UpdatePedCount((ePedType)ped->m_nPedType, false);
|
||||
@@ -1840,10 +1856,10 @@ void CReplay::ProcessLookAroundCam(void)
|
||||
TheCamera.GetRight() = right;
|
||||
TheCamera.SetPosition(camera_pt);
|
||||
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
||||
pm->pos = *(RwV3d*)&TheCamera.GetPosition();
|
||||
pm->at = *(RwV3d*)&TheCamera.GetForward();
|
||||
pm->up = *(RwV3d*)&TheCamera.GetUp();
|
||||
pm->right = *(RwV3d*)&TheCamera.GetRight();
|
||||
pm->pos = TheCamera.GetPosition();
|
||||
pm->at = TheCamera.GetForward();
|
||||
pm->up = TheCamera.GetUp();
|
||||
pm->right = TheCamera.GetRight();
|
||||
TheCamera.CalculateDerivedValues();
|
||||
RwMatrixUpdate(RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera)));
|
||||
RwFrameUpdateObjects(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
||||
@@ -1887,3 +1903,4 @@ void CReplay::Display()
|
||||
if (Mode == MODE_PLAYBACK)
|
||||
CFont::PrintString(SCREEN_SCALE_X(63.5f), SCREEN_SCALE_Y(30.0f), TheText.Get("REPLAY"));
|
||||
}
|
||||
#endif
|
||||
|
||||
+23
-12
@@ -66,6 +66,12 @@ struct CStoredDetailedAnimationState
|
||||
|
||||
void PlayReplayFromHD(void);
|
||||
|
||||
#ifdef GTA_REPLAY
|
||||
#define REPLAY_STUB
|
||||
#else
|
||||
#define REPLAY_STUB {}
|
||||
#endif
|
||||
|
||||
class CReplay
|
||||
{
|
||||
enum {
|
||||
@@ -362,21 +368,25 @@ private:
|
||||
#endif
|
||||
|
||||
public:
|
||||
static void Init(void);
|
||||
static void DisableReplays(void);
|
||||
static void EnableReplays(void);
|
||||
static void Update(void);
|
||||
static void FinishPlayback(void);
|
||||
static void EmptyReplayBuffer(void);
|
||||
static void Display(void);
|
||||
static void TriggerPlayback(uint8 cam_mode, float cam_x, float cam_y, float cam_z, bool load_scene);
|
||||
static void StreamAllNecessaryCarsAndPeds(void);
|
||||
static bool ShouldStandardCameraBeProcessed(void);
|
||||
static void Init(void) REPLAY_STUB;
|
||||
static void DisableReplays(void) REPLAY_STUB;
|
||||
static void EnableReplays(void) REPLAY_STUB;
|
||||
static void Update(void) REPLAY_STUB;
|
||||
static void FinishPlayback(void) REPLAY_STUB;
|
||||
static void EmptyReplayBuffer(void) REPLAY_STUB;
|
||||
static void Display(void) REPLAY_STUB;
|
||||
static void TriggerPlayback(uint8 cam_mode, float cam_x, float cam_y, float cam_z, bool load_scene) REPLAY_STUB;
|
||||
static void StreamAllNecessaryCarsAndPeds(void) REPLAY_STUB;
|
||||
static void RecordParticle(tParticleType type, CVector const& vecPos, CVector const& vecDir, float fSize, RwRGBA const& color) REPLAY_STUB;
|
||||
|
||||
#ifndef GTA_REPLAY
|
||||
static bool ShouldStandardCameraBeProcessed(void) { return true; }
|
||||
static bool IsPlayingBack() { return false; }
|
||||
static bool IsPlayingBackFromFile() { return false; }
|
||||
#else
|
||||
static bool ShouldStandardCameraBeProcessed(void);
|
||||
static bool IsPlayingBack() { return Mode == MODE_PLAYBACK; }
|
||||
static bool IsPlayingBackFromFile() { return bPlayingBackFromFile; }
|
||||
|
||||
static void RecordParticle(tParticleType type, CVector const& vecPos, CVector const& vecDir, float fSize, RwRGBA const& color);
|
||||
private:
|
||||
static void RecordThisFrame(void);
|
||||
static void StorePedUpdate(CPed *ped, int id);
|
||||
@@ -407,4 +417,5 @@ private:
|
||||
|
||||
/* Absolute nonsense, but how could this function end up being outside of class? */
|
||||
friend void PlayReplayFromHD(void);
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -83,7 +83,7 @@ CRestart::FindClosestHospitalRestartPoint(const CVector &pos, CVector *outPos, f
|
||||
}
|
||||
|
||||
eLevelName curlevel = CTheZones::GetLevelFromPosition(&pos);
|
||||
float fMinDist = 16000000.0f;
|
||||
float fMinDist = SQR(4000.0f);
|
||||
int closestPoint = NUM_RESTART_POINTS;
|
||||
|
||||
// find closest point on this level
|
||||
@@ -130,7 +130,7 @@ CRestart::FindClosestPoliceRestartPoint(const CVector &pos, CVector *outPos, flo
|
||||
}
|
||||
|
||||
eLevelName curlevel = CTheZones::GetLevelFromPosition(&pos);
|
||||
float fMinDist = 16000000.0f;
|
||||
float fMinDist = SQR(4000.0f);
|
||||
int closestPoint = NUM_RESTART_POINTS;
|
||||
|
||||
// find closest point on this level
|
||||
|
||||
@@ -97,11 +97,7 @@ CRoadBlocks::GenerateRoadBlockCopsForCar(CVehicle* pVehicle, int32 roadBlockType
|
||||
pCopPed->m_nRoadblockVeh->RegisterReference((CEntity**)&pCopPed->m_nRoadblockVeh);
|
||||
pCopPed->bCrouchWhenShooting = roadBlockType == 2 ? false : true;
|
||||
if (pEntityToAttack) {
|
||||
if (pCopPed->m_pPointGunAt)
|
||||
pCopPed->m_pPointGunAt->CleanUpOldReference(&pCopPed->m_pPointGunAt);
|
||||
pCopPed->m_pPointGunAt = pEntityToAttack;
|
||||
if (pEntityToAttack)
|
||||
pEntityToAttack->RegisterReference(&pCopPed->m_pPointGunAt);
|
||||
pCopPed->SetWeaponLockOnTarget(pEntityToAttack);
|
||||
pCopPed->SetAttack(pEntityToAttack);
|
||||
}
|
||||
pCopPed->m_pMyVehicle = pVehicle;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "common.h"
|
||||
|
||||
#include "SceneEdit.h"
|
||||
|
||||
#ifdef GTA_SCENE_EDIT
|
||||
#include "Automobile.h"
|
||||
#include "Camera.h"
|
||||
#include "CarCtrl.h"
|
||||
@@ -1098,3 +1098,4 @@ bool CSceneEdit::SelectWeapon(void)
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef GTA_SCENE_EDIT
|
||||
class CPed;
|
||||
class CVehicle;
|
||||
|
||||
@@ -93,3 +93,4 @@ public:
|
||||
static void SelectVehicle(void);
|
||||
static bool SelectWeapon(void);
|
||||
};
|
||||
#endif
|
||||
|
||||
+68
-11492
File diff suppressed because it is too large
Load Diff
+33
-23
@@ -14,7 +14,15 @@ class CPlayerInfo;
|
||||
|
||||
class CRunningScript;
|
||||
|
||||
#define KEY_LENGTH_IN_SCRIPT 8
|
||||
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 SPHERE_MARKER_R 252
|
||||
#define SPHERE_MARKER_G 138
|
||||
#define SPHERE_MARKER_B 242
|
||||
@@ -22,6 +30,16 @@ class CRunningScript;
|
||||
#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
|
||||
#else
|
||||
#define METERS_IN_FOOT 0.3f
|
||||
#define FEET_IN_METER 3.33f
|
||||
#endif
|
||||
|
||||
#define KEY_LENGTH_IN_SCRIPT 8
|
||||
|
||||
struct intro_script_rectangle
|
||||
{
|
||||
bool m_bIsUsed;
|
||||
@@ -288,6 +306,15 @@ class CTheScripts
|
||||
static uint16 ScriptsUpdated;
|
||||
static uint32 LastMissionPassedTime;
|
||||
static uint16 NumberOfExclusiveMissionScripts;
|
||||
#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
#define CARDS_IN_SUIT (13)
|
||||
#define NUM_SUITS (4)
|
||||
#define MAX_DECKS (6)
|
||||
#define CARDS_IN_DECK (CARDS_IN_SUIT * NUM_SUITS)
|
||||
#define CARDS_IN_STACK (CARDS_IN_DECK * MAX_DECKS)
|
||||
static int16 CardStack[CARDS_IN_STACK];
|
||||
static int16 CardStackPosition;
|
||||
#endif
|
||||
public:
|
||||
static bool bPlayerIsInTheStatium;
|
||||
static uint8 RiotIntensity;
|
||||
@@ -516,28 +543,7 @@ private:
|
||||
|
||||
float LimitAngleOnCircle(float angle) { return angle < 0.0f ? angle + 360.0f : angle; }
|
||||
|
||||
bool ThisIsAValidRandomPed(uint32 pedtype, int civ, int gang, int criminal) {
|
||||
switch (pedtype) {
|
||||
case PEDTYPE_CIVMALE:
|
||||
case PEDTYPE_CIVFEMALE:
|
||||
return civ;
|
||||
case PEDTYPE_GANG1:
|
||||
case PEDTYPE_GANG2:
|
||||
case PEDTYPE_GANG3:
|
||||
case PEDTYPE_GANG4:
|
||||
case PEDTYPE_GANG5:
|
||||
case PEDTYPE_GANG6:
|
||||
case PEDTYPE_GANG7:
|
||||
case PEDTYPE_GANG8:
|
||||
case PEDTYPE_GANG9:
|
||||
return gang;
|
||||
case PEDTYPE_CRIMINAL:
|
||||
case PEDTYPE_PROSTITUTE:
|
||||
return criminal;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
bool ThisIsAValidRandomPed(uint32 pedtype, int civ, int gang, int criminal);
|
||||
|
||||
bool CheckDamagedWeaponType(int32 actual, int32 type);
|
||||
|
||||
@@ -550,12 +556,16 @@ private:
|
||||
extern int scriptToLoad;
|
||||
#endif
|
||||
#ifdef MISSION_REPLAY
|
||||
static_assert(false, "Mission replay is not supported");
|
||||
extern int AllowMissionReplay;
|
||||
extern uint32 WaitForMissionActivate;
|
||||
extern uint32 WaitForSave;
|
||||
extern uint32 MissionStartTime;
|
||||
extern int missionRetryScriptIndex;
|
||||
extern bool doingMissionRetry;
|
||||
extern bool gbTryingPorn4Again;
|
||||
extern int IsInAmmunation;
|
||||
extern int MissionSkipLevel;
|
||||
|
||||
uint32 AddExtraDeathDelay();
|
||||
void RetryMission(int, int);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,613 @@
|
||||
#include "common.h"
|
||||
|
||||
#include "Script.h"
|
||||
#include "ScriptCommands.h"
|
||||
|
||||
#include "DMAudio.h"
|
||||
#if ((defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT) && defined MORE_LANGUAGES)
|
||||
#include "Frontend.h"
|
||||
#endif
|
||||
#include "GameLogic.h"
|
||||
#include "Garages.h"
|
||||
#ifdef MISSION_REPLAY
|
||||
#include "GenericGameStorage.h"
|
||||
#endif
|
||||
#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
#include "General.h"
|
||||
#include "maths.h"
|
||||
#endif
|
||||
#include "Hud.h"
|
||||
#include "Pad.h"
|
||||
#include "PedAttractor.h"
|
||||
#include "Population.h"
|
||||
#include "Pools.h"
|
||||
#include "RpAnimBlend.h"
|
||||
#include "Stats.h"
|
||||
#include "VisibilityPlugins.h"
|
||||
#include "Wanted.h"
|
||||
#include "WaterLevel.h"
|
||||
#include "World.h"
|
||||
#include "Zones.h"
|
||||
|
||||
int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
{
|
||||
switch (command) {
|
||||
case COMMAND_REGISTER_VIGILANTE_LEVEL:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CStats::RegisterLevelVigilanteMission(ScriptParams[0]);
|
||||
return 0;
|
||||
case COMMAND_CLEAR_ALL_CHAR_ANIMS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pPed);
|
||||
if (!pPed->bInVehicle) {
|
||||
pPed->m_pVehicleAnim = nil;
|
||||
pPed->RestartNonPartialAnims();
|
||||
RpAnimBlendClumpRemoveAllAssociations(pPed->GetClump());
|
||||
pPed->SetPedState(PED_IDLE);
|
||||
pPed->SetMoveState(PEDMOVE_STILL);
|
||||
pPed->m_nLastPedState = PED_NONE;
|
||||
pPed->ClearAimFlag();
|
||||
pPed->ClearLookFlag();
|
||||
pPed->bIsPointingGunAt = false;
|
||||
if (pPed->IsPlayer())
|
||||
((CPlayerPed*)pPed)->m_fMoveSpeed = 0.0f;
|
||||
else
|
||||
pPed->m_nStoredMoveState = PEDMOVE_STILL;
|
||||
CAnimManager::AddAnimation(pPed->GetClump(), pPed->m_animGroup, ANIM_IDLE_STANCE);
|
||||
pPed->bIsPedDieAnimPlaying = false;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_MAXIMUM_NUMBER_OF_CARS_IN_GARAGE:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CGarages::SetMaxNumStoredCarsForGarage(ScriptParams[0], ScriptParams[1]);
|
||||
return 0;
|
||||
case COMMAND_WANTED_STARS_ARE_FLASHING:
|
||||
{
|
||||
CWanted *pWanted = CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_pWanted;
|
||||
UpdateCompareFlag(pWanted->m_nMinWantedLevel - pWanted->m_nWantedLevel > 0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_ALLOW_HURRICANES:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CStats::NoMoreHurricanes = ScriptParams[0];
|
||||
return 0;
|
||||
case COMMAND_PLAY_ANNOUNCEMENT:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
DMAudio.PlayRadioAnnouncement(ScriptParams[0] + STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_PLAYER_IS_IN_STADIUM:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CTheScripts::bPlayerIsInTheStatium = ScriptParams[0];
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_BUS_FARES_COLLECTED_BY_PLAYER:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]];
|
||||
ScriptParams[0] = pPlayerInfo->m_pPed->m_nLastBusFareCollected;
|
||||
pPlayerInfo->m_pPed->m_nLastBusFareCollected = 0;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CHAR_OBJ_BUY_ICE_CREAM:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pPed);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]);
|
||||
script_assert(pVehicle);
|
||||
ScriptParams[0] = 0;
|
||||
if (pPed->m_objective == OBJECTIVE_NONE && !pPed->bHasAlreadyUsedAttractor) {
|
||||
C2dEffect* pEffect = (C2dEffect*)GetPedAttractorManager()->GetEffectForIceCreamVan(pVehicle, pPed->GetPosition()); // has to be casted, because inner methods are const
|
||||
if (pEffect) {
|
||||
CVector pos;
|
||||
CPedAttractorManager::ComputeEffectPos(pEffect, pVehicle->GetMatrix(), pos);
|
||||
if ((pPed->GetPosition() - pos).MagnitudeSqr() < SQR(20.0f)) {
|
||||
if (GetPedAttractorManager()->HasEmptySlot(pEffect) && GetPedAttractorManager()->IsApproachable(pEffect, pVehicle->GetMatrix(), 0, pPed)) {
|
||||
if (GetPedAttractorManager()->RegisterPedWithAttractor(pPed, pEffect, pVehicle->GetMatrix()))
|
||||
ScriptParams[0] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_DISPLAY_RADAR:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CHud::m_HideRadar = ScriptParams[0] == 0;
|
||||
return 0;
|
||||
case COMMAND_REGISTER_BEST_POSITION:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CStats::RegisterBestPosition(ScriptParams[0], ScriptParams[1]);
|
||||
return 0;
|
||||
case COMMAND_IS_PLAYER_IN_INFO_ZONE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]];
|
||||
char key[KEY_LENGTH_IN_SCRIPT];
|
||||
memset(key, 0, KEY_LENGTH_IN_SCRIPT);
|
||||
CTheScripts::ReadTextLabelFromScript(&m_nIp, key);
|
||||
m_nIp += KEY_LENGTH_IN_SCRIPT;
|
||||
CVector pos = pPlayerInfo->GetPos();
|
||||
CZone *infoZone = CTheZones::FindInformationZoneForPosition(&pos);
|
||||
UpdateCompareFlag(strncmp(key, infoZone->name, 8) == 0); // original code doesn't seem to be using strncmp in here and compare 2 ints instead
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CLEAR_CHAR_ICE_CREAM_PURCHASE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pPed);
|
||||
if (pPed->m_attractor)
|
||||
GetPedAttractorManager()->DeRegisterPed(pPed, pPed->m_attractor);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_IN_CAR_FIRE_BUTTON_PRESSED:
|
||||
UpdateCompareFlag(CPad::GetPad(0)->GetCarGunFired());
|
||||
return 0;
|
||||
case COMMAND_HAS_CHAR_ATTEMPTED_ATTRACTOR:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pPed);
|
||||
UpdateCompareFlag(pPed->bHasAlreadyUsedAttractor);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_LOAD_COLLISION_FOR_CAR_FLAG:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pVehicle);
|
||||
if (ScriptParams[1]) {
|
||||
pVehicle->bDontLoadCollision = false;
|
||||
if (m_bMissionFlag) {
|
||||
CWorld::Remove(pVehicle);
|
||||
pVehicle->bIsStaticWaitingForCollision = true;
|
||||
CWorld::Add(pVehicle);
|
||||
}
|
||||
}
|
||||
else {
|
||||
pVehicle->bDontLoadCollision = true;
|
||||
if (pVehicle->bIsStaticWaitingForCollision) {
|
||||
pVehicle->bIsStaticWaitingForCollision = false;
|
||||
if (!pVehicle->GetIsStatic())
|
||||
pVehicle->AddToMovingList();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_LOAD_COLLISION_FOR_CHAR_FLAG:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pPed);
|
||||
if (ScriptParams[1]) {
|
||||
pPed->bDontLoadCollision = false;
|
||||
if (m_bMissionFlag) {
|
||||
CWorld::Remove(pPed);
|
||||
pPed->bIsStaticWaitingForCollision = true;
|
||||
CWorld::Add(pPed);
|
||||
}
|
||||
}
|
||||
else {
|
||||
pPed->bDontLoadCollision = true;
|
||||
if (pPed->bIsStaticWaitingForCollision) {
|
||||
pPed->bIsStaticWaitingForCollision = false;
|
||||
if (!pPed->GetIsStatic())
|
||||
pPed->AddToMovingList();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
//case COMMAND_SET_LOAD_COLLISION_FOR_OBJECT_FLAG:
|
||||
case COMMAND_ADD_BIG_GUN_FLASH:
|
||||
{
|
||||
CollectParameters(&m_nIp, 6);
|
||||
CWeapon::AddGunFlashBigGuns(*(CVector*)&ScriptParams[0], *(CVector*)&ScriptParams[3]);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_HAS_CHAR_BOUGHT_ICE_CREAM:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pPed);
|
||||
UpdateCompareFlag(pPed->bBoughtIceCream);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_PROGRESS_PERCENTAGE:
|
||||
*(float*)&ScriptParams[0] = CStats::GetPercentageProgress();
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_SET_SHORTCUT_PICKUP_POINT:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CGameLogic::AddShortCutPointAfterDeath(*(CVector*)&ScriptParams[0], *(float*)&ScriptParams[3]);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_SHORTCUT_DROPOFF_POINT_FOR_MISSION:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CGameLogic::AddShortCutDropOffPointForMission(*(CVector*)&ScriptParams[0], *(float*)&ScriptParams[3]);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_RANDOM_ICE_CREAM_CUSTOMER_IN_AREA:
|
||||
{
|
||||
CollectParameters(&m_nIp, 7);
|
||||
int ped_handle = -1;
|
||||
CVector pos = FindPlayerCoors();
|
||||
float x1 = *(float*)&ScriptParams[0];
|
||||
float y1 = *(float*)&ScriptParams[1];
|
||||
float x2 = *(float*)&ScriptParams[2];
|
||||
float y2 = *(float*)&ScriptParams[3];
|
||||
int i = CPools::GetPedPool()->GetSize();
|
||||
while (--i && ped_handle == -1) {
|
||||
CPed* pPed = CPools::GetPedPool()->GetSlot(i);
|
||||
if (!pPed)
|
||||
continue;
|
||||
if (CTheScripts::LastRandomPedId == CPools::GetPedPool()->GetIndex(pPed))
|
||||
continue;
|
||||
if (pPed->CharCreatedBy != RANDOM_CHAR)
|
||||
continue;
|
||||
if (!pPed->IsPedInControl())
|
||||
continue;
|
||||
if (pPed->bRemoveFromWorld)
|
||||
continue;
|
||||
if (pPed->bFadeOut)
|
||||
continue;
|
||||
if (pPed->m_nWaitState != WAITSTATE_FALSE)
|
||||
continue;
|
||||
if (pPed->bHasAlreadyUsedAttractor)
|
||||
continue;
|
||||
if (pPed->m_attractor)
|
||||
continue;
|
||||
if (!ThisIsAValidRandomPed(pPed->m_nPedType, ScriptParams[4], ScriptParams[5], ScriptParams[6]))
|
||||
continue;
|
||||
if (pPed->bIsLeader || pPed->m_leader)
|
||||
continue;
|
||||
if (!pPed->IsWithinArea(x1, y1, x2, y2))
|
||||
continue;
|
||||
if (pos.z - PED_FIND_Z_OFFSET > pPed->GetPosition().z)
|
||||
continue;
|
||||
if (pos.z + PED_FIND_Z_OFFSET < pPed->GetPosition().z)
|
||||
continue;
|
||||
ped_handle = CPools::GetPedPool()->GetIndex(pPed);
|
||||
CTheScripts::LastRandomPedId = ped_handle;
|
||||
pPed->CharCreatedBy = MISSION_CHAR;
|
||||
pPed->bRespondsToThreats = false;
|
||||
++CPopulation::ms_nTotalMissionPeds;
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanup.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
}
|
||||
ScriptParams[0] = ped_handle;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
//case COMMAND_GET_RANDOM_ICE_CREAM_CUSTOMER_IN_ZONE:
|
||||
case COMMAND_UNLOCK_ALL_CAR_DOORS_IN_AREA:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
uint32 i = CPools::GetVehiclePool()->GetSize();
|
||||
float infX = *(float*)&ScriptParams[0];
|
||||
float infY = *(float*)&ScriptParams[1];
|
||||
float supX = *(float*)&ScriptParams[2];
|
||||
float supY = *(float*)&ScriptParams[3];
|
||||
while (i--) {
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i);
|
||||
if (!pVehicle)
|
||||
continue;
|
||||
if (pVehicle->IsWithinArea(infX, infY, supX, supY))
|
||||
pVehicle->m_nDoorLock = CARLOCK_UNLOCKED;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_GANG_ATTACK_PLAYER_WITH_COPS:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CGangs::SetWillAttackPlayerWithCops((ePedType)((int)PEDTYPE_GANG1 + ScriptParams[0]), !!ScriptParams[1]);
|
||||
return 0;
|
||||
case COMMAND_SET_CHAR_FRIGHTENED_IN_JACKED_CAR:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pPed);
|
||||
pPed->bHeldHostageInCar = ScriptParams[1];
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_VEHICLE_TO_FADE_IN:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pVehicle);
|
||||
CVisibilityPlugins::SetClumpAlpha(pVehicle->GetClump(), ScriptParams[1]);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_REGISTER_ODDJOB_MISSION_PASSED:
|
||||
++CStats::MissionsPassed;
|
||||
CStats::CheckPointReachedSuccessfully();
|
||||
CTheScripts::LastMissionPassedTime = CTimer::GetTimeInMilliseconds();
|
||||
CGameLogic::RemoveShortCutDropOffPointForMission();
|
||||
return 0;
|
||||
case COMMAND_IS_PLAYER_IN_SHORTCUT_TAXI:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed;
|
||||
script_assert(pPed);
|
||||
UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle && pPed->m_pMyVehicle == CGameLogic::pShortCutTaxi);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_CHAR_DUCKING:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pPed);
|
||||
UpdateCompareFlag(RpAnimBlendClumpGetAssociation(pPed->GetClump(), ANIM_DUCK_DOWN) != nil);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CREATE_DUST_EFFECT_FOR_CUTSCENE_HELI:
|
||||
{
|
||||
CollectParameters(&m_nIp, 3);
|
||||
CObject *pHeli = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
bool found = false;
|
||||
float waterLevel = -1000.0f;
|
||||
CVector pos = pHeli->GetPosition();
|
||||
float radius = *(float*)&ScriptParams[1];
|
||||
float ground = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z, &found);
|
||||
if (!CWaterLevel::GetWaterLevel(pos.x, pos.y, pos.z, &waterLevel, false))
|
||||
waterLevel = 0.0f;
|
||||
if (waterLevel > ground)
|
||||
ground = waterLevel;
|
||||
if (ScriptParams[2] > 8)
|
||||
ScriptParams[2] = 8;
|
||||
CVehicle::HeliDustGenerate(pHeli, (pos.z - ground - 1.0f - radius) * 0.3 + radius, ground, ScriptParams[2]);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_REGISTER_FIRE_LEVEL:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CStats::RegisterLevelFireMission(ScriptParams[0]);
|
||||
return 0;
|
||||
case COMMAND_IS_AUSTRALIAN_GAME:
|
||||
UpdateCompareFlag(false); // should we make some check?
|
||||
return 0;
|
||||
case COMMAND_DISARM_CAR_BOMB:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||
if (pVehicle->m_bombType != CARBOMB_NONE) {
|
||||
pVehicle->m_bombType = CARBOMB_NONE;
|
||||
pVehicle->m_pBombRigger = nil;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT)
|
||||
case COMMAND_IS_JAPANESE_GAME:
|
||||
#ifdef MORE_LANGUAGES
|
||||
UpdateCompareFlag(FrontEndMenuManager.m_PrefsLanguage == LANGUAGE_JAPANESE);
|
||||
#elif (defined GTAVC_JP_PATCH)
|
||||
UpdateCompareFlag(true);
|
||||
#else
|
||||
UpdateCompareFlag(false);
|
||||
#endif
|
||||
return 0;
|
||||
#elif (!defined GTA_PS2)
|
||||
case COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED:
|
||||
script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR);
|
||||
uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp);
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CUserDisplay::OnscnTimer.SetCounterFlashWhenFirstDisplayed(var, ScriptParams[0]);
|
||||
break;
|
||||
#endif
|
||||
#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
case COMMAND_SHUFFLE_CARD_DECKS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
script_assert(ScriptParams[0] >= 0 && ScriptParams[0] <= 6);
|
||||
for (int i = 0; i < CARDS_IN_STACK; i++)
|
||||
CTheScripts::CardStack[i] = 0;
|
||||
int16 seq[CARDS_IN_STACK];
|
||||
for (int i = 0; i < MAX_DECKS * CARDS_IN_DECK; i++)
|
||||
seq[i] = i;
|
||||
int cards_left = CARDS_IN_DECK * ScriptParams[0];
|
||||
for (int k = 1; k < CARDS_IN_DECK + 1; k++) {
|
||||
for (int deck = 0; deck < ScriptParams[0]; deck++) {
|
||||
int index = CGeneral::GetRandomNumberInRange(0, cards_left);
|
||||
CTheScripts::CardStack[seq[index]] = k;
|
||||
for (int l = index; l < cards_left; l++) {
|
||||
if (l + 1 < CARDS_IN_STACK)
|
||||
seq[l] = seq[l + 1];
|
||||
else
|
||||
seq[l] = 0;
|
||||
}
|
||||
--cards_left;
|
||||
}
|
||||
}
|
||||
CTheScripts::CardStackPosition = 0;
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_FETCH_NEXT_CARD:
|
||||
{
|
||||
if (CTheScripts::CardStack[CTheScripts::CardStackPosition] == 0)
|
||||
CTheScripts::CardStackPosition = 0;
|
||||
ScriptParams[0] = CTheScripts::CardStack[CTheScripts::CardStackPosition++];
|
||||
if (CTheScripts::CardStackPosition == CARDS_IN_DECK * MAX_DECKS)
|
||||
CTheScripts::CardStackPosition = 0;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_OBJECT_VELOCITY:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
*(CVector*)ScriptParams[0] = GAME_SPEED_TO_METERS_PER_SECOND * pObject->GetMoveSpeed();
|
||||
StoreParameters(&m_nIp, 3);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_DEBUG_CAMERA_ON:
|
||||
UpdateCompareFlag(TheCamera.WorldViewerBeingUsed);
|
||||
return 0;
|
||||
case COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
CVector newSpeed = pObject->GetTurnSpeed() + *(CVector*)ScriptParams[1] / GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
if (pObject->bIsStatic) {
|
||||
pObject->SetIsStatic(false);
|
||||
pObject->AddToMovingList();
|
||||
}
|
||||
pObject->SetTurnSpeed(newSpeed.x, newSpeed.y, newSpeed.z);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_OBJECT_ROTATION_VELOCITY:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
CVector newSpeed = *(CVector*)ScriptParams[1] / GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
if (pObject->bIsStatic) {
|
||||
pObject->SetIsStatic(false);
|
||||
pObject->AddToMovingList();
|
||||
}
|
||||
pObject->SetTurnSpeed(newSpeed.x, newSpeed.y, newSpeed.z);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_OBJECT_STATIC:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
UpdateCompareFlag(pObject->GetIsStatic());
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CVector2D v1 = *(CVector2D*)ScriptParams[0];
|
||||
CVector2D v2 = *(CVector2D*)ScriptParams[2];
|
||||
float c = DotProduct2D(v1, v2) / (v1.Magnitude() * v2.Magnitude());
|
||||
#ifdef FIX_BUGS // command is a SA leftover where it was fixed to this
|
||||
*(float*)ScriptParams[0] = RADTODEG(Acos(c));
|
||||
#else
|
||||
*(float*)ScriptParams[0] = Acos(c);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_DO_2D_RECTANGLES_COLLIDE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 8);
|
||||
float infX1 = *(float*)&ScriptParams[0] - *(float*)&ScriptParams[2] * 0.5; // NB: not float
|
||||
float supX1 = *(float*)&ScriptParams[0] + *(float*)&ScriptParams[2] * 0.5;
|
||||
float infX2 = *(float*)&ScriptParams[4] - *(float*)&ScriptParams[6] * 0.5;
|
||||
float supX2 = *(float*)&ScriptParams[4] + *(float*)&ScriptParams[6] * 0.5;
|
||||
float infY1 = *(float*)&ScriptParams[1] - *(float*)&ScriptParams[3] * 0.5;
|
||||
float supY1 = *(float*)&ScriptParams[1] + *(float*)&ScriptParams[3] * 0.5;
|
||||
float infY2 = *(float*)&ScriptParams[5] - *(float*)&ScriptParams[7] * 0.5;
|
||||
float supY2 = *(float*)&ScriptParams[5] + *(float*)&ScriptParams[7] * 0.5;
|
||||
bool collide = true;
|
||||
if (infY2 > supY1)
|
||||
collide = false;
|
||||
if (infY1 > supY2)
|
||||
collide = false;
|
||||
if (infX2 > supX1)
|
||||
collide = false;
|
||||
if (infX1 > supX2)
|
||||
collide = false;
|
||||
UpdateCompareFlag(collide);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_OBJECT_ROTATION_VELOCITY:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
*(CVector*)ScriptParams[0] = pObject->GetTurnSpeed() * GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
StoreParameters(&m_nIp, 3);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
CVector vecAddition = *(CVector*)&ScriptParams[1] * CTimer::GetTimeStep() / GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
if (!pObject->bIsStatic) {
|
||||
CVector vecCurrSpeed = pObject->GetSpeed();
|
||||
vecCurrSpeed.Normalise();
|
||||
if (vecCurrSpeed.z != 1.0) { // NB: not float!
|
||||
CVector vx = CrossProduct(vecCurrSpeed, CVector(0.0f, 0.0f, 1.0f));
|
||||
vx.Normalise();
|
||||
CVector vz = CrossProduct(vx, vecCurrSpeed);
|
||||
vz.Normalise();
|
||||
CVector vecNewSpeed = pObject->GetSpeed() + vecAddition.x * vx + vecAddition.y * vecCurrSpeed + vecAddition.z * vecCurrSpeed;
|
||||
if (pObject->bIsStatic) {
|
||||
pObject->SetIsStatic(false);
|
||||
pObject->AddToMovingList();
|
||||
}
|
||||
pObject->SetMoveSpeed(vecNewSpeed);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_OBJECT_SPEED:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
*(float*)ScriptParams[0] = pObject->GetMoveSpeed().Magnitude() * GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#if (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
case COMMAND_IS_MISSION_SKIP:
|
||||
#ifdef MISSION_REPLAY
|
||||
ScriptParams[0] = MissionSkipLevel;
|
||||
#else
|
||||
ScriptParams[0] = 0;
|
||||
#endif
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_SET_IN_AMMUNATION:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
#ifdef MISSION_REPLAY
|
||||
IsInAmmunation = ScriptParams[0];
|
||||
#endif
|
||||
return 0;
|
||||
case COMMAND_DO_SAVE_GAME:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
#ifdef MISSION_REPLAY
|
||||
SaveGameForPause(ScriptParams[0]);
|
||||
#endif
|
||||
return 0;
|
||||
case COMMAND_IS_RETRY:
|
||||
#ifdef MISSION_REPLAY
|
||||
if (strcmp(m_abScriptName, "porno4") != 0)
|
||||
ScriptParams[0] = AllowMissionReplay;
|
||||
#ifdef FIX_BUGS
|
||||
else
|
||||
ScriptParams[0] = gbTryingPorn4Again;
|
||||
#else
|
||||
else if (gbTryingPorn4Again)
|
||||
ScriptParams[0] = 1;
|
||||
#endif
|
||||
#else
|
||||
ScriptParams[0] = 0;
|
||||
#endif
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_DUMMY:
|
||||
return 0;
|
||||
#endif
|
||||
#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
// it is unknown what these commands do but they don't take parameters
|
||||
case COMMAND_MARK_CUTSCENE_START:
|
||||
return 0;
|
||||
case COMMAND_MARK_CUTSCENE_END:
|
||||
return 0;
|
||||
case COMMAND_CUTSCENE_SCROLL:
|
||||
return 0;
|
||||
#endif
|
||||
default:
|
||||
script_assert(0);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -1437,6 +1437,39 @@ enum {
|
||||
COMMAND_REGISTER_FIRE_LEVEL,
|
||||
COMMAND_IS_AUSTRALIAN_GAME,
|
||||
COMMAND_DISARM_CAR_BOMB,
|
||||
#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT)
|
||||
COMMAND_IS_JAPANESE_GAME,
|
||||
#elif (!defined GTA_PS2)
|
||||
COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED,
|
||||
#endif
|
||||
#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
COMMAND_SHUFFLE_CARD_DECKS,
|
||||
COMMAND_FETCH_NEXT_CARD,
|
||||
COMMAND_GET_OBJECT_VELOCITY,
|
||||
COMMAND_IS_DEBUG_CAMERA_ON,
|
||||
COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY,
|
||||
COMMAND_SET_OBJECT_ROTATION_VELOCITY,
|
||||
COMMAND_IS_OBJECT_STATIC,
|
||||
COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS,
|
||||
COMMAND_DO_2D_RECTANGLES_COLLIDE,
|
||||
COMMAND_GET_OBJECT_ROTATION_VELOCITY,
|
||||
COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY,
|
||||
COMMAND_GET_OBJECT_SPEED,
|
||||
#endif
|
||||
#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT)
|
||||
COMMAND_MARK_CUTSCENE_START,
|
||||
COMMAND_MARK_CUTSCENE_END,
|
||||
COMMAND_CUTSCENE_SCROLL,
|
||||
#elif (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
COMMAND_IS_MISSION_SKIP,
|
||||
COMMAND_SET_IN_AMMUNATION,
|
||||
COMMAND_DO_SAVE_GAME,
|
||||
COMMAND_IS_RETRY,
|
||||
COMMAND_DUMMY,
|
||||
COMMAND_MARK_CUTSCENE_START,
|
||||
COMMAND_MARK_CUTSCENE_END,
|
||||
COMMAND_CUTSCENE_SCROLL,
|
||||
#endif
|
||||
#ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
|
||||
LAST_SCRIPT_COMMAND
|
||||
#endif
|
||||
|
||||
@@ -29,7 +29,7 @@ void CSetPieces::AddOne(uint8 type, CVector2D vTriggerInf, CVector2D vTriggerSup
|
||||
{
|
||||
if (NumSetPieces >= NUM_SETPIECES)
|
||||
return;
|
||||
aSetPieces[NumSetPieces].m_nType = (eSetPieceType)type;
|
||||
aSetPieces[NumSetPieces].m_nType = type;
|
||||
aSetPieces[NumSetPieces].m_vTriggerInf.x = Min(vTriggerInf.x, vTriggerSup.x);
|
||||
aSetPieces[NumSetPieces].m_vTriggerInf.y = Min(vTriggerInf.y, vTriggerSup.y);
|
||||
aSetPieces[NumSetPieces].m_vTriggerSup.x = Max(vTriggerInf.x, vTriggerSup.x);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
class CVehicle;
|
||||
class CCopPed;
|
||||
|
||||
enum eSetPieceType : uint8
|
||||
enum eSetPieceType
|
||||
{
|
||||
SETPIECE_NONE = 0,
|
||||
SETPIECE_TWOCOPCARSINALLEY,
|
||||
@@ -20,7 +20,7 @@ enum eSetPieceType : uint8
|
||||
class CSetPiece
|
||||
{
|
||||
public:
|
||||
eSetPieceType m_nType;
|
||||
uint8 m_nType;
|
||||
uint32 m_nLastTimeCreated;
|
||||
CVector2D m_vTriggerInf;
|
||||
CVector2D m_vTriggerSup;
|
||||
|
||||
+45
-15
@@ -18,6 +18,7 @@
|
||||
#include "World.h"
|
||||
#include "Renderer.h"
|
||||
#include "AnimManager.h"
|
||||
#include "AnimBlendAssocGroup.h"
|
||||
#include "AnimViewer.h"
|
||||
#include "PlayerPed.h"
|
||||
#include "Pools.h"
|
||||
@@ -46,7 +47,6 @@ CEntity *CAnimViewer::pTarget = nil;
|
||||
void
|
||||
CAnimViewer::Render(void) {
|
||||
if (pTarget) {
|
||||
// pTarget->GetPosition() = CVector(0.0f, 0.0f, 0.0f);
|
||||
if (pTarget) {
|
||||
#ifdef FIX_BUGS
|
||||
if(pTarget->IsPed())
|
||||
@@ -60,11 +60,14 @@ CAnimViewer::Render(void) {
|
||||
|
||||
void
|
||||
CAnimViewer::Initialise(void) {
|
||||
LoadingScreen("Loading the ModelViewer", "", GetRandomSplashScreen());
|
||||
animTxdSlot = CTxdStore::AddTxdSlot("generic");
|
||||
CTxdStore::Create(animTxdSlot);
|
||||
|
||||
// we need messages, messages needs hud, hud needs those
|
||||
int hudSlot = CTxdStore::AddTxdSlot("hud");
|
||||
CTxdStore::LoadTxd(hudSlot, "MODELS/HUD.TXD");
|
||||
CHud::m_Wants_To_Draw_Hud = false;
|
||||
|
||||
animTxdSlot = CTxdStore::AddTxdSlot("generic");
|
||||
CTxdStore::Create(animTxdSlot);
|
||||
int particleSlot = CTxdStore::AddTxdSlot("particle");
|
||||
CTxdStore::LoadTxd(particleSlot, "MODELS/PARTICLE.TXD");
|
||||
CTxdStore::SetCurrentTxd(animTxdSlot);
|
||||
@@ -73,10 +76,6 @@ CAnimViewer::Initialise(void) {
|
||||
TheCamera.Init();
|
||||
TheCamera.SetRwCamera(Scene.camera);
|
||||
TheCamera.Cams[TheCamera.ActiveCam].Distance = 5.0f;
|
||||
|
||||
gbModelViewer = true;
|
||||
CHud::m_Wants_To_Draw_Hud = false;
|
||||
|
||||
ThePaths.Init();
|
||||
ThePaths.AllocatePathFindInfoMem(4500);
|
||||
CCollision::Init();
|
||||
@@ -101,6 +100,9 @@ CAnimViewer::Initialise(void) {
|
||||
CStreaming::LoadAllRequestedModels(false);
|
||||
CRenderer::Init();
|
||||
CVehicleModelInfo::LoadVehicleColours();
|
||||
#ifdef FIX_BUGS
|
||||
CVehicleModelInfo::LoadEnvironmentMaps();
|
||||
#endif
|
||||
CAnimManager::LoadAnimFiles();
|
||||
CWorld::PlayerInFocus = 0;
|
||||
CWeapon::InitialiseWeapons();
|
||||
@@ -110,7 +112,7 @@ CAnimViewer::Initialise(void) {
|
||||
CTimeCycle::Initialise();
|
||||
CCarCtrl::Init();
|
||||
CPlayerPed *player = new CPlayerPed();
|
||||
player->SetPosition(0.0f, 0.0f, 0.0f);
|
||||
player->SetPosition(1000.0f, 1000.0f, 1000.0f);
|
||||
CWorld::Players[0].m_pPed = player;
|
||||
CDraw::SetFOV(120.0f);
|
||||
CDraw::ms_fLODDistance = 500.0f;
|
||||
@@ -138,6 +140,25 @@ CAnimViewer::Initialise(void) {
|
||||
} else {
|
||||
// TODO? maybe request some special models here so the thing doesn't crash
|
||||
}
|
||||
|
||||
// From LCS. idk if needed
|
||||
int vanBlock = CAnimManager::GetAnimationBlockIndex("van");
|
||||
int bikesBlock = CAnimManager::GetAnimationBlockIndex("bikes");
|
||||
int bikevBlock = CAnimManager::GetAnimationBlockIndex("bikev");
|
||||
int bikehBlock = CAnimManager::GetAnimationBlockIndex("bikeh");
|
||||
int bikedBlock = CAnimManager::GetAnimationBlockIndex("biked");
|
||||
CStreaming::FlushRequestList();
|
||||
CStreaming::RequestAnim(vanBlock, STREAMFLAGS_DEPENDENCY);
|
||||
CStreaming::RequestAnim(bikesBlock, STREAMFLAGS_DEPENDENCY);
|
||||
CStreaming::RequestAnim(bikevBlock, STREAMFLAGS_DEPENDENCY);
|
||||
CStreaming::RequestAnim(bikehBlock, STREAMFLAGS_DEPENDENCY);
|
||||
CStreaming::RequestAnim(bikedBlock, STREAMFLAGS_DEPENDENCY);
|
||||
CStreaming::LoadAllRequestedModels(false);
|
||||
CAnimManager::AddAnimBlockRef(vanBlock);
|
||||
CAnimManager::AddAnimBlockRef(bikesBlock);
|
||||
CAnimManager::AddAnimBlockRef(bikevBlock);
|
||||
CAnimManager::AddAnimBlockRef(bikehBlock);
|
||||
CAnimManager::AddAnimBlockRef(bikedBlock);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -215,8 +236,7 @@ CAnimViewer::Update(void)
|
||||
{
|
||||
static int modelId = 0;
|
||||
static int animId = 0;
|
||||
// Please don't make this bool, static bool's are problematic on my side.
|
||||
static int reloadIFP = 0;
|
||||
static bool reloadIFP = false;
|
||||
|
||||
AssocGroupId animGroup = ASSOCGRP_STD;
|
||||
int nextModelId = modelId;
|
||||
@@ -241,7 +261,7 @@ CAnimViewer::Update(void)
|
||||
CAnimManager::Initialise();
|
||||
CAnimManager::LoadAnimFiles();
|
||||
|
||||
reloadIFP = 0;
|
||||
reloadIFP = false;
|
||||
}
|
||||
} else {
|
||||
animGroup = ASSOCGRP_STD;
|
||||
@@ -292,14 +312,19 @@ CAnimViewer::Update(void)
|
||||
if (pTarget->IsVehicle() || pTarget->IsPed() || pTarget->IsObject()) {
|
||||
((CPhysical*)pTarget)->m_vecMoveSpeed = CVector(0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
#ifdef FIX_BUGS
|
||||
// so we don't end up in the water
|
||||
pTarget->GetMatrix().GetPosition().z = 10.0f;
|
||||
#else
|
||||
pTarget->GetMatrix().GetPosition().z = 0.0f;
|
||||
#endif
|
||||
|
||||
if (modelInfo->GetModelType() == MITYPE_PED) {
|
||||
((CPed*)pTarget)->bKindaStayInSamePlace = true;
|
||||
|
||||
// Triangle in mobile
|
||||
if (pad->GetSquareJustDown()) {
|
||||
reloadIFP = 1;
|
||||
reloadIFP = true;
|
||||
AsciiToUnicode("IFP reloaded", gUString);
|
||||
CMessages::AddMessage(gUString, 1000, 0);
|
||||
|
||||
@@ -316,7 +341,7 @@ CAnimViewer::Update(void)
|
||||
} else if (pad->GetDPadUpJustDown()) {
|
||||
animId--;
|
||||
if (animId < 0) {
|
||||
animId = NUM_ANIMS - 1;
|
||||
animId = NUM_STD_ANIMS - 1;
|
||||
}
|
||||
PlayAnimation(pTarget->GetClump(), animGroup, (AnimationId)animId);
|
||||
|
||||
@@ -325,7 +350,7 @@ CAnimViewer::Update(void)
|
||||
CMessages::AddMessage(gUString, 1000, 0);
|
||||
|
||||
} else if (pad->GetDPadDownJustDown()) {
|
||||
animId = (animId == (NUM_ANIMS - 1) ? 0 : animId + 1);
|
||||
animId = (animId == (NUM_STD_ANIMS - 1) ? 0 : animId + 1);
|
||||
PlayAnimation(pTarget->GetClump(), animGroup, (AnimationId)animId);
|
||||
|
||||
sprintf(gString, "Current anim: %d", animId);
|
||||
@@ -344,6 +369,11 @@ CAnimViewer::Update(void)
|
||||
AsciiToUnicode("Ped Col model will be animated as long as you hold the button", gUString);
|
||||
CMessages::AddMessage(gUString, 100, 0);
|
||||
}
|
||||
|
||||
// From LCS
|
||||
if (CAnimManager::GetAnimAssocGroups()[animGroup].numAssociations <= animId)
|
||||
animId = 0;
|
||||
|
||||
} else if (modelInfo->GetModelType() == MITYPE_VEHICLE) {
|
||||
|
||||
if (pad->GetLeftShoulder1JustDown()) {
|
||||
|
||||
+77
-60
@@ -180,9 +180,11 @@ CCam::Process(void)
|
||||
Process_BehindCar(CameraTarget, TargetOrientation, SpeedVar, TargetSpeedVar);
|
||||
break;
|
||||
case MODE_FOLLOWPED:
|
||||
#ifdef PC_PLAYER_CONTROLS
|
||||
if(CCamera::m_bUseMouse3rdPerson)
|
||||
Process_FollowPedWithMouse(CameraTarget, TargetOrientation, SpeedVar, TargetSpeedVar);
|
||||
else
|
||||
#endif
|
||||
#ifdef FREE_CAM
|
||||
if(CCamera::bFreeCam)
|
||||
Process_FollowPed_Rotation(CameraTarget, TargetOrientation, SpeedVar, TargetSpeedVar);
|
||||
@@ -287,9 +289,11 @@ CCam::Process(void)
|
||||
case MODE_FIGHT_CAM_RUNABOUT:
|
||||
Process_1rstPersonPedOnPC(CameraTarget, TargetOrientation, SpeedVar, TargetSpeedVar);
|
||||
break;
|
||||
#ifdef GTA_SCENE_EDIT
|
||||
case MODE_EDITOR:
|
||||
Process_Editor(CameraTarget, TargetOrientation, SpeedVar, TargetSpeedVar);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
Source = CVector(0.0f, 0.0f, 0.0f);
|
||||
Front = CVector(0.0f, 1.0f, 0.0f);
|
||||
@@ -2703,7 +2707,7 @@ CCam::Process_1rstPersonPedOnPC(const CVector&, float TargetOrientation, float,
|
||||
RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(CamTargetEntity->GetClump());
|
||||
int32 idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_HEAD));
|
||||
RwMatrix *mats = RpHAnimHierarchyGetMatrixArray(hier);
|
||||
RwV3dTransformPoints((RwV3d*)&HeadPos, (RwV3d*)&HeadPos, 1, &mats[idx]);
|
||||
RwV3dTransformPoints(&HeadPos, &HeadPos, 1, &mats[idx]);
|
||||
RwV3d scl = { 0.0f, 0.0f, 0.0f };
|
||||
RwMatrixScale(&mats[idx], &scl, rwCOMBINEPRECONCAT);
|
||||
|
||||
@@ -2744,7 +2748,7 @@ CCam::Process_1rstPersonPedOnPC(const CVector&, float TargetOrientation, float,
|
||||
Source = HeadPos;
|
||||
|
||||
// unused:
|
||||
// ((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(&MidPos, PED_MID);
|
||||
// ((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(MidPos, PED_MID);
|
||||
// Source - MidPos;
|
||||
|
||||
// Look around
|
||||
@@ -2920,8 +2924,7 @@ CCam::Process_Sniper(const CVector &CameraTarget, float TargetOrientation, float
|
||||
UseMouse = false;
|
||||
int ZoomInButton = ControlsManager.GetMouseButtonAssociatedWithAction(PED_SNIPER_ZOOM_IN);
|
||||
int ZoomOutButton = ControlsManager.GetMouseButtonAssociatedWithAction(PED_SNIPER_ZOOM_OUT);
|
||||
// TODO: enum? this should be mouse wheel up and down
|
||||
if(ZoomInButton == 4 || ZoomInButton == 5 || ZoomOutButton == 4 || ZoomOutButton == 5){
|
||||
if(ZoomInButton == rsMOUSEWHEELUPBUTTON || ZoomInButton == rsMOUSEWHEELDOWNBUTTON || ZoomOutButton == rsMOUSEWHEELUPBUTTON || ZoomOutButton == rsMOUSEWHEELDOWNBUTTON){
|
||||
if(CPad::GetPad(0)->GetMouseWheelUp() || CPad::GetPad(0)->GetMouseWheelDown()){
|
||||
if(CPad::GetPad(0)->SniperZoomIn()){
|
||||
TargetFOV = FOV - 10.0f;
|
||||
@@ -3734,6 +3737,7 @@ CCam::Process_Fixed(const CVector &CameraTarget, float, float, float)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PC_PLAYER_CONTROLS
|
||||
if(FrontEndMenuManager.m_ControlMethod == CONTROL_STANDARD && Using3rdPersonMouseCam()){
|
||||
CPed *player = FindPlayerPed();
|
||||
if(player && player->CanStrafeOrMouseControl()){
|
||||
@@ -3744,6 +3748,7 @@ CCam::Process_Fixed(const CVector &CameraTarget, float, float, float)
|
||||
TheCamera.pTargetEntity->GetMatrix().UpdateRW();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
@@ -4034,6 +4039,7 @@ CCam::Process_Debug(const CVector&, float, float, float)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef GTA_SCENE_EDIT
|
||||
void
|
||||
CCam::Process_Editor(const CVector&, float, float, float)
|
||||
{
|
||||
@@ -4112,6 +4118,7 @@ CCam::Process_Editor(const CVector&, float, float, float)
|
||||
sprintf(str, "Look@: %f, Look@: %f, Look@: %f ", Front.x + Source.x, Front.y + Source.y, Front.z + Source.z);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
CCam::Process_ModelView(const CVector &CameraTarget, float, float, float)
|
||||
@@ -4125,6 +4132,12 @@ CCam::Process_ModelView(const CVector &CameraTarget, float, float, float)
|
||||
Distance += CPad::GetPad(0)->GetLeftStickY()/1000.0f;
|
||||
else
|
||||
Distance += CPad::GetPad(0)->GetLeftStickY() * ((Distance - 10.0f)/20.0f + 1.0f) / 1000.0f;
|
||||
#ifdef IMPROVED_CAMERA
|
||||
if(CPad::GetPad(0)->GetLeftMouse()){
|
||||
Distance += DEGTORAD(CPad::GetPad(0)->GetMouseY()/2.0f);
|
||||
Angle += DEGTORAD(CPad::GetPad(0)->GetMouseX()/2.0f);
|
||||
}
|
||||
#endif
|
||||
if(Distance < 1.5f)
|
||||
Distance = 1.5f;
|
||||
|
||||
@@ -4903,13 +4916,9 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
||||
|
||||
if (FOV > DefaultFOV)
|
||||
// 0.98f: CAR_FOV_FADE_MULT
|
||||
FOV = pow(0.98f, CTimer::GetTimeStep()) * (FOV - DefaultFOV) + DefaultFOV;
|
||||
FOV = Pow(0.98f, CTimer::GetTimeStep()) * (FOV - DefaultFOV) + DefaultFOV;
|
||||
|
||||
if (FOV <= DefaultFOV + 30.0f) {
|
||||
if (FOV < DefaultFOV)
|
||||
FOV = DefaultFOV;
|
||||
} else
|
||||
FOV = DefaultFOV + 30.0f;
|
||||
FOV = clamp(FOV, DefaultFOV, DefaultFOV + 30.0f);
|
||||
}
|
||||
|
||||
// WORKAROUND: I still don't know how looking behind works (m_bCamDirectlyInFront is unused in III, they seem to use m_bUseTransitionBeta)
|
||||
@@ -5036,7 +5045,7 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
||||
targetAlpha = maxAlphaAllowed;
|
||||
}
|
||||
float maxAlphaBlendAmount = CTimer::GetTimeStep() * CARCAM_SET[camSetArrPos][6];
|
||||
float targetAlphaBlendAmount = (1.0f - pow(CARCAM_SET[camSetArrPos][5], CTimer::GetTimeStep())) * (targetAlpha - Alpha);
|
||||
float targetAlphaBlendAmount = (1.0f - Pow(CARCAM_SET[camSetArrPos][5], CTimer::GetTimeStep())) * (targetAlpha - Alpha);
|
||||
if (targetAlphaBlendAmount <= maxAlphaBlendAmount) {
|
||||
if (targetAlphaBlendAmount < -maxAlphaBlendAmount)
|
||||
targetAlphaBlendAmount = -maxAlphaBlendAmount;
|
||||
@@ -5048,7 +5057,6 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
||||
float stickX = -(pad->GetCarGunLeftRight());
|
||||
float stickY = pad->GetCarGunUpDown();
|
||||
|
||||
// In SA this checks for m_bUseMouse3rdPerson so num2/num8 do not move camera when Keyboard & Mouse controls are used.
|
||||
if (CCamera::m_bUseMouse3rdPerson)
|
||||
stickY = 0.0f;
|
||||
|
||||
@@ -5128,7 +5136,7 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
||||
float betaSpeedFromStickX = xMovement * CARCAM_SET[camSetArrPos][12];
|
||||
|
||||
float newAngleSpeedMaxBlendAmount = CARCAM_SET[camSetArrPos][9];
|
||||
float angleChangeStep = pow(CARCAM_SET[camSetArrPos][8], CTimer::GetTimeStep());
|
||||
float angleChangeStep = Pow(CARCAM_SET[camSetArrPos][8], CTimer::GetTimeStep());
|
||||
float targetBetaWithStickBlendAmount = betaSpeedFromStickX + (targetBeta - Beta) / Max(CTimer::GetTimeStep(), 1.0f);
|
||||
|
||||
if (targetBetaWithStickBlendAmount < -newAngleSpeedMaxBlendAmount)
|
||||
@@ -5240,69 +5248,78 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
||||
// SA calls SetColVarsVehicle in here
|
||||
if (nextDirectionIsForward) {
|
||||
|
||||
// This is new in LCS!
|
||||
// LCS uses exactly the same collision code as FollowPedWithMouse, so we will do so.
|
||||
|
||||
// This is only in LCS!
|
||||
float timestepFactor = Pow(0.99f, CTimer::GetTimeStep());
|
||||
dontCollideWithCars = (timestepFactor * dontCollideWithCars) + ((1.0f - timestepFactor) * car->m_vecMoveSpeed.Magnitude());
|
||||
|
||||
// Move cam if on collision
|
||||
CColPoint foundCol;
|
||||
CEntity* foundEnt;
|
||||
// Our addition
|
||||
#define IS_TRAFFIC_LIGHT(ent) (ent->IsObject() && IsLightObject(ent->GetModelIndex()))
|
||||
|
||||
// Clip Source and fix near clip
|
||||
CColPoint colPoint;
|
||||
CEntity* entity;
|
||||
CWorld::pIgnoreEntity = CamTargetEntity;
|
||||
if (CWorld::ProcessLineOfSight(TargetCoors, Source, foundCol, foundEnt, true, dontCollideWithCars < 0.1f, false, false, false, true, false)) {
|
||||
float obstacleTargetDist = (TargetCoors - foundCol.point).Magnitude();
|
||||
float obstacleCamDist = newDistance - obstacleTargetDist;
|
||||
if (!foundEnt->IsPed() || obstacleCamDist <= 1.0f) {
|
||||
Source = foundCol.point;
|
||||
if (obstacleTargetDist < 1.2f) {
|
||||
RwCameraSetNearClipPlane(Scene.camera, Max(0.05f, obstacleTargetDist - 0.3f));
|
||||
}
|
||||
} else {
|
||||
if (!CWorld::ProcessLineOfSight(foundCol.point, Source, foundCol, foundEnt, true, dontCollideWithCars < 0.1f, false, false, false, true, false)) {
|
||||
float lessClip = obstacleCamDist - 0.35f;
|
||||
if (lessClip <= DEFAULT_NEAR)
|
||||
RwCameraSetNearClipPlane(Scene.camera, lessClip);
|
||||
else
|
||||
RwCameraSetNearClipPlane(Scene.camera, DEFAULT_NEAR);
|
||||
} else {
|
||||
obstacleTargetDist = (TargetCoors - foundCol.point).Magnitude();
|
||||
Source = foundCol.point;
|
||||
if (obstacleTargetDist < 1.2f) {
|
||||
float lessClip = obstacleTargetDist - 0.3f;
|
||||
if (lessClip >= 0.05f)
|
||||
RwCameraSetNearClipPlane(Scene.camera, lessClip);
|
||||
else
|
||||
RwCameraSetNearClipPlane(Scene.camera, 0.05f);
|
||||
}
|
||||
if(CWorld::ProcessLineOfSight(TargetCoors, Source, colPoint, entity, true, dontCollideWithCars < 0.1f, false, true, false, true, true) && !IS_TRAFFIC_LIGHT(entity)){
|
||||
float PedColDist = (TargetCoors - colPoint.point).Magnitude();
|
||||
float ColCamDist = newDistance - PedColDist;
|
||||
if(entity->IsPed() && ColCamDist > DEFAULT_NEAR + 0.1f){
|
||||
// Ped in the way but not clipping through
|
||||
if(CWorld::ProcessLineOfSight(colPoint.point, Source, colPoint, entity, true, dontCollideWithCars < 0.1f, false, true, false, true, true) || IS_TRAFFIC_LIGHT(entity)){
|
||||
PedColDist = (TargetCoors - colPoint.point).Magnitude();
|
||||
Source = colPoint.point;
|
||||
if(PedColDist < DEFAULT_NEAR + 0.3f)
|
||||
RwCameraSetNearClipPlane(Scene.camera, Max(PedColDist-0.3f, 0.05f));
|
||||
}else{
|
||||
RwCameraSetNearClipPlane(Scene.camera, Min(ColCamDist-0.35f, DEFAULT_NEAR));
|
||||
}
|
||||
}else{
|
||||
Source = colPoint.point;
|
||||
if(PedColDist < DEFAULT_NEAR + 0.3f)
|
||||
RwCameraSetNearClipPlane(Scene.camera, Max(PedColDist-0.3f, 0.05f));
|
||||
}
|
||||
}
|
||||
|
||||
CWorld::pIgnoreEntity = nil;
|
||||
float nearClip = RwCameraGetNearClipPlane(Scene.camera);
|
||||
float radius = Tan(DEGTORAD(FOV * 0.5f)) * CDraw::GetAspectRatio() * 1.1f;
|
||||
|
||||
// If we're seeing blue hell due to camera intersects some surface, fix it.
|
||||
// SA and LCS have this unrolled.
|
||||
for (int i = 0;
|
||||
i <= 5 && CWorld::TestSphereAgainstWorld((nearClip * Front) + Source, radius * nearClip, nil, true, true, false, true, false, false);
|
||||
i++) {
|
||||
|
||||
CVector surfaceCamDist = gaTempSphereColPoints->point - Source;
|
||||
CVector frontButInvertedIfTouchesSurface = DotProduct(surfaceCamDist, Front) * Front;
|
||||
float newNearClip = (surfaceCamDist - frontButInvertedIfTouchesSurface).Magnitude() / radius;
|
||||
float ViewPlaneHeight = Tan(DEGTORAD(FOV) / 2.0f);
|
||||
float ViewPlaneWidth = ViewPlaneHeight * CDraw::CalculateAspectRatio() * fTweakFOV;
|
||||
float Near = RwCameraGetNearClipPlane(Scene.camera);
|
||||
float radius = ViewPlaneWidth*Near;
|
||||
entity = CWorld::TestSphereAgainstWorld(Source + Front*Near, radius, nil, true, true, false, true, false, true);
|
||||
int i = 0;
|
||||
while(entity){
|
||||
|
||||
if (newNearClip > nearClip)
|
||||
newNearClip = nearClip;
|
||||
if (newNearClip < 0.1f)
|
||||
newNearClip = 0.1f;
|
||||
if (nearClip > newNearClip)
|
||||
RwCameraSetNearClipPlane(Scene.camera, newNearClip);
|
||||
if (IS_TRAFFIC_LIGHT(entity))
|
||||
break;
|
||||
|
||||
if (newNearClip == 0.1f)
|
||||
Source += (TargetCoors - Source) * 0.3f;
|
||||
CVector CamToCol = gaTempSphereColPoints[0].point - Source;
|
||||
float frontDist = DotProduct(CamToCol, Front);
|
||||
float dist = (CamToCol - Front*frontDist).Magnitude() / ViewPlaneWidth;
|
||||
|
||||
nearClip = RwCameraGetNearClipPlane(Scene.camera);
|
||||
radius = Tan(DEGTORAD(FOV * 0.5f)) * CDraw::GetAspectRatio() * 1.1f;
|
||||
// Try to decrease near clip
|
||||
dist = Max(Min(Near, dist), 0.1f);
|
||||
if(dist < Near)
|
||||
RwCameraSetNearClipPlane(Scene.camera, dist);
|
||||
|
||||
// Move forward a bit
|
||||
if(dist == 0.1f)
|
||||
Source += (TargetCoors - Source)*0.3f;
|
||||
|
||||
// Keep testing
|
||||
Near = RwCameraGetNearClipPlane(Scene.camera);
|
||||
radius = ViewPlaneWidth*Near;
|
||||
entity = CWorld::TestSphereAgainstWorld(Source + Front*Near, radius, nil, true, true, false, true, false, true);
|
||||
|
||||
i++;
|
||||
if(i > 5)
|
||||
entity = nil;
|
||||
}
|
||||
#undef IS_TRAFFIC_LIGHT
|
||||
}
|
||||
TheCamera.m_bCamDirectlyBehind = false;
|
||||
TheCamera.m_bCamDirectlyInFront = false;
|
||||
|
||||
+44
-28
@@ -69,7 +69,11 @@ enum
|
||||
// NB: removed explicit TheCamera from all functions
|
||||
|
||||
CCamera TheCamera;
|
||||
#ifdef PC_PLAYER_CONTROLS
|
||||
bool CCamera::m_bUseMouse3rdPerson = true;
|
||||
#else
|
||||
bool CCamera::m_bUseMouse3rdPerson = false;
|
||||
#endif
|
||||
bool bDidWeProcessAnyCinemaCam;
|
||||
static bool bSwitchedToObbeCam;
|
||||
float CCamera::m_fMouseAccelHorzntl;
|
||||
@@ -612,7 +616,7 @@ CCamera::Process(void)
|
||||
|
||||
// LOD dist
|
||||
if(!CCutsceneMgr::IsRunning() || CCutsceneMgr::UseLodMultiplier()){
|
||||
LODDistMultiplier = 70.0f/CDraw::GetFOV() * CDraw::GetAspectRatio()/(4.0f/3.0f);
|
||||
LODDistMultiplier = 70.0f/CDraw::GetFOV();
|
||||
|
||||
if(GetPosition().z > 55.0f && FindPlayerVehicle() && FindPlayerVehicle()->pHandling->Flags & (HANDLING_IS_HELI|HANDLING_IS_PLANE) ||
|
||||
FindPlayerPed()->m_attachedTo){
|
||||
@@ -1008,22 +1012,26 @@ CCamera::CamControl(void)
|
||||
ReqMode = CCam::MODE_FOLLOWPED;
|
||||
|
||||
// Check 1st person mode
|
||||
if(m_bLookingAtPlayer && pTargetEntity->IsPed() && !m_WideScreenOn && !Cams[0].Using3rdPersonMouseCam()
|
||||
if((m_bLookingAtPlayer || m_bEnable1rstPersonCamCntrlsScript) && pTargetEntity->IsPed() &&
|
||||
(!m_WideScreenOn || m_bEnable1rstPersonCamCntrlsScript) && !Cams[0].Using3rdPersonMouseCam()
|
||||
#ifdef FREE_CAM
|
||||
&& !CCamera::bFreeCam
|
||||
&& (!CCamera::bFreeCam || m_bEnable1rstPersonCamCntrlsScript)
|
||||
#endif
|
||||
){
|
||||
// See if we want to enter first person mode
|
||||
if(CPad::GetPad(0)->LookAroundLeftRight() || CPad::GetPad(0)->LookAroundUpDown()){
|
||||
m_uiFirstPersonCamLastInputTime = CTimer::GetTimeInMilliseconds();
|
||||
m_bFirstPersonBeingUsed = true;
|
||||
}else if(m_bFirstPersonBeingUsed){
|
||||
}
|
||||
if(m_bFirstPersonBeingUsed){
|
||||
// Or if we want to go back to 3rd person
|
||||
if(CPad::GetPad(0)->GetPedWalkLeftRight() || CPad::GetPad(0)->GetPedWalkUpDown() ||
|
||||
CPad::GetPad(0)->GetSquare() || CPad::GetPad(0)->GetTriangle() ||
|
||||
CPad::GetPad(0)->GetCross() || CPad::GetPad(0)->GetCircle() ||
|
||||
CTimer::GetTimeInMilliseconds() - m_uiFirstPersonCamLastInputTime > 2850.0f){
|
||||
m_bFirstPersonBeingUsed = false;
|
||||
}else if(CPad::GetPad(0)->TargetJustDown()){
|
||||
m_bFirstPersonBeingUsed = false;
|
||||
m_bJustJumpedOutOf1stPersonBecauseOfTarget = true;
|
||||
}
|
||||
}
|
||||
@@ -1129,27 +1137,31 @@ CCamera::CamControl(void)
|
||||
}else{
|
||||
whichDoor = 1;
|
||||
garageDoorPos1 = Cams[ActiveCam].Source;
|
||||
garageCenter = CVector((stairsZone->minx+stairsZone->maxx)/2.0f, (stairsZone->miny+stairsZone->maxy)/2.0f, 0.0f);
|
||||
if(pTargetEntity->GetPosition().x > 376.0f && pTargetEntity->GetPosition().x < 383.0f &&
|
||||
pTargetEntity->GetPosition().y > -496.0f && pTargetEntity->GetPosition().y < -489.0f &&
|
||||
pTargetEntity->GetPosition().z > 11.6f && pTargetEntity->GetPosition().z < 13.6f){
|
||||
// if((garageCenter-garageDoorPos1).Magnitude() > 15.0f){
|
||||
bool bClearViewOutside = true;
|
||||
CVector dirOutside = pTargetEntity->GetPosition() - garageCenter;
|
||||
dirOutside.z = 0.0f;
|
||||
dirOutside.Normalise();
|
||||
float zoneDim = stairsZone->maxx - stairsZone->minx;
|
||||
if(zoneDim < stairsZone->maxy - stairsZone->miny)
|
||||
zoneDim = stairsZone->maxy - stairsZone->miny;
|
||||
zoneDim *= 2.0f;
|
||||
CVector posOutside = pTargetEntity->GetPosition() + zoneDim*dirOutside;
|
||||
if(!CWorld::GetIsLineOfSightClear(pTargetEntity->GetPosition(), posOutside, true, false, false, false, false, false, true)){
|
||||
posOutside = pTargetEntity->GetPosition() - zoneDim*dirOutside;
|
||||
if(!CWorld::GetIsLineOfSightClear(pTargetEntity->GetPosition(), posOutside, true, false, false, false, false, false, true))
|
||||
bClearViewOutside = false;
|
||||
|
||||
if(stairsZone){ // always true
|
||||
garageCenter = CVector((stairsZone->minx+stairsZone->maxx)/2, (stairsZone->miny+stairsZone->maxy)/2, 0.0f);
|
||||
if(pTargetEntity->GetPosition().x > 376.0f && pTargetEntity->GetPosition().x < 383.0f &&
|
||||
pTargetEntity->GetPosition().y > -496.0f && pTargetEntity->GetPosition().y < -489.0f &&
|
||||
pTargetEntity->GetPosition().z > 11.6f && pTargetEntity->GetPosition().z < 13.6f){
|
||||
garageDoorPos1 = CVector(382.6f, -489.6f, 13.1f);
|
||||
}else{
|
||||
bool bClearViewOutside = true;
|
||||
CVector dirOutside = pTargetEntity->GetPosition() - garageCenter;
|
||||
dirOutside.z = 0.0f;
|
||||
dirOutside.Normalise();
|
||||
float zoneDim = stairsZone->maxx - stairsZone->minx;
|
||||
if(zoneDim < stairsZone->maxy - stairsZone->miny)
|
||||
zoneDim = stairsZone->maxy - stairsZone->miny;
|
||||
zoneDim *= 2.0f;
|
||||
CVector posOutside = pTargetEntity->GetPosition() + zoneDim*dirOutside;
|
||||
if(!CWorld::GetIsLineOfSightClear(pTargetEntity->GetPosition(), posOutside, true, false, false, false, false, false, true)){
|
||||
posOutside = pTargetEntity->GetPosition() - zoneDim*dirOutside;
|
||||
if(!CWorld::GetIsLineOfSightClear(pTargetEntity->GetPosition(), posOutside, true, false, false, false, false, false, true))
|
||||
bClearViewOutside = false;
|
||||
}
|
||||
if(bClearViewOutside)
|
||||
garageDoorPos1 = posOutside;
|
||||
}
|
||||
if(bClearViewOutside)
|
||||
garageDoorPos1 = posOutside;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1159,7 +1171,7 @@ CCamera::CamControl(void)
|
||||
garageCenter.z = 0.0f;
|
||||
}else{
|
||||
garageDoorPos1.z = 0.0f;
|
||||
if(stairs == nil) // how can this be true?
|
||||
if(!stairs) // how can this be true?
|
||||
garageCenter = CVector(pTargetEntity->GetPosition().x, pTargetEntity->GetPosition().y, 0.0f);
|
||||
}
|
||||
if(whichDoor == 1)
|
||||
@@ -1598,8 +1610,10 @@ CCamera::CamControl(void)
|
||||
switchByJumpCut = true;
|
||||
}
|
||||
}
|
||||
#ifdef GTA_SCENE_EDIT
|
||||
if(CSceneEdit::m_bEditOn)
|
||||
ReqMode = CCam::MODE_EDITOR;
|
||||
#endif
|
||||
|
||||
if((m_uiTransitionState == 0 || switchByJumpCut) && ReqMode != Cams[ActiveCam].Mode){
|
||||
if(switchByJumpCut){
|
||||
@@ -1698,7 +1712,7 @@ CCamera::CamControl(void)
|
||||
StartTransitionWhenNotFinishedInter(ReqMode);
|
||||
pTargetEntity->RegisterReference(&pTargetEntity);
|
||||
Cams[ActiveCam].CamTargetEntity->RegisterReference(&Cams[ActiveCam].CamTargetEntity);
|
||||
}else if(m_bStartInterScript && m_iTypeOfSwitch == JUMP_CUT){
|
||||
}else if(m_bStartInterScript && m_iTypeOfSwitch == JUMP_CUT || jumpCutTo1stPrs){
|
||||
m_uiTransitionState = 0;
|
||||
m_vecDoingSpecialInterPolation = false;
|
||||
if(m_bEnable1rstPersonCamCntrlsScript && ReqMode == CCam::MODE_1STPERSON)
|
||||
@@ -3385,12 +3399,12 @@ CCamera::LoadTrainCamNodes(char const *name)
|
||||
char token[16] = { 0 };
|
||||
char filename[16] = { 0 };
|
||||
uint8 *buf;
|
||||
size_t bufpos = 0;
|
||||
ssize_t bufpos = 0;
|
||||
int field = 0;
|
||||
int tokpos = 0;
|
||||
char c;
|
||||
int i;
|
||||
size_t len;
|
||||
ssize_t len;
|
||||
|
||||
strcpy(filename, name);
|
||||
len = (int)strlen(filename);
|
||||
@@ -3617,6 +3631,8 @@ CCamera::LoadPathSplines(int file)
|
||||
m_arrPathArray[i].m_arr_PathData[j] = atof(token);
|
||||
i++;
|
||||
j = 0;
|
||||
if (i == MAX_NUM_OF_SPLINETYPES)
|
||||
reading = false;
|
||||
memset(token, 0, 32);
|
||||
n = 0;
|
||||
}
|
||||
|
||||
@@ -209,7 +209,9 @@ public:
|
||||
void PrintMode(void);
|
||||
|
||||
void Process_Debug(const CVector&, float, float, float);
|
||||
#ifdef GTA_SCENE_EDIT
|
||||
void Process_Editor(const CVector&, float, float, float);
|
||||
#endif
|
||||
void Process_ModelView(const CVector &CameraTarget, float, float, float);
|
||||
void Process_FollowPed(const CVector &CameraTarget, float TargetOrientation, float, float);
|
||||
void Process_FollowPedWithMouse(const CVector &CameraTarget, float TargetOrientation, float, float);
|
||||
|
||||
+13
-1
@@ -5,6 +5,7 @@
|
||||
#include "CdStream.h"
|
||||
#include "rwcore.h"
|
||||
#include "RwHelper.h"
|
||||
#include "MemoryMgr.h"
|
||||
|
||||
#define CDDEBUG(f, ...) debug ("%s: " f "\n", "cdvd_stream", ## __VA_ARGS__)
|
||||
#define CDTRACE(f, ...) printf("%s: " f "\n", "cdvd_stream", ## __VA_ARGS__)
|
||||
@@ -72,7 +73,11 @@ CdStreamInitThread(void)
|
||||
gChannelRequestQ.size = gNumChannels + 1;
|
||||
ASSERT(gChannelRequestQ.items != nil );
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
gCdStreamSema = CreateSemaphore(nil, 0, 5, nil);
|
||||
#else
|
||||
gCdStreamSema = CreateSemaphore(nil, 0, 5, "CdStream");
|
||||
#endif
|
||||
|
||||
if ( gCdStreamSema == nil )
|
||||
{
|
||||
@@ -242,8 +247,15 @@ CdStreamRead(int32 channel, void *buffer, uint32 offset, uint32 size)
|
||||
else
|
||||
return STREAM_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
#ifdef BIG_IMG
|
||||
LARGE_INTEGER liDistanceToMove;
|
||||
liDistanceToMove.QuadPart = _GET_OFFSET(offset);
|
||||
liDistanceToMove.QuadPart *= CDSTREAM_SECTOR_SIZE;
|
||||
SetFilePointerEx(hImage, liDistanceToMove, nil, FILE_BEGIN);
|
||||
#else
|
||||
SetFilePointer(hImage, _GET_OFFSET(offset) * CDSTREAM_SECTOR_SIZE, nil, FILE_BEGIN);
|
||||
#endif
|
||||
|
||||
DWORD NumberOfBytesRead;
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
#include "CdStream.h"
|
||||
#include "rwcore.h"
|
||||
#include "RwHelper.h"
|
||||
#include "MemoryMgr.h"
|
||||
|
||||
#define CDDEBUG(f, ...) debug ("%s: " f "\n", "cdvd_stream", ## __VA_ARGS__)
|
||||
#define CDTRACE(f, ...) printf("%s: " f "\n", "cdvd_stream", ## __VA_ARGS__)
|
||||
@@ -429,7 +429,7 @@ void *CdStreamThread(void *param)
|
||||
ASSERT(pChannel->hFile >= 0);
|
||||
ASSERT(pChannel->pBuffer != nil );
|
||||
|
||||
lseek(pChannel->hFile, pChannel->nSectorOffset * CDSTREAM_SECTOR_SIZE, SEEK_SET);
|
||||
lseek(pChannel->hFile, (size_t)pChannel->nSectorOffset * (size_t)CDSTREAM_SECTOR_SIZE, SEEK_SET);
|
||||
if (read(pChannel->hFile, pChannel->pBuffer, pChannel->nSectorsToRead * CDSTREAM_SECTOR_SIZE) == -1) {
|
||||
// pChannel->nSectorsToRead == 0 at this point means we wanted to flush channel
|
||||
// STREAM_WAITING is a little hack to make CStreaming not process this data
|
||||
|
||||
@@ -2348,8 +2348,252 @@ int32 CControllerConfigManager::GetNumOfSettingsForAction(e_ControllerAction act
|
||||
return num;
|
||||
}
|
||||
|
||||
#ifdef BIND_VEHICLE_FIREWEAPON
|
||||
#define VFB(b) b,
|
||||
#else
|
||||
#define VFB(b)
|
||||
#endif
|
||||
|
||||
#define CONTROLLER_BUTTONS(T, O, X, Q, L1, L2, L3, R1, R2, R3, SELECT) \
|
||||
{{ \
|
||||
O, /* PED_FIREWEAPON */ \
|
||||
R2, /* PED_CYCLE_WEAPON_RIGHT */ \
|
||||
L2, /* PED_CYCLE_WEAPON_LEFT */ \
|
||||
nil, /* GO_FORWARD */ \
|
||||
nil, /* GO_BACK */ \
|
||||
nil, /* GO_LEFT */ \
|
||||
nil, /* GO_RIGHT */ \
|
||||
Q, /* PED_SNIPER_ZOOM_IN */ \
|
||||
X, /* PED_SNIPER_ZOOM_OUT */ \
|
||||
T, /* VEHICLE_ENTER_EXIT */ \
|
||||
SELECT, /* CAMERA_CHANGE_VIEW_ALL_SITUATIONS */ \
|
||||
Q, /* PED_JUMPING */ \
|
||||
X, /* PED_SPRINT */ \
|
||||
R3, /* PED_LOOKBEHIND */ \
|
||||
VFB(O) /* VEHICLE_FIREWEAPON */ \
|
||||
X, /* VEHICLE_ACCELERATE */ \
|
||||
Q, /* VEHICLE_BRAKE */ \
|
||||
L1, /* VEHICLE_CHANGE_RADIO_STATION */ \
|
||||
L3, /* VEHICLE_HORN */ \
|
||||
R3, /* TOGGLE_SUBMISSIONS */ \
|
||||
R1, /* VEHICLE_HANDBRAKE */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_LEFT */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_RIGHT */ \
|
||||
L2, /* VEHICLE_LOOKLEFT */ \
|
||||
R2, /* VEHICLE_LOOKRIGHT */ \
|
||||
nil, /* VEHICLE_LOOKBEHIND */ \
|
||||
nil, /* VEHICLE_TURRETLEFT */ \
|
||||
nil, /* VEHICLE_TURRETRIGHT */ \
|
||||
nil, /* VEHICLE_TURRETUP */ \
|
||||
nil, /* VEHICLE_TURRETDOWN */ \
|
||||
L2, /* PED_CYCLE_TARGET_LEFT */ \
|
||||
R2, /* PED_CYCLE_TARGET_RIGHT */ \
|
||||
L1, /* PED_CENTER_CAMERA_BEHIND_PLAYER */ \
|
||||
R1, /* PED_LOCK_TARGET */ \
|
||||
nil, /* NETWORK_TALK */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_UP */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_DOWN */ \
|
||||
nil, /* _CONTROLLERACTION_36 */ \
|
||||
nil, /* TOGGLE_DPAD */ \
|
||||
nil, /* SWITCH_DEBUG_CAM_ON */ \
|
||||
nil, /* TAKE_SCREEN_SHOT */ \
|
||||
nil, /* SHOW_MOUSE_POINTER_TOGGLE */ \
|
||||
}, \
|
||||
{ \
|
||||
O, /* PED_FIREWEAPON */ \
|
||||
R2, /* PED_CYCLE_WEAPON_RIGHT */ \
|
||||
L2, /* PED_CYCLE_WEAPON_LEFT */ \
|
||||
nil, /* GO_FORWARD */ \
|
||||
nil, /* GO_BACK */ \
|
||||
nil, /* GO_LEFT */ \
|
||||
nil, /* GO_RIGHT */ \
|
||||
Q, /* PED_SNIPER_ZOOM_IN */ \
|
||||
X, /* PED_SNIPER_ZOOM_OUT */ \
|
||||
T, /* VEHICLE_ENTER_EXIT */ \
|
||||
SELECT, /* CAMERA_CHANGE_VIEW_ALL_SITUATIONS */ \
|
||||
Q, /* PED_JUMPING */ \
|
||||
X, /* PED_SPRINT */ \
|
||||
R3, /* PED_LOOKBEHIND */ \
|
||||
VFB(O) /* VEHICLE_FIREWEAPON */ \
|
||||
X, /* VEHICLE_ACCELERATE */ \
|
||||
Q, /* VEHICLE_BRAKE */ \
|
||||
SELECT, /* VEHICLE_CHANGE_RADIO_STATION */ \
|
||||
L1, /* VEHICLE_HORN */ \
|
||||
R3, /* TOGGLE_SUBMISSIONS */ \
|
||||
R1, /* VEHICLE_HANDBRAKE */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_LEFT */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_RIGHT */ \
|
||||
L2, /* VEHICLE_LOOKLEFT */ \
|
||||
R2, /* VEHICLE_LOOKRIGHT */ \
|
||||
nil, /* VEHICLE_LOOKBEHIND */ \
|
||||
nil, /* VEHICLE_TURRETLEFT */ \
|
||||
nil, /* VEHICLE_TURRETRIGHT */ \
|
||||
nil, /* VEHICLE_TURRETUP */ \
|
||||
nil, /* VEHICLE_TURRETDOWN */ \
|
||||
L2, /* PED_CYCLE_TARGET_LEFT */ \
|
||||
R2, /* PED_CYCLE_TARGET_RIGHT */ \
|
||||
L1, /* PED_CENTER_CAMERA_BEHIND_PLAYER */ \
|
||||
R1, /* PED_LOCK_TARGET */ \
|
||||
nil, /* NETWORK_TALK */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_UP */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_DOWN */ \
|
||||
nil, /* _CONTROLLERACTION_36 */ \
|
||||
nil, /* TOGGLE_DPAD */ \
|
||||
nil, /* SWITCH_DEBUG_CAM_ON */ \
|
||||
nil, /* TAKE_SCREEN_SHOT */ \
|
||||
nil, /* SHOW_MOUSE_POINTER_TOGGLE */ \
|
||||
}, \
|
||||
{ \
|
||||
X, /* PED_FIREWEAPON */ \
|
||||
R2, /* PED_CYCLE_WEAPON_RIGHT */ \
|
||||
L2, /* PED_CYCLE_WEAPON_LEFT */ \
|
||||
nil, /* GO_FORWARD */ \
|
||||
nil, /* GO_BACK */ \
|
||||
nil, /* GO_LEFT */ \
|
||||
nil, /* GO_RIGHT */ \
|
||||
T, /* PED_SNIPER_ZOOM_IN */ \
|
||||
Q, /* PED_SNIPER_ZOOM_OUT */ \
|
||||
L1, /* VEHICLE_ENTER_EXIT */ \
|
||||
SELECT, /* CAMERA_CHANGE_VIEW_ALL_SITUATIONS */ \
|
||||
Q, /* PED_JUMPING */ \
|
||||
O, /* PED_SPRINT */ \
|
||||
R3, /* PED_LOOKBEHIND */ \
|
||||
VFB(O) /* VEHICLE_FIREWEAPON */ \
|
||||
X, /* VEHICLE_ACCELERATE */ \
|
||||
Q, /* VEHICLE_BRAKE */ \
|
||||
L3, /* VEHICLE_CHANGE_RADIO_STATION */ \
|
||||
R1, /* VEHICLE_HORN */ \
|
||||
R3, /* TOGGLE_SUBMISSIONS */ \
|
||||
T, /* VEHICLE_HANDBRAKE */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_LEFT */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_RIGHT */ \
|
||||
L2, /* VEHICLE_LOOKLEFT */ \
|
||||
R2, /* VEHICLE_LOOKRIGHT */ \
|
||||
nil, /* VEHICLE_LOOKBEHIND */ \
|
||||
nil, /* VEHICLE_TURRETLEFT */ \
|
||||
nil, /* VEHICLE_TURRETRIGHT */ \
|
||||
nil, /* VEHICLE_TURRETUP */ \
|
||||
nil, /* VEHICLE_TURRETDOWN */ \
|
||||
L2, /* PED_CYCLE_TARGET_LEFT */ \
|
||||
R2, /* PED_CYCLE_TARGET_RIGHT */ \
|
||||
T, /* PED_CENTER_CAMERA_BEHIND_PLAYER */ \
|
||||
R1, /* PED_LOCK_TARGET */ \
|
||||
nil, /* NETWORK_TALK */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_UP */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_DOWN */ \
|
||||
nil, /* _CONTROLLERACTION_36 */ \
|
||||
nil, /* TOGGLE_DPAD */ \
|
||||
nil, /* SWITCH_DEBUG_CAM_ON */ \
|
||||
nil, /* TAKE_SCREEN_SHOT */ \
|
||||
nil, /* SHOW_MOUSE_POINTER_TOGGLE */ \
|
||||
}, \
|
||||
{ \
|
||||
R1, /* PED_FIREWEAPON */ \
|
||||
R2, /* PED_CYCLE_WEAPON_RIGHT */ \
|
||||
L2, /* PED_CYCLE_WEAPON_LEFT */ \
|
||||
nil, /* GO_FORWARD */ \
|
||||
nil, /* GO_BACK */ \
|
||||
nil, /* GO_LEFT */ \
|
||||
nil, /* GO_RIGHT */ \
|
||||
Q, /* PED_SNIPER_ZOOM_IN */ \
|
||||
X, /* PED_SNIPER_ZOOM_OUT */ \
|
||||
T, /* VEHICLE_ENTER_EXIT */ \
|
||||
SELECT, /* CAMERA_CHANGE_VIEW_ALL_SITUATIONS */ \
|
||||
Q, /* PED_JUMPING */ \
|
||||
X, /* PED_SPRINT */ \
|
||||
R3, /* PED_LOOKBEHIND */ \
|
||||
VFB(R1) /* VEHICLE_FIREWEAPON */ \
|
||||
nil, /* VEHICLE_ACCELERATE */ \
|
||||
nil, /* VEHICLE_BRAKE */ \
|
||||
O, /* VEHICLE_CHANGE_RADIO_STATION */ \
|
||||
L3, /* VEHICLE_HORN */ \
|
||||
Q, /* TOGGLE_SUBMISSIONS */ \
|
||||
L1, /* VEHICLE_HANDBRAKE */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_LEFT */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_RIGHT */ \
|
||||
L2, /* VEHICLE_LOOKLEFT */ \
|
||||
R2, /* VEHICLE_LOOKRIGHT */ \
|
||||
nil, /* VEHICLE_LOOKBEHIND */ \
|
||||
nil, /* VEHICLE_TURRETLEFT */ \
|
||||
nil, /* VEHICLE_TURRETRIGHT */ \
|
||||
nil, /* VEHICLE_TURRETUP */ \
|
||||
nil, /* VEHICLE_TURRETDOWN */ \
|
||||
L2, /* PED_CYCLE_TARGET_LEFT */ \
|
||||
R2, /* PED_CYCLE_TARGET_RIGHT */ \
|
||||
O, /* PED_CENTER_CAMERA_BEHIND_PLAYER */ \
|
||||
L1, /* PED_LOCK_TARGET */ \
|
||||
nil, /* NETWORK_TALK */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_UP */ \
|
||||
nil, /* PED_1RST_PERSON_LOOK_DOWN */ \
|
||||
nil, /* _CONTROLLERACTION_36 */ \
|
||||
nil, /* TOGGLE_DPAD */ \
|
||||
nil, /* SWITCH_DEBUG_CAM_ON */ \
|
||||
nil, /* TAKE_SCREEN_SHOT */ \
|
||||
nil, /* SHOW_MOUSE_POINTER_TOGGLE */ \
|
||||
}}
|
||||
|
||||
|
||||
const char *XboxButtons_noIcons[][MAX_CONTROLLERACTIONS] = CONTROLLER_BUTTONS("Y", "B", "A", "X", "LB", "LT", "LS", "RB", "RT", "RS", "BACK");
|
||||
|
||||
#ifdef BUTTON_ICONS
|
||||
const char *XboxButtons[][MAX_CONTROLLERACTIONS] = CONTROLLER_BUTTONS("~T~", "~O~", "~X~", "~Q~", "~K~", "~M~", "~A~", "~J~", "~V~", "~C~", "BACK");
|
||||
#endif
|
||||
|
||||
|
||||
#if 0 // set 1 for ps2 fonts
|
||||
#define PS2_TRIANGLE "\""
|
||||
#define PS2_CIRCLE "|"
|
||||
#define PS2_CROSS "/"
|
||||
#define PS2_SQUARE "^"
|
||||
#elif defined(BUTTON_ICONS)
|
||||
#define PS2_TRIANGLE "~T~"
|
||||
#define PS2_CIRCLE "~O~"
|
||||
#define PS2_CROSS "~X~"
|
||||
#define PS2_SQUARE "~Q~"
|
||||
#else
|
||||
#define PS2_TRIANGLE "TRIANGLE"
|
||||
#define PS2_CIRCLE "CIRCLE"
|
||||
#define PS2_CROSS "CROSS"
|
||||
#define PS2_SQUARE "SQUARE"
|
||||
#endif
|
||||
|
||||
const char *PlayStationButtons_noIcons[][MAX_CONTROLLERACTIONS] =
|
||||
CONTROLLER_BUTTONS(PS2_TRIANGLE, PS2_CIRCLE, PS2_CROSS, PS2_SQUARE, "L1", "L2", "L3", "R1", "R2", "R3", "SELECT");
|
||||
|
||||
#ifdef BUTTON_ICONS
|
||||
const char *PlayStationButtons[][MAX_CONTROLLERACTIONS] =
|
||||
CONTROLLER_BUTTONS(PS2_TRIANGLE, PS2_CIRCLE, PS2_CROSS, PS2_SQUARE, "~K~", "~M~", "~A~", "~J~", "~V~", "~C~", "SELECT");
|
||||
#endif
|
||||
|
||||
#undef PS2_TRIANGLE
|
||||
#undef PS2_CIRCLE
|
||||
#undef PS2_CROSS
|
||||
#undef PS2_SQUARE
|
||||
|
||||
#undef CONTROLLER_BUTTONS
|
||||
#undef VFB
|
||||
|
||||
void CControllerConfigManager::GetWideStringOfCommandKeys(uint16 action, wchar *text, uint16 leight)
|
||||
{
|
||||
#ifdef DETECT_PAD_INPUT_SWITCH
|
||||
if (CPad::GetPad(0)->IsAffectedByController) {
|
||||
wchar wstr[16];
|
||||
|
||||
// TODO: INI and/or menu setting for Xbox/PS switch
|
||||
#ifdef BUTTON_ICONS
|
||||
const char *(*Buttons)[MAX_CONTROLLERACTIONS] = CFont::ButtonsSlot != -1 ? XboxButtons : XboxButtons_noIcons;
|
||||
#else
|
||||
const char *(*Buttons)[MAX_CONTROLLERACTIONS] = XboxButtons_noIcons;
|
||||
#endif
|
||||
|
||||
assert(Buttons[CPad::GetPad(0)->Mode][action] != nil); // we cannot use these
|
||||
AsciiToUnicode(Buttons[CPad::GetPad(0)->Mode][action], wstr);
|
||||
|
||||
CMessages::WideStringCopy(text, wstr, leight);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
int32 nums = GetNumOfSettingsForAction((e_ControllerAction)action);
|
||||
|
||||
int32 sets = 0;
|
||||
|
||||
@@ -59,7 +59,6 @@ CEventList::Update(void)
|
||||
}
|
||||
}
|
||||
|
||||
// ok
|
||||
void
|
||||
CEventList::RegisterEvent(eEventType type, eEventEntity entityType, CEntity *ent, CPed *criminal, int32 timeout)
|
||||
{
|
||||
@@ -121,7 +120,7 @@ CEventList::RegisterEvent(eEventType type, eEventEntity entityType, CEntity *ent
|
||||
}
|
||||
|
||||
if(criminal == FindPlayerPed())
|
||||
ReportCrimeForEvent(type, (uintptr)ent, copsDontCare);
|
||||
ReportCrimeForEvent(type, (intptr)ent, copsDontCare);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -199,7 +198,7 @@ CEventList::FindClosestEvent(eEventType type, CVector posn, int32 *event)
|
||||
}
|
||||
|
||||
void
|
||||
CEventList::ReportCrimeForEvent(eEventType type, size_t crimeId, bool copsDontCare)
|
||||
CEventList::ReportCrimeForEvent(eEventType type, intptr crimeId, bool copsDontCare)
|
||||
{
|
||||
eCrimeType crime;
|
||||
switch(type){
|
||||
|
||||
@@ -62,7 +62,7 @@ public:
|
||||
static bool GetEvent(eEventType type, int32 *event);
|
||||
static void ClearEvent(int32 event);
|
||||
static bool FindClosestEvent(eEventType type, CVector posn, int32 *event);
|
||||
static void ReportCrimeForEvent(eEventType type, size_t, bool);
|
||||
static void ReportCrimeForEvent(eEventType type, intptr, bool);
|
||||
};
|
||||
|
||||
extern CEvent gaEvent[NUMEVENTS];
|
||||
+70
-48
@@ -2,6 +2,7 @@
|
||||
#include <ctype.h>
|
||||
#include "main.h"
|
||||
|
||||
#include "General.h"
|
||||
#include "Quaternion.h"
|
||||
#include "ModelInfo.h"
|
||||
#include "ModelIndices.h"
|
||||
@@ -11,7 +12,6 @@
|
||||
#include "HandlingMgr.h"
|
||||
#include "CarCtrl.h"
|
||||
#include "PedType.h"
|
||||
#include "PedStats.h"
|
||||
#include "AnimManager.h"
|
||||
#include "Game.h"
|
||||
#include "RwHelper.h"
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "ZoneCull.h"
|
||||
#include "CdStream.h"
|
||||
#include "FileLoader.h"
|
||||
#include "MemoryHeap.h"
|
||||
#include "Streaming.h"
|
||||
#include "ColStore.h"
|
||||
#include "Occlusion.h"
|
||||
@@ -69,17 +70,19 @@ CFileLoader::LoadLevel(const char *filename)
|
||||
if(*line == '#')
|
||||
continue;
|
||||
|
||||
if(strncmp(line, "EXIT", 9) == 0) // BUG: 9?
|
||||
if(strncmp(line, "EXIT", 4) == 0)
|
||||
break;
|
||||
|
||||
if(strncmp(line, "IMAGEPATH", 9) == 0){
|
||||
RwImageSetPath(line + 10);
|
||||
}else if(strncmp(line, "TEXDICTION", 10) == 0){
|
||||
PUSH_MEMID(MEMID_TEXTURES);
|
||||
strcpy(txdname, line+11);
|
||||
LoadingScreenLoadingFile(txdname);
|
||||
RwTexDictionary *txd = LoadTexDictionary(txdname);
|
||||
AddTexDictionaries(savedTxd, txd);
|
||||
RwTexDictionaryDestroy(txd);
|
||||
POP_MEMID();
|
||||
}else if(strncmp(line, "COLFILE", 7) == 0){
|
||||
LoadingScreenLoadingFile(line+10);
|
||||
LoadCollisionFile(line+10, 0);
|
||||
@@ -95,22 +98,30 @@ CFileLoader::LoadLevel(const char *filename)
|
||||
}else if(strncmp(line, "IPL", 3) == 0){
|
||||
if(!objectsLoaded){
|
||||
LoadingScreenLoadingFile("Collision");
|
||||
PUSH_MEMID(MEMID_WORLD);
|
||||
CObjectData::Initialise("DATA\\OBJECT.DAT");
|
||||
CStreaming::Init();
|
||||
POP_MEMID();
|
||||
PUSH_MEMID(MEMID_COLLISION);
|
||||
CColStore::LoadAllCollision();
|
||||
POP_MEMID();
|
||||
for(int i = 0; i < MODELINFOSIZE; i++)
|
||||
if(CModelInfo::GetModelInfo(i))
|
||||
CModelInfo::GetModelInfo(i)->ConvertAnimFileIndex();
|
||||
objectsLoaded = true;
|
||||
}
|
||||
PUSH_MEMID(MEMID_WORLD);
|
||||
LoadingScreenLoadingFile(line + 4);
|
||||
LoadScene(line + 4);
|
||||
POP_MEMID();
|
||||
}else if(strncmp(line, "SPLASH", 6) == 0){
|
||||
#ifndef DISABLE_LOADING_SCREEN
|
||||
LoadSplash(GetRandomSplashScreen());
|
||||
#endif
|
||||
#ifndef GTA_PS2
|
||||
}else if(strncmp(line, "CDIMAGE", 7) == 0){
|
||||
CdStreamAddImage(line + 8);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,7 +172,7 @@ CFileLoader::LoadTexDictionary(const char *filename)
|
||||
|
||||
struct ColHeader
|
||||
{
|
||||
char ident[4];
|
||||
uint32 ident;
|
||||
uint32 size;
|
||||
};
|
||||
|
||||
@@ -173,12 +184,14 @@ CFileLoader::LoadCollisionFile(const char *filename, uint8 colSlot)
|
||||
CBaseModelInfo *mi;
|
||||
ColHeader header;
|
||||
|
||||
PUSH_MEMID(MEMID_COLLISION);
|
||||
|
||||
debug("Loading collision file %s\n", filename);
|
||||
fd = CFileMgr::OpenFile(filename, "rb");
|
||||
assert(fd > 0);
|
||||
|
||||
while(CFileMgr::Read(fd, (char*)&header, sizeof(header))){
|
||||
assert(strncmp(header.ident, "COLL", 4) == 0);
|
||||
assert(header.ident == 'LLOC');
|
||||
CFileMgr::Read(fd, (char*)work_buff, header.size);
|
||||
memcpy(modelname, work_buff, 24);
|
||||
|
||||
@@ -198,6 +211,8 @@ CFileLoader::LoadCollisionFile(const char *filename, uint8 colSlot)
|
||||
}
|
||||
|
||||
CFileMgr::CloseFile(fd);
|
||||
|
||||
POP_MEMID();
|
||||
}
|
||||
|
||||
|
||||
@@ -213,7 +228,7 @@ CFileLoader::LoadCollisionFileFirstTime(uint8 *buffer, uint32 size, uint8 colSlo
|
||||
while(size > 8){
|
||||
header = (ColHeader*)buffer;
|
||||
modelsize = header->size;
|
||||
if(strncmp(header->ident, "COLL", 4) != 0)
|
||||
if(header->ident != 'LLOC')
|
||||
return size-8 < CDSTREAM_SECTOR_SIZE;
|
||||
memcpy(modelname, buffer+8, 24);
|
||||
memcpy(work_buff, buffer+32, modelsize-24);
|
||||
@@ -247,7 +262,7 @@ CFileLoader::LoadCollisionFile(uint8 *buffer, uint32 size, uint8 colSlot)
|
||||
while(size > 8){
|
||||
header = (ColHeader*)buffer;
|
||||
modelsize = header->size;
|
||||
if(strncmp(header->ident, "COLL", 4) != 0)
|
||||
if(header->ident != 'LLOC')
|
||||
return size-8 < CDSTREAM_SECTOR_SIZE;
|
||||
memcpy(modelname, buffer+8, 24);
|
||||
memcpy(work_buff, buffer+32, modelsize-24);
|
||||
@@ -292,6 +307,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname)
|
||||
buf += 44;
|
||||
if(model.numSpheres > 0){
|
||||
model.spheres = (CColSphere*)RwMalloc(model.numSpheres*sizeof(CColSphere));
|
||||
REGISTER_MEMPTR(&model.spheres);
|
||||
for(i = 0; i < model.numSpheres; i++){
|
||||
model.spheres[i].Set(*(float*)buf, *(CVector*)(buf+4), buf[16], buf[17]);
|
||||
buf += 20;
|
||||
@@ -316,6 +332,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname)
|
||||
buf += 4;
|
||||
if(model.numBoxes > 0){
|
||||
model.boxes = (CColBox*)RwMalloc(model.numBoxes*sizeof(CColBox));
|
||||
REGISTER_MEMPTR(&model.boxes);
|
||||
for(i = 0; i < model.numBoxes; i++){
|
||||
model.boxes[i].Set(*(CVector*)buf, *(CVector*)(buf+12), buf[24], buf[25]);
|
||||
buf += 28;
|
||||
@@ -327,6 +344,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname)
|
||||
buf += 4;
|
||||
if(numVertices > 0){
|
||||
model.vertices = (CompressedVector*)RwMalloc(numVertices*sizeof(CompressedVector));
|
||||
REGISTER_MEMPTR(&model.vertices);
|
||||
for(i = 0; i < numVertices; i++){
|
||||
model.vertices[i].Set(*(float*)buf, *(float*)(buf+4), *(float*)(buf+8));
|
||||
#if 0
|
||||
@@ -344,6 +362,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname)
|
||||
buf += 4;
|
||||
if(model.numTriangles > 0){
|
||||
model.triangles = (CColTriangle*)RwMalloc(model.numTriangles*sizeof(CColTriangle));
|
||||
REGISTER_MEMPTR(&model.triangles);
|
||||
for(i = 0; i < model.numTriangles; i++){
|
||||
model.triangles[i].Set(*(int32*)buf, *(int32*)(buf+4), *(int32*)(buf+8), buf[12]);
|
||||
buf += 16;
|
||||
@@ -567,6 +586,9 @@ CFileLoader::AddTexDictionaries(RwTexDictionary *dst, RwTexDictionary *src)
|
||||
RwTexDictionaryForAllTextures(src, MoveTexturesCB, dst);
|
||||
}
|
||||
|
||||
#define isLine3(l, a, b, c) ((l[0] == a) && (l[1] == b) && (l[2] == c))
|
||||
#define isLine4(l, a, b, c, d) ((l[0] == a) && (l[1] == b) && (l[2] == c) && (l[3] == d))
|
||||
|
||||
void
|
||||
CFileLoader::LoadObjectTypes(const char *filename)
|
||||
{
|
||||
@@ -602,15 +624,15 @@ CFileLoader::LoadObjectTypes(const char *filename)
|
||||
continue;
|
||||
|
||||
if(section == NONE){
|
||||
if(strncmp(line, "objs", 4) == 0) section = OBJS;
|
||||
else if(strncmp(line, "tobj", 4) == 0) section = TOBJ;
|
||||
else if(strncmp(line, "weap", 4) == 0) section = WEAP;
|
||||
else if(strncmp(line, "hier", 4) == 0) section = HIER;
|
||||
else if(strncmp(line, "cars", 4) == 0) section = CARS;
|
||||
else if(strncmp(line, "peds", 4) == 0) section = PEDS;
|
||||
else if(strncmp(line, "path", 4) == 0) section = PATH;
|
||||
else if(strncmp(line, "2dfx", 4) == 0) section = TWODFX;
|
||||
}else if(strncmp(line, "end", 3) == 0){
|
||||
if(isLine4(line, 'o','b','j','s')) section = OBJS;
|
||||
else if(isLine4(line, 't','o','b','j')) section = TOBJ;
|
||||
else if(isLine4(line, 'w','e','a','p')) section = WEAP;
|
||||
else if(isLine4(line, 'h','i','e','r')) section = HIER;
|
||||
else if(isLine4(line, 'c','a','r','s')) section = CARS;
|
||||
else if(isLine4(line, 'p','e','d','s')) section = PEDS;
|
||||
else if(isLine4(line, 'p','a','t','h')) section = PATH;
|
||||
else if(isLine4(line, '2','d','f','x')) section = TWODFX;
|
||||
}else if(isLine3(line, 'e','n','d')){
|
||||
section = NONE;
|
||||
}else switch(section){
|
||||
case OBJS:
|
||||
@@ -843,21 +865,21 @@ CFileLoader::LoadVehicleObject(const char *line)
|
||||
mi->m_level = level;
|
||||
mi->m_compRules = comprules;
|
||||
|
||||
if(strncmp(type, "car", 4) == 0){
|
||||
if(strcmp(type, "car") == 0){
|
||||
mi->m_wheelId = misc;
|
||||
mi->m_wheelScale = wheelScale;
|
||||
mi->m_vehicleType = VEHICLE_TYPE_CAR;
|
||||
}else if(strncmp(type, "boat", 5) == 0){
|
||||
}else if(strcmp(type, "boat") == 0){
|
||||
mi->m_vehicleType = VEHICLE_TYPE_BOAT;
|
||||
}else if(strncmp(type, "train", 6) == 0){
|
||||
}else if(strcmp(type, "train") == 0){
|
||||
mi->m_vehicleType = VEHICLE_TYPE_TRAIN;
|
||||
}else if(strncmp(type, "heli", 5) == 0){
|
||||
}else if(strcmp(type, "heli") == 0){
|
||||
mi->m_vehicleType = VEHICLE_TYPE_HELI;
|
||||
}else if(strncmp(type, "plane", 6) == 0){
|
||||
}else if(strcmp(type, "plane") == 0){
|
||||
mi->m_planeLodId = misc;
|
||||
mi->m_wheelScale = 1.0f;
|
||||
mi->m_vehicleType = VEHICLE_TYPE_PLANE;
|
||||
}else if(strncmp(type, "bike", 5) == 0){
|
||||
}else if(strcmp(type, "bike") == 0){
|
||||
mi->m_bikeSteerAngle = misc;
|
||||
mi->m_wheelScale = wheelScale;
|
||||
mi->m_vehicleType = VEHICLE_TYPE_BIKE;
|
||||
@@ -866,29 +888,29 @@ CFileLoader::LoadVehicleObject(const char *line)
|
||||
|
||||
mi->m_handlingId = mod_HandlingManager.GetHandlingId(handlingId);
|
||||
|
||||
if(strncmp(vehclass, "normal", 7) == 0)
|
||||
if(strcmp(vehclass, "normal") == 0)
|
||||
mi->m_vehicleClass = CCarCtrl::NORMAL;
|
||||
else if(strncmp(vehclass, "poorfamily", 11) == 0)
|
||||
else if(strcmp(vehclass, "poorfamily") == 0)
|
||||
mi->m_vehicleClass = CCarCtrl::POOR;
|
||||
else if(strncmp(vehclass, "richfamily", 11) == 0)
|
||||
else if(strcmp(vehclass, "richfamily") == 0)
|
||||
mi->m_vehicleClass = CCarCtrl::RICH;
|
||||
else if(strncmp(vehclass, "executive", 10) == 0)
|
||||
else if(strcmp(vehclass, "executive") == 0)
|
||||
mi->m_vehicleClass = CCarCtrl::EXEC;
|
||||
else if(strncmp(vehclass, "worker", 7) == 0)
|
||||
else if(strcmp(vehclass, "worker") == 0)
|
||||
mi->m_vehicleClass = CCarCtrl::WORKER;
|
||||
else if(strncmp(vehclass, "big", 4) == 0)
|
||||
else if(strcmp(vehclass, "big") == 0)
|
||||
mi->m_vehicleClass = CCarCtrl::BIG;
|
||||
else if(strncmp(vehclass, "taxi", 5) == 0)
|
||||
else if(strcmp(vehclass, "taxi") == 0)
|
||||
mi->m_vehicleClass = CCarCtrl::TAXI;
|
||||
else if(strncmp(vehclass, "moped", 6) == 0)
|
||||
else if(strcmp(vehclass, "moped") == 0)
|
||||
mi->m_vehicleClass = CCarCtrl::MOPED;
|
||||
else if(strncmp(vehclass, "motorbike", 10) == 0)
|
||||
else if(strcmp(vehclass, "motorbike") == 0)
|
||||
mi->m_vehicleClass = CCarCtrl::MOTORBIKE;
|
||||
else if(strncmp(vehclass, "leisureboat", 12) == 0)
|
||||
else if(strcmp(vehclass, "leisureboat") == 0)
|
||||
mi->m_vehicleClass = CCarCtrl::LEISUREBOAT;
|
||||
else if(strncmp(vehclass, "workerboat", 11) == 0)
|
||||
else if(strcmp(vehclass, "workerboat") == 0)
|
||||
mi->m_vehicleClass = CCarCtrl::WORKERBOAT;
|
||||
else if(strncmp(vehclass, "ignore", 11) == 0){
|
||||
else if(strcmp(vehclass, "ignore") == 0) {
|
||||
mi->m_vehicleClass = -1;
|
||||
return;
|
||||
}
|
||||
@@ -995,7 +1017,7 @@ CFileLoader::Load2dEffect(const char *line)
|
||||
CTxdStore::SetCurrentTxd(CTxdStore::FindTxdSlot("particle"));
|
||||
|
||||
mi = CModelInfo::GetModelInfo(id);
|
||||
effect = CModelInfo::Get2dEffectStore().alloc();
|
||||
effect = CModelInfo::Get2dEffectStore().Alloc();
|
||||
mi->Add2dEffect(effect);
|
||||
effect->pos = CVector(x, y, z);
|
||||
effect->col = CRGBA(r, g, b, a);
|
||||
@@ -1103,13 +1125,13 @@ CFileLoader::LoadScene(const char *filename)
|
||||
continue;
|
||||
|
||||
if(section == NONE){
|
||||
if(strncmp(line, "inst", 4) == 0) section = INST;
|
||||
else if(strncmp(line, "zone", 4) == 0) section = ZONE;
|
||||
else if(strncmp(line, "cull", 4) == 0) section = CULL;
|
||||
else if(strncmp(line, "pick", 4) == 0) section = PICK;
|
||||
else if(strncmp(line, "path", 4) == 0) section = PATH;
|
||||
else if(strncmp(line, "occl", 4) == 0) section = OCCL;
|
||||
}else if(strncmp(line, "end", 3) == 0){
|
||||
if(isLine4(line, 'i','n','s','t')) section = INST;
|
||||
else if(isLine4(line, 'z','o','n','e')) section = ZONE;
|
||||
else if(isLine4(line, 'c','u','l','l')) section = CULL;
|
||||
else if(isLine4(line, 'p','i','c','k')) section = PICK;
|
||||
else if(isLine4(line, 'p','a','t','h')) section = PATH;
|
||||
else if(isLine4(line, 'o','c','c','l')) section = OCCL;
|
||||
}else if(isLine3(line, 'e','n','d')){
|
||||
section = NONE;
|
||||
}else switch(section){
|
||||
case INST:
|
||||
@@ -1307,11 +1329,11 @@ CFileLoader::ReloadPaths(const char *filename)
|
||||
continue;
|
||||
|
||||
if (section == NONE) {
|
||||
if (strncmp(line, "path", 4) == 0) {
|
||||
if (isLine4(line, 'p','a','t','h')) {
|
||||
section = PATH;
|
||||
ThePaths.AllocatePathFindInfoMem(4500);
|
||||
}
|
||||
} else if (strncmp(line, "end", 3) == 0) {
|
||||
} else if (isLine3(line, 'e','n','d')) {
|
||||
section = NONE;
|
||||
} else {
|
||||
switch (section) {
|
||||
@@ -1362,10 +1384,10 @@ CFileLoader::ReloadObjectTypes(const char *filename)
|
||||
continue;
|
||||
|
||||
if (section == NONE) {
|
||||
if (strncmp(line, "objs", 4) == 0) section = OBJS;
|
||||
else if (strncmp(line, "tobj", 4) == 0) section = TOBJ;
|
||||
else if (strncmp(line, "2dfx", 4) == 0) section = TWODFX;
|
||||
} else if (strncmp(line, "end", 3) == 0) {
|
||||
if (isLine4(line, 'o','b','j','s')) section = OBJS;
|
||||
else if (isLine4(line, 't','o','b','j')) section = TOBJ;
|
||||
else if (isLine4(line, '2','d','f','x')) section = TWODFX;
|
||||
} else if (isLine3(line, 'e','n','d')) {
|
||||
section = NONE;
|
||||
} else {
|
||||
switch (section) {
|
||||
@@ -1438,7 +1460,7 @@ CFileLoader::ReLoadScene(const char *filename)
|
||||
if (*line == '#')
|
||||
continue;
|
||||
|
||||
if (strncmp(line, "EXIT", 9) == 0) // BUG: 9?
|
||||
if (strncmp(line, "EXIT", 4) == 0)
|
||||
break;
|
||||
|
||||
if (strncmp(line, "IDE", 3) == 0) {
|
||||
|
||||
@@ -240,20 +240,22 @@ CFileMgr::SetDirMyDocuments(void)
|
||||
mychdir(_psGetUserFilesFolder());
|
||||
}
|
||||
|
||||
size_t
|
||||
ssize_t
|
||||
CFileMgr::LoadFile(const char *file, uint8 *buf, int unused, const char *mode)
|
||||
{
|
||||
int fd;
|
||||
size_t n, len;
|
||||
ssize_t n, len;
|
||||
|
||||
fd = myfopen(file, mode);
|
||||
if(fd == 0)
|
||||
return 0;
|
||||
return -1;
|
||||
len = 0;
|
||||
do{
|
||||
n = myfread(buf + len, 1, 0x4000, fd);
|
||||
if(n < 0)
|
||||
#ifndef FIX_BUGS
|
||||
if (n < 0)
|
||||
return -1;
|
||||
#endif
|
||||
len += n;
|
||||
}while(n == 0x4000);
|
||||
buf[len] = 0;
|
||||
@@ -274,13 +276,13 @@ CFileMgr::OpenFileForWriting(const char *file)
|
||||
}
|
||||
|
||||
size_t
|
||||
CFileMgr::Read(int fd, const char *buf, size_t len)
|
||||
CFileMgr::Read(int fd, const char *buf, ssize_t len)
|
||||
{
|
||||
return myfread((void*)buf, 1, len, fd);
|
||||
}
|
||||
|
||||
size_t
|
||||
CFileMgr::Write(int fd, const char *buf, size_t len)
|
||||
CFileMgr::Write(int fd, const char *buf, ssize_t len)
|
||||
{
|
||||
return myfwrite((void*)buf, 1, len, fd);
|
||||
}
|
||||
|
||||
+3
-3
@@ -9,12 +9,12 @@ public:
|
||||
static void ChangeDir(const char *dir);
|
||||
static void SetDir(const char *dir);
|
||||
static void SetDirMyDocuments(void);
|
||||
static size_t LoadFile(const char *file, uint8 *buf, int unused, const char *mode);
|
||||
static ssize_t LoadFile(const char *file, uint8 *buf, int unused, const char *mode);
|
||||
static int OpenFile(const char *file, const char *mode);
|
||||
static int OpenFile(const char *file) { return OpenFile(file, "rb"); }
|
||||
static int OpenFileForWriting(const char *file);
|
||||
static size_t Read(int fd, const char *buf, size_t len);
|
||||
static size_t Write(int fd, const char *buf, size_t len);
|
||||
static size_t Read(int fd, const char *buf, ssize_t len);
|
||||
static size_t Write(int fd, const char *buf, ssize_t len);
|
||||
static bool Seek(int fd, int offset, int whence);
|
||||
static bool ReadLine(int fd, char *buf, int len);
|
||||
static int CloseFile(int fd);
|
||||
|
||||
+19
-19
@@ -46,7 +46,7 @@ CFire::ProcessFire(void)
|
||||
float fDamagePlayer;
|
||||
float fDamagePeds;
|
||||
float fDamageVehicle;
|
||||
int8 nRandNumber;
|
||||
int16 nRandNumber;
|
||||
float fGreen;
|
||||
float fRed;
|
||||
CVector lightpos;
|
||||
@@ -107,7 +107,11 @@ CFire::ProcessFire(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!FindPlayerVehicle() && !FindPlayerPed()->m_pFire && !(FindPlayerPed()->bFireProof)
|
||||
if (!FindPlayerVehicle() &&
|
||||
#ifdef FIX_BUGS
|
||||
FindPlayerPed() &&
|
||||
#endif
|
||||
!FindPlayerPed()->m_pFire && !(FindPlayerPed()->bFireProof)
|
||||
&& ((FindPlayerPed()->GetPosition() - m_vecPos).MagnitudeSqr() < 2.0f)) {
|
||||
FindPlayerPed()->DoStuffToGoOnFire();
|
||||
gFireManager.StartFire(FindPlayerPed(), m_pSource, 0.8f, 1);
|
||||
@@ -148,11 +152,10 @@ CFire::ProcessFire(void)
|
||||
CShadows::StoreStaticShadow((uintptr)this, SHADOWTYPE_ADDITIVE, gpShadowExplosionTex, &lightpos, 7.0f, 0.0f, 0.0f, -7.0f, 0, nRandNumber / 2,
|
||||
nRandNumber / 2, 0, 10.0f, 1.0f, 40.0f, 0, 0.0f);
|
||||
}
|
||||
fGreen = nRandNumber / 128;
|
||||
fRed = nRandNumber / 128;
|
||||
fGreen = nRandNumber / 128.f;
|
||||
fRed = nRandNumber / 128.f;
|
||||
|
||||
CPointLights::AddLight(0, m_vecPos, CVector(0.0f, 0.0f, 0.0f),
|
||||
12.0f, fRed, fGreen, 0, 0, 0);
|
||||
CPointLights::AddLight(CPointLights::LIGHT_POINT, m_vecPos, CVector(0.0f, 0.0f, 0.0f), 12.0f, fRed, fGreen, 0.0f, 0, 0);
|
||||
} else {
|
||||
Extinguish();
|
||||
}
|
||||
@@ -391,19 +394,16 @@ CFireManager::ExtinguishPoint(CVector point, float range)
|
||||
bool
|
||||
CFireManager::ExtinguishPointWithWater(CVector point, float range)
|
||||
{
|
||||
int fireI = 0;
|
||||
for (int i = 0; i < NUM_FIRES; i++) {
|
||||
if (m_aFires[i].m_bIsOngoing) {
|
||||
if ((point - m_aFires[i].m_vecPos).MagnitudeSqr() < sq(range)) {
|
||||
fireI = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (fireI == NUM_FIRES)
|
||||
return false;
|
||||
|
||||
CFire *fireToExtinguish = &m_aFires[fireI];
|
||||
int i;
|
||||
for (i = 0; i < NUM_FIRES;) {
|
||||
if (m_aFires[i].m_bIsOngoing && (point - m_aFires[i].m_vecPos).MagnitudeSqr() < sq(range)) {
|
||||
break;
|
||||
}
|
||||
if (++i >= NUM_FIRES)
|
||||
return false;
|
||||
}
|
||||
|
||||
CFire *fireToExtinguish = &m_aFires[i];
|
||||
fireToExtinguish->m_fWaterExtinguishCountdown -= 0.012f * CTimer::GetTimeStep();
|
||||
CVector steamPos = fireToExtinguish->m_vecPos +
|
||||
CVector((CGeneral::GetRandomNumber() - 128) * 3.1f / 200.f,
|
||||
|
||||
+1481
-802
File diff suppressed because it is too large
Load Diff
+152
-61
@@ -4,13 +4,14 @@
|
||||
#else
|
||||
|
||||
#include "Sprite2d.h"
|
||||
#include "Timer.h"
|
||||
|
||||
#define MENUHEADER_POS_X 10.0f
|
||||
#define MENUHEADER_POS_Y 10.0f
|
||||
#define MENUHEADER_HEIGHT 2.0f
|
||||
#define MENUHEADER_WIDTH 1.0f
|
||||
|
||||
#define MENU_UNK_X_MARGIN 10.0f
|
||||
#define MENU_X_MARGIN 10.0f
|
||||
|
||||
#define MENUACTION_SCALE_MULT 0.9f
|
||||
|
||||
@@ -22,24 +23,36 @@
|
||||
#define MENU_DEFAULT_CONTENT_Y 100
|
||||
#define MENU_DEFAULT_LINE_HEIGHT 29
|
||||
|
||||
#define MENURADIO_ICON_SCALE 60.0f
|
||||
#define RIGHT_ALIGNED_TEXT_RIGHT_MARGIN(xMargin) (xMargin + 30.0f)
|
||||
|
||||
#define MENURADIO_ICON_FIRST_X 238.f
|
||||
#define MENURADIO_ICON_Y 288.0f
|
||||
#define MENURADIO_ICON_SIZE 60.0f
|
||||
#define MENURADIO_SELECTOR_START_Y 285.f // other options should leave room on the screen
|
||||
#define MENURADIO_SELECTOR_HEIGHT 65.f
|
||||
|
||||
#define MENUSLIDER_X 500.0f
|
||||
#define MENUSLIDER_UNK 100.0f
|
||||
#define MENUSLIDER_SMALLEST_BAR 8.0f
|
||||
#define MENUSLIDER_BIGGEST_BAR 25.0f
|
||||
|
||||
#define BIGTEXT2_X_SCALE 0.6f
|
||||
#define BIGTEXT2_X_SCALE 0.6f // For FONT_STANDARD
|
||||
#define BIGTEXT2_Y_SCALE 1.2f
|
||||
#define BIGTEXT_X_SCALE 0.6f
|
||||
#define BIGTEXT_X_SCALE 0.6f // For FONT_HEADING
|
||||
#define BIGTEXT_Y_SCALE 1.0f
|
||||
#define MEDIUMTEXT_X_SCALE 0.48f
|
||||
#define MEDIUMTEXT_X_SCALE 0.48f // For FONT_STANDARD
|
||||
#define MEDIUMTEXT_Y_SCALE 1.0f
|
||||
#define SMALLTEXT_X_SCALE 0.42f
|
||||
#define SMALLTEXT_X_SCALE 0.42f // For FONT_STANDARD
|
||||
#define SMALLTEXT_Y_SCALE 0.9f
|
||||
#define SMALLESTTEXT_X_SCALE 0.3f
|
||||
#define SMALLESTTEXT_X_SCALE 0.3f // For FONT_STANDARD
|
||||
#define SMALLESTTEXT_Y_SCALE 0.7f
|
||||
|
||||
#define LISTITEM_X_SCALE 0.4f // Only unproportional and commonly used scale for FONT_STANDARD
|
||||
#define LISTITEM_Y_SCALE 0.6f
|
||||
|
||||
#define HELPER_TEXT_RIGHT_MARGIN MENU_X_MARGIN
|
||||
#define HELPER_TEXT_BOTTOM_MARGIN 18.f
|
||||
|
||||
#define PLAYERSETUP_LIST_TOP 58.0f
|
||||
#define PLAYERSETUP_LIST_BOTTOM 95.0f
|
||||
#define PLAYERSETUP_LIST_LEFT 200.0f
|
||||
@@ -51,8 +64,6 @@
|
||||
#endif
|
||||
#define PLAYERSETUP_SCROLLBUTTON_HEIGHT 17.0f
|
||||
#define PLAYERSETUP_SCROLLBUTTON_TXD_DIMENSION 64
|
||||
#define PLAYERSETUP_ROW_TEXT_X_SCALE 0.4f
|
||||
#define PLAYERSETUP_ROW_TEXT_Y_SCALE 0.6f
|
||||
#define PLAYERSETUP_SKIN_COLUMN_LEFT 220.0f
|
||||
#define PLAYERSETUP_DATE_COLUMN_RIGHT 56.0f
|
||||
#define PLAYERSETUP_LIST_BODY_TOP 77
|
||||
@@ -80,16 +91,15 @@
|
||||
#define CONTSETUP_CLASSIC_ROW_HEIGHT 9.0f
|
||||
#define CONTSETUP_BOUND_HIGHLIGHT_HEIGHT 10
|
||||
#define CONTSETUP_BOUND_COLUMN_WIDTH 190.0f
|
||||
#define CONTSETUP_LIST_HEADER_HEIGHT 20.0f
|
||||
#define CONTSETUP_LIST_TOP 28.0f
|
||||
#define CONTSETUP_LIST_TOP 58.0f
|
||||
#define CONTSETUP_LIST_RIGHT 18.0f
|
||||
#define CONTSETUP_LIST_BOTTOM 120.0f
|
||||
#define CONTSETUP_LIST_LEFT 18.0f
|
||||
#define CONTSETUP_LIST_BOTTOM 78.0f
|
||||
#define CONTSETUP_LIST_LEFT 30.0f
|
||||
#define CONTSETUP_COLUMN_1_X 40.0f
|
||||
#define CONTSETUP_COLUMN_2_X 210.0f
|
||||
#define CONTSETUP_COLUMN_3_X (CONTSETUP_COLUMN_2_X + CONTSETUP_BOUND_COLUMN_WIDTH + 10.0f)
|
||||
#define CONTSETUP_BACK_RIGHT 35.0f
|
||||
#define CONTSETUP_BACK_BOTTOM 122.0f
|
||||
#define CONTSETUP_BACK_BOTTOM 82.0f
|
||||
#define CONTSETUP_BACK_HEIGHT 25.0f
|
||||
|
||||
enum
|
||||
@@ -182,7 +192,6 @@ enum eMenuScreen
|
||||
MENUPAGE_MOUSE_CONTROLS = 31,
|
||||
MENUPAGE_PAUSE_MENU = 32,
|
||||
MENUPAGE_NONE = 33, // Then chooses main menu or pause menu
|
||||
MENUPAGE_OUTRO = 34,
|
||||
#ifdef LEGACY_MENU_OPTIONS
|
||||
MENUPAGE_CONTROLLER_SETTINGS,
|
||||
MENUPAGE_DEBUG_MENU,
|
||||
@@ -192,14 +201,26 @@ enum eMenuScreen
|
||||
MENUPAGE_CONTROLLER_PC_OLD4,
|
||||
MENUPAGE_CONTROLLER_DEBUG,
|
||||
#endif
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
|
||||
#ifdef GRAPHICS_MENU_OPTIONS
|
||||
MENUPAGE_GRAPHICS_SETTINGS,
|
||||
#endif
|
||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||
MENUPAGE_DETECT_JOYSTICK,
|
||||
#endif
|
||||
|
||||
#endif
|
||||
MENUPAGE_OUTRO, // Originally 34, but CFO needs last screen to be empty to count number of menu pages
|
||||
MENUPAGES
|
||||
};
|
||||
|
||||
enum eMenuAction
|
||||
{
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
MENUACTION_CFO_SELECT = -2,
|
||||
MENUACTION_CFO_DYNAMIC = -1,
|
||||
#endif
|
||||
MENUACTION_NOTHING,
|
||||
MENUACTION_LABEL,
|
||||
MENUACTION_YES,
|
||||
@@ -254,29 +275,10 @@ enum eMenuAction
|
||||
MENUACTION_DRAWDIST,
|
||||
MENUACTION_MOUSESENS,
|
||||
MENUACTION_MP3VOLUMEBOOST,
|
||||
#ifdef IMPROVED_VIDEOMODE
|
||||
MENUACTION_SCREENFORMAT,
|
||||
#endif
|
||||
#ifdef LEGACY_MENU_OPTIONS
|
||||
MENUACTION_CTRLVIBRATION,
|
||||
MENUACTION_CTRLCONFIG,
|
||||
#endif
|
||||
#ifdef ANISOTROPIC_FILTERING
|
||||
MENUACTION_MIPMAPS,
|
||||
MENUACTION_TEXTURE_FILTERING,
|
||||
#endif
|
||||
#ifdef MULTISAMPLING
|
||||
MENUACTION_MULTISAMPLING,
|
||||
#endif
|
||||
#ifdef NO_ISLAND_LOADING
|
||||
MENUACTION_ISLANDLOADING,
|
||||
#endif
|
||||
#ifdef PS2_ALPHA_TEST
|
||||
MENUACTION_PS2_ALPHA_TEST,
|
||||
#endif
|
||||
#ifdef CUTSCENE_BORDERS_SWITCH
|
||||
MENUACTION_CUTSCENEBORDERS,
|
||||
#endif
|
||||
};
|
||||
|
||||
enum eCheckHover
|
||||
@@ -303,16 +305,8 @@ enum eCheckHover
|
||||
HOVEROPTION_LIST, // also layer in controller setup and skin menu
|
||||
HOVEROPTION_SKIN,
|
||||
HOVEROPTION_USESKIN, // also layer in controller setup and skin menu
|
||||
HOVEROPTION_RADIO_0,
|
||||
HOVEROPTION_RADIO_1,
|
||||
HOVEROPTION_RADIO_2,
|
||||
HOVEROPTION_RADIO_3,
|
||||
HOVEROPTION_RADIO_4,
|
||||
HOVEROPTION_RADIO_5,
|
||||
HOVEROPTION_RADIO_6,
|
||||
HOVEROPTION_RADIO_7,
|
||||
HOVEROPTION_RADIO_8,
|
||||
HOVEROPTION_RADIO_9,
|
||||
HOVEROPTION_NEXT_RADIO,
|
||||
HOVEROPTION_PREV_RADIO,
|
||||
HOVEROPTION_INCREASE_BRIGHTNESS,
|
||||
HOVEROPTION_DECREASE_BRIGHTNESS,
|
||||
HOVEROPTION_INCREASE_DRAWDIST,
|
||||
@@ -330,8 +324,8 @@ enum eCheckHover
|
||||
|
||||
enum
|
||||
{
|
||||
#ifdef LEGACY_MENU_OPTIONS
|
||||
NUM_MENUROWS = 14,
|
||||
#if defined LEGACY_MENU_OPTIONS || defined CUSTOM_FRONTEND_OPTIONS
|
||||
NUM_MENUROWS = 18,
|
||||
#else
|
||||
NUM_MENUROWS = 12,
|
||||
#endif
|
||||
@@ -347,7 +341,7 @@ enum eControlMethod
|
||||
enum ControllerSetupColumn
|
||||
{
|
||||
CONTSETUP_PED_COLUMN = 0,
|
||||
CONTSETUP_VEHICLE_COLUMN = 14,
|
||||
CONTSETUP_VEHICLE_COLUMN = 16,
|
||||
};
|
||||
|
||||
struct tSkinInfo
|
||||
@@ -365,6 +359,7 @@ struct BottomBarOption
|
||||
int32 screenId;
|
||||
};
|
||||
|
||||
#ifndef CUSTOM_FRONTEND_OPTIONS
|
||||
struct CMenuScreen
|
||||
{
|
||||
char m_ScreenName[8];
|
||||
@@ -382,6 +377,88 @@ struct CMenuScreen
|
||||
uint8 m_Align;
|
||||
} m_aEntries[NUM_MENUROWS];
|
||||
};
|
||||
extern CMenuScreen aScreens[MENUPAGES];
|
||||
#else
|
||||
#include "frontendoption.h"
|
||||
struct CCustomScreenLayout {
|
||||
int startX; // not used at all if first entry has X and Y values
|
||||
int startY; // not used at all if first entry has X and Y values
|
||||
int lineHeight; // used to determine next entry's Y coordinate, if it has 0-0 as coordinates
|
||||
bool showLeftRightHelper;
|
||||
bool noInvasiveBorders; // not needed on pages already handled by game
|
||||
int xMargin; // useful for two part texts - 0/empty = MENU_X_MARGIN
|
||||
};
|
||||
|
||||
struct CCFO
|
||||
{
|
||||
int8 *value;
|
||||
const char *save;
|
||||
};
|
||||
|
||||
struct CCFOSelect : CCFO
|
||||
{
|
||||
char** rightTexts;
|
||||
int8 numRightTexts;
|
||||
bool onlyApplyOnEnter;
|
||||
int8 displayedValue; // only if onlyApplyOnEnter enabled for now
|
||||
int8 lastSavedValue; // only if onlyApplyOnEnter enabled
|
||||
ChangeFunc changeFunc;
|
||||
|
||||
CCFOSelect() {};
|
||||
CCFOSelect(int8* value, const char* save, const char** rightTexts, int8 numRightTexts, bool onlyApplyOnEnter, ChangeFunc changeFunc){
|
||||
this->value = value;
|
||||
if (value)
|
||||
this->lastSavedValue = this->displayedValue = *value;
|
||||
|
||||
this->save = save;
|
||||
this->rightTexts = (char**)rightTexts;
|
||||
this->numRightTexts = numRightTexts;
|
||||
this->onlyApplyOnEnter = onlyApplyOnEnter;
|
||||
this->changeFunc = changeFunc;
|
||||
}
|
||||
};
|
||||
|
||||
struct CCFODynamic : CCFO
|
||||
{
|
||||
DrawFunc drawFunc;
|
||||
ButtonPressFunc buttonPressFunc;
|
||||
|
||||
CCFODynamic() {};
|
||||
CCFODynamic(int8* value, const char* save, DrawFunc drawFunc, ButtonPressFunc buttonPressFunc){
|
||||
this->value = value;
|
||||
this->save = save;
|
||||
this->drawFunc = drawFunc;
|
||||
this->buttonPressFunc = buttonPressFunc;
|
||||
}
|
||||
};
|
||||
|
||||
struct CMenuScreenCustom
|
||||
{
|
||||
char m_ScreenName[8];
|
||||
int32 m_PreviousPage; // eMenuScreen
|
||||
CCustomScreenLayout *layout;
|
||||
ReturnPrevPageFunc returnPrevPageFunc;
|
||||
|
||||
struct CMenuEntry
|
||||
{
|
||||
int32 m_Action; // eMenuAction - below zero is CFO
|
||||
char m_EntryName[8];
|
||||
struct {
|
||||
union {
|
||||
CCFO *m_CFO; // for initializing
|
||||
CCFOSelect *m_CFOSelect;
|
||||
CCFODynamic *m_CFODynamic;
|
||||
};
|
||||
int32 m_SaveSlot; // eSaveSlot
|
||||
int32 m_TargetMenu; // eMenuScreen
|
||||
};
|
||||
uint16 m_X;
|
||||
uint16 m_Y;
|
||||
uint8 m_Align;
|
||||
} m_aEntries[NUM_MENUROWS];
|
||||
};
|
||||
extern CMenuScreenCustom aScreens[MENUPAGES];
|
||||
#endif
|
||||
|
||||
struct MenuTrapezoid
|
||||
{
|
||||
@@ -473,7 +550,7 @@ public:
|
||||
int8 m_PrefsShowSubtitles;
|
||||
int8 m_PrefsShowLegends;
|
||||
int8 m_PrefsUseWideScreen;
|
||||
int8 m_PrefsVsync; // TODO(Miami): Are we sure?
|
||||
int8 m_PrefsVsync;
|
||||
int8 m_PrefsVsyncDisp;
|
||||
int8 m_PrefsFrameLimiter;
|
||||
int8 m_nPrefsAudio3DProviderIndex;
|
||||
@@ -481,7 +558,7 @@ public:
|
||||
int8 m_PrefsDMA;
|
||||
int8 m_PrefsSfxVolume;
|
||||
int8 m_PrefsMusicVolume;
|
||||
uint8 m_PrefsRadioStation;
|
||||
int8 m_PrefsRadioStation;
|
||||
uint8 m_PrefsStereoMono; // unused except restore settings
|
||||
int32 m_nCurrOption;
|
||||
bool m_bQuitGameNoCD;
|
||||
@@ -501,7 +578,7 @@ public:
|
||||
int32 field_54;
|
||||
int8 m_bLanguageLoaded;
|
||||
uint8 m_PrefsAllowNastyGame;
|
||||
uint8 m_PrefsMP3BoostVolume;
|
||||
int8 m_PrefsMP3BoostVolume;
|
||||
uint8 m_ControlMethod;
|
||||
int32 m_nPrefsVideoMode;
|
||||
int32 m_nDisplayVideoMode;
|
||||
@@ -514,10 +591,10 @@ public:
|
||||
uint8 field_74[4];
|
||||
int32 *pControlEdit;
|
||||
bool m_OnlySaveMenu;
|
||||
int32 m_menuTransitionProgress;
|
||||
int32 m_firstStartCounter;
|
||||
CSprite2d m_aFrontEndSprites[NUM_MENU_SPRITES];
|
||||
bool m_bSpritesLoaded;
|
||||
int32 field_F0;
|
||||
int32 m_LeftMostRadioX;
|
||||
int32 m_ScrollRadioBy;
|
||||
int32 m_nCurrScreen;
|
||||
int32 m_nPrevScreen;
|
||||
@@ -621,20 +698,34 @@ public:
|
||||
ISLAND_LOADING_HIGH
|
||||
};
|
||||
|
||||
static int8 m_DisplayIslandLoading;
|
||||
static int8 m_PrefsIslandLoading;
|
||||
int8 m_PrefsIslandLoading;
|
||||
|
||||
#define ISLAND_LOADING_IS(p) if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_##p)
|
||||
#define ISLAND_LOADING_ISNT(p) if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_##p)
|
||||
#define ISLAND_LOADING_IS(p) if (FrontEndMenuManager.m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_##p)
|
||||
#define ISLAND_LOADING_ISNT(p) if (FrontEndMenuManager.m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_##p)
|
||||
#else
|
||||
#define ISLAND_LOADING_IS(p)
|
||||
#define ISLAND_LOADING_ISNT(p)
|
||||
#endif
|
||||
|
||||
#ifdef XBOX_MESSAGE_SCREEN
|
||||
static uint32 m_nDialogHideTimer;
|
||||
static PauseModeTime m_nDialogHideTimerPauseMode;
|
||||
static bool m_bDialogOpen;
|
||||
static wchar *m_pDialogText;
|
||||
static bool m_bSaveWasSuccessful;
|
||||
|
||||
static void SetDialogText(const char*);
|
||||
static bool DialogTextCmp(const char*);
|
||||
static void ToggleDialog(bool);
|
||||
static void SetDialogTimer(uint32);
|
||||
void ProcessDialogTimer(void);
|
||||
void DrawOverlays(void);
|
||||
void CloseDialog(void);
|
||||
#endif
|
||||
|
||||
void Initialise();
|
||||
void PrintMap();
|
||||
void SetFrontEndRenderStates();
|
||||
static void BuildStatLine(Const char *text, void *stat, bool itsFloat, void *stat2);
|
||||
static void CentreMousePointer();
|
||||
void CheckCodesForControls(int);
|
||||
bool CheckHover(int x1, int x2, int y1, int y2);
|
||||
@@ -651,7 +742,6 @@ public:
|
||||
void DrawBackground(bool transitionCall);
|
||||
void DrawPlayerSetupScreen(bool);
|
||||
int FadeIn(int alpha);
|
||||
void FilterOutColorMarkersFromString(wchar*);
|
||||
int GetStartOptionsCntrlConfigScreens();
|
||||
void InitialiseChangedLanguageSettings();
|
||||
void LoadAllTextures();
|
||||
@@ -665,7 +755,7 @@ public:
|
||||
void ProcessList(bool &optionSelected, bool &goBack);
|
||||
void UserInput();
|
||||
void ProcessUserInput(uint8, uint8, uint8, uint8, int8);
|
||||
void ChangeRadioStation(uint8);
|
||||
void ChangeRadioStation(int8);
|
||||
void ProcessFileActions();
|
||||
void ProcessOnOffMenuOptions();
|
||||
void RequestFrontEndShutDown();
|
||||
@@ -679,8 +769,10 @@ public:
|
||||
void UnloadTextures();
|
||||
void WaitForUserCD();
|
||||
int GetNumOptionsCntrlConfigScreens();
|
||||
int ConstructStatLine(int);
|
||||
void SwitchToNewScreen(int8);
|
||||
void AdditionalOptionInput(bool &goBack);
|
||||
void ExportStats(void);
|
||||
void PrintRadioSelector(void);
|
||||
|
||||
// New (not in function or inlined in the game)
|
||||
void ThingsToDoBeforeLeavingPage();
|
||||
@@ -698,6 +790,5 @@ VALIDATE_SIZE(CMenuManager, 0x688);
|
||||
#endif
|
||||
|
||||
extern CMenuManager FrontEndMenuManager;
|
||||
extern CMenuScreen aScreens[];
|
||||
|
||||
#endif
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#include "Game.h"
|
||||
#include "World.h"
|
||||
#include "PlayerInfo.h"
|
||||
#include "FrontendControls.h"
|
||||
#include "FrontEndControls.h"
|
||||
#include "MemoryCard.h"
|
||||
|
||||
#define CRect_SZ(x, y, w, h) CRect(x, y, x+w, y+h)
|
||||
@@ -3017,4 +3017,4 @@ CMenuManager::FilterOutColorMarkersFromString(wchar *string, CRGBA &color)
|
||||
*dst = '\0';
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
+514
-70
@@ -32,6 +32,7 @@
|
||||
#include "Fluff.h"
|
||||
#include "Font.h"
|
||||
#include "Frontend.h"
|
||||
#include "frontendoption.h"
|
||||
#include "GameLogic.h"
|
||||
#include "Garages.h"
|
||||
#include "GenericGameStorage.h"
|
||||
@@ -44,6 +45,7 @@
|
||||
#include "MBlur.h"
|
||||
#include "Messages.h"
|
||||
#include "MemoryCard.h"
|
||||
#include "MemoryHeap.h"
|
||||
#include "Pad.h"
|
||||
#include "Particle.h"
|
||||
#include "ParticleObject.h"
|
||||
@@ -93,6 +95,10 @@
|
||||
#include "WaterCreatures.h"
|
||||
#include "postfx.h"
|
||||
#include "custompipes.h"
|
||||
#include "screendroplets.h"
|
||||
#ifdef USE_TEXTURE_POOL
|
||||
#include "TexturePools.h"
|
||||
#endif
|
||||
|
||||
eLevelName CGame::currLevel;
|
||||
int32 CGame::currArea;
|
||||
@@ -162,6 +168,11 @@ CGame::InitialiseOnceBeforeRW(void)
|
||||
debug("size of dummy %d\n", sizeof(CDummy));
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
CPostFX::InitOnce();
|
||||
#endif
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
// Not needed here but may be needed in future
|
||||
// if (numCustomFrontendOptions == 0 && numCustomFrontendScreens == 0)
|
||||
CustomFrontendOptionsPopulate();
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
@@ -182,12 +193,22 @@ CGame::InitialiseRenderWare(void)
|
||||
#ifdef USE_TEXTURE_POOL
|
||||
_TexturePoolsInitialise();
|
||||
#endif
|
||||
|
||||
|
||||
CTxdStore::Initialise();
|
||||
CVisibilityPlugins::Initialise();
|
||||
|
||||
|
||||
#ifdef GTA_PS2
|
||||
RpSkySelectTrueTSClipper(TRUE);
|
||||
RpSkySelectTrueTLClipper(TRUE);
|
||||
|
||||
// PS2ManagerApplyDirectionalLightingCB() uploads the GTA lights
|
||||
// directly without going through RpWorld and all that
|
||||
SetupPS2ManagerDefaultLightingCallback();
|
||||
PreAllocateRwObjects();
|
||||
#endif
|
||||
|
||||
/* Create camera */
|
||||
Scene.camera = CameraCreate(RsGlobal.width, RsGlobal.height, TRUE);
|
||||
Scene.camera = CameraCreate(SCREEN_WIDTH, SCREEN_HEIGHT, TRUE);
|
||||
ASSERT(Scene.camera != nil);
|
||||
if (!Scene.camera)
|
||||
{
|
||||
@@ -217,7 +238,7 @@ CGame::InitialiseRenderWare(void)
|
||||
/* Add the camera to the world */
|
||||
RpWorldAddCamera(Scene.world, Scene.camera);
|
||||
LightsCreate(Scene.world);
|
||||
|
||||
|
||||
CreateDebugFont();
|
||||
|
||||
#ifdef LIBRW
|
||||
@@ -234,23 +255,39 @@ CGame::InitialiseRenderWare(void)
|
||||
ReplaceAtomicPipeCallback();
|
||||
#endif // PS2_ALPHA_TEST
|
||||
#endif // LIBRW
|
||||
|
||||
|
||||
PUSH_MEMID(MEMID_TEXTURES);
|
||||
CFont::Initialise();
|
||||
CHud::Initialise();
|
||||
CPlayerSkin::Initialise();
|
||||
|
||||
POP_MEMID();
|
||||
|
||||
#ifdef EXTENDED_PIPELINES
|
||||
CustomPipes::CustomPipeInit(); // need Scene.world for this
|
||||
#endif
|
||||
#ifdef SCREEN_DROPLETS
|
||||
ScreenDroplets::InitDraw();
|
||||
#endif
|
||||
|
||||
return (true);
|
||||
}
|
||||
|
||||
void CGame::ShutdownRenderWare(void)
|
||||
{
|
||||
#ifdef SCREEN_DROPLETS
|
||||
ScreenDroplets::Shutdown();
|
||||
#endif
|
||||
#ifdef EXTENDED_PIPELINES
|
||||
CustomPipes::CustomPipeShutdown();
|
||||
#endif
|
||||
|
||||
DestroySplashScreen();
|
||||
CHud::Shutdown();
|
||||
CFont::Shutdown();
|
||||
|
||||
for ( int32 i = 0; i < NUMPLAYERS; i++ )
|
||||
CWorld::Players[i].DeletePlayerSkin();
|
||||
|
||||
|
||||
CPlayerSkin::Shutdown();
|
||||
|
||||
DestroyDebugFont();
|
||||
@@ -282,7 +319,12 @@ bool CGame::InitialiseOnceAfterRW(void)
|
||||
CSurfaceTable::Initialise("DATA\\SURFACE.DAT");
|
||||
CPedStats::Initialise();
|
||||
CTimeCycle::Initialise();
|
||||
#ifdef GTA_PS2
|
||||
LoadingScreen("Loading the Game", "Initialising audio", GetRandomSplashScreen());
|
||||
#endif
|
||||
DMAudio.Initialise();
|
||||
|
||||
#ifndef GTA_PS2
|
||||
if ( DMAudio.GetNum3DProvidersAvailable() == 0 )
|
||||
FrontEndMenuManager.m_nPrefsAudio3DProviderIndex = NO_AUDIO_PROVIDER;
|
||||
|
||||
@@ -299,6 +341,7 @@ bool CGame::InitialiseOnceAfterRW(void)
|
||||
DMAudio.SetEffectsMasterVolume(FrontEndMenuManager.m_PrefsSfxVolume);
|
||||
DMAudio.SetEffectsFadeVol(127);
|
||||
DMAudio.SetMusicFadeVol(127);
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -314,23 +357,40 @@ bool CGame::Initialise(const char* datFile)
|
||||
{
|
||||
ResetLoadingScreenBar();
|
||||
strcpy(aDatFile, datFile);
|
||||
|
||||
#ifdef GTA_PS2
|
||||
// TODO: upload VU0 collision code here
|
||||
#endif
|
||||
|
||||
CPools::Initialise();
|
||||
|
||||
#ifndef GTA_PS2
|
||||
CIniFile::LoadIniFile();
|
||||
#endif
|
||||
#ifdef USE_TEXTURE_POOL
|
||||
_TexturePoolsUnknown(false);
|
||||
#endif
|
||||
currLevel = LEVEL_BEACH;
|
||||
currArea = AREA_MAIN_MAP;
|
||||
|
||||
PUSH_MEMID(MEMID_TEXTURES);
|
||||
LoadingScreen("Loading the Game", "Loading generic textures", GetRandomSplashScreen());
|
||||
gameTxdSlot = CTxdStore::AddTxdSlot("generic");
|
||||
CTxdStore::Create(gameTxdSlot);
|
||||
CTxdStore::AddRef(gameTxdSlot);
|
||||
|
||||
LoadingScreen("Loading the Game", "Loading particles", nil);
|
||||
int particleTxdSlot = CTxdStore::AddTxdSlot("particle");
|
||||
CTxdStore::LoadTxd(particleTxdSlot, "MODELS/PARTICLE.TXD");
|
||||
CTxdStore::AddRef(particleTxdSlot);
|
||||
CTxdStore::SetCurrentTxd(gameTxdSlot);
|
||||
LoadingScreen("Loading the Game", "Setup game variables", nil);
|
||||
POP_MEMID();
|
||||
|
||||
#ifdef GTA_PS2
|
||||
CDma::SyncChannel(0, true);
|
||||
#endif
|
||||
|
||||
CGameLogic::InitAtStartOfGame();
|
||||
CReferences::Init();
|
||||
TheCamera.Init();
|
||||
@@ -350,21 +410,32 @@ bool CGame::Initialise(const char* datFile)
|
||||
CMessages::ClearAllMessagesDisplayedByGame();
|
||||
CRecordDataForGame::Init();
|
||||
CRestart::Initialise();
|
||||
|
||||
PUSH_MEMID(MEMID_WORLD);
|
||||
CWorld::Initialise();
|
||||
POP_MEMID();
|
||||
|
||||
PUSH_MEMID(MEMID_TEXTURES);
|
||||
CParticle::Initialise();
|
||||
#ifdef PS2
|
||||
gStartX = -180.0f;
|
||||
gStartY = 180.0f;
|
||||
gStartZ = 14.0f;
|
||||
#endif
|
||||
POP_MEMID();
|
||||
|
||||
PUSH_MEMID(MEMID_ANIMATION);
|
||||
CAnimManager::Initialise();
|
||||
CCutsceneMgr::Initialise();
|
||||
POP_MEMID();
|
||||
|
||||
PUSH_MEMID(MEMID_CARS);
|
||||
CCarCtrl::Init();
|
||||
POP_MEMID();
|
||||
|
||||
PUSH_MEMID(MEMID_DEF_MODELS);
|
||||
InitModelIndices();
|
||||
CModelInfo::Initialise();
|
||||
CPickups::Init();
|
||||
CTheCarGenerators::Init();
|
||||
|
||||
CdStreamAddImage("MODELS\\GTA3.IMG");
|
||||
|
||||
CFileLoader::LoadLevel("DATA\\DEFAULT.DAT");
|
||||
CFileLoader::LoadLevel(datFile);
|
||||
#ifdef EXTENDED_PIPELINES
|
||||
@@ -376,17 +447,21 @@ bool CGame::Initialise(const char* datFile)
|
||||
CVehicleModelInfo::LoadVehicleColours();
|
||||
CVehicleModelInfo::LoadEnvironmentMaps();
|
||||
CTheZones::PostZoneCreation();
|
||||
POP_MEMID();
|
||||
|
||||
LoadingScreen("Loading the Game", "Setup paths", nil);
|
||||
ThePaths.PreparePathData();
|
||||
for (int i = 0; i < NUMPLAYERS; i++)
|
||||
CWorld::Players[i].Clear();
|
||||
CWorld::Players[0].LoadPlayerSkin();
|
||||
TestModelIndices();
|
||||
|
||||
LoadingScreen("Loading the Game", "Setup water", nil);
|
||||
WaterLevelInitialise("DATA\\WATER.DAT");
|
||||
TheConsole.Init();
|
||||
CDraw::SetFOV(120.0f);
|
||||
CDraw::ms_fLODDistance = 500.0f;
|
||||
|
||||
LoadingScreen("Loading the Game", "Setup streaming", nil);
|
||||
CStreaming::LoadInitialVehicles();
|
||||
CStreaming::LoadInitialPeds();
|
||||
@@ -394,22 +469,32 @@ bool CGame::Initialise(const char* datFile)
|
||||
CStreaming::LoadAllRequestedModels(false);
|
||||
CStreaming::RemoveIslandsNotUsed(currLevel);
|
||||
printf("Streaming uses %zuK of its memory", CStreaming::ms_memoryUsed / 1024); // original modifier was %d
|
||||
|
||||
LoadingScreen("Loading the Game", "Load animations", GetRandomSplashScreen());
|
||||
PUSH_MEMID(MEMID_ANIMATION);
|
||||
CAnimManager::LoadAnimFiles();
|
||||
POP_MEMID();
|
||||
|
||||
CStreaming::LoadInitialWeapons();
|
||||
CStreaming::LoadAllRequestedModels(0);
|
||||
CPed::Initialise();
|
||||
CRouteNode::Initialise();
|
||||
CEventList::Initialise();
|
||||
#ifdef SCREEN_DROPLETS
|
||||
ScreenDroplets::Initialise();
|
||||
#endif
|
||||
LoadingScreen("Loading the Game", "Find big buildings", nil);
|
||||
CRenderer::Init();
|
||||
|
||||
LoadingScreen("Loading the Game", "Setup game variables", nil);
|
||||
CRadar::Initialise();
|
||||
CRadar::LoadTextures();
|
||||
CWeapon::InitialiseWeapons();
|
||||
|
||||
LoadingScreen("Loading the Game", "Setup traffic lights", nil);
|
||||
CTrafficLights::ScanForLightsOnMap();
|
||||
CRoadBlocks::Init();
|
||||
|
||||
LoadingScreen("Loading the Game", "Setup game variables", nil);
|
||||
CPopulation::Initialise();
|
||||
CWorld::PlayerInFocus = 0;
|
||||
@@ -420,10 +505,16 @@ bool CGame::Initialise(const char* datFile)
|
||||
CAntennas::Init();
|
||||
CGlass::Init();
|
||||
gPhoneInfo.Initialise();
|
||||
#ifdef GTA_SCENE_EDIT
|
||||
CSceneEdit::Initialise();
|
||||
#endif
|
||||
|
||||
LoadingScreen("Loading the Game", "Load scripts", nil);
|
||||
PUSH_MEMID(MEMID_SCRIPT);
|
||||
CTheScripts::Init();
|
||||
CGangs::Initialise();
|
||||
POP_MEMID();
|
||||
|
||||
LoadingScreen("Loading the Game", "Setup game variables", nil);
|
||||
CClock::Initialise(1000);
|
||||
CHeli::InitHelis();
|
||||
@@ -439,24 +530,26 @@ bool CGame::Initialise(const char* datFile)
|
||||
CWaterCannons::Init();
|
||||
CBridge::Init();
|
||||
CGarages::Init();
|
||||
|
||||
LoadingScreen("Loading the Game", "Position dynamic objects", nil);
|
||||
LoadingScreen("Loading the Game", "Initialise vehicle paths", nil);
|
||||
|
||||
CTrain::InitTrains();
|
||||
CPlane::InitPlanes();
|
||||
CCredits::Init();
|
||||
CRecordDataForChase::Init();
|
||||
CReplay::Init();
|
||||
|
||||
LoadingScreen("Loading the Game", "Start script", nil);
|
||||
#ifdef PS2_MENU
|
||||
if ( !TheMemoryCard.m_bWantToLoad )
|
||||
#endif
|
||||
{
|
||||
#endif
|
||||
LoadingScreen("Loading the Game", "Start script", nil);
|
||||
CTheScripts::StartTestScript();
|
||||
CTheScripts::Process();
|
||||
TheCamera.Process();
|
||||
#ifdef PS2_MENU
|
||||
CTheScripts::StartTestScript();
|
||||
CTheScripts::Process();
|
||||
TheCamera.Process();
|
||||
}
|
||||
#endif
|
||||
|
||||
LoadingScreen("Loading the Game", "Load scene", nil);
|
||||
CCollision::ms_collisionInMemory = currLevel;
|
||||
for (int i = 0; i < MAX_PADS; i++)
|
||||
@@ -481,9 +574,7 @@ bool CGame::ShutDown(void)
|
||||
CScriptPaths::Shutdown();
|
||||
CWaterCreatures::RemoveAll();
|
||||
CSpecialFX::Shutdown();
|
||||
#ifndef PS2
|
||||
CGarages::Shutdown();
|
||||
#endif
|
||||
CMovingThings::Shutdown();
|
||||
gPhoneInfo.Shutdown();
|
||||
CWeapon::ShutdownWeapons();
|
||||
@@ -537,13 +628,11 @@ void CGame::ReInitGameObjectVariables(void)
|
||||
CGameLogic::InitAtStartOfGame();
|
||||
#ifdef PS2_MENU
|
||||
if ( !TheMemoryCard.m_bWantToLoad )
|
||||
#endif
|
||||
{
|
||||
#endif
|
||||
TheCamera.Init();
|
||||
TheCamera.SetRwCamera(Scene.camera);
|
||||
#ifdef PS2_MENU
|
||||
TheCamera.Init();
|
||||
TheCamera.SetRwCamera(Scene.camera);
|
||||
}
|
||||
#endif
|
||||
CDebug::DebugInitTextBuffer();
|
||||
CWeather::Init();
|
||||
CUserDisplay::Init();
|
||||
@@ -552,11 +641,6 @@ void CGame::ReInitGameObjectVariables(void)
|
||||
CWorld::bDoingCarCollisions = false;
|
||||
CHud::ReInitialise();
|
||||
CRadar::Initialise();
|
||||
#ifdef PS2
|
||||
gStartX = -180.0f;
|
||||
gStartY = 180.0f;
|
||||
gStartZ = 14.0f;
|
||||
#endif
|
||||
CCarCtrl::ReInit();
|
||||
CTimeCycle::Initialise();
|
||||
CDraw::SetFOV(120.0f);
|
||||
@@ -568,6 +652,9 @@ void CGame::ReInitGameObjectVariables(void)
|
||||
currArea = AREA_MAIN_MAP;
|
||||
CPed::Initialise();
|
||||
CEventList::Initialise();
|
||||
#ifdef SCREEN_DROPLETS
|
||||
ScreenDroplets::Initialise();
|
||||
#endif
|
||||
CWeapon::InitialiseWeapons();
|
||||
CPopulation::Initialise();
|
||||
|
||||
@@ -575,15 +662,15 @@ void CGame::ReInitGameObjectVariables(void)
|
||||
CWorld::Players[i].Clear();
|
||||
|
||||
CWorld::PlayerInFocus = 0;
|
||||
#ifdef PS2
|
||||
CWeaponEffects::Init();
|
||||
CSkidmarks::Init();
|
||||
#endif
|
||||
CAntennas::Init();
|
||||
CGlass::Init();
|
||||
gPhoneInfo.Initialise();
|
||||
|
||||
PUSH_MEMID(MEMID_SCRIPT);
|
||||
CTheScripts::Init();
|
||||
CGangs::Initialise();
|
||||
POP_MEMID();
|
||||
|
||||
CTimer::Initialise();
|
||||
CClock::Initialise(1000);
|
||||
CTheCarGenerators::Init();
|
||||
@@ -594,10 +681,6 @@ void CGame::ReInitGameObjectVariables(void)
|
||||
CPickups::Init();
|
||||
CPacManPickups::Init();
|
||||
CGarages::Init();
|
||||
#ifdef PS2
|
||||
CClouds::Init();
|
||||
CRemote::Init();
|
||||
#endif
|
||||
CSpecialFX::Init();
|
||||
CRopes::Init();
|
||||
CWaterCannons::Init();
|
||||
@@ -667,8 +750,10 @@ void CGame::InitialiseWhenRestarting(void)
|
||||
if (b_FoundRecentSavedGameWantToLoad || FrontEndMenuManager.m_bWantToLoad)
|
||||
{
|
||||
LoadSplash("splash1");
|
||||
#ifndef XBOX_MESSAGE_SCREEN
|
||||
if (FrontEndMenuManager.m_bWantToLoad)
|
||||
FrontEndMenuManager.MessageScreen("FELD_WR", true);
|
||||
#endif
|
||||
}
|
||||
|
||||
b_FoundRecentSavedGameWantToLoad = false;
|
||||
@@ -677,6 +762,14 @@ void CGame::InitialiseWhenRestarting(void)
|
||||
|
||||
if ( FrontEndMenuManager.m_bWantToLoad == true )
|
||||
{
|
||||
#ifdef XBOX_MESSAGE_SCREEN
|
||||
FrontEndMenuManager.SetDialogTimer(1000);
|
||||
DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 0);
|
||||
CSprite2d::InitPerFrame();
|
||||
CFont::InitPerFrame();
|
||||
FrontEndMenuManager.DrawOverlays();
|
||||
DoRWStuffEndOfFrame();
|
||||
#endif
|
||||
RestoreForStartLoad();
|
||||
}
|
||||
|
||||
@@ -685,8 +778,7 @@ void CGame::InitialiseWhenRestarting(void)
|
||||
if ( FrontEndMenuManager.m_bWantToLoad == true )
|
||||
{
|
||||
FrontEndMenuManager.m_bWantToLoad = false;
|
||||
// TODO(Miami)
|
||||
//InitRadioStationPositionList();
|
||||
InitRadioStationPositionList();
|
||||
if ( GenericLoad() == true )
|
||||
{
|
||||
DMAudio.ResetTimers(CTimer::GetTimeInMilliseconds());
|
||||
@@ -710,6 +802,9 @@ void CGame::InitialiseWhenRestarting(void)
|
||||
currLevel = LEVEL_GENERIC;
|
||||
CCollision::SortOutCollisionAfterLoad();
|
||||
}
|
||||
#ifdef XBOX_MESSAGE_SCREEN
|
||||
FrontEndMenuManager.ProcessDialogTimer();
|
||||
#endif
|
||||
}
|
||||
|
||||
CTimer::Update();
|
||||
@@ -723,15 +818,17 @@ void CGame::InitialiseWhenRestarting(void)
|
||||
void CGame::Process(void)
|
||||
{
|
||||
CPad::UpdatePads();
|
||||
#ifdef GTA_PS2
|
||||
#ifdef USE_CUSTOM_ALLOCATOR
|
||||
ProcessTidyUpMemory();
|
||||
#endif
|
||||
#ifdef DEBUGMENU
|
||||
DebugMenuProcess();
|
||||
#endif
|
||||
CCutsceneMgr::Update();
|
||||
|
||||
if (!CCutsceneMgr::IsCutsceneProcessing() && !CTimer::GetIsCodePaused())
|
||||
FrontEndMenuManager.Process();
|
||||
|
||||
CTheZones::Update();
|
||||
// DRM call in here
|
||||
uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond();
|
||||
@@ -748,7 +845,11 @@ void CGame::Process(void)
|
||||
CPad::DoCheats();
|
||||
CClock::Update();
|
||||
CWeather::Update();
|
||||
|
||||
PUSH_MEMID(MEMID_SCRIPT);
|
||||
CTheScripts::Process();
|
||||
POP_MEMID();
|
||||
|
||||
CCollision::Update();
|
||||
CScriptPaths::Update();
|
||||
CTrain::UpdateTrains();
|
||||
@@ -758,7 +859,9 @@ void CGame::Process(void)
|
||||
CSkidmarks::Update();
|
||||
CAntennas::Update();
|
||||
CGlass::Update();
|
||||
#ifdef GTA_SCENE_EDIT
|
||||
CSceneEdit::Update();
|
||||
#endif
|
||||
CSetPieces::Update();
|
||||
CEventList::Update();
|
||||
CParticle::Update();
|
||||
@@ -780,7 +883,11 @@ void CGame::Process(void)
|
||||
CWaterCannons::Update();
|
||||
CUserDisplay::Process();
|
||||
CReplay::Update();
|
||||
|
||||
PUSH_MEMID(MEMID_WORLD);
|
||||
CWorld::Process();
|
||||
POP_MEMID();
|
||||
|
||||
gAccidentManager.Update();
|
||||
CPacManPickups::Update();
|
||||
CPickups::Update();
|
||||
@@ -802,13 +909,377 @@ void CGame::Process(void)
|
||||
gPhoneInfo.Update();
|
||||
if (!CReplay::IsPlayingBack())
|
||||
{
|
||||
PUSH_MEMID(MEMID_CARS);
|
||||
if (processTime < 2)
|
||||
CCarCtrl::GenerateRandomCars();
|
||||
CRoadBlocks::GenerateRoadBlocks();
|
||||
CCarCtrl::RemoveDistantCars();
|
||||
CCarCtrl::RemoveCarsIfThePoolGetsFull();
|
||||
POP_MEMID();
|
||||
}
|
||||
}
|
||||
#ifdef GTA_PS2
|
||||
CMemCheck::DoTest();
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef USE_CUSTOM_ALLOCATOR
|
||||
|
||||
// TODO(MIAMI)
|
||||
|
||||
int32 gNumMemMoved;
|
||||
|
||||
bool
|
||||
MoveMem(void** ptr)
|
||||
{
|
||||
if (*ptr) {
|
||||
gNumMemMoved++;
|
||||
void* newPtr = gMainHeap.MoveMemory(*ptr);
|
||||
if (*ptr != newPtr) {
|
||||
*ptr = newPtr;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Some convenience structs
|
||||
struct SkyDataPrefix
|
||||
{
|
||||
uint32 pktSize1;
|
||||
uint32 data; // pointer to data as read from TXD
|
||||
uint32 pktSize2;
|
||||
uint32 unused;
|
||||
};
|
||||
|
||||
struct DMAGIFUpload
|
||||
{
|
||||
uint32 tag1_qwc, tag1_addr; // dmaref
|
||||
uint32 nop1, vif_direct1;
|
||||
|
||||
uint32 giftag[4];
|
||||
uint32 gs_bitbltbuf[4];
|
||||
|
||||
uint32 tag2_qwc, tag2_addr; // dmaref
|
||||
uint32 nop2, vif_direct2;
|
||||
};
|
||||
|
||||
// This is very scary. it depends on the exact memory layout of the DMA chains and whatnot
|
||||
RwTexture*
|
||||
MoveTextureMemoryCB(RwTexture* texture, void* pData)
|
||||
{
|
||||
#ifdef GTA_PS2
|
||||
bool* pRet = (bool*)pData;
|
||||
RwRaster* raster = RwTextureGetRaster(texture);
|
||||
_SkyRasterExt* rasterExt = RASTEREXTFROMRASTER(raster);
|
||||
if (raster->originalPixels == nil || // the raw data
|
||||
raster->cpPixels == raster->originalPixels || // old format, can't handle it
|
||||
rasterExt->dmaRefCount != 0 && rasterExt->dmaClrCount != 0)
|
||||
return texture;
|
||||
|
||||
// this is the allocated pointer we will move
|
||||
SkyDataPrefix* prefix = (SkyDataPrefix*)raster->originalPixels;
|
||||
DMAGIFUpload* uploads = (DMAGIFUpload*)(prefix + 1);
|
||||
|
||||
// We have 4qw for each upload,
|
||||
// i.e. for each buffer width of mip levels,
|
||||
// and the palette if there is one.
|
||||
// NB: this code does NOT support mipmaps!
|
||||
// so we assume two uploads (pixels and palette)
|
||||
//
|
||||
// each upload looks like this:
|
||||
// (DMAcnt; NOP; VIF DIRECT(2))
|
||||
// giftag (1, A+D)
|
||||
// GS_BITBLTBUF
|
||||
// (DMAref->pixel data; NOP; VIF DIRECT(5))
|
||||
// the DMArefs are what we have to adjust
|
||||
uintptr dataDiff, upload1Diff, upload2Diff, pixelDiff, paletteDiff;
|
||||
dataDiff = prefix->data - (uintptr)raster->originalPixels;
|
||||
upload1Diff = uploads[0].tag2_addr - (uintptr)raster->originalPixels;
|
||||
if (raster->palette)
|
||||
upload2Diff = uploads[1].tag2_addr - (uintptr)raster->originalPixels;
|
||||
pixelDiff = (uintptr)raster->cpPixels - (uintptr)raster->originalPixels;
|
||||
if (raster->palette)
|
||||
paletteDiff = (uintptr)raster->palette - (uintptr)raster->originalPixels;
|
||||
uint8* newptr = (uint8*)gMainHeap.MoveMemory(raster->originalPixels);
|
||||
if (newptr != raster->originalPixels) {
|
||||
// adjust everything
|
||||
prefix->data = (uintptr)newptr + dataDiff;
|
||||
uploads[0].tag2_addr = (uintptr)newptr + upload1Diff;
|
||||
if (raster->palette)
|
||||
uploads[1].tag2_addr = (uintptr)newptr + upload2Diff;
|
||||
raster->originalPixels = newptr;
|
||||
raster->cpPixels = newptr + pixelDiff;
|
||||
if (raster->palette)
|
||||
raster->palette = newptr + paletteDiff;
|
||||
|
||||
if (pRet) {
|
||||
*pRet = true;
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
#else
|
||||
// nothing to do here really, everything should be in videomemory
|
||||
#endif
|
||||
return texture;
|
||||
}
|
||||
|
||||
bool
|
||||
MoveAtomicMemory(RpAtomic* atomic, bool onlyOne)
|
||||
{
|
||||
RpGeometry* geo = RpAtomicGetGeometry(atomic);
|
||||
|
||||
#if THIS_IS_COMPATIBLE_WITH_GTA3_RW31
|
||||
if (MoveMem((void**)&geo->triangles) && onlyOne)
|
||||
return true;
|
||||
if (MoveMem((void**)&geo->matList.materials) && onlyOne)
|
||||
return true;
|
||||
if (MoveMem((void**)&geo->preLitLum) && onlyOne)
|
||||
return true;
|
||||
if (MoveMem((void**)&geo->texCoords[0]) && onlyOne)
|
||||
return true;
|
||||
if (MoveMem((void**)&geo->texCoords[1]) && onlyOne)
|
||||
return true;
|
||||
|
||||
// verts and normals of morph target are allocated together
|
||||
int vertDiff;
|
||||
if (geo->morphTarget->normals)
|
||||
vertDiff = geo->morphTarget->normals - geo->morphTarget->verts;
|
||||
if (MoveMem((void**)&geo->morphTarget->verts)) {
|
||||
if (geo->morphTarget->normals)
|
||||
geo->morphTarget->normals = geo->morphTarget->verts + vertDiff;
|
||||
if (onlyOne)
|
||||
return true;
|
||||
}
|
||||
|
||||
RpMeshHeader* oldmesh = geo->mesh;
|
||||
if (MoveMem((void**)&geo->mesh)) {
|
||||
// index pointers are allocated together with meshes,
|
||||
// have to relocate those too
|
||||
RpMesh* mesh = (RpMesh*)(geo->mesh + 1);
|
||||
uintptr reloc = (uintptr)geo->mesh - (uintptr)oldmesh;
|
||||
for (int i = 0; i < geo->mesh->numMeshes; i++)
|
||||
mesh[i].indices = (RxVertexIndex*)((uintptr)mesh[i].indices + reloc);
|
||||
if (onlyOne)
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
// we could do something in librw here
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
MoveColModelMemory(CColModel& colModel, bool onlyOne)
|
||||
{
|
||||
#if GTA_VERSION >= GTA3_PS2_160
|
||||
// hm...should probably only do this if ownsCollisionVolumes
|
||||
// but it doesn't exist on PS2...
|
||||
if (!colModel.ownsCollisionVolumes)
|
||||
return false;
|
||||
#endif
|
||||
|
||||
if (MoveMem((void**)&colModel.spheres) && onlyOne)
|
||||
return true;
|
||||
if (MoveMem((void**)&colModel.lines) && onlyOne)
|
||||
return true;
|
||||
if (MoveMem((void**)&colModel.boxes) && onlyOne)
|
||||
return true;
|
||||
if (MoveMem((void**)&colModel.vertices) && onlyOne)
|
||||
return true;
|
||||
if (MoveMem((void**)&colModel.triangles) && onlyOne)
|
||||
return true;
|
||||
if (MoveMem((void**)&colModel.trianglePlanes) && onlyOne)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
RpAtomic*
|
||||
MoveAtomicMemoryCB(RpAtomic* atomic, void* pData)
|
||||
{
|
||||
bool* pRet = (bool*)pData;
|
||||
if (pRet == nil)
|
||||
MoveAtomicMemory(atomic, false);
|
||||
else if (MoveAtomicMemory(atomic, true)) {
|
||||
*pRet = true;
|
||||
return nil;
|
||||
}
|
||||
return atomic;
|
||||
}
|
||||
|
||||
bool
|
||||
TidyUpModelInfo(CBaseModelInfo* modelInfo, bool onlyone)
|
||||
{
|
||||
if (modelInfo->GetColModel() && modelInfo->DoesOwnColModel())
|
||||
if (MoveColModelMemory(*modelInfo->GetColModel(), onlyone))
|
||||
return true;
|
||||
|
||||
RwObject* rwobj = modelInfo->GetRwObject();
|
||||
if (RwObjectGetType(rwobj) == rpATOMIC)
|
||||
if (MoveAtomicMemory((RpAtomic*)rwobj, onlyone))
|
||||
return true;
|
||||
if (RwObjectGetType(rwobj) == rpCLUMP) {
|
||||
bool ret = false;
|
||||
if (onlyone)
|
||||
RpClumpForAllAtomics((RpClump*)rwobj, MoveAtomicMemoryCB, &ret);
|
||||
else
|
||||
RpClumpForAllAtomics((RpClump*)rwobj, MoveAtomicMemoryCB, nil);
|
||||
if (ret)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (modelInfo->GetModelType() == MITYPE_PED && ((CPedModelInfo*)modelInfo)->m_hitColModel)
|
||||
if (MoveColModelMemory(*((CPedModelInfo*)modelInfo)->m_hitColModel, onlyone))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void CGame::DrasticTidyUpMemory(bool flushDraw)
|
||||
{
|
||||
#ifdef USE_CUSTOM_ALLOCATOR
|
||||
bool removedCol = false;
|
||||
|
||||
TidyUpMemory(true, flushDraw);
|
||||
|
||||
if (gMainHeap.GetLargestFreeBlock() < 200000 && !playingIntro) {
|
||||
CStreaming::RemoveIslandsNotUsed(LEVEL_INDUSTRIAL);
|
||||
CStreaming::RemoveIslandsNotUsed(LEVEL_COMMERCIAL);
|
||||
CStreaming::RemoveIslandsNotUsed(LEVEL_SUBURBAN);
|
||||
TidyUpMemory(true, flushDraw);
|
||||
}
|
||||
|
||||
if (gMainHeap.GetLargestFreeBlock() < 200000 && !playingIntro) {
|
||||
CModelInfo::RemoveColModelsFromOtherLevels(LEVEL_GENERIC);
|
||||
TidyUpMemory(true, flushDraw);
|
||||
removedCol = true;
|
||||
}
|
||||
|
||||
if (gMainHeap.GetLargestFreeBlock() < 200000 && !playingIntro) {
|
||||
CStreaming::RemoveBigBuildings(LEVEL_INDUSTRIAL);
|
||||
CStreaming::RemoveBigBuildings(LEVEL_COMMERCIAL);
|
||||
CStreaming::RemoveBigBuildings(LEVEL_SUBURBAN);
|
||||
TidyUpMemory(true, flushDraw);
|
||||
}
|
||||
|
||||
if (removedCol) {
|
||||
// different on PS2
|
||||
CFileLoader::LoadCollisionFromDatFile(CCollision::ms_collisionInMemory);
|
||||
}
|
||||
|
||||
if (!playingIntro)
|
||||
CStreaming::RequestBigBuildings(currLevel);
|
||||
|
||||
CStreaming::LoadAllRequestedModels(true);
|
||||
#endif
|
||||
}
|
||||
|
||||
void CGame::TidyUpMemory(bool moveTextures, bool flushDraw)
|
||||
{
|
||||
#ifdef USE_CUSTOM_ALLOCATOR
|
||||
printf("Largest free block before tidy %d\n", gMainHeap.GetLargestFreeBlock());
|
||||
|
||||
if (moveTextures) {
|
||||
if (flushDraw) {
|
||||
#ifdef GTA_PS2
|
||||
for (int i = 0; i < sweMaxFlips + 1; i++) {
|
||||
#else
|
||||
for (int i = 0; i < 5; i++) { // probably more than needed
|
||||
#endif
|
||||
RwCameraBeginUpdate(Scene.camera);
|
||||
RwCameraEndUpdate(Scene.camera);
|
||||
RwCameraShowRaster(Scene.camera, nil, 0);
|
||||
}
|
||||
}
|
||||
int fontSlot = CTxdStore::FindTxdSlot("fonts");
|
||||
|
||||
for (int i = 0; i < TXDSTORESIZE; i++) {
|
||||
if (i == fontSlot ||
|
||||
CTxdStore::GetSlot(i) == nil)
|
||||
continue;
|
||||
RwTexDictionary* txd = CTxdStore::GetSlot(i)->texDict;
|
||||
if (txd)
|
||||
RwTexDictionaryForAllTextures(txd, MoveTextureMemoryCB, nil);
|
||||
}
|
||||
}
|
||||
|
||||
// animations
|
||||
for (int i = 0; i < NUMANIMATIONS; i++) {
|
||||
CAnimBlendHierarchy* anim = CAnimManager::GetAnimation(i);
|
||||
if (anim == nil)
|
||||
continue; // cannot happen
|
||||
anim->MoveMemory();
|
||||
}
|
||||
|
||||
// model info
|
||||
for (int i = 0; i < MODELINFOSIZE; i++) {
|
||||
CBaseModelInfo* mi = CModelInfo::GetModelInfo(i);
|
||||
if (mi == nil)
|
||||
continue;
|
||||
TidyUpModelInfo(mi, false);
|
||||
}
|
||||
|
||||
printf("Largest free block after tidy %d\n", gMainHeap.GetLargestFreeBlock());
|
||||
#endif
|
||||
}
|
||||
|
||||
void CGame::ProcessTidyUpMemory(void)
|
||||
{
|
||||
#ifdef USE_CUSTOM_ALLOCATOR
|
||||
static int32 modelIndex = 0;
|
||||
static int32 animIndex = 0;
|
||||
static int32 txdIndex = 0;
|
||||
bool txdReturn = false;
|
||||
RwTexDictionary* txd = nil;
|
||||
gNumMemMoved = 0;
|
||||
|
||||
// model infos
|
||||
for (int numCleanedUp = 0; numCleanedUp < 10; numCleanedUp++) {
|
||||
CBaseModelInfo* mi;
|
||||
do {
|
||||
mi = CModelInfo::GetModelInfo(modelIndex);
|
||||
modelIndex++;
|
||||
if (modelIndex >= MODELINFOSIZE)
|
||||
modelIndex = 0;
|
||||
} while (mi == nil);
|
||||
|
||||
if (TidyUpModelInfo(mi, true))
|
||||
return;
|
||||
}
|
||||
|
||||
// tex dicts
|
||||
for (int numCleanedUp = 0; numCleanedUp < 3; numCleanedUp++) {
|
||||
if (gNumMemMoved > 80)
|
||||
break;
|
||||
|
||||
do {
|
||||
#ifdef FIX_BUGS
|
||||
txd = nil;
|
||||
#endif
|
||||
if (CTxdStore::GetSlot(txdIndex))
|
||||
txd = CTxdStore::GetSlot(txdIndex)->texDict;
|
||||
txdIndex++;
|
||||
if (txdIndex >= TXDSTORESIZE)
|
||||
txdIndex = 0;
|
||||
} while (txd == nil);
|
||||
|
||||
RwTexDictionaryForAllTextures(txd, MoveTextureMemoryCB, &txdReturn);
|
||||
if (txdReturn)
|
||||
return;
|
||||
}
|
||||
|
||||
// animations
|
||||
CAnimBlendHierarchy* anim;
|
||||
do {
|
||||
anim = CAnimManager::GetAnimation(animIndex);
|
||||
animIndex++;
|
||||
if (animIndex >= NUMANIMATIONS)
|
||||
animIndex = 0;
|
||||
} while (anim == nil); // always != nil
|
||||
anim->MoveMemory(true);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
@@ -831,33 +1302,6 @@ CGame::CanSeeWaterFromCurrArea(void)
|
||||
bool
|
||||
CGame::CanSeeOutSideFromCurrArea(void)
|
||||
{
|
||||
return currArea == AREA_MAIN_MAP || currArea == AREA_MALL ||
|
||||
return currArea == AREA_MAIN_MAP || currArea == AREA_MALL ||
|
||||
currArea == AREA_MANSION || currArea == AREA_HOTEL;
|
||||
}
|
||||
|
||||
void CGame::DrasticTidyUpMemory(bool)
|
||||
{
|
||||
#ifdef USE_TEXTURE_POOL
|
||||
// TODO
|
||||
#endif
|
||||
#ifdef PS2
|
||||
// meow
|
||||
#endif
|
||||
}
|
||||
|
||||
void CGame::TidyUpMemory(bool unk1, bool unk2)
|
||||
{
|
||||
#ifdef PS2
|
||||
// meow
|
||||
#endif
|
||||
if (unk2) {
|
||||
DrasticTidyUpMemory(true); // parameter is unknown too
|
||||
}
|
||||
}
|
||||
|
||||
void CGame::ProcessTidyUpMemory(void)
|
||||
{
|
||||
#ifdef PS2
|
||||
// meow
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -123,6 +123,15 @@ public:
|
||||
return *str2 != '\0';
|
||||
}
|
||||
|
||||
static bool faststrncmp(const char *str1, const char *str2, uint32 count)
|
||||
{
|
||||
for(uint32 i = 0; *str1 && i < count; str1++, str2++, i++) {
|
||||
if (*str1 != *str2)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool faststricmp(const char *str1, const char *str2)
|
||||
{
|
||||
for (; *str1; str1++, str2++) {
|
||||
|
||||
+18
-57
@@ -2,44 +2,10 @@
|
||||
#include "Frontend.h"
|
||||
#ifdef PC_MENU
|
||||
|
||||
#ifdef CUTSCENE_BORDERS_SWITCH
|
||||
#define MENU_CUTSCENE_BORDERS_SWITCH(screen) MENUACTION_CUTSCENEBORDERS, "FEM_CSB", SAVESLOT_NONE, screen,
|
||||
#else
|
||||
#define MENU_CUTSCENE_BORDERS_SWITCH(screen)
|
||||
#endif
|
||||
|
||||
#ifdef IMPROVED_VIDEOMODE
|
||||
#define MENU_IMPROVED_VIDEOMODE(screen) MENUACTION_SCREENFORMAT, "FEM_SCF", SAVESLOT_NONE, screen,
|
||||
#else
|
||||
#define MENU_IMPROVED_VIDEOMODE(screen)
|
||||
#endif
|
||||
|
||||
#ifdef ANISOTROPIC_FILTERING
|
||||
#define MENU_MIPMAPS(screen) MENUACTION_MIPMAPS, "FED_MIP", SAVESLOT_NONE, screen,
|
||||
#define MENU_TEXTURE_FILTERING(screen) MENUACTION_TEXTURE_FILTERING, "FED_FIL", SAVESLOT_NONE, screen,
|
||||
#else
|
||||
#define MENU_MIPMAPS(screen)
|
||||
#define MENU_TEXTURE_FILTERING(screen)
|
||||
#endif
|
||||
|
||||
#ifdef MULTISAMPLING
|
||||
#define MENU_MULTISAMPLING(screen) MENUACTION_MULTISAMPLING, "FED_AAS", SAVESLOT_NONE, screen,
|
||||
#else
|
||||
#define MENU_MULTISAMPLING(screen)
|
||||
#endif
|
||||
|
||||
#ifdef NO_ISLAND_LOADING
|
||||
#define MENU_ISLAND_LOADING(screen) MENUACTION_ISLANDLOADING, "FEM_ISL", SAVESLOT_NONE, screen,
|
||||
#else
|
||||
#define MENU_ISLAND_LOADING(screen)
|
||||
#endif
|
||||
|
||||
#ifdef PS2_ALPHA_TEST
|
||||
#define MENU_PS2_ALPHA_TEST(screen) MENUACTION_PS2_ALPHA_TEST, "FEM_2PR", SAVESLOT_NONE, screen,
|
||||
#else
|
||||
#define MENU_PS2_ALPHA_TEST(screen)
|
||||
#endif
|
||||
// Please don't touch this file, except for bug fixing or ports.
|
||||
// Check MenuScreensCustom.cpp
|
||||
|
||||
#ifndef CUSTOM_FRONTEND_OPTIONS
|
||||
CMenuScreen aScreens[] = {
|
||||
// MENUPAGE_STATS = 0
|
||||
{ "FEH_STA", MENUPAGE_NONE, 3,
|
||||
@@ -72,7 +38,7 @@ CMenuScreen aScreens[] = {
|
||||
MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, 0, 0, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_GRAPHICS_SETTINGS = 4
|
||||
// MENUPAGE_DISPLAY_SETTINGS = 4
|
||||
#ifdef LEGACY_MENU_OPTIONS
|
||||
#define Y_OFFSET 50
|
||||
#else
|
||||
@@ -95,14 +61,8 @@ CMenuScreen aScreens[] = {
|
||||
MENUACTION_RADARMODE, "FED_RDR", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, 40, 228 + Y_OFFSET, MENUALIGN_LEFT,
|
||||
MENUACTION_HUD, "FED_HUD", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, 40, 253 + Y_OFFSET, MENUALIGN_LEFT,
|
||||
MENUACTION_SCREENRES, "FED_RES", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, 40, 278 + Y_OFFSET, MENUALIGN_LEFT,
|
||||
#ifdef IMPROVED_VIDEOMODE
|
||||
MENUACTION_SCREENFORMAT,"FED_POS", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, 40, 303 + Y_OFFSET, MENUALIGN_LEFT,
|
||||
MENUACTION_RESTOREDEF, "FET_DEF", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, 320, 328 + Y_OFFSET, MENUALIGN_CENTER,
|
||||
MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, 320, 353 + Y_OFFSET, MENUALIGN_CENTER,
|
||||
#else
|
||||
MENUACTION_RESTOREDEF, "FET_DEF", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, 320, 303 + Y_OFFSET, MENUALIGN_CENTER,
|
||||
MENUACTION_RESTOREDEF, "FET_DEF", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, 320, 303 + Y_OFFSET, MENUALIGN_CENTER,
|
||||
MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, 320, 328 + Y_OFFSET, MENUALIGN_CENTER,
|
||||
#endif
|
||||
},
|
||||
|
||||
#undef Y_OFFSET
|
||||
@@ -255,7 +215,9 @@ CMenuScreen aScreens[] = {
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC = 26
|
||||
{ "FET_CTL", MENUPAGE_OPTIONS, 0,
|
||||
#ifdef PC_PLAYER_CONTROLS
|
||||
MENUACTION_CTRLMETHOD, "FET_STI", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC, 320, 150, MENUALIGN_CENTER,
|
||||
#endif
|
||||
MENUACTION_KEYBOARDCTRLS,"FEC_RED", SAVESLOT_NONE, MENUPAGE_KEYBOARD_CONTROLS, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_CHANGEMENU, "FEC_MOU", SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_RESTOREDEF, "FET_DEF", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC, 0, 0, MENUALIGN_CENTER,
|
||||
@@ -286,10 +248,8 @@ CMenuScreen aScreens[] = {
|
||||
MENUACTION_CHANGEMENU, "FEP_QUI", SAVESLOT_NONE, MENUPAGE_EXIT, 0, 0, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// TODO(Miami)
|
||||
// MENUPAGE_KEYBOARD_CONTROLS = 30
|
||||
{ "FET_STI", MENUPAGE_CONTROLLER_PC, 1,
|
||||
MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_MOUSE_CONTROLS = 31
|
||||
@@ -314,18 +274,15 @@ CMenuScreen aScreens[] = {
|
||||
// MENUPAGE_NONE = 33
|
||||
{ "", 0, 0, },
|
||||
|
||||
// MENUPAGE_OUTRO = 34
|
||||
{ "", 0, 0, },
|
||||
|
||||
#ifdef LEGACY_MENU_OPTIONS
|
||||
// MENUPAGE_CONTROLLER_SETTINGS = 4
|
||||
// MENUPAGE_CONTROLLER_SETTINGS
|
||||
{ "FET_CON", MENUPAGE_OPTIONS, 0,
|
||||
MENUACTION_CTRLCONFIG, "FEC_CCF", SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS, 0, 0, 0,
|
||||
MENUACTION_CTRLVIBRATION, "FEC_VIB", SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS, 0, 0, 0,
|
||||
MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_DEBUG_MENU = 18
|
||||
// MENUPAGE_DEBUG_MENU
|
||||
{ "FED_DBG", MENUPAGE_NONE, 0,
|
||||
MENUACTION_RELOADIDE, "FED_RID", SAVESLOT_NONE, MENUPAGE_NONE, 0, 0, 0,
|
||||
MENUACTION_SETDBGFLAG, "FED_DFL", SAVESLOT_NONE, MENUPAGE_NONE, 0, 0, 0,
|
||||
@@ -334,7 +291,7 @@ CMenuScreen aScreens[] = {
|
||||
MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC_OLD1 = 36
|
||||
// MENUPAGE_CONTROLLER_PC_OLD1
|
||||
{ "FET_CTL", MENUPAGE_CONTROLLER_PC, 0,
|
||||
MENUACTION_GETKEY, "FEC_PLB", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_CWL", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1, 0, 0, 0,
|
||||
@@ -348,12 +305,12 @@ CMenuScreen aScreens[] = {
|
||||
MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC_OLD2 = 37
|
||||
// MENUPAGE_CONTROLLER_PC_OLD2
|
||||
{ "FET_CTL", MENUPAGE_CONTROLLER_PC, 1,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC_OLD3 = 38
|
||||
// MENUPAGE_CONTROLLER_PC_OLD3
|
||||
{ "FET_CTL", MENUPAGE_CONTROLLER_PC, 2,
|
||||
MENUACTION_GETKEY, "FEC_LUP", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_LDN", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3, 0, 0, 0,
|
||||
@@ -362,12 +319,12 @@ CMenuScreen aScreens[] = {
|
||||
MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC_OLD4 = 39
|
||||
// MENUPAGE_CONTROLLER_PC_OLD4
|
||||
{ "FET_CTL", MENUPAGE_CONTROLLER_PC, 3,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_DEBUG = 40
|
||||
// MENUPAGE_CONTROLLER_DEBUG
|
||||
{ "FEC_DBG", MENUPAGE_CONTROLLER_PC, 3,
|
||||
MENUACTION_GETKEY, "FEC_TGD", SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_TDO", SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG, 0, 0, 0,
|
||||
@@ -376,6 +333,10 @@ CMenuScreen aScreens[] = {
|
||||
MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, 0, 0, 0,
|
||||
},
|
||||
#endif
|
||||
|
||||
// MENUPAGE_OUTRO - Originally 34
|
||||
{ "", 0, 0, },
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,716 @@
|
||||
#include "common.h"
|
||||
#include "platform.h"
|
||||
#include "crossplatform.h"
|
||||
#include "Renderer.h"
|
||||
#include "Frontend.h"
|
||||
#include "Font.h"
|
||||
#include "Camera.h"
|
||||
#include "main.h"
|
||||
#include "MBlur.h"
|
||||
#include "postfx.h"
|
||||
#include "custompipes.h"
|
||||
#include "RwHelper.h"
|
||||
#include "Text.h"
|
||||
#include "Streaming.h"
|
||||
#include "FileLoader.h"
|
||||
#include "Collision.h"
|
||||
#include "ModelInfo.h"
|
||||
#include "Pad.h"
|
||||
|
||||
// Menu screens array is at the bottom of the file.
|
||||
|
||||
#ifdef PC_MENU
|
||||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
|
||||
#ifdef IMPROVED_VIDEOMODE
|
||||
#define VIDEOMODE_SELECTOR MENUACTION_CFO_SELECT, "FEM_SCF", { new CCFOSelect((int8*)&FrontEndMenuManager.m_nPrefsWindowed, nil, screenModes, 2, true, ScreenModeAfterChange) }, 0, 0, MENUALIGN_LEFT,
|
||||
#else
|
||||
#define VIDEOMODE_SELECTOR
|
||||
#endif
|
||||
|
||||
#ifdef MULTISAMPLING
|
||||
#define MULTISAMPLING_SELECTOR MENUACTION_CFO_DYNAMIC, "FED_AAS", { new CCFODynamic((int8*)&FrontEndMenuManager.m_nPrefsMSAALevel, "MultiSampling", MultiSamplingDraw, MultiSamplingButtonPress) }, 0, 0, MENUALIGN_LEFT,
|
||||
#else
|
||||
#define MULTISAMPLING_SELECTOR
|
||||
#endif
|
||||
|
||||
#ifdef CUTSCENE_BORDERS_SWITCH
|
||||
#define CUTSCENE_BORDERS_TOGGLE MENUACTION_CFO_SELECT, "FEM_CSB", { new CCFOSelect((int8 *)&FrontEndMenuManager.m_PrefsCutsceneBorders, "CutsceneBorders", off_on, 2, false, nil) }, 0, 0, MENUALIGN_LEFT,
|
||||
#else
|
||||
#define CUTSCENE_BORDERS_TOGGLE
|
||||
#endif
|
||||
|
||||
#ifdef FREE_CAM
|
||||
#define FREE_CAM_TOGGLE MENUACTION_CFO_SELECT, "FEC_FRC", { new CCFOSelect((int8*)&TheCamera.bFreeCam, "FreeCam", off_on, 2, false, nil) }, 0, 0, MENUALIGN_LEFT,
|
||||
#else
|
||||
#define FREE_CAM_TOGGLE
|
||||
#endif
|
||||
|
||||
#ifdef PS2_ALPHA_TEST
|
||||
#define DUALPASS_SELECTOR MENUACTION_CFO_SELECT, "FEM_2PR", { new CCFOSelect((int8*)&gPS2alphaTest, "PS2AlphaTest", off_on, 2, false, nil) }, 0, 0, MENUALIGN_LEFT,
|
||||
#else
|
||||
#define DUALPASS_SELECTOR
|
||||
#endif
|
||||
|
||||
#ifdef NO_ISLAND_LOADING
|
||||
#define ISLAND_LOADING_SELECTOR MENUACTION_CFO_SELECT, "FEM_ISL", { new CCFOSelect((int8*)&FrontEndMenuManager.m_PrefsIslandLoading, "IslandLoading", islandLoadingOpts, ARRAY_SIZE(islandLoadingOpts), true, IslandLoadingAfterChange) }, 0, 0, MENUALIGN_LEFT,
|
||||
#else
|
||||
#define ISLAND_LOADING_SELECTOR
|
||||
#endif
|
||||
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
#define POSTFX_SELECTORS \
|
||||
MENUACTION_CFO_SELECT, "FED_CLF", { new CCFOSelect((int8*)&CPostFX::EffectSwitch, "ColourFilter", filterNames, ARRAY_SIZE(filterNames), false, nil) }, 0, 0, MENUALIGN_LEFT, \
|
||||
MENUACTION_CFO_SELECT, "FED_MBL", { new CCFOSelect((int8*)&CPostFX::MotionBlurOn, "MotionBlur", off_on, 2, false, nil) }, 0, 0, MENUALIGN_LEFT,
|
||||
#else
|
||||
#define POSTFX_SELECTORS
|
||||
#endif
|
||||
|
||||
#ifdef INVERT_LOOK_FOR_PAD
|
||||
#define INVERT_PAD_SELECTOR MENUACTION_CFO_SELECT, "FEC_ILU", { new CCFOSelect((int8*)&CPad::bInvertLook4Pad, nil, off_on, 2, false, nil) }, 150, 0, MENUALIGN_LEFT,
|
||||
#else
|
||||
#define INVERT_PAD_SELECTOR
|
||||
#endif
|
||||
|
||||
const char *filterNames[] = { "FEM_NON", "FEM_SIM", "FEM_NRM", "FEM_MOB" };
|
||||
const char *off_on[] = { "FEM_OFF", "FEM_ON" };
|
||||
|
||||
void RestoreDefGraphics(int8 action) {
|
||||
if (action != FEOPTION_ACTION_SELECT)
|
||||
return;
|
||||
|
||||
#ifdef PS2_ALPHA_TEST
|
||||
gPS2alphaTest = false;
|
||||
#endif
|
||||
#ifdef MULTISAMPLING
|
||||
FrontEndMenuManager.m_nPrefsMSAALevel = FrontEndMenuManager.m_nDisplayMSAALevel = 0;
|
||||
#endif
|
||||
#ifdef NO_ISLAND_LOADING
|
||||
if (!FrontEndMenuManager.m_bGameNotLoaded) {
|
||||
FrontEndMenuManager.m_PrefsIslandLoading = FrontEndMenuManager.ISLAND_LOADING_LOW;
|
||||
CStreaming::RemoveUnusedBigBuildings(CGame::currLevel);
|
||||
CStreaming::RemoveUnusedBuildings(CGame::currLevel);
|
||||
CStreaming::RequestIslands(CGame::currLevel);
|
||||
CStreaming::LoadAllRequestedModels(true);
|
||||
} else
|
||||
FrontEndMenuManager.m_PrefsIslandLoading = FrontEndMenuManager.ISLAND_LOADING_LOW;
|
||||
#endif
|
||||
#ifdef GRAPHICS_MENU_OPTIONS // otherwise Frontend will handle those
|
||||
FrontEndMenuManager.m_PrefsFrameLimiter = true;
|
||||
FrontEndMenuManager.m_PrefsVsyncDisp = true;
|
||||
#ifdef LEGACY_MENU_OPTIONS
|
||||
FrontEndMenuManager.m_PrefsVsync = true;
|
||||
#endif
|
||||
FrontEndMenuManager.m_PrefsUseWideScreen = false;
|
||||
FrontEndMenuManager.m_nDisplayVideoMode = FrontEndMenuManager.m_nPrefsVideoMode;
|
||||
CMBlur::BlurOn = false;
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
#endif
|
||||
}
|
||||
|
||||
void RestoreDefDisplay(int8 action) {
|
||||
if (action != FEOPTION_ACTION_SELECT)
|
||||
return;
|
||||
|
||||
#ifdef CUTSCENE_BORDERS_SWITCH
|
||||
FrontEndMenuManager.m_PrefsCutsceneBorders = true;
|
||||
#endif
|
||||
#ifdef FREE_CAM
|
||||
TheCamera.bFreeCam = false;
|
||||
#endif
|
||||
#ifdef GRAPHICS_MENU_OPTIONS // otherwise Frontend will handle those
|
||||
FrontEndMenuManager.m_PrefsBrightness = 256;
|
||||
FrontEndMenuManager.m_PrefsLOD = 1.2f;
|
||||
CRenderer::ms_lodDistScale = 1.2f;
|
||||
FrontEndMenuManager.m_PrefsShowSubtitles = false;
|
||||
FrontEndMenuManager.m_PrefsShowLegends = true;
|
||||
FrontEndMenuManager.m_PrefsRadarMode = 0;
|
||||
FrontEndMenuManager.m_PrefsShowHud = true;
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef NO_ISLAND_LOADING
|
||||
const char *islandLoadingOpts[] = { "FEM_LOW", "FEM_MED", "FEM_HIG" };
|
||||
void IslandLoadingAfterChange(int8 before, int8 after) {
|
||||
if (!FrontEndMenuManager.m_bGameNotLoaded) {
|
||||
if (after > FrontEndMenuManager.ISLAND_LOADING_LOW) {
|
||||
FrontEndMenuManager.m_PrefsIslandLoading = before; // calls below needs previous mode :shrug:
|
||||
|
||||
if (after == FrontEndMenuManager.ISLAND_LOADING_HIGH) {
|
||||
CStreaming::RemoveIslandsNotUsed(LEVEL_BEACH);
|
||||
CStreaming::RemoveIslandsNotUsed(LEVEL_MAINLAND);
|
||||
}
|
||||
if (before == FrontEndMenuManager.ISLAND_LOADING_LOW) {
|
||||
FrontEndMenuManager.m_PrefsIslandLoading = after;
|
||||
CStreaming::RequestBigBuildings(CGame::currLevel);
|
||||
|
||||
} else if (before == FrontEndMenuManager.ISLAND_LOADING_HIGH) {
|
||||
FrontEndMenuManager.m_PrefsIslandLoading = after;
|
||||
CStreaming::RequestIslands(CGame::currLevel);
|
||||
} else
|
||||
FrontEndMenuManager.m_PrefsIslandLoading = after;
|
||||
|
||||
} else { // low
|
||||
CStreaming::RemoveUnusedBigBuildings(CGame::currLevel);
|
||||
CStreaming::RemoveUnusedBuildings(CGame::currLevel);
|
||||
CStreaming::RequestIslands(CGame::currLevel);
|
||||
}
|
||||
|
||||
CStreaming::LoadAllRequestedModels(true);
|
||||
}
|
||||
|
||||
FrontEndMenuManager.SetHelperText(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MORE_LANGUAGES
|
||||
void LangPolSelect(int8 action)
|
||||
{
|
||||
if (action == FEOPTION_ACTION_SELECT) {
|
||||
FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_POLISH;
|
||||
FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true;
|
||||
FrontEndMenuManager.InitialiseChangedLanguageSettings();
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
}
|
||||
|
||||
void LangRusSelect(int8 action)
|
||||
{
|
||||
if (action == FEOPTION_ACTION_SELECT) {
|
||||
FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_RUSSIAN;
|
||||
FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true;
|
||||
FrontEndMenuManager.InitialiseChangedLanguageSettings();
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
}
|
||||
|
||||
void LangJapSelect(int8 action)
|
||||
{
|
||||
if (action == FEOPTION_ACTION_SELECT) {
|
||||
FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_JAPANESE;
|
||||
FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true;
|
||||
FrontEndMenuManager.InitialiseChangedLanguageSettings();
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef MULTISAMPLING
|
||||
void GraphicsGoBack() {
|
||||
}
|
||||
#else
|
||||
void GraphicsGoBack() {
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = FrontEndMenuManager.m_nPrefsMSAALevel;
|
||||
}
|
||||
|
||||
void MultiSamplingButtonPress(int8 action) {
|
||||
if (action == FEOPTION_ACTION_SELECT) {
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel != FrontEndMenuManager.m_nPrefsMSAALevel) {
|
||||
FrontEndMenuManager.m_nPrefsMSAALevel = FrontEndMenuManager.m_nDisplayMSAALevel;
|
||||
_psSelectScreenVM(FrontEndMenuManager.m_nPrefsVideoMode);
|
||||
FrontEndMenuManager.SetHelperText(0);
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
} else if (action == FEOPTION_ACTION_LEFT || action == FEOPTION_ACTION_RIGHT) {
|
||||
if (FrontEndMenuManager.m_bGameNotLoaded) {
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel += (action == FEOPTION_ACTION_RIGHT ? 1 : -1);
|
||||
|
||||
int i = 0;
|
||||
int maxAA = RwD3D8EngineGetMaxMultiSamplingLevels();
|
||||
while (maxAA != 1) {
|
||||
i++;
|
||||
maxAA >>= 1;
|
||||
}
|
||||
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel < 0)
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = i;
|
||||
else if (FrontEndMenuManager.m_nDisplayMSAALevel > i)
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = 0;
|
||||
}
|
||||
} else if (action == FEOPTION_ACTION_FOCUSLOSS) {
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel != FrontEndMenuManager.m_nPrefsMSAALevel) {
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = FrontEndMenuManager.m_nPrefsMSAALevel;
|
||||
FrontEndMenuManager.SetHelperText(3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wchar* MultiSamplingDraw(bool *disabled, bool userHovering) {
|
||||
static wchar unicodeTemp[64];
|
||||
if (userHovering) {
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel == FrontEndMenuManager.m_nPrefsMSAALevel) {
|
||||
if (FrontEndMenuManager.m_nHelperTextMsgId == 1) // Press enter to apply
|
||||
FrontEndMenuManager.ResetHelperText();
|
||||
} else {
|
||||
FrontEndMenuManager.SetHelperText(1);
|
||||
}
|
||||
} else {
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel != FrontEndMenuManager.m_nPrefsMSAALevel) {
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = FrontEndMenuManager.m_nPrefsMSAALevel;
|
||||
}
|
||||
}
|
||||
|
||||
if (!FrontEndMenuManager.m_bGameNotLoaded)
|
||||
*disabled = true;
|
||||
|
||||
switch (FrontEndMenuManager.m_nDisplayMSAALevel) {
|
||||
case 0:
|
||||
return TheText.Get("FEM_OFF");
|
||||
default:
|
||||
sprintf(gString, "%iX", 1 << (FrontEndMenuManager.m_nDisplayMSAALevel));
|
||||
AsciiToUnicode(gString, unicodeTemp);
|
||||
return unicodeTemp;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef IMPROVED_VIDEOMODE
|
||||
const char* screenModes[] = { "FED_FLS", "FED_WND" };
|
||||
void ScreenModeAfterChange(int8 before, int8 after)
|
||||
{
|
||||
_psSelectScreenVM(FrontEndMenuManager.m_nPrefsVideoMode); // apply same resolution
|
||||
FrontEndMenuManager.SetHelperText(0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||
wchar selectedJoystickUnicode[128];
|
||||
|
||||
wchar* DetectJoystickDraw(bool* disabled, bool userHovering) {
|
||||
int numButtons;
|
||||
int found = -1;
|
||||
const char *joyname;
|
||||
if (userHovering) {
|
||||
for (int i = 0; i <= GLFW_JOYSTICK_LAST; i++) {
|
||||
if ((joyname = glfwGetJoystickName(i))) {
|
||||
const uint8* buttons = glfwGetJoystickButtons(i, &numButtons);
|
||||
for (int j = 0; j < numButtons; j++) {
|
||||
if (buttons[j]) {
|
||||
found = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found != -1)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found != -1 && PSGLOBAL(joy1id) != found) {
|
||||
if (PSGLOBAL(joy1id) != -1 && PSGLOBAL(joy1id) != found)
|
||||
PSGLOBAL(joy2id) = PSGLOBAL(joy1id);
|
||||
else
|
||||
PSGLOBAL(joy2id) = -1;
|
||||
|
||||
strcpy(gSelectedJoystickName, joyname);
|
||||
PSGLOBAL(joy1id) = found;
|
||||
}
|
||||
}
|
||||
if (PSGLOBAL(joy1id) == -1)
|
||||
AsciiToUnicode("Not found", selectedJoystickUnicode);
|
||||
else
|
||||
AsciiToUnicode(gSelectedJoystickName, selectedJoystickUnicode);
|
||||
|
||||
return selectedJoystickUnicode;
|
||||
}
|
||||
#endif
|
||||
|
||||
CMenuScreenCustom aScreens[] = {
|
||||
// MENUPAGE_STATS = 0
|
||||
{ "FEH_STA", MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 190, 320, MENUALIGN_RIGHT,
|
||||
},
|
||||
|
||||
// MENUPAGE_NEW_GAME = 1
|
||||
{ "FEP_STG", MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FES_NGA", {nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME_RELOAD}, 320, 155, MENUALIGN_CENTER,
|
||||
MENUACTION_CHANGEMENU, "FES_LOA", {nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_LOAD_SLOT}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_CHANGEMENU, "FES_DEL", {nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_DELETE_SLOT}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, 0}, 0, 0, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_BRIEFS = 2
|
||||
{ "FEH_BRI", MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 190, 320, MENUALIGN_RIGHT,
|
||||
},
|
||||
|
||||
// MENUPAGE_SOUND_SETTINGS = 3
|
||||
{ "FEH_AUD", MENUPAGE_OPTIONS, nil, nil,
|
||||
MENUACTION_MUSICVOLUME, "FEA_MUS", {nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS}, 40, 76, MENUALIGN_LEFT,
|
||||
MENUACTION_SFXVOLUME, "FEA_SFX", {nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_MP3VOLUMEBOOST, "FEA_MPB", {nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_AUDIOHW, "FEA_3DH", {nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_SPEAKERCONF, "FEA_SPK", {nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_DYNAMICACOUSTIC, "FET_DAM", {nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_RADIO, "FEA_RSS", {nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_RESTOREDEF, "FET_DEF", {nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS}, 320, 367, MENUALIGN_CENTER,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_DISPLAY_SETTINGS = 4
|
||||
#ifndef GRAPHICS_MENU_OPTIONS
|
||||
{ "FEH_DIS", MENUPAGE_OPTIONS, new CCustomScreenLayout({40, 78, 25, true}), nil,
|
||||
MENUACTION_BRIGHTNESS, "FED_BRI", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_DRAWDIST, "FEM_LOD", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
#ifdef LEGACY_MENU_OPTIONS
|
||||
MENUACTION_FRAMESYNC, "FEM_VSC", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
#endif
|
||||
MENUACTION_FRAMELIMIT, "FEM_FRM", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
#if defined LEGACY_MENU_OPTIONS && !defined EXTENDED_COLOURFILTER
|
||||
MENUACTION_TRAILS, "FED_TRA", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
#endif
|
||||
MENUACTION_SUBTITLES, "FED_SUB", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_WIDESCREEN, "FED_WIS", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_LEGENDS, "MAP_LEG", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_RADARMODE, "FED_RDR", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_HUD, "FED_HUD", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_SCREENRES, "FED_RES", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
VIDEOMODE_SELECTOR
|
||||
MULTISAMPLING_SELECTOR
|
||||
ISLAND_LOADING_SELECTOR
|
||||
DUALPASS_SELECTOR
|
||||
CUTSCENE_BORDERS_TOGGLE
|
||||
FREE_CAM_TOGGLE
|
||||
POSTFX_SELECTORS
|
||||
// re3.cpp inserts here pipeline selectors if neo/neo.txd exists and EXTENDED_PIPELINES defined
|
||||
MENUACTION_RESTOREDEF, "FET_DEF", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 320, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 320, 0, MENUALIGN_CENTER,
|
||||
},
|
||||
#else
|
||||
{ "FEH_DIS", MENUPAGE_OPTIONS, new CCustomScreenLayout({40, 78, 25, true}), nil,
|
||||
MENUACTION_BRIGHTNESS, "FED_BRI", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_DRAWDIST, "FEM_LOD", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||
CUTSCENE_BORDERS_TOGGLE
|
||||
FREE_CAM_TOGGLE
|
||||
MENUACTION_LEGENDS, "MAP_LEG", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_RADARMODE, "FED_RDR", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_HUD, "FED_HUD", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_SUBTITLES, "FED_SUB", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CFO_DYNAMIC, "FET_DEF", { new CCFODynamic(nil, nil, nil, RestoreDefDisplay) }, 320, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_GOBACK, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE}, 320, 0, MENUALIGN_CENTER,
|
||||
},
|
||||
#endif
|
||||
|
||||
// MENUPAGE_LANGUAGE_SETTINGS = 5
|
||||
{ "FEH_LAN", MENUPAGE_OPTIONS, nil, nil,
|
||||
MENUACTION_LANG_ENG, "FEL_ENG", {nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS}, 320, 132, MENUALIGN_CENTER,
|
||||
MENUACTION_LANG_FRE, "FEL_FRE", {nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_LANG_GER, "FEL_GER", {nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_LANG_ITA, "FEL_ITA", {nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_LANG_SPA, "FEL_SPA", {nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS}, 0, 0, MENUALIGN_CENTER,
|
||||
#ifdef MORE_LANGUAGES
|
||||
MENUACTION_CFO_DYNAMIC, "FEL_POL", { new CCFODynamic(nil, nil, nil, LangPolSelect) }, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_CFO_DYNAMIC, "FEL_RUS", { new CCFODynamic(nil, nil, nil, LangRusSelect) }, 0, 0, MENUALIGN_CENTER
|
||||
MENUACTION_CFO_DYNAMIC, "FEL_JAP", { new CCFODynamic(nil, nil, nil, LangJapSelect) }, 0, 0, MENUALIGN_CENTER,
|
||||
#endif
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_MAP = 6
|
||||
{ "FEH_MAP", MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 70, 380, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_NEW_GAME_RELOAD = 7
|
||||
{ "FES_NGA", MENUPAGE_NEW_GAME, nil, nil,
|
||||
MENUACTION_LABEL, "FESZ_QR", {nil, SAVESLOT_NONE, 0}, 0, 0, 0,
|
||||
MENUACTION_NO, "FEM_NO", {nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME}, 320, 200, MENUALIGN_CENTER,
|
||||
MENUACTION_NEWGAME, "FEM_YES", {nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME_RELOAD}, 320, 225, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_CHOOSE_LOAD_SLOT = 8
|
||||
{ "FET_LG", MENUPAGE_NEW_GAME, nil, nil,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL1", {nil, SAVESLOT_1, 0}, 40, 90, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL2", {nil, SAVESLOT_2, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL3", {nil, SAVESLOT_3, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL4", {nil, SAVESLOT_4, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL5", {nil, SAVESLOT_5, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL6", {nil, SAVESLOT_6, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL7", {nil, SAVESLOT_7, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL8", {nil, SAVESLOT_8, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, 0}, 320, 345, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_CHOOSE_DELETE_SLOT = 9
|
||||
{ "FES_DEL", MENUPAGE_NEW_GAME, nil, nil,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL1", {nil, SAVESLOT_1, 0}, 40, 90, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL2", {nil, SAVESLOT_2, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL3", {nil, SAVESLOT_3, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL4", {nil, SAVESLOT_4, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL5", {nil, SAVESLOT_5, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL6", {nil, SAVESLOT_6, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL7", {nil, SAVESLOT_7, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_CHECKSAVE, "FEM_SL8", {nil, SAVESLOT_8, 0}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, 0}, 320, 345, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_LOAD_SLOT_CONFIRM = 10
|
||||
{ "FET_LG", MENUPAGE_CHOOSE_LOAD_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FESZ_QL", {nil, SAVESLOT_NONE, 0}, 0, 0, 0,
|
||||
MENUACTION_NO, "FEM_NO", {nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_LOAD_SLOT}, 320, 200, MENUALIGN_CENTER,
|
||||
MENUACTION_YES, "FEM_YES", {nil, SAVESLOT_NONE, MENUPAGE_LOADING_IN_PROGRESS}, 320, 225, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_DELETE_SLOT_CONFIRM = 11
|
||||
{ "FES_DEL", MENUPAGE_CHOOSE_DELETE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FESZ_QD", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0,
|
||||
MENUACTION_NO, "FEM_NO", {nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_DELETE_SLOT}, 320, 200, MENUALIGN_CENTER,
|
||||
MENUACTION_YES, "FEM_YES", {nil, SAVESLOT_NONE, MENUPAGE_DELETING_IN_PROGRESS}, 320, 225, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_LOADING_IN_PROGRESS = 12
|
||||
{ "FET_LG", MENUPAGE_CHOOSE_LOAD_SLOT, nil, nil,
|
||||
},
|
||||
|
||||
// MENUPAGE_DELETING_IN_PROGRESS = 13
|
||||
{ "FES_DEL", MENUPAGE_CHOOSE_DELETE_SLOT, nil, nil,
|
||||
},
|
||||
|
||||
// MENUPAGE_DELETE_SUCCESSFUL = 14
|
||||
{ "FES_DEL", MENUPAGE_NEW_GAME, nil, nil,
|
||||
MENUACTION_LABEL, "FES_DSC", {nil, SAVESLOT_NONE, 0}, 0, 0, 0,
|
||||
MENUACTION_CHANGEMENU, "FEM_OK", {nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME}, 320, 225, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_CHOOSE_SAVE_SLOT = 15
|
||||
{ "FET_SG", MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_SAVEGAME, "FEM_SL1", {nil, SAVESLOT_1, MENUPAGE_SAVE_OVERWRITE_CONFIRM}, 40, 90, MENUALIGN_LEFT,
|
||||
MENUACTION_SAVEGAME, "FEM_SL2", {nil, SAVESLOT_2, MENUPAGE_SAVE_OVERWRITE_CONFIRM}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_SAVEGAME, "FEM_SL3", {nil, SAVESLOT_3, MENUPAGE_SAVE_OVERWRITE_CONFIRM}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_SAVEGAME, "FEM_SL4", {nil, SAVESLOT_4, MENUPAGE_SAVE_OVERWRITE_CONFIRM}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_SAVEGAME, "FEM_SL5", {nil, SAVESLOT_5, MENUPAGE_SAVE_OVERWRITE_CONFIRM}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_SAVEGAME, "FEM_SL6", {nil, SAVESLOT_6, MENUPAGE_SAVE_OVERWRITE_CONFIRM}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_SAVEGAME, "FEM_SL7", {nil, SAVESLOT_7, MENUPAGE_SAVE_OVERWRITE_CONFIRM}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_SAVEGAME, "FEM_SL8", {nil, SAVESLOT_8, MENUPAGE_SAVE_OVERWRITE_CONFIRM}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_RESUME_FROM_SAVEZONE,"FESZ_CA", {nil, SAVESLOT_NONE, 0}, 320, 345, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_SAVE_OVERWRITE_CONFIRM = 16
|
||||
{ "FET_SG", MENUPAGE_CHOOSE_SAVE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FESZ_QZ", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0,
|
||||
MENUACTION_NO, "FEM_NO", {nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT}, 320, 200, MENUALIGN_CENTER,
|
||||
MENUACTION_YES, "FEM_YES", {nil, SAVESLOT_NONE, MENUPAGE_SAVING_IN_PROGRESS}, 320, 225, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_SAVING_IN_PROGRESS = 17
|
||||
{ "FET_SG", MENUPAGE_CHOOSE_SAVE_SLOT, nil, nil,
|
||||
},
|
||||
|
||||
// MENUPAGE_SAVE_SUCCESSFUL = 18
|
||||
{ "FET_SG", MENUPAGE_CHOOSE_SAVE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FES_SSC", {nil, SAVESLOT_LABEL, MENUPAGE_NONE}, 0, 0, 0,
|
||||
MENUACTION_RESUME_FROM_SAVEZONE, "FEM_OK", {nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT}, 320, 225, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_SAVE_CUSTOM_WARNING = 19
|
||||
{ "FET_SG", MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_LABEL, "", {nil, SAVESLOT_NONE, 0}, 0, 0, 0,
|
||||
MENUACTION_CHANGEMENU, "FEM_OK", {nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT}, 320, 225, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_SAVE_CHEAT_WARNING = 20
|
||||
{ "FET_SG", MENUPAGE_NEW_GAME, nil, nil,
|
||||
MENUACTION_LABEL, "FES_CHE", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0,
|
||||
MENUACTION_CHANGEMENU, "FEM_OK", {nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT}, 320, 225, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_SKIN_SELECT = 21
|
||||
{ "FET_PS", MENUPAGE_OPTIONS, nil, nil,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_OPTIONS}, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_SAVE_UNUSED = 22
|
||||
{ "FET_SG", MENUPAGE_NEW_GAME, nil, nil,
|
||||
MENUACTION_LABEL, "FED_LWR", {nil, SAVESLOT_NONE, 0}, 0, 0, 0,
|
||||
MENUACTION_CHANGEMENU, "FEC_OKK", {nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT}, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_SAVE_FAILED = 23
|
||||
{ "FET_SG", MENUPAGE_CHOOSE_SAVE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FEC_SVU", {nil, SAVESLOT_NONE, 0}, 0, 0, 0,
|
||||
MENUACTION_CHANGEMENU, "FEC_OKK", {nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT}, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_SAVE_FAILED_2 = 24
|
||||
{ "FET_LG", MENUPAGE_CHOOSE_SAVE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FEC_SVU", {nil, SAVESLOT_NONE, 0}, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_LOAD_FAILED = 25
|
||||
{ "FET_LG", MENUPAGE_NEW_GAME, nil, nil,
|
||||
MENUACTION_LABEL, "FEC_LUN", {nil, SAVESLOT_NONE, 0}, 0, 0, 0,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME}, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC = 26
|
||||
{ "FET_CTL", MENUPAGE_OPTIONS, new CCustomScreenLayout({0, 0, MENU_DEFAULT_LINE_HEIGHT, false, false, 150}), nil,
|
||||
#ifdef PC_PLAYER_CONTROLS
|
||||
MENUACTION_CTRLMETHOD, "FET_STI", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC}, 320, 150, MENUALIGN_CENTER,
|
||||
#endif
|
||||
MENUACTION_KEYBOARDCTRLS,"FEC_RED", {nil, SAVESLOT_NONE, MENUPAGE_KEYBOARD_CONTROLS}, 0, 0, MENUALIGN_CENTER,
|
||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||
MENUACTION_CHANGEMENU, "FEC_JOD", {nil, SAVESLOT_NONE, MENUPAGE_DETECT_JOYSTICK}, 0, 0, MENUALIGN_CENTER,
|
||||
#endif
|
||||
MENUACTION_CHANGEMENU, "FEC_MOU", {nil, SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS}, 0, 0, MENUALIGN_CENTER,
|
||||
INVERT_PAD_SELECTOR
|
||||
MENUACTION_RESTOREDEF, "FET_DEF", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC}, 320, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, 0}, 320, 0, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_OPTIONS = 27
|
||||
{ "FET_OPT", MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FEO_CON", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC}, 320, 132, MENUALIGN_CENTER,
|
||||
MENUACTION_LOADRADIO, "FEO_AUD", {nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_CHANGEMENU, "FEO_DIS", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_CENTER,
|
||||
#ifdef GRAPHICS_MENU_OPTIONS
|
||||
MENUACTION_CHANGEMENU, "FET_GRA", {nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS}, 0, 0, MENUALIGN_CENTER,
|
||||
#endif
|
||||
MENUACTION_CHANGEMENU, "FEO_LAN", {nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_PLAYERSETUP, "FET_PS", {nil, SAVESLOT_NONE, MENUPAGE_SKIN_SELECT}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, 0}, 0, 0, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_EXIT = 28
|
||||
{ "FET_QG", MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_LABEL, "FEQ_SRE", {nil, SAVESLOT_NONE, 0}, 0, 0, 0,
|
||||
MENUACTION_DONTCANCEL, "FEM_NO", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 320, 200, MENUALIGN_CENTER,
|
||||
MENUACTION_CANCELGAME, "FEM_YES", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 320, 225, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_START_MENU = 29
|
||||
{ "FEM_MM", MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FEP_STG", {nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME}, 320, 170, MENUALIGN_CENTER,
|
||||
MENUACTION_CHANGEMENU, "FEP_OPT", {nil, SAVESLOT_NONE, MENUPAGE_OPTIONS}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_CHANGEMENU, "FEP_QUI", {nil, SAVESLOT_NONE, MENUPAGE_EXIT}, 0, 0, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_KEYBOARD_CONTROLS = 30
|
||||
{ "FET_STI", MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
},
|
||||
|
||||
// MENUPAGE_MOUSE_CONTROLS = 31
|
||||
{ "FEC_MOU", MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
MENUACTION_MOUSESENS, "FEC_MSH", {nil, SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS}, 40, 170, MENUALIGN_LEFT,
|
||||
MENUACTION_INVVERT, "FEC_IVV", {nil, SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_MOUSESTEER, "FET_MST", {nil, SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS}, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, 0}, 320, 260, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_PAUSE_MENU = 32
|
||||
{ "FET_PAU", MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_RESUME, "FEP_RES", {nil, SAVESLOT_NONE, 0}, 320, 120, MENUALIGN_CENTER,
|
||||
MENUACTION_CHANGEMENU, "FEH_SGA", {nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_CHANGEMENU, "FEH_MAP", {nil, SAVESLOT_NONE, MENUPAGE_MAP}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_CHANGEMENU, "FEP_STA", {nil, SAVESLOT_NONE, MENUPAGE_STATS}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_CHANGEMENU, "FEH_BRI", {nil, SAVESLOT_NONE, MENUPAGE_BRIEFS}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_CHANGEMENU, "FET_OPT", {nil, SAVESLOT_NONE, MENUPAGE_OPTIONS}, 0, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_CHANGEMENU, "FEP_QUI", {nil, SAVESLOT_NONE, MENUPAGE_EXIT}, 0, 0, MENUALIGN_CENTER,
|
||||
},
|
||||
|
||||
// MENUPAGE_NONE = 33
|
||||
{ "", 0, nil, nil, },
|
||||
|
||||
|
||||
#ifdef LEGACY_MENU_OPTIONS
|
||||
// MENUPAGE_CONTROLLER_SETTINGS = 4
|
||||
{ "FET_CON", MENUPAGE_OPTIONS, nil, nil,
|
||||
MENUACTION_CTRLCONFIG, "FEC_CCF", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS}, 0, 0, 0,
|
||||
MENUACTION_CTRLVIBRATION, "FEC_VIB", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS}, 0, 0, 0,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_DEBUG_MENU = 18
|
||||
{ "FED_DBG", MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_RELOADIDE, "FED_RID", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0,
|
||||
MENUACTION_SETDBGFLAG, "FED_DFL", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0,
|
||||
MENUACTION_SWITCHBIGWHITEDEBUGLIGHT, "FED_DLS", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0,
|
||||
MENUACTION_COLLISIONPOLYS, "FED_SCP", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC_OLD1 = 36
|
||||
{ "FET_CTL", MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
MENUACTION_GETKEY, "FEC_PLB", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_CWL", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_CWR", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_LKT", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_PJP", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_PSP", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_TLF", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_TRG", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_CCM", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1}, 0, 0, 0,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC_OLD2 = 37
|
||||
{ "FET_CTL", MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC_OLD3 = 38
|
||||
{ "FET_CTL", MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
MENUACTION_GETKEY, "FEC_LUP", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_LDN", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_SMS", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3}, 0, 0, 0,
|
||||
MENUACTION_SHOWHEADBOB, "FEC_GSL", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3}, 0, 0, 0,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0,
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC_OLD4 = 39
|
||||
{ "FET_CTL", MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_DEBUG = 40
|
||||
{ "FEC_DBG", MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
MENUACTION_GETKEY, "FEC_TGD", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_TDO", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_TSS", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG}, 0, 0, 0,
|
||||
MENUACTION_GETKEY, "FEC_SMS", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG}, 0, 0, 0,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0,
|
||||
},
|
||||
#endif
|
||||
|
||||
#ifdef GRAPHICS_MENU_OPTIONS
|
||||
// MENUPAGE_GRAPHICS_SETTINGS
|
||||
{ "FET_GRA", MENUPAGE_OPTIONS, new CCustomScreenLayout({40, 78, 25, true, true}), GraphicsGoBack,
|
||||
|
||||
MENUACTION_SCREENRES, "FED_RES", { nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||
MENUACTION_WIDESCREEN, "FED_WIS", { nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||
VIDEOMODE_SELECTOR
|
||||
#ifdef LEGACY_MENU_OPTIONS
|
||||
MENUACTION_FRAMESYNC, "FEM_VSC", {nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||
#endif
|
||||
MENUACTION_FRAMELIMIT, "FEM_FRM", { nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||
MULTISAMPLING_SELECTOR
|
||||
ISLAND_LOADING_SELECTOR
|
||||
DUALPASS_SELECTOR
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
POSTFX_SELECTORS
|
||||
#elif defined LEGACY_MENU_OPTIONS
|
||||
MENUACTION_TRAILS, "FED_TRA", { nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||
#endif
|
||||
// re3.cpp inserts here pipeline selectors if neo/neo.txd exists and EXTENDED_PIPELINES defined
|
||||
MENUACTION_CFO_DYNAMIC, "FET_DEF", { new CCFODynamic(nil, nil, nil, RestoreDefGraphics) }, 320, 0, MENUALIGN_CENTER,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 320, 0, MENUALIGN_CENTER,
|
||||
},
|
||||
#endif
|
||||
|
||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||
// MENUPAGE_DETECT_JOYSTICK
|
||||
{ "FEC_JOD", MENUPAGE_CONTROLLER_PC, new CCustomScreenLayout({0, 0, 0, false, false, 30}), nil,
|
||||
|
||||
MENUACTION_LABEL, "FEC_JPR", { nil, SAVESLOT_NONE, MENUPAGE_NONE }, 0, 0, 0,
|
||||
MENUACTION_CFO_DYNAMIC, "FEC_JDE", { new CCFODynamic(nil, nil, DetectJoystickDraw, nil) }, 80, 200, MENUALIGN_LEFT,
|
||||
MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 320, 225, MENUALIGN_CENTER,
|
||||
},
|
||||
#endif
|
||||
|
||||
// MENUPAGE_OUTRO = 34
|
||||
{ "", 0, nil, nil, },
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
+37
-5
@@ -1213,14 +1213,46 @@ void CPad::AddToCheatString(char c)
|
||||
|
||||
int Cheat_strncmp(char* sourceStr, char* origCheatStr)
|
||||
{
|
||||
char cheatCodeVals[] = { 3,5,7,1,13,27,3,7,1,11,13,8,7,32,13,6,28,19,10,3,3,5,7,1,13,27,3,7 };
|
||||
|
||||
for (uint32 i = 0; i < strlen(origCheatStr); i++) {
|
||||
if ((sourceStr[i] != origCheatStr[i] - cheatCodeVals[i]) || i >= ARRAY_SIZE(cheatCodeVals)) {
|
||||
return 1;
|
||||
#define ccmp(n) if((uint8)sourceStr[i] != (uint8)origCheatStr[i] - n) return 1;
|
||||
int i = 0;
|
||||
while(origCheatStr[i])
|
||||
{
|
||||
switch(i)
|
||||
{
|
||||
case 0: ccmp(3); break;
|
||||
case 1: ccmp(5); break;
|
||||
case 2: ccmp(7); break;
|
||||
case 3: ccmp(1); break;
|
||||
case 4: ccmp(13); break;
|
||||
case 5: ccmp(27); break;
|
||||
case 6: ccmp(3); break;
|
||||
case 7: ccmp(7); break;
|
||||
case 8: ccmp(1); break;
|
||||
case 9: ccmp(11); break;
|
||||
case 10: ccmp(13); break;
|
||||
case 11: ccmp(8); break;
|
||||
case 12: ccmp(7); break;
|
||||
case 13: ccmp(32); break;
|
||||
case 14: ccmp(13); break;
|
||||
case 15: ccmp(6); break;
|
||||
case 16: ccmp(28); break;
|
||||
case 17: ccmp(19); break;
|
||||
case 18: ccmp(10); break;
|
||||
case 19: ccmp(3); break;
|
||||
case 20: ccmp(3); break;
|
||||
case 21: ccmp(5); break;
|
||||
case 22: ccmp(7); break;
|
||||
case 23: ccmp(1); break;
|
||||
case 24: ccmp(13); break;
|
||||
case 25: ccmp(27); break;
|
||||
case 26: ccmp(3); break;
|
||||
case 27: ccmp(7); break;
|
||||
default: return 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
#undef ccmp
|
||||
}
|
||||
|
||||
// TODO(Miami): Mobile has changed some of the cheats to include debugging things
|
||||
|
||||
+357
-273
@@ -3,6 +3,7 @@
|
||||
#include "Automobile.h"
|
||||
#include "Bridge.h"
|
||||
#include "Camera.h"
|
||||
#include "CarCtrl.h"
|
||||
#include "Cranes.h"
|
||||
#include "Darkel.h"
|
||||
#include "Explosion.h"
|
||||
@@ -34,93 +35,10 @@
|
||||
#include "Automobile.h"
|
||||
#include "GameLogic.h"
|
||||
|
||||
// --MIAMI: File done
|
||||
|
||||
CVector lastPlayerPos;
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::SetPlayerSkin(char *skin)
|
||||
{
|
||||
strncpy(m_aSkinName, skin, 32);
|
||||
LoadPlayerSkin();
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
const CVector &
|
||||
CPlayerInfo::GetPos()
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
if (!m_pPed)
|
||||
return TheCamera.GetPosition();
|
||||
#endif
|
||||
if (m_pPed->InVehicle())
|
||||
return m_pPed->m_pMyVehicle->GetPosition();
|
||||
return m_pPed->GetPosition();
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::LoadPlayerSkin()
|
||||
{
|
||||
DeletePlayerSkin();
|
||||
|
||||
m_pSkinTexture = CPlayerSkin::GetSkinTexture(m_aSkinName);
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::DeletePlayerSkin()
|
||||
{
|
||||
if (m_pSkinTexture) {
|
||||
RwTextureDestroy(m_pSkinTexture);
|
||||
m_pSkinTexture = nil;
|
||||
}
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::KillPlayer()
|
||||
{
|
||||
if (m_WBState != WBSTATE_PLAYING) return;
|
||||
|
||||
m_WBState = WBSTATE_WASTED;
|
||||
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
||||
CDarkel::ResetOnPlayerDeath();
|
||||
CMessages::AddBigMessage(TheText.Get("DEAD"), 4000, 2);
|
||||
CStats::TimesDied++;
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::ArrestPlayer()
|
||||
{
|
||||
if (m_WBState != WBSTATE_PLAYING) return;
|
||||
|
||||
m_WBState = WBSTATE_BUSTED;
|
||||
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
||||
m_nBustedAudioStatus = BUSTEDAUDIO_NONE;
|
||||
CDarkel::ResetOnPlayerDeath();
|
||||
CMessages::AddBigMessage(TheText.Get("BUSTED"), 5000, 2);
|
||||
CStats::TimesArrested++;
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
bool
|
||||
CPlayerInfo::IsPlayerInRemoteMode()
|
||||
{
|
||||
return m_pRemoteVehicle || m_bInRemoteMode;
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::PlayerFailedCriticalMission()
|
||||
{
|
||||
if (m_WBState != WBSTATE_PLAYING)
|
||||
return;
|
||||
m_WBState = WBSTATE_FAILED_CRITICAL_MISSION;
|
||||
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
||||
CDarkel::ResetOnPlayerDeath();
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::Clear(void)
|
||||
{
|
||||
@@ -181,192 +99,6 @@ CPlayerInfo::Clear(void)
|
||||
m_nBustedAudioStatus = BUSTEDAUDIO_NONE;
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::BlowUpRCBuggy(bool actually)
|
||||
{
|
||||
if (!m_pRemoteVehicle || m_pRemoteVehicle->bRemoveFromWorld)
|
||||
return;
|
||||
|
||||
CRemote::TakeRemoteControlledCarFromPlayer(actually);
|
||||
if (actually)
|
||||
m_pRemoteVehicle->BlowUpCar(FindPlayerPed());
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::CancelPlayerEnteringCars(CVehicle *car)
|
||||
{
|
||||
if (!car || car == m_pPed->m_pMyVehicle) {
|
||||
if (m_pPed->EnteringCar())
|
||||
m_pPed->QuitEnteringCar();
|
||||
}
|
||||
if (m_pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_PASSENGER || m_pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER)
|
||||
m_pPed->ClearObjective();
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::MakePlayerSafe(bool toggle)
|
||||
{
|
||||
if (toggle) {
|
||||
m_pPed->m_pWanted->m_bIgnoredByEveryone = true;
|
||||
CWorld::StopAllLawEnforcersInTheirTracks();
|
||||
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
||||
CPad::StopPadsShaking();
|
||||
m_pPed->bBulletProof = true;
|
||||
m_pPed->bFireProof = true;
|
||||
m_pPed->bCollisionProof = true;
|
||||
m_pPed->bMeleeProof = true;
|
||||
m_pPed->bOnlyDamagedByPlayer = true;
|
||||
m_pPed->bExplosionProof = true;
|
||||
m_pPed->m_bCanBeDamaged = false;
|
||||
((CPlayerPed*)m_pPed)->ClearAdrenaline();
|
||||
CancelPlayerEnteringCars(nil);
|
||||
gFireManager.ExtinguishPoint(GetPos(), 4000.0f);
|
||||
CExplosion::RemoveAllExplosionsInArea(GetPos(), 4000.0f);
|
||||
CProjectileInfo::RemoveAllProjectiles();
|
||||
CWorld::SetAllCarsCanBeDamaged(false);
|
||||
CWorld::ExtinguishAllCarFiresInArea(GetPos(), 4000.0f);
|
||||
CReplay::DisableReplays();
|
||||
|
||||
} else {
|
||||
m_pPed->m_pWanted->m_bIgnoredByEveryone = false;
|
||||
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
||||
m_pPed->bBulletProof = false;
|
||||
m_pPed->bFireProof = false;
|
||||
m_pPed->bCollisionProof = false;
|
||||
m_pPed->bMeleeProof = false;
|
||||
m_pPed->bOnlyDamagedByPlayer = false;
|
||||
m_pPed->bExplosionProof = false;
|
||||
m_pPed->m_bCanBeDamaged = true;
|
||||
CWorld::SetAllCarsCanBeDamaged(true);
|
||||
CReplay::EnableReplays();
|
||||
}
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
bool
|
||||
CPlayerInfo::IsRestartingAfterDeath()
|
||||
{
|
||||
return m_WBState == WBSTATE_WASTED;
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
bool
|
||||
CPlayerInfo::IsRestartingAfterArrest()
|
||||
{
|
||||
return m_WBState == WBSTATE_BUSTED;
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
// lastCloseness is passed to other calls of this function
|
||||
void
|
||||
CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoundCentrePedDist, float *lastCloseness, CVehicle **closestCarOutput)
|
||||
{
|
||||
// This dist used for determining the angle to face
|
||||
CVector2D dist(carToTest->GetPosition() - player->GetPosition());
|
||||
float neededTurn = CGeneral::GetATanOfXY(player->GetForward().x, player->GetForward().y) - CGeneral::GetATanOfXY(dist.x, dist.y);
|
||||
while (neededTurn >= PI) {
|
||||
neededTurn -= 2 * PI;
|
||||
}
|
||||
|
||||
while (neededTurn < -PI) {
|
||||
neededTurn += 2 * PI;
|
||||
}
|
||||
|
||||
// This dist used for evaluating cars' distances, weird...
|
||||
// Accounts inverted needed turn (or needed turn in long way) and car dist.
|
||||
float closeness = (1.0f - Abs(neededTurn) / TWOPI) * (10.0f - carBoundCentrePedDist);
|
||||
if (closeness > *lastCloseness) {
|
||||
*lastCloseness = closeness;
|
||||
*closestCarOutput = (CVehicle*)carToTest;
|
||||
}
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::SavePlayerInfo(uint8 *buf, uint32 *size)
|
||||
{
|
||||
// Interesting
|
||||
*size = sizeof(CPlayerInfo);
|
||||
|
||||
#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); buf += sizeof(data);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFireproof);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bDriveByAllowed);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nBustedAudioStatus);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCurrentBustedAudio);
|
||||
#undef CopyToBuf
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::LoadPlayerInfo(uint8 *buf, uint32 size)
|
||||
{
|
||||
#define CopyFromBuf(buf, data) memcpy(&data, buf, sizeof(data)); buf += sizeof(data);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFireproof);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bDriveByAllowed);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nBustedAudioStatus);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCurrentBustedAudio)
|
||||
#undef CopyFromBuf
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::FindClosestCarSectorList(CPtrList& carList, CPed* ped, float unk1, float unk2, float unk3, float unk4, float* lastCloseness, CVehicle** closestCarOutput)
|
||||
{
|
||||
for (CPtrNode* node = carList.first; node; node = node->next) {
|
||||
CVehicle *car = (CVehicle*)node->item;
|
||||
if(car->m_scanCode != CWorld::GetCurrentScanCode()) {
|
||||
if (!car->bUsesCollision || !car->IsVehicle())
|
||||
continue;
|
||||
|
||||
car->m_scanCode = CWorld::GetCurrentScanCode();
|
||||
if (car->GetStatus() != STATUS_WRECKED && car->GetStatus() != STATUS_TRAIN_MOVING
|
||||
&& (car->GetUp().z > 0.3f || (car->IsVehicle() && ((CVehicle*)car)->m_vehType == VEHICLE_TYPE_BIKE))) {
|
||||
CVector carCentre = car->GetBoundCentre();
|
||||
|
||||
if (Abs(ped->GetPosition().z - carCentre.z) < 2.0f || car->IsCar() && carCentre.z < ped->GetPosition().z && ped->GetPosition().z - 4.f < carCentre.z) {
|
||||
float dist = (ped->GetPosition() - carCentre).Magnitude2D();
|
||||
if (dist <= 10.0f && !CCranes::IsThisCarBeingCarriedByAnyCrane(car)) {
|
||||
EvaluateCarPosition(car, ped, dist, lastCloseness, closestCarOutput);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::Process(void)
|
||||
{
|
||||
@@ -673,13 +405,13 @@ CPlayerInfo::Process(void)
|
||||
uint32 timeWithoutRemoteCar = CTimer::GetTimeInMilliseconds() - m_nTimeLostRemoteCar;
|
||||
if (CTimer::GetPreviousTimeInMilliseconds() - m_nTimeLostRemoteCar < 1000 && timeWithoutRemoteCar >= 1000 && m_WBState == WBSTATE_PLAYING && field_D6) {
|
||||
TheCamera.SetFadeColour(0, 0, 0);
|
||||
TheCamera.Fade(1.0f, 0);
|
||||
TheCamera.Fade(1.0f, FADE_OUT);
|
||||
}
|
||||
if (timeWithoutRemoteCar > 2000) {
|
||||
if (m_WBState == WBSTATE_PLAYING && field_D6) {
|
||||
TheCamera.RestoreWithJumpCut();
|
||||
TheCamera.SetFadeColour(0, 0, 0);
|
||||
TheCamera.Fade(1.0f, 1);
|
||||
TheCamera.Fade(1.0f, FADE_IN);
|
||||
TheCamera.Process();
|
||||
CTimer::Stop();
|
||||
CCullZones::ForceCullZoneCoors(TheCamera.GetPosition());
|
||||
@@ -796,3 +528,355 @@ CPlayerInfo::Process(void)
|
||||
m_nMoney = Min(999999999, m_nMoney);
|
||||
m_nVisibleMoney = Min(999999999, m_nVisibleMoney);
|
||||
}
|
||||
|
||||
bool
|
||||
CPlayerInfo::IsPlayerInRemoteMode()
|
||||
{
|
||||
return m_pRemoteVehicle || m_bInRemoteMode;
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::SavePlayerInfo(uint8 *buf, uint32 *size)
|
||||
{
|
||||
// Interesting
|
||||
*size = sizeof(CPlayerInfo);
|
||||
|
||||
#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); buf += sizeof(data);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFireproof);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bDriveByAllowed);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nBustedAudioStatus);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCurrentBustedAudio);
|
||||
#undef CopyToBuf
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::LoadPlayerInfo(uint8 *buf, uint32 size)
|
||||
{
|
||||
#define CopyFromBuf(buf, data) memcpy(&data, buf, sizeof(data)); buf += sizeof(data);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFireproof);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bDriveByAllowed);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nBustedAudioStatus);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCurrentBustedAudio)
|
||||
#undef CopyFromBuf
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::FindClosestCarSectorList(CPtrList& carList, CPed* ped, float unk1, float unk2, float unk3, float unk4, float* lastCloseness, CVehicle** closestCarOutput)
|
||||
{
|
||||
for (CPtrNode* node = carList.first; node; node = node->next) {
|
||||
CVehicle *car = (CVehicle*)node->item;
|
||||
if(car->m_scanCode != CWorld::GetCurrentScanCode()) {
|
||||
if (!car->bUsesCollision || !car->IsVehicle())
|
||||
continue;
|
||||
|
||||
car->m_scanCode = CWorld::GetCurrentScanCode();
|
||||
if (car->GetStatus() != STATUS_WRECKED && car->GetStatus() != STATUS_TRAIN_MOVING
|
||||
&& (car->GetUp().z > 0.3f || (car->IsVehicle() && ((CVehicle*)car)->m_vehType == VEHICLE_TYPE_BIKE))) {
|
||||
CVector carCentre = car->GetBoundCentre();
|
||||
|
||||
if (Abs(ped->GetPosition().z - carCentre.z) < 2.0f || car->IsCar() && carCentre.z < ped->GetPosition().z && ped->GetPosition().z - 4.f < carCentre.z) {
|
||||
float dist = (ped->GetPosition() - carCentre).Magnitude2D();
|
||||
if (dist <= 10.0f && !CCranes::IsThisCarBeingCarriedByAnyCrane(car)) {
|
||||
EvaluateCarPosition(car, ped, dist, lastCloseness, closestCarOutput);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// lastCloseness is passed to other calls of this function
|
||||
void
|
||||
CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoundCentrePedDist, float *lastCloseness, CVehicle **closestCarOutput)
|
||||
{
|
||||
// This dist used for determining the angle to face
|
||||
CVector2D dist(carToTest->GetPosition() - player->GetPosition());
|
||||
float neededTurn = CGeneral::GetATanOfXY(player->GetForward().x, player->GetForward().y) - CGeneral::GetATanOfXY(dist.x, dist.y);
|
||||
while (neededTurn >= PI) {
|
||||
neededTurn -= 2 * PI;
|
||||
}
|
||||
|
||||
while (neededTurn < -PI) {
|
||||
neededTurn += 2 * PI;
|
||||
}
|
||||
|
||||
// This dist used for evaluating cars' distances, weird...
|
||||
// Accounts inverted needed turn (or needed turn in long way) and car dist.
|
||||
float closeness = (1.0f - Abs(neededTurn) / TWOPI) * (10.0f - carBoundCentrePedDist);
|
||||
if (closeness > *lastCloseness) {
|
||||
*lastCloseness = closeness;
|
||||
*closestCarOutput = (CVehicle*)carToTest;
|
||||
}
|
||||
}
|
||||
|
||||
const CVector &
|
||||
CPlayerInfo::GetPos()
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
if (!m_pPed)
|
||||
return TheCamera.GetPosition();
|
||||
#endif
|
||||
if (m_pPed->InVehicle())
|
||||
return m_pPed->m_pMyVehicle->GetPosition();
|
||||
return m_pPed->GetPosition();
|
||||
}
|
||||
|
||||
CVector
|
||||
FindPlayerCoors(void)
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
if (CReplay::IsPlayingBack())
|
||||
return TheCamera.GetPosition();
|
||||
#endif
|
||||
CPlayerPed *ped = FindPlayerPed();
|
||||
if(ped->InVehicle())
|
||||
return ped->m_pMyVehicle->GetPosition();
|
||||
else
|
||||
return ped->GetPosition();
|
||||
}
|
||||
|
||||
const CVector &
|
||||
FindPlayerSpeed(void)
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
static CVector vecTmpVector(0.0f, 0.0f, 0.0f);
|
||||
if (CReplay::IsPlayingBack())
|
||||
return vecTmpVector;
|
||||
#endif
|
||||
CPlayerPed *ped = FindPlayerPed();
|
||||
if(ped->InVehicle())
|
||||
return ped->m_pMyVehicle->m_vecMoveSpeed;
|
||||
else
|
||||
return ped->m_vecMoveSpeed;
|
||||
}
|
||||
|
||||
CVehicle *
|
||||
FindPlayerVehicle(void)
|
||||
{
|
||||
CPlayerPed *ped = FindPlayerPed();
|
||||
if(ped && ped->InVehicle()) return ped->m_pMyVehicle;
|
||||
return nil;
|
||||
}
|
||||
|
||||
CEntity *
|
||||
FindPlayerEntity(void)
|
||||
{
|
||||
CPlayerPed *ped = FindPlayerPed();
|
||||
if(ped->InVehicle())
|
||||
return ped->m_pMyVehicle;
|
||||
else
|
||||
return ped;
|
||||
}
|
||||
|
||||
CVehicle *
|
||||
FindPlayerTrain(void)
|
||||
{
|
||||
if(FindPlayerVehicle() && FindPlayerVehicle()->IsTrain())
|
||||
return FindPlayerVehicle();
|
||||
else
|
||||
return nil;
|
||||
}
|
||||
|
||||
CPlayerPed *
|
||||
FindPlayerPed(void)
|
||||
{
|
||||
return CWorld::Players[CWorld::PlayerInFocus].m_pPed;
|
||||
}
|
||||
|
||||
const CVector &
|
||||
FindPlayerCentreOfWorld(int32 player)
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
if(CReplay::IsPlayingBack()) return TheCamera.GetPosition();
|
||||
#endif
|
||||
if(CCarCtrl::bCarsGeneratedAroundCamera) return TheCamera.GetPosition();
|
||||
if(CWorld::Players[player].m_pRemoteVehicle) return CWorld::Players[player].m_pRemoteVehicle->GetPosition();
|
||||
if(FindPlayerVehicle()) return FindPlayerVehicle()->GetPosition();
|
||||
return CWorld::Players[player].m_pPed->GetPosition();
|
||||
}
|
||||
|
||||
const CVector &
|
||||
FindPlayerCentreOfWorld_NoSniperShift(void)
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
if (CReplay::IsPlayingBack()) return TheCamera.GetPosition();
|
||||
#endif
|
||||
if(CCarCtrl::bCarsGeneratedAroundCamera) return TheCamera.GetPosition();
|
||||
if(CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle)
|
||||
return CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->GetPosition();
|
||||
if(FindPlayerVehicle()) return FindPlayerVehicle()->GetPosition();
|
||||
return FindPlayerPed()->GetPosition();
|
||||
}
|
||||
|
||||
float
|
||||
FindPlayerHeading(void)
|
||||
{
|
||||
if(CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle)
|
||||
return CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->GetForward().Heading();
|
||||
if(FindPlayerVehicle()) return FindPlayerVehicle()->GetForward().Heading();
|
||||
return FindPlayerPed()->GetForward().Heading();
|
||||
}
|
||||
|
||||
bool
|
||||
CPlayerInfo::IsRestartingAfterDeath()
|
||||
{
|
||||
return m_WBState == WBSTATE_WASTED;
|
||||
}
|
||||
|
||||
bool
|
||||
CPlayerInfo::IsRestartingAfterArrest()
|
||||
{
|
||||
return m_WBState == WBSTATE_BUSTED;
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::KillPlayer()
|
||||
{
|
||||
if (m_WBState != WBSTATE_PLAYING) return;
|
||||
|
||||
m_WBState = WBSTATE_WASTED;
|
||||
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
||||
CDarkel::ResetOnPlayerDeath();
|
||||
CMessages::AddBigMessage(TheText.Get("DEAD"), 4000, 2);
|
||||
CStats::TimesDied++;
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::ArrestPlayer()
|
||||
{
|
||||
if (m_WBState != WBSTATE_PLAYING) return;
|
||||
|
||||
m_WBState = WBSTATE_BUSTED;
|
||||
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
||||
m_nBustedAudioStatus = BUSTEDAUDIO_NONE;
|
||||
CDarkel::ResetOnPlayerDeath();
|
||||
CMessages::AddBigMessage(TheText.Get("BUSTED"), 5000, 2);
|
||||
CStats::TimesArrested++;
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::PlayerFailedCriticalMission()
|
||||
{
|
||||
if (m_WBState != WBSTATE_PLAYING)
|
||||
return;
|
||||
m_WBState = WBSTATE_FAILED_CRITICAL_MISSION;
|
||||
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
||||
CDarkel::ResetOnPlayerDeath();
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::CancelPlayerEnteringCars(CVehicle *car)
|
||||
{
|
||||
if (!car || car == m_pPed->m_pMyVehicle) {
|
||||
if (m_pPed->EnteringCar())
|
||||
m_pPed->QuitEnteringCar();
|
||||
}
|
||||
if (m_pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_PASSENGER || m_pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER)
|
||||
m_pPed->ClearObjective();
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::MakePlayerSafe(bool toggle)
|
||||
{
|
||||
if (toggle) {
|
||||
m_pPed->m_pWanted->m_bIgnoredByEveryone = true;
|
||||
CWorld::StopAllLawEnforcersInTheirTracks();
|
||||
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
||||
CPad::StopPadsShaking();
|
||||
m_pPed->bBulletProof = true;
|
||||
m_pPed->bFireProof = true;
|
||||
m_pPed->bCollisionProof = true;
|
||||
m_pPed->bMeleeProof = true;
|
||||
m_pPed->bOnlyDamagedByPlayer = true;
|
||||
m_pPed->bExplosionProof = true;
|
||||
m_pPed->m_bCanBeDamaged = false;
|
||||
((CPlayerPed*)m_pPed)->ClearAdrenaline();
|
||||
CancelPlayerEnteringCars(nil);
|
||||
gFireManager.ExtinguishPoint(GetPos(), 4000.0f);
|
||||
CExplosion::RemoveAllExplosionsInArea(GetPos(), 4000.0f);
|
||||
CProjectileInfo::RemoveAllProjectiles();
|
||||
CWorld::SetAllCarsCanBeDamaged(false);
|
||||
CWorld::ExtinguishAllCarFiresInArea(GetPos(), 4000.0f);
|
||||
CReplay::DisableReplays();
|
||||
|
||||
} else {
|
||||
m_pPed->m_pWanted->m_bIgnoredByEveryone = false;
|
||||
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
||||
m_pPed->bBulletProof = false;
|
||||
m_pPed->bFireProof = false;
|
||||
m_pPed->bCollisionProof = false;
|
||||
m_pPed->bMeleeProof = false;
|
||||
m_pPed->bOnlyDamagedByPlayer = false;
|
||||
m_pPed->bExplosionProof = false;
|
||||
m_pPed->m_bCanBeDamaged = true;
|
||||
CWorld::SetAllCarsCanBeDamaged(true);
|
||||
CReplay::EnableReplays();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::BlowUpRCBuggy(bool actually)
|
||||
{
|
||||
if (!m_pRemoteVehicle || m_pRemoteVehicle->bRemoveFromWorld)
|
||||
return;
|
||||
|
||||
CRemote::TakeRemoteControlledCarFromPlayer(actually);
|
||||
if (actually)
|
||||
m_pRemoteVehicle->BlowUpCar(FindPlayerPed());
|
||||
}
|
||||
|
||||
#ifdef GTA_PC
|
||||
void
|
||||
CPlayerInfo::SetPlayerSkin(const char *skin)
|
||||
{
|
||||
strncpy(m_aSkinName, skin, 32);
|
||||
LoadPlayerSkin();
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::LoadPlayerSkin()
|
||||
{
|
||||
DeletePlayerSkin();
|
||||
|
||||
m_pSkinTexture = CPlayerSkin::GetSkinTexture(m_aSkinName);
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerInfo::DeletePlayerSkin()
|
||||
{
|
||||
if (m_pSkinTexture) {
|
||||
RwTextureDestroy(m_pSkinTexture);
|
||||
m_pSkinTexture = nil;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
+19
-6
@@ -10,7 +10,7 @@ enum eWastedBustedState
|
||||
WBSTATE_FAILED_CRITICAL_MISSION,
|
||||
};
|
||||
|
||||
enum eBustedAudioState : uint8
|
||||
enum eBustedAudioState
|
||||
{
|
||||
BUSTEDAUDIO_NONE,
|
||||
BUSTEDAUDIO_LOADING,
|
||||
@@ -82,15 +82,14 @@ public:
|
||||
bool m_bGetOutOfJailFree;
|
||||
bool m_bGetOutOfHospitalFree;
|
||||
bool m_bDriveByAllowed;
|
||||
eBustedAudioState m_nBustedAudioStatus;
|
||||
uint8 m_nBustedAudioStatus;
|
||||
int16 m_nCurrentBustedAudio;
|
||||
#ifdef GTA_PC
|
||||
char m_aSkinName[32];
|
||||
RwTexture *m_pSkinTexture;
|
||||
#endif
|
||||
|
||||
void MakePlayerSafe(bool);
|
||||
void LoadPlayerSkin();
|
||||
void DeletePlayerSkin();
|
||||
void SetPlayerSkin(char* skin);
|
||||
const CVector &GetPos();
|
||||
void Process(void);
|
||||
void KillPlayer(void);
|
||||
@@ -107,5 +106,19 @@ public:
|
||||
void SavePlayerInfo(uint8 *buf, uint32* size);
|
||||
void FindClosestCarSectorList(CPtrList&, CPed*, float, float, float, float, float*, CVehicle**);
|
||||
|
||||
~CPlayerInfo() { };
|
||||
#ifdef GTA_PC
|
||||
void LoadPlayerSkin();
|
||||
void SetPlayerSkin(const char *skin);
|
||||
void DeletePlayerSkin();
|
||||
#endif
|
||||
};
|
||||
|
||||
CPlayerPed *FindPlayerPed(void);
|
||||
CVehicle *FindPlayerVehicle(void);
|
||||
CVehicle *FindPlayerTrain(void);
|
||||
CEntity *FindPlayerEntity(void);
|
||||
CVector FindPlayerCoors(void);
|
||||
const CVector &FindPlayerSpeed(void);
|
||||
const CVector &FindPlayerCentreOfWorld(int32 player);
|
||||
const CVector &FindPlayerCentreOfWorld_NoSniperShift(void);
|
||||
float FindPlayerHeading(void);
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "Streaming.h"
|
||||
#include "Wanted.h"
|
||||
#include "World.h"
|
||||
#include "MemoryHeap.h"
|
||||
|
||||
//--MIAMI: file done
|
||||
|
||||
@@ -27,19 +28,39 @@ CDummyPool *CPools::ms_pDummyPool;
|
||||
CAudioScriptObjectPool *CPools::ms_pAudioScriptObjectPool;
|
||||
CColModelPool *CPools::ms_pColModelPool;
|
||||
|
||||
#if defined GTA_PS2 && !defined MASTER // or USE_CUSTOM_ALLOCATOR
|
||||
// not in VC. perhaps ifdef'ed away
|
||||
#define CHECKMEM(msg) CMemCheck::AllocateMemCheckBlock(msg)
|
||||
#else
|
||||
#define CHECKMEM(msg)
|
||||
#endif
|
||||
|
||||
void
|
||||
CPools::Initialise(void)
|
||||
{
|
||||
PUSH_MEMID(MEMID_POOLS);
|
||||
CHECKMEM("before pools");
|
||||
ms_pPtrNodePool = new CCPtrNodePool(NUMPTRNODES, "PtrNode");
|
||||
CHECKMEM("after CPtrNodePool");
|
||||
ms_pEntryInfoNodePool = new CEntryInfoNodePool(NUMENTRYINFOS, "EntryInfoNode");
|
||||
CHECKMEM("after CEntryInfoNodePool");
|
||||
ms_pPedPool = new CPedPool(NUMPEDS, "Peds");
|
||||
CHECKMEM("after CPedPool");
|
||||
ms_pVehiclePool = new CVehiclePool(NUMVEHICLES, "Vehicles");
|
||||
CHECKMEM("after CVehiclePool");
|
||||
ms_pBuildingPool = new CBuildingPool(NUMBUILDINGS, "Buildings");
|
||||
CHECKMEM("after CBuildingPool");
|
||||
ms_pTreadablePool = new CTreadablePool(NUMTREADABLES, "Treadables");
|
||||
CHECKMEM("after CTreadablePool");
|
||||
ms_pObjectPool = new CObjectPool(NUMOBJECTS, "Objects");
|
||||
CHECKMEM("after CObjectPool");
|
||||
ms_pDummyPool = new CDummyPool(NUMDUMMIES, "Dummys");
|
||||
CHECKMEM("after CDummyPool");
|
||||
ms_pAudioScriptObjectPool = new CAudioScriptObjectPool(NUMAUDIOSCRIPTOBJECTS, "AudioScriptObj");
|
||||
CHECKMEM("after cAudioScriptObjectPool");
|
||||
ms_pColModelPool = new CColModelPool(NUMCOLMODELS, "ColModel");
|
||||
CHECKMEM("after pools");
|
||||
POP_MEMID();
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -21,6 +21,83 @@ CReferences::Init(void)
|
||||
aRefs[NUMREFERENCES-1].next = nil;
|
||||
}
|
||||
|
||||
void
|
||||
CEntity::RegisterReference(CEntity **pent)
|
||||
{
|
||||
if(IsBuilding())
|
||||
return;
|
||||
CReference *ref;
|
||||
// check if already registered
|
||||
for(ref = m_pFirstReference; ref; ref = ref->next)
|
||||
if(ref->pentity == pent)
|
||||
return;
|
||||
// have to allocate new reference
|
||||
ref = CReferences::pEmptyList;
|
||||
if(ref){
|
||||
CReferences::pEmptyList = ref->next;
|
||||
|
||||
ref->pentity = pent;
|
||||
ref->next = m_pFirstReference;
|
||||
m_pFirstReference = ref;
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Clean up the reference from *pent -> 'this'
|
||||
void
|
||||
CEntity::CleanUpOldReference(CEntity **pent)
|
||||
{
|
||||
CReference* ref, ** lastnextp;
|
||||
lastnextp = &m_pFirstReference;
|
||||
for (ref = m_pFirstReference; ref; ref = ref->next) {
|
||||
if (ref->pentity == pent) {
|
||||
*lastnextp = ref->next;
|
||||
ref->next = CReferences::pEmptyList;
|
||||
CReferences::pEmptyList = ref;
|
||||
break;
|
||||
}
|
||||
lastnextp = &ref->next;
|
||||
}
|
||||
}
|
||||
|
||||
// Clear all references to this entity
|
||||
void
|
||||
CEntity::ResolveReferences(void)
|
||||
{
|
||||
CReference *ref;
|
||||
// clear pointers to this entity
|
||||
for(ref = m_pFirstReference; ref; ref = ref->next)
|
||||
if(*ref->pentity == this)
|
||||
*ref->pentity = nil;
|
||||
// free list
|
||||
if(m_pFirstReference){
|
||||
for(ref = m_pFirstReference; ref->next; ref = ref->next)
|
||||
;
|
||||
ref->next = CReferences::pEmptyList;
|
||||
CReferences::pEmptyList = m_pFirstReference;
|
||||
m_pFirstReference = nil;
|
||||
}
|
||||
}
|
||||
|
||||
// Free all references that no longer point to this entity
|
||||
void
|
||||
CEntity::PruneReferences(void)
|
||||
{
|
||||
CReference *ref, *next, **lastnextp;
|
||||
lastnextp = &m_pFirstReference;
|
||||
for(ref = m_pFirstReference; ref; ref = next){
|
||||
next = ref->next;
|
||||
if(*ref->pentity == this)
|
||||
lastnextp = &ref->next;
|
||||
else{
|
||||
*lastnextp = ref->next;
|
||||
ref->next = CReferences::pEmptyList;
|
||||
CReferences::pEmptyList = ref;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CReferences::RemoveReferencesToPlayer(void)
|
||||
{
|
||||
|
||||
+694
-29
@@ -5,9 +5,21 @@
|
||||
#include "World.h"
|
||||
#include "Pad.h"
|
||||
#include "DMAudio.h"
|
||||
#include "main.h"
|
||||
#include "Font.h"
|
||||
#include "Frontend.h"
|
||||
#include "audio_enums.h"
|
||||
|
||||
#include <climits>
|
||||
|
||||
#ifdef USE_PRECISE_MEASUREMENT_CONVERTION
|
||||
#define MILES_IN_METER 0.000621371192f
|
||||
#define FEET_IN_METER 3.28084f
|
||||
#else
|
||||
#define MILES_IN_METER (1 / 1670.f)
|
||||
#define FEET_IN_METER 3.33f
|
||||
#endif
|
||||
|
||||
int32 CStats::SeagullsKilled;
|
||||
int32 CStats::BoatsExploded;
|
||||
int32 CStats::WantedStarsAttained;
|
||||
@@ -43,8 +55,8 @@ float CStats::GarbagePickups;
|
||||
float CStats::IceCreamSold;
|
||||
float CStats::TopShootingRangeScore;
|
||||
float CStats::ShootingRank;
|
||||
int32 CStats::ProgressMade;
|
||||
int32 CStats::TotalProgressInGame;
|
||||
float CStats::ProgressMade;
|
||||
float CStats::TotalProgressInGame;
|
||||
int32 CStats::CarsExploded;
|
||||
int32 CStats::PeopleKilledByPlayer;
|
||||
float CStats::MaximumJumpDistance;
|
||||
@@ -115,7 +127,7 @@ void CStats::Init()
|
||||
for (int i = 0; i < NUM_PEDTYPES; i++)
|
||||
PedsKilledOfThisType[i] = 0;
|
||||
HelisDestroyed = 0;
|
||||
ProgressMade = 0;
|
||||
ProgressMade = 0.0f;
|
||||
KgsOfExplosivesUsed = 0;
|
||||
BulletsThatHit = 0;
|
||||
TyresPopped = 0;
|
||||
@@ -346,27 +358,27 @@ wchar *CStats::FindCriminalRatingString()
|
||||
}
|
||||
|
||||
wchar *CStats::FindChaseString(float fMediaLevel) {
|
||||
if (fMediaLevel < 20.0f) return TheText.Get("MEDIA1");
|
||||
if (fMediaLevel < 50.0f) return TheText.Get("MEDIA2");
|
||||
if (fMediaLevel < 75.0f) return TheText.Get("MEDIA3");
|
||||
if (fMediaLevel < 100.0f) return TheText.Get("MEDIA4");
|
||||
if (fMediaLevel < 150.0f) return TheText.Get("MEDIA5");
|
||||
if (fMediaLevel < 200.0f) return TheText.Get("MEDIA6");
|
||||
if (fMediaLevel < 250.0f) return TheText.Get("MEDIA7");
|
||||
if (fMediaLevel < 300.0f) return TheText.Get("MEDIA8");
|
||||
if (fMediaLevel < 350.0f) return TheText.Get("MEDIA9");
|
||||
if (fMediaLevel < 400.0f) return TheText.Get("MEDIA10");
|
||||
if (fMediaLevel < 500.0f) return TheText.Get("MEDIA11");
|
||||
if (fMediaLevel < 600.0f) return TheText.Get("MEDIA12");
|
||||
if (fMediaLevel < 700.0f) return TheText.Get("MEDIA13");
|
||||
if (fMediaLevel < 800.0f) return TheText.Get("MEDIA14");
|
||||
if (fMediaLevel < 900.0f) return TheText.Get("MEDIA15");
|
||||
if (fMediaLevel < 1000.0f) return TheText.Get("MEDIA16");
|
||||
if (fMediaLevel < 1200.0f) return TheText.Get("MEDIA17");
|
||||
if (fMediaLevel < 1400.0f) return TheText.Get("MEDIA18");
|
||||
if (fMediaLevel < 1600.0f) return TheText.Get("MEDIA19");
|
||||
if (fMediaLevel < 1800.0f) return TheText.Get("MEDIA20");
|
||||
return TheText.Get("MEDIA21");
|
||||
if (fMediaLevel < 20.0f) return TheText.Get("CHASE1");
|
||||
if (fMediaLevel < 50.0f) return TheText.Get("CHASE2");
|
||||
if (fMediaLevel < 75.0f) return TheText.Get("CHASE3");
|
||||
if (fMediaLevel < 100.0f) return TheText.Get("CHASE4");
|
||||
if (fMediaLevel < 150.0f) return TheText.Get("CHASE5");
|
||||
if (fMediaLevel < 200.0f) return TheText.Get("CHASE6");
|
||||
if (fMediaLevel < 250.0f) return TheText.Get("CHASE7");
|
||||
if (fMediaLevel < 300.0f) return TheText.Get("CHASE8");
|
||||
if (fMediaLevel < 350.0f) return TheText.Get("CHASE9");
|
||||
if (fMediaLevel < 400.0f) return TheText.Get("CHASE10");
|
||||
if (fMediaLevel < 500.0f) return TheText.Get("CHASE11");
|
||||
if (fMediaLevel < 600.0f) return TheText.Get("CHASE12");
|
||||
if (fMediaLevel < 700.0f) return TheText.Get("CHASE13");
|
||||
if (fMediaLevel < 800.0f) return TheText.Get("CHASE14");
|
||||
if (fMediaLevel < 900.0f) return TheText.Get("CHASE15");
|
||||
if (fMediaLevel < 1000.0f) return TheText.Get("CHASE16");
|
||||
if (fMediaLevel < 1200.0f) return TheText.Get("CHASE17");
|
||||
if (fMediaLevel < 1400.0f) return TheText.Get("CHASE18");
|
||||
if (fMediaLevel < 1600.0f) return TheText.Get("CHASE19");
|
||||
if (fMediaLevel < 1800.0f) return TheText.Get("CHASE20");
|
||||
return TheText.Get("CHASE21");
|
||||
}
|
||||
|
||||
int32 CStats::FindCriminalRatingNumber()
|
||||
@@ -387,16 +399,16 @@ int32 CStats::FindCriminalRatingNumber()
|
||||
}
|
||||
|
||||
if (RoundsFiredByPlayer > 100)
|
||||
rating += (float)CStats::BulletsThatHit / (float)CStats::RoundsFiredByPlayer * 500.0f;
|
||||
rating += (float)BulletsThatHit / (float)RoundsFiredByPlayer * 500.0f;
|
||||
if (TotalProgressInGame)
|
||||
rating += (float)CStats::ProgressMade / (float)CStats::TotalProgressInGame * 1000.0f;
|
||||
rating += ProgressMade / TotalProgressInGame * 1000.0f;
|
||||
return rating;
|
||||
}
|
||||
|
||||
float CStats::GetPercentageProgress()
|
||||
{
|
||||
float percentCompleted = (CStats::TotalProgressInGame == 0 ? 0 :
|
||||
CStats::ProgressMade * 100.0f / (CGame::nastyGame ? CStats::TotalProgressInGame : CStats::TotalProgressInGame - 1.0f));
|
||||
float percentCompleted = (TotalProgressInGame == 0.f ? 0.f :
|
||||
100.0f * ProgressMade / (CGame::nastyGame ? TotalProgressInGame : TotalProgressInGame - 1.0f));
|
||||
|
||||
return Min(percentCompleted, 100.0f);
|
||||
}
|
||||
@@ -773,4 +785,657 @@ CStats::PopulateFavoriteRadioStationList()
|
||||
float* pListenTimeArray = DMAudio.GetListenTimeArray();
|
||||
for (int i = 0; i < NUM_RADIOS; i++)
|
||||
FavoriteRadioStationList[i] = pListenTimeArray[i];
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CStats::BuildStatLine(Const char *text, void *stat, int displayType, void *stat2, int isTime)
|
||||
{
|
||||
#define STAT_D *(int*)stat
|
||||
#define STAT_F *(float*)stat
|
||||
#define STAT2_D *(int*)stat2
|
||||
#define STAT2_F *(float*)stat2
|
||||
if (!text)
|
||||
return;
|
||||
|
||||
gString2[0] = '\0';
|
||||
if (isTime == 1) {
|
||||
if (*((int*)stat2) >= 10)
|
||||
sprintf(gString2, " %d:%d", STAT_D, STAT2_D);
|
||||
else
|
||||
sprintf(gString2, " %d:0%d", STAT_D, STAT2_D);
|
||||
|
||||
} else if (stat2) {
|
||||
#ifdef MORE_LANGUAGES
|
||||
if (CFont::IsJapanese()) {
|
||||
switch (displayType) {
|
||||
case 0:
|
||||
case 4:
|
||||
sprintf(gString2, " %d/%d", STAT_D, STAT2_D);
|
||||
break;
|
||||
case 1:
|
||||
sprintf(gString2, " %.2f/%.2f", STAT_F, STAT2_F);
|
||||
break;
|
||||
case 2:
|
||||
sprintf(gString2, " %d%%/%d%%", STAT_D, STAT2_D);
|
||||
break;
|
||||
case 3:
|
||||
sprintf(gString2, " $%.2f/$%.2f", STAT_F, STAT2_F);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
switch (displayType) {
|
||||
case 0:
|
||||
sprintf(gString2, " %d %s %d", STAT_D, UnicodeToAscii(TheText.Get("FEST_OO")), STAT2_D);
|
||||
break;
|
||||
case 1:
|
||||
sprintf(gString2, " %.2f %s %.2f", STAT_F, UnicodeToAscii(TheText.Get("FEST_OO")), STAT2_F);
|
||||
break;
|
||||
case 2:
|
||||
sprintf(gString2, " %d%% %s %d%%", STAT_D, UnicodeToAscii(TheText.Get("FEST_OO")), STAT2_D);
|
||||
break;
|
||||
case 3:
|
||||
sprintf(gString2, " $%.2f %s $%.2f", STAT_F, UnicodeToAscii(TheText.Get("FEST_OO")), STAT2_F);
|
||||
break;
|
||||
case 4:
|
||||
sprintf(gString2, " %d_ %s %d_", STAT_D, UnicodeToAscii(TheText.Get("FEST_OO")), STAT2_D);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (stat) {
|
||||
switch (displayType) {
|
||||
case 0:
|
||||
sprintf(gString2, "%d", STAT_D);
|
||||
break;
|
||||
case 1:
|
||||
sprintf(gString2, "%.2f", STAT_F);
|
||||
break;
|
||||
case 2:
|
||||
sprintf(gString2, "%d%%", STAT_D);
|
||||
break;
|
||||
case 3:
|
||||
sprintf(gString2, "$%.2f", STAT_F);
|
||||
break;
|
||||
case 4:
|
||||
#ifdef MORE_LANGUAGES
|
||||
if (CFont::IsJapanese())
|
||||
sprintf(gString2, "%d", STAT_D);
|
||||
else
|
||||
#endif
|
||||
sprintf(gString2, "%d_", STAT_D);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
UnicodeStrcpy(gUString, TheText.Get(text));
|
||||
CFont::FilterOutTokensFromString(gUString);
|
||||
AsciiToUnicode(gString2, gUString2);
|
||||
#undef STAT_D
|
||||
#undef STAT_F
|
||||
#undef STAT2_D
|
||||
#undef STAT2_F
|
||||
}
|
||||
|
||||
// rowIdx 99999 returns total numbers of rows. otherwise it returns 0.
|
||||
int
|
||||
CStats::ConstructStatLine(int rowIdx)
|
||||
{
|
||||
|
||||
#define STAT_LINE_1(varType, left, right1, type) \
|
||||
do { \
|
||||
if(counter == rowIdx){ \
|
||||
varType a = right1; \
|
||||
BuildStatLine(left, &a, type, nil, 0); \
|
||||
return 0; \
|
||||
} counter++; \
|
||||
} while(0)
|
||||
|
||||
#define STAT_LINE_2(varType, left, right1, type, right2, time) \
|
||||
do { \
|
||||
if(counter == rowIdx){ \
|
||||
varType a = right1; \
|
||||
varType b = right2; \
|
||||
BuildStatLine(left, &a, type, &b, time); \
|
||||
return 0; \
|
||||
} counter++; \
|
||||
} while(0)
|
||||
|
||||
#define TEXT_ON_LEFT_GXT(name) \
|
||||
do { \
|
||||
if(counter == rowIdx){ \
|
||||
BuildStatLine(name, nil, 0, nil, 0); \
|
||||
return 0; \
|
||||
} counter++; \
|
||||
} while(0)
|
||||
|
||||
#define TEXT_ON_RIGHT(text) \
|
||||
do { \
|
||||
if(counter == rowIdx){ \
|
||||
gUString[0] = '\0'; \
|
||||
UnicodeStrcpy(gUString2, text); \
|
||||
return 0; \
|
||||
} counter++; \
|
||||
} while(0)
|
||||
|
||||
#define FASTEST_TIME(id, str) \
|
||||
do { \
|
||||
if(FastestTimes[id]) { \
|
||||
if(counter == rowIdx){ \
|
||||
int hour = 0, minute; \
|
||||
for (int i = FastestTimes[id]; i > 59; i -= 60) hour++; \
|
||||
for (minute = FastestTimes[id]; minute > 59; minute -= 60); \
|
||||
if (minute < 0) minute = -minute; \
|
||||
BuildStatLine(str, &hour, 0, &minute, 1); \
|
||||
return 0; \
|
||||
} \
|
||||
counter++; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
switch (rowIdx) {
|
||||
case 0: {
|
||||
int percentCompleted = GetPercentageProgress();
|
||||
BuildStatLine("PER_COM", &percentCompleted, 2, nil, 0);
|
||||
return 0;
|
||||
}
|
||||
case 1: {
|
||||
BuildStatLine("NMISON", &MissionsGiven, 0, nil, 0);
|
||||
return 0;
|
||||
}
|
||||
case 2: {
|
||||
int hour = (CTimer::GetTimeInMilliseconds() / 60000) / 60;
|
||||
int minute = (CTimer::GetTimeInMilliseconds() / 60000) % 60;
|
||||
BuildStatLine("ST_TIME", &hour, 0, &minute, 1);
|
||||
return 0;
|
||||
}
|
||||
case 3: {
|
||||
BuildStatLine("DAYSPS", &DaysPassed, 0, nil, 0);
|
||||
return 0;
|
||||
}
|
||||
case 4: {
|
||||
BuildStatLine("NUMSHV", &SafeHouseVisits, 0, nil, 0);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
int counter = 5;
|
||||
|
||||
if (CGame::nastyGame) {
|
||||
STAT_LINE_2(int, "FEST_RP", NumberKillFrenziesPassed, 0, TotalNumberKillFrenzies, 0);
|
||||
}
|
||||
|
||||
CPlayerInfo &player = CWorld::Players[CWorld::PlayerInFocus];
|
||||
|
||||
// Hidden packages shouldn't be shown with percent
|
||||
#ifdef FIX_BUGS
|
||||
STAT_LINE_2(int, "PERPIC", player.m_nCollectedPackages, 0, player.m_nTotalPackages, 0);
|
||||
#else
|
||||
float fPackagesPercent = 0.0f;
|
||||
if (player.m_nTotalPackages != 0)
|
||||
fPackagesPercent = player.m_nCollectedPackages * 100.0f / player.m_nTotalPackages;
|
||||
|
||||
STAT_LINE_2(int, "PERPIC", fPackagesPercent, 0, 100, 0);
|
||||
#endif
|
||||
|
||||
if (CGame::nastyGame) {
|
||||
STAT_LINE_1(int, "PE_WAST", PeopleKilledByPlayer, 0);
|
||||
STAT_LINE_1(int, "PE_WSOT", PeopleKilledByOthers, 0);
|
||||
}
|
||||
STAT_LINE_1(int, "CAR_EXP", CarsExploded, 0);
|
||||
STAT_LINE_1(int, "BOA_EXP", BoatsExploded, 0);
|
||||
STAT_LINE_1(int, "HEL_DST", HelisDestroyed, 0);
|
||||
STAT_LINE_1(int, "TYREPOP", TyresPopped, 0);
|
||||
STAT_LINE_1(int, "ST_STAR", WantedStarsAttained, 0);
|
||||
STAT_LINE_1(int, "ST_STGN", WantedStarsEvaded, 0);
|
||||
STAT_LINE_1(int, "TM_BUST", TimesArrested, 0);
|
||||
STAT_LINE_1(int, "TM_DED", TimesDied, 0);
|
||||
|
||||
#ifdef MORE_LANGUAGES
|
||||
// JP version removed it altogether actually
|
||||
if (!CFont::IsJapanese())
|
||||
#endif
|
||||
STAT_LINE_1(int, "ST_HEAD", HeadsPopped, 0);
|
||||
|
||||
static uint32 lastProcessedDay = UINT32_MAX;
|
||||
static uint32 lastPoliceSpending = 0;
|
||||
|
||||
// What a random stat...
|
||||
if (lastProcessedDay != DaysPassed) {
|
||||
lastProcessedDay = DaysPassed;
|
||||
lastPoliceSpending = (CTimer::GetTimeInMilliseconds() & 255 + 80) * 255.44f;
|
||||
}
|
||||
STAT_LINE_1(float, "DAYPLC", lastPoliceSpending, 3);
|
||||
|
||||
int mostPatheticGang = 0;
|
||||
int mostKill = 0;
|
||||
for (int i = PEDTYPE_GANG1; i < PEDTYPE_GANG9; ++i) {
|
||||
if (CStats::PedsKilledOfThisType[i] > mostKill) {
|
||||
mostKill = CStats::PedsKilledOfThisType[i];
|
||||
mostPatheticGang = i;
|
||||
}
|
||||
}
|
||||
if (mostPatheticGang > 0) {
|
||||
TEXT_ON_LEFT_GXT("ST_GANG");
|
||||
|
||||
switch (mostPatheticGang) {
|
||||
case PEDTYPE_GANG1:
|
||||
TEXT_ON_RIGHT(TheText.Get("ST_GNG1"));
|
||||
break;
|
||||
case PEDTYPE_GANG2:
|
||||
TEXT_ON_RIGHT(TheText.Get("ST_GNG2"));
|
||||
break;
|
||||
case PEDTYPE_GANG3:
|
||||
TEXT_ON_RIGHT(TheText.Get("ST_GNG3"));
|
||||
break;
|
||||
case PEDTYPE_GANG4:
|
||||
TEXT_ON_RIGHT(TheText.Get("ST_GNG4"));
|
||||
break;
|
||||
case PEDTYPE_GANG5:
|
||||
TEXT_ON_RIGHT(TheText.Get("ST_GNG5"));
|
||||
break;
|
||||
case PEDTYPE_GANG6:
|
||||
TEXT_ON_RIGHT(TheText.Get("ST_GNG6"));
|
||||
break;
|
||||
case PEDTYPE_GANG7:
|
||||
TEXT_ON_RIGHT(TheText.Get("ST_GNG7"));
|
||||
break;
|
||||
case PEDTYPE_GANG8:
|
||||
TEXT_ON_RIGHT(TheText.Get("ST_GNG8"));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
STAT_LINE_1(int, "GNG_WST", PedsKilledOfThisType[PEDTYPE_GANG9] + PedsKilledOfThisType[PEDTYPE_GANG8]
|
||||
+ PedsKilledOfThisType[PEDTYPE_GANG7] + PedsKilledOfThisType[PEDTYPE_GANG6]
|
||||
+ PedsKilledOfThisType[PEDTYPE_GANG5] + PedsKilledOfThisType[PEDTYPE_GANG4]
|
||||
+ PedsKilledOfThisType[PEDTYPE_GANG3] + PedsKilledOfThisType[PEDTYPE_GANG2]
|
||||
+ PedsKilledOfThisType[PEDTYPE_GANG1], 0);
|
||||
|
||||
STAT_LINE_1(int, "DED_CRI", PedsKilledOfThisType[PEDTYPE_CRIMINAL], 0);
|
||||
STAT_LINE_1(int, "KGS_EXP", KgsOfExplosivesUsed, 0);
|
||||
STAT_LINE_1(int, "BUL_FIR", RoundsFiredByPlayer, 0);
|
||||
STAT_LINE_1(int, "BUL_HIT", BulletsThatHit, 0);
|
||||
;
|
||||
STAT_LINE_1(int, "ACCURA", RoundsFiredByPlayer == 0 ? 0 : (BulletsThatHit * 100.0f / (float)RoundsFiredByPlayer), 2);
|
||||
|
||||
switch (FrontEndMenuManager.m_PrefsLanguage) {
|
||||
case CMenuManager::LANGUAGE_AMERICAN:
|
||||
#ifndef USE_MEASUREMENTS_IN_METERS
|
||||
STAT_LINE_1(float, "FEST_DF", DistanceTravelledOnFoot * MILES_IN_METER, 1);
|
||||
STAT_LINE_1(float, "FEST_DC", DistanceTravelledByCar * MILES_IN_METER, 1);
|
||||
STAT_LINE_1(float, "DISTBIK", DistanceTravelledByBike * MILES_IN_METER, 1);
|
||||
STAT_LINE_1(float, "DISTBOA", DistanceTravelledByBoat * MILES_IN_METER, 1);
|
||||
STAT_LINE_1(float, "DISTGOL", DistanceTravelledByGolfCart * MILES_IN_METER, 1);
|
||||
STAT_LINE_1(float, "DISTHEL", DistanceTravelledByHelicoptor * MILES_IN_METER, 1);
|
||||
#ifdef FIX_BUGS
|
||||
STAT_LINE_1(float, "TOT_DIS", (DistanceTravelledOnFoot + DistanceTravelledByCar + DistanceTravelledByBoat + DistanceTravelledByBike
|
||||
+ DistanceTravelledByGolfCart + DistanceTravelledByHelicoptor + DistanceTravelledByPlane) * MILES_IN_METER, 1);
|
||||
STAT_LINE_1(float, "MXCARD", MaximumJumpDistance * FEET_IN_METER, 1);
|
||||
STAT_LINE_1(float, "MXCARJ", MaximumJumpHeight * FEET_IN_METER, 1);
|
||||
#else
|
||||
STAT_LINE_1(float, "TOT_DIS", (DistanceTravelledOnFoot + DistanceTravelledByCar + DistanceTravelledByBoat + DistanceTravelledByBike
|
||||
+ DistanceTravelledByGolfCart + DistanceTravelledByHelicoptor) * MILES_IN_METER, 1);
|
||||
#endif
|
||||
break;
|
||||
#endif
|
||||
case CMenuManager::LANGUAGE_FRENCH:
|
||||
case CMenuManager::LANGUAGE_GERMAN:
|
||||
case CMenuManager::LANGUAGE_ITALIAN:
|
||||
case CMenuManager::LANGUAGE_SPANISH:
|
||||
#ifdef MORE_LANGUAGES
|
||||
case CMenuManager::LANGUAGE_POLISH:
|
||||
case CMenuManager::LANGUAGE_RUSSIAN:
|
||||
case CMenuManager::LANGUAGE_JAPANESE:
|
||||
#endif
|
||||
STAT_LINE_1(float, "FESTDFM", DistanceTravelledOnFoot, 1);
|
||||
STAT_LINE_1(float, "FESTDCM", DistanceTravelledByCar, 1);
|
||||
STAT_LINE_1(float, "DISTBIM", DistanceTravelledByBike, 1);
|
||||
STAT_LINE_1(float, "DISTBOM", DistanceTravelledByBoat, 1);
|
||||
STAT_LINE_1(float, "DISTGOM", DistanceTravelledByGolfCart, 1);
|
||||
STAT_LINE_1(float, "DISTHEM", DistanceTravelledByHelicoptor, 1);
|
||||
#ifdef FIX_BUGS
|
||||
STAT_LINE_1(float, "TOTDISM", DistanceTravelledOnFoot + DistanceTravelledByCar + DistanceTravelledByBoat
|
||||
+ DistanceTravelledByBike + DistanceTravelledByGolfCart + DistanceTravelledByHelicoptor + DistanceTravelledByPlane, 1);
|
||||
STAT_LINE_1(float, "MXCARDM", MaximumJumpDistance, 1);
|
||||
STAT_LINE_1(float, "MXCARJM", MaximumJumpHeight, 1);
|
||||
#else
|
||||
STAT_LINE_1(float, "TOTDISM", DistanceTravelledOnFoot + DistanceTravelledByCar + DistanceTravelledByBoat
|
||||
+ DistanceTravelledByGolfCart + DistanceTravelledByHelicoptor, 1);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// They were selecting the unit according to language in III, but they deleted the feet code in VC. Weird
|
||||
#ifndef FIX_BUGS
|
||||
STAT_LINE_1(float, "MXCARDM", MaximumJumpDistance, 1);
|
||||
STAT_LINE_1(float, "MXCARJM", MaximumJumpHeight, 1);
|
||||
#endif
|
||||
STAT_LINE_1(int, "MXFLIP", MaximumJumpFlips, 0);
|
||||
STAT_LINE_2(int, "NOUNIF", NumberOfUniqueJumpsFound, 0, TotalNumberOfUniqueJumps, 0);
|
||||
STAT_LINE_1(int, "MXJUMP", MaximumJumpSpins, 4);
|
||||
|
||||
TEXT_ON_LEFT_GXT("BSTSTU");
|
||||
switch (BestStuntJump) {
|
||||
case 1:
|
||||
TEXT_ON_RIGHT(TheText.Get("INSTUN"));
|
||||
break;
|
||||
case 2:
|
||||
TEXT_ON_RIGHT(TheText.Get("PRINST"));
|
||||
break;
|
||||
case 3:
|
||||
TEXT_ON_RIGHT(TheText.Get("DBINST"));
|
||||
break;
|
||||
case 4:
|
||||
TEXT_ON_RIGHT(TheText.Get("DBPINS"));
|
||||
break;
|
||||
case 5:
|
||||
TEXT_ON_RIGHT(TheText.Get("TRINST"));
|
||||
break;
|
||||
case 6:
|
||||
TEXT_ON_RIGHT(TheText.Get("PRTRST"));
|
||||
break;
|
||||
case 7:
|
||||
TEXT_ON_RIGHT(TheText.Get("QUINST"));
|
||||
break;
|
||||
case 8:
|
||||
TEXT_ON_RIGHT(TheText.Get("PQUINS"));
|
||||
break;
|
||||
default:
|
||||
TEXT_ON_RIGHT(TheText.Get("NOSTUC"));
|
||||
break;
|
||||
}
|
||||
STAT_LINE_1(int, "ST_WHEE", LongestWheelie, 0);
|
||||
STAT_LINE_1(float, "ST_WHED", LongestWheelieDist, 1);
|
||||
STAT_LINE_1(int, "ST_STOP", LongestStoppie, 0);
|
||||
STAT_LINE_1(float, "ST_STOD", LongestStoppieDist, 1);
|
||||
STAT_LINE_1(int, "ST_2WHE", Longest2Wheel, 0);
|
||||
STAT_LINE_1(float, "ST_2WHD", Longest2WheelDist, 1);
|
||||
|
||||
if (LoanSharks > 0.0f)
|
||||
STAT_LINE_1(int, "ST_LOAN", LoanSharks, 0);
|
||||
|
||||
STAT_LINE_1(int, "FEST_CC", CriminalsCaught, 0);
|
||||
STAT_LINE_1(int, "FEST_HV", HighestLevelVigilanteMission, 0);
|
||||
STAT_LINE_1(int, "PASDRO", PassengersDroppedOffWithTaxi, 0);
|
||||
STAT_LINE_1(float, "MONTAX", MoneyMadeWithTaxi, 3);
|
||||
STAT_LINE_1(int, "FEST_LS", LivesSavedWithAmbulance, 0);
|
||||
STAT_LINE_1(int, "FEST_HA", HighestLevelAmbulanceMission, 0);
|
||||
STAT_LINE_1(int, "FEST_FE", FiresExtinguished, 0);
|
||||
STAT_LINE_1(int, "FIRELVL", HighestLevelFireMission, 0);
|
||||
|
||||
STAT_LINE_2(int, "ST_STOR", StoresKnockedOff, 0, 15, 0);
|
||||
|
||||
if (MovieStunts > 0.0f)
|
||||
STAT_LINE_1(int, "ST_MOVI", MovieStunts, 0);
|
||||
|
||||
STAT_LINE_2(int, "ST_ASSI", Assassinations, 0, 5, 0);
|
||||
|
||||
if (PhotosTaken > 0)
|
||||
STAT_LINE_1(int, "ST_PHOT", PhotosTaken, 0);
|
||||
|
||||
if (PizzasDelivered > 0.0f)
|
||||
STAT_LINE_1(int, "ST_PIZZ", PizzasDelivered, 0);
|
||||
|
||||
if (GarbagePickups > 0.0f)
|
||||
STAT_LINE_1(int, "ST_GARB", GarbagePickups, 0);
|
||||
|
||||
if (IceCreamSold > 0.0f)
|
||||
STAT_LINE_1(int, "ST_ICEC", IceCreamSold, 0);
|
||||
|
||||
if (HighestScores[1])
|
||||
STAT_LINE_1(int, "STHC_02", HighestScores[1], 0);
|
||||
|
||||
FASTEST_TIME(0, "STFT_01");
|
||||
FASTEST_TIME(1, "STFT_02");
|
||||
FASTEST_TIME(2, "STFT_03");
|
||||
FASTEST_TIME(3, "STFT_04");
|
||||
FASTEST_TIME(4, "STFT_05");
|
||||
FASTEST_TIME(5, "STFT_06");
|
||||
FASTEST_TIME(6, "STFT_07");
|
||||
FASTEST_TIME(7, "STFT_08");
|
||||
FASTEST_TIME(8, "STFT_09");
|
||||
FASTEST_TIME(9, "STFT_10");
|
||||
FASTEST_TIME(10, "STFT_11");
|
||||
FASTEST_TIME(11, "STFT_12");
|
||||
FASTEST_TIME(12, "STFT_13");
|
||||
FASTEST_TIME(13, "STFT_14");
|
||||
FASTEST_TIME(14, "STFT_15");
|
||||
FASTEST_TIME(15, "STFT_16");
|
||||
FASTEST_TIME(16, "STFT_17");
|
||||
FASTEST_TIME(17, "STFT_18");
|
||||
FASTEST_TIME(18, "STFT_19");
|
||||
FASTEST_TIME(19, "STFT_20");
|
||||
FASTEST_TIME(22, "STFT_23");
|
||||
|
||||
if (HighestScores[0])
|
||||
STAT_LINE_1(int, "STHC_01", HighestScores[0], 0);
|
||||
|
||||
if (HighestScores[3])
|
||||
STAT_LINE_1(int, "STHC_04", HighestScores[3], 0);
|
||||
|
||||
if (HighestScores[2])
|
||||
STAT_LINE_1(int, "STHC_03", HighestScores[2], 0);
|
||||
|
||||
if (BestPositions[0] != INT_MAX)
|
||||
STAT_LINE_1(int, "STHC_05", BestPositions[0], 0);
|
||||
|
||||
FASTEST_TIME(20, "STFT_21");
|
||||
|
||||
if (FastestTimes[21])
|
||||
STAT_LINE_1(float, "STFT_22", FastestTimes[21] / 1000, 1);
|
||||
|
||||
if (TopShootingRangeScore > 0.0f)
|
||||
STAT_LINE_1(int, "TOP_SHO", TopShootingRangeScore, 0);
|
||||
|
||||
if (ShootingRank > 0.0f)
|
||||
STAT_LINE_1(int, "SHO_RAN", ShootingRank, 0);
|
||||
|
||||
int flightMinute = (FlightTime / 60000) % 60;
|
||||
int flightHour = (FlightTime / 60000) / 60;
|
||||
STAT_LINE_2(int, "ST_FTIM", flightHour, 0, flightMinute, 1);
|
||||
|
||||
// We always have pilot rank if we flew more then 5 minutes
|
||||
#ifndef FIX_BUGS
|
||||
if (flightHour != 0)
|
||||
TEXT_ON_LEFT_GXT("ST_PRAN");
|
||||
#endif
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
#define FL_TIME_MORE_THAN(hour, minute) (flightHour > hour || (flightHour == hour && flightMinute >= minute))
|
||||
#else
|
||||
#define FL_TIME_MORE_THAN(hour, minute) (flightHour > hour || flightMinute >= minute)
|
||||
#endif
|
||||
|
||||
if (FL_TIME_MORE_THAN(0,5)) {
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
TEXT_ON_LEFT_GXT("ST_PRAN");
|
||||
#endif
|
||||
if (!FL_TIME_MORE_THAN(0,10)) TEXT_ON_RIGHT(TheText.Get("ST_PR01"));
|
||||
else if (!FL_TIME_MORE_THAN(0,20)) TEXT_ON_RIGHT(TheText.Get("ST_PR02"));
|
||||
else if (!FL_TIME_MORE_THAN(0,30)) TEXT_ON_RIGHT(TheText.Get("ST_PR03"));
|
||||
else if (!FL_TIME_MORE_THAN(1,0)) TEXT_ON_RIGHT(TheText.Get("ST_PR04"));
|
||||
else if (!FL_TIME_MORE_THAN(1,30)) TEXT_ON_RIGHT(TheText.Get("ST_PR05"));
|
||||
else if (!FL_TIME_MORE_THAN(2,0)) TEXT_ON_RIGHT(TheText.Get("ST_PR06"));
|
||||
else if (!FL_TIME_MORE_THAN(2,30)) TEXT_ON_RIGHT(TheText.Get("ST_PR07"));
|
||||
else if (!FL_TIME_MORE_THAN(3,0)) TEXT_ON_RIGHT(TheText.Get("ST_PR08"));
|
||||
else if (!FL_TIME_MORE_THAN(3,30)) TEXT_ON_RIGHT(TheText.Get("ST_PR09"));
|
||||
else if (!FL_TIME_MORE_THAN(4,0)) TEXT_ON_RIGHT(TheText.Get("ST_PR10"));
|
||||
else if (!FL_TIME_MORE_THAN(5,0)) TEXT_ON_RIGHT(TheText.Get("ST_PR11"));
|
||||
else if (!FL_TIME_MORE_THAN(10,0)) TEXT_ON_RIGHT(TheText.Get("ST_PR12"));
|
||||
else if (!FL_TIME_MORE_THAN(20,0)) TEXT_ON_RIGHT(TheText.Get("ST_PR13"));
|
||||
else if (!FL_TIME_MORE_THAN(25,0)) TEXT_ON_RIGHT(TheText.Get("ST_PR14"));
|
||||
else if (!FL_TIME_MORE_THAN(30,0)) TEXT_ON_RIGHT(TheText.Get("ST_PR15"));
|
||||
else if (!FL_TIME_MORE_THAN(49,2)) TEXT_ON_RIGHT(TheText.Get("ST_PR16"));
|
||||
else if (!FL_TIME_MORE_THAN(50,0)) TEXT_ON_RIGHT(TheText.Get("ST_PR17"));
|
||||
else if (!FL_TIME_MORE_THAN(100,0)) TEXT_ON_RIGHT(TheText.Get("ST_PR18"));
|
||||
else TEXT_ON_RIGHT(TheText.Get("ST_PR19"));
|
||||
}
|
||||
#undef FL_TIME_MORE_THAN
|
||||
|
||||
if (BloodRingKills > 0)
|
||||
STAT_LINE_1(int, "ST_BRK", BloodRingKills, 0);
|
||||
|
||||
if (BloodRingTime > 0)
|
||||
STAT_LINE_1(int, "ST_LTBR", BloodRingTime, 0);
|
||||
|
||||
STAT_LINE_1(int, "ST_DRWN", TimesDrowned, 0);
|
||||
|
||||
if (SeagullsKilled > 0)
|
||||
STAT_LINE_1(int, "SEAGULL", SeagullsKilled, 0);
|
||||
|
||||
bool playerHatesRadio = true;
|
||||
float* pListenTimeArray = DMAudio.GetListenTimeArray();
|
||||
for (int i = 0; i < NUM_RADIOS; i++) {
|
||||
FavoriteRadioStationList[i] = pListenTimeArray[i];
|
||||
if (FavoriteRadioStationList[i] != 0.0) // double
|
||||
playerHatesRadio = false;
|
||||
}
|
||||
|
||||
if (!playerHatesRadio) {
|
||||
// Most listened
|
||||
TEXT_ON_LEFT_GXT("FST_MFR");
|
||||
float mostListenTime = FavoriteRadioStationList[0];
|
||||
int mostListenedRadio = 0;
|
||||
for (int i = 0; i < NUM_RADIOS; i++) {
|
||||
if (FavoriteRadioStationList[i] > mostListenTime) {
|
||||
mostListenTime = FavoriteRadioStationList[i];
|
||||
mostListenedRadio = i;
|
||||
}
|
||||
}
|
||||
switch (mostListenedRadio) {
|
||||
case WILDSTYLE:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM0"));
|
||||
break;
|
||||
case FLASH_FM:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM1"));
|
||||
break;
|
||||
case KCHAT:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM2"));
|
||||
break;
|
||||
case FEVER:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM3"));
|
||||
break;
|
||||
case V_ROCK:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM4"));
|
||||
break;
|
||||
case VCPR:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM5"));
|
||||
break;
|
||||
case RADIO_ESPANTOSO:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM6"));
|
||||
break;
|
||||
case EMOTION:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM7"));
|
||||
break;
|
||||
case WAVE:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM8"));
|
||||
break;
|
||||
case USERTRACK:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_MP3"));
|
||||
break;
|
||||
default:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM8")); // heh
|
||||
break;
|
||||
}
|
||||
|
||||
// Least listened
|
||||
TEXT_ON_LEFT_GXT("FST_LFR");
|
||||
float leastListenTime = FavoriteRadioStationList[0];
|
||||
int leastListenedRadio = 0;
|
||||
for (int i = 0; i < NUM_RADIOS; i++) {
|
||||
#ifdef FIX_BUGS
|
||||
if (!DMAudio.IsMP3RadioChannelAvailable() && i == USERTRACK)
|
||||
continue;
|
||||
#endif
|
||||
if (FavoriteRadioStationList[i] < leastListenTime) {
|
||||
leastListenTime = FavoriteRadioStationList[i];
|
||||
leastListenedRadio = i;
|
||||
}
|
||||
}
|
||||
#ifndef FIX_BUGS
|
||||
if (!DMAudio.IsMP3RadioChannelAvailable() && leastListenedRadio == USERTRACK)
|
||||
leastListenedRadio = WAVE;
|
||||
#endif
|
||||
|
||||
switch (leastListenedRadio) {
|
||||
case WILDSTYLE:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM0"));
|
||||
break;
|
||||
case FLASH_FM:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM1"));
|
||||
break;
|
||||
case KCHAT:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM2"));
|
||||
break;
|
||||
case FEVER:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM3"));
|
||||
break;
|
||||
case V_ROCK:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM4"));
|
||||
break;
|
||||
case VCPR:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM5"));
|
||||
break;
|
||||
case RADIO_ESPANTOSO:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM6"));
|
||||
break;
|
||||
case EMOTION:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM7"));
|
||||
break;
|
||||
case WAVE:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM8"));
|
||||
break;
|
||||
case USERTRACK:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_MP3"));
|
||||
break;
|
||||
default:
|
||||
TEXT_ON_RIGHT(TheText.Get("FEA_FM8")); // heh
|
||||
break;
|
||||
}
|
||||
}
|
||||
STAT_LINE_1(int, "SPRAYIN", Sprayings, 0);
|
||||
STAT_LINE_1(float, "ST_WEAP", WeaponBudget, 3);
|
||||
STAT_LINE_1(float, "ST_FASH", FashionBudget, 3);
|
||||
STAT_LINE_1(float, "ST_PROP", PropertyBudget, 3);
|
||||
STAT_LINE_1(float, "ST_AUTO", AutoPaintingBudget, 3);
|
||||
STAT_LINE_1(float, "ST_DAMA", PropertyBudget, 3);
|
||||
|
||||
if (NumPropertyOwned > 0) {
|
||||
STAT_LINE_1(int, "PROPOWN", NumPropertyOwned, 0);
|
||||
if (PropertyOwned[0]) TEXT_ON_RIGHT(TheText.Get("STPR_1"));
|
||||
if (PropertyOwned[1]) TEXT_ON_RIGHT(TheText.Get("STPR_2"));
|
||||
if (PropertyOwned[2]) TEXT_ON_RIGHT(TheText.Get("STPR_3"));
|
||||
if (PropertyOwned[3]) TEXT_ON_RIGHT(TheText.Get("STPR_4"));
|
||||
if (PropertyOwned[4]) TEXT_ON_RIGHT(TheText.Get("STPR_5"));
|
||||
if (PropertyOwned[5]) TEXT_ON_RIGHT(TheText.Get("STPR_6"));
|
||||
if (PropertyOwned[6]) TEXT_ON_RIGHT(TheText.Get("STPR_7"));
|
||||
if (PropertyOwned[7]) TEXT_ON_RIGHT(TheText.Get("STPR_8"));
|
||||
if (PropertyOwned[8]) TEXT_ON_RIGHT(TheText.Get("STPR_9"));
|
||||
if (PropertyOwned[9]) TEXT_ON_RIGHT(TheText.Get("STPR_10"));
|
||||
if (PropertyOwned[10]) TEXT_ON_RIGHT(TheText.Get("STPR_11"));
|
||||
if (PropertyOwned[11]) TEXT_ON_RIGHT(TheText.Get("STPR_12"));
|
||||
if (PropertyOwned[12]) TEXT_ON_RIGHT(TheText.Get("STPR_13"));
|
||||
if (PropertyOwned[13]) TEXT_ON_RIGHT(TheText.Get("STPR_14"));
|
||||
if (PropertyOwned[14]) TEXT_ON_RIGHT(TheText.Get("STPR_15"));
|
||||
}
|
||||
STAT_LINE_1(int, "CHASE", HighestChaseValue, 0);
|
||||
TEXT_ON_RIGHT(FindChaseString(HighestChaseValue));
|
||||
|
||||
return counter;
|
||||
|
||||
#undef STAT_LINE_1
|
||||
#undef STAT_LINE_2
|
||||
#undef TEXT_ON_LEFT_GXT
|
||||
#undef TEXT_ON_RIGHT
|
||||
#undef FASTEST_TIME
|
||||
}
|
||||
|
||||
+4
-2
@@ -49,8 +49,8 @@ public:
|
||||
static int32 WantedStarsAttained;
|
||||
static int32 WantedStarsEvaded;
|
||||
static int32 PeopleKilledByPlayer;
|
||||
static int32 ProgressMade;
|
||||
static int32 TotalProgressInGame;
|
||||
static float ProgressMade;
|
||||
static float TotalProgressInGame;
|
||||
static float MaximumJumpDistance;
|
||||
static float MaximumJumpHeight;
|
||||
static int32 MaximumJumpFlips;
|
||||
@@ -147,4 +147,6 @@ public:
|
||||
static void AddPropertyAsOwned(int32);
|
||||
static void PopulateFavoriteRadioStationList();
|
||||
static float GetFavoriteRadioStationList(int32);
|
||||
static void BuildStatLine(Const char *, void *, int, void *, int);
|
||||
static int ConstructStatLine(int);
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user