home *** CD-ROM | disk | FTP | other *** search
/ The Best of Select: Games 9 / CD_1.iso / kids / apool / apool.h < prev    next >
C/C++ Source or Header  |  1995-04-23  |  8KB  |  195 lines

  1. /* This is "apool.h", part of the pool (billiards)-program
  2.                    
  3.                      "ANOTHER POOL" (V 0.97).
  4.              
  5.    "apool.h" includes the constants, prototype and global variables.
  6.  
  7.    Copyright (C) 1995 by Gerrit Jahn (email: ub1g@rz.uni-karlsruhe.de)
  8.  
  9.    "ANOTHER POOL" (V 0.97) is free software; you can redistribute it 
  10.    and/or modify it under the terms of the GNU General Public License 
  11.    as published by the Free Software Foundation; either version 2 of 
  12.    the License, or (at your option) any later version.
  13.  
  14.    This program is distributed in the hope that it will be useful,
  15.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.    GNU General Public License for more details.
  18.  
  19.    You should have received a copy of the GNU General Public License
  20.    along with GNU CC; see the file COPYING.  If not, write to
  21.    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  22.  
  23. /* ------------------------------ apool.h ------------------------------ */
  24.  
  25. #include <stdlib.h>
  26. #include <stdio.h>
  27.  
  28. /*#define BANDEN 9 Anz. der "Banden", Zeile weg -> Proc. "unkompiliert" */
  29. #define LEFT 20        /* Bildschirmgrenze links, rechts, oben, unten  */
  30. #define RIGHT 620   
  31. #define UP 70
  32. #define DOWN 370
  33. #define BALLS 16    /* Anzahl der Bälle */
  34. #define DIFFX (double)(RIGHT-LEFT)    /* "Länge u. 2* Breite in Pixeln */
  35. #define RADIUS 8.0 /* Radius der Kugeln in Pixel */
  36. #define MSG printf("\n\n ANOTHER POOL (V 0.97)\n\n")
  37. /* #define RADIUSL 39 */        /* Radius der 6 Löcher */
  38. #define SPINPOSX 600    /* Position der Kugel für Spineinstellung (x, y) */
  39. #define SPINPOSY 430
  40. #define ROLL (5.0/7.0)    /* Anteil Transl.- zu Ges.energ. bei vollst. Rollen */
  41. /*#define ALPHA 0.005*/    /* Umwandlungsfaktor von Transl. zu Rot.-geschw */
  42. /*#define BETA  0.00008*/    /* "Bohr-Reibung" */
  43. /*#define DELTA 0.00000005*/    /* Roll-Reibung (viel zu groß !!! ) */
  44. /*#define ETA   0.0000001*/    /* Gleit-Reibung */
  45. /*#define CETA 0.001*/        /*  Umwandlung von Spin in Geschwindigkeit */
  46. /*#define THETA 0.001*/        /* (Extra)-Dämpfung des Spins */
  47. /*#define BANDES 0.3 */        /* Faktor, der WW Effet-Bande "verfeinert" */
  48. /*#define BANDEREF 0.95*/    /* 1-Geschw.verlust b. Band.koll. (v_trans) */
  49. /*#define SPINC 0.3*/    /*(1-max.Abnahme) des Spins bei Koll. zweier Kugeln */
  50. #define RND ((int)(2.0*rand()/RAND_MAX+0.5)-1)
  51. #define XAB (sqrt(4*RADIUS*RADIUS-(RADIUS+1)*(RADIUS+1))+1.5)
  52. /*#define MASSE_WEISS  1.05*/    /* weiße Kugel schwerer als die bunten .... */
  53. #define MSG2 msg(\
  54. "left button: cue, middle button: set spin, right button: set power")
  55. #define SKALP( a,b ) ((a).x*(b).x+(a).y*(b).y)    /* Skalarprodukt */
  56. #define BETR( a ) sqrt( SKALP( a, a ) )        /* Betrag */
  57. #define COS( a ) cos( a* M_PI / 180.0 )        /* cos mit Winkeln in ° */
  58. #define COSV( a, b ) (((a.x || a.y)) ?\
  59.  (SKALP( a, b)/(BETR( a ) * BETR( b ))) : 0 )    /* cos aus Skalaprod. */
  60. #define DIFF(a, b) ((a)*(a) + (b)*(b)) /* DIFF, DIFF2: Abst.quadrate */
  61. #define DIFF2(a, b) (((a)*(a) + (b)*(b)) * DIFFX*DIFFX) 
  62. #define BLACK 4        /* 'Farbe' der schwarzen Kugel */
  63. #define WHITE (BALLS-1)
  64. #define COL_WHITE 0
  65. #define COL_YELLOW 2
  66. #define COL_RED 1
  67. #define COL_BLACK 3
  68. #define NEW_COL_NEW (1<<3)
  69. #define NEW_COL_DOUBLE (1<<5)
  70. #define FOUL_BLACK_ILLEGALY_POCKETED (1<<12)
  71. #define FOUL_WHITE_POCKETED (1<<11)
  72. #define FOUL_NO_TOUCH (1<<10)
  73. #define FOUL_WRONG_COLOR_POCKETED (1<<9)
  74. #define FOUL_WRONG_COLOR_TOUCHED (1<<8)
  75. #define FOUL_CORRECT_POT (1<<5)
  76. #define FOUL_NO_FOUL 0
  77. #define FOUL_ANY_FOUL ( FOUL_BLACK_ILLEGALY_POCKETED | FOUL_WHITE_POCKETED\
  78.  |FOUL_NO_TOUCH | FOUL_WRONG_COLOR_POCKETED| FOUL_WRONG_COLOR_TOUCHED )
  79. /* Definition der benötigten Strukturen */
  80.  
  81. struct vect { double x, y; };
  82. struct ball { struct vect v, vr, ve, e, p; double ez, m; int stat, col; }; 
  83. /* v: normale Translationsgeschw.; vr: normale Rotationsgeschw.; 
  84.    p: Koordinaten (0<=x<=1, 0<=y<=0.5); e,ez: ("eingegebener" Effet, Spin;
  85.    ve: normale End-Tanslationgeschw.; m: Masse          
  86.    stat: "Status" der Kugel; col: Farbe (rot, gelb, schwarz) */ 
  87. struct hole { struct vect p, m; };
  88. /* p: Pos. des Mittelpunktes des Kreises, der das jeweilige Loch darstellt,
  89.    m: Pos. des Punktes auf den der Computer zielen muß, damit er ins 
  90.    Loch trifft, wird bei plot_table() oder so berechnet */
  91. struct player { int stat, wait, points, col, hole_black; double speed;};
  92. /* stat: für Fouls, Treffer, etc.; col: welche Farbe darf angespielt werden;
  93.    speed: letzter Powerfaktor */
  94. struct bande { struct vect p0, p1, n; };
  95. /* p0,p1: Die zwei Punkte, die die Position der Bande festlegen,
  96.    n: 'Normalen-Vektor' der Bande */
  97. struct target { struct vect pos; int kno, ord; struct target *next;
  98.  double abst, angle; struct target *test; };
  99. /* f. computer.c: pos: Position des Punktes, auf den der Computer zielt,
  100.    kno, zugehörige Kugel, ord, wieviele Kugeln liegen zwischen Weißer und 
  101.    Loch; abst: noch nicht benötigt, angle: unter welchem (Gesamt)-Winkel
  102.    werden die Kugeln versenkt (wichtig für setzen der Gesch.) */
  103. struct foul { int wrongct, wrongcp, whited, notouch; };
  104. struct statistic { struct foul fouls; int wins, losses, pots, nopots,
  105.  slosses; }; 
  106.    
  107. /* jetzt kommen die globalen Variablen */
  108.  
  109. extern double ALPHA, BETA, DELTA, ETA, CETA, THETA, BANDES, BANDEREF,
  110.  SPINC, MASSE_WEISS; /* eigentlich Konstanten, werden es später wieder !!! */
  111. extern double oldalph, alph, spd, RADIUSL, e_winkel, old_min;
  112. extern int counter, oldx[BALLS], oldy[BALLS], olds[2];
  113. extern int first_hit, bande_hit, act, col_in, last_foul, freeball, 
  114.  extra_shot,ende, c_player, anstoss, demo, last_pocketed_balls;
  115. extern int BREMSE, PAINT, CLEV, new_col, old_ball, old_hole;
  116. extern struct ball k[BALLS];
  117. extern struct hole posl[6];
  118. extern struct bande ban[18];
  119. extern struct player ply[2];
  120. extern struct statistic stats[2];
  121. extern FILE *datei;
  122.  
  123. /* functions in billard.c */
  124.  
  125. void test_for_play_on_black( void );
  126. int test_if_game_is_over( void );
  127. void rules( void );
  128. void init_table( void );
  129. void undo( void );
  130. void save_actual_position( void );
  131. void stop_it( void );
  132. void calc_e_winkel( void );
  133.  
  134. /* functions in graphics.c */
  135.  
  136. void init_graphics( int x_auflsg, int y_auflsg, int anz_colors);
  137. void msg( char *ausgabestring );
  138. void plot_table( void );
  139. void speed( double geschwindigkeit ); /* 0<= geschw. <= 1 */
  140. void plot_balls( void );
  141. void test_spin( int maus_x_pos, int maus_y_pos );
  142. void set_spin( double spin_x, double spin_y , double spin_z);
  143. void wink( double winkel_alpha ); /* 0 <= alpha <= 85° */
  144. void plot_one_ball( int which_one );
  145. void err( char *ausgabe_string );
  146. void err2( char *ausgabe_string, int color );
  147. void debug( char *out_string );
  148. void make_mouse_cursor( void );
  149. int menu( void );
  150. void wait_for_click( void );
  151. void close_graphics( void );
  152. void mouse_on( void );
  153. void mouse_off( void );
  154. void plot_act_player( int actual_player );
  155. void set_white_ball( void );
  156. void calc_player_v( void );
  157. void set_player_power( void );
  158. void set_player_spin( void );
  159. void set_test_power( void );
  160. int set_test_power2( void );
  161. void ctrl_break_off( void );
  162. void plot_statistics( double time, int graphics_on_off );
  163. void delete_ball( int ballnr );
  164. void help( void );
  165. void credits( void );
  166.  
  167. /* functions in physics.c */
  168.  
  169. void translate_spin( void );
  170. void refl_kk( int kugelnr, struct vect kbande );
  171. void coll( int kugel_a, int kugel_b );
  172. void reflection( int kugelnr, int bandennr );
  173. int in_line( int kugelnr, int bandennr );
  174. void banden_test( void );
  175. int move_balls( void );
  176. void calc_v_end( int no_of_ball );
  177. int move_balls( void );
  178. void stoss( void );
  179. void wait_user_time( double time );
  180.  
  181. /* functions in computer.c */
  182.  
  183. int in_line_c( int ball_no_1, int ball_no_2, struct vect point_0, 
  184.  struct vect point_1, int color, int graphics_on_off );
  185. struct vect calc_tp( struct vect act_ball, struct vect target );
  186. void set_c_speed( double abs, struct vect speed );
  187. void computer_stoss( void );
  188. int banden_stoss( void );
  189. void calc_hot_spot( void );
  190.  
  191. /* function in creatabl.c */
  192.  
  193. void create_table( double widt