level apply(level const & l) { auto r = m_lvl_cache.find(l); if (r != m_lvl_cache.end()) return *r; level res; switch (l.kind()) { case level_kind::Zero: case level_kind::Param: case level_kind::Global: case level_kind::Meta: res = l; break; case level_kind::Succ: res = update_succ(l, apply(succ_of(l))); break; case level_kind::Max: res = update_max(l, apply(max_lhs(l)), apply(max_rhs(l))); break; case level_kind::IMax: res = update_max(l, apply(imax_lhs(l)), apply(imax_rhs(l))); break; } m_lvl_cache.insert(res); return res; }
void draw_helptext(sf::RenderWindow & win, level const & lvl) { auto CheckHelp = Concept<EntityIs<entity_id::hint>>( AtPosition(lvl.chip.get<position>()) ); std::string msg; if (lvl.state == level_state::failed) { msg = "Level Failed! Better luck next time"; } else if (lvl.state == level_state::passed) { msg = "Level Passed!"; } else if (CheckHelp.contains(lvl.entity_list)) { msg = lvl.help(); } else { return; } auto & res = resource_manager::get(); sf::Text txt(msg, res[font_uid::arial], 25); txt.setPosition((float)helptext_xpos, (float)helptext_ypos); txt.setColor(sf::Color::Red); win.draw(txt); }
expr_type::expr_type(level const & l): expr_cell(expr_kind::Type, l.hash(), false), m_level(l) { }
void renderer::set_level(level& level) { current_level = &level; level.upload(*this); }
bool point_standable(const level& lvl, const entity& e, int x, int y, collision_info* info, ALLOW_PLATFORM allow_platform) { if(allow_platform == SOLID_AND_PLATFORMS && lvl.standable(x, y, info ? &info->surf_info : NULL) || allow_platform != SOLID_AND_PLATFORMS && lvl.solid(x, y, info ? &info->surf_info : NULL)) { if(info) { info->read_surf_info(); } if(info && !lvl.solid(x, y)) { info->platform = true; } return true; } const point pt(x, y); const std::vector<entity_ptr>& chars = lvl.get_solid_chars(); for(std::vector<entity_ptr>::const_iterator i = chars.begin(); i != chars.end(); ++i) { const entity_ptr& obj = *i; if(&e == obj.get()) { continue; } if(allow_platform == SOLID_AND_PLATFORMS || obj->solid_platform()) { const rect& platform_rect = obj->platform_rect_at(pt.x); if(point_in_rect(pt, platform_rect) && obj->platform()) { if(info) { info->collide_with = obj; info->friction = obj->surface_friction(); info->traction = obj->surface_traction(); info->adjust_y = y - platform_rect.y(); info->platform = !obj->solid_platform(); } return true; } } if((e.weak_solid_dimensions()&obj->solid_dimensions()) == 0 && (e.solid_dimensions()&obj->weak_solid_dimensions()) == 0) { continue; } if(!point_in_rect(pt, obj->solid_rect())) { continue; } const frame& f = obj->current_frame(); const int xpos = obj->face_right() ? x - obj->x() : obj->x() + f.width() - x - 1; const solid_info* solid = obj->solid(); if(solid && solid->solid_at(x - obj->x(), y - obj->y(), info ? &info->collide_with_area_id : NULL)) { if(info) { info->collide_with = obj; info->friction = obj->surface_friction(); info->traction = obj->surface_traction(); } return true; } } return false; }
void new_game(void) { gs.gs_run(); menu_pages.push(&lv); lv.reset(); }
void ship::die() { lv.shipExplode(position); }
//search areas perpendicular to direction of travel for places to change direction bool ghost::search_for_intersection(level l){ //std::cout << "searching" << std::endl; bool opening = false; bool curr = true; std::vector<sf::FloatRect> levelcol = l.get_collisions(); if (xvel != 0){ sf::FloatRect colcheck (collision_box.left, collision_box.top + (4 * ghostvel), collision_box.width, collision_box.height); for (unsigned i = 0; i < levelcol.size(); i++){ if (colcheck.intersects(levelcol.at(i))){ curr = false; break; } } if (curr){ return true; } curr = true; colcheck = sf::FloatRect(collision_box.left, collision_box.top - (4 * ghostvel), collision_box.width, collision_box.height); for (unsigned i = 0; i < levelcol.size(); i++){ if (colcheck.intersects(levelcol.at(i))){ curr = false; break; } } return curr; } else if (yvel != 0){ sf::FloatRect colcheck (collision_box.left + (4 * ghostvel), collision_box.top, collision_box.width, collision_box.height); for (unsigned i = 0; i < levelcol.size(); i++){ if (colcheck.intersects(levelcol.at(i))){ curr = false; break; } } if (curr){ return true; } curr = true; colcheck = sf::FloatRect(collision_box.left - (4 * ghostvel), collision_box.top, collision_box.width, collision_box.height); for (unsigned i = 0; i < levelcol.size(); i++){ if (colcheck.intersects(levelcol.at(i))){ curr = false; break; } } return curr; } else { sf::FloatRect colcheck (collision_box.left, collision_box.top + (4 * ghostvel), collision_box.width, collision_box.height); for (unsigned i = 0; i < levelcol.size(); i++){ if (colcheck.intersects(levelcol.at(i))){ curr = false; break; } } if (curr){ return true; } curr = true; colcheck = sf::FloatRect(collision_box.left + (4 * ghostvel), collision_box.top, collision_box.width, collision_box.height); for (unsigned i = 0; i < levelcol.size(); i++){ if (colcheck.intersects(levelcol.at(i))){ curr = false; break; } } if (curr){ return true; } curr = true; colcheck = sf::FloatRect(collision_box.left - (4 * ghostvel), collision_box.top, collision_box.width, collision_box.height); for (unsigned i = 0; i < levelcol.size(); i++){ if (colcheck.intersects(levelcol.at(i))){ curr = false; break; } } if (curr){ return true; } curr = true; colcheck = sf::FloatRect(collision_box.left, collision_box.top - (4 * ghostvel), collision_box.width, collision_box.height); for (unsigned i = 0; i < levelcol.size(); i++){ if (colcheck.intersects(levelcol.at(i))){ curr = false; break; } } return curr; } }