diff options
author | aap <aap@papnet.eu> | 2019-06-20 01:07:57 +0200 |
---|---|---|
committer | aap <aap@papnet.eu> | 2019-06-20 01:07:57 +0200 |
commit | f4146d39a266b83cef8e81bc62bcc77032c3b13c (patch) | |
tree | 50526c6443c448dbf0a2effa24b4dd040a3ac5e1 /src/control/HandlingDataMgr.cpp | |
parent | f1b255e69f11794969d184917167cb63cadf6132 (diff) | |
parent | 12f009e708b5969cd42ccf5bfb60be37b70f31d8 (diff) |
finally finished CVehicleModelInfo
Diffstat (limited to 'src/control/HandlingDataMgr.cpp')
-rw-r--r-- | src/control/HandlingDataMgr.cpp | 247 |
1 files changed, 0 insertions, 247 deletions
diff --git a/src/control/HandlingDataMgr.cpp b/src/control/HandlingDataMgr.cpp deleted file mode 100644 index 48000b48..00000000 --- a/src/control/HandlingDataMgr.cpp +++ /dev/null @@ -1,247 +0,0 @@ -#include "common.h" -#include "patcher.h" -#include "main.h" -#include "FileMgr.h" -#include "HandlingDatamgr.h" - -cHandlingDataMgr &mod_HandlingManager = *(cHandlingDataMgr*)0x728060; - -char *HandlingFilename = "HANDLING.CFG"; - -char VehicleNames[NUMHANDLINGS][14] = { - "LANDSTAL", - "IDAHO", - "STINGER", - "LINERUN", - "PEREN", - "SENTINEL", - "PATRIOT", - "FIRETRUK", - "TRASH", - "STRETCH", - "MANANA", - "INFERNUS", - "BLISTA", - "PONY", - "MULE", - "CHEETAH", - "AMBULAN", - "FBICAR", - "MOONBEAM", - "ESPERANT", - "TAXI", - "KURUMA", - "BOBCAT", - "MRWHOOP", - "BFINJECT", - "POLICE", - "ENFORCER", - "SECURICA", - "BANSHEE", - "PREDATOR", - "BUS", - "RHINO", - "BARRACKS", - "TRAIN", - "HELI", - "DODO", - "COACH", - "CABBIE", - "STALLION", - "RUMPO", - "RCBANDIT", - "BELLYUP", - "MRWONGS", - "MAFIA", - "YARDIE", - "YAKUZA", - "DIABLOS", - "COLUMB", - "HOODS", - "AIRTRAIN", - "DEADDODO", - "SPEEDER", - "REEFER", - "PANLANT", - "FLATBED", - "YANKEE", - "BORGNINE" -}; - -cHandlingDataMgr::cHandlingDataMgr(void) -{ - memset(this, 0, sizeof(this)); -} - -void -cHandlingDataMgr::Initialise(void) -{ - LoadHandlingData(); - field_0 = 0.1f; - field_4 = 0.9f; - field_8 = 1.0f; - field_C = 0.8f; - field_10 = 0.98f; -} - -void -cHandlingDataMgr::LoadHandlingData(void) -{ - char *start, *end; - char line[201]; // weird value - char delim[4]; // not sure - char *word; - int field, handlingId; - int keepGoing; - tHandlingData *handling; - - CFileMgr::SetDir("DATA"); - CFileMgr::LoadFile(HandlingFilename, work_buff, sizeof(work_buff), "r"); - CFileMgr::SetDir(""); - - start = (char*)work_buff; - end = start+1; - handling = nil; - keepGoing = 1; - - while(keepGoing){ - // find end of line - while(*end != '\n') end++; - - // get line - strncpy(line, start, end - start); - line[end - start] = '\0'; - start = end+1; - end = start+1; - - // yeah, this is kinda crappy - if(strncmp(line, ";the end", 9) == 0) - keepGoing = 0; - else if(line[0] != ';'){ - field = 0; - strcpy(delim, " \t"); - // FIX: game seems to use a do-while loop here - for(word = strtok(line, delim); word; word = strtok(nil, delim)){ - switch(field){ - case 0: - handlingId = FindExactWord(word, (const char*)VehicleNames, 14, NUMHANDLINGS); - assert(handlingId >= 0 && handlingId < NUMHANDLINGS); - handling = &HandlingData[handlingId]; - handling->nIdentifier = handlingId; - break; - case 1: handling->fMass = strtod(word, nil); break; - case 2: handling->Dimension.x = strtod(word, nil); break; - case 3: handling->Dimension.y = strtod(word, nil); break; - case 4: handling->Dimension.z = strtod(word, nil); break; - case 5: handling->CentreOfMass.x = strtod(word, nil); break; - case 6: handling->CentreOfMass.y = strtod(word, nil); break; - case 7: handling->CentreOfMass.z = strtod(word, nil); break; - case 8: handling->nPercentSubmerged = atoi(word); break; - case 9: handling->fTractionMultiplier = strtod(word, nil); break; - case 10: handling->fTractionLoss = strtod(word, nil); break; - case 11: handling->fTractionBias = strtod(word, nil); break; - case 12: handling->TransmissionData.nNumberOfGears = atoi(word); break; - case 13: handling->TransmissionData.fMaxVelocity = strtod(word, nil); break; - case 14: handling->TransmissionData.fEngineAcceleration = strtod(word, nil) * 0.4f; break; - case 15: handling->TransmissionData.nDriveType = word[0]; break; - case 16: handling->TransmissionData.nEngineType = word[0]; break; - case 17: handling->fBrakeDeceleration = strtod(word, nil); break; - case 18: handling->fBrakeBias = strtod(word, nil); break; - case 19: handling->bABS = !!atoi(word); break; - case 20: handling->fSteeringLock = strtod(word, nil); break; - case 21: handling->fSuspensionForceLevel = strtod(word, nil); break; - case 22: handling->fSuspensionDampingLevel = strtod(word, nil); break; - case 23: handling->fSeatOffsetDistance = strtod(word, nil); break; - case 24: handling->fCollisionDamageMultiplier = strtod(word, nil); break; - case 25: handling->nMonetaryValue = atoi(word); break; - case 26: handling->fSuspensionUpperLimit = strtod(word, nil); break; - case 27: handling->fSuspensionLowerLimit = strtod(word, nil); break; - case 28: handling->fSuspensionBias = strtod(word, nil); break; - case 29: - sscanf(word, "%x", &handling->Flags); - handling->TransmissionData.Flags = handling->Flags; - break; - case 30: handling->FrontLights = atoi(word); break; - case 31: handling->RearLights = atoi(word); break; - } - field++; - } - ConvertDataToGameUnits(handling); - } - } -} - -int -cHandlingDataMgr::FindExactWord(const char *word, const char *words, int wordLen, int numWords) -{ - int i; - - for(i = 0; i < numWords; i++){ - // BUG: the game does something really stupid here, it's fixed here - if(strncmp(word, words, wordLen) == 0) - return i; - words += wordLen; - } - return numWords; -} - - -void -cHandlingDataMgr::ConvertDataToGameUnits(tHandlingData *handling) -{ - // TODO: figure out what exactly is being converted here - float velocity, a, b, specificVolume; - - handling->TransmissionData.fEngineAcceleration /= 2500.0f; - handling->TransmissionData.fMaxVelocity /= 180.0f; - handling->fBrakeDeceleration /= 2500.0f; - handling->fTurnMass = (sq(handling->Dimension.x) + sq(handling->Dimension.y)) * handling->fMass / 12.0f; - if(handling->fTurnMass < 10.0f) - handling->fTurnMass *= 5.0f; - handling->fInvMass = 1.0f/handling->fMass; - handling->fBuoyancy = 100.0f/handling->nPercentSubmerged * 0.008*handling->fMass; - - // What the hell is going on here? - specificVolume = handling->Dimension.x*handling->Dimension.z*0.5f / handling->fMass; // ? - a = 0.0f; - b = 100.0f; - velocity = handling->TransmissionData.fMaxVelocity; - while(a < b && velocity > 0.0f){ - velocity -= 0.01; - a = handling->TransmissionData.fEngineAcceleration/6.0f; - b = -velocity * (1.0f/(specificVolume * sq(velocity) + 1.0f) - 1.0f); - } - - if(handling->nIdentifier == HANDLING_RCBANDIT){ - handling->TransmissionData.fUnkMaxVelocity = handling->TransmissionData.fMaxVelocity; - }else{ - handling->TransmissionData.fUnkMaxVelocity = velocity; - handling->TransmissionData.fMaxVelocity = velocity * 1.2f; - } - handling->TransmissionData.fMaxReverseVelocity = -0.2f; - - if(handling->TransmissionData.nDriveType == '4') - handling->TransmissionData.fEngineAcceleration /= 4.0f; - else - handling->TransmissionData.fEngineAcceleration /= 2.0f; - - handling->TransmissionData.InitGearRatios(); -} - -int32 -cHandlingDataMgr::GetHandlingId(const char *name) -{ - int i; - for(i = 0; i < NUMHANDLINGS; i++) - if(strncmp(VehicleNames[i], name, 14) == 0) - break; - return i; -} - -STARTPATCHES - InjectHook(0x546D80, &cHandlingDataMgr::Initialise, PATCH_JUMP); - InjectHook(0x546DB0, &cHandlingDataMgr::LoadHandlingData, PATCH_JUMP); - InjectHook(0x546BB0, &cHandlingDataMgr::ConvertDataToGameUnits, PATCH_JUMP); - InjectHook(0x546AA0, &cHandlingDataMgr::FindExactWord, PATCH_JUMP); - InjectHook(0x546B70, &cHandlingDataMgr::GetHandlingId, PATCH_JUMP); -ENDPATCHES |