diff --git a/README.md b/README.md index a07b2f11..5e020987 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ such that we have a working game at all times. Apparently you can download a binary of the latest version [here](https://ci.appveyor.com/api/projects/aap/re3/artifacts/bin%2FReleaseCI%2Fre3.dll?branch=master). +Re3 starts the script main_freeroam.scm by default. Make sure you copy it to your data directory. + # Strategy A good approach is to start at the fringes of the code base, @@ -43,6 +45,9 @@ CCollision CCullZones CTheZones CPathFind +CCam +CParticle +CParticleMgr ``` # Low hanging fruit diff --git a/gamefiles/main_d.scm b/gamefiles/main_d.scm new file mode 100644 index 00000000..7b46ca39 Binary files /dev/null and b/gamefiles/main_d.scm differ diff --git a/gamefiles/main_freeroam.scm b/gamefiles/main_freeroam.scm new file mode 100644 index 00000000..021b5c25 Binary files /dev/null and b/gamefiles/main_freeroam.scm differ diff --git a/src/General.h b/src/General.h index d67b1ff0..aa52bf4d 100644 --- a/src/General.h +++ b/src/General.h @@ -1,5 +1,4 @@ - - +#pragma once class CGeneral { @@ -46,8 +45,8 @@ public: { return myrand() & 0xFFFF; } // Probably don't want to ever reach high static float GetRandomNumberInRange(float low, float high) - { return low + (high - low)*(GetRandomNumber()/float(MY_RAND_MAX + 1)); } + { return low + (high - low)*(GetRandomNumber()/65536.0f); } static Int32 GetRandomNumberInRange(Int32 low, Int32 high) - { return low + (high - low)*(GetRandomNumber()/float(MY_RAND_MAX + 1)); } + { return low + (high - low)*(GetRandomNumber()/65536.0f); } }; diff --git a/src/RecordDataForChase.cpp b/src/RecordDataForChase.cpp deleted file mode 100644 index 6bff623e..00000000 --- a/src/RecordDataForChase.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "common.h" -#include "RecordDataForChase.h" - - -UInt8 &CRecordDataForChase::Status = *(UInt8*)0x95CDCE; \ No newline at end of file diff --git a/src/RecordDataForChase.h b/src/RecordDataForChase.h deleted file mode 100644 index 0dc72bed..00000000 --- a/src/RecordDataForChase.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -class CRecordDataForChase -{ -public: - static UInt8 &Status; -}; \ No newline at end of file diff --git a/src/RecordDataForGame.cpp b/src/RecordDataForGame.cpp deleted file mode 100644 index 05b4223c..00000000 --- a/src/RecordDataForGame.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "common.h" -#include "RecordDataForGame.h" - -UInt16 &CRecordDataForGame::RecordingState = *(UInt16 *)0x95CC24; \ No newline at end of file diff --git a/src/Timer.cpp b/src/Timer.cpp index 02dbf55a..35e569ac 100644 --- a/src/Timer.cpp +++ b/src/Timer.cpp @@ -1,10 +1,9 @@ +#include #include "common.h" #include "patcher.h" #include "DMAudio.h" +#include "Record.h" #include "Timer.h" -#include "RecordDataForGame.h" -#include "RecordDataForChase.h" -#include uint32 &CTimer::m_snTimeInMilliseconds = *(uint32*)0x885B48; uint32 &CTimer::m_snTimeInMillisecondsPauseMode = *(uint32*)0x5F7614; @@ -229,4 +228,3 @@ STARTPATCHES InjectHook(0x4AD4A0, CTimer::EndUserPause, PATCH_JUMP); ENDPATCHES #endif - diff --git a/src/common.h b/src/common.h index 89c031fe..34214d42 100644 --- a/src/common.h +++ b/src/common.h @@ -18,32 +18,29 @@ #define rwVENDORID_ROCKSTAR 0x0253F2 -typedef uint8_t uint8; -typedef int8_t int8; -typedef uint16_t uint16; -typedef int16_t int16; -typedef uint32_t uint32; -typedef int32_t int32; +// Get rid of bullshit windows definitions, we're not running on an 8086 +#ifdef far +#undef far +#endif +#ifdef near +#undef near +#endif + +typedef uint8_t uint8, UInt8; +typedef int8_t int8, Int8; +typedef uint16_t uint16, UInt16; +typedef int16_t int16, Int16; +typedef uint32_t uint32, UInt32; +typedef int32_t int32, Int32; typedef uintptr_t uintptr; +typedef uint64_t uint64, UInt64; +typedef int64_t int64, Int64; -typedef char Int8; -typedef unsigned char UInt8; -typedef signed char SInt8; -typedef short Int16; -typedef unsigned short UInt16; -typedef signed short SInt16; -typedef int Int32; -typedef unsigned int UInt32; -typedef signed int SInt32; -typedef float Float; -typedef double Double; -typedef Int8 Bool; //typedef bool Bool; +typedef float Float; +typedef double Double; +typedef bool Bool; typedef char Char; -typedef __int64 Int64; -typedef unsigned __int64 UInt64; -typedef signed __int64 SInt64; - #define nil NULL #include "config.h" @@ -85,10 +82,10 @@ extern RsGlobalType &RsGlobal; #define DEFAULT_SCREEN_HEIGHT (448) #define SCREEN_WIDTH Float(RsGlobal.width) #define SCREEN_HEIGHT Float(RsGlobal.height) -#define SCREEN_STRETCH_X(a) Float( a * ( SCREEN_WIDTH / Float(DEFAULT_SCREEN_WIDTH) ) ) -#define SCREEN_STRETCH_Y(a) Float( a * ( SCREEN_HEIGHT / Float(DEFAULT_SCREEN_HEIGHT) ) ) -#define SCREEN_FROM_RIGHT(a) Float( SCREEN_WIDTH - SCREEN_STRETCH_X(a) ) -#define SCREEN_FROM_BOTTOM(a) Float( SCREEN_HEIGHT - SCREEN_STRETCH_Y(a) ) +#define SCREEN_STRETCH_X(a) Float((a) * (SCREEN_WIDTH / Float(DEFAULT_SCREEN_WIDTH))) +#define SCREEN_STRETCH_Y(a) Float((a) * (SCREEN_HEIGHT / Float(DEFAULT_SCREEN_HEIGHT))) +#define SCREEN_FROM_RIGHT(a) Float(SCREEN_WIDTH - SCREEN_STRETCH_X(a)) +#define SCREEN_FROM_BOTTOM(a) Float(SCREEN_HEIGHT - SCREEN_STRETCH_Y(a)) char *GetUserDirectory(void); @@ -120,41 +117,29 @@ public: CRGBA(void) { } CRGBA(uint8 r, uint8 g, uint8 b, uint8 a) : r(r), g(g), b(b), a(a) { } #ifdef RWCORE_H - operator RwRGBA &(void) - { + operator RwRGBA &(void) { return rwRGBA; } - operator RwRGBA *(void) - { + operator RwRGBA *(void) { return &rwRGBA; } - operator RwRGBA (void) const - { + operator RwRGBA (void) const { return rwRGBA; } #endif }; -// inline float clamp(float v, float min, float max){ return vmax ? max : v; } +#define clamp(v, low, high) ((v)<(low) ? (low) : (v)>(high) ? (high) : (v)) -inline float -sq(float x) { return x*x; } - -#define SQR(x) ( x * x ) +inline float sq(float x) { return x*x; } +#define SQR(x) ((x) * (x)) #define PI M_PI #define DEGTORAD(x) ((x) * PI / 180.0f) #define RADTODEG(x) ((x) * 180.0f / PI) - -#if USE_PS2_RAND == TRUE -#define MY_RAND_MAX 65535 -#else -#define MY_RAND_MAX 32767 -#endif - int myrand(void); void mysrand(unsigned int seed); @@ -167,10 +152,6 @@ void mysrand(unsigned int seed); #define VALIDATE_SIZE(struc, size) static_assert(sizeof(struc) == size, "Invalid structure size of " #struc) #define VALIDATE_OFFSET(struc, member, offset) static_assert(offsetof(struc, member) == offset, "The offset of " #member " in " #struc " is not " #offset "...") -#define clamp(v, a, b) (max(min(v, b), a)) -//#define min(a, b) ((a) < (b) ? (a) : (b)) -//#define max(a, b) ((a) > (b) ? (a) : (b)) - -#define PERCENT(x, p) ( ( Float(x) * ( Float(p) / 100.0f ) ) ) +#define PERCENT(x, p) ((Float(x) * (Float(p) / 100.0f))) #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) -#define BIT(num) (1<<(num)) \ No newline at end of file +#define BIT(num) (1<<(num)) diff --git a/src/config.h b/src/config.h index 8637814d..ccd81023 100644 --- a/src/config.h +++ b/src/config.h @@ -1,5 +1,4 @@ -#ifndef _CONFIG_H_ -#define _CONFIG_H_ +#pragma once enum Config { NUMCDIMAGES = 50, // was 12 @@ -52,7 +51,3 @@ enum Config { NUMWEATHERS = 4, NUMHOURS = 24, }; - -#define USE_PS2_RAND TRUE - -#endif diff --git a/src/control/Record.cpp b/src/control/Record.cpp new file mode 100644 index 00000000..8949da5e --- /dev/null +++ b/src/control/Record.cpp @@ -0,0 +1,6 @@ +#include "common.h" +#include "Record.h" + +UInt16 &CRecordDataForGame::RecordingState = *(UInt16*)0x95CC24; + +UInt8 &CRecordDataForChase::Status = *(UInt8*)0x95CDCE; diff --git a/src/RecordDataForGame.h b/src/control/Record.h similarity index 55% rename from src/RecordDataForGame.h rename to src/control/Record.h index 5d007ce5..97a9663d 100644 --- a/src/RecordDataForGame.h +++ b/src/control/Record.h @@ -4,4 +4,10 @@ class CRecordDataForGame { public: static UInt16 &RecordingState; -}; \ No newline at end of file +}; + +class CRecordDataForChase +{ +public: + static UInt8 &Status; +}; diff --git a/src/main.cpp b/src/main.cpp index 853308a1..955b33ed 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,37 +24,22 @@ void operator delete(void *ptr) noexcept { gtadelete(ptr); } unsigned __int64 myrand_seed = 1; - -int _cwrand() // original codewarrior rand -{ - return ((int (__cdecl *)())0x5A41D0)(); -} - int myps2rand(void) { - return _cwrand(); myrand_seed = 0x5851F42D4C957F2D * myrand_seed + 1; return ((myrand_seed >> 32) & 0x7FFFFFFF); } int myrand(void) { -#if USE_PS2_RAND == TRUE return myps2rand(); -#else - return _cwrand(); -#endif } void mysrand(unsigned int seed) { -#if USE_PS2_RAND == TRUE myrand_seed = seed; -#else - ; -#endif } // platform stuff diff --git a/src/math/Vector.cpp b/src/math/Vector.cpp deleted file mode 100644 index d9cc590f..00000000 --- a/src/math/Vector.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "common.h" -#include "Vector.h" - -void CVector::Normalise() -{ - float sq = MagnitudeSqr(); - if(sq > 0.0f){ - float invsqrt = 1.0f/sqrt(sq); // CMaths::RecipSqrt - x *= invsqrt; - y *= invsqrt; - z *= invsqrt; - }else - x = 1.0f; -} - -// operator + -CVector operator + (CVector const &refLeft, CVector const &refRight) -{ - return CVector(refLeft.x + refRight.x, refLeft.y + refRight.y, refLeft.z + refRight.z); -} - -CVector operator + (CVector const &refLeft, float fRight) -{ - return CVector(refLeft.x + fRight, refLeft.y + fRight, refLeft.z + fRight); -} - -CVector operator + (float fLeft, CVector const &refRight) -{ - return CVector(fLeft + refRight.x, fLeft + refRight.y, fLeft + refRight.z); -} - -// operator - -CVector operator - (CVector const &refLeft, CVector const &refRight) -{ - return CVector(refLeft.x - refRight.x, refLeft.y - refRight.y, refLeft.z - refRight.z); -} - -CVector operator - (CVector const &refLeft, float fRight) -{ - return CVector(refLeft.x - fRight, refLeft.y - fRight, refLeft.z - fRight); -} - -CVector operator - (float fLeft, CVector const &refRight) -{ - return CVector(fLeft - refRight.x, fLeft - refRight.y, fLeft - refRight.z); -} - -// operator * -CVector operator * (CVector const &refLeft, CVector const &refRight) -{ - return CVector(refLeft.x * refRight.x, refLeft.y * refRight.y, refLeft.z * refRight.z); -} - -CVector operator * (CVector const &refLeft, float fRight) -{ - return CVector(refLeft.x * fRight, refLeft.y * fRight, refLeft.z * fRight); -} - -CVector operator * (float fLeft, CVector const &refRight) -{ - return CVector(fLeft * refRight.x, fLeft * refRight.y, fLeft * refRight.z); -} - -// operator / -CVector operator / (CVector const &refLeft, CVector const &refRight) -{ - return CVector(refLeft.x / refRight.x, refLeft.y / refRight.y, refLeft.z / refRight.z); -} - -CVector operator / (CVector const &refLeft, float fRight) -{ - return CVector(refLeft.x / fRight, refLeft.y / fRight, refLeft.z / fRight); -} - -CVector operator / (float fLeft, CVector const &refRight) -{ - return CVector(fLeft / refRight.x, fLeft / refRight.y, fLeft / refRight.z); -} \ No newline at end of file diff --git a/src/math/Vector.h b/src/math/Vector.h index e45906c8..3dba07ca 100644 --- a/src/math/Vector.h +++ b/src/math/Vector.h @@ -6,128 +6,71 @@ public: float x, y, z; CVector(void) {} CVector(float x, float y, float z) : x(x), y(y), z(z) {} -// CVector(CVector &refVector) : x(refVector.x), y(refVector.y), z(refVector.z) { } -// CVector(const CVector &refVector) : x(refVector.x), y(refVector.y), z(refVector.z) {} -// CVector(CVector2D &refVector, float _z = 0.0f) : x(refVector.x), y(refVector.y), z(_z) {} #ifdef RWCORE_H - CVector(RwV3d const &v) : x(v.x), y(v.y), z(v.z) {} + CVector(const RwV3d &v) : x(v.x), y(v.y), z(v.z) {} operator RwV3d (void) const { RwV3d vecRw = { this->x, this->y, this->z }; return vecRw; } - operator RwV3d *(void) - { - return (RwV3d *)this; + operator RwV3d *(void) { + return (RwV3d*)this; } - operator RwV3d &(void) - { - return *((RwV3d *)this); + operator RwV3d &(void) { + return *((RwV3d*)this); } #endif float Magnitude(void) const { return sqrt(x*x + y*y + z*z); } float MagnitudeSqr(void) const { return x*x + y*y + z*z; } float Magnitude2D(void) const { return sqrt(x*x + y*y); } - void Normalise(void); + void Normalise(void) { + float sq = MagnitudeSqr(); + if(sq > 0.0f){ + float invsqrt = 1.0f/sqrt(sq); // CMaths::RecipSqrt + x *= invsqrt; + y *= invsqrt; + z *= invsqrt; + }else + x = 1.0f; + } + inline const CVector &operator+=(CVector const &right) { + x += right.x; + y += right.y; + z += right.z; + return *this; + } - // operator = - inline CVector const& operator = (CVector const &refRight) - { - x = refRight.x; - y = refRight.y; - z = refRight.z; + inline const CVector &operator-=(CVector const &right) { + x -= right.x; + y -= right.y; + z -= right.z; return *this; } - - inline CVector const& operator = (float fRight) - { - x = fRight; - y = fRight; - z = fRight; + + inline const CVector &operator*=(float right) { + x *= right; + y *= right; + z *= right; return *this; } - - // operator += - inline CVector const& operator += (CVector const &refRight) - { - x += refRight.x; - y += refRight.y; - z += refRight.z; + + inline const CVector &operator/=(float right) { + x /= right; + y /= right; + z /= right; return *this; } - - inline CVector const& operator += (float fRight) - { - x += fRight; - y += fRight; - z += fRight; - return *this; + + inline CVector operator-() const { + return CVector(-x, -y, -z); } - - // operator -= - inline CVector const& operator -= (CVector const &refRight) - { - x -= refRight.x; - y -= refRight.y; - z -= refRight.z; - return *this; - } - - inline CVector const& operator -= (float fRight) - { - x -= fRight; - y -= fRight; - z -= fRight; - return *this; - } - - // operator *= - inline CVector const& operator *= (CVector const &refRight) - { - x *= refRight.x; - y *= refRight.y; - z *= refRight.z; - return *this; - } - - inline CVector const& operator *= (float fRight) - { - x *= fRight; - y *= fRight; - z *= fRight; - return *this; - } - - // operator /= - inline CVector const& operator /= (CVector const &refRight) - { - x /= refRight.x; - y /= refRight.y; - z /= refRight.z; - return *this; - } - - inline CVector const& operator /= (float fRight) - { - x /= fRight; - y /= fRight; - z /= fRight; - return *this; - } - - inline CVector operator - () const - { - return CVector(-x, -y, -z); - } - + bool IsZero(void) { return x == 0.0f && y == 0.0f && z == 0.0f; } }; -//extern CVector operator*(CMatrix const& matrix, CVector const& vector); - inline float DotProduct(const CVector &v1, const CVector &v2) { @@ -143,22 +86,22 @@ CrossProduct(const CVector &v1, const CVector &v2) v1.x*v2.y - v1.y*v2.x); } -// operator + -extern CVector operator + (CVector const &refLeft, CVector const &refRight); -extern CVector operator + (CVector const &refLeft, float fRight); -extern CVector operator + (float fLeft, CVector const &refRight); +inline CVector operator+(const CVector &left, const CVector &right) +{ + return CVector(left.x + right.x, left.y + right.y, left.z + right.z); +} -// operator - -extern CVector operator - (CVector const &refLeft, CVector const &refRight); -extern CVector operator - (CVector const &refLeft, float fRight); -extern CVector operator - (float fLeft, CVector const &refRight); - -// operator * -extern CVector operator * (CVector const &refLeft, CVector const &refRight); -extern CVector operator * (CVector const &refLeft, float fRight); -extern CVector operator * (float fLeft, CVector const &refRight); - -// operator / -extern CVector operator / (CVector const &refLeft, CVector const &refRight); -extern CVector operator / (CVector const &refLeft, float fRight); -extern CVector operator / (float fLeft, CVector const &refRight); \ No newline at end of file +inline CVector operator-(const CVector &left, const CVector &right) +{ + return CVector(left.x - right.x, left.y - right.y, left.z - right.z); +} + +inline CVector operator*(const CVector &left, float right) +{ + return CVector(left.x * right, left.y * right, left.z * right); +} + +inline CVector operator/(const CVector &left, float right) +{ + return CVector(left.x / right, left.y / right, left.z / right); +} diff --git a/src/render/Particle.cpp b/src/render/Particle.cpp index aade3578..18ea4c6c 100644 --- a/src/render/Particle.cpp +++ b/src/render/Particle.cpp @@ -1229,7 +1229,9 @@ void CParticle::Update() moveStep.z = point.point.z; if ( psystem->m_Type == PARTICLE_DEBRIS2 ) { - particle->m_vecVelocity *= CVector(0.8f, 0.8f, -0.4f); + particle->m_vecVelocity.x *= 0.8f; + particle->m_vecVelocity.y *= 0.8f; + particle->m_vecVelocity.z *= -0.4f; if ( particle->m_vecVelocity.z < 0.005f ) particle->m_vecVelocity.z = 0.0f; } diff --git a/src/ParticleMgr.cpp b/src/render/ParticleMgr.cpp similarity index 100% rename from src/ParticleMgr.cpp rename to src/render/ParticleMgr.cpp diff --git a/src/ParticleMgr.h b/src/render/ParticleMgr.h similarity index 100% rename from src/ParticleMgr.h rename to src/render/ParticleMgr.h diff --git a/src/render/Sprite.cpp b/src/render/Sprite.cpp index 509564ac..900b4dba 100644 --- a/src/render/Sprite.cpp +++ b/src/render/Sprite.cpp @@ -4,12 +4,6 @@ #include "Camera.h" #include "Sprite.h" -// Get rid of bullshit windows definitions, we're not running on an 8086 -#ifdef far -#undef far -#undef near -#endif - float &CSprite::m_f2DNearScreenZ = *(float*)0x8F1ABC; float &CSprite::m_f2DFarScreenZ = *(float*)0x8F2C94; float &CSprite::m_fRecipNearClipPlane = *(float*)0x8F5FFC; diff --git a/src/render/Sprite2d.cpp b/src/render/Sprite2d.cpp index 2311a75e..ff6cd0db 100644 --- a/src/render/Sprite2d.cpp +++ b/src/render/Sprite2d.cpp @@ -4,12 +4,6 @@ #include "Camera.h" #include "Sprite2d.h" -// Get rid of bullshit windows definitions, we're not running on an 8086 -#ifdef far -#undef far -#undef near -#endif - RwIm2DVertex *CSprite2d::maVertices = (RwIm2DVertex*)0x6E9168; float &CSprite2d::RecipNearClip = *(float*)0x880DB4; int32 &CSprite2d::mCurrentBank = *(int32*)0x8F1AF4; @@ -18,7 +12,6 @@ int32 *CSprite2d::mCurrentSprite = (int32*)0x6F4500; int32 *CSprite2d::mBankStart = (int32*)0x774BE8; RwIm2DVertex *CSprite2d::maBankVertices = (RwIm2DVertex*)0x8429F8; - void CSprite2d::SetRecipNearClip(void) {