summaryrefslogtreecommitdiff
path: root/src/uqm/planets/report.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uqm/planets/report.c')
-rw-r--r--src/uqm/planets/report.c271
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);
+}
+
+