2 * Copyright (C) 2003 Robert Kooima
4 * NEVERPUTT is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published
6 * by the Free Software Foundation; either version 2 of the License,
7 * or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
29 /*---------------------------------------------------------------------------*/
45 static int stat_v[MAXPLY];
46 static float ball_p[MAXPLY][3];
47 static float ball_e[MAXPLY][3][3];
48 static struct hole hole_v[MAXHOL];
49 static int score_v[MAXHOL][MAXPLY];
51 /*---------------------------------------------------------------------------*/
53 static void hole_init_rc(const char *filename)
62 /* Load the holes list. */
64 if ((fin = fopen(config_data(filename), "r")))
66 while (fscanf(fin, "%s %s %d %s",
70 hole_v[count].song) == 4)
77 /*---------------------------------------------------------------------------*/
79 void hole_init(const char *filename)
83 memset(hole_v, 0, sizeof (struct hole) * MAXHOL);
84 memset(score_v, 0, sizeof (int) * MAXPLY * MAXHOL);
86 hole_init_rc(filename);
88 for (i = 0; i < count; i++)
89 score_v[i][0] = hole_v[i].par;
100 /*---------------------------------------------------------------------------*/
102 char *hole_player(int p)
104 if (p == 0) return _("Par");
106 if (p == 1 && 1 <= party) return _("P1");
107 if (p == 2 && 2 <= party) return _("P2");
108 if (p == 3 && 3 <= party) return _("P3");
109 if (p == 4 && 4 <= party) return _("P4");
114 char *hole_score(int h, int p)
116 static char str[MAXSTR];
118 if (1 <= h && h <= hole)
120 if (h <= hole && 0 <= p && p <= party)
122 sprintf(str, "%d", score_v[h][p]);
129 char *hole_tot(int p)
131 static char str[MAXSTR];
137 for (h = 1; h <= hole && h < count; h++)
140 sprintf(str, "%d", T);
147 char *hole_out(int p)
149 static char str[MAXSTR];
155 for (h = 1; h <= hole && h <= count / 2; h++)
158 sprintf(str, "%d", T);
167 static char str[MAXSTR];
172 if (hole > out && p <= party)
174 for (h = out + 1; h <= hole && h < count; h++)
177 sprintf(str, "%d", T);
184 /*---------------------------------------------------------------------------*/
186 int curr_hole(void) { return hole; }
187 int curr_party(void) { return party; }
188 int curr_player(void) { return player; }
189 int curr_count(void) { return count; }
191 const char *curr_scr(void)
195 sprintf(buf, "%d", score_v[hole][player]);
200 const char *curr_par(void)
204 sprintf(buf, "%d", score_v[hole][0]);
209 /*---------------------------------------------------------------------------*/
211 void hole_goto(int h, int p)
217 if (h >= 0) hole = h;
218 if (p >= 0) party = p;
220 player = (hole - 1) % party + 1;
223 back_init(hole_v[hole].back, 1);
224 game_init(hole_v[hole].file);
226 for (i = 1; i <= party; i++)
228 game_get_pos(ball_p[i], ball_e[i]);
242 player = player % party + 1;
244 while (stat_v[player]);
247 game_get_pos(ball_p[player], ball_e[player]);
256 if (hole + 1 < count)
263 hole_goto(hole, party);
272 score_v[hole][player]++;
274 if (score_v[hole][player] == 1)
275 audio_play(AUD_ONE, 1.0f);
277 else if (score_v[hole][player] == score_v[hole][0] - 2)
278 audio_play(AUD_EAGLE, 1.0f);
279 else if (score_v[hole][player] == score_v[hole][0] - 1)
280 audio_play(AUD_BIRDIE, 1.0f);
281 else if (score_v[hole][player] == score_v[hole][0])
282 audio_play(AUD_PAR, 1.0f);
283 else if (score_v[hole][player] == score_v[hole][0] + 1)
284 audio_play(AUD_BOGEY, 1.0f);
285 else if (score_v[hole][player] == score_v[hole][0] + 2)
286 audio_play(AUD_DOUBLE, 1.0f);
288 audio_play(AUD_SUCCESS, 1.0f);
294 audio_music_fade_out(2.0f);
299 score_v[hole][player]++;
301 /* Cap scores at 12 or par plus 3. */
303 if (score_v[hole][player] >= 12 && score_v[hole][player] >= score_v[hole][0] + 3)
305 score_v[hole][player] = (score_v[hole][0] > 12 - 3) ? score_v[hole][0] + 3 : 12;
313 audio_play(AUD_PENALTY, 1.0f);
315 /* Reset to the position of the putt, and apply a one-stroke penalty. */
317 game_set_pos(ball_p[player], ball_e[player]);
318 score_v[hole][player] += 2;
320 /* Cap scores at 12 or par plus 3. */
322 if (score_v[hole][player] >= 12 && score_v[hole][player] >= score_v[hole][0] + 3)
324 score_v[hole][player] = (score_v[hole][0] > 12 - 3) ? score_v[hole][0] + 3 : 12;
330 /*---------------------------------------------------------------------------*/
334 audio_music_fade_to(0.5f, hole_v[hole].song);