Refactor rendering to use an SFML view for placing the main UI within the overall interface

This commit is contained in:
2017-09-04 14:36:55 -04:00
parent e781653483
commit 9c69e006d8
19 changed files with 264 additions and 289 deletions

View File

@@ -203,11 +203,15 @@ bool cControl::handleClick(location){
if(!inWindow->pollEvent(e)) continue; if(!inWindow->pollEvent(e)) continue;
if(e.type == sf::Event::MouseButtonReleased){ if(e.type == sf::Event::MouseButtonReleased){
done = true; done = true;
clicked = frame.contains(e.mouseButton.x, e.mouseButton.y); location clickPos(e.mouseButton.x, e.mouseButton.y);
clickPos = inWindow->mapPixelToCoords(clickPos);
clicked = frame.contains(clickPos);
depressed = false; depressed = false;
} else if(e.type == sf::Event::MouseMoved){ } else if(e.type == sf::Event::MouseMoved){
restore_cursor(); restore_cursor();
depressed = frame.contains(e.mouseMove.x, e.mouseMove.y); location toPos(e.mouseMove.x, e.mouseMove.y);
toPos = inWindow->mapPixelToCoords(toPos);
depressed = frame.contains(toPos);
} }
} }
if(get_bool_pref("PlaySounds", true)) { if(get_bool_pref("PlaySounds", true)) {

View File

@@ -146,6 +146,7 @@ bool cTextField::handleClick(location clickLoc) {
} else if(e.type == sf::Event::MouseMoved){ } else if(e.type == sf::Event::MouseMoved){
restore_cursor(); restore_cursor();
location newLoc(e.mouseMove.x, e.mouseMove.y); location newLoc(e.mouseMove.x, e.mouseMove.y);
newLoc = inWindow->mapPixelToCoords(newLoc);
set_ip(newLoc, &cTextField::selectionPoint); set_ip(newLoc, &cTextField::selectionPoint);
if(is_double) { if(is_double) {
if(selectionPoint > initial_ip) { if(selectionPoint > initial_ip) {

View File

@@ -111,11 +111,14 @@ bool cScrollbar::handleClick(location where) {
while(!done){ while(!done){
redraw(); redraw();
if(!inWindow->pollEvent(e)) continue; if(!inWindow->pollEvent(e)) continue;
sf::Vector2i mouseLoc = sf::Mouse::getPosition(*inWindow); location mouseLoc = sf::Mouse::getPosition(*inWindow);
mouseLoc = inWindow->mapPixelToCoords(mouseLoc);
int mousePos = vert ? mouseLoc.y : mouseLoc.x; int mousePos = vert ? mouseLoc.y : mouseLoc.x;
if(e.type == sf::Event::MouseButtonReleased){ if(e.type == sf::Event::MouseButtonReleased){
done = true; done = true;
clicked = frame.contains(e.mouseButton.x, e.mouseButton.y); location clickLoc(e.mouseButton.x, e.mouseButton.y);
clickLoc = inWindow->mapPixelToCoords(clickLoc);
clicked = frame.contains(clickLoc);
depressed = false; depressed = false;
switch(pressedPart) { switch(pressedPart) {
case PART_UP: pos--; break; case PART_UP: pos--; break;
@@ -147,7 +150,9 @@ bool cScrollbar::handleClick(location where) {
depressed = mousePos >= bar_end - btn_size; depressed = mousePos >= bar_end - btn_size;
break; break;
} }
if(pressedPart != PART_THUMB && !frame.contains(e.mouseMove.x, e.mouseMove.y)) depressed = false; location toLoc(e.mouseMove.x, e.mouseMove.y);
toLoc = inWindow->mapPixelToCoords(toLoc);
if(pressedPart != PART_THUMB && !frame.contains(toLoc)) depressed = false;
} }
pos = minmax(0,max,pos); pos = minmax(0,max,pos);
if(parent && !link.empty()) if(parent && !link.empty())

View File

@@ -37,7 +37,6 @@
#include "render_shapes.hpp" #include "render_shapes.hpp"
rectangle bottom_buttons[14]; rectangle bottom_buttons[14];
rectangle world_screen = {23, 23, 346, 274};
rectangle item_screen_button_rects[9] = { rectangle item_screen_button_rects[9] = {
{125,10,141,28},{125,40,141,58},{125,68,141,86},{125,98,141,116},{125,126,141,144},{125,156,141,174}, {125,10,141,28},{125,40,141,58},{125,68,141,86},{125,98,141,116},{125,126,141,144},{125,156,141,174},
{126,176,141,211}, {126,176,141,211},
@@ -60,6 +59,7 @@ rectangle pc_buttons[6][5];
// name, hp, sp, info, trade // name, hp, sp, info, trade
extern rectangle startup_button[6]; extern rectangle startup_button[6];
extern rectangle win_to_rects[6];
extern bool flushingInput; extern bool flushingInput;
extern bool fog_lifted; extern bool fog_lifted;
extern bool cartoon_happening; extern bool cartoon_happening;
@@ -69,7 +69,7 @@ bool item_area_button_active[8][6];
bool pc_area_button_active[6][5]; bool pc_area_button_active[6][5];
short item_bottom_button_active[9] = {0,0,0,0,0, 0,1,1,1}; short item_bottom_button_active[9] = {0,0,0,0,0, 0,1,1,1};
rectangle pc_help_button,pc_area_rect,item_area_rect; rectangle pc_help_button;
short current_terrain_type = 0,num_out_moves = 0; short current_terrain_type = 0,num_out_moves = 0;
short store_drop_item; short store_drop_item;
@@ -85,6 +85,7 @@ extern eGameMode overall_mode;
extern location to_create; extern location to_create;
extern bool All_Done,spell_forced,monsters_going; extern bool All_Done,spell_forced,monsters_going;
extern bool party_in_memory; extern bool party_in_memory;
extern sf::View mainView;
// game info globals // game info globals
extern sf::RenderWindow mainPtr; extern sf::RenderWindow mainPtr;
@@ -107,7 +108,6 @@ extern eStatMode stat_screen_mode;
extern bool map_visible; extern bool map_visible;
extern sf::RenderWindow mini_map; extern sf::RenderWindow mini_map;
extern location ul;
extern std::shared_ptr<cScrollbar> text_sbar,item_sbar,shop_sbar; extern std::shared_ptr<cScrollbar> text_sbar,item_sbar,shop_sbar;
extern short shop_identify_cost; extern short shop_identify_cost;
@@ -128,7 +128,7 @@ bool current_bash_is_bash = false;
extern void edit_stuff_done(); extern void edit_stuff_done();
void init_screen_locs() { void init_screen_locs() {
rectangle startup_base = {279,5,327,306}; rectangle startup_base = {281,1,329,302};
rectangle shop_base = {63,12,99,267}; rectangle shop_base = {63,12,99,267};
for(short i = 0; i < 7; i++) for(short i = 0; i < 7; i++)
@@ -155,11 +155,11 @@ void init_screen_locs() {
for(short i = 0; i < 6; i++) { for(short i = 0; i < 6; i++) {
startup_button[i] = startup_base; startup_button[i] = startup_base;
startup_button[i].offset(301 * (i / 3) - 18,48 * (i % 3)); startup_button[i].offset(301 * (i / 3), 48 * (i % 3));
} }
startup_top.top = 5; startup_top.top = 7;
startup_top.bottom = startup_button[STARTBTN_LOAD].top; startup_top.bottom = startup_button[STARTBTN_LOAD].top;
startup_top.left = 5; startup_top.left = startup_base.left;
startup_top.right = startup_button[STARTBTN_JOIN].right; startup_top.right = startup_button[STARTBTN_JOIN].right;
// name, use, give, drip, info, sell/id each one 13 down // name, use, give, drip, info, sell/id each one 13 down
@@ -229,20 +229,6 @@ void init_screen_locs() {
pc_help_button.bottom = 114; pc_help_button.bottom = 114;
pc_help_button.left = 251; pc_help_button.left = 251;
pc_help_button.right = 267; pc_help_button.right = 267;
pc_area_rect.top = PC_WIN_UL_Y;
pc_area_rect.left = PC_WIN_UL_X;
pc_area_rect.bottom = PC_WIN_UL_Y + 116;
pc_area_rect.right = PC_WIN_UL_X + 271;
item_area_rect.top = ITEM_WIN_UL_Y;
item_area_rect.left = ITEM_WIN_UL_X;
item_area_rect.bottom = ITEM_WIN_UL_Y + 143;
item_area_rect.right = ITEM_WIN_UL_X + 271;
extern rectangle win_to_rects[6];
win_to_rects[5].offset(TEXT_WIN_UL_X,TEXT_WIN_UL_Y);
win_to_rects[2].offset(PC_WIN_UL_X,PC_WIN_UL_Y);
win_to_rects[3].offset(ITEM_WIN_UL_X,ITEM_WIN_UL_Y);
} }
bool prime_time() { bool prime_time() {
@@ -984,11 +970,14 @@ bool handle_action(sf::Event event) {
short button_hit = 12; short button_hit = 12;
bool right_button = event.mouseButton.button == sf::Mouse::Right; bool right_button = event.mouseButton.button == sf::Mouse::Right;
eGameMode previous_mode; eGameMode previous_mode;
rectangle world_screen = win_to_rects[WINRECT_TERVIEW];
world_screen.inset(13, 13);
std::ostringstream str; std::ostringstream str;
location the_point,point_in_area; location the_point,point_in_area;
the_point = location(event.mouseButton.x, event.mouseButton.y); the_point = location(event.mouseButton.x, event.mouseButton.y);
the_point = mainPtr.mapPixelToCoords(the_point, mainView);
end_scenario = false; end_scenario = false;
// MARK: First, figure out where party is // MARK: First, figure out where party is
@@ -1024,9 +1013,6 @@ bool handle_action(sf::Event event) {
return are_done; return are_done;
} }
the_point.x -= ul.x;
the_point.y -= ul.y;
// Now split off the extra stuff, like talking and shopping. // Now split off the extra stuff, like talking and shopping.
if(overall_mode == MODE_TALKING) { if(overall_mode == MODE_TALKING) {
handle_talk_event(the_point); handle_talk_event(the_point);
@@ -1132,8 +1118,8 @@ bool handle_action(sf::Event event) {
// MARK: Begin: click in terrain // MARK: Begin: click in terrain
if(the_point.in(world_screen) && (is_out() || is_town() || is_combat())){ if(the_point.in(world_screen) && (is_out() || is_town() || is_combat())){
int i = (the_point.x - 23) / 28; int i = (the_point.x - 32) / 28;
int j = (the_point.y - 23) / 36; int j = (the_point.y - 20) / 36;
location destination = cur_loc; location destination = cur_loc;
// Check for quick look // Check for quick look
@@ -1247,14 +1233,15 @@ bool handle_action(sf::Event event) {
// MARK: End: Screen shift // MARK: End: Screen shift
// MARK: Process clicks in PC stats area // MARK: Process clicks in PC stats area
if(the_point.in(pc_area_rect)) { if(the_point.in(win_to_rects[WINRECT_PCSTATS])) {
location pc_win_ul = win_to_rects[WINRECT_PCSTATS].topLeft();
point_in_area = the_point; point_in_area = the_point;
point_in_area.x -= PC_WIN_UL_X; point_in_area.x -= pc_win_ul.x;
point_in_area.y -= PC_WIN_UL_Y; point_in_area.y -= pc_win_ul.y;
if(point_in_area.in(pc_help_button)) { if(point_in_area.in(pc_help_button)) {
pc_help_button.offset(PC_WIN_UL_X,PC_WIN_UL_Y); rectangle help_button = pc_help_button;
arrow_button_click(pc_help_button); help_button.offset(pc_win_ul);
pc_help_button.offset(-PC_WIN_UL_X,-PC_WIN_UL_Y); arrow_button_click(help_button);
cChoiceDlog("help-party").show(); cChoiceDlog("help-party").show();
} }
for(int i = 0; i < 6; i++) for(int i = 0; i < 6; i++)
@@ -1262,9 +1249,9 @@ bool handle_action(sf::Event event) {
if(pc_area_button_active[i][j] && point_in_area.in(pc_buttons[i][j])) { if(pc_area_button_active[i][j] && point_in_area.in(pc_buttons[i][j])) {
if((j == 1 || j == 2) && !univ.party[i].is_alive()) if((j == 1 || j == 2) && !univ.party[i].is_alive())
break; break;
pc_buttons[i][j].offset(PC_WIN_UL_X,PC_WIN_UL_Y); rectangle button_rect = pc_buttons[i][j];
arrow_button_click(pc_buttons[i][j]); button_rect.offset(pc_win_ul);
pc_buttons[i][j].offset(-PC_WIN_UL_X,-PC_WIN_UL_Y); arrow_button_click(button_rect);
switch(j) { switch(j) {
case 0: case 0:
handle_switch_pc(i, need_redraw); handle_switch_pc(i, need_redraw);
@@ -1306,16 +1293,17 @@ bool handle_action(sf::Event event) {
} }
// Process clicks in item stats area // Process clicks in item stats area
if(the_point.in(item_area_rect)) { if(the_point.in(win_to_rects[WINRECT_INVEN])) {
location item_win_ul = win_to_rects[WINRECT_INVEN].topLeft();
point_in_area = the_point; point_in_area = the_point;
point_in_area.x -= ITEM_WIN_UL_X; point_in_area.x -= item_win_ul.x;
point_in_area.y -= ITEM_WIN_UL_Y; point_in_area.y -= item_win_ul.y;
for(int i = 0; i < 9; i++) for(int i = 0; i < 9; i++)
if(item_bottom_button_active[i] > 0 && point_in_area.in(item_screen_button_rects[i])) { if(item_bottom_button_active[i] > 0 && point_in_area.in(item_screen_button_rects[i])) {
item_screen_button_rects[i].offset(ITEM_WIN_UL_X,ITEM_WIN_UL_Y); rectangle button_rect = item_screen_button_rects[i];
arrow_button_click(item_screen_button_rects[i]); button_rect.offset(item_win_ul);
item_screen_button_rects[i].offset(-ITEM_WIN_UL_X,-ITEM_WIN_UL_Y); arrow_button_click(button_rect);
switch(i) { switch(i) {
case 6: // special screen case 6: // special screen
give_help(50,0); give_help(50,0);
@@ -1336,9 +1324,9 @@ bool handle_action(sf::Event event) {
for(int i = 0; i < 8; i++) for(int i = 0; i < 8; i++)
for(int j = 0; j < 6; j++) for(int j = 0; j < 6; j++)
if(item_area_button_active[i][j] && point_in_area.in(item_buttons[i][j])) { if(item_area_button_active[i][j] && point_in_area.in(item_buttons[i][j])) {
item_buttons[i][j].offset(ITEM_WIN_UL_X,ITEM_WIN_UL_Y); rectangle button_rect = item_buttons[i][j];
arrow_button_click(item_buttons[i][j]); button_rect.offset(item_win_ul);
item_buttons[i][j].offset(-ITEM_WIN_UL_X,-ITEM_WIN_UL_Y); arrow_button_click(button_rect);
item_hit = item_sbar->getPosition() + i; item_hit = item_sbar->getPosition() + i;
switch(j) { switch(j) {
@@ -1541,8 +1529,9 @@ void handle_menu_spell(eSpell spell_picked) {
pass_point.x = bottom_buttons[1].left + 5; pass_point.x = bottom_buttons[1].left + 5;
pass_point.y = bottom_buttons[1].top + 5; pass_point.y = bottom_buttons[1].top + 5;
} }
event.mouseButton.x = pass_point.x + ul.x; pass_point = mainPtr.mapCoordsToPixel(pass_point, mainView);
event.mouseButton.y = pass_point.y + ul.y; event.mouseButton.x = pass_point.x;
event.mouseButton.y = pass_point.y;
handle_action(event); handle_action(event);
} }
@@ -1651,8 +1640,9 @@ bool handle_keystroke(sf::Event& event){
for(short i = 0; i < 9; i++) for(short i = 0; i < 9; i++)
if(chr2 == talk_chars[i] && (!talk_end_forced || i == 6 || i == 5)) { if(chr2 == talk_chars[i] && (!talk_end_forced || i == 6 || i == 5)) {
int j = talk_end_forced ? i - 5 : i; int j = talk_end_forced ? i - 5 : i;
pass_point.x = talk_words[j].rect.left + 9 + ul.x; pass_point = talk_words[j].rect.topLeft();
pass_point.y = talk_words[j].rect.top + 9 + ul.y; pass_point.x += 9; pass_point.y += 9;
pass_point = mainPtr.mapCoordsToPixel(pass_point, mainView);
pass_event.mouseButton.x = pass_point.x; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.y = pass_point.y; pass_event.mouseButton.y = pass_point.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
@@ -1665,8 +1655,9 @@ bool handle_keystroke(sf::Event& event){
} }
for(short i = 0; i < 8; i++) for(short i = 0; i < 8; i++)
if(chr2 == shop_chars[i]) { if(chr2 == shop_chars[i]) {
pass_point.x = shopping_rects[i][SHOPRECT_ACTIVE_AREA].left + 9 + ul.x; pass_point = shopping_rects[i][SHOPRECT_ACTIVE_AREA].topLeft();
pass_point.y = shopping_rects[i][SHOPRECT_ACTIVE_AREA].top + 9 + ul.y; pass_point.x += 9; pass_point.y += 9;
pass_point = mainPtr.mapCoordsToPixel(pass_point, mainView);
pass_event.mouseButton.x = pass_point.x; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.y = pass_point.y; pass_event.mouseButton.y = pass_point.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
@@ -1678,8 +1669,7 @@ bool handle_keystroke(sf::Event& event){
chr2 = kb::Z; chr2 = kb::Z;
} }
else { else {
pass_point.x = terrain_click[i].x + ul.x; pass_point = mainPtr.mapCoordsToPixel(terrain_click[i], mainView);
pass_point.y = terrain_click[i].y + ul.y;
pass_event.mouseButton.x = pass_point.x; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.y = pass_point.y; pass_event.mouseButton.y = pass_point.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
@@ -1727,24 +1717,30 @@ bool handle_keystroke(sf::Event& event){
break; break;
case '1': case '2': case '3': case '4': case '5': case '6': case '1': case '2': case '3': case '4': case '5': case '6':
pass_point.x = pc_buttons[((short) chr) - 49][0].left + 1 + PC_WIN_UL_X + ul.x; pass_point = pc_buttons[((short) chr) - 49][0].topLeft();
pass_point.y = pc_buttons[((short) chr) - 49][0].top + PC_WIN_UL_Y + ul.y; pass_point.x += 1 + win_to_rects[WINRECT_PCSTATS].left;
pass_point.y += win_to_rects[WINRECT_PCSTATS].top;
pass_point = mainPtr.mapCoordsToPixel(pass_point, mainView);
pass_event.mouseButton.x = pass_point.x; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.y = pass_point.y; pass_event.mouseButton.y = pass_point.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
break; break;
case '9': // Special items case '9': // Special items
pass_point.x = item_screen_button_rects[6].left + ITEM_WIN_UL_X + ul.x; pass_point = item_screen_button_rects[6].topLeft();
pass_point.y = item_screen_button_rects[6].top + ITEM_WIN_UL_Y + ul.y; pass_point.x += win_to_rects[WINRECT_INVEN].left;
pass_point.y += win_to_rects[WINRECT_INVEN].top;
pass_point = mainPtr.mapCoordsToPixel(pass_point, mainView);
pass_event.mouseButton.x = pass_point.x; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.y = pass_point.y; pass_event.mouseButton.y = pass_point.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
break; break;
case '0': // Jobs/quests case '0': // Jobs/quests
pass_point.x = item_screen_button_rects[7].left + ITEM_WIN_UL_X + ul.x; pass_point = item_screen_button_rects[7].topLeft();
pass_point.y = item_screen_button_rects[7].top + ITEM_WIN_UL_Y + ul.y; pass_point.x += win_to_rects[WINRECT_INVEN].left;
pass_point.y += win_to_rects[WINRECT_INVEN].top;
pass_point = mainPtr.mapCoordsToPixel(pass_point, mainView);
pass_event.mouseButton.x = pass_point.x; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.y = pass_point.y; pass_event.mouseButton.y = pass_point.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
@@ -1754,17 +1750,16 @@ bool handle_keystroke(sf::Event& event){
if(overall_mode == MODE_FANCY_TARGET) { // cast multi-target spell, set # targets to 0 so that if(overall_mode == MODE_FANCY_TARGET) { // cast multi-target spell, set # targets to 0 so that
// space clicked doesn't matter // space clicked doesn't matter
num_targets_left = 0; num_targets_left = 0;
pass_point = terrain_click[5]; pass_point = mainPtr.mapCoordsToPixel(terrain_click[5], mainView);
pass_event.mouseButton.x = pass_point.x + ul.x; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.y = pass_point.y + ul.y; pass_event.mouseButton.y = pass_point.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
} else if(overall_mode == MODE_SPELL_TARGET) } else if(overall_mode == MODE_SPELL_TARGET)
// Rotate a force wall // Rotate a force wall
spell_cast_hit_return(); spell_cast_hit_return();
else if(overall_mode == MODE_TOWN || overall_mode == MODE_COMBAT || overall_mode == MODE_OUTDOORS) { else if(overall_mode == MODE_TOWN || overall_mode == MODE_COMBAT || overall_mode == MODE_OUTDOORS) {
// Pause (skip turn) // Pause (skip turn)
pass_point.x = terrain_click[5].x + ul.x; pass_point = mainPtr.mapCoordsToPixel(terrain_click[5], mainView);
pass_point.y = terrain_click[5].y + ul.y;
pass_event.mouseButton.x = pass_point.x; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.y = pass_point.y; pass_event.mouseButton.y = pass_point.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
@@ -2032,36 +2027,33 @@ bool handle_keystroke(sf::Event& event){
break; break;
case 'a': // Show automap case 'a': // Show automap
if(overall_mode < MODE_TALK_TOWN) { if(overall_mode < MODE_TALK_TOWN) {
pass_point.x = (overall_mode == MODE_OUTDOORS) ? 180 : 221; pass_point = mainPtr.mapCoordsToPixel({overall_mode == MODE_OUTDOORS ? 180 : 221, 405}, mainView);
pass_point.y = 405; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.x = pass_point.x + ul.x; pass_event.mouseButton.y = pass_point.y;
pass_event.mouseButton.y = pass_point.y + ul.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
} }
break; break;
case 'u': // Use space case 'u': // Use space
if(overall_mode == MODE_TOWN || overall_mode == MODE_USE_TOWN) { if(overall_mode == MODE_TOWN || overall_mode == MODE_USE_TOWN) {
pass_point.x = 220; pass_point = mainPtr.mapCoordsToPixel({220, 388}, mainView);
pass_point.y = 388; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.x = pass_point.x + ul.x; pass_event.mouseButton.y = pass_point.y;
pass_event.mouseButton.y = pass_point.y + ul.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
} }
break; break;
case 'b': case 'L': // Bash door, pick lock case 'b': case 'L': // Bash door, pick lock
if(overall_mode == MODE_TOWN || overall_mode == MODE_BASH_TOWN) { if(overall_mode == MODE_TOWN || overall_mode == MODE_BASH_TOWN) {
pass_point.x = chr == 'b' ? 1002 : 1003; pass_point = mainPtr.mapCoordsToPixel({chr == 'b' ? 1002 : 1003, 0}, mainView);
pass_point.y = 0; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.x = pass_point.x + ul.x; pass_event.mouseButton.y = pass_point.y;
pass_event.mouseButton.y = pass_point.y + ul.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
} }
case 'A': // Alchemy case 'A': // Alchemy
if(overall_mode == MODE_TOWN) { if(overall_mode == MODE_TOWN) {
pass_point.x = 1000 + ul.x; pass_point = mainPtr.mapCoordsToPixel({1000, 0}, mainView);
pass_event.mouseButton.x = pass_point.x; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.y = pass_point.y; pass_event.mouseButton.y = pass_point.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
@@ -2101,7 +2093,7 @@ bool handle_keystroke(sf::Event& event){
if(overall_mode == MODE_COMBAT) if(overall_mode == MODE_COMBAT)
btn = 5; btn = 5;
else if(overall_mode == MODE_TOWN) { else if(overall_mode == MODE_TOWN) {
pass_point.x = 1001 + ul.x; pass_point = mainPtr.mapCoordsToPixel({1001, 0}, mainView);
pass_event.mouseButton.x = pass_point.x; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.y = pass_point.y; pass_event.mouseButton.y = pass_point.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
@@ -2142,8 +2134,9 @@ bool handle_keystroke(sf::Event& event){
if(btn < 50) { if(btn < 50) {
pass_point.x = bottom_buttons[btn].left + 5; pass_point.x = bottom_buttons[btn].left + 5;
pass_point.y = bottom_buttons[btn].top + 5; pass_point.y = bottom_buttons[btn].top + 5;
pass_event.mouseButton.x = pass_point.x + ul.x; pass_point = mainPtr.mapCoordsToPixel(pass_point, mainView);
pass_event.mouseButton.y = pass_point.y + ul.y; pass_event.mouseButton.x = pass_point.x;
pass_event.mouseButton.y = pass_point.y;
are_done = handle_action(pass_event); are_done = handle_action(pass_event);
} }
break; break;
@@ -2154,12 +2147,13 @@ bool handle_keystroke(sf::Event& event){
bool handle_scroll(sf::Event& event) { bool handle_scroll(sf::Event& event) {
rectangle status_panel_rect = {0,0,144,271}, text_panel_rect = {0,0,138,271}; rectangle status_panel_rect = {0,0,144,271}, text_panel_rect = {0,0,138,271};
status_panel_rect.offset(ul); rectangle world_screen = win_to_rects[WINRECT_TERVIEW];
status_panel_rect.offset(ITEM_WIN_UL_X,ITEM_WIN_UL_Y); world_screen.inset(13, 13);
text_panel_rect.offset(ul); status_panel_rect.offset(win_to_rects[WINRECT_INVEN].topLeft());
text_panel_rect.offset(TEXT_WIN_UL_X,TEXT_WIN_UL_Y); text_panel_rect.offset(win_to_rects[WINRECT_TRANSCRIPT].topLeft());
fill_rect(mainPtr, world_screen, sf::Color::Magenta); fill_rect(mainPtr, world_screen, sf::Color::Magenta);
location pos(event.mouseWheel.x, event.mouseWheel.y); location pos(event.mouseWheel.x, event.mouseWheel.y);
pos = mainPtr.mapPixelToCoords(pos, mainView);
int amount = event.mouseWheel.delta; int amount = event.mouseWheel.delta;
if(item_sbar->isVisible() && pos.in(status_panel_rect)) { if(item_sbar->isVisible() && pos.in(status_panel_rect)) {
item_sbar->setPosition(item_sbar->getPosition() - amount); item_sbar->setPosition(item_sbar->getPosition() - amount);

View File

@@ -114,4 +114,12 @@ const int PCBTN_TRADE = 4;
const int ITEM_WIN_SPECIAL = 6; const int ITEM_WIN_SPECIAL = 6;
const int ITEM_WIN_QUESTS = 7; const int ITEM_WIN_QUESTS = 7;
// Gobal window rects
const int WINRECT_TERVIEW = 0;
const int WINRECT_ACTBTNS = 1;
const int WINRECT_PCSTATS = 2;
const int WINRECT_INVEN = 3;
const int WINRECT_STATUS = 4;
const int WINRECT_TRANSCRIPT = 5;
#endif #endif

View File

@@ -39,7 +39,6 @@ extern short stat_window;
extern eGameMode overall_mode; extern eGameMode overall_mode;
extern bool changed_display_mode; extern bool changed_display_mode;
extern sf::RenderWindow mainPtr; extern sf::RenderWindow mainPtr;
extern location ul;
extern rectangle d_rects[80]; extern rectangle d_rects[80];
extern short d_rect_index[80]; extern short d_rect_index[80];
extern eStatMode stat_screen_mode; extern eStatMode stat_screen_mode;
@@ -67,7 +66,7 @@ short store_personality,store_personality_graphic,shop_identify_cost;
std::string save_talk_str1, save_talk_str2; std::string save_talk_str1, save_talk_str2;
sf::RenderTexture talk_gworld; sf::RenderTexture talk_gworld;
bool talk_end_forced; bool talk_end_forced;
rectangle talk_area_rect = {5,5,420,284}, word_place_rect = {44,7,372,257},talk_help_rect = {5,254,21,272}; rectangle talk_area_rect = {7,19,422,298}, word_place_rect = {44,7,372,257},talk_help_rect = {7,268,23,286};
std::string title_string; std::string title_string;
mon_num_t store_monst_type; mon_num_t store_monst_type;
short store_m_num; short store_m_num;
@@ -206,16 +205,14 @@ void handle_shop_event(location p) {
unsigned long store_what_picked; unsigned long store_what_picked;
if(p.in(talk_help_rect)) { if(p.in(talk_help_rect)) {
location loc = {p.x + ul.x, p.y + ul.y}; if(!help_btn->handleClick(p))
if(!help_btn->handleClick(loc))
return; return;
give_help(226,27); give_help(226,27);
return; return;
} }
if(p.in(shop_done_rect)) { if(p.in(shop_done_rect)) {
location loc = {p.x + ul.x, p.y + ul.y}; if(done_btn->handleClick(p))
if(done_btn->handleClick(loc))
end_shop_mode(); end_shop_mode();
return; return;
} }
@@ -675,8 +672,7 @@ void handle_talk_event(location p) {
eTalkNode ttype; eTalkNode ttype;
if(p.in(talk_help_rect)) { if(p.in(talk_help_rect)) {
location loc = {p.x + ul.x, p.y + ul.y}; if(!help_btn->handleClick(p))
if(!help_btn->handleClick(loc))
return; return;
give_help(205,6); give_help(205,6);
return; return;

View File

@@ -11,13 +11,6 @@
#define ASB add_string_to_buf #define ASB add_string_to_buf
#define PSD univ.party.stuff_done #define PSD univ.party.stuff_done
const int PC_WIN_UL_X = 291;
const int PC_WIN_UL_Y = 5;
const int ITEM_WIN_UL_X = 291;
const int ITEM_WIN_UL_Y = 130;
const int TEXT_WIN_UL_X = 291;
const int TEXT_WIN_UL_Y = 283;
const int NUM_MONST_G = 173; const int NUM_MONST_G = 173;
const int NUM_TER_G = 251; const int NUM_TER_G = 251;
const int NUM_ITEM_G = 120; const int NUM_ITEM_G = 120;

View File

@@ -42,7 +42,6 @@ extern bool flushingInput;
extern bool cartoon_happening, fog_lifted; extern bool cartoon_happening, fog_lifted;
extern short anim_step; extern short anim_step;
extern effect_pat_type current_pat; extern effect_pat_type current_pat;
extern location ul;
extern location center; extern location center;
extern short which_combat_type; extern short which_combat_type;
extern bool monsters_going,boom_anim_active; extern bool monsters_going,boom_anim_active;
@@ -68,13 +67,14 @@ extern std::string save_talk_str1, save_talk_str2;
rectangle menuBarRect; rectangle menuBarRect;
Region originalGrayRgn, newGrayRgn, underBarRgn; Region originalGrayRgn, newGrayRgn, underBarRgn;
sf::View mainView;
long anim_ticks = 0; long anim_ticks = 0;
// 0 - terrain 1 - buttons 2 - pc stats // 0 - terrain 1 - buttons 2 - pc stats
// 3 - item stats 4 - text bar 5 - text area (not right) // 3 - item stats 4 - text bar 5 - text area (not right)
rectangle win_from_rects[6] = {{0,0,350,278},{0,0,37,258},{0,0,115,288},{0,0,143,288},{0,0,21,279},{0,0,0,288}}; rectangle win_from_rects[6] = {{0,0,350,278},{0,0,37,258},{0,0,115,288},{0,0,143,288},{0,0,21,279},{0,0,0,288}};
rectangle win_to_rects[6] = {{5,5,356,284},{383,5,421,271},{0,0,116,271},{0,0,144,271},{358,5,379,284},{0,0,138,256}}; rectangle win_to_rects[6] = {{7,19,358,298},{385,19,423,285},{7,305,123,576},{132,305,276,576},{360,19,381,298},{285,305,423,561}};
// 0 - title 1 - button 2 - credits 3 - base button // 0 - title 1 - button 2 - credits 3 - base button
rectangle startup_from[4] = {{0,0,274,602},{274,0,322,301},{0,301,67,579},{274,301,314,341}}; rectangle startup_from[4] = {{0,0,274,602},{274,0,322,301},{0,301,67,579},{274,301,314,341}};
@@ -125,47 +125,61 @@ location ok_space[4] = {loc(),loc(),loc(),loc()};
sf::Image hold_pict; sf::Image hold_pict;
void adjust_window_mode() { void adjust_window_mode() {
sf::FloatRect r;
sf::ContextSettings winSettings; sf::ContextSettings winSettings;
winSettings.stencilBits = 1; winSettings.stencilBits = 1;
sf::VideoMode desktop = sf::VideoMode::getDesktopMode(); sf::VideoMode desktop = sf::VideoMode::getDesktopMode();
hideMenuBar(); hideMenuBar();
int menubarHeight = getMenubarHeight(); int menubarHeight = getMenubarHeight();
bool firstTime = !mainPtr.isOpen(); bool firstTime = !mainPtr.isOpen();
float width = 605, height = 430;
location ul;
// TODO: Make display_mode an enum // TODO: Make display_mode an enum
// 0 - center 1- ul 2 - ur 3 - dl 4 - dr 5 - small win // 0 - center 1- ul 2 - ur 3 - dl 4 - dr 5 - small win
if(get_int_pref("DisplayMode") == 5) { int mode = get_int_pref("DisplayMode");
ul.x = 14; ul.y = 2; if(mode == 5) {
int height = 430 + menubarHeight; int winHeight = height + menubarHeight;
mainPtr.create(sf::VideoMode(605, height, 32), "Blades of Exile", sf::Style::Titlebar | sf::Style::Close, winSettings); mainPtr.create(sf::VideoMode(width, winHeight, 32), "Blades of Exile", sf::Style::Titlebar | sf::Style::Close, winSettings);
mainPtr.setPosition({static_cast<int>((desktop.width - 605) / 2), static_cast<int>((desktop.height - height) / 2)}); mainPtr.setPosition({static_cast<int>((desktop.width - width) / 2), static_cast<int>((desktop.height - height) / 2)});
r = rectangle(mainPtr); } else {
}
else {
mainPtr.create(desktop, "Blades of Exile", sf::Style::None, winSettings); mainPtr.create(desktop, "Blades of Exile", sf::Style::None, winSettings);
mainPtr.setPosition({0,0}); mainPtr.setPosition({0,0});
rectangle windRect(mainPtr);
switch(get_int_pref("DisplayMode")) {
case 0: ul.x = (windRect.right - 560) / 2; ul.y = (windRect.bottom - 422) / 2 + 14; break;
case 1: ul.x = 10; ul.y = 28; break;
case 2: ul.x = windRect.right - 570 - 6; ul.y = 28; break; // was 560. not 570
case 3: ul.x = 10; ul.y = windRect.bottom - 422 - 6; break;
case 4: ul.x = windRect.right - 570 - 6; ul.y = windRect.bottom - 422 - 6; break;
}
r = windRect;
} }
rectangle windRect(mainPtr);
if(mode == 0) {
ul.x = (windRect.right - width) / 2;
ul.y = (windRect.bottom - height) / 2;
} else if(mode < 5) {
if(mode == 1 || mode == 3)
ul.x = 10;
else ul.x = windRect.right - width - 10;
if(mode == 1 || mode == 2)
ul.y = 28 + menubarHeight;
else ul.y = windRect.bottom - height - 28;
}
// Initialize the viewport for the game UI
mainView.setSize(width, height);
mainView.setCenter(/*ul.x +*/ width / 2, /*ul.y +*/ height / 2);
sf::FloatRect mainPort;
mainPort.left = float(ul.x) / windRect.width();
mainPort.top = float(ul.y) / windRect.height();
mainPort.width = width / windRect.width();
mainPort.height = height / windRect.height();
mainView.setViewport(mainPort);
#ifndef __APPLE__ // This overrides Dock icon on OSX, which isn't what we want at all #ifndef __APPLE__ // This overrides Dock icon on OSX, which isn't what we want at all
ImageRsrc& icon = *ResMgr::get<ImageRsrc>("icon"); ImageRsrc& icon = *ResMgr::get<ImageRsrc>("icon");
mainPtr.setIcon(icon.getSize().x, icon.getSize().y, icon.copyToImage().getPixelsPtr()); mainPtr.setIcon(icon.getSize().x, icon.getSize().y, icon.copyToImage().getPixelsPtr());
#endif #endif
if(!firstTime) redraw_screen(REFRESH_NONE); if(!firstTime) redraw_screen(REFRESH_NONE);
if(text_sbar) { if(text_sbar) {
text_sbar->relocate({ul.x + 546,ul.y + 283}); text_sbar->relocate({560,285});
item_sbar->relocate({ul.x + 546,ul.y + 146}); item_sbar->relocate({560,148});
shop_sbar->relocate({ul.x + 258,ul.y + 67}); shop_sbar->relocate({272,69});
done_btn->relocate({ul.x + 217,ul.y + 393}); done_btn->relocate({231,395});
help_btn->relocate({ul.x + 259,ul.y + 10}); help_btn->relocate({273,12});
} }
init_menubar(); init_menubar();
showMenuBar(); showMenuBar();
@@ -179,19 +193,11 @@ void init_startup() {
} }
void draw_startup(short but_type) { void draw_startup(short but_type) {
rectangle to_rect;
rectangle r1 = {-1000,-1000,5,1000},r2 = {-1000,-1000,1000,5},r3 = {418,-1000,2000,1000},
r4 = {-1000,579,1000,2500};
sf::Texture& startup_gworld = *ResMgr::get<ImageRsrc>("startup"); sf::Texture& startup_gworld = *ResMgr::get<ImageRsrc>("startup");
to_rect = startup_from[0]; rect_draw_some_item(startup_gworld,startup_from[0],mainPtr,startup_top);
to_rect.offset(-13,5);
rect_draw_some_item(startup_gworld,startup_from[0],to_rect,ul);
to_rect = startup_top;
to_rect.offset(ul);
for(short i = 0; i < 5; i++) { for(short i = 0; i < 5; i++) {
rect_draw_some_item(startup_gworld,startup_from[1],startup_button[i],ul); rect_draw_some_item(startup_gworld,startup_from[1],mainPtr,startup_button[i]);
draw_start_button(i,but_type); draw_start_button(i,but_type);
} }
draw_startup_anim(false); draw_startup_anim(false);
@@ -207,9 +213,9 @@ void draw_startup_anim(bool advance) {
anim_from = anim_to; anim_from = anim_to;
anim_from.offset(-1,-4 + startup_anim_pos); anim_from.offset(-1,-4 + startup_anim_pos);
if(advance) startup_anim_pos = (startup_anim_pos + 1) % 542; if(advance) startup_anim_pos = (startup_anim_pos + 1) % 542;
rect_draw_some_item(*ResMgr::get<ImageRsrc>("startbut"),anim_size,startup_button[5],ul); rect_draw_some_item(*ResMgr::get<ImageRsrc>("startbut"),anim_size,mainPtr,startup_button[5]);
anim_to.offset(startup_button[5].left, startup_button[5].top); anim_to.offset(startup_button[5].left, startup_button[5].top);
rect_draw_some_item(*ResMgr::get<ImageRsrc>("startanim"),anim_from,anim_to,ul,sf::BlendAlpha); rect_draw_some_item(*ResMgr::get<ImageRsrc>("startanim"),anim_from,mainPtr,anim_to,sf::BlendAlpha);
} }
void draw_startup_stats() { void draw_startup_stats() {
@@ -226,22 +232,24 @@ void draw_startup_stats() {
if(!party_in_memory) { if(!party_in_memory) {
style.pointSize = 20; style.pointSize = 20;
to_rect.offset(175,40); to_rect.offset(193,40);
win_draw_string(mainPtr,to_rect,"No Party in Memory",eTextMode::WRAP,style,ul); win_draw_string(mainPtr,to_rect,"No Party in Memory",eTextMode::WRAP,style);
} else { } else {
frame_rect = startup_top; frame_rect = startup_top;
frame_rect.inset(50,50); frame_rect.inset(50,50);
frame_rect.top += 30; frame_rect.top += 30;
frame_rect.offset(ul.x - 9,ul.y + 10); frame_rect.left += 18;
frame_rect.offset(-9,10);
// TODO: Maybe I should rename that variable // TODO: Maybe I should rename that variable
::frame_rect(mainPtr, frame_rect, sf::Color::White); ::frame_rect(mainPtr, frame_rect, sf::Color::White);
to_rect.offset(203,37); to_rect.offset(221,37);
win_draw_string(mainPtr,to_rect,"Your party:",eTextMode::WRAP,style,ul); win_draw_string(mainPtr,to_rect,"Your party:",eTextMode::WRAP,style);
style.pointSize = 12; style.pointSize = 12;
style.font = FONT_BOLD; style.font = FONT_BOLD;
for(short i = 0; i < 6; i++) { for(short i = 0; i < 6; i++) {
pc_rect = startup_top; pc_rect = startup_top;
pc_rect.left += 18;
pc_rect.right = pc_rect.left + 300; pc_rect.right = pc_rect.left + 300;
pc_rect.bottom = pc_rect.top + 79; pc_rect.bottom = pc_rect.top + 79;
pc_rect.offset(60 + 232 * (i / 3) - 9,95 + 45 * (i % 3)); pc_rect.offset(60 + 232 * (i / 3) - 9,95 + 45 * (i % 3));
@@ -253,7 +261,7 @@ void draw_startup_stats() {
if(pic >= 1000) { if(pic >= 1000) {
sf::Texture* gw; 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,to_rect,ul,sf::BlendAlpha); rect_draw_some_item(*gw,from_rect,mainPtr,to_rect,sf::BlendAlpha);
} else if(pic >= 100) { } else if(pic >= 100) {
pic -= 100; pic -= 100;
// Note that we assume it's a 1x1 graphic. // Note that we assume it's a 1x1 graphic.
@@ -261,16 +269,16 @@ void draw_startup_stats() {
from_rect = get_monster_template_rect(pic, 0, 0); from_rect = get_monster_template_rect(pic, 0, 0);
int which_sheet = m_pic_index[pic].i / 20; int which_sheet = m_pic_index[pic].i / 20;
sf::Texture& monst_gworld = *ResMgr::get<ImageRsrc>("monst" + std::to_string(1 + which_sheet)); sf::Texture& monst_gworld = *ResMgr::get<ImageRsrc>("monst" + std::to_string(1 + which_sheet));
rect_draw_some_item(monst_gworld,from_rect,to_rect,ul,sf::BlendAlpha); rect_draw_some_item(monst_gworld,from_rect,mainPtr,to_rect,sf::BlendAlpha);
} else { } else {
from_rect = calc_rect(2 * (pic / 8), pic % 8); from_rect = calc_rect(2 * (pic / 8), pic % 8);
sf::Texture& pc_gworld = *ResMgr::get<ImageRsrc>("pcs"); sf::Texture& pc_gworld = *ResMgr::get<ImageRsrc>("pcs");
rect_draw_some_item(pc_gworld,from_rect,to_rect,ul,sf::BlendAlpha); rect_draw_some_item(pc_gworld,from_rect,mainPtr,to_rect,sf::BlendAlpha);
} }
style.pointSize = 14; style.pointSize = 14;
pc_rect.offset(35,0); pc_rect.offset(35,0);
win_draw_string(mainPtr,pc_rect,univ.party[i].name,eTextMode::WRAP,style,ul); win_draw_string(mainPtr,pc_rect,univ.party[i].name,eTextMode::WRAP,style);
to_rect.offset(pc_rect.left + 8,pc_rect.top + 8); to_rect.offset(pc_rect.left + 8,pc_rect.top + 8);
} }
@@ -302,7 +310,7 @@ void draw_startup_stats() {
case eRace::BIRD: status += " Bird"; break; case eRace::BIRD: status += " Bird"; break;
default: status += " *ERROR INVALID RACE*"; break; default: status += " *ERROR INVALID RACE*"; break;
} }
win_draw_string(mainPtr,pc_rect,status,eTextMode::WRAP,style,ul); win_draw_string(mainPtr,pc_rect,status,eTextMode::WRAP,style);
pc_rect.offset(0,13); pc_rect.offset(0,13);
status = "Health " + std::to_string(univ.party[i].max_health); status = "Health " + std::to_string(univ.party[i].max_health);
status += ", Spell pts. " + std::to_string(univ.party[i].max_sp); status += ", Spell pts. " + std::to_string(univ.party[i].max_sp);
@@ -324,7 +332,7 @@ void draw_startup_stats() {
break; break;
} }
if(!status.empty()) if(!status.empty())
win_draw_string(mainPtr,pc_rect,status,eTextMode::WRAP,style,ul); win_draw_string(mainPtr,pc_rect,status,eTextMode::WRAP,style);
} }
} }
@@ -338,13 +346,13 @@ void draw_startup_stats() {
std::string copyright = sout.str(); std::string copyright = sout.str();
style.font = FONT_BOLD; style.font = FONT_BOLD;
style.pointSize = 10; style.pointSize = 10;
pc_rect = startup_from[0]; pc_rect = startup_top;
pc_rect.offset(5,5); pc_rect.offset(5,5);
pc_rect.top = pc_rect.bottom - 25; pc_rect.top = pc_rect.bottom - 30;
pc_rect.left = pc_rect.right - string_length(copyright, style) - 45; pc_rect.left = pc_rect.right - string_length(copyright, style) - 32;
// TODO: Should replace this with a more appropriate copyright string // TODO: Should replace this with a more appropriate copyright string
// Windows replaced it with "That is not dead which can eternally lie..." - I don't think that's quite appropriate though. // Windows replaced it with "That is not dead which can eternally lie..." - I don't think that's quite appropriate though.
win_draw_string(mainPtr, pc_rect, copyright, eTextMode::WRAP, style, ul); win_draw_string(mainPtr, pc_rect, copyright, eTextMode::WRAP, style);
} }
@@ -363,7 +371,7 @@ void draw_start_button(short which_position,short which_button) {
to_rect.left += 4; to_rect.top += 4; to_rect.left += 4; to_rect.top += 4;
to_rect.right = to_rect.left + 40; to_rect.right = to_rect.left + 40;
to_rect.bottom = to_rect.top + 40; to_rect.bottom = to_rect.top + 40;
rect_draw_some_item(*ResMgr::get<ImageRsrc>("startup"),from_rect,to_rect,ul); rect_draw_some_item(*ResMgr::get<ImageRsrc>("startup"),from_rect,mainPtr,to_rect);
TextStyle style; TextStyle style;
style.font = FONT_DUNGEON; style.font = FONT_DUNGEON;
@@ -377,7 +385,7 @@ void draw_start_button(short which_position,short which_button) {
base_color.b += (48 * which_button); base_color.b += (48 * which_button);
style.colour = base_color; style.colour = base_color;
style.lineHeight = 18; style.lineHeight = 18;
win_draw_string(mainPtr,to_rect,button_labels[which_position],eTextMode::CENTRE,style,ul); win_draw_string(mainPtr,to_rect,button_labels[which_position],eTextMode::CENTRE,style);
} }
void main_button_click(int which_button) { void main_button_click(int which_button) {
@@ -392,7 +400,6 @@ void main_button_click(int which_button) {
} }
void arrow_button_click(rectangle button_rect) { void arrow_button_click(rectangle button_rect) {
button_rect.offset(ul);
mainPtr.setActive(); mainPtr.setActive();
clip_rect(mainPtr, button_rect); clip_rect(mainPtr, button_rect);
// TODO: Mini-event loop so that the click doesn't happen until releasing the mouse button // TODO: Mini-event loop so that the click doesn't happen until releasing the mouse button
@@ -450,7 +457,9 @@ void redraw_screen(int refresh) {
if(refresh & REFRESH_INVEN) put_item_screen(stat_window); if(refresh & REFRESH_INVEN) put_item_screen(stat_window);
if(refresh & REFRESH_TRANS) print_buf(); if(refresh & REFRESH_TRANS) print_buf();
mainPtr.setView(mainPtr.getDefaultView());
put_background(); put_background();
mainPtr.setView(mainView);
switch(overall_mode) { switch(overall_mode) {
case MODE_STARTUP: case MODE_STARTUP:
draw_startup(0); draw_startup(0);
@@ -581,8 +590,7 @@ void draw_buttons(short mode) {
rect_draw_some_item(buttons_gworld, source_rect, button_gw, to_rect, sf::BlendAlpha); rect_draw_some_item(buttons_gworld, source_rect, button_gw, to_rect, sf::BlendAlpha);
to_rect.inset(-3,-3); to_rect.inset(-3,-3);
} }
to_rect.offset(win_to_rects[1].topLeft()); to_rect.offset(win_to_rects[WINRECT_ACTBTNS].topLeft());
to_rect.offset(ul);
if(i == mode) if(i == mode)
fill_rect(mainPtr, to_rect, sf::Color::Blue); fill_rect(mainPtr, to_rect, sf::Color::Blue);
else fill_rect(mainPtr, to_rect, sf::Color::Black); else fill_rect(mainPtr, to_rect, sf::Color::Black);
@@ -594,8 +602,7 @@ void draw_buttons(short mode) {
} }
button_gw.display(); button_gw.display();
dest_rec = win_to_rects[1]; dest_rec = win_to_rects[WINRECT_ACTBTNS];
dest_rec.offset(ul);
rect_draw_some_item(button_gw.getTexture(), rectangle(button_gw), mainPtr, dest_rec, sf::BlendAdd); rect_draw_some_item(button_gw.getTexture(), rectangle(button_gw), mainPtr, dest_rec, sf::BlendAdd);
} }
@@ -642,7 +649,7 @@ void draw_text_bar() {
void put_text_bar(std::string str) { void put_text_bar(std::string str) {
text_bar_gworld.setActive(); text_bar_gworld.setActive();
rect_draw_some_item(*ResMgr::get<ImageRsrc>("textbar"), win_from_rects[4], text_bar_gworld, win_from_rects[4]); rect_draw_some_item(*ResMgr::get<ImageRsrc>("textbar"), win_from_rects[WINRECT_STATUS], text_bar_gworld, win_from_rects[WINRECT_STATUS]);
TextStyle style; TextStyle style;
style.colour = sf::Color::White; style.colour = sf::Color::White;
style.font = FONT_BOLD; style.font = FONT_BOLD;
@@ -682,7 +689,7 @@ void put_text_bar(std::string str) {
void refresh_text_bar() { void refresh_text_bar() {
mainPtr.setActive(); mainPtr.setActive();
rect_draw_some_item(text_bar_gworld.getTexture(), win_from_rects[4], win_to_rects[4],ul); rect_draw_some_item(text_bar_gworld.getTexture(), win_from_rects[WINRECT_STATUS], mainPtr, win_to_rects[WINRECT_STATUS]);
} }
// this is used for determinign whether to round off walkway corners // this is used for determinign whether to round off walkway corners
@@ -1409,10 +1416,10 @@ void boom_space(location where,short mode,short type,short damage,short sound) {
dest_rect.offset(x_adj,y_adj); dest_rect.offset(x_adj,y_adj);
dest_rect &= big_to; dest_rect &= big_to;
dest_rect.offset(win_to_rects[0].left,win_to_rects[0].top); dest_rect.offset(win_to_rects[WINRECT_TERVIEW].topLeft());
source_rect.offset(-store_rect.left + 28 * type,-store_rect.top); source_rect.offset(-store_rect.left + 28 * type,-store_rect.top);
rect_draw_some_item(*ResMgr::get<ImageRsrc>("booms"),source_rect,dest_rect,ul,sf::BlendAlpha); rect_draw_some_item(*ResMgr::get<ImageRsrc>("booms"),source_rect,mainPtr,dest_rect,sf::BlendAlpha);
if(damage > 0 && dest_rect.right - dest_rect.left >= 28 && dest_rect.bottom - dest_rect.top >= 36) { if(damage > 0 && dest_rect.right - dest_rect.left >= 28 && dest_rect.bottom - dest_rect.top >= 36) {
TextStyle style; TextStyle style;
@@ -1424,12 +1431,12 @@ void boom_space(location where,short mode,short type,short damage,short sound) {
std::string dam_str = std::to_string(damage); std::string dam_str = std::to_string(damage);
style.colour = sf::Color::White; style.colour = sf::Color::White;
text_rect.offset(-1,-1); text_rect.offset(-1,-1);
win_draw_string(mainPtr,text_rect,dam_str,eTextMode::CENTRE,style,ul); win_draw_string(mainPtr,text_rect,dam_str,eTextMode::CENTRE,style);
text_rect.offset(2,2); text_rect.offset(2,2);
win_draw_string(mainPtr,text_rect,dam_str,eTextMode::CENTRE,style,ul); win_draw_string(mainPtr,text_rect,dam_str,eTextMode::CENTRE,style);
style.colour = sf::Color::Black; style.colour = sf::Color::Black;
text_rect.offset(-1,-1); text_rect.offset(-1,-1);
win_draw_string(mainPtr,text_rect,dam_str,eTextMode::CENTRE,style,ul); win_draw_string(mainPtr,text_rect,dam_str,eTextMode::CENTRE,style);
} }
mainPtr.display(); mainPtr.display();
bool skip_boom_delay = get_bool_pref("SkipBoomDelay"); bool skip_boom_delay = get_bool_pref("SkipBoomDelay");
@@ -1448,32 +1455,47 @@ void boom_space(location where,short mode,short type,short damage,short sound) {
frame_active_pc(center); frame_active_pc(center);
} }
// dir = 0 - down, 1 - left, 2 - right, 3 - up
// pos = row or column to centre the arrow in, range 0..8
static void draw_one_pointing_arrow(int dir, int pos) {
rectangle from_rect = {351, 1, 359, 9};
from_rect.offset(9 * dir, 0);
rectangle ter_view_rect = win_to_rects[WINRECT_TERVIEW];
rectangle to_rect;
if(dir == 0 || dir == 3)
to_rect.left = ter_view_rect.left + 23 + pos * 28;
else to_rect.top = ter_view_rect.top + 23 + pos * 36;
if(dir == 0) to_rect.top = ter_view_rect.bottom - 10;
else if(dir == 1) to_rect.left = ter_view_rect.left + 2;
else if(dir == 2) to_rect.left = ter_view_rect.right - 10;
else if(dir == 3) to_rect.top = ter_view_rect.top + 2;
to_rect.width() = to_rect.height() = 8;
rect_draw_some_item(terrain_screen_gworld.getTexture(), from_rect, mainPtr, to_rect, sf::BlendAlpha);
}
void draw_pointing_arrows() { void draw_pointing_arrows() {
static const rectangle sources[4] = {
{351,28,359,36}, // up
{351,10,359,18}, // left
{351,01,359,9}, // down
{351,19,359,27} // right
};
static const rectangle dests[8] = {
{7,100,15,108},{7,170,15,178},{140,7,148,15},{212,7,220,15},
{346,100,354,108},{346,170,354,178},{140,274,148,282},{212,274,220,282}
};
if(monsters_going || !scrollableModes.count(overall_mode)) if(monsters_going || !scrollableModes.count(overall_mode))
return; return;
for(short i = 0; i < 4; i++) {
rect_draw_some_item(terrain_screen_gworld.getTexture(),sources[i],dests[i * 2],ul,sf::BlendAlpha); draw_one_pointing_arrow(0, 3);
rect_draw_some_item(terrain_screen_gworld.getTexture(),sources[i],dests[i * 2 + 1],ul,sf::BlendAlpha); draw_one_pointing_arrow(0, 5);
} draw_one_pointing_arrow(1, 3);
draw_one_pointing_arrow(1, 5);
draw_one_pointing_arrow(2, 3);
draw_one_pointing_arrow(2, 5);
draw_one_pointing_arrow(3, 3);
draw_one_pointing_arrow(3, 5);
} }
void redraw_terrain() { void redraw_terrain() {
rectangle to_rect; rectangle to_rect;
to_rect = win_to_rects[0]; to_rect = win_to_rects[WINRECT_TERVIEW];
rect_draw_some_item(terrain_screen_gworld.getTexture(), win_from_rects[0], to_rect,ul); rect_draw_some_item(terrain_screen_gworld.getTexture(), win_from_rects[WINRECT_TERVIEW], mainPtr, to_rect);
apply_light_mask(true); apply_light_mask(true);
@@ -1485,16 +1507,15 @@ void redraw_terrain() {
void draw_targets(location center) { void draw_targets(location center) {
rectangle source_rect = {74,36,85,47},dest_rect;
if(!univ.party.is_alive()) if(!univ.party.is_alive())
return; return;
sf::Texture& src_gworld = *ResMgr::get<ImageRsrc>("trim"); sf::Texture& src_gworld = *ResMgr::get<ImageRsrc>("trim");
for(short i = 0; i < 8; i++) for(short i = 0; i < 8; i++)
if((spell_targets[i].x != 120) && (point_onscreen(center,spell_targets[i]))) { if((spell_targets[i].x != 120) && (point_onscreen(center,spell_targets[i]))) {
dest_rect = coord_to_rect(spell_targets[i].x - center.x + 4,spell_targets[i].y - center.y + 4); rectangle dest_rect = coord_to_rect(spell_targets[i].x - center.x + 4,spell_targets[i].y - center.y + 4);
rect_draw_some_item(src_gworld,calc_rect(6,0),dest_rect,ul,sf::BlendAlpha); dest_rect.offset(win_to_rects[WINRECT_TERVIEW].topLeft());
rect_draw_some_item(src_gworld,calc_rect(6,0),mainPtr,dest_rect,sf::BlendAlpha);
} }
} }
@@ -1509,11 +1530,11 @@ void frame_space(location where,short mode,short width,short height) {
where_put.x = 4 + where.x - center.x; where_put.x = 4 + where.x - center.x;
where_put.y = 4 + where.y - center.y; where_put.y = 4 + where.y - center.y;
to_frame.top = 18 + where_put.y * 36; to_frame.top = 13 + where_put.y * 36;
to_frame.left = 18 + where_put.x * 28; to_frame.left = 13 + where_put.x * 28;
to_frame.bottom = 54 + where_put.y * 36 + 36 * (height - 1); to_frame.bottom = 49 + where_put.y * 36 + 36 * (height - 1);
to_frame.right = 46 + where_put.x * 28 + 28 * (width - 1); to_frame.right = 41 + where_put.x * 28 + 28 * (width - 1);
to_frame.offset(ul); to_frame.offset(win_to_rects[WINRECT_TERVIEW].topLeft());
frame_roundrect(mainPtr, to_frame, 8, (mode == 0) ? sf::Color::Red : sf::Color::Green); frame_roundrect(mainPtr, to_frame, 8, (mode == 0) ? sf::Color::Red : sf::Color::Green);
} }
@@ -1529,9 +1550,12 @@ void erase_spot(short i,short j) {
void draw_targeting_line(location where_curs) { void draw_targeting_line(location where_curs) {
location which_space,store_loc; location which_space,store_loc;
rectangle redraw_rect,redraw_rect2,terrain_rect = {0,0,351,279},target_rect; rectangle redraw_rect,redraw_rect2,target_rect;
location from_loc; location from_loc;
rectangle on_screen_terrain_area = {23, 23, 346, 274}; rectangle on_screen_terrain_area = win_to_rects[WINRECT_TERVIEW];
on_screen_terrain_area.inset(13, 13);
where_curs = mainPtr.mapPixelToCoords(where_curs, mainView);
if(overall_mode >= MODE_COMBAT) if(overall_mode >= MODE_COMBAT)
from_loc = univ.current_pc().combat_pos; from_loc = univ.current_pc().combat_pos;
@@ -1539,29 +1563,26 @@ void draw_targeting_line(location where_curs) {
if((overall_mode == MODE_SPELL_TARGET) || (overall_mode == MODE_FIRING) || (overall_mode == MODE_THROWING) || (overall_mode == MODE_FANCY_TARGET) if((overall_mode == MODE_SPELL_TARGET) || (overall_mode == MODE_FIRING) || (overall_mode == MODE_THROWING) || (overall_mode == MODE_FANCY_TARGET)
|| ((overall_mode == MODE_TOWN_TARGET) && (current_pat.pattern[4][4] != 0))) { || ((overall_mode == MODE_TOWN_TARGET) && (current_pat.pattern[4][4] != 0))) {
on_screen_terrain_area.offset(ul);
if(where_curs.in(on_screen_terrain_area)) { if(where_curs.in(on_screen_terrain_area)) {
// && (point_onscreen(center,univ.party[current_pc].combat_pos))){ // && (point_onscreen(center,univ.party[current_pc].combat_pos))){
which_space.x = center.x + (where_curs.x - 23 - ul.x) / 28 - 4; which_space.x = center.x + (where_curs.x - 37) / 28 - 4;
which_space.y = center.y + (where_curs.y - 23 - ul.y) / 36 - 4; which_space.y = center.y + (where_curs.y - 25) / 36 - 4;
int xBound = (short) (from_loc.x - center.x + 4); int xBound = (short) (from_loc.x - center.x + 4);
int yBound = (short) (from_loc.y - center.y + 4); int yBound = (short) (from_loc.y - center.y + 4);
xBound = (xBound * 28) + 32 + ul.x; xBound = (xBound * 28) + 46;
yBound = (yBound * 36) + 36 + ul.y; yBound = (yBound * 36) + 38;
if((can_see_light(from_loc,which_space,sight_obscurity) < 5) if((can_see_light(from_loc,which_space,sight_obscurity) < 5)
&& (dist(from_loc,which_space) <= current_spell_range)) { && (dist(from_loc,which_space) <= current_spell_range)) {
terrain_rect.inset(13,13);
terrain_rect.offset(5 + ul.x,5 + ul.y);
mainPtr.setActive(); mainPtr.setActive();
clip_rect(mainPtr, terrain_rect); clip_rect(mainPtr, on_screen_terrain_area);
draw_line(mainPtr, where_curs, location(xBound, yBound), 2, {128,128,128}, sf::BlendAdd); draw_line(mainPtr, where_curs, location(xBound, yBound), 2, {128,128,128}, sf::BlendAdd);
redraw_rect.left = min(where_curs.x,xBound) - 4; redraw_rect.left = min(where_curs.x,xBound) - 4;
redraw_rect.right = max(where_curs.x,xBound) + 4; redraw_rect.right = max(where_curs.x,xBound) + 4;
redraw_rect.top = min(where_curs.y,yBound) - 4; redraw_rect.top = min(where_curs.y,yBound) - 4;
redraw_rect.bottom = max(where_curs.y,yBound) + 4; redraw_rect.bottom = max(where_curs.y,yBound) + 4;
redraw_rect2 = redraw_rect & terrain_rect; redraw_rect2 = redraw_rect & on_screen_terrain_area;
// Now place targeting pattern // Now place targeting pattern
for(short i = 0; i < 9; i++) for(short i = 0; i < 9; i++)
@@ -1571,9 +1592,9 @@ void draw_targeting_line(location where_curs) {
if((abs(store_loc.x - which_space.x) <= 4) && if((abs(store_loc.x - which_space.x) <= 4) &&
(abs(store_loc.y - which_space.y) <= 4) && (abs(store_loc.y - which_space.y) <= 4) &&
(current_pat.pattern[store_loc.x - which_space.x + 4][store_loc.y - which_space.y + 4] != 0)) { (current_pat.pattern[store_loc.x - which_space.x + 4][store_loc.y - which_space.y + 4] != 0)) {
target_rect.left = 13 + 28 * i + 5 + ul.x; target_rect.left = 13 + 28 * i + 19;
target_rect.right = target_rect.left + 28; target_rect.right = target_rect.left + 28;
target_rect.top = 13 + 36 * j + 5 + ul.y; target_rect.top = 13 + 36 * j + 7;
target_rect.bottom = target_rect.top + 36; target_rect.bottom = target_rect.top + 36;
frame_rect(mainPtr, target_rect, sf::Color::White); frame_rect(mainPtr, target_rect, sf::Color::White);
target_rect.inset(-5,-5); target_rect.inset(-5,-5);
@@ -1605,12 +1626,11 @@ void redraw_partial_terrain(rectangle redraw_rect) {
rectangle from_rect; rectangle from_rect;
from_rect = redraw_rect; from_rect = redraw_rect;
from_rect.offset(-ul.x,-ul.y);
// as rect_draw_some_item will shift redraw_rect before drawing, we need to compensate // as rect_draw_some_item will shift redraw_rect before drawing, we need to compensate
redraw_rect.offset(-ul.x + 5,-ul.y + 5); redraw_rect.offset(5,5);
rect_draw_some_item(terrain_screen_gworld.getTexture(),from_rect,redraw_rect,ul); rect_draw_some_item(terrain_screen_gworld.getTexture(),from_rect,mainPtr,redraw_rect);
} }

View File

@@ -36,7 +36,6 @@ extern short combat_posing_monster , current_working_monster ; // 0-5 PC 100 + x
extern sf::RenderTexture terrain_screen_gworld; extern sf::RenderTexture terrain_screen_gworld;
extern std::queue<pending_special_type> special_queue; extern std::queue<pending_special_type> special_queue;
extern location ul;
extern location center; extern location center;
extern short which_combat_type; extern short which_combat_type;
extern bool monsters_going,anim_onscreen; extern bool monsters_going,anim_onscreen;
@@ -273,7 +272,7 @@ void frame_active_pc(location center) {
active_pc_rect.left = 18 + where_draw.x * 28; active_pc_rect.left = 18 + where_draw.x * 28;
active_pc_rect.bottom = 54 + where_draw.y * 36; active_pc_rect.bottom = 54 + where_draw.y * 36;
active_pc_rect.right = 46 + where_draw.x * 28; active_pc_rect.right = 46 + where_draw.x * 28;
active_pc_rect.offset(ul); active_pc_rect.offset(14,2);
frame_roundrect(mainPtr, active_pc_rect, 8, sf::Color::Magenta); frame_roundrect(mainPtr, active_pc_rect, 8, sf::Color::Magenta);
} }

View File

@@ -55,6 +55,7 @@ short on_spell_menu[2][62];
short on_monst_menu[256]; short on_monst_menu[256];
extern bool map_visible; extern bool map_visible;
extern sf::View mainView;
std::string scenario_temp_dir_name = "scenario"; std::string scenario_temp_dir_name = "scenario";
@@ -71,7 +72,6 @@ bool finished_init = false;
sf::RenderWindow mini_map; sf::RenderWindow mini_map;
short which_item_page[6] = {0,0,0,0,0,0}; // Remembers which of the 2 item pages pc looked at short which_item_page[6] = {0,0,0,0,0,0}; // Remembers which of the 2 item pages pc looked at
location ul = {28,10};
short current_ground = 0; short current_ground = 0;
eStatMode stat_screen_mode; eStatMode stat_screen_mode;
short anim_step = -1; short anim_step = -1;
@@ -320,6 +320,7 @@ void Mouse_Pressed() {
if(overall_mode != MODE_STARTUP) { if(overall_mode != MODE_STARTUP) {
location mousePos(event.mouseButton.x, event.mouseButton.y); location mousePos(event.mouseButton.x, event.mouseButton.y);
mousePos = mainPtr.mapPixelToCoords(mousePos, mainView);
volatile bool doneScrolling = false; volatile bool doneScrolling = false;
if(mousePos.in(text_sbar->getBounds())) { if(mousePos.in(text_sbar->getBounds())) {
mainPtr.setActive(false); mainPtr.setActive(false);
@@ -625,10 +626,11 @@ static cursor_type get_mode_cursor(){
void change_cursor(location where_curs) { void change_cursor(location where_curs) {
cursor_type cursor_needed; cursor_type cursor_needed;
location cursor_direction; location cursor_direction;
rectangle world_screen = {23, 23, 346, 274}; extern rectangle win_to_rects[6];
rectangle world_screen = win_to_rects[WINRECT_TERVIEW];
world_screen.inset(13, 13);
where_curs.x -= ul.x; where_curs = mainPtr.mapPixelToCoords(where_curs, mainView);
where_curs.y -= ul.y;
if(!world_screen.contains(where_curs)) if(!world_screen.contains(where_curs))
cursor_needed = sword_curs; cursor_needed = sword_curs;

View File

@@ -48,7 +48,6 @@ short monsters_faces[190] = {
0,0,0,0,26,26,0,0,0,50, 0,0,0,0,26,26,0,0,0,50,
23,0,0,0,0,0,0,0,23,23, 23,0,0,0,0,0,0,0,23,23,
0,0,0,55,23,36,31,0,0,0}; 0,0,0,55,23,36,31,0,0,0};
extern location ul;
extern rectangle windRect; extern rectangle windRect;
extern long anim_ticks; extern long anim_ticks;
extern tessel_ref_t bg[]; extern tessel_ref_t bg[];
@@ -73,6 +72,7 @@ extern bool fog_lifted;
extern const short alch_difficulty[20]; extern const short alch_difficulty[20];
extern const eItemAbil alch_ingred1[20]; extern const eItemAbil alch_ingred1[20];
extern const eItemAbil alch_ingred2[20]; extern const eItemAbil alch_ingred2[20];
extern rectangle win_to_rects[6];
// Talk vars // Talk vars
extern eGameMode store_pre_talk_mode; extern eGameMode store_pre_talk_mode;
@@ -228,7 +228,6 @@ void apply_light_mask(bool onWindow) {
} }
dark_mask_region.offset(5,5); dark_mask_region.offset(5,5);
dark_mask_region.offset(ul);
} }
void start_missile_anim() { void start_missile_anim() {
@@ -273,8 +272,6 @@ void add_missile(location dest,miss_num_t missile_type,short path_type,short x_a
} }
void run_a_missile(location from,location fire_to,miss_num_t miss_type,short path,short sound_num,short x_adj,short y_adj,short len) { void run_a_missile(location from,location fire_to,miss_num_t miss_type,short path,short sound_num,short x_adj,short y_adj,short len) {
// if((cartoon_happening) && (anim_step < 140))
// return;
start_missile_anim(); start_missile_anim();
add_missile(fire_to,miss_type,path, x_adj, y_adj); add_missile(fire_to,miss_type,path, x_adj, y_adj);
do_missile_anim(len,from, sound_num); do_missile_anim(len,from, sound_num);
@@ -282,9 +279,6 @@ void run_a_missile(location from,location fire_to,miss_num_t miss_type,short pat
} }
void run_a_boom(location boom_where,short type,short x_adj,short y_adj,short snd) { void run_a_boom(location boom_where,short type,short x_adj,short y_adj,short snd) {
// if((cartoon_happening) && (anim_step < 140))
// return;
if((type < 0) || (type > 2)) if((type < 0) || (type > 2))
return; return;
start_missile_anim(); start_missile_anim();
@@ -338,7 +332,7 @@ void do_missile_anim(short num_steps,location missile_origin,short sound_num) {
short x1[30],x2[30],y1[30],y2[30]; // for path paramaterization short x1[30],x2[30],y1[30],y2[30]; // for path paramaterization
rectangle missile_place_rect[30],missile_origin_rect[30]; rectangle missile_place_rect[30],missile_origin_rect[30];
location current_terrain_ul; location current_terrain_ul = win_to_rects[WINRECT_TERVIEW].topLeft();
if(!have_missile || !boom_anim_active) { if(!have_missile || !boom_anim_active) {
boom_anim_active = false; boom_anim_active = false;
@@ -349,20 +343,13 @@ void do_missile_anim(short num_steps,location missile_origin,short sound_num) {
return m.missile_type == 0; return m.missile_type == 0;
})) return; })) return;
// initialize general data
// TODO: This is probably yet another relic of the Exile III demo
if(overall_mode == MODE_STARTUP) {
current_terrain_ul.x = 306;
current_terrain_ul.y = 5;
} else current_terrain_ul.x = current_terrain_ul.y = 5;
// make terrain_template contain current terrain all nicely // make terrain_template contain current terrain all nicely
draw_terrain(1); draw_terrain(1);
to_rect = rectangle(terrain_screen_gworld); to_rect = rectangle(terrain_screen_gworld);
to_rect.bottom -= 10; // Adjust for pointing buttons to_rect.bottom -= 10; // Adjust for pointing buttons
rectangle oldBounds = to_rect; rectangle oldBounds = to_rect;
to_rect.offset(current_terrain_ul); to_rect.offset(current_terrain_ul);
rect_draw_some_item(terrain_screen_gworld.getTexture(),oldBounds,to_rect,ul); rect_draw_some_item(terrain_screen_gworld.getTexture(),oldBounds,mainPtr,to_rect);
mainPtr.setActive(); mainPtr.setActive();
@@ -411,7 +398,6 @@ void do_missile_anim(short num_steps,location missile_origin,short sound_num) {
temp_rect = missile_origin_base; temp_rect = missile_origin_base;
temp_rect.offset(-8 + x2[i] + (x1[i] * t) / num_steps, temp_rect.offset(-8 + x2[i] + (x1[i] * t) / num_steps,
-8 + y2[i] + (y1[i] * t) / num_steps); -8 + y2[i] + (y1[i] * t) / num_steps);
temp_rect.offset(ul);
temp_rect.offset(current_terrain_ul); temp_rect.offset(current_terrain_ul);
// now adjust for different paths // now adjust for different paths
@@ -461,7 +447,7 @@ void do_missile_anim(short num_steps,location missile_origin,short sound_num) {
to_rect.bottom -= 10; // Adjust for pointing buttons to_rect.bottom -= 10; // Adjust for pointing buttons
rectangle oldRect = to_rect; rectangle oldRect = to_rect;
to_rect.offset(current_terrain_ul); to_rect.offset(current_terrain_ul);
rect_draw_some_item(terrain_screen_gworld.getTexture(),oldRect,to_rect,ul); rect_draw_some_item(terrain_screen_gworld.getTexture(),oldRect,mainPtr,to_rect);
} }
short get_missile_direction(location origin_point,location the_point) { short get_missile_direction(location origin_point,location the_point) {
@@ -506,7 +492,7 @@ void do_explosion_anim(short /*sound_num*/,short special_draw, short snd) {
location screen_ul; location screen_ul;
short cur_boom_type = 0; short cur_boom_type = 0;
location current_terrain_ul; location current_terrain_ul = win_to_rects[WINRECT_TERVIEW].topLeft();;
short boom_type_sound[6] = {5,10,53,53,53,75}; short boom_type_sound[6] = {5,10,53,53,53,75};
if(!have_boom || !boom_anim_active) { if(!have_boom || !boom_anim_active) {
@@ -518,13 +504,6 @@ void do_explosion_anim(short /*sound_num*/,short special_draw, short snd) {
return b.boom_type == 0; return b.boom_type == 0;
})) return; })) return;
// initialize general data
if(overall_mode == MODE_STARTUP) {
// TODO: I think this is a relic of the "demo" on the main screen of Exile III
current_terrain_ul.x = 306;
current_terrain_ul.y = 5;
} else current_terrain_ul.x = current_terrain_ul.y = 5;
// make terrain_template contain current terrain all nicely // make terrain_template contain current terrain all nicely
draw_terrain(1); draw_terrain(1);
if(special_draw != 2) { if(special_draw != 2) {
@@ -532,7 +511,7 @@ void do_explosion_anim(short /*sound_num*/,short special_draw, short snd) {
to_rect.bottom -= 10; // Adjust for pointing buttons to_rect.bottom -= 10; // Adjust for pointing buttons
rectangle oldRect = to_rect; rectangle oldRect = to_rect;
to_rect.offset(current_terrain_ul); to_rect.offset(current_terrain_ul);
rect_draw_some_item(terrain_screen_gworld.getTexture(),oldRect,to_rect,ul); rect_draw_some_item(terrain_screen_gworld.getTexture(),oldRect,mainPtr,to_rect);
} }
TextStyle style; TextStyle style;
@@ -549,7 +528,6 @@ void do_explosion_anim(short /*sound_num*/,short special_draw, short snd) {
explode_place_rect[i] = base_rect; explode_place_rect[i] = base_rect;
explode_place_rect[i].offset(13 + 28 * (store_booms[i].dest.x - screen_ul.x) + store_booms[i].x_adj, explode_place_rect[i].offset(13 + 28 * (store_booms[i].dest.x - screen_ul.x) + store_booms[i].x_adj,
13 + 36 * (store_booms[i].dest.y - screen_ul.y) + store_booms[i].y_adj); 13 + 36 * (store_booms[i].dest.y - screen_ul.y) + store_booms[i].y_adj);
explode_place_rect[i].offset(ul);
explode_place_rect[i].offset(current_terrain_ul); explode_place_rect[i].offset(current_terrain_ul);
if((store_booms[i].place_type == 1) && (special_draw < 2)) { if((store_booms[i].place_type == 1) && (special_draw < 2)) {
@@ -826,15 +804,14 @@ void draw_shop_graphics(bool pressed,rectangle clip_area_rect) {
void refresh_shopping() { void refresh_shopping() {
rectangle from_rect(talk_gworld); rectangle from_rect(talk_gworld);
rectangle to_rect = from_rect; rectangle to_rect = from_rect;
to_rect.offset(5,5); to_rect.offset(19,7);
rect_draw_some_item(talk_gworld.getTexture(),from_rect,to_rect,ul); rect_draw_some_item(talk_gworld.getTexture(),from_rect,mainPtr,to_rect);
shop_sbar->draw(); shop_sbar->draw();
} }
static void place_talk_face() { static void place_talk_face() {
rectangle face_rect = {6,6,38,38}; rectangle face_rect = {6,6,38,38};
face_rect.offset(talk_area_rect.topLeft()); face_rect.offset(talk_area_rect.topLeft());
face_rect.offset(ul);
mainPtr.setActive(); mainPtr.setActive();
short face_to_draw = univ.scenario.scen_monsters[store_monst_type].default_facial_pic; short face_to_draw = univ.scenario.scen_monsters[store_monst_type].default_facial_pic;
if(store_talk_face_pic >= 0) if(store_talk_face_pic >= 0)
@@ -853,9 +830,8 @@ static void place_talk_face() {
void click_talk_rect(word_rect_t word) { void click_talk_rect(word_rect_t word) {
rectangle talkRect(talk_gworld), wordRect(word.rect); rectangle talkRect(talk_gworld), wordRect(word.rect);
mainPtr.setActive(); mainPtr.setActive();
rect_draw_some_item(talk_gworld.getTexture(),talkRect,talk_area_rect,ul); rect_draw_some_item(talk_gworld.getTexture(),talkRect,mainPtr,talk_area_rect);
wordRect.offset(talk_area_rect.topLeft()); wordRect.offset(talk_area_rect.topLeft());
wordRect.offset(ul);
TextStyle style; TextStyle style;
style.font = FONT_DUNGEON; style.font = FONT_DUNGEON;
style.pointSize = 18; style.pointSize = 18;
@@ -865,7 +841,7 @@ void click_talk_rect(word_rect_t word) {
place_talk_face(); place_talk_face();
mainPtr.display(); mainPtr.display();
play_sound(37, time_in_ticks(5)); play_sound(37, time_in_ticks(5));
rect_draw_some_item(talk_gworld.getTexture(),talkRect,talk_area_rect,ul); rect_draw_some_item(talk_gworld.getTexture(),talkRect,mainPtr,talk_area_rect);
place_talk_face(); place_talk_face();
} }
@@ -953,7 +929,6 @@ void place_talk_str(std::string str_to_place,std::string str_to_place2,short col
if(c_rect.right > 0) { if(c_rect.right > 0) {
mainPtr.setActive(); mainPtr.setActive();
c_rect.offset(talk_area_rect.topLeft()); c_rect.offset(talk_area_rect.topLeft());
c_rect.offset(ul);
clip_rect(mainPtr, c_rect); clip_rect(mainPtr, c_rect);
} }
@@ -1055,14 +1030,14 @@ void place_talk_str(std::string str_to_place,std::string str_to_place2,short col
// Finally place processed graphics // Finally place processed graphics
mainPtr.setActive(); mainPtr.setActive();
rect_draw_some_item(talk_gworld.getTexture(),oldRect,talk_area_rect,ul); rect_draw_some_item(talk_gworld.getTexture(),oldRect,mainPtr,talk_area_rect);
// I have no idea what this check is for; I'm jsut preserving it in case it was important // I have no idea what this check is for; I'm jsut preserving it in case it was important
if(c_rect.right == 0) place_talk_face(); if(c_rect.right == 0) place_talk_face();
} }
void refresh_talking() { void refresh_talking() {
rectangle tempRect(talk_gworld); rectangle tempRect(talk_gworld);
rect_draw_some_item(talk_gworld.getTexture(),tempRect,talk_area_rect,ul); rect_draw_some_item(talk_gworld.getTexture(),tempRect,mainPtr,talk_area_rect);
place_talk_face(); place_talk_face();
} }

View File

@@ -29,10 +29,10 @@ using std::vector;
extern bool party_in_memory; extern bool party_in_memory;
extern long register_flag; extern long register_flag;
extern sf::RenderWindow mainPtr; extern sf::RenderWindow mainPtr;
extern location ul;
extern std::vector<scen_header_type> scen_headers; extern std::vector<scen_header_type> scen_headers;
extern cUniverse univ; extern cUniverse univ;
extern eGameMode overall_mode; extern eGameMode overall_mode;
extern sf::View mainView;
rectangle startup_button[6]; rectangle startup_button[6];
@@ -42,8 +42,7 @@ bool handle_startup_press(location the_point) {
std::string scen_name; std::string scen_name;
bool force_party = false; bool force_party = false;
the_point.x -= ul.x; the_point = mainPtr.mapPixelToCoords(the_point, mainView);
the_point.y -= ul.y;
for(short i = 0; i < 5; i++) for(short i = 0; i < 5; i++)
if(the_point.in(startup_button[i])) { if(the_point.in(startup_button[i])) {

View File

@@ -64,7 +64,6 @@ extern sf::RenderTexture pc_stats_gworld, item_stats_gworld, text_area_gworld;
extern sf::RenderTexture terrain_screen_gworld; extern sf::RenderTexture terrain_screen_gworld;
// game globals // game globals
extern location ul;
extern rectangle item_buttons[8][6]; extern rectangle item_buttons[8][6];
// name, use, give, drip, info, sell/id // name, use, give, drip, info, sell/id
extern rectangle pc_buttons[6][5]; extern rectangle pc_buttons[6][5];
@@ -599,23 +598,13 @@ short first_active_pc() {
void refresh_stat_areas(short mode) { void refresh_stat_areas(short mode) {
sf::BlendMode x; sf::BlendMode x;
rectangle dest_rect,parts_of_area_to_draw[3] = {{0,0,17,271},{16,0,123,256},{123,0,144,271}}; extern rectangle win_to_rects[6];
dest_rect = rectangle(pc_stats_gworld);
rectangle oldRect = dest_rect;
dest_rect.offset(PC_WIN_UL_X,PC_WIN_UL_Y);
if(mode == 1) x = sf::BlendAdd; if(mode == 1) x = sf::BlendAdd;
else x = sf::BlendNone; else x = sf::BlendNone;
rect_draw_some_item (pc_stats_gworld.getTexture(), oldRect, dest_rect,ul, x); rect_draw_some_item(pc_stats_gworld.getTexture(), rectangle(pc_stats_gworld), mainPtr, win_to_rects[WINRECT_PCSTATS], x);
for(short i = 0; i < 3; i++) { rect_draw_some_item(item_stats_gworld.getTexture(), rectangle(item_stats_gworld), mainPtr, win_to_rects[WINRECT_INVEN], x);
dest_rect = parts_of_area_to_draw[i]; rect_draw_some_item(text_area_gworld.getTexture(), rectangle(text_area_gworld), mainPtr, win_to_rects[WINRECT_TRANSCRIPT], x);
dest_rect.offset(ITEM_WIN_UL_X,ITEM_WIN_UL_Y);
rect_draw_some_item(item_stats_gworld.getTexture(), parts_of_area_to_draw[i], dest_rect,ul, x);
}
dest_rect = rectangle(text_area_gworld);
oldRect = dest_rect;
dest_rect.offset(TEXT_WIN_UL_X,TEXT_WIN_UL_Y);
rect_draw_some_item(text_area_gworld.getTexture(),oldRect, dest_rect,ul, x);
} }
// get job info gone // get job info gone
@@ -1132,7 +1121,7 @@ void Draw_Some_Item (sf::Texture& src_gworld, rectangle src_rect, sf::RenderTarg
return; return;
destrec = coord_to_rect(target.x,target.y); destrec = coord_to_rect(target.x,target.y);
if(main_win == 1) destrec.offset(ul.x + 5,ul.y + 5); if(main_win == 1) destrec.offset(5,5);
if(main_win == 0) { if(main_win == 0) {
if(masked == 1) if(masked == 1)

View File

@@ -17,8 +17,6 @@
sf::Shader maskShader; sf::Shader maskShader;
extern fs::path progDir; extern fs::path progDir;
// TODO: Shouldn't need this
extern sf::RenderWindow mainPtr;
void init_shaders() { void init_shaders() {
fs::path shaderPath = progDir/"data"/"shaders"; fs::path shaderPath = progDir/"data"/"shaders";
@@ -90,11 +88,6 @@ void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,sf::Re
targ_gworld.draw(tile, mode); targ_gworld.draw(tile, mode);
} }
void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,rectangle targ_rect,location offset, sf::BlendMode mode) {
targ_rect.offset(offset);
rect_draw_some_item(src_gworld,src_rect,mainPtr,targ_rect,mode);
}
void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,const sf::Texture& mask_gworld,sf::RenderTarget& targ_gworld,rectangle targ_rect) { void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,const sf::Texture& mask_gworld,sf::RenderTarget& targ_gworld,rectangle targ_rect) {
static sf::RenderTexture src; static sf::RenderTexture src;
static bool inited = false; static bool inited = false;

View File

@@ -21,7 +21,6 @@
void init_shaders(); void init_shaders();
void rect_draw_some_item(sf::RenderTarget& targ_gworld,rectangle targ_rect); void rect_draw_some_item(sf::RenderTarget& targ_gworld,rectangle targ_rect);
void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::BlendMode mode = sf::BlendNone); void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::BlendMode mode = sf::BlendNone);
void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,rectangle targ_rect,location offset,sf::BlendMode mode = sf::BlendNone);
void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,const sf::Texture& mask_gworld,sf::RenderTarget& targ_gworld,rectangle targ_rect); void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,const sf::Texture& mask_gworld,sf::RenderTarget& targ_gworld,rectangle targ_rect);
void draw_splash(const sf::Texture& splash, sf::RenderWindow& targ, rectangle dest_rect); void draw_splash(const sf::Texture& splash, sf::RenderWindow& targ, rectangle dest_rect);

View File

@@ -215,8 +215,11 @@ void clip_rect(sf::RenderTarget& where, rectangle rect) {
rect &= rectangle(where); // Make sure we don't draw out of bounds rect &= rectangle(where); // Make sure we don't draw out of bounds
// TODO: Make sure this works for the scissor test... // TODO: Make sure this works for the scissor test...
setActiveRenderTarget(where); setActiveRenderTarget(where);
rectangle winRect(where);
location pivot = rect.bottomLeft();
pivot = where.mapCoordsToPixel(pivot);
glEnable(GL_SCISSOR_TEST); glEnable(GL_SCISSOR_TEST);
glScissor(rect.left, rectangle(where).height() - rect.bottom, rect.width(), rect.height()); glScissor(pivot.x, rectangle(where).height() - pivot.y, rect.width(), rect.height());
} }
void clip_region(sf::RenderWindow& where, Region& region) { void clip_region(sf::RenderWindow& where, Region& region) {

View File

@@ -38,7 +38,6 @@ struct text_params_t {
TextStyle style; TextStyle style;
eTextMode mode; eTextMode mode;
bool showBreaks = false; bool showBreaks = false;
location offset = {0,0};
// Hilite ranges are, like the STL, of the form [first, last). // Hilite ranges are, like the STL, of the form [first, last).
std::vector<hilite_t> hilite_ranges; std::vector<hilite_t> hilite_ranges;
sf::Color hilite_fg, hilite_bg = sf::Color::Transparent; sf::Color hilite_fg, hilite_bg = sf::Color::Transparent;
@@ -95,8 +94,6 @@ static void win_draw_string(sf::RenderTarget& dest_window,rectangle dest_rect,st
short total_width = 0; short total_width = 0;
short adjust_x = 0,adjust_y = 0; short adjust_x = 0,adjust_y = 0;
adjust_x = options.offset.x;
adjust_y = options.offset.y;
str_to_draw.setString("fj"); // Something that has both an ascender and a descender str_to_draw.setString("fj"); // Something that has both an ascender and a descender
adjust_y -= str_to_draw.getLocalBounds().height; adjust_y -= str_to_draw.getLocalBounds().height;
@@ -188,11 +185,10 @@ static void win_draw_string(sf::RenderTarget& dest_window,rectangle dest_rect,st
} }
} }
void win_draw_string(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,eTextMode mode,TextStyle style, location offset) { void win_draw_string(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,eTextMode mode,TextStyle style) {
text_params_t params; text_params_t params;
params.mode = mode; params.mode = mode;
params.style = style; params.style = style;
params.offset = offset;
win_draw_string(dest_window, dest_rect, str, params); win_draw_string(dest_window, dest_rect, str, params);
} }

View File

@@ -52,7 +52,7 @@ enum class eTextMode {
std::vector<rectangle> draw_string_hilite(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,TextStyle style,std::vector<hilite_t> hilites,sf::Color hiliteClr); std::vector<rectangle> draw_string_hilite(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,TextStyle style,std::vector<hilite_t> hilites,sf::Color hiliteClr);
std::vector<snippet_t> draw_string_sel(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,TextStyle style,std::vector<hilite_t> hilites,sf::Color hiliteClr); std::vector<snippet_t> draw_string_sel(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,TextStyle style,std::vector<hilite_t> hilites,sf::Color hiliteClr);
void win_draw_string(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,eTextMode mode,TextStyle style, location offset = {0,0}); void win_draw_string(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,eTextMode mode,TextStyle style);
size_t string_length(std::string str, TextStyle style, short* height = nullptr); size_t string_length(std::string str, TextStyle style, short* height = nullptr);
#endif #endif

View File

@@ -45,7 +45,6 @@ eDrawMode draw_mode = DRAW_TERRAIN;
extern short available_dlog_buttons[NUM_DLOG_B]; extern short available_dlog_buttons[NUM_DLOG_B];
extern bool editing_town; extern bool editing_town;
extern cScenario scenario; extern cScenario scenario;
extern rectangle world_screen;
extern sf::Texture bg_gworld; extern sf::Texture bg_gworld;
extern rectangle right_buttons[NRSONPAGE]; extern rectangle right_buttons[NRSONPAGE];
extern rectangle right_scrollbar_rect; extern rectangle right_scrollbar_rect;