2021-04-25 20:42:55 +00:00
|
|
|
#include "maploader.hpp"
|
|
|
|
#include "../sdlpp/sdlpp_rectrenderer.hpp"
|
|
|
|
#include <fstream>
|
|
|
|
#include "sprites.hpp"
|
|
|
|
#include "blocks.hpp"
|
|
|
|
#include "objectids.hpp"
|
|
|
|
|
2021-04-30 07:10:58 +00:00
|
|
|
std::shared_ptr<SDLPP::RectangleRender> decodeObject( char obj, BlockType type, double x, double y, std::shared_ptr<SDLPP::Renderer> &renderer) {
|
2021-04-25 20:42:55 +00:00
|
|
|
switch(obj) {
|
|
|
|
case 'F':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(FLOOR_ID, type, renderer, x, y, true);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'I':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(HILL_INCLINE_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'R':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(HILL_DOTS_RIGHT_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'G':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(HILL_FILL_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'L':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(HILL_DOTS_LEFT_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'D':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(HILL_DECLINE_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'T':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(HILL_TOP_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'q':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(BUSH_LEFT_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'w':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(BUSH_MIDDLE_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'r':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(BUSH_RIGHT_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'a':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(CLOUD_LEFT_BOTTOM_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 's':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(CLOUD_MIDDLE_BOTTOM_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'd':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(CLOUD_RIGHT_BOTTOM_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'z':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(CLOUD_LEFT_TOP_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'x':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(CLOUD_MIDDLE_TOP_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
case 'c':
|
2021-04-30 07:10:58 +00:00
|
|
|
return createTerrainBlock(CLOUD_RIGHT_TOP_ID, type, renderer, x, y);
|
2021-04-25 20:42:55 +00:00
|
|
|
}
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
2021-04-30 07:10:58 +00:00
|
|
|
void loadMap(std::shared_ptr<SDLPP::Scene> &scene, std::shared_ptr<SDLPP::RectangleRender> mario, const std::string &file, std::shared_ptr<SDLPP::Renderer> &renderer) {
|
2021-04-25 20:42:55 +00:00
|
|
|
std::fstream mapFile;
|
|
|
|
mapFile.open(file, std::ios::in);
|
|
|
|
std::string buffer;
|
|
|
|
std::getline(mapFile, buffer);
|
|
|
|
auto cols = std::stoi(buffer);
|
|
|
|
std::getline(mapFile, buffer);
|
|
|
|
auto rows = std::stoi(buffer);
|
|
|
|
std::getline(mapFile, buffer);
|
|
|
|
auto mario_x = std::stoi(buffer);
|
|
|
|
std::getline(mapFile, buffer);
|
|
|
|
auto mario_y = std::stoi(buffer);
|
|
|
|
auto cur_y = 1 - rows * BLOCK_SIZE;
|
2021-04-29 10:33:31 +00:00
|
|
|
for(int i = 0; i < rows; i++) {
|
2021-04-25 20:42:55 +00:00
|
|
|
std::getline(mapFile, buffer);
|
|
|
|
auto cur_x = -BLOCK_SIZE;
|
2021-04-29 10:33:31 +00:00
|
|
|
for(int j = 0; j < cols; j++) {
|
2021-04-25 20:42:55 +00:00
|
|
|
cur_x += BLOCK_SIZE;
|
|
|
|
if(buffer[j] == ' ')
|
|
|
|
continue;
|
2021-04-30 07:10:58 +00:00
|
|
|
auto obj = decodeObject(buffer[j], OVERWORLD, cur_x, cur_y, renderer);
|
2021-04-25 20:42:55 +00:00
|
|
|
if(obj != nullptr)
|
|
|
|
scene->addObject(obj);
|
|
|
|
}
|
|
|
|
cur_y += BLOCK_SIZE;
|
|
|
|
}
|
2021-04-30 07:10:58 +00:00
|
|
|
if(mario != nullptr) {
|
|
|
|
mario->setPos(mario_x * BLOCK_SIZE, 1 - (rows - mario_y) * BLOCK_SIZE);
|
2021-04-30 19:02:14 +00:00
|
|
|
scene->moveZTop(mario);
|
2021-04-30 07:10:58 +00:00
|
|
|
} else {
|
|
|
|
//createMarioBlock
|
|
|
|
}
|
2021-04-25 20:42:55 +00:00
|
|
|
}
|