|
|
|
@ -1,6 +1,5 @@
|
|
|
|
|
#include "level.h"
|
|
|
|
|
|
|
|
|
|
#include <sstream>
|
|
|
|
|
#include <fstream>
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
#include <iostream>
|
|
|
|
@ -42,11 +41,9 @@ void Level::Map::init(const std::string &path)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case SECTION::TELEPORT:
|
|
|
|
|
readTeleport(sstr);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case SECTION::CHARGE:
|
|
|
|
|
case SECTION::TRIGGER:
|
|
|
|
|
readTrigger(sstr);
|
|
|
|
|
readCellSection(sstr, cur_section);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
@ -85,34 +82,76 @@ void Level::Map::readMapRow(std::istringstream &sstr)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Level::Map::readTeleport(std::istringstream &sstr)
|
|
|
|
|
void Level::Map::readCellSection(std::istringstream &sstr, const SECTION §ion)
|
|
|
|
|
{
|
|
|
|
|
coordinate src_row, src_col;
|
|
|
|
|
sstr >> src_row >> src_col;
|
|
|
|
|
|
|
|
|
|
switch (section) {
|
|
|
|
|
case SECTION::TELEPORT:
|
|
|
|
|
data[src_row][src_col] = readTeleport(sstr, static_unique_pointer_cast<TeleportCell>(std::move(data[src_row][src_col])));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case SECTION::CHARGE:
|
|
|
|
|
data[src_row][src_col] = readCharge(sstr, static_unique_pointer_cast<ChargeCell>(std::move(data[src_row][src_col])));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case SECTION::TRIGGER:
|
|
|
|
|
data[src_row][src_col] = readTrigger(sstr, static_unique_pointer_cast<TriggerCell>(std::move(data[src_row][src_col])));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<TeleportCell> &&Level::Map::readTeleport(std::istringstream &sstr, std::unique_ptr<TeleportCell> &&cell)
|
|
|
|
|
{
|
|
|
|
|
coordinate dest_row, dest_col;
|
|
|
|
|
|
|
|
|
|
sstr >> src_row >> src_col >> dest_row >> dest_col;
|
|
|
|
|
auto teleport_cell = static_unique_pointer_cast<TeleportCell>(std::move(data[src_row][src_col]));
|
|
|
|
|
teleport_cell->setDestination(dest_row, dest_col);
|
|
|
|
|
data[src_row][src_col] = std::move(teleport_cell);
|
|
|
|
|
sstr >> dest_row >> dest_col;
|
|
|
|
|
cell->setDestination(dest_row, dest_col);
|
|
|
|
|
return std::move(cell);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Level::Map::readTrigger(std::istringstream &sstr)
|
|
|
|
|
std::unique_ptr<ChargeCell> &&Level::Map::readCharge(std::istringstream &sstr, std::unique_ptr<ChargeCell> &&cell)
|
|
|
|
|
{
|
|
|
|
|
int num_charges;
|
|
|
|
|
|
|
|
|
|
sstr >> num_charges;
|
|
|
|
|
cell->setCharges(num_charges);
|
|
|
|
|
return std::move(cell);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<TriggerCell> &&Level::Map::readTrigger(std::istringstream &sstr, std::unique_ptr<TriggerCell> &&cell)
|
|
|
|
|
{
|
|
|
|
|
coordinate src_row, src_col;
|
|
|
|
|
coordinate dest_row, dest_col;
|
|
|
|
|
int cell_type;
|
|
|
|
|
|
|
|
|
|
sstr >> src_row >> src_col >> dest_row >> dest_col >> cell_type;
|
|
|
|
|
|
|
|
|
|
if (std::find(TriggerCell::cells_to_cast.begin(), TriggerCell::cells_to_cast.end(), cell_type) ==
|
|
|
|
|
TriggerCell::cells_to_cast.end())
|
|
|
|
|
return ;
|
|
|
|
|
sstr >> dest_row >> dest_col >> cell_type;
|
|
|
|
|
|
|
|
|
|
auto trigger_cell = static_unique_pointer_cast<TriggerCell>(std::move(data[src_row][src_col]));
|
|
|
|
|
auto dest_cell = default_cells[cell_type]->clone();
|
|
|
|
|
dest_cell->setPosition(dest_row, dest_col);
|
|
|
|
|
trigger_cell->addTarget(std::move(dest_cell));
|
|
|
|
|
data[src_row][src_col] = std::move(trigger_cell);
|
|
|
|
|
|
|
|
|
|
switch (cell_type) {
|
|
|
|
|
case TELEPORT_CELL:
|
|
|
|
|
dest_cell = readTeleport(sstr, static_unique_pointer_cast<TeleportCell>(std::move(dest_cell)));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CHARGE_CELL:
|
|
|
|
|
dest_cell = readCharge(sstr, static_unique_pointer_cast<ChargeCell>(std::move(dest_cell)));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case TRIGGER_CELL:
|
|
|
|
|
dest_cell = readTrigger(sstr, static_unique_pointer_cast<TriggerCell>(std::move(dest_cell)));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cell->addTarget(std::move(dest_cell));
|
|
|
|
|
return std::move(cell);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Level::Level(const std::string &path)
|
|
|
|
|