+++ /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