MODE_EDIT_TYPES support monsters and items, with create/delete undo/redo
This commit is contained in:
@@ -50,7 +50,7 @@ cUndoList undo_list;
|
|||||||
|
|
||||||
short flood_count = 0;
|
short flood_count = 0;
|
||||||
|
|
||||||
rectangle terrain_rects[256],terrain_rect_base = {0,0,16,16},command_rects[21];
|
rectangle terrain_rects[16*TYPE_ROWS_EDITING],terrain_rect_base = {0,0,16,16},command_rects[21];
|
||||||
extern rectangle terrain_buttons_rect;
|
extern rectangle terrain_buttons_rect;
|
||||||
|
|
||||||
extern short cen_x, cen_y, cur_town;
|
extern short cen_x, cen_y, cur_town;
|
||||||
@@ -121,7 +121,7 @@ void init_screen_locs() {
|
|||||||
border_rect[2].top = border_rect[2].bottom - 8;
|
border_rect[2].top = border_rect[2].bottom - 8;
|
||||||
border_rect[3].left = border_rect[3].right - 8;
|
border_rect[3].left = border_rect[3].right - 8;
|
||||||
|
|
||||||
for(short i = 0; i < 256; i++) {
|
for(short i = 0; i < 16 * TYPE_ROWS_EDITING; i++) {
|
||||||
terrain_rects[i] = terrain_rect_base;
|
terrain_rects[i] = terrain_rect_base;
|
||||||
terrain_rects[i].offset(3 + (i % 16) * (terrain_rect_base.right + 1),
|
terrain_rects[i].offset(3 + (i % 16) * (terrain_rect_base.right + 1),
|
||||||
3 + (i / 16) * (terrain_rect_base.bottom + 1));
|
3 + (i / 16) * (terrain_rect_base.bottom + 1));
|
||||||
@@ -261,13 +261,13 @@ static bool handle_lb_action(int i){
|
|||||||
set_up_start_screen();
|
set_up_start_screen();
|
||||||
break;
|
break;
|
||||||
case LB_EDIT_TER:
|
case LB_EDIT_TER:
|
||||||
start_terrain_editing();
|
start_type_editing(DRAW_TERRAIN);
|
||||||
break;
|
break;
|
||||||
case LB_EDIT_MONST:
|
case LB_EDIT_MONST:
|
||||||
start_monster_editing(0);
|
start_type_editing(DRAW_MONST);
|
||||||
break;
|
break;
|
||||||
case LB_EDIT_ITEM:
|
case LB_EDIT_ITEM:
|
||||||
start_item_editing(0);
|
start_type_editing(DRAW_ITEM);
|
||||||
break;
|
break;
|
||||||
case LB_NEW_TOWN:
|
case LB_NEW_TOWN:
|
||||||
if(scenario.towns.size() >= 200) {
|
if(scenario.towns.size() >= 200) {
|
||||||
@@ -361,62 +361,6 @@ static bool handle_rb_action(location the_point, bool option_hit) {
|
|||||||
switch(right_button_status[i + right_top].action) {
|
switch(right_button_status[i + right_top].action) {
|
||||||
case RB_CLEAR:
|
case RB_CLEAR:
|
||||||
break;
|
break;
|
||||||
case RB_MONST:
|
|
||||||
size_before = scenario.scen_monsters.size();
|
|
||||||
if(option_hit) {
|
|
||||||
if(j == size_before - 1 && !scenario.is_monst_used(j))
|
|
||||||
scenario.scen_monsters.pop_back();
|
|
||||||
else if(j == size_before) {
|
|
||||||
scenario.scen_monsters.resize(size_before + 8);
|
|
||||||
for(; j < scenario.scen_monsters.size(); j++)
|
|
||||||
scenario.scen_monsters[j].m_name = "New Monster";
|
|
||||||
} else {
|
|
||||||
scenario.scen_monsters[j] = cMonster();
|
|
||||||
scenario.scen_monsters[j].m_name = "Unused Monster";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(j == size_before) {
|
|
||||||
scenario.scen_monsters.emplace_back();
|
|
||||||
scenario.scen_monsters.back().m_name = "New Monster";
|
|
||||||
}
|
|
||||||
if(!edit_monst_type(j) && j == size_before && scenario.scen_monsters.back().m_name == "New Monster")
|
|
||||||
scenario.scen_monsters.pop_back();
|
|
||||||
}
|
|
||||||
start_monster_editing(size_before == scenario.scen_monsters.size());
|
|
||||||
if(size_before > scenario.scen_monsters.size())
|
|
||||||
pos_before--;
|
|
||||||
right_sbar->setPosition(pos_before);
|
|
||||||
break;
|
|
||||||
case RB_ITEM:
|
|
||||||
size_before = scenario.scen_items.size();
|
|
||||||
if(option_hit) {
|
|
||||||
if(j == size_before - 1 && !scenario.is_item_used(j))
|
|
||||||
scenario.scen_items.pop_back();
|
|
||||||
else if(j == size_before) {
|
|
||||||
scenario.scen_items.resize(size_before + 8);
|
|
||||||
for(; j < scenario.scen_items.size(); j++) {
|
|
||||||
scenario.scen_items[j].full_name = "New Item";
|
|
||||||
scenario.scen_items[j].name = "Item";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
scenario.scen_items[j] = cItem();
|
|
||||||
scenario.scen_items[j].full_name = "Unused Item";
|
|
||||||
scenario.scen_items[j].name = "Item";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(j == size_before) {
|
|
||||||
scenario.scen_items.emplace_back();
|
|
||||||
scenario.scen_items.back().full_name = "New Item";
|
|
||||||
scenario.scen_items.back().name = "Item";
|
|
||||||
}
|
|
||||||
if(!edit_item_type(j) && j == size_before && scenario.scen_items.back().name == "New Item")
|
|
||||||
scenario.scen_items.pop_back();
|
|
||||||
}
|
|
||||||
start_item_editing(size_before == scenario.scen_items.size());
|
|
||||||
if(size_before > scenario.scen_items.size())
|
|
||||||
pos_before--;
|
|
||||||
right_sbar->setPosition(pos_before);
|
|
||||||
break;
|
|
||||||
case RB_SCEN_SPEC:
|
case RB_SCEN_SPEC:
|
||||||
size_before = scenario.scen_specials.size();
|
size_before = scenario.scen_specials.size();
|
||||||
if(option_hit) {
|
if(option_hit) {
|
||||||
@@ -1261,7 +1205,9 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool handle_terpal_action(location cur_point, bool option_hit) {
|
static bool handle_terpal_action(location cur_point, bool option_hit) {
|
||||||
for(int i = 0; i < 256; i++)
|
int rows = TYPE_ROWS_DRAWING;
|
||||||
|
if(overall_mode == MODE_EDIT_TYPES) rows = TYPE_ROWS_EDITING;
|
||||||
|
for(int i = 0; i < 16 * rows; i++)
|
||||||
if(cur_point.in(terrain_rects[i])) {
|
if(cur_point.in(terrain_rects[i])) {
|
||||||
int k = pal_sbar->getPosition() * 16 + i;
|
int k = pal_sbar->getPosition() * 16 + i;
|
||||||
rectangle temp_rect = terrain_rects[i];
|
rectangle temp_rect = terrain_rects[i];
|
||||||
@@ -1292,17 +1238,24 @@ static bool handle_terpal_action(location cur_point, bool option_hit) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// MODE_EDIT_TYPES:
|
||||||
else {
|
else {
|
||||||
short size_before = scenario.ter_types.size(), pos_before = pal_sbar->getPosition();
|
short pos_before = pos_before = pal_sbar->getPosition();
|
||||||
i += pos_before * 16;
|
i += pos_before * 16;
|
||||||
|
short size_before = scenario.ter_types.size();
|
||||||
|
if(draw_mode == DRAW_MONST) size_before = scenario.scen_monsters.size(), i++;
|
||||||
|
else if(draw_mode == DRAW_ITEM) size_before = scenario.scen_items.size();
|
||||||
if(i > size_before) return true;
|
if(i > size_before) return true;
|
||||||
if(i == 90){
|
|
||||||
|
if(draw_mode == DRAW_TERRAIN && i == 90){
|
||||||
showWarning("The pit/barrier terrain cannot be changed.");
|
showWarning("The pit/barrier terrain cannot be changed.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(option_hit) {
|
if(option_hit) {
|
||||||
// option-click the plus button: create a new row of terrains
|
// option-click the plus button: create a new row of types
|
||||||
if(i == size_before){
|
if(i == size_before){
|
||||||
|
switch(draw_mode){
|
||||||
|
case DRAW_TERRAIN:{
|
||||||
terrain_type_changes_t terrains;
|
terrain_type_changes_t terrains;
|
||||||
scenario.ter_types.resize(size_before + 16);
|
scenario.ter_types.resize(size_before + 16);
|
||||||
for(; i < scenario.ter_types.size(); i++){
|
for(; i < scenario.ter_types.size(); i++){
|
||||||
@@ -1312,39 +1265,153 @@ static bool handle_terpal_action(location cur_point, bool option_hit) {
|
|||||||
|
|
||||||
undo_list.add(action_ptr(new aCreateDeleteTerrain(terrains)));
|
undo_list.add(action_ptr(new aCreateDeleteTerrain(terrains)));
|
||||||
update_edit_menu();
|
update_edit_menu();
|
||||||
|
}break;
|
||||||
|
case DRAW_MONST:{
|
||||||
|
monst_type_changes_t monsts;
|
||||||
|
scenario.scen_monsters.resize(size_before + 16);
|
||||||
|
for(; i < scenario.scen_monsters.size(); i++){
|
||||||
|
scenario.scen_monsters[i].m_name = "New Monster";
|
||||||
|
monsts.push_back(scenario.scen_monsters[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
undo_list.add(action_ptr(new aCreateDeleteMonster(monsts)));
|
||||||
|
update_edit_menu();
|
||||||
|
}break;
|
||||||
|
case DRAW_ITEM:{
|
||||||
|
item_type_changes_t items;
|
||||||
|
scenario.scen_items.resize(size_before + 16);
|
||||||
|
for(; i < scenario.scen_items.size(); i++){
|
||||||
|
scenario.scen_items[i].full_name = "New Item";
|
||||||
|
items.push_back(scenario.scen_items[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
undo_list.add(action_ptr(new aCreateDeleteItem(items)));
|
||||||
|
update_edit_menu();
|
||||||
|
}break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
switch(draw_mode){
|
||||||
|
case DRAW_TERRAIN:
|
||||||
// option-click the last one and it's safe to delete: delete it
|
// option-click the last one and it's safe to delete: delete it
|
||||||
if(i == size_before - 1 && !scenario.is_ter_used(i)){
|
if(i == size_before - 1 && !scenario.is_ter_used(i)){
|
||||||
undo_list.add(action_ptr(new aCreateDeleteTerrain(false, scenario.ter_types.back())));
|
undo_list.add(action_ptr(new aCreateDeleteTerrain(false, scenario.ter_types.back())));
|
||||||
update_edit_menu();
|
update_edit_menu();
|
||||||
scenario.ter_types.pop_back();
|
scenario.ter_types.pop_back();
|
||||||
}
|
}
|
||||||
// option-click terrain that can't be deleted (because it would break other terrains' numbers, or is in use somewhere):
|
// option-click type that can't be deleted (because it would break other types' numbers, or is in use somewhere):
|
||||||
// reset type info
|
// reset type info
|
||||||
else{
|
else{
|
||||||
scenario.ter_types[i] = cTerrain();
|
scenario.ter_types[i] = cTerrain();
|
||||||
scenario.ter_types[i].name = "Unused Terrain";
|
scenario.ter_types[i].name = "Unused Terrain";
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case DRAW_MONST:
|
||||||
|
// option-click the last one and it's safe to delete: delete it
|
||||||
|
if(i == size_before - 1 && !scenario.is_monst_used(i)){
|
||||||
|
undo_list.add(action_ptr(new aCreateDeleteMonster(false, scenario.scen_monsters.back())));
|
||||||
|
update_edit_menu();
|
||||||
|
scenario.scen_monsters.pop_back();
|
||||||
|
}
|
||||||
|
// option-click type that can't be deleted (because it would break other types' numbers, or is in use somewhere):
|
||||||
|
// reset type info
|
||||||
|
else{
|
||||||
|
scenario.scen_monsters[i] = cMonster();
|
||||||
|
scenario.scen_monsters[i].m_name = "Unused Monster";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DRAW_ITEM:
|
||||||
|
// option-click the last one and it's safe to delete: delete it
|
||||||
|
if(i == size_before - 1 && !scenario.is_item_used(i)){
|
||||||
|
undo_list.add(action_ptr(new aCreateDeleteItem(false, scenario.scen_items.back())));
|
||||||
|
update_edit_menu();
|
||||||
|
scenario.scen_items.pop_back();
|
||||||
|
}
|
||||||
|
// option-click type that can't be deleted (because it would break other types' numbers, or is in use somewhere):
|
||||||
|
// reset type info
|
||||||
|
else{
|
||||||
|
scenario.scen_items[i] = cItem();
|
||||||
|
scenario.scen_items[i].full_name = "Unused Item";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Click the plus button: create a new terrain and edit it immediately
|
// Click the plus button: create a new type and edit it immediately
|
||||||
if(i == size_before) {
|
if(i == size_before) {
|
||||||
|
switch(draw_mode){
|
||||||
|
case DRAW_TERRAIN:
|
||||||
scenario.ter_types.emplace_back();
|
scenario.ter_types.emplace_back();
|
||||||
scenario.ter_types.back().name = "New Terrain";
|
scenario.ter_types.back().name = "New Terrain";
|
||||||
|
break;
|
||||||
|
case DRAW_MONST:
|
||||||
|
scenario.scen_monsters.emplace_back();
|
||||||
|
scenario.scen_monsters.back().m_name = "New Monster";
|
||||||
|
break;
|
||||||
|
case DRAW_ITEM:
|
||||||
|
scenario.scen_items.emplace_back();
|
||||||
|
scenario.scen_items.back().full_name = "New Item";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if(!edit_ter_type(i) && i == size_before && scenario.ter_types.back().name == "New Terrain"){
|
}
|
||||||
// Canceled:
|
switch(draw_mode){
|
||||||
|
case DRAW_TERRAIN:
|
||||||
|
if(!edit_ter_type(i)){
|
||||||
|
// Canceled editing
|
||||||
|
if(i == size_before){
|
||||||
|
// Canceled creating new:
|
||||||
scenario.ter_types.pop_back();
|
scenario.ter_types.pop_back();
|
||||||
}else{
|
}
|
||||||
|
}
|
||||||
|
// Created new:
|
||||||
|
else if(i == size_before){
|
||||||
undo_list.add(action_ptr(new aCreateDeleteTerrain(true, scenario.ter_types.back())));
|
undo_list.add(action_ptr(new aCreateDeleteTerrain(true, scenario.ter_types.back())));
|
||||||
update_edit_menu();
|
update_edit_menu();
|
||||||
|
}else{
|
||||||
|
// TODO edited existing (if different)
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DRAW_MONST:
|
||||||
|
if(!edit_monst_type(i)){
|
||||||
|
// Canceled editing
|
||||||
|
if(i == size_before){
|
||||||
|
// Canceled creating new:
|
||||||
|
scenario.scen_monsters.pop_back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(size_before / 16 > scenario.ter_types.size() / 16)
|
// Created new:
|
||||||
pos_before--;
|
else if(i == size_before){
|
||||||
|
undo_list.add(action_ptr(new aCreateDeleteMonster(true, scenario.scen_monsters.back())));
|
||||||
|
update_edit_menu();
|
||||||
|
}else{
|
||||||
|
// TODO edited existing (if different)
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DRAW_ITEM:
|
||||||
|
if(!edit_item_type(i)){
|
||||||
|
// Canceled editing
|
||||||
|
if(i == size_before){
|
||||||
|
// Canceled creating new:
|
||||||
|
scenario.scen_items.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Created new:
|
||||||
|
else if(i == size_before){
|
||||||
|
undo_list.add(action_ptr(new aCreateDeleteItem(true, scenario.scen_items.back())));
|
||||||
|
update_edit_menu();
|
||||||
|
}else{
|
||||||
|
// TODO edited existing (if different)
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
short size_after = scenario.ter_types.size();
|
||||||
|
if(draw_mode == DRAW_MONST) size_after = scenario.scen_monsters.size(), i++;
|
||||||
|
else if(draw_mode == DRAW_ITEM) size_after = scenario.scen_items.size();
|
||||||
|
pos_before += (size_after / 16 - size_before / 16);
|
||||||
|
pal_sbar->setMaximum(max(pos_before, pal_sbar->getMaximum()));
|
||||||
pal_sbar->setPosition(pos_before);
|
pal_sbar->setPosition(pos_before);
|
||||||
set_up_terrain_buttons(false);
|
set_up_type_buttons(false);
|
||||||
change_made = true;
|
change_made = true;
|
||||||
}
|
}
|
||||||
place_location();
|
place_location();
|
||||||
@@ -1621,15 +1688,15 @@ static bool handle_toolpal_action(location cur_point2) {
|
|||||||
break;
|
break;
|
||||||
case PAL_TERRAIN: // Terrain palette
|
case PAL_TERRAIN: // Terrain palette
|
||||||
draw_mode = DRAW_TERRAIN;
|
draw_mode = DRAW_TERRAIN;
|
||||||
set_up_terrain_buttons(true);
|
set_up_type_buttons(true);
|
||||||
break;
|
break;
|
||||||
case PAL_ITEM: // Item palette
|
case PAL_ITEM: // Item palette
|
||||||
draw_mode = DRAW_ITEM;
|
draw_mode = DRAW_ITEM;
|
||||||
set_up_terrain_buttons(true);
|
set_up_type_buttons(true);
|
||||||
break;
|
break;
|
||||||
case PAL_MONST: // Monster palette
|
case PAL_MONST: // Monster palette
|
||||||
draw_mode = DRAW_MONST;
|
draw_mode = DRAW_MONST;
|
||||||
set_up_terrain_buttons(true);
|
set_up_type_buttons(true);
|
||||||
break;
|
break;
|
||||||
case PAL_BOAT:
|
case PAL_BOAT:
|
||||||
set_string("Place/edit boat","Select boat location");
|
set_string("Place/edit boat","Select boat location");
|
||||||
@@ -2732,7 +2799,7 @@ void start_town_edit() {
|
|||||||
scenario.editor_state.editing_town = editing_town = true;
|
scenario.editor_state.editing_town = editing_town = true;
|
||||||
scenario.editor_state.drawing = true;
|
scenario.editor_state.drawing = true;
|
||||||
restore_current_town_state();
|
restore_current_town_state();
|
||||||
set_up_terrain_buttons(true);
|
set_up_type_buttons(true);
|
||||||
shut_down_menus(4);
|
shut_down_menus(4);
|
||||||
shut_down_menus(2);
|
shut_down_menus(2);
|
||||||
right_sbar->hide();
|
right_sbar->hide();
|
||||||
@@ -2779,7 +2846,7 @@ void start_out_edit() {
|
|||||||
scenario.editor_state.editing_town = editing_town = false;
|
scenario.editor_state.editing_town = editing_town = false;
|
||||||
scenario.editor_state.drawing = true;
|
scenario.editor_state.drawing = true;
|
||||||
restore_current_out_state();
|
restore_current_out_state();
|
||||||
set_up_terrain_buttons(true);
|
set_up_type_buttons(true);
|
||||||
right_sbar->hide();
|
right_sbar->hide();
|
||||||
pal_sbar->show();
|
pal_sbar->show();
|
||||||
shut_down_menus(4);
|
shut_down_menus(4);
|
||||||
@@ -2797,68 +2864,19 @@ void start_out_edit() {
|
|||||||
redraw_screen();
|
redraw_screen();
|
||||||
}
|
}
|
||||||
|
|
||||||
void start_terrain_editing() {
|
void start_type_editing(eDrawMode mode) {
|
||||||
right_sbar->hide();
|
right_sbar->hide();
|
||||||
pal_sbar->show();
|
pal_sbar->show();
|
||||||
overall_mode = MODE_EDIT_TYPES;
|
overall_mode = MODE_EDIT_TYPES;
|
||||||
draw_mode = DRAW_TERRAIN;
|
draw_mode = mode;
|
||||||
set_up_terrain_buttons(true);
|
set_up_type_buttons(true);
|
||||||
place_location();
|
place_location();
|
||||||
|
|
||||||
set_lb(NLS - 3,LB_TEXT,LB_NO_ACTION,"Alt-click to delete/clear",true);
|
set_lb(NLS - 3,LB_TEXT,LB_NO_ACTION,"Alt-click to delete/clear",true);
|
||||||
|
set_lb(NLS - 2,LB_TEXT,LB_NO_ACTION,"Alt-click '+' to add many",true);
|
||||||
update_mouse_spot(translate_mouse_coordinates(sf::Mouse::getPosition(mainPtr())));
|
update_mouse_spot(translate_mouse_coordinates(sf::Mouse::getPosition(mainPtr())));
|
||||||
}
|
}
|
||||||
|
|
||||||
void start_monster_editing(bool just_redo_text) {
|
|
||||||
int num_options = scenario.scen_monsters.size() + 1;
|
|
||||||
|
|
||||||
if(!just_redo_text) {
|
|
||||||
handle_close_terrain_view(MODE_MAIN_SCREEN);
|
|
||||||
right_sbar->show();
|
|
||||||
pal_sbar->hide();
|
|
||||||
right_sbar->setPosition(0);
|
|
||||||
|
|
||||||
reset_rb();
|
|
||||||
right_sbar->setMaximum(num_options - 1 - NRSONPAGE);
|
|
||||||
}
|
|
||||||
for(short i = 1; i < num_options; i++) {
|
|
||||||
std::string title;
|
|
||||||
if(i == scenario.scen_monsters.size())
|
|
||||||
title = "Create New Monster";
|
|
||||||
else title = scenario.scen_monsters[i].m_name;
|
|
||||||
title = std::to_string(i) + " - " + title;
|
|
||||||
set_rb(i - 1,RB_MONST, i, title);
|
|
||||||
}
|
|
||||||
set_lb(NLS - 3,LB_TEXT,LB_NO_ACTION,"Alt-click to delete",true);
|
|
||||||
update_mouse_spot(translate_mouse_coordinates(sf::Mouse::getPosition(mainPtr())));
|
|
||||||
redraw_screen();
|
|
||||||
}
|
|
||||||
|
|
||||||
void start_item_editing(bool just_redo_text) {
|
|
||||||
int num_options = scenario.scen_items.size() + 1;
|
|
||||||
|
|
||||||
if(!just_redo_text) {
|
|
||||||
handle_close_terrain_view(MODE_MAIN_SCREEN);
|
|
||||||
right_sbar->show();
|
|
||||||
pal_sbar->hide();
|
|
||||||
|
|
||||||
right_sbar->setPosition(0);
|
|
||||||
reset_rb();
|
|
||||||
right_sbar->setMaximum(num_options - NRSONPAGE);
|
|
||||||
}
|
|
||||||
for(short i = 0; i < num_options; i++) {
|
|
||||||
std::string title;
|
|
||||||
if(i == scenario.scen_items.size())
|
|
||||||
title = "Create New Item";
|
|
||||||
else title = scenario.scen_items[i].full_name;
|
|
||||||
title = std::to_string(i) + " - " + title;
|
|
||||||
set_rb(i,RB_ITEM, i, title);
|
|
||||||
}
|
|
||||||
set_lb(NLS - 3,LB_TEXT,LB_NO_ACTION,"Alt-click to delete",true);
|
|
||||||
update_mouse_spot(translate_mouse_coordinates(sf::Mouse::getPosition(mainPtr())));
|
|
||||||
redraw_screen();
|
|
||||||
}
|
|
||||||
|
|
||||||
void start_special_item_editing(bool just_redo_text) {
|
void start_special_item_editing(bool just_redo_text) {
|
||||||
int num_options = scenario.special_items.size() + 1;
|
int num_options = scenario.special_items.size() + 1;
|
||||||
|
|
||||||
|
@@ -35,9 +35,7 @@ void set_up_start_screen();
|
|||||||
void set_up_main_screen();
|
void set_up_main_screen();
|
||||||
void start_town_edit();
|
void start_town_edit();
|
||||||
void start_out_edit();
|
void start_out_edit();
|
||||||
void start_terrain_editing();
|
void start_type_editing(eDrawMode mode);
|
||||||
void start_monster_editing(bool just_redo_text);
|
|
||||||
void start_item_editing(bool just_redo_text);
|
|
||||||
void start_special_item_editing(bool just_redo_text);
|
void start_special_item_editing(bool just_redo_text);
|
||||||
void start_quest_editing(bool just_redo_text);
|
void start_quest_editing(bool just_redo_text);
|
||||||
void start_shops_editing(bool just_redo_text);
|
void start_shops_editing(bool just_redo_text);
|
||||||
|
@@ -22,8 +22,6 @@ enum eLBAction {
|
|||||||
|
|
||||||
enum eRBAction {
|
enum eRBAction {
|
||||||
RB_CLEAR = 0,
|
RB_CLEAR = 0,
|
||||||
RB_MONST = 2,
|
|
||||||
RB_ITEM = 3,
|
|
||||||
RB_SCEN_SPEC = 4,
|
RB_SCEN_SPEC = 4,
|
||||||
RB_OUT_SPEC = 5,
|
RB_OUT_SPEC = 5,
|
||||||
RB_TOWN_SPEC = 6,
|
RB_TOWN_SPEC = 6,
|
||||||
|
@@ -22,6 +22,10 @@ const int TER_RECT_UL_Y = 19;
|
|||||||
const int UI_LAYER_DEFAULT = 1000;
|
const int UI_LAYER_DEFAULT = 1000;
|
||||||
const int UI_LAYER_MENUBAR = 1200;
|
const int UI_LAYER_MENUBAR = 1200;
|
||||||
|
|
||||||
|
// When editing types, several more rows can fit because the tool palette isn't there
|
||||||
|
const int TYPE_ROWS_DRAWING = 16;
|
||||||
|
const int TYPE_ROWS_EDITING = 23;
|
||||||
|
|
||||||
enum eScenMode {
|
enum eScenMode {
|
||||||
MODE_DRAWING = 0,
|
MODE_DRAWING = 0,
|
||||||
MODE_TOGGLE_ROAD = 1,
|
MODE_TOGGLE_ROAD = 1,
|
||||||
|
@@ -83,12 +83,13 @@ extern rectangle palette_buttons[10][6];
|
|||||||
extern ePalBtn town_buttons[6][10], out_buttons[6][10];
|
extern ePalBtn town_buttons[6][10], out_buttons[6][10];
|
||||||
rectangle palette_button_base = {0,0,18,26};
|
rectangle palette_button_base = {0,0,18,26};
|
||||||
rectangle terrain_buttons_rect = {0,0,410,294};
|
rectangle terrain_buttons_rect = {0,0,410,294};
|
||||||
|
rectangle terrain_buttons_rect_editing = {0,0,610,294};
|
||||||
extern rectangle left_buttons[NLS][2]; // 0 - whole, 1 - blue button
|
extern rectangle left_buttons[NLS][2]; // 0 - whole, 1 - blue button
|
||||||
rectangle left_button_base = {5,5,21,280};
|
rectangle left_button_base = {5,5,21,280};
|
||||||
rectangle right_button_base = {RIGHT_AREA_UL_Y,RIGHT_AREA_UL_X,17,RIGHT_AREA_UL_Y};
|
rectangle right_button_base = {RIGHT_AREA_UL_Y,RIGHT_AREA_UL_X,17,RIGHT_AREA_UL_Y};
|
||||||
rectangle terrain_rect = {0,0,340,272};
|
rectangle terrain_rect = {0,0,340,272};
|
||||||
std::string current_string[2];
|
std::string current_string[2];
|
||||||
extern rectangle terrain_rects[256];
|
extern rectangle terrain_rects[16*TYPE_ROWS_EDITING];
|
||||||
|
|
||||||
unsigned char small_what_drawn[64][64];
|
unsigned char small_what_drawn[64][64];
|
||||||
extern bool small_any_drawn;
|
extern bool small_any_drawn;
|
||||||
@@ -331,6 +332,7 @@ static std::vector<short> get_small_icons(location at, ter_num_t t_to_draw) {
|
|||||||
void Set_up_win() {
|
void Set_up_win() {
|
||||||
terrain_rect.offset(TER_RECT_UL_X, TER_RECT_UL_Y);
|
terrain_rect.offset(TER_RECT_UL_X, TER_RECT_UL_Y);
|
||||||
terrain_buttons_rect.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y);
|
terrain_buttons_rect.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y);
|
||||||
|
terrain_buttons_rect_editing.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y);
|
||||||
palette_button_base.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y);
|
palette_button_base.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y);
|
||||||
|
|
||||||
for(short i = 0; i < 10; i++)
|
for(short i = 0; i < 10; i++)
|
||||||
@@ -442,7 +444,7 @@ void draw_main_screen() {
|
|||||||
// draw terrain palette
|
// draw terrain palette
|
||||||
if((overall_mode < MODE_MAIN_SCREEN) || (overall_mode == MODE_EDIT_TYPES)) {
|
if((overall_mode < MODE_MAIN_SCREEN) || (overall_mode == MODE_EDIT_TYPES)) {
|
||||||
place_location();
|
place_location();
|
||||||
set_up_terrain_buttons(false);
|
set_up_type_buttons(false);
|
||||||
TextStyle style;
|
TextStyle style;
|
||||||
win_draw_string(mainPtr(), search_field_text_rect, "Search:", eTextMode::WRAP, style);
|
win_draw_string(mainPtr(), search_field_text_rect, "Search:", eTextMode::WRAP, style);
|
||||||
palette_search_field->show();
|
palette_search_field->show();
|
||||||
@@ -528,27 +530,33 @@ void draw_rb_slot (short which,short mode) {
|
|||||||
win_draw_string(mainPtr(),text_rect,right_button_status[which].label,eTextMode::LEFT_TOP,style);
|
win_draw_string(mainPtr(),text_rect,right_button_status[which].label,eTextMode::LEFT_TOP,style);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_up_terrain_buttons(bool reset) {
|
void set_up_type_buttons(bool reset) {
|
||||||
short pic,small_i;
|
short pic,small_i;
|
||||||
rectangle ter_from,ter_from_base = {0,0,36,28}, ter_plus_from = {148,235,164,251};
|
rectangle ter_from,ter_from_base = {0,0,36,28}, ter_plus_from = {148,235,164,251};
|
||||||
rectangle tiny_from,tiny_to;
|
rectangle tiny_from,tiny_to;
|
||||||
|
|
||||||
rectangle palette_from,palette_to = palette_button_base;
|
rectangle palette_from,palette_to = palette_button_base;
|
||||||
int max;
|
int max;
|
||||||
|
int rows = TYPE_ROWS_DRAWING;
|
||||||
switch(draw_mode) {
|
switch(draw_mode) {
|
||||||
case DRAW_TERRAIN: max = scenario.ter_types.size(); break;
|
case DRAW_TERRAIN: max = scenario.ter_types.size(); break;
|
||||||
case DRAW_ITEM: max = scenario.scen_items.size(); break;
|
case DRAW_ITEM: max = scenario.scen_items.size(); break;
|
||||||
case DRAW_MONST: max = scenario.scen_monsters.size(); max--; break;
|
case DRAW_MONST: max = scenario.scen_monsters.size(); max--; break; // I think this is because monsters have no number 0
|
||||||
default: return;
|
default: return;
|
||||||
}
|
}
|
||||||
if(overall_mode == MODE_EDIT_TYPES) max++;
|
if(overall_mode == MODE_EDIT_TYPES){
|
||||||
|
max++; // The plus button
|
||||||
|
rows = TYPE_ROWS_EDITING;
|
||||||
|
}
|
||||||
|
|
||||||
if(reset) pal_sbar->setPosition(0);
|
if(reset) pal_sbar->setPosition(0);
|
||||||
pal_sbar->setMaximum((max - 241) / 16);
|
|
||||||
|
int rows_overflow = ceil(max / 16.0) - rows;
|
||||||
|
pal_sbar->setMaximum(rows_overflow);
|
||||||
|
|
||||||
int first = pal_sbar->getPosition() * 16;
|
int first = pal_sbar->getPosition() * 16;
|
||||||
if(draw_mode == DRAW_MONST) first++, max++;
|
if(draw_mode == DRAW_MONST) first++, max++; // Monsters have no number 0
|
||||||
int end = min(first + 256, max);
|
int end = min(first + 16 * rows, max);
|
||||||
|
|
||||||
std::string search_query = palette_search_field->getText();
|
std::string search_query = palette_search_field->getText();
|
||||||
boost::algorithm::to_lower(search_query);
|
boost::algorithm::to_lower(search_query);
|
||||||
@@ -566,6 +574,7 @@ void set_up_terrain_buttons(bool reset) {
|
|||||||
draw_rect.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y);
|
draw_rect.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y);
|
||||||
switch(draw_mode){
|
switch(draw_mode){
|
||||||
case DRAW_TERRAIN:{
|
case DRAW_TERRAIN:{
|
||||||
|
// Plus button
|
||||||
if(i == scenario.ter_types.size()) {
|
if(i == scenario.ter_types.size()) {
|
||||||
rect_draw_some_item(editor_mixed, ter_plus_from, mainPtr(), draw_rect);
|
rect_draw_some_item(editor_mixed, ter_plus_from, mainPtr(), draw_rect);
|
||||||
break;
|
break;
|
||||||
@@ -609,6 +618,11 @@ void set_up_terrain_buttons(bool reset) {
|
|||||||
rect_draw_some_item(editor_mixed, tiny_from, mainPtr(), tiny_to, sf::BlendAlpha, colour);
|
rect_draw_some_item(editor_mixed, tiny_from, mainPtr(), tiny_to, sf::BlendAlpha, colour);
|
||||||
}break;
|
}break;
|
||||||
case DRAW_MONST:{
|
case DRAW_MONST:{
|
||||||
|
// Plus button
|
||||||
|
if(i == scenario.scen_monsters.size()) {
|
||||||
|
rect_draw_some_item(editor_mixed, ter_plus_from, mainPtr(), draw_rect);
|
||||||
|
break;
|
||||||
|
}
|
||||||
const cMonster& monst = scenario.scen_monsters[i];
|
const cMonster& monst = scenario.scen_monsters[i];
|
||||||
|
|
||||||
std::string name = monst.m_name;
|
std::string name = monst.m_name;
|
||||||
@@ -718,6 +732,11 @@ void set_up_terrain_buttons(bool reset) {
|
|||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
case DRAW_ITEM:{
|
case DRAW_ITEM:{
|
||||||
|
// Plus button
|
||||||
|
if(i == scenario.scen_items.size()) {
|
||||||
|
rect_draw_some_item(editor_mixed, ter_plus_from, mainPtr(), draw_rect);
|
||||||
|
break;
|
||||||
|
}
|
||||||
const cItem& item = scenario.scen_items[i];
|
const cItem& item = scenario.scen_items[i];
|
||||||
pic = item.graphic_num;
|
pic = item.graphic_num;
|
||||||
|
|
||||||
@@ -1421,16 +1440,23 @@ void place_location() {
|
|||||||
frame_rect(mainPtr(), terrain_buttons_rect, sf::Color::Black);
|
frame_rect(mainPtr(), terrain_buttons_rect, sf::Color::Black);
|
||||||
location mouse = translate_mouse_coordinates(sf::Mouse::getPosition(mainPtr()));
|
location mouse = translate_mouse_coordinates(sf::Mouse::getPosition(mainPtr()));
|
||||||
|
|
||||||
location moveTo(5, terrain_rects[255].top + 18);
|
location moveTo(5, terrain_rects[16 * TYPE_ROWS_DRAWING - 1].top + 18);
|
||||||
|
if(overall_mode == MODE_EDIT_TYPES) moveTo.y = terrain_rects[16 * TYPE_ROWS_EDITING -1].top + 18;
|
||||||
draw_rect = text_rect;
|
draw_rect = text_rect;
|
||||||
draw_rect.offset(moveTo);
|
draw_rect.offset(moveTo);
|
||||||
if(overall_mode < MODE_MAIN_SCREEN) {
|
// Drawing modes and type editing mode, show tooltips for the type buttons
|
||||||
// std::cout << "Mouse: " << mouse << " Buttons: " << terrain_buttons_rect << " Terrain: " << terrain_rect << std::endl;
|
if(overall_mode < MODE_MAIN_SCREEN || overall_mode == MODE_EDIT_TYPES) {
|
||||||
if(mouse.in(terrain_buttons_rect)) {
|
rectangle buttons_rect = terrain_buttons_rect;
|
||||||
|
int rows = TYPE_ROWS_DRAWING;
|
||||||
|
if(overall_mode == MODE_EDIT_TYPES){
|
||||||
|
buttons_rect = terrain_buttons_rect_editing;
|
||||||
|
rows = TYPE_ROWS_EDITING;
|
||||||
|
}
|
||||||
|
if(mouse.in(buttons_rect)) {
|
||||||
location rel_mouse = mouse;
|
location rel_mouse = mouse;
|
||||||
rel_mouse.x -= RIGHT_AREA_UL_X;
|
rel_mouse.x -= RIGHT_AREA_UL_X;
|
||||||
rel_mouse.y -= RIGHT_AREA_UL_Y;
|
rel_mouse.y -= RIGHT_AREA_UL_Y;
|
||||||
for(int i = 0; i < 256; i++) {
|
for(int i = 0; i < 16 * rows; i++) {
|
||||||
if(rel_mouse.in(terrain_rects[i])) {
|
if(rel_mouse.in(terrain_rects[i])) {
|
||||||
int first = pal_sbar->getPosition() * 16;
|
int first = pal_sbar->getPosition() * 16;
|
||||||
switch(draw_mode) {
|
switch(draw_mode) {
|
||||||
@@ -1452,26 +1478,35 @@ void place_location() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(mouse.in(terrain_rect) && mouse_spot.x >= 0)
|
}
|
||||||
|
}
|
||||||
|
// Edit types, when none are hovered
|
||||||
|
if(sout.str().empty() && overall_mode == MODE_EDIT_TYPES){
|
||||||
|
moveTo.y += 13;
|
||||||
|
std::string type = "terrain";
|
||||||
|
if(draw_mode == DRAW_MONST) type = "monster";
|
||||||
|
else if(draw_mode == DRAW_ITEM) type = "item";
|
||||||
|
sout << "Click " << type << " to edit.";
|
||||||
|
}
|
||||||
|
// Modes showing the terrain map, show the highlighted spot coords or screen center coords
|
||||||
|
if(sout.str().empty() && mouse.in(terrain_rect) && mouse_spot.x >= 0)
|
||||||
sout << "Under mouse: x = " << (cen_x - 4 + mouse_spot.x)
|
sout << "Under mouse: x = " << (cen_x - 4 + mouse_spot.x)
|
||||||
<< ", y = " << (cen_y - 4 + mouse_spot.y);
|
<< ", y = " << (cen_y - 4 + mouse_spot.y);
|
||||||
if(sout.str().empty())
|
if(sout.str().empty())
|
||||||
sout << "Center: x = " << cen_x << ", y = " << cen_y;
|
sout << "Center: x = " << cen_x << ", y = " << cen_y;
|
||||||
} else {
|
|
||||||
moveTo.y += 13; // TODO: Not sure how important this is.
|
|
||||||
sout << "Click terrain to edit. ";
|
|
||||||
}
|
|
||||||
TextStyle style;
|
TextStyle style;
|
||||||
style.lineHeight = 12;
|
style.lineHeight = 12;
|
||||||
win_draw_string(mainPtr(), draw_rect, sout.str(), eTextMode::LEFT_TOP, style);
|
win_draw_string(mainPtr(), draw_rect, sout.str(), eTextMode::LEFT_TOP, style);
|
||||||
clear_sstr(sout);
|
clear_sstr(sout);
|
||||||
|
|
||||||
|
if(overall_mode != MODE_EDIT_TYPES){
|
||||||
moveTo = location(260, terrain_rects[255].top + 18);
|
moveTo = location(260, terrain_rects[255].top + 18);
|
||||||
draw_rect = text_rect;
|
draw_rect = text_rect;
|
||||||
draw_rect.offset(moveTo);
|
draw_rect.offset(moveTo);
|
||||||
sout << current_terrain_type;
|
sout << current_terrain_type;
|
||||||
win_draw_string(mainPtr(), draw_rect, sout.str(), eTextMode::LEFT_TOP, style);
|
win_draw_string(mainPtr(), draw_rect, sout.str(), eTextMode::LEFT_TOP, style);
|
||||||
clear_sstr(sout);
|
clear_sstr(sout);
|
||||||
|
}
|
||||||
|
|
||||||
if(overall_mode < MODE_MAIN_SCREEN) {
|
if(overall_mode < MODE_MAIN_SCREEN) {
|
||||||
moveTo = location(5,terrain_rects[255].bottom + 121);
|
moveTo = location(5,terrain_rects[255].bottom + 121);
|
||||||
|
@@ -12,7 +12,7 @@ void draw_lb();
|
|||||||
void draw_lb_slot (short which,short mode) ;
|
void draw_lb_slot (short which,short mode) ;
|
||||||
void draw_rb();
|
void draw_rb();
|
||||||
void draw_rb_slot (short which,short mode) ;
|
void draw_rb_slot (short which,short mode) ;
|
||||||
void set_up_terrain_buttons(bool reset);
|
void set_up_type_buttons(bool reset);
|
||||||
rectangle visible_bounds();
|
rectangle visible_bounds();
|
||||||
void draw_terrain();
|
void draw_terrain();
|
||||||
void draw_monsts();
|
void draw_monsts();
|
||||||
|
@@ -110,6 +110,38 @@ bool aCreateDeleteTerrain::redo_me() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool aCreateDeleteMonster::undo_me() {
|
||||||
|
// TODO if not in MODE_EDIT_TYPES, show it
|
||||||
|
for(cMonster monst : monsters){
|
||||||
|
scenario.scen_monsters.pop_back();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool aCreateDeleteMonster::redo_me() {
|
||||||
|
// TODO if not in MODE_EDIT_TYPES, show it
|
||||||
|
for(cMonster monst : monsters){
|
||||||
|
scenario.scen_monsters.push_back(monst);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool aCreateDeleteItem::undo_me() {
|
||||||
|
// TODO if not in MODE_EDIT_TYPES, show it
|
||||||
|
for(cItem item : items){
|
||||||
|
scenario.scen_items.pop_back();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool aCreateDeleteItem::redo_me() {
|
||||||
|
// TODO if not in MODE_EDIT_TYPES, show it
|
||||||
|
for(cItem item : items){
|
||||||
|
scenario.scen_items.push_back(item);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool aDrawTerrain::undo_me() {
|
bool aDrawTerrain::undo_me() {
|
||||||
cArea* cur_area = get_current_area();
|
cArea* cur_area = get_current_area();
|
||||||
for(auto change : changes){
|
for(auto change : changes){
|
||||||
|
@@ -5,6 +5,8 @@
|
|||||||
#include "tools/undo.hpp"
|
#include "tools/undo.hpp"
|
||||||
#include "scenario/town.hpp"
|
#include "scenario/town.hpp"
|
||||||
#include "scenario/scenario.hpp"
|
#include "scenario/scenario.hpp"
|
||||||
|
#include "scenario/item.hpp"
|
||||||
|
#include "scenario/monster.hpp"
|
||||||
|
|
||||||
extern cScenario scenario;
|
extern cScenario scenario;
|
||||||
|
|
||||||
@@ -25,6 +27,8 @@ typedef std::map<location,ter_change_t,loc_compare> stroke_ter_changes_t;
|
|||||||
typedef std::map<size_t, cTown::cItem> item_changes_t;
|
typedef std::map<size_t, cTown::cItem> item_changes_t;
|
||||||
typedef std::map<size_t, cTownperson> creature_changes_t;
|
typedef std::map<size_t, cTownperson> creature_changes_t;
|
||||||
typedef std::vector<cTerrain> terrain_type_changes_t;
|
typedef std::vector<cTerrain> terrain_type_changes_t;
|
||||||
|
typedef std::vector<cMonster> monst_type_changes_t;
|
||||||
|
typedef std::vector<class cItem> item_type_changes_t;
|
||||||
|
|
||||||
// Action that modified something in town or outdoor terrain, so we should show the modified area when undoing or redoing
|
// Action that modified something in town or outdoor terrain, so we should show the modified area when undoing or redoing
|
||||||
class cTerrainAction : public cAction {
|
class cTerrainAction : public cAction {
|
||||||
@@ -112,5 +116,32 @@ public:
|
|||||||
terrains(terrains) {}
|
terrains(terrains) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Action which adds new monster type(s) to the end of the list, or deletes from the end of the list
|
||||||
|
class aCreateDeleteMonster : public cAction {
|
||||||
|
monst_type_changes_t monsters;
|
||||||
|
bool undo_me() override;
|
||||||
|
bool redo_me() override;
|
||||||
|
public:
|
||||||
|
aCreateDeleteMonster(bool create, cMonster monst) :
|
||||||
|
cAction(create ? "Create Monster Type" : "Delete Monster Type", !create),
|
||||||
|
monsters({monst}) {}
|
||||||
|
aCreateDeleteMonster(monst_type_changes_t monsts) :
|
||||||
|
cAction("Create Monster Types", false),
|
||||||
|
monsters(monsts) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Action which adds new item type(s) to the end of the list, or deletes from the end of the list
|
||||||
|
class aCreateDeleteItem : public cAction {
|
||||||
|
item_type_changes_t items;
|
||||||
|
bool undo_me() override;
|
||||||
|
bool redo_me() override;
|
||||||
|
public:
|
||||||
|
aCreateDeleteItem(bool create, class cItem item) :
|
||||||
|
cAction(create ? "Create Item Type" : "Delete Item Type", !create),
|
||||||
|
items({item}) {}
|
||||||
|
aCreateDeleteItem(item_type_changes_t items) :
|
||||||
|
cAction("Create Item Types", false),
|
||||||
|
items(items) {}
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
Reference in New Issue
Block a user