Mercurial > molko
annotate libmlk-adventure/adventure/molko.c @ 267:bead76f6c793
adventure: start a global assets registry
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 10 Dec 2020 16:28:30 +0100 |
parents | 11db1d425502 |
children | 8d41e317c07b |
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> |
243
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
30 #include <core/translate.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 #include <core/util.h> |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
32 #include <core/sys.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 #include <core/window.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 #include <ui/ui.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 #include <rpg/rpg.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 #include <adventure/state/panic.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 #include <adventure/state/splashscreen.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 #include <adventure/state/mainmenu.h> |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
42 #include <adventure/state/map.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 |
267
bead76f6c793
adventure: start a global assets registry
David Demelier <markand@malikania.fr>
parents:
265
diff
changeset
|
44 #include "assets.h" |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 #include "molko.h" |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 #define WINDOW_WIDTH 1280 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 #define WINDOW_HEIGHT 720 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 static jmp_buf panic_buf; |
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 struct molko molko; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 |
229
e71039d820a7
doc: improve documentation
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
54 static void |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 crash(void) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 longjmp(panic_buf, 1); |
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 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 void |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 molko_init(void) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 { |
243
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
63 setlocale(LC_ALL, ""); |
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
64 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
229
diff
changeset
|
65 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
|
66 panic(); |
243
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
67 |
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
68 translate_init("libmlk-adventure"); |
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
69 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 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
|
71 panic(); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 * 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
|
75 * to be running. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 /* Init unrecoverable panic state. */ |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
79 molko.panic = panic_state_new(); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 panic_handler = crash; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 |
267
bead76f6c793
adventure: start a global assets registry
David Demelier <markand@malikania.fr>
parents:
265
diff
changeset
|
82 /* Init other stuff. */ |
bead76f6c793
adventure: start a global assets registry
David Demelier <markand@malikania.fr>
parents:
265
diff
changeset
|
83 assets_init(); |
bead76f6c793
adventure: start a global assets registry
David Demelier <markand@malikania.fr>
parents:
265
diff
changeset
|
84 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 /* Start to splash. */ |
265
11db1d425502
adventure: catch EVENT_QUIT
David Demelier <markand@malikania.fr>
parents:
263
diff
changeset
|
86 game_switch(splashscreen_state_new(), true); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 void |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 molko_run(void) |
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 if (setjmp(panic_buf) == 0) { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 /* Initial game run. */ |
261
bfde372bf152
core: prefix utilities with util_
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
94 game_loop(); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 } else { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 /* Clear event queue to avoid accidental key presses. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 for (union event ev; event_poll(&ev); ) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 continue; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
100 game_switch(molko.panic, true); |
261
bfde372bf152
core: prefix utilities with util_
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
101 game_loop(); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 void |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
106 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
|
107 { |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
108 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
|
109 game.inhibit = INHIBIT_NONE; |
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 |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
112 const char * |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
113 molko_path(const char *file) |
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 assert(file); |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
116 |
263
cd5bdb995052
cmake: create a new libmlk-data library
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
117 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
|
118 } |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
119 |
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
120 void |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 molko_finish(void) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 window_finish(); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 rpg_finish(); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 ui_finish(); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 core_finish(); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 } |