--- /dev/null
+// WL_TEXT.C\r
+\r
+#include "WL_DEF.H"\r
+#pragma hdrstop\r
+\r
+/*\r
+=============================================================================\r
+\r
+TEXT FORMATTING COMMANDS\r
+------------------------\r
+^C<hex digit> Change text color\r
+^E[enter] End of layout (all pages)\r
+^G<y>,<x>,<pic>[enter] Draw a graphic and push margins\r
+^P[enter] start new page, must be the first chars in a layout\r
+^L<x>,<y>[ENTER] Locate to a specific spot, x in pixels, y in lines\r
+\r
+=============================================================================\r
+*/\r
+\r
+/*\r
+=============================================================================\r
+\r
+ LOCAL CONSTANTS\r
+\r
+=============================================================================\r
+*/\r
+\r
+#define BACKCOLOR 0x11\r
+\r
+\r
+#define WORDLIMIT 80\r
+#define FONTHEIGHT 10\r
+#define TOPMARGIN 16\r
+#define BOTTOMMARGIN 32\r
+#define LEFTMARGIN 16\r
+#define RIGHTMARGIN 16\r
+#define PICMARGIN 8\r
+#define TEXTROWS ((200-TOPMARGIN-BOTTOMMARGIN)/FONTHEIGHT)\r
+#define SPACEWIDTH 7\r
+#define SCREENPIXWIDTH 320\r
+#define SCREENMID (SCREENPIXWIDTH/2)\r
+\r
+/*\r
+=============================================================================\r
+\r
+ LOCAL VARIABLES\r
+\r
+=============================================================================\r
+*/\r
+\r
+int pagenum,numpages;\r
+\r
+unsigned leftmargin[TEXTROWS],rightmargin[TEXTROWS];\r
+char far *text;\r
+unsigned rowon;\r
+\r
+int picx,picy,picnum,picdelay;\r
+boolean layoutdone;\r
+\r
+//===========================================================================\r
+\r
+#ifndef JAPAN\r
+/*\r
+=====================\r
+=\r
+= RipToEOL\r
+=\r
+=====================\r
+*/\r
+\r
+void RipToEOL (void)\r
+{\r
+ while (*text++ != '\n') // scan to end of line\r
+ ;\r
+}\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= ParseNumber\r
+=\r
+=====================\r
+*/\r
+\r
+int ParseNumber (void)\r
+{\r
+ char ch;\r
+ char num[80],*numptr;\r
+\r
+//\r
+// scan until a number is found\r
+//\r
+ ch = *text;\r
+ while (ch < '0' || ch >'9')\r
+ ch = *++text;\r
+\r
+//\r
+// copy the number out\r
+//\r
+ numptr = num;\r
+ do\r
+ {\r
+ *numptr++ = ch;\r
+ ch = *++text;\r
+ } while (ch >= '0' && ch <= '9');\r
+ *numptr = 0;\r
+\r
+ return atoi (num);\r
+}\r
+\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= ParsePicCommand\r
+=\r
+= Call with text pointing just after a ^P\r
+= Upon exit text points to the start of next line\r
+=\r
+=====================\r
+*/\r
+\r
+void ParsePicCommand (void)\r
+{\r
+ picy=ParseNumber();\r
+ picx=ParseNumber();\r
+ picnum=ParseNumber();\r
+ RipToEOL ();\r
+}\r
+\r
+\r
+void ParseTimedCommand (void)\r
+{\r
+ picy=ParseNumber();\r
+ picx=ParseNumber();\r
+ picnum=ParseNumber();\r
+ picdelay=ParseNumber();\r
+ RipToEOL ();\r
+}\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= TimedPicCommand\r
+=\r
+= Call with text pointing just after a ^P\r
+= Upon exit text points to the start of next line\r
+=\r
+=====================\r
+*/\r
+\r
+void TimedPicCommand (void)\r
+{\r
+ ParseTimedCommand ();\r
+\r
+//\r
+// update the screen, and wait for time delay\r
+//\r
+ VW_UpdateScreen ();\r
+\r
+//\r
+// wait for time\r
+//\r
+ TimeCount = 0;\r
+ while (TimeCount < picdelay)\r
+ ;\r
+\r
+//\r
+// draw pic\r
+//\r
+ VWB_DrawPic (picx&~7,picy,picnum);\r
+}\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= HandleCommand\r
+=\r
+=====================\r
+*/\r
+\r
+void HandleCommand (void)\r
+{\r
+ int i,margin,top,bottom;\r
+ int picwidth,picheight,picmid;\r
+\r
+ switch (toupper(*++text))\r
+ {\r
+ case 'B':\r
+ picy=ParseNumber();\r
+ picx=ParseNumber();\r
+ picwidth=ParseNumber();\r
+ picheight=ParseNumber();\r
+ VWB_Bar(picx,picy,picwidth,picheight,BACKCOLOR);\r
+ RipToEOL();\r
+ break;\r
+ case ';': // comment\r
+ RipToEOL();\r
+ break;\r
+ case 'P': // ^P is start of next page, ^E is end of file\r
+ case 'E':\r
+ layoutdone = true;\r
+ text--; // back up to the '^'\r
+ break;\r
+\r
+ case 'C': // ^c<hex digit> changes text color\r
+ i = toupper(*++text);\r
+ if (i>='0' && i<='9')\r
+ fontcolor = i-'0';\r
+ else if (i>='A' && i<='F')\r
+ fontcolor = i-'A'+10;\r
+\r
+ fontcolor *= 16;\r
+ i = toupper(*++text);\r
+ if (i>='0' && i<='9')\r
+ fontcolor += i-'0';\r
+ else if (i>='A' && i<='F')\r
+ fontcolor += i-'A'+10;\r
+ text++;\r
+ break;\r
+\r
+ case '>':\r
+ px = 160;\r
+ text++;\r
+ break;\r
+\r
+ case 'L':\r
+ py=ParseNumber();\r
+ rowon = (py-TOPMARGIN)/FONTHEIGHT;\r
+ py = TOPMARGIN+rowon*FONTHEIGHT;\r
+ px=ParseNumber();\r
+ while (*text++ != '\n') // scan to end of line\r
+ ;\r
+ break;\r
+\r
+ case 'T': // ^Tyyy,xxx,ppp,ttt waits ttt tics, then draws pic\r
+ TimedPicCommand ();\r
+ break;\r
+\r
+ case 'G': // ^Gyyy,xxx,ppp draws graphic\r
+ ParsePicCommand ();\r
+ VWB_DrawPic (picx&~7,picy,picnum);\r
+ picwidth = pictable[picnum-STARTPICS].width;\r
+ picheight = pictable[picnum-STARTPICS].height;\r
+ //\r
+ // adjust margins\r
+ //\r
+ picmid = picx + picwidth/2;\r
+ if (picmid > SCREENMID)\r
+ margin = picx-PICMARGIN; // new right margin\r
+ else\r
+ margin = picx+picwidth+PICMARGIN; // new left margin\r
+\r
+ top = (picy-TOPMARGIN)/FONTHEIGHT;\r
+ if (top<0)\r
+ top = 0;\r
+ bottom = (picy+picheight-TOPMARGIN)/FONTHEIGHT;\r
+ if (bottom>=TEXTROWS)\r
+ bottom = TEXTROWS-1;\r
+\r
+ for (i=top;i<=bottom;i++)\r
+ if (picmid > SCREENMID)\r
+ rightmargin[i] = margin;\r
+ else\r
+ leftmargin[i] = margin;\r
+\r
+ //\r
+ // adjust this line if needed\r
+ //\r
+ if (px < leftmargin[rowon])\r
+ px = leftmargin[rowon];\r
+ break;\r
+ }\r
+}\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= NewLine\r
+=\r
+=====================\r
+*/\r
+\r
+void NewLine (void)\r
+{\r
+ char ch;\r
+\r
+ if (++rowon == TEXTROWS)\r
+ {\r
+ //\r
+ // overflowed the page, so skip until next page break\r
+ //\r
+ layoutdone = true;\r
+ do\r
+ {\r
+ if (*text == '^')\r
+ {\r
+ ch = toupper(*(text+1));\r
+ if (ch == 'E' || ch == 'P')\r
+ {\r
+ layoutdone = true;\r
+ return;\r
+ }\r
+ }\r
+ text++;\r
+\r
+ } while (1);\r
+\r
+ }\r
+ px = leftmargin[rowon];\r
+ py+= FONTHEIGHT;\r
+}\r
+\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= HandleCtrls\r
+=\r
+=====================\r
+*/\r
+\r
+void HandleCtrls (void)\r
+{\r
+ char ch;\r
+\r
+ ch = *text++; // get the character and advance\r
+\r
+ if (ch == '\n')\r
+ {\r
+ NewLine ();\r
+ return;\r
+ }\r
+\r
+}\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= HandleWord\r
+=\r
+=====================\r
+*/\r
+\r
+void HandleWord (void)\r
+{\r
+ char word[WORDLIMIT];\r
+ int i,wordindex;\r
+ unsigned wwidth,wheight,newpos;\r
+\r
+\r
+ //\r
+ // copy the next word into [word]\r
+ //\r
+ word[0] = *text++;\r
+ wordindex = 1;\r
+ while (*text>32)\r
+ {\r
+ word[wordindex] = *text++;\r
+ if (++wordindex == WORDLIMIT)\r
+ Quit ("PageLayout: Word limit exceeded");\r
+ }\r
+ word[wordindex] = 0; // stick a null at end for C\r
+\r
+ //\r
+ // see if it fits on this line\r
+ //\r
+ VW_MeasurePropString (word,&wwidth,&wheight);\r
+\r
+ while (px+wwidth > rightmargin[rowon])\r
+ {\r
+ NewLine ();\r
+ if (layoutdone)\r
+ return; // overflowed page\r
+ }\r
+\r
+ //\r
+ // print it\r
+ //\r
+ newpos = px+wwidth;\r
+ VWB_DrawPropString (word);\r
+ px = newpos;\r
+\r
+ //\r
+ // suck up any extra spaces\r
+ //\r
+ while (*text == ' ')\r
+ {\r
+ px += SPACEWIDTH;\r
+ text++;\r
+ }\r
+}\r
+\r
+/*\r
+=====================\r
+=\r
+= PageLayout\r
+=\r
+= Clears the screen, draws the pics on the page, and word wraps the text.\r
+= Returns a pointer to the terminating command\r
+=\r
+=====================\r
+*/\r
+\r
+void PageLayout (boolean shownumber)\r
+{\r
+ int i,oldfontcolor;\r
+ char ch;\r
+\r
+ oldfontcolor = fontcolor;\r
+\r
+ fontcolor = 0;\r
+\r
+//\r
+// clear the screen\r
+//\r
+ VWB_Bar (0,0,320,200,BACKCOLOR);\r
+ VWB_DrawPic (0,0,H_TOPWINDOWPIC);\r
+ VWB_DrawPic (0,8,H_LEFTWINDOWPIC);\r
+ VWB_DrawPic (312,8,H_RIGHTWINDOWPIC);\r
+ VWB_DrawPic (8,176,H_BOTTOMINFOPIC);\r
+\r
+\r
+ for (i=0;i<TEXTROWS;i++)\r
+ {\r
+ leftmargin[i] = LEFTMARGIN;\r
+ rightmargin[i] = SCREENPIXWIDTH-RIGHTMARGIN;\r
+ }\r
+\r
+ px = LEFTMARGIN;\r
+ py = TOPMARGIN;\r
+ rowon = 0;\r
+ layoutdone = false;\r
+\r
+//\r
+// make sure we are starting layout text (^P first command)\r
+//\r
+ while (*text <= 32)\r
+ text++;\r
+\r
+ if (*text != '^' || toupper(*++text) != 'P')\r
+ Quit ("PageLayout: Text not headed with ^P");\r
+\r
+ while (*text++ != '\n')\r
+ ;\r
+\r
+\r
+//\r
+// process text stream\r
+//\r
+ do\r
+ {\r
+ ch = *text;\r
+\r
+ if (ch == '^')\r
+ HandleCommand ();\r
+ else\r
+ if (ch == 9)\r
+ {\r
+ px = (px+8)&0xf8;\r
+ text++;\r
+ }\r
+ else if (ch <= 32)\r
+ HandleCtrls ();\r
+ else\r
+ HandleWord ();\r
+\r
+ } while (!layoutdone);\r
+\r
+ pagenum++;\r
+\r
+ if (shownumber)\r
+ {\r
+ #ifdef SPANISH\r
+ strcpy (str,"Hoja ");\r
+ itoa (pagenum,str2,10);\r
+ strcat (str,str2);\r
+ strcat (str," de ");\r
+ py = 183;\r
+ px = 208;\r
+ #else\r
+ strcpy (str,"pg ");\r
+ itoa (pagenum,str2,10);\r
+ strcat (str,str2);\r
+ strcat (str," of ");\r
+ py = 183;\r
+ px = 213;\r
+ #endif\r
+ itoa (numpages,str2,10);\r
+ strcat (str,str2);\r
+ fontcolor = 0x4f; //12^BACKCOLOR;\r
+\r
+ VWB_DrawPropString (str);\r
+ }\r
+\r
+ fontcolor = oldfontcolor;\r
+}\r
+\r
+//===========================================================================\r
+\r
+/*\r
+=====================\r
+=\r
+= BackPage\r
+=\r
+= Scans for a previous ^P\r
+=\r
+=====================\r
+*/\r
+\r
+void BackPage (void)\r
+{\r
+ pagenum--;\r
+ do\r
+ {\r
+ text--;\r
+ if (*text == '^' && toupper(*(text+1)) == 'P')\r
+ return;\r
+ } while (1);\r
+}\r
+\r
+\r
+//===========================================================================\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= CacheLayoutGraphics\r
+=\r
+= Scans an entire layout file (until a ^E) marking all graphics used, and\r
+= counting pages, then caches the graphics in\r
+=\r
+=====================\r
+*/\r
+void CacheLayoutGraphics (void)\r
+{\r
+ char far *bombpoint, far *textstart;\r
+ char ch;\r
+\r
+ textstart = text;\r
+ bombpoint = text+30000;\r
+ numpages = pagenum = 0;\r
+\r
+ do\r
+ {\r
+ if (*text == '^')\r
+ {\r
+ ch = toupper(*++text);\r
+ if (ch == 'P') // start of a page\r
+ numpages++;\r
+ if (ch == 'E') // end of file, so load graphics and return\r
+ {\r
+ CA_MarkGrChunk(H_TOPWINDOWPIC);\r
+ CA_MarkGrChunk(H_LEFTWINDOWPIC);\r
+ CA_MarkGrChunk(H_RIGHTWINDOWPIC);\r
+ CA_MarkGrChunk(H_BOTTOMINFOPIC);\r
+ CA_CacheMarks ();\r
+ text = textstart;\r
+ return;\r
+ }\r
+ if (ch == 'G') // draw graphic command, so mark graphics\r
+ {\r
+ ParsePicCommand ();\r
+ CA_MarkGrChunk (picnum);\r
+ }\r
+ if (ch == 'T') // timed draw graphic command, so mark graphics\r
+ {\r
+ ParseTimedCommand ();\r
+ CA_MarkGrChunk (picnum);\r
+ }\r
+ }\r
+ else\r
+ text++;\r
+\r
+ } while (text<bombpoint);\r
+\r
+ Quit ("CacheLayoutGraphics: No ^E to terminate file!");\r
+}\r
+#endif\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= ShowArticle\r
+=\r
+=====================\r
+*/\r
+\r
+#ifdef JAPAN\r
+void ShowArticle (int which)\r
+#else\r
+void ShowArticle (char far *article)\r
+#endif\r
+{\r
+ #ifdef JAPAN\r
+ int snames[10] = { H_HELP1PIC,\r
+ H_HELP2PIC,\r
+ H_HELP3PIC,\r
+ H_HELP4PIC,\r
+ H_HELP5PIC,\r
+ H_HELP6PIC,\r
+ H_HELP7PIC,\r
+ H_HELP8PIC,\r
+ H_HELP9PIC,\r
+ H_HELP10PIC};\r
+ int enames[14] = {\r
+ 0,0,\r
+ #ifndef JAPDEMO\r
+ C_ENDGAME1APIC,\r
+ C_ENDGAME1BPIC,\r
+ C_ENDGAME2APIC,\r
+ C_ENDGAME2BPIC,\r
+ C_ENDGAME3APIC,\r
+ C_ENDGAME3BPIC,\r
+ C_ENDGAME4APIC,\r
+ C_ENDGAME4BPIC,\r
+ C_ENDGAME5APIC,\r
+ C_ENDGAME5BPIC,\r
+ C_ENDGAME6APIC,\r
+ C_ENDGAME6BPIC\r
+ #endif\r
+ };\r
+ #endif\r
+ unsigned oldfontnumber;\r
+ unsigned temp;\r
+ boolean newpage,firstpage;\r
+\r
+ #ifdef JAPAN\r
+ pagenum = 1;\r
+ if (!which)\r
+ numpages = 10;\r
+ else\r
+ numpages = 2;\r
+\r
+ #else\r
+\r
+ text = article;\r
+ oldfontnumber = fontnumber;\r
+ fontnumber = 0;\r
+ CA_MarkGrChunk(STARTFONT);\r
+ VWB_Bar (0,0,320,200,BACKCOLOR);\r
+ CacheLayoutGraphics ();\r
+ #endif\r
+\r
+ newpage = true;\r
+ firstpage = true;\r
+\r
+ do\r
+ {\r
+ if (newpage)\r
+ {\r
+ newpage = false;\r
+ #ifdef JAPAN\r
+ if (!which)\r
+ CA_CacheScreen(snames[pagenum - 1]);\r
+ else\r
+ CA_CacheScreen(enames[which*2 + pagenum - 1]);\r
+ #else\r
+ PageLayout (true);\r
+ #endif\r
+ VW_UpdateScreen ();\r
+ if (firstpage)\r
+ {\r
+ VL_FadeIn(0,255,&gamepal,10);\r
+ // VW_FadeIn ()\r
+ firstpage = false;\r
+ }\r
+ }\r
+\r
+ LastScan = 0;\r
+ while (!LastScan)\r
+ ;\r
+\r
+ switch (LastScan)\r
+ {\r
+ case sc_UpArrow:\r
+ case sc_PgUp:\r
+ case sc_LeftArrow:\r
+ if (pagenum>1)\r
+ {\r
+ #ifndef JAPAN\r
+ BackPage ();\r
+ BackPage ();\r
+ #else\r
+ pagenum--;\r
+ #endif\r
+ newpage = true;\r
+ }\r
+ break;\r
+\r
+ case sc_Enter:\r
+ case sc_DownArrow:\r
+ case sc_PgDn:\r
+ case sc_RightArrow: // the text allready points at next page\r
+ if (pagenum<numpages)\r
+ {\r
+ newpage = true;\r
+ #ifdef JAPAN\r
+ pagenum++;\r
+ #endif\r
+ }\r
+ break;\r
+ }\r
+\r
+ #ifndef SPEAR\r
+ if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
+ PicturePause();\r
+ #endif\r
+\r
+ } while (LastScan != sc_Escape);\r
+\r
+ IN_ClearKeysDown ();\r
+ fontnumber = oldfontnumber;\r
+}\r
+\r
+\r
+//===========================================================================\r
+\r
+#ifndef JAPAN\r
+#ifdef ARTSEXTERN\r
+int endextern = T_ENDART1;\r
+#ifndef SPEAR\r
+int helpextern = T_HELPART;\r
+#endif\r
+#endif\r
+char helpfilename[13] = "HELPART.",\r
+ endfilename[13] = "ENDART1.";\r
+#endif\r
+\r
+/*\r
+=================\r
+=\r
+= HelpScreens\r
+=\r
+=================\r
+*/\r
+#ifndef SPEAR\r
+void HelpScreens (void)\r
+{\r
+ int artnum;\r
+ char far *text;\r
+ memptr layout;\r
+\r
+\r
+ CA_UpLevel ();\r
+ MM_SortMem ();\r
+#ifdef JAPAN\r
+ ShowArticle (0);\r
+ VW_FadeOut();\r
+ FreeMusic ();\r
+ CA_DownLevel ();\r
+ MM_SortMem ();\r
+#else\r
+\r
+\r
+\r
+\r
+#ifdef ARTSEXTERN\r
+ artnum = helpextern;\r
+ CA_CacheGrChunk (artnum);\r
+ text = (char _seg *)grsegs[artnum];\r
+ MM_SetLock (&grsegs[artnum], true);\r
+#else\r
+ CA_LoadFile (helpfilename,&layout);\r
+ text = (char _seg *)layout;\r
+ MM_SetLock (&layout, true);\r
+#endif\r
+\r
+ ShowArticle (text);\r
+\r
+#ifdef ARTSEXTERN\r
+ MM_FreePtr (&grsegs[artnum]);\r
+#else\r
+ MM_FreePtr (&layout);\r
+#endif\r
+\r
+\r
+\r
+ VW_FadeOut();\r
+\r
+ FreeMusic ();\r
+ CA_DownLevel ();\r
+ MM_SortMem ();\r
+#endif\r
+}\r
+#endif\r
+\r
+//\r
+// END ARTICLES\r
+//\r
+void EndText (void)\r
+{\r
+ int artnum;\r
+ char far *text;\r
+ memptr layout;\r
+\r
+\r
+ ClearMemory ();\r
+\r
+ CA_UpLevel ();\r
+ MM_SortMem ();\r
+#ifdef JAPAN\r
+ ShowArticle(gamestate.episode + 1);\r
+\r
+ VW_FadeOut();\r
+\r
+ SETFONTCOLOR(0,15);\r
+ IN_ClearKeysDown();\r
+ if (MousePresent)\r
+ Mouse(MDelta); // Clear accumulated mouse movement\r
+\r
+ FreeMusic ();\r
+ CA_DownLevel ();\r
+ MM_SortMem ();\r
+#else\r
+\r
+\r
+\r
+#ifdef ARTSEXTERN\r
+ artnum = endextern+gamestate.episode;\r
+ CA_CacheGrChunk (artnum);\r
+ text = (char _seg *)grsegs[artnum];\r
+ MM_SetLock (&grsegs[artnum], true);\r
+#else\r
+ endfilename[6] = '1'+gamestate.episode;\r
+ CA_LoadFile (endfilename,&layout);\r
+ text = (char _seg *)layout;\r
+ MM_SetLock (&layout, true);\r
+#endif\r
+\r
+ ShowArticle (text);\r
+\r
+#ifdef ARTSEXTERN\r
+ MM_FreePtr (&grsegs[artnum]);\r
+#else\r
+ MM_FreePtr (&layout);\r
+#endif\r
+\r
+\r
+ VW_FadeOut();\r
+ SETFONTCOLOR(0,15);\r
+ IN_ClearKeysDown();\r
+ if (MousePresent)\r
+ Mouse(MDelta); // Clear accumulated mouse movement\r
+\r
+ FreeMusic ();\r
+ CA_DownLevel ();\r
+ MM_SortMem ();\r
+#endif\r
+}\r