Mercurial > molko
annotate libmlk-rpg/mlk/rpg/map.c @ 599:cb8ca73f1aa4
rpg: walksprite -> mlk_walksprite
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 31 Mar 2023 20:01:00 +0200 |
parents | cdbc13ceff85 |
children | 19707e3ad048 |
rev | line source |
---|---|
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * map.c -- game map |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
445
773a082f0b91
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
442
diff
changeset
|
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <stdio.h> |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <stdlib.h> |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <string.h> |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
431
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
24 #include <mlk/core/event.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
25 #include <mlk/core/image.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
26 #include <mlk/core/maths.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
27 #include <mlk/core/painter.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
28 #include <mlk/core/sprite.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
29 #include <mlk/core/sys.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
30 #include <mlk/core/texture.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
31 #include <mlk/core/window.h> |
148
c577c15df07f
misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents:
131
diff
changeset
|
32 |
433
862b15c3a3ae
ui: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
431
diff
changeset
|
33 #include <mlk/ui/debug.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
34 |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 #include "map.h" |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
36 #include "tileset.h" |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
38 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
39 * This is the speed the player moves on the map. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
40 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
41 * SPEED represents the number of pixels it must move per SEC. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
42 * SEC simply represends the number of milliseconds in one second. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
43 */ |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
250
diff
changeset
|
44 #define SPEED 100 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
45 #define SEC 1000 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
46 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
47 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
48 * Those are margins within the edge of the screen. The camera always try to |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
49 * keep those padding between the player and the screen. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
50 */ |
274
a9064c09dde6
rpg: increase margins
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
51 #define MARGIN_WIDTH 160 |
a9064c09dde6
rpg: increase margins
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
52 #define MARGIN_HEIGHT 90 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
53 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
54 #define WIDTH(map) ((map)->columns * (map)->tileset->sprite->cellw) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
55 #define HEIGHT(map) ((map)->rows * (map)->tileset->sprite->cellh) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
56 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
57 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
58 * This structure defines the possible movement of the player as flags since |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
59 * it's possible to make diagonal movements. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
60 */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
61 enum movement { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
62 MOVING_UP = 1 << 0, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
63 MOVING_RIGHT = 1 << 1, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
64 MOVING_DOWN = 1 << 2, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
65 MOVING_LEFT = 1 << 3 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
66 }; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
67 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
68 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
69 * A bit of explanation within this array. The structure walksprite requires |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
70 * an orientation between 0-7 depending on the user direction. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
71 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
72 * Since keys for moving the character may be pressed at the same time, we need |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
73 * a conversion table from "key pressed" to "orientation". |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
74 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
75 * When an orientation is impossible, it is set to -1. Example, when both left |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
76 * and right are pressed. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
77 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
78 * MOVING_UP = 0001 = 0x1 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
79 * MOVING_RIGHT = 0010 = 0x2 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
80 * MOVING_DOWN = 0100 = 0x3 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
81 * MOVING_LEFT = 1000 = 0x4 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
82 */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
83 static unsigned int orientations[16] = { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
84 [0x1] = 0, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
85 [0x2] = 2, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
86 [0x3] = 1, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
87 [0x4] = 4, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
88 [0x6] = 3, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
89 [0x8] = 6, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
90 [0x9] = 7, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
91 [0xC] = 5 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
92 }; |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
94 /* |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
95 * Check if this block is usable for collision detection. For example if the |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
96 * player is moving upwards but the collision shape is below it is unnecessary |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
97 * to check. |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
98 */ |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
99 static int |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
100 is_block_relevant(const struct mlk_map *map, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
101 const struct mlk_map_block *block, |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
102 int drow, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
103 int dcol) |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
104 { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
105 if (drow) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
106 /* Object outside of left-right bounds. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
107 if (block->x + (int)block->w <= map->player_x || |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
108 block->x >= map->player_x + (int)map->player_sprite->cellw) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
109 return 0; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
110 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
111 if ((drow < 0 && block->y >= map->player_y + (int)map->player_sprite->cellh) || |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
112 (drow > 0 && block->y + block->h <= map->player_y + map->player_sprite->cellh)) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
113 return 0; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
114 } else if (dcol) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
115 /* Object outside of up-down bounds. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
116 if (block->y + (int)block->h <= map->player_y || |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
117 block->y >= map->player_y + (int)map->player_sprite->cellh) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
118 return 0; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
119 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
120 if ((dcol < 0 && block->x >= map->player_x + (int)map->player_sprite->cellw) || |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
121 (dcol > 0 && block->x + block->w <= map->player_x + map->player_sprite->cellw)) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
122 return 0; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
123 } |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
124 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
125 return 1; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
126 } |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
127 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
128 /* |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
129 * Determine if this collision shape is "closer" to the player by checking the |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
130 * new block coordinates with the previous one. |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
131 */ |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
132 static int |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
133 is_block_better(const struct mlk_map_block *now, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
134 const struct mlk_map_block *new, |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
135 int drow, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
136 int dcol) |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
137 { |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
138 return ((drow < 0 && new->y + new->h > now->y + now->h) || |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
139 (drow > 0 && new->y < now->y) || |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
140 (dcol < 0 && new->x + new->w > now->x + now->w) || |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
141 (dcol > 0 && new->x < now->x)); |
431
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
142 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
143 } |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
144 |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 static void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
146 center(struct mlk_map *map) |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 { |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
148 map->view_x = map->player_x - (int)(map->view_w / 2); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
149 map->view_y = map->player_y - (int)(map->view_h / 2); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
150 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
151 if (map->view_x < 0) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
152 map->view_x = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
153 else if ((unsigned int)map->view_x > WIDTH(map) - map->view_w) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
154 map->view_x = WIDTH(map) - map->view_w; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
155 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
156 if (map->view_y < 0) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
157 map->view_y = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
158 else if ((unsigned int)map->view_y > HEIGHT(map) - map->view_h) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
159 map->view_y = HEIGHT(map) - map->view_h; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
160 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
161 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
162 static void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
163 init(struct mlk_map *map) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
164 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
165 /* Adjust view. */ |
485
3ff1fe64d0cd
core: window -> mlk_window
David Demelier <markand@malikania.fr>
parents:
472
diff
changeset
|
166 map->view_w = mlk_window.w; |
3ff1fe64d0cd
core: window -> mlk_window
David Demelier <markand@malikania.fr>
parents:
472
diff
changeset
|
167 map->view_h = mlk_window.h; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
168 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
169 /* Adjust margin. */ |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
170 map->margin_w = map->view_w - (MARGIN_WIDTH * 2) - map->player_sprite->cellw; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
171 map->margin_h = map->view_h - (MARGIN_HEIGHT * 2) - map->player_sprite->cellh; |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
172 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
173 /* Center the view by default. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
174 center(map); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
175 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
176 /* Final bits. */ |
599
cb8ca73f1aa4
rpg: walksprite -> mlk_walksprite
David Demelier <markand@malikania.fr>
parents:
554
diff
changeset
|
177 map->player_ws.sprite = map->player_sprite; |
cb8ca73f1aa4
rpg: walksprite -> mlk_walksprite
David Demelier <markand@malikania.fr>
parents:
554
diff
changeset
|
178 map->player_ws.delay = 150; |
cb8ca73f1aa4
rpg: walksprite -> mlk_walksprite
David Demelier <markand@malikania.fr>
parents:
554
diff
changeset
|
179 mlk_walksprite_init(&map->player_ws); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
180 } |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
182 static void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
183 handle_keydown(struct mlk_map *map, const union mlk_event *event) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
184 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
185 switch (event->key.key) { |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
186 case MLK_KEY_UP: |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
187 map->player_movement |= MOVING_UP; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
188 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
189 case MLK_KEY_RIGHT: |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
190 map->player_movement |= MOVING_RIGHT; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
191 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
192 case MLK_KEY_DOWN: |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
193 map->player_movement |= MOVING_DOWN; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
194 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
195 case MLK_KEY_LEFT: |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
196 map->player_movement |= MOVING_LEFT; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
197 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
198 default: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
199 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
200 } |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
202 map->player_a = orientations[map->player_movement]; |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
203 } |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
204 |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 static void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
206 handle_keyup(struct mlk_map *map, const union mlk_event *event) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
207 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
208 switch (event->key.key) { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
209 case MLK_KEY_F12: |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
210 map->flags ^= MLK_MAP_FLAGS_SHOW_GRID | MLK_MAP_FLAGS_SHOW_COLLIDE; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
211 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
212 case MLK_KEY_UP: |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
213 map->player_movement &= ~(MOVING_UP); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
214 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
215 case MLK_KEY_RIGHT: |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
216 map->player_movement &= ~(MOVING_RIGHT); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
217 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
218 case MLK_KEY_DOWN: |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
219 map->player_movement &= ~(MOVING_DOWN); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
220 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
221 case MLK_KEY_LEFT: |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
222 map->player_movement &= ~(MOVING_LEFT); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
223 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
224 default: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
225 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
226 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
227 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
228 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
229 // TODO: merge this code in tileset maybe. |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
230 static int |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
231 collision_cmp(const void *d1, const void *d2) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
232 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
233 const struct mlk_tileset_collision *c1 = d1; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
234 const struct mlk_tileset_collision *c2 = d2; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
235 |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
236 if (c1->id < c2->id) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
237 return -1; |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
238 if (c1->id > c2->id) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
239 return 1; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
240 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
241 return 0; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
242 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
243 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
244 static inline struct mlk_tileset_collision * |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
245 find_collision_by_id(const struct mlk_map *map, unsigned int id) |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
246 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
247 const struct mlk_tileset_collision key = { |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
248 .id = id |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
249 }; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
250 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
251 return bsearch(&key, map->tileset->collisions, map->tileset->collisionsz, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
252 sizeof (key), collision_cmp); |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
253 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
254 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
255 static struct mlk_tileset_collision * |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
256 find_collision_by_row_column_in_layer(const struct mlk_map *map, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
257 const struct mlk_map_layer *layer, |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
258 int row, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
259 int col) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
260 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
261 unsigned int id; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
262 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
263 if (row < 0 || (unsigned int)row >= map->rows || |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
264 col < 0 || (unsigned int)col >= map->columns) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
265 return 0; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
266 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
267 if ((id = layer->tiles[col + row * map->columns]) == 0) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
268 return NULL; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
269 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
270 return find_collision_by_id(map, id - 1); |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
271 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
272 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
273 static struct mlk_tileset_collision * |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
274 find_collision_by_row_column(const struct mlk_map *map, int row, int col) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
275 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
276 struct mlk_tileset_collision *tc; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
277 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
278 /* TODO: probably a for loop when we have indefinite layers. */ |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
279 if (!(tc = find_collision_by_row_column_in_layer(map, &map->layers[1], row, col))) |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
280 tc = find_collision_by_row_column_in_layer(map, &map->layers[0], row, col); |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
281 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
282 return tc; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
283 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
284 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
285 static void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
286 find_block_iterate(const struct mlk_map *map, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
287 struct mlk_map_block *block, |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
288 int rowstart, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
289 int rowend, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
290 int colstart, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
291 int colend, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
292 int drow, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
293 int dcol) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
294 { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
295 assert(map); |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
296 assert(block); |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
297 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
298 const struct mlk_tileset_collision *tc; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
299 const struct mlk_map_block *b; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
300 struct mlk_map_block tmp; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
301 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
302 /* First, check with tiledefs. */ |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
303 for (int r = rowstart; r <= rowend; ++r) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
304 for (int c = colstart; c <= colend; ++c) { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
305 if (!(tc = find_collision_by_row_column(map, r, c))) |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
306 continue; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
307 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
308 /* Convert to absolute values. */ |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
309 tmp.x = tc->x + c * map->tileset->sprite->cellw; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
310 tmp.y = tc->y + r * map->tileset->sprite->cellh; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
311 tmp.w = tc->w; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
312 tmp.h = tc->h; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
313 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
314 /* This tiledef is out of context. */ |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
315 if (!is_block_relevant(map, &tmp, drow, dcol)) |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
316 continue; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
317 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
318 if (is_block_better(block, &tmp, drow, dcol)) { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
319 block->x = tmp.x; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
320 block->y = tmp.y; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
321 block->w = tmp.w; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
322 block->h = tmp.h; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
323 } |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
324 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
325 } |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
326 |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
327 /* Now check if there are objects closer than tiledefs. */ |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
328 for (size_t i = 0; i < map->blocksz; ++i) { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
329 b = &map->blocks[i]; |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
330 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
331 if (is_block_relevant(map, b, drow, dcol) && |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
332 is_block_better(block, b, drow, dcol)) { |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
333 block->x = b->x; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
334 block->y = b->y; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
335 block->w = b->w; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
336 block->h = b->h; |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
337 } |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
338 } |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
339 } |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
340 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
341 static void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
342 find_collision(const struct mlk_map *map, struct mlk_map_block *block, int drow, int dcolumn) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
343 { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
344 assert((drow && !dcolumn) || (dcolumn && !drow)); |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
345 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
346 const int playercol = map->player_x / map->tileset->sprite->cellw; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
347 const int playerrow = map->player_y / map->tileset->sprite->cellh; |
216
33ddbe30440e
rpg: improve collisions
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
348 const int ncols = (map->player_sprite->cellw / map->tileset->sprite->cellw) + 1; |
33ddbe30440e
rpg: improve collisions
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
349 const int nrows = (map->player_sprite->cellh / map->tileset->sprite->cellh) + 1; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
350 int rowstart, rowend, colstart, colend; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
351 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
352 if (drow) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
353 colstart = playercol; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
354 colend = playercol + ncols; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
355 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
356 if (drow < 0) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
357 /* Moving UP. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
358 rowstart = 0; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
359 rowend = playerrow; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
360 block->x = block->y = block->h = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
361 block->w = WIDTH(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
362 } else { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
363 /* Moving DOWN. */ |
216
33ddbe30440e
rpg: improve collisions
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
364 rowstart = playerrow; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
365 rowend = HEIGHT(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
366 block->x = block->h = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
367 block->y = HEIGHT(map); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
368 block->w = WIDTH(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
369 } |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
370 } else { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
371 rowstart = playerrow; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
372 rowend = playerrow + nrows; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
373 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
374 if (dcolumn < 0) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
375 /* Moving LEFT. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
376 colstart = 0; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
377 colend = playercol; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
378 block->x = block->y = block->w = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
379 block->h = HEIGHT(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
380 } else { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
381 /* Moving RIGHT. */ |
216
33ddbe30440e
rpg: improve collisions
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
382 colstart = playercol; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
383 colend = WIDTH(map); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
384 block->x = WIDTH(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
385 block->y = block->w = 0; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
386 block->h = block->h; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
387 } |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
388 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
389 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
390 find_block_iterate(map, block, rowstart, rowend, colstart, colend, drow, dcolumn); |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
391 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
392 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
393 static void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
394 move_x(struct mlk_map *map, int delta) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
395 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
396 struct mlk_map_block block; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
397 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
398 find_collision(map, &block, 0, delta < 0 ? -1 : +1); |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
399 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
400 if (delta < 0 && map->player_x + delta < (int)(block.x + block.w)) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
401 delta = map->player_x - block.x - block.w; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
402 else if (delta > 0 && (int)(map->player_x + map->player_sprite->cellw + delta) >= block.x) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
403 delta = block.x - map->player_x - (int)(map->player_sprite->cellw); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
404 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
405 map->player_x += delta; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
406 |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
407 if ((delta < 0 && map->player_x < map->margin_x) || |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
408 (delta > 0 && map->player_x >= (int)(map->margin_x + map->margin_w))) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
409 map->view_x += delta; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
410 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
411 if (map->view_x < 0) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
412 map->view_x = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
413 else if (map->view_x >= (int)(WIDTH(map) - map->view_w)) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
414 map->view_x = WIDTH(map) - map->view_w; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
415 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
416 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
417 static void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
418 move_y(struct mlk_map *map, int delta) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
419 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
420 struct mlk_map_block block; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
421 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
422 find_collision(map, &block, delta < 0 ? -1 : +1, 0); |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
423 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
424 if (delta < 0 && map->player_y + delta < (int)(block.y + block.h)) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
425 delta = map->player_y - block.y - block.h; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
426 else if (delta > 0 && (int)(map->player_y + map->player_sprite->cellh + delta) >= block.y) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
427 delta = block.y - map->player_y - (int)(map->player_sprite->cellh); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
428 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
429 map->player_y += delta; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
430 |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
431 if ((delta < 0 && map->player_y < map->margin_y) || |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
432 (delta > 0 && map->player_y >= (int)(map->margin_y + map->margin_h))) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
433 map->view_y += delta; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
434 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
435 if (map->view_y < 0) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
436 map->view_y = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
437 else if (map->view_y >= (int)(HEIGHT(map) - map->view_h)) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
438 map->view_y = HEIGHT(map) - map->view_h; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
439 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
440 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
441 static void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
442 move(struct mlk_map *map, unsigned int ticks) |
42
22a09a5ee476
core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents:
41
diff
changeset
|
443 { |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
444 /* This is the amount of pixels the player must move. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
445 const int delta = SPEED * ticks / SEC; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
446 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
447 /* This is the rectangle within the view where users must be. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
448 map->margin_x = map->view_x + MARGIN_WIDTH; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
449 map->margin_y = map->view_y + MARGIN_HEIGHT; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
450 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
451 int dx = 0; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
452 int dy = 0; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
453 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
454 if (map->player_movement == 0) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
455 return; |
42
22a09a5ee476
core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents:
41
diff
changeset
|
456 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
457 if (map->player_movement & MOVING_UP) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
458 dy = -1; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
459 if (map->player_movement & MOVING_DOWN) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
460 dy = 1; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
461 if (map->player_movement & MOVING_LEFT) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
462 dx = -1; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
463 if (map->player_movement & MOVING_RIGHT) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
464 dx = 1; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
465 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
466 /* Move the player and adjust view if needed. */ |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
467 if (dx) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
468 move_x(map, dx * delta); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
469 if (dy) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
470 move_y(map, dy * delta); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
471 |
599
cb8ca73f1aa4
rpg: walksprite -> mlk_walksprite
David Demelier <markand@malikania.fr>
parents:
554
diff
changeset
|
472 mlk_walksprite_update(&map->player_ws, ticks); |
42
22a09a5ee476
core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents:
41
diff
changeset
|
473 } |
22a09a5ee476
core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents:
41
diff
changeset
|
474 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
475 static inline void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
476 draw_layer_tile(const struct mlk_map *map, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
477 const struct mlk_map_layer *layer, |
472
bc5483849614
core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents:
457
diff
changeset
|
478 struct mlk_texture *colbox, |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
479 int start_col, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
480 int start_row, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
481 int start_x, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
482 int start_y, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
483 unsigned int r, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
484 unsigned int c) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
485 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
486 const struct mlk_tileset_collision *tc; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
487 int index, id, sc, sr, mx, my; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
488 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
489 index = (start_col + c) + ((start_row + r) * map->columns); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
490 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
491 if ((id = layer->tiles[index]) == 0) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
492 return; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
493 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
494 id -= 1; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
495 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
496 /* Sprite row/column. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
497 sc = (id) % map->tileset->sprite->ncols; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
498 sr = (id) / map->tileset->sprite->ncols; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
499 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
500 /* On screen coordinates. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
501 mx = start_x + (int)c * (int)map->tileset->sprite->cellw; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
502 my = start_y + (int)r * (int)map->tileset->sprite->cellh; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
503 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
504 mlk_tileset_draw(map->tileset, sr, sc, mx, my); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
505 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
506 /* Draw collision box if colbox is non NULL. */ |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
507 if ((tc = find_collision_by_id(map, id)) && mlk_texture_ok(colbox)) |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
508 mlk_texture_scale(colbox, 0, 0, 5, 5, mx + tc->x, my + tc->y, tc->w, tc->h, 0); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
509 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
510 if (map->flags & MLK_MAP_FLAGS_SHOW_GRID) { |
457
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
511 mlk_painter_set_color(0x202e37ff); |
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
512 mlk_painter_draw_line(mx, my, mx + (int)map->tileset->sprite->cellw, my); |
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
513 mlk_painter_draw_line( |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
514 mx + (int)map->tileset->sprite->cellw - 1, my, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
515 mx + (int)map->tileset->sprite->cellw - 1, my + (int)map->tileset->sprite->cellh); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
516 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
517 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
518 |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
519 static void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
520 draw_layer(const struct mlk_map *map, const struct mlk_map_layer *layer) |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
521 { |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
522 assert(map); |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
523 assert(layer); |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
524 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
525 /* Beginning of view in row/column. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
526 const unsigned int start_col = map->view_x / map->tileset->sprite->cellw; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
527 const unsigned int start_row = map->view_y / map->tileset->sprite->cellh; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
528 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
529 /* Convert into x/y coordinate. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
530 const int start_x = 0 - (map->view_x % (int)map->tileset->sprite->cellw); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
531 const int start_y = 0 - (map->view_y % (int)map->tileset->sprite->cellh); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
532 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
533 /* Number of row/columns to draw starting from there. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
534 const unsigned int ncols = (map->view_w / map->tileset->sprite->cellw) + 2; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
535 const unsigned int nrows = (map->view_h / map->tileset->sprite->cellh) + 2; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
536 |
472
bc5483849614
core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents:
457
diff
changeset
|
537 struct mlk_texture colbox = {0}; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
538 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
539 if (!layer->tiles) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
540 return; |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
541 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
542 /* Show collision box if requested. */ |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
543 if (map->flags & MLK_MAP_FLAGS_SHOW_COLLIDE && mlk_texture_new(&colbox, 16, 16) == 0) { |
472
bc5483849614
core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents:
457
diff
changeset
|
544 mlk_texture_set_blend_mode(&colbox, MLK_TEXTURE_BLEND_BLEND); |
bc5483849614
core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents:
457
diff
changeset
|
545 mlk_texture_set_alpha_mod(&colbox, 100); |
457
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
546 MLK_PAINTER_BEGIN(&colbox); |
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
547 mlk_painter_set_color(0xa53030ff); |
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
548 mlk_painter_clear(); |
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
549 MLK_PAINTER_END(); |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
550 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
551 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
552 for (unsigned int r = 0; r < nrows; ++r) { |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
553 for (unsigned int c = 0; c < ncols; ++c) { |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
554 if (start_col + c >= map->columns || |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
555 start_row + r >= map->rows) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
556 continue; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
557 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
558 draw_layer_tile(map, layer, &colbox, start_col, start_row, start_x, start_y, r, c); |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
559 } |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
560 } |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
561 |
472
bc5483849614
core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents:
457
diff
changeset
|
562 mlk_texture_finish(&colbox); |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
563 } |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
564 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
565 static void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
566 draw_collide(const struct mlk_map *map) |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
567 { |
472
bc5483849614
core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents:
457
diff
changeset
|
568 struct mlk_texture box = {0}; |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
569 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
570 if (map->flags & MLK_MAP_FLAGS_SHOW_COLLIDE && mlk_texture_new(&box, 64, 64) == 0) { |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
571 /* Draw collide box around player if requested. */ |
472
bc5483849614
core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents:
457
diff
changeset
|
572 mlk_texture_set_alpha_mod(&box, 100); |
bc5483849614
core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents:
457
diff
changeset
|
573 mlk_texture_set_blend_mode(&box, MLK_TEXTURE_BLEND_BLEND); |
457
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
574 MLK_PAINTER_BEGIN(&box); |
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
575 mlk_painter_set_color(0x4f8fbaff); |
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
576 mlk_painter_clear(); |
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
577 MLK_PAINTER_END(); |
472
bc5483849614
core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents:
457
diff
changeset
|
578 mlk_texture_scale(&box, 0, 0, 64, 64, |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
579 map->player_x - map->view_x, map->player_y - map->view_y, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
580 map->player_sprite->cellw, map->player_sprite->cellh, 0.f); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
581 |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
582 /* Do the same for every objects. */ |
457
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
583 MLK_PAINTER_BEGIN(&box); |
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
584 mlk_painter_set_color(0xa8ca58ff); |
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
585 mlk_painter_clear(); |
04797b35565c
core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
586 MLK_PAINTER_END(); |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
587 |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
588 for (size_t i = 0; i < map->blocksz; ++i) { |
472
bc5483849614
core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents:
457
diff
changeset
|
589 mlk_texture_scale(&box, 0, 0, 64, 64, |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
590 map->blocks[i].x - map->view_x, map->blocks[i].y - map->view_y, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
591 map->blocks[i].w, map->blocks[i].h, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
592 0.f); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
593 } |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
594 |
472
bc5483849614
core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents:
457
diff
changeset
|
595 mlk_texture_finish(&box); |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
596 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
597 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
598 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
599 int |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
600 mlk_map_init(struct mlk_map *map) |
270
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
601 { |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
602 assert(map); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
603 |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
604 init(map); |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
605 mlk_tileset_start(map->tileset); |
270
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
606 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
607 return 0; |
270
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
608 } |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
609 |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
610 void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
611 mlk_map_handle(struct mlk_map *map, const union mlk_event *ev) |
270
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
612 { |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
613 assert(map); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
614 assert(ev); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
615 |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
616 switch (ev->type) { |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
617 case MLK_EVENT_KEYDOWN: |
270
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
618 handle_keydown(map, ev); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
619 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
620 case MLK_EVENT_KEYUP: |
270
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
621 handle_keyup(map, ev); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
622 break; |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
623 default: |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
624 break; |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
625 } |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
626 } |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
627 |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
628 void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
629 mlk_map_update(struct mlk_map *map, unsigned int ticks) |
270
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
630 { |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
631 assert(map); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
632 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
633 mlk_tileset_update(map->tileset, ticks); |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
634 move(map, ticks); |
270
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
635 } |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
636 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
637 void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
638 mlk_map_draw(const struct mlk_map *map) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
639 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
640 assert(map); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
641 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
642 /* Draw the texture about background/foreground. */ |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
643 draw_layer(map, &map->layers[MLK_MAP_LAYER_TYPE_BG]); |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
644 draw_layer(map, &map->layers[MLK_MAP_LAYER_TYPE_FG]); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
645 |
599
cb8ca73f1aa4
rpg: walksprite -> mlk_walksprite
David Demelier <markand@malikania.fr>
parents:
554
diff
changeset
|
646 mlk_walksprite_draw( |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
647 &map->player_ws, |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
648 map->player_a, |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
649 map->player_x - map->view_x, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
650 map->player_y - map->view_y); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
651 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
652 draw_layer(map, &map->layers[MLK_MAP_LAYER_TYPE_ABOVE]); |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
653 draw_collide(map); |
41
3996f873a54b
core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents:
38
diff
changeset
|
654 } |
3996f873a54b
core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents:
38
diff
changeset
|
655 |
3996f873a54b
core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents:
38
diff
changeset
|
656 void |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
486
diff
changeset
|
657 mlk_map_finish(struct mlk_map *map) |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
658 { |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
659 assert(map); |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
660 } |