OSDN Git Service

切り裂きの大鎌『ブラッディ・ムーン』に関する変更.
[hengband/hengband.git] / src / chuukei.c
index 34eae1e..99875c8 100644 (file)
@@ -77,8 +77,34 @@ int recv(int s, char *buffer, size_t buflen, int flags)
 }
 #endif
 
+/*
+ * Original hooks
+ */
+static errr (*old_xtra_hook)(int n, int v);
+static errr (*old_curs_hook)(int x, int y);
+static errr (*old_bigcurs_hook)(int x, int y);
+static errr (*old_wipe_hook)(int x, int y, int n);
+static errr (*old_text_hook)(int x, int y, int n, byte a, cptr s);
+
+
+static void disable_chuukei_server(void)
+{
+       term *t = angband_term[0];
+
+        if (!chuukei_server) return;
+
+       chuukei_server = FALSE;
+
+       t->xtra_hook = old_xtra_hook;
+       t->curs_hook = old_curs_hook;
+       t->bigcurs_hook = old_bigcurs_hook;
+       t->wipe_hook = old_wipe_hook;
+       t->text_hook = old_text_hook;
+}
+
+
 /* ANSI C¤Ë¤è¤ì¤ÐstaticÊÑ¿ô¤Ï0¤Ç½é´ü²½¤µ¤ì¤ë¤¬°ì±þ½é´ü²½¤¹¤ë */
-static errr init_chuukei()
+static errr init_chuukei(void)
 {
        fresh_queue.next = fresh_queue.tail = 0;
        ring.wptr = ring.rptr = ring.inlen = 0;
@@ -114,8 +140,8 @@ static errr insert_ringbuf(char *buf)
        /* ¥Ð¥Ã¥Õ¥¡¤ò¥ª¡¼¥Ð¡¼ */
        if (ring.inlen + len >= RINGBUF_SIZE)
        {
-               chuukei_server = FALSE;
-               chuukei_client = FALSE;
+               if (chuukei_server) disable_chuukei_server();
+               else chuukei_client = FALSE;
 
                prt("¥Ð¥Ã¥Õ¥¡¤¬°î¤ì¤Þ¤·¤¿¡£¥µ¡¼¥Ð¤È¤ÎÀܳ¤òÀÚÃǤ·¤Þ¤¹¡£", 0, 0);
                inkey();
@@ -168,11 +194,9 @@ void flush_ringbuf(void)
        while (1)
        {
                fd_set tmp_fdset;
-               struct timeval tmp_tv;
                int result;
 
                tmp_fdset = fdset;
-               tmp_tv = tv;
 
                /* ¥½¥±¥Ã¥È¤Ë¥Ç¡¼¥¿¤ò½ñ¤­¹þ¤á¤ë¤«¤É¤¦¤«Ä´¤Ù¤ë */
                select(sd+1, (fd_set *)NULL, &tmp_fdset, (fd_set *)NULL, &tv);
@@ -185,7 +209,7 @@ void flush_ringbuf(void)
                if (result <= 0)
                {
                        /* ¥µ¡¼¥Ð¤È¤ÎÀܳÃÇ¡© */
-                       chuukei_server = FALSE;
+                       disable_chuukei_server();
 
                        prt("¥µ¡¼¥Ð¤È¤ÎÀܳ¤¬ÀÚÃǤµ¤ì¤Þ¤·¤¿¡£", 0, 0);
                        inkey();
@@ -225,7 +249,7 @@ void flush_ringbuf(void)
                if (result <= 0)
                {
                        /* ¥µ¡¼¥Ð¤È¤ÎÀܳÃÇ¡© */
-                       chuukei_server = FALSE;
+                       disable_chuukei_server();
 
                        prt("¥µ¡¼¥Ð¤È¤ÎÀܳ¤¬ÀÚÃǤµ¤ì¤Þ¤·¤¿¡£", 0, 0);
                        inkey();
@@ -249,7 +273,7 @@ static int read_chuukei_prf(cptr prf_name)
        char buf[1024];
        FILE *fp;
 
-       path_build(buf, 1024, ANGBAND_DIR_XTRA, prf_name);
+       path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA, prf_name);
        fp = my_fopen(buf, "r");
 
        if (!fp) return (-1);
@@ -259,7 +283,7 @@ static int read_chuukei_prf(cptr prf_name)
        server_name[0] = 0;
        browse_delay = DEFAULT_DELAY;
 
-       while (0 == my_fgets(fp, buf, 1024))
+       while (0 == my_fgets(fp, buf, sizeof(buf)))
        {
                /* ¥µ¡¼¥Ð̾ */
                if (!strncmp(buf, "server:", 7))
@@ -414,7 +438,7 @@ int connect_chuukei_server(char *prf_name)
                        bind = (err == noErr);
            }
            if (err == noErr){
-               OTInitInetAddress(&inAddr, server_port, host_addr);
+               OTInitInetAddress(&inAddr, server_port, host_addr);
                        
                        sndCall.addr.len        = sizeof(InetAddress);                          
                        sndCall.addr.buf        = (unsigned char*) &inAddr;
@@ -459,101 +483,6 @@ int connect_chuukei_server(char *prf_name)
 #endif
 }
 
-#ifdef SJIS
-static void sjis2euc(char *str)
-{
-       int i, l;
-       unsigned char c1, c2;
-       int kanji = 0;
-       int iseuc = 1;
-       l = strlen(str);
-
-       for (i = 0; i < l; i++)
-       {
-               c1 = str[i];
-               if (c1 & 0x80) kanji = 1;
-               if (c1>=0x80 && (c1 < 0xa1 || c1 > 0xfe)) iseuc = 0;
-       }
-
-       if (kanji && !iseuc)
-       {
-               unsigned char tmp[256];
-
-               for (i = 0; i < l; i++)
-               {
-                       c1 = str[i];
-                       if (c1 & 0x80)
-                       {
-                               i++;
-                               c2 = str[i];
-                               if (c2 >= 0x9f)
-                               {
-                                       c1 = c1 * 2 - (c1 >= 0xe0 ? 0xe0 : 0x60);
-                                       c2 += 2;
-                               }
-                               else
-                               {
-                                       c1 = c1 * 2 - (c1 >= 0xe0 ? 0xe1 : 0x61);
-                                       c2 += 0x60 + (c2 < 0x7f);
-                               }
-                               tmp[i - 1] = c1;
-                               tmp[i] = c2;
-                       }
-                       else
-                               tmp[i] = c1;
-               }
-               tmp[l] = 0;
-               strcpy(str, tmp);
-       }
-}  
-
-static void euc2sjis(char *str)
-{
-       int i, l;
-       unsigned char c1, c2;
-       int kanji = 0;
-       int iseuc = 1;
-       l = strlen(str);
-
-       for (i = 0; i < l; i++)
-       {
-               c1 = str[i];
-               if (c1 & 0x80)  kanji = 1;
-               if (c1>=0x80 && (c1 < 0xa1 || c1 > 0xfe)) iseuc = 0;
-       }
-       if (kanji && iseuc)
-       {
-               unsigned char   tmp[256];
-
-               for (i = 0; i < l; i++)
-               {
-                       c1 = str[i];
-                       if (c1 & 0x80)
-                       {
-                               i++;
-                               c2 = str[i];
-                               if (c1 % 2)
-                               {
-                                       c1 = (c1 >> 1) + (c1 < 0xdf ? 0x31 : 0x71);
-                                       c2 -= 0x60 + (c2 < 0xe0);
-                               }
-                               else
-                               {
-                                       c1 = (c1 >> 1) + (c1 < 0xdf ? 0x30 : 0x70);
-                                       c2 -= 2;
-                               }
-
-                               tmp[i - 1] = c1;
-                               tmp[i] = c2;
-                       }
-                       else
-                               tmp[i] = c1;
-               }
-               tmp[l] = 0;
-               strcpy(str, tmp);
-       }
-}  
-#endif
 
 /* str¤¬Æ±¤¸Ê¸»ú¤Î·«¤êÊÖ¤·¤«¤É¤¦¤«Ä´¤Ù¤ë */
 static bool string_is_repeat(char *str, int len)
@@ -578,13 +507,11 @@ static bool string_is_repeat(char *str, int len)
        return (TRUE);
 }
 
-void send_text_to_chuukei_server(int x, int y, int len, int col, char *str)
+static errr send_text_to_chuukei_server(int x, int y, int len, byte col, cptr str)
 {
        char buf[1024];
        char buf2[1024];
 
-       if (!chuukei_server || Term != angband_term[0]) return;
-
        strncpy(buf2, str, len);
        buf2[len] = '\0';
 
@@ -605,45 +532,92 @@ void send_text_to_chuukei_server(int x, int y, int len, int col, char *str)
        }
 
        insert_ringbuf(buf);
+
+       return (*old_text_hook)(x, y, len, col, str);
 }
 
-void send_wipe_to_chuukei_server(int x, int y, int len)
+static errr send_wipe_to_chuukei_server(int x, int y, int len)
 {
        char buf[1024];
 
-       if (!chuukei_server || Term != angband_term[0]) return;
-
        sprintf(buf, "w%c%c%c", x+1, y+1, len);
 
        insert_ringbuf(buf);
+
+       return (*old_wipe_hook)(x, y, len);
 }
 
-void send_xtra_to_chuukei_server(int n)
+static errr send_xtra_to_chuukei_server(int n, int v)
 {
        char buf[1024];
 
-       if (!chuukei_server || Term != angband_term[0]) return;
-       sprintf(buf, "x%c", n+1);
+       (void)v;
 
-       insert_ringbuf(buf);
-
-       if (n == TERM_XTRA_FRESH)
+       if (n == TERM_XTRA_CLEAR || n == TERM_XTRA_FRESH || n == TERM_XTRA_SHAPE)
        {
-               sprintf(buf, "d%ld", get_current_time() - epoch_time);
+               sprintf(buf, "x%c", n+1);
+               
                insert_ringbuf(buf);
+               
+               if (n == TERM_XTRA_FRESH)
+               {
+                       sprintf(buf, "d%ld", get_current_time() - epoch_time);
+                       insert_ringbuf(buf);
+               }
        }
+
+       /* Verify the hook */
+       if (!old_xtra_hook) return -1;
+
+       return (*old_xtra_hook)(n, v);
 }
 
-void send_curs_to_chuukei_server(int x, int y)
+static errr send_curs_to_chuukei_server(int x, int y)
 {
        char buf[1024];
 
-       if (!chuukei_server || Term != angband_term[0]) return;
        sprintf(buf, "c%c%c", x+1, y+1);
 
        insert_ringbuf(buf);
+
+       return (*old_curs_hook)(x, y);
+}
+
+static errr send_bigcurs_to_chuukei_server(int x, int y)
+{
+       char buf[1024];
+
+       sprintf(buf, "C%c%c", x+1, y+1);
+
+       insert_ringbuf(buf);
+
+       return (*old_bigcurs_hook)(x, y);
 }
 
+
+/*
+ * Prepare z-term hooks to call send_*_to_chuukei_server()'s
+ */
+void prepare_chuukei_hooks(void)
+{
+       term *t0 = angband_term[0];
+
+       /* Save original z-term hooks */
+       old_xtra_hook = t0->xtra_hook;
+       old_curs_hook = t0->curs_hook;
+       old_bigcurs_hook = t0->bigcurs_hook;
+       old_wipe_hook = t0->wipe_hook;
+       old_text_hook = t0->text_hook;
+
+       /* Prepare z-term hooks */
+       t0->xtra_hook = send_xtra_to_chuukei_server;
+       t0->curs_hook = send_curs_to_chuukei_server;
+       t0->bigcurs_hook = send_bigcurs_to_chuukei_server;
+       t0->wipe_hook = send_wipe_to_chuukei_server;
+       t0->text_hook = send_text_to_chuukei_server;
+}
+
+
 static int read_sock(void)
 {
        char buf[1024];
@@ -703,7 +677,7 @@ static int read_sock(void)
 
 #ifndef WINDOWS
 /* WinÈǤÎÃæÅÀ¤ÈÊɤÎƦÉå¤ò¥Ô¥ê¥ª¥É¤È¥·¥ã¡¼¥×¤Ë¤¹¤ë¡£ */
-void win2unix(int col, char *buf)
+static void win2unix(int col, char *buf)
 {
        char kabe;
        if ( col == 9 ) kabe = '%';
@@ -819,6 +793,9 @@ static bool flush_ringbuf_client(void)
                case 'c':
                        (void)((*angband_term[0]->curs_hook)(x, y));
                        break;
+               case 'C':
+                       (void)((*angband_term[0]->bigcurs_hook)(x, y));
+                       break;
                }
        }