Mercurial > molko
annotate libmlk-rpg/rpg/map.c @ 243:71b3b7036de7
misc: lot of cleanups,
- prefix libraries with libmlk,
- move assets from source directories closes #2520,
- prefix header guards closes #2519
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 28 Nov 2020 22:37:30 +0100 |
parents | librpg/rpg/map.c@71f989ae8de9 |
children | 8ef7fb7f14ad |
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 * |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr> |
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 */ |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
45 #define SPEED 220 |
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 */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
52 #define MARGIN_WIDTH 80 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
53 #define MARGIN_HEIGHT 80 |
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 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
95 struct collision { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
96 int x; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
97 int y; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
98 unsigned int w; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
99 unsigned int h; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
100 }; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
101 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
102 static bool |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
103 is_collision_out(const struct map *map, struct collision *block, int drow, int dcol) |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
104 { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
105 if (drow) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
106 /* Object outside of left-right bounds. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
107 if (block->x + (int)block->w <= map->player_x || |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
108 block->x >= map->player_x + (int)map->player_sprite->cellw) |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
109 return false; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
110 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
111 if ((drow < 0 && block->y >= map->player_y + (int)map->player_sprite->cellh) || |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
112 (drow > 0 && block->y + block->h <= map->player_y + map->player_sprite->cellh)) |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
113 return false; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
114 } else if (dcol) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
115 /* Object outside of up-down bounds. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
116 if (block->y + (int)block->h <= map->player_y || |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
117 block->y >= map->player_y + (int)map->player_sprite->cellh) |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
118 return false; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
119 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
120 if ((dcol < 0 && block->x >= map->player_x + (int)map->player_sprite->cellw) || |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
121 (dcol > 0 && block->x + block->w <= map->player_x + map->player_sprite->cellw)) |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
122 return false; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
123 } |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
124 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
125 return true; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
126 } |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
127 |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 static void |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
129 center(struct map *map) |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 { |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
131 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
|
132 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
|
133 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
134 if (map->view_x < 0) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
135 map->view_x = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
136 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
|
137 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
|
138 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
139 if (map->view_y < 0) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
140 map->view_y = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
141 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
|
142 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
|
143 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
144 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
145 static void |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
146 init(struct map *map) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
147 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
148 /* Adjust view. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
149 map->view_w = window.w; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
150 map->view_h = window.h; |
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 /* Adjust margin. */ |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
153 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
|
154 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
|
155 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
156 /* Center the view by default. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
157 center(map); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
158 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
159 /* Final bits. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
160 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
|
161 } |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
162 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
163 static void |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
164 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
|
165 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
166 switch (event->key.key) { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
167 case KEY_UP: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
168 map->player_movement |= MOVING_UP; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
169 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
170 case KEY_RIGHT: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
171 map->player_movement |= MOVING_RIGHT; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
172 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
173 case KEY_DOWN: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
174 map->player_movement |= MOVING_DOWN; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
175 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
176 case KEY_LEFT: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
177 map->player_movement |= MOVING_LEFT; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
178 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
179 default: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
180 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
181 } |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
183 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
|
184 } |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
185 |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 static void |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
187 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
|
188 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
189 switch (event->key.key) { |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
190 case KEY_TAB: |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
191 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
|
192 break; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
193 case KEY_UP: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
194 map->player_movement &= ~(MOVING_UP); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
195 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
196 case KEY_RIGHT: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
197 map->player_movement &= ~(MOVING_RIGHT); |
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 case KEY_DOWN: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
200 map->player_movement &= ~(MOVING_DOWN); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
201 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
202 case KEY_LEFT: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
203 map->player_movement &= ~(MOVING_LEFT); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
204 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
205 default: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
206 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
207 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
208 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
209 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
210 static int |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
211 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
|
212 { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
213 if (td1->id < td2->id) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
214 return -1; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
215 if (td1->id > td2->id) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
216 return 1; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
217 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
218 return 0; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
219 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
220 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
221 static struct tileset_tiledef * |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
222 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
|
223 { |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
224 typedef int (*cmp)(const void *, const void *); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
225 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
226 const struct tileset_tiledef key = { |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
227 .id = id |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
228 }; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
229 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
230 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
|
231 sizeof (key), (cmp)cmp_tile); |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
232 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
233 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
234 static struct tileset_tiledef * |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
235 find_tiledef_by_row_column_in_layer(const struct map *map, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
236 const struct map_layer *layer, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
237 int row, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
238 int col) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
239 { |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
240 unsigned short id; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
241 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
242 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
|
243 col < 0 || (unsigned int)col >= map->columns) |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
244 return false; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
245 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
246 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
|
247 return NULL; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
248 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
249 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
|
250 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
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(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
|
254 { |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
255 struct tileset_tiledef *tile; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
256 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
257 /* TODO: probably a for loop when we have indefinite layers. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
258 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
|
259 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
|
260 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
261 return tile; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
262 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
263 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
264 static void |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
265 find_block_iterate(const struct map *map, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
266 struct collision *block, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
267 int rowstart, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
268 int rowend, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
269 int colstart, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
270 int colend, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
271 int drow, |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
272 int dcol) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
273 { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
274 assert(map); |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
275 assert(block); |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
276 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
277 for (int r = rowstart; r <= rowend; ++r) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
278 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
|
279 struct tileset_tiledef *td; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
280 struct collision tmp; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
281 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
282 if (!(td = find_tiledef_by_row_column(map, r, c))) |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
283 continue; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
284 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
285 /* Convert to absolute values. */ |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
286 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
|
287 tmp.y = td->y + r * map->tileset->sprite->cellh; |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
288 tmp.w = td->w; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
289 tmp.h = td->h; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
290 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
291 /* This tiledef is out of context. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
292 if (!is_collision_out(map, &tmp, drow, dcol)) |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
293 continue; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
294 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
295 if ((drow < 0 && tmp.y + tmp.h > block->y + block->h) || |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
296 (drow > 0 && tmp.y < block->y) || |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
297 (dcol < 0 && tmp.x + tmp.w > block->x + block->w) || |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
298 (dcol > 0 && tmp.x < block->x)) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
299 block->x = tmp.x; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
300 block->y = tmp.y; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
301 block->w = tmp.w; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
302 block->h = tmp.h; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
303 } |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
304 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
305 } |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
306 } |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
307 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
308 static void |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
309 find_collision(const struct map *map, struct collision *block, int drow, int dcolumn) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
310 { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
311 assert((drow && !dcolumn) || (dcolumn && !drow)); |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
312 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
313 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
|
314 const int playerrow = map->player_y / map->tileset->sprite->cellh; |
216
33ddbe30440e
rpg: improve collisions
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
315 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
|
316 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
|
317 int rowstart, rowend, colstart, colend; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
318 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
319 if (drow) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
320 colstart = playercol; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
321 colend = playercol + ncols; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
322 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
323 if (drow < 0) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
324 /* Moving UP. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
325 rowstart = 0; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
326 rowend = playerrow; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
327 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
|
328 block->w = WIDTH(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
329 } else { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
330 /* Moving DOWN. */ |
216
33ddbe30440e
rpg: improve collisions
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
331 rowstart = playerrow; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
332 rowend = HEIGHT(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
333 block->x = block->h = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
334 block->y = HEIGHT(map); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
335 block->w = WIDTH(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
336 } |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
337 } else { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
338 rowstart = playerrow; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
339 rowend = playerrow + nrows; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
340 |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
341 if (dcolumn < 0) { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
342 /* Moving LEFT. */ |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
343 colstart = 0; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
344 colend = playercol; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
345 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
|
346 block->h = HEIGHT(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
347 } else { |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
348 /* Moving RIGHT. */ |
216
33ddbe30440e
rpg: improve collisions
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
349 colstart = playercol; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
350 colend = WIDTH(map); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
351 block->x = WIDTH(map); |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
352 block->y = block->w = 0; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
353 block->h = block->h; |
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
354 } |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
355 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
356 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
357 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
|
358 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
359 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
360 static void |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
361 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
|
362 { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
363 struct collision block; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
364 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
365 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
|
366 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
367 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
|
368 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
|
369 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
|
370 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
|
371 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
372 map->player_x += delta; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
373 |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
374 if ((delta < 0 && map->player_x < map->margin_x) || |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
375 (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
|
376 map->view_x += delta; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
377 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
378 if (map->view_x < 0) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
379 map->view_x = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
380 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
|
381 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
|
382 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
383 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
384 static void |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
385 move_y(struct map *map, int delta) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
386 { |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
387 struct collision block; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
388 |
211
adcbb7ccfdee
rpg: some refactoring
David Demelier <markand@malikania.fr>
parents:
210
diff
changeset
|
389 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
|
390 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
391 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
|
392 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
|
393 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
|
394 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
|
395 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
396 map->player_y += delta; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
397 |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
398 if ((delta < 0 && map->player_y < map->margin_y) || |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
399 (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
|
400 map->view_y += delta; |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
401 |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
402 if (map->view_y < 0) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
403 map->view_y = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
404 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
|
405 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
|
406 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
407 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
408 static void |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
409 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
|
410 { |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
411 /* 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
|
412 const int delta = SPEED * ticks / SEC; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
413 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
414 /* 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
|
415 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
|
416 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
|
417 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
418 int dx = 0; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
419 int dy = 0; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
420 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
421 if (map->player_movement == 0) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
422 return; |
42
22a09a5ee476
core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents:
41
diff
changeset
|
423 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
424 if (map->player_movement & MOVING_UP) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
425 dy = -1; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
426 if (map->player_movement & MOVING_DOWN) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
427 dy = 1; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
428 if (map->player_movement & MOVING_LEFT) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
429 dx = -1; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
430 if (map->player_movement & MOVING_RIGHT) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
431 dx = 1; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
432 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
433 /* 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
|
434 if (dx) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
435 move_x(map, dx * delta); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
436 if (dy) |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
437 move_y(map, dy * delta); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
438 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
439 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
|
440 } |
22a09a5ee476
core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents:
41
diff
changeset
|
441 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
442 static inline void |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
443 draw_layer_tile(const struct map *map, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
444 const struct map_layer *layer, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
445 struct texture *colbox, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
446 int start_col, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
447 int start_row, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
448 int start_x, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
449 int start_y, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
450 unsigned int r, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
451 unsigned int c) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
452 { |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
453 const struct tileset_tiledef *td; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
454 int index, id, sc, sr, mx, my; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
455 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
456 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
|
457 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
458 if ((id = layer->tiles[index]) == 0) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
459 return; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
460 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
461 id -= 1; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
462 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
463 /* Sprite row/column. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
464 sc = (id) % map->tileset->sprite->ncols; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
465 sr = (id) / map->tileset->sprite->ncols; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
466 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
467 /* On screen coordinates. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
468 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
|
469 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
|
470 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
471 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
|
472 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
473 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
|
474 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
|
475 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
476 if (map->flags & MAP_FLAGS_SHOW_GRID) { |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
477 painter_set_color(0x202e37ff); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
478 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
|
479 painter_draw_line( |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
480 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
|
481 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
|
482 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
483 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
484 |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
485 static void |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
486 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
|
487 { |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
488 assert(map); |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
489 assert(layer); |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
490 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
491 /* Beginning of view in row/column. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
492 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
|
493 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
|
494 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
495 /* Convert into x/y coordinate. */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
496 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
|
497 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
|
498 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
499 /* 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
|
500 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
|
501 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
|
502 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
503 struct texture colbox = {0}; |
215
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 (!layer->tiles) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
506 return; |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
507 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
508 /* Show collision box if requested. */ |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
509 if (map->flags & MAP_FLAGS_SHOW_COLLIDE && texture_new(&colbox, 16, 16)) { |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
510 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
|
511 texture_set_alpha_mod(&colbox, 100); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
512 PAINTER_BEGIN(&colbox); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
513 painter_set_color(0xa53030ff); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
514 painter_clear(); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
515 PAINTER_END(); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
516 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
517 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
518 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
|
519 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
|
520 if (start_col + c >= map->columns || |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
521 start_row + r >= map->rows) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
522 continue; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
523 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
524 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
|
525 } |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
526 } |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
527 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
528 texture_finish(&colbox); |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
529 } |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
530 |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
531 bool |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
532 map_init(struct map *map) |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
533 { |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
534 assert(map); |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
535 |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
536 init(map); |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
216
diff
changeset
|
537 tileset_start(map->tileset); |
98
c7e993455985
map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents:
97
diff
changeset
|
538 |
c7e993455985
map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents:
97
diff
changeset
|
539 return true; |
c7e993455985
map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents:
97
diff
changeset
|
540 } |
c7e993455985
map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents:
97
diff
changeset
|
541 |
c7e993455985
map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents:
97
diff
changeset
|
542 void |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
543 map_handle(struct map *map, const union event *ev) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
544 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
545 assert(map); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
546 assert(ev); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
547 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
548 switch (ev->type) { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
549 case EVENT_KEYDOWN: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
550 handle_keydown(map, ev); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
551 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
552 case EVENT_KEYUP: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
553 handle_keyup(map, ev); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
554 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
555 default: |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
556 break; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
557 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
558 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
559 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
560 void |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
561 map_update(struct map *map, unsigned int ticks) |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
562 { |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
563 assert(map); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
564 |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
565 action_stack_update(&map->actions, ticks); |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
566 |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
216
diff
changeset
|
567 tileset_update(map->tileset, ticks); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
568 move(map, ticks); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
569 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
570 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
571 void |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
572 map_draw(const struct map *map) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
573 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
574 assert(map); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
575 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
576 struct texture box = {0}; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
577 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
578 /* Draw the texture about background/foreground. */ |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
579 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
|
580 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
|
581 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
582 walksprite_draw( |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
583 &map->player_ws, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
584 map->player_angle, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
585 map->player_x - map->view_x, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
586 map->player_y - map->view_y); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
587 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
588 draw_layer(map, &map->layers[MAP_LAYER_TYPE_ABOVE]); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
589 |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
590 action_stack_draw(&map->actions); |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
591 |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
592 /* Draw collide box around player if requested. */ |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
593 if (map->flags & MAP_FLAGS_SHOW_COLLIDE && |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
594 texture_new(&box, map->player_sprite->cellw, map->player_sprite->cellh)) { |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
595 texture_set_alpha_mod(&box, 100); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
596 texture_set_blend_mode(&box, TEXTURE_BLEND_BLEND); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
597 PAINTER_BEGIN(&box); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
598 painter_set_color(0x4f8fbaff); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
599 painter_clear(); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
600 PAINTER_END(); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
601 texture_draw(&box, map->player_x - map->view_x, map->player_y - map->view_y); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
602 texture_finish(&box); |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
603 } |
41
3996f873a54b
core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents:
38
diff
changeset
|
604 } |
3996f873a54b
core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents:
38
diff
changeset
|
605 |
3996f873a54b
core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents:
38
diff
changeset
|
606 void |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
607 map_finish(struct map *map) |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
608 { |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
609 assert(map); |
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
610 |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
611 action_stack_finish(&map->actions); |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
612 |
98
c7e993455985
map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents:
97
diff
changeset
|
613 memset(map, 0, sizeof (*map)); |
27
607bd90aba63
core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
614 } |