Explorar o código

Added ^fXXYYfilename.

This displays an ANSI file starting
at X,Y location.  Y++ for each line.

"skull" is updated with spaces around it
so it shows up better.
skull2 doesn't.  (Compare and see?)
guy also has spaces around him on the
left side.  The right side does not.
bugz %!s(int64=4) %!d(string=hai) anos
pai
achega
2ff3ba0796
Modificáronse 5 ficheiros con 113 adicións e 57 borrados
  1. 1 2
      hh/goofy_head.ans
  2. 8 8
      hh/guy.ans
  3. 12 14
      hh/skull.ans
  4. 5 7
      hh/skull2.ans
  5. 87 26
      mystic.cpp

+ 1 - 2
hh/goofy_head.ans

@@ -20,5 +20,4 @@
 詗詗詗詗詗詗詗詗詗詗詗詗詗詗詗詗�  葔詗詗詗詒�   嗖詗詗詗詗詗詗詗詗詗詗詗詗詗詗
 詗詗詗詗詗詗詗詗詗詗詗詗詗詗詗詗�  詘嗈嗈嗈嗈嗖  詗詗詗詗詗詗詗詗詗詗詗詗詗詗詗
 詗詗詗By:詗詗詗詗詗詗詗詗詗詗詗詗  詗詗詗詗詗詗  詗詗詗詗詗詗詗詗詗詗詗詗詗詗詗
-�Pretty Please詗詗詗詗詗詗詗詗詗�  詗詗詗詗詗詗  詗詗詗詗詗詗詗詗詗詗詗詗詗詗詗
-
+�Pretty Please詗詗詗詗詗詗詗詗詗�  詗詗詗詗詗詗  詗詗詗詗詗詗詗詗詗詗詗詗詗詗詗

+ 8 - 8
hh/guy.ans

@@ -1,8 +1,8 @@
-ワ
-   ロ
-゚゚゚゚ロロロ゚゚
-    ロロロ
-    ロロロ
-    ロ ロ
-    ロ ロ
-   ゚゚ ゚゚
+         ワ 
+         ロ 
+ ゚゚゚゚ロロロ゚゚ 
+     ロロロ 
+     ロロロ 
+     ロ ロ 
+     ロ ロ 
+    ゚゚ ゚゚ 

+ 12 - 14
hh/skull.ans

@@ -1,15 +1,13 @@
 
-アーーーイイア
-   アーーーロロロロイイーー
-  アーーーロロロロロロイイーー
- アアアアーロロロロロロロイーーアー
- アアロロアーロロロロロロアーローー
- アーーアイアアロロローアイアアーロ
-  アーーアーロロ ロローアアロロ
-   アーーロロ イ ロローーー
-ローロイアロロロロ
-ーー゙ン イン ー
-
-ーイン ンー゙ー
-アーー ーー
-
+      アーーーイイア       
+   アーーーロロロロイイーー     
+  アーーーロロロロロロイイーー   
+ アアアアーロロロロロロロイーーアー 
+ アアロロアーロロロロロロアーローー 
+ アーーアイアアロロローアイアアーロ 
+  アーーアーロロ ロローアアロロ  
+   アーーロロ イ ロローーー     
+     ローロイアロロロロ     
+     ーー゙ン イン ー     
+     ーイン ンー゙ー      
+      アーー ーー       

+ 5 - 7
hh/skull2.ans

@@ -1,5 +1,5 @@
 
-アーーーイイア
+      アーーーイイア
    アーーーロロロロイイーー
   アーーーロロロロロロイイーー
  アアアアーロロロロロロロイーーアー
@@ -7,9 +7,7 @@
  アーーアイアアロロローアイアアーロ
   アーーアーロロ ロローアアロロ
    アーーロロ イ ロローーー
-ローロイアロロロロ
-ーー゙ン イン ー
-
-ーイン ンー゙ー
-アーー ーー
-
+     ローロイアロロロロ
+     ーー゙ン イン ー
+     ーイン ンー゙ー
+      アーー ーー

+ 87 - 26
mystic.cpp

@@ -150,7 +150,7 @@ const char *repr(const char *data) {
   return buffer;
 }
 
-#define CHUNKSIZE 32
+#define CHUNKSIZE 40
 
 void zf_repr_chunk(int LOG_LEVEL, const char *chunk) {
   const char *output = repr(chunk);
@@ -760,6 +760,45 @@ int send_file(int fd, char *filename) {
   return 1;
 }
 
+void send_goto(int fd, int x, int y) {
+  char gbuffer[16];
+  char * cp;
+
+  sprintf(gbuffer, "\x1b[%d;%dH", y, x);
+  write(fd, gbuffer, strlen(gbuffer));
+}
+
+int send_file(int fd, int x, int y, char *filename) {
+  FILE *fp;
+  char buffer[100];
+  int read;
+  int pos;
+  fp = fopen(filename, "rb");
+  if (fp == NULL) {
+    ZF_LOGD("Failed to open %s", filename);
+    return 0;
+  }
+
+  send_goto(fd, x,y);
+  y++;
+  char *cp, * last_cp;
+
+  while ((read = fread(buffer, 1, sizeof(buffer), fp)) > 0) {
+    buffer[read] = 0;
+    last_cp = buffer;
+    while ( ( cp = strchr(last_cp, '\n')) != NULL) {
+      *cp = 0;
+      write(fd, last_cp, strlen(last_cp)); 
+      send_goto(fd, x,y);
+      y++;
+      last_cp = cp + 1;
+    };
+    write(fd, last_cp, strlen(last_cp));
+  };
+  fclose(fp);
+  return 1;
+}
+
 /**
  * process_trigger( fd, *cp )
  *
@@ -772,7 +811,7 @@ int send_file(int fd, char *filename) {
 const char *process_trigger(int fd, const char *cp) {
   char ch;
   int i, x, y;
-  ch = toupper(*cp);
+  ch = *cp;
   cp++;
 
   switch (ch) {
@@ -817,7 +856,23 @@ const char *process_trigger(int fd, const char *cp) {
     write_color(fd, i);
   } break;
 
-  case 'F': {
+  case 'F':
+  case 'f': {
+    int x, y, pos = 0;
+    if (ch == 'f') {
+      pos = 1;
+      x = (*cp) - '0';
+      cp++;
+      x *= 10;
+      x += (*cp) - '0';
+      cp++;
+      y = (*cp) - '0';
+      cp++;
+      y *= 10;
+      y += (*cp) - '0';
+      cp++;
+      ZF_LOGI( "file at (%d, %d)", x, y);
+    }
     // Ok, look for filename
     char ansifile[32] = "./hh/";
     char *ap = ansifile + strlen(ansifile);
@@ -830,7 +885,11 @@ const char *process_trigger(int fd, const char *cp) {
     strcat(ansifile, ".ans");
     cp++;
     ZF_LOGD("FILE [%s]", ansifile);
-    send_file(fd, ansifile);
+    if (pos) {
+      send_file(fd, x, y, ansifile);
+    } else {
+      send_file(fd, ansifile);
+    };
   } break;
 
   case 'G': {
@@ -966,7 +1025,7 @@ void render(int fd, const char *string_out) {
 
   reset_render();
 
-  ZF_LOGD("render(%d, %s)", fd, repr(string_out));
+  ZF_LOGV("render(%d, %s)", fd, repr(string_out));
 
   // Check our time from time to time.
   // If we start running long, disable sleeps.
@@ -1066,9 +1125,7 @@ void harry_idle_event(int fd) {
   */
 
   sprintf(buffer, "^S2^C%02d%s^P2^CR^D%02d", color, cp, (int)strlen(cp));
-
   ZF_LOGD("harry_event: render(%d, \"%s\")", fd, buffer);
-
   render(fd, buffer);
 }
 
@@ -1358,7 +1415,6 @@ int mangle(int fd, char *buffer) {
 
   ZF_LOGI("mangle:");
   ZF_LOGI_REPR(buffer);
-  ZF_LOGI("mangle(%s)", repr(buffer));
   // strcpy(work, buffer);
 
   /*
@@ -1375,11 +1431,10 @@ int mangle(int fd, char *buffer) {
       display ANSI graphic file, with delays ... then CLS
    */
   const char *ANSI_CLS = "\x1b[2J";
-  static int ANSI_CLS_count = 0; // count the number we've seen
-
   cp = strstr(buffer, ANSI_CLS);
 
   if (cp != NULL) {
+    static int ANSI_CLS_count = 0; // count the number we've seen
     ZF_LOGI("seen: ANSI_CLS");
     ANSI_CLS_count++;
 
@@ -1398,23 +1453,20 @@ int mangle(int fd, char *buffer) {
       if (random_activate(3)) {
         char display[100] = "";
         int needs_cls = 0;
+
         struct file_need {
           const char *filename;
           int cls;
-        } possibles[] = {
-            {"goofy_head", 1},
-            {
-                "bat",
-                1,
-            },
-            {"panther", 1},
-            {"wolf", 1}
-
-            //          bat.ans       creature.ans  goofy_head.ans  panther.ans
-            //          skull.ans
-            // blinkman.ans  dog.ans       guy.ans         skull2.ans   wolf.ans
+          int rand_pos;
+        } possibles[] = {{"goofy_head", 1, 0}, {"bat", 1, 0},
+                         {"panther", 1, 0},    {"wolf", 1, 0},
+                         {"skull", 0, 1},      {"skull2", 0, 1},
+                         {"guy", 0, 1},        {"blinkman", 0, 1}};
+
+        //          bat.ans       creature.ans  goofy_head.ans  panther.ans
+        //          skull.ans
+        // blinkman.ans  dog.ans       guy.ans         skull2.ans   wolf.ans
 
-        };
         static LastSeen last_files(2);
         int r;
 
@@ -1422,6 +1474,16 @@ int mangle(int fd, char *buffer) {
           r = randint((sizeof(possibles) / sizeof(file_need)));
         } while (last_files.seen_before(r));
 
+        int x, y;
+        x = randint(50) + 1;
+        y = randint(12) + 1;
+        char fgoto[10];
+        if (possibles[r].rand_pos) {
+          sprintf(fgoto, "^f%02d%02d", x, y);
+        } else {
+          strcpy(fgoto, "^F");
+        }
+
         // (2); // (sizeof(possibles) / sizeof(file_need)) - 1);
         needs_cls = possibles[r].cls;
 
@@ -1433,8 +1495,8 @@ int mangle(int fd, char *buffer) {
         // I tried a ^P2 before doing this .. but I'd rather have the picture up
         // right away I think.
 
-        sprintf(display, "%s^F%s.^P3%s", needs_cls ? "\x1b[2J" : "\n\r\n\r",
-                possibles[r].filename, restore_color);
+        sprintf(display, "%s%s%s.^P3%s", needs_cls ? "\x1b[2J" : "",
+                fgoto, possibles[r].filename, restore_color);
 
         ZF_LOGI("mangle(ANSI_CLS): %d file inserted %s", r, repr(display));
 
@@ -1507,7 +1569,6 @@ int mangle(int fd, char *buffer) {
           if (string_insert(buffer, BSIZE * 4, cp - buffer, display)) {
             ZF_LOGI("mangle(ANSI_CLS):");
             ZF_LOGI_REPR(buffer);
-            ZF_LOGI("mangle(ANSI_CLS): [%s]", repr(buffer));
             need_render = 1;
 
             /*