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)
{ // rozpoznanie wpisu modelu i ustawienie świateł
AnsiString str;
std::string str;
std::string token;
parser->getTokens(); // nazwa modelu
*parser >> token;
str = AnsiString(token.c_str());
*parser >> str;
//str = token;
parser->getTokens(1, false); // tekstura (zmienia na małe)
*parser >> token;
if (!Init(str, AnsiString(token.c_str())))
if (!Init(AnsiString(str.c_str()), AnsiString(token.c_str())))
{
if (str != "notload")
{ // gdy brak modelu
if (ter) // jeśli teren
{
if (str.SubString(str.Length() - 3, 4) == ".t3d")
str[str.Length() - 2] = 'e';
if (str.substr(str.length() - 3, 4) == ".t3d")
str[str.length() - 2] = 'e';
Global::asTerrainModel = str;
WriteLog(AnsiString("Terrain model \"" + str + "\" will be created."));
WriteLog("Terrain model \"" + str + "\" will be created.");
}
else
ErrorLog(AnsiString("Missed file: " + str));
ErrorLog("Missed file: " + str);
}
}
else
@@ -516,16 +516,16 @@ bool TAnimModel::Load(cParser *parser, bool ter)
if (token.compare("lights") == 0)
{
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str());
*parser >> str;
//str = AnsiString(token.c_str());
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);
i++;
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str());
*parser >> str;
//str = AnsiString(token.c_str());
} while (str != "endmodel");
}
return true;

View File

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

View File

@@ -32,6 +32,7 @@ http://mozilla.org/MPL/2.0/.
#include "Camera.h" //bo likwidujemy trzęsienie
#include "Console.h"
#include "Traction.h"
#include <fstream>
#pragma package(smart_init)
// 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 != this) // odświeżenie tego samego się nie liczy
WriteLog("0! Coupler warning on " + asName + ":" +
AnsiString(MyCouplFound) + " - " + FoundedObj->asName +
to_string(MyCouplFound) + " - " + FoundedObj->asName +
":0 connected to " + FoundedObj->PrevConnected->asName + ":" +
AnsiString(FoundedObj->PrevConnectedNo));
to_string(FoundedObj->PrevConnectedNo));
}
else
{
if (FoundedObj->NextConnected)
if (FoundedObj->NextConnected != this) // odświeżenie tego samego się nie liczy
WriteLog("0! Coupler warning on " + asName + ":" +
AnsiString(MyCouplFound) + " - " + FoundedObj->asName +
to_string(MyCouplFound) + " - " + FoundedObj->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
@@ -1486,9 +1487,9 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist)
if (FoundedObj->PrevConnected)
if (FoundedObj->PrevConnected != this)
WriteLog("1! Coupler warning on " + asName + ":" +
AnsiString(MyCouplFound) + " - " + FoundedObj->asName +
to_string(MyCouplFound) + " - " + FoundedObj->asName +
":0 connected to " + FoundedObj->PrevConnected->asName + ":" +
AnsiString(FoundedObj->PrevConnectedNo));
to_string(FoundedObj->PrevConnectedNo));
FoundedObj->PrevConnected = this;
FoundedObj->PrevConnectedNo = MyCouplFound;
}
@@ -1498,9 +1499,9 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist)
if (FoundedObj->NextConnected)
if (FoundedObj->NextConnected != this)
WriteLog("1! Coupler warning on " + asName + ":" +
AnsiString(MyCouplFound) + " - " + FoundedObj->asName +
to_string(MyCouplFound) + " - " + FoundedObj->asName +
":1 connected to " + FoundedObj->NextConnected->asName + ":" +
AnsiString(FoundedObj->NextConnectedNo));
to_string(FoundedObj->NextConnectedNo));
FoundedObj->NextConnected = this;
FoundedObj->NextConnectedNo = MyCouplFound;
}
@@ -1660,26 +1661,26 @@ TDynamicObject::~TDynamicObject()
}
double
TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
AnsiString BaseDir, // z którego katalogu wczytany, np. "PKP/EU07"
AnsiString asReplacableSkin, // nazwa wymiennej tekstury
AnsiString Type_Name, // nazwa CHK/MMD, np. "303E"
TDynamicObject::Init(string Name, // nazwa pojazdu, np. "EU07-424"
string BaseDir, // z którego katalogu wczytany, np. "PKP/EU07"
string asReplacableSkin, // nazwa wymiennej tekstury
string Type_Name, // nazwa CHK/MMD, np. "303E"
TTrack *Track, // tor początkowy wstwawienia (początek składu)
double fDist, // dystans względem punktu 1
AnsiString DriverType, // typ obsady
string DriverType, // typ obsady
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
float Load, // ilość ładunku
AnsiString LoadType, // nazwa ładunku
string LoadType, // nazwa ładunku
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
iDirection = (Reversed ? 0 : 1); // Ra: 0, jeśli ma być wstawiony jako obrócony tyłem
asBaseDir = "dynamic\\" + BaseDir + "\\"; // McZapkie-310302
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
if (DriverType == "headdriver")
DriverType = "1"; // sterujący kabiną +1
@@ -1693,9 +1694,9 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
else if (DriverType == "nobody")
DriverType = ""; // nikt nie siedzi
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
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;
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ł
// (zmienimy dla rozrządczych EZT)
// 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
if (ConversionError == -8)
ErrorLog("Missed file: " + BaseDir + "\\" + Type_Name + ".fiz");
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
}
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
MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać
// kropkę na koniec
int kropka = MoreParams.Pos("."); // znajdź kropke
AnsiString ActPar; // na parametry
int kropka = MoreParams.find("."); // znajdź kropke
string ActPar; // na parametry
while (kropka > 0) // jesli sa kropki jeszcze
{
int dlugosc = MoreParams.Length();
ActPar = MoreParams.SubString(1, kropka - 1).UpperCase(); // pierwszy parametr;
MoreParams = MoreParams.SubString(kropka + 1, dlugosc - kropka); // reszta do dalszej
int dlugosc = MoreParams.length();
ActPar = ToUpper(MoreParams.substr(0, kropka - 1)); // pierwszy parametr;
MoreParams = MoreParams.substr(kropka + 1, dlugosc - kropka); // reszta do dalszej
// 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
WriteLog("Wpis hamulca: " + ActPar);
if (ActPar.Pos("G") > 0)
if (ActPar.find("G") != string::npos)
{
MoverParameters->BrakeDelaySwitch(bdelay_G);
}
if (ActPar.Pos("P") > 0)
if (ActPar.find("P") != string::npos)
{
MoverParameters->BrakeDelaySwitch(bdelay_P);
}
if (ActPar.Pos("R") > 0)
if (ActPar.find("R") != string::npos)
{
MoverParameters->BrakeDelaySwitch(bdelay_R);
}
if (ActPar.Pos("M") > 0)
if (ActPar.find("M") != string::npos)
{
MoverParameters->BrakeDelaySwitch(bdelay_R);
MoverParameters->BrakeDelaySwitch(bdelay_R + bdelay_M);
}
// 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
}
if (ActPar.Pos("0") > 0) // wylaczanie na sztywno
if (ActPar.find("0") != string::npos) // wylaczanie na sztywno
{
MoverParameters->BrakeStatus |= 128; // wylacz
MoverParameters->Hamulec->ForceEmptiness();
MoverParameters->BrakeReleaser(1); // odluznij automatycznie
}
if (ActPar.Pos("E") > 0) // oprozniony
if (ActPar.find("E") != string::npos) // oprozniony
{
MoverParameters->Hamulec->ForceEmptiness();
MoverParameters->BrakeReleaser(1); // odluznij automatycznie
MoverParameters->Pipe->CreatePress(0);
MoverParameters->Pipe2->CreatePress(0);
}
if (ActPar.Pos("Q") > 0) // oprozniony
if (ActPar.find("Q") != string::npos) // oprozniony
{
// MoverParameters->Hamulec->ForceEmptiness(); //TODO: sprawdzic,
// dlaczego
@@ -1807,7 +1808,7 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
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
{
@@ -1816,7 +1817,7 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
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
{
@@ -1850,27 +1851,27 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
}
}
// nastawianie ladunku
if (ActPar.Pos("T") > 0) // prozny
if (ActPar.find("T") != string::npos) // prozny
{
MoverParameters->DecBrakeMult();
MoverParameters->DecBrakeMult();
} // 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->DecBrakeMult();
} // 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();
} // dwa razy w gore
if (ActPar.Pos("N") > 0) // parametr neutralny
if (ActPar.find("N") != string::npos) // parametr neutralny
{
}
} // 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
}
@@ -1903,7 +1904,7 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
// if (MoverParameters->CabNo!=0)
if (DriverType != "")
{ // 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 !=
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
// 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
// MoverParameters->ActiveCab=MoverParameters->CabNo; //ustalenie aktywnej
// kabiny
// (rozrząd)
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->PutCommand(
@@ -1988,11 +1989,11 @@ TDynamicObject::Init(AnsiString Name, // nazwa pojazdu, np. "EU07-424"
if (mdModel) // jeśli ma w czym szukać
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());
if (smBuforLewy[i])
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());
if (smBuforPrawy[i])
smBuforPrawy[i]->WillBeAnimated();
@@ -2329,14 +2330,14 @@ void TDynamicObject::LoadUpdate()
// Ra: nie próbujemy wczytywać modeli miliony razy podczas renderowania!!!
if ((mdLoad == NULL) && (MoverParameters->Load > 0))
{
AnsiString asLoadName =
string asLoadName =
asBaseDir + MoverParameters->LoadType + ".t3d"; // zapamiętany katalog pojazdu
// asLoadName=MoverParameters->LoadType;
// if (MoverParameters->LoadType!=AnsiString("passengers"))
Global::asCurrentTexturePath = asBaseDir; // bieżąca ścieżka do tekstur to dynamic/...
mdLoad = TModelsManager::GetModel(asLoadName.c_str()); // nowy ładunek
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
// zależności od
// 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,
// więc lepiej się tego nie zaloguje
ErrorLog("Voltage loss: by " + MoverParameters->Name + " at " +
FloatToStrF(vPosition.x, ffFixed, 7, 2) + " " +
FloatToStrF(vPosition.y, ffFixed, 7, 2) + " " +
FloatToStrF(vPosition.z, ffFixed, 7, 2) + ", time " +
FloatToStrF(NoVoltTime, ffFixed, 7, 2));
to_string(vPosition.x, 2, 7) + " " +
to_string(vPosition.y, 2, 7) + " " +
to_string(vPosition.z, 2, 7) + ", time " +
to_string(NoVoltTime, 2, 7));
// if (MoverParameters->PantRearUp)
// if (iAnimType[ANIM_PANTS]>1)
// if (pants[1])
@@ -4204,38 +4205,37 @@ void TDynamicObject::RenderAlpha()
// McZapkie-250202
// wczytywanie pliku z danymi multimedialnymi (dzwieki)
void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
AnsiString ReplacableSkin)
void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName,
string ReplacableSkin)
{
double dSDist;
TFileStream *fs;
// asBaseDir=BaseDir;
Global::asCurrentDynamicPath = BaseDir;
AnsiString asFileName = BaseDir + TypeName + ".mmd";
AnsiString asLoadName = BaseDir + MoverParameters->LoadType + ".t3d";
if (!FileExists(asFileName))
string asFileName = BaseDir + TypeName + ".mmd";
string asLoadName = BaseDir + MoverParameters->LoadType + ".t3d";
ifstream *fs = new ifstream(asFileName.c_str());
if (!fs->is_open())
{
ErrorLog("Missed file: " + asFileName); // brak MMD
delete fs;
return;
}
fs = new TFileStream(asFileName, fmOpenRead | fmShareCompat);
if (!fs)
return;
int size = fs->Size;
if (!size)
if (fs->width() == 0)
{
return delete fs;
};
AnsiString asAnimName;
string asAnimName;
bool Stop_InternalData = false;
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
fs->Read(buf, size);
//char *buf = new char[size + 1]; // ciąg bajtów o długości równej rozmiwarowi pliku
stringstream buffer;
buffer << fs->rdbuf();
//buf[size] = '\0'; // zakończony zerem na wszelki wypadek
delete fs;
TQueryParserComp *Parser;
Parser = new TQueryParserComp(NULL);
Parser->TextToParse = AnsiString(buf);
delete[] buf;
Parser->TextToParse = AnsiString(buffer.str().c_str());
//delete[] buf;
AnsiString str;
// Parser->LoadStringToParse(asFile);
Parser->First();
@@ -4248,18 +4248,18 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
if (str == AnsiString("models:")) // modele i podmodele
{
iMultiTex = 0; // czy jest wiele tekstur wymiennych?
asModel = Parser->GetNextSymbol().LowerCase();
if (asModel.Pos("#") == asModel.Length()) // Ra 2015-01: nie podoba mi się to
asModel = Parser->GetNextSymbol().LowerCase().c_str();
if (asModel.find("#") == asModel.length()) // Ra 2015-01: nie podoba mi się to
{ // model wymaga wielu tekstur wymiennych
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
// nazwie modelu, a po przecinku była by
// liczba
// tekstur?
if (i < asModel.Length())
if (i < asModel.length())
iMultiTex = asModel[i + 1] - '0';
if (iMultiTex < 0)
iMultiTex = 0;
@@ -4270,12 +4270,12 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
// modele w dynamics/basedir
Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/...
mdModel = TModelsManager::GetModel(asModel.c_str(), true);
if (ReplacableSkin != AnsiString("none"))
if (ReplacableSkin != "none")
{ // tekstura wymienna jest raczej jedynie w "dynamic\"
ReplacableSkin =
Global::asCurrentTexturePath + ReplacableSkin; // skory tez z dynamic/...
AnsiString x = TextureTest(Global::asCurrentTexturePath + "nowhere"); // na razie prymitywnie
if (!x.IsEmpty())
string x = TextureTest(Global::asCurrentTexturePath + "nowhere"); // na razie prymitywnie
if (!x.empty())
ReplacableSkinID[4] = TTexturesManager::GetTextureID(NULL, NULL, (Global::asCurrentTexturePath + "nowhere").c_str(), 9);
/*
if ((i = ReplacableSkin.Pos("|")) > 0) // replacable dzielone
@@ -4404,7 +4404,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
asModel = BaseDir + asModel;
mdPrzedsionek = TModelsManager::GetModel(asModel.c_str(), true);
}
if (!MoverParameters->LoadAccepted.IsEmpty())
if (!MoverParameters->LoadAccepted.empty())
// if (MoverParameters->LoadAccepted!=AnsiString("")); // &&
// MoverParameters->LoadType!=AnsiString("passengers"))
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
mdLoad = TModelsManager::GetModel(asLoadName.c_str(), true); // ladunek
Global::asCurrentTexturePath =
AnsiString(szTexturePath); // z powrotem defaultowa sciezka do tekstur
string(szTexturePath); // z powrotem defaultowa sciezka do tekstur
while (!Parser->EndOfFile && str != AnsiString("endmodels"))
{
str = Parser->GetNextSymbol().LowerCase();
@@ -4518,7 +4518,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
}
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
// modele w dynamic/basedir
Global::asCurrentTexturePath =
@@ -4530,13 +4530,13 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
}
if (str == AnsiString("brakemode:"))
{ // Ra 15-01: gałka nastawy hamulca
asAnimName = Parser->GetNextSymbol().LowerCase();
asAnimName = Parser->GetNextSymbol().LowerCase().c_str();
smBrakeMode = mdModel->GetFromName(asAnimName.c_str());
// jeszcze wczytać kąty obrotu dla poszczególnych ustawień
}
if (str == AnsiString("loadmode:"))
{ // Ra 15-01: gałka nastawy hamulca
asAnimName = Parser->GetNextSymbol().LowerCase();
asAnimName = Parser->GetNextSymbol().LowerCase().c_str();
smLoadMode = mdModel->GetFromName(asAnimName.c_str());
// jeszcze wczytać kąty obrotu dla poszczególnych ustawień
}
@@ -4546,7 +4546,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
str = Parser->GetNextSymbol();
for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // liczba osi
{ // McZapkie-050402: wyszukiwanie kol o nazwie str*
asAnimName = str + AnsiString(i + 1);
asAnimName = str.c_str() + to_string(i + 1);
pAnimations[i].smAnimated =
mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu
if (pAnimations[i].smAnimated)
@@ -4580,7 +4580,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
{ // obsługa różnych średnic, o
// ile występują
while ((i < iAnimType[ANIM_WHEELS]) &&
(j <= MoverParameters->AxleArangement.Length()))
(j <= MoverParameters->AxleArangement.length()))
{ // wersja ze wskaźnikami jest
// bardziej elastyczna na nietypowe
// układy
@@ -4630,7 +4630,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
for (int i = 0; i < iAnimType[ANIM_PANTS]; i++)
{ // Winger 160204: wyszukiwanie max 2 patykow o nazwie
// str*
asAnimName = str + AnsiString(i + 1);
asAnimName = str.c_str() + to_string(i + 1);
sm = mdModel->GetFromName(asAnimName.c_str());
pants[i].smElement[0] = sm; // jak NULL, to nie będzie animowany
if (sm)
@@ -4737,8 +4737,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
pants[i].fParamPants->fHeight =
0.0; // niech będzie odczyt z pantfactors:
ErrorLog("Bad model: " + asModel + ", scale of " +
AnsiString(sm->pName) + " is " +
AnsiString(100.0 * det) + "%");
(sm->pName) + " is " +
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++)
{ // Winger 160204: wyszukiwanie max 2 patykow o nazwie
// str*
asAnimName = str + AnsiString(i + 1);
asAnimName = str.c_str() + to_string(i + 1);
sm = mdModel->GetFromName(asAnimName.c_str());
pants[i].smElement[1] = sm; // jak NULL, to nie będzie animowany
if (sm)
@@ -4796,7 +4796,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
for (int i = 0; i < iAnimType[ANIM_PANTS]; i++)
{ // Winger 160204: wyszukiwanie max 2 patykow o nazwie
// 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]->WillBeAnimated();
}
@@ -4808,7 +4808,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
for (int i = 0; i < iAnimType[ANIM_PANTS]; i++)
{ // Winger 160204: wyszukiwanie max 2 patykow o nazwie
// 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]->WillBeAnimated();
}
@@ -4820,7 +4820,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
for (int i = 0; i < iAnimType[ANIM_PANTS]; i++)
{ // Winger 160204: wyszukiwanie max 2 patykow o nazwie
// 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]->WillBeAnimated();
pants[i].yUpdate = UpdatePant;
@@ -4957,7 +4957,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
for (int i = 1; i <= 4; i++)
{ // McZapkie-050402: wyszukiwanie max 4
// 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]->WillBeAnimated();
}
@@ -4990,7 +4990,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
j += iAnimType[i]; // zliczanie wcześniejszych animacji
for (i = 0; i < iAnimType[ANIM_DOORS]; ++i) // liczba drzwi
{ // 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 =
mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu
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,
GetPosition().y, GetPosition().z, true, true);
if (rsSilnik.GetWaveTime() == 0)
ErrorLog("Missed sound: \"" + str + "\" for " + asFileName);
ErrorLog("Missed sound: \"" + string(str.c_str()) + "\" for " + asFileName);
if (MoverParameters->EngineType == DieselEngine)
rsSilnik.AM = Parser->GetNextSymbol().ToDouble() /
(MoverParameters->Power + MoverParameters->nmax * 60);
@@ -5291,7 +5291,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
mdLowPolyInt->Init();
// sHorn2.CopyIfEmpty(sHorn1); //żeby jednak trąbił też drugim
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
};
AnsiString TDynamicObject::TextureTest(AnsiString &name)
string TDynamicObject::TextureTest(string &name)
{ // Ra 2015-01: sprawdzenie dostępności tekstury o podanej nazwie
AnsiString x = name + ".dds"; // na razie prymitywnie
if (FileExists(x))
string x = name + ".dds"; // na razie prymitywnie
if (FileExists(x.c_str()))
return x;
else
{
x = name + ".tga"; // w zasadzie to należałoby uwzględnić deklarowaną kolejność
if (FileExists(x))
if (FileExists(x.c_str()))
return x;
else
{
x = name + ".bmp";
if (FileExists(x))
if (FileExists(x.c_str()))
return x;
}
}
return ""; // nie znaleziona
};
void TDynamicObject::DestinationSet(AnsiString to, AnsiString numer)
void TDynamicObject::DestinationSet(string to, string numer)
{ // ustawienie stacji
// docelowej oraz wymiennej
// tekstury 4, jeśli
@@ -5680,34 +5680,34 @@ void TDynamicObject::DestinationSet(AnsiString to, AnsiString numer)
numer = Global::Bezogonkow(numer);
asDestination = to;
to = Global::Bezogonkow(to); // do szukania pliku obcinamy ogonki
AnsiString x;
string x;
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ę
return;
}
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ę
return;
}
if (to.IsEmpty())
if (to.empty())
to = "nowhere";
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ę
return;
}
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ę
else
{
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);
}
// 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 <string>
using namespace std;
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

View File

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

View File

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

217
Event.cpp
View File

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

10
Event.h
View File

@@ -10,11 +10,13 @@ http://mozilla.org/MPL/2.0/.
#ifndef EventH
#define EventH
#include <system.hpp>
#include "Classes.h"
#include "dumb3d.h"
#include <string>
using namespace Math3D;
using namespace std;
typedef enum
{
@@ -83,7 +85,7 @@ union TParam
class TEvent // zmienne: ev*
{ // zdarzenie
private:
void Conditions(cParser *parser, AnsiString s);
void Conditions(cParser *parser, string s);
public:
std::string asName;
@@ -98,16 +100,16 @@ class TEvent // zmienne: ev*
TDynamicObject *Activator;
TParam Params[13]; // McZapkie-070502 //Ra: zamieniæ to na union/struct
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
double fRandomDelay; // zakres dodatkowego opóŸnienia
public: // metody
TEvent(AnsiString m = "");
TEvent(string m = "");
~TEvent();
void Init();
void Load(cParser *parser, vector3 *org);
void AddToQuery(TEvent *e);
AnsiString CommandGet();
string CommandGet();
TCommandType Command();
double ValueGet(int n);
vector3 PositionGet();

View File

@@ -24,8 +24,11 @@ http://mozilla.org/MPL/2.0/.
#include <Controls.hpp> //do odczytu daty
#include "World.h"
#include <ostream>
#include <fstream>
#include <iomanip>
#include <ctype.h>
#include <cctype>
// namespace Global {
// parametry do u¿ytku wewnêtrznego
@@ -123,7 +126,7 @@ double Global::fMoveLight = -1; // ruchome
double Global::fLatitudeDeg = 52.0; // szerokoϾ geograficzna
float Global::fFriction = 1.0; // mno¿nik tarcia - KURS90
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)
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
pFreeCameraInitAngle[i] = vector3(0, 0, 0); // k¹ty obrotu w radianach
}
TFileStream *fs;
fs = new TFileStream(asFileName, fmOpenRead | fmShareCompat);
if (!fs)
return;
std::string str = "";
int size = fs->Size;
str.SetLength(size);
fs->Read(str.c_str(), size);
ifstream f = ifstream(asFileName.c_str());
stringstream buffer;
buffer << f.rdbuf();
//TFileStream *fs;
// fs = new TFileStream(asFileName, fmOpenRead | fmShareCompat);
// if (!fs)
// return;
AnsiString str = AnsiString(buffer.str().c_str());
//int size = fs->Size;
//str.SetLength(size);
//fs->Read(str.c_str(), size);
// str+="";
delete fs;
//delete fs;
TQueryParserComp *Parser;
Parser = new TQueryParserComp(NULL);
Parser->TextToParse = str;
@@ -251,7 +257,7 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp)
else if (str == AnsiString("humanctrlvehicle"))
{
str = GetNextSymbol().LowerCase();
asHumanCtrlVehicle = str;
asHumanCtrlVehicle = string(str.c_str());
}
else if (str == AnsiString("width"))
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].bItalic = it;
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
aLines[j].asText = aLines[j].asText.SubString(1, k - 1);
aLines[j].asText = aLines[j].asText.substr(0, k - 1);
txt += k;
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();
};
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::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 std::string asTranscript[5]; // napisy na ekranie (widoczne)
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 TTextSound *tsRadioBusy[10]; // zajêtoœæ kana³ów radiowych (wskaŸnik na odgrywany dŸwiêk)
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_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 ToUpper(std::string text);

View File

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

View File

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

View File

@@ -81,7 +81,7 @@ void ErrorLog(const char *str)
if (!errors.is_open())
{
errors.open("errors.txt", std::ios::trunc);
errors << AnsiString("EU07.EXE " + Global::asRelease).c_str() << "\n";
errors << "EU07.EXE " + Global::asRelease << "\n";
}
if (str)
errors << str;
@@ -92,11 +92,25 @@ void ErrorLog(const char *str)
void Error(const AnsiString &asMessage, bool 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());
}
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());
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, bool newline = 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 AnsiString &asMessage);
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_brakeacc = 64;
static bool const PhysicActivationFlag = false;
static bool PhysicActivationFlag = false;
//szczególne typy pojazdów (inna obsługa) dla zmiennej TrainType
//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 iLights[2]; // bity zapalonych świateł tutaj, żeby dało się liczyć pobór prądu
private:
double CouplerDist(Byte Coupler);
double CouplerDist(int Coupler);
public:
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
TEngineTypes EngineDecode(std::string s); //Q 20160721
bool CreateBrakeSys(); //Q 20160722
bool CheckLocomotiveParametersQ(bool ReadyFlag, int Dir);
bool CheckLocomotiveParameters(bool ReadyFlag, int Dir);
std::string EngineDescription(int what);
};

View File

@@ -52,6 +52,39 @@ double sqr(double val) // SQR() zle liczylo w current() ...
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
// *************************************************************************************************
@@ -284,7 +317,7 @@ TMoverParameters::TMoverParameters(double VelInitial, std::string TypeNameInit,
BrakeCtrlPosNo = 0;
LightsPosNo = 0;
LightsDefPos = 1;
for (k = -1; k < Hamulce::MainBrakeMaxPos; k++)
for (k = -1; k < MainBrakeMaxPos; k++)
{
BrakePressureTable[k].PipePressureVal = 0;
BrakePressureTable[k].BrakePressureVal = 0;
@@ -2464,9 +2497,9 @@ bool TMoverParameters::DecBrakeLevelOld(void)
bool TMoverParameters::IncLocalBrakeLevel(int CtrlSpeed)
{
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++;
CtrlSpeed--;
@@ -2508,9 +2541,9 @@ bool TMoverParameters::DecLocalBrakeLevel(int CtrlSpeed)
bool TMoverParameters::IncLocalBrakeLevelFAST(void)
{
bool ILBLF;
if (LocalBrakePos < Hamulce::LocalBrakePosNo)
if (LocalBrakePos < LocalBrakePosNo)
{
LocalBrakePos = Hamulce::LocalBrakePosNo;
LocalBrakePos = LocalBrakePosNo;
ILBLF = true;
}
else
@@ -2972,7 +3005,7 @@ void TMoverParameters::UpdatePipePressure(double dt)
if ((BrakeCtrlPosNo > 1) && (ActiveCab != 0))
// with BrakePressureTable[BrakeCtrlPos] do
{
dpLocalValve = LocHandle->GetPF(LocalBrakePos / Hamulce::LocalBrakePosNo, Hamulec->GetBCP(),
dpLocalValve = LocHandle->GetPF(LocalBrakePos / LocalBrakePosNo, Hamulec->GetBCP(),
ScndPipePress, dt, 0);
if ((BrakeHandle == FV4a) &&
((PipePress < 2.75) && ((Hamulec->GetStatus() && b_rls) == 0)) &&
@@ -5378,25 +5411,25 @@ int nSize;
int ti(std::string val)
{
return StrToInt(val);
return atoi(val.c_str());
}
double td(std::string val)
{
return val.ToDouble();
return atof(val.c_str());
}
std::string ts(std::string val)
{
// WriteLog("["+ val + "]");
return (std::string(val));
return val;
// else return "unknown";
}
std::string tS(std::string val)
{
return (val.UpperCase());
return ToUpper(val);
}
// *************************************************************************************************
@@ -6768,7 +6801,7 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
// Q: 20160717
// *************************************************************************************************
bool TMoverParameters::CheckLocomotiveParametersQ(bool ReadyFlag, int Dir)
bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir)
{
bool OK;
int b;

View File

@@ -18,6 +18,7 @@ http://mozilla.org/MPL/2.0/.
#include <string>
#include <fstream>
#include <time.h>
#include <sys/stat.h>
using namespace std;
@@ -69,6 +70,12 @@ inline int Random()
return rand();
}
inline float random(float a, float b)
{
srand(time(NULL));
return a + rand() / (float)RAND_MAX * (b - a);
}
inline double BorlandTime()
{
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*/
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 Xaspect; double Yaspect;

View File

@@ -129,7 +129,7 @@ bool TMemCell::Load(cParser *parser)
parser->getTokens();
*parser >> token;
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 >> token;
if (token.compare("endmemcell") != 0)

View File

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

View File

@@ -12,8 +12,8 @@ http://mozilla.org/MPL/2.0/.
*/
//#include "system.hpp"
//#include "classes.hpp"
#include "system.hpp"
#include "classes.hpp"
#pragma hdrstop
#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łą
// ignorowana, a mogła być inna niż 22050
fFrequency = 22050.0;
ErrorLog("Bad sound: " + AnsiString(SoundName) +
ErrorLog("Bad sound: " + string(SoundName) +
", as modulated, should have 22.05kHz in header");
}
AM = 1.0;
@@ -70,7 +70,7 @@ void TRealSound::Init(char *SoundName, double DistanceAttenuation, double X, dou
else
{ // nie ma dźwięku, to jest wysyp
AM = 0;
ErrorLog("Missed sound: " + AnsiString(SoundName));
ErrorLog("Missed sound: " + string(SoundName));
}
if (DistanceAttenuation > 0.0)
{

View File

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

View File

@@ -25,9 +25,9 @@ http://mozilla.org/MPL/2.0/.
// 101206 Ra: trapezoidalne drogi
// 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
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)

View File

@@ -58,10 +58,10 @@ TSoundContainer::TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFi
{
// SetFileUI( hDlg, TEXT("Bad wave file.") );
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
// 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;
if (Dynamic)
{ // próba wczytania z katalogu pojazdu
file = Global::asCurrentDynamicPath + AnsiString(Name);
file = AnsiString(Global::asCurrentDynamicPath.c_str()) + AnsiString(Name);
if (FileExists(file))
Name = file.c_str(); // nowa nazwa
else
@@ -259,7 +259,7 @@ LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(char *Name, bool Dynamic, float
*fSamplingRate = Next->fSamplingRate; // czêstotliwoœæ
return Next->GetUnique(pDS);
}
ErrorLog("Missed sound: " + AnsiString(Name));
ErrorLog("Missed sound: " + string(Name));
return (NULL);
};

106
Track.cpp
View File

@@ -93,7 +93,7 @@ TIsolated::TIsolated()
TIsolated("none", NULL);
};
TIsolated::TIsolated(const AnsiString &n, TIsolated *i)
TIsolated::TIsolated(const string &n, TIsolated *i)
{ // utworznie obwodu izolowanego
asName = n;
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
TIsolated *p = pRoot;
while (p)
@@ -453,18 +453,18 @@ vector3 LoadPoint(cParser *parser)
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
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;
AnsiString str;
string str;
bool bCurve;
int i; //,state; //Ra: teraz już nie ma początkowego stanu zwrotnicy we wpisie
std::string token;
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str()); // typ toru
str = token; // typ toru
if (str == "normal")
{
@@ -509,7 +509,7 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
else
eType = tt_Unknown;
if (Global::iWriteLogEnabled & 4)
WriteLog(str.c_str());
WriteLog(str);
parser->getTokens(4);
*parser >> fTrackLength >> fTrackWidth >> fFriction >> fSoundDistance;
// 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
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str()); // environment
str = token; // environment
if (str == "flat")
eEnvironment = e_flat;
else if (str == "mountains" || str == "mountain")
@@ -551,9 +551,9 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
{
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str()); // railtex
str = token; // railtex
TextureID1 = (str == "none" ? 0 : TTexturesManager::GetTextureID(
szTexturePath, szSceneryPath, str.c_str(),
szTexturePath, szSceneryPath, str,
(iCategoryFlag & 1) ? Global::iRailProFiltering :
Global::iBallastFiltering));
parser->getTokens();
@@ -562,9 +562,9 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
fTexLength = 4; // Ra: zabezpiecznie przed zawieszeniem
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str()); // sub || railtex
str = token; // sub || railtex
TextureID2 = (str == "none" ? 0 : TTexturesManager::GetTextureID(
szTexturePath, szSceneryPath, str.c_str(),
szTexturePath, szSceneryPath, str,
(eType == tt_Normal) ? Global::iBallastFiltering :
Global::iRailProFiltering));
parser->getTokens(3);
@@ -751,44 +751,44 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
}
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str());
str = token;
while (str != "endtrack")
{
if (str == "event0")
{
parser->getTokens();
*parser >> token;
asEvent0Name = AnsiString(token.c_str());
asEvent0Name = token;
}
else if (str == "event1")
{
parser->getTokens();
*parser >> token;
asEvent1Name = AnsiString(token.c_str());
asEvent1Name = token;
}
else if (str == "event2")
{
parser->getTokens();
*parser >> token;
asEvent2Name = AnsiString(token.c_str());
asEvent2Name = token;
}
else if (str == "eventall0")
{
parser->getTokens();
*parser >> token;
asEventall0Name = AnsiString(token.c_str());
asEventall0Name = token;
}
else if (str == "eventall1")
{
parser->getTokens();
*parser >> token;
asEventall1Name = AnsiString(token.c_str());
asEventall1Name = token;
}
else if (str == "eventall2")
{
parser->getTokens();
*parser >> token;
asEventall2Name = AnsiString(token.c_str());
asEventall2Name = token;
}
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
parser->getTokens();
*parser >> token;
pIsolated = TIsolated::Find(AnsiString(token.c_str()));
pIsolated = TIsolated::Find(token);
}
else if (str == "angle1")
{ // 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 + "\"");
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str());
str = token;
}
// alternatywny zapis nazwy odcinka izolowanego - po znaku "@" w nazwie toru
if (!pIsolated)
if ((i = name.Pos("@")) > 0)
if (i < name.Length()) // nie może być puste
if ((i = name.find("@")) != string::npos)
if (i < name.length()) // nie może być puste
{
pIsolated = TIsolated::Find(name.SubString(i + 1, name.Length()));
name = name.SubString(1, i - 1); // usunięcie z nazwy
pIsolated = TIsolated::Find(name.substr(i + 1, name.length()));
name = name.substr(0, i - 1); // usunięcie z nazwy
}
}
@@ -874,10 +874,10 @@ bool TTrack::AssignEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent
}
else
{
if (!asEvent0Name.IsEmpty())
if (!asEvent0Name.empty())
{
ErrorLog(AnsiString("Bad track: Event0 \"") + asEvent0Name +
AnsiString("\" does not exist"));
ErrorLog("Bad track: Event0 \"" + asEvent0Name +
"\" does not exist");
bError = true;
}
}
@@ -885,7 +885,7 @@ bool TTrack::AssignEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent
else
{
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;
}
if (!evEvent1)
@@ -896,17 +896,17 @@ bool TTrack::AssignEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent
asEvent1Name = "";
iEvents |= 2; // sumaryczna informacja o eventach
}
else if (!asEvent1Name.IsEmpty())
else if (!asEvent1Name.empty())
{ // Ra: tylko w logu informacja
ErrorLog(AnsiString("Bad track: Event1 \"") + asEvent1Name +
AnsiString("\" does not exist").c_str());
ErrorLog("Bad track: Event1 \"" + asEvent1Name +
"\" does not exist");
bError = true;
}
}
else
{
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;
}
if (!evEvent2)
@@ -917,17 +917,17 @@ bool TTrack::AssignEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent
asEvent2Name = "";
iEvents |= 4; // sumaryczna informacja o eventach
}
else if (!asEvent2Name.IsEmpty())
else if (!asEvent2Name.empty())
{ // Ra: tylko w logu informacja
ErrorLog(AnsiString("Bad track: Event2 \"") + asEvent2Name +
AnsiString("\" does not exist"));
ErrorLog("Bad track: Event2 \"" + asEvent2Name +
"\" does not exist");
bError = true;
}
}
else
{
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;
}
return !bError;
@@ -946,17 +946,17 @@ bool TTrack::AssignallEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEv
}
else
{
if (!asEvent0Name.IsEmpty())
if (!asEvent0Name.empty())
{
Error(AnsiString("Eventall0 \"") + asEventall0Name +
AnsiString("\" does not exist"));
Error("Eventall0 \"" + asEventall0Name +
"\" does not exist");
bError = true;
}
}
}
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;
}
if (!evEventall1)
@@ -969,17 +969,17 @@ bool TTrack::AssignallEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEv
}
else
{
if (!asEvent0Name.IsEmpty())
if (!asEvent0Name.empty())
{ // Ra: tylko w logu informacja
WriteLog(AnsiString("Eventall1 \"") + asEventall1Name +
AnsiString("\" does not exist"));
WriteLog("Eventall1 \"" + asEventall1Name +
"\" does not exist");
bError = true;
}
}
}
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;
}
if (!evEventall2)
@@ -992,17 +992,17 @@ bool TTrack::AssignallEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEv
}
else
{
if (!asEvent0Name.IsEmpty())
if (!asEvent0Name.empty())
{ // Ra: tylko w logu informacja
WriteLog(AnsiString("Eventall2 \"") + asEventall2Name +
AnsiString("\" does not exist"));
WriteLog("Eventall2 \"" + asEventall2Name +
"\" does not exist");
bError = true;
}
}
}
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;
}
return !bError;
@@ -1021,7 +1021,7 @@ bool TTrack::AssignForcedEvents(TEvent *NewEventPlus, TEvent *NewEventMinus)
return false;
};
AnsiString TTrack::IsolatedName()
string TTrack::IsolatedName()
{ // podaje nazwę odcinka izolowanego, jesli nie ma on jeszcze przypisanych zdarzeń
if (pIsolated)
if (!pIsolated->evBusy && !pIsolated->evFree)
@@ -3136,13 +3136,13 @@ void TTrack::ConnectionsLog()
for (i = 0; i < 2; ++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 + ":" +
AnsiString(int(SwitchExtension->iPrevDirection[i])));
to_string(int(SwitchExtension->iPrevDirection[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 + ":" +
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 <string>
using namespace std;
class TEvent;
typedef enum
@@ -107,10 +109,10 @@ class TIsolated
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
TIsolated();
TIsolated(const AnsiString &n, TIsolated *i);
TIsolated(const string &n, TIsolated *i);
~TIsolated();
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
bool Busy()
{
@@ -158,12 +160,12 @@ class TTrack : public Resource
TEvent *evEvent0; // McZapkie-280503: wyzwalany tylko gdy headdriver
TEvent *evEvent1;
TEvent *evEvent2;
AnsiString asEventall0Name; // nazwy eventów
AnsiString asEventall1Name;
AnsiString asEventall2Name;
AnsiString asEvent0Name;
AnsiString asEvent1Name;
AnsiString asEvent2Name;
string asEventall0Name; // nazwy eventów
string asEventall1Name;
string asEventall2Name;
string asEvent0Name;
string asEvent1Name;
string asEvent2Name;
int iNextDirection; // 0:Point1, 1:Point2, 3:do odchylonego na zwrotnicy
int iPrevDirection;
TTrackType eType;
@@ -228,7 +230,7 @@ class TTrack : public Resource
{
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 AssignallEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent2);
bool AssignForcedEvents(TEvent *NewEventPlus, TEvent *NewEventMinus);
@@ -266,7 +268,7 @@ class TTrack : public Resource
if (pIsolated)
pIsolated->Modify(i, o);
}; // dodanie lub odjęcie osi
AnsiString IsolatedName();
string IsolatedName();
bool IsolatedEventsAssign(TEvent *busy, TEvent *free);
double WidthTotal();
GLuint TextureGet(int i)

View File

@@ -13,8 +13,10 @@ http://mozilla.org/MPL/2.0/.
#include "opengl/glew.h"
#include "dumb3d.h"
#include "VBO.h"
#include <string>
using namespace Math3D;
using namespace std;
class TTractionPowerSource;
@@ -50,10 +52,10 @@ class TTraction
DWORD DamageFlag; // 1: zasniedziale, 128: zerwana
int Wires;
float WireOffset;
AnsiString asPowerSupplyName; // McZapkie: nazwa podstacji trakcyjnej
string asPowerSupplyName; // McZapkie: nazwa podstacji trakcyjnej
TTractionPowerSource *
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
float fResistance[2]; // rezystancja zastêpcza do punktu zasilania (0: przês³o zasilane, <0: do
// policzenia)

View File

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