Mercurial > hg > demos > krapula
annotate krapula.c @ 19:64017da3aa2f
Jee.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 29 Sep 2012 13:32:52 +0300 |
parents | ccc5cdce91e3 |
children | ea93b1d5c894 |
rev | line source |
---|---|
2 | 1 #include "dmlib.h" |
2 #include "dmargs.h" | |
3 #include "dmvecmat.h" | |
4 #include "dmres.h" | |
5 #include "dmimage.h" | |
6 | |
7 #include "jss.h" | |
8 #include "jssmod.h" | |
9 #include "jssmix.h" | |
10 #include "jssplr.h" | |
11 | |
12 #include <math.h> | |
13 | |
14 #define DM_COLORS (256) | |
15 | |
16 | |
17 typedef struct | |
18 { | |
19 int x, y; | |
20 } DMCoords; | |
21 | |
22 | |
23 typedef struct | |
24 { | |
25 int x, y; | |
26 char *filename; | |
27 SDL_Surface *img; | |
28 } DMCredits; | |
29 | |
30 | |
31 typedef struct | |
32 { | |
33 int currFrame, endTime, startTime, totalFrameTime; | |
34 BOOL pauseFlag, exitFlag; | |
35 SDL_Surface *screen; | |
36 SDL_Event event; | |
37 } DMEngineData; | |
38 | |
39 | |
40 typedef struct | |
41 { | |
42 int currFrame, endTime, startTime; | |
43 } DMFrameData; | |
44 | |
45 | |
46 | |
47 | |
48 int optVFlags = SDL_SWSURFACE | SDL_HWPALETTE; | |
49 int optScrWidth = 640, optScrHeight = 480; | |
50 int optBenchmarkLen = 20; | |
51 | |
52 | |
53 DMOptArg optList[] = { | |
54 { 0, '?', "help", "Show this help", OPT_NONE }, | |
55 { 2, 'v', "verbose", "Be more verbose", OPT_NONE }, | |
56 { 3, 'f', "fs", "Fullscreen", OPT_NONE }, | |
57 // { 5, 's', "size", "Screen resolution -s 640x480", OPT_ARGREQ }, | |
58 }; | |
59 | |
60 const int optListN = sizeof(optList) / sizeof(optList[0]); | |
61 | |
62 | |
63 | |
64 void argShowHelp() | |
65 { | |
66 dmPrintBanner(stdout, dmProgName, "[options]"); | |
67 dmArgsPrintHelp(stdout, optList, optListN); | |
68 } | |
69 | |
70 | |
71 BOOL argHandleOpt(const int optN, char *optArg, char *currArg) | |
72 { | |
73 switch (optN) { | |
74 case 0: | |
75 argShowHelp(); | |
76 exit(0); | |
77 break; | |
78 | |
79 case 2: | |
80 dmVerbosity++; | |
81 break; | |
82 | |
83 case 3: | |
84 optVFlags |= SDL_FULLSCREEN; | |
85 break; | |
86 | |
87 case 5: | |
88 { | |
89 int w, h; | |
90 if (sscanf(optArg, "%dx%d", &w, &h) == 2) | |
91 { | |
92 if (w < 320 || h < 200 || w > 1024 || h > 768) | |
93 { | |
94 dmError("Invalid width or height: %d x %d\n", w, h); | |
95 return FALSE; | |
96 } | |
97 optScrWidth = w; | |
98 optScrHeight = h; | |
99 } | |
100 else | |
101 { | |
102 dmError("Invalid size argument '%s'.\n", optArg); | |
103 return FALSE; | |
104 } | |
105 } | |
106 break; | |
107 | |
108 default: | |
109 dmError("Unknown option '%s'.\n", currArg); | |
110 return FALSE; | |
111 } | |
112 | |
113 return TRUE; | |
114 } | |
115 | |
116 | |
117 void dmMakePalette(SDL_Surface *scr) | |
118 { | |
119 SDL_Color pal[DM_COLORS]; | |
120 int n; | |
121 | |
122 for (n = 0; n < 256; n++) | |
123 { | |
124 pal[n].r = n; | |
125 pal[n].g = n; | |
126 pal[n].b = n; | |
127 } | |
128 | |
129 SDL_SetColors(scr, pal, 0, DM_COLORS); | |
130 } | |
131 | |
132 | |
133 void dmRandom(SDL_Surface *screen, int q) | |
134 { | |
135 Uint8 *pix = screen->pixels; | |
136 int xc, yc; | |
137 | |
138 for (yc = 0; yc < screen->h; yc++) | |
139 { | |
140 Uint8 *dp = pix; | |
141 | |
142 for (xc = 0; xc < screen->w; xc++) | |
143 *dp++ = yc + (xc ^ q) + (yc & q); | |
144 | |
145 pix += screen->pitch; | |
146 } | |
147 } | |
148 | |
149 | |
150 void dmPerlin(SDL_Surface *screen, float f) | |
151 { | |
152 Uint8 *pix = screen->pixels; | |
153 int xc, yc; | |
154 | |
155 for (yc = 0; yc < screen->h; yc++) | |
156 { | |
157 Uint8 *dp = pix; | |
158 | |
159 for (xc = 0; xc < screen->w; xc++) | |
160 { | |
161 *dp++ = 128 + dmPerlinNoise2D(xc, yc, 0.01, 0.1, 3) / 34.0; | |
162 } | |
163 | |
164 pix += screen->pitch; | |
165 } | |
166 } | |
167 | |
168 | |
169 #define QWIDTH 256 | |
170 #define QHEIGHT 160 | |
171 | |
172 typedef Uint8 DMBlockMap[QHEIGHT][QWIDTH]; | |
173 | |
174 | |
175 static DMFloat dmClip(DMFloat a) | |
176 { | |
177 return (a < 0.0f ? 0.0f : (a > 1.0f ? 1.0f : a)); | |
178 } | |
179 | |
180 | |
181 void dmMakeBumpMap(DMBlockMap map, DMFloat q, DMFloat m) | |
182 { | |
183 int x, y; | |
184 for (y = 0; y < QHEIGHT; y++) | |
185 for (x = 0; x < QWIDTH; x++) | |
186 { | |
187 DMFloat f = 0.40f + dmPerlinNoise2D(x, y, 1.1f, q, 2); | |
188 map[y][x] = (int) (dmClip(f) * m); | |
189 } | |
190 } | |
191 | |
192 | |
193 void dmShadowTraceHeightMap(DMBlockMap lightMap, DMBlockMap pheightMap, DMVector *light) | |
194 { | |
195 int i, j; | |
196 | |
197 for (j = 0; j < QHEIGHT; j++) | |
198 for (i = 0; i < QWIDTH; i++) | |
199 { | |
200 DMVector vr, vl, va; | |
201 DMFloat vrayLen, vfactor; | |
202 int vlen; | |
203 BOOL wasHit; | |
204 | |
205 /* Perform shadow occlusion via simplistic raytracing */ | |
206 vr.x = i; | |
207 vr.y = j; | |
208 vr.z = light->z; // - 10.0; | |
209 // vr.z = pheightMap[j][i]; | |
210 | |
211 /* Calculate light vector vector */ | |
212 dm_vector_sub_r(&vl, &vr, light); | |
213 vrayLen = dm_vector_length(&vl); | |
214 | |
215 #if 1 | |
216 dm_vector_copy(&va, &vl); | |
217 dm_vector_normalize(&va); | |
218 dm_vector_scale(&va, 0.6f); | |
219 dm_vector_copy(&vr, light); | |
220 | |
221 vlen = 0; | |
222 wasHit = FALSE; | |
223 do | |
224 { | |
225 float h; | |
226 | |
227 /* If ray is inside the heightmap, get value */ | |
228 if (vr.x >= 0 && vr.y >= 0 && vr.x < QWIDTH && vr.y < QHEIGHT) | |
229 h = pheightMap[(int) vr.y][(int) vr.x]; | |
230 else | |
231 break; | |
232 | |
233 /* Check for hits */ | |
234 if (h > vr.z) | |
235 wasHit = TRUE; | |
236 else | |
237 { | |
238 /* Move forwards */ | |
239 dm_vector_add(&vr, &va); | |
240 vlen++; | |
241 } | |
242 } | |
243 while (!wasHit && vlen <= vrayLen); | |
244 | |
245 /* Check if the ray hit something, e.g. is this point occluded? */ | |
246 if (wasHit && vlen < vrayLen) | |
247 { | |
248 vfactor = vlen * 0.01; | |
249 } | |
250 else | |
251 vfactor = vlen * 0.02; | |
252 #endif | |
253 | |
254 #if 1 | |
255 { | |
256 /* Calculate light's intensity based on the angle it "hits" | |
257 * | |
258 * 1) Calculate the vectors that form the imaginary "plane" | |
259 * 2) Cross-product -> normal vector of the plane | |
260 * 2) Normalize the normal vector | |
261 * 3) Calculate light vector's hit angle by dot product | |
262 */ | |
263 DMVector v1, v2; | |
264 DMFloat c; | |
265 | |
266 v1.x = 2.0f; | |
267 v1.y = 0.0f; | |
268 v1.z = (DMFloat) (pheightMap[j][i] - pheightMap[j][i + 1]); | |
269 | |
270 v2.x = 0.0f; | |
271 v2.y = 2.0f; | |
272 v2.z = (DMFloat) (pheightMap[j][i] - pheightMap[j + 1][i]); | |
273 | |
274 dm_vector_cross(&vr, &v1, &v2); | |
275 dm_vector_normalize(&vr); | |
276 dm_vector_normalize(&vl); | |
277 c = dm_vector_dot(&vl, &vr); | |
278 | |
279 vrayLen = 255 - (vrayLen * 0.1) * vrayLen + (c * 128.0f) + (vfactor * vfactor * 1255); | |
280 } | |
281 #else | |
282 vrayLen = 255 - vrayLen * vrayLen * (vfactor * vfactor); | |
283 if (vrayLen < 0) vrayLen = 0; | |
284 vrayLen += pheightMap[j][i]; | |
285 #endif | |
286 | |
287 /* Clip result */ | |
288 if (vrayLen < 0) | |
289 vrayLen = 0; | |
290 else if (vrayLen > 255.0f) | |
291 vrayLen = 255.0f; | |
292 | |
293 lightMap[j][i] = vrayLen; | |
294 } | |
295 } | |
296 | |
297 | |
298 void dmShadowTraceHeightMap2(DMBlockMap lightMap, DMBlockMap pheightMap, DMVector *light) | |
299 { | |
300 int i, j; | |
301 | |
302 light->z = 150; | |
303 | |
304 for (j = 0; j < QHEIGHT; j++) | |
305 for (i = 0; i < QWIDTH; i++) | |
306 { | |
307 DMVector vr, vl, va; | |
308 DMFloat vrayLen, vfactor; | |
309 int vlen; | |
310 BOOL wasHit; | |
311 | |
312 /* Perform shadow occlusion via simplistic raytracing */ | |
313 vr.x = i; | |
314 vr.y = j; | |
315 vr.z = 200; //light->z; // - 10.0; | |
316 | |
317 /* Calculate light vector vector */ | |
318 dm_vector_sub_r(&vl, &vr, light); | |
319 vrayLen = dm_vector_length(&vl); | |
320 | |
321 #if 1 | |
322 dm_vector_copy(&va, &vl); | |
323 dm_vector_normalize(&va); | |
324 dm_vector_copy(&vr, light); | |
325 | |
326 vlen = 0; | |
327 wasHit = FALSE; | |
328 do | |
329 { | |
330 float h; | |
331 | |
332 /* If ray is inside the heightmap, get value */ | |
333 if (vr.x >= 0 && vr.y >= 0 && vr.x < QWIDTH && vr.y < QHEIGHT) | |
334 h = pheightMap[(int) vr.y][(int) vr.x]; | |
335 else | |
336 break; | |
337 | |
338 /* Check for hits */ | |
339 if (h > vr.z) | |
340 wasHit = TRUE; | |
341 else | |
342 { | |
343 /* Move forwards */ | |
344 dm_vector_add(&vr, &va); | |
345 vlen++; | |
346 } | |
347 } | |
348 while (!wasHit && vlen <= vrayLen); | |
349 | |
350 /* Check if the ray hit something, e.g. is this point occluded? */ | |
351 if (wasHit && vlen < vrayLen) | |
352 { | |
353 vfactor = vlen * 0.05; | |
354 } | |
355 else | |
356 vfactor = vlen * 0.001; | |
357 #endif | |
358 | |
359 #if 0 | |
360 { | |
361 /* Calculate light's intensity based on the angle it "hits" | |
362 * | |
363 * 1) Calculate the vectors that form the imaginary "plane" | |
364 * 2) Cross-product -> normal vector of the plane | |
365 * 2) Normalize the normal vector | |
366 * 3) Calculate light vector's hit angle by dot product | |
367 */ | |
368 DMVector v1, v2; | |
369 DMFloat c; | |
370 | |
371 v1.x = 2.0f; | |
372 v1.y = 0.0f; | |
373 v1.z = (DMFloat) (pheightMap[j][i] - pheightMap[j][i + 1]); | |
374 | |
375 v2.x = 0.0f; | |
376 v2.y = 2.0f; | |
377 v2.z = (DMFloat) (pheightMap[j][i] - pheightMap[j + 1][i]); | |
378 | |
379 dm_vector_cross(&vr, &v1, &v2); | |
380 dm_vector_normalize(&vr); | |
381 dm_vector_normalize(&vl); | |
382 c = dm_vector_dot(&vl, &vr); | |
383 | |
384 vrayLen = 255 - (vrayLen * 0.1) * vrayLen + (c * 128.0f) + (vfactor * vfactor * 1255); | |
385 } | |
386 #else | |
387 vrayLen = 255 - vrayLen * vrayLen * (vfactor * vfactor); | |
388 if (vrayLen < 0) vrayLen = 0; | |
389 vrayLen -= pheightMap[j][i]; | |
390 #endif | |
391 | |
392 /* Clip result */ | |
393 if (vrayLen < 0) | |
394 vrayLen = 0; | |
395 else if (vrayLen > 255.0f) | |
396 vrayLen = 255.0f; | |
397 | |
398 lightMap[j][i] = vrayLen; | |
399 } | |
400 } | |
401 | |
402 | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
403 void engineAudioCallback(void *userdata, Uint8 *stream, int len) |
2 | 404 { |
405 JSSMixer *d = (JSSMixer *) userdata; | |
406 | |
407 if (d != NULL) | |
408 { | |
409 jvmRenderAudio(d, stream, len / jvmGetSampleSize(d)); | |
410 } | |
411 } | |
412 | |
413 #define DEBUG 0 | |
414 | |
415 #define CREDITS_SPEED 1000 | |
416 #define CREDITS_RAND 4 | |
417 | |
418 #define NOSFE_MIN 1 | |
419 #define NOSFE_MAX 269 | |
420 | |
421 static const DMCoords randomCoords[] = | |
422 { | |
423 { -300, -430 }, | |
424 { 700, -550 }, | |
425 { -200, 600 }, | |
426 { 700, 600 } | |
427 }; | |
428 const int nrandomCoords = sizeof(randomCoords) / sizeof(randomCoords[0]); | |
429 | |
430 | |
431 static DMCredits credits[] = | |
432 { | |
433 { 91, 223, "g4014.png", NULL }, | |
434 { 151, 250, "g4026.png", NULL }, | |
435 { 217, 227, "g4020.png", NULL }, | |
436 { 173, 268, "g4032.png", NULL }, | |
437 { 115, 359, "g4038.png", NULL }, | |
438 | |
439 { 437, 130, "g4062.png", NULL }, | |
440 { 457, 102, "g4068.png", NULL }, | |
441 { 450, 210, "g4056.png", NULL }, | |
442 | |
443 { 420, 320, "g4044.png", NULL }, | |
444 { 486, 381, "g4050.png", NULL }, | |
445 }; | |
446 | |
447 const int ncredits = sizeof(credits) / sizeof(credits[0]); | |
448 | |
449 | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
450 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
451 |
2 | 452 DMEngineData engine; |
453 DMFrameData frame; | |
454 | |
455 int engineGetTick() | |
456 { | |
457 return (frame.startTime - engine.startTime) + DEBUG * 1000; | |
458 } | |
459 | |
460 float engineGetTimeDT() | |
461 { | |
462 return (float) engineGetTick() / 1000.0f; | |
463 } | |
464 | |
465 | |
466 int engineGetTimeDTi() | |
467 { | |
468 return (float) engineGetTick() / 1000; | |
469 } | |
470 | |
471 | |
472 int engineGetTime(int t) | |
473 { | |
474 return engineGetTick() - (1000 * t);; | |
475 } | |
476 | |
477 | |
478 int engineGetDT(int t) | |
479 { | |
480 return engineGetTime(t) / 1000; | |
481 } | |
482 | |
483 | |
484 int dmScaledBlitSurface32to32TransparentX(SDL_Surface *src, const int x0, const int y0, const int dwidth, const int dheight, SDL_Surface *dst); | |
485 | |
486 | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
487 int engineResImageLoad(DMResource *res) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
488 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
489 SDL_Surface *img = dmLoadImage(res); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
490 if (res != NULL) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
491 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
492 res->rdata = img; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
493 return DMERR_OK; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
494 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
495 else |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
496 return dmferror(res); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
497 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
498 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
499 void engineResImageFree(DMResource *res) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
500 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
501 SDL_FreeSurface((SDL_Surface *)res->rdata); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
502 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
503 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
504 int engineResModuleLoad(DMResource *res) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
505 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
506 return jssLoadXM(res, (JSSModule **) &(res->rdata)); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
507 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
508 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
509 void engineResModuleFree(DMResource *res) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
510 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
511 jssFreeModule((JSSModule *) res->rdata); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
512 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
513 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
514 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
515 static DMResourceDataOps engineResImage = |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
516 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
517 engineResImageLoad, |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
518 engineResImageFree |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
519 }; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
520 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
521 static DMResourceDataOps engineResModule = |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
522 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
523 engineResModuleLoad, |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
524 engineResModuleFree |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
525 }; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
526 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
527 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
528 int engineClassifier(DMResource *res) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
529 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
530 DMResourceDataOps *rops = NULL; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
531 char *fext; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
532 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
533 if (res == NULL) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
534 return DMERR_NULLPTR; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
535 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
536 if ((fext = strrchr(res->filename, '.')) != NULL) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
537 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
538 if (strcasecmp(fext, ".png") == 0 || strcasecmp(fext, ".jpg") == 0) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
539 rops = &engineResImage; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
540 else |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
541 if (strcasecmp(fext, ".xm") == 0 || strcasecmp(fext, ".jmod") == 0) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
542 rops = &engineResModule; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
543 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
544 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
545 res->rops = rops; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
546 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
547 return DMERR_OK; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
548 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
549 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
550 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
551 void *engineGetResource(const char *name) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
552 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
553 DMResource *res = dmres_find(name); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
554 if (res != NULL && res->rdata != NULL) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
555 return res->rdata; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
556 else |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
557 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
558 dmError("Could not find resource '%s'.\n", name); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
559 return NULL; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
560 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
561 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
562 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
563 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
564 #define engineGetResImage(name) (SDL_Surface *) engineGetResource(name) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
565 #define engineGetResModule(name) (JSSModule *) engineGetResource(name) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
566 |
2 | 567 |
17 | 568 int engineLoadResources() |
2 | 569 { |
17 | 570 int err, loaded, total; |
571 | |
572 err = dmres_preload(TRUE, &loaded, &total); | |
2 | 573 |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
574 while ((err = dmres_preload(FALSE, &loaded, &total)) == DMERR_PROGRESS) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
575 { |
9
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
576 // Show a nice progress bar while loading |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
577 if (total > 0 && (loaded % 2) == 0) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
578 { |
9
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
579 int dx = 60, |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
580 dh = 20, |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
581 dw = engine.screen->w - (2 * dx), |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
582 dy = (engine.screen->h - dh) / 2; |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
583 |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
584 if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0) |
17 | 585 return DMERR_INIT_FAIL; |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
586 |
9
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
587 // Draw the progress bar |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
588 dmClearSurface(engine.screen, dmMapRGBA(engine.screen, 0,0,0,0)); |
9
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
589 dmFillRect(engine.screen, dx, dy, dx+dw, dy+dh, dmMapRGB(engine.screen, 255,255,255)); |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
590 dmFillRect(engine.screen, dx+1, dy+1, dx+dw-1, dy+dh-1, dmMapRGB(engine.screen, 0,0,0)); |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
591 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
592 if (total > 0) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
593 { |
9
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
594 dmFillRect(engine.screen, |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
595 dx+3, dy+3, |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
596 dx + 3 + ((dw - 3) * loaded) / total, |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
597 dy + dh - 3, |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
598 dmMapRGB(engine.screen, 200,200,200)); |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
599 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
600 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
601 // Flip screen |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
602 if (SDL_MUSTLOCK(engine.screen) != 0) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
603 SDL_UnlockSurface(engine.screen); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
604 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
605 SDL_Flip(engine.screen); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
606 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
607 } |
17 | 608 |
609 return err; | |
610 } | |
611 | |
612 | |
613 | |
614 int main(int argc, char *argv[]) | |
615 { | |
616 BOOL initSDL = FALSE; | |
617 JSSModule *mod = NULL; | |
618 JSSMixer *dev = NULL; | |
619 JSSPlayer *plr = NULL; | |
620 int err, i; | |
621 SDL_AudioSpec afmt; | |
622 | |
623 memset(&afmt, 0, sizeof(afmt)); | |
624 memset(&frame, 0, sizeof(frame)); | |
625 memset(&engine, 0, sizeof(engine)); | |
626 | |
627 dmInitProg("krapula", "Lauantai Aamun Krapula", "0.2", "(c) 2012 Anciat Prodz & TNSP", "PENIS."); | |
628 if (!dmArgsProcess(argc, argv, optList, optListN, | |
629 argHandleOpt, NULL, FALSE)) | |
630 exit(1); | |
631 | |
632 dmPrint(0, "%s\n", dmProgDesc); | |
633 dmPrint(0, "%s\n", dmProgAuthor); | |
634 dmPrint(0, "TNSP PIERUPASKA engine 2012 'passeli professional' loading.\n"); | |
635 | |
636 // Initialize resource subsystem | |
637 dmPrint(1, "Initializing resources subsystem.\n"); | |
638 if ((err = dmres_init("orvellys.dat", NULL, DRF_USE_PACK | DRF_PRELOAD_RES, engineClassifier)) != DMERR_OK) | |
639 { | |
640 dmError("Could not initialize resource manager: %d, %s.\n", err, dmErrorStr(err)); | |
641 goto error_exit; | |
642 } | |
643 | |
644 | |
645 // Initialize SDL components | |
646 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) != 0) | |
647 { | |
648 dmError("Could not initialize SDL: %s\n", SDL_GetError()); | |
649 goto error_exit; | |
650 } | |
651 initSDL = TRUE; | |
652 | |
653 | |
654 // Initialize JSS | |
655 jssInit(); | |
656 | |
657 afmt.freq = 44100; | |
658 afmt.format = AUDIO_S16SYS; | |
659 afmt.channels = 2; | |
660 afmt.samples = 16*1024; | |
661 | |
662 dmPrint(1, "Initializing miniJSS mixer with: %d, %d, %d\n", | |
663 JSS_AUDIO_S16, afmt.channels, afmt.freq); | |
664 | |
665 if ((dev = jvmInit(JSS_AUDIO_S16, afmt.channels, afmt.freq, JMIX_AUTO)) == NULL) | |
666 { | |
667 dmError("jvmInit() returned NULL, voi perkele.\n"); | |
668 goto error_exit; | |
669 } | |
670 | |
671 if ((plr = jmpInit(dev)) == NULL) | |
672 { | |
673 dmError("jmpInit() returned NULL\n"); | |
674 goto error_exit; | |
675 } | |
676 | |
677 // Initialize SDL audio | |
678 dmPrint(1, "Trying to init SDL audio with: %d, %d, %d\n", | |
679 afmt.format, afmt.channels, afmt.freq); | |
680 | |
681 afmt.callback = engineAudioCallback; | |
682 afmt.userdata = (void *) dev; | |
683 | |
684 if (SDL_OpenAudio(&afmt, NULL) < 0) | |
685 { | |
686 dmError("Couldn't open audio: %s\n", SDL_GetError()); | |
687 goto error_exit; | |
688 } | |
689 | |
690 // Initialize SDL video | |
691 dmPrint(1, "Initializing SDL video %d x %d x %dbpp - %08x flags\n", | |
692 optScrWidth, optScrHeight, 32, optVFlags); | |
693 | |
694 engine.screen = SDL_SetVideoMode(optScrWidth, optScrHeight, 32, optVFlags); | |
695 if (engine.screen == NULL) | |
696 { | |
697 dmError("Can't SDL_SetVideoMode(): %s\n", SDL_GetError()); | |
698 goto error_exit; | |
699 } | |
700 | |
701 SDL_ShowCursor(SDL_DISABLE); | |
702 SDL_WM_SetCaption(dmProgDesc, dmProgName); | |
703 | |
704 | |
705 // Load resources | |
706 err = engineLoadResources(); | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
707 if (err != DMERR_OK) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
708 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
709 dmError("Error loading resources, %d: %s.\n", |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
710 err, dmErrorStr(err)); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
711 goto error_exit; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
712 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
713 |
17 | 714 // Initialize effect stuff |
2 | 715 dmPerlinInit(); |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
716 SDL_Surface *nosfe[NOSFE_MAX - NOSFE_MIN + 1]; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
717 for (i = 0; i < NOSFE_MAX; i++) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
718 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
719 char fname[64]; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
720 snprintf(fname, sizeof(fname), "%08d.jpg", NOSFE_MIN + i); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
721 nosfe[i] = engineGetResImage(fname); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
722 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
723 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
724 for (i = 0; i < ncredits; i++) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
725 credits[i].img = engineGetResImage(credits[i].filename); |
2 | 726 |
727 SDL_Surface *bmap = SDL_CreateRGBSurface(SDL_SWSURFACE, QWIDTH, QHEIGHT, 8, 0, 0, 0, 0); | |
728 | |
17 | 729 |
730 // Initialize music player | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
731 jvmSetCallback(dev, jmpExec, plr); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
732 jmpSetModule(plr, engineGetResModule("krapula.xm")); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
733 jmpPlayOrder(plr, 0); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
734 jvmSetGlobalVol(dev, 55); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
735 SDL_PauseAudio(0); |
2 | 736 |
737 | |
738 engine.startTime = SDL_GetTicks(); | |
739 | |
740 while (!engine.exitFlag) | |
741 { | |
742 while (SDL_PollEvent(&engine.event)) | |
743 switch (engine.event.type) | |
744 { | |
745 case SDL_KEYDOWN: | |
746 switch (engine.event.key.keysym.sym) | |
747 { | |
748 case SDLK_ESCAPE: | |
749 engine.exitFlag = TRUE; | |
750 break; | |
751 | |
752 case SDLK_SPACE: | |
753 engine.pauseFlag = !engine.pauseFlag; | |
754 break; | |
755 | |
756 default: | |
757 break; | |
758 } | |
759 | |
760 break; | |
761 | |
762 case SDL_VIDEOEXPOSE: | |
763 break; | |
764 | |
765 case SDL_QUIT: | |
766 engine.exitFlag = TRUE; | |
767 break; | |
768 } | |
769 | |
770 // Draw frame | |
771 frame.startTime = SDL_GetTicks(); | |
772 | |
773 if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0) | |
774 { | |
775 dmError("Can't lock surface.\n"); | |
776 goto error_exit; | |
777 } | |
778 | |
779 float t = engineGetTimeDT(); | |
780 | |
781 if (t < 5) | |
782 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
783 SDL_Surface *anciat; |
2 | 784 int dt = engineGetTime(0); |
785 static DMLerpContext lerpX, lerpY, lerpD; | |
786 static DMScaledBlitFunc nblit; | |
787 DMVector light; | |
788 static BOOL nollattu = FALSE; | |
789 if (!nollattu) | |
790 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
791 anciat = engineGetResImage("anciat.png"); |
2 | 792 nblit = dmGetScaledBlitFunc(bmap->format, engine.screen->format, DMD_NONE); |
793 dmMakePalette(bmap); | |
794 dmLerpInit(&lerpX, 0, QWIDTH, 5000); | |
795 dmLerpInit(&lerpY, QHEIGHT * 0.25, QHEIGHT * 0.75, 5000); | |
796 dmLerpInit(&lerpD, 0.04, 0.08, 5000); | |
797 nollattu = TRUE; | |
798 } | |
799 | |
800 light.x = dmLerpSCurve(&lerpX, dt); | |
801 light.y = dmLerp1(&lerpY, dt); | |
802 light.z = 128; | |
803 | |
804 dmShadowTraceHeightMap2(bmap->pixels, anciat->pixels, &light); | |
805 nblit(bmap, 0, 0, engine.screen->w, engine.screen->h, engine.screen); | |
806 } | |
807 else | |
808 if (t < 10) | |
809 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
810 SDL_Surface *logobg, *logolayer1, *logolayer2; |
2 | 811 int dt = engineGetTime(5); |
812 static DMScaledBlitFunc nblit, kblit; | |
813 static DMLerpContext lerpD; | |
814 static BOOL nollattu = FALSE; | |
815 | |
816 if (!nollattu) | |
817 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
818 logobg = engineGetResImage("logobg.png"); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
819 logolayer1 = engineGetResImage("logolayer1.png"); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
820 logolayer2 = engineGetResImage("logolayer2.png"); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
821 |
2 | 822 nblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_TRANSPARENT); |
823 kblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_NONE); | |
824 dmLerpInit(&lerpD, 0.01, 500, 10000); | |
825 nollattu = TRUE; | |
826 } | |
827 | |
828 float q = dmLerpSCurve(&lerpD, dt); | |
829 float t = sin((float) dt / 150.0f); | |
830 int x = t * 25.0f + q, y = t * 35.0f + q*2.0f, | |
831 w = t * 70.0f + q, h = t * 40.0f + q*2.0f; | |
832 | |
833 float t2 = sin((float) dt / 150.0f + 0.2f); | |
834 int x2 = t2 * 25.0f + q, y2 = t * 35.0f + q*2.0f, | |
835 w2 = t2 * 70.0f + q, h2 = t * 40.0f + q*2.0f; | |
836 | |
837 kblit(logobg, 0, 0, engine.screen->w, engine.screen->h, engine.screen); | |
838 nblit(logolayer1, -x, -y, engine.screen->w+w, engine.screen->h+h, engine.screen); | |
839 nblit(logolayer2, -x2, -y2, engine.screen->w+w2, engine.screen->h+h2, engine.screen); | |
840 } | |
841 else | |
842 if (t < 20) | |
843 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
844 SDL_Surface *gay, *logobg; |
2 | 845 int dt = engineGetTime(10); |
846 static DMLerpContext lerpX, lerpY, lerpD; | |
847 static DMScaledBlitFunc nblit, kblit; | |
848 static BOOL nollattu = FALSE; | |
849 DMVector light; | |
850 DMBlockMap heightMap; | |
851 | |
852 if (!nollattu) | |
853 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
854 gay = engineGetResImage("gay.png"); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
855 logobg = engineGetResImage("logobg.png"); |
2 | 856 nblit = dmGetScaledBlitFunc(bmap->format, engine.screen->format, DMD_NONE); |
857 kblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_TRANSPARENT); | |
858 dmMakePalette(bmap); | |
859 dmLerpInit(&lerpX, QWIDTH, 0, 10000); | |
860 dmLerpInit(&lerpY, QHEIGHT * 0.25, QHEIGHT * 0.75, 10000); | |
861 dmLerpInit(&lerpD, 0.04, 0.08, 10000); | |
862 nollattu = TRUE; | |
863 } | |
864 | |
865 light.x = dmLerpSCurve(&lerpX, dt); | |
866 light.y = QHEIGHT * 0.5 + sin(dmLerp1(&lerpY, dt)) * 0.5; | |
867 light.z = 128; | |
868 | |
869 dmMakeBumpMap(heightMap, dmLerpSCurve(&lerpD, dt), 254); | |
870 | |
871 dmShadowTraceHeightMap(bmap->pixels, heightMap, &light); | |
872 | |
873 nblit(bmap, 0, 0, engine.screen->w, engine.screen->h, engine.screen); | |
874 | |
875 if ((dt / 100) % 10 < 5) | |
876 { | |
877 kblit(gay, 0, 0, engine.screen->w, engine.screen->h, engine.screen); | |
878 } | |
879 } | |
880 else | |
881 if (t < 45) | |
882 { | |
15 | 883 static SDL_Surface *ruutu; |
2 | 884 static int currState, currCredit, creditStartTime; |
885 static DMLerpContext lerpX, lerpY, lerpZ; | |
886 static DMScaledBlitFunc nblit, kblit; | |
887 static BOOL stateChange, nollattu = FALSE; | |
888 int currFrame = engineGetTime(20) * 15 / 1000; | |
889 if (!nollattu) | |
890 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
891 ruutu = engineGetResImage("ruutu.png"); |
2 | 892 dmClearSurface(ruutu, dmMapRGBA(ruutu, 0,0,0,0)); |
893 nblit = dmGetScaledBlitFunc(nosfe[0]->format, engine.screen->format, DMD_NONE); | |
894 kblit = dmGetScaledBlitFunc(credits[0].img->format, engine.screen->format, DMD_TRANSPARENT); | |
895 currCredit = -1; | |
896 currState = -1; | |
897 stateChange = TRUE; | |
898 nollattu = TRUE; | |
899 } | |
900 | |
901 float gt = 1.0f + sin(engineGetTime(0) / 250.0f); | |
902 int g1 = gt * 25.0f, g2 = gt * 50.0f; | |
903 | |
904 nblit(nosfe[currFrame % NOSFE_MAX], -g1, -g1, engine.screen->w+g2, engine.screen->h+g2, engine.screen); | |
905 | |
906 if (t >= 30) | |
907 { | |
908 int qtime = engineGetTime(30); | |
909 int creditTime = (engineGetTime(0) - creditStartTime); | |
910 float zscale; | |
911 if ( ( (qtime / (CREDITS_SPEED + 500)) % 2) == 0 && currState == -1) | |
912 stateChange = TRUE; | |
913 | |
914 if (stateChange && currCredit < ncredits) | |
915 { | |
916 // fprintf(stderr, "[%6d] stateChange: st=%d, credit=%d\n", creditTime, currState, currCredit); | |
917 stateChange = FALSE; | |
918 switch (currState) | |
919 { | |
920 case 0: | |
921 { | |
922 int qt = (qtime / 100) % nrandomCoords; | |
923 creditStartTime = engineGetTime(0); | |
924 creditTime = 0; | |
925 dmLerpInit(&lerpX, randomCoords[qt].x, credits[currCredit].x - 50, CREDITS_SPEED); | |
926 dmLerpInit(&lerpY, randomCoords[qt].y, credits[currCredit].y - 50, CREDITS_SPEED); | |
927 dmLerpInit(&lerpZ, 5.0f, 0.0f, CREDITS_SPEED); | |
928 currState = 1; | |
929 } | |
930 break; | |
931 | |
932 case 2: | |
933 if (creditTime >= CREDITS_SPEED) | |
934 creditTime = CREDITS_SPEED - 1; | |
935 | |
936 zscale = dmLerpSCurve(&lerpZ, creditTime); | |
937 dmScaledBlitSurface32to32TransparentX( | |
938 credits[currCredit].img, | |
939 dmLerpSCurve(&lerpX, creditTime) - (zscale * credits[currCredit].img->w), | |
940 dmLerpSCurve(&lerpY, creditTime) - (zscale * credits[currCredit].img->h), | |
941 credits[currCredit].img->w * (1.0f + zscale), | |
942 credits[currCredit].img->h * (1.0f + zscale), | |
943 ruutu); | |
944 | |
945 currState = -1; | |
946 break; | |
947 | |
948 default: | |
949 currCredit++; | |
950 currState = 0; | |
951 stateChange = TRUE; | |
952 break; | |
953 } | |
954 | |
955 // fprintf(stderr, "[%6d] changed: st=%d, credit=%d, chg=%d\n", creditTime, currState, currCredit, stateChange); | |
956 } | |
957 | |
958 | |
959 if (currCredit > 0) | |
960 { | |
961 kblit(ruutu, 0, 0, engine.screen->w, engine.screen->h, engine.screen); | |
962 } | |
963 | |
964 if (currState == 1) | |
965 { | |
966 if (creditTime >= CREDITS_SPEED) | |
967 { | |
968 creditTime = CREDITS_SPEED; | |
969 stateChange = TRUE; | |
970 currState = 2; | |
971 } | |
972 | |
973 zscale = dmLerpSCurve(&lerpZ, creditTime); | |
974 kblit(credits[currCredit].img, | |
975 dmLerpSCurve(&lerpX, creditTime) - (zscale * credits[currCredit].img->w), | |
976 dmLerpSCurve(&lerpY, creditTime) - (zscale * credits[currCredit].img->h), | |
977 credits[currCredit].img->w * (1.0f + zscale), | |
978 credits[currCredit].img->h * (1.0f + zscale), | |
979 engine.screen); | |
980 } | |
981 } | |
14
b2b506e1f42a
Add nice headache white fade synced to beat.
Matti Hamalainen <ccr@tnsp.org>
parents:
9
diff
changeset
|
982 |
2 | 983 } |
984 else | |
985 if (t < 60) | |
986 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
987 SDL_Surface *logobg, *greets; |
2 | 988 int dt = engineGetTime(45); |
989 static DMScaledBlitFunc nblit, kblit; | |
990 static DMLerpContext lerpD; | |
991 static BOOL nollattu = FALSE; | |
992 | |
993 if (!nollattu) | |
994 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
995 logobg = engineGetResImage("logobg.png"); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
996 greets = engineGetResImage("greetings.png"); |
2 | 997 nblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_TRANSPARENT); |
998 kblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_NONE); | |
999 dmLerpInit(&lerpD, 0.01, 500, 10000); | |
1000 nollattu = TRUE; | |
1001 } | |
1002 | |
1003 float q = dmLerpSCurve(&lerpD, dt); | |
15 | 1004 float t = sin((float) dt / 150.0f), |
1005 j = (1.0 + t) * 15; | |
2 | 1006 int x = t * 25.0f + q, y = t * 35.0f + q, |
1007 w = t * 70.0f + q*2.0f, h = t * 40.0f + q*2.0f; | |
1008 | |
15 | 1009 kblit(logobg, -j, -j, engine.screen->w+j*2.0f, engine.screen->h+j*2.0f, engine.screen); |
2 | 1010 nblit(greets, -x, -y, engine.screen->w+w, engine.screen->h+h, engine.screen); |
1011 } | |
1012 else | |
1013 engine.exitFlag = TRUE; | |
1014 | |
15 | 1015 { |
1016 static SDL_Surface *feidi; | |
1017 static int fadeStartTime; | |
1018 static BOOL fadeActive, nollattu = FALSE; | |
1019 static DMLerpContext fadeLerp; | |
1020 BOOL hit; | |
1021 int ch; | |
1022 | |
1023 if (!nollattu) | |
1024 { | |
1025 feidi = engineGetResImage("feidi.png"); | |
1026 dmLerpInit(&fadeLerp, 255, 0, 250); | |
1027 nollattu = TRUE; | |
1028 } | |
1029 | |
1030 JSS_LOCK(plr); | |
1031 for (hit = FALSE, ch = 0; ch < 6; ch++) | |
1032 if (plr->iCExtInstrumentN[ch] == 0) | |
1033 { | |
1034 hit = TRUE; | |
1035 break; | |
1036 } | |
1037 JSS_UNLOCK(plr); | |
1038 | |
1039 if (hit && !fadeActive) | |
1040 { | |
1041 fadeActive = TRUE; | |
1042 fadeStartTime = engineGetTime(0); | |
1043 } | |
1044 if (fadeActive) | |
1045 { | |
1046 int fadeTime = engineGetTime(0) - fadeStartTime; | |
1047 if (fadeTime < 250) | |
1048 { | |
1049 dmScaledBlitSurface32to32TransparentGA(feidi, | |
1050 0, 0, engine.screen->w, engine.screen->h, engine.screen, | |
1051 dmLerpSCurve(&fadeLerp, fadeTime)); | |
1052 } | |
1053 else | |
1054 fadeActive = FALSE; | |
1055 } | |
1056 } | |
1057 | |
2 | 1058 // Flip screen |
1059 if (SDL_MUSTLOCK(engine.screen) != 0) | |
1060 SDL_UnlockSurface(engine.screen); | |
1061 | |
1062 SDL_Flip(engine.screen); | |
1063 SDL_Delay(20); | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
1064 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
1065 // Get frame time, etc |
2 | 1066 frame.endTime = SDL_GetTicks(); |
1067 engine.currFrame++; | |
1068 engine.totalFrameTime += frame.endTime - frame.startTime; | |
1069 } | |
1070 | |
1071 // Print benchmark results | |
1072 engine.endTime = SDL_GetTicks(); | |
19 | 1073 dmPrint(1, "%d frames in %d ms, fps = %1.3f\n", |
2 | 1074 engine.currFrame, engine.endTime - engine.startTime, |
1075 (float) (engine.currFrame * 1000.0f) / (float) engine.totalFrameTime); | |
1076 | |
1077 | |
1078 error_exit: | |
19 | 1079 dmPrint(1, "Shutting down.\n"); |
2 | 1080 SDL_ShowCursor(SDL_ENABLE); |
1081 SDL_PauseAudio(1); | |
1082 | |
1083 if (engine.screen) | |
1084 SDL_FreeSurface(engine.screen); | |
1085 | |
7
2ff53bcfe366
Try to make sure that the audio shutdown does not hang.
Matti Hamalainen <ccr@tnsp.org>
parents:
2
diff
changeset
|
1086 SDL_LockAudio(); |
2 | 1087 jmpClose(plr); |
1088 jvmClose(dev); | |
1089 jssFreeModule(mod); | |
16 | 1090 jssClose(); |
7
2ff53bcfe366
Try to make sure that the audio shutdown does not hang.
Matti Hamalainen <ccr@tnsp.org>
parents:
2
diff
changeset
|
1091 SDL_UnlockAudio(); |
2 | 1092 |
1093 dmres_close(); | |
1094 | |
1095 if (initSDL) | |
1096 SDL_Quit(); | |
1097 | |
1098 dmPrint(0, "SDL on muuten melko paska kirjasto.\n"); | |
1099 | |
1100 return 0; | |
1101 } |