PingusLevel PLFResMgr::load_plf_raw(const std::string& res_name, const Pathname& pathname) { pout(PINGUS_DEBUG_LOADING) << "PLFResMgr: '" << res_name << "' -> '" << pathname.str() << "'" << std::endl; PLFMap::iterator i = plf_map.find(res_name); if (i == plf_map.end()) { // Entry not cached, so load it and add it to cache pout(PINGUS_DEBUG_LOADING) << "PLFResMgr: Loading level from DISK: '" << res_name << "' -> '" << pathname.str() << "'" << std::endl; PingusLevel plf(res_name, pathname); PLFEntry entry; entry.plf = plf; entry.mtime = pathname.mtime(); plf_map[res_name] = entry; // FIXME: leaking pointers to the outsite work is not such a good // idea, could lead to trouble sooner or later return PingusLevel (entry.plf); } else { uint64_t current_mtime = pathname.mtime(); if (current_mtime != i->second.mtime) { pout(PINGUS_DEBUG_LOADING) << "PLFResMgr: level changed on DISK, reloading: '" << res_name << "' -> '" << pathname.str() << "'" << std::endl; // Reload the file since it has changed on disk PingusLevel plf(res_name, pathname); PLFEntry entry; entry.plf = plf; entry.mtime = pathname.mtime(); plf_map[res_name] = entry; // FIXME: leaking pointers to the outsite work is not such a good // idea, could lead to trouble sooner or later return PingusLevel (entry.plf); } else { // File in cache is up to date, everything is all ready, return it pout(PINGUS_DEBUG_LOADING) << "PLFResMgr: Loading level from CACHE: '" << res_name << "' -> '" << pathname.str() << "'" << std::endl; return i->second.plf; } } }
DemoSession::DemoSession(const Pathname& pathname_) : pathname(pathname_), server(), demo(), events(), fastforward_button(), pause_button(), restart_button(), pause(false), fast_forward(false) { // Load Demo file demo = std::unique_ptr<PingusDemo>(new PingusDemo(pathname)); events = demo->get_events(); // Reverse the vector so that we can use pop_back() std::reverse(events.begin(), events.end()); // Create server plf = PingusLevel(Pathname("levels/" + demo->get_levelname() + ".pingus", Pathname::DATA_PATH)); if (plf.get_checksum() != demo->get_checksum()) { log_warn("checksum missmatch between demo (%1%) and level (%2%)", demo->get_checksum(), plf.get_checksum()); } // Create GUI DemoSession* self = this; ceu_out_go(&CEUapp, CEU_IN_NEW_DEMO_SESSION, &self); }