home *** CD-ROM | disk | FTP | other *** search
/ GameStar Special 2004 August / GSSH0804.iso / Rollenspiele / SwordOfFargoal / fargoal20030731b.exe / fargoal / src / message.c < prev    next >
C/C++ Source or Header  |  2003-07-31  |  4KB  |  226 lines

  1. #include "main.h"
  2. #include "game.h"
  3. #include "gfx.h"
  4.  
  5. static FILE *messagefile = NULL;
  6.  
  7. typedef struct MESSAGE MESSAGE;
  8. struct MESSAGE
  9. {
  10.     int delay;
  11.     SAMPLE *sound;
  12.     int volume, pitch, panning;
  13.     char string[100];
  14. };
  15.  
  16. static MESSAGE messages[10] = { {0, NULL, 0, 0, 0, ""} };
  17. static int message_rotate = 0;
  18. static int message_current = 0;
  19. static int message_time = 0;
  20. static int message_idle = 0;
  21. static int message_render = 0;
  22.  
  23. static void
  24. file_copy (char const *src, char const *dst, int html)
  25. {
  26.     FILE *file_src;
  27.     long s;
  28.     s = file_size (src);
  29.     file_src = fopen (src, "rb");
  30.     if (file_src)
  31.     {
  32.         FILE *file_dst;
  33.         file_dst = fopen (dst, "wb");        
  34.         if (file_dst)
  35.         {
  36.             char *buf;
  37.             buf = malloc (s);
  38.             fread (buf, 1, s, file_src);
  39.             
  40.             if (html)
  41.             {
  42.                 fprintf (file_dst, "<html><body><pre>\n");
  43.             }
  44.             else
  45.             {
  46.                 char *start, *end;
  47.                 start = strstr (buf, "<pre>");
  48.                 if (start)
  49.                 {
  50.                     buf = start + 5;
  51.                     while (*buf < ' ')
  52.                         buf++;
  53.  
  54.                     end = strstr (buf, "</pre>");
  55.                     if (end)
  56.                     {
  57.                         s = end - buf;
  58.                     }
  59.                     
  60.                 }
  61.                 
  62.             }
  63.             fwrite (buf, 1, s, file_dst);
  64.             if (html)
  65.             {
  66.                 fprintf (file_dst, "</pre></body></html>");
  67.             }
  68.             fclose (file_dst);
  69.         }
  70.         fclose (file_src);
  71.     }
  72. }
  73.  
  74. void
  75. messages_init (char const *filename)
  76. {
  77.     if (messagefile)
  78.         fclose (messagefile);
  79.     
  80.     if (filename)
  81.     {
  82.         file_copy (filename, "data/last.log", 0);
  83.         messagefile = fopen ("data/last.log", "a");
  84.     }
  85.     else
  86.         messagefile = fopen ("data/last.log", "w");
  87. }
  88.  
  89. /* Copy current messages to given file. */
  90. void
  91. messages_exit (char const *filename)
  92. {
  93.     if (messagefile)
  94.         fclose (messagefile);
  95.     
  96.     file_copy ("data/last.log", filename, 1);
  97.     
  98.     messagefile = fopen ("data/last.log", "a");
  99. }
  100.  
  101. static void
  102. _message (int delay, SAMPLE * sound, int volume, int pitch, int panning, char *str)
  103. {
  104.     message_rotate++;
  105.  
  106.     if (message_rotate == 10)
  107.         message_rotate = 0;
  108.  
  109.     messages[message_rotate].string[0] = '\0';
  110.     messages[message_rotate].delay = delay;
  111.     messages[message_rotate].sound = sound;
  112.     messages[message_rotate].volume = volume;
  113.     messages[message_rotate].pitch = pitch;
  114.     messages[message_rotate].panning = panning;
  115.     paused += delay;
  116.     
  117.     if (str)
  118.     {
  119.         strcpy (messages[message_rotate].string, str);
  120.         strcat (messages[message_rotate].string, "   ");
  121.         update_stats ();
  122.         if (messagefile)
  123.             fprintf (messagefile, "%s\n", messages[message_rotate].string);
  124.     }
  125. }
  126.  
  127. void
  128. message_ex (int delay, SAMPLE * sound, int volume, int pitch, int panning, char const *format, ...)
  129. {
  130.     if (format)
  131.     {
  132.         char str[100];
  133.         va_list arg;
  134.         va_start (arg, format);
  135.         vsnprintf (str, 100, format, arg);
  136.         va_end (arg);
  137.         _message (delay, sound, volume, pitch, panning, str);
  138.     }
  139.     else
  140.         _message (delay, sound, volume, pitch, panning, NULL);
  141. }
  142.  
  143. void
  144. message (int delay, SAMPLE * sound, char const *format, ...)
  145. {
  146.     if (format)
  147.     {
  148.         char str[100];
  149.         va_list arg;
  150.         va_start (arg, format);
  151.         vsnprintf (str, 100, format, arg);
  152.         va_end (arg);
  153.         _message (delay, sound, 0, 0, 0, str);
  154.     }
  155.     else
  156.         _message (delay, sound, 0, 0, 0, NULL);
  157. }
  158.  
  159. void
  160. messages_update (void)
  161. {
  162.     if (message_time > 0)
  163.     {
  164.         message_render = 1;
  165.         message_time--;            
  166.     }
  167.     else if (message_current != message_rotate)
  168.     {
  169.         MESSAGE *m;
  170.         message_current++;
  171.         if (message_current == 10)
  172.             message_current = 0;
  173.  
  174.         m = &messages[message_current];
  175.         
  176.         message_time = messages[message_current].delay;
  177.         message_idle = 0;
  178.         message_render = 1;
  179.         
  180.         if (messages[message_current].sound)
  181.             play_sample (messages[message_current].sound,
  182.                 250 - rnd (0, m->volume),
  183.                 128 + rnd (-m->panning, m->panning),
  184.                 1000 + rnd (-m->pitch, m->pitch * 2), 0);
  185.     }
  186.     else
  187.     {
  188.         message_idle++;
  189.         if (message_idle > FPS * 4 && messages[message_current].string[0])
  190.         {
  191.             message (FPS / 2, NULL, NULL);
  192.             paused -= FPS / 2;
  193.         }
  194.     }
  195. }
  196.  
  197. void
  198. messages_render (void)
  199. {
  200.     if (message_render)
  201.     {
  202.         int p = message_current - 1;
  203.         int l;
  204.         int f = FPS / 2;
  205.         int m = message_time;
  206.  
  207.         if (m > f)
  208.             m = f;
  209.         if (p < 0)
  210.             p = 9;
  211.  
  212.         l = text_length (font, messages[p].string);
  213.         blit (title, page, 0, 0, 0, 0, SCREEN_W, 18);
  214.         text_mode (-1);
  215.         if (m)
  216.             textout_right (page, font, messages[p].string, 4 + l * m / f, 4, layout_color (LC_MESSAGE));
  217.         textout (page, font, messages[message_current].string, 4 + l * m / f, 4, layout_color (LC_MESSAGE));
  218.     }
  219. }
  220.  
  221. int
  222. messages_updated (void)
  223. {
  224.     return message_render;
  225. }
  226.