X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fleveleditor.cpp;h=49eb83be9f61179878080cb92c5da1a81db7bc4a;hb=2c082bbb4a425558bde13145246431d0a62039d5;hp=aa7b081a580d587d6932e4713e0f619c71706176;hpb=272e0685b1b1c7dc4b9a028d1df08dbcb270a24c;p=supertux.git diff --git a/src/leveleditor.cpp b/src/leveleditor.cpp index aa7b081a5..49eb83be9 100644 --- a/src/leveleditor.cpp +++ b/src/leveleditor.cpp @@ -117,6 +117,7 @@ struct TileOrObject bool IsTile() { return is_tile; }; //Returns true for a GameObject bool IsObject() { return !is_tile; }; + void Init() { tile = 0; obj = NULL; is_tile = true; }; bool is_tile; //true for tile (false for object) unsigned int tile; @@ -170,11 +171,6 @@ static int le_selection_mode; static SDL_Event event; TileMapType active_tm; -// menu items for subset creation menu -enum { - MNID_CREATESUBSET -}; - void le_set_defaults() { if(le_current_level != NULL) @@ -326,7 +322,7 @@ int leveleditor(int levelnb) if(i >= 1) { le_level_subset->load(level_subsets.item[i-1]); - leveleditor_menu->item[3].kind = MN_GOTO; + leveleditor_menu->get_item_by_id(MNID_SUBSETSETTINGS).kind = MN_GOTO; le_level = 1; le_world.arrays_free(); delete le_current_level; @@ -340,8 +336,7 @@ int leveleditor(int levelnb) le_current_level->load_gfx(); le_world.activate_bad_guys(); - // FIXME:? - Menu::set_current(leveleditor_menu); + Menu::set_current(NULL); } break; } @@ -357,9 +352,9 @@ int leveleditor(int levelnb) switch (i = subset_new_menu->check()) { case MNID_CREATESUBSET: - LevelSubset::create(subset_new_menu->item[2].input); - le_level_subset->load(subset_new_menu->item[2].input); - leveleditor_menu->item[3].kind = MN_GOTO; + LevelSubset::create(subset_new_menu->get_item_by_id(MNID_SUBSETNAME).input); + le_level_subset->load(subset_new_menu->get_item_by_id(MNID_SUBSETNAME).input); + leveleditor_menu->get_item_by_id(MNID_SUBSETSETTINGS).kind = MN_GOTO; le_level = 1; le_world.arrays_free(); delete le_current_level; @@ -372,23 +367,23 @@ int leveleditor(int levelnb) le_set_defaults(); le_current_level->load_gfx(); le_world.activate_bad_guys(); - subset_new_menu->item[2].change_input(""); - // FIXME:? show_menu = true; - Menu::set_current(leveleditor_menu); + subset_new_menu->get_item_by_id(MNID_SUBSETNAME).change_input(""); + + Menu::set_current(subset_settings_menu); break; } } } else if(menu == subset_settings_menu) { - if(le_level_subset->title.compare(subset_settings_menu->item[2].input) == 0 && le_level_subset->description.compare(subset_settings_menu->item[3].input) == 0 ) - subset_settings_menu->item[5].kind = MN_DEACTIVE; + if(le_level_subset->title.compare(subset_settings_menu->get_item_by_id(MNID_SUBSETTITLE).input) == 0 && le_level_subset->description.compare(subset_settings_menu->get_item_by_id(MNID_SUBSETDESCRIPTION).input) == 0 ) + subset_settings_menu->get_item_by_id(MNID_SUBSETSAVECHANGES).kind = MN_DEACTIVE; else - subset_settings_menu->item[5].kind = MN_ACTION; + subset_settings_menu->get_item_by_id(MNID_SUBSETSAVECHANGES).kind = MN_ACTION; switch (i = subset_settings_menu->check()) { - case 5: + case MNID_SUBSETSAVECHANGES: save_subset_settings_menu(); //FIXME:show_menu = true; Menu::set_current(leveleditor_menu); @@ -461,10 +456,10 @@ void le_init_menus() subset_settings_menu->additem(MN_LABEL,"Level Subset Settings",0,0); subset_settings_menu->additem(MN_HL,"",0,0); - subset_settings_menu->additem(MN_TEXTFIELD,"Title",0,0); - subset_settings_menu->additem(MN_TEXTFIELD,"Description",0,0); + subset_settings_menu->additem(MN_TEXTFIELD,"Title",0,0,MNID_SUBSETTITLE); + subset_settings_menu->additem(MN_TEXTFIELD,"Description",0,0,MNID_SUBSETDESCRIPTION); subset_settings_menu->additem(MN_HL,"",0,0); - subset_settings_menu->additem(MN_ACTION,"Save Changes",0,0); + subset_settings_menu->additem(MN_ACTION,"Save Changes",0,0,MNID_SUBSETSAVECHANGES); subset_settings_menu->additem(MN_HL,"",0,0); subset_settings_menu->additem(MN_BACK,"Back",0,0); @@ -475,9 +470,11 @@ void le_init_menus() level_settings_menu->additem(MN_TEXTFIELD,"Author ",0,0,MNID_AUTHOR); level_settings_menu->additem(MN_STRINGSELECT,"Song ",0,0,MNID_SONG); level_settings_menu->additem(MN_STRINGSELECT,"Bg-Image",0,0,MNID_BGIMG); + level_settings_menu->additem(MN_STRINGSELECT,"Particle",0,0,MNID_PARTICLE); level_settings_menu->additem(MN_NUMFIELD,"Length ",0,0,MNID_LENGTH); level_settings_menu->additem(MN_NUMFIELD,"Time ",0,0,MNID_TIME); level_settings_menu->additem(MN_NUMFIELD,"Gravity",0,0,MNID_GRAVITY); + level_settings_menu->additem(MN_NUMFIELD,"Bg-Img-Speed",0,0,MNID_BGSPEED); level_settings_menu->additem(MN_NUMFIELD,"Top Red ",0,0,MNID_TopRed); level_settings_menu->additem(MN_NUMFIELD,"Top Green ",0,0,MNID_TopGreen); level_settings_menu->additem(MN_NUMFIELD,"Top Blue ",0,0,MNID_TopBlue); @@ -504,9 +501,28 @@ void le_init_menus() sit != (*it).tiles.end(); ++sit, ++i) { std::string imagefile = "/images/tilesets/" ; - imagefile += TileManager::instance()->get(*sit)->filenames[0]; + bool only_editor_image = false; + if(!TileManager::instance()->get(*sit)->filenames.empty()) + { + imagefile += TileManager::instance()->get(*sit)->filenames[0]; + } + else if(!TileManager::instance()->get(*sit)->editor_filenames.empty()) + { + imagefile += TileManager::instance()->get(*sit)->editor_filenames[0]; + only_editor_image = true; + } + else + { + imagefile += "notile.png"; + } Button* button = new Button(imagefile, it->name, SDLKey(SDLK_a + i), 0, 0, 32, 32); + if(!only_editor_image) + if(!TileManager::instance()->get(*sit)->editor_filenames.empty()) + { + imagefile = "/images/tilesets/" + TileManager::instance()->get(*sit)->editor_filenames[0]; + button->add_icon(imagefile,32,32); + } tilegroups_map[it->name]->additem(button, *sit); } } @@ -532,14 +548,12 @@ void le_init_menus() int le_init() { level_subsets = dsubdirs("/levels", "info"); - le_level_subset = new LevelSubset; active_tm = TM_IA; - le_show_grid = true; + scroll_x = 0; - /* level_changed = NO;*/ fire = DOWN; done = 0; le_frame = 0; /* support for frames in some tiles, like waves and bad guys */ @@ -574,7 +588,9 @@ int le_init() le_tilemap_panel->additem(new Button("/images/icons/bkgrd.png","Background",SDLK_F4,0,0),TM_BG); le_tilemap_panel->additem(new Button("/images/icons/intact.png","Interactive",SDLK_F4,0,0),TM_IA); le_tilemap_panel->additem(new Button("/images/icons/frgrd.png","Foreground",SDLK_F4,0,0),TM_FG); - + + le_current.Init(); + le_init_menus(); SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); @@ -586,25 +602,32 @@ void update_level_settings_menu() { char str[80]; int i; - + level_settings_menu->get_item_by_id(MNID_NAME).change_input(le_current_level->name.c_str()); level_settings_menu->get_item_by_id(MNID_AUTHOR).change_input(le_current_level->author.c_str()); - + string_list_copy(level_settings_menu->get_item_by_id(MNID_SONG).list, dfiles("music/",NULL, "-fast")); string_list_copy(level_settings_menu->get_item_by_id(MNID_BGIMG).list, dfiles("images/background",NULL, NULL)); string_list_add_item(level_settings_menu->get_item_by_id(MNID_BGIMG).list,""); - + string_list_add_item(level_settings_menu->get_item_by_id(MNID_PARTICLE).list,""); + string_list_add_item(level_settings_menu->get_item_by_id(MNID_PARTICLE).list,"snow"); + string_list_add_item(level_settings_menu->get_item_by_id(MNID_PARTICLE).list,"clouds"); + if((i = string_list_find(level_settings_menu->get_item_by_id(MNID_SONG).list,le_current_level->song_title.c_str())) != -1) level_settings_menu->get_item_by_id(MNID_SONG).list->active_item = i; if((i = string_list_find(level_settings_menu->get_item_by_id(MNID_BGIMG).list,le_current_level->bkgd_image.c_str())) != -1) level_settings_menu->get_item_by_id(MNID_BGIMG).list->active_item = i; - - sprintf(str,"%d",le_current_level->width); + if((i = string_list_find(level_settings_menu->get_item_by_id(MNID_PARTICLE).list,le_current_level->particle_system.c_str())) != -1) + level_settings_menu->get_item_by_id(MNID_PARTICLE).list->active_item = i; + + sprintf(str,"%d",le_current_level->width); level_settings_menu->get_item_by_id(MNID_LENGTH).change_input(str); sprintf(str,"%d",le_current_level->time_left); level_settings_menu->get_item_by_id(MNID_TIME).change_input(str); sprintf(str,"%2.0f",le_current_level->gravity); level_settings_menu->get_item_by_id(MNID_GRAVITY).change_input(str); + sprintf(str,"%d",le_current_level->bkgd_speed); + level_settings_menu->get_item_by_id(MNID_BGSPEED).change_input(str); sprintf(str,"%d",le_current_level->bkgd_top.red); level_settings_menu->get_item_by_id(MNID_TopRed).change_input(str); sprintf(str,"%d",le_current_level->bkgd_top.green); @@ -638,6 +661,11 @@ void apply_level_settings_menu() le_current_level->bkgd_image = string_list_active(level_settings_menu->get_item_by_id(MNID_BGIMG).list); i = true; } + + if(le_current_level->particle_system.compare(string_list_active(level_settings_menu->get_item_by_id(MNID_PARTICLE).list)) != 0) + { + le_current_level->particle_system = string_list_active(level_settings_menu->get_item_by_id(MNID_PARTICLE).list); + } if(i) { @@ -649,6 +677,7 @@ void apply_level_settings_menu() le_current_level->change_size(atoi(level_settings_menu->get_item_by_id(MNID_LENGTH).input)); le_current_level->time_left = atoi(level_settings_menu->get_item_by_id(MNID_BGIMG).input); le_current_level->gravity = atof(level_settings_menu->get_item_by_id(MNID_GRAVITY).input); + le_current_level->bkgd_speed = atoi(level_settings_menu->get_item_by_id(MNID_BGSPEED).input); le_current_level->bkgd_top.red = atoi(level_settings_menu->get_item_by_id(MNID_TopRed).input); le_current_level->bkgd_top.green = atoi(level_settings_menu->get_item_by_id(MNID_TopGreen).input); le_current_level->bkgd_top.blue = atoi(level_settings_menu->get_item_by_id(MNID_TopBlue).input); @@ -751,7 +780,7 @@ void le_drawinterface() } if(le_selection_mode == CURSOR) - le_selection->draw( cursor_x - pos_x, cursor_y); + le_selection->draw( cursor_x - scroll_x, cursor_y); else if(le_selection_mode == SQUARE) { int w, h; @@ -775,7 +804,11 @@ void le_drawinterface() if(TileManager::instance()->get(le_current.tile)->editor_images.size() > 0) TileManager::instance()->get(le_current.tile)->editor_images[0]->draw( 19 * 32, 14 * 32); } - + if(le_current.IsObject()) + { + le_current.obj->draw_on_screen(19 * 32, 14 * 32); + } + //if(le_current.IsObject()) //printf(""); @@ -828,7 +861,7 @@ void le_drawlevel() /* Draw the real background */ if(le_current_level->bkgd_image[0] != '\0') { - s = pos_x / 30; + s = (int)((float)pos_x * ((float)le_current_level->bkgd_speed/60.)) % screen->w; le_current_level->img_bkgd->draw_part(s,0,0,0, le_current_level->img_bkgd->w - s - 32, le_current_level->img_bkgd->h); le_current_level->img_bkgd->draw_part(0,0,screen->w - s - 32 ,0,s, @@ -838,6 +871,17 @@ void le_drawlevel() { drawgradient(le_current_level->bkgd_top, le_current_level->bkgd_bottom); } + + if(le_current.IsTile()) + { + Tile::draw(cursor_x, cursor_y,le_current.tile,128); + if(!TileManager::instance()->get(le_current.tile)->images.empty()) + fillrect(cursor_x,cursor_y,TileManager::instance()->get(le_current.tile)->images[0]->w,TileManager::instance()->get(le_current.tile)->images[0]->h,50,50,50,50); + } + if(le_current.IsObject()) + { + le_current.obj->move_to(cursor_x, cursor_y); + } /* clearscreen(current_level.bkgd_red, current_level.bkgd_green, current_level.bkgd_blue); */ @@ -1019,16 +1063,16 @@ void le_checkevents() x = event.motion.x; y = event.motion.y; - if(le_current.IsTile()) - { - cursor_x = ((int)(pos_x + x) / 32) * 32; - cursor_y = ((int) y / 32) * 32; - } - else - { - cursor_x = x; - cursor_y = y; - } + if(le_current.IsTile()) + { + cursor_x = ((int)(pos_x + x) / 32) * 32; + cursor_y = ((int) y / 32) * 32; + } + else + { + cursor_x = x; + cursor_y = y; + } if(le_mouse_pressed[LEFT]) { @@ -1145,6 +1189,8 @@ void le_checkevents() { if(pbutton->get_state() == BUTTON_CLICKED) { + if(le_current.IsObject()) + le_current.obj->move_to(pbutton->get_pos().x,pbutton->get_pos().y); le_current.Tile(pbutton->get_tag()); } } @@ -1155,6 +1201,8 @@ void le_checkevents() { if(pbutton->get_state() == BUTTON_CLICKED) { + if(le_current.IsObject()) + le_current.obj->move_to(pbutton->get_pos().x,pbutton->get_pos().y); le_current.Object(pbutton->get_game_object()); } } @@ -1198,9 +1246,9 @@ void le_checkevents() if(type == "BadGuy") { BadGuy* pbadguy = dynamic_cast(le_current.obj); - - le_world.bad_guys.push_back(BadGuy(cursor_x, cursor_y,pbadguy->kind,false)); - le_current_level->badguy_data.push_back(&le_world.bad_guys.back()); + + le_world.bad_guys.push_back(BadGuy(cursor_x+scroll_x, cursor_y,pbadguy->kind,false)); + le_current_level->badguy_data.push_back(&le_world.bad_guys.back()); } } } @@ -1215,7 +1263,7 @@ void le_checkevents() } else if(le_move_left_bt->get_state() == BUTTON_HOVER) { - pos_x -= 64; + pos_x -= 32; } if(le_move_right_bt->get_state() == BUTTON_PRESSED) @@ -1224,7 +1272,7 @@ void le_checkevents() } else if(le_move_right_bt->get_state() == BUTTON_HOVER) { - pos_x += 64; + pos_x += 32; } } @@ -1287,10 +1335,10 @@ void le_change(float x, float y, int tm, unsigned int c) /* if there is a bad guy over there, remove it */ for(i = 0; i < le_world.bad_guys.size(); ++i) if(rectcollision(cursor_base,le_world.bad_guys[i].base)) - { + { le_world.bad_guys.erase(le_world.bad_guys.begin() + i); - le_current_level->badguy_data.erase(le_current_level->badguy_data.begin() + i); - } + le_current_level->badguy_data.erase(le_current_level->badguy_data.begin() + i); + } break; case SQUARE: @@ -1359,7 +1407,7 @@ void le_testlevel() music_manager->halt_music(); - Menu::set_current(leveleditor_menu); + Menu::set_current(NULL); le_world.arrays_free(); le_current_level->load_gfx(); le_world.activate_bad_guys();