X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fleveleditor.cpp;h=49eb83be9f61179878080cb92c5da1a81db7bc4a;hb=2c082bbb4a425558bde13145246431d0a62039d5;hp=031ff4c8189d94f780f9a97a6871fc1c72593240;hpb=1af171900ae8cae790eabcea69514a8c44d9d889;p=supertux.git diff --git a/src/leveleditor.cpp b/src/leveleditor.cpp index 031ff4c81..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) @@ -273,9 +269,9 @@ int leveleditor(int levelnb) { switch (level_settings_menu->check()) { - case MNID_SUBSETSETTINGS: + case MNID_APPLY: apply_level_settings_menu(); - Menu::set_current(leveleditor_menu); + Menu::set_current(NULL); break; default: @@ -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,30 +456,31 @@ 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); level_settings_menu->arrange_left = true; level_settings_menu->additem(MN_LABEL,"Level Settings",0,0); level_settings_menu->additem(MN_HL,"",0,0); - level_settings_menu->additem(MN_TEXTFIELD,"Name ",0,0); - level_settings_menu->additem(MN_TEXTFIELD,"Author ",0,0); - level_settings_menu->additem(MN_STRINGSELECT,"Theme ",0,0); - level_settings_menu->additem(MN_STRINGSELECT,"Song ",0,0); - level_settings_menu->additem(MN_STRINGSELECT,"Bg-Image",0,0); - level_settings_menu->additem(MN_NUMFIELD,"Length ",0,0); - level_settings_menu->additem(MN_NUMFIELD,"Time ",0,0); - level_settings_menu->additem(MN_NUMFIELD,"Gravity",0,0); - level_settings_menu->additem(MN_NUMFIELD,"Top Red ",0,0); - level_settings_menu->additem(MN_NUMFIELD,"Top Green ",0,0); - level_settings_menu->additem(MN_NUMFIELD,"Top Blue ",0,0); - level_settings_menu->additem(MN_NUMFIELD,"Bottom Red ",0,0); - level_settings_menu->additem(MN_NUMFIELD,"Bottom Green",0,0); - level_settings_menu->additem(MN_NUMFIELD,"Bottom Blue",0,0); + level_settings_menu->additem(MN_TEXTFIELD,"Name ",0,0,MNID_NAME); + 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); + level_settings_menu->additem(MN_NUMFIELD,"Bottom Red ",0,0,MNID_BottomRed); + level_settings_menu->additem(MN_NUMFIELD,"Bottom Green",0,0,MNID_BottomGreen); + level_settings_menu->additem(MN_NUMFIELD,"Bottom Blue",0,0,MNID_BottomBlue); level_settings_menu->additem(MN_HL,"",0,0); level_settings_menu->additem(MN_ACTION,"Apply Changes",0,0,MNID_APPLY); @@ -505,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); } } @@ -533,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 */ @@ -575,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); @@ -588,38 +603,43 @@ void update_level_settings_menu() char str[80]; int i; - level_settings_menu->item[2].change_input(le_current_level->name.c_str()); - level_settings_menu->item[3].change_input(le_current_level->author.c_str()); - sprintf(str,"%d",le_current_level->width); + 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; + 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; - string_list_copy(level_settings_menu->item[4].list, dsubdirs("images/themes", "solid0.png")); - string_list_copy(level_settings_menu->item[5].list, dfiles("music/",NULL, "-fast")); - string_list_copy(level_settings_menu->item[6].list, dfiles("images/background",NULL, NULL)); - string_list_add_item(level_settings_menu->item[6].list,""); - if((i = string_list_find(level_settings_menu->item[4].list,le_current_level->theme.c_str())) != -1) - level_settings_menu->item[3].list->active_item = i; - if((i = string_list_find(level_settings_menu->item[5].list,le_current_level->song_title.c_str())) != -1) - level_settings_menu->item[4].list->active_item = i; - if((i = string_list_find(level_settings_menu->item[6].list,le_current_level->bkgd_image.c_str())) != -1) - level_settings_menu->item[5].list->active_item = i; - - level_settings_menu->item[7].change_input(str); + 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->item[8].change_input(str); + level_settings_menu->get_item_by_id(MNID_TIME).change_input(str); sprintf(str,"%2.0f",le_current_level->gravity); - level_settings_menu->item[9].change_input(str); + 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->item[10].change_input(str); + level_settings_menu->get_item_by_id(MNID_TopRed).change_input(str); sprintf(str,"%d",le_current_level->bkgd_top.green); - level_settings_menu->item[11].change_input(str); + level_settings_menu->get_item_by_id(MNID_TopGreen).change_input(str); sprintf(str,"%d",le_current_level->bkgd_top.blue); - level_settings_menu->item[12].change_input(str); + level_settings_menu->get_item_by_id(MNID_TopBlue).change_input(str); sprintf(str,"%d",le_current_level->bkgd_bottom.red); - level_settings_menu->item[13].change_input(str); + level_settings_menu->get_item_by_id(MNID_BottomRed).change_input(str); sprintf(str,"%d",le_current_level->bkgd_bottom.green); - level_settings_menu->item[14].change_input(str); + level_settings_menu->get_item_by_id(MNID_BottomGreen).change_input(str); sprintf(str,"%d",le_current_level->bkgd_bottom.blue); - level_settings_menu->item[15].change_input(str); + level_settings_menu->get_item_by_id(MNID_BottomBlue).change_input(str); } void update_subset_settings_menu() @@ -633,19 +653,18 @@ void apply_level_settings_menu() int i; i = false; - le_current_level->name = level_settings_menu->item[2].input; - le_current_level->author = level_settings_menu->item[3].input; + le_current_level->name = level_settings_menu->get_item_by_id(MNID_NAME).input; + le_current_level->author = level_settings_menu->get_item_by_id(MNID_AUTHOR).input; - if(le_current_level->bkgd_image.compare(string_list_active(level_settings_menu->item[6].list)) != 0) + if(le_current_level->bkgd_image.compare(string_list_active(level_settings_menu->get_item_by_id(MNID_BGIMG).list)) != 0) { - le_current_level->bkgd_image = string_list_active(level_settings_menu->item[6].list); + le_current_level->bkgd_image = string_list_active(level_settings_menu->get_item_by_id(MNID_BGIMG).list); i = true; } - - if(le_current_level->theme.compare(string_list_active(level_settings_menu->item[4].list)) != 0) + + if(le_current_level->particle_system.compare(string_list_active(level_settings_menu->get_item_by_id(MNID_PARTICLE).list)) != 0) { - le_current_level->theme = string_list_active(level_settings_menu->item[4].list); - i = true; + le_current_level->particle_system = string_list_active(level_settings_menu->get_item_by_id(MNID_PARTICLE).list); } if(i) @@ -653,17 +672,18 @@ void apply_level_settings_menu() le_current_level->load_gfx(); } - le_current_level->song_title = string_list_active(level_settings_menu->item[5].list); - - le_current_level->change_size(atoi(level_settings_menu->item[7].input)); - le_current_level->time_left = atoi(level_settings_menu->item[8].input); - le_current_level->gravity = atof(level_settings_menu->item[9].input); - le_current_level->bkgd_top.red = atoi(level_settings_menu->item[10].input); - le_current_level->bkgd_top.green = atoi(level_settings_menu->item[11].input); - le_current_level->bkgd_top.blue = atoi(level_settings_menu->item[12].input); - le_current_level->bkgd_bottom.red = atoi(level_settings_menu->item[13].input); - le_current_level->bkgd_bottom.green = atoi(level_settings_menu->item[14].input); - le_current_level->bkgd_bottom.blue = atoi(level_settings_menu->item[15].input); + le_current_level->song_title = string_list_active(level_settings_menu->get_item_by_id(MNID_SONG).list); + + 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); + le_current_level->bkgd_bottom.red = atoi(level_settings_menu->get_item_by_id(MNID_BottomRed).input); + le_current_level->bkgd_bottom.green = atoi(level_settings_menu->get_item_by_id(MNID_BottomGreen).input); + le_current_level->bkgd_bottom.blue = atoi(level_settings_menu->get_item_by_id(MNID_BottomBlue).input); } void save_subset_settings_menu() @@ -760,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; @@ -784,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(""); @@ -837,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, @@ -847,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); */ @@ -1028,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]) { @@ -1154,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()); } } @@ -1164,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()); } } @@ -1207,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()); } } } @@ -1224,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) @@ -1233,7 +1272,7 @@ void le_checkevents() } else if(le_move_right_bt->get_state() == BUTTON_HOVER) { - pos_x += 64; + pos_x += 32; } } @@ -1296,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: @@ -1368,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();