From 38ceb6ad5765f9ecc765d6018b31da0a48fea15b Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 2 Jun 2025 22:02:16 -0700 Subject: [PATCH 01/70] Start cleaning up palette code --- Fitd/fitd.cpp | 8 ++--- FitdLib/AITD1_Tatou.cpp | 23 +++++++++------ FitdLib/AITD2.cpp | 12 ++++---- FitdLib/JACK.cpp | 3 +- FitdLib/common.h | 25 ++++++++-------- FitdLib/input.cpp | 32 ++++++++++---------- FitdLib/life.cpp | 8 ++--- FitdLib/main.cpp | 14 +++++---- FitdLib/osystem.h | 9 ++---- FitdLib/palette.cpp | 63 ++++++++++++++++++++++++++++++++++++++++ FitdLib/palette.h | 12 ++++++++ FitdLib/rendererBGFX.cpp | 10 +++++-- FitdLib/sequence.cpp | 26 ++--------------- FitdLib/sequence.h | 2 -- FitdLib/tatou.cpp | 52 ++------------------------------- FitdLib/tatou.h | 8 ++--- FitdLib/vars.cpp | 2 +- FitdLib/vars.h | 2 -- 18 files changed, 163 insertions(+), 148 deletions(-) create mode 100644 FitdLib/palette.cpp create mode 100644 FitdLib/palette.h diff --git a/Fitd/fitd.cpp b/Fitd/fitd.cpp index 3eaff39..76a82e4 100644 --- a/Fitd/fitd.cpp +++ b/Fitd/fitd.cpp @@ -1,12 +1,12 @@ extern "C" { int FitdMain(int argc, char* argv[]); -} - +} + int FitdInit(int argc, char* argv[]); int main(int argc, char* argv[]) -{ +{ FitdInit(argc, argv); FitdMain(argc, argv); return 0; -} +} diff --git a/FitdLib/AITD1_Tatou.cpp b/FitdLib/AITD1_Tatou.cpp index 6d08c5a..80937f0 100644 --- a/FitdLib/AITD1_Tatou.cpp +++ b/FitdLib/AITD1_Tatou.cpp @@ -16,17 +16,18 @@ int make3dTatou(void) { char* tatou2d; char* tatou3d; - unsigned char* tatouPal; int time; int deltaTime; int rotation; int unk1; - unsigned char paletteBackup[768]; unsigned int localChrono; + palette_t tatouPal; + palette_t paletteBackup; tatou2d = CheckLoadMallocPak("ITD_RESS",AITD1_TATOU_MCG); tatou3d = CheckLoadMallocPak("ITD_RESS",AITD1_TATOU_3DO); - tatouPal = (unsigned char*)CheckLoadMallocPak("ITD_RESS",AITD1_TATOU_PAL); + char* tatouPalRaw = CheckLoadMallocPak("ITD_RESS",AITD1_TATOU_PAL); + copyPalette(tatouPalRaw, tatouPal); time = 8920; deltaTime = 50; @@ -58,15 +59,18 @@ int make3dTatou(void) //timeGlobal++; timer = timeGlobal; - if(evalChrono(&localChrono)<=180) // avant eclair + if(evalChrono(&localChrono)<=180) { + // before lightning strike if(key || Click) { break; } } - else // eclair + else { + // lightning strike + /* LastSample = -1; LastPriority = -1; */ @@ -95,8 +99,10 @@ int make3dTatou(void) osystem_CopyBlockPhys((unsigned char*)frontBuffer,0,0,320,200); - while(key==0 && Click == 0 && JoyD == 0) // boucle de rotation du tatou + while(key==0 && Click == 0 && JoyD == 0) { + // Armadillo rotation loop + process_events(); time+=deltaTime-25; @@ -121,7 +127,6 @@ int make3dTatou(void) } }while(1); - free(tatouPal); free(tatou3d); free(tatou2d); @@ -133,13 +138,13 @@ int make3dTatou(void) } FadeOutPhys(32,0); - copyPalette((unsigned char*)paletteBackup,currentGamePalette); + copyPalette(paletteBackup,currentGamePalette); return(1); } else { FadeOutPhys(16,0); - copyPalette((unsigned char*)paletteBackup,currentGamePalette); + copyPalette(paletteBackup,currentGamePalette); return(0); } diff --git a/FitdLib/AITD2.cpp b/FitdLib/AITD2.cpp index adeadf5..950ab24 100644 --- a/FitdLib/AITD2.cpp +++ b/FitdLib/AITD2.cpp @@ -291,8 +291,8 @@ void AITD2_ReadBook(int index, int type) case 0: // READ_MESSAGE { LoadPak("ITD_RESS", AITD2_LETTRE, aux); - unsigned char lpalette[0x300]; - copyPalette((unsigned char*)aux+64000,lpalette); + palette_t lpalette; + copyPalette(aux+64000,lpalette); convertPaletteIfRequired(lpalette); copyPalette(lpalette,currentGamePalette); setPalette(lpalette); @@ -304,8 +304,8 @@ void AITD2_ReadBook(int index, int type) case 1: // READ_BOOK { LoadPak("ITD_RESS", AITD2_LIVRE, aux); - unsigned char lpalette[0x300]; - copyPalette((unsigned char*)aux+64000,lpalette); + palette_t lpalette; + copyPalette(aux+64000,lpalette); convertPaletteIfRequired(lpalette); copyPalette(lpalette,currentGamePalette); setPalette(lpalette); @@ -317,8 +317,8 @@ void AITD2_ReadBook(int index, int type) case 2: // READ_CARNET { LoadPak("ITD_RESS", AITD2_CARNET, aux); - unsigned char lpalette[0x300]; - copyPalette((unsigned char*)aux+64000,lpalette); + palette_t lpalette; + copyPalette(aux+64000,lpalette); convertPaletteIfRequired(lpalette); copyPalette(lpalette,currentGamePalette); setPalette(lpalette); diff --git a/FitdLib/JACK.cpp b/FitdLib/JACK.cpp index 580c805..d8c75e1 100644 --- a/FitdLib/JACK.cpp +++ b/FitdLib/JACK.cpp @@ -20,7 +20,8 @@ void JACK_ReadBook(int index, int type) { unsigned char* pImage = (unsigned char*)loadPak("ITD_RESS", JACK_LIVRE); memcpy(aux, pImage, 320*200); - unsigned char* lpalette = pImage+320*200; + palette_t lpalette; + copyPalette(aux + 64000, lpalette); convertPaletteIfRequired(lpalette); copyPalette(lpalette,currentGamePalette); setPalette(lpalette); diff --git a/FitdLib/common.h b/FitdLib/common.h index 57ca483..fe05147 100644 --- a/FitdLib/common.h +++ b/FitdLib/common.h @@ -87,7 +87,7 @@ int getCVarsIdx(int); ////////////////// - + #if !AITD_UE4 typedef unsigned char uint8; typedef unsigned short uint16; @@ -98,7 +98,7 @@ typedef unsigned int uint; typedef signed char int8; typedef signed short int16; typedef signed long int32; -#endif +#endif typedef unsigned char U8; typedef unsigned short U16; @@ -147,6 +147,7 @@ typedef signed long S32; #include "fmopl.h" #include "main.h" #include "sequence.h" +#include "palette.h" // include game specific stuff #include "AITD1.h" @@ -180,16 +181,16 @@ typedef signed long S32; #define FORCEINLINE inline #endif #endif - -FORCEINLINE u8 READ_LE_U8(void *ptr) -{ - return *(u8*)ptr; -} - -FORCEINLINE s8 READ_LE_S8(void *ptr) -{ - return *(s8*)ptr; -} + +FORCEINLINE u8 READ_LE_U8(void *ptr) +{ + return *(u8*)ptr; +} + +FORCEINLINE s8 READ_LE_S8(void *ptr) +{ + return *(s8*)ptr; +} FORCEINLINE u16 READ_LE_U16(void *ptr) { diff --git a/FitdLib/input.cpp b/FitdLib/input.cpp index 266174c..bd0d889 100644 --- a/FitdLib/input.cpp +++ b/FitdLib/input.cpp @@ -6,18 +6,18 @@ extern float nearVal; extern float farVal; extern float cameraZoom; extern float fov; - -extern bool debuggerVar_debugMenuDisplayed; - -void handleKeyDown(SDL_Event& event) -{ - switch (event.key.key) - { - case SDL_SCANCODE_GRAVE: - debuggerVar_debugMenuDisplayed ^= 1; - break; - } -} + +extern bool debuggerVar_debugMenuDisplayed; + +void handleKeyDown(SDL_Event& event) +{ + switch (event.key.key) + { + case SDL_SCANCODE_GRAVE: + debuggerVar_debugMenuDisplayed ^= 1; + break; + } +} void readKeyboard(void) { @@ -34,9 +34,9 @@ void readKeyboard(void) ImGui_ImplSDL3_ProcessEvent(&event); - switch (event.type) { - case SDL_EVENT_KEY_DOWN: - handleKeyDown(event); + switch (event.type) { + case SDL_EVENT_KEY_DOWN: + handleKeyDown(event); break; case SDL_EVENT_QUIT: cleanupAndExit(); @@ -111,7 +111,7 @@ void readKeyboard(void) case SDL_SCANCODE_SPACE: Click = 1; break; -#ifdef FITD_DEBUGGER +#ifdef FITD_DEBUGGER case SDL_SCANCODE_O: debufferVar_topCameraZoom += 100; break; diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index 5eff648..f07aa58 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -1643,8 +1643,8 @@ void processLife(int lifeNum, bool callFoundLife) FadeOutPhys(32, 0); LoadPak("ITD_RESS", lifeTempVar1, aux); - unsigned char lpalette[0x300]; - copyPalette((unsigned char*)aux + 64000, lpalette); + palette_t lpalette; + copyPalette(aux + 64000, lpalette); convertPaletteIfRequired(lpalette); copyPalette(lpalette, currentGamePalette); setPalette(lpalette); @@ -2004,8 +2004,8 @@ void processLife(int lifeNum, bool callFoundLife) if (g_gameId > AITD1) { FadeOutPhys(0x10, 0); - unsigned char lpalette[0x300]; - copyPalette((unsigned char*)aux + 64000, lpalette); + palette_t lpalette; + copyPalette(aux + 64000, lpalette); convertPaletteIfRequired(lpalette); copyPalette(lpalette, currentGamePalette); setPalette(lpalette); diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 4a0f7cc..27c2b03 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -582,7 +582,7 @@ void fillBox(int x1, int y1, int x2, int y2, char color) // fast recode. No RE void loadPalette(void) { - unsigned char localPalette[768]; + palette_t localPalette; if(g_gameId == AITD2) { @@ -592,7 +592,7 @@ void loadPalette(void) { LoadPak("ITD_RESS",3,aux); } - copyPalette((unsigned char*)aux,currentGamePalette); + copyPalette(aux,currentGamePalette); copyPalette(currentGamePalette,localPalette); // fadeInSub1(localPalette); @@ -1335,11 +1335,15 @@ void loadCamera(int cameraIdx) } else { - memcpy(currentGamePalette,defaultPalette,0x30); - convertPaletteIfRequired((unsigned char*)currentGamePalette); + for (int i = 0; i < 16; i++) { + currentGamePalette[i][0] = defaultPalette[i * 3 + 0]; + currentGamePalette[i][1] = defaultPalette[i * 3 + 1]; + currentGamePalette[i][2] = defaultPalette[i * 3 + 2]; + } + convertPaletteIfRequired(currentGamePalette); } - osystem_setPalette(currentGamePalette); + osystem_setPalette(¤tGamePalette); } } diff --git a/FitdLib/osystem.h b/FitdLib/osystem.h index 53fc4cd..e79bd34 100644 --- a/FitdLib/osystem.h +++ b/FitdLib/osystem.h @@ -10,7 +10,8 @@ #include "debugFont.h" #endif -extern "C"{ +#include "palette.h" + #endif #define byte char @@ -49,6 +50,7 @@ extern "C"{ void osystem_putpixel(int x, int y, int pixel); void osystem_setColor(byte i, byte R, byte G, byte B); void osystem_setPalette(unsigned byte * palette); + void osystem_setPalette(palette_t* palette); void osystem_setPalette320x200(byte * palette); void osystem_flip(unsigned char *videoBuffer); void osystem_draw320x200BufferToScreen(unsigned char *videoBuffer); @@ -57,7 +59,6 @@ extern "C"{ void osystem_drawText(int X, int Y, char *text); void osystem_drawTextColor(int X, int Y, char *string, unsigned char R, unsigned char G, unsigned char B); void osystem_drawLine(int X1,int X2,int Y1,int Y2,unsigned char color, unsigned char* palette); - void osystem_getPalette(unsigned char* palette); void osystem_playSampleFromName(char* sampleName); void osystem_playSample(char* samplePtr,int size); // void getMouseStatus(mouseStatusStruct * mouseData); @@ -90,8 +91,4 @@ extern "C"{ int osystem_playTrack(int trackId); void osystem_playAdlib(); -#ifdef __cplusplus -} -#endif - #endif diff --git a/FitdLib/palette.cpp b/FitdLib/palette.cpp new file mode 100644 index 0000000..ba357bd --- /dev/null +++ b/FitdLib/palette.cpp @@ -0,0 +1,63 @@ +#include "common.h" +#include "palette.h" + +void paletteFill(palette_t& palette, unsigned char r, unsigned char g, unsigned b) +{ + r <<= 1; + g <<= 1; + b <<= 1; + + for (int i = 0; i < 256; i++) + { + palette[i][0] = r; + palette[i][1] = g; + palette[i][2] = b; + } +} + +void setPalette(palette_t& sourcePal) +{ + osystem_setPalette(&sourcePal); +} + +void copyPalette(palette_t& source, palette_t& dest) +{ + for (int i = 0; i < 256; i++) + { + dest[i] = source[i]; + } +} + +void copyPalette(void* source, palette_t& dest) +{ + for (int i = 0; i < 256; i++) + { + for (int j = 0; j < 3; j++) { + dest[i][j] = ((uint8*)source)[i * 3 + j]; + } + } +} + +void convertPaletteIfRequired(palette_t& lpalette) +{ + if (g_gameId >= JACK && g_gameId < AITD3) + { + for (int i = 0; i < 256; i++) + { + for (int j = 0; j < 3; j++) + { + lpalette[i][j] = (((unsigned int)lpalette[i][j] * 255) / 63) & 0xFF; + } + } + } +} + +void computePalette(palette_t& inPalette, palette_t& outPalette, int coef) +{ + for (int i = 0; i < 256; i++) + { + for (int j = 0; j < 3; j++) { + outPalette[i][j] = (inPalette[i][j] * coef) >> 8; + } + } +} \ No newline at end of file diff --git a/FitdLib/palette.h b/FitdLib/palette.h new file mode 100644 index 0000000..f409909 --- /dev/null +++ b/FitdLib/palette.h @@ -0,0 +1,12 @@ +#pragma once + +#include +typedef std::array, 256> palette_t; +void paletteFill(palette_t& palette, unsigned char r, unsigned char g, unsigned b); +void setPalette(palette_t& palette); +void copyPalette(void* source, palette_t& dest); +void copyPalette(palette_t& source, palette_t& dest); +void convertPaletteIfRequired(palette_t& lpalette); +void computePalette(palette_t& inPalette, palette_t& outPalette, int coef); + +extern palette_t currentGamePalette; diff --git a/FitdLib/rendererBGFX.cpp b/FitdLib/rendererBGFX.cpp index 2a2444f..917dcf3 100644 --- a/FitdLib/rendererBGFX.cpp +++ b/FitdLib/rendererBGFX.cpp @@ -208,9 +208,15 @@ void osystem_setPalette(u8* palette) bgfx::updateTexture2D(g_paletteTexture, 0, 0, 0, 0, 3, 256, bgfx::copy(RGB_Pal, 256 * 3)); } -void osystem_getPalette(unsigned char* palette) +void osystem_setPalette(palette_t* palette) { - memcpy(palette, RGB_Pal, 256 * 3); + for (int i = 0; i < 256; i++) { + for (int j = 0; j < 3; j++) { + RGB_Pal[i * 3 + j] = palette->at(i)[j]; + } + } + + bgfx::updateTexture2D(g_paletteTexture, 0, 0, 0, 0, 3, 256, bgfx::copy(RGB_Pal, 256 * 3)); } struct s_vertexData diff --git a/FitdLib/sequence.cpp b/FitdLib/sequence.cpp index 03d853a..e60c347 100644 --- a/FitdLib/sequence.cpp +++ b/FitdLib/sequence.cpp @@ -1,25 +1,5 @@ #include "common.h" -void convertPaletteIfRequired(unsigned char* lpalette) -{ - if(g_gameId >= JACK && g_gameId < AITD3) - { - int i; - unsigned char* ptr2 = lpalette; - for(i=0;i<256;i++) - { - int j; - for(j=0;j<3;j++) - { - unsigned int composante = *(ptr2); - composante*=255; - composante/=63; - *(ptr2++) = composante&0xFF; - } - } - } -} - const char* sequenceListAITD2[]= { "BATL", @@ -156,7 +136,6 @@ void playSequence(int sequenceIdx, int fadeStart, int fadeOutVar) int var_4 = 1; int quitPlayback = 0; int nextFrame = 1; - unsigned char localPalette[0x300]; char buffer[256]; if (g_gameId == AITD2) @@ -194,7 +173,8 @@ void playSequence(int sequenceIdx, int fadeStart, int fadeOutVar) if(!currentFrameId) // first frame { - memcpy(localPalette,logicalScreen,0x300); // copy palette + palette_t localPalette; + copyPalette(logicalScreen, localPalette); // copy palette memcpy(aux,logicalScreen+0x300,64000); nextFrame = READ_LE_U16(logicalScreen+64768); @@ -213,7 +193,7 @@ void playSequence(int sequenceIdx, int fadeStart, int fadeOutVar) flipOtherPalette(palette); } */ - osystem_setPalette(localPalette); + osystem_setPalette(&localPalette); copyPalette(localPalette,currentGamePalette); } } diff --git a/FitdLib/sequence.h b/FitdLib/sequence.h index 52ada68..824329f 100644 --- a/FitdLib/sequence.h +++ b/FitdLib/sequence.h @@ -12,5 +12,3 @@ typedef struct sequenceParamStruct sequenceParamStruct; extern int numSequenceParam; extern sequenceParamStruct sequenceParams[NUM_MAX_SEQUENCE_PARAM]; - -void convertPaletteIfRequired(unsigned char* lpalette); diff --git a/FitdLib/tatou.cpp b/FitdLib/tatou.cpp index 2adda77..65a3fe6 100644 --- a/FitdLib/tatou.cpp +++ b/FitdLib/tatou.cpp @@ -22,56 +22,13 @@ void blitScreenTatou(void) */ } -void copyPalette(unsigned char* source, unsigned char* dest) -{ - int i; - - for(i=0;i<768;i++) - { - dest[i] = source[i]; - } -} - void FastCopyScreen(void* source, void* dest) { memcpy(dest, source, 64000); } -void paletteFill(void* palette, unsigned char r, unsigned char g, unsigned b) -{ - unsigned char* paletteLocal = (unsigned char*) palette; - int offset = 0; - int i; - - r<<=1; - g<<=1; - b<<=1; - - for(i=0;i<256;i++) - { - paletteLocal[offset] = r; - paletteLocal[offset+1] = g; - paletteLocal[offset+2] = b; - offset += 3; - } -} - -void computePalette(unsigned char* inPalette, unsigned char* outPalette, int coef) -{ - int i; - - for(i=0;i<256;i++) - { - *(outPalette++) = ((*(inPalette++))*coef)>> 8; - *(outPalette++) = ((*(inPalette++))*coef)>> 8; - *(outPalette++) = ((*(inPalette++))*coef)>> 8; - } -} - void FadeInPhys(int step,int start) { - unsigned char localPalette[0x300]; - freezeTime(); if(fadeState == 2) // only used for the ending ? @@ -82,6 +39,7 @@ void FadeInPhys(int step,int start) for(int i=0;i<256;i+=step) { process_events(); + palette_t localPalette; computePalette(currentGamePalette,localPalette,i); setPalette(localPalette); osystem_refreshFrontTextureBuffer(); @@ -96,13 +54,12 @@ void FadeInPhys(int step,int start) void FadeOutPhys(int var1, int var2) { - unsigned char localPalette[0x300]; - freezeTime(); for(int i=256;i>=0;i-=var1) { process_events(); + palette_t localPalette; computePalette(currentGamePalette,localPalette,i); setPalette(localPalette); osystem_refreshFrontTextureBuffer(); @@ -112,11 +69,6 @@ void FadeOutPhys(int var1, int var2) unfreezeTime(); } -void setPalette(void* sourcePal) -{ - osystem_setPalette((unsigned char*)sourcePal); -} - #ifdef PCLIKE void process_events( void ) { diff --git a/FitdLib/tatou.h b/FitdLib/tatou.h index 72b9e2b..b7e3cf9 100644 --- a/FitdLib/tatou.h +++ b/FitdLib/tatou.h @@ -3,17 +3,15 @@ int make3dTatou(void); //////////////// to mode -void paletteFill(void* palette, unsigned char r, unsigned char g, unsigned b); -void setPalette(void* palette); -void startChrono(unsigned int* chrono); -int evalChrono(unsigned int* chrono); void process_events( void ); -void copyPalette(unsigned char* source, unsigned char* dest); void FastCopyScreen(void* source, void* dest); void Rotate(unsigned int x, unsigned int y, unsigned int z, int* xOut, int* yOut); void FadeInPhys(int var1,int var2); void FadeOutPhys(int var1, int var2); void playSound(int num); void setCameraTarget(int x,int y,int z,int alpha,int beta,int gamma,int time); + +void startChrono(unsigned int* chrono); +int evalChrono(unsigned int* chrono); ////////////// #endif diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index d3de9ac..f0dc4bb 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -29,7 +29,7 @@ char* PtrFont; char* PtrCadre; -unsigned char currentGamePalette[256*3]; +palette_t currentGamePalette; //OSystem osystem; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index ff9faaa..a2d7053 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -284,8 +284,6 @@ extern char* PtrFont; extern char* PtrCadre; -extern unsigned char currentGamePalette[0x300]; - //extern OSystem osystem; extern unsigned char frontBuffer[320*200]; extern char rgbaBuffer[320*200*4]; From 6f48dad3ad470b707f6d9e3b3fccab8ddef3b23c Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 2 Jun 2025 22:02:25 -0700 Subject: [PATCH 02/70] Bump SDL/Soloud --- ThirdParty/SDL | 2 +- ThirdParty/soloud.cmake/soloud | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ThirdParty/SDL b/ThirdParty/SDL index 877399b..8d60435 160000 --- a/ThirdParty/SDL +++ b/ThirdParty/SDL @@ -1 +1 @@ -Subproject commit 877399b2b2cf21e67554ed9046410f268ce1d1b2 +Subproject commit 8d604353a53853fa56d1bdce0363535605ca868f diff --git a/ThirdParty/soloud.cmake/soloud b/ThirdParty/soloud.cmake/soloud index 467259e..d3ef2e8 160000 --- a/ThirdParty/soloud.cmake/soloud +++ b/ThirdParty/soloud.cmake/soloud @@ -1 +1 @@ -Subproject commit 467259ef305251b43b26ad91229189f659240c91 +Subproject commit d3ef2e879db2199706050d241fb0a51e7ab9dd38 From 437478b6a77518965d9f8111d7f06b1cf9ce869a Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 2 Jun 2025 22:27:48 -0700 Subject: [PATCH 03/70] Fix incorrect pallette for books in JackInTheDark --- FitdLib/JACK.cpp | 2 +- FitdLib/main.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/FitdLib/JACK.cpp b/FitdLib/JACK.cpp index d8c75e1..bbcfa86 100644 --- a/FitdLib/JACK.cpp +++ b/FitdLib/JACK.cpp @@ -21,7 +21,7 @@ void JACK_ReadBook(int index, int type) unsigned char* pImage = (unsigned char*)loadPak("ITD_RESS", JACK_LIVRE); memcpy(aux, pImage, 320*200); palette_t lpalette; - copyPalette(aux + 64000, lpalette); + copyPalette(pImage + 320*200, lpalette); convertPaletteIfRequired(lpalette); copyPalette(lpalette,currentGamePalette); setPalette(lpalette); diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 27c2b03..412b9b5 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -1327,7 +1327,7 @@ void loadCamera(int cameraIdx) if(g_gameId >= JACK) { - copyPalette((unsigned char*)aux+64000,currentGamePalette); + copyPalette(aux+64000,currentGamePalette); if(g_gameId == AITD3) { From c86ddb26a3f8c6b08fd8047a26aea92e8897bb1c Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 2 Jun 2025 23:07:03 -0700 Subject: [PATCH 04/70] Modernize BGFX --- CMakeLists.txt | 2 +- FitdLib/CMakeLists.txt | 13 +++++++++++-- FitdLib/imguiBGFX.cpp | 4 ++-- ThirdParty/bgfx.cmake | 2 +- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 532e16d..c846fda 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,4 +20,4 @@ set(ZLIB_TESTS OFF CACHE BOOL "Build zlib tests") add_subdirectory(${THIRD_PARTY}/zlib ${CMAKE_BINARY_DIR}/zlib/zlib-build) add_subdirectory( FitdLib ) -add_subdirectory( Fitd ) \ No newline at end of file +add_subdirectory( Fitd ) diff --git a/FitdLib/CMakeLists.txt b/FitdLib/CMakeLists.txt index 86f3413..aa0df6e 100644 --- a/FitdLib/CMakeLists.txt +++ b/FitdLib/CMakeLists.txt @@ -50,8 +50,8 @@ function(assign_source_group) endfunction(assign_source_group) macro(addShaderProgramPermutation vsname psname varyingname platform api profileVS profilePS) - shaderc(FILE shaders/${vsname}.sc BIN2C ${vsname}_${api} OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${vsname}_${api}.h VERTEX ${platform} VARYINGDEF shaders/${varyingname}.sc INCLUDES ${BGFX_DIR}/src PROFILE ${profileVS}) - shaderc(FILE shaders/${psname}.sc BIN2C ${psname}_${api} OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${psname}_${api}.h FRAGMENT ${platform} VARYINGDEF shaders/${varyingname}.sc INCLUDES ${BGFX_DIR}/src PROFILE ${profilePS}) + _bgfx_shaderc_parse(CLI FILE shaders/${vsname}.sc BIN2C ${vsname}_${api} OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${vsname}_${api}.h VERTEX ${platform} VARYINGDEF shaders/${varyingname}.sc INCLUDES ${BGFX_DIR}/src PROFILE ${profileVS}) + _bgfx_shaderc_parse(CLI FILE shaders/${psname}.sc BIN2C ${psname}_${api} OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${psname}_${api}.h FRAGMENT ${platform} VARYINGDEF shaders/${varyingname}.sc INCLUDES ${BGFX_DIR}/src PROFILE ${profilePS}) #shaderc(FILE shaders/${vsname}.sc BIN2C ${vsname}_${api} OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${vsname}_${api}.debug.h DEBUG VERTEX ${platform} VARYINGDEF shaders/${varyingname}.sc INCLUDES ${BGFX_DIR}/src PROFILE ${profileVS}) #shaderc(FILE shaders/${psname}.sc BIN2C ${psname}_${api} OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${psname}_${api}.debug.h DEBUG FRAGMENT ${platform} VARYINGDEF shaders/${varyingname}.sc INCLUDES ${BGFX_DIR}/src PROFILE ${profilePS}) set(SOURCES @@ -104,4 +104,13 @@ addShaderProgram(sphere_vs sphere_ps sphere.varying.def) assign_source_group(${SOURCES}) +if(MSVC) + add_compile_options(/Zc:__cplusplus) + add_compile_options(/Zc:preprocessor) +endif() + add_library (FitdLib ${SOURCES}) + +target_compile_definitions( FitdLib PUBLIC "BX_CONFIG_DEBUG=0" ) +set_property(TARGET FitdLib PROPERTY CXX_STANDARD 20) + diff --git a/FitdLib/imguiBGFX.cpp b/FitdLib/imguiBGFX.cpp index 1f3ba22..610a1d4 100644 --- a/FitdLib/imguiBGFX.cpp +++ b/FitdLib/imguiBGFX.cpp @@ -490,13 +490,13 @@ static OcornutImguiContext s_ctx; static void* memAlloc(size_t _size, void* _userData) { BX_UNUSED(_userData); - return BX_ALLOC(s_ctx.m_allocator, _size); + return bx::alloc(s_ctx.m_allocator, _size); } static void memFree(void* _ptr, void* _userData) { BX_UNUSED(_userData); - BX_FREE(s_ctx.m_allocator, _ptr); + bx::free(s_ctx.m_allocator, _ptr); } void imguiCreate(float _fontSize, bx::AllocatorI* _allocator) diff --git a/ThirdParty/bgfx.cmake b/ThirdParty/bgfx.cmake index 417f8b8..657dd62 160000 --- a/ThirdParty/bgfx.cmake +++ b/ThirdParty/bgfx.cmake @@ -1 +1 @@ -Subproject commit 417f8b82ef76ef19a0f3efd93d32088c9b3331a0 +Subproject commit 657dd625515d6324a82b734c1e6f81e08cf1f1ee From 03bf585dfeecd420e8aa92eb0c9ef9b795f79027 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Tue, 3 Jun 2025 00:04:55 -0700 Subject: [PATCH 05/70] Fix shader compilation --- FitdLib/CMakeLists.txt | 50 +++++--------- FitdLib/shaders/background_ps.sc | 14 ++-- FitdLib/shaders/embeddedShaders.cpp | 97 ++++++++++++++-------------- FitdLib/shaders/flat_ps.sc | 10 +-- FitdLib/shaders/maskBackground_ps.sc | 19 +++--- FitdLib/shaders/noise_ps.sc | 10 +-- FitdLib/shaders/ramp_ps.sc | 17 +++-- FitdLib/shaders/sphere_ps.sc | 36 +++++------ 8 files changed, 121 insertions(+), 132 deletions(-) diff --git a/FitdLib/CMakeLists.txt b/FitdLib/CMakeLists.txt index aa0df6e..b0f871f 100644 --- a/FitdLib/CMakeLists.txt +++ b/FitdLib/CMakeLists.txt @@ -49,49 +49,31 @@ function(assign_source_group) endforeach() endfunction(assign_source_group) -macro(addShaderProgramPermutation vsname psname varyingname platform api profileVS profilePS) - _bgfx_shaderc_parse(CLI FILE shaders/${vsname}.sc BIN2C ${vsname}_${api} OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${vsname}_${api}.h VERTEX ${platform} VARYINGDEF shaders/${varyingname}.sc INCLUDES ${BGFX_DIR}/src PROFILE ${profileVS}) - _bgfx_shaderc_parse(CLI FILE shaders/${psname}.sc BIN2C ${psname}_${api} OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${psname}_${api}.h FRAGMENT ${platform} VARYINGDEF shaders/${varyingname}.sc INCLUDES ${BGFX_DIR}/src PROFILE ${profilePS}) +macro(addShaderProgramPermutation vsname psname varyingname) + bgfx_compile_shaders(SHADERS shaders/${vsname}.sc AS_HEADERS OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated TYPE VERTEX VARYING_DEF ${CMAKE_CURRENT_SOURCE_DIR}/shaders/${varyingname}.sc INCLUDE_DIRS ${BGFX_DIR}/src AS_HEADERS) + bgfx_compile_shaders(SHADERS shaders/${psname}.sc AS_HEADERS OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated TYPE FRAGMENT VARYING_DEF ${CMAKE_CURRENT_SOURCE_DIR}/shaders/${varyingname}.sc INCLUDE_DIRS ${BGFX_DIR}/src AS_HEADERS) #shaderc(FILE shaders/${vsname}.sc BIN2C ${vsname}_${api} OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${vsname}_${api}.debug.h DEBUG VERTEX ${platform} VARYINGDEF shaders/${varyingname}.sc INCLUDES ${BGFX_DIR}/src PROFILE ${profileVS}) #shaderc(FILE shaders/${psname}.sc BIN2C ${psname}_${api} OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${psname}_${api}.debug.h DEBUG FRAGMENT ${platform} VARYINGDEF shaders/${varyingname}.sc INCLUDES ${BGFX_DIR}/src PROFILE ${profilePS}) - set(SOURCES - ${SOURCES} - ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${vsname}_${api}.h - ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${psname}_${api}.h + #set(SOURCES + # ${SOURCES} + # ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${vsname}_${api}.h + # ${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${psname}_${api}.h #${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${vsname}_${api}.debug.h #${CMAKE_CURRENT_SOURCE_DIR}/shaders/generated/${psname}_${api}.debug.h - ) + #) endmacro() macro(addShaderProgram vsname psname varyingname) -set(SOURCES - ${SOURCES} - shaders/${vsname}.sc - shaders/${psname}.sc - shaders/${varyingname}.sc -) - -IF(${CMAKE_SYSTEM_NAME} MATCHES iOS|tvOS) - addShaderProgramPermutation(${vsname} ${psname} ${varyingname} IOS glsl 430 430) - addShaderProgramPermutation(${vsname} ${psname} ${varyingname} IOS metal metal metal) -endif() - -IF(${CMAKE_SYSTEM_NAME} MATCHES Darwin) - addShaderProgramPermutation(${vsname} ${psname} ${varyingname} OSX glsl 430 430) - addShaderProgramPermutation(${vsname} ${psname} ${varyingname} OSX mtl metal metal) -endif() - -IF(${CMAKE_SYSTEM_NAME} MATCHES Windows) - addShaderProgramPermutation(${vsname} ${psname} ${varyingname} WINDOWS dx11 vs_5_0 ps_5_0) - addShaderProgramPermutation(${vsname} ${psname} ${varyingname} WINDOWS glsl 430 430) - addShaderProgramPermutation(${vsname} ${psname} ${varyingname} WINDOWS spv spirv spirv) -endif() + set(SOURCES + ${SOURCES} + shaders/${vsname}.sc + shaders/${psname}.sc + shaders/${varyingname}.sc + ) -IF(${CMAKE_SYSTEM_NAME} MATCHES Linux) - addShaderProgramPermutation(${vsname} ${psname} ${varyingname} WINDOWS glsl 430 430) - addShaderProgramPermutation(${vsname} ${psname} ${varyingname} WINDOWS spv spirv spirv) -endif() + addShaderProgramPermutation(${vsname} ${psname} ${varyingname}) + addShaderProgramPermutation(${vsname} ${psname} ${varyingname}) endmacro() diff --git a/FitdLib/shaders/background_ps.sc b/FitdLib/shaders/background_ps.sc index 005b1c2..ade4995 100644 --- a/FitdLib/shaders/background_ps.sc +++ b/FitdLib/shaders/background_ps.sc @@ -2,14 +2,16 @@ $input v_texcoord0 #include "bgfx_shader.sh" -highp USAMPLER2D(s_backgroundTexture, 0); -highp USAMPLER2D(s_paletteTexture, 1); +USAMPLER2D(s_backgroundTexture, 0); +USAMPLER2D(s_paletteTexture, 1); void main() { - uvec4 rawTexel = texelFetch(s_backgroundTexture, ivec2(v_texcoord0.x * 320, v_texcoord0.y * 200), 0); - gl_FragColor.r = (texelFetch(s_paletteTexture, ivec2(0, rawTexel.r), 0) / 255.f).r; - gl_FragColor.g = (texelFetch(s_paletteTexture, ivec2(1, rawTexel.r), 0) / 255.f).r; - gl_FragColor.b = (texelFetch(s_paletteTexture, ivec2(2, rawTexel.r), 0) / 255.f).r; + vec2 position = vec2(v_texcoord0.xy) * vec2(320, 200); + uvec4 rawTexel = texelFetch(s_backgroundTexture, ivec2(position), 0); + ivec2 base = ivec2(0, rawTexel.r); + gl_FragColor.r = float(texelFetch(s_paletteTexture, base + ivec2(0, 0), 0).r) / 255.f; + gl_FragColor.g = float(texelFetch(s_paletteTexture, base + ivec2(1, 0), 0).r) / 255.f; + gl_FragColor.b = float(texelFetch(s_paletteTexture, base + ivec2(2, 0), 0).r) / 255.f; gl_FragColor.a = 1.f; } diff --git a/FitdLib/shaders/embeddedShaders.cpp b/FitdLib/shaders/embeddedShaders.cpp index 487450f..ee83fb0 100644 --- a/FitdLib/shaders/embeddedShaders.cpp +++ b/FitdLib/shaders/embeddedShaders.cpp @@ -2,64 +2,63 @@ #include "config.h" #if BGFX_PLATFORM_SUPPORTS_SPIRV -#include "shaders/generated/background_vs_spv.h" -#include "shaders/generated/background_ps_spv.h" -#include "shaders/generated/maskBackground_vs_spv.h" -#include "shaders/generated/maskBackground_ps_spv.h" -#include "shaders/generated/ramp_vs_spv.h" -#include "shaders/generated/ramp_ps_spv.h" -#include "shaders/generated/noise_vs_spv.h" -#include "shaders/generated/noise_ps_spv.h" -#include "shaders/generated/flat_vs_spv.h" -#include "shaders/generated/flat_ps_spv.h" -#include "shaders/generated/sphere_vs_spv.h" -#include "shaders/generated/sphere_ps_spv.h" +#include "shaders/generated/spirv/background_vs.sc.bin.h" +#include "shaders/generated/spirv/background_ps.sc.bin.h" +#include "shaders/generated/spirv/maskBackground_vs.sc.bin.h" +#include "shaders/generated/spirv/maskBackground_ps.sc.bin.h" +#include "shaders/generated/spirv/ramp_vs.sc.bin.h" +#include "shaders/generated/spirv/ramp_ps.sc.bin.h" +#include "shaders/generated/spirv/noise_vs.sc.bin.h" +#include "shaders/generated/spirv/noise_ps.sc.bin.h" +#include "shaders/generated/spirv/flat_vs.sc.bin.h" +#include "shaders/generated/spirv/flat_ps.sc.bin.h" +#include "shaders/generated/spirv/sphere_vs.sc.bin.h" +#include "shaders/generated/spirv/sphere_ps.sc.bin.h" #endif #if BGFX_PLATFORM_SUPPORTS_METAL -#include "shaders/generated/background_vs_mtl.h" -#include "shaders/generated/background_ps_mtl.h" -#include "shaders/generated/maskBackground_vs_mtl.h" -#include "shaders/generated/maskBackground_ps_mtl.h" -#include "shaders/generated/ramp_vs_mtl.h" -#include "shaders/generated/ramp_ps_mtl.h" -#include "shaders/generated/noise_vs_mtl.h" -#include "shaders/generated/noise_ps_mtl.h" -#include "shaders/generated/flat_vs_mtl.h" -#include "shaders/generated/flat_ps_mtl.h" -#include "shaders/generated/sphere_vs_mtl.h" -#include "shaders/generated/sphere_ps_mtl.h" +#include "shaders/generated/metal/background_vs.sc.bin.h" +#include "shaders/generated/metal/background_ps.sc.bin.h" +#include "shaders/generated/metal/maskBackground_vs.sc.bin.h" +#include "shaders/generated/metal/maskBackground_ps.sc.bin.h" +#include "shaders/generated/metal/ramp_vs.sc.bin.h" +#include "shaders/generated/metal/ramp_ps.sc.bin.h" +#include "shaders/generated/metal/noise_vs.sc.bin.h" +#include "shaders/generated/metal/noise_ps.sc.bin.h" +#include "shaders/generated/metal/flat_vs.sc.bin.h" +#include "shaders/generated/metal/flat_ps.sc.bin.h" +#include "shaders/generated/metal/sphere_vs.sc.bin.h" +#include "shaders/generated/metal/sphere_ps.sc.bin.h" #endif #if BGFX_PLATFORM_SUPPORTS_GLSL -#include "shaders/generated/background_vs_glsl.h" -#include "shaders/generated/background_ps_glsl.h" -#include "shaders/generated/maskBackground_vs_glsl.h" -#include "shaders/generated/maskBackground_ps_glsl.h" -#include "shaders/generated/ramp_vs_glsl.h" -#include "shaders/generated/ramp_ps_glsl.h" -#include "shaders/generated/noise_vs_glsl.h" -#include "shaders/generated/noise_ps_glsl.h" -#include "shaders/generated/flat_vs_glsl.h" -#include "shaders/generated/flat_ps_glsl.h" -#include "shaders/generated/sphere_vs_glsl.h" -#include "shaders/generated/sphere_ps_glsl.h" +#include "shaders/generated/glsl/background_vs.sc.bin.h" +#include "shaders/generated/glsl/background_ps.sc.bin.h" +#include "shaders/generated/glsl/maskBackground_vs.sc.bin.h" +#include "shaders/generated/glsl/maskBackground_ps.sc.bin.h" +#include "shaders/generated/glsl/ramp_vs.sc.bin.h" +#include "shaders/generated/glsl/ramp_ps.sc.bin.h" +#include "shaders/generated/glsl/noise_vs.sc.bin.h" +#include "shaders/generated/glsl/noise_ps.sc.bin.h" +#include "shaders/generated/glsl/flat_vs.sc.bin.h" +#include "shaders/generated/glsl/flat_ps.sc.bin.h" +#include "shaders/generated/glsl/sphere_vs.sc.bin.h" +#include "shaders/generated/glsl/sphere_ps.sc.bin.h" #endif #if BGFX_PLATFORM_SUPPORTS_DXBC -#include "shaders/generated/background_vs_dx11.h" -#include "shaders/generated/background_ps_dx11.h" -#include "shaders/generated/maskBackground_vs_dx11.h" -#include "shaders/generated/maskBackground_ps_dx11.h" - -#include "shaders/generated/ramp_vs_dx11.h" -#include "shaders/generated/ramp_ps_dx11.h" -#include "shaders/generated/noise_vs_dx11.h" -#include "shaders/generated/noise_ps_dx11.h" -#include "shaders/generated/flat_vs_dx11.h" -#include "shaders/generated/flat_ps_dx11.h" -#include "shaders/generated/sphere_vs_dx11.h" -#include "shaders/generated/sphere_ps_dx11.h" +#include "shaders/generated/dx11/background_vs.sc.bin.h" +#include "shaders/generated/dx11/background_ps.sc.bin.h" +#include "shaders/generated/dx11/maskBackground_vs.sc.bin.h" +#include "shaders/generated/dx11/maskBackground_ps.sc.bin.h" +#include "shaders/generated/dx11/ramp_vs.sc.bin.h" +#include "shaders/generated/dx11/ramp_ps.sc.bin.h" +#include "shaders/generated/dx11/noise_vs.sc.bin.h" +#include "shaders/generated/dx11/noise_ps.sc.bin.h" +#include "shaders/generated/dx11/flat_vs.sc.bin.h" +#include "shaders/generated/dx11/flat_ps.sc.bin.h" +#include "shaders/generated/dx11/sphere_vs.sc.bin.h" +#include "shaders/generated/dx11/sphere_ps.sc.bin.h" #endif static const bgfx::EmbeddedShader s_embeddedShaders[] = diff --git a/FitdLib/shaders/flat_ps.sc b/FitdLib/shaders/flat_ps.sc index ee495e3..517341d 100644 --- a/FitdLib/shaders/flat_ps.sc +++ b/FitdLib/shaders/flat_ps.sc @@ -2,7 +2,7 @@ $input v_texcoord0 #include "bgfx_shader.sh" -highp USAMPLER2D(s_paletteTexture, 1); +USAMPLER2D(s_paletteTexture, 1); void main() { @@ -11,8 +11,8 @@ void main() int colorOffset = (bank << 4) + color; - gl_FragColor.r = (texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0) / 255.f).r; - gl_FragColor.g = (texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0) / 255.f).r; - gl_FragColor.b = (texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0) / 255.f).r; - gl_FragColor.w = 1; + gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; + gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; + gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; + gl_FragColor.w = 1.f; } diff --git a/FitdLib/shaders/maskBackground_ps.sc b/FitdLib/shaders/maskBackground_ps.sc index 9dd1209..a56f2b6 100644 --- a/FitdLib/shaders/maskBackground_ps.sc +++ b/FitdLib/shaders/maskBackground_ps.sc @@ -2,19 +2,20 @@ $input v_texcoord0 #include "bgfx_shader.sh" -highp USAMPLER2D(s_maskPaletteTexture, 0); -highp USAMPLER2D(s_paletteTexture, 1); -highp USAMPLER2D(s_backgroundTexture, 2); +USAMPLER2D(s_maskPaletteTexture, 0); +USAMPLER2D(s_paletteTexture, 1); +USAMPLER2D(s_backgroundTexture, 2); void main() { - uvec4 rawMask = texelFetch(s_maskPaletteTexture, ivec2(v_texcoord0.x * 320, v_texcoord0.y * 200), 0); - if(rawMask.r == 0) + vec2 position = vec2(v_texcoord0.xy) * vec2(320, 200); + uvec4 rawMask = texelFetch(s_maskPaletteTexture, ivec2(position), 0); + if(int(rawMask.r) == 0) discard; - uvec4 rawTexel = texelFetch(s_backgroundTexture, ivec2(v_texcoord0.x * 320, v_texcoord0.y * 200), 0); - gl_FragColor.r = (texelFetch(s_paletteTexture, ivec2(0, rawTexel.r), 0) / 255.f).r; - gl_FragColor.g = (texelFetch(s_paletteTexture, ivec2(1, rawTexel.r), 0) / 255.f).r; - gl_FragColor.b = (texelFetch(s_paletteTexture, ivec2(2, rawTexel.r), 0) / 255.f).r; + uvec4 rawTexel = texelFetch(s_backgroundTexture, ivec2(position), 0); + gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, rawTexel.r), 0).r) / 255.f; + gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, rawTexel.r), 0).r) / 255.f; + gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, rawTexel.r), 0).r) / 255.f; gl_FragColor.a = 1.f; } diff --git a/FitdLib/shaders/noise_ps.sc b/FitdLib/shaders/noise_ps.sc index ee495e3..517341d 100644 --- a/FitdLib/shaders/noise_ps.sc +++ b/FitdLib/shaders/noise_ps.sc @@ -2,7 +2,7 @@ $input v_texcoord0 #include "bgfx_shader.sh" -highp USAMPLER2D(s_paletteTexture, 1); +USAMPLER2D(s_paletteTexture, 1); void main() { @@ -11,8 +11,8 @@ void main() int colorOffset = (bank << 4) + color; - gl_FragColor.r = (texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0) / 255.f).r; - gl_FragColor.g = (texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0) / 255.f).r; - gl_FragColor.b = (texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0) / 255.f).r; - gl_FragColor.w = 1; + gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; + gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; + gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; + gl_FragColor.w = 1.f; } diff --git a/FitdLib/shaders/ramp_ps.sc b/FitdLib/shaders/ramp_ps.sc index 803a881..431fef4 100644 --- a/FitdLib/shaders/ramp_ps.sc +++ b/FitdLib/shaders/ramp_ps.sc @@ -2,13 +2,18 @@ $input v_texcoord0 #include "bgfx_shader.sh" -highp USAMPLER2D(s_paletteTexture, 1); +USAMPLER2D(s_paletteTexture, 1); + +float _mod(float x, float y) +{ + return x - y * floor(x/y); +} void main() { float colorf = v_texcoord0.x; - colorf %= 2.f; + colorf = _mod(colorf, 2.f); if(colorf > 1.f) { colorf = 1.f - (colorf - 1.f); @@ -19,8 +24,8 @@ void main() int colorOffset = (bank << 4) + color; - gl_FragColor.r = (texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0) / 255.f).r; - gl_FragColor.g = (texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0) / 255.f).r; - gl_FragColor.b = (texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0) / 255.f).r; - gl_FragColor.w = 1; + gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; + gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; + gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; + gl_FragColor.w = 1.f; } diff --git a/FitdLib/shaders/sphere_ps.sc b/FitdLib/shaders/sphere_ps.sc index 14afe43..b2778aa 100644 --- a/FitdLib/shaders/sphere_ps.sc +++ b/FitdLib/shaders/sphere_ps.sc @@ -2,7 +2,7 @@ $input v_texcoord0, v_sphereParams, v_screenSpacePosition #include "bgfx_shader.sh" -highp USAMPLER2D(s_paletteTexture, 1); +USAMPLER2D(s_paletteTexture, 1); void main() { @@ -14,36 +14,36 @@ void main() int color = int(v_texcoord0.x * 15.f); int bank = int(v_texcoord0.y * 15.f); - int material = (int)v_sphereParams.w; + int material = int(v_sphereParams.w); if(material == 0) { // flat int colorOffset = (bank << 4) + color; - gl_FragColor.r = (texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0) / 255.f).r; - gl_FragColor.g = (texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0) / 255.f).r; - gl_FragColor.b = (texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0) / 255.f).r; - gl_FragColor.w = 1; + gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; + gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; + gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; + gl_FragColor.w = 1.f; } else if(material == 2) { // transparent int colorOffset = (bank << 4) + color; - gl_FragColor.r = (texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0) / 255.f).r; - gl_FragColor.g = (texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0) / 255.f).r; - gl_FragColor.b = (texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0) / 255.f).r; - gl_FragColor.w = 0.5; + gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; + gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; + gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; + gl_FragColor.w = 0.5f; } else if(material == 3) { // marbre vec2 normalizedPosition = (v_screenSpacePosition.xy - sphereCenter.xy) / sphereSize; float angle = asin(normalizedPosition.y); float distanceToCircleOnScanline = cos(angle) - normalizedPosition.x; // value is in 0/2 range distanceToCircleOnScanline /= 2.f; // remap to 0 / 1 - color = (1.f - distanceToCircleOnScanline) * 15.f; + color = int((1.f - distanceToCircleOnScanline) * 15.f); int colorOffset = (bank << 4) + color; - gl_FragColor.r = (texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0) / 255.f).r; - gl_FragColor.g = (texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0) / 255.f).r; - gl_FragColor.b = (texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0) / 255.f).r; - gl_FragColor.w = 1; + gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; + gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; + gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; + gl_FragColor.w = 1.f; } else { gl_FragColor.r = 1.f; - gl_FragColor.g = 0; - gl_FragColor.b = 0; - gl_FragColor.w = 1; + gl_FragColor.g = 0.f; + gl_FragColor.b = 0.f; + gl_FragColor.w = 1.f; } } From d4a8832b662bd1e0cdca76e601f98599d67e3674 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Tue, 3 Jun 2025 15:10:24 -0700 Subject: [PATCH 06/70] Fix linux CI --- .github/workflows/cmake-multi-platform.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/cmake-multi-platform.yml b/.github/workflows/cmake-multi-platform.yml index df00486..2ac8226 100644 --- a/.github/workflows/cmake-multi-platform.yml +++ b/.github/workflows/cmake-multi-platform.yml @@ -45,6 +45,10 @@ jobs: with: submodules: recursive + - name: Update linux apt + if: ${{ matrix.os == 'ubuntu-latest' }} + run: sudo apt update + - name: Install linux dependencies if: ${{ matrix.os == 'ubuntu-latest' }} run: sudo apt install libx11-dev libopengl-dev libglx-dev mesa-common-dev build-essential git make From 36e3511e535b5535bfcb9e1412c054de570b908d Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Tue, 3 Jun 2025 15:52:27 -0700 Subject: [PATCH 07/70] Update palette.h --- FitdLib/palette.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FitdLib/palette.h b/FitdLib/palette.h index f409909..d14e1af 100644 --- a/FitdLib/palette.h +++ b/FitdLib/palette.h @@ -1,7 +1,7 @@ #pragma once #include -typedef std::array, 256> palette_t; +typedef std::array, 256> palette_t; void paletteFill(palette_t& palette, unsigned char r, unsigned char g, unsigned b); void setPalette(palette_t& palette); void copyPalette(void* source, palette_t& dest); From c9afc6eef8c7cccbe8f9f1802064f50f04171f14 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Tue, 3 Jun 2025 16:36:16 -0700 Subject: [PATCH 08/70] Update osystemSDL.cpp --- FitdLib/osystemSDL.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FitdLib/osystemSDL.cpp b/FitdLib/osystemSDL.cpp index 9e693a8..5cc2d0b 100644 --- a/FitdLib/osystemSDL.cpp +++ b/FitdLib/osystemSDL.cpp @@ -113,7 +113,7 @@ int FitdInit(int argc, char* argv[]) getVersion(version); - printf(version); + printf("%s", version); detectGame(); @@ -258,7 +258,7 @@ int fileExists(const char* name) void osystem_init() // that's the constructor of the system dependent // object used for the SDL port { - if (SDL_Init(SDL_INIT_VIDEO) < 0) + if (!SDL_Init(SDL_INIT_VIDEO)) { fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); assert(0); From 20d7e10d486510938195271260e16dc99d9c3cde Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Wed, 4 Jun 2025 00:17:39 -0700 Subject: [PATCH 09/70] Fix some of the save code that got messed up --- FitdLib/save.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/FitdLib/save.cpp b/FitdLib/save.cpp index cb81d84..ffc431a 100644 --- a/FitdLib/save.cpp +++ b/FitdLib/save.cpp @@ -553,15 +553,18 @@ int makeSaveFile(int entry) if(g_gameId == AITD1) { + // For safety, destroy special objects before mallocs for(i=0;i Date: Wed, 4 Jun 2025 18:33:16 -0700 Subject: [PATCH 10/70] Macos CI --- .github/workflows/cmake-multi-platform.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake-multi-platform.yml b/.github/workflows/cmake-multi-platform.yml index 2ac8226..4912169 100644 --- a/.github/workflows/cmake-multi-platform.yml +++ b/.github/workflows/cmake-multi-platform.yml @@ -19,8 +19,8 @@ jobs: # # To add more build types (Release, Debug, RelWithDebInfo, etc.) customize the build_type list. matrix: - os: [ubuntu-latest, windows-2025] - build_type: [Release] + os: [ubuntu-latest, windows-2025, macos-latest] + build_type: [Release, Debug] c_compiler: [gcc, clang, cl] include: - os: windows-2025 @@ -32,6 +32,9 @@ jobs: - os: ubuntu-latest c_compiler: clang cpp_compiler: clang++ + - os: macos-latest + c_compiler: clang + cpp_compiler: clang++ exclude: - os: windows-2025 c_compiler: gcc @@ -39,6 +42,10 @@ jobs: c_compiler: clang - os: ubuntu-latest c_compiler: cl + - os: macos-latest + c_compiler: gcc + - os: macos-latest + c_compiler: cl steps: - uses: actions/checkout@v4 From fc09452075ff54eabaa4e5f35131e93419cca07e Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Wed, 4 Jun 2025 18:34:45 -0700 Subject: [PATCH 11/70] Build fix for macos (attempted) --- FitdLib/bgfxGlue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FitdLib/bgfxGlue.cpp b/FitdLib/bgfxGlue.cpp index a02818e..ef7cbad 100644 --- a/FitdLib/bgfxGlue.cpp +++ b/FitdLib/bgfxGlue.cpp @@ -134,7 +134,7 @@ void createBgfxInitParams() } #elif BX_PLATFORM_OSX initparam.platformData.ndt = NULL; - initparam.platformData.nwh = cbSetupMetalLayer(wmi.info.cocoa.window); + initparam.platformData.nwh = cbSetupMetalLayer((void*)SDL_GetPointerProperty(SDL_GetWindowProperties(gWindowBGFX), SDL_PROP_WINDOW_COCOA_WINDOW_POINTER, NULL)); #elif BX_PLATFORM_WINDOWS initparam.platformData.ndt = NULL; initparam.platformData.nwh = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(gWindowBGFX), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL); From 844be1f3c5399a7a0d7aa1a361249e975e7d37a3 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 7 Jun 2025 20:59:12 -0700 Subject: [PATCH 12/70] Fix linux --- FitdLib/config.h | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/FitdLib/config.h b/FitdLib/config.h index 5e62851..c580d19 100644 --- a/FitdLib/config.h +++ b/FitdLib/config.h @@ -1,7 +1,7 @@ #pragma once #if __cplusplus -#include +#include #include #endif @@ -37,10 +37,10 @@ #define USE_IMGUI #define USE_OPENGL_3_2 #endif - -#ifdef AITD_UE4 -#undef USE_IMGUI -#endif + +#ifdef AITD_UE4 +#undef USE_IMGUI +#endif #ifdef MACOSX #define UNIX @@ -48,7 +48,8 @@ #define HAS_YM3812 1 -#if defined(HAS_STDINT) || AITD_UE4 +#include + typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; @@ -56,15 +57,6 @@ typedef uint32_t u32; typedef int8_t s8; typedef int16_t s16; typedef int32_t s32; -#else -typedef unsigned char u8; -typedef unsigned short int u16; -typedef unsigned long int u32; - -typedef signed char s8; -typedef signed short int s16; -typedef signed long int s32; -#endif #include #include From dd99538b88eb52133e8776bdfbe2ab0703835607 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 7 Jun 2025 21:08:36 -0700 Subject: [PATCH 13/70] Simplify soloud build --- ThirdParty/soloud.cmake/CMakeLists.txt | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/ThirdParty/soloud.cmake/CMakeLists.txt b/ThirdParty/soloud.cmake/CMakeLists.txt index 9a98654..0532c76 100644 --- a/ThirdParty/soloud.cmake/CMakeLists.txt +++ b/ThirdParty/soloud.cmake/CMakeLists.txt @@ -1,16 +1,6 @@ cmake_minimum_required(VERSION 3.0.0) project(soloud C) -IF(${CMAKE_SYSTEM_NAME} MATCHES iOS) -set(SOLOUD_LIB_NAME soloud) -ELSEIF(${CMAKE_SYSTEM_NAME} MATCHES tvOS) -Set(SOLOUD_LIB_NAME soloud) -ELSEIF(${CMAKE_SYSTEM_NAME} MATCHES Darwin) -Set(SOLOUD_LIB_NAME soloud) -ELSE() -set(SOLOUD_LIB_NAME soloud) -ENDIF() - file(GLOB_RECURSE SOLOUD_HEADERS ${soloud_SOURCE_DIR}/soloud/include/*.h) file(GLOB_RECURSE SOLOUD_SOURCES ${soloud_SOURCE_DIR}/soloud/src/core/*.cpp @@ -26,11 +16,7 @@ ${SOLOUD_HEADERS} ${SOLOUD_SOURCES} ) -add_library(${SOLOUD_LIB_NAME} STATIC ${SOLOUD_SOURCES}) +add_library(soloud STATIC ${SOLOUD_SOURCES}) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") -IF(${CMAKE_SYSTEM_NAME} STREQUAL watchOS) -target_compile_definitions(${SOLOUD_LIB_NAME} PRIVATE WITH_NULL=1) -ELSE() -target_compile_definitions(${SOLOUD_LIB_NAME} PRIVATE WITH_SDL3_STATIC=1) -ENDIF() +target_compile_definitions(soloud PRIVATE WITH_SDL3_STATIC=1) From 6d2cb5fc21ee1201d0efb00ce40d66e801b0496a Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 7 Jun 2025 21:41:37 -0700 Subject: [PATCH 14/70] Update soloud sdl3 --- ThirdParty/soloud.cmake/soloud | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ThirdParty/soloud.cmake/soloud b/ThirdParty/soloud.cmake/soloud index d3ef2e8..e9e8aea 160000 --- a/ThirdParty/soloud.cmake/soloud +++ b/ThirdParty/soloud.cmake/soloud @@ -1 +1 @@ -Subproject commit d3ef2e879db2199706050d241fb0a51e7ab9dd38 +Subproject commit e9e8aea38d65a6f3a565ccf6103a4883ae8bb9c6 From 7d1f0b659639fb563cd0bb538c2a382b6ed1802f Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 7 Jun 2025 21:51:33 -0700 Subject: [PATCH 15/70] Disable macos CI for now --- .github/workflows/cmake-multi-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-multi-platform.yml b/.github/workflows/cmake-multi-platform.yml index 4912169..f737086 100644 --- a/.github/workflows/cmake-multi-platform.yml +++ b/.github/workflows/cmake-multi-platform.yml @@ -19,7 +19,7 @@ jobs: # # To add more build types (Release, Debug, RelWithDebInfo, etc.) customize the build_type list. matrix: - os: [ubuntu-latest, windows-2025, macos-latest] + os: [ubuntu-latest, windows-2025] build_type: [Release, Debug] c_compiler: [gcc, clang, cl] include: From 46174243e68c6130a79f2dbeb31be42f8e7ec421 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 7 Jun 2025 22:14:56 -0700 Subject: [PATCH 16/70] Cleanup render backends, enable d3d12 --- FitdLib/bgfxGlue.cpp | 29 ++++++++++++++++++-------- FitdLib/shaders/embeddedShadersMacro.h | 2 +- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/FitdLib/bgfxGlue.cpp b/FitdLib/bgfxGlue.cpp index ef7cbad..172e6a2 100644 --- a/FitdLib/bgfxGlue.cpp +++ b/FitdLib/bgfxGlue.cpp @@ -145,21 +145,32 @@ int initBgfxGlue(int argc, char* argv[]) { createBgfxInitParams(); //initparam.type = bgfx::RendererType::OpenGL; - initparam.type = bgfx::RendererType::Vulkan; + //initparam.type = bgfx::RendererType::Vulkan; + initparam.type = bgfx::RendererType::Direct3D12; bgfx::init(initparam); imguiCreate(); ImGuiIO& io = ImGui::GetIO(); //io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; - -#if BX_PLATFORM_WINDOWS - ImGui_ImplSDL3_InitForD3D(gWindowBGFX); -#elif BX_PLATFORM_OSX - ImGui_ImplSDL3_InitForMetal(gWindowBGFX); -#else - ImGui_ImplSDL3_InitForVulkan(gWindowBGFX); -#endif + if ((bgfx::getRendererType() == bgfx::RendererType::Direct3D11) || (bgfx::getRendererType() == bgfx::RendererType::Direct3D12)) { + ImGui_ImplSDL3_InitForD3D(gWindowBGFX); + } + else + if (bgfx::getRendererType() == bgfx::RendererType::Metal) { + ImGui_ImplSDL3_InitForMetal(gWindowBGFX); + } + else + if (bgfx::getRendererType() == bgfx::RendererType::OpenGL) { + ImGui_ImplSDL3_InitForOpenGL(gWindowBGFX, SDL_GL_GetCurrentContext()); + } + else + if (bgfx::getRendererType() == bgfx::RendererType::Vulkan) { + ImGui_ImplSDL3_InitForVulkan(gWindowBGFX); + } + else { + ImGui_ImplSDL3_InitForOther(gWindowBGFX); + } return true; } diff --git a/FitdLib/shaders/embeddedShadersMacro.h b/FitdLib/shaders/embeddedShadersMacro.h index d430d7d..a0d9394 100644 --- a/FitdLib/shaders/embeddedShadersMacro.h +++ b/FitdLib/shaders/embeddedShadersMacro.h @@ -109,7 +109,7 @@ /*BGFX_EMBEDDED_SHADER_PSSL (bgfx::RendererType::Agc, _name)*/ \ /*BGFX_EMBEDDED_SHADER_DX9BC(bgfx::RendererType::Direct3D9, _name)*/ \ BGFX_EMBEDDED_SHADER_DXBC (bgfx::RendererType::Direct3D11, _name) \ - /*BGFX_EMBEDDED_SHADER_DXBC (bgfx::RendererType::Direct3D12, _name)*/ \ + BGFX_EMBEDDED_SHADER_DXBC (bgfx::RendererType::Direct3D12, _name) \ /*BGFX_EMBEDDED_SHADER_PSSL (bgfx::RendererType::Gnm, _name)*/ \ BGFX_EMBEDDED_SHADER_METAL(bgfx::RendererType::Metal, _name) \ /*BGFX_EMBEDDED_SHADER_NVN (bgfx::RendererType::Nvn, _name)*/ \ From 5b0e051abe016f0e27b713df0ea16b2bf14cc719 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 7 Jun 2025 22:23:59 -0700 Subject: [PATCH 17/70] Don't force d3d12 renderer --- FitdLib/bgfxGlue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FitdLib/bgfxGlue.cpp b/FitdLib/bgfxGlue.cpp index 172e6a2..8315833 100644 --- a/FitdLib/bgfxGlue.cpp +++ b/FitdLib/bgfxGlue.cpp @@ -146,7 +146,7 @@ int initBgfxGlue(int argc, char* argv[]) createBgfxInitParams(); //initparam.type = bgfx::RendererType::OpenGL; //initparam.type = bgfx::RendererType::Vulkan; - initparam.type = bgfx::RendererType::Direct3D12; + //initparam.type = bgfx::RendererType::Direct3D12; bgfx::init(initparam); imguiCreate(); From e69547bd42edb734f36dfeef141a7493a703f072 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 7 Jun 2025 22:24:09 -0700 Subject: [PATCH 18/70] Cleanup shaders --- FitdLib/shaders/background_ps.sc | 8 ++----- FitdLib/shaders/flat_ps.sc | 11 ++-------- FitdLib/shaders/maskBackground_ps.sc | 7 ++----- FitdLib/shaders/noise_ps.sc | 11 ++-------- FitdLib/shaders/palette.sh | 16 ++++++++++++++ FitdLib/shaders/ramp_ps.sc | 11 ++-------- FitdLib/shaders/sphere_ps.sc | 31 +++++++++++----------------- 7 files changed, 38 insertions(+), 57 deletions(-) create mode 100644 FitdLib/shaders/palette.sh diff --git a/FitdLib/shaders/background_ps.sc b/FitdLib/shaders/background_ps.sc index ade4995..c4a2c18 100644 --- a/FitdLib/shaders/background_ps.sc +++ b/FitdLib/shaders/background_ps.sc @@ -1,17 +1,13 @@ $input v_texcoord0 #include "bgfx_shader.sh" +#include "palette.sh" USAMPLER2D(s_backgroundTexture, 0); -USAMPLER2D(s_paletteTexture, 1); void main() { vec2 position = vec2(v_texcoord0.xy) * vec2(320, 200); uvec4 rawTexel = texelFetch(s_backgroundTexture, ivec2(position), 0); - ivec2 base = ivec2(0, rawTexel.r); - gl_FragColor.r = float(texelFetch(s_paletteTexture, base + ivec2(0, 0), 0).r) / 255.f; - gl_FragColor.g = float(texelFetch(s_paletteTexture, base + ivec2(1, 0), 0).r) / 255.f; - gl_FragColor.b = float(texelFetch(s_paletteTexture, base + ivec2(2, 0), 0).r) / 255.f; - gl_FragColor.a = 1.f; + gl_FragColor = getColorFromRawOffset(rawTexel.r); } diff --git a/FitdLib/shaders/flat_ps.sc b/FitdLib/shaders/flat_ps.sc index 517341d..a1cce6c 100644 --- a/FitdLib/shaders/flat_ps.sc +++ b/FitdLib/shaders/flat_ps.sc @@ -1,18 +1,11 @@ $input v_texcoord0 #include "bgfx_shader.sh" - -USAMPLER2D(s_paletteTexture, 1); +#include "palette.sh" void main() { int color = int(v_texcoord0.x * 15.f); int bank = int(v_texcoord0.y * 15.f); - - int colorOffset = (bank << 4) + color; - - gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; - gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; - gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; - gl_FragColor.w = 1.f; + gl_FragColor = getColor(bank, color); } diff --git a/FitdLib/shaders/maskBackground_ps.sc b/FitdLib/shaders/maskBackground_ps.sc index a56f2b6..de102e7 100644 --- a/FitdLib/shaders/maskBackground_ps.sc +++ b/FitdLib/shaders/maskBackground_ps.sc @@ -1,9 +1,9 @@ $input v_texcoord0 #include "bgfx_shader.sh" +#include "palette.sh" USAMPLER2D(s_maskPaletteTexture, 0); -USAMPLER2D(s_paletteTexture, 1); USAMPLER2D(s_backgroundTexture, 2); void main() @@ -14,8 +14,5 @@ void main() discard; uvec4 rawTexel = texelFetch(s_backgroundTexture, ivec2(position), 0); - gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, rawTexel.r), 0).r) / 255.f; - gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, rawTexel.r), 0).r) / 255.f; - gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, rawTexel.r), 0).r) / 255.f; - gl_FragColor.a = 1.f; + gl_FragColor = getColorFromRawOffset(rawTexel.r); } diff --git a/FitdLib/shaders/noise_ps.sc b/FitdLib/shaders/noise_ps.sc index 517341d..a1cce6c 100644 --- a/FitdLib/shaders/noise_ps.sc +++ b/FitdLib/shaders/noise_ps.sc @@ -1,18 +1,11 @@ $input v_texcoord0 #include "bgfx_shader.sh" - -USAMPLER2D(s_paletteTexture, 1); +#include "palette.sh" void main() { int color = int(v_texcoord0.x * 15.f); int bank = int(v_texcoord0.y * 15.f); - - int colorOffset = (bank << 4) + color; - - gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; - gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; - gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; - gl_FragColor.w = 1.f; + gl_FragColor = getColor(bank, color); } diff --git a/FitdLib/shaders/palette.sh b/FitdLib/shaders/palette.sh new file mode 100644 index 0000000..b5e7fe8 --- /dev/null +++ b/FitdLib/shaders/palette.sh @@ -0,0 +1,16 @@ +USAMPLER2D(s_paletteTexture, 1); + +vec4 getColorFromRawOffset(uint colorOffset) { + vec4 outputColor; + outputColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; + outputColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; + outputColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; + outputColor.w = 1.f; + + return outputColor; +} + +vec4 getColor(int bank, int color) { + uint colorOffset = uint((bank << 4) + color); + return getColorFromRawOffset(colorOffset); +} \ No newline at end of file diff --git a/FitdLib/shaders/ramp_ps.sc b/FitdLib/shaders/ramp_ps.sc index 431fef4..21584ff 100644 --- a/FitdLib/shaders/ramp_ps.sc +++ b/FitdLib/shaders/ramp_ps.sc @@ -1,8 +1,7 @@ $input v_texcoord0 #include "bgfx_shader.sh" - -USAMPLER2D(s_paletteTexture, 1); +#include "palette.sh" float _mod(float x, float y) { @@ -21,11 +20,5 @@ void main() int color = int(colorf * 15.f); int bank = int(v_texcoord0.y * 15.f); - - int colorOffset = (bank << 4) + color; - - gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; - gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; - gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; - gl_FragColor.w = 1.f; + gl_FragColor = getColor(bank, color); } diff --git a/FitdLib/shaders/sphere_ps.sc b/FitdLib/shaders/sphere_ps.sc index b2778aa..40aaf57 100644 --- a/FitdLib/shaders/sphere_ps.sc +++ b/FitdLib/shaders/sphere_ps.sc @@ -1,8 +1,7 @@ $input v_texcoord0, v_sphereParams, v_screenSpacePosition #include "bgfx_shader.sh" - -USAMPLER2D(s_paletteTexture, 1); +#include "palette.sh" void main() { @@ -17,16 +16,11 @@ void main() int material = int(v_sphereParams.w); if(material == 0) { // flat - int colorOffset = (bank << 4) + color; - gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; - gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; - gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; - gl_FragColor.w = 1.f; - } else if(material == 2) { // transparent - int colorOffset = (bank << 4) + color; - gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; - gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; - gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; + gl_FragColor = getColor(bank, color); + } else if(material == 1) { // TODO! + gl_FragColor = getColor(bank, color); + } else if(material == 2) { // transparent + gl_FragColor = getColor(bank, color); gl_FragColor.w = 0.5f; } else if(material == 3) { // marbre vec2 normalizedPosition = (v_screenSpacePosition.xy - sphereCenter.xy) / sphereSize; @@ -34,13 +28,12 @@ void main() float distanceToCircleOnScanline = cos(angle) - normalizedPosition.x; // value is in 0/2 range distanceToCircleOnScanline /= 2.f; // remap to 0 / 1 color = int((1.f - distanceToCircleOnScanline) * 15.f); - - int colorOffset = (bank << 4) + color; - gl_FragColor.r = float(texelFetch(s_paletteTexture, ivec2(0, colorOffset), 0).r) / 255.f; - gl_FragColor.g = float(texelFetch(s_paletteTexture, ivec2(1, colorOffset), 0).r) / 255.f; - gl_FragColor.b = float(texelFetch(s_paletteTexture, ivec2(2, colorOffset), 0).r) / 255.f; - gl_FragColor.w = 1.f; - } else { + gl_FragColor = getColor(bank, color); + } else if(material == 4) { // TODO! + gl_FragColor = getColor(bank, color); + } else if(material == 6) { // TODO! + gl_FragColor = getColor(bank, color); + } else { gl_FragColor.r = 1.f; gl_FragColor.g = 0.f; gl_FragColor.b = 0.f; From c61013aacbe7f77a440d4382b6e52913ee804cc3 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 7 Jun 2025 22:26:06 -0700 Subject: [PATCH 19/70] Remove more macos CI --- .github/workflows/cmake-multi-platform.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cmake-multi-platform.yml b/.github/workflows/cmake-multi-platform.yml index f737086..0d4bec3 100644 --- a/.github/workflows/cmake-multi-platform.yml +++ b/.github/workflows/cmake-multi-platform.yml @@ -32,9 +32,9 @@ jobs: - os: ubuntu-latest c_compiler: clang cpp_compiler: clang++ - - os: macos-latest - c_compiler: clang - cpp_compiler: clang++ + #- os: macos-latest + # c_compiler: clang + # cpp_compiler: clang++ exclude: - os: windows-2025 c_compiler: gcc From 11f27bdfc88a071976f45a322320e5164b434554 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 9 Jun 2025 00:12:03 -0700 Subject: [PATCH 20/70] Cleanups and AITD3 steam/GOG support AITD3 dos and windows have different data layouts for some reasons, switch to supporting the steam/GOG version that is more common. --- FitdLib/AITD3.cpp | 2 +- FitdLib/config.h | 1 + FitdLib/floor.cpp | 131 +++++++++++++++-------------------------- FitdLib/floor.h | 1 - FitdLib/font.cpp | 16 ++--- FitdLib/font.h | 4 +- FitdLib/inventory.cpp | 4 +- FitdLib/main.cpp | 66 +++++++-------------- FitdLib/main.h | 8 +-- FitdLib/osystemSDL.cpp | 2 +- FitdLib/palette.cpp | 2 +- FitdLib/room.cpp | 49 +++++++-------- FitdLib/room.h | 16 ++--- FitdLib/vars.cpp | 4 +- 14 files changed, 120 insertions(+), 186 deletions(-) diff --git a/FitdLib/AITD3.cpp b/FitdLib/AITD3.cpp index af0a773..e532e31 100644 --- a/FitdLib/AITD3.cpp +++ b/FitdLib/AITD3.cpp @@ -36,7 +36,7 @@ void startAITD3() { g_gameUseCDA = true; - //startGame(1,0,0); + startGame(1,0,0); while(1) { diff --git a/FitdLib/config.h b/FitdLib/config.h index c580d19..9aa1ed1 100644 --- a/FitdLib/config.h +++ b/FitdLib/config.h @@ -3,6 +3,7 @@ #if __cplusplus #include #include +#include #endif #ifdef __APPLE__ diff --git a/FitdLib/floor.cpp b/FitdLib/floor.cpp index 74a90b9..0378654 100644 --- a/FitdLib/floor.cpp +++ b/FitdLib/floor.cpp @@ -2,7 +2,6 @@ u32 g_currentFloorRoomRawDataSize = 0; u32 g_currentFloorCameraRawDataSize; -u32 g_currentFloorNumCamera = 0; std::vector g_currentFloorCameraData; void loadFloor(int floorNumber) @@ -10,7 +9,6 @@ void loadFloor(int floorNumber) int i; int expectedNumberOfRoom; int expectedNumberOfCamera; - char floorFileName[256]; if(g_currentFloorCameraRawData) { @@ -25,15 +23,17 @@ void loadFloor(int floorNumber) g_currentFloor = floorNumber; - if(g_gameId < AITD3) + if(g_gameId <= AITD3) { - sprintf(floorFileName,"ETAGE%02d",floorNumber); - - g_currentFloorRoomRawDataSize = getPakSize(floorFileName,0); - g_currentFloorCameraRawDataSize = getPakSize(floorFileName,1); + std::string floorFileName = std::format("ETAGE{:02d}", floorNumber); + if (fileExists((floorFileName+".PAK").c_str())) + { + g_currentFloorRoomRawDataSize = getPakSize(floorFileName.c_str(), 0); + g_currentFloorCameraRawDataSize = getPakSize(floorFileName.c_str(), 1); - g_currentFloorRoomRawData = CheckLoadMallocPak(floorFileName,0); - g_currentFloorCameraRawData = CheckLoadMallocPak(floorFileName,1); + g_currentFloorRoomRawData = CheckLoadMallocPak(floorFileName.c_str(), 0); + g_currentFloorCameraRawData = CheckLoadMallocPak(floorFileName.c_str(), 1); + } } currentCamera = -1; @@ -42,51 +42,40 @@ void loadFloor(int floorNumber) ////////////////////////////////// - if(roomDataTable) - { - free(roomDataTable); - roomDataTable = NULL; - } + roomDataTable.clear(); expectedNumberOfRoom = getNumberOfRoom(); + assert(expectedNumberOfRoom); + + roomDataTable.reserve(expectedNumberOfRoom); for(i=0;i= AITD3) - { - char buffer[256]; - - if(g_gameId == AITD3) + if (g_currentFloorRoomRawDataSize == 0) { + if (fileExists(std::format("ETAGE{:02d}.PAK", floorNumber).c_str())) { - sprintf(buffer,"SAL%02d",floorNumber); + roomData = (u8*)CheckLoadMallocPak(std::format("ETAGE{:02d}", floorNumber).c_str(), i); } - else + else if (fileExists(std::format("SAL{:02d}.PAK", floorNumber).c_str())) { - sprintf(buffer,"ETAGE%02d",floorNumber); + roomData = (u8*)CheckLoadMallocPak(std::format("SAL{:02d}", floorNumber).c_str(), i); + } + else { + assert(0); } - - roomData = (u8*)CheckLoadMallocPak(buffer,i); } else { roomData = (u8*)(g_currentFloorRoomRawData + READ_LE_U32(g_currentFloorRoomRawData + i * 4)); } - currentRoomDataPtr = &roomDataTable[i]; + assert(roomData); + + roomDataStruct* currentRoomDataPtr = &roomDataTable.emplace_back(); currentRoomDataPtr->worldX = READ_LE_S16(roomData+4); currentRoomDataPtr->worldY = READ_LE_S16(roomData+6); @@ -94,11 +83,11 @@ void loadFloor(int floorNumber) currentRoomDataPtr->numCameraInRoom = READ_LE_U16(roomData+0xA); - currentRoomDataPtr->cameraIdxTable = (u16*)malloc(currentRoomDataPtr->numCameraInRoom*sizeof(s16)); + currentRoomDataPtr->cameraIdxTable.reserve(currentRoomDataPtr->numCameraInRoom); for(j=0;jnumCameraInRoom;j++) { - currentRoomDataPtr->cameraIdxTable[j] = READ_LE_U16(roomData+0xC+2*j); + currentRoomDataPtr->cameraIdxTable.push_back(READ_LE_U16(roomData+0xC+2*j)); } // hard col read @@ -107,15 +96,12 @@ void loadFloor(int floorNumber) currentRoomDataPtr->numHardCol = READ_LE_U16(hardColData); hardColData+=2; - if(currentRoomDataPtr->numHardCol) { - currentRoomDataPtr->hardColTable = (hardColStruct*)malloc(sizeof(hardColStruct)*currentRoomDataPtr->numHardCol); + currentRoomDataPtr->hardColTable.resize(currentRoomDataPtr->numHardCol); for(j=0;jnumHardCol;j++) { - ZVStruct* zvData; - - zvData = ¤tRoomDataPtr->hardColTable[j].zv; + ZVStruct* zvData = ¤tRoomDataPtr->hardColTable[j].zv; zvData->ZVX1 = READ_LE_S16(hardColData+0x00); zvData->ZVX2 = READ_LE_S16(hardColData+0x02); @@ -130,10 +116,6 @@ void loadFloor(int floorNumber) hardColData+=0x10; } } - else - { - currentRoomDataPtr->hardColTable = NULL; - } // sce zone read @@ -141,9 +123,8 @@ void loadFloor(int floorNumber) currentRoomDataPtr->numSceZone = READ_LE_U16(sceZoneData); sceZoneData+=2; - if(currentRoomDataPtr->numSceZone) { - currentRoomDataPtr->sceZoneTable = (sceZoneStruct*)malloc(sizeof(sceZoneStruct)*currentRoomDataPtr->numSceZone); + currentRoomDataPtr->sceZoneTable.resize(currentRoomDataPtr->numSceZone); for(j=0;jnumSceZone;j++) { @@ -164,23 +145,19 @@ void loadFloor(int floorNumber) sceZoneData+=0x10; } } - else - { - currentRoomDataPtr->sceZoneTable = NULL; - } } /////////////////////////////////// ///////////////////////////////////////////////// // camera stuff - if(g_gameId >= AITD3) + if(g_currentFloorCameraRawData == nullptr) { char buffer[256]; if(g_gameId == AITD3) { - sprintf(buffer,"CAM%02d",floorNumber); + sprintf(buffer,"CAMERA%02d",floorNumber); } else { @@ -221,22 +198,20 @@ void loadFloor(int floorNumber) unsigned int offset; unsigned char* currentCameraData; - if(g_gameId >= AITD3) + if (g_currentFloorCameraRawData == nullptr) { - char buffer[256]; - - if(g_gameId == AITD3) - { - sprintf(buffer,"CAM%02d",floorNumber); + if (fileExists(std::format("CAM{:02d}.PAK", g_currentFloor).c_str())) { + currentCameraData = (unsigned char*)CheckLoadMallocPak(std::format("CAM{:02d}", g_currentFloor).c_str(), i); } - else - { - sprintf(buffer,"CAMSAL%02d",floorNumber); + else if (fileExists(std::format("CAMSAL{:02d}.PAK", g_currentFloor).c_str())) { + currentCameraData = (unsigned char*)CheckLoadMallocPak(std::format("CAMSAL{:02d}", g_currentFloor).c_str(), i); + } + else { + assert(0); } offset = 0; g_currentFloorCameraRawDataSize = 1; - currentCameraData = (unsigned char*)CheckLoadMallocPak(buffer,i); } else { @@ -248,7 +223,7 @@ void loadFloor(int floorNumber) { unsigned char* backupDataPtr; - if(g_gameIdviewedRoomIdx = READ_LE_U16(currentCameraData+0x00); pCurrentCameraViewedRoom->offsetToMask = READ_LE_U16(currentCameraData+0x02); @@ -312,23 +283,21 @@ void loadFloor(int floorNumber) pCurrentCameraViewedRoom->numMask = READ_LE_U16(pMaskData); pMaskData+=2; - pCurrentCameraViewedRoom->masks = (cameraMaskStruct*)malloc(sizeof(cameraMaskStruct)*pCurrentCameraViewedRoom->numMask); - memset(pCurrentCameraViewedRoom->masks, 0, sizeof(cameraMaskStruct)*pCurrentCameraViewedRoom->numMask); + pCurrentCameraViewedRoom->masks.reserve(pCurrentCameraViewedRoom->numMask); for(int k=0; knumMask; k++) { - cameraMaskStruct* pCurrentCameraMask = &pCurrentCameraViewedRoom->masks[k]; + cameraMaskStruct* pCurrentCameraMask = &pCurrentCameraViewedRoom->masks.emplace_back(); // for this overlay zone, how many pCurrentCameraMask->numTestRect = READ_LE_U16(pMaskData); pMaskData+=2; - pCurrentCameraMask->rectTests = (rectTestStruct*)malloc(sizeof(rectTestStruct)*pCurrentCameraMask->numTestRect); - memset(pCurrentCameraMask->rectTests, 0, sizeof(rectTestStruct)*pCurrentCameraMask->numTestRect); + pCurrentCameraMask->rectTests.reserve(pCurrentCameraMask->numTestRect); for(int j=0; jnumTestRect; j++) { - rectTestStruct* pCurrentRectTest = &pCurrentCameraMask->rectTests[j]; + rectTestStruct* pCurrentRectTest = &pCurrentCameraMask->rectTests.emplace_back(); pCurrentRectTest->zoneX1 = READ_LE_S16(pMaskData); pCurrentRectTest->zoneZ1 = READ_LE_S16(pMaskData+2); @@ -355,9 +324,7 @@ void loadFloor(int floorNumber) pCurrentCameraViewedRoom->numCoverZones = numZones =READ_LE_U16(pZoneData); pZoneData+=2; - pCurrentCameraViewedRoom->coverZones = (cameraZoneEntryStruct*)malloc(sizeof(cameraZoneEntryStruct)*numZones); - - ASSERT(pCurrentCameraViewedRoom->coverZones); + pCurrentCameraViewedRoom->coverZones.resize(numZones); for(j=0;jnumCoverZones;j++) { @@ -399,8 +366,6 @@ void loadFloor(int floorNumber) } } - g_currentFloorNumCamera = i-1; - // globalCameraDataTable = (cameraDataStruct*)realloc(globalCameraDataTable,sizeof(cameraDataStruct)*numGlobalCamera); /* roomCameraData+=0x14; diff --git a/FitdLib/floor.h b/FitdLib/floor.h index b704ca4..661e4cb 100644 --- a/FitdLib/floor.h +++ b/FitdLib/floor.h @@ -3,7 +3,6 @@ extern std::vector g_currentFloorCameraData; extern u32 g_currentFloorRoomRawDataSize; -extern u32 g_currentFloorNumCamera; void loadFloor(int floorNumber); diff --git a/FitdLib/font.cpp b/FitdLib/font.cpp index c9cc65a..172e9c8 100644 --- a/FitdLib/font.cpp +++ b/FitdLib/font.cpp @@ -21,7 +21,7 @@ s16 fontSm9 = 0x80; unsigned char flagTable[]= {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; -void ExtSetFont(char* fontData, int color) +void SetFont(char* fontData, int color) { s16 tempDx; s16 tempAxFlip; @@ -90,7 +90,7 @@ int ExtGetSizeFont(u8* string) return(width); } -void renderText(int x, int y, char* surface, u8* string) +void PrintFont(int x, int y, char* surface, u8* string) { unsigned char character; @@ -192,11 +192,11 @@ void SelectedMessage(int x, int y, int index, int color1, int color2) textPtr = entryPtr->textPtr; - ExtSetFont(PtrFont,color2); - renderText(x,y+1,logicalScreen,textPtr); + SetFont(PtrFont,color2); + PrintFont(x,y+1,logicalScreen,textPtr); - ExtSetFont(PtrFont,color1); - renderText(x,y,logicalScreen,textPtr); + SetFont(PtrFont,color1); + PrintFont(x,y,logicalScreen,textPtr); } @@ -211,7 +211,7 @@ void SimpleMessage(int x, int y, int index, int color) u8* textPtr = entryPtr->textPtr; - ExtSetFont(PtrFont,color); + SetFont(PtrFont,color); - renderText(x,y+1,logicalScreen,textPtr); + PrintFont(x,y+1,logicalScreen,textPtr); } diff --git a/FitdLib/font.h b/FitdLib/font.h index 2bcbaa2..397af55 100644 --- a/FitdLib/font.h +++ b/FitdLib/font.h @@ -1,8 +1,8 @@ extern int fontHeight; -void ExtSetFont(char* fontData, int color); +void SetFont(char* fontData, int color); void SetFontSpace(int interWordSpace, int interLetterSpace); int ExtGetSizeFont(u8* string); -void renderText(int x, int y, char* surface, u8* string); +void PrintFont(int x, int y, char* surface, u8* string); void SelectedMessage(int x, int y, int index, int color1, int color2); void SimpleMessage(int x, int y, int index, int color); diff --git a/FitdLib/inventory.cpp b/FitdLib/inventory.cpp index 9911be6..fd49b52 100644 --- a/FitdLib/inventory.cpp +++ b/FitdLib/inventory.cpp @@ -103,9 +103,9 @@ void renderInventoryObject(int arg) if(arg!=-1) { u8 buffer[256]; - ExtSetFont(PtrFont,4); + SetFont(PtrFont,4); sprintf((char*)buffer,"%d",vars[arg]); - renderText(statusLeft+4,statusTop+4,logicalScreen,buffer); + PrintFont(statusLeft+4,statusTop+4,logicalScreen,buffer); } switch(g_gameId) diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 412b9b5..3ff9251 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -278,11 +278,6 @@ void allocTextes(void) } // setup languageNameString - if(g_gameId == AITD3) - { - strcpy(languageNameString,"TEXTES"); - } - else { for (int i=0; itextPtr); + PrintFont(currentTextX, currentTextY, logicalScreen, currentText->textPtr); currentTextX += currentText->width + interWordSpace; // add inter word space currentText++; } @@ -1322,7 +1296,7 @@ void loadCamera(int cameraIdx) if(g_gameId == AITD3) { - memmove(aux,aux+4,64000+0x300); + //memmove(aux,aux+4,64000+0x300); } if(g_gameId >= JACK) @@ -1331,7 +1305,11 @@ void loadCamera(int cameraIdx) if(g_gameId == AITD3) { - //memcpy(palette,defaultPaletteAITD3,0x30); + for (int i = 0; i < 16; i++) { + currentGamePalette[i][0] = defaultPaletteAITD3[i * 3 + 0]; + currentGamePalette[i][1] = defaultPaletteAITD3[i * 3 + 1]; + currentGamePalette[i][2] = defaultPaletteAITD3[i * 3 + 2]; + } } else { @@ -1340,8 +1318,8 @@ void loadCamera(int cameraIdx) currentGamePalette[i][1] = defaultPalette[i * 3 + 1]; currentGamePalette[i][2] = defaultPalette[i * 3 + 2]; } - convertPaletteIfRequired(currentGamePalette); } + convertPaletteIfRequired(currentGamePalette); osystem_setPalette(¤tGamePalette); } @@ -2754,7 +2732,7 @@ void drawMaskZone(cameraMaskStruct* maskZonePtr) { for(int i=0; inumTestRect; i++) { - drawAAQuad(maskZonePtr->rectTests->zoneX1*10, maskZonePtr->rectTests->zoneX2*10, maskZonePtr->rectTests->zoneZ1*10, maskZonePtr->rectTests->zoneZ2*10); + drawAAQuad(maskZonePtr->rectTests[i].zoneX1*10, maskZonePtr->rectTests[i].zoneX2*10, maskZonePtr->rectTests[i].zoneZ1*10, maskZonePtr->rectTests[i].zoneZ2*10); } } @@ -3942,7 +3920,7 @@ int AsmCheckListCol(ZVStruct* zvPtr, roomDataStruct* pRoomData) { u16 i; int hardColVar = 0; - hardColStruct* pCurrentEntry = pRoomData->hardColTable; + hardColStruct* pCurrentEntry = pRoomData->hardColTable.data(); #ifdef FITD_DEBUGGER if(debuggerVar_noHardClip) @@ -4163,7 +4141,7 @@ sceZoneStruct* processActor2Sub(int x, int y, int z, roomDataStruct* pRoomData) u32 i; sceZoneStruct* pCurrentZone; - pCurrentZone = pRoomData->sceZoneTable; + pCurrentZone = pRoomData->sceZoneTable.data(); for(i=0;inumSceZone;i++) { @@ -4761,14 +4739,14 @@ int drawTextOverlay(void) { if(currentMessage->time<26) { - ExtSetFont(PtrFont,16); + SetFont(PtrFont,16); } else { - ExtSetFont(PtrFont,16+(currentMessage->time-26)/2); + SetFont(PtrFont,16+(currentMessage->time-26)/2); } - renderText(X,var_10+1,logicalScreen,currentMessage->string->textPtr); + PrintFont(X,var_10+1,logicalScreen,currentMessage->string->textPtr); } var_10 -= 16; diff --git a/FitdLib/main.h b/FitdLib/main.h index e5ad165..b99c226 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -34,13 +34,7 @@ void HQ_Free_Malloc(hqrEntryStruct* hqrPtr, int index); void playSequence(int sequenceIdx, int fadeStart, int fadeOutVar); -#ifndef WIN32 -extern "C" { -#endif -int fileExists(const char* name); -#ifndef WIN32 -} -#endif +bool fileExists(const char* name); void OpenProgram(void); void freeAll(void); diff --git a/FitdLib/osystemSDL.cpp b/FitdLib/osystemSDL.cpp index 5cc2d0b..bae3f14 100644 --- a/FitdLib/osystemSDL.cpp +++ b/FitdLib/osystemSDL.cpp @@ -241,7 +241,7 @@ void osystem_endOfFrame() } -int fileExists(const char* name) +bool fileExists(const char* name) { FILE* fHandle; diff --git a/FitdLib/palette.cpp b/FitdLib/palette.cpp index ba357bd..f427c65 100644 --- a/FitdLib/palette.cpp +++ b/FitdLib/palette.cpp @@ -40,7 +40,7 @@ void copyPalette(void* source, palette_t& dest) void convertPaletteIfRequired(palette_t& lpalette) { - if (g_gameId >= JACK && g_gameId < AITD3) + if (g_gameId >= JACK && g_gameId <= AITD3) { for (int i = 0; i < 256; i++) { diff --git a/FitdLib/room.cpp b/FitdLib/room.cpp index 02e60dc..129be24 100644 --- a/FitdLib/room.cpp +++ b/FitdLib/room.cpp @@ -13,7 +13,7 @@ etageVar1 -> table for camera data */ -roomDataStruct* roomDataTable = NULL; +std::vector roomDataTable; cameraDataStruct* cameraDataTable[NUM_MAX_CAMERA_IN_ROOM]; cameraViewedRoomStruct* currentCameraZoneList[NUM_MAX_CAMERA_IN_ROOM]; @@ -24,32 +24,13 @@ roomDefStruct* getRoomData(int roomNumber) int getNumberOfRoom() { - int i; - int j = 0; - - if(g_gameId >= AITD3) - { - char buffer[256]; - - if(g_gameId == AITD3) - { - sprintf(buffer,"SAL%02d",g_currentFloor); - } - else - { - sprintf(buffer,"ETAGE%02d",g_currentFloor); - } - - return PAK_getNumFiles(buffer); - } - else - { + if (g_currentFloorRoomRawData) { + int numMax = (((READ_LE_U32(g_currentFloorRoomRawData)) / 4)); - int numMax = (((READ_LE_U32(g_currentFloorRoomRawData))/4)); - - for(i=0;i= READ_LE_U32(g_currentFloorRoomRawData + i * 4)) + if (g_currentFloorRoomRawDataSize >= READ_LE_U32(g_currentFloorRoomRawData + i * 4)) { j++; } @@ -58,8 +39,22 @@ int getNumberOfRoom() return j; } } + return j; } - return j; + else { + if (fileExists(std::format("ETAGE{:02d}.PAK", g_currentFloor).c_str())) { + return PAK_getNumFiles(std::format("ETAGE{:02d}", g_currentFloor).c_str()); + } + else if (fileExists(std::format("SAL{:02d}.PAK", g_currentFloor).c_str())) { + return PAK_getNumFiles(std::format("SAL{:02d}", g_currentFloor).c_str()); + } + else { + assert(0); + } + } + + assert(false); + return 0; } void loadRoom(int roomNumber) @@ -122,7 +117,7 @@ void loadRoom(int roomNumber) { unsigned int currentCameraIdx = roomDataTable[currentRoom].cameraIdxTable[i]; // indexes are between the roomDefStruct and the first zone data - ASSERT(currentCameraIdx<=g_currentFloorNumCamera); + ASSERT(currentCameraIdx <= g_currentFloorCameraData.size()); if(oldCameraIdx == currentCameraIdx) { diff --git a/FitdLib/room.h b/FitdLib/room.h index 401605a..a29e29a 100644 --- a/FitdLib/room.h +++ b/FitdLib/room.h @@ -50,7 +50,7 @@ struct rectTestStruct struct cameraMaskStruct { u16 numTestRect; - rectTestStruct* rectTests; + std::vector rectTests; }; struct cameraViewedRoomStruct @@ -65,9 +65,9 @@ struct cameraViewedRoomStruct s16 lightZ; u16 numMask; - cameraMaskStruct* masks; + std::vector masks; u16 numCoverZones; - cameraZoneEntryStruct* coverZones; + std::vector coverZones; }; struct cameraDataStruct @@ -85,7 +85,7 @@ struct cameraDataStruct s16 focal3; u16 numViewedRooms; - cameraViewedRoomStruct* viewedRoomTable; + std::vector viewedRoomTable; }; struct roomDataStruct @@ -93,22 +93,22 @@ struct roomDataStruct u32 numCameraInRoom; u32 numHardCol; - hardColStruct* hardColTable; + std::vector hardColTable; u32 numSceZone; - sceZoneStruct* sceZoneTable; + std::vector sceZoneTable; s32 worldX; s32 worldY; s32 worldZ; - u16* cameraIdxTable; + std::vector cameraIdxTable; }; typedef struct roomDataStruct roomDataStruct; extern cameraDataStruct* cameraDataTable[NUM_MAX_CAMERA_IN_ROOM]; extern cameraViewedRoomStruct* currentCameraZoneList[NUM_MAX_CAMERA_IN_ROOM]; -extern roomDataStruct* roomDataTable; +extern std::vector roomDataTable; roomDefStruct* getRoomData(int roomNumber); void loadRoom(int roomNumber); diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index f0dc4bb..eeb62e6 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -55,9 +55,11 @@ char localClick; const std::vector languageNameTable = { + "TEXTES", + "ENGLISH", + "USA", "FRANCAIS", "ITALIANO", - "ENGLISH", "ESPAGNOL", "DEUTSCH", }; From 48745c2f7b5bed97bf9b9cfa7edbad47e5f3d71a Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 9 Jun 2025 00:35:26 -0700 Subject: [PATCH 21/70] Some renaming --- FitdLib/animAction.cpp | 2 +- FitdLib/debugger.cpp | 2 +- FitdLib/evalVar.cpp | 84 +++++++++++++++++++++--------------------- FitdLib/inventory.cpp | 2 +- FitdLib/life.cpp | 18 ++++----- FitdLib/main.cpp | 55 +++++++++++++-------------- FitdLib/main.h | 2 +- FitdLib/save.cpp | 10 ++--- FitdLib/vars.cpp | 2 +- FitdLib/vars.h | 4 +- 10 files changed, 91 insertions(+), 90 deletions(-) diff --git a/FitdLib/animAction.cpp b/FitdLib/animAction.cpp index 59633ea..5c11711 100644 --- a/FitdLib/animAction.cpp +++ b/FitdLib/animAction.cpp @@ -193,7 +193,7 @@ void GereFrappe(void) objPtr->alpha = currentProcessedActorPtr->alpha; objPtr->beta = currentProcessedActorPtr->beta+0x200; - objPtr->flags2 &= 0xBFFF; + objPtr->foundFlag &= 0xBFFF; objPtr->flags |= 0x85; objPtr->flags &= 0xFFDF; diff --git a/FitdLib/debugger.cpp b/FitdLib/debugger.cpp index 8513059..5ca9196 100644 --- a/FitdLib/debugger.cpp +++ b/FitdLib/debugger.cpp @@ -194,7 +194,7 @@ void debugger_draw(void) InputS16("typeZV", &pWorldObject->typeZV); InputS16("foundBody", &pWorldObject->foundBody); InputS16("foundName", &pWorldObject->foundName); - InputS16("flags2", &pWorldObject->flags2); + InputS16("flags2", &pWorldObject->foundFlag); InputS16("foundLife", &pWorldObject->foundLife); InputS16("x", &pWorldObject->x); InputS16("y", &pWorldObject->y); diff --git a/FitdLib/evalVar.cpp b/FitdLib/evalVar.cpp index 7fa0e56..fe35cdb 100644 --- a/FitdLib/evalVar.cpp +++ b/FitdLib/evalVar.cpp @@ -362,7 +362,7 @@ int evalVar(const char* name) } case 0x10: // found { - if(ListWorldObjets[evalVar()].flags2 & 0x8000) + if(ListWorldObjets[evalVar()].foundFlag & 0x8000) { return(1); } @@ -485,7 +485,7 @@ int evalVar(const char* name) objNum = *(s16*)currentLifePtr; currentLifePtr+=2; - if(ListWorldObjets[objNum].flags2 & 0xC000) + if(ListWorldObjets[objNum].foundFlag & 0xC000) { return(1); } @@ -539,7 +539,7 @@ int evalVar(const char* name) objNum = *(s16*)currentLifePtr; currentLifePtr+=2; - if(ListWorldObjets[objNum].flags2 & 0x1000) + if(ListWorldObjets[objNum].foundFlag & 0x1000) { return 1; } @@ -570,11 +570,11 @@ int evalVar2(const char* name) if(var1 == -1) { int temp = *(s16*)(currentLifePtr); - currentLifePtr+=2; + currentLifePtr+=2; - if (name) - appendFormated("%s:", name); - appendFormated("%d, ", temp); + if (name) + appendFormated("%s:", name); + appendFormated("%d, ", temp); return(temp); } @@ -582,11 +582,11 @@ int evalVar2(const char* name) if(var1 == 0) { int temp = *(s16*)(currentLifePtr); - currentLifePtr+=2; - - if (name) - appendFormated("%s:", name); - appendFormated("vars[%d], ", temp); + currentLifePtr+=2; + + if (name) + appendFormated("%s:", name); + appendFormated("vars[%d], ", temp); return(vars[temp]); } @@ -611,19 +611,19 @@ int evalVar2(const char* name) switch(var1 & 0x7FFF) { case 0x1F: - { - if (name) - appendFormated("%s:", name); - appendFormated("worldObjects[%d].room, ", objectNumber); + { + if (name) + appendFormated("%s:", name); + appendFormated("worldObjects[%d].room, ", objectNumber); return(ListWorldObjets[objectNumber].room); break; } case 0x24: - { - if (name) - appendFormated("%s:", name); - appendFormated("worldObjects[%d].stage, ", objectNumber); + { + if (name) + appendFormated("%s:", name); + appendFormated("worldObjects[%d].stage, ", objectNumber); return(ListWorldObjets[objectNumber].stage); break; @@ -646,12 +646,12 @@ int evalVar2(const char* name) switch(var1) { case 0x0: - { - int temp1 = actorPtr->COL[0]; - - if (name) - appendFormated("%s:", name); - appendFormated("objectTable[%d].COL, ", temp1); + { + int temp1 = actorPtr->COL[0]; + + if (name) + appendFormated("%s:", name); + appendFormated("objectTable[%d].COL, ", temp1); if(temp1 != -1) { @@ -664,26 +664,26 @@ int evalVar2(const char* name) break; } case 0x1: - { - if (name) - appendFormated("%s:", name); + { + if (name) + appendFormated("%s:", name); appendFormated("HARD_DEC, "); return(actorPtr->HARD_DEC); break; } case 0x2: - { - if (name) - appendFormated("%s:", name); + { + if (name) + appendFormated("%s:", name); appendFormated("HARD_COL, "); return(actorPtr->HARD_COL); break; } case 0x3: - { - if (name) - appendFormated("%s:", name); + { + if (name) + appendFormated("%s:", name); appendFormated("HIT, "); int temp = actorPtr->HIT; @@ -803,7 +803,7 @@ int evalVar2(const char* name) } case 0x10: // found { - if(ListWorldObjets[evalVar()].flags2 & 0x8000) + if(ListWorldObjets[evalVar()].foundFlag & 0x8000) { return(1); } @@ -926,7 +926,7 @@ int evalVar2(const char* name) objNum = *(s16*)currentLifePtr; currentLifePtr+=2; - if(ListWorldObjets[objNum].flags2 & 0xC000) + if(ListWorldObjets[objNum].foundFlag & 0xC000) { return(1); } @@ -961,7 +961,7 @@ int evalVar2(const char* name) objNum = *(s16*)currentLifePtr; currentLifePtr+=2; - if(ListWorldObjets[objNum].flags2 & 0x1000) + if(ListWorldObjets[objNum].foundFlag & 0x1000) { return 1; } @@ -994,16 +994,16 @@ int evalVar2(const char* name) { return 1; break; - } - case 0x2A: // related to samples + } + case 0x2A: // related to samples { - return 1; + return 1; break; } default: { printf("Unhandled test type %X in evalVar\n",var1); - assert(0); + assert(0); return 0; break; } diff --git a/FitdLib/inventory.cpp b/FitdLib/inventory.cpp index fd49b52..a6a775c 100644 --- a/FitdLib/inventory.cpp +++ b/FitdLib/inventory.cpp @@ -325,7 +325,7 @@ void processInventory(void) currentFoundBody = HQR_Get(listBody,currentFoundBodyIdx); - var_C = ListWorldObjets[selectedWorldObjectIdx].flags2; + var_C = ListWorldObjets[selectedWorldObjectIdx].foundFlag; numInventoryActions = 0; numActionForObject = 0; diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index f07aa58..7ae4c89 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -30,7 +30,7 @@ void throwObj(int animThrow, int frameThrow, int arg_4, int objToThrowIdx, int t ListWorldObjets[objToThrowIdx].gamma -= 0x100; } - ListWorldObjets[objToThrowIdx].flags2 |= 0x1000; + ListWorldObjets[objToThrowIdx].foundFlag |= 0x1000; } } @@ -51,7 +51,7 @@ void put(int x, int y, int z, int room, int stage, int alpha, int beta, int gamm DeleteInventoryObjet(idx); - objPtr->flags2 |= 0x4000; + objPtr->foundFlag |= 0x4000; /* FlagGenereActiveList = 1; FlagRefreshAux2 = 1; */ @@ -704,8 +704,8 @@ void processLife(int lifeNum, bool callFoundLife) } case LM_FOUND_FLAG: // FOUND_FLAG { - ListWorldObjets[var_6].flags2 &= 0xE000; - ListWorldObjets[var_6].flags2 |= *(s16*)(currentLifePtr); + ListWorldObjets[var_6].foundFlag &= 0xE000; + ListWorldObjets[var_6].foundFlag |= *(s16*)(currentLifePtr); currentLifePtr += 2; break; @@ -1290,7 +1290,7 @@ void processLife(int lifeNum, bool callFoundLife) } else { - currentProcessedActorPtr->dynFlags &= 0xFFFE; + currentProcessedActorPtr->dynFlags &= ~1; } break; @@ -1354,9 +1354,9 @@ void processLife(int lifeNum, bool callFoundLife) { if (g_gameId == AITD1) // TODO: check, really useful ? { - ListWorldObjets[lifeTempVar1].flags2 &= 0x7FFF; + ListWorldObjets[lifeTempVar1].foundFlag &= ~0x8000; } - ListWorldObjets[lifeTempVar1].flags2 |= 0x4000; + ListWorldObjets[lifeTempVar1].foundFlag |= 0x4000; } break; @@ -1572,8 +1572,8 @@ void processLife(int lifeNum, bool callFoundLife) case LM_FOUND_FLAG: // FOUND_FLAG { appendFormated("LM_FOUND_FLAG "); - ListWorldObjets[currentProcessedActorPtr->indexInWorld].flags2 &= 0xE000; - ListWorldObjets[currentProcessedActorPtr->indexInWorld].flags2 |= *(s16*)(currentLifePtr); + ListWorldObjets[currentProcessedActorPtr->indexInWorld].foundFlag &= 0xE000; + ListWorldObjets[currentProcessedActorPtr->indexInWorld].foundFlag |= *(s16*)(currentLifePtr); currentLifePtr += 2; break; } diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 3ff9251..0843b40 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -288,20 +288,20 @@ void allocTextes(void) if (fileExists(tempString)) { - strcpy(languageNameString, languageNameTable[i].c_str()); + languageNameString = languageNameTable[i].c_str(); break; } } } - if(!languageNameString[0]) + if(!languageNameString.length()) { printf("Unable to detect language file..\n"); assert(0); } - systemTextes = (u8*)CheckLoadMallocPak(languageNameString, 0); // todo: use real language name - textLength = getPakSize(languageNameString, 0); + systemTextes = (u8*)CheckLoadMallocPak(languageNameString.c_str(), 0); // todo: use real language name + textLength = getPakSize(languageNameString.c_str(), 0); for(currentIndex=0;currentIndexobjIndex); } - objPtr->flags2 &= 0xBFFF; - objPtr->flags2 |= 0x8000; + objPtr->foundFlag &= 0xBFFF; + objPtr->foundFlag |= 0x8000; objPtr->room = -1; objPtr->stage = -1; @@ -3610,7 +3611,7 @@ void foundObject(int objIdx, int param) objPtr = &ListWorldObjets[objIdx]; - if( param != 0 && (objPtr->flags2 & 0xC000)) + if( param != 0 && (objPtr->foundFlag & 0xC000)) { return; } @@ -4384,7 +4385,7 @@ void PutAtObjet(int objIdx, int objIdxToPutAt) objPtr->beta = actorToPutAtPtr->beta; objPtr->gamma = actorToPutAtPtr->gamma; - objPtr->flags2 |= 0x4000; + objPtr->foundFlag |= 0x4000; objPtr->flags |= 0x80; // FlagGenereActiveList = 1; @@ -4401,7 +4402,7 @@ void PutAtObjet(int objIdx, int objIdxToPutAt) currentProcessedActorPtr->beta = actorToPutAtPtr->beta; currentProcessedActorPtr->gamma = actorToPutAtPtr->gamma; - ListWorldObjets[currentProcessedActorPtr->indexInWorld].flags2 |= 0x4000; + ListWorldObjets[currentProcessedActorPtr->indexInWorld].foundFlag |= 0x4000; ListWorldObjets[currentProcessedActorPtr->indexInWorld].flags |= 0x80; // FlagGenereActiveList = 1; @@ -4424,7 +4425,7 @@ void PutAtObjet(int objIdx, int objIdxToPutAt) objPtr->beta = objPtrToPutAt->beta; objPtr->gamma = objPtrToPutAt->gamma; - objPtr->flags2 |= 0x4000; + objPtr->foundFlag |= 0x4000; objPtr->flags |= 0x80; // FlagGenereActiveList = 1; @@ -4441,7 +4442,7 @@ void PutAtObjet(int objIdx, int objIdxToPutAt) currentProcessedActorPtr->beta = objPtrToPutAt->beta; currentProcessedActorPtr->gamma = objPtrToPutAt->gamma; - ListWorldObjets[currentProcessedActorPtr->indexInWorld].flags2 |= 0x4000; + ListWorldObjets[currentProcessedActorPtr->indexInWorld].foundFlag |= 0x4000; ListWorldObjets[currentProcessedActorPtr->indexInWorld].flags |= 0x80; // FlagGenereActiveList = 1; @@ -4543,15 +4544,15 @@ void throwStoppedAt(int x, int z) currentProcessedActorPtr->zv.ZVZ1 += z2; currentProcessedActorPtr->zv.ZVZ2 += z2; - ListWorldObjets[currentProcessedActorPtr->indexInWorld].flags2 |= 0x4000; - ListWorldObjets[currentProcessedActorPtr->indexInWorld].flags2 &= 0xEFFF; + ListWorldObjets[currentProcessedActorPtr->indexInWorld].foundFlag |= 0x4000; + ListWorldObjets[currentProcessedActorPtr->indexInWorld].foundFlag &= 0xEFFF; addActorToBgInscrust(currentProcessedActorIdx); } void startGame(int startupFloor, int startupRoom, int allowSystemMenu) { - initEngine(); + LoadWorld(); initVars(); loadFloor(startupFloor); diff --git a/FitdLib/main.h b/FitdLib/main.h index b99c226..49d92cc 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -22,7 +22,7 @@ void DeleteInventoryObjet(int objIdx); void walkStep(int angle1, int angle2, int angle3); void throwStoppedAt(int x, int z); sceZoneStruct* processActor2Sub(int x, int y, int z, roomDataStruct* pRoomData); -void initEngine(void); +void LoadWorld(void); void initVars(); void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name); void flushScreen(void); diff --git a/FitdLib/save.cpp b/FitdLib/save.cpp index ffc431a..99dddf3 100644 --- a/FitdLib/save.cpp +++ b/FitdLib/save.cpp @@ -61,7 +61,7 @@ int loadSave(int saveNumber) return(0); } - initEngine(); + LoadWorld(); initVars(); fseek(fHandle,8,SEEK_SET); @@ -116,8 +116,8 @@ int loadSave(int saveNumber) ASSERT(sizeof(ListWorldObjets[i].foundName) == 2); fread(&ListWorldObjets[i].foundName,2,1,fHandle); - ASSERT(sizeof(ListWorldObjets[i].flags2) == 2); - fread(&ListWorldObjets[i].flags2,2,1,fHandle); + ASSERT(sizeof(ListWorldObjets[i].foundFlag) == 2); + fread(&ListWorldObjets[i].foundFlag,2,1,fHandle); ASSERT(sizeof(ListWorldObjets[i].foundLife) == 2); fread(&ListWorldObjets[i].foundLife,2,1,fHandle); @@ -630,8 +630,8 @@ int makeSaveFile(int entry) ASSERT(sizeof(ListWorldObjets[i].foundName) == 2); fwrite(&ListWorldObjets[i].foundName,2,1,fHandle); - ASSERT(sizeof(ListWorldObjets[i].flags2) == 2); - fwrite(&ListWorldObjets[i].flags2,2,1,fHandle); + ASSERT(sizeof(ListWorldObjets[i].foundFlag) == 2); + fwrite(&ListWorldObjets[i].foundFlag,2,1,fHandle); ASSERT(sizeof(ListWorldObjets[i].foundLife) == 2); fwrite(&ListWorldObjets[i].foundLife,2,1,fHandle); diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index eeb62e6..b2cc185 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -64,7 +64,7 @@ const std::vector languageNameTable = "DEUTSCH", }; -char languageNameString[20] = ""; +std::string languageNameString; regularTextEntryStruct textTable[NUM_MAX_TEXT]; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index a2d7053..81be3f9 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -205,7 +205,7 @@ struct tWorldObject s16 typeZV; s16 foundBody; s16 foundName; - s16 flags2; + s16 foundFlag; s16 foundLife; s16 x; s16 y; @@ -308,7 +308,7 @@ extern char localKey; extern char localJoyD; extern char localClick; -extern char languageNameString[]; +extern std::string languageNameString; extern const std::vector languageNameTable; extern regularTextEntryStruct textTable[40]; From 079f1c3e50c6be7ffb2b8e5a82ee7280a2caf403 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 9 Jun 2025 01:24:50 -0700 Subject: [PATCH 22/70] More cleanup --- FitdLib/AITD1_Tatou.cpp | 22 ++-- FitdLib/gameTime.cpp | 4 +- FitdLib/gameTime.h | 4 +- FitdLib/hqr.cpp | 234 +++++++++++++++++++-------------------- FitdLib/inventory.cpp | 4 +- FitdLib/life.cpp | 12 +- FitdLib/main.cpp | 12 +- FitdLib/pak.cpp | 24 +--- FitdLib/palette.cpp | 2 +- FitdLib/palette.h | 2 +- FitdLib/rendererBGFX.cpp | 32 +----- FitdLib/room.cpp | 4 +- FitdLib/systemMenu.cpp | 6 +- FitdLib/tatou.cpp | 16 +-- 14 files changed, 170 insertions(+), 208 deletions(-) diff --git a/FitdLib/AITD1_Tatou.cpp b/FitdLib/AITD1_Tatou.cpp index 80937f0..30b4f66 100644 --- a/FitdLib/AITD1_Tatou.cpp +++ b/FitdLib/AITD1_Tatou.cpp @@ -16,10 +16,10 @@ int make3dTatou(void) { char* tatou2d; char* tatou3d; - int time; + int zoom; int deltaTime; - int rotation; - int unk1; + int beta; + int alpha; unsigned int localChrono; palette_t tatouPal; palette_t paletteBackup; @@ -29,10 +29,10 @@ int make3dTatou(void) char* tatouPalRaw = CheckLoadMallocPak("ITD_RESS",AITD1_TATOU_PAL); copyPalette(tatouPalRaw, tatouPal); - time = 8920; + zoom = 8920; deltaTime = 50; - rotation = 256; - unk1 = 8; + beta = 256; + alpha = 8; setupCameraProjection(160,100,128,500,490); @@ -85,7 +85,7 @@ int make3dTatou(void) clearScreenTatou(); - setCameraTarget(0,0,0,unk1,rotation,0,time); + setCameraTarget(0,0,0,alpha,beta,0,zoom); AffObjet(0,0,0,0,0,0,tatou3d); @@ -105,16 +105,16 @@ int make3dTatou(void) process_events(); - time+=deltaTime-25; + zoom += deltaTime; - if(time>16000) + if(zoom>16000) break; - rotation -=8; + beta -=8; clearScreenTatou(); - setCameraTarget(0,0,0,unk1,rotation,0,time); + setCameraTarget(0,0,0,alpha,beta,0,zoom); AffObjet(0,0,0,0,0,0,tatou3d); diff --git a/FitdLib/gameTime.cpp b/FitdLib/gameTime.cpp index 927f98a..4d4dc6a 100644 --- a/FitdLib/gameTime.cpp +++ b/FitdLib/gameTime.cpp @@ -3,7 +3,7 @@ int timerSaved = false; unsigned int timerSavedValue = 0; -void freezeTime(void) +void SaveTimerAnim(void) { if(timerSaved==0) { @@ -12,7 +12,7 @@ void freezeTime(void) timerSaved++; } -void unfreezeTime(void) +void RestoreTimerAnim(void) { assert(timerSaved); timerSaved--; diff --git a/FitdLib/gameTime.h b/FitdLib/gameTime.h index 343f27c..4826b98 100644 --- a/FitdLib/gameTime.h +++ b/FitdLib/gameTime.h @@ -1,5 +1,5 @@ #ifndef _ITD_TIME_H_ #define _ITD_TIME_H_ -void freezeTime(void); -void unfreezeTime(void); +void SaveTimerAnim(void); +void RestoreTimerAnim(void); #endif \ No newline at end of file diff --git a/FitdLib/hqr.cpp b/FitdLib/hqr.cpp index 16b13c3..48cb5e0 100644 --- a/FitdLib/hqr.cpp +++ b/FitdLib/hqr.cpp @@ -117,54 +117,54 @@ void moveHqrEntry(hqrEntryStruct* hqrPtr, int index) hqrPtr->numUsedEntry --; hqrPtr->sizeFreeData += size; -} - +} + std::vector vAnimations; - -sAnimation* createAnimationFromPtr(void* ptr) -{ - u8* animPtr = (u8*)ptr; - - sAnimation* pAnimation = new sAnimation; - - pAnimation->m_raw = ptr; - pAnimation->m_numFrames = READ_LE_U16(animPtr); animPtr += 2; - pAnimation->m_numGroups = READ_LE_U16(animPtr); animPtr += 2; - - pAnimation->m_frames.resize(pAnimation->m_numFrames); - for (int i = 0; i < pAnimation->m_numFrames; i++) - { - sFrame* pFrame = &pAnimation->m_frames[i]; - - pFrame->m_timestamp = READ_LE_U16(animPtr); animPtr += 2; - pFrame->m_animStep[0] = READ_LE_S16(animPtr); animPtr += 2; - pFrame->m_animStep[1] = READ_LE_S16(animPtr); animPtr += 2; - pFrame->m_animStep[2] = READ_LE_S16(animPtr); animPtr += 2; - - pFrame->m_groups.resize(pAnimation->m_numGroups); - for (int i = 0; i < pAnimation->m_numGroups; i++) - { - sGroupState* pGroup = &pFrame->m_groups[i]; - + +sAnimation* createAnimationFromPtr(void* ptr) +{ + u8* animPtr = (u8*)ptr; + + sAnimation* pAnimation = new sAnimation; + + pAnimation->m_raw = ptr; + pAnimation->m_numFrames = READ_LE_U16(animPtr); animPtr += 2; + pAnimation->m_numGroups = READ_LE_U16(animPtr); animPtr += 2; + + pAnimation->m_frames.resize(pAnimation->m_numFrames); + for (int i = 0; i < pAnimation->m_numFrames; i++) + { + sFrame* pFrame = &pAnimation->m_frames[i]; + + pFrame->m_timestamp = READ_LE_U16(animPtr); animPtr += 2; + pFrame->m_animStep[0] = READ_LE_S16(animPtr); animPtr += 2; + pFrame->m_animStep[1] = READ_LE_S16(animPtr); animPtr += 2; + pFrame->m_animStep[2] = READ_LE_S16(animPtr); animPtr += 2; + + pFrame->m_groups.resize(pAnimation->m_numGroups); + for (int i = 0; i < pAnimation->m_numGroups; i++) + { + sGroupState* pGroup = &pFrame->m_groups[i]; + pGroup->m_type = READ_LE_S16(animPtr); animPtr += 2; pGroup->m_delta[0] = READ_LE_S16(animPtr); animPtr += 2; pGroup->m_delta[1] = READ_LE_S16(animPtr); animPtr += 2; - pGroup->m_delta[2] = READ_LE_S16(animPtr); animPtr += 2; - } - } - + pGroup->m_delta[2] = READ_LE_S16(animPtr); animPtr += 2; + } + } + vAnimations.push_back(pAnimation); - return pAnimation; -} - + return pAnimation; +} + std::vector vBodies; sBody* createBodyFromPtr(void* ptr) -{ - u8* bodyBuffer = (u8*)ptr; +{ + u8* bodyBuffer = (u8*)ptr; sBody* newBody = new sBody; - + newBody->m_raw = ptr; newBody->m_flags = READ_LE_U16(bodyBuffer); bodyBuffer += 2; @@ -190,19 +190,19 @@ sBody* createBodyFromPtr(void* ptr) newBody->m_vertices[i].y = READ_LE_S16(bodyBuffer); bodyBuffer += 2; newBody->m_vertices[i].z = READ_LE_S16(bodyBuffer); bodyBuffer += 2; } - + if (newBody->m_flags & INFO_TORTUE) { assert(0); // never used - } - - if (newBody->m_flags & INFO_ANIM) - { + } + + if (newBody->m_flags & INFO_ANIM) + { u16 numGroups = READ_LE_U16(bodyBuffer); bodyBuffer += 2; newBody->m_groupOrder.reserve(numGroups); newBody->m_groups.resize(numGroups); - - if (newBody->m_flags & INFO_OPTIMISE) // AITD2+ + + if (newBody->m_flags & INFO_OPTIMISE) // AITD2+ { for (int i = 0; i < numGroups; i++) { @@ -222,14 +222,14 @@ sBody* createBodyFromPtr(void* ptr) newBody->m_groups[i].m_state.m_type = READ_LE_S16(bodyBuffer); bodyBuffer += 2; newBody->m_groups[i].m_state.m_delta[0] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; newBody->m_groups[i].m_state.m_delta[1] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_delta[2] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_delta[2] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; newBody->m_groups[i].m_state.m_rotateDelta[0] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; newBody->m_groups[i].m_state.m_rotateDelta[1] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_rotateDelta[2] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_rotateDelta[2] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; bodyBuffer += 2; // padding? } - } - else + } + else { for (int i = 0; i < numGroups; i++) { @@ -252,8 +252,8 @@ sBody* createBodyFromPtr(void* ptr) newBody->m_groups[i].m_state.m_delta[2] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; } } - - } + + } u16 numPrimitives = READ_LE_U16(bodyBuffer); bodyBuffer += 2; newBody->m_primitives.resize(numPrimitives); @@ -262,12 +262,12 @@ sBody* createBodyFromPtr(void* ptr) newBody->m_primitives[i].m_type = (primTypeEnum)READ_LE_U8(bodyBuffer); bodyBuffer += 1; switch (newBody->m_primitives[i].m_type) - { - case primTypeEnum_Line: + { + case primTypeEnum_Line: newBody->m_primitives[i].m_material = READ_LE_U8(bodyBuffer); bodyBuffer += 1; - newBody->m_primitives[i].m_color = READ_LE_U8(bodyBuffer); bodyBuffer += 1; - newBody->m_primitives[i].m_even = READ_LE_U8(bodyBuffer); bodyBuffer += 1; - newBody->m_primitives[i].m_points.resize(2); + newBody->m_primitives[i].m_color = READ_LE_U8(bodyBuffer); bodyBuffer += 1; + newBody->m_primitives[i].m_even = READ_LE_U8(bodyBuffer); bodyBuffer += 1; + newBody->m_primitives[i].m_points.resize(2); for (int j = 0; j < newBody->m_primitives[i].m_points.size(); j++) { newBody->m_primitives[i].m_points[j] = READ_LE_U16(bodyBuffer) / 6; bodyBuffer += 2; @@ -281,25 +281,25 @@ sBody* createBodyFromPtr(void* ptr) { newBody->m_primitives[i].m_points[j] = READ_LE_U16(bodyBuffer) / 6; bodyBuffer += 2; } - break; - case primTypeEnum_Point: - case primTypeEnum_BigPoint: - case primTypeEnum_Zixel: + break; + case primTypeEnum_Point: + case primTypeEnum_BigPoint: + case primTypeEnum_Zixel: newBody->m_primitives[i].m_material = READ_LE_U8(bodyBuffer); bodyBuffer += 1; - newBody->m_primitives[i].m_color = READ_LE_U8(bodyBuffer); bodyBuffer += 1; - newBody->m_primitives[i].m_even = READ_LE_U8(bodyBuffer); bodyBuffer += 1; - newBody->m_primitives[i].m_points.resize(1); + newBody->m_primitives[i].m_color = READ_LE_U8(bodyBuffer); bodyBuffer += 1; + newBody->m_primitives[i].m_even = READ_LE_U8(bodyBuffer); bodyBuffer += 1; + newBody->m_primitives[i].m_points.resize(1); for (int j = 0; j < newBody->m_primitives[i].m_points.size(); j++) { newBody->m_primitives[i].m_points[j] = READ_LE_U16(bodyBuffer) / 6; bodyBuffer += 2; } - break; - case primTypeEnum_Sphere: + break; + case primTypeEnum_Sphere: newBody->m_primitives[i].m_material = READ_LE_U8(bodyBuffer); bodyBuffer += 1; - newBody->m_primitives[i].m_color = READ_LE_U8(bodyBuffer); bodyBuffer += 1; - newBody->m_primitives[i].m_even = READ_LE_U8(bodyBuffer); bodyBuffer += 1; - newBody->m_primitives[i].m_size = READ_LE_U16(bodyBuffer); bodyBuffer += 2; - newBody->m_primitives[i].m_points.resize(1); + newBody->m_primitives[i].m_color = READ_LE_U8(bodyBuffer); bodyBuffer += 1; + newBody->m_primitives[i].m_even = READ_LE_U8(bodyBuffer); bodyBuffer += 1; + newBody->m_primitives[i].m_size = READ_LE_U16(bodyBuffer); bodyBuffer += 2; + newBody->m_primitives[i].m_points.resize(1); for (int j = 0; j < newBody->m_primitives[i].m_points.size(); j++) { newBody->m_primitives[i].m_points[j] = READ_LE_U16(bodyBuffer) / 6; bodyBuffer += 2; @@ -338,10 +338,10 @@ sBody* createBodyFromPtr(void* ptr) vBodies.push_back(newBody); return newBody; -} +} char* HQR_Get(hqrEntryStruct* hqrPtr, int index) -{ +{ hqrSubEntryStruct* foundEntry; if(index<0) @@ -416,7 +416,7 @@ char* HQR_Get(hqrEntryStruct* hqrPtr, int index) char* ptr; int i; - freezeTime(); + SaveTimerAnim(); size = getPakSize(hqrPtr->string,index); if(size == 0) @@ -457,7 +457,7 @@ char* HQR_Get(hqrEntryStruct* hqrPtr, int index) hqrPtr->numUsedEntry++; hqrPtr->sizeFreeData -= size; - unfreezeTime(); + RestoreTimerAnim(); return(ptr); } @@ -508,15 +508,15 @@ void HQR_Reset(hqrEntryStruct* hqrPtr) { int i; hqrPtr->sizeFreeData = hqrPtr->maxFreeData; - hqrPtr->numUsedEntry = 0; - - if (hqrPtr == listBody) - { - for (int i = 0; i < vBodies.size(); i++) - { - delete vBodies[i]; - } - vBodies.resize(0); + hqrPtr->numUsedEntry = 0; + + if (hqrPtr == listBody) + { + for (int i = 0; i < vBodies.size(); i++) + { + delete vBodies[i]; + } + vBodies.resize(0); } for(i=0;inumMaxEntry;i++) @@ -535,15 +535,15 @@ void HQR_Free(hqrEntryStruct* hqrPtr) if(!hqrPtr) return; - - if (hqrPtr == listBody) - { - for (int i = 0; i < vBodies.size(); i++) - { - delete vBodies[i]; - } - vBodies.clear(); - } + + if (hqrPtr == listBody) + { + for (int i = 0; i < vBodies.size(); i++) + { + delete vBodies[i]; + } + vBodies.clear(); + } for(i=0;inumMaxEntry;i++) { @@ -553,29 +553,29 @@ void HQR_Free(hqrEntryStruct* hqrPtr) free(hqrPtr); } - -sBody* getBodyFromPtr(void* ptr) -{ - for (int i = 0; i < vBodies.size(); i++) - { - if (vBodies[i]->m_raw == ptr) - { - return vBodies[i]; - } - } - - return createBodyFromPtr(ptr); -} - -sAnimation* getAnimationFromPtr(void* ptr) -{ - for (int i = 0; i < vAnimations.size(); i++) - { - if (vAnimations[i]->m_raw == ptr) - { - return vAnimations[i]; - } - } - - return createAnimationFromPtr(ptr); -} + +sBody* getBodyFromPtr(void* ptr) +{ + for (int i = 0; i < vBodies.size(); i++) + { + if (vBodies[i]->m_raw == ptr) + { + return vBodies[i]; + } + } + + return createBodyFromPtr(ptr); +} + +sAnimation* getAnimationFromPtr(void* ptr) +{ + for (int i = 0; i < vAnimations.size(); i++) + { + if (vAnimations[i]->m_raw == ptr) + { + return vAnimations[i]; + } + } + + return createAnimationFromPtr(ptr); +} diff --git a/FitdLib/inventory.cpp b/FitdLib/inventory.cpp index a6a775c..cffb691 100644 --- a/FitdLib/inventory.cpp +++ b/FitdLib/inventory.cpp @@ -201,7 +201,7 @@ void processInventory(void) statusVar1 = 0; - freezeTime(); + SaveTimerAnim(); //pauseShaking(); if(lightOff!=0) @@ -421,7 +421,7 @@ void processInventory(void) //osystem_flip(NULL); } - unfreezeTime(); + RestoreTimerAnim(); flagInitView = 1; diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index 7ae4c89..3a6312d 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -1639,7 +1639,7 @@ void processLife(int lifeNum, bool callFoundLife) lifeTempVar8 = *(s16*)(currentLifePtr); currentLifePtr += 2; - freezeTime(); + SaveTimerAnim(); FadeOutPhys(32, 0); LoadPak("ITD_RESS", lifeTempVar1, aux); @@ -1653,7 +1653,7 @@ void processLife(int lifeNum, bool callFoundLife) flagInitView = 2; - unfreezeTime(); + RestoreTimerAnim(); break; } @@ -1997,7 +1997,7 @@ void processLife(int lifeNum, bool callFoundLife) sampleId = readNextArgument("sampleId"); } - freezeTime(); + SaveTimerAnim(); LoadPak("ITD_RESS", pictureIndex, aux); @@ -2034,7 +2034,7 @@ void processLife(int lifeNum, bool callFoundLife) break; } while (!key && !Click); - unfreezeTime(); + RestoreTimerAnim(); flagInitView = 1; @@ -2051,7 +2051,7 @@ void processLife(int lifeNum, bool callFoundLife) u16 fadeEntry; u16 fadeOut; - freezeTime(); + SaveTimerAnim(); sequenceIdx = *(u16*)(currentLifePtr); currentLifePtr += 2; @@ -2064,7 +2064,7 @@ void processLife(int lifeNum, bool callFoundLife) playSequence(sequenceIdx, fadeEntry, fadeOut); - unfreezeTime(); + RestoreTimerAnim(); break; } diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 0843b40..30e2634 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -588,7 +588,7 @@ void turnPageBackward() void readBook(int index, int type) { - freezeTime(); + SaveTimerAnim(); switch(g_gameId) { @@ -606,7 +606,7 @@ void readBook(int index, int type) } - unfreezeTime(); + RestoreTimerAnim(); } int Lire(int index, int startx, int top, int endx, int bottom, int demoMode, int color, int shadow) @@ -2372,7 +2372,7 @@ void setupCamera() int z; cameraDataStruct* pCamera; - freezeTime(); + SaveTimerAnim(); currentCamera = startGameVar1; @@ -2442,7 +2442,7 @@ void setupCamera() } flagInitView = 0; - unfreezeTime(); + RestoreTimerAnim(); } s16 computeDistanceToPoint(int x1, int z1, int x2, int z2) @@ -3624,7 +3624,7 @@ void foundObject(int objIdx, int param) objPtr->trackNumber = 0; - freezeTime(); + SaveTimerAnim(); // setupShaking(1000); // probably to remove the shaking when in foundObject screen int weight = 0; @@ -3721,7 +3721,7 @@ void foundObject(int objIdx, int param) // menuWaitVSync(); } - unfreezeTime(); + RestoreTimerAnim(); if(var_6 == 1) { diff --git a/FitdLib/pak.cpp b/FitdLib/pak.cpp index 1b363d9..4ad5717 100644 --- a/FitdLib/pak.cpp +++ b/FitdLib/pak.cpp @@ -10,7 +10,7 @@ extern "C" { extern char homePath[512]; } -typedef struct pakInfoStruct // warning: allignement unsafe +typedef struct pakInfoStruct // warning: alignment unsafe { s32 discSize; s32 uncompressedSize; @@ -92,6 +92,7 @@ int LoadPak(const char* name, int index, char* ptr) memcpy(ptr,lptr,getPakSize(name,index)); + free(lptr); return(1); @@ -138,15 +139,12 @@ int getPakSize(const char* name, int index) fseek(fileHandle,(index+1)*4,SEEK_SET); fread(&fileOffset,4,1,fileHandle); -#ifdef MACOSX fileOffset = READ_LE_U32(&fileOffset); -#endif + fseek(fileHandle,fileOffset,SEEK_SET); fread(&additionalDescriptorSize,4,1,fileHandle); -#ifdef MACOSX additionalDescriptorSize = READ_LE_U32(&additionalDescriptorSize); -#endif readPakInfo(&pakInfo,fileHandle); @@ -225,19 +223,14 @@ char* loadPak(const char* name, int index) fseek(fileHandle,(index+1)*4,SEEK_SET); fread(&fileOffset,4,1,fileHandle); - -#ifdef MACOSX fileOffset = READ_LE_U32(&fileOffset); -#endif fseek(fileHandle,fileOffset,SEEK_SET); fread(&additionalDescriptorSize,4,1,fileHandle); - -#ifdef MACOSX additionalDescriptorSize = READ_LE_U32(&additionalDescriptorSize); -#endif - if(additionalDescriptorSize) + + if(additionalDescriptorSize) { fseek(fileHandle, additionalDescriptorSize-4, SEEK_CUR); } @@ -328,18 +321,13 @@ void dumpPak(const char* name) fseek(fileHandle, (index + 1) * 4, SEEK_SET); fread(&fileOffset, 4, 1, fileHandle); - -#ifdef MACOSX fileOffset = READ_LE_U32(&fileOffset); -#endif fseek(fileHandle, fileOffset, SEEK_SET); fread(&additionalDescriptorSize, 4, 1, fileHandle); - -#ifdef MACOSX additionalDescriptorSize = READ_LE_U32(&additionalDescriptorSize); -#endif + if (additionalDescriptorSize) { fseek(fileHandle, additionalDescriptorSize - 4, SEEK_CUR); diff --git a/FitdLib/palette.cpp b/FitdLib/palette.cpp index f427c65..dcd0350 100644 --- a/FitdLib/palette.cpp +++ b/FitdLib/palette.cpp @@ -52,7 +52,7 @@ void convertPaletteIfRequired(palette_t& lpalette) } } -void computePalette(palette_t& inPalette, palette_t& outPalette, int coef) +void SetLevelDestPal(palette_t& inPalette, palette_t& outPalette, int coef) { for (int i = 0; i < 256; i++) { diff --git a/FitdLib/palette.h b/FitdLib/palette.h index d14e1af..dfc7ca7 100644 --- a/FitdLib/palette.h +++ b/FitdLib/palette.h @@ -7,6 +7,6 @@ void setPalette(palette_t& palette); void copyPalette(void* source, palette_t& dest); void copyPalette(palette_t& source, palette_t& dest); void convertPaletteIfRequired(palette_t& lpalette); -void computePalette(palette_t& inPalette, palette_t& outPalette, int coef); +void SetLevelDestPal(palette_t& inPalette, palette_t& outPalette, int coef); extern palette_t currentGamePalette; diff --git a/FitdLib/rendererBGFX.cpp b/FitdLib/rendererBGFX.cpp index 917dcf3..ce4047a 100644 --- a/FitdLib/rendererBGFX.cpp +++ b/FitdLib/rendererBGFX.cpp @@ -520,16 +520,11 @@ void osystem_startFrame() unsigned char frontBuffer[320 * 200]; unsigned char physicalScreen[320 * 200]; -unsigned char physicalScreenRGB[320 * 200 * 3]; void osystem_CopyBlockPhys(unsigned char* videoBuffer, int left, int top, int right, int bottom) { - unsigned char* out = physicalScreenRGB; unsigned char* in = (unsigned char*)&videoBuffer[0] + left + top * 320; - int i; - int j; - while ((right - left) % 4) { right++; @@ -540,19 +535,13 @@ void osystem_CopyBlockPhys(unsigned char* videoBuffer, int left, int top, int ri bottom++; } - for (i = top; i < bottom; i++) + for (int i = top; i < bottom; i++) { in = (unsigned char*)&videoBuffer[0] + left + i * 320; unsigned char* out2 = physicalScreen + left + i * 320; - for (j = left; j < right; j++) + for (int j = left; j < right; j++) { - unsigned char color = *(in++); - - *(out++) = RGB_Pal[color * 3]; - *(out++) = RGB_Pal[color * 3 + 1]; - *(out++) = RGB_Pal[color * 3 + 2]; - - *(out2++) = color; + *(out2++) = *(in++); } } @@ -561,21 +550,6 @@ void osystem_CopyBlockPhys(unsigned char* videoBuffer, int left, int top, int ri void osystem_refreshFrontTextureBuffer() { - unsigned char* out = physicalScreenRGB; - unsigned char* in = physicalScreen; - - int i; - int j; - - for (i = 0; i < 200 * 320; i++) - { - unsigned char color = *(in++); - *(out++) = RGB_Pal[color * 3]; - *(out++) = RGB_Pal[color * 3 + 1]; - *(out++) = RGB_Pal[color * 3 + 2]; - } - - bgfx::updateTexture2D(g_backgroundTexture, 0, 0, 0, 0, 320, 200, bgfx::copy(physicalScreen, 320 * 200)); } void osystem_initBuffer() diff --git a/FitdLib/room.cpp b/FitdLib/room.cpp index 129be24..9b81ef6 100644 --- a/FitdLib/room.cpp +++ b/FitdLib/room.cpp @@ -66,7 +66,7 @@ void loadRoom(int roomNumber) int oldCameraIdx; roomDefStruct* roomDataPtr; - freezeTime(); + SaveTimerAnim(); ASSERT(roomNumber >=0); @@ -187,5 +187,5 @@ void loadRoom(int roomNumber) startGameVar1 = newNumCamera; flagInitView = 1; needChangeRoom = 0; - unfreezeTime(); + RestoreTimerAnim(); } diff --git a/FitdLib/systemMenu.cpp b/FitdLib/systemMenu.cpp index bf203b1..c8125de 100644 --- a/FitdLib/systemMenu.cpp +++ b/FitdLib/systemMenu.cpp @@ -56,7 +56,7 @@ void processSystemMenu(void) int exitMenu = 0; int currentSelectedEntry; - freezeTime(); + SaveTimerAnim(); //pauseShaking(); if(lightOff) @@ -104,7 +104,7 @@ void processSystemMenu(void) if(restoreSave(46,1)) { flagInitView = 2; - unfreezeTime(); + RestoreTimerAnim(); //updateShaking(); return; } @@ -157,5 +157,5 @@ void processSystemMenu(void) } localKey = localClick = localJoyD = 0; flagInitView = 2; - unfreezeTime(); + RestoreTimerAnim(); } \ No newline at end of file diff --git a/FitdLib/tatou.cpp b/FitdLib/tatou.cpp index 65a3fe6..74dded9 100644 --- a/FitdLib/tatou.cpp +++ b/FitdLib/tatou.cpp @@ -29,7 +29,7 @@ void FastCopyScreen(void* source, void* dest) void FadeInPhys(int step,int start) { - freezeTime(); + SaveTimerAnim(); if(fadeState == 2) // only used for the ending ? { @@ -40,7 +40,7 @@ void FadeInPhys(int step,int start) { process_events(); palette_t localPalette; - computePalette(currentGamePalette,localPalette,i); + SetLevelDestPal(currentGamePalette,localPalette,i); setPalette(localPalette); osystem_refreshFrontTextureBuffer(); osystem_drawBackground(); @@ -49,24 +49,24 @@ void FadeInPhys(int step,int start) fadeState = 1; - unfreezeTime(); + RestoreTimerAnim(); } -void FadeOutPhys(int var1, int var2) +void FadeOutPhys(int step, int var2) { - freezeTime(); + SaveTimerAnim(); - for(int i=256;i>=0;i-=var1) + for(int i=256;i>=0;i-=step) { process_events(); palette_t localPalette; - computePalette(currentGamePalette,localPalette,i); + SetLevelDestPal(currentGamePalette,localPalette,i); setPalette(localPalette); osystem_refreshFrontTextureBuffer(); osystem_drawBackground(); } - unfreezeTime(); + RestoreTimerAnim(); } #ifdef PCLIKE From 2c84167b1592c2e1cbfea8350239abbbbe2d08c8 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Tue, 10 Jun 2025 01:12:48 -0700 Subject: [PATCH 23/70] Cleanup and AITD3 main menu --- FitdLib/AITD1.cpp | 8 ++--- FitdLib/AITD2.cpp | 8 ++--- FitdLib/AITD3.cpp | 8 ++--- FitdLib/aitdBox.cpp | 2 +- FitdLib/debugger.cpp | 12 +++---- FitdLib/evalVar.cpp | 4 +-- FitdLib/floor.cpp | 4 +-- FitdLib/floor.h | 4 +-- FitdLib/input.cpp | 2 +- FitdLib/inventory.cpp | 12 +++---- FitdLib/life.cpp | 14 ++++---- FitdLib/main.cpp | 78 ++++++++++++++++++++--------------------- FitdLib/main.h | 8 ++--- FitdLib/mainLoop.cpp | 22 +++++------- FitdLib/mainLoop.h | 2 +- FitdLib/room.cpp | 10 +++--- FitdLib/room.h | 2 +- FitdLib/save.cpp | 18 +++++----- FitdLib/sequence.cpp | 2 +- FitdLib/startupMenu.cpp | 46 ++++++++++++++++-------- FitdLib/startupMenu.h | 4 +-- FitdLib/systemMenu.cpp | 4 +-- FitdLib/vars.cpp | 6 ++-- FitdLib/vars.h | 6 ++-- 24 files changed, 150 insertions(+), 136 deletions(-) diff --git a/FitdLib/AITD1.cpp b/FitdLib/AITD1.cpp index d25631a..c3761bd 100644 --- a/FitdLib/AITD1.cpp +++ b/FitdLib/AITD1.cpp @@ -316,7 +316,7 @@ void startAITD1() while (1) { #ifndef AITD_UE4 - int startupMenuResult = processStartupMenu(); + int startupMenuResult = MainMenu(); #else int startupMenuResult = 0; #endif @@ -372,11 +372,11 @@ void startAITD1() // updateShaking(); - flagInitView = 2; + FlagInitView = 2; - setupCamera(); + InitView(); - mainLoop(1, 1); + PlayWorld(1, 1); // freeScene(); diff --git a/FitdLib/AITD2.cpp b/FitdLib/AITD2.cpp index 950ab24..304b1da 100644 --- a/FitdLib/AITD2.cpp +++ b/FitdLib/AITD2.cpp @@ -205,7 +205,7 @@ void startAITD2() while(1) { - int startupMenuResult = processStartupMenu(); + int startupMenuResult = MainMenu(); switch(startupMenuResult) { @@ -225,11 +225,11 @@ void startAITD2() { // updateShaking(); - flagInitView = 2; + FlagInitView = 2; - setupCamera(); + InitView(); - mainLoop(1, 1); + PlayWorld(1, 1); // freeScene(); diff --git a/FitdLib/AITD3.cpp b/FitdLib/AITD3.cpp index e532e31..69e940b 100644 --- a/FitdLib/AITD3.cpp +++ b/FitdLib/AITD3.cpp @@ -40,7 +40,7 @@ void startAITD3() while(1) { - int startupMenuResult = processStartupMenu(); + int startupMenuResult = MainMenu(); switch(startupMenuResult) { @@ -62,11 +62,11 @@ void startAITD3() { // updateShaking(); - flagInitView = 2; + FlagInitView = 2; - setupCamera(); + InitView(); - mainLoop(1, 1); + PlayWorld(1, 1); // freeScene(); diff --git a/FitdLib/aitdBox.cpp b/FitdLib/aitdBox.cpp index 54df973..e33fe4d 100644 --- a/FitdLib/aitdBox.cpp +++ b/FitdLib/aitdBox.cpp @@ -166,7 +166,7 @@ void AffBigCadre(int x, int y, int width, int height) WindowX2 = right - 9; WindowY2 = bottom - 9; - fillBox(WindowX1,WindowY1,WindowX2,WindowY2,0); + AffRect(WindowX1,WindowY1,WindowX2,WindowY2,0); SetClip(WindowX1,WindowY1,WindowX2,WindowY2); } diff --git a/FitdLib/debugger.cpp b/FitdLib/debugger.cpp index 5ca9196..2e0996f 100644 --- a/FitdLib/debugger.cpp +++ b/FitdLib/debugger.cpp @@ -126,7 +126,7 @@ void debugger_draw(void) if(debuggerVar_debugMenuDisplayed) { - cameraDataStruct* pCamera = cameraDataTable[currentCamera]; + cameraDataStruct* pCamera = cameraDataTable[NumCamera]; ImGui::Begin("Camera"); if (pCamera) @@ -138,16 +138,16 @@ void debugger_draw(void) ImGui::InputInt("Z", &translateZ); ImGui::PopID(); ImGui::EndGroup(); - + ImGui::BeginGroup(); ImGui::PushID("Center"); InputS16("Pitch", &pCamera->alpha); - InputS16("Yaw", &pCamera->beta); + InputS16("Yaw", &pCamera->beta); InputS16("Roll", &pCamera->gamma); ImGui::PopID(); - ImGui::EndGroup(); - - SetAngleCamera(pCamera->alpha, pCamera->beta, pCamera->gamma); + ImGui::EndGroup(); + + SetAngleCamera(pCamera->alpha, pCamera->beta, pCamera->gamma); ImGui::BeginGroup(); ImGui::PushID("Center"); diff --git a/FitdLib/evalVar.cpp b/FitdLib/evalVar.cpp index fe35cdb..05a2482 100644 --- a/FitdLib/evalVar.cpp +++ b/FitdLib/evalVar.cpp @@ -453,7 +453,7 @@ int evalVar(const char* name) } case 0x1B: { - return(*(u16*)(((currentCamera+6)*2)+cameraPtr)); + return(*(u16*)(((NumCamera+6)*2)+cameraPtr)); break; } case 0x1C: @@ -894,7 +894,7 @@ int evalVar2(const char* name) } case 0x1B: { - return(cameraDataTable[currentCamera]-&g_currentFloorCameraData[0]); + return(cameraDataTable[NumCamera]-&g_currentFloorCameraData[0]); break; } case 0x1C: diff --git a/FitdLib/floor.cpp b/FitdLib/floor.cpp index 0378654..734ad13 100644 --- a/FitdLib/floor.cpp +++ b/FitdLib/floor.cpp @@ -4,7 +4,7 @@ u32 g_currentFloorRoomRawDataSize = 0; u32 g_currentFloorCameraRawDataSize; std::vector g_currentFloorCameraData; -void loadFloor(int floorNumber) +void LoadEtage(int floorNumber) { int i; int expectedNumberOfRoom; @@ -36,7 +36,7 @@ void loadFloor(int floorNumber) } } - currentCamera = -1; + NumCamera = -1; needChangeRoom = 1; changeFloor = 0; diff --git a/FitdLib/floor.h b/FitdLib/floor.h index 661e4cb..3f9ffe2 100644 --- a/FitdLib/floor.h +++ b/FitdLib/floor.h @@ -1,10 +1,10 @@ #ifndef _FLOOR_H_ -#define _FLOOR_H_ +#define _FLOOR_H_ extern std::vector g_currentFloorCameraData; extern u32 g_currentFloorRoomRawDataSize; -void loadFloor(int floorNumber); +void LoadEtage(int floorNumber); #endif diff --git a/FitdLib/input.cpp b/FitdLib/input.cpp index bd0d889..c9d82fb 100644 --- a/FitdLib/input.cpp +++ b/FitdLib/input.cpp @@ -125,7 +125,7 @@ void readKeyboard(void) case SDL_SCANCODE_Y: debuggerVar_topCamera = false; backgroundMode = backgroundModeEnum_2D; - flagInitView = 1; + FlagInitView = 1; break; case SDL_SCANCODE_C: debuggerVar_noHardClip = !debuggerVar_noHardClip; diff --git a/FitdLib/inventory.cpp b/FitdLib/inventory.cpp index cffb691..7fe9ce8 100644 --- a/FitdLib/inventory.cpp +++ b/FitdLib/inventory.cpp @@ -30,7 +30,7 @@ int DrawListObjets(int startIdx, int selectIdx, int selectColor) else { SetClip(27,25,292,98); - fillBox(27,25,292,98,0); + AffRect(27,25,292,98,0); WindowX1 = 30; WindowY1 = 27; @@ -55,7 +55,7 @@ int DrawListObjets(int startIdx, int selectIdx, int selectColor) { if(selectColor == 15) { - fillBox(0xA,y,0x135,y+0x10,0x64); + AffRect(0xA,y,0x135,y+0x10,0x64); } SelectedMessage(160,y,objPtr->foundName,selectColor,4); @@ -93,7 +93,7 @@ int DrawListObjets(int startIdx, int selectIdx, int selectColor) void renderInventoryObject(int arg) { SetClip(statusLeft,statusTop,statusRight,statusBottom); - fillBox(statusLeft,statusTop,statusRight,statusBottom,0); + AffRect(statusLeft,statusTop,statusRight,statusBottom,0); statusVar1 -= 8; @@ -132,7 +132,7 @@ void drawInventoryActions(int arg) else { SetClip(162,100,292,174); - fillBox(162,100,292,174, 0); + AffRect(162,100,292,174, 0); WindowX1 = 166; WindowY1 = 104; @@ -148,7 +148,7 @@ void drawInventoryActions(int arg) { if(g_gameId <= JACK) { - fillBox(170,y,309,y+16,100); + AffRect(170,y,309,y+16,100); SelectedMessage(240,y,inventoryActionTable[i],15,4); } else @@ -423,7 +423,7 @@ void processInventory(void) RestoreTimerAnim(); - flagInitView = 1; + FlagInitView = 1; while(Click || key || JoyD) { diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index 3a6312d..9d60517 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -785,7 +785,7 @@ void processLife(int lifeNum, bool callFoundLife) } else { - flagInitView = 1; + FlagInitView = 1; } } break; @@ -820,7 +820,7 @@ void processLife(int lifeNum, bool callFoundLife) } else { - flagInitView = 1; + FlagInitView = 1; } break; } @@ -1615,7 +1615,7 @@ void processLife(int lifeNum, bool callFoundLife) FadeOutPhys(4, 0); } - flagInitView = 2; + FlagInitView = 2; break; } @@ -1651,7 +1651,7 @@ void processLife(int lifeNum, bool callFoundLife) turnPageFlag = false; Lire(lifeTempVar2 + 1, lifeTempVar3, lifeTempVar4, lifeTempVar5, lifeTempVar6, 0, lifeTempVar7, lifeTempVar8); - flagInitView = 2; + FlagInitView = 2; RestoreTimerAnim(); @@ -1662,11 +1662,11 @@ void processLife(int lifeNum, bool callFoundLife) { appendFormated("LM_ANIM_SAMPLE "); lifeTempVar1 = evalVar(); - + if (g_gameId == TIMEGATE) { currentLifePtr += 2; - } + } lifeTempVar2 = *(s16*)(currentLifePtr); currentLifePtr += 2; @@ -2036,7 +2036,7 @@ void processLife(int lifeNum, bool callFoundLife) RestoreTimerAnim(); - flagInitView = 1; + FlagInitView = 1; if (g_gameId > AITD1) { diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 30e2634..0099098 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -533,7 +533,7 @@ textEntryStruct* getTextFromIdx(int index) return(NULL); } -void fillBox(int x1, int y1, int x2, int y2, char color) // fast recode. No RE +void AffRect(int x1, int y1, int x2, int y2, char color) // fast recode. No RE { int width = x2 - x1 + 1; int height = y2 - y1 + 1; @@ -1356,9 +1356,9 @@ void loadMask(int cameraIdx) g_MaskPtr = (unsigned char*)loadPak(name,cameraIdx); - for(int i=0; inumViewedRooms; i++) + for(int i=0; inumViewedRooms; i++) { - cameraViewedRoomStruct* pRoomView = &cameraDataTable[currentCamera]->viewedRoomTable[i]; + cameraViewedRoomStruct* pRoomView = &cameraDataTable[NumCamera]->viewedRoomTable[i]; unsigned char* pViewedRoomMask = g_MaskPtr + READ_LE_U32(g_MaskPtr + i*4); for(int j=0; jnumMask; j++) @@ -1419,11 +1419,11 @@ extern unsigned char* polyBackBuffer; void createAITD1Mask() { - for(int viewedRoomIdx=0; viewedRoomIdxnumViewedRooms; viewedRoomIdx++) + for(int viewedRoomIdx=0; viewedRoomIdxnumViewedRooms; viewedRoomIdx++) { - cameraViewedRoomStruct* pcameraViewedRoomData = &cameraDataTable[currentCamera]->viewedRoomTable[viewedRoomIdx]; + cameraViewedRoomStruct* pcameraViewedRoomData = &cameraDataTable[NumCamera]->viewedRoomTable[viewedRoomIdx]; - char* data2 = room_PtrCamera[currentCamera] + pcameraViewedRoomData->offsetToMask; + char* data2 = room_PtrCamera[NumCamera] + pcameraViewedRoomData->offsetToMask; char* data = data2; data+=2; @@ -1646,11 +1646,11 @@ void setupCameraSub1() } // visibility list: add room seen by the current camera - for(j=0;jnumViewedRooms;j++) + for(j=0;jnumViewedRooms;j++) { - if(!isInViewList(cameraDataTable[currentCamera]->viewedRoomTable[j].viewedRoomIdx)) + if(!isInViewList(cameraDataTable[NumCamera]->viewedRoomTable[j].viewedRoomIdx)) { - *(dataTabPos++) = (char)cameraDataTable[currentCamera]->viewedRoomTable[j].viewedRoomIdx; + *(dataTabPos++) = (char)cameraDataTable[NumCamera]->viewedRoomTable[j].viewedRoomIdx; *(dataTabPos) = -1; } } @@ -1920,11 +1920,11 @@ s16 cameraVisibilityVar = 0; int IsInCamera(int roomNumber) { - int numZone = cameraDataTable[currentCamera]->numViewedRooms; + int numZone = cameraDataTable[NumCamera]->numViewedRooms; for(int i=0;iviewedRoomTable[i].viewedRoomIdx == roomNumber) + if(cameraDataTable[NumCamera]->viewedRoomTable[i].viewedRoomIdx == roomNumber) { cameraVisibilityVar = i; return(1); @@ -2325,9 +2325,9 @@ int checkActorInRoom(int room) { int i; - for(i=0;inumViewedRooms;i++) + for(i=0;inumViewedRooms;i++) { - if(cameraDataTable[currentCamera]->viewedRoomTable[i].viewedRoomIdx == room) + if(cameraDataTable[NumCamera]->viewedRoomTable[i].viewedRoomIdx == room) { return(1); } @@ -2365,7 +2365,7 @@ void createActorList() } } -void setupCamera() +void InitView() { int x; int y; @@ -2374,14 +2374,14 @@ void setupCamera() SaveTimerAnim(); - currentCamera = startGameVar1; + NumCamera = NewNumCamera; - assert(startGameVar1 < roomDataTable[currentRoom].numCameraInRoom); + assert(NewNumCamera < roomDataTable[currentRoom].numCameraInRoom); - loadCamera(roomDataTable[currentRoom].cameraIdxTable[startGameVar1]); + loadCamera(roomDataTable[currentRoom].cameraIdxTable[NewNumCamera]); if(g_gameId >= JACK) { - loadMask(roomDataTable[currentRoom].cameraIdxTable[startGameVar1]); + loadMask(roomDataTable[currentRoom].cameraIdxTable[NewNumCamera]); } else { @@ -2389,7 +2389,7 @@ void setupCamera() } cameraBackgroundChanged = true; - pCamera = cameraDataTable[currentCamera]; + pCamera = cameraDataTable[NumCamera]; SetAngleCamera(pCamera->alpha,pCamera->beta,pCamera->gamma); @@ -2429,7 +2429,7 @@ void setupCamera() setupCameraSub4(); /* setupCameraSub5(); */ - if(flagInitView==2) + if(FlagInitView==2) { flagRedraw = 2; } @@ -2441,7 +2441,7 @@ void setupCamera() } } - flagInitView = 0; + FlagInitView = 0; RestoreTimerAnim(); } @@ -2740,7 +2740,7 @@ void drawMaskZone(cameraMaskStruct* maskZonePtr) void drawMaskZones() { { - cameraDataStruct* pCamera = cameraDataTable[currentCamera]; + cameraDataStruct* pCamera = cameraDataTable[NumCamera]; for(int j=0;jnumViewedRooms;j++) { @@ -3069,7 +3069,7 @@ void drawBgOverlay(tObject* actorPtr) SetClip(BBox3D1, BBox3D2, BBox3D3, BBox3D4); - cameraDataStruct* pCamera = cameraDataTable[currentCamera]; + cameraDataStruct* pCamera = cameraDataTable[NumCamera]; // look for the correct room data of that camera cameraViewedRoomStruct* pcameraViewedRoomData = NULL; @@ -3088,7 +3088,7 @@ void drawBgOverlay(tObject* actorPtr) if(g_gameId == AITD1) { - data2 = room_PtrCamera[currentCamera] + pcameraViewedRoomData->offsetToMask; + data2 = room_PtrCamera[NumCamera] + pcameraViewedRoomData->offsetToMask; data = data2; data+=2; @@ -3746,7 +3746,7 @@ void foundObject(int objIdx, int param) //setupShaking(-600); } - flagInitView = 1; + FlagInitView = 1; } void hardColSuB1Sub1(int flag) @@ -4071,10 +4071,10 @@ int findBestCamera(void) void checkIfCameraChangeIsRequired(void) { - int localCurrentCam = currentCamera; + int localCurrentCam = NumCamera; int newCamera; - if(currentCamera!=-1) + if(NumCamera!=-1) { tObject* actorPtr; int zvx1; @@ -4090,7 +4090,7 @@ void checkIfCameraChangeIsRequired(void) zvz1 = actorPtr->zv.ZVZ1/10; zvz2 = actorPtr->zv.ZVZ2/10; - if(isInPoly(zvx1,zvx2,zvz1,zvz2,currentCameraZoneList[currentCamera])) // is still in current camera zone ? + if(isInPoly(zvx1,zvx2,zvz1,zvz2,currentCameraZoneList[NumCamera])) // is still in current camera zone ? { return; } @@ -4107,10 +4107,10 @@ void checkIfCameraChangeIsRequired(void) localCurrentCam = newCamera; } - if(currentCamera != localCurrentCam) + if(NumCamera != localCurrentCam) { - startGameVar1 = localCurrentCam; - flagInitView = 1; + NewNumCamera = localCurrentCam; + FlagInitView = 1; } #ifdef FITD_DEBUGGER @@ -4218,7 +4218,7 @@ void processActor2() needChangeRoom = 1; newRoom = (short)pCurrentZone->parameter; if(g_gameId > AITD1) - loadRoom(newRoom); + ChangeSalle(newRoom); } else { @@ -4555,18 +4555,18 @@ void startGame(int startupFloor, int startupRoom, int allowSystemMenu) LoadWorld(); initVars(); - loadFloor(startupFloor); + LoadEtage(startupFloor); - currentCamera = -1; + NumCamera = -1; - loadRoom(startupRoom); + ChangeSalle(startupRoom); - startGameVar1 = 0; - flagInitView = 2; + NewNumCamera = 0; + FlagInitView = 2; - setupCamera(); + InitView(); - mainLoop(allowSystemMenu, 1); + PlayWorld(allowSystemMenu, 1); /*freeScene(); diff --git a/FitdLib/main.h b/FitdLib/main.h index 49d92cc..a090355 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -6,10 +6,10 @@ extern int input5; void menuWaitVSync(); void AffSpfI(int x, int y, int param, char* gfx); void processActor2(); -void loadFloor(int floorNumber); -void loadRoom(int roomNumber); +void LoadEtage(int floorNumber); +void ChangeSalle(int roomNumber); void executeFoundLife(int objIdx); -void setupCamera(); +void InitView(); void checkIfCameraChangeIsRequired(void); void updateAllActorAndObjects(); void createActorList(); @@ -39,7 +39,7 @@ bool fileExists(const char* name); void OpenProgram(void); void freeAll(void); void startGame(int startupEtage, int startupRoom, int allowSystemMenu); -void fillBox(int x1, int y1, int x2, int y2, char color); // fast recode. No RE +void AffRect(int x1, int y1, int x2, int y2, char color); // fast recode. No RE void copyZv(ZVStruct* source, ZVStruct* dest); void getZvRelativePosition(ZVStruct* zvPtr, int startRoom, int destRoom); void take(int objIdx); diff --git a/FitdLib/mainLoop.cpp b/FitdLib/mainLoop.cpp index 3ef0aa3..dbb6354 100644 --- a/FitdLib/mainLoop.cpp +++ b/FitdLib/mainLoop.cpp @@ -37,11 +37,7 @@ void updatePendingEvents(void) } } -extern "C" { - void mainLoop(int allowSystemMenu, int deltaTime); -} - -void mainLoop(int allowSystemMenu, int deltaTime) +void PlayWorld(int allowSystemMenu, int deltaTime) { bool bLoop = true; @@ -197,13 +193,13 @@ void mainLoop(int allowSystemMenu, int deltaTime) if(changeFloor) { - loadFloor(newFloor); + LoadEtage(newFloor); } if(needChangeRoom) { - loadRoom(newRoom); - setupCamera(); + ChangeSalle(newRoom); + InitView(); } else { @@ -212,9 +208,9 @@ void mainLoop(int allowSystemMenu, int deltaTime) { int tempCurrentCamera; - tempCurrentCamera = currentCamera; + tempCurrentCamera = NumCamera; - currentCamera = startGameVar1; + NumCamera = NewNumCamera; currentProcessedActorPtr = objectTable; for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) @@ -244,15 +240,15 @@ void mainLoop(int allowSystemMenu, int deltaTime) if(giveUp) break; - currentCamera = tempCurrentCamera; + NumCamera = tempCurrentCamera; } - if(flagInitView + if(FlagInitView #ifdef FITD_DEBUGGER || debuggerVar_topCamera #endif ) { - setupCamera(); + InitView(); } } diff --git a/FitdLib/mainLoop.h b/FitdLib/mainLoop.h index c5dc061..f0300a1 100644 --- a/FitdLib/mainLoop.h +++ b/FitdLib/mainLoop.h @@ -1,3 +1,3 @@ extern "C" { -void mainLoop(int allowSystemMenu, int deltaTime); +void PlayWorld(int allowSystemMenu, int deltaTime); } \ No newline at end of file diff --git a/FitdLib/room.cpp b/FitdLib/room.cpp index 9b81ef6..a59e9d1 100644 --- a/FitdLib/room.cpp +++ b/FitdLib/room.cpp @@ -57,7 +57,7 @@ int getNumberOfRoom() return 0; } -void loadRoom(int roomNumber) +void ChangeSalle(int roomNumber) { int i; int cameraVar0; @@ -70,7 +70,7 @@ void loadRoom(int roomNumber) ASSERT(roomNumber >=0); - if(currentCamera == -1) + if(NumCamera == -1) { oldCameraIdx = -1; } @@ -80,7 +80,7 @@ void loadRoom(int roomNumber) cameraVar1 = roomDataTable[currentRoom].worldY; cameraVar2 = roomDataTable[currentRoom].worldZ; - oldCameraIdx = roomDataTable[currentRoom].cameraIdxTable[currentCamera]; + oldCameraIdx = roomDataTable[currentRoom].cameraIdxTable[NumCamera]; } if(g_gameId < AITD3) @@ -184,8 +184,8 @@ void loadRoom(int roomNumber) } } - startGameVar1 = newNumCamera; - flagInitView = 1; + NewNumCamera = newNumCamera; + FlagInitView = 1; needChangeRoom = 0; RestoreTimerAnim(); } diff --git a/FitdLib/room.h b/FitdLib/room.h index a29e29a..7c0b4a7 100644 --- a/FitdLib/room.h +++ b/FitdLib/room.h @@ -111,7 +111,7 @@ extern cameraViewedRoomStruct* currentCameraZoneList[NUM_MAX_CAMERA_IN_ROOM]; extern std::vector roomDataTable; roomDefStruct* getRoomData(int roomNumber); -void loadRoom(int roomNumber); +void ChangeSalle(int roomNumber); int getNumberOfRoom(); #endif diff --git a/FitdLib/save.cpp b/FitdLib/save.cpp index 99dddf3..3c45cc5 100644 --- a/FitdLib/save.cpp +++ b/FitdLib/save.cpp @@ -78,8 +78,8 @@ int loadSave(int saveNumber) ASSERT(sizeof(g_currentFloor) == 2); fread(&g_currentFloor,2,1,fHandle); - ASSERT(sizeof(currentCamera) == 2); - fread(¤tCamera,2,1,fHandle); + ASSERT(sizeof(NumCamera) == 2); + fread(&NumCamera,2,1,fHandle); ASSERT(sizeof(currentWorldTarget) == 2); fread(¤tWorldTarget,2,1,fHandle); @@ -239,11 +239,11 @@ int loadSave(int saveNumber) //timerFreeze = 1; - var_E = currentCamera; + var_E = NumCamera; - loadFloor(g_currentFloor); - currentCamera = -1; - loadRoom(currentRoom); + LoadEtage(g_currentFloor); + NumCamera = -1; + ChangeSalle(currentRoom); var_16 = currentMusic; currentMusic = -1; playMusic(var_16); @@ -504,7 +504,7 @@ int loadSave(int saveNumber) } } - startGameVar1 = var_E; + NewNumCamera = var_E; return(1); } @@ -592,8 +592,8 @@ int makeSaveFile(int entry) ASSERT(sizeof(g_currentFloor) == 2); fwrite(&g_currentFloor,2,1,fHandle); - ASSERT(sizeof(currentCamera) == 2); - fwrite(¤tCamera,2,1,fHandle); + ASSERT(sizeof(NumCamera) == 2); + fwrite(&NumCamera,2,1,fHandle); ASSERT(sizeof(currentWorldTarget) == 2); fwrite(¤tWorldTarget,2,1,fHandle); diff --git a/FitdLib/sequence.cpp b/FitdLib/sequence.cpp index e60c347..48572d4 100644 --- a/FitdLib/sequence.cpp +++ b/FitdLib/sequence.cpp @@ -252,5 +252,5 @@ void playSequence(int sequenceIdx, int fadeStart, int fadeOutVar) } } - flagInitView = 2; + FlagInitView = 2; } diff --git a/FitdLib/startupMenu.cpp b/FitdLib/startupMenu.cpp index 655d83d..3d2a57a 100644 --- a/FitdLib/startupMenu.cpp +++ b/FitdLib/startupMenu.cpp @@ -1,30 +1,38 @@ #include "common.h" -void drawStartupMenu(int selectedEntry) +void DrawMenu(int selectedEntry) { + if (g_gameId == AITD3) { + LoadPak("ITD_RESS", 13, logicalScreen); + } + else { + AffBigCadre(160, 100, 320, 80); + } + int currentY = 76; - int currentTextNum = 0; - AffBigCadre(160,100,320,80); - - while(currentTextNum<3) + for(int i=0; i<3; i++) { - if(currentTextNum == selectedEntry) // hilight selected entry + if(i == selectedEntry) // highlight selected entry { - fillBox(10,currentY,309,currentY+16,100); - SelectedMessage(160,currentY,currentTextNum+11,15,4); + if (g_gameId == AITD3) { + SelectedMessage(160, currentY+1, i + 11, 1, 4); + } + else { + AffRect(10, currentY, 309, currentY + 16, 100); + SelectedMessage(160, currentY, i + 11, 15, 4); + } } else { - SimpleMessage(160,currentY,currentTextNum+11,4); + SimpleMessage(160,currentY,i+11,4); } currentY+=16; // next line - currentTextNum++; // next text } } -int processStartupMenu(void) +int MainMenu(void) { int currentSelectedEntry = 0; unsigned int chrono; @@ -32,7 +40,17 @@ int processStartupMenu(void) flushScreen(); - drawStartupMenu(0); + if (g_gameId == AITD3) { + LoadPak("ITD_RESS", 47, aux); + + palette_t lpalette; + copyPalette(aux, lpalette); + convertPaletteIfRequired(lpalette); + copyPalette(lpalette, currentGamePalette); + setPalette(lpalette); + } + + DrawMenu(0); osystem_startFrame(); osystem_stopFrame(); @@ -64,7 +82,7 @@ int processStartupMenu(void) currentSelectedEntry = 2; } - drawStartupMenu(currentSelectedEntry); + DrawMenu(currentSelectedEntry); osystem_flip(NULL); // menuWaitVSync(); @@ -86,7 +104,7 @@ int processStartupMenu(void) currentSelectedEntry = 0; } - drawStartupMenu(currentSelectedEntry); + DrawMenu(currentSelectedEntry); //menuWaitVSync(); osystem_flip(NULL); diff --git a/FitdLib/startupMenu.h b/FitdLib/startupMenu.h index cfb0344..137e34b 100644 --- a/FitdLib/startupMenu.h +++ b/FitdLib/startupMenu.h @@ -1,5 +1,5 @@ #ifndef _STARTUPMENU_H_ #define _STARTUPMENU_H_ -void drawStartupMenu(int selectedEntry); -int processStartupMenu(void); +void DrawMenu(int selectedEntry); +int MainMenu(void); #endif diff --git a/FitdLib/systemMenu.cpp b/FitdLib/systemMenu.cpp index c8125de..2cab99f 100644 --- a/FitdLib/systemMenu.cpp +++ b/FitdLib/systemMenu.cpp @@ -103,7 +103,7 @@ void processSystemMenu(void) case 2: // load if(restoreSave(46,1)) { - flagInitView = 2; + FlagInitView = 2; RestoreTimerAnim(); //updateShaking(); return; @@ -156,6 +156,6 @@ void processSystemMenu(void) process_events(); } localKey = localClick = localJoyD = 0; - flagInitView = 2; + FlagInitView = 2; RestoreTimerAnim(); } \ No newline at end of file diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index b2cc185..ca3c7d1 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -124,7 +124,7 @@ char* g_currentFloorRoomRawData = NULL; char* g_currentFloorCameraRawData = NULL; int changeFloor; -s16 currentCamera; +s16 NumCamera; s16 g_currentFloor; int needChangeRoom; @@ -132,14 +132,14 @@ char* cameraPtr; roomDefStruct* pCurrentRoomData; s16 currentRoom; -int flagInitView; +int FlagInitView; int numCameraInRoom; int numCameraZone; char* cameraZoneData; int numRoomZone; char* roomZoneData; char* room_PtrCamera[NUM_MAX_CAMERA_IN_ROOM]; -int startGameVar1; +int NewNumCamera; int transformX; int transformY; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index 81be3f9..ee990e5 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -369,21 +369,21 @@ extern char* g_currentFloorRoomRawData; extern char* g_currentFloorCameraRawData; extern int changeFloor; -extern s16 currentCamera; +extern s16 NumCamera; extern s16 g_currentFloor; extern int needChangeRoom; extern char* cameraPtr; extern roomDefStruct* pCurrentRoomData; extern s16 currentRoom; -extern int flagInitView; +extern int FlagInitView; extern int numCameraInRoom; extern int numCameraZone; extern char* cameraZoneData; extern int numRoomZone; extern char* roomZoneData; extern char* room_PtrCamera[NUM_MAX_CAMERA_IN_ROOM]; -extern int startGameVar1; +extern int NewNumCamera; extern int transformX; extern int transformY; From ad18d85769ada79b24f4c00ea9b73219c1f60903 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Fri, 13 Jun 2025 01:04:25 -0700 Subject: [PATCH 24/70] Fix trapdoor zombie --- FitdLib/AITD1_Tatou.cpp | 4 +-- FitdLib/actorList.cpp | 4 +-- FitdLib/anim.cpp | 36 +++++++++++--------- FitdLib/bgfxGlue.cpp | 3 ++ FitdLib/life.cpp | 20 +++++++++-- FitdLib/main.cpp | 40 +++++++++++----------- FitdLib/main.h | 6 ++-- FitdLib/object.cpp | 12 +++---- FitdLib/save.cpp | 36 ++++++++++---------- FitdLib/track.cpp | 74 ++++++++++++++++++++++------------------- FitdLib/vars.h | 18 +++++----- 11 files changed, 138 insertions(+), 115 deletions(-) diff --git a/FitdLib/AITD1_Tatou.cpp b/FitdLib/AITD1_Tatou.cpp index 30b4f66..9c3bc68 100644 --- a/FitdLib/AITD1_Tatou.cpp +++ b/FitdLib/AITD1_Tatou.cpp @@ -4,9 +4,7 @@ void clearScreenTatou(void) { - int i; - - for(i=0;i<45120;i++) + for(int i=0;i<45120;i++) { frontBuffer[i] = 0; } diff --git a/FitdLib/actorList.cpp b/FitdLib/actorList.cpp index 1907de9..73630b6 100644 --- a/FitdLib/actorList.cpp +++ b/FitdLib/actorList.cpp @@ -65,8 +65,8 @@ int sortCompareFunction(const void* param1, const void* param2) if(flag == 0) { - distance1 = computeDistanceToPoint(translateX,translateZ,(actor1ZvPtr->ZVX1+actor1ZvPtr->ZVX2)/2,(actor1ZvPtr->ZVZ1+actor1ZvPtr->ZVZ2)/2); - distance2 = computeDistanceToPoint(translateX,translateZ,(actor2ZvPtr->ZVX1+actor2ZvPtr->ZVX2)/2,(actor2ZvPtr->ZVZ1+actor2ZvPtr->ZVZ2)/2); + distance1 = GiveDistance2D(translateX,translateZ,(actor1ZvPtr->ZVX1+actor1ZvPtr->ZVX2)/2,(actor1ZvPtr->ZVZ1+actor1ZvPtr->ZVZ2)/2); + distance2 = GiveDistance2D(translateX,translateZ,(actor2ZvPtr->ZVX1+actor2ZvPtr->ZVX2)/2,(actor2ZvPtr->ZVZ1+actor2ZvPtr->ZVZ2)/2); } else { diff --git a/FitdLib/anim.cpp b/FitdLib/anim.cpp index e5ad814..8961d43 100644 --- a/FitdLib/anim.cpp +++ b/FitdLib/anim.cpp @@ -221,18 +221,22 @@ int InitAnim(int animNum,int animType, int animInfo) return(1); } -int evaluateReal(interpolatedValue* data) +int evaluateReal(RealValue* data) { - if(!data->param) - return data->newAngle; + if(!data->numSteps) + return data->endValue; - if(timer - data->timeOfRotate> (unsigned int)data->param) + if(timer - data->memoTicks> (unsigned int)data->numSteps) { - data->param = 0; - return data->newAngle; + data->numSteps = 0; + return data->endValue; } - return ((((data->newAngle - data->oldAngle)*(timer - data->timeOfRotate))/data->param)+data->oldAngle); + s32 valueDiff = data->endValue - data->startValue; + s32 currentTime = timer - data->memoTicks; + s32 interpolatedValue = data->startValue + ((valueDiff * currentTime) / data->numSteps); + + return interpolatedValue; } int manageFall(int actorIdx, ZVStruct* zvPtr) @@ -387,19 +391,19 @@ void updateAnimation(void) } - if(currentProcessedActorPtr->YHandler.param) // currently falling ? + if(currentProcessedActorPtr->YHandler.numSteps) // currently falling ? { - if(currentProcessedActorPtr->YHandler.param != -1) + if(currentProcessedActorPtr->YHandler.numSteps != -1) { stepY = evaluateReal(¤tProcessedActorPtr->YHandler) - oldStepY; } else // stop falling { - stepY = currentProcessedActorPtr->YHandler.newAngle - oldStepY; + stepY = currentProcessedActorPtr->YHandler.endValue - oldStepY; - currentProcessedActorPtr->YHandler.param = 0; - currentProcessedActorPtr->YHandler.newAngle = 0; - currentProcessedActorPtr->YHandler.oldAngle = 0; + currentProcessedActorPtr->YHandler.numSteps = 0; + currentProcessedActorPtr->YHandler.endValue = 0; + currentProcessedActorPtr->YHandler.startValue = 0; } } else @@ -633,7 +637,7 @@ void updateAnimation(void) currentProcessedActorPtr->zv.ZVZ2 += stepZ; } // end of movement management - if(!currentProcessedActorPtr->YHandler.param) + if(!currentProcessedActorPtr->YHandler.numSteps) { // fall management ? currentProcessedActorPtr->worldY += currentProcessedActorPtr->stepY; @@ -661,7 +665,7 @@ void updateAnimation(void) } else { - if((currentProcessedActorPtr->YHandler.param != -1) && (currentProcessedActorPtr->_flags & AF_FALLABLE)) + if((currentProcessedActorPtr->YHandler.numSteps != -1) && (currentProcessedActorPtr->_flags & AF_FALLABLE)) { currentProcessedActorPtr->falling = 1; } @@ -725,7 +729,7 @@ void updateAnimation(void) } else // not the end of anim { - if((currentProcessedActorPtr->ANIM == -1) && (currentProcessedActorPtr->speed != 0) && (currentProcessedActorPtr->speedChange.param == 0)) + if((currentProcessedActorPtr->ANIM == -1) && (currentProcessedActorPtr->speed != 0) && (currentProcessedActorPtr->speedChange.numSteps == 0)) { currentProcessedActorPtr->worldX += currentProcessedActorPtr->stepX; currentProcessedActorPtr->roomX += currentProcessedActorPtr->stepX; diff --git a/FitdLib/bgfxGlue.cpp b/FitdLib/bgfxGlue.cpp index 8315833..d8b90b8 100644 --- a/FitdLib/bgfxGlue.cpp +++ b/FitdLib/bgfxGlue.cpp @@ -147,6 +147,9 @@ int initBgfxGlue(int argc, char* argv[]) //initparam.type = bgfx::RendererType::OpenGL; //initparam.type = bgfx::RendererType::Vulkan; //initparam.type = bgfx::RendererType::Direct3D12; +#if BX_CONFIG_DEBUG + initparam.debug = true; +#endif bgfx::init(initparam); imguiCreate(); diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index 9d60517..8a2f3d3 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -11,7 +11,7 @@ sequenceParamStruct sequenceParams[NUM_MAX_SEQUENCE_PARAM]; void resetRotateParam(void) { - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; } void throwObj(int animThrow, int frameThrow, int arg_4, int objToThrowIdx, int throwRotated, int throwForce, int animNext) @@ -887,6 +887,20 @@ void processLife(int lifeNum, bool callFoundLife) break; } + case LM_DO_MAX_ZV: + { + appendFormated("LM_DO_MAX_ZV "); + getZvMax(HQR_Get(listBody, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv); + + currentProcessedActorPtr->zv.ZVX1 += currentProcessedActorPtr->roomX; + currentProcessedActorPtr->zv.ZVX2 += currentProcessedActorPtr->roomX; + currentProcessedActorPtr->zv.ZVY1 += currentProcessedActorPtr->roomY; + currentProcessedActorPtr->zv.ZVY2 += currentProcessedActorPtr->roomY; + currentProcessedActorPtr->zv.ZVZ1 += currentProcessedActorPtr->roomZ; + currentProcessedActorPtr->zv.ZVZ2 += currentProcessedActorPtr->roomZ; + + break; + } case LM_DO_CARRE_ZV: // DO_CARRE_ZV { appendFormated("LM_DO_CARRE_ZV "); @@ -1212,7 +1226,7 @@ void processLife(int lifeNum, bool callFoundLife) if (currentProcessedActorPtr->beta != lifeTempVar1) { - if (currentProcessedActorPtr->rotate.param == 0 || currentProcessedActorPtr->rotate.newAngle != lifeTempVar1) + if (currentProcessedActorPtr->rotate.numSteps == 0 || currentProcessedActorPtr->rotate.endValue != lifeTempVar1) { InitRealValue(currentProcessedActorPtr->beta, lifeTempVar1, lifeTempVar2, ¤tProcessedActorPtr->rotate); } @@ -1230,7 +1244,7 @@ void processLife(int lifeNum, bool callFoundLife) if (currentProcessedActorPtr->alpha != lifeTempVar1) { - if (currentProcessedActorPtr->rotate.param == 0 || lifeTempVar1 != currentProcessedActorPtr->rotate.newAngle) + if (currentProcessedActorPtr->rotate.numSteps == 0 || lifeTempVar1 != currentProcessedActorPtr->rotate.endValue) { InitRealValue(currentProcessedActorPtr->alpha, lifeTempVar1, lifeTempVar2, ¤tProcessedActorPtr->rotate); } diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 0099098..6e60ad4 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -2445,7 +2445,7 @@ void InitView() RestoreTimerAnim(); } -s16 computeDistanceToPoint(int x1, int z1, int x2, int z2) +s16 GiveDistance2D(int x1, int z1, int x2, int z2) { //int axBackup = x1; x1 -= x2; @@ -2470,49 +2470,49 @@ s16 computeDistanceToPoint(int x1, int z1, int x2, int z2) } } -void InitRealValue(s16 beta, s16 newBeta, s16 param, interpolatedValue* rotatePtr) +void InitRealValue(s16 startValue, s16 endValue, s16 time, RealValue* realValue) { - rotatePtr->oldAngle = beta; - rotatePtr->newAngle = newBeta; - rotatePtr->param = param; - rotatePtr->timeOfRotate = timer; + realValue->startValue = startValue; + realValue->endValue = endValue; + realValue->numSteps = time; + realValue->memoTicks = timer; } -s16 updateActorRotation(interpolatedValue* rotatePtr) +s16 updateActorRotation(RealValue* rotatePtr) { int timeDif; int angleDif; - if(!rotatePtr->param) - return(rotatePtr->newAngle); + if(!rotatePtr->numSteps) + return(rotatePtr->endValue); - timeDif = timer - rotatePtr->timeOfRotate; + timeDif = timer - rotatePtr->memoTicks; - if(timeDif>rotatePtr->param) + if(timeDif>rotatePtr->numSteps) { - rotatePtr->param = 0; - return(rotatePtr->newAngle); + rotatePtr->numSteps = 0; + return(rotatePtr->endValue); } - angleDif = (rotatePtr->newAngle&0x3FF) - (rotatePtr->oldAngle&0x3FF); + angleDif = (rotatePtr->endValue&0x3FF) - (rotatePtr->startValue&0x3FF); if(angleDif<=0x200) { if(angleDif>=-0x200) { - int angle = (rotatePtr->newAngle&0x3FF) - (rotatePtr->oldAngle&0x3FF); - return (rotatePtr->oldAngle&0x3FF) + (angle*timeDif)/rotatePtr->param; + int angle = (rotatePtr->endValue&0x3FF) - (rotatePtr->startValue&0x3FF); + return (rotatePtr->startValue&0x3FF) + (angle*timeDif)/rotatePtr->numSteps; } else { - s16 angle = ((rotatePtr->newAngle&0x3FF)+0x400) - ((rotatePtr->oldAngle&0x3FF)); - return (((rotatePtr->oldAngle&0x3FF)) + ((angle*timeDif)/rotatePtr->param)); + s16 angle = ((rotatePtr->endValue&0x3FF)+0x400) - ((rotatePtr->startValue&0x3FF)); + return (((rotatePtr->startValue&0x3FF)) + ((angle*timeDif)/rotatePtr->numSteps)); } } else { - int angle = (rotatePtr->newAngle&0x3FF) - ((rotatePtr->oldAngle&0x3FF)+0x400); - return ((angle*timeDif)/rotatePtr->param) + ((rotatePtr->oldAngle&0x3FF)); + int angle = (rotatePtr->endValue&0x3FF) - ((rotatePtr->startValue&0x3FF)+0x400); + return ((angle*timeDif)/rotatePtr->numSteps) + ((rotatePtr->startValue&0x3FF)); } } diff --git a/FitdLib/main.h b/FitdLib/main.h index a090355..f19599f 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -57,10 +57,10 @@ int Lire(int index, int left, int top, int right, int bottom, int mode, int colo void setupCameraProjection(int centerX, int centerY, int x, int y, int z); void SetAngleCamera(int x, int y, int z); void SetPosCamera(int x, int y, int z); -s16 computeDistanceToPoint(int x1, int z1, int x2, int z2); +s16 GiveDistance2D(int x1, int z1, int x2, int z2); void setMoveMode(int trackMode, int trackNumber); -void InitRealValue(s16 beta, s16 newBeta, s16 param, interpolatedValue* rotatePtr); -s16 updateActorRotation(interpolatedValue* rotatePtr); +void InitRealValue(s16 beta, s16 newBeta, s16 param, RealValue* rotatePtr); +s16 updateActorRotation(RealValue* rotatePtr); s16 GetNbFramesAnim(char* animPtr); int SetAnimObjet(int frame, char* anim, char* body); void deleteObject(int objIdx); diff --git a/FitdLib/object.cpp b/FitdLib/object.cpp index 626f68f..4a92aab 100644 --- a/FitdLib/object.cpp +++ b/FitdLib/object.cpp @@ -73,13 +73,13 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x actorPtr->hardMat = -1; } - actorPtr->rotate.oldAngle = 0; - actorPtr->rotate.newAngle = 0; - actorPtr->rotate.param = 0; + actorPtr->rotate.startValue = 0; + actorPtr->rotate.endValue = 0; + actorPtr->rotate.numSteps = 0; - actorPtr->YHandler.oldAngle = 0; - actorPtr->YHandler.newAngle = 0; - actorPtr->YHandler.param = 0; + actorPtr->YHandler.startValue = 0; + actorPtr->YHandler.endValue = 0; + actorPtr->YHandler.numSteps = 0; actorPtr->falling = 0; diff --git a/FitdLib/save.cpp b/FitdLib/save.cpp index 3c45cc5..02d4ebb 100644 --- a/FitdLib/save.cpp +++ b/FitdLib/save.cpp @@ -9,34 +9,34 @@ void* getSaveEntry(int index) return(saveTable[index].ptr); } -void loadInterpolatedValue(interpolatedValue* pRotateStruct, FILE* fHandle) +void loadInterpolatedValue(RealValue* pRotateStruct, FILE* fHandle) { - ASSERT(sizeof(pRotateStruct->oldAngle) == 2); - fread(&pRotateStruct->oldAngle,2,1,fHandle); + ASSERT(sizeof(pRotateStruct->startValue) == 2); + fread(&pRotateStruct->startValue,2,1,fHandle); - ASSERT(sizeof(pRotateStruct->newAngle) == 2); - fread(&pRotateStruct->newAngle,2,1,fHandle); + ASSERT(sizeof(pRotateStruct->endValue) == 2); + fread(&pRotateStruct->endValue,2,1,fHandle); - ASSERT(sizeof(pRotateStruct->param) == 2); - fread(&pRotateStruct->param,2,1,fHandle); + ASSERT(sizeof(pRotateStruct->numSteps) == 2); + fread(&pRotateStruct->numSteps,2,1,fHandle); - ASSERT(sizeof(pRotateStruct->timeOfRotate) == 4); - fread(&pRotateStruct->timeOfRotate,2,1,fHandle); + ASSERT(sizeof(pRotateStruct->memoTicks) == 4); + fread(&pRotateStruct->memoTicks,2,1,fHandle); } -void saveInterpolatedValue(interpolatedValue* pRotateStruct, FILE* fHandle) +void saveInterpolatedValue(RealValue* pRotateStruct, FILE* fHandle) { - ASSERT(sizeof(pRotateStruct->oldAngle) == 2); - fwrite(&pRotateStruct->oldAngle,2,1,fHandle); + ASSERT(sizeof(pRotateStruct->startValue) == 2); + fwrite(&pRotateStruct->startValue,2,1,fHandle); - ASSERT(sizeof(pRotateStruct->newAngle) == 2); - fwrite(&pRotateStruct->newAngle,2,1,fHandle); + ASSERT(sizeof(pRotateStruct->endValue) == 2); + fwrite(&pRotateStruct->endValue,2,1,fHandle); - ASSERT(sizeof(pRotateStruct->param) == 2); - fwrite(&pRotateStruct->param,2,1,fHandle); + ASSERT(sizeof(pRotateStruct->numSteps) == 2); + fwrite(&pRotateStruct->numSteps,2,1,fHandle); - ASSERT(sizeof(pRotateStruct->timeOfRotate) == 4); - fwrite(&pRotateStruct->timeOfRotate,2,1,fHandle); + ASSERT(sizeof(pRotateStruct->memoTicks) == 4); + fwrite(&pRotateStruct->memoTicks,2,1,fHandle); } int loadSave(int saveNumber) diff --git a/FitdLib/track.cpp b/FitdLib/track.cpp index 15531b1..3f566c2 100644 --- a/FitdLib/track.cpp +++ b/FitdLib/track.cpp @@ -77,12 +77,12 @@ void GereManualRot(int param) { if(currentProcessedActorPtr->direction != 1) { - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; } currentProcessedActorPtr->direction = 1; - if(currentProcessedActorPtr->rotate.param == 0) + if(currentProcessedActorPtr->rotate.numSteps == 0) { int oldBeta = currentProcessedActorPtr->beta; @@ -102,12 +102,12 @@ void GereManualRot(int param) { if(currentProcessedActorPtr->direction != -1) { - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; } currentProcessedActorPtr->direction = -1; - if(currentProcessedActorPtr->rotate.param == 0) + if(currentProcessedActorPtr->rotate.numSteps == 0) { int oldBeta = currentProcessedActorPtr->beta; @@ -126,7 +126,7 @@ void GereManualRot(int param) if(!(localJoyD&0xC)) { currentProcessedActorPtr->direction = 0; - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; } } @@ -247,16 +247,16 @@ void processTrack(void) currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, currentProcessedActorPtr->beta, x, z ); - if( currentProcessedActorPtr->rotate.param == 0 || currentProcessedActorPtr->direction != angleModif ) + if( (currentProcessedActorPtr->rotate.numSteps == 0) || (currentProcessedActorPtr->direction != angleModif) ) { - InitRealValue( currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (angleModif << 8), 60, ¤tProcessedActorPtr->rotate); + InitRealValue( currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (angleModif * 256), 60, ¤tProcessedActorPtr->rotate); } currentProcessedActorPtr->direction = angleModif; if( currentProcessedActorPtr->direction == 0 ) { - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; } else { @@ -325,7 +325,7 @@ void processTrack(void) currentProcessedActorPtr->speed = 0; currentProcessedActorPtr->direction = 0; - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; currentProcessedActorPtr->positionInTrack += 5; break; @@ -353,7 +353,7 @@ void processTrack(void) z += (roomDataTable[currentProcessedActorPtr->room].worldZ - roomDataTable[roomNumber].worldZ) * 10; } - distanceToPoint = computeDistanceToPoint( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, + distanceToPoint = GiveDistance2D( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, x,z ); @@ -365,7 +365,7 @@ void processTrack(void) currentProcessedActorPtr->beta, x,z ); - if((currentProcessedActorPtr->rotate.param == 0) || (currentProcessedActorPtr->direction != angleModif)) + if((currentProcessedActorPtr->rotate.numSteps == 0) || (currentProcessedActorPtr->direction != angleModif)) { InitRealValue(currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (angleModif * 64), 15, ¤tProcessedActorPtr->rotate); } @@ -374,7 +374,7 @@ void processTrack(void) if(!angleModif) { - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; } else { @@ -416,33 +416,37 @@ void processTrack(void) } // reached position? - if ((y == currentProcessedActorPtr->roomY) && (computeDistanceToPoint(currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, x, z) < DISTANCE_TO_POINT_TRESSHOLD)) + if (y == currentProcessedActorPtr->roomY) { - currentProcessedActorPtr->positionInTrack += 6; - } - else + int distance = GiveDistance2D(currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, x, z); + if (distance < DISTANCE_TO_POINT_TRESSHOLD) { + currentProcessedActorPtr->positionInTrack += 6; + break; + } + } + { - int angleModif = computeAngleModificatorToPosition( + int direction = computeAngleModificatorToPosition( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, currentProcessedActorPtr->beta, x, z); - if (currentProcessedActorPtr->YHandler.param == 0) + if (currentProcessedActorPtr->YHandler.numSteps == 0) { InitRealValue(0, y - (currentProcessedActorPtr->roomY + currentProcessedActorPtr->stepY), time, ¤tProcessedActorPtr->YHandler); } - if ((currentProcessedActorPtr->rotate.param == 0) || (currentProcessedActorPtr->direction != angleModif)) + if ((currentProcessedActorPtr->rotate.numSteps == 0) || (currentProcessedActorPtr->direction != direction)) { - InitRealValue(currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (angleModif * 256), 60, ¤tProcessedActorPtr->rotate); + InitRealValue(currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (direction * 256), 60, ¤tProcessedActorPtr->rotate); } - currentProcessedActorPtr->direction = angleModif; + currentProcessedActorPtr->direction = direction; - if (!angleModif) + if (!direction) { - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; } else { @@ -503,7 +507,7 @@ void processTrack(void) currentProcessedActorPtr->direction = -1; // right } - if(!currentProcessedActorPtr->rotate.param) + if(!currentProcessedActorPtr->rotate.numSteps) { InitRealValue(currentProcessedActorPtr->beta, betaDif, 120, ¤tProcessedActorPtr->rotate); } @@ -593,7 +597,7 @@ void processTrack(void) currentProcessedActorPtr->beta, x,z ); - if(!currentProcessedActorPtr->rotate.param || currentProcessedActorPtr->direction != angleModif) + if(!currentProcessedActorPtr->rotate.numSteps || currentProcessedActorPtr->direction != angleModif) { InitRealValue(currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (angleModif<<8), 60, ¤tProcessedActorPtr->rotate); } @@ -606,7 +610,7 @@ void processTrack(void) } else { - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; } } @@ -664,7 +668,7 @@ void processTrack(void) currentProcessedActorPtr->beta, x,z ); - if(!currentProcessedActorPtr->rotate.param || currentProcessedActorPtr->direction != angleModif) + if(!currentProcessedActorPtr->rotate.numSteps || currentProcessedActorPtr->direction != angleModif) { InitRealValue(currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (angleModif<<8), 60, ¤tProcessedActorPtr->rotate); } @@ -677,7 +681,7 @@ void processTrack(void) } else { - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; } } @@ -802,7 +806,7 @@ void processTrack2(void) currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, currentProcessedActorPtr->beta, x, z ); - if( currentProcessedActorPtr->rotate.param == 0 || currentProcessedActorPtr->direction != angleModif ) + if( currentProcessedActorPtr->rotate.numSteps == 0 || currentProcessedActorPtr->direction != angleModif ) { InitRealValue( currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (angleModif << 8), 60, ¤tProcessedActorPtr->rotate); } @@ -811,7 +815,7 @@ void processTrack2(void) if( currentProcessedActorPtr->direction == 0 ) { - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; } else { @@ -880,7 +884,7 @@ void processTrack2(void) currentProcessedActorPtr->speed = 0; currentProcessedActorPtr->direction = 0; - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; currentProcessedActorPtr->positionInTrack += 5; break; @@ -907,7 +911,7 @@ void processTrack2(void) z += (roomDataTable[currentProcessedActorPtr->room].worldZ - roomDataTable[roomNumber].worldZ) * 10; } - distanceToPoint = computeDistanceToPoint( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, + distanceToPoint = GiveDistance2D( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, x,z ); @@ -919,7 +923,7 @@ void processTrack2(void) currentProcessedActorPtr->beta, x,z ); - if(currentProcessedActorPtr->rotate.param == 0 || currentProcessedActorPtr->direction != angleModif) + if(currentProcessedActorPtr->rotate.numSteps == 0 || currentProcessedActorPtr->direction != angleModif) { InitRealValue(currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (angleModif<<6), 15, ¤tProcessedActorPtr->rotate); } @@ -928,7 +932,7 @@ void processTrack2(void) if(!angleModif) { - currentProcessedActorPtr->rotate.param = 0; + currentProcessedActorPtr->rotate.numSteps = 0; } else { @@ -979,7 +983,7 @@ void processTrack2(void) currentProcessedActorPtr->direction = -1; } - if(!currentProcessedActorPtr->rotate.param) + if(!currentProcessedActorPtr->rotate.numSteps) { InitRealValue(currentProcessedActorPtr->beta, betaDif, 120, ¤tProcessedActorPtr->rotate); } diff --git a/FitdLib/vars.h b/FitdLib/vars.h index ee990e5..cf1b9d4 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -93,15 +93,15 @@ struct ZVStruct typedef struct ZVStruct ZVStruct; -struct interpolatedValue +struct RealValue { - s16 oldAngle; - s16 newAngle; - s16 param; - unsigned int timeOfRotate; + s16 startValue; + s16 endValue; + s16 numSteps; + unsigned int memoTicks; }; -typedef struct interpolatedValue interpolatedValue; +typedef struct RealValue RealValue; enum actorFlags { @@ -167,12 +167,12 @@ struct tObject // used to read data from file too s16 animNegY; s16 animNegZ; - interpolatedValue YHandler; + RealValue YHandler; s16 falling; - interpolatedValue rotate; + RealValue rotate; s16 direction; s16 speed; - interpolatedValue speedChange; + RealValue speedChange; s16 COL[3]; s16 COL_BY; s16 HARD_DEC; From bd78f4501df93c0c089536241b791ee49e7d0a77 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Fri, 13 Jun 2025 01:06:27 -0700 Subject: [PATCH 25/70] Debug asan config --- CMakeLists.txt | 37 +++++++++++++++++++++++++++++++++++++ FitdLib/CMakeLists.txt | 7 +++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c846fda..5894f44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,32 @@ project(FITD) cmake_minimum_required(VERSION 3.9) +MACRO(COPY_BUILD_CONFIG SourceConfigName DestConfigName) +if(CMAKE_CONFIGURATION_TYPES) + list(APPEND CMAKE_CONFIGURATION_TYPES ${DestConfigName}) + string(TOUPPER ${SourceConfigName} SOURCE_UPCASE) + string(TOUPPER ${DestConfigName} DEST_UPCASE) + + set(CMAKE_SHARED_LINKER_FLAGS_${DEST_UPCASE} ${CMAKE_SHARED_LINKER_FLAGS_${SOURCE_UPCASE}}) + set(CMAKE_EXE_LINKER_FLAGS_${DEST_UPCASE} ${CMAKE_EXE_LINKER_FLAGS_${SOURCE_UPCASE}}) + set(CMAKE_C_FLAGS_${DEST_UPCASE} ${CMAKE_C_FLAGS_${SOURCE_UPCASE}}) + set(CMAKE_CXX_FLAGS_${DEST_UPCASE} ${CMAKE_CXX_FLAGS_${SOURCE_UPCASE}}) +else() + message(" XXX custom build types are not allowed...") +endif() +ENDMACRO(COPY_BUILD_CONFIG) + +set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DBX_CONFIG_DEBUG=0") + +#set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /DBX_CONFIG_DEBUG=1") + +IF(MSVC) + #set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /D_MSVC_STL_HARDENING=1") + #set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /D_MSVC_STL_HARDENING=1") +ENDIF(MSVC) + +COPY_BUILD_CONFIG(Debug Debug_Asan) + set(THIRD_PARTY "${CMAKE_SOURCE_DIR}/ThirdParty") set(BGFX_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) @@ -19,5 +45,16 @@ set(ZLIB_LIBRARY zlibstatic) set(ZLIB_TESTS OFF CACHE BOOL "Build zlib tests") add_subdirectory(${THIRD_PARTY}/zlib ${CMAKE_BINARY_DIR}/zlib/zlib-build) + add_subdirectory( FitdLib ) add_subdirectory( Fitd ) + +target_compile_options( + Fitd PRIVATE "$<$:/fsanitize=address>" +) +target_compile_options( + FitdLib PRIVATE "$<$:/fsanitize=address>" +) +target_compile_options( + bimg PRIVATE "$<$:/fsanitize=address>" +) \ No newline at end of file diff --git a/FitdLib/CMakeLists.txt b/FitdLib/CMakeLists.txt index b0f871f..612ee46 100644 --- a/FitdLib/CMakeLists.txt +++ b/FitdLib/CMakeLists.txt @@ -93,6 +93,9 @@ endif() add_library (FitdLib ${SOURCES}) -target_compile_definitions( FitdLib PUBLIC "BX_CONFIG_DEBUG=0" ) -set_property(TARGET FitdLib PROPERTY CXX_STANDARD 20) + +#set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /DBX_CONFIG_DEBUG=1") +#set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /DBX_CONFIG_DEBUG=1") + +set_property(TARGET FitdLib PROPERTY CXX_STANDARD 20) From 3265f22d79c54d667bdae4a0185d0d736a449f25 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Fri, 13 Jun 2025 01:39:04 -0700 Subject: [PATCH 26/70] Simplify the asan setup --- CMakeLists.txt | 38 ++++++++++---------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5894f44..f42a627 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,23 +1,7 @@ project(FITD) cmake_minimum_required(VERSION 3.9) -MACRO(COPY_BUILD_CONFIG SourceConfigName DestConfigName) -if(CMAKE_CONFIGURATION_TYPES) - list(APPEND CMAKE_CONFIGURATION_TYPES ${DestConfigName}) - string(TOUPPER ${SourceConfigName} SOURCE_UPCASE) - string(TOUPPER ${DestConfigName} DEST_UPCASE) - - set(CMAKE_SHARED_LINKER_FLAGS_${DEST_UPCASE} ${CMAKE_SHARED_LINKER_FLAGS_${SOURCE_UPCASE}}) - set(CMAKE_EXE_LINKER_FLAGS_${DEST_UPCASE} ${CMAKE_EXE_LINKER_FLAGS_${SOURCE_UPCASE}}) - set(CMAKE_C_FLAGS_${DEST_UPCASE} ${CMAKE_C_FLAGS_${SOURCE_UPCASE}}) - set(CMAKE_CXX_FLAGS_${DEST_UPCASE} ${CMAKE_CXX_FLAGS_${SOURCE_UPCASE}}) -else() - message(" XXX custom build types are not allowed...") -endif() -ENDMACRO(COPY_BUILD_CONFIG) - -set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DBX_CONFIG_DEBUG=0") - +set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBX_CONFIG_DEBUG=0") #set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /DBX_CONFIG_DEBUG=1") IF(MSVC) @@ -25,8 +9,6 @@ IF(MSVC) #set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /D_MSVC_STL_HARDENING=1") ENDIF(MSVC) -COPY_BUILD_CONFIG(Debug Debug_Asan) - set(THIRD_PARTY "${CMAKE_SOURCE_DIR}/ThirdParty") set(BGFX_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) @@ -49,12 +31,12 @@ add_subdirectory(${THIRD_PARTY}/zlib ${CMAKE_BINARY_DIR}/zlib/zlib-build) add_subdirectory( FitdLib ) add_subdirectory( Fitd ) -target_compile_options( - Fitd PRIVATE "$<$:/fsanitize=address>" -) -target_compile_options( - FitdLib PRIVATE "$<$:/fsanitize=address>" -) -target_compile_options( - bimg PRIVATE "$<$:/fsanitize=address>" -) \ No newline at end of file +set(USE_ASAN ON CACHE BOOL "" FORCE) +if(USE_ASAN) + target_link_options(Fitd PRIVATE "-fsanitize=address") + target_compile_options(Fitd PRIVATE "-fsanitize=address") + target_compile_options(FitdLib PRIVATE "-fsanitize=address") + target_compile_options(bimg PRIVATE "-fsanitize=address") + target_compile_options(bgfx PRIVATE "-fsanitize=address") + target_compile_options(soloud PRIVATE "-fsanitize=address") +endif() From d95af859063efa7984e47fc88d7187455164af29 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Fri, 13 Jun 2025 01:44:15 -0700 Subject: [PATCH 27/70] No asan by default --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f42a627..3fd0095 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ add_subdirectory(${THIRD_PARTY}/zlib ${CMAKE_BINARY_DIR}/zlib/zlib-build) add_subdirectory( FitdLib ) add_subdirectory( Fitd ) -set(USE_ASAN ON CACHE BOOL "" FORCE) +#set(USE_ASAN ON CACHE BOOL "" FORCE) if(USE_ASAN) target_link_options(Fitd PRIVATE "-fsanitize=address") target_compile_options(Fitd PRIVATE "-fsanitize=address") From cea84b5a6d7dab361feafd417e3bf0c95d521d51 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Fri, 13 Jun 2025 18:03:51 -0700 Subject: [PATCH 28/70] Mask rework --- .gitignore | 2 +- CMakeLists.txt | 17 +++++++++-------- FitdLib/common.h | 8 ++++++-- FitdLib/evalVar.cpp | 8 ++++++-- FitdLib/main.cpp | 24 +++++++++++++----------- FitdLib/osystem.h | 4 ++-- FitdLib/rendererBGFX.cpp | 4 ++-- FitdLib/room.cpp | 14 ++++++++++---- FitdLib/room.h | 4 ++-- 9 files changed, 51 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index 823f92d..b9d3a16 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ /build/vs2019 /FitdLib/shaders/generated -build/vs2022 +build data diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fd0095..9ad77bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,12 +31,13 @@ add_subdirectory(${THIRD_PARTY}/zlib ${CMAKE_BINARY_DIR}/zlib/zlib-build) add_subdirectory( FitdLib ) add_subdirectory( Fitd ) -#set(USE_ASAN ON CACHE BOOL "" FORCE) -if(USE_ASAN) - target_link_options(Fitd PRIVATE "-fsanitize=address") - target_compile_options(Fitd PRIVATE "-fsanitize=address") - target_compile_options(FitdLib PRIVATE "-fsanitize=address") - target_compile_options(bimg PRIVATE "-fsanitize=address") - target_compile_options(bgfx PRIVATE "-fsanitize=address") - target_compile_options(soloud PRIVATE "-fsanitize=address") +set(USE_SANITIZER ON) +if(USE_SANITIZER) + set(SANITIZER_TYPE "address,undefined,leak") + target_link_options(Fitd PRIVATE "-fsanitize=${SANITIZER_TYPE}") + target_compile_options(Fitd PRIVATE "-fsanitize=${SANITIZER_TYPE}") + target_compile_options(FitdLib PRIVATE "-fsanitize=${SANITIZER_TYPE}") + target_compile_options(bimg PRIVATE "-fsanitize=${SANITIZER_TYPE}") + target_compile_options(bgfx PRIVATE "-fsanitize=${SANITIZER_TYPE}") + target_compile_options(soloud PRIVATE "-fsanitize=${SANITIZER_TYPE}") endif() diff --git a/FitdLib/common.h b/FitdLib/common.h index fe05147..d0e8a99 100644 --- a/FitdLib/common.h +++ b/FitdLib/common.h @@ -197,7 +197,9 @@ FORCEINLINE u16 READ_LE_U16(void *ptr) #ifdef MACOSX return (((u8*)ptr)[1]<<8)|((u8*)ptr)[0]; #else - return *(u16*)ptr; + u16 temp; + memcpy(&temp, ptr, 2); + return temp; #endif } @@ -225,7 +227,9 @@ FORCEINLINE u32 READ_LE_U32(void *ptr) #ifdef MACOSX return (((u8*)ptr)[3]<<24)|(((u8*)ptr)[2]<<16)|(((u8*)ptr)[1]<<8)|((u8*)ptr)[0]; #else - return *(u32*)ptr; + u32 temp; + memcpy(&temp, ptr, 4); + return temp; #endif } diff --git a/FitdLib/evalVar.cpp b/FitdLib/evalVar.cpp index 05a2482..084e1d7 100644 --- a/FitdLib/evalVar.cpp +++ b/FitdLib/evalVar.cpp @@ -201,10 +201,10 @@ int evalVar(const char* name) actorIdx = ListWorldObjets[objectNumber].objIndex; currentLifePtr+=2; - actorPtr = &objectTable[actorIdx]; - + if(actorIdx==-1) { + actorPtr = nullptr; switch(var1 & 0x7FFF) { case 0x1F: @@ -224,6 +224,10 @@ int evalVar(const char* name) } } } + else { + actorPtr = &objectTable[actorIdx]; + } + } { diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 6e60ad4..7a5af86 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -1338,10 +1338,12 @@ struct maskStruct std::array mask; }; -maskStruct g_maskBuffers[10][10]; +std::vector> g_maskBuffers; void loadMask(int cameraIdx) { + g_maskBuffers.clear(); + if (g_gameId == TIMEGATE) return; @@ -1409,7 +1411,7 @@ void loadMask(int cameraIdx) } } - osystem_createMask(pDestMask->mask, i, j, (unsigned char*)aux, pDestMask->x1, pDestMask->y1, pDestMask->x2, pDestMask->y2); + osystem_createMask(pDestMask->mask, i, j, pDestMask->x1, pDestMask->y1, pDestMask->x2, pDestMask->y2); } } } @@ -1431,13 +1433,13 @@ void createAITD1Mask() for(int maskIdx=0;maskIdxmask.fill(0); - polyBackBuffer = &pDestMask->mask[0]; - - char* src = data2 + *(u16*)(data+2); + polyBackBuffer = pDestMask->mask.data(); - int numMaskZone = *(s16*)(data); + int numMaskZone = READ_LE_U16(data); + char* src = data2 + READ_LE_U16(data+2); int minX = 319; int maxX = 0; @@ -1449,12 +1451,12 @@ void createAITD1Mask() data+4, *(s16*)(data) ))*/ { - int numMaskPoly = *(s16*)src; + int numMaskPoly = READ_LE_U16(src); src += 2; for(int maskPolyIdx=0;maskPolyIdxmask, viewedRoomIdx, maskIdx, (unsigned char*)aux, minX-1, minY-1, maxX+1, maxY+1); + osystem_createMask(pDestMask->mask, viewedRoomIdx, maskIdx, minX-1, minY-1, maxX+1, maxY+1); - int numOverlay = *(s16*)(data); + int numOverlay = READ_LE_U16(data); data+=2; data+=((numOverlay*4)+1)*2; } diff --git a/FitdLib/osystem.h b/FitdLib/osystem.h index e79bd34..3364a94 100644 --- a/FitdLib/osystem.h +++ b/FitdLib/osystem.h @@ -63,8 +63,8 @@ void osystem_playSample(char* samplePtr,int size); // void getMouseStatus(mouseStatusStruct * mouseData); - void osystem_createMask(const std::array& mask, int roomId, int maskId, unsigned char* refImage, int maskX1, int maskY1, int maskX2, int maskY2); - void osystem_drawMask(int roomId, int maskId); + void osystem_createMask(const std::array& mask, int roomId, int maskId, int maskX1, int maskY1, int maskX2, int maskY2); + void osystem_drawMask(int roomId, int maskId); void osystem_startFrame(); void osystem_stopFrame(); diff --git a/FitdLib/rendererBGFX.cpp b/FitdLib/rendererBGFX.cpp index ce4047a..cfa7dd9 100644 --- a/FitdLib/rendererBGFX.cpp +++ b/FitdLib/rendererBGFX.cpp @@ -1182,7 +1182,7 @@ void osystem_flip(unsigned char* videoBuffer) osystem_flushPendingPrimitives(); } -void osystem_createMask(const std::array& mask, int roomId, int maskId, unsigned char* refImage, int maskX1, int maskY1, int maskX2, int maskY2) +void osystem_createMask(const std::array& mask, int roomId, int maskId, int maskX1, int maskY1, int maskX2, int maskY2) { if (maskTextures.size() < roomId + 1) { @@ -1205,7 +1205,7 @@ void osystem_createMask(const std::array& mask, int roomId, int m maskTextures[roomId][maskId].vertexBuffer = BGFX_INVALID_HANDLE; } - maskTextures[roomId][maskId].maskTexture = bgfx::createTexture2D(320, 200, false, 1, bgfx::TextureFormat::R8U, 0, bgfx::copy(&mask[0], 320 * 200)); + maskTextures[roomId][maskId].maskTexture = bgfx::createTexture2D(320, 200, false, 1, bgfx::TextureFormat::R8U, 0, bgfx::copy(mask.data(), 320 * 200)); maskTextures[roomId][maskId].maskX1 = maskX1; maskTextures[roomId][maskId].maskX2 = maskX2 + 1; maskTextures[roomId][maskId].maskY1 = maskY1; diff --git a/FitdLib/room.cpp b/FitdLib/room.cpp index a59e9d1..0533ea4 100644 --- a/FitdLib/room.cpp +++ b/FitdLib/room.cpp @@ -14,8 +14,8 @@ etageVar1 -> table for camera data */ std::vector roomDataTable; -cameraDataStruct* cameraDataTable[NUM_MAX_CAMERA_IN_ROOM]; -cameraViewedRoomStruct* currentCameraZoneList[NUM_MAX_CAMERA_IN_ROOM]; +std::vector cameraDataTable; +std::vector currentCameraZoneList; roomDefStruct* getRoomData(int roomNumber) { @@ -112,6 +112,11 @@ void ChangeSalle(int roomNumber) int newNumCamera = 0; int newAbsCamera = -1; + cameraDataTable.clear(); + + currentCameraZoneList.clear(); + currentCameraZoneList.resize(numCameraInRoom, nullptr); + // load the new camera table and try to keep the same camera (except if changing floor) for(i=0;inumViewedRooms; @@ -143,8 +148,9 @@ void ChangeSalle(int roomNumber) } ASSERT(cameraDataTable[i]->viewedRoomTable[j].viewedRoomIdx == currentRoom); - if(cameraDataTable[i]->viewedRoomTable[j].viewedRoomIdx == currentRoom) + if(cameraDataTable[i]->viewedRoomTable[j].viewedRoomIdx == currentRoom) { currentCameraZoneList[i] = &cameraDataTable[i]->viewedRoomTable[j]; + } } // reajust world coordinates diff --git a/FitdLib/room.h b/FitdLib/room.h index 7c0b4a7..3f3513d 100644 --- a/FitdLib/room.h +++ b/FitdLib/room.h @@ -106,8 +106,8 @@ struct roomDataStruct }; typedef struct roomDataStruct roomDataStruct; -extern cameraDataStruct* cameraDataTable[NUM_MAX_CAMERA_IN_ROOM]; -extern cameraViewedRoomStruct* currentCameraZoneList[NUM_MAX_CAMERA_IN_ROOM]; +extern std::vector cameraDataTable; +extern std::vector currentCameraZoneList; extern std::vector roomDataTable; roomDefStruct* getRoomData(int roomNumber); From 5572ed2b4473790592b2685a6fa2ce8b129cace5 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Fri, 13 Jun 2025 19:18:23 -0700 Subject: [PATCH 29/70] Fix overlapping type name --- FitdLib/main.cpp | 16 ++++++++-------- FitdLib/rendererBGFX.cpp | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 7a5af86..daef974 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -1326,7 +1326,7 @@ void loadCamera(int cameraIdx) } } -struct maskStruct +struct sMaskStruct { u16 x1; u16 y1; @@ -1338,12 +1338,10 @@ struct maskStruct std::array mask; }; -std::vector> g_maskBuffers; +std::vector> g_maskBuffers; void loadMask(int cameraIdx) { - g_maskBuffers.clear(); - if (g_gameId == TIMEGATE) return; @@ -1358,17 +1356,19 @@ void loadMask(int cameraIdx) g_MaskPtr = (unsigned char*)loadPak(name,cameraIdx); + g_maskBuffers.clear(); + g_maskBuffers.resize(cameraDataTable[NumCamera]->numViewedRooms); for(int i=0; inumViewedRooms; i++) { cameraViewedRoomStruct* pRoomView = &cameraDataTable[NumCamera]->viewedRoomTable[i]; unsigned char* pViewedRoomMask = g_MaskPtr + READ_LE_U32(g_MaskPtr + i*4); + g_maskBuffers[i].reserve(pRoomView->numMask); for(int j=0; jnumMask; j++) { + sMaskStruct* pDestMask = &g_maskBuffers[i].emplace_back(); unsigned char* pMaskData = pViewedRoomMask + READ_LE_U32(pViewedRoomMask + j*4); - maskStruct* pDestMask = &g_maskBuffers[i][j]; - pDestMask->mask.fill(0); pDestMask->x1 = READ_LE_U16(pMaskData); @@ -1433,8 +1433,8 @@ void createAITD1Mask() for(int maskIdx=0;maskIdxmask.fill(0); polyBackBuffer = pDestMask->mask.data(); diff --git a/FitdLib/rendererBGFX.cpp b/FitdLib/rendererBGFX.cpp index cfa7dd9..d0c8698 100644 --- a/FitdLib/rendererBGFX.cpp +++ b/FitdLib/rendererBGFX.cpp @@ -45,10 +45,10 @@ struct maskStruct { bgfx::TextureHandle maskTexture = BGFX_INVALID_HANDLE; bgfx::VertexBufferHandle vertexBuffer = BGFX_INVALID_HANDLE; - int maskX1; - int maskY1; - int maskX2; - int maskY2; + int maskX1 = 0; + int maskY1 = 0; + int maskX2 = 0; + int maskY2 = 0; }; std::vector> maskTextures; // [room][mask] From 49ae160a08c1f4be462c69e2f2d661f2a9737f05 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Fri, 13 Jun 2025 19:18:32 -0700 Subject: [PATCH 30/70] Fix asan for msvc --- CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ad77bf..66d27d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,12 @@ add_subdirectory( Fitd ) set(USE_SANITIZER ON) if(USE_SANITIZER) - set(SANITIZER_TYPE "address,undefined,leak") + IF(MSVC) + set(SANITIZER_TYPE "address") + ELSE() + set(SANITIZER_TYPE "address,undefined,leak") + ENDIF() + target_link_options(Fitd PRIVATE "-fsanitize=${SANITIZER_TYPE}") target_compile_options(Fitd PRIVATE "-fsanitize=${SANITIZER_TYPE}") target_compile_options(FitdLib PRIVATE "-fsanitize=${SANITIZER_TYPE}") From 9eaaf16f8e2c4d6f4420d5a762f230345c484493 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 14 Jun 2025 02:08:20 -0700 Subject: [PATCH 31/70] Implement reset animations, cleanups and fix a few sanitizer issues --- FitdLib/aitdBox.cpp | 6 ++ FitdLib/anim.cpp | 163 +++++++++++++++++++++++------------------ FitdLib/anim.h | 3 +- FitdLib/animAction.cpp | 12 +-- FitdLib/debugger.cpp | 4 +- FitdLib/evalVar.cpp | 13 ++-- FitdLib/life.cpp | 84 +++++++++++++++------ FitdLib/main.cpp | 124 +++++++++++++++++-------------- FitdLib/mainLoop.cpp | 14 ++-- FitdLib/object.cpp | 16 ++-- FitdLib/save.cpp | 28 +++---- FitdLib/track.cpp | 8 +- FitdLib/vars.cpp | 13 ++-- FitdLib/vars.h | 16 ++-- 14 files changed, 298 insertions(+), 206 deletions(-) diff --git a/FitdLib/aitdBox.cpp b/FitdLib/aitdBox.cpp index e33fe4d..e1a855a 100644 --- a/FitdLib/aitdBox.cpp +++ b/FitdLib/aitdBox.cpp @@ -28,6 +28,12 @@ void afficheSprite(int left, int top, int index, char* gfxData) offset = 320 - width; + // Prevent overflow + if(height + top > 200) + { + height = top - 200; + } + for(i=0;i g_bodyBufferMap; int SetAnimObjet(int frame, char* anim, char* body) -{ - sAnimation* pAnimation = getAnimationFromPtr(anim); +{ + sAnimation* pAnimation = getAnimationFromPtr(anim); s16 temp; s16 ax; @@ -129,23 +129,23 @@ int InitAnim(int animNum,int animType, int animInfo) { if(animNum == currentProcessedActorPtr->ANIM) { - if(!(currentProcessedActorPtr->_flags & AF_ANIMATED)) + if(!(currentProcessedActorPtr->objectType & AF_ANIMATED)) { - if(currentProcessedActorPtr->_flags & AF_BOXIFY) + if(currentProcessedActorPtr->objectType & AF_BOXIFY) { removeFromBGIncrust(currentProcessedActorIdx); } - currentProcessedActorPtr->_flags |= AF_ANIMATED; + currentProcessedActorPtr->objectType |= AF_ANIMATED; - SetAnimObjet(currentProcessedActorPtr->FRAME, HQR_Get(listAnim,animNum), HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); + SetAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim,animNum), HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); currentProcessedActorPtr->animType = animType; currentProcessedActorPtr->animInfo = animInfo; if(g_gameId > AITD1) { - currentProcessedActorPtr->FRAME = 0; + currentProcessedActorPtr->frame = 0; } return 1; @@ -164,11 +164,11 @@ int InitAnim(int animNum,int animType, int animInfo) return(1); } - if(!(currentProcessedActorPtr->_flags & AF_ANIMATED)) + if(!(currentProcessedActorPtr->objectType & AF_ANIMATED)) { - currentProcessedActorPtr->_flags |= AF_ANIMATED; + currentProcessedActorPtr->objectType |= AF_ANIMATED; - if(currentProcessedActorPtr->_flags & AF_BOXIFY) + if(currentProcessedActorPtr->objectType & AF_BOXIFY) { removeFromBGIncrust(currentProcessedActorIdx); } @@ -180,7 +180,7 @@ int InitAnim(int animNum,int animType, int animInfo) currentProcessedActorPtr->newAnimInfo = animInfo; if(g_gameId > AITD1) { - currentProcessedActorPtr->FRAME = 0; + currentProcessedActorPtr->frame = 0; } return 1; } @@ -215,7 +215,7 @@ int InitAnim(int animNum,int animType, int animInfo) if(g_gameId != AITD1) { - currentProcessedActorPtr->FRAME = 0; + currentProcessedActorPtr->frame = 0; } return(1); @@ -293,52 +293,64 @@ void updateAnimation(void) int newAnim = currentProcessedActorPtr->newAnim; - if(newAnim != -1) // next anim ? - { - if(newAnim == -2) // completely stop anim and add actor to background - { - addActorToBgInscrust(currentProcessedActorIdx); - currentProcessedActorPtr->newAnim = -1; - currentProcessedActorPtr->newAnimType = 0; - currentProcessedActorPtr->newAnimInfo = -1; - currentProcessedActorPtr->END_ANIM = 1; + if (newAnim != -1) // next anim ? + { + if (newAnim == -2) // completely stop anim and add actor to background + { + addActorToBgInscrust(currentProcessedActorIdx); + currentProcessedActorPtr->newAnim = -1; + currentProcessedActorPtr->newAnimType = 0; + currentProcessedActorPtr->newAnimInfo = -1; + currentProcessedActorPtr->flagEndAnim = 1; - return; - } + return; + } + else { + if (!(currentProcessedActorPtr->newAnimType & ANIM_RESET)) // Reset + { + if (currentProcessedActorPtr->END_FRAME == 0) + { + currentProcessedActorPtr->worldX += currentProcessedActorPtr->stepX; + currentProcessedActorPtr->roomX += currentProcessedActorPtr->stepX; - if(currentProcessedActorPtr->END_FRAME == 0) - { - currentProcessedActorPtr->worldX += currentProcessedActorPtr->stepX; - currentProcessedActorPtr->roomX += currentProcessedActorPtr->stepX; + currentProcessedActorPtr->worldZ += currentProcessedActorPtr->stepZ; + currentProcessedActorPtr->roomZ += currentProcessedActorPtr->stepZ; - currentProcessedActorPtr->worldZ += currentProcessedActorPtr->stepZ; - currentProcessedActorPtr->roomZ += currentProcessedActorPtr->stepZ; + currentProcessedActorPtr->stepX = 0; + currentProcessedActorPtr->stepZ = 0; - currentProcessedActorPtr->stepX = 0; - currentProcessedActorPtr->stepZ = 0; + currentProcessedActorPtr->animNegX = 0; + currentProcessedActorPtr->animNegY = 0; + currentProcessedActorPtr->animNegZ = 0; + } - currentProcessedActorPtr->animNegX = 0; - currentProcessedActorPtr->animNegY = 0; - currentProcessedActorPtr->animNegZ = 0; - } + // TODO: AITD3 has some extra code here to handle bufferAnimCounter + + StockInterAnim(BufferAnim[bufferAnimCounter], HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); + + bufferAnimCounter++; + if (bufferAnimCounter == NB_BUFFER_ANIM) + bufferAnimCounter = 0; - initBufferAnim(BufferAnim[bufferAnimCounter], HQR_Get(listBody,currentProcessedActorPtr->bodyNum)); + } + else { + ResetStartAnim(HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); + currentProcessedActorPtr->newAnimType &= ~ANIM_RESET; + } + currentProcessedActorPtr->ANIM = newAnim; + currentProcessedActorPtr->animType = currentProcessedActorPtr->newAnimType; + currentProcessedActorPtr->animInfo = currentProcessedActorPtr->newAnimInfo; - bufferAnimCounter++; - if(bufferAnimCounter == NB_BUFFER_ANIM) - bufferAnimCounter = 0; + currentProcessedActorPtr->newAnim = -1; + currentProcessedActorPtr->newAnimType = 0; + currentProcessedActorPtr->newAnimInfo = -1; - currentProcessedActorPtr->ANIM = newAnim; - currentProcessedActorPtr->animType = currentProcessedActorPtr->newAnimType; - currentProcessedActorPtr->animInfo = currentProcessedActorPtr->newAnimInfo; - currentProcessedActorPtr->newAnim = -1; - currentProcessedActorPtr->newAnimType = 0; - currentProcessedActorPtr->newAnimInfo = -1; - currentProcessedActorPtr->END_ANIM = 0; - currentProcessedActorPtr->FRAME = 0; + currentProcessedActorPtr->flagEndAnim = 0; + currentProcessedActorPtr->frame = 0; - currentProcessedActorPtr->numOfFrames = GetNbFramesAnim(HQR_Get(listAnim,newAnim)); - } + currentProcessedActorPtr->numOfFrames = GetNbFramesAnim(HQR_Get(listAnim, newAnim)); + } + } if(currentProcessedActorPtr->ANIM == -1) // no animation { @@ -382,7 +394,7 @@ void updateAnimation(void) oldStepY = currentProcessedActorPtr->stepY; oldStepZ = currentProcessedActorPtr->stepZ; - currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->FRAME, HQR_Get(listAnim, currentProcessedActorPtr->ANIM), HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); + currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim, currentProcessedActorPtr->ANIM), HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); walkStep(animStepX,animStepZ,currentProcessedActorPtr->beta); @@ -499,7 +511,7 @@ void updateAnimation(void) ZVStruct* touchedZv = &actorTouchedPtr->zv; - if(actorTouchedPtr->_flags & AF_FOUNDABLE) // takable + if(actorTouchedPtr->objectType & AF_FOUNDABLE) // takable { if(currentProcessedActorPtr->trackMode == 1 /*&& ((gameId == AITD1 && defines.field_1E == 0) || (gameId >= JACK && defines.field_6 == 0))*/) // TODO: check if character isn't dead... { @@ -508,7 +520,7 @@ void updateAnimation(void) } else { - if(actorTouchedPtr->_flags & AF_MOVABLE) // can be pushed ? + if(actorTouchedPtr->objectType & AF_MOVABLE) // can be pushed ? { ZVStruct localZv2; @@ -568,12 +580,12 @@ void updateAnimation(void) } else // push succeed { - if(actorTouchedPtr->_flags & AF_BOXIFY) + if(actorTouchedPtr->objectType & AF_BOXIFY) { removeFromBGIncrust(collisionIndex); } - actorTouchedPtr->_flags |= AF_ANIMATED; + actorTouchedPtr->objectType |= AF_ANIMATED; actorTouchedPtr->worldX += stepX; // apply push to object actorTouchedPtr->worldZ += stepZ; @@ -645,7 +657,7 @@ void updateAnimation(void) currentProcessedActorPtr->stepY = 0; - if(currentProcessedActorPtr->_flags & AF_FALLABLE) + if(currentProcessedActorPtr->objectType & AF_FALLABLE) { zvPtr = ¤tProcessedActorPtr->zv; @@ -665,7 +677,7 @@ void updateAnimation(void) } else { - if((currentProcessedActorPtr->YHandler.numSteps != -1) && (currentProcessedActorPtr->_flags & AF_FALLABLE)) + if((currentProcessedActorPtr->YHandler.numSteps != -1) && (currentProcessedActorPtr->objectType & AF_FALLABLE)) { currentProcessedActorPtr->falling = 1; } @@ -679,7 +691,7 @@ void updateAnimation(void) { tObject* actorTouchedPtr = &objectTable[collisionIndex]; - if(actorTouchedPtr->_flags & AF_MOVABLE) + if(actorTouchedPtr->objectType & AF_MOVABLE) { int i; @@ -691,7 +703,7 @@ void updateAnimation(void) if(i == 3) { - actorTouchedPtr->_flags &= ~AF_ANIMATED; + actorTouchedPtr->objectType &= ~AF_ANIMATED; addActorToBgInscrust(collisionIndex); } } @@ -700,12 +712,12 @@ void updateAnimation(void) if(currentProcessedActorPtr->END_FRAME) // key frame change { - currentProcessedActorPtr->FRAME++; + currentProcessedActorPtr->frame++; - if(currentProcessedActorPtr->FRAME >= currentProcessedActorPtr->numOfFrames) // end of anim ? + if(currentProcessedActorPtr->frame >= currentProcessedActorPtr->numOfFrames) // end of anim ? { - currentProcessedActorPtr->END_ANIM = 1; // end of anim - currentProcessedActorPtr->FRAME = 0; // restart anim + currentProcessedActorPtr->flagEndAnim = 1; // end of anim + currentProcessedActorPtr->frame = 0; // restart anim if(!(currentProcessedActorPtr->animType & 1) && (currentProcessedActorPtr->newAnim == -1)) // is another anim waiting ? { @@ -743,14 +755,14 @@ void updateAnimation(void) InitRealValue(0,currentProcessedActorPtr->speed,60,¤tProcessedActorPtr->speedChange); } - currentProcessedActorPtr->END_ANIM = 0; + currentProcessedActorPtr->flagEndAnim = 0; } } -void initBufferAnim(std::vector& buffer, char* bodyPtr) -{ - std::vector::iterator bufferIt = buffer.begin(); +void StockInterAnim(std::vector& buffer, char* bodyPtr) +{ + std::vector::iterator bufferIt = buffer.begin(); int flag = *(s16*)bodyPtr; if(flag & 2) @@ -780,7 +792,7 @@ void initBufferAnim(std::vector& buffer, char* bodyPtr) source+= 10; for(i=0;i& buffer, char* bodyPtr) bufferIt[0] = *(s16*)(source); bufferIt[1] = *(s16*)(source + 2); bufferIt[2] = *(s16*)(source + 4); - bufferIt[3] = *(s16*)(source + 6); + bufferIt[3] = *(s16*)(source + 6); bufferIt +=4; source+=8; @@ -803,7 +815,14 @@ void initBufferAnim(std::vector& buffer, char* bodyPtr) source+=8; } - } + } +} + +void ResetStartAnim(char* bodyPtr) { + bodyPtr += 16; + *(u16*)(bodyPtr + 4) = 0; // reset timer + *(s16*)(bodyPtr) = 0; + *(s16*)(bodyPtr + 2) = 0; } s16 GetNbFramesAnim(char* animPtr) @@ -892,7 +911,7 @@ void PatchInterStep(char** bodyPtr, int bp, int bx) // local } s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr) -{ +{ int numOfBonesInAnim = *(s16*)(animPtr+2); u16 keyframeLength; u16 timeOfKeyframeStart; @@ -901,8 +920,8 @@ s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr) u16 time; int bp; int flag; - - sBody* pBody = getBodyFromPtr(bodyPtr); + + sBody* pBody = getBodyFromPtr(bodyPtr); flag = pBody->m_flags; diff --git a/FitdLib/anim.h b/FitdLib/anim.h index 43f5b23..a6249b0 100644 --- a/FitdLib/anim.h +++ b/FitdLib/anim.h @@ -7,7 +7,8 @@ int InitAnim(int animNum,int animType, int animInfo); int SetAnimObjet(int frame, char* anim, char* body); s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr); s16 GetNbFramesAnim(char* animPtr); -void initBufferAnim(std::vector& animBuffer, char* bodyPtr); +void StockInterAnim(std::vector& animBuffer, char* bodyPtr); +void ResetStartAnim(char* bodyPtr); void updateAnimation(void); void InitCopyBox(char* var0, char* var1); diff --git a/FitdLib/animAction.cpp b/FitdLib/animAction.cpp index 5c11711..eefe7c5 100644 --- a/FitdLib/animAction.cpp +++ b/FitdLib/animAction.cpp @@ -29,7 +29,7 @@ void GereFrappe(void) return; } - if (currentProcessedActorPtr->FRAME == currentProcessedActorPtr->animActionFRAME) + if (currentProcessedActorPtr->frame == currentProcessedActorPtr->animActionFRAME) { currentProcessedActorPtr->animActionType = FRAPPE_OK; } @@ -77,7 +77,7 @@ void GereFrappe(void) actorPtr2->HIT_BY = currentProcessedActorIdx; actorPtr2->hitForce = currentProcessedActorPtr->hitForce; - if(actorPtr2->_flags & AF_ANIMATED) + if(actorPtr2->objectType & AF_ANIMATED) { currentProcessedActorPtr->animActionType = 0; return; @@ -90,7 +90,7 @@ void GereFrappe(void) if(currentProcessedActorPtr->ANIM != currentProcessedActorPtr->animActionANIM) return; - if(currentProcessedActorPtr->FRAME != currentProcessedActorPtr->animActionFRAME) + if(currentProcessedActorPtr->frame != currentProcessedActorPtr->animActionFRAME) return; currentProcessedActorPtr->animActionType = 5; @@ -174,7 +174,7 @@ void GereFrappe(void) } else { - if(currentProcessedActorPtr->FRAME == currentProcessedActorPtr->animActionFRAME) + if(currentProcessedActorPtr->frame == currentProcessedActorPtr->animActionFRAME) { currentProcessedActorPtr->animActionType = 7; @@ -240,8 +240,8 @@ void GereFrappe(void) actorPtr->zv.ZVZ1 += z; actorPtr->zv.ZVZ2 += z; - actorPtr->_flags |= AF_ANIMATED; - actorPtr->_flags &= ~AF_BOXIFY; + actorPtr->objectType |= AF_ANIMATED; + actorPtr->objectType &= ~AF_BOXIFY; ListWorldObjets[objIdx].x = x; ListWorldObjets[objIdx].y = y; diff --git a/FitdLib/debugger.cpp b/FitdLib/debugger.cpp index 2e0996f..852bb51 100644 --- a/FitdLib/debugger.cpp +++ b/FitdLib/debugger.cpp @@ -270,10 +270,10 @@ void debugger_draw(void) InputS16("newAnim", &pObject->newAnim); InputS16("newAnimType", &pObject->newAnimType); InputS16("newAnimInfo", &pObject->newAnimInfo); - InputS16("FRAME", &pObject->FRAME); + InputS16("FRAME", &pObject->frame); InputS16("numOfFrames", &pObject->numOfFrames); InputS16("END_FRAME", &pObject->END_FRAME); - InputS16("END_ANIM", &pObject->END_ANIM); + InputS16("END_ANIM", &pObject->flagEndAnim); InputS16("trackMode", &pObject->trackMode); InputS16("trackNumber", &pObject->trackNumber); InputS16("MARK", &pObject->MARK); diff --git a/FitdLib/evalVar.cpp b/FitdLib/evalVar.cpp index 084e1d7..2d7a3d7 100644 --- a/FitdLib/evalVar.cpp +++ b/FitdLib/evalVar.cpp @@ -298,12 +298,12 @@ int evalVar(const char* name) } case 0x6: { - return(actorPtr->END_ANIM); + return(actorPtr->flagEndAnim); break; } case 0x7: { - return(actorPtr->FRAME); + return(actorPtr->frame); break; } case 0x8: @@ -608,7 +608,7 @@ int evalVar2(const char* name) actorIdx = ListWorldObjets[objectNumber].objIndex; currentLifePtr+=2; - actorPtr = &objectTable[actorIdx]; + actorPtr = nullptr; if(actorIdx==-1) { @@ -640,6 +640,9 @@ int evalVar2(const char* name) } } } + else { + actorPtr = &objectTable[actorIdx]; + } } { @@ -724,12 +727,12 @@ int evalVar2(const char* name) } case 0x6: { - return(actorPtr->END_ANIM); + return(actorPtr->flagEndAnim); break; } case 0x7: { - return(actorPtr->FRAME); + return(actorPtr->frame); break; } case 0x8: diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index 8a2f3d3..eef44aa 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -84,14 +84,11 @@ int randRange(int min, int max) int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alpha, int beta, int gamma, ZVStruct* zvPtr) { s16 localSpecialTable[4]; - tObject* currentActorPtr; - int i; - ZVStruct* actorZvPtr; - memcpy(localSpecialTable, specialTable, 8); - currentActorPtr = objectTable; + tObject* currentActorPtr = objectTable.data(); + int i; for (i = 0; i < NUM_MAX_OBJECT; i++) // count the number of active actors { if (currentActorPtr->indexInWorld == -1) @@ -104,7 +101,7 @@ int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alp return(-1); } - currentActorPtr->_flags = AF_SPECIAL; + currentActorPtr->objectType = AF_SPECIAL; currentActorPtr->indexInWorld = -2; currentActorPtr->life = -1; currentActorPtr->lifeMode = 2; @@ -129,6 +126,7 @@ int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alp currentActorPtr->stepY = 0; currentActorPtr->stepZ = 0; + ZVStruct* actorZvPtr = nullptr; if (zvPtr) { actorZvPtr = ¤tActorPtr->zv; @@ -149,9 +147,9 @@ int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alp actorZvPtr->ZVZ1 -= Z; actorZvPtr->ZVZ2 -= Z; - currentActorPtr->FRAME = HQ_Malloc(HQ_Memory, 304); + currentActorPtr->frame = HQ_Malloc(HQ_Memory, 304); - flowPtr = HQ_PtrMalloc(HQ_Memory, currentActorPtr->FRAME); + flowPtr = HQ_PtrMalloc(HQ_Memory, currentActorPtr->frame); if (!flowPtr) { @@ -758,7 +756,7 @@ void processLife(int lifeNum, bool callFoundLife) { currentProcessedActorPtr->bodyNum = lifeTempVar1; - if (currentProcessedActorPtr->_flags & AF_ANIMATED) + if (currentProcessedActorPtr->objectType & AF_ANIMATED) { if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) { @@ -779,7 +777,7 @@ void processLife(int lifeNum, bool callFoundLife) } else */ { - SetInterAnimObjet(currentProcessedActorPtr->FRAME, pAnim, pBody); + SetInterAnimObjet(currentProcessedActorPtr->frame, pAnim, pBody); } } } @@ -802,7 +800,7 @@ void processLife(int lifeNum, bool callFoundLife) currentProcessedActorPtr->bodyNum = param1; - if (currentProcessedActorPtr->_flags & AF_ANIMATED) + if (currentProcessedActorPtr->objectType & AF_ANIMATED) { char* pAnim = HQR_Get(listAnim, currentProcessedActorPtr->ANIM); char* pBody; @@ -920,9 +918,9 @@ void processLife(int lifeNum, bool callFoundLife) appendFormated("LM_TYPE "); lifeTempVar1 = readNextArgument("type") & AF_MASK; - lifeTempVar2 = currentProcessedActorPtr->_flags; + lifeTempVar2 = currentProcessedActorPtr->objectType; - currentProcessedActorPtr->_flags = (currentProcessedActorPtr->_flags & ~AF_MASK) + lifeTempVar1; + currentProcessedActorPtr->objectType = (currentProcessedActorPtr->objectType & ~AF_MASK) + lifeTempVar1; if (g_gameId > AITD1) { @@ -1003,7 +1001,7 @@ void processLife(int lifeNum, bool callFoundLife) } else { - InitAnim(anim, 4, animFlag); + InitAnim(anim, ANIM_ONCE | ANIM_RESET, animFlag); } break; @@ -1011,21 +1009,61 @@ void processLife(int lifeNum, bool callFoundLife) case LM_ANIM_HYBRIDE_ONCE: { appendFormated("LM_ANIM_HYBRIDE_ONCE "); - // TODO - int anim = readNextArgument("Anim"); - int body = readNextArgument("Body?"); - //printf("LM_ANIM_HYBRIDE_ONCE(anim:%d, body:%d)\n", anim, body); + int anim = readNextArgument("Anim"); + int body = readNextArgument("Body"); + + if ((currentProcessedActorPtr->ANIM != anim) || (currentProcessedActorPtr->bodyNum != body)) { + currentProcessedActorPtr->ANIM = anim; + currentProcessedActorPtr->bodyNum = body; + currentProcessedActorPtr->memoTicks = timer; + currentProcessedActorPtr->frame = 0; + + if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) { + char* pHybrid = HQR_Get(listHybrides, currentProcessedActorPtr->ANIM); + pHybrid += READ_LE_U32(pHybrid + 8); + pHybrid += READ_LE_U32(pHybrid + currentProcessedActorPtr->bodyNum * 4); + + currentProcessedActorPtr->numOfFrames = pHybrid[1]; + currentProcessedActorPtr->animInfo = -1; + currentProcessedActorPtr->animType = ANIM_ONCE; + currentProcessedActorPtr->objectType |= AF_OBJ_2D; + } + else { + currentProcessedActorPtr->numOfFrames = 0; + currentProcessedActorPtr->objectType = 0; + } + } break; } case LM_ANIM_HYBRIDE_REPEAT: { appendFormated("LM_ANIM_HYBRIDE_REPEAT "); - // TODO - int anim = readNextArgument("Anim"); - int body = readNextArgument("Body?"); - //printf("LM_ANIM_HYBRIDE_REPEAT(anim:%d, body:%d)\n", anim, body); + int anim = readNextArgument("Anim"); + int body = readNextArgument("Body"); + + if ((currentProcessedActorPtr->ANIM != anim) || (currentProcessedActorPtr->bodyNum != body)) { + currentProcessedActorPtr->ANIM = anim; + currentProcessedActorPtr->bodyNum = body; + currentProcessedActorPtr->memoTicks = timer; + currentProcessedActorPtr->frame = 0; + + if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) { + char* pHybrid = HQR_Get(listHybrides, currentProcessedActorPtr->ANIM); + pHybrid += READ_LE_U32(pHybrid + 8); + pHybrid += READ_LE_U32(pHybrid + currentProcessedActorPtr->bodyNum * 4); + + currentProcessedActorPtr->numOfFrames = pHybrid[1]; + currentProcessedActorPtr->animInfo = -1; + currentProcessedActorPtr->animType = ANIM_REPEAT; + currentProcessedActorPtr->objectType |= AF_OBJ_2D; + } + else { + currentProcessedActorPtr->numOfFrames = 0; + currentProcessedActorPtr->objectType = 0; + } + } break; } //////////////////////////////////////////////////////////////////////// @@ -1691,7 +1729,7 @@ void processLife(int lifeNum, bool callFoundLife) { if (currentProcessedActorPtr->ANIM == lifeTempVar2) { - if (currentProcessedActorPtr->FRAME == lifeTempVar3) + if (currentProcessedActorPtr->frame == lifeTempVar3) { playSound(lifeTempVar1); //setSampleFreq(0); diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index daef974..e2718ba 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -223,7 +223,7 @@ void executeFoundLife(int objIdx) currentProcessedActorPtr->indexInWorld = objIdx; currentProcessedActorPtr->life = -1; currentProcessedActorPtr->bodyNum = -1; - currentProcessedActorPtr->_flags = 0; + currentProcessedActorPtr->objectType = 0; currentProcessedActorPtr->trackMode = -1; currentProcessedActorPtr->room = -1; currentProcessedActorPtr->lifeMode = -1; @@ -1162,7 +1162,10 @@ void LoadWorld(void) } listLife = HQR_InitRessource("LISTLIFE", 65000, 100); - listTrack = HQR_InitRessource("LISTTRAK", 20000, 100); + listTrack = HQR_InitRessource("LISTTRAK", 20000, 100); + if (g_gameId >= JACK) { + listHybrides = HQR_InitRessource("LISTHYB", 20000, 10); // TODO: recheck size for other games + } // TODO: missing dos memory check here @@ -1671,7 +1674,7 @@ void DeleteObjet(int index) // remove actor CVars[getCVarsIdx(FOG_FLAG)] = 0; } - HQ_Free_Malloc(HQ_Memory,actorPtr->FRAME); + HQ_Free_Malloc(HQ_Memory,actorPtr->frame); } else { @@ -1684,10 +1687,10 @@ void DeleteObjet(int index) // remove actor objectPtr->body = actorPtr->bodyNum; objectPtr->anim = actorPtr->ANIM; - objectPtr->frame = actorPtr->FRAME; + objectPtr->frame = actorPtr->frame; objectPtr->animType = actorPtr->animType; objectPtr->animInfo = actorPtr->animInfo; - objectPtr->flags = actorPtr->_flags & ~AF_BOXIFY; + objectPtr->flags = actorPtr->objectType & ~AF_BOXIFY; objectPtr->flags |= AF_SPECIAL * actorPtr->dynFlags; // ugly hack, need rewrite objectPtr->life = actorPtr->life; objectPtr->lifeMode = actorPtr->lifeMode; @@ -2163,7 +2166,7 @@ void updateAllActorAndObjectsAITD2() void updateAllActorAndObjects() { int i; - tObject *currentActor = objectTable; + tObject *currentActor = objectTable.data(); tWorldObject* currentObject; if(g_gameId > JACK) @@ -2340,30 +2343,24 @@ int checkActorInRoom(int room) void createActorList() { - int i; - tObject* actorPtr; - numActorInList = 0; - actorPtr = objectTable; - - for(i=0;iindexInWorld != -1 && actorPtr->bodyNum != -1) { if(checkActorInRoom(actorPtr->room)) { sortedActorTable[numActorInList] = i; - if(!(actorPtr->_flags & (AF_SPECIAL & AF_ANIMATED))) + if(!(actorPtr->objectType & (AF_SPECIAL & AF_ANIMATED))) { - actorPtr->_flags |= AF_BOXIFY; + actorPtr->objectType |= AF_BOXIFY; // FlagRefreshAux2 = 1; } numActorInList++; } } - - actorPtr++; } } @@ -2391,6 +2388,10 @@ void InitView() } cameraBackgroundChanged = true; + if (g_gameId >= JACK) { + printf("Load 2d animations"); + } + pCamera = cameraDataTable[NumCamera]; SetAngleCamera(pCamera->alpha,pCamera->beta,pCamera->gamma); @@ -2522,7 +2523,7 @@ void removeFromBGIncrust(int actorIdx) { tObject* actorPtr = &objectTable[actorIdx]; - actorPtr->_flags &= ~AF_BOXIFY; + actorPtr->objectType &= ~AF_BOXIFY; // FlagRefreshAux2 = 1; @@ -2585,7 +2586,7 @@ void deleteObject(int objIdx) // FlagGenereActiveList = 1; - if(actorPtr->_flags & AF_BOXIFY) + if(actorPtr->objectType & AF_BOXIFY) { removeFromBGIncrust(actorIdx); } @@ -3294,43 +3295,59 @@ void mainDraw(int flagFlip) // this is commented out to draw actors incrusted in background //if(actorPtr->_flags & (AF_ANIMATED + AF_DRAWABLE + AF_SPECIAL)) { - actorPtr->_flags &= ~AF_DRAWABLE; + actorPtr->objectType &= ~AF_DRAWABLE; - if(actorPtr->_flags & AF_SPECIAL) + if(actorPtr->objectType & AF_SPECIAL) { mainDrawSub2(currentDrawActor); } else { - char* bodyPtr = HQR_Get(listBody,actorPtr->bodyNum); + if (actorPtr->objectType & AF_OBJ_2D) { + char* pHybrid = HQR_Get(listHybrides, actorPtr->ANIM); + char* pData = pHybrid + READ_LE_U32(pHybrid + 8); + pData += READ_LE_U32(pData + actorPtr->bodyNum * 4); - if(HQ_Load) - { - // initAnimInBody(actorPtr->FRAME, HQR_Get(listAnim, actorPtr->ANIM), bodyPtr); - } + char* pAnim = pData + 2; + pAnim += 8 * actorPtr->frame; + s16 numHybrid = READ_LE_U16(pAnim); - AffObjet(actorPtr->worldX + actorPtr->stepX, actorPtr->worldY + actorPtr->stepY, actorPtr->worldZ + actorPtr->stepZ, actorPtr->alpha, actorPtr->beta, actorPtr->gamma, bodyPtr); + //AffHyb(numHybrid, 0, 0, pHybrid); + // TODO: bounding volume + } + else + { + char* bodyPtr = HQR_Get(listBody, actorPtr->bodyNum); + + if (HQ_Load) + { + // initAnimInBody(actorPtr->FRAME, HQR_Get(listAnim, actorPtr->ANIM), bodyPtr); + } + + AffObjet(actorPtr->worldX + actorPtr->stepX, actorPtr->worldY + actorPtr->stepY, actorPtr->worldZ + actorPtr->stepZ, actorPtr->alpha, actorPtr->beta, actorPtr->gamma, bodyPtr); - if(actorPtr->animActionType != 0) - { - if(actorPtr->hotPointID != -1) - { - getHotPoint(actorPtr->hotPointID, bodyPtr, &actorPtr->hotPoint); - } - } - ///////////////////////////////////// DEBUG + if (actorPtr->animActionType != 0) + { + if (actorPtr->hotPointID != -1) + { + getHotPoint(actorPtr->hotPointID, bodyPtr, &actorPtr->hotPoint); + } + } + + ///////////////////////////////////// DEBUG #ifdef FITD_DEBUGGER - // if(debuggerVar_drawModelZv) - { - if(backgroundMode == backgroundModeEnum_3D) - { - drawZv(actorPtr); - } - } + // if(debuggerVar_drawModelZv) + { + if (backgroundMode == backgroundModeEnum_3D) + { + drawZv(actorPtr); + } + } #endif - ///////////////////////////////////// + ///////////////////////////////////// + } } if(BBox3D1 < 0) @@ -3418,8 +3435,8 @@ void walkStep(int angle1, int angle2, int angle3) void addActorToBgInscrust(int actorIdx) { - objectTable[actorIdx]._flags |= AF_BOXIFY + AF_DRAWABLE; - objectTable[actorIdx]._flags &= ~AF_ANIMATED; + objectTable[actorIdx].objectType |= AF_BOXIFY + AF_DRAWABLE; + objectTable[actorIdx].objectType &= ~AF_ANIMATED; //FlagRefreshAux2 = 1; } @@ -3464,7 +3481,7 @@ void getZvRelativePosition(ZVStruct* zvPtr, int startRoom, int destRoom) int checkObjectCollisions(int actorIdx, ZVStruct* zvPtr) { int currentCollisionSlot = 0; - tObject* currentActor = objectTable; + tObject* currentActor = objectTable.data(); int actorRoom = objectTable[actorIdx].room; for(int i=0;i<3;i++) @@ -4078,6 +4095,12 @@ void checkIfCameraChangeIsRequired(void) if(NumCamera!=-1) { + if (currentCameraTargetActor == -1) + { + // TODO: Happens at the start of AITD3, likely a bug + return; + } + tObject* actorPtr; int zvx1; int zvx2; @@ -4317,13 +4340,10 @@ int checkLineProjectionWithActors( int actorIdx, int X, int Y, int Z, int beta, } else { - tObject* currentActorPtr = objectTable; - - int i; - - for(i=0;iindexInWorld != -1 && i != actorIdx && !(currentActorPtr->_flags & AF_SPECIAL)) + tObject* currentActorPtr = &objectTable[i]; + if(currentActorPtr->indexInWorld != -1 && i != actorIdx && !(currentActorPtr->objectType & AF_SPECIAL)) { ZVStruct* zvPtr = ¤tActorPtr->zv; @@ -4352,8 +4372,6 @@ int checkLineProjectionWithActors( int actorIdx, int X, int Y, int Z, int beta, foundFlag = i; break; } - - currentActorPtr++; } } } diff --git a/FitdLib/mainLoop.cpp b/FitdLib/mainLoop.cpp index dbb6354..311a6cb 100644 --- a/FitdLib/mainLoop.cpp +++ b/FitdLib/mainLoop.cpp @@ -110,7 +110,7 @@ void PlayWorld(int allowSystemMenu, int deltaTime) } } - currentProcessedActorPtr = objectTable; + currentProcessedActorPtr = objectTable.data(); for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) { @@ -126,12 +126,12 @@ void PlayWorld(int allowSystemMenu, int deltaTime) currentProcessedActorPtr++; } - currentProcessedActorPtr = objectTable; + currentProcessedActorPtr = objectTable.data(); for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) { if(currentProcessedActorPtr->indexInWorld >= 0) { - int flag = currentProcessedActorPtr->_flags; + int flag = currentProcessedActorPtr->objectType; if((flag & AF_ANIMATED) || (g_gameId >= AITD2 && flag & 0x200)) { @@ -151,7 +151,7 @@ void PlayWorld(int allowSystemMenu, int deltaTime) currentProcessedActorPtr++; } - currentProcessedActorPtr = objectTable; + currentProcessedActorPtr = objectTable.data(); for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) { if(currentProcessedActorPtr->indexInWorld >= 0) @@ -212,14 +212,14 @@ void PlayWorld(int allowSystemMenu, int deltaTime) NumCamera = NewNumCamera; - currentProcessedActorPtr = objectTable; - for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) + for (currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) { + currentProcessedActorPtr = &objectTable[currentProcessedActorIdx]; if(currentProcessedActorPtr->indexInWorld >= 0) { if(currentProcessedActorPtr->life != -1) { - if(currentProcessedActorPtr->_flags & 0x200) + if(currentProcessedActorPtr->objectType & 0x200) { if(currentProcessedActorPtr->lifeMode&3) if(!(currentProcessedActorPtr->lifeMode&4)) diff --git a/FitdLib/object.cpp b/FitdLib/object.cpp index 4a92aab..b111ab1 100644 --- a/FitdLib/object.cpp +++ b/FitdLib/object.cpp @@ -4,7 +4,7 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x { int i; int j; - tObject* actorPtr = objectTable; + tObject* actorPtr = objectTable.data(); char* bodyPtr; ZVStruct* zvPtr; @@ -23,7 +23,7 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x currentProcessedActorIdx = i; actorPtr->bodyNum = body; - actorPtr->_flags = objectType; + actorPtr->objectType = objectType; actorPtr->stage = stage; actorPtr->room = room; actorPtr->worldX = actorPtr->roomX = x; @@ -44,13 +44,13 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x actorPtr->dynFlags = 1; actorPtr->ANIM = anim; - actorPtr->FRAME = frame; + actorPtr->frame = frame; actorPtr->animType = animtype; actorPtr->animInfo = animInfo; actorPtr->END_FRAME = 1; - actorPtr->END_ANIM = 1; + actorPtr->flagEndAnim = 1; actorPtr->newAnim = -1; actorPtr->newAnimType = 0; actorPtr->newAnimInfo = -1; @@ -105,8 +105,8 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x SetAnimObjet(frame,animPtr,bodyPtr); actorPtr->numOfFrames = GetNbFramesAnim(animPtr); - actorPtr->END_ANIM = 0; - actorPtr->_flags |= AF_ANIMATED; + actorPtr->flagEndAnim = 0; + actorPtr->objectType |= AF_ANIMATED; // computeScreenBox(actorPtr->field_22 + actorPtr->field_5A, actorPtr->field_24 + actorPtr->field_5C, actorPtr->anim + actorPtr->field_5E, actorPtr->alpha, actorPtr->beta, actorPtr->gamma, bodyPtr); @@ -129,9 +129,9 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x } else { - if(!(actorPtr->_flags & AF_DRAWABLE)) + if(!(actorPtr->objectType & AF_DRAWABLE)) { - actorPtr->_flags &= ~AF_ANIMATED; // do not animate an object that is invisible + actorPtr->objectType &= ~AF_ANIMATED; // do not animate an object that is invisible } } } diff --git a/FitdLib/save.cpp b/FitdLib/save.cpp index 02d4ebb..58492f9 100644 --- a/FitdLib/save.cpp +++ b/FitdLib/save.cpp @@ -284,8 +284,8 @@ int loadSave(int saveNumber) ASSERT(sizeof(objectTable[i].bodyNum) == 2); fread(&objectTable[i].bodyNum,2,1,fHandle); - ASSERT(sizeof(objectTable[i]._flags) == 2); - fread(&objectTable[i]._flags,2,1,fHandle); + ASSERT(sizeof(objectTable[i].objectType) == 2); + fread(&objectTable[i].objectType,2,1,fHandle); ASSERT(sizeof(objectTable[i].dynFlags) == 2); fread(&objectTable[i].dynFlags,2,1,fHandle); @@ -389,8 +389,8 @@ int loadSave(int saveNumber) ASSERT(sizeof(objectTable[i].newAnimInfo) == 2); fread(&objectTable[i].newAnimInfo,2,1,fHandle); - ASSERT(sizeof(objectTable[i].FRAME) == 2); - fread(&objectTable[i].FRAME,2,1,fHandle); + ASSERT(sizeof(objectTable[i].frame) == 2); + fread(&objectTable[i].frame,2,1,fHandle); ASSERT(sizeof(objectTable[i].numOfFrames) == 2); fread(&objectTable[i].numOfFrames,2,1,fHandle); @@ -398,8 +398,8 @@ int loadSave(int saveNumber) ASSERT(sizeof(objectTable[i].END_FRAME) == 2); fread(&objectTable[i].END_FRAME,2,1,fHandle); - ASSERT(sizeof(objectTable[i].END_ANIM) == 2); - fread(&objectTable[i].END_ANIM,2,1,fHandle); + ASSERT(sizeof(objectTable[i].flagEndAnim) == 2); + fread(&objectTable[i].flagEndAnim,2,1,fHandle); ASSERT(sizeof(objectTable[i].trackMode) == 2); fread(&objectTable[i].trackMode,2,1,fHandle); @@ -499,7 +499,7 @@ int loadSave(int saveNumber) if(objectTable[i].ANIM != -1) { char* animPtr = HQR_Get(listAnim,objectTable[i].ANIM); - SetAnimObjet(objectTable[i].FRAME,animPtr,bodyPtr); + SetAnimObjet(objectTable[i].frame,animPtr,bodyPtr); } } } @@ -562,7 +562,7 @@ int makeSaveFile(int entry) if (objectTable[i].ANIM == 4) { CVars[getCVarsIdx(FOG_FLAG)] = 0; - HQ_Free_Malloc(HQ_Memory, objectTable[i].FRAME); + HQ_Free_Malloc(HQ_Memory, objectTable[i].frame); } } } @@ -778,8 +778,8 @@ int makeSaveFile(int entry) ASSERT(sizeof(objectTable[i].bodyNum) == 2); fwrite(&objectTable[i].bodyNum,2,1,fHandle); - ASSERT(sizeof(objectTable[i]._flags) == 2); - fwrite(&objectTable[i]._flags,2,1,fHandle); + ASSERT(sizeof(objectTable[i].objectType) == 2); + fwrite(&objectTable[i].objectType,2,1,fHandle); ASSERT(sizeof(objectTable[i].dynFlags) == 2); fwrite(&objectTable[i].dynFlags,2,1,fHandle); @@ -879,8 +879,8 @@ int makeSaveFile(int entry) ASSERT(sizeof(objectTable[i].newAnimInfo) == 2); fwrite(&objectTable[i].newAnimInfo,2,1,fHandle); - ASSERT(sizeof(objectTable[i].FRAME) == 2); - fwrite(&objectTable[i].FRAME,2,1,fHandle); + ASSERT(sizeof(objectTable[i].frame) == 2); + fwrite(&objectTable[i].frame,2,1,fHandle); ASSERT(sizeof(objectTable[i].numOfFrames) == 2); fwrite(&objectTable[i].numOfFrames,2,1,fHandle); @@ -888,8 +888,8 @@ int makeSaveFile(int entry) ASSERT(sizeof(objectTable[i].END_FRAME) == 2); fwrite(&objectTable[i].END_FRAME,2,1,fHandle); - ASSERT(sizeof(objectTable[i].END_ANIM) == 2); - fwrite(&objectTable[i].END_ANIM,2,1,fHandle); + ASSERT(sizeof(objectTable[i].flagEndAnim) == 2); + fwrite(&objectTable[i].flagEndAnim,2,1,fHandle); ASSERT(sizeof(objectTable[i].trackMode) == 2); fwrite(&objectTable[i].trackMode,2,1,fHandle); diff --git a/FitdLib/track.cpp b/FitdLib/track.cpp index 3f566c2..d3b87e5 100644 --- a/FitdLib/track.cpp +++ b/FitdLib/track.cpp @@ -537,13 +537,13 @@ void processTrack(void) } case TL_DEC_OFF: // background collision off { - currentProcessedActorPtr->_flags &= ~AF_TRIGGER; + currentProcessedActorPtr->objectType &= ~AF_TRIGGER; currentProcessedActorPtr->positionInTrack++; break; } case TL_DEC_ON: // background collision on { - currentProcessedActorPtr->_flags |= AF_TRIGGER; + currentProcessedActorPtr->objectType |= AF_TRIGGER; currentProcessedActorPtr->positionInTrack++; break; } @@ -1013,13 +1013,13 @@ void processTrack2(void) } case 0xA: { - currentProcessedActorPtr->_flags &= 0xFFBF; + currentProcessedActorPtr->objectType &= 0xFFBF; currentProcessedActorPtr->positionInTrack++; break; } case 0xB: { - currentProcessedActorPtr->_flags |= 0x40; + currentProcessedActorPtr->objectType |= 0x40; currentProcessedActorPtr->positionInTrack++; break; }/* diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index ca3c7d1..5b39c70 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -78,17 +78,18 @@ char* screenSm3; char* screenSm4; char* screenSm5; -tObject objectTable[NUM_MAX_OBJECT]; +std::array objectTable; s16 currentWorldTarget; int fileSize; -hqrEntryStruct* listBody; -hqrEntryStruct* listAnim; -hqrEntryStruct* listLife; -hqrEntryStruct* listTrack; -hqrEntryStruct* listMatrix; +hqrEntryStruct* listBody = nullptr; +hqrEntryStruct* listAnim = nullptr; +hqrEntryStruct* listLife = nullptr; +hqrEntryStruct* listTrack = nullptr; +hqrEntryStruct* listHybrides = nullptr; +hqrEntryStruct* listMatrix = nullptr; s16 maxObjects; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index cf1b9d4..43a5e25 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -115,14 +115,18 @@ enum actorFlags AF_FOUNDABLE = 0x0080, AF_FALLABLE = 0x0100, - AF_MASK = AF_ANIMATED + AF_MOVABLE + AF_TRIGGER + AF_FOUNDABLE + AF_FALLABLE, + // >= JACK + AF_OBJ_2D = 0x0200, + AF_WATER = 0x0400, + + AF_MASK = AF_ANIMATED + AF_MOVABLE + AF_TRIGGER + AF_FOUNDABLE + AF_FALLABLE + AF_WATER, }; struct tObject // used to read data from file too { s16 indexInWorld; s16 bodyNum; - u16 _flags; + u16 objectType; s16 dynFlags; ZVStruct zv; s16 screenXMin; @@ -150,10 +154,11 @@ struct tObject // used to read data from file too s16 newAnim; s16 newAnimType; s16 newAnimInfo; - s16 FRAME; + s16 frame; s16 numOfFrames; s16 END_FRAME; - s16 END_ANIM; + s16 flagEndAnim; + u32 memoTicks; // for 2d objects s16 trackMode; s16 trackNumber; s16 MARK; @@ -323,7 +328,7 @@ extern char* screenSm3; extern char* screenSm4; extern char* screenSm5; -extern tObject objectTable[NUM_MAX_OBJECT]; +extern std::array objectTable; extern s16 currentWorldTarget; @@ -333,6 +338,7 @@ extern hqrEntryStruct* listBody; extern hqrEntryStruct* listAnim; extern hqrEntryStruct* listLife; extern hqrEntryStruct* listTrack; +extern hqrEntryStruct* listHybrides; extern hqrEntryStruct* listMatrix; extern s16 maxObjects; From acc927b52d5d4f8d8974ee96206c0bc46ffbfe59 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 14 Jun 2025 14:04:57 -0700 Subject: [PATCH 32/70] Rename a few things --- FitdLib/AITD1_Tatou.cpp | 2 +- FitdLib/AITD2.cpp | 2 +- FitdLib/AITD3.cpp | 2 +- FitdLib/inventory.cpp | 2 +- FitdLib/main.cpp | 31 +++++++++++++++---------------- FitdLib/main.h | 6 +++--- FitdLib/mainLoop.cpp | 4 ++-- 7 files changed, 24 insertions(+), 25 deletions(-) diff --git a/FitdLib/AITD1_Tatou.cpp b/FitdLib/AITD1_Tatou.cpp index 9c3bc68..d53d818 100644 --- a/FitdLib/AITD1_Tatou.cpp +++ b/FitdLib/AITD1_Tatou.cpp @@ -32,7 +32,7 @@ int make3dTatou(void) beta = 256; alpha = 8; - setupCameraProjection(160,100,128,500,490); + SetProjection(160,100,128,500,490); copyPalette(currentGamePalette,paletteBackup); diff --git a/FitdLib/AITD2.cpp b/FitdLib/AITD2.cpp index 304b1da..130c608 100644 --- a/FitdLib/AITD2.cpp +++ b/FitdLib/AITD2.cpp @@ -271,7 +271,7 @@ void drawInventoryAITD2() statusRight = 159; statusBottom = 174; - setupCameraProjection(((statusRight-statusLeft)/2)+statusLeft,((statusBottom-statusTop)/2) + statusTop,128,400,390); + SetProjection(((statusRight-statusLeft)/2)+statusLeft,((statusBottom-statusTop)/2) + statusTop,128,400,390); } int TabXSprite [3] = {127,118,124}; diff --git a/FitdLib/AITD3.cpp b/FitdLib/AITD3.cpp index 69e940b..0d1d571 100644 --- a/FitdLib/AITD3.cpp +++ b/FitdLib/AITD3.cpp @@ -108,5 +108,5 @@ void drawInventoryAITD3() statusRight = 159; statusBottom = 174; - setupCameraProjection(((statusRight-statusLeft)/2)+statusLeft,((statusBottom-statusTop)/2) + statusTop,128,400,390); + SetProjection(((statusRight-statusLeft)/2)+statusLeft,((statusBottom-statusTop)/2) + statusTop,128,400,390); } \ No newline at end of file diff --git a/FitdLib/inventory.cpp b/FitdLib/inventory.cpp index 7fe9ce8..9013b9c 100644 --- a/FitdLib/inventory.cpp +++ b/FitdLib/inventory.cpp @@ -220,7 +220,7 @@ void processInventory(void) statusRight = WindowX2; statusBottom = WindowY2; - setupCameraProjection(((statusRight-statusLeft)/2)+statusLeft,((statusBottom-statusTop)/2) + statusTop,128,400,390); + SetProjection(((statusRight-statusLeft)/2)+statusLeft,((statusBottom-statusTop)/2) + statusTop,128,400,390); break; case AITD2: diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index e2718ba..b29c5e4 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -1599,7 +1599,7 @@ void SetPosCamera(int x, int y, int z) translateZ = z; } -void setupCameraProjection(int centerX, int centerY, int x, int y, int z) +void SetProjection(int centerX, int centerY, int x, int y, int z) { cameraCenterX = centerX; cameraCenterY = centerY; @@ -1626,7 +1626,7 @@ int isInViewList(int value) } // setup visibility list -void setupCameraSub1() +void InitViewedRoomList() { u32 i; int j; @@ -1892,7 +1892,7 @@ void copyZv(ZVStruct* source, ZVStruct* dest) memcpy(dest,source,sizeof(ZVStruct)); } -void setupCameraSub4(void) +void RefreshAux2(void) { FastCopyScreen(aux,aux2); @@ -2163,7 +2163,7 @@ void updateAllActorAndObjectsAITD2() //TODO: object update } -void updateAllActorAndObjects() +void GenereActiveList() { int i; tObject *currentActor = objectTable.data(); @@ -2341,7 +2341,7 @@ int checkActorInRoom(int room) return(0); } -void createActorList() +void GenereAffList() { numActorInList = 0; @@ -2369,7 +2369,6 @@ void InitView() int x; int y; int z; - cameraDataStruct* pCamera; SaveTimerAnim(); @@ -2392,7 +2391,7 @@ void InitView() printf("Load 2d animations"); } - pCamera = cameraDataTable[NumCamera]; + cameraDataStruct* pCamera = cameraDataTable[NumCamera]; SetAngleCamera(pCamera->alpha,pCamera->beta,pCamera->gamma); @@ -2418,19 +2417,19 @@ void InitView() #endif SetPosCamera(x,y,z); // setup camera position - setupCameraProjection(160,100,pCamera->focal1,pCamera->focal2,pCamera->focal3); // setup focale + SetProjection(160,100,pCamera->focal1,pCamera->focal2,pCamera->focal3); // setup projection #ifdef FITD_DEBUGGER if(debuggerVar_topCamera) - setupCameraProjection(160,100,1000,100,100); // setup focale + SetProjection(160,100,1000,100,100); #endif - setupCameraSub1(); - updateAllActorAndObjects(); - createActorList(); - // setupCameraSub3(); - setupCameraSub4(); - /* setupCameraSub5(); + InitViewedRoomList(); + GenereActiveList(); + GenereAffList(); + // TriListObjet(); + RefreshAux2(); + /* InitScreenCoors(); */ if(FlagInitView==2) { @@ -3660,7 +3659,7 @@ void foundObject(int objIdx, int param) currentFoundBodyIdx = objPtr->foundBody; currentFoundBody = HQR_Get(listBody,currentFoundBodyIdx); - setupCameraProjection(160,100,128,300,298); + SetProjection(160,100,128,300,298); statusVar1 = 0; diff --git a/FitdLib/main.h b/FitdLib/main.h index f19599f..27ba7a1 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -11,8 +11,8 @@ void ChangeSalle(int roomNumber); void executeFoundLife(int objIdx); void InitView(); void checkIfCameraChangeIsRequired(void); -void updateAllActorAndObjects(); -void createActorList(); +void GenereActiveList(); +void GenereAffList(); void mainDraw(int mode); int checkObjectCollisions(int actorIdx, ZVStruct* zvPtr); int checkLineProjectionWithActors( int actorIdx, int X, int Y, int Z, int beta, int room, int param ); @@ -54,7 +54,7 @@ void SetClip(int left, int top, int right, int bottom); void readBook(int index, int type); int Lire(int index, int left, int top, int right, int bottom, int mode, int color, int shadow); -void setupCameraProjection(int centerX, int centerY, int x, int y, int z); +void SetProjection(int centerX, int centerY, int x, int y, int z); void SetAngleCamera(int x, int y, int z); void SetPosCamera(int x, int y, int z); s16 GiveDistance2D(int x1, int z1, int x2, int z2); diff --git a/FitdLib/mainLoop.cpp b/FitdLib/mainLoop.cpp index 311a6cb..f8149a2 100644 --- a/FitdLib/mainLoop.cpp +++ b/FitdLib/mainLoop.cpp @@ -254,12 +254,12 @@ void PlayWorld(int allowSystemMenu, int deltaTime) // if(FlagGenereActiveList) { - updateAllActorAndObjects(); + GenereActiveList(); } // if(actorTurnedToObj) { - createActorList(); + GenereAffList(); } sortActorList(); From 1d0f29be5b3b121fb65da74014ec6cb8ac1183ea Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 14 Jun 2025 14:05:15 -0700 Subject: [PATCH 33/70] Reimplement line rendering --- FitdLib/rendererBGFX.cpp | 125 +++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 65 deletions(-) diff --git a/FitdLib/rendererBGFX.cpp b/FitdLib/rendererBGFX.cpp index d0c8698..6cd9ad6 100644 --- a/FitdLib/rendererBGFX.cpp +++ b/FitdLib/rendererBGFX.cpp @@ -62,11 +62,6 @@ struct polyVertex float U; float V; - - unsigned char R; - unsigned char G; - unsigned char B; - unsigned char A; }; struct sphereVertex @@ -95,6 +90,7 @@ std::array noiseVertices; std::array transparentVertices; std::array rampVertices; std::array sphereVertices; +std::vector g_lineVertices; int numUsedFlatVertices = 0; int numUsedNoiseVertices = 0; @@ -618,7 +614,6 @@ void osystem_flushPendingPrimitives() .begin() .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) - .add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8) .end(); bgfx::TransientVertexBuffer transientBuffer; @@ -652,7 +647,6 @@ void osystem_flushPendingPrimitives() .begin() .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) - .add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8) .end(); bgfx::TransientVertexBuffer transientBuffer; @@ -686,7 +680,6 @@ void osystem_flushPendingPrimitives() .begin() .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) - .add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8) .end(); bgfx::TransientVertexBuffer transientBuffer; @@ -744,6 +737,39 @@ void osystem_flushPendingPrimitives() bgfx::setVertexBuffer(0, &transientBuffer); bgfx::submit(gameViewId, getSphereShader()); } + + if (g_lineVertices.size()) { + bgfx::VertexLayout layout; + layout + .begin() + .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) + .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) + .end(); + + bgfx::TransientVertexBuffer transientBuffer; + bgfx::allocTransientVertexBuffer(&transientBuffer, g_lineVertices.size(), layout); + + memcpy(transientBuffer.data, g_lineVertices.data(), sizeof(polyVertex) * g_lineVertices.size()); + + bgfx::setState(0 | BGFX_STATE_PT_LINES + | BGFX_STATE_WRITE_RGB + | BGFX_STATE_WRITE_A + | BGFX_STATE_WRITE_Z + | BGFX_STATE_DEPTH_TEST_LEQUAL + | BGFX_STATE_MSAA + ); + + static bgfx::UniformHandle paletteTextureUniform = BGFX_INVALID_HANDLE; + if (!bgfx::isValid(paletteTextureUniform)) + { + paletteTextureUniform = bgfx::createUniform("s_paletteTexture", bgfx::UniformType::Sampler); + } + + bgfx::setTexture(1, paletteTextureUniform, g_paletteTexture); + + bgfx::setVertexBuffer(0, &transientBuffer); + bgfx::submit(gameViewId, getFlatShader()); + } #if 0 if (numUsedTransparentVertices) { @@ -761,6 +787,7 @@ void osystem_flushPendingPrimitives() numUsedRampVertices = 0; numUsedSpheres = 0; numUsedTransparentVertices = 0; + g_lineVertices.clear(); } void osystem_fillPoly(float* buffer, int numPoint, unsigned char color, u8 polyType) @@ -884,10 +911,11 @@ void osystem_fillPoly(float* buffer, int numPoint, unsigned char color, u8 polyT pVertex->Y = buffer[i * 3 + 1]; pVertex->Z = buffer[i * 3 + 2]; - pVertex->R = RGB_Pal[color * 3]; - pVertex->G = RGB_Pal[color * 3 + 1]; - pVertex->B = RGB_Pal[color * 3 + 2]; - pVertex->A = 128; + int bank = (color & 0xF0) >> 4; + int startColor = color & 0xF; + float colorf = startColor; + pVertex->U = colorf / 15.f; + pVertex->V = bank / 15.f; pVertex++; } break; @@ -1004,6 +1032,26 @@ void osystem_fillPoly(float* buffer, int numPoint, unsigned char color, u8 polyT void osystem_draw3dLine(float x1, float y1, float z1, float x2, float y2, float z2, unsigned char color) { + polyVertex vertex1; + polyVertex vertex2; + + vertex1.X = x1; + vertex1.Y = y1; + vertex1.Z = z1; + + vertex2.X = x2; + vertex2.Y = y2; + vertex2.Z = z2; + + int bank = (color & 0xF0) >> 4; + int startColor = color & 0xF; + float colorf = startColor; + vertex1.U = vertex2.U = colorf / 15.f; + vertex1.V = vertex2.V = bank / 15.f; + + g_lineVertices.push_back(vertex1); + g_lineVertices.push_back(vertex2); + #if 0 GLfloat lineVertices[2 * 3]; GLubyte lineColor[2 * 4]; @@ -1071,63 +1119,10 @@ void osystem_draw3dLine(float x1, float y1, float z1, float x2, float y2, float void osystem_draw3dQuad(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4, unsigned char color, int transparency) { - float lineVertices[4 * 3]; - unsigned char lineColor1[4 * 4]; - unsigned char lineColor2[4 * 4]; - - for (int i = 0; i < 4; i++) - { - lineColor1[i * 4 + 0] = RGB_Pal[(color + 3) * 3]; - lineColor1[i * 4 + 1] = RGB_Pal[(color + 3) * 3 + 1]; - lineColor1[i * 4 + 2] = RGB_Pal[(color + 3) * 3 + 2]; - lineColor1[i * 4 + 3] = 255; - - lineColor2[i * 4 + 0] = RGB_Pal[color * 3]; - lineColor2[i * 4 + 1] = RGB_Pal[color * 3 + 1]; - lineColor2[i * 4 + 2] = RGB_Pal[color * 3 + 2]; - lineColor2[i * 4 + 3] = 255; - - } - - lineVertices[0] = x1; - lineVertices[1] = y1; - lineVertices[2] = z1; - - lineVertices[3] = x2; - lineVertices[4] = y2; - lineVertices[5] = z2; - - lineVertices[6] = x4; - lineVertices[7] = y4; - lineVertices[8] = z4; - - lineVertices[9] = x3; - lineVertices[10] = y3; - lineVertices[11] = z3; - osystem_draw3dLine(x1, y1, z1, x2, y2, z2, color); osystem_draw3dLine(x2, y2, z2, x3, y3, z3, color); osystem_draw3dLine(x3, y3, z3, x4, y4, z4, color); osystem_draw3dLine(x4, y4, z4, x1, y1, z1, color); - - //glEnable(GL_DEPTH_TEST); - //glDisable(GL_BLEND); - - /*glColor4ub(1.f, 1.f, 1.f, 1.f); - glVertexPointer(3, GL_FLOAT, 0, lineVertices); - glColorPointer(4, GL_UNSIGNED_BYTE, 0, lineColor1); - glDrawArrays(GL_LINE_LOOP, 0, 4); - checkGL();*/ - /* - { - checkGL(); - glVertexPointer(3, GL_FLOAT, 0, lineVertices); - glColorPointer(4, GL_UNSIGNED_BYTE, 0, lineColor2); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - checkGL(); - } - */ - } void osystem_drawSphere(float X, float Y, float Z, u8 color, u8 material, float size) From 5d9b0521ecdb31b9d52ee0942081d6beb2b001ce Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 14 Jun 2025 14:05:22 -0700 Subject: [PATCH 34/70] Disable asan again --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 66d27d7..4e179a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ add_subdirectory(${THIRD_PARTY}/zlib ${CMAKE_BINARY_DIR}/zlib/zlib-build) add_subdirectory( FitdLib ) add_subdirectory( Fitd ) -set(USE_SANITIZER ON) +#set(USE_SANITIZER ON) if(USE_SANITIZER) IF(MSVC) set(SANITIZER_TYPE "address") From 575169a5fa351d9f96a048145d5f2e916672310b Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 14 Jun 2025 14:32:58 -0700 Subject: [PATCH 35/70] Rework debugger --- FitdLib/debugger.cpp | 86 +++++++++++++++++++++++--------------------- FitdLib/main.cpp | 34 +++++++++--------- FitdLib/vars.cpp | 2 ++ FitdLib/vars.h | 10 ++++++ 4 files changed, 75 insertions(+), 57 deletions(-) diff --git a/FitdLib/debugger.cpp b/FitdLib/debugger.cpp index 852bb51..032290d 100644 --- a/FitdLib/debugger.cpp +++ b/FitdLib/debugger.cpp @@ -119,6 +119,8 @@ void debugger_draw(void) if (ImGui::BeginMenu("Debug")) { ImGui::MenuItem("No Collisions", nullptr, &debuggerVar_noHardClip); + ImGui::Combo("Collision", (int*)&hardColDisplayMode, "None\0Wireframe\0Filled\0"); + ImGui::Combo("Triggers", (int*)&sceColDisplayMode, "None\0Wireframe\0Filled\0"); ImGui::EndMenu(); } ImGui::EndMainMenuBar(); @@ -126,51 +128,53 @@ void debugger_draw(void) if(debuggerVar_debugMenuDisplayed) { - cameraDataStruct* pCamera = cameraDataTable[NumCamera]; - - ImGui::Begin("Camera"); - if (pCamera) + if(cameraDataTable.size()) { - ImGui::BeginGroup(); - ImGui::PushID("Position"); - ImGui::InputInt("X", &translateX); - ImGui::InputInt("Y", &translateY); - ImGui::InputInt("Z", &translateZ); - ImGui::PopID(); - ImGui::EndGroup(); - - ImGui::BeginGroup(); - ImGui::PushID("Center"); - InputS16("Pitch", &pCamera->alpha); - InputS16("Yaw", &pCamera->beta); - InputS16("Roll", &pCamera->gamma); - ImGui::PopID(); - ImGui::EndGroup(); - - SetAngleCamera(pCamera->alpha, pCamera->beta, pCamera->gamma); - - ImGui::BeginGroup(); - ImGui::PushID("Center"); - ImGui::InputInt("HCenter", &cameraCenterX); - ImGui::InputInt("VCenter", &cameraCenterY); - ImGui::PopID(); - ImGui::EndGroup(); - - ImGui::BeginGroup(); - ImGui::PushID("Projection"); - ImGui::InputInt("Perspective", &cameraPerspective); - ImGui::InputInt("XFov", &cameraFovX); - ImGui::InputInt("YFov", &cameraFovY); - ImGui::PopID(); - ImGui::EndGroup(); - } + cameraDataStruct* pCamera = cameraDataTable[NumCamera]; - if (ImGui::Button("DumpScene")) - { - SaveScene(); + ImGui::Begin("Camera"); + if (pCamera) + { + ImGui::BeginGroup(); + ImGui::PushID("Position"); + ImGui::InputInt("X", &translateX); + ImGui::InputInt("Y", &translateY); + ImGui::InputInt("Z", &translateZ); + ImGui::PopID(); + ImGui::EndGroup(); + + ImGui::BeginGroup(); + ImGui::PushID("Center"); + InputS16("Pitch", &pCamera->alpha); + InputS16("Yaw", &pCamera->beta); + InputS16("Roll", &pCamera->gamma); + ImGui::PopID(); + ImGui::EndGroup(); + + SetAngleCamera(pCamera->alpha, pCamera->beta, pCamera->gamma); + + ImGui::BeginGroup(); + ImGui::PushID("Center"); + ImGui::InputInt("HCenter", &cameraCenterX); + ImGui::InputInt("VCenter", &cameraCenterY); + ImGui::PopID(); + ImGui::EndGroup(); + + ImGui::BeginGroup(); + ImGui::PushID("Projection"); + ImGui::InputInt("Perspective", &cameraPerspective); + ImGui::InputInt("XFov", &cameraFovX); + ImGui::InputInt("YFov", &cameraFovY); + ImGui::PopID(); + ImGui::EndGroup(); + } + if (ImGui::Button("DumpScene")) + { + SaveScene(); + } + ImGui::End(); } - ImGui::End(); if(ListWorldObjets.size()) { diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index b29c5e4..f198dd6 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -3266,22 +3266,6 @@ void mainDraw(int flagFlip) SetClip(0,0,319,199); genVar6 = 0; -#ifdef FITD_DEBUGGER - if(backgroundMode == backgroundModeEnum_3D) - { - for(i=0;i Date: Sat, 14 Jun 2025 17:48:55 -0700 Subject: [PATCH 36/70] Implement lines. Fix sphere ratio and incorrect math in material 3 --- FitdLib/actorList.cpp | 4 +-- FitdLib/main.cpp | 14 +++-------- FitdLib/osystem.h | 2 -- FitdLib/renderer.cpp | 48 +++++++++++++++++------------------- FitdLib/rendererBGFX.cpp | 27 +++++++------------- FitdLib/shaders/sphere_ps.sc | 38 ++++++++++++++-------------- FitdLib/vars.cpp | 6 ++--- FitdLib/vars.h | 6 ++--- 8 files changed, 63 insertions(+), 82 deletions(-) diff --git a/FitdLib/actorList.cpp b/FitdLib/actorList.cpp index 73630b6..05d4226 100644 --- a/FitdLib/actorList.cpp +++ b/FitdLib/actorList.cpp @@ -60,7 +60,7 @@ int sortCompareFunction(const void* param1, const void* param2) flag |= 2; } - //TODO: remove hack and find the exact cause of the bug in the sorting algorithme + //TODO: remove hack and find the exact cause of the bug in the sorting algorithm //flag = 0; if(flag == 0) @@ -134,5 +134,5 @@ int sortCompareFunction(const void* param1, const void* param2) void sortActorList() { - qsort(sortedActorTable, numActorInList, sizeof(int), sortCompareFunction); + qsort(sortedActorTable.data(), numActorInList, sizeof(int), sortCompareFunction); } diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index f198dd6..477ffdc 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -1221,8 +1221,8 @@ void initVars() genVar1 = genVar2; genVar3 = genVar4; - genVar5 = 0; - genVar6 = 0; + NbPhysBoxs = 0; + NbLogBoxs = 0; LastSample = -1; nextSample = -1; @@ -3257,16 +3257,12 @@ void mainDraw(int flagFlip) } else { - genVar5 = 0; + NbPhysBoxs = 0; FastCopyScreen(aux2,logicalScreen); } - //osystem_drawBackground(); - SetClip(0,0,319,199); - genVar6 = 0; - - osystem_startModelRender(); + NbLogBoxs = 0; for(i=0;itype = primTypeEnum_Line; - pCurrentPrimEntry->color = lineColor; - + pCurrentPrimEntry->numOfVertices = 2; + pCurrentPrimEntry->color = ptr->m_color; + pCurrentPrimEntry->material = ptr->m_material; - for(int i=0;i<2;i++) + float depth = 32000.f; + ASSERT(pCurrentPrimEntry->numOfVertices < NUM_MAX_VERTEX_IN_PRIM); + for (int i = 0; i < pCurrentPrimEntry->numOfVertices; i++) { u16 pointIndex; - pointIndex = *(u16*)(*ptr); - (*ptr)+=2; + pointIndex = ptr->m_points[i] * 6; - ASSERT((pointIndex%2) == 0); + ASSERT((pointIndex % 2) == 0); - pCurrentPrimEntry->vertices[i].X = renderPointList[pointIndex/2]; - pCurrentPrimEntry->vertices[i].Y = renderPointList[(pointIndex/2)+1]; - pCurrentPrimEntry->vertices[i].Z = renderPointList[(pointIndex/2)+2]; + pCurrentPrimEntry->vertices[i].X = renderPointList[pointIndex / 2]; + pCurrentPrimEntry->vertices[i].Y = renderPointList[(pointIndex / 2) + 1]; + pCurrentPrimEntry->vertices[i].Z = renderPointList[(pointIndex / 2) + 2]; - if(depth>pCurrentPrimEntry->vertices[i].Z) + if (pCurrentPrimEntry->vertices[i].Z < depth) depth = pCurrentPrimEntry->vertices[i].Z; - } - if(depth > 0) + } + +#if !defined(AITD_UE4) + if (depth > 100) +#endif { positionInPrimEntry++; + numOfPrimitiveToRender++; - ASSERT(positionInPrimEntry < NUM_MAX_PRIM_ENTRY); - } -} - -void processPrim_Line(int primType, sPrimitive* ptr, char** out) -{ + ASSERT(positionInPrimEntry < NUM_MAX_PRIM_ENTRY); + } } void processPrim_Poly(int primType, sPrimitive* ptr, char** out) diff --git a/FitdLib/rendererBGFX.cpp b/FitdLib/rendererBGFX.cpp index 6cd9ad6..d16677a 100644 --- a/FitdLib/rendererBGFX.cpp +++ b/FitdLib/rendererBGFX.cpp @@ -595,16 +595,6 @@ void osystem_stopFrame() { } -void osystem_startModelRender() -{ - -} - -void osystem_stopModelRender() -{ - osystem_flushPendingPrimitives(); -} - void osystem_flushPendingPrimitives() { if (numUsedFlatVertices) @@ -1132,21 +1122,22 @@ void osystem_drawSphere(float X, float Y, float Z, u8 color, u8 material, float void osystem_drawPoint(float X, float Y, float Z, u8 color, u8 material, float size) { + float fScaleRatio = 6.f / 5.f; std::array corners; - corners[0].X = X + size; - corners[0].Y = Y + size; + corners[0].X = X + size * fScaleRatio; + corners[0].Y = Y + size * fScaleRatio; corners[0].Z = Z; - corners[1].X = X + size; - corners[1].Y = Y - size; + corners[1].X = X + size * fScaleRatio; + corners[1].Y = Y - size * fScaleRatio; corners[1].Z = Z; - corners[2].X = X - size; - corners[2].Y = Y - size; + corners[2].X = X - size * fScaleRatio; + corners[2].Y = Y - size * fScaleRatio; corners[2].Z = Z; - corners[3].X = X - size; - corners[3].Y = Y + size; + corners[3].X = X - size * fScaleRatio; + corners[3].Y = Y + size * fScaleRatio; corners[3].Z = Z; std::array mapping = { { diff --git a/FitdLib/shaders/sphere_ps.sc b/FitdLib/shaders/sphere_ps.sc index 40aaf57..ecef1a1 100644 --- a/FitdLib/shaders/sphere_ps.sc +++ b/FitdLib/shaders/sphere_ps.sc @@ -7,36 +7,36 @@ void main() { vec2 sphereCenter = v_sphereParams.xy; float sphereSize = v_sphereParams.z; - float fDistanceToCenter = length(v_screenSpacePosition.xy - sphereCenter); - if(fDistanceToCenter > sphereSize) + + float distanceToCircleOnScanline; + vec2 normalizedPosition = (v_screenSpacePosition.xy - sphereCenter.xy) / sphereSize; + + float xScalingRatio = 5.f/6.f; + + normalizedPosition.x *= xScalingRatio; + if(length(normalizedPosition) > 1.f) discard; int color = int(v_texcoord0.x * 15.f); int bank = int(v_texcoord0.y * 15.f); int material = int(v_sphereParams.w); - if(material == 0) { // flat + switch(material) { + case 0: // flat gl_FragColor = getColor(bank, color); - } else if(material == 1) { // TODO! - gl_FragColor = getColor(bank, color); - } else if(material == 2) { // transparent + break; + case 2: //transparent gl_FragColor = getColor(bank, color); gl_FragColor.w = 0.5f; - } else if(material == 3) { // marbre - vec2 normalizedPosition = (v_screenSpacePosition.xy - sphereCenter.xy) / sphereSize; + break; + case 3: //marbre float angle = asin(normalizedPosition.y); - float distanceToCircleOnScanline = cos(angle) - normalizedPosition.x; // value is in 0/2 range - distanceToCircleOnScanline /= 2.f; // remap to 0 / 1 - color = int((1.f - distanceToCircleOnScanline) * 15.f); - gl_FragColor = getColor(bank, color); - } else if(material == 4) { // TODO! + distanceToCircleOnScanline = ((normalizedPosition.x / cos(angle)) / 2.f) + 0.5f; + color = int((distanceToCircleOnScanline) * 15.f); gl_FragColor = getColor(bank, color); - } else if(material == 6) { // TODO! + break; + default: gl_FragColor = getColor(bank, color); - } else { - gl_FragColor.r = 1.f; - gl_FragColor.g = 0.f; - gl_FragColor.b = 0.f; - gl_FragColor.w = 1.f; + break; } } diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index cdfc50c..78abafb 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -109,8 +109,8 @@ boxStruct genVar4[50]; boxStruct *genVar1; boxStruct *genVar3; -int genVar5; -int genVar6; +int NbPhysBoxs; +int NbLogBoxs; int nextSample; int nextMusic; s16 currentCameraTargetActor; @@ -201,7 +201,7 @@ int flagRedraw; float renderPointList[6400]; int numActorInList; -int sortedActorTable[NUM_MAX_OBJECT]; +std::array sortedActorTable; int angleCompX; int angleCompZ; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index ca306d1..1731005 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -359,8 +359,8 @@ extern boxStruct genVar4[50]; extern boxStruct *genVar1; extern boxStruct *genVar3; -extern int genVar5; -extern int genVar6; +extern int NbPhysBoxs; +extern int NbLogBoxs; extern int nextSample; extern int nextMusic; extern s16 currentCameraTargetActor; @@ -435,7 +435,7 @@ extern int flagRedraw; extern float renderPointList[6400]; extern int numActorInList; -extern int sortedActorTable[NUM_MAX_OBJECT]; +extern std::array sortedActorTable; extern int angleCompX; extern int angleCompZ; From 719474cb7ab0584512ab1b4026f92fbd52678615 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 14 Jun 2025 17:57:00 -0700 Subject: [PATCH 37/70] Backface culling --- FitdLib/rendererBGFX.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/FitdLib/rendererBGFX.cpp b/FitdLib/rendererBGFX.cpp index d16677a..f379dde 100644 --- a/FitdLib/rendererBGFX.cpp +++ b/FitdLib/rendererBGFX.cpp @@ -616,6 +616,7 @@ void osystem_flushPendingPrimitives() | BGFX_STATE_WRITE_Z | BGFX_STATE_DEPTH_TEST_LEQUAL | BGFX_STATE_MSAA + | BGFX_STATE_CULL_CCW ); static bgfx::UniformHandle paletteTextureUniform = BGFX_INVALID_HANDLE; @@ -649,6 +650,7 @@ void osystem_flushPendingPrimitives() | BGFX_STATE_WRITE_Z | BGFX_STATE_DEPTH_TEST_LEQUAL | BGFX_STATE_MSAA + | BGFX_STATE_CULL_CCW ); static bgfx::UniformHandle paletteTextureUniform = BGFX_INVALID_HANDLE; @@ -682,6 +684,7 @@ void osystem_flushPendingPrimitives() | BGFX_STATE_WRITE_Z | BGFX_STATE_DEPTH_TEST_LEQUAL | BGFX_STATE_MSAA + | BGFX_STATE_CULL_CCW ); static bgfx::UniformHandle paletteTextureUniform = BGFX_INVALID_HANDLE; From ad71b0afee067716343e3a62d17b29e22c5dd73a Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 14 Jun 2025 18:06:05 -0700 Subject: [PATCH 38/70] Tweak point sizes --- FitdLib/renderer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FitdLib/renderer.cpp b/FitdLib/renderer.cpp index d19ba06..95d81ed 100644 --- a/FitdLib/renderer.cpp +++ b/FitdLib/renderer.cpp @@ -912,7 +912,7 @@ void renderPoly(primEntryStruct* pEntry) // poly void renderZixel(primEntryStruct* pEntry) // point { - float pointSize = 20.f; + static float pointSize = 20.f; float transformedSize = ((pointSize * (float)cameraFovX) / (float)(pEntry->vertices[0].Z+cameraPerspective)); osystem_drawPoint(pEntry->vertices[0].X,pEntry->vertices[0].Y,pEntry->vertices[0].Z,pEntry->color,pEntry->material, transformedSize); @@ -920,13 +920,13 @@ void renderZixel(primEntryStruct* pEntry) // point void renderPoint(primEntryStruct* pEntry) // point { - float pointSize = 0.3f; // TODO: better way to compute that? + static float pointSize = 0.3f; // TODO: better way to compute that? osystem_drawPoint(pEntry->vertices[0].X,pEntry->vertices[0].Y,pEntry->vertices[0].Z,pEntry->color, pEntry->material, pointSize); } void renderBigPoint(primEntryStruct* pEntry) // point { - float bigPointSize = 2.f; // TODO: better way to compute that? + static float bigPointSize = 1.f; // TODO: better way to compute that? osystem_drawPoint(pEntry->vertices[0].X,pEntry->vertices[0].Y,pEntry->vertices[0].Z,pEntry->color, pEntry->material, bigPointSize); } From f0b3db18329d7eaea68b8c58d0e96b6bada1a578 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 14 Jun 2025 23:19:43 -0700 Subject: [PATCH 39/70] Hackish implementation of the noise effect --- FitdLib/rendererBGFX.cpp | 82 ++++++---------------------- FitdLib/shaders/noise.varying.def.sc | 1 + FitdLib/shaders/noise_ps.sc | 12 +++- FitdLib/shaders/noise_vs.sc | 3 +- 4 files changed, 31 insertions(+), 67 deletions(-) diff --git a/FitdLib/rendererBGFX.cpp b/FitdLib/rendererBGFX.cpp index f379dde..3f9f286 100644 --- a/FitdLib/rendererBGFX.cpp +++ b/FitdLib/rendererBGFX.cpp @@ -661,6 +661,24 @@ void osystem_flushPendingPrimitives() bgfx::setTexture(1, paletteTextureUniform, g_paletteTexture); + // noise texture + static bgfx::TextureHandle noiseTexture = BGFX_INVALID_HANDLE; + if(!bgfx::isValid(noiseTexture)) + { + const int noiseTextureDim = 256; + std::array noiseTextureData; + for (int i = 0; i < noiseTextureData.size(); i++) { + noiseTextureData[i] = rand(); + } + noiseTexture = bgfx::createTexture2D(noiseTextureDim, noiseTextureDim, false, 1, bgfx::TextureFormat::R8U, 0, bgfx::copy(noiseTextureData.data(), noiseTextureDim * noiseTextureDim)); + } + static bgfx::UniformHandle noiseTextureUniform = BGFX_INVALID_HANDLE; + if (!bgfx::isValid(noiseTextureUniform)) { + noiseTextureUniform = bgfx::createUniform("s_noiseTexture", bgfx::UniformType::Sampler); + } + + bgfx::setTexture(0, noiseTextureUniform, noiseTexture); + bgfx::setVertexBuffer(0, &transientBuffer); bgfx::submit(gameViewId, getNoiseShader()); } @@ -1044,70 +1062,6 @@ void osystem_draw3dLine(float x1, float y1, float z1, float x2, float y2, float g_lineVertices.push_back(vertex1); g_lineVertices.push_back(vertex2); - -#if 0 - GLfloat lineVertices[2 * 3]; - GLubyte lineColor[2 * 4]; - - for (int i = 0; i < 2; i++) - { - lineColor[4 * i + 0] = RGB_Pal[color * 3 + 0]; - lineColor[4 * i + 1] = RGB_Pal[color * 3 + 1]; - lineColor[4 * i + 2] = RGB_Pal[color * 3 + 2]; - lineColor[4 * i + 3] = 255; - } - lineVertices[0] = x1; - lineVertices[1] = y1; - lineVertices[2] = z1; - lineVertices[3] = x2; - lineVertices[4] = y2; - lineVertices[5] = z2; - - static GLuint shaderprogram = 0; - static GLuint vertexp = 0; - static GLuint colorp = 0; - if (shaderprogram == 0) - { - shaderprogram = compileShader(flatQuadVS, flatQuadPS); - vertexp = glGetAttribLocation(shaderprogram, (const GLchar*)"in_Position"); - colorp = glGetAttribLocation(shaderprogram, (const GLchar*)"in_Color"); - } - - glUseProgram(shaderprogram); - - static GLuint vbo = 0; - if (vbo == 0) - { - glGenBuffers(1, &vbo); - } - - for (int i = 0; i < 2; i++) - { - gVertexArray[i].positions[0] = lineVertices[i * 3 + 0]; - gVertexArray[i].positions[1] = lineVertices[i * 3 + 1]; - gVertexArray[i].positions[2] = lineVertices[i * 3 + 2]; - - gVertexArray[i].color[0] = lineColor[i * 4 + 0] / 255.f; - gVertexArray[i].color[1] = lineColor[i * 4 + 1] / 255.f; - gVertexArray[i].color[2] = lineColor[i * 4 + 2] / 255.f; - gVertexArray[i].color[3] = lineColor[i * 4 + 3] / 255.f; - } - - glBindBuffer(GL_ARRAY_BUFFER, vbo); checkGL(); - glBufferData(GL_ARRAY_BUFFER, sizeof(s_vertexData) * 2, &gVertexArray[0], GL_STATIC_DRAW); checkGL(); - glVertexAttribPointer(vertexp, 3, GL_FLOAT, GL_FALSE, sizeof(s_vertexData), (void*)&((s_vertexData*)NULL)->positions); checkGL(); - glEnableVertexAttribArray(vertexp); checkGL(); - - if (colorp != -1) - { - glVertexAttribPointer(colorp, 4, GL_FLOAT, GL_FALSE, sizeof(s_vertexData), (void*)&((s_vertexData*)NULL)->color); - glEnableVertexAttribArray(colorp); - } - - glDrawArrays(GL_LINE_LOOP, 0, 2); checkGL(); - - checkGL(); -#endif } void osystem_draw3dQuad(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4, unsigned char color, int transparency) diff --git a/FitdLib/shaders/noise.varying.def.sc b/FitdLib/shaders/noise.varying.def.sc index e0f07e2..c09e62c 100644 --- a/FitdLib/shaders/noise.varying.def.sc +++ b/FitdLib/shaders/noise.varying.def.sc @@ -3,4 +3,5 @@ vec2 a_texcoord0 : TEXCOORD0; vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec3 v_screenSpacePosition : TEXCOORD2 = vec3(0.0, 0.0, 0.0); diff --git a/FitdLib/shaders/noise_ps.sc b/FitdLib/shaders/noise_ps.sc index a1cce6c..351b961 100644 --- a/FitdLib/shaders/noise_ps.sc +++ b/FitdLib/shaders/noise_ps.sc @@ -1,11 +1,19 @@ -$input v_texcoord0 +$input v_texcoord0, v_screenSpacePosition #include "bgfx_shader.sh" #include "palette.sh" +USAMPLER2D(s_noiseTexture, 0); + void main() { int color = int(v_texcoord0.x * 15.f); int bank = int(v_texcoord0.y * 15.f); - gl_FragColor = getColor(bank, color); + + uvec2 noiseSampler = uvec2(v_screenSpacePosition.xy * v_screenSpacePosition.z) % uvec2(255, 255); + float noise = float(texelFetch(s_noiseTexture, ivec2(noiseSampler), 0).r) / 255.f; + //color = int(noise * 15.f); + + vec4 baseColor = getColor(bank, color); + gl_FragColor = baseColor * (0.5f + noise/2.f); } diff --git a/FitdLib/shaders/noise_vs.sc b/FitdLib/shaders/noise_vs.sc index 18e6ad0..1548a60 100644 --- a/FitdLib/shaders/noise_vs.sc +++ b/FitdLib/shaders/noise_vs.sc @@ -1,5 +1,5 @@ $input a_position, a_texcoord0 -$output v_texcoord0 +$output v_texcoord0, v_screenSpacePosition #include "bgfx_shader.sh" @@ -7,4 +7,5 @@ void main() { gl_Position = vec4(a_position.x/160.0-1.0, 1.0-a_position.y/100.0, a_position.z/40960.f, 1.0); v_texcoord0 = a_texcoord0; + v_screenSpacePosition = a_position.xyz; } From 7bcd0a5723a9be39f078607cff5f8012ed4353f0 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 14 Jun 2025 23:40:12 -0700 Subject: [PATCH 40/70] Fix potential crash in debugger --- FitdLib/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 477ffdc..3ef0ffe 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -2650,7 +2650,7 @@ void drawZv(tObject* actorPtr) { ZVStruct localZv; - if( actorPtr->room != objectTable[currentCameraTargetActor].room ) + if(( actorPtr->room != objectTable[currentCameraTargetActor].room ) && (objectTable[currentCameraTargetActor].room != -1)) { getZvRelativePosition(&localZv, actorPtr->room, objectTable[currentCameraTargetActor].room); } From 19fcb93e1924d7c76ef94633d29728f1c8b2e5bc Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 14 Jun 2025 23:48:07 -0700 Subject: [PATCH 41/70] This is a better fix for now --- FitdLib/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 3ef0ffe..16652d4 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -2650,8 +2650,11 @@ void drawZv(tObject* actorPtr) { ZVStruct localZv; - if(( actorPtr->room != objectTable[currentCameraTargetActor].room ) && (objectTable[currentCameraTargetActor].room != -1)) + if( actorPtr->room != objectTable[currentCameraTargetActor].room ) { + if (objectTable[currentCameraTargetActor].room == -1) { + return; + } getZvRelativePosition(&localZv, actorPtr->room, objectTable[currentCameraTargetActor].room); } else From 4a65d10adf70747ddee8cc7819de9d366f4fadcd Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sun, 15 Jun 2025 14:56:56 -0700 Subject: [PATCH 42/70] Cleanup, fix a potential out of bound access --- FitdLib/anim.cpp | 2 +- FitdLib/anim.h | 2 +- FitdLib/floor.cpp | 4 +- FitdLib/life.cpp | 38 ++++++++--------- FitdLib/main.cpp | 19 +++++---- FitdLib/main.h | 4 +- FitdLib/mainLoop.cpp | 99 ++++++++++++++++++++------------------------ FitdLib/room.cpp | 4 +- FitdLib/save.cpp | 8 ++-- FitdLib/track.cpp | 50 +++++++++++----------- FitdLib/vars.cpp | 10 ++--- FitdLib/vars.h | 10 ++--- 12 files changed, 123 insertions(+), 127 deletions(-) diff --git a/FitdLib/anim.cpp b/FitdLib/anim.cpp index e4dfd96..924d7ba 100644 --- a/FitdLib/anim.cpp +++ b/FitdLib/anim.cpp @@ -279,7 +279,7 @@ int manageFall(int actorIdx, ZVStruct* zvPtr) return(fallResult); } -void updateAnimation(void) +void GereAnim(void) { int oldStepZ=0; int oldStepY=0; diff --git a/FitdLib/anim.h b/FitdLib/anim.h index a6249b0..4af88b3 100644 --- a/FitdLib/anim.h +++ b/FitdLib/anim.h @@ -9,6 +9,6 @@ s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr); s16 GetNbFramesAnim(char* animPtr); void StockInterAnim(std::vector& animBuffer, char* bodyPtr); void ResetStartAnim(char* bodyPtr); -void updateAnimation(void); +void GereAnim(void); void InitCopyBox(char* var0, char* var1); diff --git a/FitdLib/floor.cpp b/FitdLib/floor.cpp index 734ad13..da9befb 100644 --- a/FitdLib/floor.cpp +++ b/FitdLib/floor.cpp @@ -37,8 +37,8 @@ void LoadEtage(int floorNumber) } NumCamera = -1; - needChangeRoom = 1; - changeFloor = 0; + FlagChangeSalle = 1; + FlagChangeEtage = 0; ////////////////////////////////// diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index eef44aa..81e8f67 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -345,16 +345,16 @@ void setStage(int newStage, int newRoomLocal, int X, int Y, int Z) { if (newStage != g_currentFloor) { - changeFloor = 1; - newFloor = newStage; - newRoom = newRoomLocal; + FlagChangeEtage = 1; + NewNumEtage = newStage; + NewNumSalle = newRoomLocal; } else { if (currentRoom != newRoomLocal) { - needChangeRoom = 1; - newRoom = newRoomLocal; + FlagChangeSalle = 1; + NewNumSalle = newRoomLocal; } } } @@ -1979,8 +1979,8 @@ void processLife(int lifeNum, bool callFoundLife) if (lifeTempVar3 != currentRoom) { - needChangeRoom = 1; - newRoom = lifeTempVar3; + FlagChangeSalle = 1; + NewNumSalle = lifeTempVar3; } } else @@ -1990,9 +1990,9 @@ void processLife(int lifeNum, bool callFoundLife) if (objectTable[lifeTempVar2].stage != g_currentFloor) { currentWorldTarget = lifeTempVar1; - changeFloor = 1; - newFloor = objectTable[lifeTempVar2].stage; - newRoom = objectTable[lifeTempVar2].room; + FlagChangeEtage = 1; + NewNumEtage = objectTable[lifeTempVar2].stage; + NewNumSalle = objectTable[lifeTempVar2].room; } else { @@ -2003,8 +2003,8 @@ void processLife(int lifeNum, bool callFoundLife) if (lifeTempVar3 != currentRoom) { - needChangeRoom = 1; - newRoom = lifeTempVar3; + FlagChangeSalle = 1; + NewNumSalle = lifeTempVar3; } } } @@ -2014,16 +2014,16 @@ void processLife(int lifeNum, bool callFoundLife) currentWorldTarget = lifeTempVar1; if (ListWorldObjets[lifeTempVar1].stage != g_currentFloor) { - changeFloor = 1; - newFloor = ListWorldObjets[lifeTempVar1].stage; - newRoom = ListWorldObjets[lifeTempVar1].room; + FlagChangeEtage = 1; + NewNumEtage = ListWorldObjets[lifeTempVar1].stage; + NewNumSalle = ListWorldObjets[lifeTempVar1].room; } else { if (currentRoom != ListWorldObjets[lifeTempVar1].room) { - needChangeRoom = 1; - newRoom = ListWorldObjets[lifeTempVar1].room; + FlagChangeSalle = 1; + NewNumSalle = ListWorldObjets[lifeTempVar1].room; } } } @@ -2473,7 +2473,7 @@ void processLife(int lifeNum, bool callFoundLife) { process_events(); } - giveUp = 1; + FlagGameOver = 1; exitLife = 1; break; } @@ -2488,7 +2488,7 @@ void processLife(int lifeNum, bool callFoundLife) { process_events(); } - giveUp = 1; + FlagGameOver = 1; exitLife = 1; break; } diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 16652d4..eedef6a 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -1206,7 +1206,7 @@ void initVarsSub1(void) void initVars() { - giveUp = 0; + FlagGameOver = 0; currentInventory = 0; @@ -4086,7 +4086,7 @@ int findBestCamera(void) return(foundCamera); } -void checkIfCameraChangeIsRequired(void) +void GereSwitchCamera(void) { int localCurrentCam = NumCamera; int newCamera; @@ -4187,7 +4187,7 @@ sceZoneStruct* processActor2Sub(int x, int y, int z, roomDataStruct* pRoomData) } -void processActor2() +void GereDec() { bool onceMore = false; bool flagFloorChange = false; @@ -4238,10 +4238,15 @@ void processActor2() onceMore = true; if(currentProcessedActorIdx == currentCameraTargetActor) { - needChangeRoom = 1; - newRoom = (short)pCurrentZone->parameter; - if(g_gameId > AITD1) - ChangeSalle(newRoom); + FlagChangeSalle = 1; + NewNumSalle = (short)pCurrentZone->parameter; + if (g_gameId > AITD1) + { + ChangeSalle(NewNumSalle); + + // Hack: this wasn't in the original game, but is required here, or else we would use the current camera index in the new room and potentially go out of bound + NumCamera = -1; + } } else { diff --git a/FitdLib/main.h b/FitdLib/main.h index 27ba7a1..108bb95 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -5,12 +5,12 @@ extern int input5; void menuWaitVSync(); void AffSpfI(int x, int y, int param, char* gfx); -void processActor2(); +void GereDec(); void LoadEtage(int floorNumber); void ChangeSalle(int roomNumber); void executeFoundLife(int objIdx); void InitView(); -void checkIfCameraChangeIsRequired(void); +void GereSwitchCamera(void); void GenereActiveList(); void GenereAffList(); void mainDraw(int mode); diff --git a/FitdLib/mainLoop.cpp b/FitdLib/mainLoop.cpp index f8149a2..9e4b4ca 100644 --- a/FitdLib/mainLoop.cpp +++ b/FitdLib/mainLoop.cpp @@ -99,7 +99,7 @@ void PlayWorld(int allowSystemMenu, int deltaTime) executeFoundLife(inHandTable[currentInventory]); - if(changeFloor == 0) + if(FlagChangeEtage == 0) { if(g_gameId == AITD1) { @@ -110,10 +110,9 @@ void PlayWorld(int allowSystemMenu, int deltaTime) } } - currentProcessedActorPtr = objectTable.data(); - for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) { + currentProcessedActorPtr = &objectTable[currentProcessedActorIdx]; if(currentProcessedActorPtr->indexInWorld >= 0) { currentProcessedActorPtr->COL_BY = -1; @@ -122,24 +121,22 @@ void PlayWorld(int allowSystemMenu, int deltaTime) currentProcessedActorPtr->HARD_DEC = -1; currentProcessedActorPtr->HARD_COL = -1; } - - currentProcessedActorPtr++; } - currentProcessedActorPtr = objectTable.data(); for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) { + currentProcessedActorPtr = &objectTable[currentProcessedActorIdx]; if(currentProcessedActorPtr->indexInWorld >= 0) { int flag = currentProcessedActorPtr->objectType; if((flag & AF_ANIMATED) || (g_gameId >= AITD2 && flag & 0x200)) { - updateAnimation(); + GereAnim(); } if(flag & AF_TRIGGER) { - processActor2(); + GereDec(); } if(currentProcessedActorPtr->animActionType) @@ -147,13 +144,12 @@ void PlayWorld(int allowSystemMenu, int deltaTime) GereFrappe(); } } - - currentProcessedActorPtr++; } - currentProcessedActorPtr = objectTable.data(); + for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) { + currentProcessedActorPtr = &objectTable[currentProcessedActorIdx]; if(currentProcessedActorPtr->indexInWorld >= 0) { if(currentProcessedActorPtr->life != -1) @@ -181,75 +177,70 @@ void PlayWorld(int allowSystemMenu, int deltaTime) } } - if(changeFloor) + if(FlagChangeEtage) break; - - currentProcessedActorPtr++; } - if(giveUp) + if(FlagGameOver) break; } - if(changeFloor) + if(FlagChangeEtage) { - LoadEtage(newFloor); + LoadEtage(NewNumEtage); } - if(needChangeRoom) + if(FlagChangeSalle) { - ChangeSalle(newRoom); + ChangeSalle(NewNumSalle); InitView(); + continue; } - else - { - checkIfCameraChangeIsRequired(); - if(g_gameId >= AITD2) - { - int tempCurrentCamera; - tempCurrentCamera = NumCamera; + GereSwitchCamera(); - NumCamera = NewNumCamera; + // Handle 2d objects + //if (g_gameId >= AITD2) // no need for this test since it would do anything if there are 2d objects + { + int memocam = NumCamera; + + NumCamera = NewNumCamera; - for (currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) + for (currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) + { + currentProcessedActorPtr = &objectTable[currentProcessedActorIdx]; + if (currentProcessedActorPtr->indexInWorld >= 0) { - currentProcessedActorPtr = &objectTable[currentProcessedActorIdx]; - if(currentProcessedActorPtr->indexInWorld >= 0) + if (currentProcessedActorPtr->life != -1) { - if(currentProcessedActorPtr->life != -1) + if (currentProcessedActorPtr->objectType & AF_OBJ_2D) { - if(currentProcessedActorPtr->objectType & 0x200) - { - if(currentProcessedActorPtr->lifeMode&3) - if(!(currentProcessedActorPtr->lifeMode&4)) - { - processLife(currentProcessedActorPtr->life, false); - actorTurnedToObj = 1; - } - } + if (currentProcessedActorPtr->lifeMode & 3) + if (!(currentProcessedActorPtr->lifeMode & 4)) + { + processLife(currentProcessedActorPtr->life, false); + actorTurnedToObj = 1; + } } } - - if(changeFloor) - break; - - currentProcessedActorPtr++; } - if(giveUp) + if (FlagChangeEtage) break; - - NumCamera = tempCurrentCamera; } - if(FlagInitView + + if (FlagGameOver) + break; + + NumCamera = memocam; + } + if (FlagInitView #ifdef FITD_DEBUGGER - || debuggerVar_topCamera + || debuggerVar_topCamera #endif - ) - { - InitView(); - } + ) + { + InitView(); } // if(FlagGenereActiveList) diff --git a/FitdLib/room.cpp b/FitdLib/room.cpp index 0533ea4..8a2f1c8 100644 --- a/FitdLib/room.cpp +++ b/FitdLib/room.cpp @@ -190,8 +190,8 @@ void ChangeSalle(int roomNumber) } } - NewNumCamera = newNumCamera; + NewNumCamera = newNumCamera; FlagInitView = 1; - needChangeRoom = 0; + FlagChangeSalle = 0; RestoreTimerAnim(); } diff --git a/FitdLib/save.cpp b/FitdLib/save.cpp index 58492f9..f6a0ed9 100644 --- a/FitdLib/save.cpp +++ b/FitdLib/save.cpp @@ -216,8 +216,8 @@ int loadSave(int saveNumber) ASSERT(sizeof(statusScreenAllowed) == 2); fread(&statusScreenAllowed,2,1,fHandle); - ASSERT(sizeof(giveUp) == 2); - fread(&giveUp,2,1,fHandle); + ASSERT(sizeof(FlagGameOver) == 2); + fread(&FlagGameOver,2,1,fHandle); ASSERT(sizeof(lightOff) == 2); fread(&lightOff,2,1,fHandle); @@ -730,8 +730,8 @@ int makeSaveFile(int entry) ASSERT(sizeof(statusScreenAllowed) == 2); fwrite(&statusScreenAllowed,2,1,fHandle); - ASSERT(sizeof(giveUp) == 2); - fwrite(&giveUp,2,1,fHandle); + ASSERT(sizeof(FlagGameOver) == 2); + fwrite(&FlagGameOver,2,1,fHandle); ASSERT(sizeof(lightOff) == 2); fwrite(&lightOff,2,1,fHandle); diff --git a/FitdLib/track.cpp b/FitdLib/track.cpp index d3b87e5..452395b 100644 --- a/FitdLib/track.cpp +++ b/FitdLib/track.cpp @@ -291,8 +291,8 @@ void processTrack(void) { if(currentCameraTargetActor == currentProcessedActorIdx) { - needChangeRoom = 1; - newRoom = roomNumber; + FlagChangeSalle = 1; + NewNumSalle = roomNumber; } currentProcessedActorPtr->room = roomNumber; @@ -387,7 +387,7 @@ void processTrack(void) } break; - } + } case TL_GOTO_3D: // goToPosition { int roomNumber = *(s16*)(trackPtr); @@ -400,42 +400,42 @@ void processTrack(void) x = *(s16*)(trackPtr); trackPtr += 2; - y = *(s16*)(trackPtr); + y = *(s16*)(trackPtr); trackPtr += 2; z = *(s16*)(trackPtr); - trackPtr += 2; + trackPtr += 2; int time = *(s16*)(trackPtr); trackPtr += 2; if (roomNumber != currentProcessedActorPtr->room) { // TODO: fix bug here... - x -= (roomDataTable[currentProcessedActorPtr->room].worldX - roomDataTable[roomNumber].worldX) * 10; + x -= (roomDataTable[currentProcessedActorPtr->room].worldX - roomDataTable[roomNumber].worldX) * 10; y += (roomDataTable[currentProcessedActorPtr->room].worldY - roomDataTable[roomNumber].worldY) * 10; z += (roomDataTable[currentProcessedActorPtr->room].worldZ - roomDataTable[roomNumber].worldZ) * 10; - } - - // reached position? - if (y == currentProcessedActorPtr->roomY) - { - int distance = GiveDistance2D(currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, x, z); - if (distance < DISTANCE_TO_POINT_TRESSHOLD) { - currentProcessedActorPtr->positionInTrack += 6; - break; - } - } + } + + // reached position? + if (y == currentProcessedActorPtr->roomY) + { + int distance = GiveDistance2D(currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, x, z); + if (distance < DISTANCE_TO_POINT_TRESSHOLD) { + currentProcessedActorPtr->positionInTrack += 6; + break; + } + } { - int direction = computeAngleModificatorToPosition( + int direction = computeAngleModificatorToPosition( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, currentProcessedActorPtr->beta, x, z); - - if (currentProcessedActorPtr->YHandler.numSteps == 0) - { - InitRealValue(0, y - (currentProcessedActorPtr->roomY + currentProcessedActorPtr->stepY), time, ¤tProcessedActorPtr->YHandler); - } + + if (currentProcessedActorPtr->YHandler.numSteps == 0) + { + InitRealValue(0, y - (currentProcessedActorPtr->roomY + currentProcessedActorPtr->stepY), time, ¤tProcessedActorPtr->YHandler); + } if ((currentProcessedActorPtr->rotate.numSteps == 0) || (currentProcessedActorPtr->direction != direction)) { @@ -850,8 +850,8 @@ void processTrack2(void) { if(currentCameraTargetActor == currentProcessedActorIdx) { - needChangeRoom = 1; - newRoom = roomNumber; + FlagChangeSalle = 1; + NewNumSalle = roomNumber; } currentProcessedActorPtr->room = roomNumber; diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index 78abafb..e69d65d 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -114,7 +114,7 @@ int NbLogBoxs; int nextSample; int nextMusic; s16 currentCameraTargetActor; -s16 giveUp; +s16 FlagGameOver; s16 lightOff; int lightVar2; int LastPriority; @@ -124,10 +124,10 @@ s16 statusScreenAllowed; char* g_currentFloorRoomRawData = NULL; char* g_currentFloorCameraRawData = NULL; -int changeFloor; +int FlagChangeEtage; s16 NumCamera; s16 g_currentFloor; -int needChangeRoom; +int FlagChangeSalle; char* cameraPtr; roomDefStruct* pCurrentRoomData; @@ -224,7 +224,7 @@ char* animVar1; char* animVar3; char* animVar4; -s16 newFloor; +s16 NewNumEtage; int fadeState; @@ -242,7 +242,7 @@ int overlaySize2; int bgOverlayVar1; -s16 newRoom; +s16 NewNumSalle; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index 1731005..36c51af 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -364,7 +364,7 @@ extern int NbLogBoxs; extern int nextSample; extern int nextMusic; extern s16 currentCameraTargetActor; -extern s16 giveUp; +extern s16 FlagGameOver; extern s16 lightOff; extern int lightVar2; extern int LastPriority; @@ -374,10 +374,10 @@ extern s16 statusScreenAllowed; extern char* g_currentFloorRoomRawData; extern char* g_currentFloorCameraRawData; -extern int changeFloor; +extern int FlagChangeEtage; extern s16 NumCamera; extern s16 g_currentFloor; -extern int needChangeRoom; +extern int FlagChangeSalle; extern char* cameraPtr; extern roomDefStruct* pCurrentRoomData; @@ -455,7 +455,7 @@ extern char* animVar1; extern char* animVar3; extern char* animVar4; -extern s16 newFloor; +extern s16 NewNumEtage; extern int fadeState; @@ -473,7 +473,7 @@ extern int overlaySize2; extern int bgOverlayVar1; -extern s16 newRoom; +extern s16 NewNumSalle; extern const char* listBodySelect[]; extern const char* listAnimSelect[]; From 485d4f1d06c7f7825d2e455e9ca7bc518e575b16 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sun, 15 Jun 2025 18:42:09 -0700 Subject: [PATCH 43/70] Fix incorrect follow in AITD2+ --- FitdLib/track.cpp | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/FitdLib/track.cpp b/FitdLib/track.cpp index 452395b..f63bf12 100644 --- a/FitdLib/track.cpp +++ b/FitdLib/track.cpp @@ -49,7 +49,7 @@ int computeAngleModificatorToPositionSub1(int ax) return(-1); } -int computeAngleModificatorToPosition(int x1,int z1, int beta, int x2, int z2) +int CapObjet(int x1,int z1, int beta, int x2, int z2) { int resultMin; int resultMax; @@ -243,7 +243,7 @@ void processTrack(void) z = *(s16*)(link+8)+(((*(s16*)(link+10))-(*(s16 *)(link+8))) / 2); } - angleModif = computeAngleModificatorToPosition( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, + angleModif = CapObjet( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, currentProcessedActorPtr->beta, x, z ); @@ -360,7 +360,7 @@ void processTrack(void) if(distanceToPoint >= DISTANCE_TO_POINT_TRESSHOLD) // not yet at position { - int angleModif = computeAngleModificatorToPosition( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, + int angleModif = CapObjet( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, currentProcessedActorPtr->beta, x,z ); @@ -426,7 +426,7 @@ void processTrack(void) } { - int direction = computeAngleModificatorToPosition( + int direction = CapObjet( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, currentProcessedActorPtr->beta, @@ -592,7 +592,7 @@ void processTrack(void) currentProcessedActorPtr->zv.ZVY1 += difY; currentProcessedActorPtr->zv.ZVY2 += difY; - angleModif = computeAngleModificatorToPosition( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, + angleModif = CapObjet( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, currentProcessedActorPtr->beta, x,z ); @@ -663,7 +663,7 @@ void processTrack(void) currentProcessedActorPtr->zv.ZVY1 += difY; currentProcessedActorPtr->zv.ZVY2 += difY; - angleModif = computeAngleModificatorToPosition( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, + angleModif = CapObjet( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, currentProcessedActorPtr->beta, x,z ); @@ -787,24 +787,21 @@ void processTrack2(void) { tObject* followedActorPtr = &objectTable[followedActorIdx]; - int roomNumber = followedActorPtr->room; - int x = followedActorPtr->roomX; - //int y = followedActorPtr->roomY; - int z = followedActorPtr->roomZ; - int angleModif; + int targetX = followedActorPtr->roomX; + int targetY = followedActorPtr->roomY; + int targetZ = followedActorPtr->roomZ; - if(currentProcessedActorPtr->room != roomNumber) - { - /* char* link = getRoomLink(currentProcessedActorPtr->room,roomNumber); + // This was changed from AITD2 and on + const auto& targetRoom = roomDataTable[followedActorPtr->room]; + const auto& sourceRoom = roomDataTable[currentProcessedActorPtr->room]; - x = *(s16*)(link)+(((*(s16*)(link+2))-(*(s16 *)(link))) / 2); - y = *(s16*)(link+4)+(((*(s16*)(link+6))-(*(s16 *)(link+4))) / 2); - z = *(s16*)(link+8)+(((*(s16*)(link+10))-(*(s16 *)(link+8))) / 2); */ - } + targetX -= (sourceRoom.worldX - targetRoom.worldX) * 10; + targetZ += (sourceRoom.worldZ - targetRoom.worldZ) * 10; - angleModif = computeAngleModificatorToPosition( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, + int angleModif = CapObjet( + currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, - currentProcessedActorPtr->beta, x, z ); + currentProcessedActorPtr->beta, targetX, targetZ ); if( currentProcessedActorPtr->rotate.numSteps == 0 || currentProcessedActorPtr->direction != angleModif ) { @@ -841,7 +838,7 @@ void processTrack2(void) switch(trackMacro) { - case 0: // warp + case TL_INIT_COOR: // warp { int roomNumber = *(s16*)(trackPtr); trackPtr += 2; @@ -918,7 +915,7 @@ void processTrack2(void) if(distanceToPoint >= DISTANCE_TO_POINT_TRESSHOLD) // not yet at position { - int angleModif = computeAngleModificatorToPosition( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, + int angleModif = CapObjet( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, currentProcessedActorPtr->beta, x,z ); From f3e84a00a0d7fabfde42a5d34c889f266e514e9e Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sun, 15 Jun 2025 19:03:36 -0700 Subject: [PATCH 44/70] Re-merge the track-handling code --- FitdLib/life.cpp | 9 +- FitdLib/track.cpp | 544 +++++----------------------------------------- FitdLib/track.h | 1 - 3 files changed, 53 insertions(+), 501 deletions(-) diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index 81e8f67..e80674d 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -1218,14 +1218,7 @@ void processLife(int lifeNum, bool callFoundLife) case LM_DO_MOVE: { appendFormated("LM_DO_MOVE "); - if (g_gameId == AITD1) - { - processTrack(); - } - else - { - processTrack2(); - } + processTrack(); break; } case LM_ANIM_MOVE: diff --git a/FitdLib/track.cpp b/FitdLib/track.cpp index f63bf12..3192104 100644 --- a/FitdLib/track.cpp +++ b/FitdLib/track.cpp @@ -6,10 +6,10 @@ #define TL_END 2 #define TL_REPEAT 3 #define TL_MARK 4 -#define TL_WALK 5 -#define TL_RUN 6 +#define TL_WALK 5 // removed in AITD2+ +#define TL_RUN 6 // removed in AITD2+ #define TL_STOP 7 -#define TL_BACK 8 +#define TL_BACK 8 // removed in AITD2+ #define TL_SET_ANGLE 9 #define TL_COL_OFF 10 #define TL_COL_ON 11 @@ -23,6 +23,22 @@ #define TL_ANGLE 19 #define TL_CLOSE 20 +// AITD2+ has removed a few entries, so covert the enum to match +s16 convertTrackMacro(s16 inTrackMacro) { + if (g_gameId == AITD1) { + return inTrackMacro; + } + + if (inTrackMacro <= 4) + return inTrackMacro; + + if (inTrackMacro >= 6) + return inTrackMacro + 3; + + assert(inTrackMacro == 5); + return TL_STOP; +} + int makeProportional(int x1, int x2, int y1, int y2) { return x1 + ((x2 - x1) * y2) / y1; @@ -228,24 +244,38 @@ void processTrack(void) { tObject* followedActorPtr = &objectTable[followedActorIdx]; - int roomNumber = followedActorPtr->room; - int x = followedActorPtr->roomX; - int y = followedActorPtr->roomY; - int z = followedActorPtr->roomZ; + int targetRoomNumber = followedActorPtr->room; + int targetX = followedActorPtr->roomX; + int targetY = followedActorPtr->roomY; + int targetZ = followedActorPtr->roomZ; int angleModif; - if(currentProcessedActorPtr->room != roomNumber) - { - char* link = getRoomLink(currentProcessedActorPtr->room,roomNumber); + if (g_gameId == AITD1) { + // in AITD1, if the target entity is in a different room, the entity would aim for the center of the trigger zone to get to that room + if (currentProcessedActorPtr->room != targetRoomNumber) + { + char* link = getRoomLink(currentProcessedActorPtr->room, targetRoomNumber); - x = *(s16*)(link)+(((*(s16*)(link+2))-(*(s16 *)(link))) / 2); - y = *(s16*)(link+4)+(((*(s16*)(link+6))-(*(s16 *)(link+4))) / 2); - z = *(s16*)(link+8)+(((*(s16*)(link+10))-(*(s16 *)(link+8))) / 2); + targetX = *(s16*)(link + 0) + (((*(s16*)(link + 2)) - (*(s16*)(link + 0))) / 2); + targetY = *(s16*)(link + 4) + (((*(s16*)(link + 6)) - (*(s16*)(link + 4))) / 2); + targetZ = *(s16*)(link + 8) + (((*(s16*)(link + 10)) - (*(s16*)(link + 8))) / 2); + } + } + else { + // This was changed from AITD2+ to aim for the target in world-space + if((followedActorPtr->room >= 0) && (currentProcessedActorPtr->room>=0)) + { + const auto& targetRoom = roomDataTable[followedActorPtr->room]; + const auto& sourceRoom = roomDataTable[currentProcessedActorPtr->room]; + + targetX -= (sourceRoom.worldX - targetRoom.worldX) * 10; + targetZ += (sourceRoom.worldZ - targetRoom.worldZ) * 10; + } } angleModif = CapObjet( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, - currentProcessedActorPtr->beta, x, z ); + currentProcessedActorPtr->beta, targetX, targetZ); if( (currentProcessedActorPtr->rotate.numSteps == 0) || (currentProcessedActorPtr->direction != angleModif) ) { @@ -271,11 +301,9 @@ void processTrack(void) case 3: // track { char* trackPtr = HQR_Get(listTrack,currentProcessedActorPtr->trackNumber); - s16 trackMacro; - trackPtr+=currentProcessedActorPtr->positionInTrack * 2; - trackMacro = *(s16*)trackPtr; + s16 trackMacro = convertTrackMacro(*(s16*)trackPtr); trackPtr += 2; //printf("Track macro %X\n",trackMacro); @@ -489,8 +517,12 @@ void processTrack(void) } case TL_STOP: { - currentProcessedActorPtr->speed = 0; - currentProcessedActorPtr->positionInTrack++; + // Stop only has a meaning in AITD1 where it means stop walking + if (g_gameId == AITD1) + { + currentProcessedActorPtr->speed = 0; + currentProcessedActorPtr->positionInTrack++; + } break; } case TL_SET_ANGLE: // TL_SET_ANGLE @@ -525,7 +557,7 @@ void processTrack(void) } case TL_COL_OFF: { - currentProcessedActorPtr->dynFlags &= 0xFFFE; + currentProcessedActorPtr->dynFlags &= ~1; currentProcessedActorPtr->positionInTrack++; break; } @@ -730,475 +762,3 @@ void processTrack(void) currentProcessedActorPtr->beta &= 0x3FF; } -void processTrack2(void) -{ - switch(currentProcessedActorPtr->trackMode) - { - case 1: // manual - { - GereManualRot(60); - if(localJoyD&1) // forward - { - if(timer - lastTimeForward < 10 && currentProcessedActorPtr->speed != 4) - currentProcessedActorPtr->speed = 5; - else - if(currentProcessedActorPtr->speed == 0 || currentProcessedActorPtr->speed == -1) - currentProcessedActorPtr->speed = 4; - - /* if(currentProcessedActorPtr->speed>0 && currentProcessedActorPtr->speed<4) - currentProcessedActorPtr->speed = 5; */ - - - lastTimeForward = timer; - } - else - { - if(currentProcessedActorPtr->speed>0 && currentProcessedActorPtr->speed<=4) - { - currentProcessedActorPtr->speed--; - } - else - { - currentProcessedActorPtr->speed = 0; - } - } - - if(localJoyD&2) // backward - { - if(currentProcessedActorPtr->speed == 0 || currentProcessedActorPtr->speed >= 4) - currentProcessedActorPtr->speed = -1; - - if(currentProcessedActorPtr->speed == 5) - currentProcessedActorPtr->speed = 0; - } - - break; - } - case 2: // follow - { - int followedActorIdx = ListWorldObjets[currentProcessedActorPtr->trackNumber].objIndex; - - if(followedActorIdx == -1) - { - currentProcessedActorPtr->direction = 0; - currentProcessedActorPtr->speed = 0; - } - else - { - tObject* followedActorPtr = &objectTable[followedActorIdx]; - - int targetX = followedActorPtr->roomX; - int targetY = followedActorPtr->roomY; - int targetZ = followedActorPtr->roomZ; - - // This was changed from AITD2 and on - const auto& targetRoom = roomDataTable[followedActorPtr->room]; - const auto& sourceRoom = roomDataTable[currentProcessedActorPtr->room]; - - targetX -= (sourceRoom.worldX - targetRoom.worldX) * 10; - targetZ += (sourceRoom.worldZ - targetRoom.worldZ) * 10; - - int angleModif = CapObjet( - currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, - currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, - currentProcessedActorPtr->beta, targetX, targetZ ); - - if( currentProcessedActorPtr->rotate.numSteps == 0 || currentProcessedActorPtr->direction != angleModif ) - { - InitRealValue( currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (angleModif << 8), 60, ¤tProcessedActorPtr->rotate); - } - - currentProcessedActorPtr->direction = angleModif; - - if( currentProcessedActorPtr->direction == 0 ) - { - currentProcessedActorPtr->rotate.numSteps = 0; - } - else - { - currentProcessedActorPtr->beta = updateActorRotation(¤tProcessedActorPtr->rotate); - } - - currentProcessedActorPtr->speed = 4; - - } - break; - } - case 3: // track - { - char* trackPtr = HQR_Get(listTrack,currentProcessedActorPtr->trackNumber); - s16 trackMacro; - - trackPtr+=currentProcessedActorPtr->positionInTrack * 2; - - trackMacro = *(s16*)trackPtr; - trackPtr += 2; - - //printf("Track macro %X\n",trackMacro); - - switch(trackMacro) - { - case TL_INIT_COOR: // warp - { - int roomNumber = *(s16*)(trackPtr); - trackPtr += 2; - - if(currentProcessedActorPtr->room != roomNumber) - { - if(currentCameraTargetActor == currentProcessedActorIdx) - { - FlagChangeSalle = 1; - NewNumSalle = roomNumber; - } - - currentProcessedActorPtr->room = roomNumber; - } - - currentProcessedActorPtr->zv.ZVX1 -= currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX; - currentProcessedActorPtr->zv.ZVX2 -= currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX; - currentProcessedActorPtr->zv.ZVY1 -= currentProcessedActorPtr->roomY + currentProcessedActorPtr->stepY; - currentProcessedActorPtr->zv.ZVY2 -= currentProcessedActorPtr->roomY + currentProcessedActorPtr->stepY; - currentProcessedActorPtr->zv.ZVZ1 -= currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ; - currentProcessedActorPtr->zv.ZVZ2 -= currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ; - - currentProcessedActorPtr->worldX = currentProcessedActorPtr->roomX = *(s16*)(trackPtr); - trackPtr += 2; - currentProcessedActorPtr->worldY = currentProcessedActorPtr->roomY = *(s16*)(trackPtr); - trackPtr += 2; - currentProcessedActorPtr->worldZ = currentProcessedActorPtr->roomZ = *(s16*)(trackPtr); - trackPtr += 2; - - currentProcessedActorPtr->worldX -= (s16)((roomDataTable[currentRoom].worldX - roomDataTable[currentProcessedActorPtr->room].worldX) * 10); - currentProcessedActorPtr->worldY += (s16)((roomDataTable[currentRoom].worldY - roomDataTable[currentProcessedActorPtr->room].worldY) * 10); - currentProcessedActorPtr->worldZ += (s16)((roomDataTable[currentRoom].worldZ - roomDataTable[currentProcessedActorPtr->room].worldZ) * 10); - - currentProcessedActorPtr->zv.ZVX1 += currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX; - currentProcessedActorPtr->zv.ZVX2 += currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX; - currentProcessedActorPtr->zv.ZVY1 += currentProcessedActorPtr->roomY + currentProcessedActorPtr->stepY; - currentProcessedActorPtr->zv.ZVY2 += currentProcessedActorPtr->roomY + currentProcessedActorPtr->stepY; - currentProcessedActorPtr->zv.ZVZ1 += currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ; - currentProcessedActorPtr->zv.ZVZ2 += currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ; - - currentProcessedActorPtr->speed = 0; - currentProcessedActorPtr->direction = 0; - currentProcessedActorPtr->rotate.numSteps = 0; - currentProcessedActorPtr->positionInTrack += 5; - - break; - } - case 1: // goToPosition - { - int roomNumber = *(s16*)(trackPtr); - int x; - int y; - int z; - unsigned int distanceToPoint; - - trackPtr += 2; - - x = *(s16*)(trackPtr); - trackPtr += 2; - y = 0; - z = *(s16*)(trackPtr); - trackPtr += 2; - - if(roomNumber != currentProcessedActorPtr->room) - { - x -= (roomDataTable[currentProcessedActorPtr->room].worldX - roomDataTable[roomNumber].worldX) * 10; - z += (roomDataTable[currentProcessedActorPtr->room].worldZ - roomDataTable[roomNumber].worldZ) * 10; - } - - distanceToPoint = GiveDistance2D( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, - currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, - x,z ); - - - if(distanceToPoint >= DISTANCE_TO_POINT_TRESSHOLD) // not yet at position - { - int angleModif = CapObjet( currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX, - currentProcessedActorPtr->roomZ + currentProcessedActorPtr->stepZ, - currentProcessedActorPtr->beta, - x,z ); - - if(currentProcessedActorPtr->rotate.numSteps == 0 || currentProcessedActorPtr->direction != angleModif) - { - InitRealValue(currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (angleModif<<6), 15, ¤tProcessedActorPtr->rotate); - } - - currentProcessedActorPtr->direction = angleModif; - - if(!angleModif) - { - currentProcessedActorPtr->rotate.numSteps = 0; - } - else - { - currentProcessedActorPtr->beta = updateActorRotation(¤tProcessedActorPtr->rotate); - } - } - else // reached position - { - currentProcessedActorPtr->positionInTrack += 4; - } - - break; - } - case 2: // stop - { - currentProcessedActorPtr->speed = 0; - currentProcessedActorPtr->trackNumber = -1; - setMoveMode(0,0); - break; - } - case 3: - { - currentProcessedActorPtr->positionInTrack = 0; - break; - } - case 4: // MARK - { - currentProcessedActorPtr->MARK = *(s16*)(trackPtr); - trackPtr += 2; - currentProcessedActorPtr->positionInTrack += 2; - break; - } - case 5: - { - break; - } - case 0x6: - { - int betaDif = *(s16*)(trackPtr); - trackPtr += 2; - - if(((currentProcessedActorPtr->beta - betaDif)&0x3FF) > 0x200) - { - currentProcessedActorPtr->direction = 1; - } - else - { - currentProcessedActorPtr->direction = -1; - } - - if(!currentProcessedActorPtr->rotate.numSteps) - { - InitRealValue(currentProcessedActorPtr->beta, betaDif, 120, ¤tProcessedActorPtr->rotate); - } - - currentProcessedActorPtr->beta = updateActorRotation(¤tProcessedActorPtr->rotate); - - if(currentProcessedActorPtr->beta == betaDif) - { - currentProcessedActorPtr->direction = 0; - - currentProcessedActorPtr->positionInTrack+=2; - } - - break; - } - case 0x7: - { - currentProcessedActorPtr->dynFlags &= 0xFFFE; - currentProcessedActorPtr->positionInTrack++; - break; - } - case 0x8: - { - currentProcessedActorPtr->dynFlags |= 1; - currentProcessedActorPtr->positionInTrack++; - break; - } - case 0xA: - { - currentProcessedActorPtr->objectType &= 0xFFBF; - currentProcessedActorPtr->positionInTrack++; - break; - } - case 0xB: - { - currentProcessedActorPtr->objectType |= 0x40; - currentProcessedActorPtr->positionInTrack++; - break; - }/* - case 0x10: - { - int objNum = currentProcessedActorPtr->field_0; - - objectTable[objNum].x = currentProcessedActorPtr->roomX + currentProcessedActorPtr->modX; - objectTable[objNum].y = currentProcessedActorPtr->roomY + currentProcessedActorPtr->modY; - objectTable[objNum].z = currentProcessedActorPtr->roomZ + currentProcessedActorPtr->modZ; - - currentProcessedActorPtr->positionInTrack++; - - break; - } - case 0x11: // walk up/down stairs on X - { - int x; - int y; - int z; - int objX; - int objY; - int objZ; - - x = *(s16*)(trackPtr); - trackPtr += 2; - y = *(s16*)(trackPtr); - trackPtr += 2; - z = *(s16*)(trackPtr); - trackPtr += 2; - - objX = objectTable[currentProcessedActorPtr->field_0].x; - objY = objectTable[currentProcessedActorPtr->field_0].y; - objZ = objectTable[currentProcessedActorPtr->field_0].z; - - if( currentProcessedActorPtr->roomY + currentProcessedActorPtr->modY < y - 100 - || currentProcessedActorPtr->roomY + currentProcessedActorPtr->modY > y + 100) - { - int propX = makeProportional(objY, y, x - objX, (currentProcessedActorPtr->roomX + currentProcessedActorPtr->modX) - objX); - - int difY = propX - currentProcessedActorPtr->worldY; - int angleModif; - - currentProcessedActorPtr->worldY += difY; - currentProcessedActorPtr->roomY += difY; - currentProcessedActorPtr->zv.ZVY1 += difY; - currentProcessedActorPtr->zv.ZVY2 += difY; - - angleModif = computeAngleModificatorToPosition( currentProcessedActorPtr->roomX + currentProcessedActorPtr->modX, - currentProcessedActorPtr->roomZ + currentProcessedActorPtr->modZ, - currentProcessedActorPtr->beta, - x,z ); - - if(!currentProcessedActorPtr->rotate.param || currentProcessedActorPtr->field_72 != angleModif) - { - startActorRotation(currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (angleModif<<8), 60, ¤tProcessedActorPtr->rotate); - } - - currentProcessedActorPtr->field_72 = angleModif; - - if(angleModif) - { - currentProcessedActorPtr->beta = updateActorRotation(¤tProcessedActorPtr->rotate); - } - else - { - currentProcessedActorPtr->rotate.param = 0; - } - - } - else - { - int difY = y - currentProcessedActorPtr->worldY; - - currentProcessedActorPtr->modY = 0; - currentProcessedActorPtr->worldY += difY; - currentProcessedActorPtr->roomY += difY; - currentProcessedActorPtr->zv.ZVY1 += difY; - currentProcessedActorPtr->zv.ZVY2 += difY; - - currentProcessedActorPtr->positionInTrack +=4; - } - - break; - } - case 0x12: // walk up/down stairs on Z - { - int x; - int y; - int z; - int objX; - int objY; - int objZ; - - x = *(s16*)(trackPtr); - trackPtr += 2; - y = *(s16*)(trackPtr); - trackPtr += 2; - z = *(s16*)(trackPtr); - trackPtr += 2; - - objX = objectTable[currentProcessedActorPtr->field_0].x; - objY = objectTable[currentProcessedActorPtr->field_0].y; - objZ = objectTable[currentProcessedActorPtr->field_0].z; - - if( currentProcessedActorPtr->roomY + currentProcessedActorPtr->modY < y - 100 - || currentProcessedActorPtr->roomY + currentProcessedActorPtr->modY > y + 100) - { - int propZ = makeProportional(objY, y, z - objZ, (currentProcessedActorPtr->roomZ + currentProcessedActorPtr->modZ) - objZ); - - int difY = propZ - currentProcessedActorPtr->worldY; - - int angleModif; - - currentProcessedActorPtr->worldY += difY; - currentProcessedActorPtr->roomY += difY; - currentProcessedActorPtr->zv.ZVY1 += difY; - currentProcessedActorPtr->zv.ZVY2 += difY; - - angleModif = computeAngleModificatorToPosition( currentProcessedActorPtr->roomX + currentProcessedActorPtr->modX, - currentProcessedActorPtr->roomZ + currentProcessedActorPtr->modZ, - currentProcessedActorPtr->beta, - x,z ); - - if(!currentProcessedActorPtr->rotate.param || currentProcessedActorPtr->field_72 != angleModif) - { - startActorRotation(currentProcessedActorPtr->beta, currentProcessedActorPtr->beta - (angleModif<<8), 60, ¤tProcessedActorPtr->rotate); - } - - currentProcessedActorPtr->field_72 = angleModif; - - if(angleModif) - { - currentProcessedActorPtr->beta = updateActorRotation(¤tProcessedActorPtr->rotate); - } - else - { - currentProcessedActorPtr->rotate.param = 0; - } - - } - else - { - int difY = y - currentProcessedActorPtr->worldY; - - currentProcessedActorPtr->modY = 0; - currentProcessedActorPtr->worldY += difY; - currentProcessedActorPtr->roomY += difY; - currentProcessedActorPtr->zv.ZVY1 += difY; - currentProcessedActorPtr->zv.ZVY2 += difY; - - currentProcessedActorPtr->positionInTrack +=4; - } - - break; - } - case 0x13: // rotate - { - currentProcessedActorPtr->alpha = *(s16*)(trackPtr); - trackPtr += 2; - currentProcessedActorPtr->beta = *(s16*)(trackPtr); - trackPtr += 2; - currentProcessedActorPtr->gamma = *(s16*)(trackPtr); - trackPtr += 2; - - currentProcessedActorPtr->field_72 = 0; - - currentProcessedActorPtr->positionInTrack +=4; - - break; - } */ - default: - { - printf("Unknown track macro %X\n",trackMacro); - assert(0); - break; - } - } - - break; - } - } - - currentProcessedActorPtr->beta &= 0x3FF; -} diff --git a/FitdLib/track.h b/FitdLib/track.h index 7bbe32b..9a585b7 100644 --- a/FitdLib/track.h +++ b/FitdLib/track.h @@ -2,7 +2,6 @@ #define _TRACK_ void processTrack(void); -void processTrack2(void); void GereManualRot(int param); #endif From 1de212ab21a3400e4acb3cfe4ebb0c37ceaaf372 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sun, 15 Jun 2025 22:28:27 -0700 Subject: [PATCH 45/70] Better fix for the camera index issue --- FitdLib/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index eedef6a..a35fa3e 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -4245,7 +4245,7 @@ void GereDec() ChangeSalle(NewNumSalle); // Hack: this wasn't in the original game, but is required here, or else we would use the current camera index in the new room and potentially go out of bound - NumCamera = -1; + InitView(); } } else From ac19c0dd34ef2f0c3d86d896d34a60aae0c38f20 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sun, 15 Jun 2025 22:28:35 -0700 Subject: [PATCH 46/70] Renames --- FitdLib/anim.cpp | 10 ++--- FitdLib/animAction.cpp | 4 +- FitdLib/floor.cpp | 2 +- FitdLib/hqr.cpp | 4 +- FitdLib/inventory.cpp | 12 +++--- FitdLib/life.cpp | 12 +++--- FitdLib/main.cpp | 94 ++++++++++++++++++++---------------------- FitdLib/main.h | 2 +- FitdLib/object.cpp | 2 +- FitdLib/save.cpp | 4 +- FitdLib/systemMenu.cpp | 8 ++-- FitdLib/vars.cpp | 8 ++-- FitdLib/vars.h | 8 ++-- 13 files changed, 82 insertions(+), 88 deletions(-) diff --git a/FitdLib/anim.cpp b/FitdLib/anim.cpp index 924d7ba..ef317b2 100644 --- a/FitdLib/anim.cpp +++ b/FitdLib/anim.cpp @@ -138,7 +138,7 @@ int InitAnim(int animNum,int animType, int animInfo) currentProcessedActorPtr->objectType |= AF_ANIMATED; - SetAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim,animNum), HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); + SetAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim,animNum), HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); currentProcessedActorPtr->animType = animType; currentProcessedActorPtr->animInfo = animInfo; @@ -173,7 +173,7 @@ int InitAnim(int animNum,int animType, int animInfo) removeFromBGIncrust(currentProcessedActorIdx); } - SetAnimObjet(0, HQR_Get(listAnim,animNum), HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); + SetAnimObjet(0, HQR_Get(listAnim,animNum), HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); currentProcessedActorPtr->newAnim = animNum; currentProcessedActorPtr->newAnimType = animType; @@ -326,7 +326,7 @@ void GereAnim(void) // TODO: AITD3 has some extra code here to handle bufferAnimCounter - StockInterAnim(BufferAnim[bufferAnimCounter], HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); + StockInterAnim(BufferAnim[bufferAnimCounter], HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); bufferAnimCounter++; if (bufferAnimCounter == NB_BUFFER_ANIM) @@ -334,7 +334,7 @@ void GereAnim(void) } else { - ResetStartAnim(HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); + ResetStartAnim(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); currentProcessedActorPtr->newAnimType &= ~ANIM_RESET; } currentProcessedActorPtr->ANIM = newAnim; @@ -394,7 +394,7 @@ void GereAnim(void) oldStepY = currentProcessedActorPtr->stepY; oldStepZ = currentProcessedActorPtr->stepZ; - currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim, currentProcessedActorPtr->ANIM), HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); + currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim, currentProcessedActorPtr->ANIM), HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); walkStep(animStepX,animStepZ,currentProcessedActorPtr->beta); diff --git a/FitdLib/animAction.cpp b/FitdLib/animAction.cpp index eefe7c5..af62802 100644 --- a/FitdLib/animAction.cpp +++ b/FitdLib/animAction.cpp @@ -158,7 +158,7 @@ void GereFrappe(void) ZVStruct rangeZv; - GiveZVObjet(HQR_Get(listBody, objPtr->body),&rangeZv); + GiveZVObjet(HQR_Get(HQ_Bodys, objPtr->body),&rangeZv); rangeZv.ZVX1 += x; rangeZv.ZVX2 += x; @@ -231,7 +231,7 @@ void GereFrappe(void) actorPtr->roomY = y; actorPtr->roomZ = z; - GiveZVObjet(HQR_Get(listBody,actorPtr->bodyNum),&actorPtr->zv); + GiveZVObjet(HQR_Get(HQ_Bodys,actorPtr->bodyNum),&actorPtr->zv); actorPtr->zv.ZVX1 += x; actorPtr->zv.ZVX2 += x; diff --git a/FitdLib/floor.cpp b/FitdLib/floor.cpp index da9befb..8d063ad 100644 --- a/FitdLib/floor.cpp +++ b/FitdLib/floor.cpp @@ -18,7 +18,7 @@ void LoadEtage(int floorNumber) //stopSounds(); - HQR_Reset(listBody); + HQR_Reset(HQ_Bodys); HQR_Reset(listAnim); g_currentFloor = floorNumber; diff --git a/FitdLib/hqr.cpp b/FitdLib/hqr.cpp index 48cb5e0..073268f 100644 --- a/FitdLib/hqr.cpp +++ b/FitdLib/hqr.cpp @@ -510,7 +510,7 @@ void HQR_Reset(hqrEntryStruct* hqrPtr) hqrPtr->sizeFreeData = hqrPtr->maxFreeData; hqrPtr->numUsedEntry = 0; - if (hqrPtr == listBody) + if (hqrPtr == HQ_Bodys) { for (int i = 0; i < vBodies.size(); i++) { @@ -536,7 +536,7 @@ void HQR_Free(hqrEntryStruct* hqrPtr) if(!hqrPtr) return; - if (hqrPtr == listBody) + if (hqrPtr == HQ_Bodys) { for (int i = 0; i < vBodies.size(); i++) { diff --git a/FitdLib/inventory.cpp b/FitdLib/inventory.cpp index 9013b9c..194884c 100644 --- a/FitdLib/inventory.cpp +++ b/FitdLib/inventory.cpp @@ -95,10 +95,10 @@ void renderInventoryObject(int arg) SetClip(statusLeft,statusTop,statusRight,statusBottom); AffRect(statusLeft,statusTop,statusRight,statusBottom,0); - statusVar1 -= 8; + ShowBeta -= 8; - setCameraTarget(0,0,0,60,statusVar1,0,24000); - AffObjet(0,0,0,0,0,0,currentFoundBody); + setCameraTarget(0,0,0,60,ShowBeta,0,24000); + AffObjet(0,0,0,0,0,0,ShowObjet); if(arg!=-1) { @@ -199,7 +199,7 @@ void processInventory(void) modeSelect = 0; antiBounce = 2; - statusVar1 = 0; + ShowBeta = 0; SaveTimerAnim(); //pauseShaking(); @@ -321,9 +321,9 @@ void processInventory(void) { selectedWorldObjectIdx = DrawListObjets(firstObjectDisplayedIdx,selectedObjectIdx,15); - currentFoundBodyIdx = ListWorldObjets[selectedWorldObjectIdx].foundBody; + ShowBody = ListWorldObjets[selectedWorldObjectIdx].foundBody; - currentFoundBody = HQR_Get(listBody,currentFoundBodyIdx); + ShowObjet = HQR_Get(HQ_Bodys,ShowBody); var_C = ListWorldObjets[selectedWorldObjectIdx].foundFlag; diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index e80674d..8c02a31 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -431,7 +431,7 @@ void doRealZv(tObject* actorPtr) { ZVStruct* zvPtr; - computeScreenBox(0, 0, 0, actorPtr->alpha, actorPtr->beta, actorPtr->gamma, HQR_Get(listBody, actorPtr->bodyNum)); + computeScreenBox(0, 0, 0, actorPtr->alpha, actorPtr->beta, actorPtr->gamma, HQR_Get(HQ_Bodys, actorPtr->bodyNum)); zvPtr = &actorPtr->zv; @@ -769,7 +769,7 @@ void processLife(int lifeNum, bool callFoundLife) gereDecal(); */ } - pBody = HQR_Get(listBody, currentProcessedActorPtr->bodyNum); + pBody = HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum); /* if(gameId >= JACK) { @@ -811,7 +811,7 @@ void processLife(int lifeNum, bool callFoundLife) gereDecal(); */ } - pBody = HQR_Get(listBody, currentProcessedActorPtr->bodyNum); + pBody = HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum); SetAnimObjet(0, pAnim, pBody); InitAnim(param2, 4, -1); @@ -871,7 +871,7 @@ void processLife(int lifeNum, bool callFoundLife) case LM_DO_ROT_ZV: // DO_ROT_ZV { appendFormated("LM_DO_ROT_ZV "); - getZvRot(HQR_Get(listBody, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv, + getZvRot(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv, currentProcessedActorPtr->alpha, currentProcessedActorPtr->beta, currentProcessedActorPtr->gamma); @@ -888,7 +888,7 @@ void processLife(int lifeNum, bool callFoundLife) case LM_DO_MAX_ZV: { appendFormated("LM_DO_MAX_ZV "); - getZvMax(HQR_Get(listBody, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv); + getZvMax(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv); currentProcessedActorPtr->zv.ZVX1 += currentProcessedActorPtr->roomX; currentProcessedActorPtr->zv.ZVX2 += currentProcessedActorPtr->roomX; @@ -902,7 +902,7 @@ void processLife(int lifeNum, bool callFoundLife) case LM_DO_CARRE_ZV: // DO_CARRE_ZV { appendFormated("LM_DO_CARRE_ZV "); - getZvCube(HQR_Get(listBody, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv); + getZvCube(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv); currentProcessedActorPtr->zv.ZVX1 += currentProcessedActorPtr->roomX; currentProcessedActorPtr->zv.ZVX2 += currentProcessedActorPtr->roomX; diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index a35fa3e..8990efa 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -26,7 +26,7 @@ FILE* Open(const char* filename, const char* mode) { return fopen(path.string().c_str(), mode); } -int input5; +int AntiRebond; int* currentCVarTable = NULL; @@ -1171,12 +1171,12 @@ void LoadWorld(void) if(g_gameId == AITD1) { - listBody = HQR_InitRessource(listBodySelect[CVars[getCVarsIdx(CHOOSE_PERSO)]],37000, 50); // was calculated from free mem size + HQ_Bodys = HQR_InitRessource(listBodySelect[CVars[getCVarsIdx(CHOOSE_PERSO)]],37000, 50); // was calculated from free mem size listAnim = HQR_InitRessource(listAnimSelect[CVars[getCVarsIdx(CHOOSE_PERSO)]],30000, 80); // was calculated from free mem size } else { - listBody = HQR_InitRessource("LISTBODY",37000, 50); // was calculated from free mem size + HQ_Bodys = HQR_InitRessource("LISTBODY",37000, 50); // was calculated from free mem size listAnim = HQR_InitRessource("LISTANIM",30000, 80); // was calculated from free mem size listMatrix = HQR_InitRessource("LISTMAT",64000,5); @@ -2388,7 +2388,7 @@ void InitView() cameraBackgroundChanged = true; if (g_gameId >= JACK) { - printf("Load 2d animations"); + printf("Load 2d animations\n"); } cameraDataStruct* pCamera = cameraDataTable[NumCamera]; @@ -3300,7 +3300,7 @@ void mainDraw(int flagFlip) } else { - char* bodyPtr = HQR_Get(listBody, actorPtr->bodyNum); + char* bodyPtr = HQR_Get(HQ_Bodys, actorPtr->bodyNum); if (HQ_Load) { @@ -3537,13 +3537,13 @@ void cleanClip() } } -void drawFoundObect(int menuState,int objectName,int zoomFactor) +void DrawFoundWindow(int menuState,int objectName,int zoomFactor) { cleanClip(); - setCameraTarget(0,0,0,60,statusVar1,0,zoomFactor); + setCameraTarget(0,0,0,60,ShowBeta,0,zoomFactor); - AffObjet(0,0,0,0,0,0, HQR_Get(listBody, currentFoundBodyIdx)); + AffObjet(0,0,0,0,0,0, HQR_Get(HQ_Bodys, ShowBody)); SimpleMessage(160,WindowY1,20,1); SimpleMessage(160,WindowY1+16,objectName,1); @@ -3612,11 +3612,6 @@ void take(int objIdx) void foundObject(int objIdx, int param) { tWorldObject* objPtr; - int var_C = 0; - int var_6 = 1; - int i; - int var_A = 15000; - int var_8 = -200; if(objIdx < 0) return; @@ -3645,34 +3640,39 @@ void foundObject(int objIdx, int param) // setupShaking(1000); // probably to remove the shaking when in foundObject screen int weight = 0; - for(i=0;ipositionInTrack + weight > CVars[getCVarsIdx(MAX_WEIGHT_LOADABLE)] || numObjInInventoryTable[currentInventory] +1 == 30) { - var_6 = 3; + choix = 3; } - currentFoundBodyIdx = objPtr->foundBody; - currentFoundBody = HQR_Get(listBody,currentFoundBodyIdx); + ShowBody = objPtr->foundBody; + ShowObjet = HQR_Get(HQ_Bodys,ShowBody); SetProjection(160,100,128,300,298); - statusVar1 = 0; + int zoom = 15000; + int stepzoom = -200; + ShowBeta = 0; memset(frontBuffer, 0, 320*200); FastCopyScreen(frontBuffer,logicalScreen); AffBigCadre(160,100,240,120); - drawFoundObect(var_6, objPtr->foundName, var_A); + DrawFoundWindow(choix, objPtr->foundName, zoom); osystem_flip(NULL); - input5 = 1; + AntiRebond = 1; - while(!var_C) + int exitflag = 0; + while(!exitflag) { osystem_CopyBlockPhys((unsigned char*)logicalScreen,0,0,320,200); @@ -3683,27 +3683,27 @@ void foundObject(int objIdx, int param) localJoyD = JoyD; localClick = Click; - if(!input5) + if(!AntiRebond) { if(localKey == 1) { - if(var_6 != 2) + if(choix != 2) { - var_6 = 0; + choix = 0; } - var_C = 1; + exitflag = 1; } - if(var_6 != 2) + if(choix != 2) { if(localJoyD&4) { - var_6 = 0; + choix = 0; } if(localJoyD&8) { - var_6 = 1; + choix = 1; } } @@ -3714,33 +3714,33 @@ void foundObject(int objIdx, int param) process_events(); } - var_C = 1; + exitflag = 1; } } else { if(!localKey && !localJoyD && !localClick) - input5 = 0; + AntiRebond = 0; } - statusVar1 -= 8; + ShowBeta -= 8; - var_A += var_8; // zoom / dezoom + zoom += stepzoom; // zoom / dezoom - if(var_A> 8000) // zoom management - var_8 = -var_8; + if(zoom> 8000) // zoom management + stepzoom = -stepzoom; - if(var_A< 25000) - var_8 = -var_8; + if(zoom< 25000) + stepzoom = -stepzoom; - drawFoundObect(var_6,objPtr->foundName,var_A); + DrawFoundWindow(choix,objPtr->foundName,zoom); // menuWaitVSync(); } RestoreTimerAnim(); - if(var_6 == 1) + if(choix == 1) { take(objIdx); } @@ -4210,17 +4210,13 @@ void GereDec() { case 0: { - int x; - int y; - int z; - int oldRoom = currentProcessedActorPtr->room; currentProcessedActorPtr->room = (short)pCurrentZone->parameter; - x = (roomDataTable[currentProcessedActorPtr->room].worldX - roomDataTable[oldRoom].worldX) * 10; - y = (roomDataTable[currentProcessedActorPtr->room].worldY - roomDataTable[oldRoom].worldY) * 10; - z = (roomDataTable[currentProcessedActorPtr->room].worldZ - roomDataTable[oldRoom].worldZ) * 10; + int x = (roomDataTable[currentProcessedActorPtr->room].worldX - roomDataTable[oldRoom].worldX) * 10; + int y = (roomDataTable[currentProcessedActorPtr->room].worldY - roomDataTable[oldRoom].worldY) * 10; + int z = (roomDataTable[currentProcessedActorPtr->room].worldZ - roomDataTable[oldRoom].worldZ) * 10; currentProcessedActorPtr->roomX -= x; currentProcessedActorPtr->roomY += y; @@ -4277,9 +4273,7 @@ void GereDec() } case 10: // stage { - int life; - - life = ListWorldObjets[currentProcessedActorPtr->indexInWorld].floorLife; + int life = ListWorldObjets[currentProcessedActorPtr->indexInWorld].floorLife; if(life==-1) return; @@ -4486,7 +4480,7 @@ void throwStoppedAt(int x, int z) ZVStruct zvLocal; u8* bodyPtr; - bodyPtr = (u8*)HQR_Get(listBody,currentProcessedActorPtr->bodyNum); + bodyPtr = (u8*)HQR_Get(HQ_Bodys,currentProcessedActorPtr->bodyNum); GiveZVObjet((char*)bodyPtr,&zvLocal); @@ -4854,7 +4848,7 @@ void cleanupAndExit(void) HQR_Free(HQ_Memory); HQR_Free(listLife); HQR_Free(listTrack); - HQR_Free(listBody); + HQR_Free(HQ_Bodys); HQR_Free(listAnim); /* free(tabTextes); diff --git a/FitdLib/main.h b/FitdLib/main.h index 108bb95..df68a01 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -1,7 +1,7 @@ #ifndef _MAIN_ #define _MAIN_ -extern int input5; +extern int AntiRebond; void menuWaitVSync(); void AffSpfI(int x, int y, int param, char* gfx); diff --git a/FitdLib/object.cpp b/FitdLib/object.cpp index b111ab1..0f9eb44 100644 --- a/FitdLib/object.cpp +++ b/FitdLib/object.cpp @@ -96,7 +96,7 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x if(body != -1) { - bodyPtr = HQR_Get(listBody,actorPtr->bodyNum); + bodyPtr = HQR_Get(HQ_Bodys,actorPtr->bodyNum); if(anim != -1) { diff --git a/FitdLib/save.cpp b/FitdLib/save.cpp index f6a0ed9..520cc33 100644 --- a/FitdLib/save.cpp +++ b/FitdLib/save.cpp @@ -260,7 +260,7 @@ int loadSave(int saveNumber) if(g_gameId == AITD1) { - configureHqrHero(listBody,listBodySelect[CVars[getCVarsIdx(CHOOSE_PERSO)]]); + configureHqrHero(HQ_Bodys,listBodySelect[CVars[getCVarsIdx(CHOOSE_PERSO)]]); configureHqrHero(listAnim,listAnimSelect[CVars[getCVarsIdx(CHOOSE_PERSO)]]); } else @@ -494,7 +494,7 @@ int loadSave(int saveNumber) { if(objectTable[i].indexInWorld != -1 && objectTable[i].bodyNum != -1) { - char* bodyPtr = HQR_Get(listBody,objectTable[i].bodyNum); + char* bodyPtr = HQR_Get(HQ_Bodys,objectTable[i].bodyNum); if(objectTable[i].ANIM != -1) { diff --git a/FitdLib/systemMenu.cpp b/FitdLib/systemMenu.cpp index 2cab99f..4852c33 100644 --- a/FitdLib/systemMenu.cpp +++ b/FitdLib/systemMenu.cpp @@ -88,7 +88,7 @@ void processSystemMenu(void) localClick = Click; localJoyD = JoyD; - if(!input5) + if(!AntiRebond) { if(localKey == 0x1C || localClick) // enter { @@ -125,7 +125,7 @@ void processSystemMenu(void) if(currentSelectedEntry<0) currentSelectedEntry = 6; - input5 = 1; + AntiRebond = 1; } if(localJoyD == 2) // bottom { @@ -134,7 +134,7 @@ void processSystemMenu(void) if(currentSelectedEntry>6) currentSelectedEntry = 0; - input5 = 1; + AntiRebond = 1; } } } @@ -142,7 +142,7 @@ void processSystemMenu(void) { if(!localKey && !localJoyD) { - input5 = 0; + AntiRebond = 0; } } } diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index e69d65d..8ca552f 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -2,9 +2,9 @@ enum gameTypeEnum g_gameId; -char* currentFoundBody; -int currentFoundBodyIdx; -int statusVar1; +char* ShowObjet; +int ShowBody; +int ShowBeta; hqrEntryStruct* HQ_Memory; @@ -84,7 +84,7 @@ s16 currentWorldTarget; int fileSize; -hqrEntryStruct* listBody = nullptr; +hqrEntryStruct* HQ_Bodys = nullptr; hqrEntryStruct* listAnim = nullptr; hqrEntryStruct* listLife = nullptr; hqrEntryStruct* listTrack = nullptr; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index 36c51af..f6e3c81 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -2,9 +2,9 @@ #include "osystem.h" -extern char* currentFoundBody; -extern int currentFoundBodyIdx; -extern int statusVar1; +extern char* ShowObjet; +extern int ShowBody; +extern int ShowBeta; enum gameTypeEnum { @@ -334,7 +334,7 @@ extern s16 currentWorldTarget; extern int fileSize; -extern hqrEntryStruct* listBody; +extern hqrEntryStruct* HQ_Bodys; extern hqrEntryStruct* listAnim; extern hqrEntryStruct* listLife; extern hqrEntryStruct* listTrack; From 37cc8d5ded2846d6f6479f79bf11b138cb68bfaa Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 16 Jun 2025 00:12:08 -0700 Subject: [PATCH 47/70] Cleanup --- FitdLib/animAction.cpp | 4 + FitdLib/inventory.cpp | 209 ++++++++++++++++++++++++++++++++- FitdLib/main.cpp | 256 ++++------------------------------------- FitdLib/main.h | 2 + FitdLib/renderer.cpp | 13 ++- FitdLib/renderer.h | 1 + FitdLib/vars.cpp | 4 - FitdLib/vars.h | 4 - 8 files changed, 248 insertions(+), 245 deletions(-) diff --git a/FitdLib/animAction.cpp b/FitdLib/animAction.cpp index af62802..f55bbcf 100644 --- a/FitdLib/animAction.cpp +++ b/FitdLib/animAction.cpp @@ -63,6 +63,10 @@ void GereFrappe(void) rangeZv.ZVZ1 = z - range; rangeZv.ZVZ2 = z + range; + if (backgroundMode == backgroundModeEnum_3D) { + drawZv(rangeZv); + } + //drawProjectedBox(rangeZv.ZVX1,rangeZv.ZVX2,rangeZv.ZVY1,rangeZv.ZVY2,rangeZv.ZVZ1,rangeZv.ZVZ2,60,255); collision = checkObjectCollisions(currentProcessedActorIdx,&rangeZv); diff --git a/FitdLib/inventory.cpp b/FitdLib/inventory.cpp index 194884c..228e397 100644 --- a/FitdLib/inventory.cpp +++ b/FitdLib/inventory.cpp @@ -1,5 +1,9 @@ #include "common.h" +sBody* ShowObjet; +int ShowBody; +int ShowBeta; + s16 currentInventory = 0; s16 numObjInInventoryTable[NUM_MAX_INVENTORY]; s16 inHandTable[NUM_MAX_INVENTORY]; @@ -323,7 +327,7 @@ void processInventory(void) ShowBody = ListWorldObjets[selectedWorldObjectIdx].foundBody; - ShowObjet = HQR_Get(HQ_Bodys,ShowBody); + ShowObjet = getBodyFromPtr(HQR_Get(HQ_Bodys,ShowBody)); var_C = ListWorldObjets[selectedWorldObjectIdx].foundFlag; @@ -441,3 +445,206 @@ void processInventory(void) //updateShaking(); } + + +void cleanClip() +{ + for (int x = clipLeft; x < clipRight; x++) + { + for (int y = clipTop; y < clipBottom; y++) + { + logicalScreen[y * 320 + x] = 0; + } + } +} + +void DrawFoundWindow(int menuState, int objectName, int zoomFactor) +{ + cleanClip(); + + setCameraTarget(0, 0, 0, 60, ShowBeta, 0, zoomFactor); + + AffObjet(0, 0, 0, 0, 0, 0, getBodyFromPtr(HQR_Get(HQ_Bodys, ShowBody))); + + SimpleMessage(160, WindowY1, 20, 1); + SimpleMessage(160, WindowY1 + 16, objectName, 1); + SimpleMessage(160, WindowY1 + 16, objectName, 1); + + switch (menuState) + { + case 0: + { + SelectedMessage(130, WindowY2 - 16, 21, 1, 4); + SimpleMessage(190, WindowY2 - 16, 22, 4); + break; + } + case 1: + { + SimpleMessage(130, WindowY2 - 16, 21, 4); + SelectedMessage(190, WindowY2 - 16, 22, 1, 4); + break; + } + case 2: + { + SelectedMessage(160, WindowY2 - 16, 10, 1, 4); + break; + } + } +} + +void foundObject(int objIdx, int param) +{ + tWorldObject* objPtr; + + if (objIdx < 0) + return; + + if (param == 2) + { + printf("foundObject with param == 2\n"); + } + + objPtr = &ListWorldObjets[objIdx]; + + if (param != 0 && (objPtr->foundFlag & 0xC000)) + { + return; + } + + if (objPtr->trackNumber) + { + if (timer - objPtr->trackNumber < 300) // prevent from reopening the window every frame + return; + } + + objPtr->trackNumber = 0; + + SaveTimerAnim(); + // setupShaking(1000); // probably to remove the shaking when in foundObject screen + + int weight = 0; + for (int i = 0; i < numObjInInventoryTable[currentInventory]; i++) + { + weight += ListWorldObjets[inventoryTable[currentInventory][i]].positionInTrack; + } + + int choix = 1; + + if (objPtr->positionInTrack + weight > CVars[getCVarsIdx(MAX_WEIGHT_LOADABLE)] || numObjInInventoryTable[currentInventory] + 1 == 30) + { + choix = 3; + } + + ShowBody = objPtr->foundBody; + ShowObjet = getBodyFromPtr(HQR_Get(HQ_Bodys, ShowBody)); + + SetProjection(160, 100, 128, 300, 298); + + int zoom = 15000; + int stepzoom = -200; + ShowBeta = 0; + + memset(frontBuffer, 0, 320 * 200); + FastCopyScreen(frontBuffer, logicalScreen); + + AffBigCadre(160, 100, 240, 120); + + DrawFoundWindow(choix, objPtr->foundName, zoom); + osystem_flip(NULL); + + AntiRebond = 1; + + int exitflag = 0; + while (!exitflag) + { + osystem_CopyBlockPhys((unsigned char*)logicalScreen, 0, 0, 320, 200); + + process_events(); + osystem_drawBackground(); + + localKey = key; + localJoyD = JoyD; + localClick = Click; + + if (!AntiRebond) + { + if (localKey == 1) + { + if (choix != 2) + { + choix = 0; + } + + exitflag = 1; + } + if (choix != 2) + { + if (localJoyD & 4) + { + choix = 0; + } + + if (localJoyD & 8) + { + choix = 1; + } + } + + if (localKey == 28 || localClick != 0) + { + while (key) + { + process_events(); + } + + exitflag = 1; + } + } + else + { + if (!localKey && !localJoyD && !localClick) + AntiRebond = 0; + } + + ShowBeta -= 8; + + zoom += stepzoom; // zoom / dezoom + + if (zoom > 8000) // zoom management + stepzoom = -stepzoom; + + if (zoom < 25000) + stepzoom = -stepzoom; + + DrawFoundWindow(choix, objPtr->foundName, zoom); + + // menuWaitVSync(); + } + + RestoreTimerAnim(); + + if (choix == 1) + { + take(objIdx); + } + else + { + objPtr->trackNumber = timer; + } + + while (key && Click) + { + process_events(); + } + + localJoyD = 0; + localKey = 0; + localClick = 0; + + // if(mainLoopVar1 != 0) + { + //setupShaking(-600); + } + + FlagInitView = 1; +} \ No newline at end of file diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 8990efa..cf31e54 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -2646,6 +2646,25 @@ void drawProjectedLine(s32 x1s, s32 y1s, s32 z1s, s32 x2s, s32 y2s, s32 z2s,int #endif } +void drawZv(const ZVStruct& localZv) { + // bottom + drawProjectedLine(localZv.ZVX1, localZv.ZVY2, localZv.ZVZ1, localZv.ZVX1, localZv.ZVY2, localZv.ZVZ2, 10); + drawProjectedLine(localZv.ZVX1, localZv.ZVY2, localZv.ZVZ2, localZv.ZVX2, localZv.ZVY2, localZv.ZVZ2, 10); + drawProjectedLine(localZv.ZVX2, localZv.ZVY2, localZv.ZVZ2, localZv.ZVX2, localZv.ZVY2, localZv.ZVZ1, 10); + drawProjectedLine(localZv.ZVX2, localZv.ZVY2, localZv.ZVZ1, localZv.ZVX1, localZv.ZVY2, localZv.ZVZ1, 10); + + // top + drawProjectedLine(localZv.ZVX1, localZv.ZVY1, localZv.ZVZ1, localZv.ZVX1, localZv.ZVY1, localZv.ZVZ2, 10); + drawProjectedLine(localZv.ZVX1, localZv.ZVY1, localZv.ZVZ2, localZv.ZVX2, localZv.ZVY1, localZv.ZVZ2, 10); + drawProjectedLine(localZv.ZVX2, localZv.ZVY1, localZv.ZVZ2, localZv.ZVX2, localZv.ZVY1, localZv.ZVZ1, 10); + drawProjectedLine(localZv.ZVX2, localZv.ZVY1, localZv.ZVZ1, localZv.ZVX1, localZv.ZVY1, localZv.ZVZ1, 10); + + drawProjectedLine(localZv.ZVX1, localZv.ZVY2, localZv.ZVZ1, localZv.ZVX1, localZv.ZVY1, localZv.ZVZ1, 10); + drawProjectedLine(localZv.ZVX1, localZv.ZVY2, localZv.ZVZ2, localZv.ZVX1, localZv.ZVY1, localZv.ZVZ2, 10); + drawProjectedLine(localZv.ZVX2, localZv.ZVY2, localZv.ZVZ2, localZv.ZVX2, localZv.ZVY1, localZv.ZVZ2, 10); + drawProjectedLine(localZv.ZVX2, localZv.ZVY2, localZv.ZVZ1, localZv.ZVX2, localZv.ZVY1, localZv.ZVZ1, 10); +} + void drawZv(tObject* actorPtr) { ZVStruct localZv; @@ -2662,32 +2681,7 @@ void drawZv(tObject* actorPtr) copyZv(&actorPtr->zv,&localZv); } - - // bottom - drawProjectedLine( localZv.ZVX1, - localZv.ZVY2, - localZv.ZVZ1, - localZv.ZVX1, - localZv.ZVY2, - localZv.ZVZ2, - 10); - - drawProjectedLine(localZv.ZVX1,localZv.ZVY2,localZv.ZVZ2,localZv.ZVX2,localZv.ZVY2,localZv.ZVZ2,10); - drawProjectedLine(localZv.ZVX2,localZv.ZVY2,localZv.ZVZ2,localZv.ZVX2,localZv.ZVY2,localZv.ZVZ1,10); - drawProjectedLine(localZv.ZVX2,localZv.ZVY2,localZv.ZVZ1,localZv.ZVX1,localZv.ZVY2,localZv.ZVZ1,10); - - // top - drawProjectedLine(localZv.ZVX1,localZv.ZVY1,localZv.ZVZ1,localZv.ZVX1,localZv.ZVY1,localZv.ZVZ2,10); - drawProjectedLine(localZv.ZVX1,localZv.ZVY1,localZv.ZVZ2,localZv.ZVX2,localZv.ZVY1,localZv.ZVZ2,10); - drawProjectedLine(localZv.ZVX2,localZv.ZVY1,localZv.ZVZ2,localZv.ZVX2,localZv.ZVY1,localZv.ZVZ1,10); - drawProjectedLine(localZv.ZVX2,localZv.ZVY1,localZv.ZVZ1,localZv.ZVX1,localZv.ZVY1,localZv.ZVZ1,10); - - drawProjectedLine( localZv.ZVX1,localZv.ZVY2,localZv.ZVZ1, localZv.ZVX1,localZv.ZVY1,localZv.ZVZ1,10); - drawProjectedLine( localZv.ZVX1,localZv.ZVY2,localZv.ZVZ2, localZv.ZVX1,localZv.ZVY1,localZv.ZVZ2,10); - drawProjectedLine( localZv.ZVX2,localZv.ZVY2,localZv.ZVZ2, localZv.ZVX2,localZv.ZVY1,localZv.ZVZ2,10); - drawProjectedLine( localZv.ZVX2,localZv.ZVY2,localZv.ZVZ1, localZv.ZVX2,localZv.ZVY1,localZv.ZVZ1,10); - - + drawZv(localZv); } void drawConverZone(cameraZoneEntryStruct* zonePtr) @@ -3204,7 +3198,7 @@ void getHotPoint(int hotPointIdx, char* bodyPtr, point3dStruct* hotPoint) ASSERT(hotPointIdx < offset); if(hotPointIdx < offset) - { + { int pointIdx; s16* source; @@ -3213,7 +3207,7 @@ void getHotPoint(int hotPointIdx, char* bodyPtr, point3dStruct* hotPoint) bodyPtr+=hotPointIdx*0x18; } else - { + { bodyPtr+=hotPointIdx*16; } @@ -3300,7 +3294,7 @@ void mainDraw(int flagFlip) } else { - char* bodyPtr = HQR_Get(HQ_Bodys, actorPtr->bodyNum); + sBody* bodyPtr = getBodyFromPtr(HQR_Get(HQ_Bodys, actorPtr->bodyNum)); if (HQ_Load) { @@ -3314,7 +3308,7 @@ void mainDraw(int flagFlip) { if (actorPtr->hotPointID != -1) { - getHotPoint(actorPtr->hotPointID, bodyPtr, &actorPtr->hotPoint); + getHotPoint(actorPtr->hotPointID, (char*)bodyPtr->m_raw, &actorPtr->hotPoint); } } @@ -3526,51 +3520,6 @@ int checkObjectCollisions(int actorIdx, ZVStruct* zvPtr) return(currentCollisionSlot); } -void cleanClip() -{ - for(int x=clipLeft; xstage = -1; } -void foundObject(int objIdx, int param) -{ - tWorldObject* objPtr; - - if(objIdx < 0) - return; - - if(param == 2) - { - printf("foundObject with param == 2\n"); - } - - objPtr = &ListWorldObjets[objIdx]; - - if( param != 0 && (objPtr->foundFlag & 0xC000)) - { - return; - } - - if(objPtr->trackNumber) - { - if(timer - objPtr->trackNumber < 300) // prevent from reopening the window every frame - return; - } - - objPtr->trackNumber = 0; - - SaveTimerAnim(); - // setupShaking(1000); // probably to remove the shaking when in foundObject screen - - int weight = 0; - for(int i=0;ipositionInTrack + weight > CVars[getCVarsIdx(MAX_WEIGHT_LOADABLE)] || numObjInInventoryTable[currentInventory] +1 == 30) - { - choix = 3; - } - - ShowBody = objPtr->foundBody; - ShowObjet = HQR_Get(HQ_Bodys,ShowBody); - - SetProjection(160,100,128,300,298); - - int zoom = 15000; - int stepzoom = -200; - ShowBeta = 0; - - memset(frontBuffer, 0, 320*200); - FastCopyScreen(frontBuffer,logicalScreen); - - AffBigCadre(160,100,240,120); - - DrawFoundWindow(choix, objPtr->foundName, zoom); - osystem_flip(NULL); - - AntiRebond = 1; - - int exitflag = 0; - while(!exitflag) - { - osystem_CopyBlockPhys((unsigned char*)logicalScreen,0,0,320,200); - - process_events(); - osystem_drawBackground(); - - localKey = key; - localJoyD = JoyD; - localClick = Click; - - if(!AntiRebond) - { - if(localKey == 1) - { - if(choix != 2) - { - choix = 0; - } - - exitflag = 1; - } - if(choix != 2) - { - if(localJoyD&4) - { - choix = 0; - } - - if(localJoyD&8) - { - choix = 1; - } - } - - if(localKey == 28 || localClick !=0) - { - while(key) - { - process_events(); - } - - exitflag = 1; - } - } - else - { - if(!localKey && !localJoyD && !localClick) - AntiRebond = 0; - } - - ShowBeta -= 8; - - zoom += stepzoom; // zoom / dezoom - - if(zoom> 8000) // zoom management - stepzoom = -stepzoom; - - if(zoom< 25000) - stepzoom = -stepzoom; - - DrawFoundWindow(choix,objPtr->foundName,zoom); - - // menuWaitVSync(); - } - - RestoreTimerAnim(); - - if(choix == 1) - { - take(objIdx); - } - else - { - objPtr->trackNumber = timer; - } - - while(key && Click) - { - process_events(); - } - - localJoyD = 0; - localKey = 0; - localClick = 0; - - // if(mainLoopVar1 != 0) - { - //setupShaking(-600); - } - - FlagInitView = 1; -} - void hardColSuB1Sub1(int flag) { switch(flag) diff --git a/FitdLib/main.h b/FitdLib/main.h index df68a01..8e9ae43 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -50,6 +50,8 @@ void getZvCube(char* bodyPtr, ZVStruct* zvPtr); void PutAtObjet(int objIdx, int objIdxToPutAt); void SetClip(int left, int top, int right, int bottom); +void drawZv(const ZVStruct& localZv); + /// void readBook(int index, int type); int Lire(int index, int left, int top, int right, int bottom, int mode, int color, int shadow); diff --git a/FitdLib/renderer.cpp b/FitdLib/renderer.cpp index 95d81ed..aabdd33 100644 --- a/FitdLib/renderer.cpp +++ b/FitdLib/renderer.cpp @@ -958,10 +958,9 @@ renderFunction renderFunctions[]={ renderZixel, }; -int AffObjet(int x,int y,int z,int alpha,int beta,int gamma,void* modelPtr) -{ - sBody* pBody = getBodyFromPtr(modelPtr); - char* ptr = (char*)modelPtr; +int AffObjet(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) +{ + char* ptr = (char*)pBody->m_raw; int numPrim; int i; char* out; @@ -1143,6 +1142,12 @@ int AffObjet(int x,int y,int z,int alpha,int beta,int gamma,void* modelPtr) return(0); } +int AffObjet(int x, int y, int z, int alpha, int beta, int gamma, void* modelPtr) +{ + sBody* pBody = getBodyFromPtr(modelPtr); + return AffObjet(x, y, z, alpha, beta, gamma, pBody); +} + void computeScreenBox(int x, int y, int z, int alpha, int beta, int gamma, char* bodyPtr) { sBody* pBody = getBodyFromPtr(bodyPtr); diff --git a/FitdLib/renderer.h b/FitdLib/renderer.h index 56faee8..5b4ddd9 100644 --- a/FitdLib/renderer.h +++ b/FitdLib/renderer.h @@ -14,6 +14,7 @@ extern int numOfPoints; void transformPoint(float* ax, float* bx, float* cx); +int AffObjet(int x, int y, int z, int alpha, int beta, int gamma, sBody* pBody); int AffObjet(int var0,int var1,int var2,int var3,int var4,int var5,void* modelPtr); void computeScreenBox(int x, int y, int z, int alpha, int beta, int gamma, char* bodyPtr); diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index 8ca552f..d2f72d4 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -2,10 +2,6 @@ enum gameTypeEnum g_gameId; -char* ShowObjet; -int ShowBody; -int ShowBeta; - hqrEntryStruct* HQ_Memory; int videoMode; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index f6e3c81..68b903c 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -2,10 +2,6 @@ #include "osystem.h" -extern char* ShowObjet; -extern int ShowBody; -extern int ShowBeta; - enum gameTypeEnum { AITD1, From 3391dc789fa2dc47f2cc335d0538fb56ffd302b1 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:39:11 -0700 Subject: [PATCH 48/70] Update README.md --- README.md | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 357a637..505a162 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,28 @@ Free in the Dark, a Alone in the Dark engine reimplementation. -Long overdue source code update from the version that was released on source forge in the 2000s. -Only buildable with Visual Studio 2022 for now but other platform should be fairly straight forward. +The goal of this project is to make playable on modern machines the "Alone in the Dark" (AITD) games released from 1992 to 1995 by Infograms. +The focus is on the versions currently available on Steam and GOG (some other versions like Alone in the Dark 3 windows versions are incompatible for now). -Rendering is being rewritten to bgfx, for better portability. There is still some graphical artifacts. +Steam: +* [Alone in the Dark 1](https://store.steampowered.com/app/548090/Alone_in_the_Dark_1/) +* [Alone in the Dark 2](https://store.steampowered.com/app/548890/Alone_in_the_Dark_2/) +* [Alone in the Dark 3](https://store.steampowered.com/app/548900/Alone_in_the_Dark_3/) + +[GOG](https://www.gog.com/en/game/alone_in_the_dark_the_trilogy_123) version available as a trilogy. + +Jack in the Dark that was included in some releases is also supported. + +Additionaly, there is (very) early support for "Timegate: Knights Chase" released by Infogram in 1995 using a slightly upgraded engine. + +[Steam](https://store.steampowered.com/app/781280/Time_Gate_Knights_Chase/) version, and [GOG](https://www.gog.com/en/game/time_gate_knights_chase) versions. + +## Status +* Graphical issues and missing features in all games +* AITD1 was completable at some point (with some missing features), but might have regressed +* Jack in the Dark was also completable at some point. +* Other games are considered non-completable due to a variety of missing features or bugs. +* Current focus is to make games completable and fixing some of the graphics shortcomings. ## Build instructions * Requires VS2022 with CMake module installed (you can also provide your own cmake but vs2022.bat won't work out of the box). From 2724f36b82f3f27d2d8c5fc24c671497688d985a Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:23:49 -0700 Subject: [PATCH 49/70] Body rework --- FitdLib/main.cpp | 65 ++++++++---------------------------------------- 1 file changed, 11 insertions(+), 54 deletions(-) diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index cf31e54..7ea108f 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -3171,68 +3171,25 @@ void mainDrawSub2(int actorIdx) // draw flow // TODO: finish } -void getHotPoint(int hotPointIdx, char* bodyPtr, point3dStruct* hotPoint) +void getHotPoint(int hotPointIdx, sBody* bodyPtr, point3dStruct* hotPoint) { - s16 flag; + hotPoint->x = 0; + hotPoint->y = 0; + hotPoint->z = 0; - flag = *(s16*)bodyPtr; - bodyPtr += 2; - - if(flag&2) - { - s16 offset; - bodyPtr += 12; - - offset = *(s16*)bodyPtr; - bodyPtr+=2; - bodyPtr+=offset; - - offset = *(s16*)bodyPtr; // num points - bodyPtr+=2; - bodyPtr+=offset*6; // skip point buffer - - offset = *(s16*)bodyPtr; // num bones - bodyPtr+=2; - bodyPtr+=offset*2; // skip bone buffer - - ASSERT(hotPointIdx < offset); - - if(hotPointIdx < offset) + if(bodyPtr->m_flags &2) { - int pointIdx; - s16* source; + ASSERT(hotPointIdx < bodyPtr->m_groups.size()); - if(flag&INFO_OPTIMISE) - { - bodyPtr+=hotPointIdx*0x18; - } - else + if(hotPointIdx < bodyPtr->m_groups.size()) { - bodyPtr+=hotPointIdx*16; - } - - pointIdx = *(s16*)(bodyPtr+4); // first point - - //ASSERT(pointIdx > 0 && pointIdx < 1200); + auto& group = bodyPtr->m_groups[bodyPtr->m_groupOrder[hotPointIdx]]; - source = (s16*)(((char*)pointBuffer) + pointIdx); + int pointIdx = group.m_baseVertices; // first point + auto& vertex = bodyPtr->m_vertices[pointIdx]; - hotPoint->x = source[0]; - hotPoint->y = source[1]; - hotPoint->z = source[2]; + *hotPoint = vertex; } - else - { - hotPoint->x = 0; - hotPoint->y = 0; - hotPoint->z = 0; - } - } - else - { - hotPoint->x = 0; - hotPoint->y = 0; - hotPoint->z = 0; } } From 39f25aefb5c218cd5f02be4fa7aef4fd7bdfeeaf Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 16 Jun 2025 18:49:03 -0700 Subject: [PATCH 50/70] Fix build --- FitdLib/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 7ea108f..cc73d2e 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -3265,7 +3265,7 @@ void mainDraw(int flagFlip) { if (actorPtr->hotPointID != -1) { - getHotPoint(actorPtr->hotPointID, (char*)bodyPtr->m_raw, &actorPtr->hotPoint); + getHotPoint(actorPtr->hotPointID, bodyPtr, &actorPtr->hotPoint); } } From 55061360e222e6e00cefdb74123b03496101490a Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 16 Jun 2025 18:49:15 -0700 Subject: [PATCH 51/70] Switch ZV code to proper body --- FitdLib/animAction.cpp | 4 +- FitdLib/life.cpp | 6 +- FitdLib/main.cpp | 117 +--------------------------------- FitdLib/main.h | 7 +-- FitdLib/object.cpp | 9 +-- FitdLib/zv.cpp | 140 ++++++++++++++++++++++++++++++++++------- FitdLib/zv.h | 8 +-- 7 files changed, 136 insertions(+), 155 deletions(-) diff --git a/FitdLib/animAction.cpp b/FitdLib/animAction.cpp index f55bbcf..8d10555 100644 --- a/FitdLib/animAction.cpp +++ b/FitdLib/animAction.cpp @@ -162,7 +162,7 @@ void GereFrappe(void) ZVStruct rangeZv; - GiveZVObjet(HQR_Get(HQ_Bodys, objPtr->body),&rangeZv); + GiveZVObjet(getBodyFromPtr(HQR_Get(HQ_Bodys, objPtr->body)),&rangeZv); rangeZv.ZVX1 += x; rangeZv.ZVX2 += x; @@ -235,7 +235,7 @@ void GereFrappe(void) actorPtr->roomY = y; actorPtr->roomZ = z; - GiveZVObjet(HQR_Get(HQ_Bodys,actorPtr->bodyNum),&actorPtr->zv); + GiveZVObjet(getBodyFromPtr(HQR_Get(HQ_Bodys,actorPtr->bodyNum)),&actorPtr->zv); actorPtr->zv.ZVX1 += x; actorPtr->zv.ZVX2 += x; diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index 8c02a31..cd70c3a 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -871,7 +871,7 @@ void processLife(int lifeNum, bool callFoundLife) case LM_DO_ROT_ZV: // DO_ROT_ZV { appendFormated("LM_DO_ROT_ZV "); - getZvRot(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv, + getZvRot(getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)), ¤tProcessedActorPtr->zv, currentProcessedActorPtr->alpha, currentProcessedActorPtr->beta, currentProcessedActorPtr->gamma); @@ -888,7 +888,7 @@ void processLife(int lifeNum, bool callFoundLife) case LM_DO_MAX_ZV: { appendFormated("LM_DO_MAX_ZV "); - getZvMax(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv); + getZvMax(getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)), ¤tProcessedActorPtr->zv); currentProcessedActorPtr->zv.ZVX1 += currentProcessedActorPtr->roomX; currentProcessedActorPtr->zv.ZVX2 += currentProcessedActorPtr->roomX; @@ -902,7 +902,7 @@ void processLife(int lifeNum, bool callFoundLife) case LM_DO_CARRE_ZV: // DO_CARRE_ZV { appendFormated("LM_DO_CARRE_ZV "); - getZvCube(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv); + getZvCube(getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)), ¤tProcessedActorPtr->zv); currentProcessedActorPtr->zv.ZVX1 += currentProcessedActorPtr->roomX; currentProcessedActorPtr->zv.ZVX2 += currentProcessedActorPtr->roomX; diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index cc73d2e..26b0681 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -1777,116 +1777,6 @@ void pointRotate(int x, int y, int z, int* destX, int* destY, int* destZ) } } -void zvRotSub(int X, int Y, int Z, int alpha, int beta, int gamma) -{ - if( alpha || beta || gamma ) - { - setupPointRotate(alpha,beta,gamma); - pointRotate(X, Y, Z, &animMoveX,&animMoveY,&animMoveZ); - } - else - { - animMoveX = X; - animMoveY = Y; - animMoveZ = Z; - } -} - -void getZvRot(char* bodyPtr, ZVStruct* zvPtr, int alpha, int beta, int gamma) -{ - int X1 = 32000; - int Y1 = 32000; - int Z1 = 32000; - - int X2 = -32000; - int Y2 = -32000; - int Z2 = -32000; - - int i; - int tempX; - int tempY; - int tempZ; - - GiveZVObjet(bodyPtr, zvPtr); - - for(i=0;i<8;i++) - { - switch(i) - { - case 0: - { - tempX = zvPtr->ZVX1; - tempY = zvPtr->ZVY1; - tempZ = zvPtr->ZVZ1; - break; - } - case 1: - { - tempZ = zvPtr->ZVZ2; - break; - } - case 2: - { - tempX = zvPtr->ZVX2; - break; - } - case 3: - { - tempZ = zvPtr->ZVZ1; - break; - } - case 4: - { - tempY = zvPtr->ZVY2; - break; - } - case 5: - { - tempX = zvPtr->ZVX1; - break; - } - case 6: - { - tempZ = zvPtr->ZVZ2; - break; - } - case 7: - { - tempX = zvPtr->ZVX2; - break; - } - } - - zvRotSub(tempX, tempY, tempZ, alpha, beta, gamma); - - if(animMoveXX2) - X2 = animMoveX; - - if(animMoveYY2) - Y2 = animMoveY; - - if(animMoveZZ2) - Z2 = animMoveZ; - - } - - zvPtr->ZVX1 = X1; - zvPtr->ZVX2 = X2; - zvPtr->ZVY1 = Y1; - zvPtr->ZVY2 = Y2; - zvPtr->ZVZ1 = Z1; - zvPtr->ZVZ2 = Z2; -} - void copyZv(ZVStruct* source, ZVStruct* dest) { memcpy(dest,source,sizeof(ZVStruct)); @@ -4227,11 +4117,10 @@ void throwStoppedAt(int x, int z) ZVStruct zvCopy; ZVStruct zvLocal; - u8* bodyPtr; - bodyPtr = (u8*)HQR_Get(HQ_Bodys,currentProcessedActorPtr->bodyNum); + sBody* bodyPtr = getBodyFromPtr(HQR_Get(HQ_Bodys,currentProcessedActorPtr->bodyNum)); - GiveZVObjet((char*)bodyPtr,&zvLocal); + GiveZVObjet(bodyPtr,&zvLocal); x2 = x; y2 = (currentProcessedActorPtr->roomY/2000)*2000; @@ -4301,7 +4190,7 @@ void throwStoppedAt(int x, int z) currentProcessedActorPtr->speed = 0; currentProcessedActorPtr->gamma = 0; - GiveZVObjet((char*)bodyPtr,¤tProcessedActorPtr->zv); + GiveZVObjet(bodyPtr,¤tProcessedActorPtr->zv); currentProcessedActorPtr->zv.ZVX1 += x2; currentProcessedActorPtr->zv.ZVX2 += x2; diff --git a/FitdLib/main.h b/FitdLib/main.h index 8e9ae43..ccb368a 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -16,7 +16,6 @@ void GenereAffList(); void mainDraw(int mode); int checkObjectCollisions(int actorIdx, ZVStruct* zvPtr); int checkLineProjectionWithActors( int actorIdx, int X, int Y, int Z, int beta, int room, int param ); -void GiveZVObjet(char* bodyPtr, ZVStruct* zvPtr); int AsmCheckListCol(ZVStruct* zvPtr, roomDataStruct* pRoomData); void DeleteInventoryObjet(int objIdx); void walkStep(int angle1, int angle2, int angle3); @@ -46,7 +45,6 @@ void take(int objIdx); void foundObject(int objIdx, int param); void hit(int animNumber,int arg_2,int arg_4,int arg_6,int hitForce,int arg_A); int checkZvCollision(ZVStruct* zvPtr1,ZVStruct* zvPtr2); -void getZvCube(char* bodyPtr, ZVStruct* zvPtr); void PutAtObjet(int objIdx, int objIdxToPutAt); void SetClip(int left, int top, int right, int bottom); @@ -72,9 +70,10 @@ int drawTextOverlay(void); s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr); void handleCollision(ZVStruct* startZv, ZVStruct* zvPtr2, ZVStruct* zvPtr3); -void getZvRot(char* bodyPtr, ZVStruct* zvPtr, int alpha, int beta, int gamma); - void addActorToBgInscrust(int actorIdx); +void setupPointRotate(int alpha, int beta, int gamma); +void pointRotate(int x, int y, int z, int* destX, int* destY, int* destZ); + #endif diff --git a/FitdLib/object.cpp b/FitdLib/object.cpp index 0f9eb44..22ccf47 100644 --- a/FitdLib/object.cpp +++ b/FitdLib/object.cpp @@ -4,8 +4,7 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x { int i; int j; - tObject* actorPtr = objectTable.data(); - char* bodyPtr; + tObject* actorPtr = objectTable.data(); ZVStruct* zvPtr; for(i=0;iHIT = -1; actorPtr->HIT_BY = -1; + sBody* bodyPtr = nullptr; + if(body != -1) { - bodyPtr = HQR_Get(HQ_Bodys,actorPtr->bodyNum); + bodyPtr = getBodyFromPtr(HQR_Get(HQ_Bodys,actorPtr->bodyNum)); if(anim != -1) { char* animPtr = HQR_Get(listAnim,anim); - SetAnimObjet(frame,animPtr,bodyPtr); + SetAnimObjet(frame,animPtr,(char*)bodyPtr->m_raw); actorPtr->numOfFrames = GetNbFramesAnim(animPtr); actorPtr->flagEndAnim = 0; diff --git a/FitdLib/zv.cpp b/FitdLib/zv.cpp index 7b302a8..b59a760 100644 --- a/FitdLib/zv.cpp +++ b/FitdLib/zv.cpp @@ -1,34 +1,16 @@ #include "common.h" -void getZvCube(char* bodyPtr, ZVStruct* zvPtr) +void getZvCube(sBody* bodyPtr, ZVStruct* zvPtr) { - s16* ptr; - - ptr = (s16*)(bodyPtr+2); - - zvPtr->ZVX1 = *(ptr++); - zvPtr->ZVX2 = *(ptr++); - zvPtr->ZVY1 = *(ptr++); - zvPtr->ZVY2 = *(ptr++); - zvPtr->ZVZ1 = *(ptr++); - zvPtr->ZVZ2 = *(ptr++); - + *zvPtr = bodyPtr->m_zv; + zvPtr->ZVZ2 = zvPtr->ZVX2 = (zvPtr->ZVX2 + zvPtr->ZVZ2)/2; zvPtr->ZVX1 = zvPtr->ZVZ1 = -zvPtr->ZVZ2; } -void GiveZVObjet(char* bodyPtr, ZVStruct* zvPtr) +void GiveZVObjet(sBody* bodyPtr, ZVStruct* zvPtr) { - s16* ptr; - - ptr = (s16*)(bodyPtr+2); - - zvPtr->ZVX1 = *(ptr++); - zvPtr->ZVX2 = *(ptr++); - zvPtr->ZVY1 = *(ptr++); - zvPtr->ZVY2 = *(ptr++); - zvPtr->ZVZ1 = *(ptr++); - zvPtr->ZVZ2 = *(ptr++); + *zvPtr = bodyPtr->m_zv; } void makeDefaultZV(ZVStruct* zvPtr) @@ -43,7 +25,7 @@ void makeDefaultZV(ZVStruct* zvPtr) zvPtr->ZVZ2 = 100; } -void getZvMax(char* bodyPtr, ZVStruct* zvPtr) +void getZvMax(sBody* bodyPtr, ZVStruct* zvPtr) { int x1; int x2; @@ -74,3 +56,113 @@ void getZvMax(char* bodyPtr, ZVStruct* zvPtr) zvPtr->ZVZ1 = -x2; zvPtr->ZVZ2 = x2; } + +void zvRotSub(int X, int Y, int Z, int alpha, int beta, int gamma) +{ + if (alpha || beta || gamma) + { + setupPointRotate(alpha, beta, gamma); + pointRotate(X, Y, Z, &animMoveX, &animMoveY, &animMoveZ); + } + else + { + animMoveX = X; + animMoveY = Y; + animMoveZ = Z; + } +} + +void getZvRot(sBody* bodyPtr, ZVStruct* zvPtr, int alpha, int beta, int gamma) +{ + int X1 = 32000; + int Y1 = 32000; + int Z1 = 32000; + + int X2 = -32000; + int Y2 = -32000; + int Z2 = -32000; + + int i; + int tempX; + int tempY; + int tempZ; + + GiveZVObjet(bodyPtr, zvPtr); + + for (i = 0; i < 8; i++) + { + switch (i) + { + case 0: + { + tempX = zvPtr->ZVX1; + tempY = zvPtr->ZVY1; + tempZ = zvPtr->ZVZ1; + break; + } + case 1: + { + tempZ = zvPtr->ZVZ2; + break; + } + case 2: + { + tempX = zvPtr->ZVX2; + break; + } + case 3: + { + tempZ = zvPtr->ZVZ1; + break; + } + case 4: + { + tempY = zvPtr->ZVY2; + break; + } + case 5: + { + tempX = zvPtr->ZVX1; + break; + } + case 6: + { + tempZ = zvPtr->ZVZ2; + break; + } + case 7: + { + tempX = zvPtr->ZVX2; + break; + } + } + + zvRotSub(tempX, tempY, tempZ, alpha, beta, gamma); + + if (animMoveX < X1) + X1 = animMoveX; + + if (animMoveX > X2) + X2 = animMoveX; + + if (animMoveY < Y1) + Y1 = animMoveY; + + if (animMoveY > Y2) + Y2 = animMoveY; + + if (animMoveZ < Z1) + Z1 = animMoveZ; + + if (animMoveZ > Z2) + Z2 = animMoveZ; + + } + + zvPtr->ZVX1 = X1; + zvPtr->ZVX2 = X2; + zvPtr->ZVY1 = Y1; + zvPtr->ZVY2 = Y2; + zvPtr->ZVZ1 = Z1; + zvPtr->ZVZ2 = Z2; +} diff --git a/FitdLib/zv.h b/FitdLib/zv.h index a0d85ac..ad47f74 100644 --- a/FitdLib/zv.h +++ b/FitdLib/zv.h @@ -1,8 +1,8 @@ #ifndef _ZV_H_ #define _ZV_H_ -void getZvCube(char* bodyPtr, ZVStruct* zvPtr); -void GiveZVObjet(char* bodyPtr, ZVStruct* zvPtr); -void getZvMax(char* bodyPtr, ZVStruct* zvPtr); +void getZvCube(sBody* bodyPtr, ZVStruct* zvPtr); +void GiveZVObjet(sBody* bodyPtr, ZVStruct* zvPtr); +void getZvMax(sBody* bodyPtr, ZVStruct* zvPtr); +void getZvRot(sBody* bodyPtr, ZVStruct* zvPtr, int alpha, int beta, int gamma); void makeDefaultZV(ZVStruct* zvPtr); -void getZvMax(char* bodyPtr, ZVStruct* zvPtr); #endif From 5f9a8e18e11f6177e1afa4ed9c504136ebe7083e Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 16 Jun 2025 20:53:20 -0700 Subject: [PATCH 52/70] Rewrite body --- FitdLib/anim.cpp | 318 +++++++++++++------------------------------ FitdLib/anim.h | 8 +- FitdLib/hqr.cpp | 2 +- FitdLib/life.cpp | 48 +++---- FitdLib/main.cpp | 6 +- FitdLib/main.h | 2 - FitdLib/object.cpp | 2 +- FitdLib/renderer.cpp | 160 +++++----------------- FitdLib/renderer.h | 2 +- FitdLib/save.cpp | 2 +- FitdLib/vars.cpp | 1 - FitdLib/vars.h | 38 ++++-- FitdLib/zv.cpp | 17 ++- 13 files changed, 196 insertions(+), 410 deletions(-) diff --git a/FitdLib/anim.cpp b/FitdLib/anim.cpp index ef317b2..52d3479 100644 --- a/FitdLib/anim.cpp +++ b/FitdLib/anim.cpp @@ -2,42 +2,30 @@ #include "common.h" -std::unordered_map g_bodyBufferMap; - -int SetAnimObjet(int frame, char* anim, char* body) +int SetAnimObjet(int frame, char* anim, sBody* body) { sAnimation* pAnimation = getAnimationFromPtr(anim); - s16 temp; - s16 ax; - s16 cx; s16 bx; - char* saveAnim; - int i; - int flag; - - flag = (*(s16*)body); - temp = *(s16*)anim; anim+=2; - if(frame >= temp) + if(frame >= pAnimation->m_numFrames) { return(0); } - ax = *(s16*)anim; + int numGroupsInAnimation = pAnimation->m_numGroups; anim+=2; - cx = ax; - - if(flag&INFO_OPTIMISE) + int ax; + if(body->m_flags & INFO_OPTIMISE) { - ax = ((ax<<4)+8)*frame; + ax = ((numGroupsInAnimation <<4)+8)*frame; } else { - ax = ((ax+1)<<3)*frame; + ax = ((numGroupsInAnimation +1)<<3)*frame; } anim+=ax; @@ -45,82 +33,38 @@ int SetAnimObjet(int frame, char* anim, char* body) animCurrentTime = *(s16*)anim; animKeyframeLength = animCurrentTime; - if(!(flag&2)) + if(!(body->m_flags & INFO_ANIM)) { return(0); } - body +=14; - - g_bodyBufferMap[body + 2] = anim; - *(u16*)(body+6) = timer; - - body+= *(s16*)body; - body+=2; - - ax = *(s16*)body; - bx = ax; - - body+=(((ax << 1) + bx) << 1) +2; - - bx = ax = *(s16*)body; - - body+=bx<<1; + body->startAnim = anim; + *(u16*)(body->m_scratchBuffer.data() + 4) = timer; - if(cx > ax) - cx = ax; + if(numGroupsInAnimation > body->m_groupOrder.size()) + numGroupsInAnimation = body->m_groupOrder.size(); - body+=10; + anim += 2; // skip key length + animStepX = *(s16*)(anim); anim += 2; + animStepY = *(s16*)(anim); anim += 2; + animStepZ = *(s16*)(anim); anim += 2; - saveAnim = anim; - - anim += 8; - - for(i=0;im_groups[i].m_state.m_type = *(s16*)(anim); anim += 2; + body->m_groups[i].m_state.m_delta[0] = *(s16*)(anim); anim += 2; + body->m_groups[i].m_state.m_delta[1] = *(s16*)(anim); anim += 2; + body->m_groups[i].m_state.m_delta[2] = *(s16*)(anim); anim += 2; + + if(body->m_flags & INFO_OPTIMISE) { - *(s16*)(body) = *(s16*)(anim); - body+=2; - anim+=2; - *(s16*)(body) = *(s16*)(anim); - body+=2; - anim+=2; - *(s16*)(body) = *(s16*)(anim); - body+=2; - anim+=2; - *(s16*)(body) = *(s16*)(anim); - body+=2; - anim+=2; + body->m_groups[i].m_state.m_rotateDelta[0] = *(s16*)(anim); anim += 2; + body->m_groups[i].m_state.m_rotateDelta[1] = *(s16*)(anim); anim += 2; + body->m_groups[i].m_state.m_rotateDelta[2] = *(s16*)(anim); anim += 2; + body->m_groups[i].m_state.m_padding = *(s16*)(anim); anim += 2; } - - body+=8; } - anim = saveAnim; - - anim+=2; - - animStepX = *(s16*)anim; - anim+=2; - animStepY = *(s16*)anim; - anim+=2; - animStepZ = *(s16*)anim; - anim+=2; - return(1); } @@ -138,7 +82,7 @@ int InitAnim(int animNum,int animType, int animInfo) currentProcessedActorPtr->objectType |= AF_ANIMATED; - SetAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim,animNum), HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); + SetAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim,animNum), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); currentProcessedActorPtr->animType = animType; currentProcessedActorPtr->animInfo = animInfo; @@ -173,7 +117,7 @@ int InitAnim(int animNum,int animType, int animInfo) removeFromBGIncrust(currentProcessedActorIdx); } - SetAnimObjet(0, HQR_Get(listAnim,animNum), HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); + SetAnimObjet(0, HQR_Get(listAnim,animNum), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); currentProcessedActorPtr->newAnim = animNum; currentProcessedActorPtr->newAnimType = animType; @@ -326,7 +270,7 @@ void GereAnim(void) // TODO: AITD3 has some extra code here to handle bufferAnimCounter - StockInterAnim(BufferAnim[bufferAnimCounter], HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); + StockInterAnim(BufferAnim[bufferAnimCounter], getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); bufferAnimCounter++; if (bufferAnimCounter == NB_BUFFER_ANIM) @@ -334,7 +278,7 @@ void GereAnim(void) } else { - ResetStartAnim(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); + ResetStartAnim(getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); currentProcessedActorPtr->newAnimType &= ~ANIM_RESET; } currentProcessedActorPtr->ANIM = newAnim; @@ -394,7 +338,7 @@ void GereAnim(void) oldStepY = currentProcessedActorPtr->stepY; oldStepZ = currentProcessedActorPtr->stepZ; - currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim, currentProcessedActorPtr->ANIM), HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); + currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim, currentProcessedActorPtr->ANIM), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); walkStep(animStepX,animStepZ,currentProcessedActorPtr->beta); @@ -760,69 +704,42 @@ void GereAnim(void) } -void StockInterAnim(std::vector& buffer, char* bodyPtr) +void StockInterAnim(std::vector& buffer, sBody* bodyPtr) { std::vector::iterator bufferIt = buffer.begin(); - int flag = *(s16*)bodyPtr; - if(flag & 2) + if(bodyPtr->m_flags & INFO_ANIM) { - char* source = bodyPtr+0x10; - s16 ax; - int cx; - int i; - - *(u16*)(source+4) = (u16)timer; - - g_bodyBufferMap[source] = (char*)&buffer[0]; - - source += *(s16*)(source-2); - - ax = *(s16*)(source); - - ax = (((ax * 2) + ax)*2)+2; - - source += ax; - - cx = *(s16*)source; - - source += cx*2; + *(u16*)(bodyPtr->m_scratchBuffer.data()+4) = (u16)timer; + bodyPtr->startAnim = (char*) & buffer[0]; bufferIt += 4; - source+= 10; - for(i=0;im_groups.size();i++) { - bufferIt[0] = *(s16*)(source); - bufferIt[1] = *(s16*)(source+2); - bufferIt[2] = *(s16*)(source+4); - bufferIt[3] = *(s16*)(source+6); + bufferIt[0] = bodyPtr->m_groups[i].m_state.m_type; + bufferIt[1] = bodyPtr->m_groups[i].m_state.m_delta[0]; + bufferIt[2] = bodyPtr->m_groups[i].m_state.m_delta[1]; + bufferIt[3] = bodyPtr->m_groups[i].m_state.m_delta[2]; bufferIt +=4; - source+=8; - if(flag&INFO_OPTIMISE) + if(bodyPtr->m_flags & INFO_OPTIMISE) { - bufferIt[0] = *(s16*)(source); - bufferIt[1] = *(s16*)(source + 2); - bufferIt[2] = *(s16*)(source + 4); - bufferIt[3] = *(s16*)(source + 6); + bufferIt[0] = bodyPtr->m_groups[i].m_state.m_rotateDelta[0]; + bufferIt[1] = bodyPtr->m_groups[i].m_state.m_rotateDelta[1]; + bufferIt[2] = bodyPtr->m_groups[i].m_state.m_rotateDelta[2]; + bufferIt[3] = bodyPtr->m_groups[i].m_state.m_padding; bufferIt +=4; - source+=8; } - - source+=8; } - } } -void ResetStartAnim(char* bodyPtr) { - bodyPtr += 16; - *(u16*)(bodyPtr + 4) = 0; // reset timer - *(s16*)(bodyPtr) = 0; - *(s16*)(bodyPtr + 2) = 0; +void ResetStartAnim(sBody* bodyPtr) { + *(u16*)(bodyPtr->m_scratchBuffer.data() + 4) = (u16)timer; // reset timer + bodyPtr->startAnim = nullptr; } s16 GetNbFramesAnim(char* animPtr) @@ -830,7 +747,7 @@ s16 GetNbFramesAnim(char* animPtr) return(*(s16*)animPtr); } -s16 PatchType(char** bodyPtr) // local +s16 PatchType(sGroupState* bodyPtr) // local { s16 temp = *(s16*)animVar1; @@ -838,13 +755,12 @@ s16 PatchType(char** bodyPtr) // local animVar4+=2; - *(s16*)(*bodyPtr) = temp; - (*bodyPtr)+=2; + bodyPtr->m_type = temp; return(temp); } -void PatchInterAngle(char** bodyPtr, int bp, int bx) // local +void PatchInterAngle(s16* value, int bp, int bx) // local { s16 oldRotation = *(s16*)animVar4; s16 newRotation; @@ -859,7 +775,7 @@ void PatchInterAngle(char** bodyPtr, int bp, int bx) // local if(diff == 0) { - *(s16*)(*bodyPtr) = newRotation; + *value = newRotation; } else { @@ -867,14 +783,14 @@ void PatchInterAngle(char** bodyPtr, int bp, int bx) // local { if(diff >= -0x200) { - *(s16*)(*bodyPtr) = ((diff*bp)/bx) + oldRotation; + *value = ((diff*bp)/bx) + oldRotation; } else { newRotation += 0x400; newRotation -= oldRotation; - *(s16*)(*bodyPtr) = ((newRotation*bp)/bx) + oldRotation; + *value = ((newRotation*bp)/bx) + oldRotation; } } else @@ -882,14 +798,12 @@ void PatchInterAngle(char** bodyPtr, int bp, int bx) // local oldRotation += 0x400; newRotation -= oldRotation; - *(s16*)(*bodyPtr) = ((newRotation*bp)/bx) + oldRotation; + *value = ((newRotation*bp)/bx) + oldRotation; } } - - (*bodyPtr)+=2; } -void PatchInterStep(char** bodyPtr, int bp, int bx) // local +void PatchInterStep(s16* value, int bp, int bx) // local { s16 cx = *(s16*)animVar4; s16 ax; @@ -900,17 +814,15 @@ void PatchInterStep(char** bodyPtr, int bp, int bx) // local if(ax == cx) { - *(s16*)(*bodyPtr) = ax; + *value = ax; } else { - *(s16*)(*bodyPtr) = (((ax - cx)*bp)/bx) + cx; + *value = (((ax - cx)*bp)/bx) + cx; } - - (*bodyPtr)+=2; } -s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr) +s16 SetInterAnimObjet(int frame, char* animPtr, sBody* pBody) { int numOfBonesInAnim = *(s16*)(animPtr+2); u16 keyframeLength; @@ -921,8 +833,6 @@ s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr) int bp; int flag; - sBody* pBody = getBodyFromPtr(bodyPtr); - flag = pBody->m_flags; animPtr+=4; @@ -946,13 +856,9 @@ s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr) return(0); } - bodyPtr+=16;// skip the flags, ZV, scratch buffer size - - animVar3 = bodyPtr; // this is the scratch buffer + timeOfKeyframeStart = *(u16*)(pBody->m_scratchBuffer.data() + 4); // time of start of keyframe - timeOfKeyframeStart = *(u16*)(bodyPtr+4); // time of start of keyframe - - char* animBufferPtr = g_bodyBufferMap[bodyPtr]; + char* animBufferPtr = pBody->startAnim; if(!animBufferPtr) { @@ -962,23 +868,11 @@ s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr) // animVar4 = ptr to previous key frame animVar4 = animBufferPtr; - bodyPtr+= *(s16*)(bodyPtr-2); // skip over scratch buffer - - ax = *(s16*)bodyPtr; // num vertices - ax = (ax*6)+2; - bodyPtr+=ax; // skip the vertices - - ax = *(s16*)bodyPtr; // num of group order - bx = ax; - bodyPtr+=bx*2; // skip group order table - if(numOfBonesInAnim > pBody->m_groupOrder.size()) { numOfBonesInAnim = pBody->m_groupOrder.size(); } - bodyPtr+=10; // skip bone 0 - time = (u16)timer - timeOfKeyframeStart; bx = keyframeLength; @@ -993,65 +887,54 @@ s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr) if(!(flag&INFO_OPTIMISE)) { - do + for (int i = 0; i < numOfBonesInAnim; i++) { - switch(PatchType(&bodyPtr)) + switch(PatchType(&pBody->m_groups[i].m_state)) { case 0: // rotate - PatchInterAngle(&bodyPtr,bp,bx); - PatchInterAngle(&bodyPtr,bp,bx); - PatchInterAngle(&bodyPtr,bp,bx); + PatchInterAngle(&pBody->m_groups[i].m_state.m_delta[0], bp, bx); + PatchInterAngle(&pBody->m_groups[i].m_state.m_delta[1], bp, bx); + PatchInterAngle(&pBody->m_groups[i].m_state.m_delta[2], bp, bx); break; case 1: // translate - PatchInterStep(&bodyPtr,bp,bx); - PatchInterStep(&bodyPtr,bp,bx); - PatchInterStep(&bodyPtr,bp,bx); + PatchInterStep(&pBody->m_groups[i].m_state.m_delta[0], bp, bx); + PatchInterStep(&pBody->m_groups[i].m_state.m_delta[1], bp, bx); + PatchInterStep(&pBody->m_groups[i].m_state.m_delta[2], bp, bx); break; case 2: // zoom - PatchInterStep(&bodyPtr,bp,bx); - PatchInterStep(&bodyPtr,bp,bx); - PatchInterStep(&bodyPtr,bp,bx); + PatchInterStep(&pBody->m_groups[i].m_state.m_delta[0], bp, bx); + PatchInterStep(&pBody->m_groups[i].m_state.m_delta[1], bp, bx); + PatchInterStep(&pBody->m_groups[i].m_state.m_delta[2], bp, bx); break; } - - bodyPtr+=8; } - while(--numOfBonesInAnim); } else { - do + for (int i = 0; i < numOfBonesInAnim; i++) { - switch(PatchType(&bodyPtr)) + switch (PatchType(&pBody->m_groups[i].m_state)) { case 0: - { animVar4 += 6; animVar1 += 6; - bodyPtr += 6; break; - } case 1: case 2: - { - PatchInterStep(&bodyPtr,bp,bx); - PatchInterStep(&bodyPtr,bp,bx); - PatchInterStep(&bodyPtr,bp,bx); - break; - } + PatchInterStep(&pBody->m_groups[i].m_state.m_delta[0], bp, bx); + PatchInterStep(&pBody->m_groups[i].m_state.m_delta[1], bp, bx); + PatchInterStep(&pBody->m_groups[i].m_state.m_delta[2], bp, bx); + break; } - PatchInterAngle(&bodyPtr,bp,bx); - PatchInterAngle(&bodyPtr,bp,bx); - PatchInterAngle(&bodyPtr,bp,bx); + PatchInterStep(&pBody->m_groups[i].m_state.m_rotateDelta[0], bp, bx); + PatchInterStep(&pBody->m_groups[i].m_state.m_rotateDelta[1], bp, bx); + PatchInterStep(&pBody->m_groups[i].m_state.m_rotateDelta[2], bp, bx); animVar4 += 2; animVar1 += 2; - bodyPtr += 10; - } - while(--numOfBonesInAnim); } animVar1 = animVar1Backup; @@ -1076,34 +959,27 @@ s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr) si+=8; - do + for (int i = 0; i < numOfBonesInAnim; i++) { - *(s16*)(bodyPtr) = *(s16*)(si); - *(s16*)(bodyPtr+2) = *(s16*)(si+2); - *(s16*)(bodyPtr+4) = *(s16*)(si+4); - *(s16*)(bodyPtr+6) = *(s16*)(si+6); + pBody->m_groups[i].m_state.m_type = *(s16*)(si); + pBody->m_groups[i].m_state.m_delta[0] = *(s16*)(si + 2); + pBody->m_groups[i].m_state.m_delta[1] = *(s16*)(si + 4); + pBody->m_groups[i].m_state.m_delta[2] = *(s16*)(si + 6); + si += 8; - bodyPtr+=8; - si+=8; - - if(flag&INFO_OPTIMISE) + if (flag & INFO_OPTIMISE) { - *(s16*)(bodyPtr) = *(s16*)(si); - *(s16*)(bodyPtr+2) = *(s16*)(si+2); - *(s16*)(bodyPtr+4) = *(s16*)(si+4); - *(s16*)(bodyPtr+6) = *(s16*)(si+6); - bodyPtr+=8; - si+=8; + pBody->m_groups[i].m_state.m_rotateDelta[0] = *(s16*)(si + 2); + pBody->m_groups[i].m_state.m_rotateDelta[1] = *(s16*)(si + 4); + pBody->m_groups[i].m_state.m_rotateDelta[2] = *(s16*)(si + 6); + pBody->m_groups[i].m_state.m_padding = *(s16*)(si); + si += 8; } + }; - bodyPtr+=8; - - }while(--numOfBonesInAnim); - - g_bodyBufferMap[animVar3] = animVar1; - //*(char**)animVar3 = animVar1; + pBody->startAnim = animVar1; - *(u16*)(animVar3+4) = (u16)timer; + *(u16*)(pBody->m_scratchBuffer.data()+4) = (u16)timer; tempBx+=2; diff --git a/FitdLib/anim.h b/FitdLib/anim.h index 4af88b3..213c6e9 100644 --- a/FitdLib/anim.h +++ b/FitdLib/anim.h @@ -4,11 +4,11 @@ #define INFO_OPTIMISE 8 int InitAnim(int animNum,int animType, int animInfo); -int SetAnimObjet(int frame, char* anim, char* body); -s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr); +int SetAnimObjet(int frame, char* anim, sBody* body); +s16 SetInterAnimObjet(int frame, char* animPtr, sBody* bodyPtr); s16 GetNbFramesAnim(char* animPtr); -void StockInterAnim(std::vector& animBuffer, char* bodyPtr); -void ResetStartAnim(char* bodyPtr); +void StockInterAnim(std::vector& animBuffer, sBody* bodyPtr); +void ResetStartAnim(sBody* bodyPtr); void GereAnim(void); void InitCopyBox(char* var0, char* var1); diff --git a/FitdLib/hqr.cpp b/FitdLib/hqr.cpp index 073268f..09b3877 100644 --- a/FitdLib/hqr.cpp +++ b/FitdLib/hqr.cpp @@ -226,7 +226,7 @@ sBody* createBodyFromPtr(void* ptr) newBody->m_groups[i].m_state.m_rotateDelta[0] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; newBody->m_groups[i].m_state.m_rotateDelta[1] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; newBody->m_groups[i].m_state.m_rotateDelta[2] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - bodyBuffer += 2; // padding? + newBody->m_groups[i].m_state.m_padding = READ_LE_S16(bodyBuffer); bodyBuffer += 2; } } else diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index cd70c3a..b61711c 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -373,9 +373,6 @@ void setStage(int newStage, int newRoomLocal, int X, int Y, int Z) void setupRealZv(ZVStruct* zvPtr) { - int i; - s16* ptr = pointBuffer; - zvPtr->ZVX1 = 32000; zvPtr->ZVY1 = 32000; zvPtr->ZVZ1 = 32000; @@ -383,47 +380,36 @@ void setupRealZv(ZVStruct* zvPtr) zvPtr->ZVY2 = -32000; zvPtr->ZVZ2 = -32000; - for (i = 0; i < numOfPoints; i++) + for (int i = 0; i < numOfPoints; i++) { - if (zvPtr->ZVX1 >(*ptr)) + point3dStruct* ptr = &pointBuffer[i]; + if (zvPtr->ZVX1 > ptr->x) { - zvPtr->ZVX1 = *(ptr); + zvPtr->ZVX1 = ptr->x; } - else + else if (zvPtr->ZVX2 < ptr->x) { - if (zvPtr->ZVX2 < (*ptr)) - { - zvPtr->ZVX2 = *(ptr); - } + zvPtr->ZVX2 = ptr->x; } - ptr++; - if (zvPtr->ZVY1 >(*ptr)) + if (zvPtr->ZVY1 > ptr->y) { - zvPtr->ZVY1 = *(ptr); + zvPtr->ZVY1 = ptr->y; } - else + else if (zvPtr->ZVY2 < ptr->y) { - if (zvPtr->ZVY2 < (*ptr)) - { - zvPtr->ZVY2 = *(ptr); - } + zvPtr->ZVY2 = ptr->y; } - ptr++; - if (zvPtr->ZVZ1 >(*ptr)) + if (zvPtr->ZVZ1 > ptr->z) { - zvPtr->ZVZ1 = *(ptr); + zvPtr->ZVZ1 = ptr->z; } else + if (zvPtr->ZVZ2 < ptr->z) { - if (zvPtr->ZVZ2 < (*ptr)) - { - zvPtr->ZVZ2 = *(ptr); - } + zvPtr->ZVZ2 = ptr->z; } - ptr++; - } } @@ -761,7 +747,6 @@ void processLife(int lifeNum, bool callFoundLife) if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) { char* pAnim = HQR_Get(listAnim, currentProcessedActorPtr->ANIM); - char* pBody; if (g_gameId >= JACK) { @@ -769,7 +754,7 @@ void processLife(int lifeNum, bool callFoundLife) gereDecal(); */ } - pBody = HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum); + sBody* pBody = getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); /* if(gameId >= JACK) { @@ -803,7 +788,6 @@ void processLife(int lifeNum, bool callFoundLife) if (currentProcessedActorPtr->objectType & AF_ANIMATED) { char* pAnim = HQR_Get(listAnim, currentProcessedActorPtr->ANIM); - char* pBody; if (g_gameId >= JACK) { @@ -811,7 +795,7 @@ void processLife(int lifeNum, bool callFoundLife) gereDecal(); */ } - pBody = HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum); + sBody* pBody = getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); SetAnimObjet(0, pAnim, pBody); InitAnim(param2, 4, -1); diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 26b0681..4837cab 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -3073,12 +3073,10 @@ void getHotPoint(int hotPointIdx, sBody* bodyPtr, point3dStruct* hotPoint) if(hotPointIdx < bodyPtr->m_groups.size()) { - auto& group = bodyPtr->m_groups[bodyPtr->m_groupOrder[hotPointIdx]]; + auto& group = bodyPtr->m_groups[hotPointIdx]; int pointIdx = group.m_baseVertices; // first point - auto& vertex = bodyPtr->m_vertices[pointIdx]; - - *hotPoint = vertex; + *hotPoint = pointBuffer[pointIdx]; } } } diff --git a/FitdLib/main.h b/FitdLib/main.h index ccb368a..435e7ff 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -62,12 +62,10 @@ void setMoveMode(int trackMode, int trackNumber); void InitRealValue(s16 beta, s16 newBeta, s16 param, RealValue* rotatePtr); s16 updateActorRotation(RealValue* rotatePtr); s16 GetNbFramesAnim(char* animPtr); -int SetAnimObjet(int frame, char* anim, char* body); void deleteObject(int objIdx); void removeFromBGIncrust(int actorIdx); void makeMessage(int messageIdx); int drawTextOverlay(void); -s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr); void handleCollision(ZVStruct* startZv, ZVStruct* zvPtr2, ZVStruct* zvPtr3); void addActorToBgInscrust(int actorIdx); diff --git a/FitdLib/object.cpp b/FitdLib/object.cpp index 22ccf47..7154416 100644 --- a/FitdLib/object.cpp +++ b/FitdLib/object.cpp @@ -103,7 +103,7 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x { char* animPtr = HQR_Get(listAnim,anim); - SetAnimObjet(frame,animPtr,(char*)bodyPtr->m_raw); + SetAnimObjet(frame,animPtr, bodyPtr); actorPtr->numOfFrames = GetNbFramesAnim(animPtr); actorPtr->flagEndAnim = 0; diff --git a/FitdLib/renderer.cpp b/FitdLib/renderer.cpp index aabdd33..4d4e03d 100644 --- a/FitdLib/renderer.cpp +++ b/FitdLib/renderer.cpp @@ -77,7 +77,7 @@ int renderZ; int numOfPoints; int numOfBones; -s16 pointBuffer[NUM_MAX_POINT_IN_POINT_BUFFER*3]; +std::array pointBuffer; s16 cameraSpaceBuffer[NUM_MAX_POINT_IN_POINT_BUFFER*3]; s16 bonesBuffer[NUM_MAX_BONES]; @@ -208,19 +208,19 @@ void InitGroupeRot(int transX,int transY,int transZ) } } -void RotateList(s16* pointPtr, int numOfPoint) +void RotateList(point3dStruct* pointPtr, int numOfPoint) { for(int i=0;i>16)<<1; z = ((((tempX * boneRotateYCos) + (tempZ * boneRotateYSin)))>>16)<<1; } @@ -241,11 +241,9 @@ void RotateList(s16* pointPtr, int numOfPoint) y = ((((tempX * boneRotateZCos) + ( tempY * boneRotateZSin)))>>16)<<1; } - *(s16*)(pointPtr) = x; - *(s16*)(pointPtr+1) = y; - *(s16*)(pointPtr+2) = z; - - pointPtr+=3; + point.x = x; + point.y = y; + point.z = z; } } @@ -256,7 +254,7 @@ void RotateGroupeOptimise(sGroup* ptr) int baseBone = ptr->m_start; int numPoints = ptr->m_numVertices; - RotateList(pointBuffer + baseBone * 3, numPoints); + RotateList(pointBuffer.data() + baseBone, numPoints); } } @@ -267,7 +265,7 @@ void RotateGroupe(sGroup* ptr) int temp; int temp2; - RotateList(pointBuffer + baseBone * 3, numPoints); + RotateList(pointBuffer.data() + baseBone, numPoints); temp = ptr->m_numGroup; // group number @@ -286,25 +284,23 @@ void RotateGroupe(sGroup* ptr) void TranslateGroupe(int transX, int transY, int transZ, sGroup* ptr) { - s16* ptrSource = &pointBuffer[ptr->m_start * 3]; - for (int i = 0; i < ptr->m_numVertices; i++) { - *(ptrSource++) += transX; - *(ptrSource++) += transY; - *(ptrSource++) += transZ; + point3dStruct& point = pointBuffer[ptr->m_start + i]; + point.x += transX; + point.y += transY; + point.z += transZ; } } void ZoomGroupe(int zoomX, int zoomY, int zoomZ, sGroup* ptr) { - s16* ptrSource = &pointBuffer[ptr->m_start * 3]; - for (int i = 0; i < ptr->m_numVertices; i++) { - *(ptrSource++) = (*(ptrSource) * (zoomX + 256)) / 256; - *(ptrSource++) = (*(ptrSource) * (zoomY + 256)) / 256; - *(ptrSource++) = (*(ptrSource) * (zoomZ + 256)) / 256; + point3dStruct& point = pointBuffer[ptr->m_start + i]; + point.x = (point.x * (zoomX + 256)) / 256; + point.y = (point.y * (zoomY + 256)) / 256; + point.z = (point.z * (zoomZ + 256)) / 256; } } @@ -318,9 +314,7 @@ int AnimNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) for (int i = 0; i < pBody->m_vertices.size(); i++) { - pointBuffer[i * 3 + 0] = pBody->m_vertices[i].x; - pointBuffer[i * 3 + 1] = pBody->m_vertices[i].y; - pointBuffer[i * 3 + 2] = pBody->m_vertices[i].z; + pointBuffer[i] = pBody->m_vertices[i]; } numOfPoints = pBody->m_vertices.size(); @@ -397,70 +391,28 @@ int AnimNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) for(int i=0;im_groups.size();i++) { sGroup* pGroup = &pBody->m_groups[i]; - - int j; - - int point1; - int point2; - - s16* ptr1; - s16* ptr2; - - int number; - - int ax; - int bx; - int dx; - - point1 = pGroup->m_baseVertices * 6; - point2 = pGroup->m_start * 6; - - ASSERT(point1%2 == 0); - ASSERT(point2%2 == 0); - - point1/=2; - point2/=2; - - ASSERT(point1/3m_numVertices; - - ax = ptr1[0]; - bx = ptr1[1]; - dx = ptr1[2]; - - for(j=0;jm_numVertices;j++) { - *(ptr2++) += ax; - *(ptr2++) += bx; - *(ptr2++) += dx; + pointBuffer[pGroup->m_start + j].x += pointBuffer[pGroup->m_baseVertices].x; + pointBuffer[pGroup->m_start + j].y += pointBuffer[pGroup->m_baseVertices].y; + pointBuffer[pGroup->m_start + j].z += pointBuffer[pGroup->m_baseVertices].z; } } if(modelFlags & INFO_OPTIMISE) { InitGroupeRot(alpha,beta,gamma); - RotateList(pointBuffer,numOfPoints); + RotateList(pointBuffer.data(),numOfPoints); } { - char* ptr = (char*)pointBuffer; s16* outPtr = cameraSpaceBuffer; - int k = numOfPoints; - - - float* outPtr2; - for(int i=0;im_raw; int numPrim; int i; char* out; @@ -981,14 +931,10 @@ int AffObjet(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) renderVar2 = renderBuffer; - modelFlags = READ_LE_S16(ptr); ptr+=2; - ptr+=12; // skip the ZV - - ptr+=READ_LE_S16(ptr) + 2; // skip scratch buffer + modelFlags = pBody->m_flags; if(modelFlags&INFO_ANIM) { - pBody->sync(); if(!AnimNuage(x,y,z,alpha,beta,gamma, pBody)) { BBox3D3 = -32000; @@ -1059,7 +1005,6 @@ int AffObjet(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) case processPrim_PolyTexture9: case processPrim_PolyTexture10: processPrim_Poly(primType, pPrimitive, &out); - ptr += 3 * 2; break; default: return 0; @@ -1168,37 +1113,6 @@ void computeScreenBox(int x, int y, int z, int alpha, int beta, int gamma, char* if(modelFlags&INFO_ANIM) { - pBody->sync(); AnimNuage(x,y,z,alpha,beta,gamma, pBody); } } - -void sBody::sync() -{ - u8* ptr = (u8*)m_raw; - - ptr += 2; // skip the flag - ptr += 12; // skip the ZV - ptr += READ_LE_S16(ptr) + 2; // skip scratch buffer - ptr += READ_LE_S16(ptr) * 6 + 2; // skip vertices - u16 numGroups = READ_LE_U16(ptr); - ptr += numGroups * 2 + 2; // skip group order - - assert(numGroups == m_groups.size()); - - for (int i = 0; i < numGroups; i++) - { - m_groups[i].m_state.m_type = READ_LE_S16(ptr + 8); - m_groups[i].m_state.m_delta[0] = READ_LE_S16(ptr + 10); - m_groups[i].m_state.m_delta[1] = READ_LE_S16(ptr + 12); - m_groups[i].m_state.m_delta[2] = READ_LE_S16(ptr + 14); - ptr += 16; - if (m_flags & INFO_OPTIMISE) - { - m_groups[i].m_state.m_rotateDelta[0] = READ_LE_S16(ptr + 0); - m_groups[i].m_state.m_rotateDelta[1] = READ_LE_S16(ptr + 2); - m_groups[i].m_state.m_rotateDelta[2] = READ_LE_S16(ptr + 4); - ptr += 8; - } - } -} diff --git a/FitdLib/renderer.h b/FitdLib/renderer.h index 5b4ddd9..49e75a1 100644 --- a/FitdLib/renderer.h +++ b/FitdLib/renderer.h @@ -9,7 +9,7 @@ extern int BBox3D4; #define NUM_MAX_POINT_IN_POINT_BUFFER 800 #define NUM_MAX_BONES 50 -extern s16 pointBuffer[NUM_MAX_POINT_IN_POINT_BUFFER*3]; +extern std::array pointBuffer; extern int numOfPoints; void transformPoint(float* ax, float* bx, float* cx); diff --git a/FitdLib/save.cpp b/FitdLib/save.cpp index 520cc33..6e4ee95 100644 --- a/FitdLib/save.cpp +++ b/FitdLib/save.cpp @@ -494,7 +494,7 @@ int loadSave(int saveNumber) { if(objectTable[i].indexInWorld != -1 && objectTable[i].bodyNum != -1) { - char* bodyPtr = HQR_Get(HQ_Bodys,objectTable[i].bodyNum); + sBody* bodyPtr = getBodyFromPtr(HQR_Get(HQ_Bodys,objectTable[i].bodyNum)); if(objectTable[i].ANIM != -1) { diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index d2f72d4..6f925a0 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -217,7 +217,6 @@ int animStepZ; int animStepY; char* animVar1; -char* animVar3; char* animVar4; s16 NewNumEtage; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index 68b903c..83a6325 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -89,6 +89,16 @@ struct ZVStruct typedef struct ZVStruct ZVStruct; +struct ZVStruct16 +{ + s16 ZVX1; + s16 ZVX2; + s16 ZVY1; + s16 ZVY2; + s16 ZVZ1; + s16 ZVZ2; +}; + struct RealValue { s16 startValue; @@ -448,7 +458,6 @@ extern int animStepZ; extern int animStepX; extern int animStepY; extern char* animVar1; -extern char* animVar3; extern char* animVar4; extern s16 NewNumEtage; @@ -522,9 +531,12 @@ extern collisiosDisplayMode sceColDisplayMode; struct sGroupState { - s16 m_type; // 8 - s16 m_delta[3]; // A - s16 m_rotateDelta[3]; // 10 (AITD2+) if Info_optimise + s16 m_type; // 0 + s16 m_delta[3]; // 2 + // (AITD2+) if Info_optimise + s16 m_rotateDelta[3]; // 8 + s16 m_padding; + // 8 / 0x10 }; struct sGroup @@ -534,7 +546,8 @@ struct sGroup s16 m_baseVertices; // 4 s8 m_orgGroup; // 6 s8 m_numGroup; // 7 - sGroupState m_state; + sGroupState m_state;//8 + // 0x16 / 0x22 (AITD2+) if Info_optimise }; enum primTypeEnum @@ -575,15 +588,14 @@ struct sBody { void* m_raw; - u16 m_flags; - ZVStruct m_zv; - std::vector m_scratchBuffer; - std::vector m_vertices; - std::vector m_groupOrder; - std::vector m_groups; + u16 m_flags; //0 size 0x2 + ZVStruct16 m_zv; //2 size 0xC + char* startAnim = nullptr; // This is normally stored as 4 bytes at the beginning of scratchBuffer, but we store it here due to pointer size + std::vector m_scratchBuffer; //0xE size u16 + data + std::vector m_vertices; // size u16 count * 6 + std::vector m_groupOrder; // size u16 * 2 + std::vector m_groups; // size u16 std::vector m_primitives; - - void sync(); }; struct sFrame diff --git a/FitdLib/zv.cpp b/FitdLib/zv.cpp index b59a760..597835e 100644 --- a/FitdLib/zv.cpp +++ b/FitdLib/zv.cpp @@ -1,18 +1,23 @@ #include "common.h" +void GiveZVObjet(sBody* bodyPtr, ZVStruct* zvPtr) +{ + zvPtr->ZVX1 = bodyPtr->m_zv.ZVX1; + zvPtr->ZVX2 = bodyPtr->m_zv.ZVX2; + zvPtr->ZVY1 = bodyPtr->m_zv.ZVY1; + zvPtr->ZVY2 = bodyPtr->m_zv.ZVY2; + zvPtr->ZVZ1 = bodyPtr->m_zv.ZVZ1; + zvPtr->ZVZ2 = bodyPtr->m_zv.ZVZ2; +} + void getZvCube(sBody* bodyPtr, ZVStruct* zvPtr) { - *zvPtr = bodyPtr->m_zv; + GiveZVObjet(bodyPtr, zvPtr); zvPtr->ZVZ2 = zvPtr->ZVX2 = (zvPtr->ZVX2 + zvPtr->ZVZ2)/2; zvPtr->ZVX1 = zvPtr->ZVZ1 = -zvPtr->ZVZ2; } -void GiveZVObjet(sBody* bodyPtr, ZVStruct* zvPtr) -{ - *zvPtr = bodyPtr->m_zv; -} - void makeDefaultZV(ZVStruct* zvPtr) { zvPtr->ZVX1 = -100; From 97ba0bf877478ebf20f71bf8c7d093f690119b6c Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Mon, 16 Jun 2025 21:56:12 -0700 Subject: [PATCH 53/70] Revamp animation --- FitdLib/anim.cpp | 269 +++++++++++++------------------------------ FitdLib/anim.h | 30 ++++- FitdLib/hqr.cpp | 30 ++--- FitdLib/hqr.h | 2 +- FitdLib/life.cpp | 4 +- FitdLib/main.cpp | 6 +- FitdLib/main.h | 1 - FitdLib/object.cpp | 2 +- FitdLib/renderer.cpp | 22 ++-- FitdLib/save.cpp | 2 +- FitdLib/vars.cpp | 4 - FitdLib/vars.h | 30 +---- 12 files changed, 142 insertions(+), 260 deletions(-) diff --git a/FitdLib/anim.cpp b/FitdLib/anim.cpp index 52d3479..7e14d4b 100644 --- a/FitdLib/anim.cpp +++ b/FitdLib/anim.cpp @@ -2,35 +2,19 @@ #include "common.h" -int SetAnimObjet(int frame, char* anim, sBody* body) -{ - sAnimation* pAnimation = getAnimationFromPtr(anim); - - s16 bx; - - anim+=2; +std::vector BufferAnim; +int SetAnimObjet(int frame, sAnimation* pAnimation, sBody* body) +{ if(frame >= pAnimation->m_numFrames) { return(0); } int numGroupsInAnimation = pAnimation->m_numGroups; - anim+=2; + sFrame& keyframe = pAnimation->m_frames[frame]; - int ax; - if(body->m_flags & INFO_OPTIMISE) - { - ax = ((numGroupsInAnimation <<4)+8)*frame; - } - else - { - ax = ((numGroupsInAnimation +1)<<3)*frame; - } - - anim+=ax; - - animCurrentTime = *(s16*)anim; + animCurrentTime = keyframe.m_timestamp; animKeyframeLength = animCurrentTime; if(!(body->m_flags & INFO_ANIM)) @@ -38,30 +22,25 @@ int SetAnimObjet(int frame, char* anim, sBody* body) return(0); } - body->startAnim = anim; + body->startAnim = &keyframe; *(u16*)(body->m_scratchBuffer.data() + 4) = timer; if(numGroupsInAnimation > body->m_groupOrder.size()) numGroupsInAnimation = body->m_groupOrder.size(); - anim += 2; // skip key length - animStepX = *(s16*)(anim); anim += 2; - animStepY = *(s16*)(anim); anim += 2; - animStepZ = *(s16*)(anim); anim += 2; + animStepX = keyframe.m_animStep.x; + animStepY = keyframe.m_animStep.y; + animStepZ = keyframe.m_animStep.z; for(int i=0;i< numGroupsInAnimation;i++) { - body->m_groups[i].m_state.m_type = *(s16*)(anim); anim += 2; - body->m_groups[i].m_state.m_delta[0] = *(s16*)(anim); anim += 2; - body->m_groups[i].m_state.m_delta[1] = *(s16*)(anim); anim += 2; - body->m_groups[i].m_state.m_delta[2] = *(s16*)(anim); anim += 2; + body->m_groups[i].m_state.m_type = keyframe.m_groups[i].m_type; + body->m_groups[i].m_state.m_delta = keyframe.m_groups[i].m_delta; if(body->m_flags & INFO_OPTIMISE) { - body->m_groups[i].m_state.m_rotateDelta[0] = *(s16*)(anim); anim += 2; - body->m_groups[i].m_state.m_rotateDelta[1] = *(s16*)(anim); anim += 2; - body->m_groups[i].m_state.m_rotateDelta[2] = *(s16*)(anim); anim += 2; - body->m_groups[i].m_state.m_padding = *(s16*)(anim); anim += 2; + body->m_groups[i].m_state.m_rotateDelta = keyframe.m_groups[i].m_rotateDelta; + body->m_groups[i].m_state.m_padding = keyframe.m_groups[i].m_padding; } } @@ -82,7 +61,7 @@ int InitAnim(int animNum,int animType, int animInfo) currentProcessedActorPtr->objectType |= AF_ANIMATED; - SetAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim,animNum), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); + SetAnimObjet(currentProcessedActorPtr->frame, getAnimationFromPtr(HQR_Get(listAnim,animNum)), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); currentProcessedActorPtr->animType = animType; currentProcessedActorPtr->animInfo = animInfo; @@ -117,7 +96,7 @@ int InitAnim(int animNum,int animType, int animInfo) removeFromBGIncrust(currentProcessedActorIdx); } - SetAnimObjet(0, HQR_Get(listAnim,animNum), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); + SetAnimObjet(0, getAnimationFromPtr(HQR_Get(listAnim,animNum)), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); currentProcessedActorPtr->newAnim = animNum; currentProcessedActorPtr->newAnimType = animType; @@ -269,7 +248,6 @@ void GereAnim(void) } // TODO: AITD3 has some extra code here to handle bufferAnimCounter - StockInterAnim(BufferAnim[bufferAnimCounter], getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); bufferAnimCounter++; @@ -292,7 +270,7 @@ void GereAnim(void) currentProcessedActorPtr->flagEndAnim = 0; currentProcessedActorPtr->frame = 0; - currentProcessedActorPtr->numOfFrames = GetNbFramesAnim(HQR_Get(listAnim, newAnim)); + currentProcessedActorPtr->numOfFrames = GetNbFramesAnim(getAnimationFromPtr(HQR_Get(listAnim, newAnim))); } } @@ -338,7 +316,7 @@ void GereAnim(void) oldStepY = currentProcessedActorPtr->stepY; oldStepZ = currentProcessedActorPtr->stepZ; - currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim, currentProcessedActorPtr->ANIM), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); + currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->frame, getAnimationFromPtr(HQR_Get(listAnim, currentProcessedActorPtr->ANIM)), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); walkStep(animStepX,animStepZ,currentProcessedActorPtr->beta); @@ -704,35 +682,16 @@ void GereAnim(void) } -void StockInterAnim(std::vector& buffer, sBody* bodyPtr) +void StockInterAnim(sFrame& buffer, sBody* bodyPtr) { - std::vector::iterator bufferIt = buffer.begin(); - if(bodyPtr->m_flags & INFO_ANIM) { *(u16*)(bodyPtr->m_scratchBuffer.data()+4) = (u16)timer; - bodyPtr->startAnim = (char*) & buffer[0]; - - bufferIt += 4; - - for(int i=0;i< bodyPtr->m_groups.size();i++) - { - bufferIt[0] = bodyPtr->m_groups[i].m_state.m_type; - bufferIt[1] = bodyPtr->m_groups[i].m_state.m_delta[0]; - bufferIt[2] = bodyPtr->m_groups[i].m_state.m_delta[1]; - bufferIt[3] = bodyPtr->m_groups[i].m_state.m_delta[2]; - - bufferIt +=4; - - if(bodyPtr->m_flags & INFO_OPTIMISE) - { - bufferIt[0] = bodyPtr->m_groups[i].m_state.m_rotateDelta[0]; - bufferIt[1] = bodyPtr->m_groups[i].m_state.m_rotateDelta[1]; - bufferIt[2] = bodyPtr->m_groups[i].m_state.m_rotateDelta[2]; - bufferIt[3] = bodyPtr->m_groups[i].m_state.m_padding; + bodyPtr->startAnim = &buffer; - bufferIt +=4; - } + buffer.m_groups.resize(bodyPtr->m_groups.size()); + for (int i = 0; i < bodyPtr->m_groups.size(); i++) { + buffer.m_groups[i] = bodyPtr->m_groups[i].m_state; } } } @@ -742,40 +701,25 @@ void ResetStartAnim(sBody* bodyPtr) { bodyPtr->startAnim = nullptr; } -s16 GetNbFramesAnim(char* animPtr) +s16 GetNbFramesAnim(sAnimation* animPtr) { - return(*(s16*)animPtr); + return animPtr->m_numFrames; } -s16 PatchType(sGroupState* bodyPtr) // local +s16 PatchType(sGroupState* bodyPtr, u16 type) // local { - s16 temp = *(s16*)animVar1; - - animVar1+=2; - - animVar4+=2; + bodyPtr->m_type = type; - bodyPtr->m_type = temp; - - return(temp); + return(bodyPtr->m_type); } -void PatchInterAngle(s16* value, int bp, int bx) // local +void PatchInterAngle(s16* value, s16 previousValue, s16 nextValue, int bp, int bx) // local { - s16 oldRotation = *(s16*)animVar4; - s16 newRotation; - s16 diff; - - animVar4+=2; - - newRotation = *(s16*)animVar1; - animVar1+=2; - - diff = newRotation - oldRotation; + s16 diff = nextValue - previousValue; if(diff == 0) { - *value = newRotation; + *value = nextValue; } else { @@ -783,34 +727,30 @@ void PatchInterAngle(s16* value, int bp, int bx) // local { if(diff >= -0x200) { - *value = ((diff*bp)/bx) + oldRotation; + *value = ((diff*bp)/bx) + previousValue; } else { - newRotation += 0x400; - newRotation -= oldRotation; + nextValue += 0x400; + nextValue -= previousValue; - *value = ((newRotation*bp)/bx) + oldRotation; + *value = ((nextValue *bp)/bx) + previousValue; } } else { - oldRotation += 0x400; - newRotation -= oldRotation; + previousValue += 0x400; + nextValue -= previousValue; - *value = ((newRotation*bp)/bx) + oldRotation; + *value = ((nextValue *bp)/bx) + previousValue; } } } -void PatchInterStep(s16* value, int bp, int bx) // local +void PatchInterStep(s16* value, s16 previousValue, s16 nextValue, int bp, int bx) // local { - s16 cx = *(s16*)animVar4; - s16 ax; - animVar4+=2; - - ax = *(s16*)animVar1; - animVar1+=2; + s16 cx = previousValue; + s16 ax = nextValue; if(ax == cx) { @@ -822,9 +762,9 @@ void PatchInterStep(s16* value, int bp, int bx) // local } } -s16 SetInterAnimObjet(int frame, char* animPtr, sBody* pBody) +s16 SetInterAnimObjet(int frame, sAnimation* pAnim, sBody* pBody) { - int numOfBonesInAnim = *(s16*)(animPtr+2); + int numOfBonesInAnim = pAnim->m_numGroups; u16 keyframeLength; u16 timeOfKeyframeStart; int ax; @@ -835,21 +775,9 @@ s16 SetInterAnimObjet(int frame, char* animPtr, sBody* pBody) flag = pBody->m_flags; - animPtr+=4; + sFrame* pKeyframe = &pAnim->m_frames[frame]; - if(flag&INFO_OPTIMISE) - { - animPtr += ((numOfBonesInAnim<<4)+8)*frame; // seek to keyframe - } - else - { - animPtr += ((numOfBonesInAnim+1)*8)*frame; // seek to keyframe - } - - // animVar1 = ptr to the current keyFrame - animVar1 = animPtr; - - keyframeLength = *(u16*)animPtr; // keyframe length + keyframeLength = pKeyframe->m_timestamp; // keyframe length if(!(pBody->m_flags & INFO_ANIM)) // do not anim if the model can't be animated { @@ -858,16 +786,13 @@ s16 SetInterAnimObjet(int frame, char* animPtr, sBody* pBody) timeOfKeyframeStart = *(u16*)(pBody->m_scratchBuffer.data() + 4); // time of start of keyframe - char* animBufferPtr = pBody->startAnim; + sFrame* pPreviousKeyframe = pBody->startAnim; - if(!animBufferPtr) + if(!pPreviousKeyframe) { - animBufferPtr = animVar1; + pPreviousKeyframe = pKeyframe; } - // animVar4 = ptr to previous key frame - animVar4 = animBufferPtr; - if(numOfBonesInAnim > pBody->m_groupOrder.size()) { numOfBonesInAnim = pBody->m_groupOrder.size(); @@ -880,32 +805,25 @@ s16 SetInterAnimObjet(int frame, char* animPtr, sBody* pBody) if(timem_groups[i].m_state)) + point3dStruct& state = pBody->m_groups[i].m_state.m_delta; + point3dStruct& previousState = pPreviousKeyframe->m_groups[i].m_delta; + point3dStruct& nextState = pKeyframe->m_groups[i].m_delta; + switch(PatchType(&pBody->m_groups[i].m_state, pKeyframe->m_groups[i].m_type)) { case 0: // rotate - PatchInterAngle(&pBody->m_groups[i].m_state.m_delta[0], bp, bx); - PatchInterAngle(&pBody->m_groups[i].m_state.m_delta[1], bp, bx); - PatchInterAngle(&pBody->m_groups[i].m_state.m_delta[2], bp, bx); + PatchInterAngle(&state.x, previousState.x, nextState.x, bp, bx); + PatchInterAngle(&state.y, previousState.y, nextState.y, bp, bx); + PatchInterAngle(&state.z, previousState.z, nextState.z, bp, bx); break; case 1: // translate - PatchInterStep(&pBody->m_groups[i].m_state.m_delta[0], bp, bx); - PatchInterStep(&pBody->m_groups[i].m_state.m_delta[1], bp, bx); - PatchInterStep(&pBody->m_groups[i].m_state.m_delta[2], bp, bx); - break; - case 2: // zoom - PatchInterStep(&pBody->m_groups[i].m_state.m_delta[0], bp, bx); - PatchInterStep(&pBody->m_groups[i].m_state.m_delta[1], bp, bx); - PatchInterStep(&pBody->m_groups[i].m_state.m_delta[2], bp, bx); + PatchInterStep(&state.x, previousState.x, nextState.x, bp, bx); + PatchInterStep(&state.y, previousState.y, nextState.y, bp, bx); + PatchInterStep(&state.z, previousState.z, nextState.z, bp, bx); break; } } @@ -914,38 +832,36 @@ s16 SetInterAnimObjet(int frame, char* animPtr, sBody* pBody) { for (int i = 0; i < numOfBonesInAnim; i++) { - switch (PatchType(&pBody->m_groups[i].m_state)) + point3dStruct& state = pBody->m_groups[i].m_state.m_delta; + point3dStruct& previousState = pPreviousKeyframe->m_groups[i].m_delta; + point3dStruct& nextState = pKeyframe->m_groups[i].m_delta; + switch (PatchType(&pBody->m_groups[i].m_state, pKeyframe->m_groups[i].m_type)) { case 0: - animVar4 += 6; - animVar1 += 6; break; case 1: case 2: - PatchInterStep(&pBody->m_groups[i].m_state.m_delta[0], bp, bx); - PatchInterStep(&pBody->m_groups[i].m_state.m_delta[1], bp, bx); - PatchInterStep(&pBody->m_groups[i].m_state.m_delta[2], bp, bx); + PatchInterStep(&state.x, previousState.x, nextState.x, bp, bx); + PatchInterStep(&state.y, previousState.y, nextState.y, bp, bx); + PatchInterStep(&state.z, previousState.z, nextState.z, bp, bx); break; } - PatchInterStep(&pBody->m_groups[i].m_state.m_rotateDelta[0], bp, bx); - PatchInterStep(&pBody->m_groups[i].m_state.m_rotateDelta[1], bp, bx); - PatchInterStep(&pBody->m_groups[i].m_state.m_rotateDelta[2], bp, bx); + { + point3dStruct& state = pBody->m_groups[i].m_state.m_rotateDelta; + point3dStruct& previousState = pPreviousKeyframe->m_groups[i].m_rotateDelta; + point3dStruct& nextState = pKeyframe->m_groups[i].m_rotateDelta; - animVar4 += 2; - animVar1 += 2; + PatchInterStep(&state.x, previousState.x, nextState.x, bp, bx); + PatchInterStep(&state.y, previousState.y, nextState.y, bp, bx); + PatchInterStep(&state.z, previousState.z, nextState.z, bp, bx); + } } } - animVar1 = animVar1Backup; - - animVar1+=2; - - animStepX = ((*(s16*)(animVar1))*bp)/bx; // X - animStepY = ((*(s16*)(animVar1+2))*bp)/bx; // Y - animStepZ = ((*(s16*)(animVar1+4))*bp)/bx; // Z - - animVar1+=6; + animStepX = (pKeyframe->m_animStep.x * bp) / bx; + animStepY = (pKeyframe->m_animStep.y * bp) / bx; + animStepZ = (pKeyframe->m_animStep.z * bp) / bx; animCurrentTime = bx; animKeyframeLength = bp; @@ -953,46 +869,23 @@ s16 SetInterAnimObjet(int frame, char* animPtr, sBody* pBody) } else // change keyframe { - char* tempBx = animVar1; - char* si = animVar1; - - - si+=8; - for (int i = 0; i < numOfBonesInAnim; i++) { - pBody->m_groups[i].m_state.m_type = *(s16*)(si); - pBody->m_groups[i].m_state.m_delta[0] = *(s16*)(si + 2); - pBody->m_groups[i].m_state.m_delta[1] = *(s16*)(si + 4); - pBody->m_groups[i].m_state.m_delta[2] = *(s16*)(si + 6); - si += 8; - - if (flag & INFO_OPTIMISE) - { - pBody->m_groups[i].m_state.m_rotateDelta[0] = *(s16*)(si + 2); - pBody->m_groups[i].m_state.m_rotateDelta[1] = *(s16*)(si + 4); - pBody->m_groups[i].m_state.m_rotateDelta[2] = *(s16*)(si + 6); - pBody->m_groups[i].m_state.m_padding = *(s16*)(si); - si += 8; - } + sGroupState& nextState = pKeyframe->m_groups[i]; + pBody->m_groups[i].m_state = nextState; }; - pBody->startAnim = animVar1; + pBody->startAnim = pKeyframe; *(u16*)(pBody->m_scratchBuffer.data()+4) = (u16)timer; - tempBx+=2; - animCurrentTime = bx; animKeyframeLength = bx; - animStepX = *(s16*)(tempBx); - animStepY = *(s16*)(tempBx+2); - animStepZ = *(s16*)(tempBx+4); - - tempBx += 6; + animStepX = pKeyframe->m_animStep.x; + animStepY = pKeyframe->m_animStep.y; + animStepZ = pKeyframe->m_animStep.z; return(1); - } } diff --git a/FitdLib/anim.h b/FitdLib/anim.h index 213c6e9..a593797 100644 --- a/FitdLib/anim.h +++ b/FitdLib/anim.h @@ -3,11 +3,33 @@ #define INFO_TORTUE 4 #define INFO_OPTIMISE 8 + +struct sFrame +{ + u16 m_timestamp; + point3dStruct m_animStep; + std::vector m_groups; +}; + +struct sAnimation +{ + void* m_raw; + + u16 m_numFrames; + u16 m_numGroups; + std::vector m_frames; +}; + +#define NB_BUFFER_ANIM 25 // AITD1 was 20 +#define SIZE_BUFFER_ANIM (8*41) // AITD1 was 4*31 + +extern std::vector BufferAnim; + int InitAnim(int animNum,int animType, int animInfo); -int SetAnimObjet(int frame, char* anim, sBody* body); -s16 SetInterAnimObjet(int frame, char* animPtr, sBody* bodyPtr); -s16 GetNbFramesAnim(char* animPtr); -void StockInterAnim(std::vector& animBuffer, sBody* bodyPtr); +int SetAnimObjet(int frame, sAnimation* anim, sBody* body); +s16 SetInterAnimObjet(int frame, sAnimation* animPtr, sBody* bodyPtr); +s16 GetNbFramesAnim(sAnimation* animPtr); +void StockInterAnim(sFrame& animBuffer, sBody* bodyPtr); void ResetStartAnim(sBody* bodyPtr); void GereAnim(void); void InitCopyBox(char* var0, char* var1); diff --git a/FitdLib/hqr.cpp b/FitdLib/hqr.cpp index 09b3877..3295978 100644 --- a/FitdLib/hqr.cpp +++ b/FitdLib/hqr.cpp @@ -137,9 +137,9 @@ sAnimation* createAnimationFromPtr(void* ptr) sFrame* pFrame = &pAnimation->m_frames[i]; pFrame->m_timestamp = READ_LE_U16(animPtr); animPtr += 2; - pFrame->m_animStep[0] = READ_LE_S16(animPtr); animPtr += 2; - pFrame->m_animStep[1] = READ_LE_S16(animPtr); animPtr += 2; - pFrame->m_animStep[2] = READ_LE_S16(animPtr); animPtr += 2; + pFrame->m_animStep.x = READ_LE_S16(animPtr); animPtr += 2; + pFrame->m_animStep.y = READ_LE_S16(animPtr); animPtr += 2; + pFrame->m_animStep.z = READ_LE_S16(animPtr); animPtr += 2; pFrame->m_groups.resize(pAnimation->m_numGroups); for (int i = 0; i < pAnimation->m_numGroups; i++) @@ -147,9 +147,9 @@ sAnimation* createAnimationFromPtr(void* ptr) sGroupState* pGroup = &pFrame->m_groups[i]; pGroup->m_type = READ_LE_S16(animPtr); animPtr += 2; - pGroup->m_delta[0] = READ_LE_S16(animPtr); animPtr += 2; - pGroup->m_delta[1] = READ_LE_S16(animPtr); animPtr += 2; - pGroup->m_delta[2] = READ_LE_S16(animPtr); animPtr += 2; + pGroup->m_delta.x = READ_LE_S16(animPtr); animPtr += 2; + pGroup->m_delta.y = READ_LE_S16(animPtr); animPtr += 2; + pGroup->m_delta.z = READ_LE_S16(animPtr); animPtr += 2; } } @@ -220,12 +220,12 @@ sBody* createBodyFromPtr(void* ptr) newBody->m_groups[i].m_orgGroup = READ_LE_S8(bodyBuffer); bodyBuffer += 1; newBody->m_groups[i].m_numGroup = READ_LE_S8(bodyBuffer); bodyBuffer += 1; newBody->m_groups[i].m_state.m_type = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_delta[0] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_delta[1] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_delta[2] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_rotateDelta[0] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_rotateDelta[1] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_rotateDelta[2] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_delta.x = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_delta.y = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_delta.z = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_rotateDelta.x = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_rotateDelta.y = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_rotateDelta.z = READ_LE_S16(bodyBuffer); bodyBuffer += 2; newBody->m_groups[i].m_state.m_padding = READ_LE_S16(bodyBuffer); bodyBuffer += 2; } } @@ -247,9 +247,9 @@ sBody* createBodyFromPtr(void* ptr) newBody->m_groups[i].m_orgGroup = READ_LE_S8(bodyBuffer); bodyBuffer += 1; newBody->m_groups[i].m_numGroup = READ_LE_S8(bodyBuffer); bodyBuffer += 1; newBody->m_groups[i].m_state.m_type = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_delta[0] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_delta[1] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_delta[2] = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_delta.x = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_delta.y = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_delta.z = READ_LE_S16(bodyBuffer); bodyBuffer += 2; } } diff --git a/FitdLib/hqr.h b/FitdLib/hqr.h index 1e0356c..dc94a5b 100644 --- a/FitdLib/hqr.h +++ b/FitdLib/hqr.h @@ -9,6 +9,6 @@ void HQR_Reset(hqrEntryStruct* hqrPtr); void HQR_Free(hqrEntryStruct* hqrPtr); sBody* getBodyFromPtr(void* ptr); -sAnimation* getAnimationFromPtr(void* ptr); +struct sAnimation* getAnimationFromPtr(void* ptr); #endif diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index b61711c..19811b7 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -746,7 +746,7 @@ void processLife(int lifeNum, bool callFoundLife) { if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) { - char* pAnim = HQR_Get(listAnim, currentProcessedActorPtr->ANIM); + sAnimation* pAnim = getAnimationFromPtr(HQR_Get(listAnim, currentProcessedActorPtr->ANIM)); if (g_gameId >= JACK) { @@ -787,7 +787,7 @@ void processLife(int lifeNum, bool callFoundLife) if (currentProcessedActorPtr->objectType & AF_ANIMATED) { - char* pAnim = HQR_Get(listAnim, currentProcessedActorPtr->ANIM); + sAnimation* pAnim = getAnimationFromPtr(HQR_Get(listAnim, currentProcessedActorPtr->ANIM)); if (g_gameId >= JACK) { diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 4837cab..c87e068 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -398,12 +398,8 @@ void OpenProgram(void) InitSpecialCopyPoly(aux2); */ BufferAnim.resize(NB_BUFFER_ANIM); - for (int i = 0; i < NB_BUFFER_ANIM; i++) - { - BufferAnim[i].resize(SIZE_BUFFER_ANIM); - } - switch(g_gameId) + switch(g_gameId) { case AITD3: PtrFont = CheckLoadMallocPak("ITD_RESS", 1); diff --git a/FitdLib/main.h b/FitdLib/main.h index 435e7ff..ea1c1ee 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -61,7 +61,6 @@ s16 GiveDistance2D(int x1, int z1, int x2, int z2); void setMoveMode(int trackMode, int trackNumber); void InitRealValue(s16 beta, s16 newBeta, s16 param, RealValue* rotatePtr); s16 updateActorRotation(RealValue* rotatePtr); -s16 GetNbFramesAnim(char* animPtr); void deleteObject(int objIdx); void removeFromBGIncrust(int actorIdx); void makeMessage(int messageIdx); diff --git a/FitdLib/object.cpp b/FitdLib/object.cpp index 7154416..5419ae4 100644 --- a/FitdLib/object.cpp +++ b/FitdLib/object.cpp @@ -101,7 +101,7 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x if(anim != -1) { - char* animPtr = HQR_Get(listAnim,anim); + sAnimation* animPtr = getAnimationFromPtr(HQR_Get(listAnim,anim)); SetAnimObjet(frame,animPtr, bodyPtr); diff --git a/FitdLib/renderer.cpp b/FitdLib/renderer.cpp index 4d4e03d..911b180 100644 --- a/FitdLib/renderer.cpp +++ b/FitdLib/renderer.cpp @@ -331,37 +331,37 @@ int AnimNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) switch(pGroup->m_state.m_type) { case 1: - if(pGroup->m_state.m_delta[0] || pGroup->m_state.m_delta[1] || pGroup->m_state.m_delta[2]) + if(pGroup->m_state.m_delta.x || pGroup->m_state.m_delta.y || pGroup->m_state.m_delta.z) { - TranslateGroupe(pGroup->m_state.m_delta[0], pGroup->m_state.m_delta[1], pGroup->m_state.m_delta[2], pGroup); + TranslateGroupe(pGroup->m_state.m_delta.x, pGroup->m_state.m_delta.y, pGroup->m_state.m_delta.z, pGroup); } break; case 2: - if (pGroup->m_state.m_delta[0] || pGroup->m_state.m_delta[1] || pGroup->m_state.m_delta[2]) + if (pGroup->m_state.m_delta.x || pGroup->m_state.m_delta.y || pGroup->m_state.m_delta.z) { - ZoomGroupe(pGroup->m_state.m_delta[0], pGroup->m_state.m_delta[1], pGroup->m_state.m_delta[2], pGroup); + ZoomGroupe(pGroup->m_state.m_delta.x, pGroup->m_state.m_delta.y, pGroup->m_state.m_delta.z, pGroup); } break; } - InitGroupeRot(pGroup[0].m_state.m_rotateDelta[0], pGroup[0].m_state.m_rotateDelta[1], pGroup[0].m_state.m_rotateDelta[2]); + InitGroupeRot(pGroup[0].m_state.m_rotateDelta.x, pGroup[0].m_state.m_rotateDelta.y, pGroup[0].m_state.m_rotateDelta.z); RotateGroupeOptimise(pGroup); } } else { - pBody->m_groups[0].m_state.m_delta[0] = alpha; - pBody->m_groups[0].m_state.m_delta[1] = beta; - pBody->m_groups[0].m_state.m_delta[2] = gamma; + pBody->m_groups[0].m_state.m_delta.x = alpha; + pBody->m_groups[0].m_state.m_delta.y = beta; + pBody->m_groups[0].m_state.m_delta.z = gamma; for(int i=0;im_groups.size();i++) { int boneDataOffset = pBody->m_groupOrder[i]; sGroup* pGroup = &pBody->m_groups[pBody->m_groupOrder[i]]; - int transX = pGroup->m_state.m_delta[0]; - int transY = pGroup->m_state.m_delta[1]; - int transZ = pGroup->m_state.m_delta[2]; + int transX = pGroup->m_state.m_delta.x; + int transY = pGroup->m_state.m_delta.y; + int transZ = pGroup->m_state.m_delta.z; if(transX || transY || transZ) { diff --git a/FitdLib/save.cpp b/FitdLib/save.cpp index 6e4ee95..3cdcca1 100644 --- a/FitdLib/save.cpp +++ b/FitdLib/save.cpp @@ -498,7 +498,7 @@ int loadSave(int saveNumber) if(objectTable[i].ANIM != -1) { - char* animPtr = HQR_Get(listAnim,objectTable[i].ANIM); + sAnimation* animPtr = getAnimationFromPtr(HQR_Get(listAnim,objectTable[i].ANIM)); SetAnimObjet(objectTable[i].frame,animPtr,bodyPtr); } } diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index 6f925a0..97c1dfb 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -10,7 +10,6 @@ int musicEnabled; char* aux; char* aux2; -std::vector> BufferAnim; char* logicalScreen; @@ -216,9 +215,6 @@ int animStepX; int animStepZ; int animStepY; -char* animVar1; -char* animVar4; - s16 NewNumEtage; int fadeState; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index 83a6325..81e8256 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -277,11 +277,6 @@ extern int musicEnabled; extern char* aux; extern char* aux2; -#define NB_BUFFER_ANIM 25 // AITD1 was 20 -#define SIZE_BUFFER_ANIM (8*41) // AITD1 was 4*31 - -extern std::vector> BufferAnim; - extern char* logicalScreen; extern int screenBufferSize; @@ -457,8 +452,6 @@ extern int animMoveZ; extern int animStepZ; extern int animStepX; extern int animStepY; -extern char* animVar1; -extern char* animVar4; extern s16 NewNumEtage; @@ -532,9 +525,9 @@ extern collisiosDisplayMode sceColDisplayMode; struct sGroupState { s16 m_type; // 0 - s16 m_delta[3]; // 2 + point3dStruct m_delta; // 2 // (AITD2+) if Info_optimise - s16 m_rotateDelta[3]; // 8 + point3dStruct m_rotateDelta; // 8 s16 m_padding; // 8 / 0x10 }; @@ -590,27 +583,10 @@ struct sBody u16 m_flags; //0 size 0x2 ZVStruct16 m_zv; //2 size 0xC - char* startAnim = nullptr; // This is normally stored as 4 bytes at the beginning of scratchBuffer, but we store it here due to pointer size + struct sFrame* startAnim = nullptr; // This is normally stored as 4 bytes at the beginning of scratchBuffer, but we store it here due to pointer size std::vector m_scratchBuffer; //0xE size u16 + data std::vector m_vertices; // size u16 count * 6 std::vector m_groupOrder; // size u16 * 2 std::vector m_groups; // size u16 std::vector m_primitives; }; - -struct sFrame -{ - u16 m_timestamp; - s16 m_animStep[3]; - std::vector m_groups; -}; - -struct sAnimation -{ - void* m_raw; - - u16 m_numFrames; - u16 m_numGroups; - std::vector m_frames; -}; - From f2d6decdb0f0f083b57a6350b25dc12ec494495c Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Tue, 17 Jun 2025 00:28:15 -0700 Subject: [PATCH 54/70] More cleanup --- FitdLib/anim.cpp | 8 +- FitdLib/evalVar.cpp | 4 +- FitdLib/floor.cpp | 2 +- FitdLib/life.cpp | 8 +- FitdLib/main.cpp | 533 ++++++++++++++++++------------------------- FitdLib/main.h | 2 +- FitdLib/mainLoop.cpp | 2 +- FitdLib/object.cpp | 4 +- FitdLib/object.h | 2 +- FitdLib/room.h | 22 +- FitdLib/save.cpp | 4 +- FitdLib/track.cpp | 2 +- FitdLib/vars.cpp | 6 +- FitdLib/vars.h | 6 +- 14 files changed, 256 insertions(+), 349 deletions(-) diff --git a/FitdLib/anim.cpp b/FitdLib/anim.cpp index 7e14d4b..2d151af 100644 --- a/FitdLib/anim.cpp +++ b/FitdLib/anim.cpp @@ -61,7 +61,7 @@ int InitAnim(int animNum,int animType, int animInfo) currentProcessedActorPtr->objectType |= AF_ANIMATED; - SetAnimObjet(currentProcessedActorPtr->frame, getAnimationFromPtr(HQR_Get(listAnim,animNum)), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); + SetAnimObjet(currentProcessedActorPtr->frame, getAnimationFromPtr(HQR_Get(HQ_Anims,animNum)), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); currentProcessedActorPtr->animType = animType; currentProcessedActorPtr->animInfo = animInfo; @@ -96,7 +96,7 @@ int InitAnim(int animNum,int animType, int animInfo) removeFromBGIncrust(currentProcessedActorIdx); } - SetAnimObjet(0, getAnimationFromPtr(HQR_Get(listAnim,animNum)), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); + SetAnimObjet(0, getAnimationFromPtr(HQR_Get(HQ_Anims,animNum)), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); currentProcessedActorPtr->newAnim = animNum; currentProcessedActorPtr->newAnimType = animType; @@ -270,7 +270,7 @@ void GereAnim(void) currentProcessedActorPtr->flagEndAnim = 0; currentProcessedActorPtr->frame = 0; - currentProcessedActorPtr->numOfFrames = GetNbFramesAnim(getAnimationFromPtr(HQR_Get(listAnim, newAnim))); + currentProcessedActorPtr->numOfFrames = GetNbFramesAnim(getAnimationFromPtr(HQR_Get(HQ_Anims, newAnim))); } } @@ -316,7 +316,7 @@ void GereAnim(void) oldStepY = currentProcessedActorPtr->stepY; oldStepZ = currentProcessedActorPtr->stepZ; - currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->frame, getAnimationFromPtr(HQR_Get(listAnim, currentProcessedActorPtr->ANIM)), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); + currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->frame, getAnimationFromPtr(HQR_Get(HQ_Anims, currentProcessedActorPtr->ANIM)), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); walkStep(animStepX,animStepZ,currentProcessedActorPtr->beta); diff --git a/FitdLib/evalVar.cpp b/FitdLib/evalVar.cpp index 2d7a3d7..142dd3d 100644 --- a/FitdLib/evalVar.cpp +++ b/FitdLib/evalVar.cpp @@ -4,7 +4,7 @@ int getPosRelTable[] = {4,1,8,2,4,1,8,0}; int getMatrix(int param1, int actorIdx, int param2) { - unsigned char* matrixPtr = (unsigned char*)HQR_Get(listMatrix,param1); + unsigned char* matrixPtr = (unsigned char*)HQR_Get(HQ_Matrices,param1); int matrixWidth = *matrixPtr++; int matrixHeigh = *matrixPtr++; @@ -515,7 +515,7 @@ int evalVar(const char* name) temp2 = *(s16*)currentLifePtr; currentLifePtr +=2; - return(testZvEndAnim(actorPtr,HQR_Get(listAnim,temp1),temp2)); + return(testZvEndAnim(actorPtr,HQR_Get(HQ_Anims,temp1),temp2)); break; } diff --git a/FitdLib/floor.cpp b/FitdLib/floor.cpp index 8d063ad..eee4df6 100644 --- a/FitdLib/floor.cpp +++ b/FitdLib/floor.cpp @@ -19,7 +19,7 @@ void LoadEtage(int floorNumber) //stopSounds(); HQR_Reset(HQ_Bodys); - HQR_Reset(listAnim); + HQR_Reset(HQ_Anims); g_currentFloor = floorNumber; diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index 19811b7..f6c0347 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -198,7 +198,7 @@ int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alp } } - actorTurnedToObj = 1; + FlagGenereAffList = 1; return(i); } @@ -746,7 +746,7 @@ void processLife(int lifeNum, bool callFoundLife) { if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) { - sAnimation* pAnim = getAnimationFromPtr(HQR_Get(listAnim, currentProcessedActorPtr->ANIM)); + sAnimation* pAnim = getAnimationFromPtr(HQR_Get(HQ_Anims, currentProcessedActorPtr->ANIM)); if (g_gameId >= JACK) { @@ -787,7 +787,7 @@ void processLife(int lifeNum, bool callFoundLife) if (currentProcessedActorPtr->objectType & AF_ANIMATED) { - sAnimation* pAnim = getAnimationFromPtr(HQR_Get(listAnim, currentProcessedActorPtr->ANIM)); + sAnimation* pAnim = getAnimationFromPtr(HQR_Get(HQ_Anims, currentProcessedActorPtr->ANIM)); if (g_gameId >= JACK) { @@ -1174,7 +1174,7 @@ void processLife(int lifeNum, bool callFoundLife) lifeTempVar1 = readNextArgument("TrackMode"); lifeTempVar2 = readNextArgument("TrackNumber"); - setMoveMode(lifeTempVar1, lifeTempVar2); + InitDeplacement(lifeTempVar1, lifeTempVar2); break; } diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index c87e068..849d7e4 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -1168,14 +1168,14 @@ void LoadWorld(void) if(g_gameId == AITD1) { HQ_Bodys = HQR_InitRessource(listBodySelect[CVars[getCVarsIdx(CHOOSE_PERSO)]],37000, 50); // was calculated from free mem size - listAnim = HQR_InitRessource(listAnimSelect[CVars[getCVarsIdx(CHOOSE_PERSO)]],30000, 80); // was calculated from free mem size + HQ_Anims = HQR_InitRessource(listAnimSelect[CVars[getCVarsIdx(CHOOSE_PERSO)]],30000, 80); // was calculated from free mem size } else { HQ_Bodys = HQR_InitRessource("LISTBODY",37000, 50); // was calculated from free mem size - listAnim = HQR_InitRessource("LISTANIM",30000, 80); // was calculated from free mem size + HQ_Anims = HQR_InitRessource("LISTANIM",30000, 80); // was calculated from free mem size - listMatrix = HQR_InitRessource("LISTMAT",64000,5); + HQ_Matrices = HQR_InitRessource("LISTMAT",64000,5); } @@ -1713,7 +1713,7 @@ void DeleteObjet(int index) // remove actor objectPtr->stage = actorPtr->stage; objectPtr->room = actorPtr->room; - actorTurnedToObj = 1; + FlagGenereAffList = 1; } } } @@ -1785,7 +1785,7 @@ void RefreshAux2(void) //TODO: implementer la suite } -void setMoveMode(int trackMode, int trackNumber) +void InitDeplacement(int trackMode, int trackNumber) { currentProcessedActorPtr->trackMode = trackMode; @@ -1807,7 +1807,7 @@ void setMoveMode(int trackMode, int trackNumber) } } -s16 cameraVisibilityVar = 0; +s16 ObjSalleRel = 0; int IsInCamera(int roomNumber) { @@ -1817,12 +1817,12 @@ int IsInCamera(int roomNumber) { if(cameraDataTable[NumCamera]->viewedRoomTable[i].viewedRoomIdx == roomNumber) { - cameraVisibilityVar = i; + ObjSalleRel = i; return(1); } } - cameraVisibilityVar = -1; + ObjSalleRel = -1; return 0; } @@ -1835,376 +1835,283 @@ int IsInCamRectTestAITD2(int X, int Z) // TODO: not 100% exact return 0; } -int updateActorAitd2Only(int actorIdx) -{ - tObject *currentActor = &objectTable[actorIdx]; - - if(g_gameId == AITD1) - { - return 0; - } - - if(currentActor->bodyNum != -1) - { - if(IsInCamera(currentActor->room)) - { - if(IsInCamRectTestAITD2(currentActor->roomX + currentActor->stepX, currentActor->roomZ + currentActor->stepZ)) - { - currentActor->lifeMode |= 4; - return 1; - } - } - } - - return 0; -} - void updateAllActorAndObjectsAITD2() { - for(int i=0;iindexInWorld == -1) - { - continue; - } - - pObject->lifeMode &= ~4; + for (int i = 0; i < NUM_MAX_OBJECT; i++) + { + tObject* pObject = &objectTable[i]; - if(pObject->stage == g_currentFloor) - { - switch(pObject->lifeMode) - { - case 0: // OFF - break; - case 1: // STAGE - continue; - case 2: // ROOM - if(pObject->room == currentRoom) - { - continue; - } - break; - case 3: // CAMERA - if(isInViewList(pObject->room)) - { - continue; - } - break; - default: - //assert(0); - break; - } + if (pObject->indexInWorld == -1) + { + continue; + } - if(updateActorAitd2Only(i)) - { - pObject->lifeMode |= 4; - continue; - } - } - DeleteObjet(i); - } + pObject->lifeMode &= ~4; - for(int i=0;istage == g_currentFloor) + { + switch (pObject->lifeMode) + { + case 0: // OFF + break; + case 1: // STAGE + continue; + case 2: // ROOM + if (pObject->room == currentRoom) + { + continue; + } + break; + case 3: // CAMERA + if (isInViewList(pObject->room)) + { + continue; + } + break; + default: + break; + } - if(currentObject->objIndex != -1) - { - if(currentWorldTarget == i) - { - currentCameraTargetActor = currentObject->objIndex; - } - } - else - { - if(currentObject->stage == g_currentFloor) - { - if(currentObject->life != -1) - { - if(currentObject->lifeMode != -1) - { - int actorIdx; - int di; + if (pObject->bodyNum != -1) + { + if (IsInCamera(pObject->room)) + { + if (IsInCamRectTestAITD2(pObject->roomX + pObject->stepX, pObject->roomZ + pObject->stepZ)) + { + pObject->lifeMode |= 4; + continue; + } + } + } + } + DeleteObjet(i); + } - switch(currentObject->lifeMode&3) - { - case 0: - { - di = 0; - break; - } - case 1: - { - di = 1; - break; - } - case 2: - { - if(currentObject->room != currentRoom) - { - di = 0; - } - else - { - di = 1; - } - break; - } - case 3: - { - if(!isInViewList(currentObject->room)) - { - di = 0; - } - else - { - di = 1; - } - break; - } - } + for (int i = 0; i < maxObjects; i++) + { + tWorldObject* currentObject = &ListWorldObjets[i]; - if(!di) - { - if(currentObject->body != -1) - { - if(IsInCamera(currentObject->room)) - { - if(IsInCamRectTestAITD2(currentObject->x,currentObject->z)) - { - currentObject->lifeMode |= 4; - } - else - { - continue; - } - } - else - { - continue; - } - } - else - { - continue; - } - } + if (currentObject->objIndex != -1) + { + if (currentWorldTarget == i) + { + currentCameraTargetActor = currentObject->objIndex; + } + continue; + } - //int var_C = currentObject->flags & 0xFFDF; - //int var_E = currentObject->field_2; - //int var_A = currentObject->anim; -addObject: - actorIdx = copyObjectToActor( currentObject->body, currentObject->typeZV, currentObject->foundName, - currentObject->flags & 0xFFDF, - currentObject->x, currentObject->y, currentObject->z, - currentObject->stage, currentObject->room, - currentObject->alpha, currentObject->beta, currentObject->gamma, - currentObject->anim, - currentObject->frame, currentObject->animType, currentObject->animInfo); + if (currentObject->stage != g_currentFloor) + continue; - currentObject->objIndex = actorIdx; + bool isOk = false; + switch (currentObject->lifeMode & 3) + { + case 0: // OFF + isOk = false; + break; + case 1: // STAGE + isOk = true; + break; + case 3: // CAMERA + if (!isInViewList(currentObject->room)) + { + isOk = false; + } + else + { + isOk = true; + } + break; + case 2: // ROOM + if (currentObject->room != currentRoom) + { + isOk = false; + } + else + { + isOk = true; + } + break; + } - if(actorIdx != -1) - { - currentProcessedActorPtr = &objectTable[actorIdx]; - currentProcessedActorIdx = actorIdx; + if (!isOk) { + if ((currentObject->body == -1) || (!IsInCamera(currentObject->room)) || (!IsInCamRectTestAITD2(currentObject->x, currentObject->z))) + { + continue; + } + else { + currentObject->lifeMode |= 4; + } + } - if(currentWorldTarget == i) - { - currentCameraTargetActor = currentProcessedActorIdx; - } + currentObject->objIndex = InitObjet(currentObject->body, currentObject->typeZV, currentObject->foundName, + currentObject->flags & ~AF_SPECIAL, + currentObject->x, currentObject->y, currentObject->z, + currentObject->stage, currentObject->room, + currentObject->alpha, currentObject->beta, currentObject->gamma, + currentObject->anim, + currentObject->frame, currentObject->animType, currentObject->animInfo); - currentProcessedActorPtr->dynFlags = (currentObject->flags & 0x20) / 0x20; // recheck - currentProcessedActorPtr->life = currentObject->life; - currentProcessedActorPtr->lifeMode = currentObject->lifeMode; + if (currentObject->objIndex != -1) + { + currentProcessedActorPtr = &objectTable[currentObject->objIndex]; + currentProcessedActorIdx = currentObject->objIndex; - currentProcessedActorPtr->indexInWorld = i; + if (currentWorldTarget == i) + { + currentCameraTargetActor = currentProcessedActorIdx; + } - setMoveMode(currentObject->trackMode, currentObject->trackNumber); + currentProcessedActorPtr->dynFlags = (currentObject->flags & 0x20) / 0x20; // recheck + currentProcessedActorPtr->life = currentObject->life; + currentProcessedActorPtr->lifeMode = currentObject->lifeMode; - currentProcessedActorPtr->positionInTrack = currentObject->positionInTrack; + currentProcessedActorPtr->indexInWorld = i; - if(g_gameId != AITD1) - { - currentProcessedActorPtr->MARK = currentObject->mark; - } + InitDeplacement(currentObject->trackMode, currentObject->trackNumber); - actorTurnedToObj = 1; - } - } - } - else - { - if(isInViewList(currentObject->room)) - goto addObject; - } - } - } - } + currentProcessedActorPtr->positionInTrack = currentObject->positionInTrack; - // objModifFlag1 = 0; + if (g_gameId != AITD1) + { + currentProcessedActorPtr->MARK = currentObject->mark; + } - //TODO: object update + FlagGenereAffList = 1; + } + } + //FlagGenereActiveList = true; } + void GenereActiveList() { - int i; - tObject *currentActor = objectTable.data(); - tWorldObject* currentObject; - if(g_gameId > JACK) { updateAllActorAndObjectsAITD2(); return; } - for(i=0;iindexInWorld != -1) + tObject* currentActor = &objectTable[i]; + if (currentActor->indexInWorld == -1) + continue; + + if(currentActor->stage == g_currentFloor) { - if(currentActor->stage == g_currentFloor) + if(currentActor->life != -1) { - if(currentActor->life != -1) + switch(currentActor->lifeMode) { - switch(currentActor->lifeMode) + case 0: // STAGE + continue; + case 1: // ROOM + if(currentActor->room != currentRoom) { - case 0: - { - break; - } - case 1: - { - if(currentActor->room != currentRoom) - { - DeleteObjet(i); - } - break; - } - case 2: - { - if(!isInViewList(currentActor->room)) - { - DeleteObjet(i); - } - break; - } - default: - { - DeleteObjet(i); - break; - } + continue; } - } - else - { + break; + case 2: // CAMERA if(!isInViewList(currentActor->room)) { DeleteObjet(i); } + break; + default: + { + break; + } } } else { - DeleteObjet(i); + if(!isInViewList(currentActor->room)) + { + continue; + } } } - currentActor++; + DeleteObjet(i); } - currentObject = &ListWorldObjets[0]; - - for(i=0;iobjIndex != -1) - { + tWorldObject* currentObject = &ListWorldObjets[i]; + if(currentObject->objIndex != -1) { if(currentWorldTarget == i) { currentCameraTargetActor = currentObject->objIndex; } + continue; } - else - { - if(currentObject->stage == g_currentFloor) - { - if(currentObject->life != -1) - { - if(currentObject->lifeMode != -1) - { - int actorIdx; - switch(currentObject->lifeMode) - { - case 1: - { - if(currentObject->room != currentRoom) - { - currentObject++; - continue; - } - break; - } - case 2: - { - if(!isInViewList(currentObject->room)) - { - currentObject++; - continue; - } - break; - } - } + if (currentObject->stage != g_currentFloor) { + continue; + } - //int var_C = currentObject->flags & 0xFFDF; - //int var_E = currentObject->field_2; - //int var_A = currentObject->anim; + if (currentObject->life != -1) + { + switch (currentObject->lifeMode) + { + case -1: + continue; -addObject: actorIdx = copyObjectToActor( currentObject->body, currentObject->typeZV, currentObject->foundName, - currentObject->flags & 0xFFDF, - currentObject->x, currentObject->y, currentObject->z, - currentObject->stage, currentObject->room, - currentObject->alpha, currentObject->beta, currentObject->gamma, - currentObject->anim, - currentObject->frame, currentObject->animType, currentObject->animInfo); + case 0: // Stage + break; + + case 1: // Room + if (currentObject->room != currentRoom) + { + continue; + } + break; + case 2: // Camera + if (!isInViewList(currentObject->room)) + { + continue; + } + break; + } + } + else + { + if (!isInViewList(currentObject->room)) { + continue; + } + } - currentObject->objIndex = actorIdx; + currentObject->objIndex = InitObjet( currentObject->body, currentObject->typeZV, currentObject->foundName, + currentObject->flags & ~AF_SPECIAL, + currentObject->x, currentObject->y, currentObject->z, + currentObject->stage, currentObject->room, + currentObject->alpha, currentObject->beta, currentObject->gamma, + currentObject->anim, + currentObject->frame, currentObject->animType, currentObject->animInfo); - if(actorIdx != -1) - { - currentProcessedActorPtr = &objectTable[actorIdx]; - currentProcessedActorIdx = actorIdx; + if(currentObject->objIndex != -1) + { + currentProcessedActorPtr = &objectTable[currentObject->objIndex]; + currentProcessedActorIdx = currentObject->objIndex; - if(currentWorldTarget == i) - { - currentCameraTargetActor = currentProcessedActorIdx; - } + if(currentWorldTarget == i) + { + currentCameraTargetActor = currentProcessedActorIdx; + } - currentProcessedActorPtr->dynFlags = (currentObject->flags & 0x20) / 0x20; // recheck - currentProcessedActorPtr->life = currentObject->life; - currentProcessedActorPtr->lifeMode = currentObject->lifeMode; + currentProcessedActorPtr->dynFlags = (currentObject->flags & 0x20) / 0x20; // recheck + currentProcessedActorPtr->life = currentObject->life; + currentProcessedActorPtr->lifeMode = currentObject->lifeMode; - currentProcessedActorPtr->indexInWorld = i; + currentProcessedActorPtr->indexInWorld = i; - setMoveMode(currentObject->trackMode, currentObject->trackNumber); + InitDeplacement(currentObject->trackMode, currentObject->trackNumber); - currentProcessedActorPtr->positionInTrack = currentObject->positionInTrack; + currentProcessedActorPtr->positionInTrack = currentObject->positionInTrack; - actorTurnedToObj = 1; - } - } - } - else - { - if(isInViewList(currentObject->room)) - goto addObject; - } - } + FlagGenereAffList = 1; } - - currentObject++; } // FlagGenereActiveList = 0; @@ -3879,7 +3786,7 @@ void GereDec() } else { - actorTurnedToObj = 1; + FlagGenereAffList = 1; } startChrono(¤tProcessedActorPtr->ROOM_CHRONO); @@ -4481,7 +4388,7 @@ void cleanupAndExit(void) HQR_Free(listLife); HQR_Free(listTrack); HQR_Free(HQ_Bodys); - HQR_Free(listAnim); + HQR_Free(HQ_Anims); /* free(tabTextes); free(aux); diff --git a/FitdLib/main.h b/FitdLib/main.h index ea1c1ee..22c5c52 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -58,7 +58,7 @@ void SetProjection(int centerX, int centerY, int x, int y, int z); void SetAngleCamera(int x, int y, int z); void SetPosCamera(int x, int y, int z); s16 GiveDistance2D(int x1, int z1, int x2, int z2); -void setMoveMode(int trackMode, int trackNumber); +void InitDeplacement(int trackMode, int trackNumber); void InitRealValue(s16 beta, s16 newBeta, s16 param, RealValue* rotatePtr); s16 updateActorRotation(RealValue* rotatePtr); void deleteObject(int objIdx); diff --git a/FitdLib/mainLoop.cpp b/FitdLib/mainLoop.cpp index 9e4b4ca..ee42c65 100644 --- a/FitdLib/mainLoop.cpp +++ b/FitdLib/mainLoop.cpp @@ -219,7 +219,7 @@ void PlayWorld(int allowSystemMenu, int deltaTime) if (!(currentProcessedActorPtr->lifeMode & 4)) { processLife(currentProcessedActorPtr->life, false); - actorTurnedToObj = 1; + FlagGenereAffList = 1; } } } diff --git a/FitdLib/object.cpp b/FitdLib/object.cpp index 5419ae4..37f0f3f 100644 --- a/FitdLib/object.cpp +++ b/FitdLib/object.cpp @@ -1,6 +1,6 @@ #include "common.h" -int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x, int y, int z, int stage, int room, int alpha, int beta, int gamma, int anim, int frame, int animtype, int animInfo) +int InitObjet(int body, int typeZv, int hardZvIdx, s16 objectType, int x, int y, int z, int stage, int room, int alpha, int beta, int gamma, int anim, int frame, int animtype, int animInfo) { int i; int j; @@ -101,7 +101,7 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x if(anim != -1) { - sAnimation* animPtr = getAnimationFromPtr(HQR_Get(listAnim,anim)); + sAnimation* animPtr = getAnimationFromPtr(HQR_Get(HQ_Anims,anim)); SetAnimObjet(frame,animPtr, bodyPtr); diff --git a/FitdLib/object.h b/FitdLib/object.h index f434465..30dc2e7 100644 --- a/FitdLib/object.h +++ b/FitdLib/object.h @@ -1,4 +1,4 @@ #ifndef _OBJECT_H_ #define _OBJECT_H_ -int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x, int y, int z, int stage, int room, int alpha, int beta, int gamma, int anim, int frame, int animtype, int animInfo); +int InitObjet(int body, int typeZv, int hardZvIdx, s16 objectType, int x, int y, int z, int stage, int room, int alpha, int beta, int gamma, int anim, int frame, int animtype, int animInfo); #endif diff --git a/FitdLib/room.h b/FitdLib/room.h index 3f3513d..cc59276 100644 --- a/FitdLib/room.h +++ b/FitdLib/room.h @@ -72,20 +72,20 @@ struct cameraViewedRoomStruct struct cameraDataStruct { - s16 alpha; - s16 beta; - s16 gamma; + s16 alpha; // 0 + s16 beta; // 2 + s16 gamma; // 4 - s16 x; - s16 y; - s16 z; + s16 x; // 6 + s16 y; // 8 + s16 z; // 10 - s16 focal1; - s16 focal2; - s16 focal3; + s16 focal1; // 12 + s16 focal2; // 14 + s16 focal3; // 16 - u16 numViewedRooms; - std::vector viewedRoomTable; + u16 numViewedRooms; // 18 + std::vector viewedRoomTable; // 20 }; struct roomDataStruct diff --git a/FitdLib/save.cpp b/FitdLib/save.cpp index 3cdcca1..b37f42c 100644 --- a/FitdLib/save.cpp +++ b/FitdLib/save.cpp @@ -261,7 +261,7 @@ int loadSave(int saveNumber) if(g_gameId == AITD1) { configureHqrHero(HQ_Bodys,listBodySelect[CVars[getCVarsIdx(CHOOSE_PERSO)]]); - configureHqrHero(listAnim,listAnimSelect[CVars[getCVarsIdx(CHOOSE_PERSO)]]); + configureHqrHero(HQ_Anims,listAnimSelect[CVars[getCVarsIdx(CHOOSE_PERSO)]]); } else { @@ -498,7 +498,7 @@ int loadSave(int saveNumber) if(objectTable[i].ANIM != -1) { - sAnimation* animPtr = getAnimationFromPtr(HQR_Get(listAnim,objectTable[i].ANIM)); + sAnimation* animPtr = getAnimationFromPtr(HQR_Get(HQ_Anims,objectTable[i].ANIM)); SetAnimObjet(objectTable[i].frame,animPtr,bodyPtr); } } diff --git a/FitdLib/track.cpp b/FitdLib/track.cpp index 3192104..5367eaf 100644 --- a/FitdLib/track.cpp +++ b/FitdLib/track.cpp @@ -488,7 +488,7 @@ void processTrack(void) { currentProcessedActorPtr->speed = 0; currentProcessedActorPtr->trackNumber = -1; - setMoveMode(0,0); + InitDeplacement(0,0); break; } case TL_REPEAT: diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index 97c1dfb..9697948 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -80,11 +80,11 @@ s16 currentWorldTarget; int fileSize; hqrEntryStruct* HQ_Bodys = nullptr; -hqrEntryStruct* listAnim = nullptr; +hqrEntryStruct* HQ_Anims = nullptr; hqrEntryStruct* listLife = nullptr; hqrEntryStruct* listTrack = nullptr; hqrEntryStruct* listHybrides = nullptr; -hqrEntryStruct* listMatrix = nullptr; +hqrEntryStruct* HQ_Matrices = nullptr; s16 maxObjects; @@ -162,7 +162,7 @@ int cameraFovY; char currentCameraVisibilityList[30]; -int actorTurnedToObj = 0; +int FlagGenereAffList = 0; int currentProcessedActorIdx; tObject* currentProcessedActorPtr; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index 81e8256..351c988 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -336,11 +336,11 @@ extern s16 currentWorldTarget; extern int fileSize; extern hqrEntryStruct* HQ_Bodys; -extern hqrEntryStruct* listAnim; +extern hqrEntryStruct* HQ_Anims; extern hqrEntryStruct* listLife; extern hqrEntryStruct* listTrack; extern hqrEntryStruct* listHybrides; -extern hqrEntryStruct* listMatrix; +extern hqrEntryStruct* HQ_Matrices; extern s16 maxObjects; @@ -417,7 +417,7 @@ extern int cameraFovY; extern char currentCameraVisibilityList[30]; -extern int actorTurnedToObj; +extern int FlagGenereAffList; extern int currentProcessedActorIdx; extern tObject* currentProcessedActorPtr; From f54ae34a836826126dd3e1a406d4030d73cb8427 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Tue, 17 Jun 2025 01:07:59 -0700 Subject: [PATCH 55/70] Clear animations between floors to avoid potentially taking the wrong one. This is not a great fix, and the real solution will be to handle the proper types of HQR containers --- FitdLib/hqr.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/FitdLib/hqr.cpp b/FitdLib/hqr.cpp index 3295978..e1ff11d 100644 --- a/FitdLib/hqr.cpp +++ b/FitdLib/hqr.cpp @@ -518,6 +518,13 @@ void HQR_Reset(hqrEntryStruct* hqrPtr) } vBodies.resize(0); } + if (hqrPtr == HQ_Anims) { + for (int i = 0; i < vAnimations.size(); i++) + { + delete vAnimations[i]; + } + vAnimations.resize(0); + } for(i=0;inumMaxEntry;i++) { @@ -544,6 +551,13 @@ void HQR_Free(hqrEntryStruct* hqrPtr) } vBodies.clear(); } + if (hqrPtr == HQ_Anims) { + for (int i = 0; i < vAnimations.size(); i++) + { + delete vAnimations[i]; + } + vAnimations.clear(); + } for(i=0;inumMaxEntry;i++) { From 51e74e70664a676b3e79e2bb6de1936a5d6274a2 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Tue, 17 Jun 2025 22:13:04 -0700 Subject: [PATCH 56/70] HQR rework and cleanup body/anim storage --- FitdLib/AITD1_Tatou.cpp | 13 +- FitdLib/anim.cpp | 16 +- FitdLib/anim.h | 2 + FitdLib/animAction.cpp | 4 +- FitdLib/evalVar.cpp | 35 ++--- FitdLib/hqr.cpp | 328 ++++++++++++++-------------------------- FitdLib/hqr.h | 41 +++-- FitdLib/inventory.cpp | 6 +- FitdLib/life.cpp | 14 +- FitdLib/main.cpp | 34 ++--- FitdLib/main.h | 3 +- FitdLib/object.cpp | 4 +- FitdLib/renderer.cpp | 14 +- FitdLib/renderer.h | 3 +- FitdLib/save.cpp | 4 +- FitdLib/vars.cpp | 17 +-- FitdLib/vars.h | 41 ++--- 17 files changed, 220 insertions(+), 359 deletions(-) diff --git a/FitdLib/AITD1_Tatou.cpp b/FitdLib/AITD1_Tatou.cpp index d53d818..cf26914 100644 --- a/FitdLib/AITD1_Tatou.cpp +++ b/FitdLib/AITD1_Tatou.cpp @@ -12,8 +12,6 @@ void clearScreenTatou(void) int make3dTatou(void) { - char* tatou2d; - char* tatou3d; int zoom; int deltaTime; int beta; @@ -22,8 +20,11 @@ int make3dTatou(void) palette_t tatouPal; palette_t paletteBackup; - tatou2d = CheckLoadMallocPak("ITD_RESS",AITD1_TATOU_MCG); - tatou3d = CheckLoadMallocPak("ITD_RESS",AITD1_TATOU_3DO); + char* tatou2d = CheckLoadMallocPak("ITD_RESS",AITD1_TATOU_MCG); + + char* tatou3dRaw = CheckLoadMallocPak("ITD_RESS", AITD1_TATOU_3DO); + sBody* tatou3d = createBodyFromPtr(tatou3dRaw); + char* tatouPalRaw = CheckLoadMallocPak("ITD_RESS",AITD1_TATOU_PAL); copyPalette(tatouPalRaw, tatouPal); @@ -125,7 +126,9 @@ int make3dTatou(void) } }while(1); - free(tatou3d); + delete[] tatou3dRaw; + delete tatou3d; + free(tatou2d); if(key || Click || JoyD) diff --git a/FitdLib/anim.cpp b/FitdLib/anim.cpp index 2d151af..284019a 100644 --- a/FitdLib/anim.cpp +++ b/FitdLib/anim.cpp @@ -1,7 +1,7 @@ -#include - #include "common.h" +hqrEntryStruct* HQ_Anims = nullptr; + std::vector BufferAnim; int SetAnimObjet(int frame, sAnimation* pAnimation, sBody* body) @@ -61,7 +61,7 @@ int InitAnim(int animNum,int animType, int animInfo) currentProcessedActorPtr->objectType |= AF_ANIMATED; - SetAnimObjet(currentProcessedActorPtr->frame, getAnimationFromPtr(HQR_Get(HQ_Anims,animNum)), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); + SetAnimObjet(currentProcessedActorPtr->frame, HQR_Get(HQ_Anims,animNum), HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); currentProcessedActorPtr->animType = animType; currentProcessedActorPtr->animInfo = animInfo; @@ -96,7 +96,7 @@ int InitAnim(int animNum,int animType, int animInfo) removeFromBGIncrust(currentProcessedActorIdx); } - SetAnimObjet(0, getAnimationFromPtr(HQR_Get(HQ_Anims,animNum)), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); + SetAnimObjet(0, HQR_Get(HQ_Anims,animNum), HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); currentProcessedActorPtr->newAnim = animNum; currentProcessedActorPtr->newAnimType = animType; @@ -248,7 +248,7 @@ void GereAnim(void) } // TODO: AITD3 has some extra code here to handle bufferAnimCounter - StockInterAnim(BufferAnim[bufferAnimCounter], getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); + StockInterAnim(BufferAnim[bufferAnimCounter], HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); bufferAnimCounter++; if (bufferAnimCounter == NB_BUFFER_ANIM) @@ -256,7 +256,7 @@ void GereAnim(void) } else { - ResetStartAnim(getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); + ResetStartAnim(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); currentProcessedActorPtr->newAnimType &= ~ANIM_RESET; } currentProcessedActorPtr->ANIM = newAnim; @@ -270,7 +270,7 @@ void GereAnim(void) currentProcessedActorPtr->flagEndAnim = 0; currentProcessedActorPtr->frame = 0; - currentProcessedActorPtr->numOfFrames = GetNbFramesAnim(getAnimationFromPtr(HQR_Get(HQ_Anims, newAnim))); + currentProcessedActorPtr->numOfFrames = GetNbFramesAnim(HQR_Get(HQ_Anims, newAnim)); } } @@ -316,7 +316,7 @@ void GereAnim(void) oldStepY = currentProcessedActorPtr->stepY; oldStepZ = currentProcessedActorPtr->stepZ; - currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->frame, getAnimationFromPtr(HQR_Get(HQ_Anims, currentProcessedActorPtr->ANIM)), getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum))); + currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->frame, HQR_Get(HQ_Anims, currentProcessedActorPtr->ANIM), HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); walkStep(animStepX,animStepZ,currentProcessedActorPtr->beta); diff --git a/FitdLib/anim.h b/FitdLib/anim.h index a593797..7278a40 100644 --- a/FitdLib/anim.h +++ b/FitdLib/anim.h @@ -20,6 +20,8 @@ struct sAnimation std::vector m_frames; }; +extern hqrEntryStruct* HQ_Anims; + #define NB_BUFFER_ANIM 25 // AITD1 was 20 #define SIZE_BUFFER_ANIM (8*41) // AITD1 was 4*31 diff --git a/FitdLib/animAction.cpp b/FitdLib/animAction.cpp index 8d10555..f55bbcf 100644 --- a/FitdLib/animAction.cpp +++ b/FitdLib/animAction.cpp @@ -162,7 +162,7 @@ void GereFrappe(void) ZVStruct rangeZv; - GiveZVObjet(getBodyFromPtr(HQR_Get(HQ_Bodys, objPtr->body)),&rangeZv); + GiveZVObjet(HQR_Get(HQ_Bodys, objPtr->body),&rangeZv); rangeZv.ZVX1 += x; rangeZv.ZVX2 += x; @@ -235,7 +235,7 @@ void GereFrappe(void) actorPtr->roomY = y; actorPtr->roomZ = z; - GiveZVObjet(getBodyFromPtr(HQR_Get(HQ_Bodys,actorPtr->bodyNum)),&actorPtr->zv); + GiveZVObjet(HQR_Get(HQ_Bodys,actorPtr->bodyNum),&actorPtr->zv); actorPtr->zv.ZVX1 += x; actorPtr->zv.ZVX2 += x; diff --git a/FitdLib/evalVar.cpp b/FitdLib/evalVar.cpp index 142dd3d..a2a277c 100644 --- a/FitdLib/evalVar.cpp +++ b/FitdLib/evalVar.cpp @@ -103,44 +103,29 @@ int calcDist(int X1, int Y1, int Z1, int X2, int Y2, int Z2) return(Xdist + Ydist + Zdist); // recheck overflow } -int testZvEndAnim(tObject* actorPtr,char* animPtr, int param) +int testZvEndAnim(tObject* actorPtr,sAnimation* animPtr, int param) { - s16 var_16; - s16 var_14; - s16 var_E = 0; - s16 var_12 = 0; - s16 var_10 = param; - s16 var_18; - ZVStruct localZv; - ASSERT(actorPtr); ASSERT(animPtr); - var_16 = *(s16*)(animPtr); - animPtr += 2; - var_14 = *(s16*)(animPtr); - animPtr += 2; + s16 stepX = 0; + s16 stepZ = 0; - for(var_18 = 0; var_18 < var_16; var_18 ++) + for(int i=0; i< animPtr->m_numFrames; i++) { - animPtr += 2; - var_12 += *(s16*)animPtr; - animPtr += 2; - animPtr += 2; - var_E += *(s16*)animPtr; // step depth - animPtr += 2; - - animPtr+= var_14*8; + stepZ += animPtr->m_frames[i].m_animStep.x; + stepX += animPtr->m_frames[i].m_animStep.z; } + ZVStruct localZv; copyZv(&actorPtr->zv, &localZv); - walkStep(0,var_E,actorPtr->beta); + walkStep(0,stepX,actorPtr->beta); localZv.ZVX1 += animMoveX; localZv.ZVX2 += animMoveX; - localZv.ZVY1 += var_10; - localZv.ZVY2 += var_10; + localZv.ZVY1 += param; + localZv.ZVY2 += param; localZv.ZVZ1 += animMoveZ; localZv.ZVZ2 += animMoveZ; diff --git a/FitdLib/hqr.cpp b/FitdLib/hqr.cpp index e1ff11d..7198722 100644 --- a/FitdLib/hqr.cpp +++ b/FitdLib/hqr.cpp @@ -1,53 +1,68 @@ #include "common.h" -hqrSubEntryStruct* quickFindEntry(int index, int numMax, hqrSubEntryStruct* ptr) // no RE. Original was probably faster +template +struct hqrSubEntryStruct { - int i; - - for(i=0;i +struct hqrEntryStruct +{ + char string[10]; + u16 maxFreeData; + u16 sizeFreeData; + u16 numMaxEntry; + u16 numUsedEntry; + std::vector> entries; +}; + +template +hqrSubEntryStruct* quickFindEntry(int index, int numMax, std::vector>& ptr) // no RE. Original was probably faster +{ + for(int i=0;i +hqrEntryStruct* HQR_InitRessource(const char* name, int size, int numEntries) { - int i; - hqrEntryStruct* dest; - - dest = (hqrEntryStruct*)malloc(sizeof(hqrEntryStruct)); + hqrEntryStruct* dest = new hqrEntryStruct(); if(!dest) return NULL; numEntries = 2000; - strcpy(dest->string," "); - strncpy(dest->string,name,8); + strcpy_s(dest->string, sizeof(dest->string), " "); + strncpy_s(dest->string, sizeof(dest->string), name,8); dest->sizeFreeData = size; dest->maxFreeData = size; dest->numMaxEntry = numEntries; dest->numUsedEntry = 0; - dest->entries = (hqrSubEntryStruct*)malloc(numEntries*sizeof(hqrSubEntryStruct)); + dest->entries.resize(numEntries); - for(i=0;ientries[i].ptr = NULL; + dest->entries[i].ptr = nullptr; } return(dest); } -int HQ_Malloc(hqrEntryStruct* hqrPtr,int size) +int HQ_Malloc(hqrEntryStruct* hqrPtr,int size) { - hqrSubEntryStruct* dataPtr1; - hqrSubEntryStruct* dataPtr2; int key; int entryNum; @@ -56,15 +71,13 @@ int HQ_Malloc(hqrEntryStruct* hqrPtr,int size) entryNum = hqrPtr->numUsedEntry; - dataPtr1 = dataPtr2 = hqrPtr->entries; - key = hqrKeyGen; - dataPtr1[entryNum].key = key; + hqrPtr->entries[entryNum].key = key; // dataPtr1[entryNum].offset = hqrPtr->maxFreeData - hqrPtr->sizeFreeData; - dataPtr1[entryNum].size = size; - dataPtr1[entryNum].ptr = (char*)malloc(size); + hqrPtr->entries[entryNum].size = size; + hqrPtr->entries[entryNum].ptr = (char*)malloc(size); hqrPtr->numUsedEntry++; hqrPtr->sizeFreeData -= size; @@ -74,17 +87,13 @@ int HQ_Malloc(hqrEntryStruct* hqrPtr,int size) return(key); } -char* HQ_PtrMalloc(hqrEntryStruct* hqrPtr, int index) +char* HQ_PtrMalloc(hqrEntryStruct* hqrPtr, int index) { - hqrSubEntryStruct* ptr; - hqrSubEntryStruct* dataPtr; if(index<0) return NULL; - dataPtr = hqrPtr->entries; - - ptr = quickFindEntry(index, hqrPtr->numUsedEntry, dataPtr); + hqrSubEntryStruct* ptr = quickFindEntry(index, hqrPtr->numUsedEntry, hqrPtr->entries); if(!ptr) return NULL; @@ -92,35 +101,6 @@ char* HQ_PtrMalloc(hqrEntryStruct* hqrPtr, int index) return(ptr->ptr); } -void moveHqrEntry(hqrEntryStruct* hqrPtr, int index) -{ - /* hqrSubEntryStruct* hqrSubPtr = (hqrSubEntryStruct*)(((char*)hqrPtr)+sizeof(hqrEntryStruct)); - hqrSubEntryStruct* hqrSubPtr2 = hqrSubPtr; - - int size = hqrSubPtr[index].size; - - if(hqrPtr->numUsedEntry - 1 > index ) //if not last entry - { - char* dest = hqrPtr->dataPtr + hqrSubPtr2[index].offset; - char* src = dest + size; - - memcpy(dest,src,hqrPtr->dataPtr + hqrPtr->maxFreeData - src); - - dest = (char*)&hqrSubPtr2[index]; - src = (char*)&hqrSubPtr2[index+1]; - memcpy(dest,src,hqrPtr->numMaxEntry-(index+1) * sizeof(hqrSubEntryStruct)); - }*/ - - int size = hqrPtr->entries[index].size; - - free(hqrPtr->entries[index].ptr); - - hqrPtr->numUsedEntry --; - hqrPtr->sizeFreeData += size; -} - -std::vector vAnimations; - sAnimation* createAnimationFromPtr(void* ptr) { u8* animPtr = (u8*)ptr; @@ -152,13 +132,9 @@ sAnimation* createAnimationFromPtr(void* ptr) pGroup->m_delta.z = READ_LE_S16(animPtr); animPtr += 2; } } - - vAnimations.push_back(pAnimation); return pAnimation; } -std::vector vBodies; - sBody* createBodyFromPtr(void* ptr) { u8* bodyBuffer = (u8*)ptr; @@ -336,13 +312,13 @@ sBody* createBodyFromPtr(void* ptr) } } - vBodies.push_back(newBody); return newBody; } -char* HQR_Get(hqrEntryStruct* hqrPtr, int index) +template +T* HQR_Get(hqrEntryStruct* hqrPtr, int index) { - hqrSubEntryStruct* foundEntry; + hqrSubEntryStruct* foundEntry; if(index<0) return NULL; @@ -358,66 +334,8 @@ char* HQR_Get(hqrEntryStruct* hqrPtr, int index) } else { - /* int size; - unsigned int time; - char* ptr; - - freezeTime(); - size = getPakSize(hqrPtr->string,index); - - if(size>=hqrPtr->maxFreeData) - { - theEnd(1,hqrPtr->string); - } - - time = timer; - - foundEntry = hqrSubPtr; - - while(size>hqrPtr->sizeFreeData || hqrPtr->numUsedEntry>= hqrPtr->numMaxEntry) - { - int bestEntry = 0; - unsigned int bestTime = 0; - int entryIdx = 0; - - for(entryIdx = 0; entryIdxnumUsedEntry; entryIdx++) - { - if(time - foundEntry[entryIdx].lastTimeUsed > bestTime) - { - bestTime = time - foundEntry[entryIdx].lastTimeUsed; - bestEntry = entryIdx; - } - } - - moveHqrEntry(hqrPtr,bestEntry); - } - - ptr = hqrPtr->dataPtr + (hqrPtr->maxFreeData - hqrPtr->sizeFreeData); - - if(!loadPakToPtr(hqrPtr->string,index,ptr)) - { - theEnd(1,hqrPtr->string); - } - - hqrVar1 = 1; - - foundEntry[hqrPtr->numUsedEntry].key = index; - foundEntry[hqrPtr->numUsedEntry].lastTimeUsed = timer; - foundEntry[hqrPtr->numUsedEntry].offset = hqrPtr->maxFreeData - hqrPtr->sizeFreeData; - foundEntry[hqrPtr->numUsedEntry].size = size; - - hqrPtr->numUsedEntry++; - hqrPtr->sizeFreeData -= size; - - unfreezeTime();*/ - - int size; - unsigned int time; - char* ptr; - int i; - SaveTimerAnim(); - size = getPakSize(hqrPtr->string,index); + int size = getPakSize(hqrPtr->string,index); if(size == 0) return NULL; @@ -427,9 +345,9 @@ char* HQR_Get(hqrEntryStruct* hqrPtr, int index) fatalError(1,hqrPtr->string); } - time = timer; + unsigned int time = timer; - for(i=0;inumMaxEntry;i++) + for(int i=0;inumMaxEntry;i++) { if(hqrPtr->entries[i].ptr == NULL) { @@ -448,31 +366,40 @@ char* HQR_Get(hqrEntryStruct* hqrPtr, int index) foundEntry->lastTimeUsed = timer; //foundEntry[hqrPtr->numUsedEntry].offset = hqrPtr->maxFreeData - hqrPtr->sizeFreeData; foundEntry->size = size; - foundEntry->ptr = (char*)malloc(size); - ptr = foundEntry->ptr; + char* buffer = new char[size]; + LoadPak(hqrPtr->string, index, buffer); - LoadPak(hqrPtr->string,index,foundEntry->ptr); + if constexpr (std::is_same_v) { + foundEntry->ptr = buffer; + } + else if constexpr (std::is_same_v) { + foundEntry->ptr = createBodyFromPtr(buffer); + delete[] buffer; + } + else if constexpr (std::is_same_v) { + foundEntry->ptr = createAnimationFromPtr(buffer); + delete[] buffer; + } + else { + assert(0); + } hqrPtr->numUsedEntry++; hqrPtr->sizeFreeData -= size; RestoreTimerAnim(); - return(ptr); + return(foundEntry->ptr); } } -hqrEntryStruct* HQR_Init(int size,int numEntry) +hqrEntryStruct* HQR_Init(int size,int numEntry) { - int i; - hqrEntryStruct* dest; - char* dest2; - ASSERT(size > 0); ASSERT(numEntry > 0); - dest = (hqrEntryStruct*)malloc(sizeof(hqrEntryStruct)); + hqrEntryStruct* dest = new hqrEntryStruct(); numEntry = 2000; @@ -481,115 +408,86 @@ hqrEntryStruct* HQR_Init(int size,int numEntry) if(!dest) return NULL; - dest2 = (char*)malloc(size); - - ASSERT_PTR(dest2); - - if(!dest2) - return NULL; - - strcpy(dest->string,"_MEMORY_"); + strcpy_s(dest->string, sizeof(dest->string), "_MEMORY_"); dest->sizeFreeData = size; dest->maxFreeData = size; dest->numMaxEntry = numEntry; dest->numUsedEntry = 0; - dest->entries = (hqrSubEntryStruct*)malloc(numEntry*sizeof(hqrSubEntryStruct)); + dest->entries.resize(numEntry); - for(i=0;ientries[i].ptr = NULL; + dest->entries[i].ptr = nullptr; } return(dest); } -void HQR_Reset(hqrEntryStruct* hqrPtr) +template +void HQR_Reset(hqrEntryStruct* hqrPtr) { - int i; hqrPtr->sizeFreeData = hqrPtr->maxFreeData; hqrPtr->numUsedEntry = 0; - if (hqrPtr == HQ_Bodys) + for(int i =0;inumMaxEntry;i++) { - for (int i = 0; i < vBodies.size(); i++) + if (hqrPtr->entries[i].ptr) { - delete vBodies[i]; - } - vBodies.resize(0); - } - if (hqrPtr == HQ_Anims) { - for (int i = 0; i < vAnimations.size(); i++) - { - delete vAnimations[i]; + if constexpr (std::is_same_v) { + delete[] hqrPtr->entries[i].ptr; + } + else { + delete hqrPtr->entries[i].ptr; + } + hqrPtr->entries[i].ptr = nullptr; } - vAnimations.resize(0); } - for(i=0;inumMaxEntry;i++) - { - if(hqrPtr->entries[i].ptr) - free(hqrPtr->entries[i].ptr); +} - hqrPtr->entries[i].ptr = NULL; - } +template +void HQR_Free(hqrEntryStruct* hqrPtr) +{ + HQR_Reset(hqrPtr); + delete hqrPtr; } -void HQR_Free(hqrEntryStruct* hqrPtr) +template +void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name) { - int i; + strcpy_s(hqrPtr->string, sizeof(hqrPtr->string), " "); + strncpy_s(hqrPtr->string, sizeof(hqrPtr->string), name, 8); +} - if(!hqrPtr) - return; +void HQ_Free_Malloc(hqrEntryStruct* hqrPtr, int index) +{ +} - if (hqrPtr == HQ_Bodys) - { - for (int i = 0; i < vBodies.size(); i++) - { - delete vBodies[i]; - } - vBodies.clear(); - } - if (hqrPtr == HQ_Anims) { - for (int i = 0; i < vAnimations.size(); i++) - { - delete vAnimations[i]; - } - vAnimations.clear(); - } +template +hqrEntryStruct* HQR_InitRessource(const char* name, int size, int numEntries); - for(i=0;inumMaxEntry;i++) - { - if(hqrPtr->entries[i].ptr) - free(hqrPtr->entries[i].ptr); - } +template +char* HQR_Get(hqrEntryStruct* hqrPtr, int index); - free(hqrPtr); -} +template +void HQR_Free(hqrEntryStruct* hqrPtr); -sBody* getBodyFromPtr(void* ptr) -{ - for (int i = 0; i < vBodies.size(); i++) - { - if (vBodies[i]->m_raw == ptr) - { - return vBodies[i]; - } - } +template +void HQR_Reset(hqrEntryStruct* hqrPtr); - return createBodyFromPtr(ptr); -} +template +void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name); -sAnimation* getAnimationFromPtr(void* ptr) -{ - for (int i = 0; i < vAnimations.size(); i++) - { - if (vAnimations[i]->m_raw == ptr) - { - return vAnimations[i]; - } - } +/// body +template hqrEntryStruct* HQR_InitRessource(const char* name, int size, int numEntries); +template sBody* HQR_Get(hqrEntryStruct* hqrPtr, int index); +template void HQR_Free(hqrEntryStruct* hqrPtr); +template void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name); - return createAnimationFromPtr(ptr); -} +/// anim +template hqrEntryStruct* HQR_InitRessource(const char* name, int size, int numEntries); +template sAnimation* HQR_Get(hqrEntryStruct* hqrPtr, int index); +template void HQR_Free(hqrEntryStruct* hqrPtr); +template void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name); \ No newline at end of file diff --git a/FitdLib/hqr.h b/FitdLib/hqr.h index dc94a5b..3257e05 100644 --- a/FitdLib/hqr.h +++ b/FitdLib/hqr.h @@ -1,14 +1,31 @@ -#ifndef _HQR_ -#define _HQR_ -char* HQR_Get(hqrEntryStruct* hqrPtr, int index); -int HQ_Malloc(hqrEntryStruct* hqrPtr,int size); -char* HQ_PtrMalloc(hqrEntryStruct* hqrPtr, int index); -hqrEntryStruct* HQR_InitRessource(const char* name, int size, int numEntries); -hqrEntryStruct* HQR_Init(int size,int numEntry); -void HQR_Reset(hqrEntryStruct* hqrPtr); -void HQR_Free(hqrEntryStruct* hqrPtr); +#pragma once + +template +struct hqrSubEntryStruct; + +template +struct hqrEntryStruct; + +template +T* HQR_Get(hqrEntryStruct* hqrPtr, int index); + +hqrEntryStruct* HQR_Init(int size, int numEntry); +int HQ_Malloc(hqrEntryStruct* hqrPtr,int size); +char* HQ_PtrMalloc(hqrEntryStruct* hqrPtr, int index); +void HQ_Free_Malloc(hqrEntryStruct* hqrPtr, int index); + +template +void HQR_Free(hqrEntryStruct* hqrPtr); + +template +hqrEntryStruct* HQR_InitRessource(const char* name, int size, int numEntries); + +template +void HQR_Reset(hqrEntryStruct* hqrPtr); + +template +void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name); + +struct sBody* createBodyFromPtr(void* ptr); -sBody* getBodyFromPtr(void* ptr); -struct sAnimation* getAnimationFromPtr(void* ptr); -#endif diff --git a/FitdLib/inventory.cpp b/FitdLib/inventory.cpp index 228e397..205b067 100644 --- a/FitdLib/inventory.cpp +++ b/FitdLib/inventory.cpp @@ -327,7 +327,7 @@ void processInventory(void) ShowBody = ListWorldObjets[selectedWorldObjectIdx].foundBody; - ShowObjet = getBodyFromPtr(HQR_Get(HQ_Bodys,ShowBody)); + ShowObjet = HQR_Get(HQ_Bodys,ShowBody); var_C = ListWorldObjets[selectedWorldObjectIdx].foundFlag; @@ -464,7 +464,7 @@ void DrawFoundWindow(int menuState, int objectName, int zoomFactor) setCameraTarget(0, 0, 0, 60, ShowBeta, 0, zoomFactor); - AffObjet(0, 0, 0, 0, 0, 0, getBodyFromPtr(HQR_Get(HQ_Bodys, ShowBody))); + AffObjet(0, 0, 0, 0, 0, 0, HQR_Get(HQ_Bodys, ShowBody)); SimpleMessage(160, WindowY1, 20, 1); SimpleMessage(160, WindowY1 + 16, objectName, 1); @@ -536,7 +536,7 @@ void foundObject(int objIdx, int param) } ShowBody = objPtr->foundBody; - ShowObjet = getBodyFromPtr(HQR_Get(HQ_Bodys, ShowBody)); + ShowObjet = HQR_Get(HQ_Bodys, ShowBody); SetProjection(160, 100, 128, 300, 298); diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index f6c0347..32b5006 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -746,7 +746,7 @@ void processLife(int lifeNum, bool callFoundLife) { if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) { - sAnimation* pAnim = getAnimationFromPtr(HQR_Get(HQ_Anims, currentProcessedActorPtr->ANIM)); + sAnimation* pAnim = HQR_Get(HQ_Anims, currentProcessedActorPtr->ANIM); if (g_gameId >= JACK) { @@ -754,7 +754,7 @@ void processLife(int lifeNum, bool callFoundLife) gereDecal(); */ } - sBody* pBody = getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); + sBody* pBody = HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum); /* if(gameId >= JACK) { @@ -787,7 +787,7 @@ void processLife(int lifeNum, bool callFoundLife) if (currentProcessedActorPtr->objectType & AF_ANIMATED) { - sAnimation* pAnim = getAnimationFromPtr(HQR_Get(HQ_Anims, currentProcessedActorPtr->ANIM)); + sAnimation* pAnim = HQR_Get(HQ_Anims, currentProcessedActorPtr->ANIM); if (g_gameId >= JACK) { @@ -795,7 +795,7 @@ void processLife(int lifeNum, bool callFoundLife) gereDecal(); */ } - sBody* pBody = getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)); + sBody* pBody = HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum); SetAnimObjet(0, pAnim, pBody); InitAnim(param2, 4, -1); @@ -855,7 +855,7 @@ void processLife(int lifeNum, bool callFoundLife) case LM_DO_ROT_ZV: // DO_ROT_ZV { appendFormated("LM_DO_ROT_ZV "); - getZvRot(getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)), ¤tProcessedActorPtr->zv, + getZvRot(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv, currentProcessedActorPtr->alpha, currentProcessedActorPtr->beta, currentProcessedActorPtr->gamma); @@ -872,7 +872,7 @@ void processLife(int lifeNum, bool callFoundLife) case LM_DO_MAX_ZV: { appendFormated("LM_DO_MAX_ZV "); - getZvMax(getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)), ¤tProcessedActorPtr->zv); + getZvMax(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv); currentProcessedActorPtr->zv.ZVX1 += currentProcessedActorPtr->roomX; currentProcessedActorPtr->zv.ZVX2 += currentProcessedActorPtr->roomX; @@ -886,7 +886,7 @@ void processLife(int lifeNum, bool callFoundLife) case LM_DO_CARRE_ZV: // DO_CARRE_ZV { appendFormated("LM_DO_CARRE_ZV "); - getZvCube(getBodyFromPtr(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum)), ¤tProcessedActorPtr->zv); + getZvCube(HQR_Get(HQ_Bodys, currentProcessedActorPtr->bodyNum), ¤tProcessedActorPtr->zv); currentProcessedActorPtr->zv.ZVX1 += currentProcessedActorPtr->roomX; currentProcessedActorPtr->zv.ZVX2 += currentProcessedActorPtr->roomX; diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 849d7e4..ff89603 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -466,7 +466,7 @@ void OpenProgram(void) // if(musicConfigured) { - listMus = HQR_InitRessource("LISTMUS",110000,40); + listMus = HQR_InitRessource("LISTMUS",110000,40); } char sampleFileName[256] = ""; @@ -479,7 +479,7 @@ void OpenProgram(void) strcpy(sampleFileName, "LISTSAMP"); } - listSamp = HQR_InitRessource(sampleFileName,64000,30); + listSamp = HQR_InitRessource(sampleFileName,64000,30); HQ_Memory = HQR_Init(10000,50); } @@ -570,10 +570,6 @@ void loadPalette(void) // to finish } -void HQ_Free_Malloc(hqrEntryStruct* hqrPtr, int index) -{ -} - void turnPageForward() { } @@ -1157,25 +1153,25 @@ void LoadWorld(void) CVars[getCVarsIdx(CHOOSE_PERSO)] = choosePersoBackup; } - listLife = HQR_InitRessource("LISTLIFE", 65000, 100); - listTrack = HQR_InitRessource("LISTTRAK", 20000, 100); + listLife = HQR_InitRessource("LISTLIFE", 65000, 100); + listTrack = HQR_InitRessource("LISTTRAK", 20000, 100); if (g_gameId >= JACK) { - listHybrides = HQR_InitRessource("LISTHYB", 20000, 10); // TODO: recheck size for other games + listHybrides = HQR_InitRessource("LISTHYB", 20000, 10); // TODO: recheck size for other games } // TODO: missing dos memory check here if(g_gameId == AITD1) { - HQ_Bodys = HQR_InitRessource(listBodySelect[CVars[getCVarsIdx(CHOOSE_PERSO)]],37000, 50); // was calculated from free mem size - HQ_Anims = HQR_InitRessource(listAnimSelect[CVars[getCVarsIdx(CHOOSE_PERSO)]],30000, 80); // was calculated from free mem size + HQ_Bodys = HQR_InitRessource(listBodySelect[CVars[getCVarsIdx(CHOOSE_PERSO)]], 37000, 50); // was calculated from free mem size + HQ_Anims = HQR_InitRessource(listAnimSelect[CVars[getCVarsIdx(CHOOSE_PERSO)]], 30000, 80); // was calculated from free mem size } else { - HQ_Bodys = HQR_InitRessource("LISTBODY",37000, 50); // was calculated from free mem size - HQ_Anims = HQR_InitRessource("LISTANIM",30000, 80); // was calculated from free mem size + HQ_Bodys = HQR_InitRessource("LISTBODY", 37000, 50); // was calculated from free mem size + HQ_Anims = HQR_InitRessource("LISTANIM",30000, 80); // was calculated from free mem size - HQ_Matrices = HQR_InitRessource("LISTMAT",64000,5); + HQ_Matrices = HQR_InitRessource("LISTMAT",64000,5); } @@ -3042,7 +3038,7 @@ void mainDraw(int flagFlip) } else { - sBody* bodyPtr = getBodyFromPtr(HQR_Get(HQ_Bodys, actorPtr->bodyNum)); + sBody* bodyPtr = HQR_Get(HQ_Bodys, actorPtr->bodyNum); if (HQ_Load) { @@ -4019,7 +4015,7 @@ void throwStoppedAt(int x, int z) ZVStruct zvCopy; ZVStruct zvLocal; - sBody* bodyPtr = getBodyFromPtr(HQR_Get(HQ_Bodys,currentProcessedActorPtr->bodyNum)); + sBody* bodyPtr = HQR_Get(HQ_Bodys,currentProcessedActorPtr->bodyNum); GiveZVObjet(bodyPtr,&zvLocal); @@ -4135,12 +4131,6 @@ int parseAllSaves(int arg) // TODO : make real implementation } -void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name) -{ - strcpy(hqrPtr->string," "); - strncpy(hqrPtr->string,name,8); -} - void detectGame(void) { if(fileExists("LISTBOD2.PAK")) diff --git a/FitdLib/main.h b/FitdLib/main.h index 22c5c52..de45966 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -23,13 +23,12 @@ void throwStoppedAt(int x, int z); sceZoneStruct* processActor2Sub(int x, int y, int z, roomDataStruct* pRoomData); void LoadWorld(void); void initVars(); -void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name); + void flushScreen(void); int parseAllSaves(int arg); textEntryStruct* getTextFromIdx(int index); void cleanupAndExit(void); void drawProjectedBox(int x1,int x2,int y1,int y2,int z1,int z2, int color, int transparency); -void HQ_Free_Malloc(hqrEntryStruct* hqrPtr, int index); void playSequence(int sequenceIdx, int fadeStart, int fadeOutVar); diff --git a/FitdLib/object.cpp b/FitdLib/object.cpp index 37f0f3f..2978bd2 100644 --- a/FitdLib/object.cpp +++ b/FitdLib/object.cpp @@ -97,11 +97,11 @@ int InitObjet(int body, int typeZv, int hardZvIdx, s16 objectType, int x, int y, if(body != -1) { - bodyPtr = getBodyFromPtr(HQR_Get(HQ_Bodys,actorPtr->bodyNum)); + bodyPtr = HQR_Get(HQ_Bodys,actorPtr->bodyNum); if(anim != -1) { - sAnimation* animPtr = getAnimationFromPtr(HQR_Get(HQ_Anims,anim)); + sAnimation* animPtr = HQR_Get(HQ_Anims,anim); SetAnimObjet(frame,animPtr, bodyPtr); diff --git a/FitdLib/renderer.cpp b/FitdLib/renderer.cpp index 911b180..c4d72a6 100644 --- a/FitdLib/renderer.cpp +++ b/FitdLib/renderer.cpp @@ -1087,16 +1087,8 @@ int AffObjet(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) return(0); } -int AffObjet(int x, int y, int z, int alpha, int beta, int gamma, void* modelPtr) -{ - sBody* pBody = getBodyFromPtr(modelPtr); - return AffObjet(x, y, z, alpha, beta, gamma, pBody); -} - -void computeScreenBox(int x, int y, int z, int alpha, int beta, int gamma, char* bodyPtr) +void computeScreenBox(int x, int y, int z, int alpha, int beta, int gamma, sBody* bodyPtr) { - sBody* pBody = getBodyFromPtr(bodyPtr); - BBox3D1 = 0x7FFF; BBox3D2 = 0x7FFF; @@ -1109,10 +1101,10 @@ void computeScreenBox(int x, int y, int z, int alpha, int beta, int gamma, char* renderVar2 = renderBuffer; - modelFlags = pBody->m_flags; + modelFlags = bodyPtr->m_flags; if(modelFlags&INFO_ANIM) { - AnimNuage(x,y,z,alpha,beta,gamma, pBody); + AnimNuage(x,y,z,alpha,beta,gamma, bodyPtr); } } diff --git a/FitdLib/renderer.h b/FitdLib/renderer.h index 49e75a1..47206a9 100644 --- a/FitdLib/renderer.h +++ b/FitdLib/renderer.h @@ -15,8 +15,7 @@ extern int numOfPoints; void transformPoint(float* ax, float* bx, float* cx); int AffObjet(int x, int y, int z, int alpha, int beta, int gamma, sBody* pBody); -int AffObjet(int var0,int var1,int var2,int var3,int var4,int var5,void* modelPtr); -void computeScreenBox(int x, int y, int z, int alpha, int beta, int gamma, char* bodyPtr); +void computeScreenBox(int x, int y, int z, int alpha, int beta, int gamma, sBody* bodyPtr); #endif diff --git a/FitdLib/save.cpp b/FitdLib/save.cpp index b37f42c..627480a 100644 --- a/FitdLib/save.cpp +++ b/FitdLib/save.cpp @@ -494,11 +494,11 @@ int loadSave(int saveNumber) { if(objectTable[i].indexInWorld != -1 && objectTable[i].bodyNum != -1) { - sBody* bodyPtr = getBodyFromPtr(HQR_Get(HQ_Bodys,objectTable[i].bodyNum)); + sBody* bodyPtr = HQR_Get(HQ_Bodys,objectTable[i].bodyNum); if(objectTable[i].ANIM != -1) { - sAnimation* animPtr = getAnimationFromPtr(HQR_Get(HQ_Anims,objectTable[i].ANIM)); + sAnimation* animPtr = HQR_Get(HQ_Anims,objectTable[i].ANIM); SetAnimObjet(objectTable[i].frame,animPtr,bodyPtr); } } diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index 9697948..7264d32 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -2,7 +2,7 @@ enum gameTypeEnum g_gameId; -hqrEntryStruct* HQ_Memory; +hqrEntryStruct* HQ_Memory; int videoMode; int musicConfigured; @@ -79,12 +79,11 @@ s16 currentWorldTarget; int fileSize; -hqrEntryStruct* HQ_Bodys = nullptr; -hqrEntryStruct* HQ_Anims = nullptr; -hqrEntryStruct* listLife = nullptr; -hqrEntryStruct* listTrack = nullptr; -hqrEntryStruct* listHybrides = nullptr; -hqrEntryStruct* HQ_Matrices = nullptr; +hqrEntryStruct* HQ_Bodys = nullptr; +hqrEntryStruct* listLife = nullptr; +hqrEntryStruct* listTrack = nullptr; +hqrEntryStruct* listHybrides = nullptr; +hqrEntryStruct* HQ_Matrices = nullptr; s16 maxObjects; @@ -271,8 +270,8 @@ int clipBottom = 119; unsigned char* g_MaskPtr = NULL; -hqrEntryStruct* listMus; -hqrEntryStruct* listSamp; +hqrEntryStruct* listMus; +hqrEntryStruct* listSamp; #if defined(FITD_DEBUGGER) backgroundModeEnum backgroundMode = backgroundModeEnum_2D; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index 351c988..616ea9c 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -55,28 +55,6 @@ struct regularTextEntryStruct typedef struct regularTextEntryStruct regularTextEntryStruct; -struct hqrSubEntryStruct -{ - s16 key; - s16 size; - unsigned int lastTimeUsed; - char* ptr; -}; - -typedef struct hqrSubEntryStruct hqrSubEntryStruct; - -struct hqrEntryStruct -{ - char string[10]; - u16 maxFreeData; - u16 sizeFreeData; - u16 numMaxEntry; - u16 numUsedEntry; - hqrSubEntryStruct* entries; -}; - -typedef struct hqrEntryStruct hqrEntryStruct; - struct ZVStruct { s32 ZVX1; @@ -265,10 +243,10 @@ struct roomDefStruct typedef struct roomDefStruct roomDefStruct; -extern hqrEntryStruct* HQ_Memory; - -extern hqrEntryStruct* listMus; -extern hqrEntryStruct* listSamp; +#include "hqr.h" +extern hqrEntryStruct* HQ_Memory; +extern hqrEntryStruct* listMus; +extern hqrEntryStruct* listSamp; extern int videoMode; extern int musicConfigured; @@ -335,12 +313,11 @@ extern s16 currentWorldTarget; extern int fileSize; -extern hqrEntryStruct* HQ_Bodys; -extern hqrEntryStruct* HQ_Anims; -extern hqrEntryStruct* listLife; -extern hqrEntryStruct* listTrack; -extern hqrEntryStruct* listHybrides; -extern hqrEntryStruct* HQ_Matrices; +extern hqrEntryStruct* HQ_Bodys; +extern hqrEntryStruct* listLife; +extern hqrEntryStruct* listTrack; +extern hqrEntryStruct* listHybrides; +extern hqrEntryStruct* HQ_Matrices; extern s16 maxObjects; From 9d2104fe4cdb54dfaf73801ce32ecceac1700548 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Tue, 17 Jun 2025 22:27:32 -0700 Subject: [PATCH 57/70] Warning for the future --- FitdLib/life.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index 32b5006..06101a9 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -104,7 +104,7 @@ int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alp currentActorPtr->objectType = AF_SPECIAL; currentActorPtr->indexInWorld = -2; currentActorPtr->life = -1; - currentActorPtr->lifeMode = 2; + currentActorPtr->lifeMode = 2; // TODO: probably incorrect betweem AITD1/2 currentActorPtr->bodyNum = 0; currentActorPtr->worldX = currentActorPtr->roomX = X; currentActorPtr->worldY = currentActorPtr->roomY = Y; From aee4974e9c8cd0e1b606d87785a6cbbebf86d7f6 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Tue, 17 Jun 2025 22:51:43 -0700 Subject: [PATCH 58/70] Fix regression in AITD1 where door were non-functional --- FitdLib/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index ff89603..68a2ba8 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -2009,9 +2009,9 @@ void GenereActiveList() } break; case 2: // CAMERA - if(!isInViewList(currentActor->room)) + if(isInViewList(currentActor->room)) { - DeleteObjet(i); + continue; } break; default: From 5bad38be374258386048ed248720d0c02a5f24e5 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:05:07 -0700 Subject: [PATCH 59/70] Fix a couple more AITD1 regressions --- FitdLib/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 68a2ba8..5f4ac86 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -2003,7 +2003,7 @@ void GenereActiveList() case 0: // STAGE continue; case 1: // ROOM - if(currentActor->room != currentRoom) + if(currentActor->room == currentRoom) { continue; } @@ -2022,7 +2022,7 @@ void GenereActiveList() } else { - if(!isInViewList(currentActor->room)) + if(isInViewList(currentActor->room)) { continue; } From e6de0f0c2edffdc04a9f468d137a06494984658f Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Wed, 18 Jun 2025 20:34:53 -0700 Subject: [PATCH 60/70] Fix linux build --- FitdLib/hqr.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/FitdLib/hqr.cpp b/FitdLib/hqr.cpp index 7198722..cfe4710 100644 --- a/FitdLib/hqr.cpp +++ b/FitdLib/hqr.cpp @@ -12,7 +12,7 @@ struct hqrSubEntryStruct template struct hqrEntryStruct { - char string[10]; + std::string string; u16 maxFreeData; u16 sizeFreeData; u16 numMaxEntry; @@ -43,10 +43,7 @@ hqrEntryStruct* HQR_InitRessource(const char* name, int size, int numEntries) return NULL; numEntries = 2000; - - strcpy_s(dest->string, sizeof(dest->string), " "); - strncpy_s(dest->string, sizeof(dest->string), name,8); - + dest->string = name; dest->sizeFreeData = size; dest->maxFreeData = size; dest->numMaxEntry = numEntries; @@ -335,14 +332,14 @@ T* HQR_Get(hqrEntryStruct* hqrPtr, int index) else { SaveTimerAnim(); - int size = getPakSize(hqrPtr->string,index); + int size = getPakSize(hqrPtr->string.c_str(),index); if(size == 0) return NULL; if(size>=hqrPtr->maxFreeData) { - fatalError(1,hqrPtr->string); + fatalError(1,hqrPtr->string.c_str()); } unsigned int time = timer; @@ -368,7 +365,7 @@ T* HQR_Get(hqrEntryStruct* hqrPtr, int index) foundEntry->size = size; char* buffer = new char[size]; - LoadPak(hqrPtr->string, index, buffer); + LoadPak(hqrPtr->string.c_str(), index, buffer); if constexpr (std::is_same_v) { foundEntry->ptr = buffer; @@ -408,8 +405,7 @@ hqrEntryStruct* HQR_Init(int size,int numEntry) if(!dest) return NULL; - strcpy_s(dest->string, sizeof(dest->string), "_MEMORY_"); - + dest->string = "_MEMORY_"; dest->sizeFreeData = size; dest->maxFreeData = size; dest->numMaxEntry = numEntry; @@ -457,8 +453,7 @@ void HQR_Free(hqrEntryStruct* hqrPtr) template void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name) { - strcpy_s(hqrPtr->string, sizeof(hqrPtr->string), " "); - strncpy_s(hqrPtr->string, sizeof(hqrPtr->string), name, 8); + hqrPtr->string = name; } void HQ_Free_Malloc(hqrEntryStruct* hqrPtr, int index) From 7ad1c6812bb921fc44a9ead269a6c7f6ddc2df54 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Wed, 18 Jun 2025 22:40:15 -0700 Subject: [PATCH 61/70] Implement text rendering on top of the game --- FitdLib/CMakeLists.txt | 1 + FitdLib/font.cpp | 2 +- FitdLib/main.cpp | 4 +- FitdLib/osystem.h | 1 + FitdLib/osystemSDL.cpp | 2 + FitdLib/rendererBGFX.cpp | 117 ++++++++++++++++++++++++++++ FitdLib/screen.cpp | 10 +-- FitdLib/shaders/embeddedShaders.cpp | 12 ++- FitdLib/shaders/ui.varying.def.sc | 6 ++ FitdLib/shaders/ui_ps.sc | 15 ++++ FitdLib/shaders/ui_vs.sc | 10 +++ FitdLib/vars.cpp | 2 - FitdLib/vars.h | 3 +- 13 files changed, 173 insertions(+), 12 deletions(-) create mode 100644 FitdLib/shaders/ui.varying.def.sc create mode 100644 FitdLib/shaders/ui_ps.sc create mode 100644 FitdLib/shaders/ui_vs.sc diff --git a/FitdLib/CMakeLists.txt b/FitdLib/CMakeLists.txt index 612ee46..f04a4d0 100644 --- a/FitdLib/CMakeLists.txt +++ b/FitdLib/CMakeLists.txt @@ -77,6 +77,7 @@ macro(addShaderProgram vsname psname varyingname) endmacro() +addShaderProgram(ui_vs ui_ps ui.varying.def) addShaderProgram(background_vs background_ps background.varying.def) addShaderProgram(maskBackground_vs maskBackground_ps maskBackground.varying.def) addShaderProgram(flat_vs flat_ps flat.varying.def) diff --git a/FitdLib/font.cpp b/FitdLib/font.cpp index 172e9c8..285550f 100644 --- a/FitdLib/font.cpp +++ b/FitdLib/font.cpp @@ -134,7 +134,7 @@ void PrintFont(int x, int y, char* surface, u8* string) { if (bp >= 200) return; - char* outPtr = logicalScreen + bp*320 + fontSm8; + char* outPtr = (char*)uiLayer.data() + bp * 320 + fontSm8; int dh = fontSm9; diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 5f4ac86..a4a1246 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -534,7 +534,7 @@ void AffRect(int x1, int y1, int x2, int y2, char color) // fast recode. No RE int width = x2 - x1 + 1; int height = y2 - y1 + 1; - char* dest = logicalScreen + y1*320 + x1; + char* dest = (char*)uiLayer.data() + y1*320 + x1; int i; int j; @@ -2982,6 +2982,8 @@ void getHotPoint(int hotPointIdx, sBody* bodyPtr, point3dStruct* hotPoint) void mainDraw(int flagFlip) { + uiLayer.fill(0); + int i; //if(flagFlip == 2) { diff --git a/FitdLib/osystem.h b/FitdLib/osystem.h index 4f4c99c..0be9233 100644 --- a/FitdLib/osystem.h +++ b/FitdLib/osystem.h @@ -81,6 +81,7 @@ void osystem_drawSphere(float X, float Y, float Z, u8 color, u8 material, float size); void osystem_drawPoint(float X, float Y, float Z, u8 color, u8 material, float size); void osystem_flushPendingPrimitives(); + void osystem_drawUILayer(); void osystem_startBgPoly(); void osystem_endBgPoly(); diff --git a/FitdLib/osystemSDL.cpp b/FitdLib/osystemSDL.cpp index bae3f14..5bc4fbb 100644 --- a/FitdLib/osystemSDL.cpp +++ b/FitdLib/osystemSDL.cpp @@ -219,6 +219,8 @@ void osystem_endOfFrame() { osystem_flushPendingPrimitives(); + osystem_drawUILayer(); + #ifdef FITD_DEBUGGER debugger_draw(); #endif diff --git a/FitdLib/rendererBGFX.cpp b/FitdLib/rendererBGFX.cpp index 3f9f286..f36db88 100644 --- a/FitdLib/rendererBGFX.cpp +++ b/FitdLib/rendererBGFX.cpp @@ -27,6 +27,7 @@ email : yaz0r@yaz0r.net unsigned int gameViewId = 1; bgfx::TextureHandle g_backgroundTexture = BGFX_INVALID_HANDLE; +bgfx::TextureHandle g_uiLayerTexture = BGFX_INVALID_HANDLE; bgfx::TextureHandle g_paletteTexture = BGFX_INVALID_HANDLE; extern int outputResolution[2]; extern bool debuggerVar_debugMenuDisplayed; @@ -242,6 +243,17 @@ bgfx::ShaderHandle loadBgfxShader(const std::string& filename) return handle; } +bgfx::ProgramHandle getUIShader() +{ + static bgfx::ProgramHandle programHandle = BGFX_INVALID_HANDLE; + if (!bgfx::isValid(programHandle)) + { + programHandle = loadBgfxProgram("ui_vs", "ui_ps"); + } + + return programHandle; +} + bgfx::ProgramHandle getBackgroundShader() { static bgfx::ProgramHandle programHandle = BGFX_INVALID_HANDLE; @@ -308,6 +320,107 @@ bgfx::ProgramHandle getSphereShader() return programHandle; } +void osystem_drawUILayer() +{ + bgfx::updateTexture2D(g_uiLayerTexture, 0, 0, 0, 0, 320, 200, bgfx::copy(uiLayer.data(), 320 * 200)); + + if (backgroundMode == backgroundModeEnum_2D) + { + bgfx::VertexLayout layout; + layout + .begin() + .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) + .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) + .end(); + + bgfx::TransientVertexBuffer transientBuffer; + bgfx::allocTransientVertexBuffer(&transientBuffer, 6, layout); + + struct sVertice + { + float position[3]; + float texcoord[2]; + }; + + sVertice* pVertices = (sVertice*)transientBuffer.data; + + float quadVertices[6 * 3]; + float quadUV[6 * 2]; + + // 0 + pVertices->position[0] = 0.f; + pVertices->position[1] = 0.f; + pVertices->position[2] = 1000.f; + pVertices->texcoord[0] = 0.f; + pVertices->texcoord[1] = 0.f; + pVertices++; + + //2 + pVertices->position[0] = 320.f; + pVertices->position[1] = 200.f; + pVertices->position[2] = 1000.f; + pVertices->texcoord[0] = 1.f; + pVertices->texcoord[1] = 1.f; + pVertices++; + + //1 + pVertices->position[0] = 320.f; + pVertices->position[1] = 0.f; + pVertices->position[2] = 1000.f; + pVertices->texcoord[0] = 1.f; + pVertices->texcoord[1] = 0.f; + pVertices++; + + //------------------------ + //3 + pVertices->position[0] = 0.f; + pVertices->position[1] = 0.f; + pVertices->position[2] = 1000.f; + pVertices->texcoord[0] = 0.f; + pVertices->texcoord[1] = 0.f; + pVertices++; + + //4 + pVertices->position[0] = 0.f; + pVertices->position[1] = 200.f; + pVertices->position[2] = 1000.f; + pVertices->texcoord[0] = 0.f; + pVertices->texcoord[1] = 1.f; + pVertices++; + + //5 + pVertices->position[0] = 320.f; + pVertices->position[1] = 200.f; + pVertices->position[2] = 1000.f; + pVertices->texcoord[0] = 1.f; + pVertices->texcoord[1] = 1.f; + pVertices++; + + static bgfx::UniformHandle backgroundTextureUniform = BGFX_INVALID_HANDLE; + if (!bgfx::isValid(backgroundTextureUniform)) + { + backgroundTextureUniform = bgfx::createUniform("s_backgroundTexture", bgfx::UniformType::Sampler); + } + static bgfx::UniformHandle paletteTextureUniform = BGFX_INVALID_HANDLE; + if (!bgfx::isValid(paletteTextureUniform)) + { + paletteTextureUniform = bgfx::createUniform("s_paletteTexture", bgfx::UniformType::Sampler); + } + + + bgfx::setState(0 | BGFX_STATE_WRITE_RGB + | BGFX_STATE_MSAA + | BGFX_STATE_DEPTH_TEST_ALWAYS + ); + + bgfx::setVertexBuffer(0, &transientBuffer); + + bgfx::setTexture(0, backgroundTextureUniform, g_uiLayerTexture); + bgfx::setTexture(1, paletteTextureUniform, g_paletteTexture); + bgfx::submit(gameViewId, getUIShader()); + } +} + void osystem_drawBackground() { if (backgroundMode == backgroundModeEnum_2D) @@ -418,6 +531,7 @@ void initBgfxMainResources() { // create background texture g_backgroundTexture = bgfx::createTexture2D(320, 200, false, 1, bgfx::TextureFormat::R8U); + g_uiLayerTexture = bgfx::createTexture2D(320, 200, false, 1, bgfx::TextureFormat::R8U); g_paletteTexture = bgfx::createTexture2D(3, 256, false, 1, bgfx::TextureFormat::R8U); } @@ -447,6 +561,8 @@ void osystem_startFrame() g_bgfxMainResourcesInitialized = true; } + //uiLayer.fill(0x0); + static ImVec2 oldWindowSize = { -1,-1 }; if (debuggerVar_debugMenuDisplayed) @@ -516,6 +632,7 @@ void osystem_startFrame() unsigned char frontBuffer[320 * 200]; unsigned char physicalScreen[320 * 200]; +std::array uiLayer; void osystem_CopyBlockPhys(unsigned char* videoBuffer, int left, int top, int right, int bottom) { diff --git a/FitdLib/screen.cpp b/FitdLib/screen.cpp index 87becd8..6ee351c 100644 --- a/FitdLib/screen.cpp +++ b/FitdLib/screen.cpp @@ -16,14 +16,12 @@ void setupScreen(void) void flushScreen(void) { - int i; - int j; - - for(i=0;i<200;i++) + for(int i=0;i<200;i++) { - for(j=0;j<320;j++) + for(int j=0;j<320;j++) { - *(logicalScreen+i*320+j) = 0; + *(uiLayer.data()+i*320+j) = 0; + *(logicalScreen + i * 320 + j) = 0; } } } diff --git a/FitdLib/shaders/embeddedShaders.cpp b/FitdLib/shaders/embeddedShaders.cpp index ee83fb0..2ff6c8a 100644 --- a/FitdLib/shaders/embeddedShaders.cpp +++ b/FitdLib/shaders/embeddedShaders.cpp @@ -2,6 +2,8 @@ #include "config.h" #if BGFX_PLATFORM_SUPPORTS_SPIRV +#include "shaders/generated/spirv/ui_vs.sc.bin.h" +#include "shaders/generated/spirv/ui_ps.sc.bin.h" #include "shaders/generated/spirv/background_vs.sc.bin.h" #include "shaders/generated/spirv/background_ps.sc.bin.h" #include "shaders/generated/spirv/maskBackground_vs.sc.bin.h" @@ -17,6 +19,8 @@ #endif #if BGFX_PLATFORM_SUPPORTS_METAL +#include "shaders/generated/metal/ui_vs.sc.bin.h" +#include "shaders/generated/metal/ui_ps.sc.bin.h" #include "shaders/generated/metal/background_vs.sc.bin.h" #include "shaders/generated/metal/background_ps.sc.bin.h" #include "shaders/generated/metal/maskBackground_vs.sc.bin.h" @@ -32,6 +36,8 @@ #endif #if BGFX_PLATFORM_SUPPORTS_GLSL +#include "shaders/generated/glsl/ui_vs.sc.bin.h" +#include "shaders/generated/glsl/ui_ps.sc.bin.h" #include "shaders/generated/glsl/background_vs.sc.bin.h" #include "shaders/generated/glsl/background_ps.sc.bin.h" #include "shaders/generated/glsl/maskBackground_vs.sc.bin.h" @@ -47,6 +53,8 @@ #endif #if BGFX_PLATFORM_SUPPORTS_DXBC +#include "shaders/generated/dx11/ui_vs.sc.bin.h" +#include "shaders/generated/dx11/ui_ps.sc.bin.h" #include "shaders/generated/dx11/background_vs.sc.bin.h" #include "shaders/generated/dx11/background_ps.sc.bin.h" #include "shaders/generated/dx11/maskBackground_vs.sc.bin.h" @@ -63,7 +71,9 @@ static const bgfx::EmbeddedShader s_embeddedShaders[] = { - BGFX_EMBEDDED_SHADER(background_vs), + BGFX_EMBEDDED_SHADER(ui_vs), + BGFX_EMBEDDED_SHADER(ui_ps), + BGFX_EMBEDDED_SHADER(background_vs), BGFX_EMBEDDED_SHADER(background_ps), BGFX_EMBEDDED_SHADER(maskBackground_vs), BGFX_EMBEDDED_SHADER(maskBackground_ps), diff --git a/FitdLib/shaders/ui.varying.def.sc b/FitdLib/shaders/ui.varying.def.sc new file mode 100644 index 0000000..91fd257 --- /dev/null +++ b/FitdLib/shaders/ui.varying.def.sc @@ -0,0 +1,6 @@ +vec3 a_position : POSITION; +vec2 a_texcoord0 : TEXCOORD0; + +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); + diff --git a/FitdLib/shaders/ui_ps.sc b/FitdLib/shaders/ui_ps.sc new file mode 100644 index 0000000..71afc9b --- /dev/null +++ b/FitdLib/shaders/ui_ps.sc @@ -0,0 +1,15 @@ +$input v_texcoord0 + +#include "bgfx_shader.sh" +#include "palette.sh" + +USAMPLER2D(s_backgroundTexture, 0); + +void main() +{ + vec2 position = vec2(v_texcoord0.xy) * vec2(320, 200); + uvec4 rawTexel = texelFetch(s_backgroundTexture, ivec2(position), 0); + if(rawTexel.r == uint(0)) + discard; + gl_FragColor = getColorFromRawOffset(rawTexel.r); +} diff --git a/FitdLib/shaders/ui_vs.sc b/FitdLib/shaders/ui_vs.sc new file mode 100644 index 0000000..5e3d0e7 --- /dev/null +++ b/FitdLib/shaders/ui_vs.sc @@ -0,0 +1,10 @@ +$input a_position, a_texcoord0 +$output v_texcoord0 + +#include "bgfx_shader.sh" + +void main() +{ + gl_Position = vec4(a_position.x/160.0-1.0, 1.0-a_position.y/100.0, 0.0, 1.0); + v_texcoord0 = a_texcoord0; +} diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index 7264d32..8082d31 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -28,8 +28,6 @@ palette_t currentGamePalette; //OSystem osystem; -char rgbaBuffer[320*200*4]; - unsigned int timer; unsigned int timeGlobal; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index 616ea9c..f711795 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -270,7 +270,6 @@ extern char* PtrCadre; //extern OSystem osystem; extern unsigned char frontBuffer[320*200]; -extern char rgbaBuffer[320*200*4]; extern unsigned int timer; extern unsigned int timeGlobal; @@ -477,6 +476,8 @@ extern int clipBottom; extern unsigned char* g_MaskPtr; +extern std::array uiLayer; + #if defined(FITD_DEBUGGER) enum backgroundModeEnum { From c3c6b5769b511c904a96be84ea4b541664713d8a Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Wed, 18 Jun 2025 22:54:18 -0700 Subject: [PATCH 62/70] Fix a few ui layer regressions --- FitdLib/AITD1.cpp | 1 + FitdLib/inventory.cpp | 1 + FitdLib/main.cpp | 6 +++++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/FitdLib/AITD1.cpp b/FitdLib/AITD1.cpp index c3761bd..bb76d7c 100644 --- a/FitdLib/AITD1.cpp +++ b/FitdLib/AITD1.cpp @@ -179,6 +179,7 @@ int ChoosePerso(void) int firsttime = 1; int choiceMade = 0; + uiLayer.fill(0); InitCopyBox(aux, logicalScreen); while (choiceMade == 0) diff --git a/FitdLib/inventory.cpp b/FitdLib/inventory.cpp index 205b067..f102063 100644 --- a/FitdLib/inventory.cpp +++ b/FitdLib/inventory.cpp @@ -454,6 +454,7 @@ void cleanClip() for (int y = clipTop; y < clipBottom; y++) { logicalScreen[y * 320 + x] = 0; + uiLayer[y * 320 + x] = 0; } } } diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index a4a1246..a9c9e32 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -534,7 +534,8 @@ void AffRect(int x1, int y1, int x2, int y2, char color) // fast recode. No RE int width = x2 - x1 + 1; int height = y2 - y1 + 1; - char* dest = (char*)uiLayer.data() + y1*320 + x1; + char* dest = logicalScreen + y1*320 + x1; + char* dest2 = (char*)uiLayer.data() + y1*320 + x1; int i; int j; @@ -544,9 +545,11 @@ void AffRect(int x1, int y1, int x2, int y2, char color) // fast recode. No RE for(j=0;j Date: Fri, 20 Jun 2025 14:53:56 -0700 Subject: [PATCH 63/70] Early hybrids support --- FitdLib/anim.cpp | 7 ++++ FitdLib/hqr.cpp | 12 +++++- FitdLib/hybrid.cpp | 94 ++++++++++++++++++++++++++++++++++++++++++++++ FitdLib/hybrid.h | 43 +++++++++++++++++++++ FitdLib/life.cpp | 15 +++----- FitdLib/main.cpp | 16 +++----- FitdLib/vars.cpp | 1 - FitdLib/vars.h | 1 - 8 files changed, 166 insertions(+), 23 deletions(-) create mode 100644 FitdLib/hybrid.cpp create mode 100644 FitdLib/hybrid.h diff --git a/FitdLib/anim.cpp b/FitdLib/anim.cpp index 284019a..902e9ed 100644 --- a/FitdLib/anim.cpp +++ b/FitdLib/anim.cpp @@ -1,4 +1,5 @@ #include "common.h" +#include "hybrid.h" hqrEntryStruct* HQ_Anims = nullptr; @@ -204,6 +205,12 @@ int manageFall(int actorIdx, ZVStruct* zvPtr) void GereAnim(void) { + if (currentProcessedActorPtr->objectType & AF_OBJ_2D) { + if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) { + sHybrid* pHybrid = HQR_Get(HQ_Hybrides, currentProcessedActorPtr->ANIM); + } + } + int oldStepZ=0; int oldStepY=0; int oldStepX=0; diff --git a/FitdLib/hqr.cpp b/FitdLib/hqr.cpp index cfe4710..29167c8 100644 --- a/FitdLib/hqr.cpp +++ b/FitdLib/hqr.cpp @@ -1,4 +1,5 @@ #include "common.h" +#include "hybrid.h" template struct hqrSubEntryStruct @@ -378,6 +379,10 @@ T* HQR_Get(hqrEntryStruct* hqrPtr, int index) foundEntry->ptr = createAnimationFromPtr(buffer); delete[] buffer; } + else if constexpr (std::is_same_v) { + foundEntry->ptr = new sHybrid((uint8_t*)buffer, size); + delete[] buffer; + } else { assert(0); } @@ -485,4 +490,9 @@ template void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name); template hqrEntryStruct* HQR_InitRessource(const char* name, int size, int numEntries); template sAnimation* HQR_Get(hqrEntryStruct* hqrPtr, int index); template void HQR_Free(hqrEntryStruct* hqrPtr); -template void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name); \ No newline at end of file +template void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name); + +/// hybrids +template hqrEntryStruct* HQR_InitRessource(const char* name, int size, int numEntries); +template sHybrid* HQR_Get(hqrEntryStruct* hqrPtr, int index); +template void HQR_Free(hqrEntryStruct* hqrPtr); diff --git a/FitdLib/hybrid.cpp b/FitdLib/hybrid.cpp new file mode 100644 index 0000000..b6f63c1 --- /dev/null +++ b/FitdLib/hybrid.cpp @@ -0,0 +1,94 @@ +#include "common.h" +#include "hybrid.h" + +hqrEntryStruct* HQ_Hybrides = nullptr; + +sHybrid::sHybrid(uint8_t* buffer, int size) { + assert(size == READ_LE_U32(buffer + 20)); // EOF offset + + for (int i = 0; i < 5; i++) { + if (int startOffset = READ_LE_U32(buffer + 4 * i)) { + int blockSize = 0; + for (int j = i + 1; j < 6; j++) { + if (int nextOffset = READ_LE_U32(buffer + 4 * j)) { + blockSize = nextOffset - startOffset; + break; + } + } + assert(blockSize); + + switch (i) { + case 0: // Entities + readEntites(buffer + startOffset, blockSize); + break; + case 2: // Animation + readAnimations(buffer + startOffset, blockSize); + break; + default: + break; + } + } + } +} + +void sHybrid::readEntites(uint8_t* buffer, int size) { + int count = READ_LE_U32(buffer) / 4; + entities.reserve(count); + for (int i = 0; i < count; i++) { + uint8_t* data = buffer + READ_LE_U32(buffer + i * 4); + + auto& entity = entities.emplace_back(); + entity.flags = READ_LE_U16(data); data+=2; + + int numEntities = (entity.flags >> 8) & 0xFF; + + entity.parts.reserve(numEntities); + for (int j = 0; j < numEntities; j++) { + auto& part = entity.parts.emplace_back(); + + part.id = READ_LE_U8(data); data++; + part.nbpt = READ_LE_U8(data); data++; + part.cout = READ_LE_U8(data); data++; + part.cin = READ_LE_U8(data); data++; + + part.XY.resize(part.nbpt); + for (int k = 0; k < part.nbpt; k++) { + part.XY[k][0] = READ_LE_S16(data); data += 2; + part.XY[k][1] = READ_LE_S16(data); data += 2; + } + } + } +} + +void sHybrid::readAnimations(uint8_t* buffer, int size) { + int count = READ_LE_U32(buffer) / 4; + anims.reserve(count); + for (int i = 0; i < count; i++) { + uint8_t* animStart = buffer + READ_LE_U32(buffer + i * 4); + auto& anim = anims.emplace_back(); + anim.flag = READ_LE_U8(animStart); animStart++; + anim.count = READ_LE_U8(animStart); animStart++; + anim.animations.reserve(anim.count); + for (int j = 0; j < anim.count; j++) { + auto& animation = anim.animations.emplace_back(); + animation.id = READ_LE_U16(animStart); animStart += 2; + animation.flag = READ_LE_U16(animStart); animStart += 2; + animation.deltaX = READ_LE_S16(animStart); animStart += 2; + animation.deltaY = READ_LE_S16(animStart); animStart += 2; + } + } +} + +void AffHyb(int index, int X, int Y, sHybrid* pHybrid) { + auto& entity = pHybrid->entities[index]; + for (int i = 0; i < entity.parts.size(); i++) { + auto& part = entity.parts[i]; + switch (part.id) { + case 6: + for (int i = 0; i < part.XY.size()-1; i++) { + osystem_draw3dLine(part.XY[i][0], part.XY[i][1], 0, part.XY[i+1][0], part.XY[i+1][1], 0, part.cin); + } + break; + } + } +} \ No newline at end of file diff --git a/FitdLib/hybrid.h b/FitdLib/hybrid.h new file mode 100644 index 0000000..f3d9921 --- /dev/null +++ b/FitdLib/hybrid.h @@ -0,0 +1,43 @@ +#pragma once + +struct sHybrid_EntityPart { + uint8_t id; + uint8_t nbpt; + uint8_t cout; + uint8_t cin; + std::vector> XY; +}; + +struct sHybrid_Entity { + uint16_t flags; + + std::vector parts; +}; + +struct sHybrid_Animation { + uint16_t id; + uint16_t flag; + int16_t deltaX; + int16_t deltaY; +}; + +struct sHybrid_Anim { + uint8_t flag; + uint8_t count; + std::vector animations; +}; + +struct sHybrid { + sHybrid(uint8_t* buffer, int size); + + std::vector entities; + std::vector anims; + +private: + void readEntites(uint8_t* buffer, int size); + void readAnimations(uint8_t* buffer, int size); +}; + +extern hqrEntryStruct* HQ_Hybrides; + +void AffHyb(int index, int X, int Y, sHybrid* pHybrid); \ No newline at end of file diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index 06101a9..6e8e654 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -1,6 +1,7 @@ #include #include "common.h" +#include "hybrid.h" int groundLevel; s16 specialTable[4] = { 144, 192, 48, 112 }; @@ -1004,11 +1005,8 @@ void processLife(int lifeNum, bool callFoundLife) currentProcessedActorPtr->frame = 0; if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) { - char* pHybrid = HQR_Get(listHybrides, currentProcessedActorPtr->ANIM); - pHybrid += READ_LE_U32(pHybrid + 8); - pHybrid += READ_LE_U32(pHybrid + currentProcessedActorPtr->bodyNum * 4); - - currentProcessedActorPtr->numOfFrames = pHybrid[1]; + sHybrid* pHybrid = HQR_Get(HQ_Hybrides, currentProcessedActorPtr->ANIM); + currentProcessedActorPtr->numOfFrames = pHybrid->anims[currentProcessedActorPtr->bodyNum].count; currentProcessedActorPtr->animInfo = -1; currentProcessedActorPtr->animType = ANIM_ONCE; currentProcessedActorPtr->objectType |= AF_OBJ_2D; @@ -1034,11 +1032,8 @@ void processLife(int lifeNum, bool callFoundLife) currentProcessedActorPtr->frame = 0; if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) { - char* pHybrid = HQR_Get(listHybrides, currentProcessedActorPtr->ANIM); - pHybrid += READ_LE_U32(pHybrid + 8); - pHybrid += READ_LE_U32(pHybrid + currentProcessedActorPtr->bodyNum * 4); - - currentProcessedActorPtr->numOfFrames = pHybrid[1]; + sHybrid* pHybrid = HQR_Get(HQ_Hybrides, currentProcessedActorPtr->ANIM); + currentProcessedActorPtr->numOfFrames = pHybrid->anims[currentProcessedActorPtr->bodyNum].count; currentProcessedActorPtr->animInfo = -1; currentProcessedActorPtr->animType = ANIM_REPEAT; currentProcessedActorPtr->objectType |= AF_OBJ_2D; diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index a9c9e32..fb417e2 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -7,6 +7,8 @@ // seg002 #include "common.h" +#include "hybrid.h" + #include #ifndef AITD_UE4 @@ -1160,7 +1162,7 @@ void LoadWorld(void) listLife = HQR_InitRessource("LISTLIFE", 65000, 100); listTrack = HQR_InitRessource("LISTTRAK", 20000, 100); if (g_gameId >= JACK) { - listHybrides = HQR_InitRessource("LISTHYB", 20000, 10); // TODO: recheck size for other games + HQ_Hybrides = HQR_InitRessource("LISTHYB", 20000, 10); // TODO: recheck size for other games } // TODO: missing dos memory check here @@ -3030,15 +3032,9 @@ void mainDraw(int flagFlip) else { if (actorPtr->objectType & AF_OBJ_2D) { - char* pHybrid = HQR_Get(listHybrides, actorPtr->ANIM); - char* pData = pHybrid + READ_LE_U32(pHybrid + 8); - pData += READ_LE_U32(pData + actorPtr->bodyNum * 4); - - char* pAnim = pData + 2; - pAnim += 8 * actorPtr->frame; - s16 numHybrid = READ_LE_U16(pAnim); - - //AffHyb(numHybrid, 0, 0, pHybrid); + sHybrid* pHybrid = HQR_Get(HQ_Hybrides, actorPtr->ANIM); + s16 numHybrid = pHybrid->anims[actorPtr->bodyNum].animations[actorPtr->frame].id; + AffHyb(numHybrid, 0, 0, pHybrid); // TODO: bounding volume } diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index 8082d31..734c0bd 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -80,7 +80,6 @@ int fileSize; hqrEntryStruct* HQ_Bodys = nullptr; hqrEntryStruct* listLife = nullptr; hqrEntryStruct* listTrack = nullptr; -hqrEntryStruct* listHybrides = nullptr; hqrEntryStruct* HQ_Matrices = nullptr; s16 maxObjects; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index f711795..4b80235 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -315,7 +315,6 @@ extern int fileSize; extern hqrEntryStruct* HQ_Bodys; extern hqrEntryStruct* listLife; extern hqrEntryStruct* listTrack; -extern hqrEntryStruct* listHybrides; extern hqrEntryStruct* HQ_Matrices; extern s16 maxObjects; From 8eea2f421721c20ccc5a5e60cab486d88f227923 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 21 Jun 2025 01:27:30 -0700 Subject: [PATCH 64/70] 2d animations --- FitdLib/actorList.cpp | 2 +- FitdLib/aitdBox.cpp | 26 +++--- FitdLib/anim2d.cpp | 69 ++++++++++++++++ FitdLib/anim2d.h | 24 ++++++ FitdLib/floor.cpp | 45 ++++++---- FitdLib/hybrid.cpp | 36 ++++++-- FitdLib/hybrid.h | 12 ++- FitdLib/life.cpp | 4 +- FitdLib/main.cpp | 185 +++++++++++++++++++++++------------------- FitdLib/main.h | 2 +- FitdLib/mainLoop.cpp | 5 +- FitdLib/room.h | 7 +- FitdLib/sprite.cpp | 45 ++++++++++ FitdLib/sprite.h | 24 ++++++ FitdLib/vars.cpp | 4 +- FitdLib/vars.h | 4 +- 16 files changed, 361 insertions(+), 133 deletions(-) create mode 100644 FitdLib/anim2d.cpp create mode 100644 FitdLib/anim2d.h create mode 100644 FitdLib/sprite.cpp create mode 100644 FitdLib/sprite.h diff --git a/FitdLib/actorList.cpp b/FitdLib/actorList.cpp index 05d4226..6b11e5a 100644 --- a/FitdLib/actorList.cpp +++ b/FitdLib/actorList.cpp @@ -134,5 +134,5 @@ int sortCompareFunction(const void* param1, const void* param2) void sortActorList() { - qsort(sortedActorTable.data(), numActorInList, sizeof(int), sortCompareFunction); + qsort(Index.data(), NbAffObjets, sizeof(int), sortCompareFunction); } diff --git a/FitdLib/aitdBox.cpp b/FitdLib/aitdBox.cpp index e1a855a..82b8d91 100644 --- a/FitdLib/aitdBox.cpp +++ b/FitdLib/aitdBox.cpp @@ -1,6 +1,6 @@ #include "common.h" -void afficheSprite(int left, int top, int index, char* gfxData) +void AffSpf(int left, int top, int index, char* gfxData) { char* outPtr; char* inPtr; @@ -17,13 +17,13 @@ void afficheSprite(int left, int top, int index, char* gfxData) return; outPtr = logicalScreen + top*320 + left; - inPtr = gfxData + READ_LE_U16(index * 2 + gfxData); // alignement unsafe + inPtr = gfxData + READ_LE_U16(index * 2 + gfxData); inPtr +=4; - width = READ_LE_U16(inPtr); // alignement unsafe + width = READ_LE_U16(inPtr); inPtr+=2; - height = READ_LE_U16(inPtr); // alignement unsafe + height = READ_LE_U16(inPtr); inPtr+=2; offset = 320 - width; @@ -113,7 +113,7 @@ void AffBigCadre(int x, int y, int width, int height) right = x + halfWidth; bottom = y + halfHeight; - afficheSprite(currentLeftPosition,currentTopPosition,0,PtrCadre); // draw top left corner + AffSpf(currentLeftPosition,currentTopPosition,0,PtrCadre); // draw top left corner while(1) // draw top bar { @@ -122,10 +122,10 @@ void AffBigCadre(int x, int y, int width, int height) if(right - 20 <= currentLeftPosition) break; - afficheSprite(currentLeftPosition,currentTopPosition,4,PtrCadre); + AffSpf(currentLeftPosition,currentTopPosition,4,PtrCadre); } - afficheSprite(currentLeftPosition,currentTopPosition,1,PtrCadre); // draw top right corner + AffSpf(currentLeftPosition,currentTopPosition,1,PtrCadre); // draw top right corner currentLeftPosition = left; @@ -136,7 +136,7 @@ void AffBigCadre(int x, int y, int width, int height) if(bottom - 20 <= currentTopPosition) break; - afficheSprite(currentLeftPosition,currentTopPosition,6,PtrCadre); + AffSpf(currentLeftPosition,currentTopPosition,6,PtrCadre); } currentLeftPosition = right - 8; @@ -144,14 +144,14 @@ void AffBigCadre(int x, int y, int width, int height) while(bottom - 20 > currentTopPosition) { - afficheSprite(currentLeftPosition,currentTopPosition,7,PtrCadre); + AffSpf(currentLeftPosition,currentTopPosition,7,PtrCadre); currentTopPosition += 20; } currentLeftPosition = left; - afficheSprite(currentLeftPosition,currentTopPosition,2,PtrCadre); // draw bottom left corner + AffSpf(currentLeftPosition,currentTopPosition,2,PtrCadre); // draw bottom left corner while(1) // draw bottom bar { @@ -160,12 +160,12 @@ void AffBigCadre(int x, int y, int width, int height) if(right-20 <= currentLeftPosition) break; - afficheSprite(currentLeftPosition,currentTopPosition+12,5,PtrCadre); + AffSpf(currentLeftPosition,currentTopPosition+12,5,PtrCadre); } - afficheSprite(currentLeftPosition,currentTopPosition,3,PtrCadre); // draw bottom right corner + AffSpf(currentLeftPosition,currentTopPosition,3,PtrCadre); // draw bottom right corner - afficheSprite(x-20,currentTopPosition+12,8,PtrCadre); // draw "in the dark" + AffSpf(x-20,currentTopPosition+12,8,PtrCadre); // draw "in the dark" WindowX1 = left + 8; WindowY1 = top + 8; diff --git a/FitdLib/anim2d.cpp b/FitdLib/anim2d.cpp new file mode 100644 index 0000000..473f98a --- /dev/null +++ b/FitdLib/anim2d.cpp @@ -0,0 +1,69 @@ +#include "common.h" +#include "anim2d.h" +#include "hybrid.h" + +std::array TabAnim2d; +int NbAnim2D = 0; + +sHybrid* PtrAnim2D = nullptr; +void load2dAnims(int cameraIdx) { + char name[16]; + + sprintf(name, "ANIM%02d", g_currentFloor); + + if (PtrAnim2D) + { + delete PtrAnim2D; + PtrAnim2D = nullptr; + } + + unsigned char* rawAnim2D = (unsigned char*)loadPak(name, cameraIdx); + PtrAnim2D = new sHybrid(rawAnim2D, getPakSize(name, cameraIdx)); + free(rawAnim2D); +} + +void handleAnim2d() { + + std::array Index2 = Index; + + for (int i = 0; i < currentCameraZoneList[NumCamera]->hybrids.size(); i++) { + auto& anim = TabAnim2d[i]; + if (timer - anim.time >= anim.pAnim->flag) { + anim.frame++; + if (anim.frame == anim.pAnimation->anims.size()) { + anim.frame = 0; + anim.pAnim = anim.pAnimation->anims.begin(); + } + else { + anim.pAnim++; + } + anim.time = timer; + } + + int j; + for (j = NbAffObjets + i - 1; j >= 0; j--) { + if (!(Index2[j] & 0x8000)) { + //TODO: test rects + } + } + + std::memmove(&Index2[j + 2], &Index2[j + 1], (NbAffObjets + i - j - 1) * sizeof(Index2[0])); + Index2[j + 1] = 0x8000 + i; + } + + Index = Index2; +} + +void resetAnim2D() { + NbAnim2D = 0; +} + +void startAnim2d(int index) { + auto& anim = PtrAnim2D->animations[index]; + + TabAnim2d[NbAnim2D].pAnimation = &anim; + TabAnim2d[NbAnim2D].pAnim = anim.anims.begin(); + TabAnim2d[NbAnim2D].frame = 0; + TabAnim2d[NbAnim2D].time = timer; + NbAnim2D++; +} \ No newline at end of file diff --git a/FitdLib/anim2d.h b/FitdLib/anim2d.h new file mode 100644 index 0000000..33be68d --- /dev/null +++ b/FitdLib/anim2d.h @@ -0,0 +1,24 @@ +#pragma once + +#include "hybrid.h" + +struct sAnim2d { + uint16_t frame; + uint32_t time; + uint16_t flagEndInterAnim; + std::vector::iterator pAnim; + sHybrid_Animation* pAnimation; + int16_t ScreenXMin; + int16_t ScreenYMin; + int16_t ScreenXMax; + int16_t ScreenYMax; +}; + +extern std::array TabAnim2d; +extern int NbAnim2D; +extern sHybrid* PtrAnim2D; + +void resetAnim2D(); +void load2dAnims(int cameraIdx); +void startAnim2d(int index); +void handleAnim2d(); \ No newline at end of file diff --git a/FitdLib/floor.cpp b/FitdLib/floor.cpp index eee4df6..f16906e 100644 --- a/FitdLib/floor.cpp +++ b/FitdLib/floor.cpp @@ -280,12 +280,10 @@ void LoadEtage(int floorNumber) pMaskData = backupDataPtr + g_currentFloorCameraData[i].viewedRoomTable[k].offsetToMask; // for this camera, how many masks zone - pCurrentCameraViewedRoom->numMask = READ_LE_U16(pMaskData); - pMaskData+=2; + int numMasks = READ_LE_U16(pMaskData); pMaskData+=2; + pCurrentCameraViewedRoom->masks.reserve(numMasks); - pCurrentCameraViewedRoom->masks.reserve(pCurrentCameraViewedRoom->numMask); - - for(int k=0; knumMask; k++) + for(int k=0; k< numMasks; k++) { cameraMaskStruct* pCurrentCameraMask = &pCurrentCameraViewedRoom->masks.emplace_back(); @@ -310,23 +308,17 @@ void LoadEtage(int floorNumber) // load camera cover { - unsigned char* pZoneData; - int numZones; - int j; - - pZoneData = backupDataPtr + g_currentFloorCameraData[i].viewedRoomTable[k].offsetToCover; + unsigned char* pZoneData = backupDataPtr + g_currentFloorCameraData[i].viewedRoomTable[k].offsetToCover; if(pMaskData) { assert(pZoneData == pMaskData); } //pZoneData = currentCameraData; - pCurrentCameraViewedRoom->numCoverZones = numZones =READ_LE_U16(pZoneData); - pZoneData+=2; - - pCurrentCameraViewedRoom->coverZones.resize(numZones); + int numCoverZones = READ_LE_U16(pZoneData); pZoneData += 2; + pCurrentCameraViewedRoom->coverZones.resize(numCoverZones); - for(j=0;jnumCoverZones;j++) + for(int j=0;j< numCoverZones;j++) { int pointIdx; int numPoints; @@ -349,6 +341,29 @@ void LoadEtage(int floorNumber) } } + // load hybrids + if(pCurrentCameraViewedRoom->offsetToHybrids) + { + unsigned char* pHybridData = backupDataPtr + pCurrentCameraViewedRoom->offsetToHybrids; + int numHybrids = READ_LE_U16(pHybridData); pHybridData += 2; + pCurrentCameraViewedRoom->hybrids.reserve(numHybrids); + for (int i = 0; i < numHybrids; i++) { + auto& hybrid = pCurrentCameraViewedRoom->hybrids.emplace_back(); + int numRect = READ_LE_U16(pHybridData); pHybridData += 2; + hybrid.rects.reserve(numRect); + for (int j = 0; j < numRect; j++) { + auto& rect = hybrid.rects.emplace_back(); + rect.zoneX1 = READ_LE_S16(pHybridData); pHybridData += 2; + rect.zoneZ1 = READ_LE_S16(pHybridData); pHybridData += 2; + rect.zoneX2 = READ_LE_S16(pHybridData); pHybridData += 2; + rect.zoneZ2 = READ_LE_S16(pHybridData); pHybridData += 2; + } + } + if (pCurrentCameraViewedRoom->offsetCamOptims) { + assert(backupDataPtr + pCurrentCameraViewedRoom->offsetCamOptims == pHybridData); + } + } + if(g_gameId == AITD1) currentCameraData+=0x0C; else diff --git a/FitdLib/hybrid.cpp b/FitdLib/hybrid.cpp index b6f63c1..d9a6893 100644 --- a/FitdLib/hybrid.cpp +++ b/FitdLib/hybrid.cpp @@ -21,6 +21,9 @@ sHybrid::sHybrid(uint8_t* buffer, int size) { case 0: // Entities readEntites(buffer + startOffset, blockSize); break; + case 1: // Sprites + readSprites(buffer + startOffset, blockSize); + break; case 2: // Animation readAnimations(buffer + startOffset, blockSize); break; @@ -31,6 +34,22 @@ sHybrid::sHybrid(uint8_t* buffer, int size) { } } +void sHybrid::readSprites(uint8_t* buffer, int size) { + int count = (READ_LE_U32(buffer) - 2) / 4; + sprites.reserve(count); + for (int i = 0; i < count; i++) { + uint8_t* data = buffer + READ_LE_U32(buffer + i * 4) - 2; + uint32_t spriteSize; + if (i < count - 1) { + spriteSize = (READ_LE_U32(buffer + (i + 1) * 4) - 2) - (READ_LE_U32(buffer + i * 4) - 2); + } + else { + spriteSize = size - (READ_LE_U32(buffer + i * 4) - 2); + } + sprites.emplace_back().read(data, spriteSize); + } +} + void sHybrid::readEntites(uint8_t* buffer, int size) { int count = READ_LE_U32(buffer) / 4; entities.reserve(count); @@ -62,15 +81,15 @@ void sHybrid::readEntites(uint8_t* buffer, int size) { void sHybrid::readAnimations(uint8_t* buffer, int size) { int count = READ_LE_U32(buffer) / 4; - anims.reserve(count); + animations.reserve(count); for (int i = 0; i < count; i++) { uint8_t* animStart = buffer + READ_LE_U32(buffer + i * 4); - auto& anim = anims.emplace_back(); + auto& anim = animations.emplace_back(); anim.flag = READ_LE_U8(animStart); animStart++; anim.count = READ_LE_U8(animStart); animStart++; - anim.animations.reserve(anim.count); + anim.anims.reserve(anim.count); for (int j = 0; j < anim.count; j++) { - auto& animation = anim.animations.emplace_back(); + auto& animation = anim.anims.emplace_back(); animation.id = READ_LE_U16(animStart); animStart += 2; animation.flag = READ_LE_U16(animStart); animStart += 2; animation.deltaX = READ_LE_S16(animStart); animStart += 2; @@ -84,7 +103,14 @@ void AffHyb(int index, int X, int Y, sHybrid* pHybrid) { for (int i = 0; i < entity.parts.size(); i++) { auto& part = entity.parts[i]; switch (part.id) { - case 6: + case 1: // sprite + { + int spriteNumber = part.cout + (((int)part.cin) << 8); + // TODO: dx/dy + AffSpr(spriteNumber, part.XY[0][0] + X, part.XY[0][1] + Y + 1, logicalScreen, pHybrid->sprites); + break; + } + case 6: // line for (int i = 0; i < part.XY.size()-1; i++) { osystem_draw3dLine(part.XY[i][0], part.XY[i][1], 0, part.XY[i+1][0], part.XY[i+1][1], 0, part.cin); } diff --git a/FitdLib/hybrid.h b/FitdLib/hybrid.h index f3d9921..df1e4c7 100644 --- a/FitdLib/hybrid.h +++ b/FitdLib/hybrid.h @@ -1,5 +1,7 @@ #pragma once +#include "sprite.h" + struct sHybrid_EntityPart { uint8_t id; uint8_t nbpt; @@ -14,27 +16,29 @@ struct sHybrid_Entity { std::vector parts; }; -struct sHybrid_Animation { +struct sHybrid_Anim { uint16_t id; uint16_t flag; int16_t deltaX; int16_t deltaY; }; -struct sHybrid_Anim { +struct sHybrid_Animation { uint8_t flag; uint8_t count; - std::vector animations; + std::vector anims; }; struct sHybrid { sHybrid(uint8_t* buffer, int size); std::vector entities; - std::vector anims; + std::vector sprites; + std::vector animations; private: void readEntites(uint8_t* buffer, int size); + void readSprites(uint8_t* buffer, int size); void readAnimations(uint8_t* buffer, int size); }; diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index 6e8e654..48a9bb1 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -1006,7 +1006,7 @@ void processLife(int lifeNum, bool callFoundLife) if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) { sHybrid* pHybrid = HQR_Get(HQ_Hybrides, currentProcessedActorPtr->ANIM); - currentProcessedActorPtr->numOfFrames = pHybrid->anims[currentProcessedActorPtr->bodyNum].count; + currentProcessedActorPtr->numOfFrames = pHybrid->animations[currentProcessedActorPtr->bodyNum].count; currentProcessedActorPtr->animInfo = -1; currentProcessedActorPtr->animType = ANIM_ONCE; currentProcessedActorPtr->objectType |= AF_OBJ_2D; @@ -1033,7 +1033,7 @@ void processLife(int lifeNum, bool callFoundLife) if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) { sHybrid* pHybrid = HQR_Get(HQ_Hybrides, currentProcessedActorPtr->ANIM); - currentProcessedActorPtr->numOfFrames = pHybrid->anims[currentProcessedActorPtr->bodyNum].count; + currentProcessedActorPtr->numOfFrames = pHybrid->animations[currentProcessedActorPtr->bodyNum].count; currentProcessedActorPtr->animInfo = -1; currentProcessedActorPtr->animType = ANIM_REPEAT; currentProcessedActorPtr->objectType |= AF_OBJ_2D; diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index fb417e2..1132d4e 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -8,6 +8,7 @@ #include "common.h" #include "hybrid.h" +#include "anim2d.h" #include @@ -1364,8 +1365,8 @@ void loadMask(int cameraIdx) cameraViewedRoomStruct* pRoomView = &cameraDataTable[NumCamera]->viewedRoomTable[i]; unsigned char* pViewedRoomMask = g_MaskPtr + READ_LE_U32(g_MaskPtr + i*4); - g_maskBuffers[i].reserve(pRoomView->numMask); - for(int j=0; jnumMask; j++) + g_maskBuffers[i].reserve(pRoomView->masks.size()); + for(int j=0; jmasks.size(); j++) { sMaskStruct* pDestMask = &g_maskBuffers[i].emplace_back(); unsigned char* pMaskData = pViewedRoomMask + READ_LE_U32(pViewedRoomMask + j*4); @@ -2138,7 +2139,7 @@ int checkActorInRoom(int room) void GenereAffList() { - numActorInList = 0; + NbAffObjets = 0; for(int i=0;i< objectTable.size();i++) { @@ -2147,13 +2148,13 @@ void GenereAffList() { if(checkActorInRoom(actorPtr->room)) { - sortedActorTable[numActorInList] = i; + Index[NbAffObjets] = i; if(!(actorPtr->objectType & (AF_SPECIAL & AF_ANIMATED))) { actorPtr->objectType |= AF_BOXIFY; // FlagRefreshAux2 = 1; } - numActorInList++; + NbAffObjets++; } } } @@ -2167,6 +2168,8 @@ void InitView() SaveTimerAnim(); + resetAnim2D(); + NumCamera = NewNumCamera; assert(NewNumCamera < roomDataTable[currentRoom].numCameraInRoom); @@ -2183,7 +2186,7 @@ void InitView() cameraBackgroundChanged = true; if (g_gameId >= JACK) { - printf("Load 2d animations\n"); + load2dAnims(roomDataTable[currentRoom].cameraIdxTable[NewNumCamera]); } cameraDataStruct* pCamera = cameraDataTable[NumCamera]; @@ -2240,6 +2243,10 @@ void InitView() FlagInitView = 0; RestoreTimerAnim(); + + for (int i = 0; i < currentCameraZoneList[NumCamera]->hybrids.size(); i++) { + startAnim2d(i); + } } s16 GiveDistance2D(int x1, int z1, int x2, int z2) @@ -2506,7 +2513,7 @@ void drawConverZones() if(cameraDataTable[i]->viewedRoomTable[j].viewedRoomIdx == currentRoom) { - for(k=0;kviewedRoomTable[j].numCoverZones;k++) + for(k=0;kviewedRoomTable[j].coverZones.size();k++) { drawConverZone(&cameraDataTable[i]->viewedRoomTable[j].coverZones[k]); } @@ -2542,7 +2549,7 @@ void drawMaskZones() //if(cameraDataTable[i]->viewedRoomTable[j].viewedRoomIdx == currentDisplayedRoom) { - for(k=0;kviewedRoomTable[j].numMask;k++) + for(k=0;kviewedRoomTable[j].masks.size();k++) { drawMaskZone(&pCamera->viewedRoomTable[j].masks[k]); } @@ -2930,7 +2937,7 @@ void drawBgOverlay(tObject* actorPtr) } else { - for(int i=0;inumMask;i++) + for(int i=0;imasks.size();i++) { cameraMaskStruct* pMaskZones = &pcameraViewedRoomData->masks[i]; @@ -2957,7 +2964,7 @@ void drawBgOverlay(tObject* actorPtr) SetClip(0,0,319,199); } -void mainDrawSub2(int actorIdx) // draw flow +void AffSpecialObjet(int actorIdx) // draw flow { //actorStruct* actorPtr = &actorTable[actorIdx]; @@ -2986,11 +2993,10 @@ void getHotPoint(int hotPointIdx, sBody* bodyPtr, point3dStruct* hotPoint) } } -void mainDraw(int flagFlip) +void AllRedraw(int flagFlip) { uiLayer.fill(0); - int i; //if(flagFlip == 2) { if(cameraBackgroundChanged) @@ -3002,7 +3008,7 @@ void mainDraw(int flagFlip) if(flagFlip== 0) { - //restoreDirtyRects(); + //ClsAuxLog(); } else { @@ -3013,107 +3019,116 @@ void mainDraw(int flagFlip) SetClip(0,0,319,199); NbLogBoxs = 0; - for(i=0;iid, 0, 0, PtrAnim2D); - // this is commented out to draw actors incrusted in background - //if(actorPtr->_flags & (AF_ANIMATED + AF_DRAWABLE + AF_SPECIAL)) - { - actorPtr->objectType &= ~AF_DRAWABLE; + // TODO: Clipping stuff + osystem_CopyBlockPhys((unsigned char*)logicalScreen, 0, 0, 320, 200); + } + else { + tObject* actorPtr = &objectTable[currentDrawActor]; - if(actorPtr->objectType & AF_SPECIAL) - { - mainDrawSub2(currentDrawActor); - } - else - { - if (actorPtr->objectType & AF_OBJ_2D) { - sHybrid* pHybrid = HQR_Get(HQ_Hybrides, actorPtr->ANIM); - s16 numHybrid = pHybrid->anims[actorPtr->bodyNum].animations[actorPtr->frame].id; - AffHyb(numHybrid, 0, 0, pHybrid); + // this is commented out to draw actors backed into the background + //if(actorPtr->_flags & (AF_ANIMATED + AF_DRAWABLE + AF_SPECIAL)) + { + actorPtr->objectType &= ~AF_DRAWABLE; - // TODO: bounding volume + if (actorPtr->objectType & AF_SPECIAL) + { + AffSpecialObjet(currentDrawActor); } else { - sBody* bodyPtr = HQR_Get(HQ_Bodys, actorPtr->bodyNum); + if (actorPtr->objectType & AF_OBJ_2D) { + sHybrid* pHybrid = HQR_Get(HQ_Hybrides, actorPtr->ANIM); + s16 numHybrid = pHybrid->animations[actorPtr->bodyNum].anims[actorPtr->frame].id; + AffHyb(numHybrid, 0, 0, pHybrid); - if (HQ_Load) - { - // initAnimInBody(actorPtr->FRAME, HQR_Get(listAnim, actorPtr->ANIM), bodyPtr); + // TODO: bounding volume } + else + { + sBody* bodyPtr = HQR_Get(HQ_Bodys, actorPtr->bodyNum); - AffObjet(actorPtr->worldX + actorPtr->stepX, actorPtr->worldY + actorPtr->stepY, actorPtr->worldZ + actorPtr->stepZ, actorPtr->alpha, actorPtr->beta, actorPtr->gamma, bodyPtr); + if (HQ_Load) + { + // initAnimInBody(actorPtr->FRAME, HQR_Get(listAnim, actorPtr->ANIM), bodyPtr); + } + AffObjet(actorPtr->worldX + actorPtr->stepX, actorPtr->worldY + actorPtr->stepY, actorPtr->worldZ + actorPtr->stepZ, actorPtr->alpha, actorPtr->beta, actorPtr->gamma, bodyPtr); - if (actorPtr->animActionType != 0) - { - if (actorPtr->hotPointID != -1) + + if (actorPtr->animActionType != 0) { - getHotPoint(actorPtr->hotPointID, bodyPtr, &actorPtr->hotPoint); + if (actorPtr->hotPointID != -1) + { + getHotPoint(actorPtr->hotPointID, bodyPtr, &actorPtr->hotPoint); + } } - } - ///////////////////////////////////// DEBUG + ///////////////////////////////////// DEBUG #ifdef FITD_DEBUGGER // if(debuggerVar_drawModelZv) - { - if (backgroundMode == backgroundModeEnum_3D) { - drawZv(actorPtr); + if (backgroundMode == backgroundModeEnum_3D) + { + drawZv(actorPtr); + } } - } #endif - ///////////////////////////////////// + ///////////////////////////////////// + } } - } - if(BBox3D1 < 0) - BBox3D1 = 0; - if(BBox3D3 > 319) - BBox3D3 = 319; - if(BBox3D2 < 0) - BBox3D2 = 0; - if(BBox3D4 > 199) - BBox3D4 = 199; + if (BBox3D1 < 0) + BBox3D1 = 0; + if (BBox3D3 > 319) + BBox3D3 = 319; + if (BBox3D2 < 0) + BBox3D2 = 0; + if (BBox3D4 > 199) + BBox3D4 = 199; - if(BBox3D1<=319 && BBox3D2<=199 && BBox3D3>=0 && BBox3D4>=0) // is the character on screen ? - { - if(g_gameId == AITD1) - { - if(actorPtr->indexInWorld == CVars[getCVarsIdx(LIGHT_OBJECT)]) - { - lightX = (BBox3D3 + BBox3D1) / 2; - lightY = (BBox3D4 + BBox3D2) / 2; - } - } + if (BBox3D1 <= 319 && BBox3D2 <= 199 && BBox3D3 >= 0 && BBox3D4 >= 0) // is the character on screen ? + { + if (g_gameId == AITD1) + { + if (actorPtr->indexInWorld == CVars[getCVarsIdx(LIGHT_OBJECT)]) + { + lightX = (BBox3D3 + BBox3D1) / 2; + lightY = (BBox3D4 + BBox3D2) / 2; + } + } #ifdef FITD_DEBUGGER - if(backgroundMode == backgroundModeEnum_2D) + if (backgroundMode == backgroundModeEnum_2D) #endif - { - //if(g_gameId == AITD1) - drawBgOverlay(actorPtr); - } - //addToRedrawBox(); - } - else - { - actorPtr->screenYMax = -1; - actorPtr->screenXMax = -1; - actorPtr->screenYMin = -1; - actorPtr->screenXMin = -1; - } - } + { + //if(g_gameId == AITD1) + drawBgOverlay(actorPtr); + } + //addToRedrawBox(); + } + else + { + actorPtr->screenYMax = -1; + actorPtr->screenXMax = -1; + actorPtr->screenYMin = -1; + actorPtr->screenXMin = -1; + } + } + } } #ifdef FITD_DEBUGGER { - for (i = 0; i < getNumberOfRoom(); i++) + for (int i = 0; i < getNumberOfRoom(); i++) { if (hardColDisplayMode != displayNone) { drawHardCol(i); @@ -3548,7 +3563,7 @@ int isInPoly(int x1, int x2, int z1, int z2, cameraViewedRoomStruct* pCameraZone int i; - for(i=0;inumCoverZones;i++) + for(i=0;icoverZones.size();i++) { int j; int flag = 0; diff --git a/FitdLib/main.h b/FitdLib/main.h index de45966..19712b8 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -13,7 +13,7 @@ void InitView(); void GereSwitchCamera(void); void GenereActiveList(); void GenereAffList(); -void mainDraw(int mode); +void AllRedraw(int mode); int checkObjectCollisions(int actorIdx, ZVStruct* zvPtr); int checkLineProjectionWithActors( int actorIdx, int X, int Y, int Z, int beta, int room, int param ); int AsmCheckListCol(ZVStruct* zvPtr, roomDataStruct* pRoomData); diff --git a/FitdLib/mainLoop.cpp b/FitdLib/mainLoop.cpp index ee42c65..c58140f 100644 --- a/FitdLib/mainLoop.cpp +++ b/FitdLib/mainLoop.cpp @@ -1,4 +1,5 @@ #include "common.h" +#include "anim2d.h" #ifndef WIN32 #include @@ -255,6 +256,8 @@ void PlayWorld(int allowSystemMenu, int deltaTime) sortActorList(); + handleAnim2d(); + // if(FlagRefreshAux2) { // setupCameraSub4(); @@ -264,7 +267,7 @@ void PlayWorld(int allowSystemMenu, int deltaTime) //osystem_delay(100); - mainDraw(flagRedraw); + AllRedraw(flagRedraw); updatePendingEvents(); } diff --git a/FitdLib/room.h b/FitdLib/room.h index cc59276..94dec2d 100644 --- a/FitdLib/room.h +++ b/FitdLib/room.h @@ -53,6 +53,10 @@ struct cameraMaskStruct std::vector rectTests; }; +struct cameraHybridStruct { + std::vector rects; +}; + struct cameraViewedRoomStruct { s16 viewedRoomIdx; @@ -64,10 +68,9 @@ struct cameraViewedRoomStruct s16 lightY; s16 lightZ; - u16 numMask; std::vector masks; - u16 numCoverZones; std::vector coverZones; + std::vector hybrids; }; struct cameraDataStruct diff --git a/FitdLib/sprite.cpp b/FitdLib/sprite.cpp new file mode 100644 index 0000000..b7a210c --- /dev/null +++ b/FitdLib/sprite.cpp @@ -0,0 +1,45 @@ +#include "common.h" +#include "sprite.h" + +void sHybrid_Sprite::read(uint8_t* buffer, int bufferSize) { + flags = READ_LE_U16(buffer); buffer+=2; + dx = READ_LE_U8(buffer); buffer++; + dy = READ_LE_U8(buffer); buffer++; + + lines.reserve(dy); + for (int i = 0; i < dy; i++) { + auto& line = lines.emplace_back(); + int numBlocks = READ_LE_U8(buffer); buffer++; + line.blocks.reserve(numBlocks); + for (int j = 0; j < numBlocks; j++) { + auto& block = line.blocks.emplace_back(); + block.unk0 = READ_LE_U8(buffer); buffer++; + block.numWords = READ_LE_U8(buffer); buffer++; + block.numBytes = READ_LE_U8(buffer); buffer++; + + int dataSize = block.numWords * 4 + block.numBytes; + block.data.resize(dataSize); + for (int k = 0; k < dataSize; k++) { + block.data[k] = READ_LE_U8(buffer); buffer++; + } + } + line.unk = READ_LE_U8(buffer); buffer++; + } +} + +void AffSpr(int spriteNumber, int X, int Y, char* screen, std::vector& sprites) { + sHybrid_Sprite& sprite = sprites[spriteNumber]; + + Y -= sprite.dy; + for (int y = 0; y < sprite.dy; y++) { + auto& lineData = sprite.lines[y]; + + char* lineStart = screen + ((y + Y) * 320 + X); + for (int i = 0; i < lineData.blocks.size(); i++) { + auto& block = lineData.blocks[i]; + lineStart += block.unk0; + memcpy(lineStart, block.data.data(), block.data.size()); + lineStart += block.data.size(); + } + } +} diff --git a/FitdLib/sprite.h b/FitdLib/sprite.h new file mode 100644 index 0000000..6259bbc --- /dev/null +++ b/FitdLib/sprite.h @@ -0,0 +1,24 @@ +#pragma once + +struct sHybrid_SpriteBlock { + uint8_t unk0; + uint8_t numWords; + uint8_t numBytes; + std::vector data; +}; + +struct sHybrid_SpriteLine { + std::vector blocks; + uint8_t unk; +}; + +struct sHybrid_Sprite { + uint16_t flags; + uint8_t dx; + uint8_t dy; + std::vector lines; + + void read(uint8_t* buffer, int bufferSize); +}; + +void AffSpr(int spriteNumber, int X, int Y, char* screen, std::vector& sprites); \ No newline at end of file diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index 734c0bd..caf4ed9 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -191,8 +191,8 @@ int flagRedraw; float renderPointList[6400]; -int numActorInList; -std::array sortedActorTable; +int NbAffObjets; +std::array Index; int angleCompX; int angleCompZ; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index 4b80235..083b2e1 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -410,8 +410,8 @@ extern int flagRedraw; extern float renderPointList[6400]; -extern int numActorInList; -extern std::array sortedActorTable; +extern int NbAffObjets; +extern std::array Index; extern int angleCompX; extern int angleCompZ; From 14126c19eb04faee6ed3fa7bd6465ccb36749417 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 21 Jun 2025 21:03:45 -0700 Subject: [PATCH 65/70] Fix linux build --- FitdLib/anim2d.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FitdLib/anim2d.cpp b/FitdLib/anim2d.cpp index 473f98a..cf69075 100644 --- a/FitdLib/anim2d.cpp +++ b/FitdLib/anim2d.cpp @@ -47,7 +47,7 @@ void handleAnim2d() { } } - std::memmove(&Index2[j + 2], &Index2[j + 1], (NbAffObjets + i - j - 1) * sizeof(Index2[0])); + memmove(&Index2[j + 2], &Index2[j + 1], (NbAffObjets + i - j - 1) * sizeof(Index2[0])); Index2[j + 1] = 0x8000 + i; } From 341a39580a8a51d23b198afcb177d0d918e35d5e Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 21 Jun 2025 21:31:27 -0700 Subject: [PATCH 66/70] add missing template --- FitdLib/hqr.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/FitdLib/hqr.cpp b/FitdLib/hqr.cpp index 29167c8..7b77e0e 100644 --- a/FitdLib/hqr.cpp +++ b/FitdLib/hqr.cpp @@ -490,6 +490,7 @@ template void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name); template hqrEntryStruct* HQR_InitRessource(const char* name, int size, int numEntries); template sAnimation* HQR_Get(hqrEntryStruct* hqrPtr, int index); template void HQR_Free(hqrEntryStruct* hqrPtr); +template void HQR_Reset(hqrEntryStruct* hqrPtr); template void configureHqrHero(hqrEntryStruct* hqrPtr, const char* name); /// hybrids From 612b7027905cc3edf4173d15ba3a9ebb7c5f421c Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 21 Jun 2025 22:57:43 -0700 Subject: [PATCH 67/70] Fix Jack animations --- FitdLib/anim.cpp | 6 +++--- FitdLib/hqr.cpp | 22 ++++++++++++++++++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/FitdLib/anim.cpp b/FitdLib/anim.cpp index 902e9ed..3557e10 100644 --- a/FitdLib/anim.cpp +++ b/FitdLib/anim.cpp @@ -859,9 +859,9 @@ s16 SetInterAnimObjet(int frame, sAnimation* pAnim, sBody* pBody) point3dStruct& previousState = pPreviousKeyframe->m_groups[i].m_rotateDelta; point3dStruct& nextState = pKeyframe->m_groups[i].m_rotateDelta; - PatchInterStep(&state.x, previousState.x, nextState.x, bp, bx); - PatchInterStep(&state.y, previousState.y, nextState.y, bp, bx); - PatchInterStep(&state.z, previousState.z, nextState.z, bp, bx); + PatchInterAngle(&state.x, previousState.x, nextState.x, bp, bx); + PatchInterAngle(&state.y, previousState.y, nextState.y, bp, bx); + PatchInterAngle(&state.z, previousState.z, nextState.z, bp, bx); } } } diff --git a/FitdLib/hqr.cpp b/FitdLib/hqr.cpp index 7b77e0e..d82f9e3 100644 --- a/FitdLib/hqr.cpp +++ b/FitdLib/hqr.cpp @@ -99,7 +99,7 @@ char* HQ_PtrMalloc(hqrEntryStruct* hqrPtr, int index) return(ptr->ptr); } -sAnimation* createAnimationFromPtr(void* ptr) +sAnimation* createAnimationFromPtr(void* ptr, int size) { u8* animPtr = (u8*)ptr; @@ -109,6 +109,18 @@ sAnimation* createAnimationFromPtr(void* ptr) pAnimation->m_numFrames = READ_LE_U16(animPtr); animPtr += 2; pAnimation->m_numGroups = READ_LE_U16(animPtr); animPtr += 2; + int fullSizeNoOptim = 2 + 2 + pAnimation->m_numFrames * (2 + 2 + 2 + 2 + pAnimation->m_numGroups * (2 + 2 + 2 + 2)); + int fullSizeWithOptim = 2 + 2 + pAnimation->m_numFrames * (2 + 2 + 2 + 2 + pAnimation->m_numGroups * (2 + 2 + 2 + 2 + 2 + 2 + 2 + 2)); + + bool bUseOptim = false; + + if (size == fullSizeWithOptim) { + bUseOptim = true; + } + else { + assert(size == fullSizeNoOptim); + } + pAnimation->m_frames.resize(pAnimation->m_numFrames); for (int i = 0; i < pAnimation->m_numFrames; i++) { @@ -128,6 +140,12 @@ sAnimation* createAnimationFromPtr(void* ptr) pGroup->m_delta.x = READ_LE_S16(animPtr); animPtr += 2; pGroup->m_delta.y = READ_LE_S16(animPtr); animPtr += 2; pGroup->m_delta.z = READ_LE_S16(animPtr); animPtr += 2; + if (bUseOptim) { + pGroup->m_rotateDelta.x = READ_LE_S16(animPtr); animPtr += 2; + pGroup->m_rotateDelta.y = READ_LE_S16(animPtr); animPtr += 2; + pGroup->m_rotateDelta.z = READ_LE_S16(animPtr); animPtr += 2; + pGroup->m_padding = READ_LE_S16(animPtr); animPtr += 2; + } } } return pAnimation; @@ -376,7 +394,7 @@ T* HQR_Get(hqrEntryStruct* hqrPtr, int index) delete[] buffer; } else if constexpr (std::is_same_v) { - foundEntry->ptr = createAnimationFromPtr(buffer); + foundEntry->ptr = createAnimationFromPtr(buffer, size); delete[] buffer; } else if constexpr (std::is_same_v) { From 24c7d8fa233edab33bcd4fda9a33ca3d670a4452 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Sat, 21 Jun 2025 23:07:06 -0700 Subject: [PATCH 68/70] Cleanup to the optimized animations --- FitdLib/anim.cpp | 7 +++---- FitdLib/config.h | 1 + FitdLib/hqr.cpp | 18 ++++++++++-------- FitdLib/renderer.cpp | 2 +- FitdLib/vars.h | 3 +-- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/FitdLib/anim.cpp b/FitdLib/anim.cpp index 3557e10..c90b9ad 100644 --- a/FitdLib/anim.cpp +++ b/FitdLib/anim.cpp @@ -41,7 +41,6 @@ int SetAnimObjet(int frame, sAnimation* pAnimation, sBody* body) if(body->m_flags & INFO_OPTIMISE) { body->m_groups[i].m_state.m_rotateDelta = keyframe.m_groups[i].m_rotateDelta; - body->m_groups[i].m_state.m_padding = keyframe.m_groups[i].m_padding; } } @@ -855,9 +854,9 @@ s16 SetInterAnimObjet(int frame, sAnimation* pAnim, sBody* pBody) } { - point3dStruct& state = pBody->m_groups[i].m_state.m_rotateDelta; - point3dStruct& previousState = pPreviousKeyframe->m_groups[i].m_rotateDelta; - point3dStruct& nextState = pKeyframe->m_groups[i].m_rotateDelta; + point3dStruct& state = pBody->m_groups[i].m_state.m_rotateDelta.value(); + point3dStruct& previousState = pPreviousKeyframe->m_groups[i].m_rotateDelta.value(); + point3dStruct& nextState = pKeyframe->m_groups[i].m_rotateDelta.value(); PatchInterAngle(&state.x, previousState.x, nextState.x, bp, bx); PatchInterAngle(&state.y, previousState.y, nextState.y, bp, bx); diff --git a/FitdLib/config.h b/FitdLib/config.h index 9aa1ed1..f7a2abc 100644 --- a/FitdLib/config.h +++ b/FitdLib/config.h @@ -4,6 +4,7 @@ #include #include #include +#include #endif #ifdef __APPLE__ diff --git a/FitdLib/hqr.cpp b/FitdLib/hqr.cpp index d82f9e3..7ebe671 100644 --- a/FitdLib/hqr.cpp +++ b/FitdLib/hqr.cpp @@ -141,10 +141,11 @@ sAnimation* createAnimationFromPtr(void* ptr, int size) pGroup->m_delta.y = READ_LE_S16(animPtr); animPtr += 2; pGroup->m_delta.z = READ_LE_S16(animPtr); animPtr += 2; if (bUseOptim) { - pGroup->m_rotateDelta.x = READ_LE_S16(animPtr); animPtr += 2; - pGroup->m_rotateDelta.y = READ_LE_S16(animPtr); animPtr += 2; - pGroup->m_rotateDelta.z = READ_LE_S16(animPtr); animPtr += 2; - pGroup->m_padding = READ_LE_S16(animPtr); animPtr += 2; + pGroup->m_rotateDelta.emplace(); + pGroup->m_rotateDelta.value().x = READ_LE_S16(animPtr); animPtr += 2; + pGroup->m_rotateDelta.value().y = READ_LE_S16(animPtr); animPtr += 2; + pGroup->m_rotateDelta.value().z = READ_LE_S16(animPtr); animPtr += 2; + animPtr += 2; } } } @@ -215,10 +216,11 @@ sBody* createBodyFromPtr(void* ptr) newBody->m_groups[i].m_state.m_delta.x = READ_LE_S16(bodyBuffer); bodyBuffer += 2; newBody->m_groups[i].m_state.m_delta.y = READ_LE_S16(bodyBuffer); bodyBuffer += 2; newBody->m_groups[i].m_state.m_delta.z = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_rotateDelta.x = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_rotateDelta.y = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_rotateDelta.z = READ_LE_S16(bodyBuffer); bodyBuffer += 2; - newBody->m_groups[i].m_state.m_padding = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_rotateDelta.emplace(); + newBody->m_groups[i].m_state.m_rotateDelta.value().x = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_rotateDelta.value().y = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + newBody->m_groups[i].m_state.m_rotateDelta.value().z = READ_LE_S16(bodyBuffer); bodyBuffer += 2; + bodyBuffer += 2; } } else diff --git a/FitdLib/renderer.cpp b/FitdLib/renderer.cpp index c4d72a6..be12642 100644 --- a/FitdLib/renderer.cpp +++ b/FitdLib/renderer.cpp @@ -344,7 +344,7 @@ int AnimNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) break; } - InitGroupeRot(pGroup[0].m_state.m_rotateDelta.x, pGroup[0].m_state.m_rotateDelta.y, pGroup[0].m_state.m_rotateDelta.z); + InitGroupeRot(pGroup->m_state.m_rotateDelta.value().x, pGroup->m_state.m_rotateDelta.value().y, pGroup->m_state.m_rotateDelta.value().z); RotateGroupeOptimise(pGroup); } } diff --git a/FitdLib/vars.h b/FitdLib/vars.h index 083b2e1..b487e7d 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -504,8 +504,7 @@ struct sGroupState s16 m_type; // 0 point3dStruct m_delta; // 2 // (AITD2+) if Info_optimise - point3dStruct m_rotateDelta; // 8 - s16 m_padding; + std::optional m_rotateDelta; // 8 // 8 / 0x10 }; From 228f0856c4988df758093c7d6c2ce535b271df96 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Fri, 25 Jul 2025 21:50:43 -0700 Subject: [PATCH 69/70] Various rename and cleanup --- FitdLib/actorList.cpp | 12 +- FitdLib/anim.cpp | 119 ++++----- FitdLib/animAction.cpp | 28 +-- FitdLib/debugger.cpp | 2 +- FitdLib/evalVar.cpp | 50 ++-- FitdLib/inventory.cpp | 2 +- FitdLib/life.cpp | 32 +-- FitdLib/main.cpp | 294 +++++++++++----------- FitdLib/main.h | 12 +- FitdLib/mainLoop.cpp | 8 +- FitdLib/object.cpp | 4 +- FitdLib/osystemSDL.cpp | 2 +- FitdLib/room.cpp | 14 +- FitdLib/save.cpp | 550 ++++++++++++++++++++--------------------- FitdLib/track.cpp | 2 +- FitdLib/vars.cpp | 2 +- FitdLib/vars.h | 2 +- 17 files changed, 575 insertions(+), 560 deletions(-) diff --git a/FitdLib/actorList.cpp b/FitdLib/actorList.cpp index 6b11e5a..bf89ae4 100644 --- a/FitdLib/actorList.cpp +++ b/FitdLib/actorList.cpp @@ -17,23 +17,23 @@ int sortCompareFunction(const void* param1, const void* param2) ASSERT(*(int*)param1 >=0 && *(int*)param1 < NUM_MAX_OBJECT); ASSERT(*(int*)param2 >=0 && *(int*)param2 < NUM_MAX_OBJECT); - actor1Ptr = &objectTable[*(int*)param1]; - actor2Ptr = &objectTable[*(int*)param2]; + actor1Ptr = &ListObjets[*(int*)param1]; + actor2Ptr = &ListObjets[*(int*)param2]; actor1ZvPtr = &actor1Ptr->zv; actor2ZvPtr = &actor2Ptr->zv; if(actor1Ptr->room != currentRoom) { - copyZv(actor1ZvPtr, &localZv1); - getZvRelativePosition(&localZv1, actor1Ptr->room, currentRoom); + CopyZV(actor1ZvPtr, &localZv1); + AdjustZV(&localZv1, actor1Ptr->room, currentRoom); actor1ZvPtr = &localZv1; } if(actor2Ptr->room != currentRoom) { - copyZv(actor2ZvPtr, &localZv2); - getZvRelativePosition(&localZv2, actor2Ptr->room, currentRoom); + CopyZV(actor2ZvPtr, &localZv2); + AdjustZV(&localZv2, actor2Ptr->room, currentRoom); actor2ZvPtr = &localZv2; } diff --git a/FitdLib/anim.cpp b/FitdLib/anim.cpp index c90b9ad..85dfb4a 100644 --- a/FitdLib/anim.cpp +++ b/FitdLib/anim.cpp @@ -166,11 +166,11 @@ int manageFall(int actorIdx, ZVStruct* zvPtr) { int fallResult = 0; int i; - int room = objectTable[actorIdx].room; + int room = ListObjets[actorIdx].room; for(i=0;iindexInWorld != -1 && i != actorIdx) { @@ -179,20 +179,20 @@ int manageFall(int actorIdx, ZVStruct* zvPtr) if(currentTestedActorPtr->room != room) { ZVStruct localZv; - copyZv(zvPtr, &localZv); - getZvRelativePosition(&localZv, room, currentTestedActorPtr->room); + CopyZV(zvPtr, &localZv); + AdjustZV(&localZv, room, currentTestedActorPtr->room); - if(checkZvCollision(&localZv, testedZv)) + if(CubeIntersect(&localZv, testedZv)) { - objectTable[i].COL_BY = actorIdx; + ListObjets[i].COL_BY = actorIdx; fallResult++; } } else { - if(checkZvCollision(zvPtr, testedZv)) + if(CubeIntersect(zvPtr, testedZv)) { - objectTable[i].COL_BY = actorIdx; + ListObjets[i].COL_BY = actorIdx; fallResult++; } } @@ -285,11 +285,11 @@ void GereAnim(void) currentProcessedActorPtr->END_FRAME = 0; if(currentProcessedActorPtr->speed == 0) { - int numObjectCollisions = checkObjectCollisions(currentProcessedActorIdx, ¤tProcessedActorPtr->zv); + int numObjectCollisions = CheckObjectCol(currentProcessedActorIdx, ¤tProcessedActorPtr->zv); for(int i = 0; iCOL[i]].COL_BY = currentProcessedActorIdx; // collision with current actor + ListObjets[currentProcessedActorPtr->COL[i]].COL_BY = currentProcessedActorIdx; // collision with current actor } oldStepY = 0; @@ -356,7 +356,7 @@ void GereAnim(void) if(stepX || stepY || stepZ) // start of movement management { zvPtr = ¤tProcessedActorPtr->zv; - copyZv(¤tProcessedActorPtr->zv,&zvLocal); + CopyZV(¤tProcessedActorPtr->zv,&zvLocal); zvLocal.ZVX1 += stepX; zvLocal.ZVX2 += stepX; @@ -367,6 +367,7 @@ void GereAnim(void) zvLocal.ZVZ1 += stepZ; zvLocal.ZVZ2 += stepZ; + // check for wall collisions if(currentProcessedActorPtr->dynFlags & 1) // hard collision enabled for actor ? { int numCol = AsmCheckListCol(&zvLocal, &roomDataTable[currentProcessedActorPtr->room]); @@ -380,38 +381,42 @@ void GereAnim(void) currentProcessedActorPtr->HARD_COL = (short)pHardCol->parameter; } + // climbable wall if(pHardCol->type == 3) { currentProcessedActorPtr->HARD_COL = 255; } - if(g_gameId == AITD1 || (g_gameId>=JACK && (pHardCol->type != 10 || currentProcessedActorIdx != currentCameraTargetActor))) + if (g_gameId >= JACK) { + // monster collision for floor changes + if ((pHardCol->type == 10) && (currentProcessedActorIdx == currentCameraTargetActor)) + continue; + } + + if(stepX || stepZ) // move on the X or Z axis ? update to avoid entering the hard col { - if(stepX || stepZ) // move on the X or Z axis ? update to avoid entering the hard col - { - //ZVStruct tempZv; + //ZVStruct tempZv; - hardColStepX = stepX; - hardColStepZ = stepZ; + hardColStepX = stepX; + hardColStepZ = stepZ; - handleCollision(zvPtr, &zvLocal, &pHardCol->zv); + GereCollision(zvPtr, &zvLocal, &pHardCol->zv); - currentProcessedActorPtr->animNegX += hardColStepX - stepX; - currentProcessedActorPtr->animNegZ += hardColStepZ - stepZ; + currentProcessedActorPtr->animNegX += hardColStepX - stepX; + currentProcessedActorPtr->animNegZ += hardColStepZ - stepZ; - zvLocal.ZVX1 += hardColStepX - stepX; - zvLocal.ZVX2 += hardColStepX - stepX; - zvLocal.ZVZ1 += hardColStepZ - stepZ; - zvLocal.ZVZ2 += hardColStepZ - stepZ; + zvLocal.ZVX1 += hardColStepX - stepX; + zvLocal.ZVX2 += hardColStepX - stepX; + zvLocal.ZVZ1 += hardColStepZ - stepZ; + zvLocal.ZVZ2 += hardColStepZ - stepZ; - stepX = hardColStepX; - stepZ = hardColStepZ; - } + stepX = hardColStepX; + stepZ = hardColStepZ; + } - if(stepY) - { - //assert(0); //not implemented - } + if(stepY) + { + //assert(0); //not implemented } } } @@ -427,13 +432,14 @@ void GereAnim(void) } } - int numCol = checkObjectCollisions(currentProcessedActorIdx,&zvLocal); // get the number of actor/actor collision - + // check for object collisions + // TODO: AITD2 checks flag collision here + int numCol = CheckObjectCol(currentProcessedActorIdx,&zvLocal); // get the number of actor/actor collision for(int j=0;jCOL[j]; - tObject* actorTouchedPtr = &objectTable[collisionIndex]; + tObject* actorTouchedPtr = &ListObjets[collisionIndex]; actorTouchedPtr->COL_BY = currentProcessedActorIdx; @@ -443,10 +449,10 @@ void GereAnim(void) { if(currentProcessedActorPtr->trackMode == 1 /*&& ((gameId == AITD1 && defines.field_1E == 0) || (gameId >= JACK && defines.field_6 == 0))*/) // TODO: check if character isn't dead... { - foundObject(actorTouchedPtr->indexInWorld, 0); + FoundObjet(actorTouchedPtr->indexInWorld, 0); } + continue; } - else { if(actorTouchedPtr->objectType & AF_MOVABLE) // can be pushed ? { @@ -454,7 +460,7 @@ void GereAnim(void) bool isPushPossible = true; - copyZv(touchedZv, &localZv2); + CopyZV(touchedZv, &localZv2); localZv2.ZVX1 += stepX; localZv2.ZVX2 += stepX; @@ -462,17 +468,16 @@ void GereAnim(void) localZv2.ZVZ1 += stepZ; localZv2.ZVZ2 += stepZ; - if(!AsmCheckListCol(&localZv2, &roomDataTable[currentProcessedActorPtr->room])) - { - if(checkObjectCollisions(collisionIndex, &localZv2)) - { - isPushPossible = false; - } - } - else + // check pushed object against walls + if(AsmCheckListCol(&localZv2, &roomDataTable[currentProcessedActorPtr->room])) { - isPushPossible = false; + isPushPossible = false; } + else if (CheckObjectCol(collisionIndex, &localZv2)) + { + // if no wall preventing to move object, check is there is a another object in the way + isPushPossible = false; + } if(!isPushPossible) { @@ -482,14 +487,14 @@ void GereAnim(void) { ZVStruct localZv3; - copyZv(touchedZv, &localZv3); + CopyZV(touchedZv, &localZv3); - getZvRelativePosition(&localZv3, actorTouchedPtr->room, currentProcessedActorPtr->room); + AdjustZV(&localZv3, actorTouchedPtr->room, currentProcessedActorPtr->room); hardColStepX = stepX; hardColStepZ = stepZ; - handleCollision(zvPtr, &zvLocal, &localZv3); + GereCollision(zvPtr, &zvLocal, &localZv3); stepX = hardColStepX; stepZ = hardColStepZ; @@ -499,7 +504,7 @@ void GereAnim(void) hardColStepX = stepX; hardColStepZ = stepZ; - handleCollision(zvPtr, &zvLocal, touchedZv); // manage as hard collision + GereCollision(zvPtr, &zvLocal, touchedZv); // manage as hard collision stepX = hardColStepX; stepZ = hardColStepZ; @@ -521,7 +526,7 @@ void GereAnim(void) actorTouchedPtr->roomX += stepX; actorTouchedPtr->roomZ += stepZ; - copyZv(&localZv2,touchedZv); + CopyZV(&localZv2,touchedZv); } } else @@ -536,7 +541,7 @@ void GereAnim(void) hardColStepX = stepX; hardColStepZ = stepZ; - handleCollision(zvPtr, &zvLocal, touchedZv); // manage as hard collision + GereCollision(zvPtr, &zvLocal, touchedZv); // manage as hard collision stepX = hardColStepX; stepZ = hardColStepZ; @@ -545,14 +550,14 @@ void GereAnim(void) { ZVStruct localZv3; - copyZv(touchedZv, &localZv3); + CopyZV(touchedZv, &localZv3); - getZvRelativePosition(&localZv3, actorTouchedPtr->room, currentProcessedActorPtr->room); + AdjustZV(&localZv3, actorTouchedPtr->room, currentProcessedActorPtr->room); hardColStepX = stepX; hardColStepZ = stepZ; - handleCollision(zvPtr, &zvLocal, &localZv3); // manage as hard collision + GereCollision(zvPtr, &zvLocal, &localZv3); // manage as hard collision stepX = hardColStepX; stepZ = hardColStepZ; @@ -589,7 +594,7 @@ void GereAnim(void) { zvPtr = ¤tProcessedActorPtr->zv; - copyZv(zvPtr, &zvLocal); + CopyZV(zvPtr, &zvLocal); zvLocal.ZVY2 += 100; @@ -617,7 +622,7 @@ void GereAnim(void) if(collisionIndex != -1) { - tObject* actorTouchedPtr = &objectTable[collisionIndex]; + tObject* actorTouchedPtr = &ListObjets[collisionIndex]; if(actorTouchedPtr->objectType & AF_MOVABLE) { diff --git a/FitdLib/animAction.cpp b/FitdLib/animAction.cpp index f55bbcf..10c09a7 100644 --- a/FitdLib/animAction.cpp +++ b/FitdLib/animAction.cpp @@ -69,14 +69,14 @@ void GereFrappe(void) //drawProjectedBox(rangeZv.ZVX1,rangeZv.ZVX2,rangeZv.ZVY1,rangeZv.ZVY2,rangeZv.ZVZ1,rangeZv.ZVZ2,60,255); - collision = checkObjectCollisions(currentProcessedActorIdx,&rangeZv); + collision = CheckObjectCol(currentProcessedActorIdx,&rangeZv); for(i=0;iHIT = currentProcessedActorPtr->COL[i]; - actorPtr2 = &objectTable[currentProcessedActorPtr->COL[i]]; + actorPtr2 = &ListObjets[currentProcessedActorPtr->COL[i]]; actorPtr2->HIT_BY = currentProcessedActorIdx; actorPtr2->hitForce = currentProcessedActorPtr->hitForce; @@ -141,8 +141,8 @@ void GereFrappe(void) currentProcessedActorPtr->HIT = touchedActor; - objectTable[touchedActor].HIT_BY = currentProcessedActorIdx; - objectTable[touchedActor].hitForce = currentProcessedActorPtr->hitForce; + ListObjets[touchedActor].HIT_BY = currentProcessedActorIdx; + ListObjets[touchedActor].hitForce = currentProcessedActorPtr->hitForce; currentProcessedActorPtr->animActionType = 0; } @@ -229,7 +229,7 @@ void GereFrappe(void) if(actorIdx == -1) return; - actorPtr = &objectTable[actorIdx]; + actorPtr = &ListObjets[actorIdx]; actorPtr->roomX = x; actorPtr->roomY = y; @@ -287,8 +287,8 @@ void GereFrappe(void) int z3; int step; - copyZv(¤tProcessedActorPtr->zv, &rangeZv); - copyZv(¤tProcessedActorPtr->zv, &rangeZv2); + CopyZV(¤tProcessedActorPtr->zv, &rangeZv); + CopyZV(¤tProcessedActorPtr->zv, &rangeZv2); xtemp = currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX; ytemp = currentProcessedActorPtr->roomY + currentProcessedActorPtr->stepY; @@ -328,7 +328,7 @@ void GereFrappe(void) y2 = y1; z2 = z1 + animMoveZ; - copyZv(&rangeZv2,&rangeZv); + CopyZV(&rangeZv2,&rangeZv); rangeZv.ZVX1 = x2 - 200; rangeZv.ZVX2 = x2 + 200; @@ -337,7 +337,7 @@ void GereFrappe(void) rangeZv.ZVZ1 = z2 - 200; rangeZv.ZVZ2 = z2 + 200; - collision = checkObjectCollisions(currentProcessedActorIdx,&rangeZv); + collision = CheckObjectCol(currentProcessedActorIdx,&rangeZv); if(collision) { @@ -352,7 +352,7 @@ void GereFrappe(void) { int currentActorCol = currentProcessedActorPtr->COL[i]; - if(objectTable[currentActorCol].indexInWorld == objPtr->alpha) + if(ListObjets[currentActorCol].indexInWorld == objPtr->alpha) { collision2--; objPtr->x = xtemp; @@ -362,7 +362,7 @@ void GereFrappe(void) return; } - if(objectTable[currentActorCol].indexInWorld == CVars[getCVarsIdx((enumCVars)REVERSE_OBJECT)]) + if(ListObjets[currentActorCol].indexInWorld == CVars[getCVarsIdx((enumCVars)REVERSE_OBJECT)]) { objPtr->alpha = CVars[getCVarsIdx((enumCVars)REVERSE_OBJECT)]; currentProcessedActorPtr->beta += 0x200; @@ -376,7 +376,7 @@ void GereFrappe(void) currentProcessedActorPtr->stepX = 0; currentProcessedActorPtr->stepZ = 0; - copyZv(&rangeZv2, &rangeZv); + CopyZV(&rangeZv2, &rangeZv); rangeZv.ZVX1 += x3; rangeZv.ZVX2 += x3; @@ -385,7 +385,7 @@ void GereFrappe(void) rangeZv.ZVZ1 += z3; rangeZv.ZVZ2 += z3; - copyZv(&rangeZv, ¤tProcessedActorPtr->zv); + CopyZV(&rangeZv, ¤tProcessedActorPtr->zv); objPtr->x = xtemp; objPtr->y = ytemp; @@ -399,7 +399,7 @@ void GereFrappe(void) tObject* actorPtr; currentProcessedActorPtr->HIT = currentActorCol; - actorPtr = &objectTable[currentActorCol]; + actorPtr = &ListObjets[currentActorCol]; actorPtr->HIT_BY = currentProcessedActorIdx; actorPtr->hitForce = currentProcessedActorPtr->hitForce; } diff --git a/FitdLib/debugger.cpp b/FitdLib/debugger.cpp index 032290d..49e0aaf 100644 --- a/FitdLib/debugger.cpp +++ b/FitdLib/debugger.cpp @@ -235,7 +235,7 @@ void debugger_draw(void) if (selectedObject > NUM_MAX_OBJECT) selectedObject = NUM_MAX_OBJECT - 1; - tObject*pObject = &objectTable[selectedObject]; + tObject*pObject = &ListObjets[selectedObject]; ImGui::PushItemWidth(100); diff --git a/FitdLib/evalVar.cpp b/FitdLib/evalVar.cpp index a2a277c..e605896 100644 --- a/FitdLib/evalVar.cpp +++ b/FitdLib/evalVar.cpp @@ -9,8 +9,8 @@ int getMatrix(int param1, int actorIdx, int param2) int matrixWidth = *matrixPtr++; int matrixHeigh = *matrixPtr++; - matrixPtr+=(objectTable[actorIdx].hardMat-1)*matrixWidth; - matrixPtr+=(objectTable[param2].hardMat-1); + matrixPtr+=(ListObjets[actorIdx].hardMat-1)*matrixWidth; + matrixPtr+=(ListObjets[param2].hardMat-1); if(g_gameId == AITD3) { @@ -43,11 +43,11 @@ int getPosRel(tObject* actor1, tObject* actor2) } - copyZv(&actor2->zv, &localZv); + CopyZV(&actor2->zv, &localZv); if(actor1->room != actor2->room) { - getZvRelativePosition(&localZv, actor2->room, actor1->room); + AdjustZV(&localZv, actor2->room, actor1->room); } centerX = (localZv.ZVX1 + localZv.ZVX2) / 2; @@ -118,7 +118,7 @@ int testZvEndAnim(tObject* actorPtr,sAnimation* animPtr, int param) } ZVStruct localZv; - copyZv(&actorPtr->zv, &localZv); + CopyZV(&actorPtr->zv, &localZv); walkStep(0,stepX,actorPtr->beta); @@ -210,7 +210,7 @@ int evalVar(const char* name) } } else { - actorPtr = &objectTable[actorIdx]; + actorPtr = &ListObjets[actorIdx]; } } @@ -228,7 +228,7 @@ int evalVar(const char* name) if(temp1 != -1) { - return(objectTable[temp1].indexInWorld); + return(ListObjets[temp1].indexInWorld); } else { @@ -256,7 +256,7 @@ int evalVar(const char* name) } else { - return(objectTable[temp].indexInWorld); + return(ListObjets[temp].indexInWorld); } break; @@ -271,7 +271,7 @@ int evalVar(const char* name) } else { - return(objectTable[temp].indexInWorld); + return(ListObjets[temp].indexInWorld); } break; @@ -332,9 +332,9 @@ int evalVar(const char* name) } else { - int tempX = objectTable[actorNumber].worldX; - int tempY = objectTable[actorNumber].worldY; - int tempZ = objectTable[actorNumber].worldZ; + int tempX = ListObjets[actorNumber].worldX; + int tempY = ListObjets[actorNumber].worldY; + int tempZ = ListObjets[actorNumber].worldZ; return(calcDist(actorPtr->worldX, actorPtr->worldY, actorPtr->worldZ, tempX, tempY, tempZ)); } @@ -346,7 +346,7 @@ int evalVar(const char* name) if(actorPtr->COL_BY == -1) return(-1); else - return(objectTable[actorPtr->COL_BY].indexInWorld); + return(ListObjets[actorPtr->COL_BY].indexInWorld); break; } case 0x10: // found @@ -379,7 +379,7 @@ int evalVar(const char* name) return 0; } - return (getPosRel(actorPtr, &objectTable[ListWorldObjets[objNum].objIndex])); + return (getPosRel(actorPtr, &ListObjets[ListWorldObjets[objNum].objIndex])); break; } @@ -412,7 +412,7 @@ int evalVar(const char* name) return -1; } - return objectTable[temp1].indexInWorld; + return ListObjets[temp1].indexInWorld; break; } case 0x16: @@ -626,7 +626,7 @@ int evalVar2(const char* name) } } else { - actorPtr = &objectTable[actorIdx]; + actorPtr = &ListObjets[actorIdx]; } } { @@ -647,7 +647,7 @@ int evalVar2(const char* name) if(temp1 != -1) { - return(objectTable[temp1].indexInWorld); + return(ListObjets[temp1].indexInWorld); } else { @@ -685,7 +685,7 @@ int evalVar2(const char* name) } else { - return(objectTable[temp].indexInWorld); + return(ListObjets[temp].indexInWorld); } break; @@ -700,7 +700,7 @@ int evalVar2(const char* name) } else { - return(objectTable[temp].indexInWorld); + return(ListObjets[temp].indexInWorld); } break; @@ -776,9 +776,9 @@ int evalVar2(const char* name) } else { - tempX = objectTable[objectIdx].worldX; - tempY = objectTable[objectIdx].worldY; - tempZ = objectTable[objectIdx].worldZ; + tempX = ListObjets[objectIdx].worldX; + tempY = ListObjets[objectIdx].worldY; + tempZ = ListObjets[objectIdx].worldZ; } return(calcDist(actorPtr->worldX, actorPtr->worldY, actorPtr->worldZ, tempX, tempY, tempZ)); @@ -790,7 +790,7 @@ int evalVar2(const char* name) if(actorPtr->COL_BY == -1) return(-1); else - return(objectTable[actorPtr->COL_BY].indexInWorld); + return(ListObjets[actorPtr->COL_BY].indexInWorld); break; } case 0x10: // found @@ -823,7 +823,7 @@ int evalVar2(const char* name) return 0; } - return (getPosRel(actorPtr, &objectTable[ListWorldObjets[objNum].objIndex])); + return (getPosRel(actorPtr, &ListObjets[ListWorldObjets[objNum].objIndex])); break; } @@ -856,7 +856,7 @@ int evalVar2(const char* name) return -1; } - return objectTable[temp1].indexInWorld; + return ListObjets[temp1].indexInWorld; break; } case 0x16: diff --git a/FitdLib/inventory.cpp b/FitdLib/inventory.cpp index f102063..87475d5 100644 --- a/FitdLib/inventory.cpp +++ b/FitdLib/inventory.cpp @@ -493,7 +493,7 @@ void DrawFoundWindow(int menuState, int objectName, int zoomFactor) } } -void foundObject(int objIdx, int param) +void FoundObjet(int objIdx, int param) { tWorldObject* objPtr; diff --git a/FitdLib/life.cpp b/FitdLib/life.cpp index 48a9bb1..e9f33df 100644 --- a/FitdLib/life.cpp +++ b/FitdLib/life.cpp @@ -87,7 +87,7 @@ int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alp s16 localSpecialTable[4]; memcpy(localSpecialTable, specialTable, 8); - tObject* currentActorPtr = objectTable.data(); + tObject* currentActorPtr = ListObjets.data(); int i; for (i = 0; i < NUM_MAX_OBJECT; i++) // count the number of active actors @@ -131,7 +131,7 @@ int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alp if (zvPtr) { actorZvPtr = ¤tActorPtr->zv; - copyZv(zvPtr, actorZvPtr); + CopyZV(zvPtr, actorZvPtr); } switch (mode) @@ -226,7 +226,7 @@ void getHardClip() zvCol.ZVZ1 = READ_LE_S16(etageData + 0x08); zvCol.ZVZ2 = READ_LE_S16(etageData + 0x0A); - if (checkZvCollision(zvPtr, &zvCol)) + if (CubeIntersect(zvPtr, &zvCol)) { hardClip.ZVX1 = zvCol.ZVX1; hardClip.ZVX2 = zvCol.ZVX2; @@ -502,7 +502,7 @@ void processLife(int lifeNum, bool callFoundLife) if (currentProcessedActorIdx != -1) { - currentProcessedActorPtr = &objectTable[currentProcessedActorIdx]; + currentProcessedActorPtr = &ListObjets[currentProcessedActorIdx]; goto processOpcode; } @@ -1284,9 +1284,9 @@ void processLife(int lifeNum, bool callFoundLife) currentProcessedActorPtr->gamma = ListWorldObjets[object].gamma; } else { - currentProcessedActorPtr->alpha = objectTable[localObjectIndex].alpha; - currentProcessedActorPtr->beta = objectTable[localObjectIndex].beta; - currentProcessedActorPtr->gamma = objectTable[localObjectIndex].gamma; + currentProcessedActorPtr->alpha = ListObjets[localObjectIndex].alpha; + currentProcessedActorPtr->beta = ListObjets[localObjectIndex].beta; + currentProcessedActorPtr->gamma = ListObjets[localObjectIndex].gamma; } break; } @@ -1408,7 +1408,7 @@ void processLife(int lifeNum, bool callFoundLife) } case 1: // flow { - currentProcessedActorPtr = &objectTable[currentProcessedActorPtr->HIT_BY]; + currentProcessedActorPtr = &ListObjets[currentProcessedActorPtr->HIT_BY]; InitSpecialObjet(1, currentProcessedActorPtr->roomX + currentProcessedActorPtr->stepX + currentProcessedActorPtr->hotPoint.x, @@ -1458,17 +1458,17 @@ void processLife(int lifeNum, bool callFoundLife) if (g_gameId == AITD1) { - foundObject(lifeTempVar1, 1); + FoundObjet(lifeTempVar1, 1); } else { if (callFoundLife) { - foundObject(lifeTempVar1, 2); + FoundObjet(lifeTempVar1, 2); } else { - foundObject(lifeTempVar1, 1); + FoundObjet(lifeTempVar1, 1); } } @@ -1947,7 +1947,7 @@ void processLife(int lifeNum, bool callFoundLife) currentWorldTarget = lifeTempVar1; currentCameraTargetActor = lifeTempVar2; - lifeTempVar3 = objectTable[currentCameraTargetActor].room; + lifeTempVar3 = ListObjets[currentCameraTargetActor].room; if (lifeTempVar3 != currentRoom) { @@ -1959,19 +1959,19 @@ void processLife(int lifeNum, bool callFoundLife) { // security case, the target actor may be still be in list while already changed of stage // TODO: check if AITD1 could use the same code (quite probable as it's only security) - if (objectTable[lifeTempVar2].stage != g_currentFloor) + if (ListObjets[lifeTempVar2].stage != g_currentFloor) { currentWorldTarget = lifeTempVar1; FlagChangeEtage = 1; - NewNumEtage = objectTable[lifeTempVar2].stage; - NewNumSalle = objectTable[lifeTempVar2].room; + NewNumEtage = ListObjets[lifeTempVar2].stage; + NewNumSalle = ListObjets[lifeTempVar2].room; } else { currentWorldTarget = lifeTempVar1; currentCameraTargetActor = lifeTempVar2; - lifeTempVar3 = objectTable[currentCameraTargetActor].room; + lifeTempVar3 = ListObjets[currentCameraTargetActor].room; if (lifeTempVar3 != currentRoom) { diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 1132d4e..8ed2a2c 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -197,7 +197,7 @@ void executeFoundLife(int objIdx) if(actorIdx==-1) { - tObject* currentActorEntryPtr = &objectTable[NUM_MAX_OBJECT-1]; + tObject* currentActorEntryPtr = &ListObjets[NUM_MAX_OBJECT-1]; int currentActorEntry = NUM_MAX_OBJECT-1; while(currentActorEntry>=0) @@ -212,14 +212,14 @@ void executeFoundLife(int objIdx) if(currentActorEntry==-1) // no space, we will have to overwrite the last actor ! { currentActorEntry = NUM_MAX_OBJECT-1; - currentActorEntryPtr = &objectTable[NUM_MAX_OBJECT-1]; + currentActorEntryPtr = &ListObjets[NUM_MAX_OBJECT-1]; } actorIdx = currentActorEntry; var_2 = 1; - currentProcessedActorPtr = &objectTable[actorIdx]; - currentLifeActorPtr = &objectTable[actorIdx]; + currentProcessedActorPtr = &ListObjets[actorIdx]; + currentLifeActorPtr = &ListObjets[actorIdx]; currentProcessedActorIdx = actorIdx; currentLifeActorIdx = actorIdx; @@ -1184,7 +1184,7 @@ void LoadWorld(void) for(i=0;iindexInWorld == -2) // flow { @@ -1776,7 +1776,7 @@ void pointRotate(int x, int y, int z, int* destX, int* destY, int* destZ) } } -void copyZv(ZVStruct* source, ZVStruct* dest) +void CopyZV(ZVStruct* source, ZVStruct* dest) { memcpy(dest,source,sizeof(ZVStruct)); } @@ -1842,7 +1842,7 @@ void updateAllActorAndObjectsAITD2() { for (int i = 0; i < NUM_MAX_OBJECT; i++) { - tObject* pObject = &objectTable[i]; + tObject* pObject = &ListObjets[i]; if (pObject->indexInWorld == -1) { @@ -1957,7 +1957,7 @@ void updateAllActorAndObjectsAITD2() if (currentObject->objIndex != -1) { - currentProcessedActorPtr = &objectTable[currentObject->objIndex]; + currentProcessedActorPtr = &ListObjets[currentObject->objIndex]; currentProcessedActorIdx = currentObject->objIndex; if (currentWorldTarget == i) @@ -1997,7 +1997,7 @@ void GenereActiveList() for(int i=0;iindexInWorld == -1) continue; @@ -2095,7 +2095,7 @@ void GenereActiveList() if(currentObject->objIndex != -1) { - currentProcessedActorPtr = &objectTable[currentObject->objIndex]; + currentProcessedActorPtr = &ListObjets[currentObject->objIndex]; currentProcessedActorIdx = currentObject->objIndex; if(currentWorldTarget == i) @@ -2141,9 +2141,9 @@ void GenereAffList() { NbAffObjets = 0; - for(int i=0;i< objectTable.size();i++) + for(int i=0;i< ListObjets.size();i++) { - tObject* actorPtr = &objectTable[i]; + tObject* actorPtr = &ListObjets[i]; if(actorPtr->indexInWorld != -1 && actorPtr->bodyNum != -1) { if(checkActorInRoom(actorPtr->room)) @@ -2207,9 +2207,9 @@ void InitView() { if(currentCameraTargetActor != -1) { - x = objectTable[currentCameraTargetActor].worldX + objectTable[currentCameraTargetActor].stepX; + x = ListObjets[currentCameraTargetActor].worldX + ListObjets[currentCameraTargetActor].stepX; y = debufferVar_topCameraZoom; - z = objectTable[currentCameraTargetActor].worldZ + objectTable[currentCameraTargetActor].stepZ; + z = ListObjets[currentCameraTargetActor].worldZ + ListObjets[currentCameraTargetActor].stepZ; } } #endif @@ -2322,7 +2322,7 @@ s16 updateActorRotation(RealValue* rotatePtr) void removeFromBGIncrust(int actorIdx) { - tObject* actorPtr = &objectTable[actorIdx]; + tObject* actorPtr = &ListObjets[actorIdx]; actorPtr->objectType &= ~AF_BOXIFY; @@ -2380,7 +2380,7 @@ void deleteObject(int objIdx) if(actorIdx != -1) { - actorPtr = &objectTable[actorIdx]; + actorPtr = &ListObjets[actorIdx]; actorPtr->room = -1; actorPtr->stage = -1; @@ -2471,16 +2471,16 @@ void drawZv(tObject* actorPtr) { ZVStruct localZv; - if( actorPtr->room != objectTable[currentCameraTargetActor].room ) + if( actorPtr->room != ListObjets[currentCameraTargetActor].room ) { - if (objectTable[currentCameraTargetActor].room == -1) { + if (ListObjets[currentCameraTargetActor].room == -1) { return; } - getZvRelativePosition(&localZv, actorPtr->room, objectTable[currentCameraTargetActor].room); + AdjustZV(&localZv, actorPtr->room, ListObjets[currentCameraTargetActor].room); } else { - copyZv(&actorPtr->zv,&localZv); + CopyZV(&actorPtr->zv,&localZv); } drawZv(localZv); @@ -2644,7 +2644,7 @@ void drawRoomZv(ZVStruct* zoneData, int color, int transparency) cameraZv.ZVZ1 += translateZ; cameraZv.ZVZ2 += translateZ; - if(checkZvCollision(&cameraZv,zoneData)) + if(CubeIntersect(&cameraZv,zoneData)) { return; } @@ -2665,7 +2665,7 @@ void drawRoomZvLine(ZVStruct* zoneData, int color) cameraZv.ZVZ1 += translateZ; cameraZv.ZVZ2 += translateZ; - if(checkZvCollision(&cameraZv,zoneData)) + if(CubeIntersect(&cameraZv,zoneData)) { return; } @@ -2728,7 +2728,7 @@ void drawZone(char* zoneData,int color) tempZv.ZVZ1 = READ_LE_S16(zoneData+0x08); tempZv.ZVZ2 = READ_LE_S16(zoneData+0x0A); - if(checkZvCollision(&cameraZv,&tempZv)) + if(CubeIntersect(&cameraZv,&tempZv)) { return; } @@ -2768,7 +2768,7 @@ void drawSceZone(int roomNumber) memcpy(&dataLocal,&roomDataTable[roomNumber].sceZoneTable[i].zv,sizeof(ZVStruct)); if(roomNumber!=currentRoom) { - getZvRelativePosition(&dataLocal,roomNumber,currentRoom); + AdjustZV(&dataLocal,roomNumber,currentRoom); } // if(roomDataTable[roomNumber].sceZoneTable[i].parameter == 4) @@ -2788,11 +2788,11 @@ void drawHardCol(int roomNumber) /*if(roomDataTable[roomNumber].hardColTable[i].type != 9) continue;*/ - copyZv(&roomDataTable[roomNumber].hardColTable[i].zv,&dataLocal); + CopyZV(&roomDataTable[roomNumber].hardColTable[i].zv,&dataLocal); if(roomNumber!=currentRoom) { - getZvRelativePosition(&dataLocal,roomNumber,currentRoom); + AdjustZV(&dataLocal,roomNumber,currentRoom); } switch(roomDataTable[roomNumber].hardColTable[i].type) @@ -3032,7 +3032,7 @@ void AllRedraw(int flagFlip) osystem_CopyBlockPhys((unsigned char*)logicalScreen, 0, 0, 320, 200); } else { - tObject* actorPtr = &objectTable[currentDrawActor]; + tObject* actorPtr = &ListObjets[currentDrawActor]; // this is commented out to draw actors backed into the background //if(actorPtr->_flags & (AF_ANIMATED + AF_DRAWABLE + AF_SPECIAL)) @@ -3188,13 +3188,13 @@ void walkStep(int angle1, int angle2, int angle3) void addActorToBgInscrust(int actorIdx) { - objectTable[actorIdx].objectType |= AF_BOXIFY + AF_DRAWABLE; - objectTable[actorIdx].objectType &= ~AF_ANIMATED; + ListObjets[actorIdx].objectType |= AF_BOXIFY + AF_DRAWABLE; + ListObjets[actorIdx].objectType &= ~AF_ANIMATED; //FlagRefreshAux2 = 1; } -int checkZvCollision(ZVStruct* zvPtr1,ZVStruct* zvPtr2) +int CubeIntersect(ZVStruct* zvPtr1,ZVStruct* zvPtr2) { if(zvPtr1->ZVX1 >= zvPtr2->ZVX2) return 0; @@ -3217,7 +3217,7 @@ int checkZvCollision(ZVStruct* zvPtr1,ZVStruct* zvPtr2) return 1; } -void getZvRelativePosition(ZVStruct* zvPtr, int startRoom, int destRoom) +void AdjustZV(ZVStruct* zvPtr, int startRoom, int destRoom) { unsigned int Xdif = 10*(roomDataTable[destRoom].worldX - roomDataTable[startRoom].worldX); unsigned int Ydif = 10*(roomDataTable[destRoom].worldY - roomDataTable[startRoom].worldY); @@ -3231,11 +3231,11 @@ void getZvRelativePosition(ZVStruct* zvPtr, int startRoom, int destRoom) zvPtr->ZVZ2 += Zdif; } -int checkObjectCollisions(int actorIdx, ZVStruct* zvPtr) +int CheckObjectCol(int actorIdx, ZVStruct* zvPtr) { int currentCollisionSlot = 0; - tObject* currentActor = objectTable.data(); - int actorRoom = objectTable[actorIdx].room; + + int actorRoom = ListObjets[actorIdx].room; for(int i=0;i<3;i++) { @@ -3244,38 +3244,41 @@ int checkObjectCollisions(int actorIdx, ZVStruct* zvPtr) for(int i=0;iindexInWorld != -1 && i!=actorIdx) - { - ZVStruct* currentActorZv = ¤tActor->zv; + tObject* currentActor = &ListObjets.at(i); - if(currentActor->room != actorRoom) - { - ZVStruct localZv; + if (currentActor->indexInWorld == -1) + continue; + if (i == actorIdx) + continue; - copyZv(zvPtr,&localZv); + ZVStruct* currentActorZv = ¤tActor->zv; - getZvRelativePosition(&localZv,actorRoom,currentActor->room); + if (currentActor->room != actorRoom) + { + ZVStruct localZv; - if(checkZvCollision(&localZv,currentActorZv)) - { - currentProcessedActorPtr->COL[currentCollisionSlot++] = i; + CopyZV(zvPtr, &localZv); - if(currentCollisionSlot == 3) - return(3); - } - } - else - { - if(checkZvCollision(zvPtr,currentActorZv)) - { - currentProcessedActorPtr->COL[currentCollisionSlot++] = i; + AdjustZV(&localZv, actorRoom, currentActor->room); - if(currentCollisionSlot == 3) - return(3); - } - } - } - currentActor++; + if (CubeIntersect(&localZv, currentActorZv)) + { + currentProcessedActorPtr->COL[currentCollisionSlot++] = i; + + if (currentCollisionSlot == 3) + return(3); + } + } + else + { + if (CubeIntersect(zvPtr, currentActorZv)) + { + currentProcessedActorPtr->COL[currentCollisionSlot++] = i; + + if (currentCollisionSlot == 3) + return(3); + } + } } return(currentCollisionSlot); @@ -3319,7 +3322,7 @@ void take(int objIdx) objPtr->stage = -1; } -void hardColSuB1Sub1(int flag) +void Glisser(int flag) { switch(flag) { @@ -3342,48 +3345,54 @@ void hardColSuB1Sub1(int flag) } } -void handleCollision(ZVStruct* startZv, ZVStruct* zvPtr2, ZVStruct* zvPtr3) +void GereCollision(ZVStruct* oldZv, ZVStruct* animatedZv, ZVStruct* fixZv) { - s32 flag = 0; - s32 var_8; + s32 oldpos = 0; + s32 oldtype; s32 halfX; s32 halfZ; - s32 var_A; - s32 var_6; + s32 pos; + s32 type; - if(startZv->ZVX2 > zvPtr3->ZVX1) + if(oldZv->ZVX2 > fixZv->ZVX1) { - if(zvPtr3->ZVX2 <= startZv->ZVX1) + if(fixZv->ZVX2 <= oldZv->ZVX1) { - flag = 8; + oldpos = 8; // right } + else { + oldpos = 0; // center + } } else { - flag = 4; + oldpos = 4; // left } - if(startZv->ZVZ2 > zvPtr3->ZVZ1) + if(oldZv->ZVZ2 > fixZv->ZVZ1) { - if(startZv->ZVZ1 >= zvPtr3->ZVZ2) + if(oldZv->ZVZ1 >= fixZv->ZVZ2) { - flag |= 2; + oldpos |= 2; } + else { + oldpos |= 0; // center + } } else { - flag |= 1; + oldpos |= 1; } - if( flag == 5 || flag == 9 || flag == 6 || flag == 10 ) + if( (oldpos == 5) || (oldpos == 9) || (oldpos == 6) || (oldpos == 10) ) { - var_8 = 2; + oldtype = 2; // corner } else { - if(!flag) + if(oldpos == 0) { - var_8 = 0; + oldtype = 0; hardColStepZ = 0; hardColStepX = 0; @@ -3392,99 +3401,100 @@ void handleCollision(ZVStruct* startZv, ZVStruct* zvPtr2, ZVStruct* zvPtr3) } else { - var_8 = 1; + oldtype = 1; // corner } } - halfX = (zvPtr2->ZVX1 + zvPtr2->ZVX2) / 2; - halfZ = (zvPtr2->ZVZ1 + zvPtr2->ZVZ2) / 2; + halfX = (animatedZv->ZVX1 + animatedZv->ZVX2) / 2; + halfZ = (animatedZv->ZVZ1 + animatedZv->ZVZ2) / 2; - if(zvPtr3->ZVX1 > halfX) + if(fixZv->ZVX1 > halfX) { - var_A = 4; + pos = 4; // left } else { - if(zvPtr3->ZVX2 < halfX) + if(fixZv->ZVX2 < halfX) { - var_A = 0; + pos = 0; // center } else { - var_A = 8; + pos = 8; // right } } - if(zvPtr3->ZVZ1 > halfZ) + if(fixZv->ZVZ1 > halfZ) { - var_A |= 1; + pos |= 1; // up } else { - if(zvPtr3->ZVZ2 < halfZ) + if(fixZv->ZVZ2 < halfZ) { - var_A |= 0; // once again, not that much usefull + pos |= 0; // center } else { - var_A |= 2; + pos |= 2; // bellow } } - if( var_A == 5 || var_A == 9 || var_A == 6 || var_A == 10 ) + if( (pos == 5) || (pos == 9) || (pos == 6) || (pos == 10) ) { - var_6 = 2; + type = 2; // corner } else { - if(!var_A) + if(pos == 0) { - var_6 = 0; + type = 0; // center } else { - var_6 = 1; + type = 1; // border } } - if(var_8 == 1) + if(oldtype == 1) // border { - hardColSuB1Sub1(flag); - return; - } - - if(var_6 == 1 && (var_A & flag)) - { - hardColSuB1Sub1(var_A); - return; + Glisser(oldpos); } + else + { + if ((type == 1) && (pos & oldpos)) + { + Glisser(pos); + } + else { + if ((pos == oldpos) || (pos+oldpos == 15)) + { + int Xmod = abs(animatedZv->ZVX1 - oldZv->ZVX1); // recheck + int Zmod = abs(animatedZv->ZVZ1 - oldZv->ZVZ1); - if(var_A == flag || flag == 15) - { - int Xmod = abs(zvPtr2->ZVX1 - startZv->ZVX1); // recheck - int Zmod = abs(zvPtr2->ZVZ1 - startZv->ZVZ1); - - if(Xmod > Zmod) - { - hardColStepZ = 0; - } - else - { - hardColStepX = 0; - } - } - else - { - if(!var_6 || (var_6 == 1 && !(var_A & flag))) - { - hardColStepZ = 0; - hardColStepX = 0; - } - else - { - hardColSuB1Sub1(flag&var_A); - } - } + if (Xmod > Zmod) + { + hardColStepZ = 0; + } + else + { + hardColStepX = 0; + } + } + else + { + if ((type == 0) || ((type == 1) && ((pos & oldpos) == 0))) + { + hardColStepZ = 0; + hardColStepX = 0; + } + else + { + Glisser(oldpos & pos); + } + } + } + } } int AsmCheckListCol(ZVStruct* zvPtr, roomDataStruct* pRoomData) @@ -3605,7 +3615,7 @@ int findBestCamera(void) int foundAngle = 32000; int foundCamera = -1; - tObject* actorPtr = &objectTable[currentCameraTargetActor]; + tObject* actorPtr = &ListObjets[currentCameraTargetActor]; int x1 = actorPtr->zv.ZVX1/10; int x2 = actorPtr->zv.ZVX2/10; @@ -3658,7 +3668,7 @@ void GereSwitchCamera(void) int zvz1; int zvz2; - actorPtr = &objectTable[currentCameraTargetActor]; + actorPtr = &ListObjets[currentCameraTargetActor]; zvx1 = actorPtr->zv.ZVX1/10; zvx2 = actorPtr->zv.ZVX2/10; @@ -3890,9 +3900,9 @@ int checkLineProjectionWithActors( int actorIdx, int X, int Y, int Z, int beta, } else { - for(int i=0;iindexInWorld != -1 && i != actorIdx && !(currentActorPtr->objectType & AF_SPECIAL)) { ZVStruct* zvPtr = ¤tActorPtr->zv; @@ -3901,10 +3911,10 @@ int checkLineProjectionWithActors( int actorIdx, int X, int Y, int Z, int beta, { ZVStruct localZv2; - copyZv(&localZv, &localZv2); - getZvRelativePosition(&localZv2, room, currentActorPtr->room); + CopyZV(&localZv, &localZv2); + AdjustZV(&localZv2, room, currentActorPtr->room); - if(!checkZvCollision(&localZv2,zvPtr)) + if(!CubeIntersect(&localZv2,zvPtr)) { currentActorPtr++; continue; @@ -3912,7 +3922,7 @@ int checkLineProjectionWithActors( int actorIdx, int X, int Y, int Z, int beta, } else { - if(!checkZvCollision(&localZv,zvPtr)) + if(!CubeIntersect(&localZv,zvPtr)) { currentActorPtr++; continue; @@ -3940,7 +3950,7 @@ void PutAtObjet(int objIdx, int objIdxToPutAt) if(objPtrToPutAt->objIndex != -1) { - tObject* actorToPutAtPtr = &objectTable[objPtrToPutAt->objIndex]; + tObject* actorToPutAtPtr = &ListObjets[objPtrToPutAt->objIndex]; DeleteInventoryObjet(objIdx); @@ -4046,7 +4056,7 @@ void throwStoppedAt(int x, int z) while(!foundPosition) { walkStep(0,-step,currentProcessedActorPtr->beta+0x200); - copyZv(&zvLocal,&zvCopy); + CopyZV(&zvLocal,&zvCopy); x2 = x + animMoveX; z2 = z + animMoveZ; diff --git a/FitdLib/main.h b/FitdLib/main.h index 19712b8..ac1165c 100644 --- a/FitdLib/main.h +++ b/FitdLib/main.h @@ -14,7 +14,7 @@ void GereSwitchCamera(void); void GenereActiveList(); void GenereAffList(); void AllRedraw(int mode); -int checkObjectCollisions(int actorIdx, ZVStruct* zvPtr); +int CheckObjectCol(int actorIdx, ZVStruct* zvPtr); int checkLineProjectionWithActors( int actorIdx, int X, int Y, int Z, int beta, int room, int param ); int AsmCheckListCol(ZVStruct* zvPtr, roomDataStruct* pRoomData); void DeleteInventoryObjet(int objIdx); @@ -38,12 +38,12 @@ void OpenProgram(void); void freeAll(void); void startGame(int startupEtage, int startupRoom, int allowSystemMenu); void AffRect(int x1, int y1, int x2, int y2, char color); // fast recode. No RE -void copyZv(ZVStruct* source, ZVStruct* dest); -void getZvRelativePosition(ZVStruct* zvPtr, int startRoom, int destRoom); +void CopyZV(ZVStruct* source, ZVStruct* dest); +void AdjustZV(ZVStruct* zvPtr, int startRoom, int destRoom); void take(int objIdx); -void foundObject(int objIdx, int param); +void FoundObjet(int objIdx, int param); void hit(int animNumber,int arg_2,int arg_4,int arg_6,int hitForce,int arg_A); -int checkZvCollision(ZVStruct* zvPtr1,ZVStruct* zvPtr2); +int CubeIntersect(ZVStruct* zvPtr1,ZVStruct* zvPtr2); void PutAtObjet(int objIdx, int objIdxToPutAt); void SetClip(int left, int top, int right, int bottom); @@ -64,7 +64,7 @@ void deleteObject(int objIdx); void removeFromBGIncrust(int actorIdx); void makeMessage(int messageIdx); int drawTextOverlay(void); -void handleCollision(ZVStruct* startZv, ZVStruct* zvPtr2, ZVStruct* zvPtr3); +void GereCollision(ZVStruct* startZv, ZVStruct* zvPtr2, ZVStruct* zvPtr3); void addActorToBgInscrust(int actorIdx); diff --git a/FitdLib/mainLoop.cpp b/FitdLib/mainLoop.cpp index c58140f..2a29648 100644 --- a/FitdLib/mainLoop.cpp +++ b/FitdLib/mainLoop.cpp @@ -113,7 +113,7 @@ void PlayWorld(int allowSystemMenu, int deltaTime) for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) { - currentProcessedActorPtr = &objectTable[currentProcessedActorIdx]; + currentProcessedActorPtr = &ListObjets[currentProcessedActorIdx]; if(currentProcessedActorPtr->indexInWorld >= 0) { currentProcessedActorPtr->COL_BY = -1; @@ -126,7 +126,7 @@ void PlayWorld(int allowSystemMenu, int deltaTime) for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) { - currentProcessedActorPtr = &objectTable[currentProcessedActorIdx]; + currentProcessedActorPtr = &ListObjets[currentProcessedActorIdx]; if(currentProcessedActorPtr->indexInWorld >= 0) { int flag = currentProcessedActorPtr->objectType; @@ -150,7 +150,7 @@ void PlayWorld(int allowSystemMenu, int deltaTime) for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) { - currentProcessedActorPtr = &objectTable[currentProcessedActorIdx]; + currentProcessedActorPtr = &ListObjets[currentProcessedActorIdx]; if(currentProcessedActorPtr->indexInWorld >= 0) { if(currentProcessedActorPtr->life != -1) @@ -209,7 +209,7 @@ void PlayWorld(int allowSystemMenu, int deltaTime) for (currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) { - currentProcessedActorPtr = &objectTable[currentProcessedActorIdx]; + currentProcessedActorPtr = &ListObjets[currentProcessedActorIdx]; if (currentProcessedActorPtr->indexInWorld >= 0) { if (currentProcessedActorPtr->life != -1) diff --git a/FitdLib/object.cpp b/FitdLib/object.cpp index 2978bd2..c37a582 100644 --- a/FitdLib/object.cpp +++ b/FitdLib/object.cpp @@ -4,7 +4,7 @@ int InitObjet(int body, int typeZv, int hardZvIdx, s16 objectType, int x, int y, { int i; int j; - tObject* actorPtr = objectTable.data(); + tObject* actorPtr = ListObjets.data(); ZVStruct* zvPtr; for(i=0;iroom; int targetX = followedActorPtr->roomX; diff --git a/FitdLib/vars.cpp b/FitdLib/vars.cpp index caf4ed9..a7dfc41 100644 --- a/FitdLib/vars.cpp +++ b/FitdLib/vars.cpp @@ -71,7 +71,7 @@ char* screenSm3; char* screenSm4; char* screenSm5; -std::array objectTable; +std::array ListObjets; s16 currentWorldTarget; diff --git a/FitdLib/vars.h b/FitdLib/vars.h index b487e7d..d998728 100644 --- a/FitdLib/vars.h +++ b/FitdLib/vars.h @@ -306,7 +306,7 @@ extern char* screenSm3; extern char* screenSm4; extern char* screenSm5; -extern std::array objectTable; +extern std::array ListObjets; extern s16 currentWorldTarget; From 543e22bc78b64405537ae545ecd382dcdf2c12b2 Mon Sep 17 00:00:00 2001 From: yaz0r <363511+yaz0r@users.noreply.github.com> Date: Fri, 1 Aug 2025 23:08:30 -0700 Subject: [PATCH 70/70] Display collision volumes for actors that don't have a body --- FitdLib/main.cpp | 26 ++++----- FitdLib/renderer.cpp | 126 +++++++++++++++++++++---------------------- 2 files changed, 77 insertions(+), 75 deletions(-) diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 8ed2a2c..494bfb4 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -3071,18 +3071,6 @@ void AllRedraw(int flagFlip) getHotPoint(actorPtr->hotPointID, bodyPtr, &actorPtr->hotPoint); } } - - ///////////////////////////////////// DEBUG -#ifdef FITD_DEBUGGER - // if(debuggerVar_drawModelZv) - { - if (backgroundMode == backgroundModeEnum_3D) - { - drawZv(actorPtr); - } - } -#endif - ///////////////////////////////////// } } @@ -3128,6 +3116,20 @@ void AllRedraw(int flagFlip) #ifdef FITD_DEBUGGER { + if (backgroundMode == backgroundModeEnum_3D) + { + for (int i = 0; i < NUM_MAX_OBJECT; i++) + { + tObject* actorPtr = &ListObjets[i]; + + if (actorPtr->indexInWorld != -1) + { + drawZv(actorPtr); + } + } + } + + ///////////////////////////////////// for (int i = 0; i < getNumberOfRoom(); i++) { if (hardColDisplayMode != displayNone) { diff --git a/FitdLib/renderer.cpp b/FitdLib/renderer.cpp index be12642..d6632d6 100644 --- a/FitdLib/renderer.cpp +++ b/FitdLib/renderer.cpp @@ -95,9 +95,9 @@ int boneRotateZSin; char primBuffer[30000]; int renderVar3; - + #ifndef AITD_UE4 -void fillpoly(s16 * datas, int n, char c); +void fillpoly(s16 * datas, int n, char c); #endif /* @@ -246,7 +246,7 @@ void RotateList(point3dStruct* pointPtr, int numOfPoint) point.z = z; } } - + void RotateGroupeOptimise(sGroup* ptr) { if (ptr->m_numGroup) // if group number is 0 @@ -257,7 +257,7 @@ void RotateGroupeOptimise(sGroup* ptr) RotateList(pointBuffer.data() + baseBone, numPoints); } } - + void RotateGroupe(sGroup* ptr) { int baseBone = ptr->m_start; @@ -280,8 +280,8 @@ void RotateGroupe(sGroup* ptr) ptr++; } while (--temp2); -} - +} + void TranslateGroupe(int transX, int transY, int transZ, sGroup* ptr) { for (int i = 0; i < ptr->m_numVertices; i++) @@ -292,7 +292,7 @@ void TranslateGroupe(int transX, int transY, int transZ, sGroup* ptr) point.z += transZ; } } - + void ZoomGroupe(int zoomX, int zoomY, int zoomZ, sGroup* ptr) { for (int i = 0; i < ptr->m_numVertices; i++) @@ -305,24 +305,24 @@ void ZoomGroupe(int zoomX, int zoomY, int zoomZ, sGroup* ptr) } int AnimNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) -{ +{ renderX = x - translateX; renderY = y; renderZ = z - translateZ; ASSERT(pBody->m_vertices.size()m_vertices.size(); i++) - { - pointBuffer[i] = pBody->m_vertices[i]; - } - - numOfPoints = pBody->m_vertices.size(); + + for (int i = 0; i < pBody->m_vertices.size(); i++) + { + pointBuffer[i] = pBody->m_vertices[i]; + } + + numOfPoints = pBody->m_vertices.size(); numOfBones = pBody->m_groupOrder.size(); ASSERT(numOfBonesm_flags & INFO_OPTIMISE) - { + { for(int i=0;im_groupOrder.size();i++) { int boneDataOffset = pBody->m_groupOrder[i]; @@ -334,7 +334,7 @@ int AnimNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) if(pGroup->m_state.m_delta.x || pGroup->m_state.m_delta.y || pGroup->m_state.m_delta.z) { TranslateGroupe(pGroup->m_state.m_delta.x, pGroup->m_state.m_delta.y, pGroup->m_state.m_delta.z, pGroup); - } + } break; case 2: if (pGroup->m_state.m_delta.x || pGroup->m_state.m_delta.y || pGroup->m_state.m_delta.z) @@ -389,8 +389,8 @@ int AnimNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) } for(int i=0;im_groups.size();i++) - { - sGroup* pGroup = &pBody->m_groups[i]; + { + sGroup* pGroup = &pBody->m_groups[i]; for(int j=0;j< pGroup->m_numVertices;j++) { pointBuffer[pGroup->m_start + j].x += pointBuffer[pGroup->m_baseVertices].x; @@ -415,13 +415,13 @@ int AnimNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) X += renderX; - Y += renderY; + Y += renderY; Z += renderZ; - -#if defined(AITD_UE4) + +#if defined(AITD_UE4) *(outPtr++) = (s16)X; *(outPtr++) = (s16)Y; - *(outPtr++) = (s16)Z; + *(outPtr++) = (s16)Z; #else if(Y>10000) // height clamp { @@ -438,7 +438,7 @@ int AnimNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) *(outPtr++) = (s16)X; *(outPtr++) = (s16)Y; *(outPtr++) = (s16)Z; - } + } #endif } @@ -456,11 +456,11 @@ int AnimNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) Y = ptr[1]; Z = ptr[2]; ptr+=3; - -#if defined(AITD_UE4) + +#if defined(AITD_UE4) *(outPtr2++) = X; *(outPtr2++) = Y; - *(outPtr2++) = Z; + *(outPtr2++) = Z; #else Z += cameraPerspective; @@ -495,7 +495,7 @@ int AnimNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) *(outPtr2++) = Z; } -#endif +#endif k--; if(k==0) @@ -517,7 +517,7 @@ z - cameraZ */ int RotateNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) -{ +{ float* outPtr; renderX = x - translateX; @@ -543,7 +543,7 @@ int RotateNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) } outPtr = renderPointList; - + for(int i=0; im_vertices.size(); i++) { float X = pBody->m_vertices[i].x; @@ -582,12 +582,12 @@ int RotateNuage(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) X += renderX; Y += renderY; - Z += renderZ; - -#if defined(AITD_UE4) + Z += renderZ; + +#if defined(AITD_UE4) *(outPtr++) = X; *(outPtr++) = Y; - *(outPtr++) = Z; + *(outPtr++) = Z; #else if(Y>10000) // height clamp { @@ -647,8 +647,8 @@ void primFunctionDefault(int primType,char** ptr,char** out) assert(0); } -void processPrim_Line(int primType, sPrimitive* ptr, char** out) -{ +void processPrim_Line(int primType, sPrimitive* ptr, char** out) +{ primEntryStruct* pCurrentPrimEntry = &primTable[positionInPrimEntry]; ASSERT(positionInPrimEntry < NUM_MAX_PRIM_ENTRY); @@ -676,19 +676,19 @@ void processPrim_Line(int primType, sPrimitive* ptr, char** out) depth = pCurrentPrimEntry->vertices[i].Z; } - + #if !defined(AITD_UE4) - if (depth > 100) + if (depth > 100) #endif { positionInPrimEntry++; numOfPrimitiveToRender++; ASSERT(positionInPrimEntry < NUM_MAX_PRIM_ENTRY); - } -} - -void processPrim_Poly(int primType, sPrimitive* ptr, char** out) + } +} + +void processPrim_Poly(int primType, sPrimitive* ptr, char** out) { primEntryStruct* pCurrentPrimEntry = &primTable[positionInPrimEntry]; @@ -717,19 +717,19 @@ void processPrim_Poly(int primType, sPrimitive* ptr, char** out) depth = pCurrentPrimEntry->vertices[i].Z; } - + #if !defined(AITD_UE4) - if (depth > 100) + if (depth > 100) #endif { positionInPrimEntry++; numOfPrimitiveToRender++; ASSERT(positionInPrimEntry < NUM_MAX_PRIM_ENTRY); - } -} - -void processPrim_Point(primTypeEnum primType, sPrimitive* ptr, char** out) + } +} + +void processPrim_Point(primTypeEnum primType, sPrimitive* ptr, char** out) { primEntryStruct* pCurrentPrimEntry = &primTable[positionInPrimEntry]; @@ -751,20 +751,20 @@ void processPrim_Point(primTypeEnum primType, sPrimitive* ptr, char** out) depth = pCurrentPrimEntry->vertices[0].Z; } - + #if !defined(AITD_UE4) - if (depth > 100) + if (depth > 100) #endif { positionInPrimEntry++; numOfPrimitiveToRender++; ASSERT(positionInPrimEntry < NUM_MAX_PRIM_ENTRY); - } -} - -void processPrim_Sphere(int primType, sPrimitive* ptr, char** out) -{ + } +} + +void processPrim_Sphere(int primType, sPrimitive* ptr, char** out) +{ primEntryStruct* pCurrentPrimEntry = &primTable[positionInPrimEntry]; ASSERT(positionInPrimEntry < NUM_MAX_PRIM_ENTRY); @@ -786,16 +786,16 @@ void processPrim_Sphere(int primType, sPrimitive* ptr, char** out) depth = pCurrentPrimEntry->vertices[0].Z; } - + #if !defined(AITD_UE4) - if (depth > 100) + if (depth > 100) #endif { positionInPrimEntry++; numOfPrimitiveToRender++; ASSERT(positionInPrimEntry < NUM_MAX_PRIM_ENTRY); - } + } } void primType5(int primType, char** ptr, char** out) // draw out of hardClip @@ -934,7 +934,7 @@ int AffObjet(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) modelFlags = pBody->m_flags; if(modelFlags&INFO_ANIM) - { + { if(!AnimNuage(x,y,z,alpha,beta,gamma, pBody)) { BBox3D3 = -32000; @@ -982,7 +982,7 @@ int AffObjet(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) // create the list of all primitives to render for(i=0;im_primitives[i]; primTypeEnum primType = pPrimitive->m_type; @@ -1088,7 +1088,7 @@ int AffObjet(int x,int y,int z,int alpha,int beta,int gamma, sBody* pBody) } void computeScreenBox(int x, int y, int z, int alpha, int beta, int gamma, sBody* bodyPtr) -{ +{ BBox3D1 = 0x7FFF; BBox3D2 = 0x7FFF; @@ -1102,9 +1102,9 @@ void computeScreenBox(int x, int y, int z, int alpha, int beta, int gamma, sBody renderVar2 = renderBuffer; modelFlags = bodyPtr->m_flags; - + if(modelFlags&INFO_ANIM) - { + { AnimNuage(x,y,z,alpha,beta,gamma, bodyPtr); } }