diff options
author | Gregory Montoir | 2003-12-26 14:49:49 +0000 |
---|---|---|
committer | Gregory Montoir | 2003-12-26 14:49:49 +0000 |
commit | e05e079116cd9d63ebd06688a67264abe1aadb9b (patch) | |
tree | 3261b0ff49eef3a56f5a186b6e012b6052689d34 | |
parent | 802ebb584fdaaa6ac4315f8f12c2b2ddb9b81bf5 (diff) | |
download | scummvm-rg350-e05e079116cd9d63ebd06688a67264abe1aadb9b.tar.gz scummvm-rg350-e05e079116cd9d63ebd06688a67264abe1aadb9b.tar.bz2 scummvm-rg350-e05e079116cd9d63ebd06688a67264abe1aadb9b.zip |
enable original screen blankers
svn-id: r11944
-rw-r--r-- | queen/display.cpp | 114 | ||||
-rw-r--r-- | queen/display.h | 18 | ||||
-rw-r--r-- | queen/input.cpp | 7 | ||||
-rw-r--r-- | queen/input.h | 7 | ||||
-rw-r--r-- | queen/logic.cpp | 3 |
5 files changed, 140 insertions, 9 deletions
diff --git a/queen/display.cpp b/queen/display.cpp index 32464e67fb..5e7e7c0cc0 100644 --- a/queen/display.cpp +++ b/queen/display.cpp @@ -109,12 +109,15 @@ Display::Display(QueenEngine *vm, Language language, OSystem *system) _buffer[RB_BACKDROP] = new uint8[BACKDROP_W * BACKDROP_H]; _buffer[RB_PANEL] = new uint8[PANEL_W * PANEL_H]; _buffer[RB_SCREEN] = new uint8[SCREEN_W * SCREEN_H]; + _buffer[RB_MINI] = new uint8[MINI_W * MINI_H]; memset(_buffer[RB_BACKDROP], 0, BACKDROP_W * BACKDROP_H); memset(_buffer[RB_PANEL], 0, PANEL_W * PANEL_H); memset(_buffer[RB_SCREEN], 0, SCREEN_W * SCREEN_H); + memset(_buffer[RB_MINI], 0, MINI_W * MINI_H); _bufPitch[RB_BACKDROP] = BACKDROP_W; _bufPitch[RB_PANEL] = PANEL_W; _bufPitch[RB_SCREEN] = SCREEN_W; + _bufPitch[RB_MINI] = MINI_H; _pal.room = new uint8[ 256 * 3 ]; _pal.screen = new uint8[ 256 * 3 ]; @@ -125,6 +128,7 @@ Display::Display(QueenEngine *vm, Language language, OSystem *system) _pal.scrollable = true; _horizontalScroll = 0; + _curBlankingEffect = 0; } @@ -133,6 +137,7 @@ Display::~Display() { delete[] _buffer[RB_BACKDROP]; delete[] _buffer[RB_PANEL]; delete[] _buffer[RB_SCREEN]; + delete[] _buffer[RB_MINI]; delete[] _pal.room; delete[] _pal.screen; @@ -691,9 +696,7 @@ void Display::update(bool dynalum, int16 dynaX, int16 dynaY) { _pal.dirtyMin = 144; _pal.dirtyMax = 144; } - _system->copy_rect(_buffer[RB_SCREEN], _bufPitch[RB_SCREEN], 0, 0, SCREEN_W, SCREEN_H); - _system->update_screen(); - waitForTimer(); + drawScreen(); } @@ -880,6 +883,111 @@ void Display::drawBox(int16 x1, int16 y1, int16 x2, int16 y2, uint8 col) { } +void Display::drawScreen() { + + _system->copy_rect(_buffer[RB_SCREEN], _bufPitch[RB_SCREEN], 0, 0, SCREEN_W, SCREEN_H); + _system->update_screen(); + waitForTimer(); +} + + + +void Display::blankScreen() { + + typedef void (Display::*BlankerEffect)(); + static const BlankerEffect effects[] = { + &Display::blankScreenEffect1, + &Display::blankScreenEffect2, + &Display::blankScreenEffect3 + }; + (this->*effects[_curBlankingEffect])(); + _curBlankingEffect = (_curBlankingEffect + 1) % 3; +} + + +void Display::blankScreenEffect1() { + + while (_vm->input()->idleTime() >= Input::DELAY_SCREEN_BLANKER) { + for(int i = 0; i < 2; ++i) { + uint16 x = _vm->randomizer.getRandomNumber(SCREEN_W - MINI_W - 2) + 1; + uint16 y = _vm->randomizer.getRandomNumber(SCREEN_H - MINI_H - 2) + 1; + uint8 *p = _buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * y + x; + blit(RB_MINI, 0, 0, p, MINI_W, MINI_H, _bufPitch[RB_SCREEN], false, false); + if (_vm->randomizer.getRandomNumber(1) & 1) { + --x; + } else { + ++x; + } + if (_vm->randomizer.getRandomNumber(1) & 1) { + --y; + } else { + ++y; + } + blit(RB_SCREEN, x, y, _buffer[RB_MINI], MINI_W, MINI_H, _bufPitch[RB_MINI], false, false); + drawScreen(); + } + } +} + + +void Display::blankScreenEffect2() { + + while (_vm->input()->idleTime() >= Input::DELAY_SCREEN_BLANKER) { + uint16 x = _vm->randomizer.getRandomNumber(SCREEN_W - 2); + uint16 y = _vm->randomizer.getRandomNumber(SCREEN_H - 2); + uint8 c = 0; + switch (_vm->randomizer.getRandomNumber(3)) { + case 0: + c = *(_buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * y + x); + break; + case 1: + c = *(_buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * y + x + 1); + break; + case 2: + c = *(_buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * (y + 1) + x); + break; + case 3: + c = *(_buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * (y + 1) + x + 1); + break; + default: + break; + } + uint8 *p = _buffer[RB_SCREEN] + y * _bufPitch[RB_SCREEN] + x; + int j = 2; + while (j--) { + memset(p, c, 2); + p += _bufPitch[RB_SCREEN]; + } + drawScreen(); + } +} + + +void Display::blankScreenEffect3() { + + uint32 i = 0; + while (_vm->input()->idleTime() >= Input::DELAY_SCREEN_BLANKER) { + uint16 x = _vm->randomizer.getRandomNumber(SCREEN_W - 2); + uint16 y = _vm->randomizer.getRandomNumber(SCREEN_H - 2); + uint8 *p = _buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * y + x; + uint8 p0 = *p; + uint8 p1 = *(p + 1); + uint8 p2 = *(p + _bufPitch[RB_SCREEN]); + uint8 p3 = *(p + _bufPitch[RB_SCREEN] + 1); + uint8 c = (p0 + p1 + p2 + p3) / 4; + int j = 2; + while (j--) { + memset(p, c, 2); + p += _bufPitch[RB_SCREEN]; + } + if (i > 4000000) { + memset(_buffer[RB_SCREEN], 0, SCREEN_W * SCREEN_H); + } + drawScreen(); + ++i; + } +} + const uint8 TextRenderer::_font[] = { 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, diff --git a/queen/display.h b/queen/display.h index da92cd2baf..16dc3fb281 100644 --- a/queen/display.h +++ b/queen/display.h @@ -31,7 +31,8 @@ namespace Queen { enum RenderingBuffer { RB_BACKDROP = 0, RB_PANEL = 1, - RB_SCREEN = 2 + RB_SCREEN = 2, + RB_MINI = 3 }; enum JoePalette { @@ -112,6 +113,12 @@ public: void showMouseCursor(bool show); void drawBox(int16 x1, int16 y1, int16 x2, int16 y2, uint8 col); + void drawScreen(); + + void blankScreen(); + void blankScreenEffect1(); + void blankScreenEffect2(); + void blankScreenEffect3(); private: @@ -125,7 +132,9 @@ private: SCREEN_W = 320, SCREEN_H = 200, PANEL_W = 320, - PANEL_H = 50 + PANEL_H = 50, + MINI_W = 32, + MINI_H = 32 }; TextRenderer _textRenderer; @@ -137,8 +146,8 @@ private: bool scrollable; } _pal; - uint8 *_buffer[3]; - uint16 _bufPitch[3]; + uint8 *_buffer[4]; + uint16 _bufPitch[4]; bool _fullscreen; @@ -146,6 +155,7 @@ private: uint16 _bdWidth, _bdHeight; bool _gotTick; + int _curBlankingEffect; Dynalum _dynalum; OSystem *_system; diff --git a/queen/input.cpp b/queen/input.cpp index cf964dd3ad..a7bb6972f8 100644 --- a/queen/input.cpp +++ b/queen/input.cpp @@ -37,7 +37,7 @@ Input::Input(Language language, OSystem *system) : _system(system), _fastMode(false), _keyVerb(VERB_NONE), _cutawayRunning(false), _cutawayQuit(false), _talkQuit(false), _quickSave(false), _quickLoad(false), _debugger(false), - _inKey(0), _mouse_x(0), _mouse_y(0), _mouseButton(0) { + _inKey(0), _mouse_x(0), _mouse_y(0), _mouseButton(0), _idleTime(0) { switch (language) { case ENGLISH: @@ -75,8 +75,13 @@ void Input::delay(uint amount) { uint32 start = _system->get_msecs(); uint32 cur = start; + if (_idleTime < DELAY_SCREEN_BLANKER) { + _idleTime += amount; + } + do { while (_system->poll_event(&event)) { + _idleTime = 0; switch (event.event_code) { case OSystem::EVENT_KEYDOWN: debug(1, "event.kbd.keycode = %i (%c)", diff --git a/queen/input.h b/queen/input.h index 5936efd11c..91ef573036 100644 --- a/queen/input.h +++ b/queen/input.h @@ -34,7 +34,8 @@ class Input { //! Adjust here to change delays! enum { DELAY_SHORT = 10, - DELAY_NORMAL = 100 + DELAY_NORMAL = 100, + DELAY_SCREEN_BLANKER = 5 * 60 * 1000 }; enum { @@ -87,6 +88,8 @@ class Input { int mouseButton() const { return _mouseButton; } void clearMouseButton() { _mouseButton = 0; } + uint32 idleTime() const { return _idleTime; } + private: enum KeyCode { @@ -155,6 +158,8 @@ class Input { //! Set by delay(); int _mouseButton; + uint32 _idleTime; + //! Command keys for current language const char *_currentCommandKeys; diff --git a/queen/logic.cpp b/queen/logic.cpp index 9fa31bc03d..fa2826fca6 100644 --- a/queen/logic.cpp +++ b/queen/logic.cpp @@ -2258,6 +2258,9 @@ void Logic::update() { _vm->input()->quickLoadReset(); gameLoad(0); } + if (_vm->input()->idleTime() >= Input::DELAY_SCREEN_BLANKER) { + _vm->display()->blankScreen(); + } } } |