#include "ADVect.h" #include "Graphics.h" #include #include namespace ADVect { Game::Game(std::string name, std::vector& scenes) : m_name(name), m_running(false), m_scenes(scenes), m_text(""), m_scene_pos(0), m_current_scene(0) { if (SDL_Init(SDL_INIT_EVERYTHING)) { std::cerr << "SDL shit itself : " << SDL_GetError() << std::endl; } m_window = SDL_CreateWindow(m_name.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN); m_surface = SDL_GetWindowSurface(m_window); ADVect::Graphics::Init(); NVL::Environment::ENVIRONMENT.enter("Say", NVL::Environment::Variable([&](std::vector args) { m_text = std::get(NVL::Environment::Variable(args[0]).value); return NVL::Environment::Type::Nil; }, 1)); NVL::Environment::ENVIRONMENT.enter("SwitchSpeaker", NVL::Environment::Variable([&](std::vector args) { m_speaker = std::get(NVL::Environment::Variable(args[0]).value); return NVL::Environment::Type::Nil; }, 1)); Advance(); } Game::~Game() { SDL_DestroyWindow(m_window); SDL_Quit(); } void Game::Advance() { int curr_size = m_scenes[m_current_scene].get().size(); while (m_scene_pos < curr_size) { if (std::get(m_scenes[m_current_scene].get()[m_scene_pos][0].value) == "Say") { NVL::Environment::Apply(m_scenes[m_current_scene].get()[m_scene_pos]); m_scene_pos++; return; } else { NVL::Environment::Apply(m_scenes[m_current_scene].get()[m_scene_pos]); m_scene_pos++; } switch (curr_size - m_scene_pos) { case 0: m_current_scene = -1; return; case 1: return; default: if (std::get(m_scenes[m_current_scene].get()[m_scene_pos + 1][0].value) == "Say") { NVL::Environment::Apply(m_scenes[m_current_scene].get()[m_scene_pos]); m_scene_pos++; return; } break; } } } void Game::Update() { if (m_keys[SDL_SCANCODE_SPACE]) { if (m_current_scene == -1) { m_running = false; return; } Advance(); m_keys[SDL_SCANCODE_SPACE] = false; } } void Game::Render() { SDL_FillRect(m_surface, nullptr, SDL_MapRGBA(m_surface->format, 0, 0, 0, 255)); ADVect::Graphics::RenderString(m_speaker, m_surface, 10, 250); ADVect::Graphics::RenderString(m_text, m_surface, 10, 300); SDL_UpdateWindowSurface(m_window); SDL_Delay(10); } void Game::Run() { m_running = true; while (m_running) { for (SDL_Event event; SDL_PollEvent(&event);) { switch (event.type) { case SDL_QUIT: m_running = false; break; case SDL_KEYDOWN: m_keys[event.key.keysym.scancode] = true; break; case SDL_KEYUP: m_keys[event.key.keysym.scancode] = false; break; } } Update(); Render(); } } } int main(int argc, char* argv[]) { const std::string PJ_DIR = "E:\\Archive\\Projects\\NouVeL\\NVL\\"; std::vector SCENES = NVL::Parse::ParseFile(PJ_DIR + "dialogue.nvl"); ADVect::Game game("Test", SCENES); game.Run(); return 0; }