mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
scn parsing with directive and trainset matching
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include "stdafx.h"
|
||||
#include "scenery_scanner.h"
|
||||
#include "Logs.h"
|
||||
|
||||
void scenery_scanner::scan()
|
||||
{
|
||||
@@ -10,24 +11,35 @@ void scenery_scanner::scan()
|
||||
continue;
|
||||
|
||||
if (string_ends_with(path.string(), ".scn"))
|
||||
scan_scn(path.string());
|
||||
scan_scn(path);
|
||||
}
|
||||
|
||||
std::sort(scenarios.begin(), scenarios.end(),
|
||||
[](const scenery_desc &a, const scenery_desc &b) { return a.path < b.path; });
|
||||
}
|
||||
|
||||
void scenery_scanner::scan_scn(std::string path)
|
||||
void scenery_scanner::scan_scn(std::filesystem::path path)
|
||||
{
|
||||
scenarios.emplace_back();
|
||||
scenery_desc &desc = scenarios.back();
|
||||
desc.path = path;
|
||||
|
||||
std::ifstream stream(path, std::ios_base::binary | std::ios_base::in);
|
||||
cParser parser(path.string(), cParser::buffer_FILE);
|
||||
parser.expandIncludes = false;
|
||||
while (!parser.eof()) {
|
||||
parser.getTokens();
|
||||
if (parser.peek() == "trainset")
|
||||
parse_trainset(parser);
|
||||
}
|
||||
|
||||
std::ifstream stream(path.string(), std::ios_base::binary | std::ios_base::in);
|
||||
|
||||
int line_counter = 0;
|
||||
std::string line;
|
||||
while (std::getline(stream, line))
|
||||
{
|
||||
line_counter++;
|
||||
|
||||
if (line.size() < 6 || !string_starts_with(line, "//$"))
|
||||
continue;
|
||||
|
||||
@@ -49,9 +61,34 @@ void scenery_scanner::scan_scn(std::string path)
|
||||
desc.links.push_back(std::make_pair(file, label));
|
||||
}
|
||||
else if (line[3] == 'o') {
|
||||
desc.trainsets.emplace_back();
|
||||
trainset_desc &trainset = desc.trainsets.back();
|
||||
trainset.name = line.substr(5);
|
||||
for (trainset_desc &trainset : desc.trainsets) {
|
||||
if (line_counter < trainset.file_bounds.first
|
||||
|| line_counter > trainset.file_bounds.second)
|
||||
continue;
|
||||
|
||||
trainset.description = line.substr(5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WriteLog(path.string() + "----------");
|
||||
for (trainset_desc &trainset : desc.trainsets) {
|
||||
WriteLog(trainset.name + "=" + std::to_string(trainset.file_bounds.first) + ":" + std::to_string(trainset.file_bounds.second) + "@" + trainset.description);
|
||||
}
|
||||
}
|
||||
|
||||
void scenery_scanner::parse_trainset(cParser &parser)
|
||||
{
|
||||
scenery_desc &desc = scenarios.back();
|
||||
desc.trainsets.emplace_back();
|
||||
trainset_desc &trainset = desc.trainsets.back();
|
||||
|
||||
trainset.file_bounds.first = parser.Line();
|
||||
parser.getTokens(4);
|
||||
parser >> trainset.name >> trainset.track >> trainset.offset >> trainset.velocity;
|
||||
|
||||
while (parser.peek() != "endtrainset")
|
||||
parser.getTokens();
|
||||
|
||||
trainset.file_bounds.second = parser.Line();
|
||||
}
|
||||
|
||||
@@ -3,8 +3,11 @@
|
||||
#include <filesystem>
|
||||
#include "Texture.h"
|
||||
#include "utilities.h"
|
||||
#include "parser.h"
|
||||
|
||||
struct trainset_desc {
|
||||
std::pair<int, int> file_bounds;
|
||||
|
||||
std::string description;
|
||||
|
||||
std::string name;
|
||||
@@ -13,8 +16,7 @@ struct trainset_desc {
|
||||
float offset { 0.f };
|
||||
float velocity { 0.f };
|
||||
|
||||
std::vector<std::string> vehicles;
|
||||
std::vector<int> couplings;
|
||||
std::vector<std::pair<std::string, int>> vehicles;
|
||||
};
|
||||
|
||||
struct scenery_desc {
|
||||
@@ -42,5 +44,6 @@ public:
|
||||
void scan();
|
||||
|
||||
private:
|
||||
void scan_scn(std::string path);
|
||||
void scan_scn(std::filesystem::path path);
|
||||
void parse_trainset(cParser &parser);
|
||||
};
|
||||
|
||||
@@ -231,7 +231,7 @@ std::string cParser::readToken( bool ToLower, const char *Break ) {
|
||||
}
|
||||
}
|
||||
|
||||
if( token == "include" ) {
|
||||
if( expandIncludes && token == "include" ) {
|
||||
// launch child parser if include directive found.
|
||||
// NOTE: parameter collecting uses default set of token separators.
|
||||
std::string includefile = readToken(ToLower); // nazwa pliku
|
||||
|
||||
Reference in New Issue
Block a user