diff options
Diffstat (limited to 'src/uqm/planets/report.c')
-rw-r--r-- | src/uqm/planets/report.c | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/src/uqm/planets/report.c b/src/uqm/planets/report.c new file mode 100644 index 0000000..5defbe7 --- /dev/null +++ b/src/uqm/planets/report.c @@ -0,0 +1,271 @@ +//Copyright Paul Reiche, Fred Ford. 1992-2002 + +/* + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "lander.h" +#include "scan.h" +#include "planets.h" +#include "../colors.h" +#include "../controls.h" +#include "../gamestr.h" +#include "../setup.h" +#include "../util.h" +#include "../sounds.h" +#include "../uqmdebug.h" +#include "options.h" +#include "libs/inplib.h" + +#include <ctype.h> +#include <string.h> + + +#define NUM_CELL_COLS MAP_WIDTH / 6 +#define NUM_CELL_ROWS MAP_HEIGHT / 6 +#define MAX_CELL_COLS 40 + +extern FRAME SpaceJunkFrame; + +static void +ClearReportArea (void) +{ + COUNT x, y; + RECT r; + STAMP s; + COORD startx; + + if (optWhichFonts == OPT_PC) + s.frame = SetAbsFrameIndex (SpaceJunkFrame, 21); + else + s.frame = SetAbsFrameIndex (SpaceJunkFrame, 18); + GetFrameRect (s.frame, &r); + + BatchGraphics (); + + SetContextBackGroundColor (BLACK_COLOR); + ClearDrawable (); + SetContextForeGroundColor ( + BUILD_COLOR (MAKE_RGB15 (0x00, 0x07, 0x00), 0x57)); + + startx = 1 + (r.extent.width >> 1) - 1; + s.origin.y = 1; + for (y = 0; y < NUM_CELL_ROWS; ++y) + { + s.origin.x = startx; + for (x = 0; x < NUM_CELL_COLS; ++x) + { + if (optWhichFonts == OPT_PC) + DrawStamp (&s); + else + DrawFilledStamp (&s); + + s.origin.x += r.extent.width + 1; + } + s.origin.y += r.extent.height + 1; + } + + UnbatchGraphics (); +} + +static void +MakeReport (SOUND ReadOutSounds, UNICODE *pStr, COUNT StrLen) +{ + BYTE ButtonState; + int end_page_len; + UNICODE end_page_buf[200]; + UniChar last_c = 0; + COUNT row_cells; + BOOLEAN Sleepy; + RECT r; + TEXT t; + + sprintf (end_page_buf, "%s\n", GAME_STRING (SCAN_STRING_BASE + NUM_SCAN_TYPES)); + end_page_len = utf8StringCount (end_page_buf); + + GetFrameRect (SetAbsFrameIndex (SpaceJunkFrame, 18), &r); + + t.align = ALIGN_LEFT; + t.CharCount = 1; + t.pStr = pStr; + + Sleepy = TRUE; + + FlushInput (); + // XXX: this is a pretty ugly goto + goto InitPageCell; + + while (StrLen) + { + COUNT col_cells; + const UNICODE *pLastStr; + const UNICODE *pNextStr; + COUNT lf_pos; + + pLastStr = t.pStr; + + // scan for LFs in the remaining string + // trailing LF will be ignored + for (lf_pos = StrLen, pNextStr = t.pStr; + lf_pos && getCharFromString (&pNextStr) != '\n'; + --lf_pos) + ; + + col_cells = 0; + // check if the remaining text fits on current screen + if (row_cells == NUM_CELL_ROWS - 1 + && (StrLen > NUM_CELL_COLS || lf_pos > 1)) + { + col_cells = (NUM_CELL_COLS >> 1) - (end_page_len >> 1); + t.pStr = end_page_buf; + StrLen += end_page_len; + } + t.baseline.x = 1 + (r.extent.width >> 1) + + (col_cells * (r.extent.width + 1)) - 1; + do + { + COUNT word_chars; + const UNICODE *pStr; + UniChar c; + + pStr = t.pStr; + pNextStr = t.pStr; + while (UniChar_isGraph (getCharFromString (&pNextStr))) + pStr = pNextStr; + + word_chars = utf8StringCountN (t.pStr, pStr); + if ((col_cells += word_chars) <= NUM_CELL_COLS) + { + TimeCount TimeOut; + + if (StrLen -= word_chars) + --StrLen; + TimeOut = GetTimeCounter (); + while (word_chars--) + { + pNextStr = t.pStr; + c = getCharFromString (&pNextStr); + + if (!Sleepy || (GLOBAL (CurrentActivity) & CHECK_ABORT)) + font_DrawText (&t); + else + { + font_DrawText (&t); + + PlaySound (ReadOutSounds, NotPositional (), NULL, + GAME_SOUND_PRIORITY); + + if (c == ',') + TimeOut += ONE_SECOND / 4; + if (c == '.' || c == '!' || c == '?') + TimeOut += ONE_SECOND / 2; + else + TimeOut += ONE_SECOND / 20; + if (word_chars == 0) + TimeOut += ONE_SECOND / 20; + + if (WaitForAnyButtonUntil (TRUE, TimeOut, FALSE)) + { + Sleepy = FALSE; + // We draw the whole thing at once after this + BatchGraphics (); + } + } + t.pStr = pNextStr; + t.baseline.x += r.extent.width + 1; + } + + ++col_cells; + last_c = getCharFromString (&t.pStr); + t.baseline.x += r.extent.width + 1; + } + } while (col_cells <= NUM_CELL_COLS && last_c != '\n' && StrLen); + + t.baseline.y += r.extent.height + 1; + if (++row_cells == NUM_CELL_ROWS || StrLen == 0) + { + t.pStr = pLastStr; + if (!Sleepy) + { + UnbatchGraphics (); + } + + if (!WaitForAnyButton (TRUE, WAIT_INFINITE, FALSE)) + break; + +InitPageCell: + ButtonState = 1; + t.baseline.y = r.extent.height + 1; + row_cells = 0; + if (StrLen) + { + if (!Sleepy) + BatchGraphics (); + ClearReportArea(); + SetContextForeGroundColor ( + BUILD_COLOR (MAKE_RGB15 (0x00, 0x1F, 0x00), 0xFF)); + } + } + } +} + +void +DoDiscoveryReport (SOUND ReadOutSounds) +{ + CONTEXT OldContext; + CONTEXT context; + BOOLEAN ownContext; + STAMP saveStamp; + +#ifdef DEBUG + if (disableInteractivity) + return; +#endif + + context = GetScanContext (&ownContext); + OldContext = SetContext (context); + saveStamp = SaveContextFrame (NULL); + { + FONT OldFont; + FRAME OldFontEffect; + + OldFont = SetContextFont ( + pSolarSysState->SysInfo.PlanetInfo.LanderFont); + if (optWhichFonts == OPT_PC) + OldFontEffect = SetContextFontEffect ( + pSolarSysState->SysInfo.PlanetInfo.LanderFontEff); + else + OldFontEffect = SetContextFontEffect (NULL); + + MakeReport (ReadOutSounds, + (UNICODE *)GetStringAddress (pSolarSysState->SysInfo.PlanetInfo.DiscoveryString), + GetStringLength (pSolarSysState->SysInfo.PlanetInfo.DiscoveryString)); + + SetContextFontEffect (OldFontEffect); + SetContextFont (OldFont); + } + // Restore previous screen + DrawStamp (&saveStamp); + SetContext (OldContext); + // TODO: Make CONTEXT ref-counted + if (ownContext) + DestroyScanContext (); + + DestroyDrawable (ReleaseDrawable (saveStamp.frame)); + + WaitForNoInput (WAIT_INFINITE, TRUE); +} + + |