enable original screen blankers
svn-id: r11944
This commit is contained in:
parent
802ebb584f
commit
e05e079116
5 changed files with 140 additions and 9 deletions
|
@ -109,12 +109,15 @@ Display::Display(QueenEngine *vm, Language language, OSystem *system)
|
||||||
_buffer[RB_BACKDROP] = new uint8[BACKDROP_W * BACKDROP_H];
|
_buffer[RB_BACKDROP] = new uint8[BACKDROP_W * BACKDROP_H];
|
||||||
_buffer[RB_PANEL] = new uint8[PANEL_W * PANEL_H];
|
_buffer[RB_PANEL] = new uint8[PANEL_W * PANEL_H];
|
||||||
_buffer[RB_SCREEN] = new uint8[SCREEN_W * SCREEN_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_BACKDROP], 0, BACKDROP_W * BACKDROP_H);
|
||||||
memset(_buffer[RB_PANEL], 0, PANEL_W * PANEL_H);
|
memset(_buffer[RB_PANEL], 0, PANEL_W * PANEL_H);
|
||||||
memset(_buffer[RB_SCREEN], 0, SCREEN_W * SCREEN_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_BACKDROP] = BACKDROP_W;
|
||||||
_bufPitch[RB_PANEL] = PANEL_W;
|
_bufPitch[RB_PANEL] = PANEL_W;
|
||||||
_bufPitch[RB_SCREEN] = SCREEN_W;
|
_bufPitch[RB_SCREEN] = SCREEN_W;
|
||||||
|
_bufPitch[RB_MINI] = MINI_H;
|
||||||
|
|
||||||
_pal.room = new uint8[ 256 * 3 ];
|
_pal.room = new uint8[ 256 * 3 ];
|
||||||
_pal.screen = 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;
|
_pal.scrollable = true;
|
||||||
|
|
||||||
_horizontalScroll = 0;
|
_horizontalScroll = 0;
|
||||||
|
_curBlankingEffect = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -133,6 +137,7 @@ Display::~Display() {
|
||||||
delete[] _buffer[RB_BACKDROP];
|
delete[] _buffer[RB_BACKDROP];
|
||||||
delete[] _buffer[RB_PANEL];
|
delete[] _buffer[RB_PANEL];
|
||||||
delete[] _buffer[RB_SCREEN];
|
delete[] _buffer[RB_SCREEN];
|
||||||
|
delete[] _buffer[RB_MINI];
|
||||||
|
|
||||||
delete[] _pal.room;
|
delete[] _pal.room;
|
||||||
delete[] _pal.screen;
|
delete[] _pal.screen;
|
||||||
|
@ -691,9 +696,7 @@ void Display::update(bool dynalum, int16 dynaX, int16 dynaY) {
|
||||||
_pal.dirtyMin = 144;
|
_pal.dirtyMin = 144;
|
||||||
_pal.dirtyMax = 144;
|
_pal.dirtyMax = 144;
|
||||||
}
|
}
|
||||||
_system->copy_rect(_buffer[RB_SCREEN], _bufPitch[RB_SCREEN], 0, 0, SCREEN_W, SCREEN_H);
|
drawScreen();
|
||||||
_system->update_screen();
|
|
||||||
waitForTimer();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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[] = {
|
const uint8 TextRenderer::_font[] = {
|
||||||
0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
|
0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
|
||||||
|
|
|
@ -31,7 +31,8 @@ namespace Queen {
|
||||||
enum RenderingBuffer {
|
enum RenderingBuffer {
|
||||||
RB_BACKDROP = 0,
|
RB_BACKDROP = 0,
|
||||||
RB_PANEL = 1,
|
RB_PANEL = 1,
|
||||||
RB_SCREEN = 2
|
RB_SCREEN = 2,
|
||||||
|
RB_MINI = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
enum JoePalette {
|
enum JoePalette {
|
||||||
|
@ -112,6 +113,12 @@ public:
|
||||||
void showMouseCursor(bool show);
|
void showMouseCursor(bool show);
|
||||||
|
|
||||||
void drawBox(int16 x1, int16 y1, int16 x2, int16 y2, uint8 col);
|
void drawBox(int16 x1, int16 y1, int16 x2, int16 y2, uint8 col);
|
||||||
|
void drawScreen();
|
||||||
|
|
||||||
|
void blankScreen();
|
||||||
|
void blankScreenEffect1();
|
||||||
|
void blankScreenEffect2();
|
||||||
|
void blankScreenEffect3();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -125,7 +132,9 @@ private:
|
||||||
SCREEN_W = 320,
|
SCREEN_W = 320,
|
||||||
SCREEN_H = 200,
|
SCREEN_H = 200,
|
||||||
PANEL_W = 320,
|
PANEL_W = 320,
|
||||||
PANEL_H = 50
|
PANEL_H = 50,
|
||||||
|
MINI_W = 32,
|
||||||
|
MINI_H = 32
|
||||||
};
|
};
|
||||||
|
|
||||||
TextRenderer _textRenderer;
|
TextRenderer _textRenderer;
|
||||||
|
@ -137,8 +146,8 @@ private:
|
||||||
bool scrollable;
|
bool scrollable;
|
||||||
} _pal;
|
} _pal;
|
||||||
|
|
||||||
uint8 *_buffer[3];
|
uint8 *_buffer[4];
|
||||||
uint16 _bufPitch[3];
|
uint16 _bufPitch[4];
|
||||||
|
|
||||||
bool _fullscreen;
|
bool _fullscreen;
|
||||||
|
|
||||||
|
@ -146,6 +155,7 @@ private:
|
||||||
uint16 _bdWidth, _bdHeight;
|
uint16 _bdWidth, _bdHeight;
|
||||||
|
|
||||||
bool _gotTick;
|
bool _gotTick;
|
||||||
|
int _curBlankingEffect;
|
||||||
|
|
||||||
Dynalum _dynalum;
|
Dynalum _dynalum;
|
||||||
OSystem *_system;
|
OSystem *_system;
|
||||||
|
|
|
@ -37,7 +37,7 @@ Input::Input(Language language, OSystem *system) :
|
||||||
_system(system), _fastMode(false), _keyVerb(VERB_NONE),
|
_system(system), _fastMode(false), _keyVerb(VERB_NONE),
|
||||||
_cutawayRunning(false), _cutawayQuit(false), _talkQuit(false),
|
_cutawayRunning(false), _cutawayQuit(false), _talkQuit(false),
|
||||||
_quickSave(false), _quickLoad(false), _debugger(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) {
|
switch (language) {
|
||||||
case ENGLISH:
|
case ENGLISH:
|
||||||
|
@ -75,8 +75,13 @@ void Input::delay(uint amount) {
|
||||||
uint32 start = _system->get_msecs();
|
uint32 start = _system->get_msecs();
|
||||||
uint32 cur = start;
|
uint32 cur = start;
|
||||||
|
|
||||||
|
if (_idleTime < DELAY_SCREEN_BLANKER) {
|
||||||
|
_idleTime += amount;
|
||||||
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
while (_system->poll_event(&event)) {
|
while (_system->poll_event(&event)) {
|
||||||
|
_idleTime = 0;
|
||||||
switch (event.event_code) {
|
switch (event.event_code) {
|
||||||
case OSystem::EVENT_KEYDOWN:
|
case OSystem::EVENT_KEYDOWN:
|
||||||
debug(1, "event.kbd.keycode = %i (%c)",
|
debug(1, "event.kbd.keycode = %i (%c)",
|
||||||
|
|
|
@ -34,7 +34,8 @@ class Input {
|
||||||
//! Adjust here to change delays!
|
//! Adjust here to change delays!
|
||||||
enum {
|
enum {
|
||||||
DELAY_SHORT = 10,
|
DELAY_SHORT = 10,
|
||||||
DELAY_NORMAL = 100
|
DELAY_NORMAL = 100,
|
||||||
|
DELAY_SCREEN_BLANKER = 5 * 60 * 1000
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -87,6 +88,8 @@ class Input {
|
||||||
int mouseButton() const { return _mouseButton; }
|
int mouseButton() const { return _mouseButton; }
|
||||||
void clearMouseButton() { _mouseButton = 0; }
|
void clearMouseButton() { _mouseButton = 0; }
|
||||||
|
|
||||||
|
uint32 idleTime() const { return _idleTime; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
enum KeyCode {
|
enum KeyCode {
|
||||||
|
@ -155,6 +158,8 @@ class Input {
|
||||||
//! Set by delay();
|
//! Set by delay();
|
||||||
int _mouseButton;
|
int _mouseButton;
|
||||||
|
|
||||||
|
uint32 _idleTime;
|
||||||
|
|
||||||
//! Command keys for current language
|
//! Command keys for current language
|
||||||
const char *_currentCommandKeys;
|
const char *_currentCommandKeys;
|
||||||
|
|
||||||
|
|
|
@ -2258,6 +2258,9 @@ void Logic::update() {
|
||||||
_vm->input()->quickLoadReset();
|
_vm->input()->quickLoadReset();
|
||||||
gameLoad(0);
|
gameLoad(0);
|
||||||
}
|
}
|
||||||
|
if (_vm->input()->idleTime() >= Input::DELAY_SCREEN_BLANKER) {
|
||||||
|
_vm->display()->blankScreen();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue