From 8fe465afefe96f22083f574a1d49b8b5224a22b9 Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Thu, 19 Jan 2017 17:49:49 +0100 Subject: [PATCH] re-enabled door controls (hard-coded and limited to EZT for the time being); added more convenient version of getkyval(); fixed disappearing vehicle wheels. --- DynObj.cpp | 40 ++++++++++++++-------------- Event.cpp | 2 +- Ground.cpp | 19 +++++++------- McZapkie/MOVER.h | 22 ++++++++++++++++ McZapkie/Mover.cpp | 16 ++++++++++-- McZapkie/Oerlikon_ESt.cpp | 8 +++--- Track.cpp | 2 +- Train.cpp | 55 +++++++++++++++++++-------------------- 8 files changed, 100 insertions(+), 64 deletions(-) diff --git a/DynObj.cpp b/DynObj.cpp index 812c656a..4d840b01 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -3110,11 +3110,11 @@ bool TDynamicObject::Update(double dt, double dt1) if (MoverParameters->Vel != 0) { // McZapkie-050402: krecenie kolami: - dWheelAngle[0] += 114.59155902616464175359630962821 * MoverParameters->V * dt1 / - MoverParameters->WheelDiameterL; // przednie toczne + assert( MoverParameters->WheelDiameterL != 0.0 ); + assert( MoverParameters->WheelDiameterT != 0.0 ); + dWheelAngle[ 0 ] += 114.59155902616464175359630962821 * MoverParameters->V * dt1 / MoverParameters->WheelDiameterL; // przednie toczne dWheelAngle[1] += MoverParameters->nrot * dt1 * 360.0; // napędne - dWheelAngle[2] += 114.59155902616464175359630962821 * MoverParameters->V * dt1 / - MoverParameters->WheelDiameterT; // tylne toczne + dWheelAngle[2] += 114.59155902616464175359630962821 * MoverParameters->V * dt1 / MoverParameters->WheelDiameterT; // tylne toczne if (dWheelAngle[0] > 360.0) dWheelAngle[0] -= 360.0; // a w drugą stronę jak się kręcą? if (dWheelAngle[1] > 360.0) @@ -4224,6 +4224,16 @@ void TDynamicObject::RenderAlpha() void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, std::string ReplacableSkin) { + // temporary hack to enable door animation in EZT + // TODO: add relevant entries to suitable definition file (.mmd ?) + // ensure the parameters are loaded before the main body mesh + // so the code binds proper method of door animation + if( MoverParameters->TrainType & dt_EZT ) { + MoverParameters->DoorOpenCtrl = 1; + MoverParameters->DoorCloseCtrl = 1; + MoverParameters->DoorOpenMethod = 1; + } + double dSDist; // asBaseDir=BaseDir; Global::asCurrentDynamicPath = BaseDir; @@ -4580,31 +4590,23 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, m = 0; // numer osi; kolejny znak; ile osi danego typu; która średnica if ((MoverParameters->WheelDiameterL != MoverParameters->WheelDiameter) || (MoverParameters->WheelDiameterT != MoverParameters->WheelDiameter)) - { // obsługa różnych średnic, o - // ile występują + { // obsługa różnych średnic, o ile występują while ((i < iAnimType[ANIM_WHEELS]) && (j <= MoverParameters->AxleArangement.length())) - { // wersja ze wskaźnikami jest - // bardziej elastyczna na nietypowe - // układy + { // wersja ze wskaźnikami jest bardziej elastyczna na nietypowe układy if ((k >= 'A') && (k <= 'J')) // 10 chyba maksimum? { - pAnimations[i++].dWheelAngle = - dWheelAngle + 1; // obrót osi napędzających - --k; // następna będzie albo taka sama, albo bierzemy kolejny - // znak + pAnimations[i++].dWheelAngle = dWheelAngle + 1; // obrót osi napędzających + --k; // następna będzie albo taka sama, albo bierzemy kolejny znak m = 2; // następujące toczne będą miały inną średnicę } else if ((k >= '1') && (k <= '9')) { - pAnimations[i++].dWheelAngle = dWheelAngle + m; // obrót osi - // tocznych - --k; // następna będzie albo taka sama, albo bierzemy kolejny - // znak + pAnimations[i++].dWheelAngle = dWheelAngle + m; // obrót osi tocznych + --k; // następna będzie albo taka sama, albo bierzemy kolejny znak } else - k = MoverParameters->AxleArangement[j++]; // pobranie kolejnego - // znaku + k = MoverParameters->AxleArangement[j++]; // pobranie kolejnego znaku } } } diff --git a/Event.cpp b/Event.cpp index 1056f613..545480d6 100644 --- a/Event.cpp +++ b/Event.cpp @@ -90,7 +90,7 @@ void TEvent::Conditions(cParser *parser, string s) std::string token, str; if (!asNodeName.empty()) { // podczepienie łańcucha, jeśli nie jest pusty - // NOTE: source of a memory leak -- the array never gets deleted. fix the destructor + // BUG: source of a memory leak -- the array never gets deleted. fix the destructor Params[9].asText = new char[asNodeName.length() + 1]; // usuwane i zamieniane na // wskaźnik strcpy(Params[9].asText, asNodeName.c_str()); diff --git a/Ground.cpp b/Ground.cpp index effd8683..be63b145 100644 --- a/Ground.cpp +++ b/Ground.cpp @@ -739,7 +739,7 @@ void TSubRect::NodeAdd(TGroundNode *Node) { if (t && (Node->TextureID != t)) { // jeśli są dwie różne tekstury, dodajemy drugi obiekt dla danego toru - TGroundNode *n = new TGroundNode(); + TGroundNode *n = new TGroundNode(); // BUG: source of a memory leak here n->iType = TP_DUMMYTRACK; // obiekt renderujący siatki dla tekstury n->TextureID = t; n->pTrack = Node->pTrack; // wskazuje na ten sam tor @@ -962,7 +962,7 @@ void TSubRect::Sort() if (t < n1->TextureID) // jeśli (n1) ma inną teksturę niż poprzednie { // można zrobić obiekt renderujący t = n1->TextureID; - n2 = new TGroundNode(); + n2 = new TGroundNode(); // BUG: source of a memory leak here n2->nNext2 = nRootMesh; nRootMesh = n2; // podczepienie na początku listy nRootMesh->iType = TP_MESH; // obiekt renderujący siatki dla tekstury @@ -3135,14 +3135,13 @@ bool TGround::InitEvents() strcpy(buff, Current->Params[i].asText); SafeDeleteArray(Current->Params[i].asText); Current->Params[i].asEvent = FindEvent(buff); - if (!Current->Params[i].asEvent) // Ra: tylko w logu informacja o braku - if (string(Current->Params[i].asText).substr(0, 5) != "none_") - { - WriteLog("Event \"" + string(buff) + - "\" does not exist"); - ErrorLog("Missed event: " + string(buff) + " in multiple " + - Current->asName); - } + if( !Current->Params[ i ].asEvent ) { // Ra: tylko w logu informacja o braku + if( ( Current->Params[ i ].asText == NULL ) + || ( std::string( Current->Params[ i ].asText ).substr( 0, 5 ) != "none_" ) ) { + WriteLog( "Event \"" + string( buff ) + "\" does not exist" ); + ErrorLog( "Missed event: " + string( buff ) + " in multiple " + Current->asName ); + } + } } } break; diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 299cd1d6..dc6e1674 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -1125,3 +1125,25 @@ public: }; extern double Distance(TLocation Loc1, TLocation Loc2, TDimension Dim1, TDimension Dim2); + +template +bool getkeyval( _Type &Variable, std::string const &Key, std::string const &Input ) { + + auto lookup = Input.find( Key + "=" ); + if( lookup == std::string::npos ) { + return false; } + std::string value = Input.substr( Input.find_first_not_of( ' ', lookup + Key.size() + 1 ) ); + lookup = value.find( ' ' ); + if( lookup != std::string::npos ) { + // trim everything past the value + value.erase( lookup ); + } + if( true == value.empty() ) { + return false; + } + // set the specified variable to retrieved value + std::stringstream converter; + converter << value; + converter >> Variable; + return true; // all done +} \ No newline at end of file diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index cb139d21..39f673b8 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -6392,6 +6392,17 @@ bool TMoverParameters::LoadFIZ(std::string chkpath) startBPT = false; secParam = true; SetFlag(OKFlag, param_ok); + getkeyval( aCategory, "Category", xline ); + getkeyval( aType, "Type", xline ); aType = ToUpper( aType ); + getkeyval( aMass, "M", xline ); + getkeyval( aMred, "Mred", xline ); + getkeyval( aVmax, "Vmax", xline ); + getkeyval( aPWR, "PWR", xline ); + getkeyval( aSandCap, "SandCap", xline ); + getkeyval( aHeatingP, "HeatingP", xline ); + getkeyval( aLightP, "LightP", xline ); + // TODO: switch other sections to the new getkeyval() code +/* aCategory = getkeyval(1, "Category"); aType = ToUpper(getkeyval(1, "Type")); aMass = atof(getkeyval(3, "M").c_str()); @@ -6401,6 +6412,7 @@ bool TMoverParameters::LoadFIZ(std::string chkpath) aSandCap = atoi(getkeyval(2, "SandCap").c_str()); aHeatingP = atof(getkeyval(3, "HeatingP").c_str()); aLightP = atof(getkeyval(3, "LightP").c_str()); +*/ continue; } @@ -6774,11 +6786,11 @@ bool TMoverParameters::LoadFIZ(std::string chkpath) ADist = dAd; BDist = dBd; - if (WheelDiameterL == -1) // gdyby nie było parametru... + if (WheelDiameterL == 0.0) // gdyby nie było parametru... WheelDiameterL = WheelDiameter; //... lepsze to niż zero else WheelDiameterL = dDl; - if (WheelDiameterT == -1) // gdyby nie było parametru... + if (WheelDiameterT == 0.0) // gdyby nie było parametru... WheelDiameterT = WheelDiameter; //... lepsze to niż zero else WheelDiameterT = dDt; diff --git a/McZapkie/Oerlikon_ESt.cpp b/McZapkie/Oerlikon_ESt.cpp index fa547bc1..d8568c1a 100644 --- a/McZapkie/Oerlikon_ESt.cpp +++ b/McZapkie/Oerlikon_ESt.cpp @@ -522,9 +522,11 @@ void TNESt3::SetSize(int size, std::string params) // ustawianie dysz (rozmiaru else Przekladniki[2] = std::make_shared(); - if ((params.find("3d") + params.find("4d")) != std::string::npos) - autom = false; - else + if( ( params.find( "3d" ) != std::string::npos ) + || ( params.find( "4d" ) != std::string::npos ) ) { + autom = false; + } + else autom = true; if ((params.find("HBG300") != std::string::npos)) HBG300 = 1; diff --git a/Track.cpp b/Track.cpp index 467afe19..e3d21113 100644 --- a/Track.cpp +++ b/Track.cpp @@ -117,7 +117,7 @@ TIsolated * TIsolated::Find(const string &n) return p; p = p->pNext; } - pRoot = new TIsolated(n, pRoot); + pRoot = new TIsolated(n, pRoot); // BUG: source of a memory leak return pRoot; }; diff --git a/Train.cpp b/Train.cpp index c33cc709..613dc094 100644 --- a/Train.cpp +++ b/Train.cpp @@ -227,9 +227,9 @@ bool TTrain::Init(TDynamicObject *NewDynamicObject, bool e3d) fMechPitch = 0.1; fMainRelayTimer = 0; // Hunter, do k...y nędzy, ustawiaj wartości początkowe zmiennych! - if (!LoadMMediaFile(DynamicObject->asBaseDir + DynamicObject->MoverParameters->TypeName + - ".mmd")) - return false; + if( false == LoadMMediaFile( DynamicObject->asBaseDir + DynamicObject->MoverParameters->TypeName + ".mmd" ) ) { + return false; + } // McZapkie: w razie wykolejenia // dsbDerailment=TSoundsManager::GetFromName("derail.wav"); @@ -698,8 +698,7 @@ void TTrain::OnKeyDown(int cKey) else if (cKey == Global::Keys[k_OpenLeft]) // NBMX 17-09-2003: otwieranie drzwi { if (mvOccupied->DoorOpenCtrl == 1) - if (mvOccupied->CabNo < 0 ? mvOccupied->DoorRight(true) : - mvOccupied->DoorLeft(true)) + if (mvOccupied->CabNo < 0 ? mvOccupied->DoorRight(true) : mvOccupied->DoorLeft(true)) { dsbSwitch->SetVolume(DSBVOLUME_MAX); dsbSwitch->Play(0, 0, 0); @@ -712,9 +711,8 @@ void TTrain::OnKeyDown(int cKey) } else if (cKey == Global::Keys[k_OpenRight]) // NBMX 17-09-2003: otwieranie drzwi { - if (mvOccupied->DoorCloseCtrl == 1) - if (mvOccupied->CabNo < 0 ? mvOccupied->DoorLeft(true) : - mvOccupied->DoorRight(true)) + if (mvOccupied->DoorOpenCtrl == 1) + if (mvOccupied->CabNo < 0 ? mvOccupied->DoorLeft(true) : mvOccupied->DoorRight(true)) { dsbSwitch->SetVolume(DSBVOLUME_MAX); dsbSwitch->Play(0, 0, 0); @@ -1927,29 +1925,29 @@ if } else if (cKey == Global::Keys[k_CloseLeft]) // NBMX 17-09-2003: zamykanie drzwi { - if (mvOccupied->CabNo < 0 ? mvOccupied->DoorRight(false) : mvOccupied->DoorLeft(false)) - { - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - if (dsbDoorClose) - { - dsbDoorClose->SetCurrentPosition(0); - dsbDoorClose->Play(0, 0, 0); - } - } + if( mvOccupied->DoorCloseCtrl == 1 ) { + if( mvOccupied->CabNo < 0 ? mvOccupied->DoorRight( false ) : mvOccupied->DoorLeft( false ) ) { + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + if( dsbDoorClose ) { + dsbDoorClose->SetCurrentPosition( 0 ); + dsbDoorClose->Play( 0, 0, 0 ); + } + } + } } else if (cKey == Global::Keys[k_CloseRight]) // NBMX 17-09-2003: zamykanie drzwi { - if (mvOccupied->CabNo < 0 ? mvOccupied->DoorLeft(false) : mvOccupied->DoorRight(false)) - { - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - if (dsbDoorClose) - { - dsbDoorClose->SetCurrentPosition(0); - dsbDoorClose->Play(0, 0, 0); - } - } + if( mvOccupied->DoorCloseCtrl == 1 ) { + if( mvOccupied->CabNo < 0 ? mvOccupied->DoorLeft( false ) : mvOccupied->DoorRight( false ) ) { + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + if( dsbDoorClose ) { + dsbDoorClose->SetCurrentPosition( 0 ); + dsbDoorClose->Play( 0, 0, 0 ); + } + } + } } //----------- @@ -5019,6 +5017,7 @@ bool TTrain::LoadMMediaFile(std::string const &asFileName) dsbCouplerDetach = TSoundsManager::GetFromName("couplerdetach.wav", true); dsbCouplerStretch = TSoundsManager::GetFromName("en57_couplerstretch.wav", true); dsbCouplerAttach = TSoundsManager::GetFromName("couplerattach.wav", true); + std::string token; do { token = "";