diff options
Diffstat (limited to 'sword2/scroll.cpp')
-rw-r--r-- | sword2/scroll.cpp | 61 |
1 files changed, 29 insertions, 32 deletions
diff --git a/sword2/scroll.cpp b/sword2/scroll.cpp index 3ae0a82aa2..ec64ca2361 100644 --- a/sword2/scroll.cpp +++ b/sword2/scroll.cpp @@ -33,10 +33,7 @@ namespace Sword2 { // max no of pixel allowed to scroll per cycle #define MAX_SCROLL_DISTANCE 8 -// used to be a define, but now it's flexible (see new functions below) -uint8 scroll_fraction = 16; - -void Set_scrolling(void) { +void Sword2Engine::setScrolling(void) { // normally we aim to get George's feet at (320,250) from top left // of screen window // feet_x = 128 + 320 @@ -53,51 +50,51 @@ void Set_scrolling(void) { // if the scroll offsets are being forced in script if (SCROLL_X || SCROLL_Y) { // ensure not too far right - if (g_sword2->_thisScreen.max_scroll_offset_x > SCROLL_X) - g_sword2->_thisScreen.scroll_offset_x = SCROLL_X; + if (_thisScreen.max_scroll_offset_x > SCROLL_X) + _thisScreen.scroll_offset_x = SCROLL_X; else - g_sword2->_thisScreen.scroll_offset_x = g_sword2->_thisScreen.max_scroll_offset_x; + _thisScreen.scroll_offset_x = _thisScreen.max_scroll_offset_x; // ensure not too far down - if (g_sword2->_thisScreen.max_scroll_offset_y > SCROLL_Y) - g_sword2->_thisScreen.scroll_offset_y = SCROLL_Y; + if (_thisScreen.max_scroll_offset_y > SCROLL_Y) + _thisScreen.scroll_offset_y = SCROLL_Y; else - g_sword2->_thisScreen.scroll_offset_y = g_sword2->_thisScreen.max_scroll_offset_y; + _thisScreen.scroll_offset_y = _thisScreen.max_scroll_offset_y; } else { // George's offset from the centre - the desired position // for him - offset_x = g_sword2->_thisScreen.player_feet_x - g_sword2->_thisScreen.feet_x; - offset_y = g_sword2->_thisScreen.player_feet_y - g_sword2->_thisScreen.feet_y; + offset_x = _thisScreen.player_feet_x - _thisScreen.feet_x; + offset_y = _thisScreen.player_feet_y - _thisScreen.feet_y; // prevent scrolling too far left/right/up/down if (offset_x < 0) offset_x = 0; - else if ((uint32) offset_x > g_sword2->_thisScreen.max_scroll_offset_x) - offset_x = g_sword2->_thisScreen.max_scroll_offset_x; + else if ((uint32) offset_x > _thisScreen.max_scroll_offset_x) + offset_x = _thisScreen.max_scroll_offset_x; if (offset_y < 0) offset_y = 0; - else if ((uint32) offset_y > g_sword2->_thisScreen.max_scroll_offset_y) - offset_y = g_sword2->_thisScreen.max_scroll_offset_y; + else if ((uint32) offset_y > _thisScreen.max_scroll_offset_y) + offset_y = _thisScreen.max_scroll_offset_y; // first time on this screen - need absolute scroll // immediately! - if (g_sword2->_thisScreen.scroll_flag == 2) { + if (_thisScreen.scroll_flag == 2) { debug(5, "init scroll"); - g_sword2->_thisScreen.scroll_offset_x = offset_x; - g_sword2->_thisScreen.scroll_offset_y = offset_y; - g_sword2->_thisScreen.scroll_flag = 1; + _thisScreen.scroll_offset_x = offset_x; + _thisScreen.scroll_offset_y = offset_y; + _thisScreen.scroll_flag = 1; } else { // catch up with required scroll offsets - speed // depending on distance to catch up (dx and dy) & // 'SCROLL_FRACTION' used, but limit to certain // number of pixels per cycle (MAX_SCROLL_DISTANCE) - dx = g_sword2->_thisScreen.scroll_offset_x - offset_x; - dy = g_sword2->_thisScreen.scroll_offset_y - offset_y; + dx = _thisScreen.scroll_offset_x - offset_x; + dy = _thisScreen.scroll_offset_y - offset_y; // current scroll_offset_x is less than the required // value @@ -111,39 +108,39 @@ void Set_scrolling(void) { // NB. dx is -ve, so we subtract // dx / SCROLL_FRACTION - scroll_distance_x = 1 - dx / scroll_fraction; + scroll_distance_x = 1 - dx / _scrollFraction; if (scroll_distance_x > MAX_SCROLL_DISTANCE) scroll_distance_x = MAX_SCROLL_DISTANCE; - g_sword2->_thisScreen.scroll_offset_x += scroll_distance_x; + _thisScreen.scroll_offset_x += scroll_distance_x; } else if (dx > 0) { // current scroll_offset_x is greater than // the required value // => dec by (fraction of the differnce) - scroll_distance_x = 1 + dx / scroll_fraction; + scroll_distance_x = 1 + dx / _scrollFraction; if (scroll_distance_x > MAX_SCROLL_DISTANCE) scroll_distance_x = MAX_SCROLL_DISTANCE; - g_sword2->_thisScreen.scroll_offset_x -= scroll_distance_x; + _thisScreen.scroll_offset_x -= scroll_distance_x; } if (dy < 0) { - scroll_distance_y = 1 - dy / scroll_fraction; + scroll_distance_y = 1 - dy / _scrollFraction; if (scroll_distance_y > MAX_SCROLL_DISTANCE) scroll_distance_y = MAX_SCROLL_DISTANCE; - g_sword2->_thisScreen.scroll_offset_y += scroll_distance_y; + _thisScreen.scroll_offset_y += scroll_distance_y; } else if (dy > 0) { - scroll_distance_y = 1 + dy / scroll_fraction; + scroll_distance_y = 1 + dy / _scrollFraction; if (scroll_distance_y > MAX_SCROLL_DISTANCE) scroll_distance_y = MAX_SCROLL_DISTANCE; - g_sword2->_thisScreen.scroll_offset_y -= scroll_distance_y; + _thisScreen.scroll_offset_y -= scroll_distance_y; } } } @@ -173,14 +170,14 @@ int32 Logic::fnSetScrollCoordinate(int32 *params) { int32 Logic::fnSetScrollSpeedNormal(int32 *params) { // params: none - scroll_fraction = 16; + g_sword2->_scrollFraction = 16; return IR_CONT; } int32 Logic::fnSetScrollSpeedSlow(int32 *params) { // params: none - scroll_fraction = 32; + g_sword2->_scrollFraction = 32; return IR_CONT; } |