Mercurial > molko
annotate src/libmlk-rpg/rpg/battle-entity-state-moving.c @ 383:b944cd41e8f9
rpg: do the same for battle entities
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 13 Feb 2022 11:13:17 +0100 |
parents | 460c78706989 |
children | c458441ff472 |
rev | line source |
---|---|
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * battle-entity-state-moving.c -- the entity is moving |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
378
460c78706989
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
4 * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr> |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <math.h> |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <stdlib.h> |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include <core/alloc.h> |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #include <core/panic.h> |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #include "battle-entity.h" |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 #include "battle-entity-state.h" |
383
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
28 #include "battle-entity-state-moving.h" |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 #include "character.h" |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include "walksprite.h" |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 #define SPEED 800 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 #define SEC 1000 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 #define WALK 40 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 |
383
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
36 struct self { |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
37 struct battle_entity_state_moving data; |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 struct battle_entity_state state; |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 }; |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 static inline unsigned int |
383
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
42 orientation(const struct battle_entity_state_moving *mv, const struct battle_entity *et) |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 { |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 /* TODO: support diagonal. */ |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 /* See: walksprite definitions. */ |
383
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
46 return mv->x < et->x ? 6 : 2; |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 } |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
254
diff
changeset
|
49 static int |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 update(struct battle_entity_state *st, struct battle_entity *et, unsigned int ticks) |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 { |
383
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
52 return battle_entity_state_moving_update(st->data, et, ticks); |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 } |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 static void |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 draw(const struct battle_entity_state *st, const struct battle_entity *et) |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 { |
383
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
58 battle_entity_state_moving_draw(st->data, et); |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 } |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 static void |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 finish(struct battle_entity_state *st, struct battle_entity *et) |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 { |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 (void)et; |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 free(st->data); |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 } |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 void |
383
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
70 battle_entity_state_moving_init(struct battle_entity_state_moving *mv, struct battle_entity *et, int dstx, int dsty) |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
71 { |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
72 assert(mv); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
73 assert(et); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
74 |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
75 walksprite_init(&mv->ws, et->ch->sprites[CHARACTER_SPRITE_NORMAL], 40); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
76 mv->x = dstx; |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
77 mv->y = dsty; |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
78 } |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
79 |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
80 int |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
81 battle_entity_state_moving_update(struct battle_entity_state_moving *mv, struct battle_entity *et, unsigned int ticks) |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
82 { |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
83 assert(mv); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
84 assert(et); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
85 |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
86 int step_x, step_y, delta_x, delta_y; |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
87 |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
88 delta_x = mv->x < et->x ? -1 : +1; |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
89 delta_y = mv->y < et->y ? -1 : +1; |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
90 step_x = fmin(SPEED * ticks / SEC, abs(et->x - mv->x)); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
91 step_y = fmin(SPEED * ticks / SEC, abs(et->y - mv->y)); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
92 |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
93 et->x += delta_x * step_x; |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
94 et->y += delta_y * step_y; |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
95 |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
96 if (et->x != mv->x || et->y != mv->y) |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
97 walksprite_update(&mv->ws, ticks); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
98 else |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
99 walksprite_reset(&mv->ws); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
100 |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
101 return et->x == mv->x && et->y == mv->y; |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
102 } |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
103 |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
104 void |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
105 battle_entity_state_moving_draw(const struct battle_entity_state_moving *mv, const struct battle_entity *et) |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
106 { |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
107 assert(mv); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
108 assert(battle_entity_ok(et)); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
109 |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
110 /* TODO: compute orientation. */ |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
111 walksprite_draw(&mv->ws, orientation(mv, et), et->x, et->y); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
112 } |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
113 |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
114 void |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
115 battle_entity_state_moving(struct battle_entity *et, int dstx, int dsty) |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 { |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 assert(et); |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 |
383
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
119 struct self *self; |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 |
383
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
121 self = alloc_new0(sizeof (*self)); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
122 self->state.data = self; |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
123 self->state.update = update; |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
124 self->state.draw = draw; |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
125 self->state.finish = finish; |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 |
383
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
127 battle_entity_state_moving_init(&self->data, et, dstx, dsty); |
b944cd41e8f9
rpg: do the same for battle entities
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
128 battle_entity_switch(et, &self->state); |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 } |