Initial commit
This commit is contained in:
192
engines/got/views/story.cpp
Normal file
192
engines/got/views/story.cpp
Normal file
@@ -0,0 +1,192 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "got/views/story.h"
|
||||
#include "got/gfx/palette.h"
|
||||
#include "got/metaengine.h"
|
||||
#include "got/utils/file.h"
|
||||
#include "got/vars.h"
|
||||
|
||||
namespace Got {
|
||||
namespace Views {
|
||||
|
||||
#define MAX_Y 236
|
||||
|
||||
bool Story::msgFocus(const FocusMessage &msg) {
|
||||
Common::String storyName = g_events->isDemo() ? "STORY" :
|
||||
Common::String::format("STORY%d", _G(area));
|
||||
resourceRead(storyName, _G(tmpBuff));
|
||||
|
||||
byte paletteBuffer[Graphics::PALETTE_SIZE] = {};
|
||||
resourceRead("STORYPAL", paletteBuffer);
|
||||
|
||||
for (int i = 0; i < Graphics::PALETTE_SIZE; ++i)
|
||||
paletteBuffer[i] = ((int)paletteBuffer[i] * 255 + 31) / 63;
|
||||
Gfx::setPalette(paletteBuffer);
|
||||
|
||||
// Create story image and load in it's fragments
|
||||
_surface.create(320, 240 * 2);
|
||||
|
||||
for (int i = 0; i < 12; i++) {
|
||||
Gfx::Pics pics(Common::String::format("OPENP%d", i + 1));
|
||||
pics.load();
|
||||
|
||||
_surface.simpleBlitFrom(pics[0], Common::Point(0, i * 40));
|
||||
}
|
||||
|
||||
// Set up the story text
|
||||
int i = 0;
|
||||
int x = 8, y = 2;
|
||||
byte color = 72;
|
||||
char s[21];
|
||||
|
||||
const char *p = (const char *)_G(tmpBuff);
|
||||
|
||||
#ifdef USE_TTS
|
||||
_ttsMessage.clear();
|
||||
#endif
|
||||
|
||||
while (i < 46) {
|
||||
if (*p == '\n') {
|
||||
x = 8;
|
||||
y += 10;
|
||||
i++;
|
||||
|
||||
if (i == 23) {
|
||||
// Move to start of of "second page" of the surface
|
||||
y = 240 + 2;
|
||||
#ifdef USE_TTS
|
||||
_secondPageIndex = _ttsMessage.size() - 1;
|
||||
#endif
|
||||
}
|
||||
#ifdef USE_TTS
|
||||
_ttsMessage += '\n';
|
||||
#endif
|
||||
} else if (*p == '/' && *(p + 4) == '/') {
|
||||
p++;
|
||||
s[0] = *p++;
|
||||
s[1] = *p++;
|
||||
s[2] = *p++;
|
||||
s[3] = 0;
|
||||
color = atoi(s);
|
||||
} else if (*p != '\r') {
|
||||
_surface.rawPrintChar(*p, x - 1, y - 1, 255);
|
||||
_surface.rawPrintChar(*p, x + 1, y + 1, 255);
|
||||
_surface.rawPrintChar(*p, x - 1, y + 1, 255);
|
||||
_surface.rawPrintChar(*p, x + 1, y - 1, 255);
|
||||
_surface.rawPrintChar(*p, x, y - 1, 255);
|
||||
_surface.rawPrintChar(*p, x, y + 1, 255);
|
||||
_surface.rawPrintChar(*p, x - 1, y, 255);
|
||||
_surface.rawPrintChar(*p, x + 1, y, 255);
|
||||
_surface.rawPrintChar(*p, x, y, color);
|
||||
x += 8;
|
||||
|
||||
#ifdef USE_TTS
|
||||
_ttsMessage += *p;
|
||||
#endif
|
||||
}
|
||||
|
||||
p++;
|
||||
}
|
||||
|
||||
#ifdef USE_TTS
|
||||
sayText(_ttsMessage.substr(0, _secondPageIndex));
|
||||
#endif
|
||||
|
||||
// Final two glyphs
|
||||
Gfx::Pics glyphs("STORYPIC", 262);
|
||||
|
||||
if (_G(area) == 1) {
|
||||
_surface.simpleBlitFrom(glyphs[0], Common::Point(146, 64));
|
||||
_surface.simpleBlitFrom(glyphs[1], Common::Point(24, 88 + 240));
|
||||
} else {
|
||||
_surface.simpleBlitFrom(glyphs[0], Common::Point(146, 16));
|
||||
}
|
||||
|
||||
// Play the opening music
|
||||
musicPlay("OPENSONG", true);
|
||||
|
||||
_yp = 0;
|
||||
_scrolling = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Story::msgUnfocus(const UnfocusMessage &msg) {
|
||||
_surface.clear();
|
||||
musicPause();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Story::draw() {
|
||||
GfxSurface s = getSurface();
|
||||
|
||||
// Draw the currently visible part of the surface
|
||||
s.simpleBlitFrom(_surface, Common::Rect(0, _yp, 320, _yp + 240),
|
||||
Common::Point(0, 0));
|
||||
}
|
||||
|
||||
bool Story::msgAction(const ActionMessage &msg) {
|
||||
if (msg._action == KEYBIND_ESCAPE || _yp == MAX_Y)
|
||||
done();
|
||||
else if (!_scrolling) {
|
||||
#ifdef USE_TTS
|
||||
sayText(_ttsMessage.substr(_secondPageIndex));
|
||||
#endif
|
||||
_scrolling = true;
|
||||
} else
|
||||
_yp = MAX_Y;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Story::msgKeypress(const KeypressMessage &msg) {
|
||||
if (_yp == MAX_Y)
|
||||
done();
|
||||
else if (!_scrolling)
|
||||
_scrolling = true;
|
||||
else
|
||||
_yp = 240;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Story::tick() {
|
||||
if (_scrolling && _yp < MAX_Y) {
|
||||
_yp = MIN(_yp + 4, MAX_Y);
|
||||
redraw();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Story::done() {
|
||||
musicStop();
|
||||
|
||||
fadeOut();
|
||||
Gfx::loadPalette();
|
||||
replaceView("PartTitle");
|
||||
fadeIn();
|
||||
}
|
||||
|
||||
} // namespace Views
|
||||
} // namespace Got
|
||||
Reference in New Issue
Block a user