OSDN Git Service

going to start wolf3d core core (loop with input only) work soon. I was mostly brains...
[proj16/16.git] / src / core / wl_text.c
1 // WL_TEXT.C\r
2 \r
3 #include "WL_DEF.H"\r
4 #pragma hdrstop\r
5 \r
6 /*\r
7 =============================================================================\r
8 \r
9 TEXT FORMATTING COMMANDS\r
10 ------------------------\r
11 ^C<hex digit>                   Change text color\r
12 ^E[enter]                               End of layout (all pages)\r
13 ^G<y>,<x>,<pic>[enter]  Draw a graphic and push margins\r
14 ^P[enter]                               start new page, must be the first chars in a layout\r
15 ^L<x>,<y>[ENTER]                Locate to a specific spot, x in pixels, y in lines\r
16 \r
17 =============================================================================\r
18 */\r
19 \r
20 /*\r
21 =============================================================================\r
22 \r
23                                                  LOCAL CONSTANTS\r
24 \r
25 =============================================================================\r
26 */\r
27 \r
28 #define BACKCOLOR               0x11\r
29 \r
30 \r
31 #define WORDLIMIT               80\r
32 #define FONTHEIGHT              10\r
33 #define TOPMARGIN               16\r
34 #define BOTTOMMARGIN    32\r
35 #define LEFTMARGIN              16\r
36 #define RIGHTMARGIN             16\r
37 #define PICMARGIN               8\r
38 #define TEXTROWS                ((200-TOPMARGIN-BOTTOMMARGIN)/FONTHEIGHT)\r
39 #define SPACEWIDTH              7\r
40 #define SCREENPIXWIDTH  320\r
41 #define SCREENMID               (SCREENPIXWIDTH/2)\r
42 \r
43 /*\r
44 =============================================================================\r
45 \r
46                                                  LOCAL VARIABLES\r
47 \r
48 =============================================================================\r
49 */\r
50 \r
51 int                     pagenum,numpages;\r
52 \r
53 unsigned        leftmargin[TEXTROWS],rightmargin[TEXTROWS];\r
54 char            far *text;\r
55 unsigned        rowon;\r
56 \r
57 int                     picx,picy,picnum,picdelay;\r
58 boolean         layoutdone;\r
59 \r
60 //===========================================================================\r
61 \r
62 #ifndef JAPAN\r
63 /*\r
64 =====================\r
65 =\r
66 = RipToEOL\r
67 =\r
68 =====================\r
69 */\r
70 \r
71 void RipToEOL (void)\r
72 {\r
73         while (*text++ != '\n')         // scan to end of line\r
74         ;\r
75 }\r
76 \r
77 \r
78 /*\r
79 =====================\r
80 =\r
81 = ParseNumber\r
82 =\r
83 =====================\r
84 */\r
85 \r
86 int     ParseNumber (void)\r
87 {\r
88         char    ch;\r
89         char    num[80],*numptr;\r
90 \r
91 //\r
92 // scan until a number is found\r
93 //\r
94         ch = *text;\r
95         while (ch < '0' || ch >'9')\r
96                 ch = *++text;\r
97 \r
98 //\r
99 // copy the number out\r
100 //\r
101         numptr = num;\r
102         do\r
103         {\r
104                 *numptr++ = ch;\r
105                 ch = *++text;\r
106         } while (ch >= '0' && ch <= '9');\r
107         *numptr = 0;\r
108 \r
109         return atoi (num);\r
110 }\r
111 \r
112 \r
113 \r
114 /*\r
115 =====================\r
116 =\r
117 = ParsePicCommand\r
118 =\r
119 = Call with text pointing just after a ^P\r
120 = Upon exit text points to the start of next line\r
121 =\r
122 =====================\r
123 */\r
124 \r
125 void    ParsePicCommand (void)\r
126 {\r
127         picy=ParseNumber();\r
128         picx=ParseNumber();\r
129         picnum=ParseNumber();\r
130         RipToEOL ();\r
131 }\r
132 \r
133 \r
134 void    ParseTimedCommand (void)\r
135 {\r
136         picy=ParseNumber();\r
137         picx=ParseNumber();\r
138         picnum=ParseNumber();\r
139         picdelay=ParseNumber();\r
140         RipToEOL ();\r
141 }\r
142 \r
143 \r
144 /*\r
145 =====================\r
146 =\r
147 = TimedPicCommand\r
148 =\r
149 = Call with text pointing just after a ^P\r
150 = Upon exit text points to the start of next line\r
151 =\r
152 =====================\r
153 */\r
154 \r
155 void    TimedPicCommand (void)\r
156 {\r
157         ParseTimedCommand ();\r
158 \r
159 //\r
160 // update the screen, and wait for time delay\r
161 //\r
162         VW_UpdateScreen ();\r
163 \r
164 //\r
165 // wait for time\r
166 //\r
167         TimeCount = 0;\r
168         while (TimeCount < picdelay)\r
169         ;\r
170 \r
171 //\r
172 // draw pic\r
173 //\r
174         VWB_DrawPic (picx&~7,picy,picnum);\r
175 }\r
176 \r
177 \r
178 /*\r
179 =====================\r
180 =\r
181 = HandleCommand\r
182 =\r
183 =====================\r
184 */\r
185 \r
186 void HandleCommand (void)\r
187 {\r
188         int     i,margin,top,bottom;\r
189         int     picwidth,picheight,picmid;\r
190 \r
191         switch (toupper(*++text))\r
192         {\r
193         case 'B':\r
194                 picy=ParseNumber();\r
195                 picx=ParseNumber();\r
196                 picwidth=ParseNumber();\r
197                 picheight=ParseNumber();\r
198                 VWB_Bar(picx,picy,picwidth,picheight,BACKCOLOR);\r
199                 RipToEOL();\r
200                 break;\r
201         case ';':               // comment\r
202                 RipToEOL();\r
203                 break;\r
204         case 'P':               // ^P is start of next page, ^E is end of file\r
205         case 'E':\r
206                 layoutdone = true;\r
207                 text--;         // back up to the '^'\r
208                 break;\r
209 \r
210         case 'C':               // ^c<hex digit> changes text color\r
211                 i = toupper(*++text);\r
212                 if (i>='0' && i<='9')\r
213                         fontcolor = i-'0';\r
214                 else if (i>='A' && i<='F')\r
215                         fontcolor = i-'A'+10;\r
216 \r
217                 fontcolor *= 16;\r
218                 i = toupper(*++text);\r
219                 if (i>='0' && i<='9')\r
220                         fontcolor += i-'0';\r
221                 else if (i>='A' && i<='F')\r
222                         fontcolor += i-'A'+10;\r
223                 text++;\r
224                 break;\r
225 \r
226         case '>':\r
227                 px = 160;\r
228                 text++;\r
229                 break;\r
230 \r
231         case 'L':\r
232                 py=ParseNumber();\r
233                 rowon = (py-TOPMARGIN)/FONTHEIGHT;\r
234                 py = TOPMARGIN+rowon*FONTHEIGHT;\r
235                 px=ParseNumber();\r
236                 while (*text++ != '\n')         // scan to end of line\r
237                 ;\r
238                 break;\r
239 \r
240         case 'T':               // ^Tyyy,xxx,ppp,ttt waits ttt tics, then draws pic\r
241                 TimedPicCommand ();\r
242                 break;\r
243 \r
244         case 'G':               // ^Gyyy,xxx,ppp draws graphic\r
245                 ParsePicCommand ();\r
246                 VWB_DrawPic (picx&~7,picy,picnum);\r
247                 picwidth = pictable[picnum-STARTPICS].width;\r
248                 picheight = pictable[picnum-STARTPICS].height;\r
249                 //\r
250                 // adjust margins\r
251                 //\r
252                 picmid = picx + picwidth/2;\r
253                 if (picmid > SCREENMID)\r
254                         margin = picx-PICMARGIN;                        // new right margin\r
255                 else\r
256                         margin = picx+picwidth+PICMARGIN;       // new left margin\r
257 \r
258                 top = (picy-TOPMARGIN)/FONTHEIGHT;\r
259                 if (top<0)\r
260                         top = 0;\r
261                 bottom = (picy+picheight-TOPMARGIN)/FONTHEIGHT;\r
262                 if (bottom>=TEXTROWS)\r
263                         bottom = TEXTROWS-1;\r
264 \r
265                 for (i=top;i<=bottom;i++)\r
266                         if (picmid > SCREENMID)\r
267                                 rightmargin[i] = margin;\r
268                         else\r
269                                 leftmargin[i] = margin;\r
270 \r
271                 //\r
272                 // adjust this line if needed\r
273                 //\r
274                 if (px < leftmargin[rowon])\r
275                         px = leftmargin[rowon];\r
276                 break;\r
277         }\r
278 }\r
279 \r
280 \r
281 /*\r
282 =====================\r
283 =\r
284 = NewLine\r
285 =\r
286 =====================\r
287 */\r
288 \r
289 void NewLine (void)\r
290 {\r
291         char    ch;\r
292 \r
293         if (++rowon == TEXTROWS)\r
294         {\r
295         //\r
296         // overflowed the page, so skip until next page break\r
297         //\r
298                 layoutdone = true;\r
299                 do\r
300                 {\r
301                         if (*text == '^')\r
302                         {\r
303                                 ch = toupper(*(text+1));\r
304                                 if (ch == 'E' || ch == 'P')\r
305                                 {\r
306                                         layoutdone = true;\r
307                                         return;\r
308                                 }\r
309                         }\r
310                         text++;\r
311 \r
312                 } while (1);\r
313 \r
314         }\r
315         px = leftmargin[rowon];\r
316         py+= FONTHEIGHT;\r
317 }\r
318 \r
319 \r
320 \r
321 /*\r
322 =====================\r
323 =\r
324 = HandleCtrls\r
325 =\r
326 =====================\r
327 */\r
328 \r
329 void HandleCtrls (void)\r
330 {\r
331         char    ch;\r
332 \r
333         ch = *text++;                   // get the character and advance\r
334 \r
335         if (ch == '\n')\r
336         {\r
337                 NewLine ();\r
338                 return;\r
339         }\r
340 \r
341 }\r
342 \r
343 \r
344 /*\r
345 =====================\r
346 =\r
347 = HandleWord\r
348 =\r
349 =====================\r
350 */\r
351 \r
352 void HandleWord (void)\r
353 {\r
354         char            word[WORDLIMIT];\r
355         int                     i,wordindex;\r
356         unsigned        wwidth,wheight,newpos;\r
357 \r
358 \r
359         //\r
360         // copy the next word into [word]\r
361         //\r
362         word[0] = *text++;\r
363         wordindex = 1;\r
364         while (*text>32)\r
365         {\r
366                 word[wordindex] = *text++;\r
367                 if (++wordindex == WORDLIMIT)\r
368                         Quit ("PageLayout: Word limit exceeded");\r
369         }\r
370         word[wordindex] = 0;            // stick a null at end for C\r
371 \r
372         //\r
373         // see if it fits on this line\r
374         //\r
375         VW_MeasurePropString (word,&wwidth,&wheight);\r
376 \r
377         while (px+wwidth > rightmargin[rowon])\r
378         {\r
379                 NewLine ();\r
380                 if (layoutdone)\r
381                         return;         // overflowed page\r
382         }\r
383 \r
384         //\r
385         // print it\r
386         //\r
387         newpos = px+wwidth;\r
388         VWB_DrawPropString (word);\r
389         px = newpos;\r
390 \r
391         //\r
392         // suck up any extra spaces\r
393         //\r
394         while (*text == ' ')\r
395         {\r
396                 px += SPACEWIDTH;\r
397                 text++;\r
398         }\r
399 }\r
400 \r
401 /*\r
402 =====================\r
403 =\r
404 = PageLayout\r
405 =\r
406 = Clears the screen, draws the pics on the page, and word wraps the text.\r
407 = Returns a pointer to the terminating command\r
408 =\r
409 =====================\r
410 */\r
411 \r
412 void PageLayout (boolean shownumber)\r
413 {\r
414         int             i,oldfontcolor;\r
415         char    ch;\r
416 \r
417         oldfontcolor = fontcolor;\r
418 \r
419         fontcolor = 0;\r
420 \r
421 //\r
422 // clear the screen\r
423 //\r
424         VWB_Bar (0,0,320,200,BACKCOLOR);\r
425         VWB_DrawPic (0,0,H_TOPWINDOWPIC);\r
426         VWB_DrawPic (0,8,H_LEFTWINDOWPIC);\r
427         VWB_DrawPic (312,8,H_RIGHTWINDOWPIC);\r
428         VWB_DrawPic (8,176,H_BOTTOMINFOPIC);\r
429 \r
430 \r
431         for (i=0;i<TEXTROWS;i++)\r
432         {\r
433                 leftmargin[i] = LEFTMARGIN;\r
434                 rightmargin[i] = SCREENPIXWIDTH-RIGHTMARGIN;\r
435         }\r
436 \r
437         px = LEFTMARGIN;\r
438         py = TOPMARGIN;\r
439         rowon = 0;\r
440         layoutdone = false;\r
441 \r
442 //\r
443 // make sure we are starting layout text (^P first command)\r
444 //\r
445         while (*text <= 32)\r
446                 text++;\r
447 \r
448         if (*text != '^' || toupper(*++text) != 'P')\r
449                 Quit ("PageLayout: Text not headed with ^P");\r
450 \r
451         while (*text++ != '\n')\r
452         ;\r
453 \r
454 \r
455 //\r
456 // process text stream\r
457 //\r
458         do\r
459         {\r
460                 ch = *text;\r
461 \r
462                 if (ch == '^')\r
463                         HandleCommand ();\r
464                 else\r
465                 if (ch == 9)\r
466                 {\r
467                  px = (px+8)&0xf8;\r
468                  text++;\r
469                 }\r
470                 else if (ch <= 32)\r
471                         HandleCtrls ();\r
472                 else\r
473                         HandleWord ();\r
474 \r
475         } while (!layoutdone);\r
476 \r
477         pagenum++;\r
478 \r
479         if (shownumber)\r
480         {\r
481                 #ifdef SPANISH\r
482                 strcpy (str,"Hoja ");\r
483                 itoa (pagenum,str2,10);\r
484                 strcat (str,str2);\r
485                 strcat (str," de ");\r
486                 py = 183;\r
487                 px = 208;\r
488                 #else\r
489                 strcpy (str,"pg ");\r
490                 itoa (pagenum,str2,10);\r
491                 strcat (str,str2);\r
492                 strcat (str," of ");\r
493                 py = 183;\r
494                 px = 213;\r
495                 #endif\r
496                 itoa (numpages,str2,10);\r
497                 strcat (str,str2);\r
498                 fontcolor = 0x4f;                          //12^BACKCOLOR;\r
499 \r
500                 VWB_DrawPropString (str);\r
501         }\r
502 \r
503         fontcolor = oldfontcolor;\r
504 }\r
505 \r
506 //===========================================================================\r
507 \r
508 /*\r
509 =====================\r
510 =\r
511 = BackPage\r
512 =\r
513 = Scans for a previous ^P\r
514 =\r
515 =====================\r
516 */\r
517 \r
518 void BackPage (void)\r
519 {\r
520         pagenum--;\r
521         do\r
522         {\r
523                 text--;\r
524                 if (*text == '^' && toupper(*(text+1)) == 'P')\r
525                         return;\r
526         } while (1);\r
527 }\r
528 \r
529 \r
530 //===========================================================================\r
531 \r
532 \r
533 /*\r
534 =====================\r
535 =\r
536 = CacheLayoutGraphics\r
537 =\r
538 = Scans an entire layout file (until a ^E) marking all graphics used, and\r
539 = counting pages, then caches the graphics in\r
540 =\r
541 =====================\r
542 */\r
543 void CacheLayoutGraphics (void)\r
544 {\r
545         char    far *bombpoint, far *textstart;\r
546         char    ch;\r
547 \r
548         textstart = text;\r
549         bombpoint = text+30000;\r
550         numpages = pagenum = 0;\r
551 \r
552         do\r
553         {\r
554                 if (*text == '^')\r
555                 {\r
556                         ch = toupper(*++text);\r
557                         if (ch == 'P')          // start of a page\r
558                                 numpages++;\r
559                         if (ch == 'E')          // end of file, so load graphics and return\r
560                         {\r
561                                 CA_MarkGrChunk(H_TOPWINDOWPIC);\r
562                                 CA_MarkGrChunk(H_LEFTWINDOWPIC);\r
563                                 CA_MarkGrChunk(H_RIGHTWINDOWPIC);\r
564                                 CA_MarkGrChunk(H_BOTTOMINFOPIC);\r
565                                 CA_CacheMarks ();\r
566                                 text = textstart;\r
567                                 return;\r
568                         }\r
569                         if (ch == 'G')          // draw graphic command, so mark graphics\r
570                         {\r
571                                 ParsePicCommand ();\r
572                                 CA_MarkGrChunk (picnum);\r
573                         }\r
574                         if (ch == 'T')          // timed draw graphic command, so mark graphics\r
575                         {\r
576                                 ParseTimedCommand ();\r
577                                 CA_MarkGrChunk (picnum);\r
578                         }\r
579                 }\r
580                 else\r
581                         text++;\r
582 \r
583         } while (text<bombpoint);\r
584 \r
585         Quit ("CacheLayoutGraphics: No ^E to terminate file!");\r
586 }\r
587 #endif\r
588 \r
589 \r
590 /*\r
591 =====================\r
592 =\r
593 = ShowArticle\r
594 =\r
595 =====================\r
596 */\r
597 \r
598 #ifdef JAPAN\r
599 void ShowArticle (int which)\r
600 #else\r
601 void ShowArticle (char far *article)\r
602 #endif\r
603 {\r
604         #ifdef JAPAN\r
605         int             snames[10] = {  H_HELP1PIC,\r
606                                                         H_HELP2PIC,\r
607                                                         H_HELP3PIC,\r
608                                                         H_HELP4PIC,\r
609                                                         H_HELP5PIC,\r
610                                                         H_HELP6PIC,\r
611                                                         H_HELP7PIC,\r
612                                                         H_HELP8PIC,\r
613                                                         H_HELP9PIC,\r
614                                                         H_HELP10PIC};\r
615         int             enames[14] = {\r
616                                                         0,0,\r
617                                                         #ifndef JAPDEMO\r
618                                                         C_ENDGAME1APIC,\r
619                                                         C_ENDGAME1BPIC,\r
620                                                         C_ENDGAME2APIC,\r
621                                                         C_ENDGAME2BPIC,\r
622                                                         C_ENDGAME3APIC,\r
623                                                         C_ENDGAME3BPIC,\r
624                                                         C_ENDGAME4APIC,\r
625                                                         C_ENDGAME4BPIC,\r
626                                                         C_ENDGAME5APIC,\r
627                                                         C_ENDGAME5BPIC,\r
628                                                         C_ENDGAME6APIC,\r
629                                                         C_ENDGAME6BPIC\r
630                                                         #endif\r
631                                                         };\r
632         #endif\r
633         unsigned        oldfontnumber;\r
634         unsigned        temp;\r
635         boolean         newpage,firstpage;\r
636 \r
637         #ifdef JAPAN\r
638         pagenum = 1;\r
639         if (!which)\r
640                 numpages = 10;\r
641         else\r
642                 numpages = 2;\r
643 \r
644         #else\r
645 \r
646         text = article;\r
647         oldfontnumber = fontnumber;\r
648         fontnumber = 0;\r
649         CA_MarkGrChunk(STARTFONT);\r
650         VWB_Bar (0,0,320,200,BACKCOLOR);\r
651         CacheLayoutGraphics ();\r
652         #endif\r
653 \r
654         newpage = true;\r
655         firstpage = true;\r
656 \r
657         do\r
658         {\r
659                 if (newpage)\r
660                 {\r
661                         newpage = false;\r
662                         #ifdef JAPAN\r
663                         if (!which)\r
664                                 CA_CacheScreen(snames[pagenum - 1]);\r
665                         else\r
666                                 CA_CacheScreen(enames[which*2 + pagenum - 1]);\r
667                         #else\r
668                         PageLayout (true);\r
669                         #endif\r
670                         VW_UpdateScreen ();\r
671                         if (firstpage)\r
672                         {\r
673                                 VL_FadeIn(0,255,&gamepal,10);\r
674                                 // VW_FadeIn ()\r
675                                 firstpage = false;\r
676                         }\r
677                 }\r
678 \r
679                 LastScan = 0;\r
680                 while (!LastScan)\r
681                 ;\r
682 \r
683                 switch (LastScan)\r
684                 {\r
685                 case sc_UpArrow:\r
686                 case sc_PgUp:\r
687                 case sc_LeftArrow:\r
688                         if (pagenum>1)\r
689                         {\r
690                                 #ifndef JAPAN\r
691                                 BackPage ();\r
692                                 BackPage ();\r
693                                 #else\r
694                                 pagenum--;\r
695                                 #endif\r
696                                 newpage = true;\r
697                         }\r
698                         break;\r
699 \r
700                 case sc_Enter:\r
701                 case sc_DownArrow:\r
702                 case sc_PgDn:\r
703                 case sc_RightArrow:             // the text allready points at next page\r
704                         if (pagenum<numpages)\r
705                         {\r
706                                 newpage = true;\r
707                                 #ifdef JAPAN\r
708                                 pagenum++;\r
709                                 #endif\r
710                         }\r
711                         break;\r
712                 }\r
713 \r
714                 #ifndef SPEAR\r
715                 if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
716                         PicturePause();\r
717                 #endif\r
718 \r
719         } while (LastScan != sc_Escape);\r
720 \r
721         IN_ClearKeysDown ();\r
722         fontnumber = oldfontnumber;\r
723 }\r
724 \r
725 \r
726 //===========================================================================\r
727 \r
728 #ifndef JAPAN\r
729 #ifdef ARTSEXTERN\r
730 int     endextern = T_ENDART1;\r
731 #ifndef SPEAR\r
732 int             helpextern = T_HELPART;\r
733 #endif\r
734 #endif\r
735 char helpfilename[13] = "HELPART.",\r
736          endfilename[13] = "ENDART1.";\r
737 #endif\r
738 \r
739 /*\r
740 =================\r
741 =\r
742 = HelpScreens\r
743 =\r
744 =================\r
745 */\r
746 #ifndef SPEAR\r
747 void HelpScreens (void)\r
748 {\r
749         int                     artnum;\r
750         char far        *text;\r
751         memptr          layout;\r
752 \r
753 \r
754         CA_UpLevel ();\r
755         MM_SortMem ();\r
756 #ifdef JAPAN\r
757         ShowArticle (0);\r
758         VW_FadeOut();\r
759         FreeMusic ();\r
760         CA_DownLevel ();\r
761         MM_SortMem ();\r
762 #else\r
763 \r
764 \r
765 \r
766 \r
767 #ifdef ARTSEXTERN\r
768         artnum = helpextern;\r
769         CA_CacheGrChunk (artnum);\r
770         text = (char _seg *)grsegs[artnum];\r
771         MM_SetLock (&grsegs[artnum], true);\r
772 #else\r
773         CA_LoadFile (helpfilename,&layout);\r
774         text = (char _seg *)layout;\r
775         MM_SetLock (&layout, true);\r
776 #endif\r
777 \r
778         ShowArticle (text);\r
779 \r
780 #ifdef ARTSEXTERN\r
781         MM_FreePtr (&grsegs[artnum]);\r
782 #else\r
783         MM_FreePtr (&layout);\r
784 #endif\r
785 \r
786 \r
787 \r
788         VW_FadeOut();\r
789 \r
790         FreeMusic ();\r
791         CA_DownLevel ();\r
792         MM_SortMem ();\r
793 #endif\r
794 }\r
795 #endif\r
796 \r
797 //\r
798 // END ARTICLES\r
799 //\r
800 void EndText (void)\r
801 {\r
802         int                     artnum;\r
803         char far        *text;\r
804         memptr          layout;\r
805 \r
806 \r
807         ClearMemory ();\r
808 \r
809         CA_UpLevel ();\r
810         MM_SortMem ();\r
811 #ifdef JAPAN\r
812         ShowArticle(gamestate.episode + 1);\r
813 \r
814         VW_FadeOut();\r
815 \r
816         SETFONTCOLOR(0,15);\r
817         IN_ClearKeysDown();\r
818         if (MousePresent)\r
819                 Mouse(MDelta);  // Clear accumulated mouse movement\r
820 \r
821         FreeMusic ();\r
822         CA_DownLevel ();\r
823         MM_SortMem ();\r
824 #else\r
825 \r
826 \r
827 \r
828 #ifdef ARTSEXTERN\r
829         artnum = endextern+gamestate.episode;\r
830         CA_CacheGrChunk (artnum);\r
831         text = (char _seg *)grsegs[artnum];\r
832         MM_SetLock (&grsegs[artnum], true);\r
833 #else\r
834         endfilename[6] = '1'+gamestate.episode;\r
835         CA_LoadFile (endfilename,&layout);\r
836         text = (char _seg *)layout;\r
837         MM_SetLock (&layout, true);\r
838 #endif\r
839 \r
840         ShowArticle (text);\r
841 \r
842 #ifdef ARTSEXTERN\r
843         MM_FreePtr (&grsegs[artnum]);\r
844 #else\r
845         MM_FreePtr (&layout);\r
846 #endif\r
847 \r
848 \r
849         VW_FadeOut();\r
850         SETFONTCOLOR(0,15);\r
851         IN_ClearKeysDown();\r
852         if (MousePresent)\r
853                 Mouse(MDelta);  // Clear accumulated mouse movement\r
854 \r
855         FreeMusic ();\r
856         CA_DownLevel ();\r
857         MM_SortMem ();\r
858 #endif\r
859 }\r