home *** CD-ROM | disk | FTP | other *** search
/ Collection of Education / collectionofeducationcarat1997.iso / GAMES / CAROM10.ZIP / CAROMSRC.ZIP / BALLFULL.H < prev    next >
C/C++ Source or Header  |  1994-08-13  |  5KB  |  158 lines

  1. /*
  2.    Copyright (c) 1994 Csaba Mßrkus. All rights reserved.
  3.    E-mail: ethcms@duna.ericsson.se
  4.    Addr.:  H-9600 Sßrvßr, Szatmßr u. 4, Hungary
  5.  
  6.    Permission to use, copy, modify, and distribute this software and its
  7.    documentation for any purpose, without fee, and without written agreement
  8.    is hereby granted, provided that the above copyright notice and the
  9.    following two paragraphs appear in all copies of this software.
  10.  
  11.    IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR
  12.    DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  13.    OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHOR HAS
  14.    BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  15.  
  16.    THE AUTHOR DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17.    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18.    THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE AUTHOR HAS
  19.    NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS
  20.    OR MODIFICATIONS.
  21. */
  22.  
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <math.h>
  26. #include <windows.h>
  27.  
  28. extern HGLOBAL hglbShotHistory;
  29.  
  30. /* Number of balls:
  31. */
  32. #define N 3
  33.  
  34. /* Time resolution
  35. */
  36. #define TIME_SLOT (1.0 / (2 * 18.2))
  37.  
  38. /* Gravity
  39.    If you want to process gravity effects, activate the next #define
  40. */
  41. // #define GRAVITY_HANDLED
  42. #ifdef GRAVITY_HANDLED
  43. #define GRAVITY_SPEED_PER_SECOND (981.0 * 0)
  44. #endif
  45.  
  46. /* Rolling
  47. */
  48. #define MU_ROLLING 0.0025
  49. #define ROLLING_SPEED_PER_SECOND (MU_ROLLING * 9810.0 * 1.0)
  50.  
  51. /* Friction
  52. */
  53. #define MU_FRICTION 0.045
  54. #define FRICTION_SPEED_PER_SECOND (MU_FRICTION * 9810.0 / 1.0)
  55.  
  56. /* Ratio to which the rotation of a ball decreases when it hits the cushion.
  57.    That is, if the rotation speed is V before the collision, it will be
  58.    (1-ROTATION_CONVERT_RATIO)*V afterward.
  59. */
  60. #define ROTATION_CONVERT_RATIO 0.75
  61.  
  62. /* Maximum starting speed is 100 * POWER_SCALE mm/sec:
  63. */
  64. #define POWER_SCALE 30.0
  65. /* Maximum vertical spin speed is VER_SPIN_RATIO * starting speed:
  66. */
  67. #define VER_SPIN_RATIO 1.0
  68. /* Maximum horizontal rotation speed is HOR_SPIN_RATIO * starting speed:
  69. */
  70. #define HOR_SPIN_RATIO 0.67
  71.  
  72. /* If you want to reflect the spin of balls when they're hitting the cushion
  73.    activate this #define:
  74. */
  75. /* #define SPIN_REFLECTION
  76. */
  77.  
  78. #define TABLE_LENGTH    2845.0     /* [mm] Rule: 2840 +- 5 mm */
  79. #define TABLE_WIDTH    1422.5     /* [mm] Rule: 1420 +- 5 mm */
  80. #define CUSHION_WIDTH      40.0     /* Width of rubber cushion */
  81. #define CUSHION_HEIGHT      37.0     /* [mm] Rule: 37 +- 1 mm */
  82. #define BALL_DIAMETER     61.0   /* [mm] Rule: 61.0 - 61.5 mm */
  83. #define BALL_MASS     210.0     /* [g] Rule: 205 - 220 g */
  84. #define WOOD_WIDTH         80.0     /* Width of wooden frame */
  85. /* Position of the top spot: */
  86. #define TOP_SPOT_X     (2133.75 + WOOD_WIDTH + CUSHION_WIDTH)
  87. #define TOP_SPOT_Y    (711.25 + WOOD_WIDTH + CUSHION_WIDTH)
  88. /* Position of the middle spot: */
  89. #define MIDDLE_SPOT_X  (1422.50 + WOOD_WIDTH + CUSHION_WIDTH)
  90. #define MIDDLE_SPOT_Y   (711.25 + WOOD_WIDTH + CUSHION_WIDTH)
  91. /* Position of bottom left-hand spot: */
  92. #define BOTTOML_SPOT_X    (711.25 + WOOD_WIDTH + CUSHION_WIDTH)
  93. #define BOTTOML_SPOT_Y    (889.25 + WOOD_WIDTH + CUSHION_WIDTH)
  94. /* Position of bottom middle spot: */
  95. #define BOTTOMM_SPOT_X    (711.25 + WOOD_WIDTH + CUSHION_WIDTH)
  96. #define BOTTOMM_SPOT_Y  (711.25 + WOOD_WIDTH + CUSHION_WIDTH)
  97. /* Position of bottom right-hand spot: */
  98. #define BOTTOMR_SPOT_X    (711.25 + WOOD_WIDTH + CUSHION_WIDTH)
  99. #define BOTTOMR_SPOT_Y  (533.25 + WOOD_WIDTH + CUSHION_WIDTH)
  100.  
  101. #define BALL_RADIUS (BALL_DIAMETER / 2.0) /* Radius of balls */
  102.  
  103. /* Multiplier to convert float numbers to unsigned:
  104. */
  105. #define FIXED_MULT 16.0
  106.  
  107. /* For outline balls, comment out this:
  108. */
  109. // #define SOLID_BALLS
  110.  
  111. /* Location of cushions:
  112. */
  113. #define LEFT       (WOOD_WIDTH + CUSHION_WIDTH)
  114. #define RIGHT      (WOOD_WIDTH + CUSHION_WIDTH + TABLE_LENGTH)
  115. #define BOTTOM     (WOOD_WIDTH + CUSHION_WIDTH)
  116. #define TOP    (WOOD_WIDTH + CUSHION_WIDTH + TABLE_WIDTH)
  117.  
  118. /* Location of cushions with respect to the radius of the balls
  119.    ("C_" refers to "C"enter of balls...):
  120. */
  121. #define C_LEFT     (LEFT + BALL_RADIUS)
  122. #define C_RIGHT     (RIGHT - BALL_RADIUS)
  123. #define C_BOTTOM (BOTTOM + BALL_RADIUS)
  124. #define C_TOP     (TOP - BALL_RADIUS)
  125.  
  126. /* Data structure to store information on one particular ball:
  127. */
  128. typedef struct {
  129.     float x;    /* X Location [mm]   */
  130.     float y;    /* Y Location [mm]   */
  131.     float r;    /* Radius     [mm]   */
  132.     float m;    /* Mass       [g]    */
  133.     char *colour; /* Colour name */
  134.     char *name;    /* Name       [text] */
  135.     float v;    /* Speed      [mm/s] */
  136.     unsigned a;    /* Direction  [rad]  */
  137.     float sv;    /* Spin speed [mm/s] (on the surface) */
  138.     unsigned sa;/* Spin angle [rad]  */
  139.     float rv;    /* Rotation speed [mm/s] (on the surface) */
  140. } ball_data;
  141.  
  142. extern ball_data ball[N];
  143.  
  144. /* Global variables used for recognizing the event of a "carom".
  145. */
  146. extern int iscarom[N];
  147. extern int cushion_counter; 
  148.  
  149. /* develop_balls
  150.  
  151.    This is the heart of the "biliardness" of the program.
  152. */
  153.  
  154. void compute_all_phases(int spin_ver, int spin_hor,
  155.             int power, float direction,
  156.             int cueball, int *good_shot, int *extra_points,
  157.             int *first_ball);
  158.