16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 23:19:19 +02:00

Kompiluje się do DynamicObject. Prace nad TMoverParameters.

This commit is contained in:
firleju
2016-10-25 22:46:26 +02:00
parent 28d5be7363
commit 1491681576
27 changed files with 638 additions and 530 deletions

View File

@@ -463,26 +463,26 @@ bool TAnimModel::Init(AnsiString asName, AnsiString asReplacableTexture)
bool TAnimModel::Load(cParser *parser, bool ter) bool TAnimModel::Load(cParser *parser, bool ter)
{ // rozpoznanie wpisu modelu i ustawienie świateł { // rozpoznanie wpisu modelu i ustawienie świateł
AnsiString str; std::string str;
std::string token; std::string token;
parser->getTokens(); // nazwa modelu parser->getTokens(); // nazwa modelu
*parser >> token; *parser >> str;
str = AnsiString(token.c_str()); //str = token;
parser->getTokens(1, false); // tekstura (zmienia na małe) parser->getTokens(1, false); // tekstura (zmienia na małe)
*parser >> token; *parser >> token;
if (!Init(str, AnsiString(token.c_str()))) if (!Init(AnsiString(str.c_str()), AnsiString(token.c_str())))
{ {
if (str != "notload") if (str != "notload")
{ // gdy brak modelu { // gdy brak modelu
if (ter) // jeśli teren if (ter) // jeśli teren
{ {
if (str.SubString(str.Length() - 3, 4) == ".t3d") if (str.substr(str.length() - 3, 4) == ".t3d")
str[str.Length() - 2] = 'e'; str[str.length() - 2] = 'e';
Global::asTerrainModel = str; Global::asTerrainModel = str;
WriteLog(AnsiString("Terrain model \"" + str + "\" will be created.")); WriteLog("Terrain model \"" + str + "\" will be created.");
} }
else else
ErrorLog(AnsiString("Missed file: " + str)); ErrorLog("Missed file: " + str);
} }
} }
else else
@@ -516,16 +516,16 @@ bool TAnimModel::Load(cParser *parser, bool ter)
if (token.compare("lights") == 0) if (token.compare("lights") == 0)
{ {
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> str;
str = AnsiString(token.c_str()); //str = AnsiString(token.c_str());
do do
{ {
ti = str.ToDouble(); // stan światła jest liczbą z ułamkiem ti = atof(str.c_str()); // stan światła jest liczbą z ułamkiem
LightSet(i, ti); LightSet(i, ti);
i++; i++;
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> str;
str = AnsiString(token.c_str()); //str = AnsiString(token.c_str());
} while (str != "endmodel"); } while (str != "endmodel");
} }
return true; return true;

View File

@@ -16,6 +16,7 @@ http://mozilla.org/MPL/2.0/.
#include <string> #include <string>
using namespace Math3D; using namespace Math3D;
using namespace Mtable; using namespace Mtable;
using namespace std;
enum TOrders enum TOrders
{ // rozkazy dla AI { // rozkazy dla AI
@@ -378,7 +379,7 @@ class TController
public: public:
void PhysicsLog(); void PhysicsLog();
AnsiString StopReasonText(); string StopReasonText();
~TController(); ~TController();
std::string NextStop(); std::string NextStop();
void TakeControl(bool yes); void TakeControl(bool yes);

View File

@@ -32,6 +32,7 @@ http://mozilla.org/MPL/2.0/.
#include "Camera.h" //bo likwidujemy trzęsienie #include "Camera.h" //bo likwidujemy trzęsienie
#include "Console.h" #include "Console.h"
#include "Traction.h" #include "Traction.h"
#include <fstream>
#pragma package(smart_init) #pragma package(smart_init)
// Ra: taki zapis funkcjonuje lepiej, ale może nie jest optymalny // Ra: taki zapis funkcjonuje lepiej, ale może nie jest optymalny
@@ -1395,18 +1396,18 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist)
if (FoundedObj->PrevConnected) if (FoundedObj->PrevConnected)
if (FoundedObj->PrevConnected != this) // odświeżenie tego samego się nie liczy if (FoundedObj->PrevConnected != this) // odświeżenie tego samego się nie liczy
WriteLog("0! Coupler warning on " + asName + ":" + WriteLog("0! Coupler warning on " + asName + ":" +
AnsiString(MyCouplFound) + " - " + FoundedObj->asName + to_string(MyCouplFound) + " - " + FoundedObj->asName +
":0 connected to " + FoundedObj->PrevConnected->asName + ":" + ":0 connected to " + FoundedObj->PrevConnected->asName + ":" +
AnsiString(FoundedObj->PrevConnectedNo)); to_string(FoundedObj->PrevConnectedNo));
} }
else else
{ {
if (FoundedObj->NextConnected) if (FoundedObj->NextConnected)
if (FoundedObj->NextConnected != this) // odświeżenie tego samego się nie liczy if (FoundedObj->NextConnected != this) // odświeżenie tego samego się nie liczy
WriteLog("0! Coupler warning on " + asName + ":" + WriteLog("0! Coupler warning on " + asName + ":" +
AnsiString(MyCouplFound) + " - " + FoundedObj->asName + to_string(MyCouplFound) + " - " + FoundedObj->asName +
":1 connected to " + FoundedObj->NextConnected->asName + ":" + ":1 connected to " + FoundedObj->NextConnected->asName + ":" +
AnsiString(FoundedObj->NextConnectedNo)); to_string(FoundedObj->NextConnectedNo));
} }
if (FoundedObj == NULL) // jeśli nie ma na tym samym, szukamy po okolicy if (FoundedObj == NULL) // jeśli nie ma na tym samym, szukamy po okolicy
@@ -1486,9 +1487,9 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist)
if (FoundedObj->PrevConnected) if (FoundedObj->PrevConnected)
if (FoundedObj->PrevConnected != this) if (FoundedObj->PrevConnected != this)
WriteLog("1! Coupler warning on " + asName + ":" + WriteLog("1! Coupler warning on " + asName + ":" +
AnsiString(MyCouplFound) + " - " + FoundedObj->asName + to_string(MyCouplFound) + " - " + FoundedObj->asName +
":0 connected to " + FoundedObj->PrevConnected->asName + ":" + ":0 connected to " + FoundedObj->PrevConnected->asName + ":" +
AnsiString(FoundedObj->PrevConnectedNo)); to_string(FoundedObj->PrevConnectedNo));
FoundedObj->PrevConnected = this; FoundedObj->PrevConnected = this;
FoundedObj->PrevConnectedNo = MyCouplFound; FoundedObj->PrevConnectedNo = MyCouplFound;
} }
@@ -1498,9 +1499,9 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist)
if (FoundedObj->NextConnected) if (FoundedObj->NextConnected)
if (FoundedObj->NextConnected != this) if (FoundedObj->NextConnected != this)
WriteLog("1! Coupler warning on " + asName + ":" + WriteLog("1! Coupler warning on " + asName + ":" +
AnsiString(MyCouplFound) + " - " + FoundedObj->asName + to_string(MyCouplFound) + " - " + FoundedObj->asName +
":1 connected to " + FoundedObj->NextConnected->asName + ":" + ":1 connected to " + FoundedObj->NextConnected->asName + ":" +
AnsiString(FoundedObj->NextConnectedNo)); to_string(FoundedObj->NextConnectedNo));
FoundedObj->NextConnected = this; FoundedObj->NextConnected = this;
FoundedObj->NextConnectedNo = MyCouplFound; FoundedObj->NextConnectedNo = MyCouplFound;
} }
@@ -1660,26 +1661,26 @@ TDynamicObject::~TDynamicObject()
} }
double double
TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424" TDynamicObject::Init(string Name, // nazwa pojazdu, np. "EU07-424"
AnsiString BaseDir, // z którego katalogu wczytany, np. "PKP/EU07" string BaseDir, // z którego katalogu wczytany, np. "PKP/EU07"
AnsiString asReplacableSkin, // nazwa wymiennej tekstury string asReplacableSkin, // nazwa wymiennej tekstury
AnsiString Type_Name, // nazwa CHK/MMD, np. "303E" string Type_Name, // nazwa CHK/MMD, np. "303E"
TTrack *Track, // tor początkowy wstwawienia (początek składu) TTrack *Track, // tor początkowy wstwawienia (początek składu)
double fDist, // dystans względem punktu 1 double fDist, // dystans względem punktu 1
AnsiString DriverType, // typ obsady string DriverType, // typ obsady
double fVel, // prędkość początkowa double fVel, // prędkość początkowa
AnsiString TrainName, // nazwa składu, np. "PE2307" albo Vmax, jeśli pliku string TrainName, // nazwa składu, np. "PE2307" albo Vmax, jeśli pliku
// nie ma a są cyfry // nie ma a są cyfry
float Load, // ilość ładunku float Load, // ilość ładunku
AnsiString LoadType, // nazwa ładunku string LoadType, // nazwa ładunku
bool Reversed, // true, jeśli ma stać odwrotnie w składzie bool Reversed, // true, jeśli ma stać odwrotnie w składzie
AnsiString MoreParams // dodatkowe parametry wczytywane w postaci tekstowej string MoreParams // dodatkowe parametry wczytywane w postaci tekstowej
) )
{ // Ustawienie początkowe pojazdu { // Ustawienie początkowe pojazdu
iDirection = (Reversed ? 0 : 1); // Ra: 0, jeśli ma być wstawiony jako obrócony tyłem iDirection = (Reversed ? 0 : 1); // Ra: 0, jeśli ma być wstawiony jako obrócony tyłem
asBaseDir = "dynamic\\" + BaseDir + "\\"; // McZapkie-310302 asBaseDir = "dynamic\\" + BaseDir + "\\"; // McZapkie-310302
asName = Name; asName = Name;
AnsiString asAnimName = ""; // zmienna robocza do wyszukiwania osi i wózków string asAnimName = ""; // zmienna robocza do wyszukiwania osi i wózków
// Ra: zmieniamy znaczenie obsady na jednoliterowe, żeby dosadzić kierownika // Ra: zmieniamy znaczenie obsady na jednoliterowe, żeby dosadzić kierownika
if (DriverType == "headdriver") if (DriverType == "headdriver")
DriverType = "1"; // sterujący kabiną +1 DriverType = "1"; // sterujący kabiną +1
@@ -1693,9 +1694,9 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
else if (DriverType == "nobody") else if (DriverType == "nobody")
DriverType = ""; // nikt nie siedzi DriverType = ""; // nikt nie siedzi
int Cab = 0; // numer kabiny z obsadą (nie można zająć obu) int Cab = 0; // numer kabiny z obsadą (nie można zająć obu)
if (DriverType.Pos("1")) // od przodu składu if (DriverType.find("1")) // od przodu składu
Cab = 1; // iDirection?1:-1; //iDirection=1 gdy normalnie, =0 odwrotnie Cab = 1; // iDirection?1:-1; //iDirection=1 gdy normalnie, =0 odwrotnie
else if (DriverType.Pos("2")) // od tyłu składu else if (DriverType.find("2")) // od tyłu składu
Cab = -1; // iDirection?-1:1; Cab = -1; // iDirection?-1:1;
else if (DriverType == "p") else if (DriverType == "p")
{ {
@@ -1719,12 +1720,12 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
iLights = MoverParameters->iLights; // wskaźnik na stan własnych świateł iLights = MoverParameters->iLights; // wskaźnik na stan własnych świateł
// (zmienimy dla rozrządczych EZT) // (zmienimy dla rozrządczych EZT)
// McZapkie: TypeName musi byc nazwą CHK/MMD pojazdu // McZapkie: TypeName musi byc nazwą CHK/MMD pojazdu
if (!MoverParameters->LoadChkFile(asBaseDir)) if (!MoverParameters->LoadFIZ(asBaseDir))
{ // jak wczytanie CHK się nie uda, to błąd { // jak wczytanie CHK się nie uda, to błąd
if (ConversionError == -8) if (ConversionError == -8)
ErrorLog("Missed file: " + BaseDir + "\\" + Type_Name + ".fiz"); ErrorLog("Missed file: " + BaseDir + "\\" + Type_Name + ".fiz");
Error("Cannot load dynamic object " + asName + " from:\r\n" + BaseDir + "\\" + Type_Name + Error("Cannot load dynamic object " + asName + " from:\r\n" + BaseDir + "\\" + Type_Name +
".fiz\r\nError " + ConversionError + " in line " + LineCount); ".fiz\r\nError " + to_string(ConversionError) + " in line " + to_string(LineCount));
return 0.0; // zerowa długość to brak pojazdu return 0.0; // zerowa długość to brak pojazdu
} }
bool driveractive = (fVel != 0.0); // jeśli prędkość niezerowa, to aktywujemy ruch bool driveractive = (fVel != 0.0); // jeśli prędkość niezerowa, to aktywujemy ruch
@@ -1744,55 +1745,55 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
// dodatkowe parametry yB // dodatkowe parametry yB
MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać
// kropkę na koniec // kropkę na koniec
int kropka = MoreParams.Pos("."); // znajdź kropke int kropka = MoreParams.find("."); // znajdź kropke
AnsiString ActPar; // na parametry string ActPar; // na parametry
while (kropka > 0) // jesli sa kropki jeszcze while (kropka > 0) // jesli sa kropki jeszcze
{ {
int dlugosc = MoreParams.Length(); int dlugosc = MoreParams.length();
ActPar = MoreParams.SubString(1, kropka - 1).UpperCase(); // pierwszy parametr; ActPar = ToUpper(MoreParams.substr(0, kropka - 1)); // pierwszy parametr;
MoreParams = MoreParams.SubString(kropka + 1, dlugosc - kropka); // reszta do dalszej MoreParams = MoreParams.substr(kropka + 1, dlugosc - kropka); // reszta do dalszej
// obrobki // obrobki
kropka = MoreParams.Pos("."); kropka = MoreParams.find(".");
if (ActPar.SubString(1, 1) == "B") // jesli hamulce if (ActPar.substr(0, 1) == "B") // jesli hamulce
{ // sprawdzanie kolejno nastaw { // sprawdzanie kolejno nastaw
WriteLog("Wpis hamulca: " + ActPar); WriteLog("Wpis hamulca: " + ActPar);
if (ActPar.Pos("G") > 0) if (ActPar.find("G") != string::npos)
{ {
MoverParameters->BrakeDelaySwitch(bdelay_G); MoverParameters->BrakeDelaySwitch(bdelay_G);
} }
if (ActPar.Pos("P") > 0) if (ActPar.find("P") != string::npos)
{ {
MoverParameters->BrakeDelaySwitch(bdelay_P); MoverParameters->BrakeDelaySwitch(bdelay_P);
} }
if (ActPar.Pos("R") > 0) if (ActPar.find("R") != string::npos)
{ {
MoverParameters->BrakeDelaySwitch(bdelay_R); MoverParameters->BrakeDelaySwitch(bdelay_R);
} }
if (ActPar.Pos("M") > 0) if (ActPar.find("M") != string::npos)
{ {
MoverParameters->BrakeDelaySwitch(bdelay_R); MoverParameters->BrakeDelaySwitch(bdelay_R);
MoverParameters->BrakeDelaySwitch(bdelay_R + bdelay_M); MoverParameters->BrakeDelaySwitch(bdelay_R + bdelay_M);
} }
// wylaczanie hamulca // wylaczanie hamulca
if (ActPar.Pos("<>") > 0) // wylaczanie na probe hamowania naglego if (ActPar.find("<>") != string::npos) // wylaczanie na probe hamowania naglego
{ {
MoverParameters->BrakeStatus |= 128; // wylacz MoverParameters->BrakeStatus |= 128; // wylacz
} }
if (ActPar.Pos("0") > 0) // wylaczanie na sztywno if (ActPar.find("0") != string::npos) // wylaczanie na sztywno
{ {
MoverParameters->BrakeStatus |= 128; // wylacz MoverParameters->BrakeStatus |= 128; // wylacz
MoverParameters->Hamulec->ForceEmptiness(); MoverParameters->Hamulec->ForceEmptiness();
MoverParameters->BrakeReleaser(1); // odluznij automatycznie MoverParameters->BrakeReleaser(1); // odluznij automatycznie
} }
if (ActPar.Pos("E") > 0) // oprozniony if (ActPar.find("E") != string::npos) // oprozniony
{ {
MoverParameters->Hamulec->ForceEmptiness(); MoverParameters->Hamulec->ForceEmptiness();
MoverParameters->BrakeReleaser(1); // odluznij automatycznie MoverParameters->BrakeReleaser(1); // odluznij automatycznie
MoverParameters->Pipe->CreatePress(0); MoverParameters->Pipe->CreatePress(0);
MoverParameters->Pipe2->CreatePress(0); MoverParameters->Pipe2->CreatePress(0);
} }
if (ActPar.Pos("Q") > 0) // oprozniony if (ActPar.find("Q") != string::npos) // oprozniony
{ {
// MoverParameters->Hamulec->ForceEmptiness(); //TODO: sprawdzic, // MoverParameters->Hamulec->ForceEmptiness(); //TODO: sprawdzic,
// dlaczego // dlaczego
@@ -1807,7 +1808,7 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
MoverParameters->CompressedVolume = 0; MoverParameters->CompressedVolume = 0;
} }
if (ActPar.Pos("1") > 0) // wylaczanie 10% if (ActPar.find("1") != string::npos) // wylaczanie 10%
{ {
if (random(10) < 1) // losowanie 1/10 if (random(10) < 1) // losowanie 1/10
{ {
@@ -1816,7 +1817,7 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
MoverParameters->BrakeReleaser(1); // odluznij automatycznie MoverParameters->BrakeReleaser(1); // odluznij automatycznie
} }
} }
if (ActPar.Pos("X") > 0) // agonalny wylaczanie 20%, usrednienie przekladni if (ActPar.find("X") != string::npos) // agonalny wylaczanie 20%, usrednienie przekladni
{ {
if (random(100) < 20) // losowanie 20/100 if (random(100) < 20) // losowanie 20/100
{ {
@@ -1850,27 +1851,27 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
} }
} }
// nastawianie ladunku // nastawianie ladunku
if (ActPar.Pos("T") > 0) // prozny if (ActPar.find("T") != string::npos) // prozny
{ {
MoverParameters->DecBrakeMult(); MoverParameters->DecBrakeMult();
MoverParameters->DecBrakeMult(); MoverParameters->DecBrakeMult();
} // dwa razy w dol } // dwa razy w dol
if (ActPar.Pos("H") > 0) // ladowny I (dla P-Ł dalej prozny) if (ActPar.find("H") != string::npos) // ladowny I (dla P-Ł dalej prozny)
{ {
MoverParameters->IncBrakeMult(); MoverParameters->IncBrakeMult();
MoverParameters->IncBrakeMult(); MoverParameters->IncBrakeMult();
MoverParameters->DecBrakeMult(); MoverParameters->DecBrakeMult();
} // dwa razy w gore i obniz } // dwa razy w gore i obniz
if (ActPar.Pos("F") > 0) // ladowny II if (ActPar.find("F") != string::npos) // ladowny II
{ {
MoverParameters->IncBrakeMult(); MoverParameters->IncBrakeMult();
MoverParameters->IncBrakeMult(); MoverParameters->IncBrakeMult();
} // dwa razy w gore } // dwa razy w gore
if (ActPar.Pos("N") > 0) // parametr neutralny if (ActPar.find("N") != string::npos) // parametr neutralny
{ {
} }
} // koniec hamulce } // koniec hamulce
else if (ActPar.SubString(1, 1) == "") // tu mozna wpisac inny prefiks i inne rzeczy else if (ActPar.substr(0, 1) == "") // tu mozna wpisac inny prefiks i inne rzeczy
{ {
// jakies inne prefiksy // jakies inne prefiksy
} }
@@ -1903,7 +1904,7 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
// if (MoverParameters->CabNo!=0) // if (MoverParameters->CabNo!=0)
if (DriverType != "") if (DriverType != "")
{ // McZapkie-040602: jeśli coś siedzi w pojeździe { // McZapkie-040602: jeśli coś siedzi w pojeździe
if (Name == AnsiString(Global::asHumanCtrlVehicle)) // jeśli pojazd wybrany do prowadzenia if (Name == Global::asHumanCtrlVehicle) // jeśli pojazd wybrany do prowadzenia
{ {
if (DebugModeFlag ? false : MoverParameters->EngineType != if (DebugModeFlag ? false : MoverParameters->EngineType !=
Dumb) // jak nie Debugmode i nie jest dumbem Dumb) // jak nie Debugmode i nie jest dumbem
@@ -1913,13 +1914,13 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
} }
// McZapkie-151102: rozkład jazdy czytany z pliku *.txt z katalogu w którym // McZapkie-151102: rozkład jazdy czytany z pliku *.txt z katalogu w którym
// jest sceneria // jest sceneria
if (DriverType.Pos("1") || DriverType.Pos("2")) if (DriverType.find("1") || DriverType.find("2"))
{ // McZapkie-110303: mechanik i rozklad tylko gdy jest obsada { // McZapkie-110303: mechanik i rozklad tylko gdy jest obsada
// MoverParameters->ActiveCab=MoverParameters->CabNo; //ustalenie aktywnej // MoverParameters->ActiveCab=MoverParameters->CabNo; //ustalenie aktywnej
// kabiny // kabiny
// (rozrząd) // (rozrząd)
Mechanik = new TController(Controller, this, Aggressive); Mechanik = new TController(Controller, this, Aggressive);
if (TrainName.IsEmpty()) // jeśli nie w składzie if (TrainName.empty()) // jeśli nie w składzie
{ {
Mechanik->DirectionInitial(); // załączenie rozrządu (wirtualne kabiny) itd. Mechanik->DirectionInitial(); // załączenie rozrządu (wirtualne kabiny) itd.
Mechanik->PutCommand( Mechanik->PutCommand(
@@ -1988,11 +1989,11 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
if (mdModel) // jeśli ma w czym szukać if (mdModel) // jeśli ma w czym szukać
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
{ {
asAnimName = AnsiString("buffer_left0") + (i + 1); asAnimName = string("buffer_left0") + to_string(i + 1);
smBuforLewy[i] = mdModel->GetFromName(asAnimName.c_str()); smBuforLewy[i] = mdModel->GetFromName(asAnimName.c_str());
if (smBuforLewy[i]) if (smBuforLewy[i])
smBuforLewy[i]->WillBeAnimated(); // ustawienie flagi animacji smBuforLewy[i]->WillBeAnimated(); // ustawienie flagi animacji
asAnimName = AnsiString("buffer_right0") + (i + 1); asAnimName = string("buffer_right0") + to_string(i + 1);
smBuforPrawy[i] = mdModel->GetFromName(asAnimName.c_str()); smBuforPrawy[i] = mdModel->GetFromName(asAnimName.c_str());
if (smBuforPrawy[i]) if (smBuforPrawy[i])
smBuforPrawy[i]->WillBeAnimated(); smBuforPrawy[i]->WillBeAnimated();
@@ -2329,14 +2330,14 @@ void TDynamicObject::LoadUpdate()
// Ra: nie próbujemy wczytywać modeli miliony razy podczas renderowania!!! // Ra: nie próbujemy wczytywać modeli miliony razy podczas renderowania!!!
if ((mdLoad == NULL) && (MoverParameters->Load > 0)) if ((mdLoad == NULL) && (MoverParameters->Load > 0))
{ {
AnsiString asLoadName = string asLoadName =
asBaseDir + MoverParameters->LoadType + ".t3d"; // zapamiętany katalog pojazdu asBaseDir + MoverParameters->LoadType + ".t3d"; // zapamiętany katalog pojazdu
// asLoadName=MoverParameters->LoadType; // asLoadName=MoverParameters->LoadType;
// if (MoverParameters->LoadType!=AnsiString("passengers")) // if (MoverParameters->LoadType!=AnsiString("passengers"))
Global::asCurrentTexturePath = asBaseDir; // bieżąca ścieżka do tekstur to dynamic/... Global::asCurrentTexturePath = asBaseDir; // bieżąca ścieżka do tekstur to dynamic/...
mdLoad = TModelsManager::GetModel(asLoadName.c_str()); // nowy ładunek mdLoad = TModelsManager::GetModel(asLoadName.c_str()); // nowy ładunek
Global::asCurrentTexturePath = Global::asCurrentTexturePath =
AnsiString(szTexturePath); // z powrotem defaultowa sciezka do tekstur string(szTexturePath); // z powrotem defaultowa sciezka do tekstur
// Ra: w MMD można by zapisać położenie modelu ładunku (np. węgiel) w // Ra: w MMD można by zapisać położenie modelu ładunku (np. węgiel) w
// zależności od // zależności od
// załadowania // załadowania
@@ -2615,10 +2616,10 @@ bool TDynamicObject::Update(double dt, double dt1)
// Ra 15-01: bezwzględne współrzędne pantografu nie są dostępne, // Ra 15-01: bezwzględne współrzędne pantografu nie są dostępne,
// więc lepiej się tego nie zaloguje // więc lepiej się tego nie zaloguje
ErrorLog("Voltage loss: by " + MoverParameters->Name + " at " + ErrorLog("Voltage loss: by " + MoverParameters->Name + " at " +
FloatToStrF(vPosition.x, ffFixed, 7, 2) + " " + to_string(vPosition.x, 2, 7) + " " +
FloatToStrF(vPosition.y, ffFixed, 7, 2) + " " + to_string(vPosition.y, 2, 7) + " " +
FloatToStrF(vPosition.z, ffFixed, 7, 2) + ", time " + to_string(vPosition.z, 2, 7) + ", time " +
FloatToStrF(NoVoltTime, ffFixed, 7, 2)); to_string(NoVoltTime, 2, 7));
// if (MoverParameters->PantRearUp) // if (MoverParameters->PantRearUp)
// if (iAnimType[ANIM_PANTS]>1) // if (iAnimType[ANIM_PANTS]>1)
// if (pants[1]) // if (pants[1])
@@ -4204,38 +4205,37 @@ void TDynamicObject::RenderAlpha()
// McZapkie-250202 // McZapkie-250202
// wczytywanie pliku z danymi multimedialnymi (dzwieki) // wczytywanie pliku z danymi multimedialnymi (dzwieki)
void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName,
AnsiString ReplacableSkin) string ReplacableSkin)
{ {
double dSDist; double dSDist;
TFileStream *fs;
// asBaseDir=BaseDir; // asBaseDir=BaseDir;
Global::asCurrentDynamicPath = BaseDir; Global::asCurrentDynamicPath = BaseDir;
AnsiString asFileName = BaseDir + TypeName + ".mmd"; string asFileName = BaseDir + TypeName + ".mmd";
AnsiString asLoadName = BaseDir + MoverParameters->LoadType + ".t3d"; string asLoadName = BaseDir + MoverParameters->LoadType + ".t3d";
if (!FileExists(asFileName)) ifstream *fs = new ifstream(asFileName.c_str());
if (!fs->is_open())
{ {
ErrorLog("Missed file: " + asFileName); // brak MMD ErrorLog("Missed file: " + asFileName); // brak MMD
delete fs;
return; return;
} }
fs = new TFileStream(asFileName, fmOpenRead | fmShareCompat); if (fs->width() == 0)
if (!fs)
return;
int size = fs->Size;
if (!size)
{ {
return delete fs; return delete fs;
}; };
AnsiString asAnimName; string asAnimName;
bool Stop_InternalData = false; bool Stop_InternalData = false;
char *buf = new char[size + 1]; // ciąg bajtów o długości równej rozmiwarowi pliku //char *buf = new char[size + 1]; // ciąg bajtów o długości równej rozmiwarowi pliku
buf[size] = '\0'; // zakończony zerem na wszelki wypadek stringstream buffer;
fs->Read(buf, size); buffer << fs->rdbuf();
//buf[size] = '\0'; // zakończony zerem na wszelki wypadek
delete fs; delete fs;
TQueryParserComp *Parser; TQueryParserComp *Parser;
Parser = new TQueryParserComp(NULL); Parser = new TQueryParserComp(NULL);
Parser->TextToParse = AnsiString(buf); Parser->TextToParse = AnsiString(buffer.str().c_str());
delete[] buf; //delete[] buf;
AnsiString str; AnsiString str;
// Parser->LoadStringToParse(asFile); // Parser->LoadStringToParse(asFile);
Parser->First(); Parser->First();
@@ -4248,18 +4248,18 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
if (str == AnsiString("models:")) // modele i podmodele if (str == AnsiString("models:")) // modele i podmodele
{ {
iMultiTex = 0; // czy jest wiele tekstur wymiennych? iMultiTex = 0; // czy jest wiele tekstur wymiennych?
asModel = Parser->GetNextSymbol().LowerCase(); asModel = Parser->GetNextSymbol().LowerCase().c_str();
if (asModel.Pos("#") == asModel.Length()) // Ra 2015-01: nie podoba mi się to if (asModel.find("#") == asModel.length()) // Ra 2015-01: nie podoba mi się to
{ // model wymaga wielu tekstur wymiennych { // model wymaga wielu tekstur wymiennych
iMultiTex = 1; iMultiTex = 1;
asModel = asModel.SubString(1, asModel.Length() - 1); asModel = asModel.substr(0, asModel.length() - 1);
} }
if ((i = asModel.Pos(",")) > 0) if ((i = asModel.find(",")) != string::npos)
{ // Ra 2015-01: może szukać przecinka w { // Ra 2015-01: może szukać przecinka w
// nazwie modelu, a po przecinku była by // nazwie modelu, a po przecinku była by
// liczba // liczba
// tekstur? // tekstur?
if (i < asModel.Length()) if (i < asModel.length())
iMultiTex = asModel[i + 1] - '0'; iMultiTex = asModel[i + 1] - '0';
if (iMultiTex < 0) if (iMultiTex < 0)
iMultiTex = 0; iMultiTex = 0;
@@ -4270,12 +4270,12 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
// modele w dynamics/basedir // modele w dynamics/basedir
Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/... Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/...
mdModel = TModelsManager::GetModel(asModel.c_str(), true); mdModel = TModelsManager::GetModel(asModel.c_str(), true);
if (ReplacableSkin != AnsiString("none")) if (ReplacableSkin != "none")
{ // tekstura wymienna jest raczej jedynie w "dynamic\" { // tekstura wymienna jest raczej jedynie w "dynamic\"
ReplacableSkin = ReplacableSkin =
Global::asCurrentTexturePath + ReplacableSkin; // skory tez z dynamic/... Global::asCurrentTexturePath + ReplacableSkin; // skory tez z dynamic/...
AnsiString x = TextureTest(Global::asCurrentTexturePath + "nowhere"); // na razie prymitywnie string x = TextureTest(Global::asCurrentTexturePath + "nowhere"); // na razie prymitywnie
if (!x.IsEmpty()) if (!x.empty())
ReplacableSkinID[4] = TTexturesManager::GetTextureID(NULL, NULL, (Global::asCurrentTexturePath + "nowhere").c_str(), 9); ReplacableSkinID[4] = TTexturesManager::GetTextureID(NULL, NULL, (Global::asCurrentTexturePath + "nowhere").c_str(), 9);
/* /*
if ((i = ReplacableSkin.Pos("|")) > 0) // replacable dzielone if ((i = ReplacableSkin.Pos("|")) > 0) // replacable dzielone
@@ -4404,7 +4404,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
asModel = BaseDir + asModel; asModel = BaseDir + asModel;
mdPrzedsionek = TModelsManager::GetModel(asModel.c_str(), true); mdPrzedsionek = TModelsManager::GetModel(asModel.c_str(), true);
} }
if (!MoverParameters->LoadAccepted.IsEmpty()) if (!MoverParameters->LoadAccepted.empty())
// if (MoverParameters->LoadAccepted!=AnsiString("")); // && // if (MoverParameters->LoadAccepted!=AnsiString("")); // &&
// MoverParameters->LoadType!=AnsiString("passengers")) // MoverParameters->LoadType!=AnsiString("passengers"))
if (MoverParameters->EnginePowerSource.SourceType == CurrentCollector) if (MoverParameters->EnginePowerSource.SourceType == CurrentCollector)
@@ -4441,7 +4441,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
else // Ra: tu wczytywanie modelu ładunku jest w porządku else // Ra: tu wczytywanie modelu ładunku jest w porządku
mdLoad = TModelsManager::GetModel(asLoadName.c_str(), true); // ladunek mdLoad = TModelsManager::GetModel(asLoadName.c_str(), true); // ladunek
Global::asCurrentTexturePath = Global::asCurrentTexturePath =
AnsiString(szTexturePath); // z powrotem defaultowa sciezka do tekstur string(szTexturePath); // z powrotem defaultowa sciezka do tekstur
while (!Parser->EndOfFile && str != AnsiString("endmodels")) while (!Parser->EndOfFile && str != AnsiString("endmodels"))
{ {
str = Parser->GetNextSymbol().LowerCase(); str = Parser->GetNextSymbol().LowerCase();
@@ -4518,7 +4518,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
} }
if (str == AnsiString("lowpolyinterior:")) // ABu: wnetrze lowpoly if (str == AnsiString("lowpolyinterior:")) // ABu: wnetrze lowpoly
{ {
asModel = Parser->GetNextSymbol().LowerCase(); asModel = Parser->GetNextSymbol().LowerCase().c_str();
asModel = BaseDir + asModel; // McZapkie-200702 - dynamics maja swoje asModel = BaseDir + asModel; // McZapkie-200702 - dynamics maja swoje
// modele w dynamic/basedir // modele w dynamic/basedir
Global::asCurrentTexturePath = Global::asCurrentTexturePath =
@@ -4530,13 +4530,13 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
} }
if (str == AnsiString("brakemode:")) if (str == AnsiString("brakemode:"))
{ // Ra 15-01: gałka nastawy hamulca { // Ra 15-01: gałka nastawy hamulca
asAnimName = Parser->GetNextSymbol().LowerCase(); asAnimName = Parser->GetNextSymbol().LowerCase().c_str();
smBrakeMode = mdModel->GetFromName(asAnimName.c_str()); smBrakeMode = mdModel->GetFromName(asAnimName.c_str());
// jeszcze wczytać kąty obrotu dla poszczególnych ustawień // jeszcze wczytać kąty obrotu dla poszczególnych ustawień
} }
if (str == AnsiString("loadmode:")) if (str == AnsiString("loadmode:"))
{ // Ra 15-01: gałka nastawy hamulca { // Ra 15-01: gałka nastawy hamulca
asAnimName = Parser->GetNextSymbol().LowerCase(); asAnimName = Parser->GetNextSymbol().LowerCase().c_str();
smLoadMode = mdModel->GetFromName(asAnimName.c_str()); smLoadMode = mdModel->GetFromName(asAnimName.c_str());
// jeszcze wczytać kąty obrotu dla poszczególnych ustawień // jeszcze wczytać kąty obrotu dla poszczególnych ustawień
} }
@@ -4546,7 +4546,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
str = Parser->GetNextSymbol(); str = Parser->GetNextSymbol();
for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // liczba osi for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // liczba osi
{ // McZapkie-050402: wyszukiwanie kol o nazwie str* { // McZapkie-050402: wyszukiwanie kol o nazwie str*
asAnimName = str + AnsiString(i + 1); asAnimName = str.c_str() + to_string(i + 1);
pAnimations[i].smAnimated = pAnimations[i].smAnimated =
mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu
if (pAnimations[i].smAnimated) if (pAnimations[i].smAnimated)
@@ -4580,7 +4580,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
{ // obsługa różnych średnic, o { // obsługa różnych średnic, o
// ile występują // ile występują
while ((i < iAnimType[ANIM_WHEELS]) && while ((i < iAnimType[ANIM_WHEELS]) &&
(j <= MoverParameters->AxleArangement.Length())) (j <= MoverParameters->AxleArangement.length()))
{ // wersja ze wskaźnikami jest { // wersja ze wskaźnikami jest
// bardziej elastyczna na nietypowe // bardziej elastyczna na nietypowe
// układy // układy
@@ -4630,7 +4630,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++)
{ // Winger 160204: wyszukiwanie max 2 patykow o nazwie { // Winger 160204: wyszukiwanie max 2 patykow o nazwie
// str* // str*
asAnimName = str + AnsiString(i + 1); asAnimName = str.c_str() + to_string(i + 1);
sm = mdModel->GetFromName(asAnimName.c_str()); sm = mdModel->GetFromName(asAnimName.c_str());
pants[i].smElement[0] = sm; // jak NULL, to nie będzie animowany pants[i].smElement[0] = sm; // jak NULL, to nie będzie animowany
if (sm) if (sm)
@@ -4737,8 +4737,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
pants[i].fParamPants->fHeight = pants[i].fParamPants->fHeight =
0.0; // niech będzie odczyt z pantfactors: 0.0; // niech będzie odczyt z pantfactors:
ErrorLog("Bad model: " + asModel + ", scale of " + ErrorLog("Bad model: " + asModel + ", scale of " +
AnsiString(sm->pName) + " is " + (sm->pName) + " is " +
AnsiString(100.0 * det) + "%"); to_string(100.0 * det) + "%");
} }
} }
} }
@@ -4757,7 +4757,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++)
{ // Winger 160204: wyszukiwanie max 2 patykow o nazwie { // Winger 160204: wyszukiwanie max 2 patykow o nazwie
// str* // str*
asAnimName = str + AnsiString(i + 1); asAnimName = str.c_str() + to_string(i + 1);
sm = mdModel->GetFromName(asAnimName.c_str()); sm = mdModel->GetFromName(asAnimName.c_str());
pants[i].smElement[1] = sm; // jak NULL, to nie będzie animowany pants[i].smElement[1] = sm; // jak NULL, to nie będzie animowany
if (sm) if (sm)
@@ -4796,7 +4796,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++)
{ // Winger 160204: wyszukiwanie max 2 patykow o nazwie { // Winger 160204: wyszukiwanie max 2 patykow o nazwie
// str* // str*
asAnimName = str + AnsiString(i + 1); asAnimName = str.c_str() + to_string(i + 1);
pants[i].smElement[2] = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[2] = mdModel->GetFromName(asAnimName.c_str());
pants[i].smElement[2]->WillBeAnimated(); pants[i].smElement[2]->WillBeAnimated();
} }
@@ -4808,7 +4808,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++)
{ // Winger 160204: wyszukiwanie max 2 patykow o nazwie { // Winger 160204: wyszukiwanie max 2 patykow o nazwie
// str* // str*
asAnimName = str + AnsiString(i + 1); asAnimName = str.c_str() + to_string(i + 1);
pants[i].smElement[3] = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[3] = mdModel->GetFromName(asAnimName.c_str());
pants[i].smElement[3]->WillBeAnimated(); pants[i].smElement[3]->WillBeAnimated();
} }
@@ -4820,7 +4820,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++)
{ // Winger 160204: wyszukiwanie max 2 patykow o nazwie { // Winger 160204: wyszukiwanie max 2 patykow o nazwie
// str* // str*
asAnimName = str + AnsiString(i + 1); asAnimName = str.c_str() + to_string(i + 1);
pants[i].smElement[4] = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[4] = mdModel->GetFromName(asAnimName.c_str());
pants[i].smElement[4]->WillBeAnimated(); pants[i].smElement[4]->WillBeAnimated();
pants[i].yUpdate = UpdatePant; pants[i].yUpdate = UpdatePant;
@@ -4957,7 +4957,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
for (int i = 1; i <= 4; i++) for (int i = 1; i <= 4; i++)
{ // McZapkie-050402: wyszukiwanie max 4 { // McZapkie-050402: wyszukiwanie max 4
// wahaczy o nazwie str* // wahaczy o nazwie str*
asAnimName = str + AnsiString(i); asAnimName = str.c_str() + to_string(i);
smWahacze[i - 1] = mdModel->GetFromName(asAnimName.c_str()); smWahacze[i - 1] = mdModel->GetFromName(asAnimName.c_str());
smWahacze[i - 1]->WillBeAnimated(); smWahacze[i - 1]->WillBeAnimated();
} }
@@ -4990,7 +4990,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
j += iAnimType[i]; // zliczanie wcześniejszych animacji j += iAnimType[i]; // zliczanie wcześniejszych animacji
for (i = 0; i < iAnimType[ANIM_DOORS]; ++i) // liczba drzwi for (i = 0; i < iAnimType[ANIM_DOORS]; ++i) // liczba drzwi
{ // NBMX wrzesien 2003: wyszukiwanie drzwi o nazwie str* { // NBMX wrzesien 2003: wyszukiwanie drzwi o nazwie str*
asAnimName = str + AnsiString(i + 1); asAnimName = str.c_str() + to_string(i + 1);
pAnimations[i + j].smAnimated = pAnimations[i + j].smAnimated =
mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu
if (pAnimations[i + j].smAnimated) if (pAnimations[i + j].smAnimated)
@@ -5057,7 +5057,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
rsSilnik.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), GetPosition().x, rsSilnik.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), GetPosition().x,
GetPosition().y, GetPosition().z, true, true); GetPosition().y, GetPosition().z, true, true);
if (rsSilnik.GetWaveTime() == 0) if (rsSilnik.GetWaveTime() == 0)
ErrorLog("Missed sound: \"" + str + "\" for " + asFileName); ErrorLog("Missed sound: \"" + string(str.c_str()) + "\" for " + asFileName);
if (MoverParameters->EngineType == DieselEngine) if (MoverParameters->EngineType == DieselEngine)
rsSilnik.AM = Parser->GetNextSymbol().ToDouble() / rsSilnik.AM = Parser->GetNextSymbol().ToDouble() /
(MoverParameters->Power + MoverParameters->nmax * 60); (MoverParameters->Power + MoverParameters->nmax * 60);
@@ -5291,7 +5291,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
mdLowPolyInt->Init(); mdLowPolyInt->Init();
// sHorn2.CopyIfEmpty(sHorn1); //żeby jednak trąbił też drugim // sHorn2.CopyIfEmpty(sHorn1); //żeby jednak trąbił też drugim
Global::asCurrentTexturePath = Global::asCurrentTexturePath =
AnsiString(szTexturePath); // kiedyś uproszczone wnętrze mieszało tekstury nieba string(szTexturePath); // kiedyś uproszczone wnętrze mieszało tekstury nieba
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -5646,27 +5646,27 @@ int TDynamicObject::RouteWish(TTrack *tr)
return Mechanik ? Mechanik->CrossRoute(tr) : 0; // wg AI albo prosto return Mechanik ? Mechanik->CrossRoute(tr) : 0; // wg AI albo prosto
}; };
AnsiString TDynamicObject::TextureTest(AnsiString &name) string TDynamicObject::TextureTest(string &name)
{ // Ra 2015-01: sprawdzenie dostępności tekstury o podanej nazwie { // Ra 2015-01: sprawdzenie dostępności tekstury o podanej nazwie
AnsiString x = name + ".dds"; // na razie prymitywnie string x = name + ".dds"; // na razie prymitywnie
if (FileExists(x)) if (FileExists(x.c_str()))
return x; return x;
else else
{ {
x = name + ".tga"; // w zasadzie to należałoby uwzględnić deklarowaną kolejność x = name + ".tga"; // w zasadzie to należałoby uwzględnić deklarowaną kolejność
if (FileExists(x)) if (FileExists(x.c_str()))
return x; return x;
else else
{ {
x = name + ".bmp"; x = name + ".bmp";
if (FileExists(x)) if (FileExists(x.c_str()))
return x; return x;
} }
} }
return ""; // nie znaleziona return ""; // nie znaleziona
}; };
void TDynamicObject::DestinationSet(AnsiString to, AnsiString numer) void TDynamicObject::DestinationSet(string to, string numer)
{ // ustawienie stacji { // ustawienie stacji
// docelowej oraz wymiennej // docelowej oraz wymiennej
// tekstury 4, jeśli // tekstury 4, jeśli
@@ -5680,34 +5680,34 @@ void TDynamicObject::DestinationSet(AnsiString to, AnsiString numer)
numer = Global::Bezogonkow(numer); numer = Global::Bezogonkow(numer);
asDestination = to; asDestination = to;
to = Global::Bezogonkow(to); // do szukania pliku obcinamy ogonki to = Global::Bezogonkow(to); // do szukania pliku obcinamy ogonki
AnsiString x; string x;
x = TextureTest(asBaseDir + numer + "@" + MoverParameters->TypeName); x = TextureTest(asBaseDir + numer + "@" + MoverParameters->TypeName);
if (!x.IsEmpty()) if (!x.empty())
{ {
ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się
return; return;
} }
x = TextureTest(asBaseDir + numer ); x = TextureTest(asBaseDir + numer );
if (!x.IsEmpty()) if (!x.empty())
{ {
ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się
return; return;
} }
if (to.IsEmpty()) if (to.empty())
to = "nowhere"; to = "nowhere";
x = TextureTest(asBaseDir + to + "@" + MoverParameters->TypeName); // w pierwszej kolejności z nazwą FIZ/MMD x = TextureTest(asBaseDir + to + "@" + MoverParameters->TypeName); // w pierwszej kolejności z nazwą FIZ/MMD
if (!x.IsEmpty()) if (!x.empty())
{ {
ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się
return; return;
} }
x = TextureTest(asBaseDir + to); // na razie prymitywnie x = TextureTest(asBaseDir + to); // na razie prymitywnie
if (!x.IsEmpty()) if (!x.empty())
ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się
else else
{ {
x = TextureTest(asBaseDir + "nowhere"); // jak nie znalazł dedykowanej, to niech daje nowhere x = TextureTest(asBaseDir + "nowhere"); // jak nie znalazł dedykowanej, to niech daje nowhere
if (!x.IsEmpty()) if (!x.empty())
ReplacableSkinID[4] = TTexturesManager::GetTextureID(NULL, NULL, x.c_str(), 9); ReplacableSkinID[4] = TTexturesManager::GetTextureID(NULL, NULL, x.c_str(), 9);
} }
// Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa // Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa

View File

@@ -23,6 +23,9 @@ http://mozilla.org/MPL/2.0/.
#include "AirCoupler.h" #include "AirCoupler.h"
#include <string> #include <string>
using namespace std;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -56,7 +56,6 @@ void TEventLauncher::Init()
bool TEventLauncher::Load(cParser *parser) bool TEventLauncher::Load(cParser *parser)
{ // wczytanie wyzwalacza zdarzeñ { // wczytanie wyzwalacza zdarzeñ
AnsiString str;
std::string token; std::string token;
parser->getTokens(); parser->getTokens();
*parser >> dRadius; // promieñ dzia³ania *parser >> dRadius; // promieñ dzia³ania
@@ -64,13 +63,12 @@ bool TEventLauncher::Load(cParser *parser)
dRadius *= dRadius; // do kwadratu, pod warunkiem, ¿e nie jest ujemne dRadius *= dRadius; // do kwadratu, pod warunkiem, ¿e nie jest ujemne
parser->getTokens(); // klawisz steruj¹cy parser->getTokens(); // klawisz steruj¹cy
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); if (token != "none")
if (str != "none")
{ {
if (str.Length() == 1) if (token.length() == 1)
iKey = VkKeyScan(str[1]); // jeden znak jest konwertowany na kod klawisza iKey = VkKeyScan(token[1]); // jeden znak jest konwertowany na kod klawisza
else else
iKey = str.ToIntDef(0); // a jak wiêcej, to jakby numer klawisza jest iKey = stol_def(token,0); // a jak wiêcej, to jakby numer klawisza jest
} }
parser->getTokens(); parser->getTokens();
*parser >> DeltaTime; *parser >> DeltaTime;
@@ -81,31 +79,31 @@ bool TEventLauncher::Load(cParser *parser)
iMinute = int(DeltaTime) % 100; // minuty s¹ najm³odszymi cyframi dziesietnymi iMinute = int(DeltaTime) % 100; // minuty s¹ najm³odszymi cyframi dziesietnymi
iHour = int(DeltaTime - iMinute) / 100; // godzina to setki iHour = int(DeltaTime - iMinute) / 100; // godzina to setki
DeltaTime = 0; // bez powtórzeñ DeltaTime = 0; // bez powtórzeñ
WriteLog("EventLauncher at " + IntToStr(iHour) + ":" + WriteLog("EventLauncher at " + to_string(iHour) + ":" +
IntToStr(iMinute)); // wyœwietlenie czasu to_string(iMinute)); // wyœwietlenie czasu
} }
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
asEvent1Name = AnsiString(token.c_str()); // pierwszy event asEvent1Name = token; // pierwszy event
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
asEvent2Name = AnsiString(token.c_str()); // drugi event asEvent2Name = token; // drugi event
if ((asEvent2Name == "end") || (asEvent2Name == "condition")) if ((asEvent2Name == "end") || (asEvent2Name == "condition"))
{ // drugiego eventu mo¿e nie byæ, bo s¹ z tym problemy, ale ciii... { // drugiego eventu mo¿e nie byæ, bo s¹ z tym problemy, ale ciii...
str = asEvent2Name; // rozpoznane s³owo idzie do dalszego przetwarzania token = asEvent2Name; // rozpoznane s³owo idzie do dalszego przetwarzania
asEvent2Name = "none"; // a drugiego eventu nie ma asEvent2Name = "none"; // a drugiego eventu nie ma
} }
else else
{ // gdy s¹ dwa eventy { // gdy s¹ dwa eventy
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); //str = AnsiString(token.c_str());
} }
if (str == AnsiString("condition")) if (token == "condition")
{ // obs³uga wyzwalania warunkowego { // obs³uga wyzwalania warunkowego
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
asMemCellName = AnsiString(token.c_str()); asMemCellName = token;
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
SafeDeleteArray(szText); SafeDeleteArray(szText);
@@ -118,8 +116,8 @@ bool TEventLauncher::Load(cParser *parser)
if (token.compare("*") != 0) //*=nie braæ wartoœci 1. pod uwagê if (token.compare("*") != 0) //*=nie braæ wartoœci 1. pod uwagê
{ {
iCheckMask |= conditional_memval1; iCheckMask |= conditional_memval1;
str = AnsiString(token.c_str()); //str = AnsiString(token.c_str());
fVal1 = str.ToDouble(); fVal1 = atof(token.c_str());
} }
else else
fVal1 = 0; fVal1 = 0;
@@ -128,8 +126,8 @@ bool TEventLauncher::Load(cParser *parser)
if (token.compare("*") != 0) //*=nie braæ wartoœci 2. pod uwagê if (token.compare("*") != 0) //*=nie braæ wartoœci 2. pod uwagê
{ {
iCheckMask |= conditional_memval2; iCheckMask |= conditional_memval2;
str = AnsiString(token.c_str()); //str = AnsiString(token.c_str());
fVal2 = str.ToDouble(); fVal2 = atof(token.c_str());
} }
else else
fVal2 = 0; fVal2 = 0;

View File

@@ -11,6 +11,9 @@ http://mozilla.org/MPL/2.0/.
#define EvLaunchH #define EvLaunchH
#include "Classes.h" #include "Classes.h"
#include <string>
using namespace std;
class TEventLauncher class TEventLauncher
{ {
@@ -24,9 +27,9 @@ class TEventLauncher
int iHour, iMinute; // minuta uruchomienia int iHour, iMinute; // minuta uruchomienia
public: public:
double dRadius; double dRadius;
AnsiString asEvent1Name; string asEvent1Name;
AnsiString asEvent2Name; string asEvent2Name;
AnsiString asMemCellName; string asMemCellName;
TEvent *Event1; TEvent *Event1;
TEvent *Event2; TEvent *Event2;
TMemCell *MemCell; TMemCell *MemCell;

217
Event.cpp
View File

@@ -26,7 +26,7 @@ http://mozilla.org/MPL/2.0/.
#include "Ground.h" #include "Ground.h"
#pragma package(smart_init) #pragma package(smart_init)
TEvent::TEvent(AnsiString m) TEvent::TEvent(string m)
{ {
// asName=""; //czy nazwa eventu jest niezbêdna w tym przypadku? chyba nie // asName=""; //czy nazwa eventu jest niezbêdna w tym przypadku? chyba nie
evNext = evNext2 = NULL; evNext = evNext2 = NULL;
@@ -37,7 +37,7 @@ TEvent::TEvent(AnsiString m)
// bIsHistory=false; // bIsHistory=false;
fDelay = 0; fDelay = 0;
fStartTime = 0; // 0 nie ma sensu fStartTime = 0; // 0 nie ma sensu
Type = m.IsEmpty() ? tp_Unknown : Type = m.empty() ? tp_Unknown :
tp_GetValues; // utworzenie niejawnego odczytu komórki pamiêci w torze tp_GetValues; // utworzenie niejawnego odczytu komórki pamiêci w torze
for (int i = 0; i < 13; i++) for (int i = 0; i < 13; i++)
Params[i].asPointer = NULL; Params[i].asPointer = NULL;
@@ -82,37 +82,36 @@ void TEvent::Init(){
}; };
void TEvent::Conditions(cParser *parser, AnsiString s) void TEvent::Conditions(cParser *parser, string s)
{ // przetwarzanie warunków, wspólne dla Multiple i UpdateValues { // przetwarzanie warunków, wspólne dla Multiple i UpdateValues
if (s == "condition") if (s == "condition")
{ // jesli nie "endevent" { // jesli nie "endevent"
std::string token; std::string token, str;
AnsiString str; if (!asNodeName.empty())
if (!asNodeName.IsEmpty())
{ // podczepienie ³añcucha, jeœli nie jest pusty { // podczepienie ³añcucha, jeœli nie jest pusty
Params[9].asText = new char[asNodeName.Length() + 1]; // usuwane i zamieniane na Params[9].asText = new char[asNodeName.length() + 1]; // usuwane i zamieniane na
// wskaŸnik // wskaŸnik
strcpy(Params[9].asText, asNodeName.c_str()); strcpy(Params[9].asText, asNodeName.c_str());
} }
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); str = token;
if (str == AnsiString("trackoccupied")) if (str == "trackoccupied")
iFlags |= conditional_trackoccupied; iFlags |= conditional_trackoccupied;
else if (str == AnsiString("trackfree")) else if (str == "trackfree")
iFlags |= conditional_trackfree; iFlags |= conditional_trackfree;
else if (str == AnsiString("propability")) else if (str == "propability")
{ {
iFlags |= conditional_propability; iFlags |= conditional_propability;
parser->getTokens(); parser->getTokens();
*parser >> Params[10].asdouble; *parser >> Params[10].asdouble;
} }
else if (str == AnsiString("memcompare")) else if (str == "memcompare")
{ {
iFlags |= conditional_memcompare; iFlags |= conditional_memcompare;
parser->getTokens(1, false); // case sensitive parser->getTokens(1, false); // case sensitive
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); str = token;
if (str != "*") //"*" - nie brac command pod uwage if (str != "*") //"*" - nie brac command pod uwage
{ // zapamiêtanie ³añcucha do porównania { // zapamiêtanie ³añcucha do porównania
Params[10].asText = new char[255]; Params[10].asText = new char[255];
@@ -121,24 +120,24 @@ void TEvent::Conditions(cParser *parser, AnsiString s)
} }
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); str = token;
if (str != "*") //"*" - nie brac val1 pod uwage if (str != "*") //"*" - nie brac val1 pod uwage
{ {
Params[11].asdouble = str.ToDouble(); Params[11].asdouble = atof(str.c_str());
iFlags |= conditional_memval1; iFlags |= conditional_memval1;
} }
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); str = token;
if (str != AnsiString("*")) //"*" - nie brac val2 pod uwage if (str != "*") //"*" - nie brac val2 pod uwage
{ {
Params[12].asdouble = str.ToDouble(); Params[12].asdouble = atof(str.c_str());
iFlags |= conditional_memval2; iFlags |= conditional_memval2;
} }
} }
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
s = AnsiString(token.c_str()); // ewentualnie dalej losowe opóŸnienie s = token; // ewentualnie dalej losowe opóŸnienie
} }
if (s == "randomdelay") if (s == "randomdelay")
{ // losowe opóŸnienie { // losowe opóŸnienie
@@ -156,7 +155,7 @@ void TEvent::Load(cParser *parser, vector3 *org)
int ti; int ti;
double tf; double tf;
std::string token; std::string token;
AnsiString str; //string str;
char *ptr; char *ptr;
bEnabled = true; // zmieniane na false dla eventów u¿ywanych do skanowania sygna³ów bEnabled = true; // zmieniane na false dla eventów u¿ywanych do skanowania sygna³ów
@@ -167,49 +166,49 @@ void TEvent::Load(cParser *parser, vector3 *org)
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
if (str == AnsiString("exit")) if (token == "exit")
Type = tp_Exit; Type = tp_Exit;
else if (str == AnsiString("updatevalues")) else if (token == "updatevalues")
Type = tp_UpdateValues; Type = tp_UpdateValues;
else if (str == AnsiString("getvalues")) else if (token == "getvalues")
Type = tp_GetValues; Type = tp_GetValues;
else if (str == AnsiString("putvalues")) else if (token == "putvalues")
Type = tp_PutValues; Type = tp_PutValues;
else if (str == AnsiString("disable")) else if (token == "disable")
Type = tp_Disable; Type = tp_Disable;
else if (str == AnsiString("sound")) else if (token == "sound")
Type = tp_Sound; Type = tp_Sound;
else if (str == AnsiString("velocity")) else if (token == "velocity")
Type = tp_Velocity; Type = tp_Velocity;
else if (str == AnsiString("animation")) else if (token == "animation")
Type = tp_Animation; Type = tp_Animation;
else if (str == AnsiString("lights")) else if (token == "lights")
Type = tp_Lights; Type = tp_Lights;
else if (str == AnsiString("visible")) else if (token == "visible")
Type = tp_Visible; // zmiana wyœwietlania obiektu Type = tp_Visible; // zmiana wyœwietlania obiektu
else if (str == AnsiString("switch")) else if (token == "switch")
Type = tp_Switch; Type = tp_Switch;
else if (str == AnsiString("dynvel")) else if (token == "dynvel")
Type = tp_DynVel; Type = tp_DynVel;
else if (str == AnsiString("trackvel")) else if (token == "trackvel")
Type = tp_TrackVel; Type = tp_TrackVel;
else if (str == AnsiString("multiple")) else if (token == "multiple")
Type = tp_Multiple; Type = tp_Multiple;
else if (str == AnsiString("addvalues")) else if (token == "addvalues")
Type = tp_AddValues; Type = tp_AddValues;
else if (str == AnsiString("copyvalues")) else if (token == "copyvalues")
Type = tp_CopyValues; Type = tp_CopyValues;
else if (str == AnsiString("whois")) else if (token == "whois")
Type = tp_WhoIs; Type = tp_WhoIs;
else if (str == AnsiString("logvalues")) else if (token == "logvalues")
Type = tp_LogValues; Type = tp_LogValues;
else if (str == AnsiString("voltage")) else if (token == "voltage")
Type = tp_Voltage; // zmiana napiêcia w zasilaczu (TractionPowerSource) Type = tp_Voltage; // zmiana napiêcia w zasilaczu (TractionPowerSource)
else if (str == AnsiString("message")) else if (token == "message")
Type = tp_Message; // wyœwietlenie komunikatu Type = tp_Message; // wyœwietlenie komunikatu
else if (str == AnsiString("friction")) else if (token == "friction")
Type = tp_Friction; // zmiana tarcia na scenerii Type = tp_Friction; // zmiana tarcia na scenerii
else else
Type = tp_Unknown; Type = tp_Unknown;
@@ -219,10 +218,10 @@ void TEvent::Load(cParser *parser, vector3 *org)
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
if (str != "none") if (token != "none")
asNodeName = str; // nazwa obiektu powi¹zanego asNodeName = token; // nazwa obiektu powi¹zanego
if (asName.substr(0, 5) == "none_") if (asName.substr(0, 5) == "none_")
Type = tp_Ignored; // Ra: takie s¹ ignorowane Type = tp_Ignored; // Ra: takie s¹ ignorowane
@@ -235,34 +234,34 @@ void TEvent::Load(cParser *parser, vector3 *org)
// if (Type==tp_UpdateValues) iFlags=0; //co modyfikowaæ // if (Type==tp_UpdateValues) iFlags=0; //co modyfikowaæ
parser->getTokens(1, false); // case sensitive parser->getTokens(1, false); // case sensitive
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
Params[0].asText = new char[str.Length() + 1]; Params[0].asText = new char[token.length() + 1];
strcpy(Params[0].asText, str.c_str()); strcpy(Params[0].asText, token.c_str());
if (str != "*") // czy ma zostaæ bez zmian? if (token != "*") // czy ma zostaæ bez zmian?
iFlags |= update_memstring; iFlags |= update_memstring;
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
if (str != "*") // czy ma zostaæ bez zmian? if (token != "*") // czy ma zostaæ bez zmian?
{ {
Params[1].asdouble = str.ToDouble(); Params[1].asdouble = atof(token.c_str());
iFlags |= update_memval1; iFlags |= update_memval1;
} }
else else
Params[1].asdouble = 0; Params[1].asdouble = 0;
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
if (str != "*") // czy ma zostaæ bez zmian? if (token != "*") // czy ma zostaæ bez zmian?
{ {
Params[2].asdouble = str.ToDouble(); Params[2].asdouble = atof(token.c_str());
iFlags |= update_memval2; iFlags |= update_memval2;
} }
else else
Params[2].asdouble = 0; Params[2].asdouble = 0;
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
Conditions(parser, token.c_str()); // sprawdzanie warunków Conditions(parser, token); // sprawdzanie warunków
break; break;
case tp_CopyValues: case tp_CopyValues:
Params[9].asText = NULL; Params[9].asText = NULL;
@@ -279,8 +278,8 @@ void TEvent::Load(cParser *parser, vector3 *org)
strcpy(Params[9].asText, token.c_str()); strcpy(Params[9].asText, token.c_str());
break; break;
case 2: // maska wartoœci case 2: // maska wartoœci
iFlags = AnsiString(token.c_str()) iFlags = stol_def(token,
.ToIntDef(update_memstring | update_memval1 | update_memval2); (update_memstring | update_memval1 | update_memval2));
break; break;
} }
parser->getTokens(); parser->getTokens();
@@ -297,8 +296,8 @@ void TEvent::Load(cParser *parser, vector3 *org)
switch (++i) switch (++i)
{ // znaczenie kolejnych parametrów { // znaczenie kolejnych parametrów
case 1: // maska wartoœci case 1: // maska wartoœci
iFlags = AnsiString(token.c_str()) iFlags = stol_def(token,
.ToIntDef(update_memstring | update_memval1 | update_memval2); (update_memstring | update_memval1 | update_memval2));
break; break;
} }
parser->getTokens(); parser->getTokens();
@@ -324,31 +323,31 @@ void TEvent::Load(cParser *parser, vector3 *org)
// Params[12].asInt=0; // Params[12].asInt=0;
parser->getTokens(1, false); // komendy 'case sensitive' parser->getTokens(1, false); // komendy 'case sensitive'
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
if (str.SubString(1, 19) == "PassengerStopPoint:") if (token.substr(0, 19) == "PassengerStopPoint:")
{ {
if (str.Pos("#")) if (token.find("#"))
str = str.SubString(1, str.Pos("#") - 1); // obciêcie unikatowoœci token = token.substr(0, token.find("#") - 1); // obciêcie unikatowoœci
bEnabled = false; // nie do kolejki (dla SetVelocity te¿, ale jak jest do toru bEnabled = false; // nie do kolejki (dla SetVelocity te¿, ale jak jest do toru
// dowi¹zany) // dowi¹zany)
Params[6].asCommand = cm_PassengerStopPoint; Params[6].asCommand = cm_PassengerStopPoint;
} }
else if (str == "SetVelocity") else if (token == "SetVelocity")
{ {
bEnabled = false; bEnabled = false;
Params[6].asCommand = cm_SetVelocity; Params[6].asCommand = cm_SetVelocity;
} }
else if (str == "RoadVelocity") else if (token == "RoadVelocity")
{ {
bEnabled = false; bEnabled = false;
Params[6].asCommand = cm_RoadVelocity; Params[6].asCommand = cm_RoadVelocity;
} }
else if (str == "SectionVelocity") else if (token == "SectionVelocity")
{ {
bEnabled = false; bEnabled = false;
Params[6].asCommand = cm_SectionVelocity; Params[6].asCommand = cm_SectionVelocity;
} }
else if (str == "ShuntVelocity") else if (token == "ShuntVelocity")
{ {
bEnabled = false; bEnabled = false;
Params[6].asCommand = cm_ShuntVelocity; Params[6].asCommand = cm_ShuntVelocity;
@@ -358,44 +357,44 @@ void TEvent::Load(cParser *parser, vector3 *org)
// bEnabled = false; // bEnabled = false;
// Params[6].asCommand = cm_SetProximityVelocity; // Params[6].asCommand = cm_SetProximityVelocity;
//} //}
else if (str == "OutsideStation") else if (token == "OutsideStation")
{ {
bEnabled = false; // ma byæ skanowny, aby AI nie przekracza³o W5 bEnabled = false; // ma byæ skanowny, aby AI nie przekracza³o W5
Params[6].asCommand = cm_OutsideStation; Params[6].asCommand = cm_OutsideStation;
} }
else else
Params[6].asCommand = cm_Unknown; Params[6].asCommand = cm_Unknown;
Params[0].asText = new char[str.Length() + 1]; Params[0].asText = new char[token.length() + 1];
strcpy(Params[0].asText, str.c_str()); strcpy(Params[0].asText, token.c_str());
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
if (str == "none") if (token == "none")
Params[1].asdouble = 0.0; Params[1].asdouble = 0.0;
else else
try try
{ {
Params[1].asdouble = str.ToDouble(); Params[1].asdouble = atof(token.c_str());
} }
catch (...) catch (...)
{ {
Params[1].asdouble = 0.0; Params[1].asdouble = 0.0;
WriteLog("Error: number expected in PutValues event, found: " + str); WriteLog("Error: number expected in PutValues event, found: " + token);
} }
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
if (str == "none") if (token == "none")
Params[2].asdouble = 0.0; Params[2].asdouble = 0.0;
else else
try try
{ {
Params[2].asdouble = str.ToDouble(); Params[2].asdouble = atof(token.c_str());
} }
catch (...) catch (...)
{ {
Params[2].asdouble = 0.0; Params[2].asdouble = 0.0;
WriteLog("Error: number expected in PutValues event, found: " + str); WriteLog("Error: number expected in PutValues event, found: " + token);
} }
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
@@ -408,9 +407,9 @@ void TEvent::Load(cParser *parser, vector3 *org)
*parser >> token; *parser >> token;
if (token.compare("endevent") != 0) if (token.compare("endevent") != 0)
{ {
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
if (i < 8) if (i < 8)
Params[i].asdouble = str.ToDouble(); // teraz mo¿e mieæ u³amek Params[i].asdouble = atof(token.c_str()); // teraz mo¿e mieæ u³amek
i++; i++;
} }
} while (token.compare("endevent") != 0); } while (token.compare("endevent") != 0);
@@ -418,16 +417,16 @@ void TEvent::Load(cParser *parser, vector3 *org)
case tp_Visible: // zmiana wyœwietlania obiektu case tp_Visible: // zmiana wyœwietlania obiektu
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
Params[0].asInt = str.ToInt(); Params[0].asInt = atoi(token.c_str());
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
break; break;
case tp_Velocity: case tp_Velocity:
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
Params[0].asdouble = str.ToDouble() * 0.28; Params[0].asdouble = atof(token.c_str()) * 0.28;
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
break; break;
@@ -443,7 +442,7 @@ void TEvent::Load(cParser *parser, vector3 *org)
*parser >> token; *parser >> token;
break; break;
case tp_Exit: case tp_Exit:
while ((ptr = strchr(asNodeName.c_str(), '_')) != NULL) while ((ptr = strchr(strdup(asNodeName.c_str()), '_')) != NULL)
*ptr = ' '; *ptr = ' ';
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
@@ -513,20 +512,20 @@ void TEvent::Load(cParser *parser, vector3 *org)
*parser >> Params[0].asInt; *parser >> Params[0].asInt;
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
if (str != "endevent") if (token != "endevent")
{ {
Params[1].asdouble = str.ToDouble(); // prêdkoœæ liniowa ruchu iglic Params[1].asdouble = atof(token.c_str()); // prêdkoœæ liniowa ruchu iglic
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
} }
else else
Params[1].asdouble = -1.0; // u¿yæ domyœlnej Params[1].asdouble = -1.0; // u¿yæ domyœlnej
if (str != "endevent") if (token != "endevent")
{ {
Params[2].asdouble = Params[2].asdouble =
str.ToDouble(); // dodatkowy ruch drugiej iglicy (zamkniêcie nastawnicze) atof(token.c_str()); // dodatkowy ruch drugiej iglicy (zamkniêcie nastawnicze)
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
} }
@@ -550,16 +549,16 @@ void TEvent::Load(cParser *parser, vector3 *org)
ti = 0; // flaga dla else ti = 0; // flaga dla else
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
while (str != AnsiString("endevent") && str != AnsiString("condition") && while (token != "endevent" && token != "condition" &&
str != AnsiString("randomdelay")) token != "randomdelay")
{ {
if ((str.SubString(1, 5) != "none_") ? (i < 8) : false) if ((token.substr(0, 5) != "none_") ? (i < 8) : false)
{ // eventy rozpoczynaj¹ce siê od "none_" s¹ ignorowane { // eventy rozpoczynaj¹ce siê od "none_" s¹ ignorowane
if (str != "else") if (token != "else")
{ {
Params[i].asText = new char[255]; Params[i].asText = new char[255];
strcpy(Params[i].asText, str.c_str()); strcpy(Params[i].asText, token.c_str());
if (ti) if (ti)
iFlags |= conditional_else << i; // oflagowanie dla eventów "else" iFlags |= conditional_else << i; // oflagowanie dla eventów "else"
i++; i++;
@@ -568,14 +567,14 @@ void TEvent::Load(cParser *parser, vector3 *org)
ti = !ti; // zmiana flagi dla s³owa "else" ti = !ti; // zmiana flagi dla s³owa "else"
} }
else if (i >= 8) else if (i >= 8)
ErrorLog("Bad event: \"" + string(str.c_str()) + "\" ignored in multiple \"" + asName + "\"!"); ErrorLog("Bad event: \"" + token + "\" ignored in multiple \"" + asName + "\"!");
else else
WriteLog("Event \"" + string(str.c_str()) + "\" ignored in multiple \"" + asName + "\"!"); WriteLog("Event \"" + token + "\" ignored in multiple \"" + asName + "\"!");
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
} }
Conditions(parser, str); // sprawdzanie warunków Conditions(parser, token); // sprawdzanie warunków
break; break;
case tp_Voltage: // zmiana napiêcia w zasilaczu (TractionPowerSource) case tp_Voltage: // zmiana napiêcia w zasilaczu (TractionPowerSource)
case tp_Friction: // zmiana przyczepnosci na scenerii case tp_Friction: // zmiana przyczepnosci na scenerii
@@ -589,8 +588,8 @@ void TEvent::Load(cParser *parser, vector3 *org)
{ {
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
} while (str != "endevent"); } while (token != "endevent");
break; break;
case tp_Ignored: // ignorowany case tp_Ignored: // ignorowany
case tp_Unknown: // nieznany case tp_Unknown: // nieznany
@@ -598,8 +597,8 @@ void TEvent::Load(cParser *parser, vector3 *org)
{ {
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // str = AnsiString(token.c_str());
} while (str != "endevent"); } while (token != "endevent");
WriteLog("Bad event: \"" + asName + WriteLog("Bad event: \"" + asName +
(Type == tp_Unknown ? "\" has unknown type." : "\" is ignored.")); (Type == tp_Unknown ? "\" has unknown type." : "\" is ignored."));
break; break;
@@ -619,14 +618,14 @@ void TEvent::AddToQuery(TEvent *e)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
AnsiString TEvent::CommandGet() string TEvent::CommandGet()
{ // odczytanie komendy z eventu { // odczytanie komendy z eventu
switch (Type) switch (Type)
{ // to siê wykonuje równie¿ sk³adu jad¹cego bez obs³ugi { // to siê wykonuje równie¿ sk³adu jad¹cego bez obs³ugi
case tp_GetValues: case tp_GetValues:
return String(Params[9].asMemCell->Text()); return string(Params[9].asMemCell->Text());
case tp_PutValues: case tp_PutValues:
return String(Params[0].asText); return string(Params[0].asText);
} }
return ""; // inne eventy siê nie licz¹ return ""; // inne eventy siê nie licz¹
}; };

10
Event.h
View File

@@ -10,11 +10,13 @@ http://mozilla.org/MPL/2.0/.
#ifndef EventH #ifndef EventH
#define EventH #define EventH
#include <system.hpp>
#include "Classes.h" #include "Classes.h"
#include "dumb3d.h" #include "dumb3d.h"
#include <string> #include <string>
using namespace Math3D; using namespace Math3D;
using namespace std;
typedef enum typedef enum
{ {
@@ -83,7 +85,7 @@ union TParam
class TEvent // zmienne: ev* class TEvent // zmienne: ev*
{ // zdarzenie { // zdarzenie
private: private:
void Conditions(cParser *parser, AnsiString s); void Conditions(cParser *parser, string s);
public: public:
std::string asName; std::string asName;
@@ -98,16 +100,16 @@ class TEvent // zmienne: ev*
TDynamicObject *Activator; TDynamicObject *Activator;
TParam Params[13]; // McZapkie-070502 //Ra: zamieniæ to na union/struct TParam Params[13]; // McZapkie-070502 //Ra: zamieniæ to na union/struct
unsigned int iFlags; // zamiast Params[8] z flagami warunku unsigned int iFlags; // zamiast Params[8] z flagami warunku
AnsiString asNodeName; // McZapkie-100302 - dodalem zeby zapamietac nazwe toru string asNodeName; // McZapkie-100302 - dodalem zeby zapamietac nazwe toru
TEvent *evJoined; // kolejny event z t¹ sam¹ nazw¹ - od wersji 378 TEvent *evJoined; // kolejny event z t¹ sam¹ nazw¹ - od wersji 378
double fRandomDelay; // zakres dodatkowego opóŸnienia double fRandomDelay; // zakres dodatkowego opóŸnienia
public: // metody public: // metody
TEvent(AnsiString m = ""); TEvent(string m = "");
~TEvent(); ~TEvent();
void Init(); void Init();
void Load(cParser *parser, vector3 *org); void Load(cParser *parser, vector3 *org);
void AddToQuery(TEvent *e); void AddToQuery(TEvent *e);
AnsiString CommandGet(); string CommandGet();
TCommandType Command(); TCommandType Command();
double ValueGet(int n); double ValueGet(int n);
vector3 PositionGet(); vector3 PositionGet();

View File

@@ -24,8 +24,11 @@ http://mozilla.org/MPL/2.0/.
#include <Controls.hpp> //do odczytu daty #include <Controls.hpp> //do odczytu daty
#include "World.h" #include "World.h"
#include <ostream> #include <ostream>
#include <fstream>
#include <iomanip> #include <iomanip>
#include <ctype.h> #include <ctype.h>
#include <cctype>
// namespace Global { // namespace Global {
// parametry do u¿ytku wewnêtrznego // parametry do u¿ytku wewnêtrznego
@@ -123,7 +126,7 @@ double Global::fMoveLight = -1; // ruchome
double Global::fLatitudeDeg = 52.0; // szerokoϾ geograficzna double Global::fLatitudeDeg = 52.0; // szerokoϾ geograficzna
float Global::fFriction = 1.0; // mno¿nik tarcia - KURS90 float Global::fFriction = 1.0; // mno¿nik tarcia - KURS90
double Global::fBrakeStep = 1.0; // krok zmiany hamulca dla klawiszy [Num3] i [Num9] double Global::fBrakeStep = 1.0; // krok zmiany hamulca dla klawiszy [Num3] i [Num9]
std::string Global::asLang = "pl"; // domyœlny jêzyk - http://tools.ietf.org/html/bcp47 AnsiString Global::asLang = "pl"; // domyœlny jêzyk - http://tools.ietf.org/html/bcp47
// parametry wydajnoœciowe (np. regulacja FPS, szybkoœæ wczytywania) // parametry wydajnoœciowe (np. regulacja FPS, szybkoœæ wczytywania)
bool Global::bAdjustScreenFreq = true; bool Global::bAdjustScreenFreq = true;
@@ -215,16 +218,19 @@ void Global::LoadIniFile(std::string asFileName)
pFreeCameraInit[i] = vector3(0, 0, 0); // wspó³rzêdne w scenerii pFreeCameraInit[i] = vector3(0, 0, 0); // wspó³rzêdne w scenerii
pFreeCameraInitAngle[i] = vector3(0, 0, 0); // k¹ty obrotu w radianach pFreeCameraInitAngle[i] = vector3(0, 0, 0); // k¹ty obrotu w radianach
} }
TFileStream *fs; ifstream f = ifstream(asFileName.c_str());
fs = new TFileStream(asFileName, fmOpenRead | fmShareCompat); stringstream buffer;
if (!fs) buffer << f.rdbuf();
return; //TFileStream *fs;
std::string str = ""; // fs = new TFileStream(asFileName, fmOpenRead | fmShareCompat);
int size = fs->Size; // if (!fs)
str.SetLength(size); // return;
fs->Read(str.c_str(), size); AnsiString str = AnsiString(buffer.str().c_str());
//int size = fs->Size;
//str.SetLength(size);
//fs->Read(str.c_str(), size);
// str+=""; // str+="";
delete fs; //delete fs;
TQueryParserComp *Parser; TQueryParserComp *Parser;
Parser = new TQueryParserComp(NULL); Parser = new TQueryParserComp(NULL);
Parser->TextToParse = str; Parser->TextToParse = str;
@@ -251,7 +257,7 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp)
else if (str == AnsiString("humanctrlvehicle")) else if (str == AnsiString("humanctrlvehicle"))
{ {
str = GetNextSymbol().LowerCase(); str = GetNextSymbol().LowerCase();
asHumanCtrlVehicle = str; asHumanCtrlVehicle = string(str.c_str());
} }
else if (str == AnsiString("width")) else if (str == AnsiString("width"))
iWindowWidth = GetNextSymbol().ToInt(); iWindowWidth = GetNextSymbol().ToInt();
@@ -801,9 +807,9 @@ void TTranscripts::AddLine(char *txt, float show, float hide, bool it)
aLines[j].fHide = hide; // wyœwietlaæ do aLines[j].fHide = hide; // wyœwietlaæ do
aLines[j].bItalic = it; aLines[j].bItalic = it;
aLines[j].asText = std::string(txt); // bez sensu, wystarczy³by wskaŸnik aLines[j].asText = std::string(txt); // bez sensu, wystarczy³by wskaŸnik
if ((k = aLines[j].asText.Pos("|")) > 0) if ((k = aLines[j].asText.find("|")) != std::string::npos)
{ // jak jest podzia³ linijki na wiersze { // jak jest podzia³ linijki na wiersze
aLines[j].asText = aLines[j].asText.SubString(1, k - 1); aLines[j].asText = aLines[j].asText.substr(0, k - 1);
txt += k; txt += k;
i = j; // kolejna linijka dopisywana bêdzie na koniec w³aœnie dodanej i = j; // kolejna linijka dopisywana bêdzie na koniec w³aœnie dodanej
} }
@@ -988,6 +994,28 @@ std::string to_hex_str(double _Val, int precision, int width)
return o.str(); return o.str();
}; };
int stol_def(const std::string &str, const int &DefaultValue)
{
// this function was developed iteratively on Codereview.stackexchange
// with the assistance of @Corbin
std::size_t len = str.size();
while (std::isspace(str[len - 1]))
len--;
if (len == 0)
return DefaultValue;
errno = 0;
char *s = new char[len + 1];
std::strncpy(s, str.c_str(), len);
char *p;
int result = strtol(s, &p, 0);
if ((*p != '\0') || (errno != 0))
{
return DefaultValue;
}
delete s;
return result;
}
std::string ToLower(std::string text) std::string ToLower(std::string text)
{ {
std::transform(text.begin(), text.end(), text.begin(), ::tolower); std::transform(text.begin(), text.end(), text.begin(), ::tolower);

View File

@@ -308,7 +308,7 @@ class Global
static bool bSmudge; // czy wyœwietlaæ smugê, a pojazd u¿ytkownika na koñcu static bool bSmudge; // czy wyœwietlaæ smugê, a pojazd u¿ytkownika na koñcu
static std::string asTranscript[5]; // napisy na ekranie (widoczne) static std::string asTranscript[5]; // napisy na ekranie (widoczne)
static TTranscripts tranTexts; // obiekt obs³uguj¹cy stenogramy dŸwiêków na ekranie static TTranscripts tranTexts; // obiekt obs³uguj¹cy stenogramy dŸwiêków na ekranie
static std::string asLang; // domyœlny jêzyk - http://tools.ietf.org/html/bcp47 static AnsiString asLang; // domyœlny jêzyk - http://tools.ietf.org/html/bcp47
static int iHiddenEvents; // czy ³¹czyæ eventy z torami poprzez nazwê toru static int iHiddenEvents; // czy ³¹czyæ eventy z torami poprzez nazwê toru
static TTextSound *tsRadioBusy[10]; // zajêtoœæ kana³ów radiowych (wskaŸnik na odgrywany dŸwiêk) static TTextSound *tsRadioBusy[10]; // zajêtoœæ kana³ów radiowych (wskaŸnik na odgrywany dŸwiêk)
static int iPoKeysPWM[7]; // numery wejϾ dla PWM static int iPoKeysPWM[7]; // numery wejϾ dla PWM
@@ -335,6 +335,7 @@ class Global
std::string to_string(double _Val, int precision, int width); std::string to_string(double _Val, int precision, int width);
std::string to_hex_str(int _Val, int precision = 0, int width = 0); std::string to_hex_str(int _Val, int precision = 0, int width = 0);
int stol_def(const std::string & str, const int & DefaultValue);
std::string ToLower(std::string text); std::string ToLower(std::string text);
std::string ToUpper(std::string text); std::string ToUpper(std::string text);

View File

@@ -46,7 +46,7 @@ http://mozilla.org/MPL/2.0/.
#pragma package(smart_init) #pragma package(smart_init)
bool bCondition; // McZapkie: do testowania warunku na event multiple bool bCondition; // McZapkie: do testowania warunku na event multiple
AnsiString LogComment; string LogComment;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Obiekt renderuj¹cy siatkê jest sztucznie tworzonym obiektem pomocniczym, // Obiekt renderuj¹cy siatkê jest sztucznie tworzonym obiektem pomocniczym,
@@ -1403,10 +1403,10 @@ TGroundNode * TGround::FindGroundNode(std::string asNameToFind, TGroundNodeType
double fTrainSetVel = 0; double fTrainSetVel = 0;
double fTrainSetDir = 0; double fTrainSetDir = 0;
double fTrainSetDist = 0; // odleg³oœæ sk³adu od punktu 1 w stronê punktu 2 double fTrainSetDist = 0; // odleg³oœæ sk³adu od punktu 1 w stronê punktu 2
AnsiString asTrainSetTrack = ""; string asTrainSetTrack = "";
int iTrainSetConnection = 0; int iTrainSetConnection = 0;
bool bTrainSet = false; bool bTrainSet = false;
AnsiString asTrainName = ""; string asTrainName = "";
int iTrainSetWehicleNumber = 0; int iTrainSetWehicleNumber = 0;
TGroundNode *nTrainSetNode = NULL; // poprzedni pojazd do ³¹czenia TGroundNode *nTrainSetNode = NULL; // poprzedni pojazd do ³¹czenia
TGroundNode *nTrainSetDriver = NULL; // pojazd, któremu zostanie wys³any rozk³ad TGroundNode *nTrainSetDriver = NULL; // pojazd, któremu zostanie wys³any rozk³ad
@@ -1543,7 +1543,7 @@ void TGround::RaTriangleDivider(TGroundNode *node)
TGroundNode * TGround::AddGroundNode(cParser *parser) TGroundNode * TGround::AddGroundNode(cParser *parser)
{ // wczytanie wpisu typu "node" { // wczytanie wpisu typu "node"
// parser->LoadTraction=Global::bLoadTraction; //Ra: tu nie potrzeba powtarzaæ // parser->LoadTraction=Global::bLoadTraction; //Ra: tu nie potrzeba powtarzaæ
AnsiString str, str1, str2, str3, str4, Skin, DriverType, asNodeName; string str, str1, str2, str3, str4, Skin, DriverType, asNodeName;
int nv, ti, i, n; int nv, ti, i, n;
double tf, r, rmin, tf1, tf2, tf3, tf4, l, dist, mgn; double tf, r, rmin, tf1, tf2, tf3, tf4, l, dist, mgn;
int int1, int2; int int1, int2;
@@ -1559,13 +1559,14 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
*parser >> r >> rmin; *parser >> r >> rmin;
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
asNodeName = AnsiString(token.c_str()); asNodeName = token;
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); str = token;
//str = AnsiString(token.c_str());
TGroundNode *tmp, *tmp2; TGroundNode *tmp, *tmp2;
tmp = new TGroundNode(); tmp = new TGroundNode();
tmp->asName = (asNodeName == AnsiString("none") ? AnsiString("") : asNodeName); tmp->asName = (asNodeName == "none" ? string("") : asNodeName);
if (r >= 0) if (r >= 0)
tmp->fSquareRadius = r * r; tmp->fSquareRadius = r * r;
tmp->fSquareMinRadius = rmin * rmin; tmp->fSquareMinRadius = rmin * rmin;
@@ -1604,12 +1605,12 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
// WriteLog("-> node "+str+" "+tmp->asName); // WriteLog("-> node "+str+" "+tmp->asName);
if (bError) if (bError)
{ {
Error(AnsiString("Scene parse error near " + str).c_str()); Error("Scene parse error near " + str);
for (int i = 0; i < 60; ++i) for (int i = 0; i < 60; ++i)
{ // Ra: skopiowanie dalszej czêœci do logu - taka prowizorka, lepsza ni¿ nic { // Ra: skopiowanie dalszej czêœci do logu - taka prowizorka, lepsza ni¿ nic
parser->getTokens(); // pobranie linijki tekstu nie dzia³a parser->getTokens(); // pobranie linijki tekstu nie dzia³a
*parser >> token; *parser >> token;
WriteLog(token.c_str()); WriteLog(token);
} }
// if (tmp==RootNode) RootNode=NULL; // if (tmp==RootNode) RootNode=NULL;
delete tmp; delete tmp;
@@ -1621,7 +1622,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
tmp->hvTraction = new TTraction(); tmp->hvTraction = new TTraction();
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
tmp->hvTraction->asPowerSupplyName = AnsiString(token.c_str()); // nazwa zasilacza tmp->hvTraction->asPowerSupplyName = token; // nazwa zasilacza
parser->getTokens(3); parser->getTokens(3);
*parser >> tmp->hvTraction->NominalVoltage >> tmp->hvTraction->MaxCurrent >> *parser >> tmp->hvTraction->NominalVoltage >> tmp->hvTraction->MaxCurrent >>
tmp->hvTraction->fResistivity; tmp->hvTraction->fResistivity;
@@ -1688,7 +1689,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
{ // jawne wskazanie innego przês³a, na które mo¿e przestawiæ siê pantograf { // jawne wskazanie innego przês³a, na które mo¿e przestawiæ siê pantograf
parser->getTokens(); parser->getTokens();
*parser >> token; // wypada³o by to zapamiêtaæ... *parser >> token; // wypada³o by to zapamiêtaæ...
tmp->hvTraction->asParallel = AnsiString(token.c_str()); tmp->hvTraction->asParallel = token;
parser->getTokens(); parser->getTokens();
*parser >> token; // a tu ju¿ powinien byæ koniec *parser >> token; // a tu ju¿ powinien byæ koniec
} }
@@ -1714,7 +1715,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
tmp->pCenter += pOrigin; tmp->pCenter += pOrigin;
tmp->MemCell = new TMemCell(&tmp->pCenter); tmp->MemCell = new TMemCell(&tmp->pCenter);
tmp->MemCell->Load(parser); tmp->MemCell->Load(parser);
if (!tmp->asName.IsEmpty()) // jest pusta gdy "none" if (!tmp->asName.empty()) // jest pusta gdy "none"
{ // dodanie do wyszukiwarki { // dodanie do wyszukiwarki
if (sTracks->Update(TP_MEMCELL, tmp->asName.c_str(), if (sTracks->Update(TP_MEMCELL, tmp->asName.c_str(),
tmp)) // najpierw sprawdziæ, czy ju¿ jest tmp)) // najpierw sprawdziæ, czy ju¿ jest
@@ -1737,11 +1738,11 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
case TP_TRACK: case TP_TRACK:
tmp->pTrack = new TTrack(tmp); tmp->pTrack = new TTrack(tmp);
if (Global::iWriteLogEnabled & 4) if (Global::iWriteLogEnabled & 4)
if (!tmp->asName.IsEmpty()) if (!tmp->asName.empty())
WriteLog(tmp->asName.c_str()); WriteLog(tmp->asName);
tmp->pTrack->Load(parser, pOrigin, tmp->pTrack->Load(parser, pOrigin,
tmp->asName); // w nazwie mo¿e byæ nazwa odcinka izolowanego tmp->asName); // w nazwie mo¿e byæ nazwa odcinka izolowanego
if (!tmp->asName.IsEmpty()) // jest pusta gdy "none" if (!tmp->asName.empty()) // jest pusta gdy "none"
{ // dodanie do wyszukiwarki { // dodanie do wyszukiwarki
if (sTracks->Update(TP_TRACK, tmp->asName.c_str(), if (sTracks->Update(TP_TRACK, tmp->asName.c_str(),
tmp)) // najpierw sprawdziæ, czy ju¿ jest tmp)) // najpierw sprawdziæ, czy ju¿ jest
@@ -1766,8 +1767,9 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
tmp->pCenter += pOrigin; tmp->pCenter += pOrigin;
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); str = token;
tmp->tsStaticSound->Init(str.c_str(), sqrt(tmp->fSquareRadius), tmp->pCenter.x, //str = AnsiString(token.c_str());
tmp->tsStaticSound->Init(strdup(str.c_str()), sqrt(tmp->fSquareRadius), tmp->pCenter.x,
tmp->pCenter.y, tmp->pCenter.z, false, rmin); tmp->pCenter.y, tmp->pCenter.z, false, rmin);
if (rmin < 0.0) if (rmin < 0.0)
rmin = rmin =
@@ -1783,14 +1785,14 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
// tmp->DynamicObject->Load(Parser); // tmp->DynamicObject->Load(Parser);
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str1 = AnsiString(token.c_str()); // katalog str1 = token; // katalog
// McZapkie: doszedl parametr ze zmienialna skora // McZapkie: doszedl parametr ze zmienialna skora
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
Skin = AnsiString(token.c_str()); // tekstura wymienna Skin = token; // tekstura wymienna
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str3 = AnsiString(token.c_str()); // McZapkie-131102: model w MMD str3 = token; // McZapkie-131102: model w MMD
if (bTrainSet) if (bTrainSet)
{ // jeœli pojazd jest umieszczony w sk³adzie { // jeœli pojazd jest umieszczony w sk³adzie
str = asTrainSetTrack; str = asTrainSetTrack;
@@ -1798,22 +1800,22 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
*parser >> tf1; // Ra: -1 oznacza odwrotne wstawienie, normalnie w sk³adzie 0 *parser >> tf1; // Ra: -1 oznacza odwrotne wstawienie, normalnie w sk³adzie 0
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
DriverType = AnsiString(token.c_str()); // McZapkie:010303 - w przyszlosci rozne DriverType = token; // McZapkie:010303 - w przyszlosci rozne
// konfiguracje mechanik/pomocnik itp // konfiguracje mechanik/pomocnik itp
tf3 = fTrainSetVel; // prêdkoœæ tf3 = fTrainSetVel; // prêdkoœæ
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str4 = AnsiString(token.c_str()); str4 = token;
int2 = str4.Pos("."); // yB: wykorzystuje tutaj zmienna, ktora potem bedzie ladunkiem int2 = str4.find("."); // yB: wykorzystuje tutaj zmienna, ktora potem bedzie ladunkiem
if (int2 > 0) // yB: jesli znalazl kropke, to ja przetwarza jako parametry if (int2 != string::npos) // yB: jesli znalazl kropke, to ja przetwarza jako parametry
{ {
int dlugosc = str4.Length(); int dlugosc = str4.length();
int1 = str4.SubString(1, int2 - 1).ToInt(); // niech sprzegiem bedzie do kropki cos int1 = atoi(str4.substr(0, int2 - 1).c_str()); // niech sprzegiem bedzie do kropki cos
str4 = str4.SubString(int2 + 1, dlugosc - int2); str4 = str4.substr(int2 + 1, dlugosc - int2);
} }
else else
{ {
int1 = str4.ToInt(); int1 = atoi(str4.c_str());
str4 = ""; str4 = "";
} }
int2 = 0; // zeruje po wykorzystaniu int2 = 0; // zeruje po wykorzystaniu
@@ -1834,12 +1836,12 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
// sk³adu (trainset) // sk³adu (trainset)
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // track str = token; // track
parser->getTokens(); parser->getTokens();
*parser >> tf1; // Ra: -1 oznacza odwrotne wstawienie *parser >> tf1; // Ra: -1 oznacza odwrotne wstawienie
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
DriverType = AnsiString(token.c_str()); // McZapkie:010303: obsada DriverType = token; // McZapkie:010303: obsada
parser->getTokens(); parser->getTokens();
*parser >> *parser >>
tf3; // prêdkoœæ, niektórzy wpisuj¹ tu "3" jako sprzêg, ¿eby nie by³o tabliczki tf3; // prêdkoœæ, niektórzy wpisuj¹ tu "3" jako sprzêg, ¿eby nie by³o tabliczki
@@ -1852,8 +1854,8 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
{ // je¿eli ³adunku jest wiêcej ni¿ 0, to rozpoznajemy jego typ { // je¿eli ³adunku jest wiêcej ni¿ 0, to rozpoznajemy jego typ
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str2 = AnsiString(token.c_str()); // LoadType str2 = token; // LoadType
if (str2 == AnsiString("enddynamic")) // idiotoodpornoœæ: ³adunek bez podanego typu if (str2 == "enddynamic") // idiotoodpornoœæ: ³adunek bez podanego typu
{ {
str2 = ""; str2 = "";
int2 = 0; // iloœæ bez typu siê nie liczy jako ³adunek int2 = 0; // iloœæ bez typu siê nie liczy jako ³adunek
@@ -1917,7 +1919,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
if (tmp) if (tmp)
tmp->DynamicObject->asDestination = AnsiString(token.c_str()); tmp->DynamicObject->asDestination = token;
*parser >> token; *parser >> token;
} }
if (token.compare("enddynamic") != 0) if (token.compare("enddynamic") != 0)
@@ -1987,7 +1989,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
// tmp->nNode[i].asName= // tmp->nNode[i].asName=
} }
} }
else if (!tmp->asName.IsEmpty()) // jest pusta gdy "none" else if (!tmp->asName.empty()) // jest pusta gdy "none"
{ // dodanie do wyszukiwarki { // dodanie do wyszukiwarki
if (sTracks->Update(TP_MODEL, tmp->asName.c_str(), if (sTracks->Update(TP_MODEL, tmp->asName.c_str(),
tmp)) // najpierw sprawdziæ, czy ju¿ jest tmp)) // najpierw sprawdziæ, czy ju¿ jest
@@ -2051,12 +2053,12 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
} }
str = AnsiString(token.c_str()); str = token;
#ifdef _PROBLEND #ifdef _PROBLEND
// PROBLEND Q: 13122011 - Szociu: 27012012 // PROBLEND Q: 13122011 - Szociu: 27012012
PROBLEND = true; // domyslnie uruchomione nowe wyœwietlanie PROBLEND = true; // domyslnie uruchomione nowe wyœwietlanie
tmp->PROBLEND = true; // odwolanie do tgroundnode, bo rendering jest w tej klasie tmp->PROBLEND = true; // odwolanie do tgroundnode, bo rendering jest w tej klasie
if (str.Pos("@") > 0) // sprawdza, czy w nazwie tekstury jest znak "@" if (str.find("@") != string::npos) // sprawdza, czy w nazwie tekstury jest znak "@"
{ {
PROBLEND = false; // jeœli jest, wyswietla po staremu PROBLEND = false; // jeœli jest, wyswietla po staremu
tmp->PROBLEND = false; tmp->PROBLEND = false;
@@ -2174,8 +2176,8 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
*parser >> token; *parser >> token;
do do
{ {
str = AnsiString(token.c_str()); str = token;
TempVerts[i].Point.x = str.ToDouble(); TempVerts[i].Point.x = atof(str.c_str());
parser->getTokens(2); parser->getTokens(2);
*parser >> TempVerts[i].Point.y >> TempVerts[i].Point.z; *parser >> TempVerts[i].Point.y >> TempVerts[i].Point.z;
TempVerts[i].Point.RotateZ(aRotate.z / 180 * M_PI); TempVerts[i].Point.RotateZ(aRotate.z / 180 * M_PI);
@@ -2223,7 +2225,7 @@ TSubRect * TGround::GetSubRect(int iCol, int iRow)
return (Rects[br][bc].SafeGetRect(sc, sr)); // pobranie ma³ego kwadratu return (Rects[br][bc].SafeGetRect(sc, sr)); // pobranie ma³ego kwadratu
} }
TEvent * TGround::FindEvent(const AnsiString &asEventName) TEvent * TGround::FindEvent(const string &asEventName)
{ {
return (TEvent *)sTracks->Find(0, asEventName.c_str()); // wyszukiwanie w drzewie return (TEvent *)sTracks->Find(0, asEventName.c_str()); // wyszukiwanie w drzewie
/* //powolna wyszukiwarka /* //powolna wyszukiwarka
@@ -2236,15 +2238,15 @@ TEvent * TGround::FindEvent(const AnsiString &asEventName)
*/ */
} }
TEvent * TGround::FindEventScan(const AnsiString &asEventName) TEvent * TGround::FindEventScan(const string &asEventName)
{ // wyszukanie eventu z opcj¹ utworzenia niejawnego dla komórek skanowanych { // wyszukanie eventu z opcj¹ utworzenia niejawnego dla komórek skanowanych
TEvent *e = (TEvent *)sTracks->Find(0, asEventName.c_str()); // wyszukiwanie w drzewie eventów TEvent *e = (TEvent *)sTracks->Find(0, asEventName.c_str()); // wyszukiwanie w drzewie eventów
if (e) if (e)
return e; // jak istnieje, to w porz¹dku return e; // jak istnieje, to w porz¹dku
if (asEventName.SubString(asEventName.Length() - 4, 5) == if (asEventName.substr(asEventName.length() - 4, 5) ==
":scan") // jeszcze mo¿e byæ event niejawny ":scan") // jeszcze mo¿e byæ event niejawny
{ // no to szukamy komórki pamiêci o nazwie zawartej w evencie { // no to szukamy komórki pamiêci o nazwie zawartej w evencie
AnsiString n = asEventName.SubString(1, asEventName.Length() - 5); // do dwukropka string n = asEventName.substr(0, asEventName.length() - 5); // do dwukropka
if (sTracks->Find(TP_MEMCELL, n.c_str())) // jeœli jest takowa komórka pamiêci if (sTracks->Find(TP_MEMCELL, n.c_str())) // jeœli jest takowa komórka pamiêci
e = new TEvent(n); // utworzenie niejawnego eventu jej odczytu e = new TEvent(n); // utworzenie niejawnego eventu jej odczytu
} }
@@ -2269,13 +2271,13 @@ void TGround::FirstInit()
srGlobal.NodeAdd(Current); // dodanie do globalnego obiektu srGlobal.NodeAdd(Current); // dodanie do globalnego obiektu
else if (i == TP_TERRAIN) else if (i == TP_TERRAIN)
{ // specjalne przetwarzanie terenu wczytanego z pliku E3D { // specjalne przetwarzanie terenu wczytanego z pliku E3D
AnsiString xxxzzz; // nazwa kwadratu string xxxzzz; // nazwa kwadratu
TGroundRect *gr; TGroundRect *gr;
for (j = 1; j < Current->iCount; ++j) for (j = 1; j < Current->iCount; ++j)
{ // od 1 do koñca s¹ zestawy trójk¹tów { // od 1 do koñca s¹ zestawy trójk¹tów
xxxzzz = AnsiString(Current->nNode[j].smTerrain->pName); // pobranie nazwy xxxzzz = string(Current->nNode[j].smTerrain->pName); // pobranie nazwy
gr = GetRect(1000 * (xxxzzz.SubString(1, 3).ToIntDef(0) - 500), gr = GetRect(1000 * (stol_def(xxxzzz.substr(0, 3),0) - 500),
1000 * (xxxzzz.SubString(4, 3).ToIntDef(0) - 500)); 1000 * (stol_def(xxxzzz.substr(3, 3),0) - 500));
if (Global::bUseVBO) if (Global::bUseVBO)
gr->nTerrain = Current->nNode + j; // zapamiêtanie gr->nTerrain = Current->nNode + j; // zapamiêtanie
else else
@@ -2364,13 +2366,13 @@ void TGround::FirstInit()
bool TGround::Init(std::string asFile, HDC hDC) bool TGround::Init(std::string asFile, HDC hDC)
{ // g³ówne wczytywanie scenerii { // g³ówne wczytywanie scenerii
if (AnsiString(asFile.c_str()).LowerCase().SubString(1, 7) == "scenery") if (ToLower(asFile).substr(0, 7) == "scenery")
AnsiString(asFile.c_str()).Delete(1, 8); // Ra: usuniêcie niepotrzebnych znaków - zgodnoœæ wstecz z 2003 asFile = asFile.erase(0, 8); // Ra: usuniêcie niepotrzebnych znaków - zgodnoœæ wstecz z 2003
WriteLog("Loading scenery from " + asFile); WriteLog("Loading scenery from " + asFile);
Global::pGround = this; Global::pGround = this;
// pTrain=NULL; // pTrain=NULL;
pOrigin = aRotate = vector3(0, 0, 0); // zerowanie przesuniêcia i obrotu pOrigin = aRotate = vector3(0, 0, 0); // zerowanie przesuniêcia i obrotu
AnsiString str = ""; string str = "";
// TFileStream *fs; // TFileStream *fs;
// int size; // int size;
std::string subpath = Global::asCurrentSceneryPath; // "scenery/"; std::string subpath = Global::asCurrentSceneryPath; // "scenery/";
@@ -2423,8 +2425,8 @@ bool TGround::Init(std::string asFile, HDC hDC)
} }
else else
++refresh; ++refresh;
str = AnsiString(token.c_str()); str = token;
if (str == AnsiString("node")) if (str == "node")
{ {
LastNode = AddGroundNode(&parser); // rozpoznanie wêz³a LastNode = AddGroundNode(&parser); // rozpoznanie wêz³a
if (LastNode) if (LastNode)
@@ -2477,11 +2479,11 @@ bool TGround::Init(std::string asFile, HDC hDC)
} }
else else
{ {
Error("Scene parse error near " + AnsiString(token.c_str())); Error("Scene parse error near " + token);
// break; // break;
} }
} }
else if (str == AnsiString("trainset")) else if (str == "trainset")
{ {
iTrainSetWehicleNumber = 0; iTrainSetWehicleNumber = 0;
nTrainSetNode = NULL; nTrainSetNode = NULL;
@@ -2489,14 +2491,14 @@ bool TGround::Init(std::string asFile, HDC hDC)
bTrainSet = true; bTrainSet = true;
parser.getTokens(); parser.getTokens();
parser >> token; parser >> token;
asTrainName = AnsiString(token.c_str()); // McZapkie: rodzaj+nazwa pociagu w SRJP asTrainName = token; // McZapkie: rodzaj+nazwa pociagu w SRJP
parser.getTokens(); parser.getTokens();
parser >> token; parser >> token;
asTrainSetTrack = AnsiString(token.c_str()); //œcie¿ka startowa asTrainSetTrack = token; //œcie¿ka startowa
parser.getTokens(2); parser.getTokens(2);
parser >> fTrainSetDist >> fTrainSetVel; // przesuniêcie i prêdkoœæ parser >> fTrainSetDist >> fTrainSetVel; // przesuniêcie i prêdkoœæ
} }
else if (str == AnsiString("endtrainset")) else if (str == "endtrainset")
{ // McZapkie-110103: sygnaly konca pociagu ale tylko dla pociagow rozkladowych { // McZapkie-110103: sygnaly konca pociagu ale tylko dla pociagow rozkladowych
if (nTrainSetNode) // trainset bez dynamic siê sypa³ if (nTrainSetNode) // trainset bez dynamic siê sypa³
{ // powinien te¿ tu wchodziæ, gdy pojazd bez trainset { // powinien te¿ tu wchodziæ, gdy pojazd bez trainset
@@ -2523,7 +2525,7 @@ bool TGround::Init(std::string asFile, HDC hDC)
nTrainSetNode = nTrainSetDriver = NULL; nTrainSetNode = nTrainSetDriver = NULL;
iTrainSetWehicleNumber = 0; iTrainSetWehicleNumber = 0;
} }
else if (str == AnsiString("event")) else if (str == "event")
{ {
TEvent *tmp = new TEvent(); TEvent *tmp = new TEvent();
tmp->Load(&parser, &pOrigin); tmp->Load(&parser, &pOrigin);
@@ -2534,25 +2536,25 @@ bool TGround::Init(std::string asFile, HDC hDC)
TEvent *found = FindEvent(tmp->asName); TEvent *found = FindEvent(tmp->asName);
if (found) if (found)
{ // jeœli znaleziony duplikat { // jeœli znaleziony duplikat
int i = tmp->asName.Length(); int i = tmp->asName.length();
if (tmp->asName[1] == '#') // zawsze jeden znak co najmniej jest if (tmp->asName[1] == '#') // zawsze jeden znak co najmniej jest
{ {
delete tmp; delete tmp;
tmp = NULL; tmp = NULL;
} // utylizacja duplikatu z krzy¿ykiem } // utylizacja duplikatu z krzy¿ykiem
else if (i > 8 ? tmp->asName.SubString(1, 9) == "lineinfo:" : else if (i > 8 ? tmp->asName.substr(0, 9) == "lineinfo:" :
false) // tymczasowo wyj¹tki false) // tymczasowo wyj¹tki
{ {
delete tmp; delete tmp;
tmp = NULL; tmp = NULL;
} // tymczasowa utylizacja duplikatów W5 } // tymczasowa utylizacja duplikatów W5
else if (i > 8 ? tmp->asName.SubString(i - 7, 8) == "_warning" : else if (i > 8 ? tmp->asName.substr(i - 7, 8) == "_warning" :
false) // tymczasowo wyj¹tki false) // tymczasowo wyj¹tki
{ {
delete tmp; delete tmp;
tmp = NULL; tmp = NULL;
} // tymczasowa utylizacja duplikatu z tr¹bieniem } // tymczasowa utylizacja duplikatu z tr¹bieniem
else if (i > 4 ? tmp->asName.SubString(i - 3, 4) == "_shp" : else if (i > 4 ? tmp->asName.substr(i - 3, 4) == "_shp" :
false) // nie podlegaj¹ logowaniu false) // nie podlegaj¹ logowaniu
{ {
delete tmp; delete tmp;
@@ -2579,8 +2581,8 @@ bool TGround::Init(std::string asFile, HDC hDC)
{ // jeœli nazwa wyst¹pi³a, to do kolejki i wyszukiwarki dodawany jest tylko { // jeœli nazwa wyst¹pi³a, to do kolejki i wyszukiwarki dodawany jest tylko
// pierwszy // pierwszy
if (RootEvent->Type != tp_Ignored) if (RootEvent->Type != tp_Ignored)
if (RootEvent->asName.Pos( if (RootEvent->asName.find(
"onstart")) // event uruchamiany automatycznie po starcie "onstart") != string::npos) // event uruchamiany automatycznie po starcie
AddToQuery(RootEvent, NULL); // dodanie do kolejki AddToQuery(RootEvent, NULL); // dodanie do kolejki
sTracks->Add(0, tmp->asName.c_str(), tmp); // dodanie do wyszukiwarki sTracks->Add(0, tmp->asName.c_str(), tmp); // dodanie do wyszukiwarki
} }
@@ -2592,7 +2594,7 @@ bool TGround::Init(std::string asFile, HDC hDC)
// { // {
// Include(Parser); // Include(Parser);
// } // }
else if (str == AnsiString("rotate")) else if (str == "rotate")
{ {
// parser.getTokens(3); // parser.getTokens(3);
// parser >> aRotate.x >> aRotate.y >> aRotate.z; //Ra: to potrafi dawaæ b³êdne // parser >> aRotate.x >> aRotate.y >> aRotate.z; //Ra: to potrafi dawaæ b³êdne
@@ -2606,14 +2608,14 @@ bool TGround::Init(std::string asFile, HDC hDC)
// WriteLog("*** rotate "+AnsiString(aRotate.x)+" "+AnsiString(aRotate.y)+" // WriteLog("*** rotate "+AnsiString(aRotate.x)+" "+AnsiString(aRotate.y)+"
// "+AnsiString(aRotate.z)); // "+AnsiString(aRotate.z));
} }
else if (str == AnsiString("origin")) else if (str == "origin")
{ {
// str=Parser->GetNextSymbol().LowerCase(); // str=Parser->GetNextSymbol().LowerCase();
// if (str=="begin") // if (str=="begin")
{ {
if (OriginStackTop >= OriginStackMaxDepth - 1) if (OriginStackTop >= OriginStackMaxDepth - 1)
{ {
MessageBox(0, AnsiString("Origin stack overflow ").c_str(), "Error", MB_OK); MessageBox(0, "Origin stack overflow ", "Error", MB_OK);
break; break;
} }
parser.getTokens(3); parser.getTokens(3);
@@ -2623,14 +2625,14 @@ bool TGround::Init(std::string asFile, HDC hDC)
OriginStackTop++; // zwiêkszenie wskaŸnika stosu OriginStackTop++; // zwiêkszenie wskaŸnika stosu
} }
} }
else if (str == AnsiString("endorigin")) else if (str == "endorigin")
{ {
// else // else
// if (str=="end") // if (str=="end")
{ {
if (OriginStackTop <= 0) if (OriginStackTop <= 0)
{ {
MessageBox(0, AnsiString("Origin stack underflow ").c_str(), "Error", MB_OK); MessageBox(0, "Origin stack underflow ", "Error", MB_OK);
break; break;
} }
@@ -2638,7 +2640,7 @@ bool TGround::Init(std::string asFile, HDC hDC)
pOrigin -= OriginStack[OriginStackTop]; pOrigin -= OriginStack[OriginStackTop];
} }
} }
else if (str == AnsiString("atmo")) // TODO: uporzadkowac gdzie maja byc parametry mgly! else if (str == "atmo") // TODO: uporzadkowac gdzie maja byc parametry mgly!
{ // Ra: ustawienie parametrów OpenGL przeniesione do FirstInit { // Ra: ustawienie parametrów OpenGL przeniesione do FirstInit
WriteLog("Scenery atmo definition"); WriteLog("Scenery atmo definition");
parser.getTokens(3); parser.getTokens(3);
@@ -2658,7 +2660,7 @@ bool TGround::Init(std::string asFile, HDC hDC)
parser >> token; parser >> token;
} }
} }
else if (str == AnsiString("time")) else if (str == "time")
{ {
WriteLog("Scenery time definition"); WriteLog("Scenery time definition");
char temp_in[9]; char temp_in[9];
@@ -2708,7 +2710,7 @@ bool TGround::Init(std::string asFile, HDC hDC)
parser >> token; parser >> token;
} }
} }
else if (str == AnsiString("light")) else if (str == "light")
{ // Ra: ustawianie œwiat³a przeniesione do FirstInit { // Ra: ustawianie œwiat³a przeniesione do FirstInit
WriteLog("Scenery light definition"); WriteLog("Scenery light definition");
vector3 lp; vector3 lp;
@@ -2749,7 +2751,7 @@ bool TGround::Init(std::string asFile, HDC hDC)
parser >> token; parser >> token;
} while (token.compare("endlight") != 0); } while (token.compare("endlight") != 0);
} }
else if (str == AnsiString("camera")) else if (str == "camera")
{ {
vector3 xyz, abc; vector3 xyz, abc;
xyz = abc = vector3(0, 0, 0); // wartoœci domyœlne, bo nie wszystie musz¹ byæ xyz = abc = vector3(0, 0, 0); // wartoœci domyœlne, bo nie wszystie musz¹ byæ
@@ -2795,7 +2797,7 @@ bool TGround::Init(std::string asFile, HDC hDC)
Global::iCameraLast = into; // numer ostatniej Global::iCameraLast = into; // numer ostatniej
} }
} }
else if (str == AnsiString("sky")) else if (str == "sky")
{ // youBy - niebo z pliku { // youBy - niebo z pliku
WriteLog("Scenery sky definition"); WriteLog("Scenery sky definition");
parser.getTokens(); parser.getTokens();
@@ -2810,9 +2812,9 @@ bool TGround::Init(std::string asFile, HDC hDC)
} while (token.compare("endsky") != 0); } while (token.compare("endsky") != 0);
WriteLog(Global::asSky.c_str()); WriteLog(Global::asSky.c_str());
} }
else if (str == AnsiString("firstinit")) else if (str == "firstinit")
FirstInit(); FirstInit();
else if (str == AnsiString("description")) else if (str == "description")
{ {
do do
{ {
@@ -2820,7 +2822,7 @@ bool TGround::Init(std::string asFile, HDC hDC)
parser >> token; parser >> token;
} while (token.compare("enddescription") != 0); } while (token.compare("enddescription") != 0);
} }
else if (str == AnsiString("test")) else if (str == "test")
{ // wypisywanie treœci po przetworzeniu { // wypisywanie treœci po przetworzeniu
WriteLog("---> Parser test:"); WriteLog("---> Parser test:");
do do
@@ -2831,15 +2833,15 @@ bool TGround::Init(std::string asFile, HDC hDC)
} while (token.compare("endtest") != 0); } while (token.compare("endtest") != 0);
WriteLog("---> End of parser test."); WriteLog("---> End of parser test.");
} }
else if (str == AnsiString("config")) else if (str == "config")
{ // mo¿liwoœæ przedefiniowania parametrów w scenerii { // mo¿liwoœæ przedefiniowania parametrów w scenerii
Global::ConfigParse(NULL, &parser); // parsowanie dodatkowych ustawieñ Global::ConfigParse(NULL, &parser); // parsowanie dodatkowych ustawieñ
} }
else if (str != AnsiString("")) else if (str != "")
{ // pomijanie od nierozpoznanej komendy do jej zakoñczenia { // pomijanie od nierozpoznanej komendy do jej zakoñczenia
if ((token.length() > 2) && (atof(token.c_str()) == 0.0)) if ((token.length() > 2) && (atof(token.c_str()) == 0.0))
{ // jeœli nie liczba, to spróbowaæ pomin¹æ komendê { // jeœli nie liczba, to spróbowaæ pomin¹æ komendê
WriteLog(AnsiString("Unrecognized command: " + str)); WriteLog("Unrecognized command: " + str);
str = "end" + str; str = "end" + str;
do do
{ {
@@ -2849,9 +2851,9 @@ bool TGround::Init(std::string asFile, HDC hDC)
} while ((token != "") && (token.compare(str.c_str()) != 0)); } while ((token != "") && (token.compare(str.c_str()) != 0));
} }
else // jak liczba to na pewno b³¹d else // jak liczba to na pewno b³¹d
Error(AnsiString("Unrecognized command: " + str)); Error("Unrecognized command: " + str);
} }
else if (str == AnsiString("")) else if (str == "")
break; break;
// LastNode=NULL; // LastNode=NULL;
@@ -2896,7 +2898,7 @@ bool TGround::InitEvents()
if (trk) if (trk)
Current->Params[9].asTrack = trk->pTrack; Current->Params[9].asTrack = trk->pTrack;
if (!Current->Params[9].asTrack) if (!Current->Params[9].asTrack)
ErrorLog("Bad event: track \"" + AnsiString(Current->asNodeName) + ErrorLog("Bad event: track \"" + Current->asNodeName +
"\" does not exists in \"" + Current->asName + "\""); "\" does not exists in \"" + Current->asName + "\"");
} }
Current->Params[4].nGroundNode = tmp; Current->Params[4].nGroundNode = tmp;
@@ -2904,7 +2906,7 @@ bool TGround::InitEvents()
if (Current->iFlags & (conditional_memcompare)) if (Current->iFlags & (conditional_memcompare))
Current->Params[9].asMemCell = tmp->MemCell; // komórka do badania warunku Current->Params[9].asMemCell = tmp->MemCell; // komórka do badania warunku
if (!tmp->MemCell->asTrackName if (!tmp->MemCell->asTrackName
.IsEmpty()) // tor powi¹zany z komórk¹ powi¹zan¹ z eventem .empty()) // tor powi¹zany z komórk¹ powi¹zan¹ z eventem
{ // tu potrzebujemy wskaŸnik do komórki w (tmp) { // tu potrzebujemy wskaŸnik do komórki w (tmp)
trk = FindGroundNode(tmp->MemCell->asTrackName, TP_TRACK); trk = FindGroundNode(tmp->MemCell->asTrackName, TP_TRACK);
if (trk) if (trk)
@@ -2924,7 +2926,7 @@ bool TGround::InitEvents()
} }
break; break;
case tp_LogValues: // skojarzenie z memcell case tp_LogValues: // skojarzenie z memcell
if (Current->asNodeName.IsEmpty()) if (Current->asNodeName.empty())
{ // brak skojarzenia daje logowanie wszystkich { // brak skojarzenia daje logowanie wszystkich
Current->Params[9].asMemCell = NULL; Current->Params[9].asMemCell = NULL;
break; break;
@@ -2955,7 +2957,7 @@ bool TGround::InitEvents()
Current->Params[4].nGroundNode = tmp; Current->Params[4].nGroundNode = tmp;
Current->Params[5].asMemCell = tmp->MemCell; // komórka docelowa Current->Params[5].asMemCell = tmp->MemCell; // komórka docelowa
if (!tmp->MemCell->asTrackName if (!tmp->MemCell->asTrackName
.IsEmpty()) // tor powi¹zany z komórk¹ powi¹zan¹ z eventem .empty()) // tor powi¹zany z komórk¹ powi¹zan¹ z eventem
{ // tu potrzebujemy wskaŸnik do komórki w (tmp) { // tu potrzebujemy wskaŸnik do komórki w (tmp)
trk = FindGroundNode(tmp->MemCell->asTrackName, TP_TRACK); trk = FindGroundNode(tmp->MemCell->asTrackName, TP_TRACK);
if (trk) if (trk)
@@ -2982,7 +2984,7 @@ bool TGround::InitEvents()
} }
else else
ErrorLog("Bad copyvalues: event \"" + Current->asName + ErrorLog("Bad copyvalues: event \"" + Current->asName +
"\" cannot find memcell \"" + AnsiString(buff) + "\""); "\" cannot find memcell \"" + buff + "\"");
break; break;
case tp_Animation: // animacja modelu case tp_Animation: // animacja modelu
tmp = FindGroundNode(Current->asNodeName, TP_MODEL); // egzemplarza modelu do animowania tmp = FindGroundNode(Current->asNodeName, TP_MODEL); // egzemplarza modelu do animowania
@@ -3004,7 +3006,7 @@ bool TGround::InitEvents()
if (!Current->Params[9] if (!Current->Params[9]
.asAnimContainer->Event()) // nie szukaæ, gdy znaleziony .asAnimContainer->Event()) // nie szukaæ, gdy znaleziony
Current->Params[9].asAnimContainer->EventAssign( Current->Params[9].asAnimContainer->EventAssign(
FindEvent(Current->asNodeName + "." + AnsiString(buff) + ":done")); FindEvent(Current->asNodeName + "." + buff + ":done"));
} }
} }
} }
@@ -3064,7 +3066,7 @@ bool TGround::InitEvents()
Current->asNodeName = ""; Current->asNodeName = "";
break; break;
case tp_TrackVel: // ustawienie prêdkoœci na torze case tp_TrackVel: // ustawienie prêdkoœci na torze
if (!Current->asNodeName.IsEmpty()) if (!Current->asNodeName.empty())
{ {
tmp = FindGroundNode(Current->asNodeName, TP_TRACK); tmp = FindGroundNode(Current->asNodeName, TP_TRACK);
if (tmp) if (tmp)
@@ -3109,7 +3111,7 @@ bool TGround::InitEvents()
Current->Params[9].asTrack = tmp->pTrack; Current->Params[9].asTrack = tmp->pTrack;
if (!Current->Params[9].asTrack) if (!Current->Params[9].asTrack)
{ {
ErrorLog(AnsiString("Bad event: Track \"") + AnsiString(buff) + ErrorLog("Bad event: Track \"" + string(buff) +
"\" does not exist in \"" + Current->asName + "\""); "\" does not exist in \"" + Current->asName + "\"");
Current->iFlags &= Current->iFlags &=
~(conditional_trackoccupied | conditional_trackfree); // zerowanie flag ~(conditional_trackoccupied | conditional_trackfree); // zerowanie flag
@@ -3123,8 +3125,8 @@ bool TGround::InitEvents()
Current->Params[9].asMemCell = tmp->MemCell; Current->Params[9].asMemCell = tmp->MemCell;
if (!Current->Params[9].asMemCell) if (!Current->Params[9].asMemCell)
{ {
ErrorLog(AnsiString("Bad event: MemCell \"") + AnsiString(buff) + ErrorLog("Bad event: MemCell \"" + string(buff) +
AnsiString("\" does not exist in \"" + Current->asName + "\"")); "\" does not exist in \"" + Current->asName + "\"");
Current->iFlags &= Current->iFlags &=
~(conditional_memstring | conditional_memval1 | conditional_memval2); ~(conditional_memstring | conditional_memval1 | conditional_memval2);
} }
@@ -3137,18 +3139,18 @@ bool TGround::InitEvents()
SafeDeleteArray(Current->Params[i].asText); SafeDeleteArray(Current->Params[i].asText);
Current->Params[i].asEvent = FindEvent(buff); Current->Params[i].asEvent = FindEvent(buff);
if (!Current->Params[i].asEvent) // Ra: tylko w logu informacja o braku if (!Current->Params[i].asEvent) // Ra: tylko w logu informacja o braku
if (AnsiString(Current->Params[i].asText).SubString(1, 5) != "none_") if (string(Current->Params[i].asText).substr(0, 5) != "none_")
{ {
WriteLog(AnsiString("Event \"") + AnsiString(buff) + WriteLog("Event \"" + string(buff) +
AnsiString("\" does not exist")); "\" does not exist");
ErrorLog("Missed event: " + AnsiString(buff) + " in multiple " + ErrorLog("Missed event: " + string(buff) + " in multiple " +
Current->asName); Current->asName);
} }
} }
} }
break; break;
case tp_Voltage: // zmiana napiêcia w zasilaczu (TractionPowerSource) case tp_Voltage: // zmiana napiêcia w zasilaczu (TractionPowerSource)
if (!Current->asNodeName.IsEmpty()) if (!Current->asNodeName.empty())
{ {
tmp = FindGroundNode(Current->asNodeName, tmp = FindGroundNode(Current->asNodeName,
TP_TRACTIONPOWERSOURCE); // pod³¹czenie zasilacza TP_TRACTIONPOWERSOURCE); // pod³¹czenie zasilacza
@@ -3179,42 +3181,42 @@ void TGround::InitTracks()
TTrack *tmp; // znaleziony tor TTrack *tmp; // znaleziony tor
TTrack *Track; TTrack *Track;
int iConnection, state; int iConnection, state;
AnsiString name; string name;
// tracks=tracksfar=0; // tracks=tracksfar=0;
for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext) for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext)
{ {
Track = Current->pTrack; Track = Current->pTrack;
if (Global::iHiddenEvents & 1) if (Global::iHiddenEvents & 1)
if (!Current->asName.IsEmpty()) if (!Current->asName.empty())
{ // jeœli podana jest nazwa torów, mo¿na szukaæ eventów skojarzonych przez nazwê { // jeœli podana jest nazwa torów, mo¿na szukaæ eventów skojarzonych przez nazwê
if (Track->asEvent0Name.IsEmpty()) if (Track->asEvent0Name.empty())
if (FindEvent(Current->asName + ":event0")) if (FindEvent(Current->asName + ":event0"))
Track->asEvent0Name = Current->asName + ":event0"; Track->asEvent0Name = Current->asName + ":event0";
if (Track->asEvent1Name.IsEmpty()) if (Track->asEvent1Name.empty())
if (FindEvent(Current->asName + ":event1")) if (FindEvent(Current->asName + ":event1"))
Track->asEvent1Name = Current->asName + ":event1"; Track->asEvent1Name = Current->asName + ":event1";
if (Track->asEvent2Name.IsEmpty()) if (Track->asEvent2Name.empty())
if (FindEvent(Current->asName + ":event2")) if (FindEvent(Current->asName + ":event2"))
Track->asEvent2Name = Current->asName + ":event2"; Track->asEvent2Name = Current->asName + ":event2";
if (Track->asEventall0Name.IsEmpty()) if (Track->asEventall0Name.empty())
if (FindEvent(Current->asName + ":eventall0")) if (FindEvent(Current->asName + ":eventall0"))
Track->asEventall0Name = Current->asName + ":eventall0"; Track->asEventall0Name = Current->asName + ":eventall0";
if (Track->asEventall1Name.IsEmpty()) if (Track->asEventall1Name.empty())
if (FindEvent(Current->asName + ":eventall1")) if (FindEvent(Current->asName + ":eventall1"))
Track->asEventall1Name = Current->asName + ":eventall1"; Track->asEventall1Name = Current->asName + ":eventall1";
if (Track->asEventall2Name.IsEmpty()) if (Track->asEventall2Name.empty())
if (FindEvent(Current->asName + ":eventall2")) if (FindEvent(Current->asName + ":eventall2"))
Track->asEventall2Name = Current->asName + ":eventall2"; Track->asEventall2Name = Current->asName + ":eventall2";
} }
Track->AssignEvents( Track->AssignEvents(
Track->asEvent0Name.IsEmpty() ? NULL : FindEvent(Track->asEvent0Name), Track->asEvent0Name.empty() ? NULL : FindEvent(Track->asEvent0Name),
Track->asEvent1Name.IsEmpty() ? NULL : FindEventScan(Track->asEvent1Name), Track->asEvent1Name.empty() ? NULL : FindEventScan(Track->asEvent1Name),
Track->asEvent2Name.IsEmpty() ? NULL : FindEventScan(Track->asEvent2Name)); Track->asEvent2Name.empty() ? NULL : FindEventScan(Track->asEvent2Name));
Track->AssignallEvents( Track->AssignallEvents(
Track->asEventall0Name.IsEmpty() ? NULL : FindEvent(Track->asEventall0Name), Track->asEventall0Name.empty() ? NULL : FindEvent(Track->asEventall0Name),
Track->asEventall1Name.IsEmpty() ? NULL : FindEvent(Track->asEventall1Name), Track->asEventall1Name.empty() ? NULL : FindEvent(Track->asEventall1Name),
Track->asEventall2Name.IsEmpty() ? NULL : Track->asEventall2Name.empty() ? NULL :
FindEvent(Track->asEventall2Name)); // MC-280503 FindEvent(Track->asEventall2Name)); // MC-280503
switch (Track->eType) switch (Track->eType)
{ {
@@ -3314,9 +3316,9 @@ void TGround::InitTracks()
break; break;
} }
name = Track->IsolatedName(); // pobranie nazwy odcinka izolowanego name = Track->IsolatedName(); // pobranie nazwy odcinka izolowanego
if (!name.IsEmpty()) // jeœli zosta³a zwrócona nazwa if (!name.empty()) // jeœli zosta³a zwrócona nazwa
Track->IsolatedEventsAssign(FindEvent(name + ":busy"), FindEvent(name + ":free")); Track->IsolatedEventsAssign(FindEvent(name + ":busy"), FindEvent(name + ":free"));
if (Current->asName.SubString(1, 1) == if (Current->asName.substr(0, 1) ==
"*") // mo¿liwy portal, jeœli nie pod³¹czony od striny 1 "*") // mo¿liwy portal, jeœli nie pod³¹czony od striny 1
if (!Track->CurrentPrev() && Track->CurrentNext()) if (!Track->CurrentPrev() && Track->CurrentNext())
Track->iCategoryFlag |= 0x100; // ustawienie flagi portalu Track->iCategoryFlag |= 0x100; // ustawienie flagi portalu
@@ -3353,7 +3355,7 @@ void TGround::InitTraction()
TTraction *tmp; // znalezione przês³o TTraction *tmp; // znalezione przês³o
TTraction *Traction; TTraction *Traction;
int iConnection; int iConnection;
AnsiString name; string name;
for (nCurrent = nRootOfType[TP_TRACTION]; nCurrent; nCurrent = nCurrent->nNext) for (nCurrent = nRootOfType[TP_TRACTION]; nCurrent; nCurrent = nCurrent->nNext)
{ // pod³¹czenie do zasilacza, ¿eby mo¿na by³o sumowaæ pr¹d kilku pojazdów { // pod³¹czenie do zasilacza, ¿eby mo¿na by³o sumowaæ pr¹d kilku pojazdów
// a jednoczeœnie z jednego miejsca zmieniaæ napiêcie eventem // a jednoczeœnie z jednego miejsca zmieniaæ napiêcie eventem
@@ -3412,9 +3414,9 @@ void TGround::InitTraction()
} }
else // jeœli obie to sekcje albo obie podstacje, to bêdzie b³¹d else // jeœli obie to sekcje albo obie podstacje, to bêdzie b³¹d
ErrorLog("Bad power: at " + ErrorLog("Bad power: at " +
FloatToStrF(Traction->pPoint1.x, ffFixed, 6, 2) + " " + to_string(Traction->pPoint1.x, 2, 6) + " " +
FloatToStrF(Traction->pPoint1.y, ffFixed, 6, 2) + " " + to_string(Traction->pPoint1.y, 2, 6) + " " +
FloatToStrF(Traction->pPoint1.z, ffFixed, 6, 2)); to_string(Traction->pPoint1.z, 2, 6));
} }
} }
if (!Traction->hvNext[1]) // tylko jeœli jeszcze nie pod³¹czony if (!Traction->hvNext[1]) // tylko jeœli jeszcze nie pod³¹czony
@@ -3446,9 +3448,9 @@ void TGround::InitTraction()
} }
else // jeœli obie to sekcje albo obie podstacje, to bêdzie b³¹d else // jeœli obie to sekcje albo obie podstacje, to bêdzie b³¹d
ErrorLog("Bad power: at " + ErrorLog("Bad power: at " +
FloatToStrF(Traction->pPoint2.x, ffFixed, 6, 2) + " " + to_string(Traction->pPoint2.x, 2, 6) + " " +
FloatToStrF(Traction->pPoint2.y, ffFixed, 6, 2) + " " + to_string(Traction->pPoint2.y, 2, 6) + " " +
FloatToStrF(Traction->pPoint2.z, ffFixed, 6, 2)); to_string(Traction->pPoint2.z, 2, 6));
} }
} }
} }
@@ -3483,7 +3485,7 @@ void TGround::InitTraction()
for (nCurrent = nRootOfType[TP_TRACTION]; nCurrent; nCurrent = nCurrent->nNext) for (nCurrent = nRootOfType[TP_TRACTION]; nCurrent; nCurrent = nCurrent->nNext)
{ //³¹czenie bie¿ni wspólnych, w tym oznaczanie niepodanych jawnie { //³¹czenie bie¿ni wspólnych, w tym oznaczanie niepodanych jawnie
Traction = nCurrent->hvTraction; Traction = nCurrent->hvTraction;
if (!Traction->asParallel.IsEmpty()) // bêdzie wskaŸnik na inne przês³o if (!Traction->asParallel.empty()) // bêdzie wskaŸnik na inne przês³o
if ((Traction->asParallel == "none") || if ((Traction->asParallel == "none") ||
(Traction->asParallel == "*")) // jeœli nieokreœlone (Traction->asParallel == "*")) // jeœli nieokreœlone
Traction->iLast = Traction->iLast =
@@ -3598,7 +3600,7 @@ bool TGround::InitLaunchers()
{ {
EventLauncher = Current->EvLaunch; EventLauncher = Current->EvLaunch;
if (EventLauncher->iCheckMask != 0) if (EventLauncher->iCheckMask != 0)
if (EventLauncher->asMemCellName != AnsiString("none")) if (EventLauncher->asMemCellName != "none")
{ // jeœli jest powi¹zana komórka pamiêci { // jeœli jest powi¹zana komórka pamiêci
tmp = FindGroundNode(EventLauncher->asMemCellName, TP_MEMCELL); tmp = FindGroundNode(EventLauncher->asMemCellName, TP_MEMCELL);
if (tmp) if (tmp)
@@ -3608,10 +3610,10 @@ bool TGround::InitLaunchers()
} }
else else
EventLauncher->MemCell = NULL; EventLauncher->MemCell = NULL;
EventLauncher->Event1 = (EventLauncher->asEvent1Name != AnsiString("none")) ? EventLauncher->Event1 = (EventLauncher->asEvent1Name != "none") ?
FindEvent(EventLauncher->asEvent1Name) : FindEvent(EventLauncher->asEvent1Name) :
NULL; NULL;
EventLauncher->Event2 = (EventLauncher->asEvent2Name != AnsiString("none")) ? EventLauncher->Event2 = (EventLauncher->asEvent2Name != "none") ?
FindEvent(EventLauncher->asEvent2Name) : FindEvent(EventLauncher->asEvent2Name) :
NULL; NULL;
} }
@@ -3786,15 +3788,15 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node)
&Event->Params[4].nGroundNode->pCenter); &Event->Params[4].nGroundNode->pCenter);
//if (DebugModeFlag) //if (DebugModeFlag)
WriteLog("EVENT EXECUTED: AddValues & Track command - " + WriteLog("EVENT EXECUTED: AddValues & Track command - " +
AnsiString(Event->Params[0].asText) + " " + string(Event->Params[0].asText) + " " +
AnsiString(Event->Params[1].asdouble) + " " + to_string(Event->Params[1].asdouble) + " " +
AnsiString(Event->Params[2].asdouble)); to_string(Event->Params[2].asdouble));
} }
//else if (DebugModeFlag) //else if (DebugModeFlag)
WriteLog("EVENT EXECUTED: AddValues - " + WriteLog("EVENT EXECUTED: AddValues - " +
AnsiString(Event->Params[0].asText) + " " + string(Event->Params[0].asText) + " " +
AnsiString(Event->Params[1].asdouble) + " " + to_string(Event->Params[1].asdouble) + " " +
AnsiString(Event->Params[2].asdouble)); to_string(Event->Params[2].asdouble));
} }
Event = Event =
Event Event
@@ -3803,7 +3805,7 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node)
if (Event) if (Event)
{ // standardowe dodanie do kolejki { // standardowe dodanie do kolejki
WriteLog("EVENT ADDED TO QUEUE: " + Event->asName + WriteLog("EVENT ADDED TO QUEUE: " + Event->asName +
(Node ? AnsiString(" by " + Node->asName) : AnsiString(""))); (Node ? (" by " + Node->asName) : string("")));
Event->fStartTime = Event->fStartTime =
fabs(Event->fDelay) + Timer::GetTime(); // czas od uruchomienia scenerii fabs(Event->fDelay) + Timer::GetTime(); // czas od uruchomienia scenerii
if (Event->fRandomDelay > 0.0) if (Event->fRandomDelay > 0.0)
@@ -3842,45 +3844,45 @@ bool TGround::EventConditon(TEvent *e)
if (tmpEvent->Params[9].asMemCell->Compare(e->Params[10].asText, e->Params[11].asdouble, if (tmpEvent->Params[9].asMemCell->Compare(e->Params[10].asText, e->Params[11].asdouble,
e->Params[12].asdouble, e->iFlags)) e->Params[12].asdouble, e->iFlags))
{ //logowanie spe³nionych warunków { //logowanie spe³nionych warunków
LogComment = e->Params[9].asMemCell->Text() + AnsiString(" ") + LogComment = e->Params[9].asMemCell->Text() + string(" ") +
FloatToStrF(e->Params[9].asMemCell->Value1(), ffFixed, 8, 2) + " " + to_string(e->Params[9].asMemCell->Value1(), 2, 8) + " " +
FloatToStrF(tmpEvent->Params[9].asMemCell->Value2(), ffFixed, 8, 2) + to_string(tmpEvent->Params[9].asMemCell->Value2(), 2, 8) +
" = "; " = ";
if (TestFlag(e->iFlags, conditional_memstring)) if (TestFlag(e->iFlags, conditional_memstring))
LogComment += AnsiString(tmpEvent->Params[10].asText); LogComment += string(tmpEvent->Params[10].asText);
else else
LogComment += "*"; LogComment += "*";
if (TestFlag(tmpEvent->iFlags, conditional_memval1)) if (TestFlag(tmpEvent->iFlags, conditional_memval1))
LogComment += " " + FloatToStrF(tmpEvent->Params[11].asdouble, ffFixed, 8, 2); LogComment += " " + to_string(tmpEvent->Params[11].asdouble, 2, 8);
else else
LogComment += " *"; LogComment += " *";
if (TestFlag(tmpEvent->iFlags, conditional_memval2)) if (TestFlag(tmpEvent->iFlags, conditional_memval2))
LogComment += " " + FloatToStrF(tmpEvent->Params[12].asdouble, ffFixed, 8, 2); LogComment += " " + to_string(tmpEvent->Params[12].asdouble, 2, 8);
else else
LogComment += " *"; LogComment += " *";
WriteLog(LogComment.c_str()); WriteLog(LogComment);
return true; return true;
} }
//else if (Global::iWriteLogEnabled && DebugModeFlag) //zawsze bo to bardzo istotne w debugowaniu scenariuszy //else if (Global::iWriteLogEnabled && DebugModeFlag) //zawsze bo to bardzo istotne w debugowaniu scenariuszy
else else
{ // nie zgadza siê, wiêc sprawdzmy, co { // nie zgadza siê, wiêc sprawdzmy, co
LogComment = e->Params[9].asMemCell->Text() + AnsiString(" ") + LogComment = e->Params[9].asMemCell->Text() + string(" ") +
FloatToStrF(e->Params[9].asMemCell->Value1(), ffFixed, 8, 2) + " " + to_string(e->Params[9].asMemCell->Value1(), 2, 8) + " " +
FloatToStrF(tmpEvent->Params[9].asMemCell->Value2(), ffFixed, 8, 2) + to_string(tmpEvent->Params[9].asMemCell->Value2(), 2, 8) +
" != "; " != ";
if (TestFlag(e->iFlags, conditional_memstring)) if (TestFlag(e->iFlags, conditional_memstring))
LogComment += AnsiString(tmpEvent->Params[10].asText); LogComment += (tmpEvent->Params[10].asText);
else else
LogComment += "*"; LogComment += "*";
if (TestFlag(tmpEvent->iFlags, conditional_memval1)) if (TestFlag(tmpEvent->iFlags, conditional_memval1))
LogComment += " " + FloatToStrF(tmpEvent->Params[11].asdouble, ffFixed, 8, 2); LogComment += " " + to_string(tmpEvent->Params[11].asdouble, 2, 8);
else else
LogComment += " *"; LogComment += " *";
if (TestFlag(tmpEvent->iFlags, conditional_memval2)) if (TestFlag(tmpEvent->iFlags, conditional_memval2))
LogComment += " " + FloatToStrF(tmpEvent->Params[12].asdouble, ffFixed, 8, 2); LogComment += " " + to_string(tmpEvent->Params[12].asdouble, 2, 8);
else else
LogComment += " *"; LogComment += " *";
WriteLog(LogComment.c_str()); WriteLog(LogComment);
} }
} }
return false; return false;
@@ -3950,8 +3952,8 @@ bool TGround::CheckQuery()
if (tmpEvent->bEnabled) if (tmpEvent->bEnabled)
{ // w zasadzie te wy³¹czone s¹ skanowane i nie powinny siê nigdy w kolejce znaleŸæ { // w zasadzie te wy³¹czone s¹ skanowane i nie powinny siê nigdy w kolejce znaleŸæ
WriteLog("EVENT LAUNCHED: " + tmpEvent->asName + WriteLog("EVENT LAUNCHED: " + tmpEvent->asName +
(tmpEvent->Activator ? AnsiString(" by " + tmpEvent->Activator->asName) : (tmpEvent->Activator ? string(" by " + tmpEvent->Activator->asName) :
AnsiString(""))); string("")));
switch (tmpEvent->Type) switch (tmpEvent->Type)
{ {
case tp_CopyValues: // skopiowanie wartoœci z innej komórki case tp_CopyValues: // skopiowanie wartoœci z innej komórki
@@ -4149,7 +4151,7 @@ bool TGround::CheckQuery()
{ // jeœli pytanie o ³adunek { // jeœli pytanie o ³adunek
if (tmpEvent->iFlags & update_memadd) // jeœli typ pojazdu if (tmpEvent->iFlags & update_memadd) // jeœli typ pojazdu
tmpEvent->Params[9].asMemCell->UpdateValues( tmpEvent->Params[9].asMemCell->UpdateValues(
tmpEvent->Activator->MoverParameters->TypeName.c_str(), // typ pojazdu strdup(tmpEvent->Activator->MoverParameters->TypeName.c_str()), // typ pojazdu
0, // na razie nic 0, // na razie nic
0, // na razie nic 0, // na razie nic
tmpEvent->iFlags & tmpEvent->iFlags &
@@ -4157,8 +4159,8 @@ bool TGround::CheckQuery()
else // jeœli parametry ³adunku else // jeœli parametry ³adunku
tmpEvent->Params[9].asMemCell->UpdateValues( tmpEvent->Params[9].asMemCell->UpdateValues(
tmpEvent->Activator->MoverParameters->LoadType != "" ? tmpEvent->Activator->MoverParameters->LoadType != "" ?
tmpEvent->Activator->MoverParameters->LoadType.c_str() : strdup(tmpEvent->Activator->MoverParameters->LoadType.c_str()) :
"none", // nazwa ³adunku (char*)"none", // nazwa ³adunku
tmpEvent->Activator->MoverParameters->Load, // aktualna iloϾ tmpEvent->Activator->MoverParameters->Load, // aktualna iloϾ
tmpEvent->Activator->MoverParameters->MaxLoad, // maksymalna iloϾ tmpEvent->Activator->MoverParameters->MaxLoad, // maksymalna iloϾ
tmpEvent->iFlags & tmpEvent->iFlags &
@@ -4167,7 +4169,7 @@ bool TGround::CheckQuery()
else if (tmpEvent->iFlags & update_memadd) else if (tmpEvent->iFlags & update_memadd)
{ // jeœli miejsce docelowe pojazdu { // jeœli miejsce docelowe pojazdu
tmpEvent->Params[9].asMemCell->UpdateValues( tmpEvent->Params[9].asMemCell->UpdateValues(
tmpEvent->Activator->asDestination.c_str(), // adres docelowy strdup(tmpEvent->Activator->asDestination.c_str()), // adres docelowy
tmpEvent->Activator->DirectionGet(), // kierunek pojazdu wzglêdem czo³a tmpEvent->Activator->DirectionGet(), // kierunek pojazdu wzglêdem czo³a
// sk³adu (1=zgodny,-1=przeciwny) // sk³adu (1=zgodny,-1=przeciwny)
tmpEvent->Activator->MoverParameters tmpEvent->Activator->MoverParameters
@@ -4192,14 +4194,14 @@ bool TGround::CheckQuery()
if (tmpEvent->Params[9].asMemCell) // jeœli by³a podana nazwa komórki if (tmpEvent->Params[9].asMemCell) // jeœli by³a podana nazwa komórki
WriteLog("Memcell \"" + tmpEvent->asNodeName + "\": " + WriteLog("Memcell \"" + tmpEvent->asNodeName + "\": " +
tmpEvent->Params[9].asMemCell->Text() + " " + tmpEvent->Params[9].asMemCell->Text() + " " +
tmpEvent->Params[9].asMemCell->Value1() + " " + to_string(tmpEvent->Params[9].asMemCell->Value1()) + " " +
tmpEvent->Params[9].asMemCell->Value2()); to_string(tmpEvent->Params[9].asMemCell->Value2()));
else // lista wszystkich else // lista wszystkich
for (TGroundNode *Current = nRootOfType[TP_MEMCELL]; Current; for (TGroundNode *Current = nRootOfType[TP_MEMCELL]; Current;
Current = Current->nNext) Current = Current->nNext)
WriteLog("Memcell \"" + Current->asName + "\": " + WriteLog("Memcell \"" + Current->asName + "\": " +
Current->MemCell->Text() + " " + Current->MemCell->Value1() + " " + Current->MemCell->Text() + " " + to_string(Current->MemCell->Value1()) + " " +
Current->MemCell->Value2()); to_string(Current->MemCell->Value2()));
break; break;
case tp_Voltage: // zmiana napiêcia w zasilaczu (TractionPowerSource) case tp_Voltage: // zmiana napiêcia w zasilaczu (TractionPowerSource)
if (tmpEvent->Params[9].psPower) if (tmpEvent->Params[9].psPower)
@@ -4494,11 +4496,11 @@ bool TGround::GetTraction(TDynamicObject *model)
if (DebugModeFlag) if (DebugModeFlag)
ErrorLog( ErrorLog(
"Pant. break: at " + "Pant. break: at " +
FloatToStrF(pant0.x, ffFixed, 7, 2) + to_string(pant0.x, 2, 7) +
" " + " " +
FloatToStrF(pant0.y, ffFixed, 7, 2) + to_string(pant0.y, 2, 7) +
" " + " " +
FloatToStrF(pant0.z, ffFixed, 7, 2)); to_string(pant0.z, 2, 7));
} }
} }
else if (fVertical < p->PantTraction) // ale ni¿ej, ni¿ else if (fVertical < p->PantTraction) // ale ni¿ej, ni¿
@@ -5095,7 +5097,7 @@ void TGround::TerrainWrite()
{ // Ra: zapisywanie trójk¹tów terenu do pliku E3D { // Ra: zapisywanie trójk¹tów terenu do pliku E3D
if (Global::pTerrainCompact->TerrainLoaded()) if (Global::pTerrainCompact->TerrainLoaded())
return; // jeœli zosta³o wczytane, to nie ma co dalej robiæ return; // jeœli zosta³o wczytane, to nie ma co dalej robiæ
if (Global::asTerrainModel.IsEmpty()) if (Global::asTerrainModel.empty())
return; return;
// Trójk¹ty s¹ zapisywane kwadratami kilometrowymi. // Trójk¹ty s¹ zapisywane kwadratami kilometrowymi.
// Kwadrat 500500 jest na œrodku (od 0.0 do 1000.0 na OX oraz OZ). // Kwadrat 500500 jest na œrodku (od 0.0 do 1000.0 na OX oraz OZ).
@@ -5178,7 +5180,7 @@ void TGround::TerrainWrite()
break; break;
} }
} }
m->SaveToBinFile(AnsiString("models\\" + Global::asTerrainModel).c_str()); m->SaveToBinFile(strdup(("models\\" + Global::asTerrainModel).c_str()));
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -5188,7 +5190,7 @@ void TGround::TrackBusyList()
TTrack *Track; TTrack *Track;
AnsiString name; AnsiString name;
for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext) for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext)
if (!Current->asName.IsEmpty()) // musi byæ nazwa if (!Current->asName.empty()) // musi byæ nazwa
if (Current->pTrack->iNumDynamics) // osi to chyba nie ma jak policzyæ if (Current->pTrack->iNumDynamics) // osi to chyba nie ma jak policzyæ
WyslijString(Current->asName, 8); // zajêty WyslijString(Current->asName, 8); // zajêty
}; };

View File

@@ -14,8 +14,10 @@ http://mozilla.org/MPL/2.0/.
#include "ResourceManager.h" #include "ResourceManager.h"
#include "VBO.h" #include "VBO.h"
#include "Classes.h" #include "Classes.h"
#include <string>
using namespace Math3D; using namespace Math3D;
using namespace std;
// Ra: zmniejszone liczby, aby zrobić tabelkę i zoptymalizować wyszukiwanie // Ra: zmniejszone liczby, aby zrobić tabelkę i zoptymalizować wyszukiwanie
const int TP_MODEL = 10; const int TP_MODEL = 10;
@@ -381,8 +383,8 @@ class TGround
{ {
return (x / fSubRectSize + fHalfTotalNumSubRects); return (x / fSubRectSize + fHalfTotalNumSubRects);
}; };
TEvent * FindEvent(const AnsiString &asEventName); TEvent * FindEvent(const string &asEventName);
TEvent * FindEventScan(const AnsiString &asEventName); TEvent * FindEventScan(const string &asEventName);
void TrackJoin(TGroundNode *Current); void TrackJoin(TGroundNode *Current);
private: private:

View File

@@ -81,7 +81,7 @@ void ErrorLog(const char *str)
if (!errors.is_open()) if (!errors.is_open())
{ {
errors.open("errors.txt", std::ios::trunc); errors.open("errors.txt", std::ios::trunc);
errors << AnsiString("EU07.EXE " + Global::asRelease).c_str() << "\n"; errors << "EU07.EXE " + Global::asRelease << "\n";
} }
if (str) if (str)
errors << str; errors << str;
@@ -92,11 +92,25 @@ void ErrorLog(const char *str)
void Error(const AnsiString &asMessage, bool box) void Error(const AnsiString &asMessage, bool box)
{ {
if (box) if (box)
MessageBox(NULL, asMessage.c_str(), AnsiString("EU07 " + Global::asRelease).c_str(), MB_OK); MessageBox(NULL, asMessage.c_str(), string("EU07 " + Global::asRelease).c_str(), MB_OK);
WriteLog(asMessage.c_str()); WriteLog(asMessage.c_str());
} }
void ErrorLog(const std::string &str, bool newline = true) void Error(const std::string &asMessage, bool box)
{
if (box)
MessageBox(NULL, asMessage.c_str(), string("EU07 " + Global::asRelease).c_str(), MB_OK);
WriteLog(asMessage.c_str());
}
void Error(const char* &asMessage, bool box)
{
if (box)
MessageBox(NULL, asMessage, string("EU07 " + Global::asRelease).c_str(), MB_OK);
WriteLog(asMessage);
}
void ErrorLog(const std::string &str, bool newline)
{ {
ErrorLog(str.c_str()); ErrorLog(str.c_str());
WriteLog(str.c_str(), newline); WriteLog(str.c_str(), newline);

2
Logs.h
View File

@@ -17,6 +17,8 @@ void WriteConsoleOnly(const char *str, bool newline = true);
void WriteLog(const char *str, double value); void WriteLog(const char *str, double value);
void WriteLog(const char *str, bool newline = true); 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 Error(const std::string &asMessage, bool box = true);
void Error(const char* &asMessage, bool box = true);
void ErrorLog(const std::string &str, bool newline = true); void ErrorLog(const std::string &str, bool newline = 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);

View File

@@ -172,7 +172,7 @@ static int const sound_relay = 16;
static int const sound_manyrelay = 32; static int const sound_manyrelay = 32;
static int const sound_brakeacc = 64; static int const sound_brakeacc = 64;
static bool const PhysicActivationFlag = false; static bool PhysicActivationFlag = false;
//szczególne typy pojazdów (inna obsługa) dla zmiennej TrainType //szczególne typy pojazdów (inna obsługa) dla zmiennej TrainType
//zamienione na flagi bitowe, aby szybko wybierać grupę (np. EZT+SZT) //zamienione na flagi bitowe, aby szybko wybierać grupę (np. EZT+SZT)
@@ -879,7 +879,7 @@ public:
int iProblem; // flagi problemów z taborem, aby AI nie musiało porównywać; 0=może jechać int iProblem; // flagi problemów z taborem, aby AI nie musiało porównywać; 0=może jechać
int iLights[2]; // bity zapalonych świateł tutaj, żeby dało się liczyć pobór prądu int iLights[2]; // bity zapalonych świateł tutaj, żeby dało się liczyć pobór prądu
private: private:
double CouplerDist(Byte Coupler); double CouplerDist(int Coupler);
public: public:
TMoverParameters(double VelInitial, std::string TypeNameInit, std::string NameInit, int LoadInitial, std::string LoadTypeInitial, int Cab); TMoverParameters(double VelInitial, std::string TypeNameInit, std::string NameInit, int LoadInitial, std::string LoadTypeInitial, int Cab);
@@ -1050,7 +1050,7 @@ public:
TPowerType PowerDecode(std::string s); //Q 20160719 TPowerType PowerDecode(std::string s); //Q 20160719
TEngineTypes EngineDecode(std::string s); //Q 20160721 TEngineTypes EngineDecode(std::string s); //Q 20160721
bool CreateBrakeSys(); //Q 20160722 bool CreateBrakeSys(); //Q 20160722
bool CheckLocomotiveParametersQ(bool ReadyFlag, int Dir); bool CheckLocomotiveParameters(bool ReadyFlag, int Dir);
std::string EngineDescription(int what); std::string EngineDescription(int what);
}; };

View File

@@ -52,6 +52,39 @@ double sqr(double val) // SQR() zle liczylo w current() ...
return val * val; return val * val;
} }
double ComputeCollision(double v1, double v2, double m1, double m2, double beta, bool vc)
{ // oblicza zmiane predkosci i przyrost pedu wskutek kolizji
if (v1 < v2 && vc)
return 0;
else
{
double sum = m1 + m2;
double w1 = ((m1 - m2) * v1 + 2 * m2 * v2) / sum;
double w2 = ((m2 - m1) * v2 + 2 * m1 * v1) / sum;
v1 = w1 * sqrt(1 - beta); // niejawna zmiana predkosci wskutek zderzenia
v2 = w2 * sqrt(1 - beta);
return m1 * (w2 - w1) * (1 - beta);
}
}
int DirPatch(int Coupler1, int Coupler2)
{
return (Coupler1 != Coupler2 ? 1 : -1);
}
int DirF(int CouplerN)
{
switch (CouplerN)
{
case 0:
return -1;
case 1:
return 1;
default:
return 0;
}
}
// ************************************************************************************************* // *************************************************************************************************
// Q: 20160716 // Q: 20160716
// ************************************************************************************************* // *************************************************************************************************
@@ -284,7 +317,7 @@ TMoverParameters::TMoverParameters(double VelInitial, std::string TypeNameInit,
BrakeCtrlPosNo = 0; BrakeCtrlPosNo = 0;
LightsPosNo = 0; LightsPosNo = 0;
LightsDefPos = 1; LightsDefPos = 1;
for (k = -1; k < Hamulce::MainBrakeMaxPos; k++) for (k = -1; k < MainBrakeMaxPos; k++)
{ {
BrakePressureTable[k].PipePressureVal = 0; BrakePressureTable[k].PipePressureVal = 0;
BrakePressureTable[k].BrakePressureVal = 0; BrakePressureTable[k].BrakePressureVal = 0;
@@ -2464,9 +2497,9 @@ bool TMoverParameters::DecBrakeLevelOld(void)
bool TMoverParameters::IncLocalBrakeLevel(int CtrlSpeed) bool TMoverParameters::IncLocalBrakeLevel(int CtrlSpeed)
{ {
bool IBL; bool IBL;
if ((LocalBrakePos < Hamulce::LocalBrakePosNo) /*and (BrakeCtrlPos<1)*/) if ((LocalBrakePos < LocalBrakePosNo) /*and (BrakeCtrlPos<1)*/)
{ {
while ((LocalBrakePos < Hamulce::LocalBrakePosNo) && (CtrlSpeed > 0)) while ((LocalBrakePos < LocalBrakePosNo) && (CtrlSpeed > 0))
{ {
LocalBrakePos++; LocalBrakePos++;
CtrlSpeed--; CtrlSpeed--;
@@ -2508,9 +2541,9 @@ bool TMoverParameters::DecLocalBrakeLevel(int CtrlSpeed)
bool TMoverParameters::IncLocalBrakeLevelFAST(void) bool TMoverParameters::IncLocalBrakeLevelFAST(void)
{ {
bool ILBLF; bool ILBLF;
if (LocalBrakePos < Hamulce::LocalBrakePosNo) if (LocalBrakePos < LocalBrakePosNo)
{ {
LocalBrakePos = Hamulce::LocalBrakePosNo; LocalBrakePos = LocalBrakePosNo;
ILBLF = true; ILBLF = true;
} }
else else
@@ -2972,7 +3005,7 @@ void TMoverParameters::UpdatePipePressure(double dt)
if ((BrakeCtrlPosNo > 1) && (ActiveCab != 0)) if ((BrakeCtrlPosNo > 1) && (ActiveCab != 0))
// with BrakePressureTable[BrakeCtrlPos] do // with BrakePressureTable[BrakeCtrlPos] do
{ {
dpLocalValve = LocHandle->GetPF(LocalBrakePos / Hamulce::LocalBrakePosNo, Hamulec->GetBCP(), dpLocalValve = LocHandle->GetPF(LocalBrakePos / LocalBrakePosNo, Hamulec->GetBCP(),
ScndPipePress, dt, 0); ScndPipePress, dt, 0);
if ((BrakeHandle == FV4a) && if ((BrakeHandle == FV4a) &&
((PipePress < 2.75) && ((Hamulec->GetStatus() && b_rls) == 0)) && ((PipePress < 2.75) && ((Hamulec->GetStatus() && b_rls) == 0)) &&
@@ -5378,25 +5411,25 @@ int nSize;
int ti(std::string val) int ti(std::string val)
{ {
return StrToInt(val); return atoi(val.c_str());
} }
double td(std::string val) double td(std::string val)
{ {
return val.ToDouble(); return atof(val.c_str());
} }
std::string ts(std::string val) std::string ts(std::string val)
{ {
// WriteLog("["+ val + "]"); // WriteLog("["+ val + "]");
return (std::string(val)); return val;
// else return "unknown"; // else return "unknown";
} }
std::string tS(std::string val) std::string tS(std::string val)
{ {
return (val.UpperCase()); return ToUpper(val);
} }
// ************************************************************************************************* // *************************************************************************************************
@@ -6768,7 +6801,7 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
// Q: 20160717 // Q: 20160717
// ************************************************************************************************* // *************************************************************************************************
bool TMoverParameters::CheckLocomotiveParametersQ(bool ReadyFlag, int Dir) bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir)
{ {
bool OK; bool OK;
int b; int b;

View File

@@ -18,6 +18,7 @@ http://mozilla.org/MPL/2.0/.
#include <string> #include <string>
#include <fstream> #include <fstream>
#include <time.h> #include <time.h>
#include <sys/stat.h>
using namespace std; using namespace std;
@@ -69,6 +70,12 @@ inline int Random()
return rand(); return rand();
} }
inline float random(float a, float b)
{
srand(time(NULL));
return a + rand() / (float)RAND_MAX * (b - a);
}
inline double BorlandTime() inline double BorlandTime()
{ {
std::tm epoch; std::tm epoch;
@@ -108,7 +115,11 @@ void ComputeArc(double X0, double Y0, double Xn, double Yn, double R, double L,
/*wylicza polozenie Xout Yout i orientacje phi punktu na elemencie dL luku*/ /*wylicza polozenie Xout Yout i orientacje phi punktu na elemencie dL luku*/
void ComputeALine(double X0, double Y0, double Xn, double Yn, double L, double R, double & Xout, double & Yout); void ComputeALine(double X0, double Y0, double Xn, double Yn, double L, double R, double & Xout, double & Yout);
inline bool fileExist(const std::string &name)
{
struct stat buffer;
return (stat(name.c_str(), &buffer) == 0);
}
double Xmin; double Ymin; double Xmax; double Ymax; double Xmin; double Ymin; double Xmax; double Ymax;
double Xaspect; double Yaspect; double Xaspect; double Yaspect;

View File

@@ -129,7 +129,7 @@ bool TMemCell::Load(cParser *parser)
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
if (token.compare("none") != 0) // gdy ró¿ne od "none" if (token.compare("none") != 0) // gdy ró¿ne od "none"
asTrackName = AnsiString(token.c_str()); // sprawdzane przez IsEmpty() asTrackName = token; // sprawdzane przez IsEmpty()
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
if (token.compare("endmemcell") != 0) if (token.compare("endmemcell") != 0)

View File

@@ -13,6 +13,7 @@ http://mozilla.org/MPL/2.0/.
#include "Classes.h" #include "Classes.h"
#include "dumb3d.h" #include "dumb3d.h"
using namespace Math3D; using namespace Math3D;
using namespace std;
class TMemCell class TMemCell
{ {
@@ -25,7 +26,7 @@ class TMemCell
bool bCommand; // czy zawiera komendê dla zatrzymanego AI bool bCommand; // czy zawiera komendê dla zatrzymanego AI
TEvent *OnSent; // event dodawany do kolejki po wys³aniu komendy zatrzymuj¹cej sk³ad TEvent *OnSent; // event dodawany do kolejki po wys³aniu komendy zatrzymuj¹cej sk³ad
public: public:
AnsiString string
asTrackName; // McZapkie-100302 - zeby nazwe toru na ktory jest Putcommand wysylane pamietac asTrackName; // McZapkie-100302 - zeby nazwe toru na ktory jest Putcommand wysylane pamietac
TMemCell(vector3 *p); TMemCell(vector3 *p);
~TMemCell(); ~TMemCell();

View File

@@ -12,8 +12,8 @@ http://mozilla.org/MPL/2.0/.
*/ */
//#include "system.hpp" #include "system.hpp"
//#include "classes.hpp" #include "classes.hpp"
#pragma hdrstop #pragma hdrstop
#include "math.h" #include "math.h"
@@ -61,7 +61,7 @@ void TRealSound::Init(char *SoundName, double DistanceAttenuation, double X, dou
{ // dla modulowanych nie może być zmiany mnożnika, bo częstotliwość w nagłówku byłą { // dla modulowanych nie może być zmiany mnożnika, bo częstotliwość w nagłówku byłą
// ignorowana, a mogła być inna niż 22050 // ignorowana, a mogła być inna niż 22050
fFrequency = 22050.0; fFrequency = 22050.0;
ErrorLog("Bad sound: " + AnsiString(SoundName) + ErrorLog("Bad sound: " + string(SoundName) +
", as modulated, should have 22.05kHz in header"); ", as modulated, should have 22.05kHz in header");
} }
AM = 1.0; AM = 1.0;
@@ -70,7 +70,7 @@ void TRealSound::Init(char *SoundName, double DistanceAttenuation, double X, dou
else else
{ // nie ma dźwięku, to jest wysyp { // nie ma dźwięku, to jest wysyp
AM = 0; AM = 0;
ErrorLog("Missed sound: " + AnsiString(SoundName)); ErrorLog("Missed sound: " + string(SoundName));
} }
if (DistanceAttenuation > 0.0) if (DistanceAttenuation > 0.0)
{ {

View File

@@ -10,8 +10,12 @@ http://mozilla.org/MPL/2.0/.
#ifndef RealSoundH #ifndef RealSoundH
#define RealSoundH #define RealSoundH
#include "system.hpp"
#include "classes.hpp"
#include "Sound.h" #include "Sound.h"
#include "Geometry.h" #include "Geometry.h"
#include <string>
class TRealSound class TRealSound
{ {

View File

@@ -25,9 +25,9 @@ http://mozilla.org/MPL/2.0/.
// 101206 Ra: trapezoidalne drogi // 101206 Ra: trapezoidalne drogi
// 110806 Ra: odwrócone mapowanie wzdłuż - Point1 == 1.0 // 110806 Ra: odwrócone mapowanie wzdłuż - Point1 == 1.0
AnsiString Where(vector3 p) string Where(vector3 p)
{ // zamiana współrzędnych na tekst, używana w błędach { // zamiana współrzędnych na tekst, używana w błędach
return AnsiString(p.x) + " " + AnsiString(p.y) + " " + AnsiString(p.z); return to_string(p.x) + " " + to_string(p.y) + " " + to_string(p.z);
}; };
TSegment::TSegment(TTrack *owner) TSegment::TSegment(TTrack *owner)

View File

@@ -58,10 +58,10 @@ TSoundContainer::TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFi
{ {
// SetFileUI( hDlg, TEXT("Bad wave file.") ); // SetFileUI( hDlg, TEXT("Bad wave file.") );
return; return;
ErrorLog("Missed sound: " + AnsiString(strFileName)); ErrorLog("Missed sound: " + string(strFileName));
} }
strcpy(Name, AnsiString(strFileName).LowerCase().c_str()); strcpy(Name, ToLower(strFileName).c_str());
// Set up the direct sound buffer, and only request the flags needed // Set up the direct sound buffer, and only request the flags needed
// since each requires some overhead and limits if the buffer can // since each requires some overhead and limits if the buffer can
@@ -208,7 +208,7 @@ LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(char *Name, bool Dynamic, float
AnsiString file; AnsiString file;
if (Dynamic) if (Dynamic)
{ // próba wczytania z katalogu pojazdu { // próba wczytania z katalogu pojazdu
file = Global::asCurrentDynamicPath + AnsiString(Name); file = AnsiString(Global::asCurrentDynamicPath.c_str()) + AnsiString(Name);
if (FileExists(file)) if (FileExists(file))
Name = file.c_str(); // nowa nazwa Name = file.c_str(); // nowa nazwa
else else
@@ -259,7 +259,7 @@ LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(char *Name, bool Dynamic, float
*fSamplingRate = Next->fSamplingRate; // czêstotliwoœæ *fSamplingRate = Next->fSamplingRate; // czêstotliwoœæ
return Next->GetUnique(pDS); return Next->GetUnique(pDS);
} }
ErrorLog("Missed sound: " + AnsiString(Name)); ErrorLog("Missed sound: " + string(Name));
return (NULL); return (NULL);
}; };

106
Track.cpp
View File

@@ -93,7 +93,7 @@ TIsolated::TIsolated()
TIsolated("none", NULL); TIsolated("none", NULL);
}; };
TIsolated::TIsolated(const AnsiString &n, TIsolated *i) TIsolated::TIsolated(const string &n, TIsolated *i)
{ // utworznie obwodu izolowanego { // utworznie obwodu izolowanego
asName = n; asName = n;
pNext = i; pNext = i;
@@ -115,7 +115,7 @@ TIsolated::~TIsolated(){
*/ */
}; };
TIsolated * TIsolated::Find(const AnsiString &n) TIsolated * TIsolated::Find(const string &n)
{ // znalezienie obiektu albo utworzenie nowego { // znalezienie obiektu albo utworzenie nowego
TIsolated *p = pRoot; TIsolated *p = pRoot;
while (p) while (p)
@@ -453,18 +453,18 @@ vector3 LoadPoint(cParser *parser)
return p; return p;
} }
void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name) void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name)
{ // pobranie obiektu trajektorii ruchu { // pobranie obiektu trajektorii ruchu
vector3 pt, vec, p1, p2, cp1, cp2, p3, p4, cp3, cp4; // dodatkowe punkty potrzebne do skrzyżowań vector3 pt, vec, p1, p2, cp1, cp2, p3, p4, cp3, cp4; // dodatkowe punkty potrzebne do skrzyżowań
double a1, a2, r1, r2, r3, r4, d1, d2, a; double a1, a2, r1, r2, r3, r4, d1, d2, a;
AnsiString str; string str;
bool bCurve; bool bCurve;
int i; //,state; //Ra: teraz już nie ma początkowego stanu zwrotnicy we wpisie int i; //,state; //Ra: teraz już nie ma początkowego stanu zwrotnicy we wpisie
std::string token; std::string token;
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // typ toru str = token; // typ toru
if (str == "normal") if (str == "normal")
{ {
@@ -509,7 +509,7 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
else else
eType = tt_Unknown; eType = tt_Unknown;
if (Global::iWriteLogEnabled & 4) if (Global::iWriteLogEnabled & 4)
WriteLog(str.c_str()); WriteLog(str);
parser->getTokens(4); parser->getTokens(4);
*parser >> fTrackLength >> fTrackWidth >> fFriction >> fSoundDistance; *parser >> fTrackLength >> fTrackWidth >> fFriction >> fSoundDistance;
// fTrackLength=Parser->GetNextSymbol().ToDouble(); //track length // fTrackLength=Parser->GetNextSymbol().ToDouble(); //track length
@@ -526,7 +526,7 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
iAction |= 0x80; // flaga wykolejania z powodu uszkodzenia iAction |= 0x80; // flaga wykolejania z powodu uszkodzenia
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // environment str = token; // environment
if (str == "flat") if (str == "flat")
eEnvironment = e_flat; eEnvironment = e_flat;
else if (str == "mountains" || str == "mountain") else if (str == "mountains" || str == "mountain")
@@ -551,9 +551,9 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
{ {
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // railtex str = token; // railtex
TextureID1 = (str == "none" ? 0 : TTexturesManager::GetTextureID( TextureID1 = (str == "none" ? 0 : TTexturesManager::GetTextureID(
szTexturePath, szSceneryPath, str.c_str(), szTexturePath, szSceneryPath, str,
(iCategoryFlag & 1) ? Global::iRailProFiltering : (iCategoryFlag & 1) ? Global::iRailProFiltering :
Global::iBallastFiltering)); Global::iBallastFiltering));
parser->getTokens(); parser->getTokens();
@@ -562,9 +562,9 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
fTexLength = 4; // Ra: zabezpiecznie przed zawieszeniem fTexLength = 4; // Ra: zabezpiecznie przed zawieszeniem
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // sub || railtex str = token; // sub || railtex
TextureID2 = (str == "none" ? 0 : TTexturesManager::GetTextureID( TextureID2 = (str == "none" ? 0 : TTexturesManager::GetTextureID(
szTexturePath, szSceneryPath, str.c_str(), szTexturePath, szSceneryPath, str,
(eType == tt_Normal) ? Global::iBallastFiltering : (eType == tt_Normal) ? Global::iBallastFiltering :
Global::iRailProFiltering)); Global::iRailProFiltering));
parser->getTokens(3); parser->getTokens(3);
@@ -751,44 +751,44 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
} }
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); str = token;
while (str != "endtrack") while (str != "endtrack")
{ {
if (str == "event0") if (str == "event0")
{ {
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
asEvent0Name = AnsiString(token.c_str()); asEvent0Name = token;
} }
else if (str == "event1") else if (str == "event1")
{ {
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
asEvent1Name = AnsiString(token.c_str()); asEvent1Name = token;
} }
else if (str == "event2") else if (str == "event2")
{ {
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
asEvent2Name = AnsiString(token.c_str()); asEvent2Name = token;
} }
else if (str == "eventall0") else if (str == "eventall0")
{ {
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
asEventall0Name = AnsiString(token.c_str()); asEventall0Name = token;
} }
else if (str == "eventall1") else if (str == "eventall1")
{ {
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
asEventall1Name = AnsiString(token.c_str()); asEventall1Name = token;
} }
else if (str == "eventall2") else if (str == "eventall2")
{ {
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
asEventall2Name = AnsiString(token.c_str()); asEventall2Name = token;
} }
else if (str == "velocity") else if (str == "velocity")
{ {
@@ -803,7 +803,7 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
{ // obwód izolowany, do którego tor należy { // obwód izolowany, do którego tor należy
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
pIsolated = TIsolated::Find(AnsiString(token.c_str())); pIsolated = TIsolated::Find(token);
} }
else if (str == "angle1") else if (str == "angle1")
{ // kąt ścięcia końca od strony 1 { // kąt ścięcia końca od strony 1
@@ -849,15 +849,15 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
ErrorLog("Unknown property: \"" + str + "\" in track \"" + name + "\""); ErrorLog("Unknown property: \"" + str + "\" in track \"" + name + "\"");
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); str = token;
} }
// alternatywny zapis nazwy odcinka izolowanego - po znaku "@" w nazwie toru // alternatywny zapis nazwy odcinka izolowanego - po znaku "@" w nazwie toru
if (!pIsolated) if (!pIsolated)
if ((i = name.Pos("@")) > 0) if ((i = name.find("@")) != string::npos)
if (i < name.Length()) // nie może być puste if (i < name.length()) // nie może być puste
{ {
pIsolated = TIsolated::Find(name.SubString(i + 1, name.Length())); pIsolated = TIsolated::Find(name.substr(i + 1, name.length()));
name = name.SubString(1, i - 1); // usunięcie z nazwy name = name.substr(0, i - 1); // usunięcie z nazwy
} }
} }
@@ -874,10 +874,10 @@ bool TTrack::AssignEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent
} }
else else
{ {
if (!asEvent0Name.IsEmpty()) if (!asEvent0Name.empty())
{ {
ErrorLog(AnsiString("Bad track: Event0 \"") + asEvent0Name + ErrorLog("Bad track: Event0 \"" + asEvent0Name +
AnsiString("\" does not exist")); "\" does not exist");
bError = true; bError = true;
} }
} }
@@ -885,7 +885,7 @@ bool TTrack::AssignEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent
else else
{ {
ErrorLog( ErrorLog(
AnsiString("Bad track: Event0 cannot be assigned to track, track already has one")); "Bad track: Event0 cannot be assigned to track, track already has one");
bError = true; bError = true;
} }
if (!evEvent1) if (!evEvent1)
@@ -896,17 +896,17 @@ bool TTrack::AssignEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent
asEvent1Name = ""; asEvent1Name = "";
iEvents |= 2; // sumaryczna informacja o eventach iEvents |= 2; // sumaryczna informacja o eventach
} }
else if (!asEvent1Name.IsEmpty()) else if (!asEvent1Name.empty())
{ // Ra: tylko w logu informacja { // Ra: tylko w logu informacja
ErrorLog(AnsiString("Bad track: Event1 \"") + asEvent1Name + ErrorLog("Bad track: Event1 \"" + asEvent1Name +
AnsiString("\" does not exist").c_str()); "\" does not exist");
bError = true; bError = true;
} }
} }
else else
{ {
ErrorLog( ErrorLog(
AnsiString("Bad track: Event1 cannot be assigned to track, track already has one")); "Bad track: Event1 cannot be assigned to track, track already has one");
bError = true; bError = true;
} }
if (!evEvent2) if (!evEvent2)
@@ -917,17 +917,17 @@ bool TTrack::AssignEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent
asEvent2Name = ""; asEvent2Name = "";
iEvents |= 4; // sumaryczna informacja o eventach iEvents |= 4; // sumaryczna informacja o eventach
} }
else if (!asEvent2Name.IsEmpty()) else if (!asEvent2Name.empty())
{ // Ra: tylko w logu informacja { // Ra: tylko w logu informacja
ErrorLog(AnsiString("Bad track: Event2 \"") + asEvent2Name + ErrorLog("Bad track: Event2 \"" + asEvent2Name +
AnsiString("\" does not exist")); "\" does not exist");
bError = true; bError = true;
} }
} }
else else
{ {
ErrorLog( ErrorLog(
AnsiString("Bad track: Event2 cannot be assigned to track, track already has one")); "Bad track: Event2 cannot be assigned to track, track already has one");
bError = true; bError = true;
} }
return !bError; return !bError;
@@ -946,17 +946,17 @@ bool TTrack::AssignallEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEv
} }
else else
{ {
if (!asEvent0Name.IsEmpty()) if (!asEvent0Name.empty())
{ {
Error(AnsiString("Eventall0 \"") + asEventall0Name + Error("Eventall0 \"" + asEventall0Name +
AnsiString("\" does not exist")); "\" does not exist");
bError = true; bError = true;
} }
} }
} }
else else
{ {
Error(AnsiString("Eventall0 cannot be assigned to track, track already has one")); Error("Eventall0 cannot be assigned to track, track already has one");
bError = true; bError = true;
} }
if (!evEventall1) if (!evEventall1)
@@ -969,17 +969,17 @@ bool TTrack::AssignallEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEv
} }
else else
{ {
if (!asEvent0Name.IsEmpty()) if (!asEvent0Name.empty())
{ // Ra: tylko w logu informacja { // Ra: tylko w logu informacja
WriteLog(AnsiString("Eventall1 \"") + asEventall1Name + WriteLog("Eventall1 \"" + asEventall1Name +
AnsiString("\" does not exist")); "\" does not exist");
bError = true; bError = true;
} }
} }
} }
else else
{ {
Error(AnsiString("Eventall1 cannot be assigned to track, track already has one")); Error("Eventall1 cannot be assigned to track, track already has one");
bError = true; bError = true;
} }
if (!evEventall2) if (!evEventall2)
@@ -992,17 +992,17 @@ bool TTrack::AssignallEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEv
} }
else else
{ {
if (!asEvent0Name.IsEmpty()) if (!asEvent0Name.empty())
{ // Ra: tylko w logu informacja { // Ra: tylko w logu informacja
WriteLog(AnsiString("Eventall2 \"") + asEventall2Name + WriteLog("Eventall2 \"" + asEventall2Name +
AnsiString("\" does not exist")); "\" does not exist");
bError = true; bError = true;
} }
} }
} }
else else
{ {
Error(AnsiString("Eventall2 cannot be assigned to track, track already has one")); Error("Eventall2 cannot be assigned to track, track already has one");
bError = true; bError = true;
} }
return !bError; return !bError;
@@ -1021,7 +1021,7 @@ bool TTrack::AssignForcedEvents(TEvent *NewEventPlus, TEvent *NewEventMinus)
return false; return false;
}; };
AnsiString TTrack::IsolatedName() string TTrack::IsolatedName()
{ // podaje nazwę odcinka izolowanego, jesli nie ma on jeszcze przypisanych zdarzeń { // podaje nazwę odcinka izolowanego, jesli nie ma on jeszcze przypisanych zdarzeń
if (pIsolated) if (pIsolated)
if (!pIsolated->evBusy && !pIsolated->evFree) if (!pIsolated->evBusy && !pIsolated->evFree)
@@ -3136,13 +3136,13 @@ void TTrack::ConnectionsLog()
for (i = 0; i < 2; ++i) for (i = 0; i < 2; ++i)
{ {
if (SwitchExtension->pPrevs[i]) if (SwitchExtension->pPrevs[i])
WriteLog("Point " + AnsiString(i + i + 1) + " -> track " + WriteLog("Point " + to_string(i + i + 1) + " -> track " +
SwitchExtension->pPrevs[i]->pMyNode->asName + ":" + SwitchExtension->pPrevs[i]->pMyNode->asName + ":" +
AnsiString(int(SwitchExtension->iPrevDirection[i]))); to_string(int(SwitchExtension->iPrevDirection[i])));
if (SwitchExtension->pNexts[i]) if (SwitchExtension->pNexts[i])
WriteLog("Point " + AnsiString(i + i + 2) + " -> track " + WriteLog("Point " + to_string(i + i + 2) + " -> track " +
SwitchExtension->pNexts[i]->pMyNode->asName + ":" + SwitchExtension->pNexts[i]->pMyNode->asName + ":" +
AnsiString(int(SwitchExtension->iNextDirection[i]))); to_string(int(SwitchExtension->iNextDirection[i])));
} }
}; };

22
Track.h
View File

@@ -17,6 +17,8 @@ http://mozilla.org/MPL/2.0/.
#include "Classes.h" #include "Classes.h"
#include <string> #include <string>
using namespace std;
class TEvent; class TEvent;
typedef enum typedef enum
@@ -107,10 +109,10 @@ class TIsolated
TEvent *evFree; // zdarzenie wyzwalane po całkowitym zwolnieniu zajętości grupy TEvent *evFree; // zdarzenie wyzwalane po całkowitym zwolnieniu zajętości grupy
TMemCell *pMemCell; // automatyczna komórka pamięci, która współpracuje z odcinkiem izolowanym TMemCell *pMemCell; // automatyczna komórka pamięci, która współpracuje z odcinkiem izolowanym
TIsolated(); TIsolated();
TIsolated(const AnsiString &n, TIsolated *i); TIsolated(const string &n, TIsolated *i);
~TIsolated(); ~TIsolated();
static TIsolated * Find( static TIsolated * Find(
const AnsiString &n); // znalezienie obiektu albo utworzenie nowego const string &n); // znalezienie obiektu albo utworzenie nowego
void Modify(int i, TDynamicObject *o); // dodanie lub odjęcie osi void Modify(int i, TDynamicObject *o); // dodanie lub odjęcie osi
bool Busy() bool Busy()
{ {
@@ -158,12 +160,12 @@ class TTrack : public Resource
TEvent *evEvent0; // McZapkie-280503: wyzwalany tylko gdy headdriver TEvent *evEvent0; // McZapkie-280503: wyzwalany tylko gdy headdriver
TEvent *evEvent1; TEvent *evEvent1;
TEvent *evEvent2; TEvent *evEvent2;
AnsiString asEventall0Name; // nazwy eventów string asEventall0Name; // nazwy eventów
AnsiString asEventall1Name; string asEventall1Name;
AnsiString asEventall2Name; string asEventall2Name;
AnsiString asEvent0Name; string asEvent0Name;
AnsiString asEvent1Name; string asEvent1Name;
AnsiString asEvent2Name; string asEvent2Name;
int iNextDirection; // 0:Point1, 1:Point2, 3:do odchylonego na zwrotnicy int iNextDirection; // 0:Point1, 1:Point2, 3:do odchylonego na zwrotnicy
int iPrevDirection; int iPrevDirection;
TTrackType eType; TTrackType eType;
@@ -228,7 +230,7 @@ class TTrack : public Resource
{ {
return (SwitchExtension ? SwitchExtension->CurrentIndex : -1); return (SwitchExtension ? SwitchExtension->CurrentIndex : -1);
}; };
void Load(cParser *parser, vector3 pOrigin, AnsiString name); void Load(cParser *parser, vector3 pOrigin, std::string name);
bool AssignEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent2); bool AssignEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent2);
bool AssignallEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent2); bool AssignallEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent2);
bool AssignForcedEvents(TEvent *NewEventPlus, TEvent *NewEventMinus); bool AssignForcedEvents(TEvent *NewEventPlus, TEvent *NewEventMinus);
@@ -266,7 +268,7 @@ class TTrack : public Resource
if (pIsolated) if (pIsolated)
pIsolated->Modify(i, o); pIsolated->Modify(i, o);
}; // dodanie lub odjęcie osi }; // dodanie lub odjęcie osi
AnsiString IsolatedName(); string IsolatedName();
bool IsolatedEventsAssign(TEvent *busy, TEvent *free); bool IsolatedEventsAssign(TEvent *busy, TEvent *free);
double WidthTotal(); double WidthTotal();
GLuint TextureGet(int i) GLuint TextureGet(int i)

View File

@@ -13,8 +13,10 @@ http://mozilla.org/MPL/2.0/.
#include "opengl/glew.h" #include "opengl/glew.h"
#include "dumb3d.h" #include "dumb3d.h"
#include "VBO.h" #include "VBO.h"
#include <string>
using namespace Math3D; using namespace Math3D;
using namespace std;
class TTractionPowerSource; class TTractionPowerSource;
@@ -50,10 +52,10 @@ class TTraction
DWORD DamageFlag; // 1: zasniedziale, 128: zerwana DWORD DamageFlag; // 1: zasniedziale, 128: zerwana
int Wires; int Wires;
float WireOffset; float WireOffset;
AnsiString asPowerSupplyName; // McZapkie: nazwa podstacji trakcyjnej string asPowerSupplyName; // McZapkie: nazwa podstacji trakcyjnej
TTractionPowerSource * TTractionPowerSource *
psSection; // zasilacz (opcjonalnie mo¿e to byæ pulpit steruj¹cy EL2 w hali!) psSection; // zasilacz (opcjonalnie mo¿e to byæ pulpit steruj¹cy EL2 w hali!)
AnsiString asParallel; // nazwa przês³a, z którym mo¿e byæ bie¿nia wspólna string asParallel; // nazwa przês³a, z którym mo¿e byæ bie¿nia wspólna
TTraction *hvParallel; // jednokierunkowa i zapêtlona lista przêse³ ewentualnej bie¿ni wspólnej TTraction *hvParallel; // jednokierunkowa i zapêtlona lista przêse³ ewentualnej bie¿ni wspólnej
float fResistance[2]; // rezystancja zastêpcza do punktu zasilania (0: przês³o zasilane, <0: do float fResistance[2]; // rezystancja zastêpcza do punktu zasilania (0: przês³o zasilane, <0: do
// policzenia) // policzenia)

View File

@@ -2802,7 +2802,7 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz)
if (Global::iMultiplayer) if (Global::iMultiplayer)
{ // WriteLog("Komunikat: "+AnsiString(pRozkaz->Name1)); { // WriteLog("Komunikat: "+AnsiString(pRozkaz->Name1));
TEvent *e = Ground.FindEvent( TEvent *e = Ground.FindEvent(
AnsiString(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0]))); string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])));
if (e) if (e)
if ((e->Type == tp_Multiple) || (e->Type == tp_Lights) || if ((e->Type == tp_Multiple) || (e->Type == tp_Lights) ||
bool(e->evJoined)) // tylko jawne albo niejawne Multiple bool(e->evJoined)) // tylko jawne albo niejawne Multiple