Mercurial > molko
annotate src/libmlk-rpg/rpg/map.c @ 320:8f9937403749
misc: improve loading of data
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 01 Oct 2021 20:30:00 +0200 |
parents | libmlk-rpg/rpg/map.c@d01e83210ca2 |
children | 460c78706989 |
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 * |
314 | 4 * Copyright (c) 2020-2021 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 |
148
c577c15df07f
misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents:
131
diff
changeset
|
24 #include <core/error.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
25 #include <core/event.h> |
148
c577c15df07f
misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents:
131
diff
changeset
|
26 #include <core/image.h> |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
27 #include <core/maths.h> |
148
c577c15df07f
misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents:
131
diff
changeset
|
28 #include <core/painter.h> |
c577c15df07f
misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents:
131
diff
changeset
|
29 #include <core/sprite.h> |
c577c15df07f
misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents:
131
diff
changeset
|
30 #include <core/sys.h> |
c577c15df07f
misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents:
131
diff
changeset
|
31 #include <core/texture.h> |
c577c15df07f
misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents:
131
diff
changeset
|
32 #include <core/window.h> |
c577c15df07f
misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents:
131
diff
changeset
|
33 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
34 #include <ui/debug.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
35 |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 #include "map.h" |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
37 #include "tileset.h" |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
39 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
40 * 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
|
41 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
42 * 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
|
43 * 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
|
44 */ |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
250
diff
changeset
|
45 #define SPEED 100 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
46 #define SEC 1000 |
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 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
49 * 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
|
50 * 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
|
51 */ |
274
a9064c09dde6
rpg: increase margins
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
52 #define MARGIN_WIDTH 160 |
a9064c09dde6
rpg: increase margins
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
53 #define MARGIN_HEIGHT 90 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
54 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
55 #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
|
56 #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
|
57 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
58 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
59 * 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
|
60 * it's possible to make diagonal movements. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
61 */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
62 enum movement { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
63 MOVING_UP = 1 << 0, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
64 MOVING_RIGHT = 1 << 1, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
65 MOVING_DOWN = 1 << 2, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
66 MOVING_LEFT = 1 << 3 |
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 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
70 * 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
|
71 * 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
|
72 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
73 * 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
|
74 * 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
|
75 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
76 * 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
|
77 * and right are pressed. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
78 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
79 * MOVING_UP = 0001 = 0x1 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
80 * MOVING_RIGHT = 0010 = 0x2 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
81 * MOVING_DOWN = 0100 = 0x3 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
82 * MOVING_LEFT = 1000 = 0x4 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
83 */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
84 static unsigned int orientations[16] = { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
85 [0x1] = 0, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
86 [0x2] = 2, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
87 [0x3] = 1, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
88 [0x4] = 4, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
89 [0x6] = 3, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
90 [0x8] = 6, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
91 [0x9] = 7, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
92 [0xC] = 5 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
93 }; |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
95 /* |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
96 * 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
|
97 * 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
|
98 * to check. |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
99 */ |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
100 static int |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
101 is_block_relevant(const struct map *map, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
102 const struct map_block *block, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
103 int drow, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
104 int dcol) |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
105 { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
106 if (drow) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
107 /* Object outside of left-right bounds. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
108 if (block->x + (int)block->w <= map->player_x || |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
109 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
|
110 return 0; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
111 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
112 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
|
113 (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
|
114 return 0; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
115 } else if (dcol) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
116 /* Object outside of up-down bounds. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
117 if (block->y + (int)block->h <= map->player_y || |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
118 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
|
119 return 0; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
120 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
121 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
|
122 (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
|
123 return 0; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
124 } |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
125 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
126 return 1; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
127 } |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
128 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
129 /* |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
130 * 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
|
131 * new block coordinates with the previous one. |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
132 */ |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
133 static int |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
134 is_block_better(const struct map_block *now, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
135 const struct map_block *new, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
136 int drow, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
137 int dcol) |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
138 { |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
139 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
|
140 (drow > 0 && new->y < now->y) || |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
141 (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
|
142 (dcol > 0 && new->x < now->x)); |
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 } |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
145 |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 static void |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
147 center(struct map *map) |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 { |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
149 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
|
150 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
|
151 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
152 if (map->view_x < 0) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
153 map->view_x = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
154 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
|
155 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
|
156 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
157 if (map->view_y < 0) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
158 map->view_y = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
159 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
|
160 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
|
161 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
162 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
163 static void |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
164 init(struct map *map) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
165 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
166 /* Adjust view. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
167 map->view_w = window.w; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
168 map->view_h = window.h; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
169 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
170 /* Adjust margin. */ |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
171 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
|
172 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
|
173 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
174 /* Center the view by default. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
175 center(map); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
176 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
177 /* Final bits. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
178 walksprite_init(&map->player_ws, map->player_sprite, 150); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
179 } |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
181 static void |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
182 handle_keydown(struct map *map, const union event *event) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
183 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
184 switch (event->key.key) { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
185 case KEY_UP: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
186 map->player_movement |= MOVING_UP; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
187 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
188 case KEY_RIGHT: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
189 map->player_movement |= MOVING_RIGHT; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
190 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
191 case KEY_DOWN: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
192 map->player_movement |= MOVING_DOWN; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
193 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
194 case KEY_LEFT: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
195 map->player_movement |= MOVING_LEFT; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
196 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
197 default: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
198 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
199 } |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
200 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
201 map->player_angle = orientations[map->player_movement]; |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 } |
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 static void |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
205 handle_keyup(struct map *map, const union event *event) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
206 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
207 switch (event->key.key) { |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
208 case KEY_TAB: |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
209 map->flags ^= MAP_FLAGS_SHOW_GRID | MAP_FLAGS_SHOW_COLLIDE; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
210 break; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
211 case KEY_UP: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
212 map->player_movement &= ~(MOVING_UP); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
213 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
214 case KEY_RIGHT: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
215 map->player_movement &= ~(MOVING_RIGHT); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
216 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
217 case KEY_DOWN: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
218 map->player_movement &= ~(MOVING_DOWN); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
219 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
220 case KEY_LEFT: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
221 map->player_movement &= ~(MOVING_LEFT); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
222 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
223 default: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
224 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
225 } |
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 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
228 static int |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
229 cmp_tile(const struct tileset_tiledef *td1, const struct tileset_tiledef *td2) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
230 { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
231 if (td1->id < td2->id) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
232 return -1; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
233 if (td1->id > td2->id) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
234 return 1; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
235 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
236 return 0; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
237 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
238 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
239 static struct tileset_tiledef * |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
240 find_tiledef_by_id(const struct map *map, unsigned short id) |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
241 { |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
242 typedef int (*cmp)(const void *, const void *); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
243 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
244 const struct tileset_tiledef key = { |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
245 .id = id |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
246 }; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
247 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
248 return bsearch(&key, map->tileset->tiledefs, map->tileset->tiledefsz, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
249 sizeof (key), (cmp)cmp_tile); |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
250 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
251 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
252 static struct tileset_tiledef * |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
253 find_tiledef_by_row_column_in_layer(const struct map *map, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
254 const struct map_layer *layer, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
255 int row, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
256 int col) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
257 { |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
258 unsigned short id; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
259 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
260 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
|
261 col < 0 || (unsigned int)col >= map->columns) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
262 return 0; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
263 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
264 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
|
265 return NULL; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
266 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
267 return find_tiledef_by_id(map, id - 1); |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
268 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
269 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
270 static struct tileset_tiledef * |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
271 find_tiledef_by_row_column(const struct map *map, int row, int col) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
272 { |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
273 struct tileset_tiledef *tile; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
274 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
275 /* TODO: probably a for loop when we have indefinite layers. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
276 if (!(tile = find_tiledef_by_row_column_in_layer(map, &map->layers[1], row, col))) |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
277 tile = find_tiledef_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
|
278 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
279 return tile; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
280 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
281 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
282 static void |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
283 find_block_iterate(const struct map *map, |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
284 struct map_block *block, |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
285 int rowstart, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
286 int rowend, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
287 int colstart, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
288 int colend, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
289 int drow, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
290 int dcol) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
291 { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
292 assert(map); |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
293 assert(block); |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
294 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
295 /* First, check with tiledefs. */ |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
296 for (int r = rowstart; r <= rowend; ++r) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
297 for (int c = colstart; c <= colend; ++c) { |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
298 struct tileset_tiledef *td; |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
299 struct map_block tmp; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
300 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
301 if (!(td = find_tiledef_by_row_column(map, r, c))) |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
302 continue; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
303 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
304 /* Convert to absolute values. */ |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
305 tmp.x = td->x + c * map->tileset->sprite->cellw; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
306 tmp.y = td->y + r * map->tileset->sprite->cellh; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
307 tmp.w = td->w; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
308 tmp.h = td->h; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
309 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
310 /* This tiledef is out of context. */ |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
311 if (!is_block_relevant(map, &tmp, drow, dcol)) |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
312 continue; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
313 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
314 if (is_block_better(block, &tmp, drow, dcol)) { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
315 block->x = tmp.x; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
316 block->y = tmp.y; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
317 block->w = tmp.w; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
318 block->h = tmp.h; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
319 } |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
320 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
321 } |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
322 |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
323 /* 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
|
324 for (size_t i = 0; i < map->blocksz; ++i) { |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
325 const struct map_block *new = &map->blocks[i]; |
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 if (is_block_relevant(map, new, drow, dcol) && |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
328 is_block_better(block, new, drow, dcol)) { |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
329 block->x = new->x; |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
330 block->y = new->y; |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
331 block->w = new->w; |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
332 block->h = new->h; |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
333 } |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
334 } |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
335 } |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
336 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
337 static void |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
338 find_collision(const struct map *map, struct 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
|
339 { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
340 assert((drow && !dcolumn) || (dcolumn && !drow)); |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
341 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
342 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
|
343 const int playerrow = map->player_y / map->tileset->sprite->cellh; |
216
33ddbe30440e
rpg: improve collisions
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
344 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
|
345 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
|
346 int rowstart, rowend, colstart, colend; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
347 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
348 if (drow) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
349 colstart = playercol; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
350 colend = playercol + ncols; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
351 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
352 if (drow < 0) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
353 /* Moving UP. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
354 rowstart = 0; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
355 rowend = playerrow; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
356 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
|
357 block->w = WIDTH(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
358 } else { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
359 /* Moving DOWN. */ |
216
33ddbe30440e
rpg: improve collisions
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
360 rowstart = playerrow; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
361 rowend = HEIGHT(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
362 block->x = block->h = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
363 block->y = HEIGHT(map); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
364 block->w = WIDTH(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
365 } |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
366 } else { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
367 rowstart = playerrow; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
368 rowend = playerrow + nrows; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
369 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
370 if (dcolumn < 0) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
371 /* Moving LEFT. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
372 colstart = 0; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
373 colend = playercol; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
374 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
|
375 block->h = HEIGHT(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
376 } else { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
377 /* Moving RIGHT. */ |
216
33ddbe30440e
rpg: improve collisions
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
378 colstart = playercol; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
379 colend = WIDTH(map); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
380 block->x = WIDTH(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
381 block->y = block->w = 0; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
382 block->h = block->h; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
383 } |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
384 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
385 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
386 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
|
387 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
388 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
389 static void |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
390 move_x(struct map *map, int delta) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
391 { |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
392 struct map_block block; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
393 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
394 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
|
395 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
396 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
|
397 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
|
398 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
|
399 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
|
400 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
401 map->player_x += delta; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
402 |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
403 if ((delta < 0 && map->player_x < map->margin_x) || |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
404 (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
|
405 map->view_x += delta; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
406 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
407 if (map->view_x < 0) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
408 map->view_x = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
409 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
|
410 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
|
411 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
412 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
413 static void |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
414 move_y(struct map *map, int delta) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
415 { |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
416 struct map_block block; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
417 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
418 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
|
419 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
420 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
|
421 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
|
422 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
|
423 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
|
424 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
425 map->player_y += delta; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
426 |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
427 if ((delta < 0 && map->player_y < map->margin_y) || |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
428 (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
|
429 map->view_y += delta; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
430 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
431 if (map->view_y < 0) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
432 map->view_y = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
433 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
|
434 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
|
435 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
436 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
437 static void |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
438 move(struct map *map, unsigned int ticks) |
42
22a09a5ee476
core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents:
41
diff
changeset
|
439 { |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
440 /* 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
|
441 const int delta = SPEED * ticks / SEC; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
442 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
443 /* 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
|
444 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
|
445 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
|
446 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
447 int dx = 0; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
448 int dy = 0; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
449 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
450 if (map->player_movement == 0) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
451 return; |
42
22a09a5ee476
core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents:
41
diff
changeset
|
452 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
453 if (map->player_movement & MOVING_UP) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
454 dy = -1; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
455 if (map->player_movement & MOVING_DOWN) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
456 dy = 1; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
457 if (map->player_movement & MOVING_LEFT) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
458 dx = -1; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
459 if (map->player_movement & MOVING_RIGHT) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
460 dx = 1; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
461 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
462 /* 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
|
463 if (dx) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
464 move_x(map, dx * delta); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
465 if (dy) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
466 move_y(map, dy * delta); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
467 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
468 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
|
469 } |
22a09a5ee476
core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents:
41
diff
changeset
|
470 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
471 static inline void |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
472 draw_layer_tile(const struct map *map, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
473 const struct map_layer *layer, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
474 struct texture *colbox, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
475 int start_col, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
476 int start_row, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
477 int start_x, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
478 int start_y, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
479 unsigned int r, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
480 unsigned int c) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
481 { |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
482 const struct tileset_tiledef *td; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
483 int index, id, sc, sr, mx, my; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
484 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
485 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
|
486 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
487 if ((id = layer->tiles[index]) == 0) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
488 return; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
489 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
490 id -= 1; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
491 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
492 /* Sprite row/column. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
493 sc = (id) % map->tileset->sprite->ncols; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
494 sr = (id) / map->tileset->sprite->ncols; |
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 /* On screen coordinates. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
497 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
|
498 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
|
499 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
500 tileset_draw(map->tileset, sr, sc, mx, my); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
501 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
502 if ((td = find_tiledef_by_id(map, id)) && texture_ok(colbox)) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
503 texture_scale(colbox, 0, 0, 5, 5, mx + td->x, my + td->y, td->w, td->h, 0); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
504 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
505 if (map->flags & MAP_FLAGS_SHOW_GRID) { |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
506 painter_set_color(0x202e37ff); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
507 painter_draw_line(mx, my, mx + (int)map->tileset->sprite->cellw, my); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
508 painter_draw_line( |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
509 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
|
510 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
|
511 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
512 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
513 |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
514 static void |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
515 draw_layer(const struct map *map, const struct map_layer *layer) |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
516 { |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
517 assert(map); |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
518 assert(layer); |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
519 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
520 /* Beginning of view in row/column. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
521 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
|
522 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
|
523 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
524 /* Convert into x/y coordinate. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
525 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
|
526 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
|
527 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
528 /* 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
|
529 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
|
530 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
|
531 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
532 struct texture colbox = {0}; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
533 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
534 if (!layer->tiles) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
535 return; |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
536 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
537 /* Show collision box if requested. */ |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
538 if (map->flags & MAP_FLAGS_SHOW_COLLIDE && texture_new(&colbox, 16, 16) == 0) { |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
539 texture_set_blend_mode(&colbox, TEXTURE_BLEND_BLEND); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
540 texture_set_alpha_mod(&colbox, 100); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
541 PAINTER_BEGIN(&colbox); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
542 painter_set_color(0xa53030ff); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
543 painter_clear(); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
544 PAINTER_END(); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
545 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
546 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
547 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
|
548 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
|
549 if (start_col + c >= map->columns || |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
550 start_row + r >= map->rows) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
551 continue; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
552 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
553 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
|
554 } |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
555 } |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
556 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
557 texture_finish(&colbox); |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
558 } |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
559 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
560 static void |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
561 draw_collide(const struct map *map) |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
562 { |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
563 struct texture box = {0}; |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
564 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
565 if (map->flags & MAP_FLAGS_SHOW_COLLIDE && texture_new(&box, 64, 64) == 0) { |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
566 /* Draw collide box around player if requested. */ |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
567 texture_set_alpha_mod(&box, 100); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
568 texture_set_blend_mode(&box, TEXTURE_BLEND_BLEND); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
569 PAINTER_BEGIN(&box); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
570 painter_set_color(0x4f8fbaff); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
571 painter_clear(); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
572 PAINTER_END(); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
573 texture_scale(&box, 0, 0, 64, 64, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
574 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
|
575 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
|
576 |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
577 /* Do the same for every objects. */ |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
578 PAINTER_BEGIN(&box); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
579 painter_set_color(0xa8ca58ff); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
580 painter_clear(); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
581 PAINTER_END(); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
582 |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
583 for (size_t i = 0; i < map->blocksz; ++i) { |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
584 texture_scale(&box, 0, 0, 64, 64, |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
585 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
|
586 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
|
587 0.f); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
588 } |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
589 |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
590 texture_finish(&box); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
591 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
592 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
593 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
594 int |
270
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
595 map_init(struct map *map) |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
596 { |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
597 assert(map); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
598 |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
599 init(map); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
600 tileset_start(map->tileset); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
601 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
274
diff
changeset
|
602 return 0; |
270
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 |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
605 void |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
606 map_handle(struct map *map, const union event *ev) |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
607 { |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
608 assert(map); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
609 assert(ev); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
610 |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
611 switch (ev->type) { |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
612 case EVENT_KEYDOWN: |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
613 handle_keydown(map, ev); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
614 break; |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
615 case EVENT_KEYUP: |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
616 handle_keyup(map, ev); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
617 break; |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
618 default: |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
619 break; |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
620 } |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
621 |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
622 action_stack_handle(&map->astack_par, ev); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
623 action_stack_handle(&map->astack_seq, ev); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
624 } |
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 void |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
627 map_update(struct map *map, unsigned int ticks) |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
628 { |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
629 assert(map); |
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 action_stack_update(&map->astack_par, ticks); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
632 action_stack_update(&map->astack_seq, ticks); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
633 |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
634 tileset_update(map->tileset, ticks); |
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 /* No movements if the sequential actions are running. */ |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
637 if (action_stack_completed(&map->astack_seq)) |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
638 move(map, ticks); |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
639 } |
2d8d1cacda36
rpg: move definitions
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
640 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
641 void |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
642 map_draw(const struct map *map) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
643 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
644 assert(map); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
645 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
646 /* Draw the texture about background/foreground. */ |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
647 draw_layer(map, &map->layers[MAP_LAYER_TYPE_BACKGROUND]); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
648 draw_layer(map, &map->layers[MAP_LAYER_TYPE_FOREGROUND]); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
649 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
650 walksprite_draw( |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
651 &map->player_ws, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
652 map->player_angle, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
653 map->player_x - map->view_x, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
654 map->player_y - map->view_y); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
655 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
656 draw_layer(map, &map->layers[MAP_LAYER_TYPE_ABOVE]); |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
657 draw_collide(map); |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
658 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
659 action_stack_draw(&map->astack_par); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
660 action_stack_draw(&map->astack_seq); |
41
3996f873a54b
core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents:
38
diff
changeset
|
661 } |
3996f873a54b
core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents:
38
diff
changeset
|
662 |
3996f873a54b
core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents:
38
diff
changeset
|
663 void |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
664 map_finish(struct map *map) |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
665 { |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
666 assert(map); |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
667 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
668 action_stack_finish(&map->astack_par); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
669 action_stack_finish(&map->astack_seq); |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
670 |
98
c7e993455985
map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents:
97
diff
changeset
|
671 memset(map, 0, sizeof (*map)); |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
672 } |