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
)
63 /* Load the holes list. */
65 if ((fin
= fs_open(filename
, "r")))
67 /* Skip shot and description. */
69 if (fs_gets(buff
, sizeof (buff
), fin
) &&
70 fs_gets(buff
, sizeof (buff
), fin
))
74 while (fs_gets(buff
, sizeof (buff
), fin
) &&
75 sscanf(buff
, "%s %s %d %s",
79 hole_v
[count
].song
) >= 1)
87 /*---------------------------------------------------------------------------*/
89 int hole_load(int h
, const char *filename
)
93 if (filename
!= hole_v
[h
].file
)
95 /* Note filename if it came from elsewhere. */
97 SAFECPY(hole_v
[h
].file
, filename
);
100 if (sol_load_meta(&base
, filename
))
104 for (i
= 0; i
< base
.dc
; i
++)
106 const char *k
= base
.av
+ base
.dv
[i
].ai
;
107 const char *v
= base
.av
+ base
.dv
[i
].aj
;
109 if (strcmp("grad", k
) == 0)
110 SAFECPY(hole_v
[h
].back
, v
);
111 else if (strcmp("par", k
) == 0)
112 hole_v
[h
].par
= atoi(v
);
113 else if (strcmp("song", k
) == 0)
114 SAFECPY(hole_v
[h
].song
, v
);
117 score_v
[h
][0] = hole_v
[h
].par
;
119 sol_free_base(&base
);
125 void hole_init(const char *filename
)
129 memset(hole_v
, 0, sizeof (struct hole
) * MAXHOL
);
130 memset(score_v
, 0, sizeof (int) * MAXPLY
* MAXHOL
);
134 hole_init_rc(filename
);
136 for (i
= 0; i
< count
; i
++)
137 hole_load(i
, hole_v
[i
].file
);
141 /* Standalone mode. */
142 /* Why is this 2, you ask? Good question. */
156 /*---------------------------------------------------------------------------*/
158 char *hole_player(int p
)
160 if (p
== 0) return _("Par");
162 if (p
== 1 && 1 <= party
) return _("P1");
163 if (p
== 2 && 2 <= party
) return _("P2");
164 if (p
== 3 && 3 <= party
) return _("P3");
165 if (p
== 4 && 4 <= party
) return _("P4");
170 char *hole_score(int h
, int p
)
172 static char str
[MAXSTR
];
174 if (1 <= h
&& h
<= hole
)
176 if (h
<= hole
&& 0 <= p
&& p
<= party
)
178 sprintf(str
, "%d", score_v
[h
][p
]);
185 char *hole_tot(int p
)
187 static char str
[MAXSTR
];
193 for (h
= 1; h
<= hole
&& h
< count
; h
++)
196 sprintf(str
, "%d", T
);
203 char *hole_out(int p
)
205 static char str
[MAXSTR
];
211 for (h
= 1; h
<= hole
&& h
<= count
/ 2; h
++)
214 sprintf(str
, "%d", T
);
223 static char str
[MAXSTR
];
228 if (hole
> out
&& p
<= party
)
230 for (h
= out
+ 1; h
<= hole
&& h
< count
; h
++)
233 sprintf(str
, "%d", T
);
240 /*---------------------------------------------------------------------------*/
242 int curr_hole(void) { return hole
; }
243 int curr_party(void) { return party
; }
244 int curr_player(void) { return player
; }
245 int curr_count(void) { return count
; }
247 const char *curr_scr(void)
251 sprintf(buf
, "%d", score_v
[hole
][player
]);
256 const char *curr_par(void)
260 sprintf(buf
, "%d", score_v
[hole
][0]);
265 /*---------------------------------------------------------------------------*/
267 int hole_goto(int h
, int p
)
273 if (h
>= 0) hole
= h
;
274 if (p
>= 0) party
= p
;
276 if (game_init(hole_v
[hole
].file
))
278 back_init(hole_v
[hole
].back
);
280 player
= (hole
- 1) % party
+ 1;
283 for (i
= 1; i
<= party
; i
++)
285 game_get_pos(ball_p
[i
], ball_e
[i
]);
302 player
= player
% party
+ 1;
304 while (stat_v
[player
]);
307 game_get_pos(ball_p
[player
], ball_e
[player
]);
316 if (hole
+ 1 < count
)
323 if (hole_goto(hole
, party
))
331 score_v
[hole
][player
]++;
333 if (score_v
[hole
][player
] == 1)
334 audio_play(AUD_ONE
, 1.0f
);
336 else if (score_v
[hole
][player
] == score_v
[hole
][0] - 2)
337 audio_play(AUD_EAGLE
, 1.0f
);
338 else if (score_v
[hole
][player
] == score_v
[hole
][0] - 1)
339 audio_play(AUD_BIRDIE
, 1.0f
);
340 else if (score_v
[hole
][player
] == score_v
[hole
][0])
341 audio_play(AUD_PAR
, 1.0f
);
342 else if (score_v
[hole
][player
] == score_v
[hole
][0] + 1)
343 audio_play(AUD_BOGEY
, 1.0f
);
344 else if (score_v
[hole
][player
] == score_v
[hole
][0] + 2)
345 audio_play(AUD_DOUBLE
, 1.0f
);
347 audio_play(AUD_SUCCESS
, 1.0f
);
353 audio_music_fade_out(2.0f
);
358 score_v
[hole
][player
]++;
360 /* Cap scores at 12 or par plus 3. */
362 if (score_v
[hole
][player
] >= 12 &&
363 score_v
[hole
][player
] >= score_v
[hole
][0] + 3)
365 score_v
[hole
][player
] = (score_v
[hole
][0] > 12 - 3) ? score_v
[hole
][0] + 3 : 12;
373 audio_play(AUD_PENALTY
, 1.0f
);
375 /* Reset to the position of the putt, and apply a one-stroke penalty. */
377 game_set_pos(ball_p
[player
], ball_e
[player
]);
378 score_v
[hole
][player
] += 2;
380 /* Cap scores at 12 or par plus 3. */
382 if (score_v
[hole
][player
] >= 12 &&
383 score_v
[hole
][player
] >= score_v
[hole
][0] + 3)
385 score_v
[hole
][player
] = (score_v
[hole
][0] > 12 - 3) ? score_v
[hole
][0] + 3 : 12;
391 /*---------------------------------------------------------------------------*/
395 audio_music_fade_to(0.5f
, hole_v
[hole
].song
);