IR Compile(Form* form) { string out; string tmp; if(form == NULL) error(form,"Can't emit code for the null form."); else if(isatom(form)) { if(val(form) == "quit") exit(0); else if(val(form) == "IR") { master.Program->dump(); nerror("Dumped IR."); } else if(val(form) == "debug") { master.debug = !master.debug; nerror("Debug mode is ",(master.debug?"on":"off"),"."); } else out = emitCode(form); } else out = emitCode(form/*,Top*/); /*for(unsigned long i = 0; i < master.Persistent.size(); i++) tmp += master.Persistent[i] + "\n";*/ for(unsigned long i = 0; i < master.CodeStack.size(); i++) tmp += master.CodeStack[i] + "\n"; out = "define " + latest_type() + " @entry(){\n" + out + "\nret " + latest_type() + " " + get_current_res() + "\n}"; out = tmp + out; string type = latest_type(); master.CodeStack.clear(); clear_reader(); return {out,type}; }
int WinMain() { #else int main() { #endif try { if(SDL_Init(SDL_INIT_VIDEO) < 0) { throw Game::SDLError(); } { int imgFlags = IMG_INIT_PNG; if(!(IMG_Init(imgFlags) & imgFlags)) { throw Game::SDLError(IMG_GetError()); } } if (TTF_Init() < 0) { throw Game::SDLError(TTF_GetError()); } if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0) { printf("Error starting SDL_Mix: %s\n", Mix_GetError()); } auto gs = std::make_shared<Game::sdl_info>("Letvezi", "art/font.ttf"); auto persistent = std::make_shared<Persistent>("user_info.dat"); if (persistent == NULL) throw std::runtime_error("Failed to create user settings object"); gs->loading_screen([persistent](auto& ch) { auto set_bg = [&ch](std::string file) { ch.push(std::tuple<std::string,std::function<void(Game::sdl_info&)>>( "background music", [file](auto& gs) { gs.set_background(file); } ) ); }; auto load_sfx = [&ch](std::string key, Game::SFX_ID xkey, std::string file) { ch.push( std::tuple<std::string,std::function<void(Game::sdl_info&)>>( key, [xkey,file](auto& gs) { gs.load_sfx(xkey,file); } ) ); }; auto load_png = [&ch](std::string key, Game::TextureID xkey, std::string file) { ch.push( std::tuple<std::string,std::function<void(Game::sdl_info&)>>( key, [xkey,file](auto& gs) { gs.load_png(xkey,file); } ) ); }; auto do_ = [&ch](std::string key, std::function<void()> fn) { ch.push( std::tuple<std::string,std::function<void(Game::sdl_info&)>>( key, [fn](auto&) { fn(); } )); }; set_bg("art/background.ogg"); load_png("bg_star" , Game::TEX_BackgroundStar , "art/img/bg_star.png" ); load_png("player" , Game::TEX_Player , "art/img/player.png" ); load_png("player_laser" , Game::TEX_PlayerLaser , "art/img/player_laser.png" ); load_png("player_life" , Game::TEX_PlayerLife , "art/img/player_life.png" ); load_png("player_shield" , Game::TEX_PlayerShield , "art/img/player_shield.png" ); load_png("enemy_1" , Game::TEX_Enemy1 , "art/img/enemy_1.png" ); load_png("enemy_2" , Game::TEX_Enemy2 , "art/img/enemy_2.png" ); load_png("enemy_3" , Game::TEX_Enemy3 , "art/img/enemy_3.png" ); load_png("enemy_boss" , Game::TEX_EnemyBoss , "art/img/enemy_boss.png" ); load_png("enemy_laser" , Game::TEX_EnemyLaser , "art/img/enemy_laser.png" ); load_png("enemy_boss_laser", Game::TEX_EnemyBossLaser , "art/img/enemy_boss_laser.png" ); load_png("enemy_boss_squad", Game::TEX_EnemyBossSquad , "art/img/enemy_boss_squad.png" ); load_png("powerup_shield" , Game::TEX_PowerupShield , "art/img/powerup_shield.png" ); load_png("powerup_bolt" , Game::TEX_PowerupBolt , "art/img/powerup_bolt.png" ); load_sfx("player_laser" , Game::SFX_PlayerLaser , "art/sfx/player_laser.ogg" ); load_sfx("shield_enabled" , Game::SFX_ShieldEnabled , "art/sfx/player_laser.ogg" ); do_("user info", [persistent]() { persistent->load(); }); }); Game::Resolution res = gs->get_current_res(); Letvezi::GameState::Type start_state = Letvezi::GameState::Type(persistent, gs, res, Letvezi::Position(res.width/2, res.height-70-gs->textures().at(Game::TEX_Player).height)); std::function<void(Conc::Chan<SDL_Event>&,Conc::Chan<Letvezi::Events::Type>&)> event_fn = Letvezi::event_handler; std::function<void(Conc::Chan<Letvezi::Events::Type>&,Conc::VarL<Letvezi::GameState::Type>&)> game_fn = Letvezi::game_handler; std::function<Game::LSit(Conc::VarL<Letvezi::GameState::Type>&,uint16_t)> render_fn = [gs](Conc::VarL<Letvezi::GameState::Type>& typ,uint16_t fps_rel) { return Letvezi::Render::handler_game(gs,typ,fps_rel); }; std::function<void(Conc::VarL<Letvezi::GameState::Type>&)> expensive_handler = Letvezi::Render::expensive_handler; gs->loop(event_fn, game_fn, expensive_handler, render_fn, start_state); persistent->save(); printf("Game over!\n"); } catch (Game::SDLError& err) { printf("SDL Error: %s\n", err.what()); } std::cout << "SDL_Quit()" << std::endl; SDL_Quit(); return 0; }
inline string latest_type() { return res_type(get_current_res()); }