mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-23 08:39:18 +02:00
re-enabled door controls (hard-coded and limited to EZT for the time being); added more convenient version of getkyval(); fixed disappearing vehicle wheels.
This commit is contained in:
40
DynObj.cpp
40
DynObj.cpp
@@ -3110,11 +3110,11 @@ bool TDynamicObject::Update(double dt, double dt1)
|
|||||||
|
|
||||||
if (MoverParameters->Vel != 0)
|
if (MoverParameters->Vel != 0)
|
||||||
{ // McZapkie-050402: krecenie kolami:
|
{ // McZapkie-050402: krecenie kolami:
|
||||||
dWheelAngle[0] += 114.59155902616464175359630962821 * MoverParameters->V * dt1 /
|
assert( MoverParameters->WheelDiameterL != 0.0 );
|
||||||
MoverParameters->WheelDiameterL; // przednie toczne
|
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[1] += MoverParameters->nrot * dt1 * 360.0; // napędne
|
||||||
dWheelAngle[2] += 114.59155902616464175359630962821 * MoverParameters->V * dt1 /
|
dWheelAngle[2] += 114.59155902616464175359630962821 * MoverParameters->V * dt1 / MoverParameters->WheelDiameterT; // tylne toczne
|
||||||
MoverParameters->WheelDiameterT; // tylne toczne
|
|
||||||
if (dWheelAngle[0] > 360.0)
|
if (dWheelAngle[0] > 360.0)
|
||||||
dWheelAngle[0] -= 360.0; // a w drugą stronę jak się kręcą?
|
dWheelAngle[0] -= 360.0; // a w drugą stronę jak się kręcą?
|
||||||
if (dWheelAngle[1] > 360.0)
|
if (dWheelAngle[1] > 360.0)
|
||||||
@@ -4224,6 +4224,16 @@ void TDynamicObject::RenderAlpha()
|
|||||||
void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
||||||
std::string ReplacableSkin)
|
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;
|
double dSDist;
|
||||||
// asBaseDir=BaseDir;
|
// asBaseDir=BaseDir;
|
||||||
Global::asCurrentDynamicPath = 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
|
m = 0; // numer osi; kolejny znak; ile osi danego typu; która średnica
|
||||||
if ((MoverParameters->WheelDiameterL != MoverParameters->WheelDiameter) ||
|
if ((MoverParameters->WheelDiameterL != MoverParameters->WheelDiameter) ||
|
||||||
(MoverParameters->WheelDiameterT != MoverParameters->WheelDiameter))
|
(MoverParameters->WheelDiameterT != MoverParameters->WheelDiameter))
|
||||||
{ // obsługa różnych średnic, o
|
{ // obsługa różnych średnic, o ile występują
|
||||||
// ile występują
|
|
||||||
while ((i < iAnimType[ANIM_WHEELS]) &&
|
while ((i < iAnimType[ANIM_WHEELS]) &&
|
||||||
(j <= MoverParameters->AxleArangement.length()))
|
(j <= MoverParameters->AxleArangement.length()))
|
||||||
{ // wersja ze wskaźnikami jest
|
{ // wersja ze wskaźnikami jest bardziej elastyczna na nietypowe układy
|
||||||
// bardziej elastyczna na nietypowe
|
|
||||||
// układy
|
|
||||||
if ((k >= 'A') && (k <= 'J')) // 10 chyba maksimum?
|
if ((k >= 'A') && (k <= 'J')) // 10 chyba maksimum?
|
||||||
{
|
{
|
||||||
pAnimations[i++].dWheelAngle =
|
pAnimations[i++].dWheelAngle = dWheelAngle + 1; // obrót osi napędzających
|
||||||
dWheelAngle + 1; // obrót osi napędzających
|
--k; // następna będzie albo taka sama, albo bierzemy kolejny znak
|
||||||
--k; // następna będzie albo taka sama, albo bierzemy kolejny
|
|
||||||
// znak
|
|
||||||
m = 2; // następujące toczne będą miały inną średnicę
|
m = 2; // następujące toczne będą miały inną średnicę
|
||||||
}
|
}
|
||||||
else if ((k >= '1') && (k <= '9'))
|
else if ((k >= '1') && (k <= '9'))
|
||||||
{
|
{
|
||||||
pAnimations[i++].dWheelAngle = dWheelAngle + m; // obrót osi
|
pAnimations[i++].dWheelAngle = dWheelAngle + m; // obrót osi tocznych
|
||||||
// tocznych
|
--k; // następna będzie albo taka sama, albo bierzemy kolejny znak
|
||||||
--k; // następna będzie albo taka sama, albo bierzemy kolejny
|
|
||||||
// znak
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
k = MoverParameters->AxleArangement[j++]; // pobranie kolejnego
|
k = MoverParameters->AxleArangement[j++]; // pobranie kolejnego znaku
|
||||||
// znaku
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ void TEvent::Conditions(cParser *parser, string s)
|
|||||||
std::string token, str;
|
std::string token, str;
|
||||||
if (!asNodeName.empty())
|
if (!asNodeName.empty())
|
||||||
{ // podczepienie ³añcucha, jeœli nie jest pusty
|
{ // 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
|
Params[9].asText = new char[asNodeName.length() + 1]; // usuwane i zamieniane na
|
||||||
// wskaŸnik
|
// wskaŸnik
|
||||||
strcpy(Params[9].asText, asNodeName.c_str());
|
strcpy(Params[9].asText, asNodeName.c_str());
|
||||||
|
|||||||
17
Ground.cpp
17
Ground.cpp
@@ -739,7 +739,7 @@ void TSubRect::NodeAdd(TGroundNode *Node)
|
|||||||
{
|
{
|
||||||
if (t && (Node->TextureID != t))
|
if (t && (Node->TextureID != t))
|
||||||
{ // jeœli s¹ dwie ró¿ne tekstury, dodajemy drugi obiekt dla danego toru
|
{ // 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->iType = TP_DUMMYTRACK; // obiekt renderuj¹cy siatki dla tekstury
|
||||||
n->TextureID = t;
|
n->TextureID = t;
|
||||||
n->pTrack = Node->pTrack; // wskazuje na ten sam tor
|
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
|
if (t < n1->TextureID) // jeœli (n1) ma inn¹ teksturê ni¿ poprzednie
|
||||||
{ // mo¿na zrobiæ obiekt renderuj¹cy
|
{ // mo¿na zrobiæ obiekt renderuj¹cy
|
||||||
t = n1->TextureID;
|
t = n1->TextureID;
|
||||||
n2 = new TGroundNode();
|
n2 = new TGroundNode(); // BUG: source of a memory leak here
|
||||||
n2->nNext2 = nRootMesh;
|
n2->nNext2 = nRootMesh;
|
||||||
nRootMesh = n2; // podczepienie na pocz¹tku listy
|
nRootMesh = n2; // podczepienie na pocz¹tku listy
|
||||||
nRootMesh->iType = TP_MESH; // obiekt renderuj¹cy siatki dla tekstury
|
nRootMesh->iType = TP_MESH; // obiekt renderuj¹cy siatki dla tekstury
|
||||||
@@ -3135,13 +3135,12 @@ bool TGround::InitEvents()
|
|||||||
strcpy(buff, Current->Params[i].asText);
|
strcpy(buff, Current->Params[i].asText);
|
||||||
SafeDeleteArray(Current->Params[i].asText);
|
SafeDeleteArray(Current->Params[i].asText);
|
||||||
Current->Params[i].asEvent = FindEvent(buff);
|
Current->Params[i].asEvent = FindEvent(buff);
|
||||||
if (!Current->Params[i].asEvent) // Ra: tylko w logu informacja o braku
|
if( !Current->Params[ i ].asEvent ) { // Ra: tylko w logu informacja o braku
|
||||||
if (string(Current->Params[i].asText).substr(0, 5) != "none_")
|
if( ( Current->Params[ i ].asText == NULL )
|
||||||
{
|
|| ( std::string( Current->Params[ i ].asText ).substr( 0, 5 ) != "none_" ) ) {
|
||||||
WriteLog("Event \"" + string(buff) +
|
WriteLog( "Event \"" + string( buff ) + "\" does not exist" );
|
||||||
"\" does not exist");
|
ErrorLog( "Missed event: " + string( buff ) + " in multiple " + Current->asName );
|
||||||
ErrorLog("Missed event: " + string(buff) + " in multiple " +
|
}
|
||||||
Current->asName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1125,3 +1125,25 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern double Distance(TLocation Loc1, TLocation Loc2, TDimension Dim1, TDimension Dim2);
|
extern double Distance(TLocation Loc1, TLocation Loc2, TDimension Dim1, TDimension Dim2);
|
||||||
|
|
||||||
|
template <typename _Type>
|
||||||
|
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
|
||||||
|
}
|
||||||
@@ -6392,6 +6392,17 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
|
|||||||
startBPT = false;
|
startBPT = false;
|
||||||
secParam = true;
|
secParam = true;
|
||||||
SetFlag(OKFlag, param_ok);
|
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");
|
aCategory = getkeyval(1, "Category");
|
||||||
aType = ToUpper(getkeyval(1, "Type"));
|
aType = ToUpper(getkeyval(1, "Type"));
|
||||||
aMass = atof(getkeyval(3, "M").c_str());
|
aMass = atof(getkeyval(3, "M").c_str());
|
||||||
@@ -6401,6 +6412,7 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
|
|||||||
aSandCap = atoi(getkeyval(2, "SandCap").c_str());
|
aSandCap = atoi(getkeyval(2, "SandCap").c_str());
|
||||||
aHeatingP = atof(getkeyval(3, "HeatingP").c_str());
|
aHeatingP = atof(getkeyval(3, "HeatingP").c_str());
|
||||||
aLightP = atof(getkeyval(3, "LightP").c_str());
|
aLightP = atof(getkeyval(3, "LightP").c_str());
|
||||||
|
*/
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6774,11 +6786,11 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
|
|||||||
ADist = dAd;
|
ADist = dAd;
|
||||||
BDist = dBd;
|
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
|
WheelDiameterL = WheelDiameter; //... lepsze to niż zero
|
||||||
else
|
else
|
||||||
WheelDiameterL = dDl;
|
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
|
WheelDiameterT = WheelDiameter; //... lepsze to niż zero
|
||||||
else
|
else
|
||||||
WheelDiameterT = dDt;
|
WheelDiameterT = dDt;
|
||||||
|
|||||||
@@ -522,8 +522,10 @@ void TNESt3::SetSize(int size, std::string params) // ustawianie dysz (rozmiaru
|
|||||||
else
|
else
|
||||||
Przekladniki[2] = std::make_shared<TRura>();
|
Przekladniki[2] = std::make_shared<TRura>();
|
||||||
|
|
||||||
if ((params.find("3d") + params.find("4d")) != std::string::npos)
|
if( ( params.find( "3d" ) != std::string::npos )
|
||||||
|
|| ( params.find( "4d" ) != std::string::npos ) ) {
|
||||||
autom = false;
|
autom = false;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
autom = true;
|
autom = true;
|
||||||
if ((params.find("HBG300") != std::string::npos))
|
if ((params.find("HBG300") != std::string::npos))
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ TIsolated * TIsolated::Find(const string &n)
|
|||||||
return p;
|
return p;
|
||||||
p = p->pNext;
|
p = p->pNext;
|
||||||
}
|
}
|
||||||
pRoot = new TIsolated(n, pRoot);
|
pRoot = new TIsolated(n, pRoot); // BUG: source of a memory leak
|
||||||
return pRoot;
|
return pRoot;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
45
Train.cpp
45
Train.cpp
@@ -227,9 +227,9 @@ bool TTrain::Init(TDynamicObject *NewDynamicObject, bool e3d)
|
|||||||
fMechPitch = 0.1;
|
fMechPitch = 0.1;
|
||||||
fMainRelayTimer = 0; // Hunter, do k...y nêdzy, ustawiaj wartoœci pocz¹tkowe zmiennych!
|
fMainRelayTimer = 0; // Hunter, do k...y nêdzy, ustawiaj wartoœci pocz¹tkowe zmiennych!
|
||||||
|
|
||||||
if (!LoadMMediaFile(DynamicObject->asBaseDir + DynamicObject->MoverParameters->TypeName +
|
if( false == LoadMMediaFile( DynamicObject->asBaseDir + DynamicObject->MoverParameters->TypeName + ".mmd" ) ) {
|
||||||
".mmd"))
|
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// McZapkie: w razie wykolejenia
|
// McZapkie: w razie wykolejenia
|
||||||
// dsbDerailment=TSoundsManager::GetFromName("derail.wav");
|
// 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
|
else if (cKey == Global::Keys[k_OpenLeft]) // NBMX 17-09-2003: otwieranie drzwi
|
||||||
{
|
{
|
||||||
if (mvOccupied->DoorOpenCtrl == 1)
|
if (mvOccupied->DoorOpenCtrl == 1)
|
||||||
if (mvOccupied->CabNo < 0 ? mvOccupied->DoorRight(true) :
|
if (mvOccupied->CabNo < 0 ? mvOccupied->DoorRight(true) : mvOccupied->DoorLeft(true))
|
||||||
mvOccupied->DoorLeft(true))
|
|
||||||
{
|
{
|
||||||
dsbSwitch->SetVolume(DSBVOLUME_MAX);
|
dsbSwitch->SetVolume(DSBVOLUME_MAX);
|
||||||
dsbSwitch->Play(0, 0, 0);
|
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
|
else if (cKey == Global::Keys[k_OpenRight]) // NBMX 17-09-2003: otwieranie drzwi
|
||||||
{
|
{
|
||||||
if (mvOccupied->DoorCloseCtrl == 1)
|
if (mvOccupied->DoorOpenCtrl == 1)
|
||||||
if (mvOccupied->CabNo < 0 ? mvOccupied->DoorLeft(true) :
|
if (mvOccupied->CabNo < 0 ? mvOccupied->DoorLeft(true) : mvOccupied->DoorRight(true))
|
||||||
mvOccupied->DoorRight(true))
|
|
||||||
{
|
{
|
||||||
dsbSwitch->SetVolume(DSBVOLUME_MAX);
|
dsbSwitch->SetVolume(DSBVOLUME_MAX);
|
||||||
dsbSwitch->Play(0, 0, 0);
|
dsbSwitch->Play(0, 0, 0);
|
||||||
@@ -1927,27 +1925,27 @@ if
|
|||||||
}
|
}
|
||||||
else if (cKey == Global::Keys[k_CloseLeft]) // NBMX 17-09-2003: zamykanie drzwi
|
else if (cKey == Global::Keys[k_CloseLeft]) // NBMX 17-09-2003: zamykanie drzwi
|
||||||
{
|
{
|
||||||
if (mvOccupied->CabNo < 0 ? mvOccupied->DoorRight(false) : mvOccupied->DoorLeft(false))
|
if( mvOccupied->DoorCloseCtrl == 1 ) {
|
||||||
{
|
if( mvOccupied->CabNo < 0 ? mvOccupied->DoorRight( false ) : mvOccupied->DoorLeft( false ) ) {
|
||||||
dsbSwitch->SetVolume(DSBVOLUME_MAX);
|
dsbSwitch->SetVolume( DSBVOLUME_MAX );
|
||||||
dsbSwitch->Play(0, 0, 0);
|
dsbSwitch->Play( 0, 0, 0 );
|
||||||
if (dsbDoorClose)
|
if( dsbDoorClose ) {
|
||||||
{
|
dsbDoorClose->SetCurrentPosition( 0 );
|
||||||
dsbDoorClose->SetCurrentPosition(0);
|
dsbDoorClose->Play( 0, 0, 0 );
|
||||||
dsbDoorClose->Play(0, 0, 0);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (cKey == Global::Keys[k_CloseRight]) // NBMX 17-09-2003: zamykanie drzwi
|
else if (cKey == Global::Keys[k_CloseRight]) // NBMX 17-09-2003: zamykanie drzwi
|
||||||
{
|
{
|
||||||
if (mvOccupied->CabNo < 0 ? mvOccupied->DoorLeft(false) : mvOccupied->DoorRight(false))
|
if( mvOccupied->DoorCloseCtrl == 1 ) {
|
||||||
{
|
if( mvOccupied->CabNo < 0 ? mvOccupied->DoorLeft( false ) : mvOccupied->DoorRight( false ) ) {
|
||||||
dsbSwitch->SetVolume(DSBVOLUME_MAX);
|
dsbSwitch->SetVolume( DSBVOLUME_MAX );
|
||||||
dsbSwitch->Play(0, 0, 0);
|
dsbSwitch->Play( 0, 0, 0 );
|
||||||
if (dsbDoorClose)
|
if( dsbDoorClose ) {
|
||||||
{
|
dsbDoorClose->SetCurrentPosition( 0 );
|
||||||
dsbDoorClose->SetCurrentPosition(0);
|
dsbDoorClose->Play( 0, 0, 0 );
|
||||||
dsbDoorClose->Play(0, 0, 0);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5019,6 +5017,7 @@ bool TTrain::LoadMMediaFile(std::string const &asFileName)
|
|||||||
dsbCouplerDetach = TSoundsManager::GetFromName("couplerdetach.wav", true);
|
dsbCouplerDetach = TSoundsManager::GetFromName("couplerdetach.wav", true);
|
||||||
dsbCouplerStretch = TSoundsManager::GetFromName("en57_couplerstretch.wav", true);
|
dsbCouplerStretch = TSoundsManager::GetFromName("en57_couplerstretch.wav", true);
|
||||||
dsbCouplerAttach = TSoundsManager::GetFromName("couplerattach.wav", true);
|
dsbCouplerAttach = TSoundsManager::GetFromName("couplerattach.wav", true);
|
||||||
|
|
||||||
std::string token;
|
std::string token;
|
||||||
do {
|
do {
|
||||||
token = "";
|
token = "";
|
||||||
|
|||||||
Reference in New Issue
Block a user