diff options
-rw-r--r-- | gui/about.cpp | 308 | ||||
-rw-r--r-- | gui/about.h | 17 |
2 files changed, 305 insertions, 20 deletions
diff --git a/gui/about.cpp b/gui/about.cpp index 88bb98f87c..d9641d8c96 100644 --- a/gui/about.cpp +++ b/gui/about.cpp @@ -27,36 +27,306 @@ namespace GUI { +enum { + kScrollStartDelay = 3000, + kScrollMillisPerPixel = 80, + + kXOff = 3, + kYOff = 2 +}; + +// TODO: Probably should display something regarding GPL +// We could just list our full credits section here now... +// +// The following commands can be put at the start of a line (all subject to change): +// \C, \L, \R -- set center/left/right alignment +// \c0 - \c4 -- set a custom color: +// 0 normal text (green) +// 1 highlighted text (light green) +// 2 light border (light gray) +// 3 dark border (dark gray) +// 4 background (black) +const char *about_lines[] = { +"\\C""Copyright (C) 2002-2004 The ScummVM project", +"\\C""http://www.scummvm.org", +"\\C""", +"\\C""LucasArts SCUMM Games (C) LucasArts", +"\\C""Humongous SCUMM Games (C) Humongous", +"\\C""Simon the Sorcerer (C) Adventure Soft", +"\\C""Beneath a Steel Sky (C) Revolution", +"\\C""Broken Sword Games (C) Revolution", +"\\C""Flight of the Amazon Queen (C) John Passfield", +"\\C""and Steve Stamatiadis", +"\\C""", +"\\C\\c1""The ScummVM team:", +"\\L\\c0"" James Brown", +"\\L\\c2"" Lead developer", +"\\L\\c0"" Max Horn", +"\\L\\c2"" Lead developer", +"\\L\\c0"" Torbjorn Andersson", +"\\L\\c2"" Engine: SCUMM, Broken Sword II", +"\\L\\c0"" David Eriksson", +"\\L\\c2"" Engine: Flight of the Amazon Queen", +"\\L\\c0"" Robert Goeffringmann", +"\\L\\c2"" Engine: Beneath a Steel Sky, Broken Sword I", +"\\L\\c0"" Jonathan Gray", +"\\L\\c2"" Engine: SCUMM, Broken Sword II", +"\\L\\c0"" Travis Howell", +"\\L\\c2"" Engine: SCUMM, Simon the Sorcerer", +"\\L\\c0"" Oliver Kiehl", +"\\L\\c2"" Engine: Beneath a Steel Sky, Simon", +"\\L\\c0"" Pawel Kolodziejski", +"\\L\\c2"" Engine: SCUMM (Codecs, iMUSE, Smush, etc.)", +"\\L\\c0"" Gregory Montoir", +"\\L\\c2"" Engine: Flight of the Amazon Queen", +"\\L\\c0"" Joost Peters", +"\\L\\c2"" Engine: Beneath a Steel Sky, Flight of the", +"\\L\\c2"" Amazon Queen", +"\\L\\c0"" Eugene Sandulenko", +"\\L\\c2"" Engine: SCUMM (FT INSANE, bugfixes)", +"\\L\\c0"" Chris Apers", +"\\L\\c2"" Port: PalmOS", +"\\L\\c0"" Nicolas Bacca", +"\\L\\c2"" Port: PocketPC/WinCE port", +"\\L\\c0"" Marcus Comstedt", +"\\L\\c2"" Port: Dreamcast", +"\\L\\c0"" Ruediger Hanke", +"\\L\\c2"" Port: MorphOS", +"\\L\\c0"" Peter Moraliyski", +"\\L\\c2"" Port: GP32", +"\\L\\c0"" Lionel Ulmer", +"\\L\\c2"" Port: X11", +"\\L\\c0"" Jamieson Christian", +"\\L\\c2"" iMUSE, MIDI, all things musical.", +"\\L\\c0"" Jochen Hoenicke", +"\\L\\c2"" Speaker & PCjr sound support, Adlib work", +"\\L\\c0"" Jeremy Newman", +"\\L\\c2"" Webmaster", +"\\L\\c0""", +"\\C\\c1""Retired Team Members:", +"\\L\\c0"" Ralph Brorsen", +"\\L\\c2"" Help with GUI implementation", +"\\L\\c0"" Vincent Hamm", +"\\L\\c2"" Co-Founder", +"\\L\\c0"" Felix Jakschitsch", +"\\L\\c2"" Zak256 reverse engineering", +"\\L\\c0"" Mutwin Kraus", +"\\L\\c2"" Original MacOS porter", +"\\L\\c0"" Ludvig Strigeus", +"\\L\\c2"" Original ScummVM and SimonVM author", +"\\L\\c0""", +"\\C\\c1""Contributors:", +"\\L\\c0"" Andreas Roever", +"\\L\\c2"" Broken Sword 1/2 MPEG2 cutscene support", +"\\L\\c0"" Quietust", +"\\L\\c2"" Sound support for Amiga SCUMM V2", +"\\L\\c2"" V3 games", +"\\L\\c0"" Stuart Caie", +"\\L\\c2"" Decoders for Simon 1 Amiga data files", +"\\L\\c0"" Janne Huttunen", +"\\L\\c2"" V3 actor mask support, Dig/FT Smush audio", +"\\L\\c0"" Kovacs Endre Janos", +"\\L\\c2"" Several fixes for Simon1", +"\\L\\c0"" Jeroen Janssen", +"\\L\\c2"" Numerous readability and bugfix patches", +"\\L\\c0"" Claudio Matsuoka", +"\\L\\c2"" Daily Linux/BeOS builds ", +"\\L\\c0"" Mikesch Nepomuk", +"\\L\\c2"" MI1 VGA floppy patches.", +"\\L\\c0"" Nicolas Noble", +"\\L\\c2"" Config file and ALSA support", +"\\L\\c0"" Edward Rudd", +"\\L\\c2"" Fixes for playing MP3 versions of MI1/Loom", +"\\L\\c2"" audio", +"\\L\\c0"" Daniel Schepler", +"\\L\\c2"" Final MI1 CD music support/Initial Ogg", +"\\L\\c2"" Vorbis support", +"\\L\\c0"" Andre Souza", +"\\L\\c2"" SDL-based OpenGL renderer", +"\\L\\c0"" Tim 'realmz'", +"\\L\\c2"" Initial MI1 CD music support", +"\\L\\c0"" Tore Anderson", +"\\L\\c2"" Packaging for Debian GNU/Linux", +"\\L\\c0""", +"\\L\\c0"" And to all the contributors, users, and beta", +"\\L\\c0"" testers we've missed. Thanks!", +"\\L\\c0""", +"\\C\\c1""Special thanks to:", +"\\L\\c0"" Sander Buskens", +"\\L\\c2"" For his work on the initial reversing of", +"\\L\\c2"" Monkey2", +"\\L\\c0"" Canadacow", +"\\L\\c2"" For his MT-32 emulator", +"\\L\\c0"" Kevin Carnes", +"\\L\\c2"" For Scumm16, the basis of ScummVM older", +"\\L\\c2"" gfx codec", +"\\L\\c0"" Jezar", +"\\L\\c2"" For his freeverb filter implementation", +"\\L\\c0"" Jim Leiterman", +"\\L\\c2"" Various info on his FM-TOWNS/Marty SCUMM", +"\\L\\c2"" ports", +"\\L\\c0"" Jimmi Thogersen", +"\\L\\c2"" For ScummRev, and much obscure", +"\\L\\c2"" code/documentation", +"\\L\\c0"" Tristan", +"\\L\\c2"" For his Linux port of MT-32 emulator", +"\\L\\c0""", +"\\L\\c0""Tony Warriner and everyone at Revolution", +"\\L\\c0""Software Ltd. for sharing with us the source", +"\\L\\c0""of some of their brilliant games, allowing us", +"\\L\\c0""to release Beneath a Steel Sky as freeware...", +"\\L\\c0""and generally being supportive above and", +"\\L\\c0""beyond the call of duty.", +"\\L\\c0""", +"\\L\\c0""John Passfield and Steve Stamatiadis for", +"\\L\\c0""sharing the source of their classic title,", +"\\L\\c0""Flight of the Amazon Queen and also being", +"\\L\\c0""incredibly supportive.", +"\\L\\c0""", +"\\L\\c0""Aric Wilmunder, Ron Gilbert, David Fox, Vince", +"\\L\\c0""Lee, and all those at LucasFilm/LucasArts who", +"\\L\\c0""made SCUMM the insane mess to reimplement", +"\\L\\c0""that it is today. Feel free to drop us a line", +"\\L\\c0""and tell us what you think, guys!", +}; + AboutDialog::AboutDialog() - : Dialog(10, 20, 300, 174) { + : Dialog(10, 20, 300, 174), + _scrollPos(0), _scrollTime(0) { + + int i; - addButton((_w - kButtonWidth) / 2, 150, "OK", kCloseCmd, '\r'); // Close dialog - FIXME + _lineHeight = g_gui.getFont().getFontHeight() + 3; - Common::String version("ScummVM "); + for (i = 0; i < 1; i++) + _lines.push_back(""); + + Common::String version("\\C\\c0""ScummVM "); version += gScummVMVersion; - new StaticTextWidget(this, 0, 10, _w, kLineHeight, version, kTextAlignCenter); + _lines.push_back(version); - Common::String date("(built on "); + Common::String date("\\C\\c2""(built on "); date += gScummVMBuildDate; date += ')'; - new StaticTextWidget(this, 0, 20, _w, kLineHeight, date, kTextAlignCenter); + _lines.push_back(date); - Common::String features("Supports: "); + Common::String features("\\C\\c2""Supports: "); features += gScummVMFeatures; - new StaticTextWidget(this, 0, 30, _w, kLineHeight, features, kTextAlignCenter ); + _lines.push_back(features); + + _lines.push_back(""); + for (i = 0; i < ARRAYSIZE(about_lines); i++) + _lines.push_back(about_lines[i]); +} + +void AboutDialog::open() { + _scrollTime = g_system->getMillis() + kScrollStartDelay; + _scrollPos = 0; + + Dialog::open(); +} + +void AboutDialog::drawDialog() { + // Blend over the background + g_gui.blendRect(_x, _y, _w, _h, g_gui._bgcolor); + + // Draw text + // TODO: Add a "fade" effect for the top/bottom text lines + const int firstLine = _scrollPos / _lineHeight; + const int lastLine = MIN((_scrollPos + _h) / _lineHeight + 1, _lines.size()); + int y = _y + kYOff - (_scrollPos % _lineHeight); + + for (int line = firstLine; line < lastLine; line++) { + const char *str = _lines[line].c_str(); + Graphics::TextAlignment align = Graphics::kTextAlignCenter; + OverlayColor color = g_gui._textcolor; + while (str[0] == '\\') { + switch (str[1]) { + case 'C': + align = Graphics::kTextAlignCenter; + break; + case 'L': + align = Graphics::kTextAlignLeft; + break; + case 'R': + align = Graphics::kTextAlignRight; + break; + case 'c': + switch (str[2]) { + case '0': + color = g_gui._textcolor; + break; + case '1': + color = g_gui._textcolorhi; + break; + case '2': + color = g_gui._color; + break; + case '3': + color = g_gui._shadowcolor; + break; + case '4': + color = g_gui._bgcolor; + break; + default: + warning("Unknown color type '%c'", str[2]); + } + str++; + break; + default: + warning("Unknown scroller opcode '%c'\n", str[1]); + break; + } + str += 2; + } + // Trim leading whitespaces if center mode is on + if (align == Graphics::kTextAlignCenter) + while (*str && *str == ' ') + str++; - // TODO: Probably should display something regarding GPL - new StaticTextWidget(this, 0, 45, _w, kLineHeight, "Copyright (C) 2002-2004 The ScummVM project", kTextAlignCenter); - new StaticTextWidget(this, 0, 55, _w, kLineHeight, "http://www.scummvm.org", kTextAlignCenter); - - new StaticTextWidget(this, 0, 75, _w, kLineHeight, "LucasArts SCUMM Games (C) LucasArts", kTextAlignCenter); - new StaticTextWidget(this, 0, 85, _w, kLineHeight, "Humongous SCUMM Games (C) Humongous", kTextAlignCenter); - new StaticTextWidget(this, 0, 95, _w, kLineHeight, "Simon the Sorcerer (C) Adventure Soft", kTextAlignCenter); - new StaticTextWidget(this, 0, 105, _w, kLineHeight, "Beneath a Steel Sky (C) Revolution", kTextAlignCenter); - new StaticTextWidget(this, 0, 115, _w, kLineHeight, "Broken Sword Games (C) Revolution", kTextAlignCenter); - new StaticTextWidget(this, 0, 125, _w, kLineHeight, "Flight of the Amazon Queen (C) John Passfield", kTextAlignCenter); - new StaticTextWidget(this, 0, 135, _w, kLineHeight, "and Steve Stamatiadis", kTextAlignCenter); + g_gui.drawString(str, _x + kXOff, y, _w - 2 * kXOff, color, align); + y += _lineHeight; + } + + // Draw a border + g_gui.box(_x, _y, _w, _h, g_gui._color, g_gui._shadowcolor); + + // Finally blit it all to the screen + g_gui.addDirtyRect(_x, _y, _w, _h); } + +void AboutDialog::handleTickle() { + const uint32 t = g_system->getMillis(); + int scrollOffset = ((int)t - (int)_scrollTime) / kScrollMillisPerPixel; + if (scrollOffset > 0) { + _scrollPos += scrollOffset; + _scrollTime = t; + + if (_scrollPos < 0) { + _scrollPos = 0; + } else if ((uint32)_scrollPos > _lines.size() * _lineHeight) { + _scrollPos = 0; + _scrollTime += kScrollStartDelay; + } else { + g_gui.addDirtyRect(_x, _y, _w, _h); + } + draw(); // Issue a full redraw + } +} + +void AboutDialog::handleMouseUp(int x, int y, int button, int clickCount) { + // Close upon any mouse click + close(); +} + +void AboutDialog::handleKeyDown(uint16 ascii, int keycode, int modifiers) { +} + +void AboutDialog::handleKeyUp(uint16 ascii, int keycode, int modifiers) { + close(); +} + + } // End of namespace GUI diff --git a/gui/about.h b/gui/about.h index de2d1f3ce4..13ad79c7d6 100644 --- a/gui/about.h +++ b/gui/about.h @@ -21,13 +21,28 @@ #ifndef ABOUT_DIALOG_H #define ABOUT_DIALOG_H -#include "dialog.h" +#include "gui/dialog.h" +#include "common/str.h" namespace GUI { class AboutDialog : public Dialog { + typedef Common::StringList StringList; +protected: + int _scrollPos; + uint32 _scrollTime; + StringList _lines; + uint32 _lineHeight; + public: AboutDialog(); + + void open(); + void drawDialog(); + void handleTickle(); + void handleMouseUp(int x, int y, int button, int clickCount); + void handleKeyDown(uint16 ascii, int keycode, int modifiers); + void handleKeyUp(uint16 ascii, int keycode, int modifiers); }; } // End of namespace GUI |