16
0
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:
firleju
2016-09-09 06:38:50 +02:00
parent a324e9fd02
commit 803cefc71d
15 changed files with 717 additions and 60 deletions

View File

@@ -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;
};

View File

@@ -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();

View File

@@ -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=

View File

@@ -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");

View File

@@ -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()

View File

@@ -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)

View File

@@ -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);
};

View File

@@ -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

View File

@@ -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
View File

@@ -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);
//---------------------------------------------------------------------------

View File

@@ -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;

View File

@@ -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"

View File

@@ -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
View 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
View 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