Expose the shared pointer instead of the raw pointer in the resource manager and rewrite the custom sheets list to use a vector instead of manual memory management

In particular, this should fix a segmentation fault in the sound system caused by the resource manager pulling a resource that's in use.
This commit is contained in:
2020-01-26 15:10:57 -05:00
parent 2d1ee24473
commit 14e2597108
17 changed files with 142 additions and 139 deletions

View File

@@ -632,7 +632,7 @@ void cPict::recalcRect() {
setBounds(bounds); setBounds(bounds);
} }
const sf::Texture* cPict::getSheet(eSheetType type, size_t n) { std::shared_ptr<const sf::Texture> cPict::getSheet(eSheetType type, size_t n) {
std::ostringstream sout; std::ostringstream sout;
switch(type) { switch(type) {
case NUM_SHEET_TYPES: case NUM_SHEET_TYPES:
@@ -734,7 +734,7 @@ void cPict::draw(){
} }
void cPict::drawPresetTer(short num, rectangle to_rect){ void cPict::drawPresetTer(short num, rectangle to_rect){
const sf::Texture* from_gw = getSheet(SHEET_TER, num / 50); auto from_gw = getSheet(SHEET_TER, num / 50);
if(!from_gw) return; if(!from_gw) return;
num = num % 50; num = num % 50;
rectangle from_rect = calc_rect(num % 10, num / 10); rectangle from_rect = calc_rect(num % 10, num / 10);
@@ -745,7 +745,7 @@ void cPict::drawPresetTer(short num, rectangle to_rect){
void cPict::drawPresetTerAnim(short num, rectangle to_rect){ void cPict::drawPresetTerAnim(short num, rectangle to_rect){
rectangle from_rect = calc_rect(4 * (num / 5) + animFrame % 4, num % 5); rectangle from_rect = calc_rect(4 * (num / 5) + animFrame % 4, num % 5);
const sf::Texture* from_gw = getSheet(SHEET_TER_ANIM); auto from_gw = getSheet(SHEET_TER_ANIM);
if(to_rect.right - to_rect.left > 28) { if(to_rect.right - to_rect.left > 28) {
to_rect.inset(4,0); to_rect.inset(4,0);
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
@@ -771,7 +771,7 @@ static rectangle calcDefMonstRect(short i, short animFrame){
void cPict::drawPresetMonstSm(short num, rectangle to_rect){ void cPict::drawPresetMonstSm(short num, rectangle to_rect){
short m_start_pic = m_pic_index[num].i; short m_start_pic = m_pic_index[num].i;
const sf::Texture* from_gw = getSheet(SHEET_MONST, m_start_pic / 20); auto from_gw = getSheet(SHEET_MONST, m_start_pic / 20);
if(!from_gw) return; if(!from_gw) return;
m_start_pic = m_start_pic % 20; m_start_pic = m_start_pic % 20;
rectangle from_rect = calcDefMonstRect(m_start_pic, animFrame); rectangle from_rect = calcDefMonstRect(m_start_pic, animFrame);
@@ -787,7 +787,7 @@ void cPict::drawPresetMonstWide(short num, rectangle to_rect){
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
short m_start_pic = m_pic_index[num].i; short m_start_pic = m_pic_index[num].i;
const sf::Texture* from_gw = getSheet(SHEET_MONST, m_start_pic / 20); auto from_gw = getSheet(SHEET_MONST, m_start_pic / 20);
if(!from_gw) return; if(!from_gw) return;
rectangle from_rect = calcDefMonstRect(m_start_pic % 20, animFrame); rectangle from_rect = calcDefMonstRect(m_start_pic % 20, animFrame);
small_monst_rect.offset(to_rect.left,to_rect.top + 7); small_monst_rect.offset(to_rect.left,to_rect.top + 7);
@@ -808,7 +808,7 @@ void cPict::drawPresetMonstTall(short num, rectangle to_rect){
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
short m_start_pic = m_pic_index[num].i; short m_start_pic = m_pic_index[num].i;
const sf::Texture* from_gw = getSheet(SHEET_MONST, m_start_pic / 20); auto from_gw = getSheet(SHEET_MONST, m_start_pic / 20);
if(!from_gw) return; if(!from_gw) return;
rectangle from_rect = calcDefMonstRect(m_start_pic % 20, animFrame); rectangle from_rect = calcDefMonstRect(m_start_pic % 20, animFrame);
small_monst_rect.offset(to_rect.left + 7,to_rect.top); small_monst_rect.offset(to_rect.left + 7,to_rect.top);
@@ -829,7 +829,7 @@ void cPict::drawPresetMonstLg(short num, rectangle to_rect){
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
short m_start_pic = m_pic_index[num].i; short m_start_pic = m_pic_index[num].i;
const sf::Texture* from_gw = getSheet(SHEET_MONST, m_start_pic / 20); auto from_gw = getSheet(SHEET_MONST, m_start_pic / 20);
if(!from_gw) return; if(!from_gw) return;
rectangle from_rect = calcDefMonstRect(m_start_pic % 20, animFrame); rectangle from_rect = calcDefMonstRect(m_start_pic % 20, animFrame);
small_monst_rect.offset(to_rect.left,to_rect.top); small_monst_rect.offset(to_rect.left,to_rect.top);
@@ -860,7 +860,7 @@ void cPict::drawPresetMonstLg(short num, rectangle to_rect){
void cPict::drawPresetDlog(short num, rectangle to_rect){ void cPict::drawPresetDlog(short num, rectangle to_rect){
to_rect.right = to_rect.left + 36; to_rect.right = to_rect.left + 36;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
const sf::Texture* from_gw = getSheet(SHEET_DLOG); auto from_gw = getSheet(SHEET_DLOG);
rectangle from_rect = {0,0,36,36}; rectangle from_rect = {0,0,36,36};
from_rect.offset(36 * (num % 4),36 * (num / 4)); from_rect.offset(36 * (num % 4),36 * (num / 4));
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect); rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
@@ -869,7 +869,7 @@ void cPict::drawPresetDlog(short num, rectangle to_rect){
void cPict::drawPresetDlogLg(short num, rectangle to_rect){ void cPict::drawPresetDlogLg(short num, rectangle to_rect){
to_rect.right = to_rect.left + (drawScaled ? getBounds().width() : 72); to_rect.right = to_rect.left + (drawScaled ? getBounds().width() : 72);
to_rect.bottom = to_rect.top + (drawScaled ? getBounds().height() : 72); to_rect.bottom = to_rect.top + (drawScaled ? getBounds().height() : 72);
const sf::Texture* from_gw = getSheet(SHEET_DLOG); auto from_gw = getSheet(SHEET_DLOG);
rectangle from_rect = {0,0,72,72}; rectangle from_rect = {0,0,72,72};
from_rect.offset(36 * (num % 4),36 * (num / 4)); from_rect.offset(36 * (num % 4),36 * (num / 4));
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect); rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
@@ -878,14 +878,14 @@ void cPict::drawPresetDlogLg(short num, rectangle to_rect){
void cPict::drawPresetTalk(short num, rectangle to_rect){ void cPict::drawPresetTalk(short num, rectangle to_rect){
to_rect.right = to_rect.left + 32; to_rect.right = to_rect.left + 32;
to_rect.bottom = to_rect.top + 32; to_rect.bottom = to_rect.top + 32;
const sf::Texture* from_gw = getSheet(SHEET_TALK); auto from_gw = getSheet(SHEET_TALK);
rectangle from_rect = {0,0,32,32}; rectangle from_rect = {0,0,32,32};
from_rect.offset(32 * (num % 10),32 * (num / 10)); from_rect.offset(32 * (num % 10),32 * (num / 10));
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect); rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
} }
void cPict::drawPresetScen(short num, rectangle to_rect){ void cPict::drawPresetScen(short num, rectangle to_rect){
const sf::Texture* from_gw = getSheet(SHEET_SCEN); auto from_gw = getSheet(SHEET_SCEN);
rectangle from_rect = {0,0,32,32}; rectangle from_rect = {0,0,32,32};
from_rect.offset(32 * (num % 5),32 * (num / 5)); from_rect.offset(32 * (num % 5),32 * (num / 5));
to_rect.right = to_rect.left + 32; to_rect.right = to_rect.left + 32;
@@ -894,7 +894,7 @@ void cPict::drawPresetScen(short num, rectangle to_rect){
} }
void cPict::drawPresetScenLg(short num, rectangle to_rect){ void cPict::drawPresetScenLg(short num, rectangle to_rect){
const sf::Texture* from_gw = getSheet(SHEET_SCEN_LG); auto from_gw = getSheet(SHEET_SCEN_LG);
to_rect.right = to_rect.left + (drawScaled ? getBounds().width() : 64); to_rect.right = to_rect.left + (drawScaled ? getBounds().width() : 64);
to_rect.bottom = to_rect.top + (drawScaled ? getBounds().height() : 64); to_rect.bottom = to_rect.top + (drawScaled ? getBounds().height() : 64);
rectangle from_rect = {0,0,64,64}; rectangle from_rect = {0,0,64,64};
@@ -906,7 +906,7 @@ void cPict::drawPresetItem(short num, rectangle to_rect){
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
rectangle from_rect = {0,0,18,18}; rectangle from_rect = {0,0,18,18};
if(num < 55) { if(num < 55) {
from_gw = getSheet(SHEET_ITEM); from_gw = getSheet(SHEET_ITEM);
@@ -923,15 +923,14 @@ void cPict::drawPresetTinyItem(short num, rectangle to_rect){
to_rect.right = to_rect.left + 18; to_rect.right = to_rect.left + 18;
to_rect.bottom = to_rect.top + 18; to_rect.bottom = to_rect.top + 18;
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
const sf::Texture* from_gw;
rectangle from_rect = {0,0,18,18}; rectangle from_rect = {0,0,18,18};
from_gw = getSheet(SHEET_TINY_ITEM); auto from_gw = getSheet(SHEET_TINY_ITEM);
from_rect.offset(18 * (num % 10), 18 * (num / 10)); from_rect.offset(18 * (num % 10), 18 * (num / 10));
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
} }
void cPict::drawPresetPc(short num, rectangle to_rect){ void cPict::drawPresetPc(short num, rectangle to_rect){
const sf::Texture* from_gw = getSheet(SHEET_PC); auto from_gw = getSheet(SHEET_PC);
rectangle from_rect = calc_rect(2 * (num / 8), num % 8); rectangle from_rect = calc_rect(2 * (num / 8), num % 8);
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
@@ -940,7 +939,7 @@ void cPict::drawPresetPc(short num, rectangle to_rect){
} }
void cPict::drawPresetField(short num, rectangle to_rect){ void cPict::drawPresetField(short num, rectangle to_rect){
const sf::Texture* from_gw = getSheet(SHEET_FIELD); auto from_gw = getSheet(SHEET_FIELD);
rectangle from_rect = calc_rect(num % 8, num / 8); rectangle from_rect = calc_rect(num % 8, num / 8);
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
@@ -949,7 +948,7 @@ void cPict::drawPresetField(short num, rectangle to_rect){
} }
void cPict::drawPresetBoom(short num, rectangle to_rect){ void cPict::drawPresetBoom(short num, rectangle to_rect){
const sf::Texture* from_gw = getSheet(SHEET_BOOM); auto from_gw = getSheet(SHEET_BOOM);
if(num >= 8) if(num >= 8)
num = 8 * (num - 7) + animFrame % 8; num = 8 * (num - 7) + animFrame % 8;
rectangle from_rect = calc_rect(num % 8, num / 8); rectangle from_rect = calc_rect(num % 8, num / 8);
@@ -962,7 +961,7 @@ void cPict::drawPresetBoom(short num, rectangle to_rect){
void cPict::drawFullSheet(short num, rectangle to_rect){ void cPict::drawFullSheet(short num, rectangle to_rect){
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw = getSheet(SHEET_FULL, num); auto from_gw = getSheet(SHEET_FULL, num);
from_rect = rectangle(*from_gw); from_rect = rectangle(*from_gw);
if(!drawScaled) { if(!drawScaled) {
to_rect.right = to_rect.left + (from_rect.right - from_rect.left); to_rect.right = to_rect.left + (from_rect.right - from_rect.left);
@@ -973,7 +972,7 @@ void cPict::drawFullSheet(short num, rectangle to_rect){
void cPict::drawPresetMissile(short num, rectangle to_rect){ void cPict::drawPresetMissile(short num, rectangle to_rect){
rectangle from_rect = {0,0,18,18}; rectangle from_rect = {0,0,18,18};
const sf::Texture* from_gw = getSheet(SHEET_MISSILE); auto from_gw = getSheet(SHEET_MISSILE);
to_rect.right = to_rect.left + 18; to_rect.right = to_rect.left + 18;
to_rect.bottom = to_rect.top + 18; to_rect.bottom = to_rect.top + 18;
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
@@ -984,7 +983,7 @@ void cPict::drawPresetMissile(short num, rectangle to_rect){
void cPict::drawPresetTerMap(short num, rectangle to_rect){ void cPict::drawPresetTerMap(short num, rectangle to_rect){
rectangle from_rect = {0,0,12,12}; rectangle from_rect = {0,0,12,12};
const sf::Texture* from_gw = getSheet(SHEET_TER_MAP); auto from_gw = getSheet(SHEET_TER_MAP);
// TODO: Should probably fill black somewhere in here...? // TODO: Should probably fill black somewhere in here...?
to_rect.right = to_rect.left + 24; to_rect.right = to_rect.left + 24;
to_rect.bottom = to_rect.top + 24; to_rect.bottom = to_rect.top + 24;
@@ -996,7 +995,7 @@ void cPict::drawPresetTerMap(short num, rectangle to_rect){
void cPict::drawStatusIcon(short num, rectangle to_rect){ void cPict::drawStatusIcon(short num, rectangle to_rect){
rectangle from_rect = {0,0,12,12}; rectangle from_rect = {0,0,12,12};
const sf::Texture* from_gw = getSheet(SHEET_STATUS); auto from_gw = getSheet(SHEET_STATUS);
to_rect.right = to_rect.left + 12; to_rect.right = to_rect.left + 12;
to_rect.bottom = to_rect.top + 12; to_rect.bottom = to_rect.top + 12;
from_rect.offset(12 * (num % 3), 12 * (num / 3)); from_rect.offset(12 * (num % 3), 12 * (num / 3));
@@ -1012,7 +1011,7 @@ void cPict::drawCustomTer(short num, rectangle to_rect){
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect); rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
} }
@@ -1022,7 +1021,7 @@ void cPict::drawCustomTerAnim(short num, rectangle to_rect){
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
num += animFrame % 4; num += animFrame % 4;
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect); rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
} }
@@ -1035,7 +1034,7 @@ void cPict::drawCustomMonstSm(short num, rectangle to_rect){
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
} }
@@ -1049,7 +1048,7 @@ void cPict::drawCustomMonstWide(short num, rectangle to_rect){
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
small_monst_rect.offset(to_rect.left,to_rect.top + 7); small_monst_rect.offset(to_rect.left,to_rect.top + 7);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
@@ -1068,7 +1067,7 @@ void cPict::drawCustomMonstTall(short num, rectangle to_rect){
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
small_monst_rect.offset(to_rect.left + 7,to_rect.top); small_monst_rect.offset(to_rect.left + 7,to_rect.top);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
@@ -1087,7 +1086,7 @@ void cPict::drawCustomMonstLg(short num, rectangle to_rect){
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
small_monst_rect.offset(to_rect.left,to_rect.top); small_monst_rect.offset(to_rect.left,to_rect.top);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
@@ -1110,7 +1109,7 @@ static int dlog_to_w = 18, dlog_to_h = 36;
void cPict::drawCustomDlog(short num, rectangle to_rect){ void cPict::drawCustomDlog(short num, rectangle to_rect){
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
to_rect.right = to_rect.left + dlog_to_w; to_rect.right = to_rect.left + dlog_to_w;
to_rect.bottom = to_rect.top + dlog_to_h; to_rect.bottom = to_rect.top + dlog_to_h;
@@ -1145,7 +1144,7 @@ void cPict::drawCustomDlogLg(short num, rectangle to_rect){
void cPict::drawCustomTalk(short num, rectangle to_rect){ void cPict::drawCustomTalk(short num, rectangle to_rect){
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
to_rect.right = to_rect.left + 16; to_rect.right = to_rect.left + 16;
to_rect.bottom = to_rect.top + 32; to_rect.bottom = to_rect.top + 32;
@@ -1164,7 +1163,7 @@ void cPict::drawCustomItem(short num, rectangle to_rect){
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
@@ -1174,7 +1173,7 @@ void cPict::drawCustomTinyItem(short num, rectangle to_rect){
to_rect.right = to_rect.left + 18; to_rect.right = to_rect.left + 18;
to_rect.bottom = to_rect.top + 18; to_rect.bottom = to_rect.top + 18;
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
@@ -1184,7 +1183,7 @@ void cPict::drawCustomBoom(short num, rectangle to_rect){
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num + animFrame % 8); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num + animFrame % 8);
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
@@ -1193,7 +1192,7 @@ void cPict::drawCustomBoom(short num, rectangle to_rect){
void cPict::drawCustomMissile(short num, rectangle to_rect){ void cPict::drawCustomMissile(short num, rectangle to_rect){
num += animFrame % 8; num += animFrame % 8;
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
from_rect.right = from_rect.left + 18; from_rect.right = from_rect.left + 18;
from_rect.bottom = from_rect.top + 18; from_rect.bottom = from_rect.top + 18;
@@ -1205,7 +1204,7 @@ void cPict::drawCustomMissile(short num, rectangle to_rect){
void cPict::drawCustomTerMap(short num, rectangle to_rect){ void cPict::drawCustomTerMap(short num, rectangle to_rect){
rectangle from_rect; rectangle from_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num % 1000); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num % 1000);
from_rect.right = from_rect.left + 12; from_rect.right = from_rect.left + 12;
from_rect.bottom = from_rect.top + 12; from_rect.bottom = from_rect.top + 12;
@@ -1219,7 +1218,7 @@ void cPict::drawCustomTerMap(short num, rectangle to_rect){
void cPict::drawPartyMonstSm(short num, rectangle to_rect){ void cPict::drawPartyMonstSm(short num, rectangle to_rect){
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
rectangle from_rect; rectangle from_rect;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true);
@@ -1232,7 +1231,7 @@ void cPict::drawPartyMonstWide(short num, rectangle to_rect){
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
rectangle from_rect; rectangle from_rect;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true);
@@ -1249,7 +1248,7 @@ void cPict::drawPartyMonstTall(short num, rectangle to_rect){
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
rectangle from_rect; rectangle from_rect;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true);
@@ -1266,7 +1265,7 @@ void cPict::drawPartyMonstLg(short num, rectangle to_rect){
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
rectangle from_rect; rectangle from_rect;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true);
@@ -1287,7 +1286,7 @@ void cPict::drawPartyMonstLg(short num, rectangle to_rect){
} }
void cPict::drawPartyScen(short num, rectangle to_rect){ void cPict::drawPartyScen(short num, rectangle to_rect){
const sf::Texture* from_gw = getSheet(SHEET_HEADER); auto from_gw = getSheet(SHEET_HEADER);
rectangle from_rect = {0,0,32,32}; rectangle from_rect = {0,0,32,32};
from_rect.offset(32 * (num % 5),32 * (num / 5)); from_rect.offset(32 * (num % 5),32 * (num / 5));
to_rect.right = to_rect.left + 32; to_rect.right = to_rect.left + 32;
@@ -1298,7 +1297,7 @@ void cPict::drawPartyScen(short num, rectangle to_rect){
void cPict::drawPartyItem(short num, rectangle to_rect){ void cPict::drawPartyItem(short num, rectangle to_rect){
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
rectangle from_rect; rectangle from_rect;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true);
@@ -1309,7 +1308,7 @@ void cPict::drawPartyItem(short num, rectangle to_rect){
void cPict::drawPartyPc(short num, rectangle to_rect){ void cPict::drawPartyPc(short num, rectangle to_rect){
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
rectangle from_rect; rectangle from_rect;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true);

View File

@@ -89,7 +89,7 @@ public:
cPict& operator=(cPict& other) = delete; cPict& operator=(cPict& other) = delete;
cPict(cPict& other) = delete; cPict(cPict& other) = delete;
private: private:
static const sf::Texture* getSheet(eSheetType type, size_t n = 0); static std::shared_ptr<const sf::Texture> getSheet(eSheetType type, size_t n = 0);
static short animFrame; static short animFrame;
pic_num_t picNum; pic_num_t picNum;
ePicType picType; ePicType picType;

View File

@@ -391,9 +391,10 @@ bool load_party_v2(fs::path file_to_load, cUniverse& real_univ){
sf::Image party_sheet; sf::Image party_sheet;
StdInputStream stream(fin); StdInputStream stream(fin);
if(party_sheet.loadFromStream(stream)) { if(party_sheet.loadFromStream(stream)) {
spec_scen_g.party_sheet.reset(new sf::Texture); sf::Texture sheet;
spec_scen_g.party_sheet->create(party_sheet.getSize().x, party_sheet.getSize().y); sheet.create(party_sheet.getSize().x, party_sheet.getSize().y);
spec_scen_g.party_sheet->update(party_sheet); sheet.update(party_sheet);
spec_scen_g.party_sheet.reset(new sf::Texture(sheet));
} else showWarning("There was an error loading the party custom graphics."); } else showWarning("There was an error loading the party custom graphics.");
} }

View File

@@ -2449,13 +2449,16 @@ void load_spec_graphics_v1(fs::path scen_file) {
// This means they need an alpha channel // This means they need an alpha channel
graphics_store.createMaskFromColor(sf::Color::White); graphics_store.createMaskFromColor(sf::Color::White);
spec_scen_g.is_old = true; spec_scen_g.is_old = true;
spec_scen_g.sheets = new sf::Texture[1]; spec_scen_g.sheets.resize(1);
spec_scen_g.numSheets = 1; spec_scen_g.numSheets = 1;
if(!spec_scen_g.sheets[0].loadFromImage(graphics_store)) { sf::Texture sheet;
if(sheet.loadFromImage(graphics_store)) {
spec_scen_g.sheets[0].reset(new sf::Texture(sheet));
} else {
showWarning("An error occurred while converting old-style graphics into the new format.",noGraphics); showWarning("An error occurred while converting old-style graphics into the new format.",noGraphics);
spec_scen_g.is_old = false; spec_scen_g.is_old = false;
spec_scen_g.numSheets = 0; spec_scen_g.numSheets = 0;
delete[] spec_scen_g.sheets; spec_scen_g.sheets.clear();
} }
} }
} }
@@ -2464,12 +2467,12 @@ void load_spec_graphics_v1(fs::path scen_file) {
void load_spec_graphics_v2(int num_sheets) { void load_spec_graphics_v2(int num_sheets) {
spec_scen_g.clear(); spec_scen_g.clear();
if(num_sheets > 0) { if(num_sheets > 0) {
spec_scen_g.sheets = new sf::Texture[num_sheets]; spec_scen_g.sheets.resize(num_sheets);
spec_scen_g.numSheets = num_sheets; spec_scen_g.numSheets = num_sheets;
} }
while(num_sheets-- > 0) { while(num_sheets-- > 0) {
std::string name = "sheet" + std::to_string(num_sheets); std::string name = "sheet" + std::to_string(num_sheets);
ResMgr::graphics.free(name); ResMgr::graphics.free(name);
spec_scen_g.sheets[num_sheets] = *ResMgr::graphics.get(name); spec_scen_g.sheets[num_sheets] = &ResMgr::graphics.get(name);
} }
} }

View File

@@ -73,8 +73,8 @@ namespace ResMgr {
return **res_ptr; return **res_ptr;
} }
// Overloading the address operator... // Overloading the address operator...
const T*const operator&() const { std::shared_ptr<const T> operator&() const {
return res_ptr.get()->get(); return *res_ptr.get();
} }
}; };

View File

@@ -317,7 +317,7 @@ void draw_startup_stats() {
to_rect.offset(pc_rect.left,pc_rect.top); to_rect.offset(pc_rect.left,pc_rect.top);
pic_num_t pic = univ.party[i].which_graphic; pic_num_t pic = univ.party[i].which_graphic;
if(pic >= 1000) { if(pic >= 1000) {
const sf::Texture* gw; std::shared_ptr<const sf::Texture> gw;
graf_pos_ref(gw, from_rect) = spec_scen_g.find_graphic(pic % 1000, pic >= 10000); graf_pos_ref(gw, from_rect) = spec_scen_g.find_graphic(pic % 1000, pic >= 10000);
rect_draw_some_item(*gw,from_rect,mainPtr,to_rect,sf::BlendAlpha); rect_draw_some_item(*gw,from_rect,mainPtr,to_rect,sf::BlendAlpha);
} else if(pic >= 100) { } else if(pic >= 100) {
@@ -1191,7 +1191,7 @@ void draw_trim(short q,short r,short which_trim,ter_num_t ground_ter) {
}; };
static std::unique_ptr<sf::Texture> trim_masks[12], walkway_masks[9]; static std::unique_ptr<sf::Texture> trim_masks[12], walkway_masks[9];
rectangle from_rect = {0,0,36,28},to_rect; rectangle from_rect = {0,0,36,28},to_rect;
const sf::Texture* from_gworld; std::shared_ptr<const sf::Texture> from_gworld;
sf::Texture* mask; sf::Texture* mask;
static bool inited = false; static bool inited = false;
if(!inited){ if(!inited){

View File

@@ -62,7 +62,7 @@ bool gave_no_g_error = false;
void draw_one_terrain_spot (short i,short j,short terrain_to_draw) { void draw_one_terrain_spot (short i,short j,short terrain_to_draw) {
rectangle where_draw; rectangle where_draw;
rectangle source_rect; rectangle source_rect;
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
short anim_type = 0; short anim_type = 0;
location l; location l;
@@ -146,7 +146,7 @@ void draw_monsters() {
if(picture_wanted >= 0) { if(picture_wanted >= 0) {
if(picture_wanted >= 1000) { if(picture_wanted >= 1000) {
for(short k = 0; k < width * height; k++) { for(short k = 0; k < width * height; k++) {
const sf::Texture* src_gw; std::shared_ptr<const sf::Texture> src_gw;
graf_pos_ref(src_gw, source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000 + graf_pos_ref(src_gw, source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000 +
((enc.direction < 4) ? 0 : (width * height)) + k); ((enc.direction < 4) ? 0 : (width * height)) + k);
to_rect = monst_rects[(width - 1) * 2 + height - 1][k]; to_rect = monst_rects[(width - 1) * 2 + height - 1][k];
@@ -189,7 +189,7 @@ void draw_monsters() {
draw_one_terrain_spot((short) where_draw.x,(short) where_draw.y,10000 + univ.scenario.ter_types[ter].flag1); draw_one_terrain_spot((short) where_draw.x,(short) where_draw.y,10000 + univ.scenario.ter_types[ter].flag1);
else if(monst.picture_num >= 1000) { else if(monst.picture_num >= 1000) {
bool isParty = monst.picture_num >= 10000; bool isParty = monst.picture_num >= 10000;
const sf::Texture* src_gw; std::shared_ptr<const sf::Texture> src_gw;
pic_num_t need_pic = (monst.picture_num % 1000) + k; pic_num_t need_pic = (monst.picture_num % 1000) + k;
if(monst.direction >= 4) need_pic += width * height; if(monst.direction >= 4) need_pic += width * height;
if(combat_posing_monster == i + 100) need_pic += (2 * width * height); if(combat_posing_monster == i + 100) need_pic += (2 * width * height);
@@ -228,7 +228,7 @@ void draw_combat_pc(cPlayer& who, location center, bool attacking) {
if(point_onscreen(center, who.combat_pos) && (cartoon_happening || party_can_see(who.combat_pos) < 6)) { if(point_onscreen(center, who.combat_pos) && (cartoon_happening || party_can_see(who.combat_pos) < 6)) {
location where_draw(who.combat_pos.x - center.x + 4, who.combat_pos.y - center.y + 4); location where_draw(who.combat_pos.x - center.x + 4, who.combat_pos.y - center.y + 4);
rectangle source_rect; rectangle source_rect;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
pic_num_t pic = who.which_graphic; pic_num_t pic = who.which_graphic;
if(pic >= 1000) { if(pic >= 1000) {
bool isParty = pic >= 10000; bool isParty = pic >= 10000;
@@ -303,7 +303,7 @@ void draw_items(location where){
if(univ.town.items[i].variety != eItemType::NO_ITEM && univ.town.items[i].item_loc == where) { if(univ.town.items[i].variety != eItemType::NO_ITEM && univ.town.items[i].item_loc == where) {
if(univ.town.items[i].contained) continue; if(univ.town.items[i].contained) continue;
if(party_can_see(where) >= 6) continue; if(party_can_see(where) >= 6) continue;
const sf::Texture* src_gw; std::shared_ptr<const sf::Texture> src_gw;
to_rect = coord_to_rect(where_draw.x,where_draw.y); to_rect = coord_to_rect(where_draw.x,where_draw.y);
if(univ.town.items[i].graphic_num >= 10000){ if(univ.town.items[i].graphic_num >= 10000){
graf_pos_ref(src_gw, from_rect) = spec_scen_g.find_graphic(univ.town.items[i].graphic_num - 10000, true); graf_pos_ref(src_gw, from_rect) = spec_scen_g.find_graphic(univ.town.items[i].graphic_num - 10000, true);
@@ -451,7 +451,7 @@ void draw_party_symbol(location center) {
if((univ.party.in_boat < 0) && (univ.party.in_horse < 0)) { if((univ.party.in_boat < 0) && (univ.party.in_horse < 0)) {
i = first_active_pc(); i = first_active_pc();
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
pic_num_t pic = univ.party[i].which_graphic; pic_num_t pic = univ.party[i].which_graphic;
if(pic >= 1000) { if(pic >= 1000) {
bool isParty = pic >= 10000; bool isParty = pic >= 10000;

View File

@@ -424,7 +424,7 @@ void do_missile_anim(short num_steps,location missile_origin,short sound_num) {
base -= 10000; base -= 10000;
} else base -= 1000; } else base -= 1000;
base += step % 4; base += step % 4;
const sf::Texture* from_gw = nullptr; std::shared_ptr<const sf::Texture> from_gw = nullptr;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(base, isParty); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(base, isParty);
if(from_gw == nullptr) continue; if(from_gw == nullptr) continue;
from_rect.width() = 18; from_rect.width() = 18;
@@ -557,7 +557,7 @@ void do_explosion_anim(short /*sound_num*/,short special_draw, short snd) {
if(store_booms[i].boom_type >= 0) { if(store_booms[i].boom_type >= 0) {
if((t + store_booms[i].offset >= 0) && (t + store_booms[i].offset <= 7)) { if((t + store_booms[i].offset >= 0) && (t + store_booms[i].offset <= 7)) {
if(cur_boom_type >= 1000) { if(cur_boom_type >= 1000) {
const sf::Texture* src_gworld; std::shared_ptr<const sf::Texture> src_gworld;
graf_pos_ref(src_gworld, from_rect) = spec_scen_g.find_graphic(cur_boom_type - 1000 + t); graf_pos_ref(src_gworld, from_rect) = spec_scen_g.find_graphic(cur_boom_type - 1000 + t);
rect_draw_some_item(*src_gworld, from_rect, mainPtr, explode_place_rect[i], sf::BlendAlpha); rect_draw_some_item(*src_gworld, from_rect, mainPtr, explode_place_rect[i], sf::BlendAlpha);
} else { } else {
@@ -606,7 +606,7 @@ void click_shop_rect(rectangle area_rect) {
graf_pos calc_item_rect(int num,rectangle& to_rect) { graf_pos calc_item_rect(int num,rectangle& to_rect) {
if(num >= 1000) return spec_scen_g.find_graphic(num - 1000); if(num >= 1000) return spec_scen_g.find_graphic(num - 1000);
rectangle from_rect = {0,0,18,18}; rectangle from_rect = {0,0,18,18};
const sf::Texture *from_gw; std::shared_ptr<const sf::Texture> from_gw;
if(num < 55) { if(num < 55) {
from_gw = &ResMgr::graphics.get("objects"); from_gw = &ResMgr::graphics.get("objects");
from_rect = calc_rect(num % 5, num / 5); from_rect = calc_rect(num % 5, num / 5);
@@ -666,7 +666,7 @@ void draw_shop_graphics(bool pressed,rectangle clip_area_rect) {
// Place store icon // Place store icon
if(!pressed) { if(!pressed) {
rectangle from_rect = {0,0,32,32}; rectangle from_rect = {0,0,32,32};
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
int i = std::max<int>(0, active_shop.getFace()); int i = std::max<int>(0, active_shop.getFace());
if(i >= 1000) { if(i >= 1000) {
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(i - 1000); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(i - 1000);
@@ -734,7 +734,7 @@ void draw_shop_graphics(bool pressed,rectangle clip_area_rect) {
base_item = item.item; base_item = item.item;
std::string cur_name = base_item.full_name, cur_info_str; std::string cur_name = base_item.full_name, cur_info_str;
rectangle from_rect, to_rect = shopping_rects[i][SHOPRECT_GRAPHIC]; rectangle from_rect, to_rect = shopping_rects[i][SHOPRECT_GRAPHIC];
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
switch(item.type) { switch(item.type) {
case eShopItemType::ITEM: case eShopItemType::ITEM:
base_item.ident = true; base_item.ident = true;

View File

@@ -435,7 +435,7 @@ void place_item_graphic(short which_slot,short graphic) {
to_rect.inset(-1,-1); to_rect.inset(-1,-1);
to_rect.offset(20,1); to_rect.offset(20,1);
from_rect.inset(2,2); from_rect.inset(2,2);
const sf::Texture* src_gw; std::shared_ptr<const sf::Texture> src_gw;
if(graphic >= 10000) { if(graphic >= 10000) {
graf_pos_ref(src_gw, from_rect) = spec_scen_g.find_graphic(graphic - 10000, true); graf_pos_ref(src_gw, from_rect) = spec_scen_g.find_graphic(graphic - 10000, true);
rect_draw_some_item(*src_gw, from_rect, item_stats_gworld, to_rect,sf::BlendAlpha); rect_draw_some_item(*src_gw, from_rect, item_stats_gworld, to_rect,sf::BlendAlpha);
@@ -496,7 +496,7 @@ void place_item_bottom_buttons() {
to_rect = item_screen_button_rects[i]; to_rect = item_screen_button_rects[i];
rect_draw_some_item(invenbtn_gworld, but_from_rect, item_stats_gworld, to_rect, sf::BlendAlpha); rect_draw_some_item(invenbtn_gworld, but_from_rect, item_stats_gworld, to_rect, sf::BlendAlpha);
pic_num_t pic = univ.party[i].which_graphic; pic_num_t pic = univ.party[i].which_graphic;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
if(pic >= 1000) { if(pic >= 1000) {
bool isParty = pic >= 10000; bool isParty = pic >= 10000;
pic_num_t need_pic = pic % 1000; pic_num_t need_pic = pic % 1000;

View File

@@ -1428,7 +1428,7 @@ void draw_map(bool need_refresh) {
if(pic >= 1000) { if(pic >= 1000) {
if(spec_scen_g) { if(spec_scen_g) {
//print_nums(0,99,pic); //print_nums(0,99,pic);
const sf::Texture* src_gw; std::shared_ptr<const sf::Texture> src_gw;
if(drawLargeIcon) { if(drawLargeIcon) {
pic = pic % 1000; pic = pic % 1000;
graf_pos_ref(src_gw, custom_from) = spec_scen_g.find_graphic(pic); graf_pos_ref(src_gw, custom_from) = spec_scen_g.find_graphic(pic);
@@ -1448,7 +1448,7 @@ void draw_map(bool need_refresh) {
rect_draw_some_item(*ResMgr::graphics.get("teranim"), custom_from, map_gworld, draw_rect); rect_draw_some_item(*ResMgr::graphics.get("teranim"), custom_from, map_gworld, draw_rect);
} else { } else {
int which_sheet = pic / 50; int which_sheet = pic / 50;
const sf::Texture* src_gw = &ResMgr::graphics.get("ter" + std::to_string(1 + which_sheet)); auto src_gw = &ResMgr::graphics.get("ter" + std::to_string(1 + which_sheet));
pic %= 50; pic %= 50;
custom_from = calc_rect(pic % 10, pic / 10); custom_from = calc_rect(pic % 10, pic / 10);
rect_draw_some_item(*src_gw, custom_from, map_gworld, draw_rect); rect_draw_some_item(*src_gw, custom_from, map_gworld, draw_rect);

View File

@@ -29,7 +29,7 @@ graf_pos cCustomGraphics::find_graphic(pic_num_t which_rect, bool party) {
else if(numSheets == 0) valid = false; else if(numSheets == 0) valid = false;
if(!valid) { if(!valid) {
INVALID: INVALID:
const sf::Texture* blank = &ResMgr::graphics.get("blank"); std::shared_ptr<const sf::Texture> blank = &ResMgr::graphics.get("blank");
return {blank, {0,0,36,28}}; return {blank, {0,0,36,28}};
} }
short sheet = which_rect / 100; short sheet = which_rect / 100;
@@ -38,22 +38,22 @@ graf_pos cCustomGraphics::find_graphic(pic_num_t which_rect, bool party) {
rectangle store_rect = {0,0,36,28}; rectangle store_rect = {0,0,36,28};
store_rect.offset(28 * (which_rect % 10),36 * (which_rect / 10)); store_rect.offset(28 * (which_rect % 10),36 * (which_rect / 10));
sf::Texture* the_sheet = party ? party_sheet.get() : &sheets[sheet]; std::shared_ptr<const sf::Texture> the_sheet = party ? party_sheet : sheets[sheet];
rectangle test(*the_sheet); rectangle test(*the_sheet);
if((store_rect & test) != store_rect) goto INVALID; // FIXME: HACK if((store_rect & test) != store_rect) goto INVALID; // FIXME: HACK
return std::make_pair(the_sheet,store_rect); return std::make_pair(the_sheet,store_rect);
} }
size_t cCustomGraphics::count(bool party) { size_t cCustomGraphics::count(bool party) {
if(!party && sheets == nullptr) return 0; if(!party && !sheets.empty()) return 0;
else if(party && party_sheet == nullptr) return 0; else if(party && party_sheet == nullptr) return 0;
else if(is_old || party) { else if(is_old || party) {
rectangle bounds(party ? *party_sheet : sheets[0]); rectangle bounds(party ? *party_sheet : *sheets[0]);
if(bounds.width() < 280) return bounds.width() / 28; if(bounds.width() < 280) return bounds.width() / 28;
return 10 * bounds.height() / 36; return 10 * bounds.height() / 36;
} else { } else {
size_t count = 100 * (numSheets - 1); size_t count = 100 * (numSheets - 1);
rectangle bounds(sheets[numSheets - 1]); rectangle bounds(*sheets[numSheets - 1]);
if(bounds.width() < 280) count += bounds.width() / 28; if(bounds.width() < 280) count += bounds.width() / 28;
else count += 10 * bounds.height() / 36; else count += 10 * bounds.height() / 36;
return count; return count;
@@ -65,9 +65,10 @@ void cCustomGraphics::copy_graphic(pic_num_t dest, pic_num_t src, size_t numSlot
if(!party_sheet) { if(!party_sheet) {
sf::Image empty; sf::Image empty;
empty.create(280, 180, sf::Color::Transparent); empty.create(280, 180, sf::Color::Transparent);
party_sheet.reset(new sf::Texture); sf::Texture sheet;
party_sheet->create(280, 180); sheet.create(280, 180);
party_sheet->update(empty); sheet.update(empty);
party_sheet.reset(new sf::Texture(sheet));
numSheets = 1; numSheets = 1;
} }
size_t havePics = count(); size_t havePics = count();
@@ -79,25 +80,25 @@ void cCustomGraphics::copy_graphic(pic_num_t dest, pic_num_t src, size_t numSlot
temp.create(280, party_sheet->getSize().y + 36 * addRows); temp.create(280, party_sheet->getSize().y + 36 * addRows);
temp.clear(sf::Color::Transparent); temp.clear(sf::Color::Transparent);
rect_draw_some_item(*party_sheet, rectangle(*party_sheet), temp, rectangle(*party_sheet)); rect_draw_some_item(*party_sheet, rectangle(*party_sheet), temp, rectangle(*party_sheet));
*party_sheet = temp.getTexture(); party_sheet.reset(new sf::Texture(temp.getTexture()));
} }
const sf::Texture* from_sheet; std::shared_ptr<const sf::Texture> from_sheet;
const sf::Texture* to_sheet; std::shared_ptr<const sf::Texture> to_sheet;
sf::Texture* last_src = nullptr; std::shared_ptr<const sf::Texture> last_src = nullptr;
sf::RenderTexture temp; sf::RenderTexture temp;
rectangle from_rect, to_rect; rectangle from_rect, to_rect;
for(size_t i = 0; i < numSlots; i++) { for(size_t i = 0; i < numSlots; i++) {
graf_pos_ref(from_sheet, from_rect) = find_graphic(src + i); graf_pos_ref(from_sheet, from_rect) = find_graphic(src + i);
graf_pos_ref(to_sheet, to_rect) = find_graphic(dest + i, true); graf_pos_ref(to_sheet, to_rect) = find_graphic(dest + i, true);
if(to_sheet != last_src) { if(to_sheet != last_src) {
if(last_src) *last_src = temp.getTexture(); if(last_src) last_src.reset(new sf::Texture(temp.getTexture()));
last_src = const_cast<sf::Texture*>(to_sheet); last_src = to_sheet;
temp.create(to_sheet->getSize().x, to_sheet->getSize().y); temp.create(to_sheet->getSize().x, to_sheet->getSize().y);
rect_draw_some_item(*to_sheet, rectangle(*to_sheet), temp, rectangle(*to_sheet)); rect_draw_some_item(*to_sheet, rectangle(*to_sheet), temp, rectangle(*to_sheet));
} }
rect_draw_some_item(*from_sheet, from_rect, temp, to_rect); rect_draw_some_item(*from_sheet, from_rect, temp, to_rect);
} }
*last_src = temp.getTexture(); last_src.reset(new sf::Texture(temp.getTexture()));
} }
extern std::string scenario_temp_dir_name; extern std::string scenario_temp_dir_name;
@@ -105,11 +106,11 @@ void cCustomGraphics::convert_sheets() {
if(!is_old) return; if(!is_old) return;
int num_graphics = count(); int num_graphics = count();
is_old = false; is_old = false;
sf::Image old_graph = sheets[0].copyToImage(); sf::Image old_graph = sheets[0]->copyToImage();
delete[] sheets; sheets.clear();
numSheets = num_graphics / 100; numSheets = num_graphics / 100;
if(num_graphics % 100) numSheets++; if(num_graphics % 100) numSheets++;
sheets = new sf::Texture[numSheets]; sheets.resize(numSheets);
extern fs::path tempDir; extern fs::path tempDir;
fs::path pic_dir = tempDir/scenario_temp_dir_name/"graphics"; fs::path pic_dir = tempDir/scenario_temp_dir_name/"graphics";
for(size_t i = 0; i < numSheets; i++) { for(size_t i = 0; i < numSheets; i++) {
@@ -122,18 +123,22 @@ void cCustomGraphics::convert_sheets() {
sheet.create(280, 360); sheet.create(280, 360);
sheet.copy(old_graph, 0, 0, subrect); sheet.copy(old_graph, 0, 0, subrect);
sheets[i].create(280, 360); sf::Texture sheet_tex;
sheets[i].update(sheet); sheet_tex.create(280, 360);
sheet_tex.update(sheet);
sheets[i].reset(new sf::Texture(sheet_tex));
fs::path sheetPath = pic_dir/("sheet" + std::to_string(i) + ".png"); fs::path sheetPath = pic_dir/("sheet" + std::to_string(i) + ".png");
sheets[i].copyToImage().saveToFile(sheetPath.string().c_str()); sheets[i]->copyToImage().saveToFile(sheetPath.string().c_str());
} }
ResMgr::graphics.pushPath(pic_dir); ResMgr::graphics.pushPath(pic_dir);
} }
void cCustomGraphics::replace_sheet(size_t num, sf::Image& newSheet) { void cCustomGraphics::replace_sheet(size_t num, sf::Image& newSheet) {
if(num >= numSheets) return; // TODO: Fail silently? Is that a good idea? if(num >= numSheets) return; // TODO: Fail silently? Is that a good idea?
sheets[num].loadFromImage(newSheet); sf::Texture replacement;
replacement.loadFromImage(newSheet);
sheets[num].reset(new sf::Texture(replacement));
// Then we need to do some extra stuff to ensure the dialog engine also sees the change // Then we need to do some extra stuff to ensure the dialog engine also sees the change
extern fs::path tempDir; extern fs::path tempDir;
std::string sheetname = "sheet" + std::to_string(num); std::string sheetname = "sheet" + std::to_string(num);
@@ -143,19 +148,21 @@ void cCustomGraphics::replace_sheet(size_t num, sf::Image& newSheet) {
} }
void cCustomGraphics::init_sheet(size_t num) { void cCustomGraphics::init_sheet(size_t num) {
sheets[num].create(280,360); sf::Texture placeholder;
placeholder.create(280,360);
sf::Image fill1, fill2; sf::Image fill1, fill2;
fill1.create(28,36,{0xff,0xff,0xc0}); fill1.create(28,36,{0xff,0xff,0xc0});
fill2.create(28,36,{0xc0,0xff,0xc0}); fill2.create(28,36,{0xc0,0xff,0xc0});
for(int y = 0; y < 10; y++) { for(int y = 0; y < 10; y++) {
for(int x = 0; x < 10; x++) { for(int x = 0; x < 10; x++) {
if(x % 2 == y % 2) { if(x % 2 == y % 2) {
sheets[num].update(fill1.getPixelsPtr(), 28, 36, x * 28, y * 36); placeholder.update(fill1.getPixelsPtr(), 28, 36, x * 28, y * 36);
} else { } else {
sheets[num].update(fill2.getPixelsPtr(), 28, 36, x * 28, y * 36); placeholder.update(fill2.getPixelsPtr(), 28, 36, x * 28, y * 36);
} }
} }
} }
sheets[num].reset(new sf::Texture(placeholder));
} }
extern const std::vector<m_pic_index_t> m_pic_index = { extern const std::vector<m_pic_index_t> m_pic_index = {

View File

@@ -16,8 +16,8 @@
#include "location.hpp" #include "location.hpp"
static const pic_num_t NO_PIC = -1; static const pic_num_t NO_PIC = -1;
using graf_pos = std::pair<const sf::Texture*,rectangle>; using graf_pos = std::pair<std::shared_ptr<const sf::Texture>,rectangle>;
using graf_pos_ref = std::pair<const sf::Texture*&,rectangle&>; using graf_pos_ref = std::pair<std::shared_ptr<const sf::Texture>&,rectangle&>;
struct m_pic_index_t { struct m_pic_index_t {
unsigned char i, x, y; unsigned char i, x, y;
@@ -25,18 +25,18 @@ struct m_pic_index_t {
struct cCustomGraphics { struct cCustomGraphics {
size_t numSheets; size_t numSheets;
sf::Texture* sheets = nullptr; std::vector<std::shared_ptr<const sf::Texture>> sheets;
std::shared_ptr<sf::Texture> party_sheet; std::shared_ptr<const sf::Texture> party_sheet;
bool is_old = false; bool is_old = false;
void clear() { void clear() {
if(sheets != nullptr) delete[] sheets; sheets.clear();
sheets = nullptr; party_sheet.reset();
}
~cCustomGraphics() {
clear();
} }
explicit operator bool() { explicit operator bool() {
return sheets; return !sheets.empty() && bool(sheets[0]);
}
bool operator!() {
return !bool(*this);
} }
void convert_sheets(); void convert_sheets();
void copy_graphic(pic_num_t dest, pic_num_t src, size_t numSlots); void copy_graphic(pic_num_t dest, pic_num_t src, size_t numSlots);

View File

@@ -392,7 +392,7 @@ void display_party() {
if(univ.party[i].main_status != eMainStatus::ABSENT) { // PC exists? if(univ.party[i].main_status != eMainStatus::ABSENT) { // PC exists?
// draw PC graphic // draw PC graphic
pic_num_t pic = univ.party[i].which_graphic; pic_num_t pic = univ.party[i].which_graphic;
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
if(pic >= 1000) { if(pic >= 1000) {
bool isParty = pic >= 10000; bool isParty = pic >= 10000;
pic_num_t need_pic = pic % 1000; pic_num_t need_pic = pic % 1000;

View File

@@ -3348,10 +3348,10 @@ void edit_custom_sheets() {
if(must_init_spec_g) { if(must_init_spec_g) {
spec_scen_g.clear(); spec_scen_g.clear();
spec_scen_g.sheets = new sf::Texture[1]; spec_scen_g.sheets.resize(1);
spec_scen_g.numSheets = 1; spec_scen_g.numSheets = 1;
spec_scen_g.init_sheet(0); spec_scen_g.init_sheet(0);
spec_scen_g.sheets[0].copyToImage().saveToFile((pic_dir/"sheet0.png").string().c_str()); spec_scen_g.sheets[0]->copyToImage().saveToFile((pic_dir/"sheet0.png").string().c_str());
all_pics.insert(all_pics.begin(), 0); all_pics.insert(all_pics.begin(), 0);
ResMgr::graphics.pushPath(pic_dir); ResMgr::graphics.pushPath(pic_dir);
} }
@@ -3362,7 +3362,7 @@ void edit_custom_sheets() {
size_t cur = 0; size_t cur = 0;
std::unordered_map<size_t, sf::Image> sheets; std::unordered_map<size_t, sf::Image> sheets;
for(size_t i = 0; i < spec_scen_g.numSheets; i++) { for(size_t i = 0; i < spec_scen_g.numSheets; i++) {
sheets[i] = spec_scen_g.sheets[i].copyToImage(); sheets[i] = spec_scen_g.sheets[i]->copyToImage();
} }
auto sheetsSave = sheets; auto sheetsSave = sheets;
@@ -3438,11 +3438,9 @@ void edit_custom_sheets() {
int newSheet = pickNum->getControl("num").getTextAsNum(); int newSheet = pickNum->getControl("num").getTextAsNum();
fs::path sheetPath = pic_dir/("sheet" + std::to_string(newSheet) + ".png"); fs::path sheetPath = pic_dir/("sheet" + std::to_string(newSheet) + ".png");
if(newSheet == spec_scen_g.numSheets) { if(newSheet == spec_scen_g.numSheets) {
sf::Texture* wasSheets = spec_scen_g.sheets; spec_scen_g.sheets.emplace_back();
spec_scen_g.sheets = new sf::Texture[spec_scen_g.numSheets + 1];
std::copy_n(wasSheets, spec_scen_g.numSheets, spec_scen_g.sheets);
spec_scen_g.init_sheet(newSheet); spec_scen_g.init_sheet(newSheet);
spec_scen_g.sheets[newSheet].copyToImage().saveToFile(sheetPath.string().c_str()); spec_scen_g.sheets[newSheet]->copyToImage().saveToFile(sheetPath.string().c_str());
spec_scen_g.numSheets++; spec_scen_g.numSheets++;
auto iter = all_pics.insert(std::upper_bound(all_pics.begin(), all_pics.end(), newSheet), newSheet); auto iter = all_pics.insert(std::upper_bound(all_pics.begin(), all_pics.end(), newSheet), newSheet);
cur = iter - all_pics.begin(); cur = iter - all_pics.begin();
@@ -3470,11 +3468,8 @@ void edit_custom_sheets() {
if(which_pic < spec_scen_g.numSheets - 1) if(which_pic < spec_scen_g.numSheets - 1)
choice = cChoiceDlog("must-delete-in-order", {"cancel", "del", "move"}, &me).show(); choice = cChoiceDlog("must-delete-in-order", {"cancel", "del", "move"}, &me).show();
if(choice == "cancel") return true; if(choice == "cancel") return true;
sf::Texture* wasSheets = spec_scen_g.sheets;
if(choice == "move") { if(choice == "move") {
spec_scen_g.sheets = new sf::Texture[spec_scen_g.numSheets-1]; spec_scen_g.sheets.erase(spec_scen_g.sheets.begin() + which_pic);
std::copy_n(wasSheets, which_pic, spec_scen_g.sheets);
std::copy(wasSheets + which_pic + 1, wasSheets + spec_scen_g.numSheets, spec_scen_g.sheets + which_pic);
spec_scen_g.numSheets--; spec_scen_g.numSheets--;
for(; which_pic < spec_scen_g.numSheets; which_pic++) { for(; which_pic < spec_scen_g.numSheets; which_pic++) {
fs::path from = pic_dir/("sheet" + std::to_string(which_pic + 1) + ".png"); fs::path from = pic_dir/("sheet" + std::to_string(which_pic + 1) + ".png");
@@ -3494,11 +3489,9 @@ void edit_custom_sheets() {
} else if(choice == "del") { } else if(choice == "del") {
all_pics.erase(all_pics.begin() + cur); all_pics.erase(all_pics.begin() + cur);
spec_scen_g.numSheets = which_pic; spec_scen_g.numSheets = which_pic;
spec_scen_g.sheets = new sf::Texture[which_pic]; spec_scen_g.sheets.resize(which_pic);
std::copy_n(wasSheets, which_pic, spec_scen_g.sheets);
ResMgr::graphics.free("sheet" + std::to_string(which_pic)); ResMgr::graphics.free("sheet" + std::to_string(which_pic));
} }
delete[] wasSheets;
} }
fs::path fpath = pic_dir/("sheet" + std::to_string(which_pic) + ".png"); fs::path fpath = pic_dir/("sheet" + std::to_string(which_pic) + ".png");
if(fs::exists(fpath)) fs::remove(fpath); if(fs::exists(fpath)) fs::remove(fpath);

View File

@@ -1089,7 +1089,7 @@ void save_scenario(bool rename) {
if(spec_scen_g.is_old) { if(spec_scen_g.is_old) {
spec_scen_g.convert_sheets(); spec_scen_g.convert_sheets();
for(size_t i = 0; i < spec_scen_g.numSheets; i++) { for(size_t i = 0; i < spec_scen_g.numSheets; i++) {
sf::Image sheet = spec_scen_g.sheets[i].copyToImage(); sf::Image sheet = spec_scen_g.sheets[i]->copyToImage();
fs::path tempPath = tempDir/"temp.png"; fs::path tempPath = tempDir/"temp.png";
sheet.saveToFile(tempPath.string()); sheet.saveToFile(tempPath.string());
std::ostream& pic_out = scen_file.newFile("scenario/graphics/sheet" + std::to_string(i) + ".png"); std::ostream& pic_out = scen_file.newFile("scenario/graphics/sheet" + std::to_string(i) + ".png");

View File

@@ -518,7 +518,7 @@ void set_up_terrain_buttons(bool reset) {
ter_from = ter_from_base; ter_from = ter_from_base;
pic = scenario.ter_types[i].picture; pic = scenario.ter_types[i].picture;
if(pic >= 1000) { if(pic >= 1000) {
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic % 1000); graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic % 1000);
rect_draw_some_item(*source_gworld, ter_from, mainPtr, draw_rect); rect_draw_some_item(*source_gworld, ter_from, mainPtr, draw_rect);
} }
@@ -555,7 +555,7 @@ void set_up_terrain_buttons(bool reset) {
pic %= 1000; pic %= 1000;
tiny_to.width() = tiny_to.width() / 2; tiny_to.width() = tiny_to.width() / 2;
tiny_to.height() = tiny_to.height() / 2; tiny_to.height() = tiny_to.height() / 2;
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic);
rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha);
pic++; pic++;
@@ -575,7 +575,7 @@ void set_up_terrain_buttons(bool reset) {
tiny_to.width() = tiny_to.width() / 2; tiny_to.width() = tiny_to.width() / 2;
tiny_to.height() = tiny_to.height() / 2; tiny_to.height() = tiny_to.height() / 2;
tiny_to.offset(tiny_to.width() / 2, 0); tiny_to.offset(tiny_to.width() / 2, 0);
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic);
rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha);
pic++; pic++;
@@ -587,7 +587,7 @@ void set_up_terrain_buttons(bool reset) {
tiny_to.width() = tiny_to.width() / 2; tiny_to.width() = tiny_to.width() / 2;
tiny_to.height() = tiny_to.height() / 2; tiny_to.height() = tiny_to.height() / 2;
tiny_to.offset(0, tiny_to.height() / 2); tiny_to.offset(0, tiny_to.height() / 2);
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic);
rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha);
pic++; pic++;
@@ -596,7 +596,7 @@ void set_up_terrain_buttons(bool reset) {
rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha);
} else if(pic >= 1000) { } else if(pic >= 1000) {
pic %= 1000; pic %= 1000;
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic);
rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha);
} else { } else {
@@ -653,7 +653,7 @@ void set_up_terrain_buttons(bool reset) {
tiny_to = draw_rect; tiny_to = draw_rect;
frame_rect(mainPtr, tiny_to, sf::Color::Black); frame_rect(mainPtr, tiny_to, sf::Color::Black);
if(pic >= 1000) { if(pic >= 1000) {
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic % 1000); graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic % 1000);
rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha);
} else { } else {
@@ -976,7 +976,7 @@ void draw_terrain(){
void draw_monsts() { void draw_monsts() {
short width,height,m_start_pic; short width,height,m_start_pic;
const sf::Texture* from_gworld = nullptr; std::shared_ptr<const sf::Texture> from_gworld = nullptr;
rectangle source_rect; rectangle source_rect;
location where_draw,store_loc; location where_draw,store_loc;
@@ -1059,7 +1059,7 @@ void draw_items() {
(where_draw.y >= 0) && (where_draw.y <= 8)) { (where_draw.y >= 0) && (where_draw.y <= 8)) {
if(pic_num >= 1000) { if(pic_num >= 1000) {
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(pic_num - 1000); graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(pic_num - 1000);
dest_rect = calc_rect(where_draw.x,where_draw.y); dest_rect = calc_rect(where_draw.x,where_draw.y);
dest_rect.offset(8+TER_RECT_UL_X,8+TER_RECT_UL_Y); dest_rect.offset(8+TER_RECT_UL_X,8+TER_RECT_UL_Y);
@@ -1095,7 +1095,7 @@ void draw_one_terrain_spot (short i,short j,ter_num_t terrain_to_draw) {
location where_draw; location where_draw;
rectangle source_rect; rectangle source_rect;
short picture_wanted; short picture_wanted;
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
if(i < 0 || i > 8 || j < 0 || j > 8) if(i < 0 || i > 8 || j < 0 || j > 8)
return; return;
@@ -1136,7 +1136,7 @@ void draw_one_tiny_terrain_spot (short i,short j,ter_num_t terrain_to_draw,short
rectangle dest_rect = {0,0,size,size},from_rect = {0,0,12,12}; rectangle dest_rect = {0,0,size,size},from_rect = {0,0,12,12};
short picture_wanted; short picture_wanted;
bool drawLargeIcon = false; bool drawLargeIcon = false;
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
picture_wanted = scenario.ter_types[terrain_to_draw].map_pic; picture_wanted = scenario.ter_types[terrain_to_draw].map_pic;
if(picture_wanted == NO_PIC) { if(picture_wanted == NO_PIC) {
@@ -1160,7 +1160,7 @@ void draw_one_tiny_terrain_spot (short i,short j,ter_num_t terrain_to_draw,short
rect_draw_some_item(*source_gworld, from_rect, mainPtr, dest_rect); rect_draw_some_item(*source_gworld, from_rect, mainPtr, dest_rect);
} else { } else {
if(picture_wanted >= 1000) { if(picture_wanted >= 1000) {
const sf::Texture* from_gw; std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(picture_wanted % 1000);
from_rect.right = from_rect.left + 12; from_rect.right = from_rect.left + 12;
from_rect.bottom = from_rect.top + 12; from_rect.bottom = from_rect.top + 12;
@@ -1261,7 +1261,7 @@ static void place_selected_terrain(ter_num_t ter, rectangle draw_rect) {
pic_num_t picture_wanted = scenario.ter_types[ter].picture; pic_num_t picture_wanted = scenario.ter_types[ter].picture;
rectangle source_rect; rectangle source_rect;
if(picture_wanted >= 1000) { if(picture_wanted >= 1000) {
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000);
rect_draw_some_item(*source_gworld, source_rect,mainPtr,draw_rect); rect_draw_some_item(*source_gworld, source_rect,mainPtr,draw_rect);
} }
@@ -1377,7 +1377,7 @@ void place_location() {
picture_wanted %= 1000; picture_wanted %= 1000;
to_rect.width() = to_rect.width() / 2; to_rect.width() = to_rect.width() / 2;
to_rect.height() = to_rect.height() / 2; to_rect.height() = to_rect.height() / 2;
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted);
rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha);
picture_wanted++; picture_wanted++;
@@ -1397,7 +1397,7 @@ void place_location() {
to_rect.width() = to_rect.width() / 2; to_rect.width() = to_rect.width() / 2;
to_rect.height() = to_rect.height() / 2; to_rect.height() = to_rect.height() / 2;
to_rect.offset(to_rect.width() / 2, 0); to_rect.offset(to_rect.width() / 2, 0);
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted);
rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha);
picture_wanted++; picture_wanted++;
@@ -1409,7 +1409,7 @@ void place_location() {
to_rect.width() = to_rect.width() / 2; to_rect.width() = to_rect.width() / 2;
to_rect.height() = to_rect.height() / 2; to_rect.height() = to_rect.height() / 2;
to_rect.offset(0, to_rect.height() / 2); to_rect.offset(0, to_rect.height() / 2);
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted);
rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha);
picture_wanted++; picture_wanted++;
@@ -1418,7 +1418,7 @@ void place_location() {
rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha);
} else if(picture_wanted >= 1000) { } else if(picture_wanted >= 1000) {
picture_wanted %= 1000; picture_wanted %= 1000;
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted);
rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha);
} else { } else {
@@ -1472,7 +1472,7 @@ void place_location() {
} else if(overall_mode == MODE_PLACE_ITEM || overall_mode == MODE_PLACE_SAME_ITEM) { } else if(overall_mode == MODE_PLACE_ITEM || overall_mode == MODE_PLACE_SAME_ITEM) {
picture_wanted = scenario.scen_items[mode_count].graphic_num; picture_wanted = scenario.scen_items[mode_count].graphic_num;
if(picture_wanted >= 1000) { if(picture_wanted >= 1000) {
const sf::Texture* source_gworld; std::shared_ptr<const sf::Texture> source_gworld;
graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000);
rect_draw_some_item(*source_gworld,source_rect,mainPtr,draw_rect,sf::BlendAlpha); rect_draw_some_item(*source_gworld,source_rect,mainPtr,draw_rect,sf::BlendAlpha);
} else if(picture_wanted < 55) { } else if(picture_wanted < 55) {

View File

@@ -62,7 +62,7 @@ void init_snd_tool(){
} }
void play_sound(snd_num_t which, sf::Time delay) { // if < 0, play asynch void play_sound(snd_num_t which, sf::Time delay) { // if < 0, play asynch
const sf::SoundBuffer* sndhandle; std::shared_ptr<const sf::SoundBuffer> sndhandle;
if(!get_bool_pref("PlaySounds", true)) { if(!get_bool_pref("PlaySounds", true)) {
if(which >= 0) if(which >= 0)
sf::sleep(delay); sf::sleep(delay);