]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/hb/wl_text.c
[16_ca needs huge amounts of work and I should remember what needs to be done soon...
[16.git] / src / lib / hb / wl_text.c
diff --git a/src/lib/hb/wl_text.c b/src/lib/hb/wl_text.c
new file mode 100755 (executable)
index 0000000..1df86b8
--- /dev/null
@@ -0,0 +1,859 @@
+// 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