mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-18 00:49: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
|
||||
|
||||
#include "Driver.h"
|
||||
#include <mtable.hpp>
|
||||
#include "mtable.h"
|
||||
#include "DynObj.h"
|
||||
#include <math.h>
|
||||
#include "Globals.h"
|
||||
@@ -810,7 +810,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
{ // o ile dana pozycja tabelki jest istotna
|
||||
if (sSpeedTable[i].iFlags & spPassengerStopPoint)
|
||||
{ // 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
|
||||
if (sSpeedTable[i].fDist < -fLength) // jeśli został przejechany
|
||||
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
|
||||
// już semafora)
|
||||
#if LOGSTOPS
|
||||
WriteLog(pVehicle->asName + " as " + TrainParams->TrainName + ": at " +
|
||||
WriteLog(pVehicle->asName + " as " + TrainParams->TrainName.c_str() + ": at " +
|
||||
AnsiString(GlobalTime->hh) + ":" + AnsiString(GlobalTime->mm) +
|
||||
" skipped " + asNextStop); // informacja
|
||||
" skipped " + AnsiString(asNextStop.c_str())); // informacja
|
||||
#endif
|
||||
fLastStopExpDist = mvOccupied->DistCounter + 0.250 +
|
||||
0.001 * fLength; // przy jakim dystansie (stanie
|
||||
@@ -838,7 +838,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
// następny postój
|
||||
TrainParams->UpdateMTable(
|
||||
GlobalTime->hh, GlobalTime->mm,
|
||||
asNextStop.SubString(20, asNextStop.Length()));
|
||||
asNextStop.substr(20, asNextStop.length()));
|
||||
TrainParams->StationIndexInc(); // przejście do następnej
|
||||
asNextStop =
|
||||
TrainParams->NextStop(); // pobranie kolejnego miejsca zatrzymania
|
||||
@@ -938,7 +938,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
}
|
||||
if (TrainParams->UpdateMTable(
|
||||
GlobalTime->hh, GlobalTime->mm,
|
||||
asNextStop.SubString(20, asNextStop.Length())))
|
||||
asNextStop.substr(20, asNextStop.length())))
|
||||
{ // to się wykona tylko raz po zatrzymaniu na W4
|
||||
if (TrainParams->CheckTrainLatency() < 0.0)
|
||||
iDrivigFlags |= moveLate; // odnotowano spóźnienie
|
||||
@@ -1000,10 +1000,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
->NextStop(); // pobranie kolejnego miejsca zatrzymania
|
||||
// TableClear(); //aby od nowa sprawdziło W4 z inną nazwą już - to nie jest dobry pomysł
|
||||
#if LOGSTOPS
|
||||
WriteLog(pVehicle->asName + " as " + TrainParams->TrainName +
|
||||
WriteLog(pVehicle->asName + " as " + AnsiString(TrainParams->TrainName.c_str()) +
|
||||
": at " + AnsiString(GlobalTime->hh) + ":" +
|
||||
AnsiString(GlobalTime->mm) + " next " +
|
||||
asNextStop); // informacja
|
||||
AnsiString(asNextStop.c_str())); // informacja
|
||||
#endif
|
||||
if (int(floor(sSpeedTable[i].evEvent->ValueGet(1))) & 1)
|
||||
iDrivigFlags |= moveStopHere; // nie podjeżdżać do semafora,
|
||||
@@ -1027,7 +1027,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
else
|
||||
{ // jeśli dojechaliśmy do końca rozkładu
|
||||
#if LOGSTOPS
|
||||
WriteLog(pVehicle->asName + " as " + TrainParams->TrainName +
|
||||
WriteLog(pVehicle->asName + " as " + AnsiString(TrainParams->TrainName.c_str()) +
|
||||
": at " + AnsiString(GlobalTime->hh) + ":" +
|
||||
AnsiString(GlobalTime->mm) +
|
||||
" end of route."); // informacja
|
||||
@@ -1875,7 +1875,7 @@ bool TController::CheckVehicles(TOrders user)
|
||||
{
|
||||
if (TrainParams)
|
||||
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
|
||||
p->RaLightsSet(0, 0); // gasimy światła
|
||||
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
|
||||
#endif
|
||||
if (!TrainParams)
|
||||
TrainParams = new TTrainParameters(NewCommand); // rozkład jazdy
|
||||
TrainParams = new TTrainParameters(std::string(NewCommand.c_str())); // rozkład jazdy
|
||||
else
|
||||
TrainParams->NewName(NewCommand); // czyści tabelkę przystanków
|
||||
TrainParams->NewName(std::string(NewCommand.c_str())); // czyści tabelkę przystanków
|
||||
delete tsGuardSignal;
|
||||
tsGuardSignal = NULL; // wywalenie kierownika
|
||||
if (NewCommand != "none")
|
||||
{
|
||||
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
|
||||
{
|
||||
if (ConversionError == -8)
|
||||
@@ -2980,7 +2980,7 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New
|
||||
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
|
||||
TDynamicObject *p = pVehicles[0];
|
||||
@@ -4903,7 +4903,7 @@ void TController::OrdersInit(double fVel)
|
||||
// OrderPos=OrderTop=0; //wypełniamy od pozycji 0
|
||||
OrdersClear(); // usunięcie poprzedniej tabeli
|
||||
OrderPush(Prepare_engine); // najpierw odpalenie silnika
|
||||
if (TrainParams->TrainName == AnsiString("none"))
|
||||
if (TrainParams->TrainName == "none")
|
||||
{ // brak rozkładu to jazda manewrowa
|
||||
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
|
||||
@@ -4913,8 +4913,7 @@ void TController::OrdersInit(double fVel)
|
||||
if ((fVel > 0.0) && (fVel < 0.02))
|
||||
OrderPush(Shunt); // dla prędkości 0.01 włączamy jazdę manewrową
|
||||
else if (TrainParams ?
|
||||
(TrainParams->TimeTable[1].StationWare.Pos(
|
||||
"@") ? // jeśli obrót na pierwszym przystanku
|
||||
(TrainParams->DirectionChange() ? // jeśli obrót na pierwszym przystanku
|
||||
((iDrivigFlags &
|
||||
movePushPull) ? // SZT również! SN61 zależnie od wagonów...
|
||||
(TrainParams->TimeTable[1].StationName == TrainParams->Relation1) :
|
||||
@@ -4933,10 +4932,10 @@ void TController::OrdersInit(double fVel)
|
||||
{
|
||||
t = TrainParams->TimeTable + i;
|
||||
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->Dm) + " " + AnsiString(t->StationWare));
|
||||
if (AnsiString(t->StationWare).Pos("@"))
|
||||
AnsiString((int)t->Dm) + " " + AnsiString(t->StationWare.c_str()));
|
||||
if (AnsiString(t->StationWare.c_str()).Pos("@"))
|
||||
{ // zmiana kierunku i dalsza jazda wg rozkładu
|
||||
if (iDrivigFlags & movePushPull) // SZT również! SN61 zależnie od wagonów...
|
||||
{ // jeśli skład zespolony, wystarczy zmienić kierunek jazdy
|
||||
@@ -5291,21 +5290,22 @@ TCommandType TController::BackwardScan()
|
||||
return cm_Unknown; // nic
|
||||
};
|
||||
|
||||
AnsiString TController::NextStop()
|
||||
std::string TController::NextStop()
|
||||
{ // 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
|
||||
// dodać godzinę odjazdu
|
||||
if (!TrainParams)
|
||||
return ""; // tu nie powinno nigdy wejść
|
||||
TMTableLine *t = TrainParams->TimeTable + TrainParams->StationIndex;
|
||||
std::string tmp = "";
|
||||
if (t->Dh >= 0) // jeśli jest godzina odjazdu
|
||||
return asNextStop.SubString(20, 30) + AnsiString(" ") + AnsiString(int(t->Dh)) +
|
||||
AnsiString(":") + AnsiString(int(100 + t->Dm)).SubString(2, 2); // odjazd
|
||||
return asNextStop.substr(20, 30) + " " + Global::to_string(t->Dh) +
|
||||
":" + Global::to_string(100 + t->Dm).substr(2, 2); // odjazd
|
||||
else if (t->Ah >= 0) // przyjazd
|
||||
return asNextStop.SubString(20, 30) + AnsiString(" (") + AnsiString(int(t->Ah)) +
|
||||
AnsiString(":") + AnsiString(int(100 + t->Am)).SubString(2, 2) +
|
||||
AnsiString(")"); // przyjazd
|
||||
return asNextStop.substr(20, 30) + " (" + Global::to_string(t->Ah) +
|
||||
":" + Global::to_string(100 + t->Am).substr(2, 2) +
|
||||
")"; // przyjazd
|
||||
return "";
|
||||
};
|
||||
|
||||
@@ -5382,12 +5382,12 @@ void TController::DirectionForward(bool forward)
|
||||
mvControlling->IncMainCtrl(1); //żeby nie zgasł
|
||||
};
|
||||
|
||||
AnsiString TController::Relation()
|
||||
std::string TController::Relation()
|
||||
{ // zwraca relację pociągu
|
||||
return TrainParams->ShowRelation();
|
||||
};
|
||||
|
||||
AnsiString TController::TrainName()
|
||||
std::string TController::TrainName()
|
||||
{ // zwraca numer pociągu
|
||||
return TrainParams->TrainName;
|
||||
};
|
||||
|
||||
12
Driver.h
12
Driver.h
@@ -13,7 +13,9 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "Classes.h"
|
||||
#include "dumb3d.h"
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
using namespace Math3D;
|
||||
using namespace Mtable;
|
||||
|
||||
enum TOrders
|
||||
{ // rozkazy dla AI
|
||||
@@ -178,7 +180,7 @@ class TController
|
||||
double fAccGravity; // przyspieszenie składowej stycznej grawitacji
|
||||
public:
|
||||
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
|
||||
private: // parametry sterowania pojazdem (stan, hamowanie)
|
||||
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)
|
||||
TMoverParameters *mvControlling; // jakim pojazdem steruje (może silnikowym w EZT)
|
||||
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
|
||||
// AnsiString OrderCommand; //komenda pobierana z pojazdu
|
||||
// double OrderValue; //argument komendy
|
||||
@@ -378,10 +380,10 @@ class TController
|
||||
void PhysicsLog();
|
||||
AnsiString StopReasonText();
|
||||
~TController();
|
||||
AnsiString NextStop();
|
||||
std::string NextStop();
|
||||
void TakeControl(bool yes);
|
||||
AnsiString Relation();
|
||||
AnsiString TrainName();
|
||||
std::string Relation();
|
||||
std::string TrainName();
|
||||
int StationCount();
|
||||
int StationIndex();
|
||||
bool IsStop();
|
||||
|
||||
26
EU07.bpr
26
EU07.bpr
@@ -3,15 +3,15 @@
|
||||
<PROJECT>
|
||||
<MACROS>
|
||||
<VERSION value="BCB.05.03"/>
|
||||
<PROJECT value="EU07.exe"/>
|
||||
<OBJFILES value="QueryParserComp.obj McZapkie\mtable.obj McZapkie\_mover.obj
|
||||
McZapkie\hamulce.obj McZapkie\Oerlikon_ESt.obj EU07.obj dumb3d.obj
|
||||
Camera.obj Texture.obj World.obj Model3d.obj MdlMngr.obj Train.obj
|
||||
wavread.obj Timer.obj Event.obj MemCell.obj Logs.obj Spring.obj Button.obj
|
||||
Globals.obj Gauge.obj AnimModel.obj Ground.obj TrkFoll.obj Segment.obj
|
||||
Sound.obj AdvSound.obj Track.obj DynObj.obj RealSound.obj EvLaunch.obj
|
||||
FadeSound.obj Traction.obj TractionPower.obj parser.obj sky.obj
|
||||
AirCoupler.obj opengl\glew.obj ResourceManager.obj VBO.obj TextureDDS.obj
|
||||
<PROJECT value="E:\Gry\MaSzyna_15_04\EU07.exe"/>
|
||||
<OBJFILES value="QueryParserComp.obj McZapkie\_mover.obj McZapkie\hamulce.obj
|
||||
McZapkie\Oerlikon_ESt.obj EU07.obj dumb3d.obj Camera.obj Texture.obj
|
||||
World.obj Model3d.obj MdlMngr.obj Train.obj wavread.obj Timer.obj
|
||||
Event.obj MemCell.obj Logs.obj Spring.obj Button.obj Globals.obj Gauge.obj
|
||||
AnimModel.obj Ground.obj TrkFoll.obj Segment.obj Sound.obj AdvSound.obj
|
||||
Track.obj DynObj.obj RealSound.obj EvLaunch.obj FadeSound.obj Traction.obj
|
||||
TractionPower.obj parser.obj sky.obj AirCoupler.obj opengl\glew.obj
|
||||
ResourceManager.obj VBO.obj mtable.obj TextureDDS.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
|
||||
PyInt.obj"/>
|
||||
@@ -84,7 +84,7 @@ Comments=
|
||||
[Excluded Packages]
|
||||
$(BCB)\Bin\bcbsmp50.bpl=Borland C++ Sample 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\applet50.bpl=Borland Control Panel Applet Package
|
||||
|
||||
@@ -116,8 +116,8 @@ Item7=_DEBUG
|
||||
|
||||
[HistoryLists\hlFinalOutputDir]
|
||||
Count=5
|
||||
Item0=D:\Maszyna
|
||||
Item1=E:\Gry\MaSzyna_15_04\
|
||||
Item0=E:\Gry\MaSzyna_15_04\
|
||||
Item1=D:\Maszyna
|
||||
Item2=E:\Gry\MaSzyna_15_04
|
||||
Item3=D:\EU07\
|
||||
Item4=E:\EU07\
|
||||
@@ -126,7 +126,7 @@ Item4=E:\EU07\
|
||||
DebugSourceDirs=McZapkie\
|
||||
|
||||
[Parameters]
|
||||
RunParams=-s $.scn -v EN57AKL-1ra
|
||||
RunParams=-s td.scn -v EP07-424
|
||||
HostApplication=
|
||||
RemoteHost=
|
||||
RemotePath=
|
||||
|
||||
2
EU07.cpp
2
EU07.cpp
@@ -71,7 +71,7 @@ USEUNIT("AirCoupler.cpp");
|
||||
USEUNIT("opengl\glew.c");
|
||||
USEUNIT("ResourceManager.cpp");
|
||||
USEUNIT("VBO.cpp");
|
||||
USEUNIT("McZapkie\mtable.pas");
|
||||
USEUNIT("mtable.cpp");
|
||||
USEUNIT("TextureDDS.cpp");
|
||||
USEUNIT("opengl\ARB_Multisample.cpp");
|
||||
USEUNIT("Float3d.cpp");
|
||||
|
||||
@@ -16,7 +16,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "system.hpp"
|
||||
#pragma hdrstop
|
||||
|
||||
#include "mtable.hpp"
|
||||
#include "mtable.h"
|
||||
#include "Timer.h"
|
||||
#include "Globals.h"
|
||||
#include "EvLaunch.h"
|
||||
@@ -27,6 +27,8 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "parser.h"
|
||||
#include "Console.h"
|
||||
|
||||
using namespace Mtable;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
TEventLauncher::TEventLauncher()
|
||||
|
||||
@@ -919,4 +919,12 @@ double Global::CutValueToRange(double min, double value, double max)
|
||||
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)
|
||||
|
||||
@@ -324,6 +324,7 @@ class Global
|
||||
static AnsiString Bezogonkow(AnsiString str, bool _ = false);
|
||||
static double Min0RSpeed(double vel1, double vel2);
|
||||
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 "AnimModel.h"
|
||||
#include "MemCell.h"
|
||||
#include "mtable.hpp"
|
||||
#include "mtable.h"
|
||||
#include "DynObj.h"
|
||||
#include "Data.h"
|
||||
#include "parser.h" //Tolaris-010603
|
||||
@@ -4179,7 +4179,7 @@ bool TGround::CheckQuery()
|
||||
if (tmpEvent->Activator->Mechanik->Primary())
|
||||
{ // tylko jeœli ktoœ tam siedzi - nie powinno dotyczyæ pasa¿era!
|
||||
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
|
||||
->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);
|
||||
};
|
||||
|
||||
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)
|
||||
{ // Ra: warunkowa rejestracja komunikatów
|
||||
WriteLog(str);
|
||||
|
||||
2
Logs.h
2
Logs.h
@@ -10,6 +10,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
#ifndef LogsH
|
||||
#define LogsH
|
||||
#include <system.hpp>
|
||||
#include <string>
|
||||
|
||||
void WriteConsoleOnly(const char *str, double value);
|
||||
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 ErrorLog(const AnsiString &asMessage);
|
||||
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 AnsiString &str);
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -22,10 +22,12 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "logs.h"
|
||||
#include "Globals.h"
|
||||
#include "Timer.h"
|
||||
#include "mtable.hpp"
|
||||
#include "mtable.h"
|
||||
//---------------------------------------------------------------------------
|
||||
#pragma package(smart_init)
|
||||
|
||||
using namespace Mtable;
|
||||
|
||||
double TSubModel::fSquareDist = 0;
|
||||
int TSubModel::iInstance; // numer renderowanego egzemplarza obiektu
|
||||
GLuint *TSubModel::ReplacableSkinId = NULL;
|
||||
|
||||
2
Train.h
2
Train.h
@@ -17,7 +17,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "Gauge.h"
|
||||
#include "Button.h"
|
||||
#include "DynObj.h"
|
||||
#include "mtable.hpp"
|
||||
#include "mtable.h"
|
||||
|
||||
#include "Sound.h"
|
||||
#include "AdvSound.h"
|
||||
|
||||
14
World.cpp
14
World.cpp
@@ -20,7 +20,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
#pragma hdrstop
|
||||
|
||||
#include "Timer.h"
|
||||
#include "mtable.hpp"
|
||||
#include "mtable.h"
|
||||
#include "Sound.h"
|
||||
#include "World.h"
|
||||
#include "Logs.h"
|
||||
@@ -1891,11 +1891,11 @@ bool TWorld::Update()
|
||||
if (Controlled)
|
||||
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
|
||||
// zatrzymania
|
||||
OutText2 =
|
||||
Global::Bezogonkow(OutText2 + ": -> " + Controlled->Mechanik->NextStop(),
|
||||
Global::Bezogonkow(OutText2 + ": -> " + Controlled->Mechanik->NextStop().c_str(),
|
||||
true); // dopisanie punktu zatrzymania
|
||||
}
|
||||
// double CtrlPos=mvControlled->MainCtrlPos;
|
||||
@@ -2502,8 +2502,8 @@ bool TWorld::Update()
|
||||
glColor3f(1.0f, 1.0f, 1.0f); // a, damy bia³ym
|
||||
// glTranslatef(0.0f,0.0f,-0.50f);
|
||||
glRasterPos2f(-0.25f, 0.20f);
|
||||
OutText1 = tmp->Mechanik->Relation() + " (" +
|
||||
tmp->Mechanik->Timetable()->TrainName + ")";
|
||||
OutText1 = AnsiString(tmp->Mechanik->Relation().c_str()) + " (" +
|
||||
tmp->Mechanik->Timetable()->TrainName.c_str() + ")";
|
||||
glPrint(Global::Bezogonkow(OutText1, true).c_str());
|
||||
glRasterPos2f(-0.25f, 0.19f);
|
||||
// glPrint("|============================|=======|=======|=====|");
|
||||
@@ -2514,7 +2514,7 @@ bool TWorld::Update()
|
||||
for (int i = tmp->Mechanik->iStationStart; i <= tt->StationCount; ++i)
|
||||
{ // wyœwietlenie pozycji z rozk³adu
|
||||
t = tt->TimeTable + i; // linijka rozk³adu
|
||||
OutText1 = AnsiString(AnsiString(t->StationName) +
|
||||
OutText1 = AnsiString(AnsiString(t->StationName.c_str()) +
|
||||
" ").SubString(1, 26);
|
||||
OutText2 = (t->Ah >= 0) ?
|
||||
AnsiString(int(100 + t->Ah)).SubString(2, 2) + ":" +
|
||||
@@ -2529,7 +2529,7 @@ bool TWorld::Update()
|
||||
3); // z wyrównaniem do prawej
|
||||
// if (AnsiString(t->StationWare).Pos("@"))
|
||||
OutText1 = "| " + OutText1 + " | " + OutText2 + " | " + OutText3 +
|
||||
" | " + OutText4 + " | " + AnsiString(t->StationWare);
|
||||
" | " + OutText4 + " | " + AnsiString(t->StationWare.c_str());
|
||||
glRasterPos2f(-0.25f,
|
||||
0.18f - 0.02f * (i - tmp->Mechanik->iStationStart));
|
||||
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