From e4d220799eac7fbcf02ad616fa7ce6ff74443141 Mon Sep 17 00:00:00 2001 From: ALONSO Laurent Date: Sun, 17 Oct 2021 16:23:06 +0200 Subject: [PATCH] graphics: add a picture to store/show some errors, Scene Editor: try to do not end with a fatal errors if a terrain's picture or map picture does not exist, to be improved... --- rsrc/graphics/CREDITS.md | 1 + rsrc/graphics/errors.png | Bin 0 -> 4698 bytes src/gfx/gfxsheets.cpp | 4 ++-- src/gfx/texture.hpp | 1 + src/scenario/terrain.cpp | 8 ++++---- src/scenedit/scen.core.cpp | 35 +++++++++++++++++++++++++++------ src/scenedit/scen.graphics.cpp | 25 +++++++++++++++++------ 7 files changed, 56 insertions(+), 18 deletions(-) create mode 100644 rsrc/graphics/errors.png diff --git a/rsrc/graphics/CREDITS.md b/rsrc/graphics/CREDITS.md index 5575c7e4..38110992 100644 --- a/rsrc/graphics/CREDITS.md +++ b/rsrc/graphics/CREDITS.md @@ -20,6 +20,7 @@ though in some cases rearranged a little: - dlogbtnsm.png - dlogbtntall.png - dlogpics.png +- errors.png ( "Under Construction Grunge Sign" by Free Grunge Textures - www.freestock.ca is licensed under CC BY 2.0 ) - edsplash.png (by James Ernest) - fighthelp.png - invenbtns.png (the coin was cropped from an item graphic) diff --git a/rsrc/graphics/errors.png b/rsrc/graphics/errors.png new file mode 100644 index 0000000000000000000000000000000000000000..fa5d2faf1d6d95b1ab7a80db6e8e161093a77ad1 GIT binary patch literal 4698 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 literal 0 HcmV?d00001 diff --git a/src/gfx/gfxsheets.cpp b/src/gfx/gfxsheets.cpp index 46ceb14e..c80be3a2 100644 --- a/src/gfx/gfxsheets.cpp +++ b/src/gfx/gfxsheets.cpp @@ -29,8 +29,8 @@ Texture_pos cCustomGraphics::find_graphic(pic_num_t which_rect, bool party) { else if(numSheets == 0) valid = false; if(!valid) { INVALID: - auto const &blank = *ResMgr::textures.get("blank", true); - return std::make_pair(blank, rectangle(0,0,36,28)); + auto const &error = *ResMgr::textures.get("errors", true); + return std::make_pair(error, rectangle(0,0,40,40)); } short sheet = which_rect / 100; if(is_old || party) sheet = 0; diff --git a/src/gfx/texture.hpp b/src/gfx/texture.hpp index 4b8d91f3..d9a845fe 100644 --- a/src/gfx/texture.hpp +++ b/src/gfx/texture.hpp @@ -78,6 +78,7 @@ struct Texture { { "dlogscrollwh", {64,64} }, { "edbuttons", {251,164} }, { "edsplash", {640,480} }, + { "errors", {40,40} }, { "fields", {224,144} }, { "fighthelp", {320,125} }, { "icon", {38,38} }, diff --git a/src/scenario/terrain.cpp b/src/scenario/terrain.cpp index d1996b9a..e8a81f64 100644 --- a/src/scenario/terrain.cpp +++ b/src/scenario/terrain.cpp @@ -438,10 +438,10 @@ cPictNum cTerrain::get_map_picture_num() const { if (map_pic<0) return get_picture_num(); - if (map_pic<1000) - return cPictNum(map_pic+(map_pic<960 ? 0 : 400-960),PIC_TER_MAP); + if (map_pic < 1000) + return cPictNum(map_pic,PIC_TER_MAP); if(map_pic < 2000) - return cPictNum(map_pic-1000,PIC_CUSTOM_TER); - return cPictNum(map_pic-2000,PIC_CUSTOM_TER_ANIM); + return cPictNum(map_pic-1000,PIC_CUSTOM_TER_MAP); + return cPictNum(map_pic-2000,PIC_CUSTOM_TER_MAP); // checkme add force PIC_TER_MAP? } diff --git a/src/scenedit/scen.core.cpp b/src/scenedit/scen.core.cpp index 07e10c6c..f63a6b18 100644 --- a/src/scenedit/scen.core.cpp +++ b/src/scenedit/scen.core.cpp @@ -353,15 +353,38 @@ static void fill_ter_info(cDialog& me, short ter){ cTerrain& ter_type = scenario.ter_types[ter]; { cPict& pic_ctrl = dynamic_cast(me["graphic"]); - pic_ctrl.setPict(ter_type.get_picture_num()); + bool bad=false; + if (ter_type.get_picture_num().type==ePicType::PIC_TER) { + // REMOVEME when setPict will not do fatal error + try { + *ResMgr::textures.get("ter" + std::to_string(1 + ter_type.get_picture_num().num / 50)); + } + catch(...) { + bad=true; + } + } + if (!bad) + pic_ctrl.setPict(ter_type.get_picture_num()); + else + pic_ctrl.setPict(cPictNum(1999,ePicType::PIC_CUSTOM_TER)); me["pict"].setTextToNum(ter_type.picture); }{ cPict& pic_ctrl = dynamic_cast(me["seemap"]); - pic_num_t pic = ter_type.map_pic; - if(pic < 1000) - pic_ctrl.setPict(pic, PIC_TER_MAP); - else pic_ctrl.setPict(pic, PIC_CUSTOM_TER_MAP); - me["map"].setTextToNum(pic); + bool bad=false; + if (ter_type.get_map_picture_num().type==ePicType::PIC_TER) { + // REMOVEME when setPict will not do fatal error + try { + *ResMgr::textures.get("ter" + std::to_string(1 + ter_type.get_map_picture_num().num / 50)); + } + catch(...) { + bad=true; + } + } + if (!bad) // FIXME the picture size is bad if we revert to the main picture + pic_ctrl.setPict(ter_type.get_map_picture_num()); + else + pic_ctrl.setPict(cPictNum(1999,ePicType::PIC_CUSTOM_TER)); + me["map"].setTextToNum(ter_type.map_pic); } me["number"].setTextToNum(ter); me["name"].setText(ter_type.name); diff --git a/src/scenedit/scen.graphics.cpp b/src/scenedit/scen.graphics.cpp index b4a4abc8..c82fc2d0 100644 --- a/src/scenedit/scen.graphics.cpp +++ b/src/scenedit/scen.graphics.cpp @@ -318,7 +318,7 @@ static std::vector get_small_icons(location at, ter_num_t t_to_draw) { } static bool get_terrain_picture(cPictNum pict, Texture &source, rectangle &from_rect) -{ +try { source=Texture(); ePicType type=pict.type; if (pict.num<0) @@ -336,8 +336,14 @@ static bool get_terrain_picture(cPictNum pict, Texture &source, rectangle &from_ break; case ePicType::PIC_TER_MAP: source=*ResMgr::textures.get("termap"); - from_rect.left = 12*(pict.num%20); - from_rect.top = 12*(pict.num/20); + if (pict.num<960) { + from_rect.left = 12*(pict.num%20); + from_rect.top = 12*(pict.num/20); + } + else { + from_rect.left = 12*20; + from_rect.top = 12*(pict.num-960); + } from_rect.right = from_rect.left+12; from_rect.bottom = from_rect.top+12; break; @@ -350,10 +356,17 @@ static bool get_terrain_picture(cPictNum pict, Texture &source, rectangle &from_ default: break; } - if (bool(source)) - return true; + if (!source) + throw "can not find image"; + return true; +} +catch (...) { + if (pict.num==-1) // ok no picture + return false; std::cerr << "Error[get_terrain_picture]: can not find picture id=" << pict.num << "type=" << int(pict.type)<< "\n"; - return false; + source = *ResMgr::textures.get("errors"); + from_rect={0,0,40,40}; + return true; } void Set_up_win() {