diff --git a/decompile/General/AltMods/Mods4.c b/decompile/General/AltMods/Mods4.c index e4a7bc6f1..f01e09293 100644 --- a/decompile/General/AltMods/Mods4.c +++ b/decompile/General/AltMods/Mods4.c @@ -1,108 +1,5 @@ #ifdef USE_ONLINE #include "OnlineCTR/names3d.c" - -void UpdateCheckpointTracker(int driverID); -typedef void (*VehicleFuncPtr)(struct Thread* thread, struct Driver* driver); - -void RunVehicleThread(VehicleFuncPtr func, struct Thread* thread, struct Driver* driver) -{ - UpdateCheckpointTracker(driver->driverID); - if (func == nullptr) { return; } - - bool restore = false; - if ((sdata->gGT->gameMode1 & END_OF_RACE) && (checkpointTracker[driver->driverID].raceFinished == 0)) - { - sdata->gGT->gameMode1 &= ~(END_OF_RACE); - restore = true; - } - func(thread, driver); - if (restore) { sdata->gGT->gameMode1 |= END_OF_RACE; } -} - -void RunVehicleSet13(struct Thread* dThread, struct Driver* dOnline) -{ - if(dThread->funcThTick != 0) - return; - - // This only works because we have NO collision - // and therefore NO bounce physics, update P1 - // first, then update other drivers later - - // We can still "eventually" have mask-weapon - // collision, but no "bounce" physics with this logic - - for(int iVar11 = 0; iVar11 < 13; iVar11++) - { - VehicleFuncPtr pcVar5 = dOnline->funcPtrs[iVar11]; - - if(pcVar5 == NULL) - continue; - - RunVehicleThread(pcVar5, dThread, dOnline); - - #ifdef USE_60FPS - #ifndef REBUILD_PS1 - // if this function just ran - if(pcVar5 == VehFrameProc_Driving) - { - // only if jumping animation, - // otherwise wheelie gets bugged - if(dOnline->instSelf->animIndex == 3) - { - dOnline->matrixIndex = - dOnline->matrixIndex >> 1; - } - } - #endif - #endif - } -} +#include "OnlineCTR/vehThread.c" +#include "OnlineCTR/hsvColor.c" #endif - -#ifdef USE_ONLINE -Color HsvToRgb(int h, int s, int v) -{ - Color rgb; - h = h & 0xFF; // modulo 256 - int region, remainder, p, q, t; - - if (s == 0) - { - rgb.r = v; - rgb.g = v; - rgb.b = v; - return rgb; - } - - region = h / 43; - remainder = (h - (region * 43)) * 6; - - p = (v * (255 - s)) >> 8; - q = (v * (255 - ((s * remainder) >> 8))) >> 8; - t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8; - - switch (region) - { - case 0: - rgb.r = v; rgb.g = t; rgb.b = p; - break; - case 1: - rgb.r = q; rgb.g = v; rgb.b = p; - break; - case 2: - rgb.r = p; rgb.g = v; rgb.b = t; - break; - case 3: - rgb.r = p; rgb.g = q; rgb.b = v; - break; - case 4: - rgb.r = t; rgb.g = p; rgb.b = v; - break; - default: - rgb.r = v; rgb.g = p; rgb.b = q; - break; - } - - return rgb; -} -#endif \ No newline at end of file diff --git a/decompile/General/AltMods/OnlineCTR/hsvColor.c b/decompile/General/AltMods/OnlineCTR/hsvColor.c new file mode 100644 index 000000000..60c440237 --- /dev/null +++ b/decompile/General/AltMods/OnlineCTR/hsvColor.c @@ -0,0 +1,46 @@ + +Color HsvToRgb(int h, int s, int v) +{ + Color rgb; + h = h & 0xFF; // modulo 256 + int region, remainder, p, q, t; + + if (s == 0) + { + rgb.r = v; + rgb.g = v; + rgb.b = v; + return rgb; + } + + region = h / 43; + remainder = (h - (region * 43)) * 6; + + p = (v * (255 - s)) >> 8; + q = (v * (255 - ((s * remainder) >> 8))) >> 8; + t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8; + + switch (region) + { + case 0: + rgb.r = v; rgb.g = t; rgb.b = p; + break; + case 1: + rgb.r = q; rgb.g = v; rgb.b = p; + break; + case 2: + rgb.r = p; rgb.g = v; rgb.b = t; + break; + case 3: + rgb.r = p; rgb.g = q; rgb.b = v; + break; + case 4: + rgb.r = t; rgb.g = p; rgb.b = v; + break; + default: + rgb.r = v; rgb.g = p; rgb.b = q; + break; + } + + return rgb; +} diff --git a/decompile/General/AltMods/OnlineCTR/vehThread.c b/decompile/General/AltMods/OnlineCTR/vehThread.c new file mode 100644 index 000000000..49eb076ce --- /dev/null +++ b/decompile/General/AltMods/OnlineCTR/vehThread.c @@ -0,0 +1,62 @@ + +void UpdateCheckpointTracker(int driverID); +typedef void (*VehicleFuncPtr)(struct Thread* thread, struct Driver* driver); + +void RunVehicleThread(VehicleFuncPtr func, struct Thread* thread, struct Driver* driver) +{ + UpdateCheckpointTracker(driver->driverID); + if (func == nullptr) { return; } + + bool restore = false; + if ((sdata->gGT->gameMode1 & END_OF_RACE) && (checkpointTracker[driver->driverID].raceFinished == 0)) + { + sdata->gGT->gameMode1 &= ~(END_OF_RACE); + restore = true; + } + func(thread, driver); + if (restore) { sdata->gGT->gameMode1 |= END_OF_RACE; } +} + + +// TODO: This isnt called anymore, +// need to decide if still needed +#if 0 +void RunVehicleSet13(struct Thread* dThread, struct Driver* dOnline) +{ + if(dThread->funcThTick != 0) + return; + + // This only works because we have NO collision + // and therefore NO bounce physics, update P1 + // first, then update other drivers later + + // We can still "eventually" have mask-weapon + // collision, but no "bounce" physics with this logic + + for(int iVar11 = 0; iVar11 < 13; iVar11++) + { + VehicleFuncPtr pcVar5 = dOnline->funcPtrs[iVar11]; + + if(pcVar5 == NULL) + continue; + + RunVehicleThread(pcVar5, dThread, dOnline); + + #ifdef USE_60FPS + #ifndef REBUILD_PS1 + // if this function just ran + if(pcVar5 == VehFrameProc_Driving) + { + // only if jumping animation, + // otherwise wheelie gets bugged + if(dOnline->instSelf->animIndex == 3) + { + dOnline->matrixIndex = + dOnline->matrixIndex >> 1; + } + } + #endif + #endif + } +} +#endif \ No newline at end of file