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