Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
9169 | turbocat | 1 | /* |
2 | * OpenTyrian: A modern cross-platform port of Tyrian |
||
3 | * Copyright (C) 2007-2009 The OpenTyrian Development Team |
||
4 | * |
||
5 | * This program is free software; you can redistribute it and/or |
||
6 | * modify it under the terms of the GNU General Public License |
||
7 | * as published by the Free Software Foundation; either version 2 |
||
8 | * of the License, or (at your option) any later version. |
||
9 | * |
||
10 | * This program is distributed in the hope that it will be useful, |
||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
13 | * GNU General Public License for more details. |
||
14 | * |
||
15 | * You should have received a copy of the GNU General Public License |
||
16 | * along with this program; if not, write to the Free Software |
||
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||
18 | */ |
||
19 | #include "nortsong.h" |
||
20 | |||
21 | #include "file.h" |
||
22 | #include "joystick.h" |
||
23 | #include "keyboard.h" |
||
24 | #include "loudness.h" |
||
25 | #include "musmast.h" |
||
26 | #include "opentyr.h" |
||
27 | #include "params.h" |
||
28 | #include "sndmast.h" |
||
29 | #include "vga256d.h" |
||
30 | |||
31 | #include "SDL.h" |
||
32 | |||
33 | Uint32 target, target2; |
||
34 | |||
35 | JE_boolean notYetLoadedSound = true; |
||
36 | |||
37 | JE_word frameCount, frameCount2, frameCountMax; |
||
38 | |||
39 | JE_byte *digiFx[SAMPLE_COUNT] = { NULL }; /* [1..soundnum + 9] */ |
||
40 | JE_word fxSize[SAMPLE_COUNT]; /* [1..soundnum + 9] */ |
||
41 | |||
42 | JE_word tyrMusicVolume, fxVolume; |
||
43 | JE_word fxPlayVol; |
||
44 | JE_word tempVolume; |
||
45 | |||
46 | JE_word speed; /* JE: holds timer speed for 70Hz */ |
||
47 | |||
48 | float jasondelay = 1000.0f / (1193180.0f / 0x4300); |
||
49 | |||
50 | void setdelay( JE_byte delay ) |
||
51 | { |
||
52 | target = (delay * 16) + SDL_GetTicks(); |
||
53 | } |
||
54 | |||
55 | void setjasondelay( int delay ) |
||
56 | { |
||
57 | target = SDL_GetTicks() + delay * jasondelay; |
||
58 | } |
||
59 | |||
60 | void setjasondelay2( int delay ) |
||
61 | { |
||
62 | target2 = SDL_GetTicks() + delay * jasondelay; |
||
63 | } |
||
64 | |||
65 | int delaycount( void ) |
||
66 | { |
||
67 | return (SDL_GetTicks() < target ? target - SDL_GetTicks() : 0); |
||
68 | } |
||
69 | |||
70 | int delaycount2( void ) |
||
71 | { |
||
72 | return (SDL_GetTicks() < target2 ? target2 - SDL_GetTicks() : 0); |
||
73 | } |
||
74 | |||
75 | void wait_delay( void ) |
||
76 | { |
||
77 | Sint32 delay = target - SDL_GetTicks(); |
||
78 | if (delay > 0) |
||
79 | uSDL_Delay(delay); |
||
80 | } |
||
81 | |||
82 | void service_wait_delay( void ) |
||
83 | { |
||
84 | while (SDL_GetTicks() < target) |
||
85 | { |
||
86 | uSDL_Delay(SDL_GetTicks() - target > SDL_POLL_INTERVAL ? SDL_POLL_INTERVAL : SDL_GetTicks() - target); |
||
87 | service_SDL_events(false); |
||
88 | } |
||
89 | } |
||
90 | |||
91 | void wait_delayorinput( JE_boolean keyboard, JE_boolean mouse, JE_boolean joystick ) |
||
92 | { |
||
93 | service_SDL_events(true); |
||
94 | while (SDL_GetTicks() < target && !((keyboard && keydown) || (mouse && mousedown) || (joystick && joydown))) |
||
95 | { |
||
96 | uSDL_Delay(SDL_GetTicks() - target > SDL_POLL_INTERVAL ? SDL_POLL_INTERVAL : SDL_GetTicks() - target); |
||
97 | push_joysticks_as_keyboard(); |
||
98 | service_SDL_events(false); |
||
99 | } |
||
100 | } |
||
101 | |||
102 | void JE_loadSndFile( const char *effects_sndfile, const char *voices_sndfile ) |
||
103 | { |
||
104 | JE_byte y, z; |
||
105 | JE_word x; |
||
106 | JE_longint templ; |
||
107 | JE_longint sndPos[2][SAMPLE_COUNT + 1]; |
||
108 | JE_word sndNum; |
||
109 | |||
110 | FILE *fi; |
||
111 | |||
112 | /* SYN: Loading offsets into TYRIAN.SND */ |
||
113 | fi = dir_fopen_die(data_dir(), effects_sndfile, "rb"); |
||
114 | efread(&sndNum, sizeof(sndNum), 1, fi); |
||
115 | |||
116 | for (x = 0; x < sndNum; x++) |
||
117 | { |
||
118 | efread(&sndPos[0][x], sizeof(sndPos[0][x]), 1, fi); |
||
119 | } |
||
120 | fseek(fi, 0, SEEK_END); |
||
121 | sndPos[0][sndNum] = ftell(fi); /* Store file size */ |
||
122 | |||
123 | for (z = 0; z < sndNum; z++) |
||
124 | { |
||
125 | fseek(fi, sndPos[0][z], SEEK_SET); |
||
126 | fxSize[z] = (sndPos[0][z+1] - sndPos[0][z]); /* Store sample sizes */ |
||
127 | free(digiFx[z]); |
||
128 | digiFx[z] = malloc(fxSize[z]); |
||
129 | efread(digiFx[z], 1, fxSize[z], fi); /* JE: Load sample to buffer */ |
||
130 | } |
||
131 | |||
132 | fclose(fi); |
||
133 | |||
134 | /* SYN: Loading offsets into VOICES.SND */ |
||
135 | fi = dir_fopen_die(data_dir(), voices_sndfile, "rb"); |
||
136 | |||
137 | efread(&sndNum, sizeof(sndNum), 1, fi); |
||
138 | |||
139 | for (x = 0; x < sndNum; x++) |
||
140 | { |
||
141 | efread(&sndPos[1][x], sizeof(sndPos[1][x]), 1, fi); |
||
142 | } |
||
143 | fseek(fi, 0, SEEK_END); |
||
144 | sndPos[1][sndNum] = ftell(fi); /* Store file size */ |
||
145 | |||
146 | z = SAMPLE_COUNT - 9; |
||
147 | |||
148 | for (y = 0; y < sndNum; y++) |
||
149 | { |
||
150 | fseek(fi, sndPos[1][y], SEEK_SET); |
||
151 | |||
152 | templ = (sndPos[1][y+1] - sndPos[1][y]) - 100; /* SYN: I'm not entirely sure what's going on here. */ |
||
153 | if (templ < 1) templ = 1; |
||
154 | fxSize[z + y] = templ; /* Store sample sizes */ |
||
155 | digiFx[z + y] = malloc(fxSize[z + y]); |
||
156 | efread(digiFx[z + y], 1, fxSize[z + y], fi); /* JE: Load sample to buffer */ |
||
157 | } |
||
158 | |||
159 | fclose(fi); |
||
160 | |||
161 | notYetLoadedSound = false; |
||
162 | |||
163 | } |
||
164 | |||
165 | void JE_playSampleNum( JE_byte samplenum ) |
||
166 | { |
||
167 | JE_multiSamplePlay(digiFx[samplenum-1], fxSize[samplenum-1], 0, fxPlayVol); |
||
168 | } |
||
169 | |||
170 | void JE_calcFXVol( void ) // TODO: not sure *exactly* what this does |
||
171 | { |
||
172 | fxPlayVol = (fxVolume - 1) >> 5; |
||
173 | } |
||
174 | |||
175 | void JE_setTimerInt( void ) |
||
176 | { |
||
177 | jasondelay = 1000.0f / (1193180.0f / speed); |
||
178 | } |
||
179 | |||
180 | void JE_resetTimerInt( void ) |
||
181 | { |
||
182 | jasondelay = 1000.0f / (1193180.0f / 0x4300); |
||
183 | } |
||
184 | |||
185 | void JE_changeVolume( JE_word *music, int music_delta, JE_word *sample, int sample_delta ) |
||
186 | { |
||
187 | int music_temp = *music + music_delta, |
||
188 | sample_temp = *sample + sample_delta; |
||
189 | |||
190 | if (music_delta) |
||
191 | { |
||
192 | if (music_temp > 255) |
||
193 | { |
||
194 | music_temp = 255; |
||
195 | JE_playSampleNum(S_CLINK); |
||
196 | } |
||
197 | else if (music_temp < 0) |
||
198 | { |
||
199 | music_temp = 0; |
||
200 | JE_playSampleNum(S_CLINK); |
||
201 | } |
||
202 | } |
||
203 | |||
204 | if (sample_delta) |
||
205 | { |
||
206 | if (sample_temp > 255) |
||
207 | { |
||
208 | sample_temp = 255; |
||
209 | JE_playSampleNum(S_CLINK); |
||
210 | } |
||
211 | else if (sample_temp < 0) |
||
212 | { |
||
213 | sample_temp = 0; |
||
214 | JE_playSampleNum(S_CLINK); |
||
215 | } |
||
216 | } |
||
217 | |||
218 | *music = music_temp; |
||
219 | *sample = sample_temp; |
||
220 | |||
221 | JE_calcFXVol(); |
||
222 | |||
223 | set_volume(*music, *sample); |
||
224 | }>>>>>>>>>>> |
||
225 |