Mercurial > molko
annotate libmlk-adventure/adventure/molko.c @ 278:cc676046aac9
core: add sprite_scale function
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 15 Dec 2020 22:06:32 +0100 |
parents | 8d41e317c07b |
children | 87b8c7510717 |
rev | line source |
---|---|
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * molko.c -- main structure for Molko's Adventure |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
19 #include <assert.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <stddef.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <setjmp.h> |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
22 #include <string.h> |
243
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
23 #include <locale.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #include <core/clock.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #include <core/core.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 #include <core/event.h> |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
28 #include <core/image.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 #include <core/panic.h> |
276
8d41e317c07b
adventure: enable trace_hud
David Demelier <markand@malikania.fr>
parents:
267
diff
changeset
|
30 #include <core/sys.h> |
8d41e317c07b
adventure: enable trace_hud
David Demelier <markand@malikania.fr>
parents:
267
diff
changeset
|
31 #include <core/trace.h> |
243
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
32 #include <core/translate.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 #include <core/util.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 #include <core/window.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 #include <ui/ui.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 #include <rpg/rpg.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 #include <adventure/state/panic.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 #include <adventure/state/splashscreen.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 #include <adventure/state/mainmenu.h> |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
43 #include <adventure/state/map.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 |
267
bead76f6c793
adventure: start a global assets registry
David Demelier <markand@malikania.fr>
parents:
265
diff
changeset
|
45 #include "assets.h" |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 #include "molko.h" |
276
8d41e317c07b
adventure: enable trace_hud
David Demelier <markand@malikania.fr>
parents:
267
diff
changeset
|
47 #include "trace_hud.h" |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 #define WINDOW_WIDTH 1280 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 #define WINDOW_HEIGHT 720 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 static jmp_buf panic_buf; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 struct molko molko; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 |
229
e71039d820a7
doc: improve documentation
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
56 static void |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 crash(void) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 longjmp(panic_buf, 1); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 void |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 molko_init(void) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 { |
243
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
65 setlocale(LC_ALL, ""); |
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
66 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
229
diff
changeset
|
67 if (!core_init("fr.malikania", "molko") || !ui_init() || !rpg_init()) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 panic(); |
243
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
69 |
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
70 translate_init("libmlk-adventure"); |
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
71 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 if (!window_open("Molko's Adventure", WINDOW_WIDTH, WINDOW_HEIGHT)) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 panic(); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 * From here, we can setup our panic state which requires a window |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 * to be running. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 /* Init unrecoverable panic state. */ |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
81 molko.panic = panic_state_new(); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 panic_handler = crash; |
276
8d41e317c07b
adventure: enable trace_hud
David Demelier <markand@malikania.fr>
parents:
267
diff
changeset
|
83 trace_handler = trace_hud_handler; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 |
267
bead76f6c793
adventure: start a global assets registry
David Demelier <markand@malikania.fr>
parents:
265
diff
changeset
|
85 /* Init other stuff. */ |
bead76f6c793
adventure: start a global assets registry
David Demelier <markand@malikania.fr>
parents:
265
diff
changeset
|
86 assets_init(); |
bead76f6c793
adventure: start a global assets registry
David Demelier <markand@malikania.fr>
parents:
265
diff
changeset
|
87 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 /* Start to splash. */ |
265
11db1d425502
adventure: catch EVENT_QUIT
David Demelier <markand@malikania.fr>
parents:
263
diff
changeset
|
89 game_switch(splashscreen_state_new(), true); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 void |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 molko_run(void) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 if (setjmp(panic_buf) == 0) { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 /* Initial game run. */ |
261
bfde372bf152
core: prefix utilities with util_
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
97 game_loop(); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 } else { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 /* Clear event queue to avoid accidental key presses. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 for (union event ev; event_poll(&ev); ) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 continue; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
103 game_switch(molko.panic, true); |
261
bfde372bf152
core: prefix utilities with util_
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
104 game_loop(); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 void |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
109 molko_teleport(const char *map, int origin_x, int origin_y) |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
110 { |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
111 game_switch(map_state_new(map, origin_x, origin_y), false); |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
112 game.inhibit = INHIBIT_NONE; |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
113 } |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
114 |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
115 const char * |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
116 molko_path(const char *file) |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
117 { |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
118 assert(file); |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
119 |
263
cd5bdb995052
cmake: create a new libmlk-data library
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
120 return util_pathf("%s/mlk-adventure/%s", sys_dir(SYS_DIR_DATA), file); |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
121 } |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
122 |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
123 void |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 molko_finish(void) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 window_finish(); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 rpg_finish(); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 ui_finish(); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 core_finish(); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 } |