summaryrefslogtreecommitdiffstats
path: root/games/hack/hack.topl.c
diff options
context:
space:
mode:
Diffstat (limited to 'games/hack/hack.topl.c')
-rw-r--r--games/hack/hack.topl.c192
1 files changed, 192 insertions, 0 deletions
diff --git a/games/hack/hack.topl.c b/games/hack/hack.topl.c
new file mode 100644
index 0000000..13a033d
--- /dev/null
+++ b/games/hack/hack.topl.c
@@ -0,0 +1,192 @@
+/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
+/* hack.topl.c - version 1.0.2 */
+
+#include "hack.h"
+#include <stdio.h>
+extern char *eos();
+extern int CO;
+
+char toplines[BUFSZ];
+xchar tlx, tly; /* set by pline; used by addtopl */
+
+struct topl {
+ struct topl *next_topl;
+ char *topl_text;
+} *old_toplines, *last_redone_topl;
+#define OTLMAX 20 /* max nr of old toplines remembered */
+
+doredotopl(){
+ if(last_redone_topl)
+ last_redone_topl = last_redone_topl->next_topl;
+ if(!last_redone_topl)
+ last_redone_topl = old_toplines;
+ if(last_redone_topl){
+ (void) strcpy(toplines, last_redone_topl->topl_text);
+ }
+ redotoplin();
+ return(0);
+}
+
+redotoplin() {
+ home();
+ if(index(toplines, '\n')) cl_end();
+ putstr(toplines);
+ cl_end();
+ tlx = curx;
+ tly = cury;
+ flags.toplin = 1;
+ if(tly > 1)
+ more();
+}
+
+remember_topl() {
+register struct topl *tl;
+register int cnt = OTLMAX;
+ if(last_redone_topl &&
+ !strcmp(toplines, last_redone_topl->topl_text)) return;
+ if(old_toplines &&
+ !strcmp(toplines, old_toplines->topl_text)) return;
+ last_redone_topl = 0;
+ tl = (struct topl *)
+ alloc((unsigned)(strlen(toplines) + sizeof(struct topl) + 1));
+ tl->next_topl = old_toplines;
+ tl->topl_text = (char *)(tl + 1);
+ (void) strcpy(tl->topl_text, toplines);
+ old_toplines = tl;
+ while(cnt && tl){
+ cnt--;
+ tl = tl->next_topl;
+ }
+ if(tl && tl->next_topl){
+ free((char *) tl->next_topl);
+ tl->next_topl = 0;
+ }
+}
+
+addtopl(s) char *s; {
+ curs(tlx,tly);
+ if(tlx + strlen(s) > CO) putsym('\n');
+ putstr(s);
+ tlx = curx;
+ tly = cury;
+ flags.toplin = 1;
+}
+
+xmore(s)
+char *s; /* allowed chars besides space/return */
+{
+ if(flags.toplin) {
+ curs(tlx, tly);
+ if(tlx + 8 > CO) putsym('\n'), tly++;
+ }
+
+ if(flags.standout)
+ standoutbeg();
+ putstr("--More--");
+ if(flags.standout)
+ standoutend();
+
+ xwaitforspace(s);
+ if(flags.toplin && tly > 1) {
+ home();
+ cl_end();
+ docorner(1, tly-1);
+ }
+ flags.toplin = 0;
+}
+
+more(){
+ xmore("");
+}
+
+cmore(s)
+register char *s;
+{
+ xmore(s);
+}
+
+clrlin(){
+ if(flags.toplin) {
+ home();
+ cl_end();
+ if(tly > 1) docorner(1, tly-1);
+ remember_topl();
+ }
+ flags.toplin = 0;
+}
+
+/*VARARGS1*/
+pline(line,arg1,arg2,arg3,arg4,arg5,arg6)
+register char *line,*arg1,*arg2,*arg3,*arg4,*arg5,*arg6;
+{
+ char pbuf[BUFSZ];
+ register char *bp = pbuf, *tl;
+ register int n,n0;
+
+ if(!line || !*line) return;
+ if(!index(line, '%')) (void) strcpy(pbuf,line); else
+ (void) sprintf(pbuf,line,arg1,arg2,arg3,arg4,arg5,arg6);
+ if(flags.toplin == 1 && !strcmp(pbuf, toplines)) return;
+ nscr(); /* %% */
+
+ /* If there is room on the line, print message on same line */
+ /* But messages like "You die..." deserve their own line */
+ n0 = strlen(bp);
+ if(flags.toplin == 1 && tly == 1 &&
+ n0 + strlen(toplines) + 3 < CO-8 && /* leave room for --More-- */
+ strncmp(bp, "You ", 4)) {
+ (void) strcat(toplines, " ");
+ (void) strcat(toplines, bp);
+ tlx += 2;
+ addtopl(bp);
+ return;
+ }
+ if(flags.toplin == 1) more();
+ remember_topl();
+ toplines[0] = 0;
+ while(n0){
+ if(n0 >= CO){
+ /* look for appropriate cut point */
+ n0 = 0;
+ for(n = 0; n < CO; n++) if(bp[n] == ' ')
+ n0 = n;
+ if(!n0) for(n = 0; n < CO-1; n++)
+ if(!letter(bp[n])) n0 = n;
+ if(!n0) n0 = CO-2;
+ }
+ (void) strncpy((tl = eos(toplines)), bp, n0);
+ tl[n0] = 0;
+ bp += n0;
+
+ /* remove trailing spaces, but leave one */
+ while(n0 > 1 && tl[n0-1] == ' ' && tl[n0-2] == ' ')
+ tl[--n0] = 0;
+
+ n0 = strlen(bp);
+ if(n0 && tl[0]) (void) strcat(tl, "\n");
+ }
+ redotoplin();
+}
+
+putsym(c) char c; {
+ switch(c) {
+ case '\b':
+ backsp();
+ return;
+ case '\n':
+ curx = 1;
+ cury++;
+ if(cury > tly) tly = cury;
+ break;
+ default:
+ if(curx == CO)
+ putsym('\n'); /* 1 <= curx <= CO; avoid CO */
+ else
+ curx++;
+ }
+ (void) putchar(c);
+}
+
+putstr(s) register char *s; {
+ while(*s) putsym(*s++);
+}
OpenPOWER on IntegriCloud