From e9152f6d21d5a8b1e02922e0fc95b71fc21cbd92 Mon Sep 17 00:00:00 2001 From: mrg Date: Sat, 4 Oct 1997 09:00:13 +0000 Subject: hunt version 1993-07-17 --- hunt/huntd/draw.c | 365 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 365 insertions(+) create mode 100644 hunt/huntd/draw.c (limited to 'hunt/huntd/draw.c') diff --git a/hunt/huntd/draw.c b/hunt/huntd/draw.c new file mode 100644 index 00000000..bbadbe16 --- /dev/null +++ b/hunt/huntd/draw.c @@ -0,0 +1,365 @@ +/* + * Hunt + * Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold + * San Francisco, California + */ + +# include "hunt.h" + +drawmaze(pp) +register PLAYER *pp; +{ + register int x; + register char *sp; + register int y; + register char *endp; + + clrscr(pp); + outstr(pp, pp->p_maze[0], WIDTH); + for (y = 1; y < HEIGHT - 1; y++) { + endp = &pp->p_maze[y][WIDTH]; + for (x = 0, sp = pp->p_maze[y]; sp < endp; x++, sp++) + if (*sp != SPACE) { + cgoto(pp, y, x); + if (pp->p_x == x && pp->p_y == y) + outch(pp, translate(*sp)); + else if (isplayer(*sp)) + outch(pp, player_sym(pp, y, x)); + else + outch(pp, *sp); + } + } + cgoto(pp, HEIGHT - 1, 0); + outstr(pp, pp->p_maze[HEIGHT - 1], WIDTH); + drawstatus(pp); +} + +/* + * drawstatus - put up the status lines (this assumes the screen + * size is 80x24 with the maze being 64x24) + */ +drawstatus(pp) +register PLAYER *pp; +{ + register int i; + register PLAYER *np; + + cgoto(pp, STAT_AMMO_ROW, STAT_LABEL_COL); + outstr(pp, "Ammo:", 5); + (void) sprintf(Buf, "%3d", pp->p_ammo); + cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL); + outstr(pp, Buf, 3); + + cgoto(pp, STAT_GUN_ROW, STAT_LABEL_COL); + outstr(pp, "Gun:", 4); + cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL); + outstr(pp, (pp->p_ncshot < MAXNCSHOT) ? " ok" : " ", 3); + + cgoto(pp, STAT_DAM_ROW, STAT_LABEL_COL); + outstr(pp, "Damage:", 7); + (void) sprintf(Buf, "%2d/%2d", pp->p_damage, pp->p_damcap); + cgoto(pp, STAT_DAM_ROW, STAT_VALUE_COL); + outstr(pp, Buf, 5); + + cgoto(pp, STAT_KILL_ROW, STAT_LABEL_COL); + outstr(pp, "Kills:", 6); + (void) sprintf(Buf, "%3d", (pp->p_damcap - MAXDAM) / 2); + cgoto(pp, STAT_KILL_ROW, STAT_VALUE_COL); + outstr(pp, Buf, 3); + + cgoto(pp, STAT_PLAY_ROW, STAT_LABEL_COL); + outstr(pp, "Player:", 7); + for (i = STAT_PLAY_ROW + 1, np = Player; np < End_player; np++) { + (void) sprintf(Buf, "%5.2f%c%-10.10s %c", np->p_ident->i_score, + stat_char(np), np->p_ident->i_name, + np->p_ident->i_team); + cgoto(pp, i++, STAT_NAME_COL); + outstr(pp, Buf, STAT_NAME_LEN); + } + +# ifdef MONITOR + cgoto(pp, STAT_MON_ROW, STAT_LABEL_COL); + outstr(pp, "Monitor:", 8); + for (i = STAT_MON_ROW + 1, np = Monitor; np < End_monitor; np++) { + (void) sprintf(Buf, "%5.5s %-10.10s %c", " ", + np->p_ident->i_name, np->p_ident->i_team); + cgoto(pp, i++, STAT_NAME_COL); + outstr(pp, Buf, STAT_NAME_LEN); + } +# endif +} + +look(pp) +register PLAYER *pp; +{ + register int x, y; + + x = pp->p_x; + y = pp->p_y; + + check(pp, y - 1, x - 1); + check(pp, y - 1, x ); + check(pp, y - 1, x + 1); + check(pp, y , x - 1); + check(pp, y , x ); + check(pp, y , x + 1); + check(pp, y + 1, x - 1); + check(pp, y + 1, x ); + check(pp, y + 1, x + 1); + + switch (pp->p_face) { + case LEFTS: + see(pp, LEFTS); + see(pp, ABOVE); + see(pp, BELOW); + break; + case RIGHT: + see(pp, RIGHT); + see(pp, ABOVE); + see(pp, BELOW); + break; + case ABOVE: + see(pp, ABOVE); + see(pp, LEFTS); + see(pp, RIGHT); + break; + case BELOW: + see(pp, BELOW); + see(pp, LEFTS); + see(pp, RIGHT); + break; +# ifdef FLY + case FLYER: + break; +# endif + } + cgoto(pp, y, x); +} + +see(pp, face) +register PLAYER *pp; +int face; +{ + register char *sp; + register int y, x, i, cnt; + + x = pp->p_x; + y = pp->p_y; + + switch (face) { + case LEFTS: + sp = &Maze[y][x]; + for (i = 0; See_over[*--sp]; i++) + continue; + + if (i == 0) + break; + + cnt = i; + x = pp->p_x - 1; + --y; + while (i--) + check(pp, y, --x); + i = cnt; + x = pp->p_x - 1; + ++y; + while (i--) + check(pp, y, --x); + i = cnt; + x = pp->p_x - 1; + ++y; + while (i--) + check(pp, y, --x); + break; + case RIGHT: + sp = &Maze[y][++x]; + for (i = 0; See_over[*sp++]; i++) + continue; + + if (i == 0) + break; + + cnt = i; + x = pp->p_x + 1; + --y; + while (i--) + check(pp, y, ++x); + i = cnt; + x = pp->p_x + 1; + ++y; + while (i--) + check(pp, y, ++x); + i = cnt; + x = pp->p_x + 1; + ++y; + while (i--) + check(pp, y, ++x); + break; + case ABOVE: + sp = &Maze[--y][x]; + if (!See_over[*sp]) + break; + do { + --y; + sp -= sizeof Maze[0]; + check(pp, y, x - 1); + check(pp, y, x ); + check(pp, y, x + 1); + } while (See_over[*sp]); + break; + case BELOW: + sp = &Maze[++y][x]; + if (!See_over[*sp]) + break; + do { + y++; + sp += sizeof Maze[0]; + check(pp, y, x - 1); + check(pp, y, x ); + check(pp, y, x + 1); + } while (See_over[*sp]); + break; + } +} + +check(pp, y, x) +PLAYER *pp; +int y, x; +{ + register int index; + register int ch; + register PLAYER *rpp; + + index = y * sizeof Maze[0] + x; + ch = ((char *) Maze)[index]; + if (ch != ((char *) pp->p_maze)[index]) { + rpp = pp; + cgoto(rpp, y, x); + if (x == rpp->p_x && y == rpp->p_y) + outch(rpp, translate(ch)); + else if (isplayer(ch)) + outch(rpp, player_sym(rpp, y, x)); + else + outch(rpp, ch); + ((char *) rpp->p_maze)[index] = ch; + } +} + +/* + * showstat + * Update the status of players + */ +showstat(pp) +register PLAYER *pp; +{ + register PLAYER *np; + register int y; + register char c; + + y = STAT_PLAY_ROW + 1 + (pp - Player); + c = stat_char(pp); +# ifdef MONITOR + for (np = Monitor; np < End_monitor; np++) { + cgoto(np, y, STAT_SCAN_COL); + outch(np, c); + } +# endif + for (np = Player; np < End_player; np++) { + cgoto(np, y, STAT_SCAN_COL); + outch(np, c); + } +} + +/* + * drawplayer: + * Draw the player on the screen and show him to everyone who's scanning + * unless he is cloaked. + */ +drawplayer(pp, draw) +PLAYER *pp; +FLAG draw; +{ + register PLAYER *newp; + register int x, y; + + x = pp->p_x; + y = pp->p_y; + Maze[y][x] = draw ? pp->p_face : pp->p_over; + +# ifdef MONITOR + for (newp = Monitor; newp < End_monitor; newp++) + check(newp, y, x); +# endif + + for (newp = Player; newp < End_player; newp++) { + if (!draw || newp == pp) { + check(newp, y, x); + continue; + } + if (newp->p_scan == 0) { + newp->p_scan--; + showstat(newp); + } + else if (newp->p_scan > 0) { + if (pp->p_cloak < 0) + check(newp, y, x); + newp->p_scan--; + } + } + if (!draw || pp->p_cloak < 0) + return; + if (pp->p_cloak-- == 0) + showstat(pp); +} + +message(pp, s) +register PLAYER *pp; +char *s; +{ + cgoto(pp, HEIGHT, 0); + outstr(pp, s, strlen(s)); + ce(pp); +} + +/* + * translate: + * Turn a character into the right direction character if we are + * looking at the current player. + */ +translate(ch) +char ch; +{ + switch (ch) { + case LEFTS: + return '<'; + case RIGHT: + return '>'; + case ABOVE: + return '^'; + case BELOW: + return 'v'; + } + return ch; +} + +/* + * player_sym: + * Return the player symbol + */ +player_sym(pp, y, x) +PLAYER *pp; +int y, x; +{ + register PLAYER *npp; + + npp = play_at(y, x); + if (npp->p_ident->i_team == ' ') + return Maze[y][x]; +#ifdef MONITOR + if (pp->p_ident->i_team == '*') + return npp->p_ident->i_team; +#endif + if (pp->p_ident->i_team != npp->p_ident->i_team) + return Maze[y][x]; + return pp->p_ident->i_team; +} -- cgit v1.2.3-56-ge451