From b0717b8608f490d2c34b9c61933aeabe6d8d6e08 Mon Sep 17 00:00:00 2001 From: ALONSO Laurent Date: Sun, 21 Nov 2021 14:49:53 +0100 Subject: [PATCH] scenario/special.cpp[terrain]: try to take in account special terrains, gfxsheets: fix a rare problem with party's sheet. --- src/gfx/gfxsheets.cpp | 13 +++++-- src/scenario/special.cpp | 79 +++++++++++++++++++++++----------------- 2 files changed, 54 insertions(+), 38 deletions(-) diff --git a/src/gfx/gfxsheets.cpp b/src/gfx/gfxsheets.cpp index 836b157e..cf1ccf56 100644 --- a/src/gfx/gfxsheets.cpp +++ b/src/gfx/gfxsheets.cpp @@ -23,10 +23,15 @@ rectangle calc_rect(short i, short j){ Texture_pos cCustomGraphics::find_graphic(pic_num_t which_rect, bool party) { bool valid = true; - if(party && !party_sheet) valid = false; - else if(!party && !is_old && (which_rect / 100) >= numSheets) - valid = false; - else if(numSheets == 0) valid = false; + if(party) { + valid = bool(party_sheet); + } + else { + if (!is_old && (which_rect / 100) >= numSheets) + valid = false; + else if(is_old && numSheets == 0) + valid = false; + } if(!valid) { INVALID: auto const &error = *ResMgr::textures.get("errors", true); diff --git a/src/scenario/special.cpp b/src/scenario/special.cpp index ddfa2144..bba4cdc9 100644 --- a/src/scenario/special.cpp +++ b/src/scenario/special.cpp @@ -83,20 +83,52 @@ static cPictNum port_graphic_num(int pic) { */ if (pic<0) return cPictNum(pic, PIC_NONE); - if (pic<400) + if (pic>3000) pic-=3000; // suppress drawing a frame around the graphic + if (pic<300) { + switch(pic) { + case 247: pic = 210; break; + case 248: pic = 211; break; + case 249: pic = 212; break; + case 250: pic = 213; break; + case 202: pic = 0; break; + case 203: pic = 2; break; + case 204: pic = 32; break; + case 207: pic = 0; break; + case 208: pic = 123; break; + case 209: pic = 210; break; + case 210: pic = 163; break; + case 211: pic = 2; break; + case 212: pic = 32; break; + case 218: case 219: case 220: case 221: + case 222: case 223: case 224: case 225: + case 215: pic = 216; break; + case 233: pic = 137; break; + case 213: pic = 214; break; + case 214: pic = 215; break; + case 246: pic = 209; break; + case 251: pic = 207; break; + case 252: pic = 208; break; + } return cPictNum(pic, PIC_TER); + } + if (pic<400) + return cPictNum(pic-300, PIC_TER_ANIM); if (pic<700) return cPictNum(pic-400,PIC_MONST); - if (pic<900) + if (pic<800) return cPictNum(pic-700, PIC_DLOG); + if (pic<900) + return cPictNum(pic-800, PIC_PC); if (pic<1000)// ARGH: normally bwpats, force an error picture return cPictNum(800, PIC_TER); - if (pic < 1100) - return cPictNum(pic-1000, PIC_TALK); - if (pic < 1200) - return cPictNum(pic-1100, PIC_ITEM); - if (pic < 1300) - return cPictNum(pic-1200, PIC_PC); +#if 0 + if (pic == 1100 || pic==1200 || pic==1300 || (pic>=1400 && pic<=1402)) // maybe, but the picture's size will be bad and hide the message... + return cPictNum(pic, PIC_FULL); +#endif + if (pic<2000)// ARGH: unsure 1600-? again terrain, force an error picture + return cPictNum(800, PIC_TER); + if (pic<2400) + return cPictNum(pic-2000, PIC_CUSTOM_TER); // ARGH: not implemented, force an error picture return cPictNum(800, PIC_TER); } @@ -253,34 +285,12 @@ void cSpecial::import_legacy(legacy::special_node_type const &old){ ex2a = 9; break; } - case 56: case 59: case 188: // Large dialogs with terrain graphics - pictype = PIC_TER; + case 56: case 59: case 188: { // Large dialogs with terrain graphics + cPictNum picTyp=port_graphic_num(pic); + pic=picTyp.num; + pictype=picTyp.type; m3 = m2; m2 = -1; - switch(pic) { - case 247: pic = 210; break; - case 248: pic = 211; break; - case 249: pic = 212; break; - case 250: pic = 213; break; - case 202: pic = 0; break; - case 203: pic = 2; break; - case 204: pic = 32; break; - case 207: pic = 0; break; - case 208: pic = 123; break; - case 209: pic = 210; break; - case 210: pic = 163; break; - case 211: pic = 2; break; - case 212: pic = 32; break; - case 218: case 219: case 220: case 221: - case 222: case 223: case 224: case 225: - case 215: pic = 216; break; - case 233: pic = 137; break; - case 213: pic = 214; break; - case 214: pic = 215; break; - case 246: pic = 209; break; - case 251: pic = 207; break; - case 252: pic = 208; break; - } if(old.type == 56) type = eSpecType::ONCE_DIALOG; else if(old.type == 59) type = eSpecType::ONCE_GIVE_ITEM_DIALOG; else type = eSpecType::TOWN_LEVER; @@ -291,6 +301,7 @@ void cSpecial::import_legacy(legacy::special_node_type const &old){ if(old.ex2a == 20) ex2a = 9; break; + } // TODO: Originally the block nodes supported messages; the new version doesn't. // (Will probably need to make special nodes a dynamic vector before fixing this.) case 7: case 8: case 9: case 10: // out, town, combat, look block