mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 16:19:19 +02:00
Obsługa rozkładu jazdy przetłumaczona na C++.
This commit is contained in:
58
Driver.cpp
58
Driver.cpp
@@ -17,7 +17,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#pragma hdrstop
|
#pragma hdrstop
|
||||||
|
|
||||||
#include "Driver.h"
|
#include "Driver.h"
|
||||||
#include <mtable.hpp>
|
#include "mtable.h"
|
||||||
#include "DynObj.h"
|
#include "DynObj.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
@@ -810,7 +810,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
{ // o ile dana pozycja tabelki jest istotna
|
{ // o ile dana pozycja tabelki jest istotna
|
||||||
if (sSpeedTable[i].iFlags & spPassengerStopPoint)
|
if (sSpeedTable[i].iFlags & spPassengerStopPoint)
|
||||||
{ // jeśli przystanek, trzeba obsłużyć wg rozkładu
|
{ // jeśli przystanek, trzeba obsłużyć wg rozkładu
|
||||||
if (sSpeedTable[i].evEvent->CommandGet() != asNextStop)
|
if (sSpeedTable[i].evEvent->CommandGet() != AnsiString(asNextStop.c_str()))
|
||||||
{ // jeśli nazwa nie jest zgodna
|
{ // jeśli nazwa nie jest zgodna
|
||||||
if (sSpeedTable[i].fDist < -fLength) // jeśli został przejechany
|
if (sSpeedTable[i].fDist < -fLength) // jeśli został przejechany
|
||||||
sSpeedTable[i].iFlags =
|
sSpeedTable[i].iFlags =
|
||||||
@@ -828,9 +828,9 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
{ // zaliczamy posterunek w pewnej odległości przed (choć W4 nie zasłania
|
{ // zaliczamy posterunek w pewnej odległości przed (choć W4 nie zasłania
|
||||||
// już semafora)
|
// już semafora)
|
||||||
#if LOGSTOPS
|
#if LOGSTOPS
|
||||||
WriteLog(pVehicle->asName + " as " + TrainParams->TrainName + ": at " +
|
WriteLog(pVehicle->asName + " as " + TrainParams->TrainName.c_str() + ": at " +
|
||||||
AnsiString(GlobalTime->hh) + ":" + AnsiString(GlobalTime->mm) +
|
AnsiString(GlobalTime->hh) + ":" + AnsiString(GlobalTime->mm) +
|
||||||
" skipped " + asNextStop); // informacja
|
" skipped " + AnsiString(asNextStop.c_str())); // informacja
|
||||||
#endif
|
#endif
|
||||||
fLastStopExpDist = mvOccupied->DistCounter + 0.250 +
|
fLastStopExpDist = mvOccupied->DistCounter + 0.250 +
|
||||||
0.001 * fLength; // przy jakim dystansie (stanie
|
0.001 * fLength; // przy jakim dystansie (stanie
|
||||||
@@ -838,7 +838,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
// następny postój
|
// następny postój
|
||||||
TrainParams->UpdateMTable(
|
TrainParams->UpdateMTable(
|
||||||
GlobalTime->hh, GlobalTime->mm,
|
GlobalTime->hh, GlobalTime->mm,
|
||||||
asNextStop.SubString(20, asNextStop.Length()));
|
asNextStop.substr(20, asNextStop.length()));
|
||||||
TrainParams->StationIndexInc(); // przejście do następnej
|
TrainParams->StationIndexInc(); // przejście do następnej
|
||||||
asNextStop =
|
asNextStop =
|
||||||
TrainParams->NextStop(); // pobranie kolejnego miejsca zatrzymania
|
TrainParams->NextStop(); // pobranie kolejnego miejsca zatrzymania
|
||||||
@@ -938,7 +938,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
}
|
}
|
||||||
if (TrainParams->UpdateMTable(
|
if (TrainParams->UpdateMTable(
|
||||||
GlobalTime->hh, GlobalTime->mm,
|
GlobalTime->hh, GlobalTime->mm,
|
||||||
asNextStop.SubString(20, asNextStop.Length())))
|
asNextStop.substr(20, asNextStop.length())))
|
||||||
{ // to się wykona tylko raz po zatrzymaniu na W4
|
{ // to się wykona tylko raz po zatrzymaniu na W4
|
||||||
if (TrainParams->CheckTrainLatency() < 0.0)
|
if (TrainParams->CheckTrainLatency() < 0.0)
|
||||||
iDrivigFlags |= moveLate; // odnotowano spóźnienie
|
iDrivigFlags |= moveLate; // odnotowano spóźnienie
|
||||||
@@ -1000,10 +1000,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
->NextStop(); // pobranie kolejnego miejsca zatrzymania
|
->NextStop(); // pobranie kolejnego miejsca zatrzymania
|
||||||
// TableClear(); //aby od nowa sprawdziło W4 z inną nazwą już - to nie jest dobry pomysł
|
// TableClear(); //aby od nowa sprawdziło W4 z inną nazwą już - to nie jest dobry pomysł
|
||||||
#if LOGSTOPS
|
#if LOGSTOPS
|
||||||
WriteLog(pVehicle->asName + " as " + TrainParams->TrainName +
|
WriteLog(pVehicle->asName + " as " + AnsiString(TrainParams->TrainName.c_str()) +
|
||||||
": at " + AnsiString(GlobalTime->hh) + ":" +
|
": at " + AnsiString(GlobalTime->hh) + ":" +
|
||||||
AnsiString(GlobalTime->mm) + " next " +
|
AnsiString(GlobalTime->mm) + " next " +
|
||||||
asNextStop); // informacja
|
AnsiString(asNextStop.c_str())); // informacja
|
||||||
#endif
|
#endif
|
||||||
if (int(floor(sSpeedTable[i].evEvent->ValueGet(1))) & 1)
|
if (int(floor(sSpeedTable[i].evEvent->ValueGet(1))) & 1)
|
||||||
iDrivigFlags |= moveStopHere; // nie podjeżdżać do semafora,
|
iDrivigFlags |= moveStopHere; // nie podjeżdżać do semafora,
|
||||||
@@ -1027,7 +1027,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
else
|
else
|
||||||
{ // jeśli dojechaliśmy do końca rozkładu
|
{ // jeśli dojechaliśmy do końca rozkładu
|
||||||
#if LOGSTOPS
|
#if LOGSTOPS
|
||||||
WriteLog(pVehicle->asName + " as " + TrainParams->TrainName +
|
WriteLog(pVehicle->asName + " as " + AnsiString(TrainParams->TrainName.c_str()) +
|
||||||
": at " + AnsiString(GlobalTime->hh) + ":" +
|
": at " + AnsiString(GlobalTime->hh) + ":" +
|
||||||
AnsiString(GlobalTime->mm) +
|
AnsiString(GlobalTime->mm) +
|
||||||
" end of route."); // informacja
|
" end of route."); // informacja
|
||||||
@@ -1875,7 +1875,7 @@ bool TController::CheckVehicles(TOrders user)
|
|||||||
{
|
{
|
||||||
if (TrainParams)
|
if (TrainParams)
|
||||||
if (p->asDestination == "none")
|
if (p->asDestination == "none")
|
||||||
p->DestinationSet(TrainParams->Relation2); // relacja docelowa, jeśli nie było
|
p->DestinationSet(AnsiString(TrainParams->Relation2.c_str())); // relacja docelowa, jeśli nie było
|
||||||
if (AIControllFlag) // jeśli prowadzi komputer
|
if (AIControllFlag) // jeśli prowadzi komputer
|
||||||
p->RaLightsSet(0, 0); // gasimy światła
|
p->RaLightsSet(0, 0); // gasimy światła
|
||||||
if (p->MoverParameters->EnginePowerSource.SourceType == CurrentCollector)
|
if (p->MoverParameters->EnginePowerSource.SourceType == CurrentCollector)
|
||||||
@@ -2933,15 +2933,15 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New
|
|||||||
WriteLog("New timetable for " + pVehicle->asName + ": " + NewCommand); // informacja
|
WriteLog("New timetable for " + pVehicle->asName + ": " + NewCommand); // informacja
|
||||||
#endif
|
#endif
|
||||||
if (!TrainParams)
|
if (!TrainParams)
|
||||||
TrainParams = new TTrainParameters(NewCommand); // rozkład jazdy
|
TrainParams = new TTrainParameters(std::string(NewCommand.c_str())); // rozkład jazdy
|
||||||
else
|
else
|
||||||
TrainParams->NewName(NewCommand); // czyści tabelkę przystanków
|
TrainParams->NewName(std::string(NewCommand.c_str())); // czyści tabelkę przystanków
|
||||||
delete tsGuardSignal;
|
delete tsGuardSignal;
|
||||||
tsGuardSignal = NULL; // wywalenie kierownika
|
tsGuardSignal = NULL; // wywalenie kierownika
|
||||||
if (NewCommand != "none")
|
if (NewCommand != "none")
|
||||||
{
|
{
|
||||||
if (!TrainParams->LoadTTfile(
|
if (!TrainParams->LoadTTfile(
|
||||||
Global::asCurrentSceneryPath, floor(NewValue2 + 0.5),
|
std::string(Global::asCurrentSceneryPath.c_str()), floor(NewValue2 + 0.5),
|
||||||
NewValue1)) // pierwszy parametr to przesunięcie rozkładu w czasie
|
NewValue1)) // pierwszy parametr to przesunięcie rozkładu w czasie
|
||||||
{
|
{
|
||||||
if (ConversionError == -8)
|
if (ConversionError == -8)
|
||||||
@@ -2980,7 +2980,7 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New
|
|||||||
iGuardRadio = iRadioChannel;
|
iGuardRadio = iRadioChannel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NewCommand = TrainParams->Relation2; // relacja docelowa z rozkładu
|
NewCommand = AnsiString(TrainParams->Relation2.c_str()); // relacja docelowa z rozkładu
|
||||||
}
|
}
|
||||||
// jeszcze poustawiać tekstury na wyświetlaczach
|
// jeszcze poustawiać tekstury na wyświetlaczach
|
||||||
TDynamicObject *p = pVehicles[0];
|
TDynamicObject *p = pVehicles[0];
|
||||||
@@ -4903,7 +4903,7 @@ void TController::OrdersInit(double fVel)
|
|||||||
// OrderPos=OrderTop=0; //wypełniamy od pozycji 0
|
// OrderPos=OrderTop=0; //wypełniamy od pozycji 0
|
||||||
OrdersClear(); // usunięcie poprzedniej tabeli
|
OrdersClear(); // usunięcie poprzedniej tabeli
|
||||||
OrderPush(Prepare_engine); // najpierw odpalenie silnika
|
OrderPush(Prepare_engine); // najpierw odpalenie silnika
|
||||||
if (TrainParams->TrainName == AnsiString("none"))
|
if (TrainParams->TrainName == "none")
|
||||||
{ // brak rozkładu to jazda manewrowa
|
{ // brak rozkładu to jazda manewrowa
|
||||||
if (fVel > 0.05) // typowo 0.1 oznacza gotowość do jazdy, 0.01 tylko załączenie silnika
|
if (fVel > 0.05) // typowo 0.1 oznacza gotowość do jazdy, 0.01 tylko załączenie silnika
|
||||||
OrderPush(Shunt); // jeśli nie ma rozkładu, to manewruje
|
OrderPush(Shunt); // jeśli nie ma rozkładu, to manewruje
|
||||||
@@ -4913,8 +4913,7 @@ void TController::OrdersInit(double fVel)
|
|||||||
if ((fVel > 0.0) && (fVel < 0.02))
|
if ((fVel > 0.0) && (fVel < 0.02))
|
||||||
OrderPush(Shunt); // dla prędkości 0.01 włączamy jazdę manewrową
|
OrderPush(Shunt); // dla prędkości 0.01 włączamy jazdę manewrową
|
||||||
else if (TrainParams ?
|
else if (TrainParams ?
|
||||||
(TrainParams->TimeTable[1].StationWare.Pos(
|
(TrainParams->DirectionChange() ? // jeśli obrót na pierwszym przystanku
|
||||||
"@") ? // jeśli obrót na pierwszym przystanku
|
|
||||||
((iDrivigFlags &
|
((iDrivigFlags &
|
||||||
movePushPull) ? // SZT również! SN61 zależnie od wagonów...
|
movePushPull) ? // SZT również! SN61 zależnie od wagonów...
|
||||||
(TrainParams->TimeTable[1].StationName == TrainParams->Relation1) :
|
(TrainParams->TimeTable[1].StationName == TrainParams->Relation1) :
|
||||||
@@ -4933,10 +4932,10 @@ void TController::OrdersInit(double fVel)
|
|||||||
{
|
{
|
||||||
t = TrainParams->TimeTable + i;
|
t = TrainParams->TimeTable + i;
|
||||||
if (DebugModeFlag) // normalnie nie ma po co tego wypisywać
|
if (DebugModeFlag) // normalnie nie ma po co tego wypisywać
|
||||||
WriteLog(AnsiString(t->StationName) + " " + AnsiString((int)t->Ah) + ":" +
|
WriteLog(AnsiString(t->StationName.c_str()) + " " + AnsiString((int)t->Ah) + ":" +
|
||||||
AnsiString((int)t->Am) + ", " + AnsiString((int)t->Dh) + ":" +
|
AnsiString((int)t->Am) + ", " + AnsiString((int)t->Dh) + ":" +
|
||||||
AnsiString((int)t->Dm) + " " + AnsiString(t->StationWare));
|
AnsiString((int)t->Dm) + " " + AnsiString(t->StationWare.c_str()));
|
||||||
if (AnsiString(t->StationWare).Pos("@"))
|
if (AnsiString(t->StationWare.c_str()).Pos("@"))
|
||||||
{ // zmiana kierunku i dalsza jazda wg rozkładu
|
{ // zmiana kierunku i dalsza jazda wg rozkładu
|
||||||
if (iDrivigFlags & movePushPull) // SZT również! SN61 zależnie od wagonów...
|
if (iDrivigFlags & movePushPull) // SZT również! SN61 zależnie od wagonów...
|
||||||
{ // jeśli skład zespolony, wystarczy zmienić kierunek jazdy
|
{ // jeśli skład zespolony, wystarczy zmienić kierunek jazdy
|
||||||
@@ -5291,21 +5290,22 @@ TCommandType TController::BackwardScan()
|
|||||||
return cm_Unknown; // nic
|
return cm_Unknown; // nic
|
||||||
};
|
};
|
||||||
|
|
||||||
AnsiString TController::NextStop()
|
std::string TController::NextStop()
|
||||||
{ // informacja o następnym zatrzymaniu, wyświetlane pod [F1]
|
{ // informacja o następnym zatrzymaniu, wyświetlane pod [F1]
|
||||||
if (asNextStop.Length() < 20)
|
if (asNextStop.length() < 20)
|
||||||
return ""; // nie zawiera nazwy stacji, gdy dojechał do końca
|
return ""; // nie zawiera nazwy stacji, gdy dojechał do końca
|
||||||
// dodać godzinę odjazdu
|
// dodać godzinę odjazdu
|
||||||
if (!TrainParams)
|
if (!TrainParams)
|
||||||
return ""; // tu nie powinno nigdy wejść
|
return ""; // tu nie powinno nigdy wejść
|
||||||
TMTableLine *t = TrainParams->TimeTable + TrainParams->StationIndex;
|
TMTableLine *t = TrainParams->TimeTable + TrainParams->StationIndex;
|
||||||
|
std::string tmp = "";
|
||||||
if (t->Dh >= 0) // jeśli jest godzina odjazdu
|
if (t->Dh >= 0) // jeśli jest godzina odjazdu
|
||||||
return asNextStop.SubString(20, 30) + AnsiString(" ") + AnsiString(int(t->Dh)) +
|
return asNextStop.substr(20, 30) + " " + Global::to_string(t->Dh) +
|
||||||
AnsiString(":") + AnsiString(int(100 + t->Dm)).SubString(2, 2); // odjazd
|
":" + Global::to_string(100 + t->Dm).substr(2, 2); // odjazd
|
||||||
else if (t->Ah >= 0) // przyjazd
|
else if (t->Ah >= 0) // przyjazd
|
||||||
return asNextStop.SubString(20, 30) + AnsiString(" (") + AnsiString(int(t->Ah)) +
|
return asNextStop.substr(20, 30) + " (" + Global::to_string(t->Ah) +
|
||||||
AnsiString(":") + AnsiString(int(100 + t->Am)).SubString(2, 2) +
|
":" + Global::to_string(100 + t->Am).substr(2, 2) +
|
||||||
AnsiString(")"); // przyjazd
|
")"; // przyjazd
|
||||||
return "";
|
return "";
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5382,12 +5382,12 @@ void TController::DirectionForward(bool forward)
|
|||||||
mvControlling->IncMainCtrl(1); //żeby nie zgasł
|
mvControlling->IncMainCtrl(1); //żeby nie zgasł
|
||||||
};
|
};
|
||||||
|
|
||||||
AnsiString TController::Relation()
|
std::string TController::Relation()
|
||||||
{ // zwraca relację pociągu
|
{ // zwraca relację pociągu
|
||||||
return TrainParams->ShowRelation();
|
return TrainParams->ShowRelation();
|
||||||
};
|
};
|
||||||
|
|
||||||
AnsiString TController::TrainName()
|
std::string TController::TrainName()
|
||||||
{ // zwraca numer pociągu
|
{ // zwraca numer pociągu
|
||||||
return TrainParams->TrainName;
|
return TrainParams->TrainName;
|
||||||
};
|
};
|
||||||
|
|||||||
12
Driver.h
12
Driver.h
@@ -13,7 +13,9 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "Classes.h"
|
#include "Classes.h"
|
||||||
#include "dumb3d.h"
|
#include "dumb3d.h"
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <string>
|
||||||
using namespace Math3D;
|
using namespace Math3D;
|
||||||
|
using namespace Mtable;
|
||||||
|
|
||||||
enum TOrders
|
enum TOrders
|
||||||
{ // rozkazy dla AI
|
{ // rozkazy dla AI
|
||||||
@@ -178,7 +180,7 @@ class TController
|
|||||||
double fAccGravity; // przyspieszenie składowej stycznej grawitacji
|
double fAccGravity; // przyspieszenie składowej stycznej grawitacji
|
||||||
public:
|
public:
|
||||||
TEvent *eSignNext; // sygnał zmieniający prędkość, do pokazania na [F2]
|
TEvent *eSignNext; // sygnał zmieniający prędkość, do pokazania na [F2]
|
||||||
AnsiString asNextStop; // nazwa następnego punktu zatrzymania wg rozkładu
|
std::string asNextStop; // nazwa następnego punktu zatrzymania wg rozkładu
|
||||||
int iStationStart; // numer pierwszej stacji pokazywanej na podglądzie rozkładu
|
int iStationStart; // numer pierwszej stacji pokazywanej na podglądzie rozkładu
|
||||||
private: // parametry sterowania pojazdem (stan, hamowanie)
|
private: // parametry sterowania pojazdem (stan, hamowanie)
|
||||||
double fShuntVelocity; // maksymalna prędkość manewrowania, zależy m.in. od składu
|
double fShuntVelocity; // maksymalna prędkość manewrowania, zależy m.in. od składu
|
||||||
@@ -221,7 +223,7 @@ class TController
|
|||||||
pVehicles[2]; // skrajne pojazdy w składzie (niekoniecznie bezpośrednio sterowane)
|
pVehicles[2]; // skrajne pojazdy w składzie (niekoniecznie bezpośrednio sterowane)
|
||||||
TMoverParameters *mvControlling; // jakim pojazdem steruje (może silnikowym w EZT)
|
TMoverParameters *mvControlling; // jakim pojazdem steruje (może silnikowym w EZT)
|
||||||
TMoverParameters *mvOccupied; // jakim pojazdem hamuje
|
TMoverParameters *mvOccupied; // jakim pojazdem hamuje
|
||||||
Mtable::TTrainParameters *TrainParams; // rozkład jazdy zawsze jest, nawet jeśli pusty
|
TTrainParameters *TrainParams; // rozkład jazdy zawsze jest, nawet jeśli pusty
|
||||||
// int TrainNumber; //numer rozkladowy tego pociagu
|
// int TrainNumber; //numer rozkladowy tego pociagu
|
||||||
// AnsiString OrderCommand; //komenda pobierana z pojazdu
|
// AnsiString OrderCommand; //komenda pobierana z pojazdu
|
||||||
// double OrderValue; //argument komendy
|
// double OrderValue; //argument komendy
|
||||||
@@ -378,10 +380,10 @@ class TController
|
|||||||
void PhysicsLog();
|
void PhysicsLog();
|
||||||
AnsiString StopReasonText();
|
AnsiString StopReasonText();
|
||||||
~TController();
|
~TController();
|
||||||
AnsiString NextStop();
|
std::string NextStop();
|
||||||
void TakeControl(bool yes);
|
void TakeControl(bool yes);
|
||||||
AnsiString Relation();
|
std::string Relation();
|
||||||
AnsiString TrainName();
|
std::string TrainName();
|
||||||
int StationCount();
|
int StationCount();
|
||||||
int StationIndex();
|
int StationIndex();
|
||||||
bool IsStop();
|
bool IsStop();
|
||||||
|
|||||||
26
EU07.bpr
26
EU07.bpr
@@ -3,15 +3,15 @@
|
|||||||
<PROJECT>
|
<PROJECT>
|
||||||
<MACROS>
|
<MACROS>
|
||||||
<VERSION value="BCB.05.03"/>
|
<VERSION value="BCB.05.03"/>
|
||||||
<PROJECT value="EU07.exe"/>
|
<PROJECT value="E:\Gry\MaSzyna_15_04\EU07.exe"/>
|
||||||
<OBJFILES value="QueryParserComp.obj McZapkie\mtable.obj McZapkie\_mover.obj
|
<OBJFILES value="QueryParserComp.obj McZapkie\_mover.obj McZapkie\hamulce.obj
|
||||||
McZapkie\hamulce.obj McZapkie\Oerlikon_ESt.obj EU07.obj dumb3d.obj
|
McZapkie\Oerlikon_ESt.obj EU07.obj dumb3d.obj Camera.obj Texture.obj
|
||||||
Camera.obj Texture.obj World.obj Model3d.obj MdlMngr.obj Train.obj
|
World.obj Model3d.obj MdlMngr.obj Train.obj wavread.obj Timer.obj
|
||||||
wavread.obj Timer.obj Event.obj MemCell.obj Logs.obj Spring.obj Button.obj
|
Event.obj MemCell.obj Logs.obj Spring.obj Button.obj Globals.obj Gauge.obj
|
||||||
Globals.obj Gauge.obj AnimModel.obj Ground.obj TrkFoll.obj Segment.obj
|
AnimModel.obj Ground.obj TrkFoll.obj Segment.obj Sound.obj AdvSound.obj
|
||||||
Sound.obj AdvSound.obj Track.obj DynObj.obj RealSound.obj EvLaunch.obj
|
Track.obj DynObj.obj RealSound.obj EvLaunch.obj FadeSound.obj Traction.obj
|
||||||
FadeSound.obj Traction.obj TractionPower.obj parser.obj sky.obj
|
TractionPower.obj parser.obj sky.obj AirCoupler.obj opengl\glew.obj
|
||||||
AirCoupler.obj opengl\glew.obj ResourceManager.obj VBO.obj TextureDDS.obj
|
ResourceManager.obj VBO.obj mtable.obj TextureDDS.obj
|
||||||
opengl\ARB_Multisample.obj Float3d.obj Classes.obj Driver.obj Names.obj
|
opengl\ARB_Multisample.obj Float3d.obj Classes.obj Driver.obj Names.obj
|
||||||
Console.obj Mover.obj Console\PoKeys55.obj Forth.obj Console\LPT.obj
|
Console.obj Mover.obj Console\PoKeys55.obj Forth.obj Console\LPT.obj
|
||||||
PyInt.obj"/>
|
PyInt.obj"/>
|
||||||
@@ -84,7 +84,7 @@ Comments=
|
|||||||
[Excluded Packages]
|
[Excluded Packages]
|
||||||
$(BCB)\Bin\bcbsmp50.bpl=Borland C++ Sample Components
|
$(BCB)\Bin\bcbsmp50.bpl=Borland C++ Sample Components
|
||||||
$(BCB)\Bin\dclqrt50.bpl=QuickReport Components
|
$(BCB)\Bin\dclqrt50.bpl=QuickReport Components
|
||||||
C:\WINDOWS\system32\ibsmp50.bpl=Borland C++ InterBase Alerter Component
|
C:\Windows\system32\ibsmp50.bpl=Borland C++ InterBase Alerter Component
|
||||||
$(BCB)\Bin\dcltee50.bpl=TeeChart 5.0 Components
|
$(BCB)\Bin\dcltee50.bpl=TeeChart 5.0 Components
|
||||||
$(BCB)\Bin\applet50.bpl=Borland Control Panel Applet Package
|
$(BCB)\Bin\applet50.bpl=Borland Control Panel Applet Package
|
||||||
|
|
||||||
@@ -116,8 +116,8 @@ Item7=_DEBUG
|
|||||||
|
|
||||||
[HistoryLists\hlFinalOutputDir]
|
[HistoryLists\hlFinalOutputDir]
|
||||||
Count=5
|
Count=5
|
||||||
Item0=D:\Maszyna
|
Item0=E:\Gry\MaSzyna_15_04\
|
||||||
Item1=E:\Gry\MaSzyna_15_04\
|
Item1=D:\Maszyna
|
||||||
Item2=E:\Gry\MaSzyna_15_04
|
Item2=E:\Gry\MaSzyna_15_04
|
||||||
Item3=D:\EU07\
|
Item3=D:\EU07\
|
||||||
Item4=E:\EU07\
|
Item4=E:\EU07\
|
||||||
@@ -126,7 +126,7 @@ Item4=E:\EU07\
|
|||||||
DebugSourceDirs=McZapkie\
|
DebugSourceDirs=McZapkie\
|
||||||
|
|
||||||
[Parameters]
|
[Parameters]
|
||||||
RunParams=-s $.scn -v EN57AKL-1ra
|
RunParams=-s td.scn -v EP07-424
|
||||||
HostApplication=
|
HostApplication=
|
||||||
RemoteHost=
|
RemoteHost=
|
||||||
RemotePath=
|
RemotePath=
|
||||||
|
|||||||
2
EU07.cpp
2
EU07.cpp
@@ -71,7 +71,7 @@ USEUNIT("AirCoupler.cpp");
|
|||||||
USEUNIT("opengl\glew.c");
|
USEUNIT("opengl\glew.c");
|
||||||
USEUNIT("ResourceManager.cpp");
|
USEUNIT("ResourceManager.cpp");
|
||||||
USEUNIT("VBO.cpp");
|
USEUNIT("VBO.cpp");
|
||||||
USEUNIT("McZapkie\mtable.pas");
|
USEUNIT("mtable.cpp");
|
||||||
USEUNIT("TextureDDS.cpp");
|
USEUNIT("TextureDDS.cpp");
|
||||||
USEUNIT("opengl\ARB_Multisample.cpp");
|
USEUNIT("opengl\ARB_Multisample.cpp");
|
||||||
USEUNIT("Float3d.cpp");
|
USEUNIT("Float3d.cpp");
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "system.hpp"
|
#include "system.hpp"
|
||||||
#pragma hdrstop
|
#pragma hdrstop
|
||||||
|
|
||||||
#include "mtable.hpp"
|
#include "mtable.h"
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
#include "EvLaunch.h"
|
#include "EvLaunch.h"
|
||||||
@@ -27,6 +27,8 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
#include "Console.h"
|
#include "Console.h"
|
||||||
|
|
||||||
|
using namespace Mtable;
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
TEventLauncher::TEventLauncher()
|
TEventLauncher::TEventLauncher()
|
||||||
|
|||||||
@@ -919,4 +919,12 @@ double Global::CutValueToRange(double min, double value, double max)
|
|||||||
return value;
|
return value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
std::string Global::to_string(int _Val)
|
||||||
|
{
|
||||||
|
std::string str;
|
||||||
|
int num = 3;
|
||||||
|
sprintf((char*)str.c_str(), "%d", _Val);
|
||||||
|
return str;
|
||||||
|
};
|
||||||
|
|
||||||
#pragma package(smart_init)
|
#pragma package(smart_init)
|
||||||
|
|||||||
@@ -324,6 +324,7 @@ class Global
|
|||||||
static AnsiString Bezogonkow(AnsiString str, bool _ = false);
|
static AnsiString Bezogonkow(AnsiString str, bool _ = false);
|
||||||
static double Min0RSpeed(double vel1, double vel2);
|
static double Min0RSpeed(double vel1, double vel2);
|
||||||
static double CutValueToRange(double min, double value, double max);
|
static double CutValueToRange(double min, double value, double max);
|
||||||
|
static std::string to_string(int _Val);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "RealSound.h"
|
#include "RealSound.h"
|
||||||
#include "AnimModel.h"
|
#include "AnimModel.h"
|
||||||
#include "MemCell.h"
|
#include "MemCell.h"
|
||||||
#include "mtable.hpp"
|
#include "mtable.h"
|
||||||
#include "DynObj.h"
|
#include "DynObj.h"
|
||||||
#include "Data.h"
|
#include "Data.h"
|
||||||
#include "parser.h" //Tolaris-010603
|
#include "parser.h" //Tolaris-010603
|
||||||
@@ -4179,7 +4179,7 @@ bool TGround::CheckQuery()
|
|||||||
if (tmpEvent->Activator->Mechanik->Primary())
|
if (tmpEvent->Activator->Mechanik->Primary())
|
||||||
{ // tylko jeœli ktoœ tam siedzi - nie powinno dotyczyæ pasa¿era!
|
{ // tylko jeœli ktoœ tam siedzi - nie powinno dotyczyæ pasa¿era!
|
||||||
tmpEvent->Params[9].asMemCell->UpdateValues(
|
tmpEvent->Params[9].asMemCell->UpdateValues(
|
||||||
tmpEvent->Activator->Mechanik->TrainName().c_str(),
|
const_cast<char *>(tmpEvent->Activator->Mechanik->TrainName().c_str()),
|
||||||
tmpEvent->Activator->Mechanik->StationCount() -
|
tmpEvent->Activator->Mechanik->StationCount() -
|
||||||
tmpEvent->Activator->Mechanik
|
tmpEvent->Activator->Mechanik
|
||||||
->StationIndex(), // ile przystanków do koñca
|
->StationIndex(), // ile przystanków do koñca
|
||||||
|
|||||||
5
Logs.cpp
5
Logs.cpp
@@ -105,6 +105,11 @@ void WriteLog(const AnsiString &str, bool newline)
|
|||||||
WriteLog(str.c_str(), newline);
|
WriteLog(str.c_str(), newline);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void WriteLog(const std::string &str, bool newline)
|
||||||
|
{ // Ra: wersja z AnsiString jest zamienna z Error()
|
||||||
|
WriteLog(str.c_str(), newline);
|
||||||
|
};
|
||||||
|
|
||||||
void CommLog(const char *str)
|
void CommLog(const char *str)
|
||||||
{ // Ra: warunkowa rejestracja komunikatów
|
{ // Ra: warunkowa rejestracja komunikatów
|
||||||
WriteLog(str);
|
WriteLog(str);
|
||||||
|
|||||||
2
Logs.h
2
Logs.h
@@ -10,6 +10,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#ifndef LogsH
|
#ifndef LogsH
|
||||||
#define LogsH
|
#define LogsH
|
||||||
#include <system.hpp>
|
#include <system.hpp>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
void WriteConsoleOnly(const char *str, double value);
|
void WriteConsoleOnly(const char *str, double value);
|
||||||
void WriteConsoleOnly(const char *str, bool newline = true);
|
void WriteConsoleOnly(const char *str, bool newline = true);
|
||||||
@@ -18,6 +19,7 @@ void WriteLog(const char *str, bool newline = true);
|
|||||||
void Error(const AnsiString &asMessage, bool box = true);
|
void Error(const AnsiString &asMessage, bool box = true);
|
||||||
void ErrorLog(const AnsiString &asMessage);
|
void ErrorLog(const AnsiString &asMessage);
|
||||||
void WriteLog(const AnsiString &str, bool newline = true);
|
void WriteLog(const AnsiString &str, bool newline = true);
|
||||||
|
void WriteLog(const std::string &str, bool newline = true);
|
||||||
void CommLog(const char *str);
|
void CommLog(const char *str);
|
||||||
void CommLog(const AnsiString &str);
|
void CommLog(const AnsiString &str);
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -22,10 +22,12 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "logs.h"
|
#include "logs.h"
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
#include "mtable.hpp"
|
#include "mtable.h"
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#pragma package(smart_init)
|
#pragma package(smart_init)
|
||||||
|
|
||||||
|
using namespace Mtable;
|
||||||
|
|
||||||
double TSubModel::fSquareDist = 0;
|
double TSubModel::fSquareDist = 0;
|
||||||
int TSubModel::iInstance; // numer renderowanego egzemplarza obiektu
|
int TSubModel::iInstance; // numer renderowanego egzemplarza obiektu
|
||||||
GLuint *TSubModel::ReplacableSkinId = NULL;
|
GLuint *TSubModel::ReplacableSkinId = NULL;
|
||||||
|
|||||||
2
Train.h
2
Train.h
@@ -17,7 +17,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "Gauge.h"
|
#include "Gauge.h"
|
||||||
#include "Button.h"
|
#include "Button.h"
|
||||||
#include "DynObj.h"
|
#include "DynObj.h"
|
||||||
#include "mtable.hpp"
|
#include "mtable.h"
|
||||||
|
|
||||||
#include "Sound.h"
|
#include "Sound.h"
|
||||||
#include "AdvSound.h"
|
#include "AdvSound.h"
|
||||||
|
|||||||
14
World.cpp
14
World.cpp
@@ -20,7 +20,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#pragma hdrstop
|
#pragma hdrstop
|
||||||
|
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
#include "mtable.hpp"
|
#include "mtable.h"
|
||||||
#include "Sound.h"
|
#include "Sound.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "Logs.h"
|
#include "Logs.h"
|
||||||
@@ -1891,11 +1891,11 @@ bool TWorld::Update()
|
|||||||
if (Controlled)
|
if (Controlled)
|
||||||
if (Controlled->Mechanik)
|
if (Controlled->Mechanik)
|
||||||
{
|
{
|
||||||
OutText2 = Controlled->Mechanik->Relation();
|
OutText2 = Controlled->Mechanik->Relation().c_str();
|
||||||
if (!OutText2.IsEmpty()) // jeœli jest podana relacja, to dodajemy punkt nastêpnego
|
if (!OutText2.IsEmpty()) // jeœli jest podana relacja, to dodajemy punkt nastêpnego
|
||||||
// zatrzymania
|
// zatrzymania
|
||||||
OutText2 =
|
OutText2 =
|
||||||
Global::Bezogonkow(OutText2 + ": -> " + Controlled->Mechanik->NextStop(),
|
Global::Bezogonkow(OutText2 + ": -> " + Controlled->Mechanik->NextStop().c_str(),
|
||||||
true); // dopisanie punktu zatrzymania
|
true); // dopisanie punktu zatrzymania
|
||||||
}
|
}
|
||||||
// double CtrlPos=mvControlled->MainCtrlPos;
|
// double CtrlPos=mvControlled->MainCtrlPos;
|
||||||
@@ -2502,8 +2502,8 @@ bool TWorld::Update()
|
|||||||
glColor3f(1.0f, 1.0f, 1.0f); // a, damy bia³ym
|
glColor3f(1.0f, 1.0f, 1.0f); // a, damy bia³ym
|
||||||
// glTranslatef(0.0f,0.0f,-0.50f);
|
// glTranslatef(0.0f,0.0f,-0.50f);
|
||||||
glRasterPos2f(-0.25f, 0.20f);
|
glRasterPos2f(-0.25f, 0.20f);
|
||||||
OutText1 = tmp->Mechanik->Relation() + " (" +
|
OutText1 = AnsiString(tmp->Mechanik->Relation().c_str()) + " (" +
|
||||||
tmp->Mechanik->Timetable()->TrainName + ")";
|
tmp->Mechanik->Timetable()->TrainName.c_str() + ")";
|
||||||
glPrint(Global::Bezogonkow(OutText1, true).c_str());
|
glPrint(Global::Bezogonkow(OutText1, true).c_str());
|
||||||
glRasterPos2f(-0.25f, 0.19f);
|
glRasterPos2f(-0.25f, 0.19f);
|
||||||
// glPrint("|============================|=======|=======|=====|");
|
// glPrint("|============================|=======|=======|=====|");
|
||||||
@@ -2514,7 +2514,7 @@ bool TWorld::Update()
|
|||||||
for (int i = tmp->Mechanik->iStationStart; i <= tt->StationCount; ++i)
|
for (int i = tmp->Mechanik->iStationStart; i <= tt->StationCount; ++i)
|
||||||
{ // wyœwietlenie pozycji z rozk³adu
|
{ // wyœwietlenie pozycji z rozk³adu
|
||||||
t = tt->TimeTable + i; // linijka rozk³adu
|
t = tt->TimeTable + i; // linijka rozk³adu
|
||||||
OutText1 = AnsiString(AnsiString(t->StationName) +
|
OutText1 = AnsiString(AnsiString(t->StationName.c_str()) +
|
||||||
" ").SubString(1, 26);
|
" ").SubString(1, 26);
|
||||||
OutText2 = (t->Ah >= 0) ?
|
OutText2 = (t->Ah >= 0) ?
|
||||||
AnsiString(int(100 + t->Ah)).SubString(2, 2) + ":" +
|
AnsiString(int(100 + t->Ah)).SubString(2, 2) + ":" +
|
||||||
@@ -2529,7 +2529,7 @@ bool TWorld::Update()
|
|||||||
3); // z wyrównaniem do prawej
|
3); // z wyrównaniem do prawej
|
||||||
// if (AnsiString(t->StationWare).Pos("@"))
|
// if (AnsiString(t->StationWare).Pos("@"))
|
||||||
OutText1 = "| " + OutText1 + " | " + OutText2 + " | " + OutText3 +
|
OutText1 = "| " + OutText1 + " | " + OutText2 + " | " + OutText3 +
|
||||||
" | " + OutText4 + " | " + AnsiString(t->StationWare);
|
" | " + OutText4 + " | " + AnsiString(t->StationWare.c_str());
|
||||||
glRasterPos2f(-0.25f,
|
glRasterPos2f(-0.25f,
|
||||||
0.18f - 0.02f * (i - tmp->Mechanik->iStationStart));
|
0.18f - 0.02f * (i - tmp->Mechanik->iStationStart));
|
||||||
if ((tmp->Mechanik->iStationStart < tt->StationIndex) ?
|
if ((tmp->Mechanik->iStationStart < tt->StationIndex) ?
|
||||||
|
|||||||
537
mtable.cpp
Normal file
537
mtable.cpp
Normal file
@@ -0,0 +1,537 @@
|
|||||||
|
/** @file
|
||||||
|
@brief
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
This Source Code Form is subject to the
|
||||||
|
terms of the Mozilla Public License, v.
|
||||||
|
2.0. If a copy of the MPL was not
|
||||||
|
distributed with this file, You can
|
||||||
|
obtain one at
|
||||||
|
http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mtable.h"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
using namespace Mtable;
|
||||||
|
|
||||||
|
double CompareTime(double t1h, double t1m, double t2h, double t2m) /*roznica czasu w minutach*/
|
||||||
|
// zwraca ró¿nicê czasu
|
||||||
|
// jeœli pierwsza jest aktualna, a druga rozk³adowa, to ujemna oznacza opó¿nienie
|
||||||
|
// na d³u¿sz¹ metê trzeba uwzglêdniæ datê, jakby opó¿nienia mia³y przekraczaæ 12h (towarowych)
|
||||||
|
{
|
||||||
|
double t;
|
||||||
|
|
||||||
|
if ((t2h < 0))
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
t = (t2h - t1h) * 60 + t2m - t1m; // jeœli t2=00:05, a t1=23:50, to ró¿nica wyjdzie ujemna
|
||||||
|
if ((t < -720)) // jeœli ró¿nica przekracza 12h na minus
|
||||||
|
t = t + 1440; // to dodanie doby minut;else
|
||||||
|
if ((t > 720)) // jeœli przekracza 12h na plus
|
||||||
|
t = t - 1440; // to odjêcie doby minut
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double TTrainParameters::CheckTrainLatency()
|
||||||
|
{
|
||||||
|
if ((LastStationLatency > 1.0) || (LastStationLatency < -1.0))
|
||||||
|
return LastStationLatency; /*spoznienie + lub do przodu - z tolerancja 1 min*/
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
double TTrainParameters::WatchMTable(double DistCounter)
|
||||||
|
{ //zwraca odlegloϾ do najblizszej stacji z zatrzymaniem
|
||||||
|
double dist;
|
||||||
|
|
||||||
|
if (Direction == 1)
|
||||||
|
dist = TimeTable[StationIndex].km - TimeTable[0].km - DistCounter;
|
||||||
|
else
|
||||||
|
dist = TimeTable[0].km - TimeTable[StationIndex].km - DistCounter;
|
||||||
|
return dist;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string TTrainParameters::NextStop()
|
||||||
|
{ // pobranie nazwy nastêpnego miejsca zatrzymania
|
||||||
|
if (StationIndex <= StationCount)
|
||||||
|
return "PassengerStopPoint:" + NextStationName; // nazwa nastêpnego przystanku;
|
||||||
|
else
|
||||||
|
return "[End of route]"; //¿e niby koniec
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TTrainParameters::IsStop()
|
||||||
|
{ // zapytanie, czy zatrzymywaæ na nastêpnym punkcie rozk³adu
|
||||||
|
if ((StationIndex < StationCount))
|
||||||
|
return TimeTable[StationIndex].Ah >= 0; //-1 to brak postoju
|
||||||
|
else
|
||||||
|
return true; // na ostatnim siê zatrzymaæ zawsze
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TTrainParameters::UpdateMTable(double hh, double mm, std::string NewName)
|
||||||
|
/*odfajkowanie dojechania do stacji (NewName) i przeliczenie opóŸnienia*/
|
||||||
|
{
|
||||||
|
bool OK;
|
||||||
|
OK = false;
|
||||||
|
if (StationIndex <= StationCount) // Ra: "<=", bo ostatni przystanek jest traktowany wyj¹tkowo
|
||||||
|
{
|
||||||
|
if (NewName == NextStationName) // jeœli dojechane do nastêpnego
|
||||||
|
{ // Ra: wywo³anie mo¿e byæ powtarzane, jak stoi na W4
|
||||||
|
if (TimeTable[StationIndex + 1].km - TimeTable[StationIndex].km < 0) // to jest bez sensu
|
||||||
|
Direction = -1;
|
||||||
|
else
|
||||||
|
Direction = 1; // prowizorka bo moze byc zmiana kilometrazu
|
||||||
|
// ustalenie, czy opóŸniony (porównanie z czasem odjazdu)
|
||||||
|
LastStationLatency =
|
||||||
|
CompareTime(hh, mm, TimeTable[StationIndex].Dh, TimeTable[StationIndex].Dm);
|
||||||
|
// inc(StationIndex); //przejœcie do nastêpnej pozycji StationIndex<=StationCount
|
||||||
|
if (StationIndex <
|
||||||
|
StationCount) // Ra: "<", bo dodaje 1 przy przejœciu do nastêpnej stacji
|
||||||
|
{ // jeœli nie ostatnia stacja
|
||||||
|
NextStationName = TimeTable[StationIndex + 1].StationName; // zapamiêtanie nazwy
|
||||||
|
TTVmax = TimeTable[StationIndex + 1]
|
||||||
|
.vmax; // Ra: nowa prêdkoœæ rozk³adowa na kolejnym odcinku
|
||||||
|
}
|
||||||
|
else // gdy ostatnia stacja
|
||||||
|
NextStationName = ""; // nie ma nastêpnej stacji
|
||||||
|
OK = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return OK; /*czy jest nastepna stacja*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void TTrainParameters::StationIndexInc()
|
||||||
|
{ // przejœcie do nastêpnej pozycji StationIndex<=StationCount
|
||||||
|
++StationIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TTrainParameters::IsTimeToGo(double hh, double mm)
|
||||||
|
// sprawdzenie, czy mo¿na ju¿ odjechaæ z aktualnego zatrzymania
|
||||||
|
// StationIndex to numer nastêpnego po dodarciu do aktualnego
|
||||||
|
{
|
||||||
|
if ((StationIndex < 1))
|
||||||
|
return true; // przed pierwsz¹ jechaæ
|
||||||
|
else if ((StationIndex < StationCount))
|
||||||
|
{ // oprócz ostatniego przystanku
|
||||||
|
if ((TimeTable[StationIndex].Ah < 0)) // odjazd z poprzedniego
|
||||||
|
return true; // czas przyjazdu nie by³ podany - przelot
|
||||||
|
else
|
||||||
|
return CompareTime(hh, mm, TimeTable[StationIndex].Dh, TimeTable[StationIndex].Dm) <= 0;
|
||||||
|
}
|
||||||
|
else // gdy rozk³ad siê skoñczy³
|
||||||
|
return false; // dalej nie jechaæ
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string TTrainParameters::ShowRelation()
|
||||||
|
/*zwraca informacjê o relacji*/
|
||||||
|
{
|
||||||
|
// if (Relation1=TimeTable[1].StationName) and (Relation2=TimeTable[StationCount].StationName)
|
||||||
|
if ((Relation1 != "") && (Relation2 != ""))
|
||||||
|
return Relation1 + " - " + Relation2;
|
||||||
|
else
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
TTrainParameters::TTrainParameters(std::string NewTrainName)
|
||||||
|
/*wstêpne ustawienie parametrów rozk³adu jazdy*/
|
||||||
|
{
|
||||||
|
NewName(NewTrainName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TTrainParameters::NewName(std::string NewTrainName)
|
||||||
|
/*wstêpne ustawienie parametrów rozk³adu jazdy*/
|
||||||
|
{
|
||||||
|
TrainName = NewTrainName;
|
||||||
|
StationCount = 0;
|
||||||
|
StationIndex = 0;
|
||||||
|
NextStationName = "nowhere";
|
||||||
|
LastStationLatency = 0;
|
||||||
|
Direction = 1;
|
||||||
|
Relation1 = "";
|
||||||
|
Relation2 = "";
|
||||||
|
for (int i = 0; i < MaxTTableSize + 1; ++i)
|
||||||
|
{
|
||||||
|
TMTableLine *t = &TimeTable[i];
|
||||||
|
t->km = 0;
|
||||||
|
t->vmax = -1;
|
||||||
|
t->StationName = "nowhere";
|
||||||
|
t->StationWare = "";
|
||||||
|
t->TrackNo = 1;
|
||||||
|
t->Ah = -1;
|
||||||
|
t->Am = -1;
|
||||||
|
t->Dh = -1;
|
||||||
|
t->Dm = -1;
|
||||||
|
t->tm = 0;
|
||||||
|
t->WaitTime = 0;
|
||||||
|
}
|
||||||
|
TTVmax = 100; /*wykasowac*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void TTrainParameters::UpdateVelocity(int StationCount, double vActual)
|
||||||
|
// zapisywanie prêdkoœci maksymalnej do wczeœniejszych odcinków
|
||||||
|
// wywo³ywane z numerem ostatniego przetworzonego przystanku
|
||||||
|
{
|
||||||
|
int i = StationCount;
|
||||||
|
// TTVmax:=vActual; {PROWIZORKA!!!}
|
||||||
|
while ((i >= 0) && (TimeTable[i].vmax == -1))
|
||||||
|
{
|
||||||
|
TimeTable[i].vmax = vActual; // prêdkoœæ dojazdu do przystanku i
|
||||||
|
--i; // ewentualnie do poprzedniego te¿
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
||||||
|
//{
|
||||||
|
// return false;
|
||||||
|
//}
|
||||||
|
|
||||||
|
bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
||||||
|
// wczytanie pliku-tabeli z rozk³adem przesuniêtym o (fPlus); (vMax) nie ma znaczenia
|
||||||
|
{
|
||||||
|
std::string lines;
|
||||||
|
std::string s;
|
||||||
|
std::ifstream fin;
|
||||||
|
bool EndTable;
|
||||||
|
double vActual;
|
||||||
|
int i;
|
||||||
|
int time; // do zwiêkszania czasu
|
||||||
|
|
||||||
|
int ConversionError = 0;
|
||||||
|
EndTable = false;
|
||||||
|
if ((TrainName == ""))
|
||||||
|
{ // jeœli pusty rozk³ad
|
||||||
|
// UpdateVelocity(StationCount,vMax); //ograniczenie do prêdkoœci startowej
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ConversionError = 666;
|
||||||
|
vActual = -1;
|
||||||
|
s = scnpath + TrainName + ".txt";
|
||||||
|
// Ra 2014-09: ustaliæ zasady wyznaczenia pierwotnego pliku przy przesuniêtych rozk³adach
|
||||||
|
// (kolejny poci¹g dostaje numer +2)
|
||||||
|
fin.open(s.c_str()); //otwieranie pliku
|
||||||
|
|
||||||
|
if (!fin.is_open())
|
||||||
|
{ //jeœli nie ma pliku
|
||||||
|
vmax = atoi(TrainName.c_str()); // nie ma pliku ale jest liczba
|
||||||
|
if ((vmax > 10) && (vmax < 200))
|
||||||
|
{
|
||||||
|
TTVmax = vmax; // Ra 2014-07: zamiast rozk³adu mo¿na podaæ Vmax
|
||||||
|
UpdateVelocity(StationCount, vmax); // ograniczenie do prêdkoœci startowej
|
||||||
|
ConversionError = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ConversionError = -8; /*Ra: ten b³¹d jest niepotrzebny*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ /*analiza rozk³adu jazdy*/
|
||||||
|
ConversionError = 0;
|
||||||
|
while (!(fin.bad() || (ConversionError != 0) || EndTable))
|
||||||
|
{
|
||||||
|
std::getline(fin,lines); /*wczytanie linii*/
|
||||||
|
if (lines.find("___________________") != std::string::npos) /*linia pozioma górna*/
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
if (s == "[") /*lewy pion*/
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
if (s == "Rodzaj") /*"Rodzaj i numer pociagu"*/
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
} while (!(s == "|") || (fin.eof())); /*œrodkowy pion*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fin >> s; /*nazwa poci¹gu*/
|
||||||
|
// if LowerCase(s)<>ExtractFileName(TrainName) then {musi byæ taka sama, jak nazwa
|
||||||
|
// pliku}
|
||||||
|
// ConversionError:=-7 {b³¹d niezgodnoœci}
|
||||||
|
TrainName = s; // nadanie nazwy z pliku TXT (bez œcie¿ki do pliku)
|
||||||
|
// else
|
||||||
|
{ /*czytaj naglowek*/
|
||||||
|
while(fin >> s || !fin.bad())
|
||||||
|
{
|
||||||
|
if (s.find("_______|") != std::string::npos)
|
||||||
|
break;
|
||||||
|
//fin >> s;
|
||||||
|
} //while (!(s.find("_______|") != std::string::npos) || fin.eof());
|
||||||
|
while (fin >> s || !fin.bad())
|
||||||
|
{
|
||||||
|
if (s == "[")
|
||||||
|
break;
|
||||||
|
} //while (!() || (fin.eof())); /*pierwsza linia z relacj¹*/
|
||||||
|
while(fin >> s || !fin.bad())
|
||||||
|
{
|
||||||
|
if (s != "|")
|
||||||
|
break;
|
||||||
|
} //while (!(() || fin.eof()));
|
||||||
|
if (s != "|")
|
||||||
|
Relation1 = s;
|
||||||
|
else
|
||||||
|
ConversionError = -5;
|
||||||
|
while(fin >> s || !fin.bad())
|
||||||
|
{
|
||||||
|
if (s == "Relacja")
|
||||||
|
break;
|
||||||
|
} //while (
|
||||||
|
// !( || (fin.eof()))); /*druga linia z relacj¹*/
|
||||||
|
while (fin >> s || !fin.bad())
|
||||||
|
{
|
||||||
|
if (s == "|")
|
||||||
|
break;
|
||||||
|
} //while (!( || (fin.eof())));
|
||||||
|
fin >> Relation2;
|
||||||
|
while (fin >> s || !fin.bad())
|
||||||
|
{
|
||||||
|
if (s == "Wymagany")
|
||||||
|
break;
|
||||||
|
}// while (!();
|
||||||
|
while (fin >> s || !fin.bad())
|
||||||
|
{
|
||||||
|
if ((s == "|") || (s == "\n"))
|
||||||
|
break;
|
||||||
|
} //while (!());
|
||||||
|
fin >> s;
|
||||||
|
s = s.substr(0, s.find("%"));
|
||||||
|
BrakeRatio = atof(s.c_str());
|
||||||
|
while (fin >> s || fin.bad())
|
||||||
|
{
|
||||||
|
if (s == "Seria")
|
||||||
|
break;
|
||||||
|
} //while (!(s == "Seria"));
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
} while (!((s == "|") || (fin.bad())));
|
||||||
|
fin >> LocSeries;
|
||||||
|
fin >> LocLoad;// = s2rE(ReadWord(fin));
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
} while (!(s.find("[______________") != std::string::npos || fin.bad()));
|
||||||
|
while (!fin.bad() && !EndTable)
|
||||||
|
{
|
||||||
|
++StationCount;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
} while (!((s == "[") || (fin.bad())));
|
||||||
|
TMTableLine *record = &TimeTable[StationCount];
|
||||||
|
{
|
||||||
|
if (s == "[")
|
||||||
|
fin >> s;
|
||||||
|
else
|
||||||
|
ConversionError = -4;
|
||||||
|
if (s.find("|") == std::string::npos)
|
||||||
|
{
|
||||||
|
record->km = atof(s.c_str());
|
||||||
|
fin >> s;
|
||||||
|
}
|
||||||
|
if (s.find("|_____|") != std::string::npos) /*zmiana predkosci szlakowej*/
|
||||||
|
UpdateVelocity(StationCount, vActual);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
if (s.find("|") == std::string::npos)
|
||||||
|
vActual = atof(s.c_str());
|
||||||
|
}
|
||||||
|
while (s.find("|") == std::string::npos)
|
||||||
|
fin >> s;
|
||||||
|
fin >> record->StationName;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
} while (!((s == "1") || (s == "2") || fin.bad()));
|
||||||
|
record->TrackNo = atoi(s.c_str());
|
||||||
|
fin >> s;
|
||||||
|
if (s != "|")
|
||||||
|
{
|
||||||
|
if (s.find(hrsd) != std::string::npos)
|
||||||
|
{
|
||||||
|
record->Ah = atoi(s.substr(0, s.find(hrsd)).c_str()); // godzina przyjazdu
|
||||||
|
record->Am = atoi(
|
||||||
|
s.substr(s.find(hrsd) + 1, s.length()).c_str()); // minuta przyjazdu
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
record->Ah = TimeTable[StationCount - 1]
|
||||||
|
.Ah; // godzina z poprzedniej pozycji
|
||||||
|
record->Am = atoi(s.c_str()); // bo tylko minuty podane
|
||||||
|
}
|
||||||
|
}
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
} while (!((s != "|") || (fin.bad())));
|
||||||
|
if (s != "]")
|
||||||
|
record->tm = atof(s.c_str());
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
} while (!((s == "[") || fin.bad()));
|
||||||
|
fin >> s;
|
||||||
|
if (s.find("|") == std::string::npos)
|
||||||
|
{
|
||||||
|
/*tu s moze byc miejscem zmiany predkosci szlakowej*/
|
||||||
|
fin >> s;
|
||||||
|
}
|
||||||
|
if (s.find("|_____|") != std::string::npos) /*zmiana predkosci szlakowej*/
|
||||||
|
UpdateVelocity(StationCount, vActual);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
if (s.find("|") == std::string::npos)
|
||||||
|
vActual = atof(s.c_str());
|
||||||
|
}
|
||||||
|
while (s.find("|") == std::string::npos)
|
||||||
|
fin >> s;
|
||||||
|
fin >> record->StationWare;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
} while (!((s == "1") || (s == "2") || fin.bad()));
|
||||||
|
record->TrackNo = atoi(s.c_str());
|
||||||
|
fin >> s;
|
||||||
|
if (s != "|")
|
||||||
|
{
|
||||||
|
if (s.find(hrsd) != std::string::npos)
|
||||||
|
{
|
||||||
|
record->Dh = atoi(s.substr(0, s.find(hrsd)).c_str()); // godzina odjazdu
|
||||||
|
record->Dm = atoi(
|
||||||
|
s.substr(s.find(hrsd) + 1, s.length()).c_str()); // minuta odjazdu
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
record->Dh = TimeTable[StationCount - 1]
|
||||||
|
.Dh; // godzina z poprzedniej pozycji
|
||||||
|
record->Dm = atoi(s.c_str()); // bo tylko minuty podane
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
record->Dh = record->Ah; // odjazd o tej samej, co przyjazd (dla ostatniego te¿)
|
||||||
|
record->Dm = record->Am; // bo s¹ u¿ywane do wyliczenia opóŸnienia po dojechaniu
|
||||||
|
}
|
||||||
|
if ((record->Ah >= 0))
|
||||||
|
record->WaitTime = (int)(CompareTime(record->Ah, record->Am, record->Dh, record->Dm) + 0.1);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
} while (!((s != "|") || (fin.bad())));
|
||||||
|
if (s != "]")
|
||||||
|
record->tm = atof(s.c_str());
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
} while (!((s.find("[") != std::string::npos) || fin.bad()));
|
||||||
|
if (s.find("_|_") == std::string::npos)
|
||||||
|
fin >> s;
|
||||||
|
if (s.find("|") == std::string::npos)
|
||||||
|
{
|
||||||
|
/*tu s moze byc miejscem zmiany predkosci szlakowej*/
|
||||||
|
fin >> s;
|
||||||
|
}
|
||||||
|
if (s.find("|_____|") != std::string::npos) /*zmiana predkosci szlakowej*/
|
||||||
|
UpdateVelocity(StationCount, vActual);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fin >> s;
|
||||||
|
if (s.find("|") == std::string::npos)
|
||||||
|
vActual = atof(s.c_str());
|
||||||
|
}
|
||||||
|
while (s.find("|") == std::string::npos)
|
||||||
|
fin >> s;
|
||||||
|
while ((s.find("]") == std::string::npos))
|
||||||
|
fin >> s;
|
||||||
|
if (s.find("_|_") != std::string::npos)
|
||||||
|
EndTable = true;
|
||||||
|
} /*timetableline*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /*while eof*/
|
||||||
|
fin.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ConversionError == 0)
|
||||||
|
{
|
||||||
|
if ((TimeTable[1].StationName == Relation1)) // jeœli nazwa pierwszego zgodna z relacj¹
|
||||||
|
if ((TimeTable[1].Ah < 0)) // a nie podany czas przyjazdu
|
||||||
|
{ // to mamy zatrzymanie na pierwszym, a nie przelot
|
||||||
|
TimeTable[1].Ah = TimeTable[1].Dh;
|
||||||
|
TimeTable[1].Am = TimeTable[1].Dm;
|
||||||
|
}
|
||||||
|
// NextStationName:=TimeTable[1].StationName;
|
||||||
|
/* TTVmax:=TimeTable[1].vmax; */
|
||||||
|
}
|
||||||
|
if ((iPlus != 0)) // je¿eli jest przesuniêcie rozk³adu
|
||||||
|
{
|
||||||
|
long i_end = StationCount + 1;
|
||||||
|
for (i = 1; i < i_end; ++i) // bez with, bo ciê¿ko siê przenosi na C++
|
||||||
|
{
|
||||||
|
if ((TimeTable[i].Ah >= 0))
|
||||||
|
{
|
||||||
|
time = iPlus + TimeTable[i].Ah * 60 + TimeTable[i].Am; // nowe minuty
|
||||||
|
TimeTable[i].Am = time % 60;
|
||||||
|
TimeTable[i].Ah = (time /*div*/ / 60) % 60;
|
||||||
|
}
|
||||||
|
if ((TimeTable[i].Dh >= 0))
|
||||||
|
{
|
||||||
|
time = iPlus + TimeTable[i].Dh * 60 + TimeTable[i].Dm; // nowe minuty
|
||||||
|
TimeTable[i].Dm = time % 60;
|
||||||
|
TimeTable[i].Dh = (time /*div*/ / 60) % 60;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return !(bool)ConversionError;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMTableTime::UpdateMTableTime(double deltaT)
|
||||||
|
// dodanie czasu (deltaT) w sekundach, z przeliczeniem godziny
|
||||||
|
{
|
||||||
|
mr = mr + deltaT; // dodawanie sekund
|
||||||
|
while (mr > 60.0) // przeliczenie sekund do w³aœciwego przedzia³u
|
||||||
|
{
|
||||||
|
mr = mr - 60.0;
|
||||||
|
++mm;
|
||||||
|
}
|
||||||
|
while (mm > 59) // przeliczenie minut do w³aœciwego przedzia³u
|
||||||
|
{
|
||||||
|
mm = mm - 60;
|
||||||
|
++hh;
|
||||||
|
}
|
||||||
|
while (hh > 23) // przeliczenie godzin do w³aœciwego przedzia³u
|
||||||
|
{
|
||||||
|
hh = hh - 24;
|
||||||
|
++dd; // zwiêkszenie numeru dnia
|
||||||
|
}
|
||||||
|
GameTime = GameTime + deltaT;
|
||||||
|
}
|
||||||
|
|
||||||
|
TMTableTime::TMTableTime(int InitH, int InitM, int InitSRH, int InitSRM, int InitSSH, int InitSSM)
|
||||||
|
{
|
||||||
|
GameTime = 0.0;
|
||||||
|
dd = 0;
|
||||||
|
hh = InitH;
|
||||||
|
mm = InitM;
|
||||||
|
srh = InitSRH;
|
||||||
|
srm = InitSRM;
|
||||||
|
ssh = InitSSH;
|
||||||
|
ssm = InitSSM;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TTrainParameters::DirectionChange()
|
||||||
|
// sprawdzenie, czy po zatrzymaniu wykonaæ kolejne komendy
|
||||||
|
{
|
||||||
|
if ((StationIndex > 0) && (StationIndex < StationCount)) // dla ostatniej stacji nie
|
||||||
|
if (TimeTable[StationIndex].StationWare.find("@") != std::string::npos)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
98
mtable.h
Normal file
98
mtable.h
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
This Source Code Form is subject to the
|
||||||
|
terms of the Mozilla Public License, v.
|
||||||
|
2.0. If a copy of the MPL was not
|
||||||
|
distributed with this file, You can
|
||||||
|
obtain one at
|
||||||
|
http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MTABLE_H
|
||||||
|
#define MTABLE_H
|
||||||
|
|
||||||
|
#include "McZapkie/mctools.hpp"
|
||||||
|
#include <string>
|
||||||
|
// using namespace std;
|
||||||
|
//#include "sysutils.h"
|
||||||
|
|
||||||
|
namespace Mtable
|
||||||
|
{
|
||||||
|
|
||||||
|
static int const MaxTTableSize = 100; // mo¿na by to robiæ dynamicznie
|
||||||
|
static char const *hrsd = ".";
|
||||||
|
|
||||||
|
// Ra: pozycja zerowa rozk³adu chyba nie ma sensu
|
||||||
|
// Ra: numeracja przystanków jest 1..StationCount
|
||||||
|
|
||||||
|
struct TMTableLine
|
||||||
|
{
|
||||||
|
double km; // kilometraz linii
|
||||||
|
double vmax; // predkosc rozkladowa przed przystankiem
|
||||||
|
// StationName:string[32]; //nazwa stacji ('_' zamiast spacji)
|
||||||
|
// StationWare:string[32]; //typ i wyposazenie stacji, oddz. przecinkami}
|
||||||
|
std::string StationName; // nazwa stacji ('_' zamiast spacji)
|
||||||
|
std::string StationWare; // typ i wyposazenie stacji, oddz. przecinkami}
|
||||||
|
int TrackNo; // ilosc torow szlakowych
|
||||||
|
int Ah;
|
||||||
|
int Am; // godz. i min. przyjazdu, -1 gdy bez postoju
|
||||||
|
int Dh;
|
||||||
|
int Dm; // godz. i min. odjazdu
|
||||||
|
double tm; // czas jazdy do tej stacji w min. (z kolumny)
|
||||||
|
int WaitTime; // czas postoju (liczony plus 6 sekund)
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef TMTableLine TMTable[MaxTTableSize + 1];
|
||||||
|
|
||||||
|
//typedef TTrainParameters *PTrainParameters;
|
||||||
|
|
||||||
|
class TTrainParameters
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::string TrainName;
|
||||||
|
double TTVmax;
|
||||||
|
std::string Relation1;
|
||||||
|
std::string Relation2; // nazwy stacji danego odcinka
|
||||||
|
double BrakeRatio;
|
||||||
|
std::string LocSeries; // seria (typ) pojazdu
|
||||||
|
double LocLoad;
|
||||||
|
TMTable TimeTable;
|
||||||
|
int StationCount; // iloœæ przystanków (0-techniczny)
|
||||||
|
int StationIndex; // numer najbli¿szego (aktualnego) przystanku
|
||||||
|
std::string NextStationName;
|
||||||
|
double LastStationLatency;
|
||||||
|
int Direction; /*kierunek jazdy w/g kilometrazu*/
|
||||||
|
double CheckTrainLatency();
|
||||||
|
/*todo: str hh:mm to int i z powrotem*/
|
||||||
|
std::string ShowRelation();
|
||||||
|
double WatchMTable(double DistCounter);
|
||||||
|
std::string NextStop();
|
||||||
|
bool IsStop();
|
||||||
|
bool IsTimeToGo(double hh, double mm);
|
||||||
|
bool UpdateMTable(double hh, double mm, std::string NewName);
|
||||||
|
TTrainParameters(std::string NewTrainName);
|
||||||
|
void NewName(std::string NewTrainName);
|
||||||
|
void UpdateVelocity(int StationCount, double vActual);
|
||||||
|
bool LoadTTfile(std::string scnpath, int iPlus, double vmax);
|
||||||
|
bool DirectionChange();
|
||||||
|
void StationIndexInc();
|
||||||
|
};
|
||||||
|
|
||||||
|
struct /*class*/ TMTableTime
|
||||||
|
|
||||||
|
{
|
||||||
|
double GameTime;
|
||||||
|
int dd;
|
||||||
|
int hh;
|
||||||
|
int mm;
|
||||||
|
int srh;
|
||||||
|
int srm; /*wschod slonca*/
|
||||||
|
int ssh;
|
||||||
|
int ssm; /*zachod slonca*/
|
||||||
|
double mr;
|
||||||
|
void UpdateMTableTime(double deltaT);
|
||||||
|
TMTableTime(int InitH, int InitM, int InitSRH, int InitSRM, int InitSSH, int InitSSM);
|
||||||
|
};
|
||||||
|
|
||||||
|
TMTableTime *GlobalTime;
|
||||||
|
}
|
||||||
|
#endif // MTABLE_H
|
||||||
Reference in New Issue
Block a user