OSDN Git Service

[Refactor] #37353 聖浄の杖の効果を cleasing_nova() に分離。 / Separate implementation of 'staff...
[hengband/hengband.git] / src / z-term.c
index 91124bf..76a167e 100644 (file)
@@ -52,7 +52,8 @@
  * computers, and to check for "keypresses" from the user.  The major
  * concerns were thus portability and efficiency, so Angband could be
  * easily ported to many different systems, with minimal effort, and
- * yet would run quickly on each of these systems, no matter what kind
+ * yet would run quickly on each of these sys
+ tems, no matter what kind
  * of underlying hardware/software support was being used.
  *
  * It is important to understand the differences between the older
@@ -296,22 +297,22 @@ term *Term = NULL;
 /*
  * Nuke a term_win (see below)
  */
-static errr term_win_nuke(term_win *s, int w, int h)
+static errr term_win_nuke(term_win *s, TERM_LEN w, TERM_LEN h)
 {
        /* Free the window access arrays */
-       C_KILL(s->a, h, byte*);
+       C_KILL(s->a, h, TERM_COLOR*);
        C_KILL(s->c, h, char*);
 
        /* Free the window content arrays */
-       C_KILL(s->va, h * w, byte);
+       C_KILL(s->va, h * w, TERM_COLOR);
        C_KILL(s->vc, h * w, char);
 
        /* Free the terrain access arrays */
-       C_KILL(s->ta, h, byte*);
+       C_KILL(s->ta, h, TERM_COLOR*);
        C_KILL(s->tc, h, char*);
 
        /* Free the terrain content arrays */
-       C_KILL(s->vta, h * w, byte);
+       C_KILL(s->vta, h * w, TERM_COLOR);
        C_KILL(s->vtc, h * w, char);
 
        /* Success */
@@ -322,24 +323,24 @@ static errr term_win_nuke(term_win *s, int w, int h)
 /*
  * Initialize a "term_win" (using the given window size)
  */
-static errr term_win_init(term_win *s, int w, int h)
+static errr term_win_init(term_win *s, TERM_LEN w, TERM_LEN h)
 {
-       int y;
+       TERM_LEN y;
 
        /* Make the window access arrays */
-       C_MAKE(s->a, h, byte*);
+       C_MAKE(s->a, h, TERM_COLOR*);
        C_MAKE(s->c, h, char*);
 
        /* Make the window content arrays */
-       C_MAKE(s->va, h * w, byte);
+       C_MAKE(s->va, h * w, TERM_COLOR);
        C_MAKE(s->vc, h * w, char);
 
        /* Make the terrain access arrays */
-       C_MAKE(s->ta, h, byte*);
+       C_MAKE(s->ta, h, TERM_COLOR*);
        C_MAKE(s->tc, h, char*);
 
        /* Make the terrain content arrays */
-       C_MAKE(s->vta, h * w, byte);
+       C_MAKE(s->vta, h * w, TERM_COLOR);
        C_MAKE(s->vtc, h * w, char);
 
 
@@ -361,23 +362,23 @@ static errr term_win_init(term_win *s, int w, int h)
 /*
  * Copy a "term_win" from another
  */
-static errr term_win_copy(term_win *s, term_win *f, int w, int h)
+static errr term_win_copy(term_win *s, term_win *f, TERM_LEN w, TERM_LEN h)
 {
-       int x, y;
+       TERM_LEN x, y;
 
        /* Copy contents */
        for (y = 0; y < h; y++)
        {
-               byte *f_aa = f->a[y];
+               TERM_COLOR *f_aa = f->a[y];
                char *f_cc = f->c[y];
 
-               byte *s_aa = s->a[y];
+               TERM_COLOR *s_aa = s->a[y];
                char *s_cc = s->c[y];
 
-               byte *f_taa = f->ta[y];
+               TERM_COLOR *f_taa = f->ta[y];
                char *f_tcc = f->tc[y];
 
-               byte *s_taa = s->ta[y];
+               TERM_COLOR *s_taa = s->ta[y];
                char *s_tcc = s->tc[y];
 
                for (x = 0; x < w; x++)
@@ -437,20 +438,19 @@ errr Term_xtra(int n, int v)
 /*
  * Hack -- fake hook for "Term_curs()" (see above)
  */
-static errr Term_curs_hack(int x, int y)
+static errr Term_curs_hack(TERM_LEN x, TERM_LEN y)
 {
        /* Unused */
        (void)x;
        (void)y;
 
-       /* Oops */
        return (-1);
 }
 
 /*
  * Hack -- fake hook for "Term_bigcurs()" (see above)
  */
-static errr Term_bigcurs_hack(int x, int y)
+static errr Term_bigcurs_hack(TERM_LEN x, TERM_LEN y)
 {
        return (*Term->curs_hook)(x, y);
 }
@@ -458,21 +458,20 @@ static errr Term_bigcurs_hack(int x, int y)
 /*
  * Hack -- fake hook for "Term_wipe()" (see above)
  */
-static errr Term_wipe_hack(int x, int y, int n)
+static errr Term_wipe_hack(TERM_LEN x, TERM_LEN y, int n)
 {
        /* Unused */
        (void)x;
        (void)y;
        (void)n;
 
-       /* Oops */
        return (-1);
 }
 
 /*
  * Hack -- fake hook for "Term_text()" (see above)
  */
-static errr Term_text_hack(int x, int y, int n, byte a, cptr cp)
+static errr Term_text_hack(TERM_LEN x, TERM_LEN y, int n, TERM_COLOR a, concptr cp)
 {
        /* Unused */
        (void)x;
@@ -481,14 +480,13 @@ static errr Term_text_hack(int x, int y, int n, byte a, cptr cp)
        (void)a;
        (void)cp;
 
-       /* Oops */
        return (-1);
 }
 
 /*
  * Hack -- fake hook for "Term_pict()" (see above)
  */
-static errr Term_pict_hack(int x, int y, int n, const byte *ap, cptr cp, const byte *tap, cptr tcp)
+static errr Term_pict_hack(TERM_LEN x, TERM_LEN y, int n, const TERM_COLOR *ap, concptr cp, const TERM_COLOR *tap, concptr tcp)
 {
        /* Unused */
        (void)x;
@@ -499,7 +497,6 @@ static errr Term_pict_hack(int x, int y, int n, const byte *ap, cptr cp, const b
        (void)tap;
        (void)tcp;
 
-       /* Oops */
        return (-1);
 }
 
@@ -510,17 +507,16 @@ static errr Term_pict_hack(int x, int y, int n, const byte *ap, cptr cp, const b
 
 /*
  * Mentally draw an attr/char at a given location
- *
  * Assumes given location and values are valid.
  */
-void Term_queue_char(int x, int y, byte a, char c, byte ta, char tc)
+void Term_queue_char(TERM_LEN x, TERM_LEN y, TERM_COLOR a, char c, TERM_COLOR ta, char tc)
 {
        term_win *scrn = Term->scr; 
        
-       byte *scr_aa = &scrn->a[y][x];
+       TERM_COLOR *scr_aa = &scrn->a[y][x];
        char *scr_cc = &scrn->c[y][x];
 
-       byte *scr_taa = &scrn->ta[y][x];
+       TERM_COLOR *scr_taa = &scrn->ta[y][x];
        char *scr_tcc = &scrn->tc[y][x];
 
        /* Hack -- Ignore non-changes */
@@ -535,12 +531,12 @@ void Term_queue_char(int x, int y, byte a, char c, byte ta, char tc)
        *scr_tcc = tc;
 
        /* Check for new min/max row info */
-       if (y < Term->y1) Term->y1 = y;
-       if (y > Term->y2) Term->y2 = y;
+       if (y < Term->y1) Term->y1 = (byte_hack)y;
+       if (y > Term->y2) Term->y2 = (byte_hack)y;
 
        /* Check for new min/max col info for this row */
-       if (x < Term->x1[y]) Term->x1[y] = x;
-       if (x > Term->x2[y]) Term->x2[y] = x;
+       if (x < Term->x1[y]) Term->x1[y] = (byte_hack)x;
+       if (x > Term->x2[y]) Term->x2[y] = (byte_hack)x;
 
 #ifdef JP
        if (((scrn->a[y][x] & AF_BIGTILE2) == AF_BIGTILE2) ||
@@ -554,14 +550,11 @@ void Term_queue_char(int x, int y, byte a, char c, byte ta, char tc)
 
 /*
  * Bigtile version of Term_queue_char().
- *
  * If use_bigtile is FALSE, simply call Term_queue_char().
- *
  * Otherwise, mentally draw a pair of attr/char at a given location.
- *
  * Assumes given location and values are valid.
  */
-void Term_queue_bigchar(int x, int y, byte a, char c, byte ta, char tc)
+void Term_queue_bigchar(TERM_LEN x, TERM_LEN y, TERM_COLOR a, char c, TERM_COLOR ta, char tc)
 {
 
 #ifdef JP
@@ -572,7 +565,7 @@ void Term_queue_bigchar(int x, int y, byte a, char c, byte ta, char tc)
         * 「■」は二倍幅豆腐の内部コードに使用。
         */
        static char ascii_to_zenkaku[] =
-               " !”#$%&’()*+,./"
+               " !”#$%&’()*+,./"
                "0123456789:;<=>?"
                "@ABCDEFGHIJKLMNO"
                "PQRSTUVWXYZ[\]^_"
@@ -643,17 +636,17 @@ void Term_queue_bigchar(int x, int y, byte a, char c, byte ta, char tc)
  * This function is designed to be fast, with no consistancy checking.
  * It is used to update the map in the game.
  */
-void Term_queue_line(int x, int y, int n, byte *a, char *c, byte *ta, char *tc)
+void Term_queue_line(TERM_LEN x, TERM_LEN y, int n, TERM_COLOR *a, char *c, TERM_COLOR *ta, char *tc)
 {
        term_win *scrn = Term->scr;
 
-       int x1 = -1;
-       int x2 = -1;
+       TERM_LEN x1 = -1;
+       TERM_LEN x2 = -1;
 
-       byte *scr_aa = &scrn->a[y][x];
+       TERM_COLOR *scr_aa = &scrn->a[y][x];
        char *scr_cc = &scrn->c[y][x];
 
-       byte *scr_taa = &scrn->ta[y][x];
+       TERM_COLOR *scr_taa = &scrn->ta[y][x];
        char *scr_tcc = &scrn->tc[y][x];
 
        while (n--)
@@ -695,12 +688,12 @@ void Term_queue_line(int x, int y, int n, byte *a, char *c, byte *ta, char *tc)
        if (x1 >= 0)
        {
                /* Check for new min/max row info */
-               if (y < Term->y1) Term->y1 = y;
-               if (y > Term->y2) Term->y2 = y;
+               if (y < Term->y1) Term->y1 = (byte_hack)y;
+               if (y > Term->y2) Term->y2 = (byte_hack)y;
 
                /* Check for new min/max col info in this row */
-               if (x1 < Term->x1[y]) Term->x1[y] = x1;
-               if (x2 > Term->x2[y]) Term->x2[y] = x2;
+               if (x1 < Term->x1[y]) Term->x1[y] = (byte_hack)x1;
+               if (x2 > Term->x2[y]) Term->x2[y] = (byte_hack)x2;
        }
 }
 
@@ -714,20 +707,20 @@ void Term_queue_line(int x, int y, int n, byte *a, char *c, byte *ta, char *tc)
  * a valid location, so the first "n" characters of "s" can all be added
  * starting at (x,y) without causing any illegal operations.
  */
-void Term_queue_chars(int x, int y, int n, byte a, cptr s)
+void Term_queue_chars(TERM_LEN x, TERM_LEN y, int n, TERM_COLOR a, concptr s)
 {
-       int x1 = -1, x2 = -1;
+       TERM_LEN x1 = -1, x2 = -1;
 
-       byte *scr_aa = Term->scr->a[y];
+       TERM_COLOR *scr_aa = Term->scr->a[y];
 #ifdef JP
        char *scr_cc = Term->scr->c[y];
 
-       byte *scr_taa = Term->scr->ta[y];
+       TERM_COLOR *scr_taa = Term->scr->ta[y];
        char *scr_tcc = Term->scr->tc[y];
 #else
        char *scr_cc = Term->scr->c[y];
 
-       byte *scr_taa = Term->scr->ta[y];
+       TERM_COLOR *scr_taa = Term->scr->ta[y];
        char *scr_tcc = Term->scr->tc[y];
 #endif
 
@@ -781,10 +774,10 @@ void Term_queue_chars(int x, int y, int n, byte a, cptr s)
                else
                {
 #endif
-               byte oa = scr_aa[x];
+               TERM_COLOR oa = scr_aa[x];
                char oc = scr_cc[x];
 
-               byte ota = scr_taa[x];
+               TERM_COLOR ota = scr_taa[x];
                char otc = scr_tcc[x];
 
                /* Hack -- Ignore non-changes */
@@ -828,12 +821,12 @@ void Term_queue_chars(int x, int y, int n, byte a, cptr s)
        if (x1 >= 0)
        {
                /* Check for new min/max row info */
-               if (y < Term->y1) Term->y1 = y;
-               if (y > Term->y2) Term->y2 = y;
+               if (y < Term->y1) Term->y1 = (byte_hack)y;
+               if (y > Term->y2) Term->y2 = (byte_hack)y;
 
                /* Check for new min/max col info in this row */
-               if (x1 < Term->x1[y]) Term->x1[y] = x1;
-               if (x2 > Term->x2[y]) Term->x2[y] = x2;
+               if (x1 < Term->x1[y]) Term->x1[y] = (byte_hack)x1;
+               if (x2 > Term->x2[y]) Term->x2[y] = (byte_hack)x2;
        }
 }
 
@@ -847,39 +840,39 @@ void Term_queue_chars(int x, int y, int n, byte a, cptr s)
  *
  * Display text using "Term_pict()"
  */
-static void Term_fresh_row_pict(int y, int x1, int x2)
+static void Term_fresh_row_pict(TERM_LEN y, TERM_LEN x1, TERM_LEN x2)
 {
-       int x;
+       TERM_LEN x;
 
-       byte *old_aa = Term->old->a[y];
+       TERM_COLOR *old_aa = Term->old->a[y];
        char *old_cc = Term->old->c[y];
 
-       byte *scr_aa = Term->scr->a[y];
+       TERM_COLOR *scr_aa = Term->scr->a[y];
        char *scr_cc = Term->scr->c[y];
 
-       byte *old_taa = Term->old->ta[y];
+       TERM_COLOR *old_taa = Term->old->ta[y];
        char *old_tcc = Term->old->tc[y];
 
-       byte *scr_taa = Term->scr->ta[y];
+       TERM_COLOR *scr_taa = Term->scr->ta[y];
        char *scr_tcc = Term->scr->tc[y];
 
-       byte ota;
+       TERM_COLOR ota;
        char otc;
 
-       byte nta;
+       TERM_COLOR nta;
        char ntc;
 
 
        /* Pending length */
-       int fn = 0;
+       TERM_LEN fn = 0;
 
        /* Pending start */
-       int fx = 0;
+       TERM_LEN fx = 0;
 
-       byte oa;
+       TERM_COLOR oa;
        char oc;
 
-       byte na;
+       TERM_COLOR na;
        char nc;
 
 #ifdef JP
@@ -935,7 +928,7 @@ static void Term_fresh_row_pict(int y, int x1, int x2)
                        {
                                /* Draw pending attr/char pairs */
                                (void)((*Term->pict_hook)(fx, y, fn,
-                                      &scr_aa[fx], &scr_cc[fx],&scr_taa[fx], &scr_tcc[fx]));
+                                      &scr_aa[fx], &scr_cc[fx], &scr_taa[fx], &scr_tcc[fx]));
 
                                /* Forget */
                                fn = 0;
@@ -981,24 +974,24 @@ static void Term_fresh_row_pict(int y, int x1, int x2)
  * Display text using "Term_text()" and "Term_wipe()",
  * but use "Term_pict()" for high-bit attr/char pairs
  */
-static void Term_fresh_row_both(int y, int x1, int x2)
+static void Term_fresh_row_both(TERM_LEN y, int x1, int x2)
 {
-       int x;
+       TERM_LEN x;
 
-       byte *old_aa = Term->old->a[y];
+       TERM_COLOR *old_aa = Term->old->a[y];
        char *old_cc = Term->old->c[y];
 
-       byte *scr_aa = Term->scr->a[y];
+       TERM_COLOR *scr_aa = Term->scr->a[y];
        char *scr_cc = Term->scr->c[y];
 
-       byte *old_taa = Term->old->ta[y];
+       TERM_COLOR *old_taa = Term->old->ta[y];
        char *old_tcc = Term->old->tc[y];
-       byte *scr_taa = Term->scr->ta[y];
+       TERM_COLOR *scr_taa = Term->scr->ta[y];
        char *scr_tcc = Term->scr->tc[y];
 
-       byte ota;
+       TERM_COLOR ota;
        char otc;
-       byte nta;
+       TERM_COLOR nta;
        char ntc;
 
        /* The "always_text" flag */
@@ -1013,10 +1006,10 @@ static void Term_fresh_row_both(int y, int x1, int x2)
        /* Pending attr */
        byte fa = Term->attr_blank;
 
-       byte oa;
+       TERM_COLOR oa;
        char oc;
 
-       byte na;
+       TERM_COLOR na;
        char nc;
 
 #ifdef JP
@@ -1202,14 +1195,14 @@ static void Term_fresh_row_both(int y, int x1, int x2)
  *
  * Display text using "Term_text()" and "Term_wipe()"
  */
-static void Term_fresh_row_text(int y, int x1, int x2)
+static void Term_fresh_row_text(TERM_LEN y, TERM_LEN x1, TERM_LEN x2)
 {
-       int x;
+       TERM_LEN x;
 
-       byte *old_aa = Term->old->a[y];
+       TERM_COLOR *old_aa = Term->old->a[y];
        char *old_cc = Term->old->c[y];
 
-       byte *scr_aa = Term->scr->a[y];
+       TERM_COLOR *scr_aa = Term->scr->a[y];
        char *scr_cc = Term->scr->c[y];
 
        /* The "always_text" flag */
@@ -1224,10 +1217,10 @@ static void Term_fresh_row_text(int y, int x1, int x2)
        /* Pending attr */
        byte fa = Term->attr_blank;
 
-       byte oa;
+       TERM_COLOR oa;
        char oc;
 
-       byte na;
+       TERM_COLOR na;
        char nc;
 
 #ifdef JP
@@ -1475,7 +1468,7 @@ static void Term_fresh_row_text(int y, int x1, int x2)
  * On systems with a "soft" cursor, we must explicitly erase the cursor
  * before flushing the output, if needed, to prevent a "jumpy" refresh.
  * The actual method for this is horrible, but there is very little that
- * we can do to simplify it efficiently.  XXX XXX XXX
+ * we can do to simplify it efficiently.  
  *
  * On systems with a "hard" cursor, we will "hide" the cursor before
  * flushing the output, if needed, to avoid a "flickery" refresh.  It
@@ -1493,7 +1486,7 @@ static void Term_fresh_row_text(int y, int x1, int x2)
  */
 errr Term_fresh(void)
 {
-       int x, y;
+       TERM_LEN x, y;
 
        int w = Term->wid;
        int h = Term->hgt;
@@ -1503,7 +1496,9 @@ errr Term_fresh(void)
 
        term_win *old = Term->old;
        term_win *scr = Term->scr;
-
+       
+       /* Before initialize (Advice from Mr.shimitei)*/
+       if (!old || !scr) return (1);
 
        /* Do nothing unless "mapped" */
        if (!Term->mapped_flag) return (1);
@@ -1537,10 +1532,10 @@ errr Term_fresh(void)
                /* Wipe each row */
                for (y = 0; y < h; y++)
                {
-                       byte *aa = old->a[y];
+                       TERM_COLOR *aa = old->a[y];
                        char *cc = old->c[y];
 
-                       byte *taa = old->ta[y];
+                       TERM_COLOR *taa = old->ta[y];
                        char *tcc = old->tc[y];
 
 
@@ -1579,16 +1574,16 @@ errr Term_fresh(void)
                if (!old->cu && old->cv)
                {
                        int csize = 1;
-                       int tx = old->cx;
-                       int ty = old->cy;
+                       TERM_LEN tx = old->cx;
+                       TERM_LEN ty = old->cy;
 
-                       byte *old_aa = old->a[ty];
+                       TERM_COLOR *old_aa = old->a[ty];
                        char *old_cc = old->c[ty];
 
-                       byte *old_taa = old->ta[ty];
+                       TERM_COLOR *old_taa = old->ta[ty];
                        char *old_tcc = old->tc[ty];
 
-                       byte ota = old_taa[tx];
+                       TERM_COLOR ota = old_taa[tx];
                        char otc = old_tcc[tx];
 
 #ifdef JP
@@ -1662,8 +1657,8 @@ errr Term_fresh(void)
                /* Scan the "modified" rows */
                for (y = y1; y <= y2; ++y)
                {
-                       int x1 = Term->x1[y];
-                       int x2 = Term->x2[y];
+                       TERM_LEN x1 = Term->x1[y];
+                       TERM_LEN x2 = Term->x2[y];
 
                        /* Flush each "modified" row */
                        if (x1 <= x2)
@@ -1690,7 +1685,7 @@ errr Term_fresh(void)
                                }
 
                                /* This row is all done */
-                               Term->x1[y] = w;
+                               Term->x1[y] = (byte_hack)w;
                                Term->x2[y] = 0;
 
                                /* Hack -- Flush that row (if allowed) */
@@ -1699,7 +1694,7 @@ errr Term_fresh(void)
                }
 
                /* No rows are invalid */
-               Term->y1 = h;
+               Term->y1 = (byte_hack)h;
                Term->y2 = 0;
        }
 
@@ -1794,7 +1789,7 @@ errr Term_set_cursor(int v)
        if (Term->scr->cv == v) return (1);
 
        /* Change */
-       Term->scr->cv = v;
+       Term->scr->cv = (bool_hack)v;
 
        /* Success */
        return (0);
@@ -1806,7 +1801,7 @@ errr Term_set_cursor(int v)
  *
  * Note -- "illegal" requests do not move the cursor.
  */
-errr Term_gotoxy(int x, int y)
+errr Term_gotoxy(TERM_LEN x, TERM_LEN y)
 {
        int w = Term->wid;
        int h = Term->hgt;
@@ -1816,8 +1811,8 @@ errr Term_gotoxy(int x, int y)
        if ((y < 0) || (y >= h)) return (-1);
 
        /* Remember the cursor */
-       Term->scr->cx = x;
-       Term->scr->cy = y;
+       Term->scr->cx = (byte_hack)x;
+       Term->scr->cy = (byte_hack)y;
 
        /* The cursor is not useless */
        Term->scr->cu = 0;
@@ -1832,7 +1827,7 @@ errr Term_gotoxy(int x, int y)
  * Do not change the cursor position
  * No visual changes until "Term_fresh()".
  */
-errr Term_draw(int x, int y, byte a, char c)
+errr Term_draw(TERM_LEN x, TERM_LEN y, TERM_COLOR a, char c)
 {
        int w = Term->wid;
        int h = Term->hgt;
@@ -1868,9 +1863,9 @@ errr Term_draw(int x, int y, byte a, char c)
  * positive value, future calls to either function will
  * return negative ones.
  */
-errr Term_addch(byte a, char c)
+errr Term_addch(TERM_COLOR a, char c)
 {
-       int w = Term->wid;
+       TERM_LEN w = Term->wid;
 
        /* Handle "unusable" cursor */
        if (Term->scr->cu) return (-1);
@@ -1903,7 +1898,7 @@ errr Term_addch(byte a, char c)
  * Otherwise, queue a pair of attr/char for display at the current
  * cursor location, and advance the cursor to the right by two.
  */
-errr Term_add_bigch(byte a, char c)
+errr Term_add_bigch(TERM_COLOR a, char c)
 {
        if (!use_bigtile) return Term_addch(a, c);
 
@@ -1949,12 +1944,10 @@ errr Term_add_bigch(byte a, char c)
  * positive value, future calls to either function will
  * return negative ones.
  */
-errr Term_addstr(int n, byte a, cptr s)
+errr Term_addstr(int n, TERM_COLOR a, concptr s)
 {
        int k;
-
-       int w = Term->wid;
-
+       TERM_LEN w = Term->wid;
        errr res = 0;
 
        /* Handle "unusable" cursor */
@@ -1973,7 +1966,7 @@ errr Term_addstr(int n, byte a, cptr s)
        Term_queue_chars(Term->scr->cx, Term->scr->cy, n, a, s);
 
        /* Advance the cursor */
-       Term->scr->cx += n;
+       Term->scr->cx += (byte_hack)n;
 
        /* Hack -- Notice "Useless" cursor */
        if (res) Term->scr->cu = 1;
@@ -1986,7 +1979,7 @@ errr Term_addstr(int n, byte a, cptr s)
 /*
  * Move to a location and, using an attr, add a char
  */
-errr Term_putch(int x, int y, byte a, char c)
+errr Term_putch(TERM_LEN x, TERM_LEN y, TERM_COLOR a, char c)
 {
        errr res;
 
@@ -2004,7 +1997,7 @@ errr Term_putch(int x, int y, byte a, char c)
 /*
  * Move to a location and, using an attr, add a string
  */
-errr Term_putstr(int x, int y, int n, byte a, cptr s)
+errr Term_putstr(TERM_LEN x, TERM_LEN y, int n, TERM_COLOR a, concptr s)
 {
        errr res;
 
@@ -2022,7 +2015,7 @@ errr Term_putstr(int x, int y, int n, byte a, cptr s)
 /*
  * Move to a location and, using an attr, add a string vertically
  */
-errr Term_putstr_v(int x, int y, int n, byte a, cptr s)
+errr Term_putstr_v(TERM_LEN x, TERM_LEN y, int n, byte a, concptr s)
 {
        errr res;
        int i;
@@ -2054,23 +2047,23 @@ errr Term_putstr_v(int x, int y, int n, byte a, cptr s)
 /*
  * Place cursor at (x,y), and clear the next "n" chars
  */
-errr Term_erase(int x, int y, int n)
+errr Term_erase(TERM_LEN x, TERM_LEN y, int n)
 {
        int i;
 
-       int w = Term->wid;
+       TERM_LEN w = Term->wid;
        /* int h = Term->hgt; */
 
-       int x1 = -1;
-       int x2 = -1;
+       TERM_LEN x1 = -1;
+       TERM_LEN x2 = -1;
 
        int na = Term->attr_blank;
        int nc = Term->char_blank;
 
-       byte *scr_aa;
+       TERM_COLOR *scr_aa;
        char *scr_cc;
 
-       byte *scr_taa;
+       TERM_COLOR *scr_taa;
        char *scr_tcc;
 
        /* Place cursor */
@@ -2122,8 +2115,8 @@ errr Term_erase(int x, int y, int n)
                        n++;
 #endif
                /* Save the "literal" information */
-               scr_aa[x] = na;
-               scr_cc[x] = nc;
+               scr_aa[x] = (byte_hack)na;
+               scr_cc[x] = (char)nc;
 
                scr_taa[x] = 0;
                scr_tcc[x] = 0;
@@ -2139,12 +2132,12 @@ errr Term_erase(int x, int y, int n)
        if (x1 >= 0)
        {
                /* Check for new min/max row info */
-               if (y < Term->y1) Term->y1 = y;
-               if (y > Term->y2) Term->y2 = y;
+               if (y < Term->y1) Term->y1 = (byte_hack)y;
+               if (y > Term->y2) Term->y2 = (byte_hack)y;
 
                /* Check for new min/max col info in this row */
-               if (x1 < Term->x1[y]) Term->x1[y] = x1;
-               if (x2 > Term->x2[y]) Term->x2[y] = x2;
+               if (x1 < Term->x1[y]) Term->x1[y] = (byte_hack)x1;
+               if (x2 > Term->x2[y]) Term->x2[y] = (byte_hack)x2;
        }
 
        /* Success */
@@ -2159,12 +2152,12 @@ errr Term_erase(int x, int y, int n)
  */
 errr Term_clear(void)
 {
-       int x, y;
+       TERM_LEN x, y;
 
-       int w = Term->wid;
-       int h = Term->hgt;
+       TERM_LEN w = Term->wid;
+       TERM_LEN h = Term->hgt;
 
-       byte na = Term->attr_blank;
+       TERM_COLOR na = Term->attr_blank;
        char nc = Term->char_blank;
 
        /* Cursor usable */
@@ -2176,10 +2169,10 @@ errr Term_clear(void)
        /* Wipe each row */
        for (y = 0; y < h; y++)
        {
-               byte *scr_aa = Term->scr->a[y];
+               TERM_COLOR *scr_aa = Term->scr->a[y];
                char *scr_cc = Term->scr->c[y];
 
-               byte *scr_taa = Term->scr->ta[y];
+               TERM_COLOR *scr_taa = Term->scr->ta[y];
                char *scr_tcc = Term->scr->tc[y];
 
                /* Wipe each column */
@@ -2229,9 +2222,9 @@ errr Term_redraw(void)
 
 
 /*
- * Redraw part of a widow.
+ * Redraw part of a window.
  */
-errr Term_redraw_section(int x1, int y1, int x2, int y2)
+errr Term_redraw_section(TERM_LEN x1, TERM_LEN y1, TERM_LEN x2, TERM_LEN y2)
 {
        int i, j;
 
@@ -2244,8 +2237,8 @@ errr Term_redraw_section(int x1, int y1, int x2, int y2)
        if (x1 < 0) x1 = 0;
 
        /* Set y limits */
-       Term->y1 = y1;
-       Term->y2 = y2;
+       Term->y1 = (byte_hack)y1;
+       Term->y2 = (byte_hack)y2;
 
        /* Set the x limits */
        for (i = Term->y1; i <= Term->y2; i++)
@@ -2264,8 +2257,8 @@ errr Term_redraw_section(int x1, int y1, int x2, int y2)
                        if (Term->scr->a[i][x2j] & AF_KANJI1) x2j++;
                }
    
-               Term->x1[i] = x1j;
-               Term->x2[i] = x2j;
+               Term->x1[i] = (byte_hack)x1j;
+               Term->x2[i] = (byte_hack)x2j;
    
                c_ptr = Term->old->c[i];
    
@@ -2318,7 +2311,7 @@ errr Term_get_cursor(int *v)
 /*
  * Extract the current window size
  */
-errr Term_get_size(int *w, int *h)
+errr Term_get_size(TERM_LEN *w, TERM_LEN *h)
 {
        /* Access the cursor */
        (*w) = Term->wid;
@@ -2332,7 +2325,7 @@ errr Term_get_size(int *w, int *h)
 /*
  * Extract the current cursor location
  */
-errr Term_locate(int *x, int *y)
+errr Term_locate(TERM_LEN *x, TERM_LEN *y)
 {
        /* Access the cursor */
        (*x) = Term->scr->cx;
@@ -2351,10 +2344,10 @@ errr Term_locate(int *x, int *y)
  * Note that this refers to what will be on the window after the
  * next call to "Term_fresh()".  It may or may not already be there.
  */
-errr Term_what(int x, int y, byte *a, char *c)
+errr Term_what(TERM_LEN x, TERM_LEN y, TERM_COLOR *a, char *c)
 {
-       int w = Term->wid;
-       int h = Term->hgt;
+       TERM_LEN w = Term->wid;
+       TERM_LEN h = Term->hgt;
 
        /* Verify location */
        if ((x < 0) || (x >= w)) return (-1);
@@ -2399,7 +2392,7 @@ errr Term_keypress(int k)
        if (!k) return (-1);
 
        /* Store the char, advance the queue */
-       Term->key_queue[Term->key_head++] = k;
+       Term->key_queue[Term->key_head++] = (char)k;
 
        /* Circular queue, handle wrap */
        if (Term->key_head == Term->key_size) Term->key_head = 0;
@@ -2429,16 +2422,11 @@ errr Term_key_push(int k)
        if (Term->key_tail == 0) Term->key_tail = Term->key_size;
 
        /* Back up, Store the char */
-       Term->key_queue[--Term->key_tail] = k;
+       Term->key_queue[--Term->key_tail] = (char)k;
 
        /* Success (unless overflow) */
        if (Term->key_head != Term->key_tail) return (0);
 
-#if 0
-       /* Hack -- Forget the oldest key */
-       if (++Term->key_tail == Term->key_size) Term->key_tail = 0;
-#endif
-
        /* Problem */
        return (1);
 }
@@ -2520,8 +2508,8 @@ errr Term_inkey(char *ch, bool wait, bool take)
  */
 errr Term_save(void)
 {
-       int w = Term->wid;
-       int h = Term->hgt;
+       TERM_LEN w = Term->wid;
+       TERM_LEN h = Term->hgt;
 
        /* Create */
        if (!Term->mem)
@@ -2548,10 +2536,10 @@ errr Term_save(void)
  */
 errr Term_load(void)
 {
-       int y;
+       TERM_LEN y;
 
-       int w = Term->wid;
-       int h = Term->hgt;
+       TERM_LEN w = Term->wid;
+       TERM_LEN h = Term->hgt;
 
        /* Create */
        if (!Term->mem)
@@ -2588,10 +2576,10 @@ errr Term_load(void)
  */
 errr Term_exchange(void)
 {
-       int y;
+       TERM_LEN y;
 
-       int w = Term->wid;
-       int h = Term->hgt;
+       TERM_LEN w = Term->wid;
+       TERM_LEN h = Term->hgt;
 
        term_win *exchanger;
 
@@ -2632,14 +2620,14 @@ errr Term_exchange(void)
 /*
  * React to a new physical window size.
  */
-errr Term_resize(int w, int h)
+errr Term_resize(TERM_LEN w, TERM_LEN h)
 {
        int i;
 
-       int wid, hgt;
+       TERM_LEN wid, hgt;
 
-       byte *hold_x1;
-       byte *hold_x2;
+       TERM_LEN *hold_x1;
+       TERM_LEN *hold_x2;
 
        term_win *hold_old;
        term_win *hold_scr;
@@ -2680,8 +2668,8 @@ errr Term_resize(int w, int h)
        hold_tmp = Term->tmp;
 
        /* Create new scanners */
-       C_MAKE(Term->x1, h, byte);
-       C_MAKE(Term->x2, h, byte);
+       C_MAKE(Term->x1, h, TERM_LEN);
+       C_MAKE(Term->x2, h, TERM_LEN);
 
        /* Create new window */
        MAKE(Term->old, term_win);
@@ -2728,8 +2716,8 @@ errr Term_resize(int w, int h)
        }
 
        /* Free some arrays */
-       C_KILL(hold_x1, Term->hgt, byte);
-       C_KILL(hold_x2, Term->hgt, byte);
+       C_KILL(hold_x1, Term->hgt, TERM_LEN);
+       C_KILL(hold_x2, Term->hgt, TERM_LEN);
 
        /* Nuke */
        term_win_nuke(hold_old, Term->wid, Term->hgt);
@@ -2857,8 +2845,8 @@ errr Term_activate(term *t)
  */
 errr term_nuke(term *t)
 {
-       int w = t->wid;
-       int h = t->hgt;
+       TERM_LEN w = t->wid;
+       TERM_LEN h = t->hgt;
 
 
        /* Hack -- Call the special "nuke" hook */
@@ -2908,8 +2896,8 @@ errr term_nuke(term *t)
        }
 
        /* Free some arrays */
-       C_KILL(t->x1, h, byte);
-       C_KILL(t->x2, h, byte);
+       C_KILL(t->x1, h, TERM_LEN);
+       C_KILL(t->x2, h, TERM_LEN);
 
        /* Free the input queue */
        C_KILL(t->key_queue, t->key_size, char);
@@ -2925,9 +2913,9 @@ errr term_nuke(term *t)
  * By default, the cursor starts out "invisible"
  * By default, we "erase" using "black spaces"
  */
-errr term_init(term *t, int w, int h, int k)
+errr term_init(term *t, TERM_LEN w, TERM_LEN h, int k)
 {
-       int y;
+       TERM_LEN y;
 
 
        /* Wipe it */
@@ -2938,7 +2926,7 @@ errr term_init(term *t, int w, int h, int k)
        t->key_head = t->key_tail = 0;
 
        /* Determine the input queue size */
-       t->key_size = k;
+       t->key_size = (u16b)k;
 
        /* Allocate the input queue */
        C_MAKE(t->key_queue, t->key_size, char);
@@ -2949,8 +2937,8 @@ errr term_init(term *t, int w, int h, int k)
        t->hgt = h;
 
        /* Allocate change arrays */
-       C_MAKE(t->x1, h, byte);
-       C_MAKE(t->x2, h, byte);
+       C_MAKE(t->x1, h, TERM_LEN);
+       C_MAKE(t->x2, h, TERM_LEN);
 
 
        /* Allocate "displayed" */