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

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. #include "main.h"
  7. #include "game.h"
  8. #include "menu.h"
  9. #include "config.h"
  10. #include "gfx.h"
  11. #include "scroller.h"
  12.  
  13. #ifdef ALLEGRO_WINDOWS
  14. #define CHAR CHARblablabla
  15. #include <winalleg.h>
  16. #undef CHAR
  17. #endif
  18.  
  19. #ifdef ALLEGRO_LINUX
  20. #include <sys/time.h>
  21. #endif
  22.  
  23. int frames;
  24. int fps;
  25. BITMAP *page;
  26. int show_fps = 0;
  27.  
  28. int fullscreen;
  29. int colordepth;
  30. int joy_ok;
  31.  
  32. int USE_DRS = 1;
  33.  
  34. static int quit = 0;
  35.  
  36. static volatile int ticks = 0;
  37. static void
  38. ticker (void)
  39. {
  40.     ticks++;
  41. }
  42. END_OF_FUNCTION (ticker)
  43.  
  44.    
  45. #define MRAND_MAX 0xFFFF
  46. unsigned int mrand_seed;
  47.  
  48. static int
  49. mrand (void)
  50. {
  51.     mrand_seed = (mrand_seed + 1) * 1103515245 + 12345;
  52.     return (mrand_seed >> 16) % (MRAND_MAX + 1);
  53. }
  54.  
  55. int rnd (int min, int max)
  56. {
  57.     return min + ((max - min) * ((float) mrand () / (float) MRAND_MAX) + 0.5);
  58. }
  59.  
  60. static int oldkeys[KEY_MAX];
  61.  
  62. static void
  63. display_switch (void)
  64. {
  65.     menu_alt_tab ();
  66.     game_alt_tab ();
  67. }
  68.  
  69. void
  70. fix_alt_tab (void)
  71. {
  72.     #if !(defined(ALLEGRO_MSVC) && defined(_DEBUG))
  73.         if (set_display_switch_mode (SWITCH_BACKGROUND))
  74.             set_display_switch_mode (SWITCH_BACKAMNESIA);
  75.             set_display_switch_callback (SWITCH_IN, display_switch);
  76.     #endif
  77. }
  78.  
  79. int
  80. check_key_ex (int k, int fast)
  81. {
  82.     int joy_key=0;
  83.  
  84.     if (oldkeys[k])
  85.         oldkeys[k]--;
  86.  
  87.     if(joy_ok)
  88.     {
  89.         switch(k)
  90.         {
  91.             case KEY_ENTER:
  92.                 joy_key=joy[0].button[0].b;
  93.                 break;
  94.  
  95.             case KEY_LEFT:
  96.                 joy_key=joy[0].stick[0].axis[0].d1;
  97.                 break;
  98.  
  99.             case KEY_RIGHT:
  100.                 joy_key=joy[0].stick[0].axis[0].d2;
  101.                 break;
  102.  
  103.             case KEY_UP:
  104.                 joy_key=joy[0].stick[0].axis[1].d1;
  105.                 break;
  106.  
  107.             case KEY_DOWN:
  108.                 joy_key=joy[0].stick[0].axis[1].d2;
  109.                 break;
  110.         }
  111.     }
  112.  
  113.  
  114.     if (key[k] || joy_key)
  115.     {
  116.         if (!oldkeys[k] || fast)
  117.         {
  118.             oldkeys[k] = FPS;
  119.             return 1;
  120.         }
  121.     }
  122.     else
  123.     {
  124.         oldkeys[k] = 0;
  125.     }
  126.     return 0;
  127. }
  128.  
  129.  
  130. int check_key(int k)
  131. {
  132.     return check_key_ex(k, FALSE);
  133. }
  134.  
  135.  
  136. static int
  137. run_init (void)
  138. {
  139.     DATAFILE *fontdata = load_datafile ("gfx/sword.dat");
  140.  
  141.     if (!fontdata)
  142.     {
  143.         printf ("Could not load font.\n");
  144.         return 1;
  145.     }
  146.     font = fontdata[0].dat;
  147.     if (game_init ())
  148.         return 1;
  149.     
  150.     if (quest_number)
  151.         game_load (quest_number);
  152.     
  153.     menu_init ();    
  154.     return 0;
  155. }
  156.  
  157. void
  158. run_exit (void)
  159. {
  160.     quit = 1;
  161. }
  162.  
  163. static void
  164. run_frame (void)
  165. {
  166.     poll_joystick();
  167.  
  168.     while (keypressed ())
  169.     {
  170.         int k = readkey ();
  171.         
  172.         k >>= 8;
  173.         if (k == KEY_ESC)
  174.         {
  175.             if (scroller_active)
  176.             {
  177.                 scroller_exit ();
  178.                 menu_init ();
  179.                 menu_active = 1;
  180.             }
  181.             else
  182.             if (menu_active)
  183.             {
  184.                 menu_active = 0;
  185.                 game_continue ();
  186.             }
  187.             else
  188.             {
  189.                 menu_init ();
  190.                 menu_active = 1;
  191.             }
  192.         }
  193.     }
  194.     if (scroller_active)
  195.         scroller_frame ();
  196.     else
  197.     if (menu_active)
  198.         menu_run ();
  199.     else
  200.         game_frame ();
  201. }
  202.  
  203. static void
  204. run_render (void)
  205. {
  206.     if (scroller_active)
  207.         scroller_render ();
  208.     else
  209.     if (menu_active)
  210.         menu_render ();
  211.     else
  212.         game_render ();
  213.  
  214.     if (show_fps)
  215.     {
  216.         text_mode (0);
  217.         textprintf_right (screen, font, SCREEN_W, 0, makecol (255, 255, 255), "%d fps", fps);
  218.     }
  219. }
  220.  
  221. static int
  222. scan_int_arg (int argc, char *argv[], const char *arg, int def)
  223. {
  224.     int i;
  225.  
  226.     for (i = 1; i < argc; i++)
  227.     {
  228.         if (!strcmp (argv[i], arg))
  229.         {
  230.             i++;
  231.             if (i < argc)
  232.             {
  233.                 return strtol (argv[i], NULL, 0);
  234.             }
  235.         }
  236.     }
  237.     return def;
  238. }
  239.  
  240.  
  241. static void
  242. close_button (void)
  243. {
  244.     quit = 1;
  245. }
  246.  
  247. extern int _mangled_main (int, char **);
  248. int
  249. main (int argc, char *argv[])
  250. {
  251.     int gframes;
  252.     int framecounttime, framecounter;
  253.     
  254.     if (scan_int_arg (argc, argv, "-monsterstats", 0) == 1)
  255.     {
  256.         int t, i;
  257.         TYPE grid[100][CHAR_NUM];
  258.         int h[4][100]; /* min, avg, max, player_avg */
  259.         int s[4][100];
  260.         int lev_avg[100];
  261.         memset (&grid, 0, sizeof grid);
  262.         memset (&h, 0, sizeof h);
  263.         memset (&s, 0, sizeof s);
  264.         memset (&lev_avg, 0, sizeof lev_avg);
  265.         /* Run 1000 games. */
  266.         for (t = 0; t < 1000; t++)
  267.         {
  268.             int ph, ps;
  269.             char_num = 2;
  270.             list[1].alive = 0;
  271.             /* Create test player. */
  272.             player_roll (&ph, &ps);
  273.             player_create (0, 0, ph, ps);
  274.             list[1].lev = 1;
  275.             for (i = 0; i < 100; i++)
  276.             {
  277.                 int m;
  278.                 list[1].current_level = i;
  279.                 /* Create 8 monsters in level i, and slay them. */
  280.                 for (m = 0; m < 8; m++)
  281.                 {
  282.                     int r = rnd (1, 2);
  283.                     list[2].alive = 0;
  284.                     char_num = 2;
  285.                     char_create (0, 0);
  286.                     if (r == 1) monster_human_create (2, i);
  287.                     if (r == 2) monster_creature_create (2, i);
  288.                     grid[i][list[2].type]++;
  289.                     h[1][i] += list[2].hit;
  290.                     if (t == 0 || list[2].hit < h[0][i])
  291.                         h[0][i] = list[2].hit;
  292.                     if (t == 0 || list[2].hit > h[2][i])
  293.                         h[2][i] = list[2].hit;
  294.                     
  295.                     s[1][i] += list[2].dex;
  296.                     if (t == 0 || list[2].dex < s[0][i])
  297.                         s[0][i] = list[2].dex;
  298.                     if (t == 0 || list[2].dex > s[2][i])
  299.                         s[2][i] = list[2].dex;
  300.                     
  301.                     list[1].fighting = 2;
  302.                     player_won (1);
  303.                     player_try_levelup (1);
  304.                 }
  305.                 h[3][i] += list[1].maxhit;
  306.                 s[3][i] += list[1].dex;
  307.                 lev_avg[i] += list[1].lev;
  308.             }
  309.             fprintf (stderr, ".");
  310.         }
  311.  
  312.         printf ("      Hitpoints        Skill            Player                 Types\n");
  313.         printf ("Lev | Min Avg    Max | Min Avg    Max | Health Skill  Level  | %%\n");
  314.         for (i = 0; i < 100; i++)
  315.         {
  316.             int j;
  317.             printf ("%3i | %3i %6.1f %3i | %3i %6.1f %3i | %6.1f %6.1f %6.1f | ",
  318.                 i, h[0][i], (float)h[1][i] / 8000.0, h[2][i],
  319.                 s[0][i], (float)s[1][i] / 8000.0, s[2][i],
  320.                 (float) h[3][i] / 1000.0, (float) s[3][i] / 1000.0,
  321.                 (float) lev_avg[i] / 1000.0);
  322.             for (j = 0; j < CHAR_NUM; j++)
  323.             {
  324.                 int p = grid[i][j] / 80;
  325.                 if (p)
  326.                 {
  327.                     printf ("%i%%%c%c%c ", p,
  328.                         char_names[j][0], char_names[j][1], char_names[j][2]);
  329.                 }
  330.             }
  331.             printf ("\n");
  332.         }
  333.         
  334.         exit (0);
  335.     }
  336.  
  337.     allegro_init ();
  338.  
  339.     srand ((unsigned) time (NULL));
  340.  
  341.     load_settings ();
  342.     
  343.     /* TODO: all into the config system.. */
  344.     show_fps = scan_int_arg (argc, argv, "-s", show_fps);
  345.  
  346.     USE_DRS = 1;
  347.  
  348. #define WINDOWED_MODE GFX_AUTODETECT_WINDOWED
  349.  
  350.  
  351. #ifdef ALLEGRO_MSVC
  352. #ifdef _DEBUG
  353. #undef WINDOWED_MODE
  354. #define WINDOWED_MODE GFX_GDI
  355. USE_DRS = 0;
  356. #endif
  357. #endif
  358.  
  359.     set_color_depth (colordepth);
  360.     if (set_gfx_mode (fullscreen ? GFX_AUTODETECT_FULLSCREEN : WINDOWED_MODE, 640, 480, 0, 0) < 0)
  361.     {
  362.         allegro_message ("Cannot set graphics mode.\n");
  363.         exit (-1);
  364.     }
  365.  
  366.     fix_alt_tab ();    
  367.  
  368.     #if (ALLEGRO_SUB_VERSION == 0)
  369.         set_window_close_button (1);
  370.         set_window_close_hook (close_button);
  371.     #else
  372.         set_close_button_callback (close_button);
  373.     #endif
  374.     
  375.     if (colordepth == 8)
  376.     {
  377.         PALETTE pal;
  378.         rgb_map = malloc (sizeof *rgb_map);
  379.         generate_332_palette (pal);
  380.         memset (&pal[0], 0, sizeof pal[0]);
  381.         create_rgb_table (rgb_map, pal, NULL);
  382.         set_palette (pal);
  383.     }
  384.     set_color_conversion (COLORCONV_TOTAL | COLORCONV_KEEP_TRANS);
  385.  
  386.     install_keyboard ();
  387.  
  388.     joy_ok=(!install_joystick(JOY_TYPE_AUTODETECT) && num_joysticks);
  389.  
  390.     install_timer ();
  391.  
  392.     LOCK_FUNCTION (ticker);
  393.     LOCK_VARIABLE (ticks);
  394.  
  395.     install_int_ex (ticker, BPS_TO_TIMER (FPS));
  396.  
  397.     install_sound (DIGI_AUTODETECT, MIDI_NONE, NULL);
  398.  
  399.     page = create_bitmap (SCREEN_W, SCREEN_H);
  400.  
  401.     if (run_init ())
  402.     {
  403.         allegro_message ("Data could not be found. Please check your installation.");
  404.         return 1;
  405.     }
  406.  
  407.     framecounter = 0;
  408.     framecounttime = ticks;
  409.     gframes = ticks;
  410.     frames = ticks;
  411.     while (!quit)
  412.     {
  413.         while (frames <= ticks)
  414.         {
  415.             run_frame ();
  416.             frames++;
  417.         }
  418.         if (gframes < frames)
  419.         {
  420.             run_render ();
  421.  
  422.             gframes = frames;
  423.             framecounter++;
  424.  
  425.             if (ticks - framecounttime >= FPS)
  426.             {
  427.                 fps = framecounter;
  428.                 framecounter = 0;
  429.                 framecounttime = ticks;
  430.             }
  431.  
  432.         }
  433.         #ifdef ALLEGRO_WINDOWS
  434.             Sleep (1);
  435.         #endif
  436.         #ifdef ALLEGRO_UNIX
  437.         {
  438.             /* This way we use 0% CPU in linux. */
  439.             struct timeval timeval = {0, 1};
  440.             select (0, NULL, NULL, NULL, &timeval);
  441.         }
  442.         #endif
  443.     }
  444.  
  445.     remove ("data/last.log");
  446.     save_settings ();
  447.     
  448.     run_exit ();
  449.     return 0;
  450. }
  451.  
  452. END_OF_MAIN ()
  453.