Mercurial > molko
annotate libmlk-rpg/mlk/rpg/battle.c @ 434:4e78f045e8c0
rpg: cleanup hierarchy
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 15 Oct 2022 21:24:17 +0200 |
parents | src/libmlk-rpg/rpg/battle.c@862b15c3a3ae |
children | 9c3b3935f0aa |
rev | line source |
---|---|
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * battle.c -- battles |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
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> |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <stdio.h> |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <stdlib.h> |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <string.h> |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
431
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
24 #include <mlk/core/alloc.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
25 #include <mlk/core/event.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
26 #include <mlk/core/font.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
27 #include <mlk/core/music.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
28 #include <mlk/core/sprite.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
29 #include <mlk/core/texture.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
30 #include <mlk/core/trace.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
31 #include <mlk/core/util.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
32 #include <mlk/core/window.h> |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 |
433
862b15c3a3ae
ui: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
431
diff
changeset
|
34 #include <mlk/ui/align.h> |
862b15c3a3ae
ui: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
431
diff
changeset
|
35 #include <mlk/ui/frame.h> |
862b15c3a3ae
ui: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
431
diff
changeset
|
36 #include <mlk/ui/label.h> |
862b15c3a3ae
ui: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
431
diff
changeset
|
37 #include <mlk/ui/theme.h> |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 |
385
3f13dc6c0e37
rpg: separate battle and the bar, closes #2522
David Demelier <markand@malikania.fr>
parents:
382
diff
changeset
|
39 #include "battle-bar.h" |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 #include "battle-indicator.h" |
382
43d155668a55
rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
41 #include "battle-state-ai.h" |
43d155668a55
rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
42 #include "battle-state-attacking.h" |
43d155668a55
rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
43 #include "battle-state-check.h" |
43d155668a55
rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
44 #include "battle-state-menu.h" |
43d155668a55
rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
45 #include "battle-state-opening.h" |
385
3f13dc6c0e37
rpg: separate battle and the bar, closes #2522
David Demelier <markand@malikania.fr>
parents:
382
diff
changeset
|
46 #include "battle-state.h" |
3f13dc6c0e37
rpg: separate battle and the bar, closes #2522
David Demelier <markand@malikania.fr>
parents:
382
diff
changeset
|
47 #include "battle.h" |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 #include "character.h" |
290
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
49 #include "inventory.h" |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
50 #include "item.h" |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 #include "spell.h" |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 struct indicator { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 struct drawable dw; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 struct battle_indicator bti; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 }; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
290
diff
changeset
|
58 static int |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 indicator_update(struct drawable *dw, unsigned int ticks) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 struct indicator *id = dw->data; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 return battle_indicator_update(&id->bti, ticks); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 static void |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 indicator_draw(struct drawable *dw) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 const struct indicator *id = dw->data; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 battle_indicator_draw(&id->bti, dw->x, dw->y); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 static void |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 indicator_free(struct drawable *dw) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 struct indicator *id = dw->data; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 battle_indicator_finish(&id->bti); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 free(id); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 static struct battle_entity * |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 find(struct battle *bt, const struct character *ch) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 struct battle_entity *et; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 BATTLE_TEAM_FOREACH(bt, et) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 if (et->ch == ch) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 return et; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 BATTLE_ENEMY_FOREACH(bt, et) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 if (et->ch == ch) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 return et; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 return NULL; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 |
286
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
98 static struct battle_entity * |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
99 random_select(struct battle_entity **group, size_t groupsz) |
286
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
100 { |
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
101 struct battle_entity *ret = NULL, *et = NULL; |
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
102 |
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
103 do { |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
104 et = group[util_nrand(0, groupsz - 1)]; |
286
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
105 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
106 if (et && et->ch) |
286
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
107 ret = et; |
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
108 } while (!ret); |
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
109 |
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
110 return ret; |
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
111 } |
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
112 |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 static int |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 cmp_order(const void *d1, const void *d2) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 const struct battle_entity *et1 = *(const struct battle_entity **)d1; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 const struct battle_entity *et2 = *(const struct battle_entity **)d2; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
119 return et2->ch->agt < et1->ch->agt; |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
290
diff
changeset
|
122 static int |
286
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
123 is_team(const struct battle *bt, const struct character *ch) |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 { |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
125 for (size_t i = 0; i < bt->teamsz; ++i) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
126 if (bt->team[i] && bt->team[i]->ch == ch) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
290
diff
changeset
|
127 return 1; |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
290
diff
changeset
|
129 return 0; |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 static void |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 positionate_name(struct battle_entity *et, const struct battle *bt) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 unsigned int lw; |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
136 struct sprite *sprite; |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 /* Show the character name below its sprite. */ |
235
fb304a94a05c
rpg: prepare equipment
David Demelier <markand@malikania.fr>
parents:
232
diff
changeset
|
139 sprite = et->ch->sprites[CHARACTER_SPRITE_NORMAL]; |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
140 |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 et->name.text = et->ch->name; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 et->name.flags = LABEL_FLAGS_SHADOW; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 label_query(&et->name, &lw, NULL); |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
144 et->name.y = et->y + sprite->cellh + BATTLE_THEME(bt)->padding; |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
145 et->name.x = et->x + (sprite->cellw / 2) - (lw / 2); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 static void |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
149 positionate_names(struct battle *bt) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 struct battle_entity *et; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 BATTLE_TEAM_FOREACH(bt, et) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 if (character_ok(et->ch)) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 positionate_name(et, bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 BATTLE_ENEMY_FOREACH(bt, et) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 if (character_ok(et->ch)) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 positionate_name(et, bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
159 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
160 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
161 static void |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
162 positionate_team(struct battle *bt) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
163 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
164 struct battle_entity *et; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
165 unsigned int requirement = 0, nmemb = 0, spacing; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
166 int x, y; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 BATTLE_TEAM_FOREACH(bt, et) { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 /* Stop in case any member of the team has been positionated. */ |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
170 if (et->x != 0 || et->y != 0) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 return; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
172 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
173 if (battle_entity_ok(bt->team[i])) { |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 nmemb++; |
235
fb304a94a05c
rpg: prepare equipment
David Demelier <markand@malikania.fr>
parents:
232
diff
changeset
|
175 requirement += et->ch->sprites[CHARACTER_SPRITE_NORMAL]->cellh; |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 /* TODO: compute a correct x placement. */ |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 spacing = (window.h - requirement) / (nmemb + 1); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 x = window.w - 200; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 y = spacing; |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
183 |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
184 BATTLE_TEAM_FOREACH(bt, et) { |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
185 if (battle_entity_ok(et)) { |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 et->x = x; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
187 et->y = y; |
235
fb304a94a05c
rpg: prepare equipment
David Demelier <markand@malikania.fr>
parents:
232
diff
changeset
|
188 y += et->ch->sprites[CHARACTER_SPRITE_NORMAL]->cellh + spacing; |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
190 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
191 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
193 static void |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
194 draw_entities(const struct battle *bt, struct battle_entity **entities, size_t entitiesz) |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
195 { |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
196 for (size_t i = 0; i < entitiesz; ++i) { |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
197 if (battle_entity_ok(entities[i])) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
198 battle_entity_draw(entities[i], bt); |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
199 } |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
200 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 static void |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
203 update_entities(struct battle_entity **entities, size_t entitiesz, unsigned int ticks) |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
204 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 for (size_t i = 0; i < entitiesz; ++i) { |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
206 if (battle_entity_ok(entities[i])) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
207 battle_entity_update(entities[i], ticks); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
210 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 void |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
212 battle_init(struct battle *bt) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
213 { |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
214 assert(bt); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
215 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
216 memset(bt, 0, sizeof (*bt)); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
217 } |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
218 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
219 int |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
220 battle_ok(const struct battle *bt) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
221 { |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
222 return bt && bt->state && bt->bar && bt->enemiesz && bt->team; |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
223 } |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
224 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
225 void |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
226 battle_start(struct battle *bt) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
227 { |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
228 assert(bt); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
229 |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
230 struct battle_entity *et; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
231 |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
232 BATTLE_TEAM_FOREACH(bt, et) |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
233 if (battle_entity_ok(et)) |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
234 battle_entity_init(et); |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
235 BATTLE_ENEMY_FOREACH(bt, et) |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
236 if (battle_entity_ok(et)) |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
237 battle_entity_init(et); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
238 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
239 positionate_team(bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
240 positionate_names(bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
241 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
242 /* Start the state "opening" animation. */ |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
243 battle_state_opening(bt); |
208
c0e0d4accae8
rpg: add music support in battle
David Demelier <markand@malikania.fr>
parents:
192
diff
changeset
|
244 |
c0e0d4accae8
rpg: add music support in battle
David Demelier <markand@malikania.fr>
parents:
192
diff
changeset
|
245 /* Play music if present. */ |
c0e0d4accae8
rpg: add music support in battle
David Demelier <markand@malikania.fr>
parents:
192
diff
changeset
|
246 if (bt->music[0]) |
382
43d155668a55
rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
247 music_play(bt->music[0], MUSIC_LOOP); |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
248 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
249 battle_order(bt); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
250 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
251 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
252 void |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
253 battle_switch(struct battle *bt, struct battle_state *st) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
254 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
255 assert(bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
256 assert(st); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
257 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
258 if (bt->state) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
259 battle_state_finish(bt->state, bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
260 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
261 bt->state = st; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
262 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
263 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
264 void |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
265 battle_order(struct battle *bt) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
266 { |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
267 struct battle_entity **porder; |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
268 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
269 /* Create a pointer list to every entity. */ |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
270 bt->order = alloc_rearray0(bt->order, bt->ordersz, |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
271 bt->teamsz + bt->enemiesz, sizeof (*bt->order)); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
272 bt->ordersz = bt->teamsz + bt->enemiesz; |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
273 bt->ordercur = porder = bt->order; |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
274 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
275 for (size_t i = 0; i < bt->teamsz; ++i) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
276 if (bt->team[i] && character_ok(bt->team[i]->ch)) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
277 *porder++ = bt->team[i]; |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
278 for (size_t i = 0; i < bt->enemiesz; ++i) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
279 if (bt->enemies[i] && character_ok(bt->enemies[i]->ch)) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
280 *porder++ = bt->enemies[i]; |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
281 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
282 /* Now sort. */ |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
283 qsort(bt->order, bt->ordersz, sizeof (*bt->order), cmp_order); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
284 } |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
285 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
286 struct battle_entity * |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
287 battle_current(const struct battle *bt) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
288 { |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
289 assert(bt); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
290 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
291 return *bt->ordercur; |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
292 } |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
293 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
294 size_t |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
295 battle_index(const struct battle *bt) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
296 { |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
297 assert(bt); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
298 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
299 return bt->ordercur - bt->order; |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
300 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
301 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
302 void |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
303 battle_attack(struct battle *bt, |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
304 struct character *source, |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
305 struct character *target) |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
306 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
307 assert(bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
308 assert(character_ok(source)); |
286
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
309 |
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
310 /* Target is empty? select randomly. */ |
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
311 if (!target) { |
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
312 if (is_team(bt, source)) |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
313 target = random_select(bt->enemies, bt->enemiesz)->ch; |
286
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
314 else |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
315 target = random_select(bt->team, bt->teamsz)->ch; |
286
3991779aaba9
adventure: initial test of spawn
David Demelier <markand@malikania.fr>
parents:
261
diff
changeset
|
316 } |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
317 |
382
43d155668a55
rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
318 battle_state_attacking(battle_find(bt, source), battle_find(bt, target), bt); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
319 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
320 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
321 void |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
322 battle_cast(struct battle *bt, |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
323 struct character *source, |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
324 const struct spell *spell, |
289
63d9fb56c609
rpg: rework selection
David Demelier <markand@malikania.fr>
parents:
286
diff
changeset
|
325 const struct selection *selection) |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
326 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
327 assert(bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
328 assert(source); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
329 assert(spell); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
330 assert((unsigned int)source->mp >= spell->mp); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
331 |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
332 /* TODO: animate. */ |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
333 source->mp -= spell->mp; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
334 spell_action(spell, bt, source, selection); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
335 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
336 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
337 void |
290
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
338 battle_use(struct battle *bt, const struct item *item, struct character *owner, struct character *target) |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
339 { |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
340 assert(bt); |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
341 assert(item); |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
342 assert(owner); |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
343 assert(target); |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
344 |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
345 /* |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
346 * Change the state to check prior to execute the item so it can change to something else |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
347 * if needed. |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
348 */ |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
349 battle_state_check(bt); |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
350 |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
351 inventory_consume(bt->inventory, item, 1); |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
352 item_exec_battle(item, bt, owner, target); |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
353 } |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
354 |
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
355 void |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
356 battle_next(struct battle *bt) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
357 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
358 assert(bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
359 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
360 if (!bt->ordercur) |
232
085c2a02a93f
rpg: some cleanups in battle
David Demelier <markand@malikania.fr>
parents:
230
diff
changeset
|
361 battle_order(bt); |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
362 else { |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
363 if (bt->ordercur - bt->order + (size_t)1U >= bt->ordersz) |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
364 battle_order(bt); |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
365 else |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
366 bt->ordercur++; |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
367 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
368 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
369 if (is_team(bt, battle_current(bt)->ch)) { |
385
3f13dc6c0e37
rpg: separate battle and the bar, closes #2522
David Demelier <markand@malikania.fr>
parents:
382
diff
changeset
|
370 battle_bar_start(bt->bar, bt); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
371 battle_state_menu(bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
372 } else |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
373 battle_state_ai(bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
374 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
375 |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
376 struct battle_entity * |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
377 battle_find(struct battle *bt, const struct character *ch) |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
378 { |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
379 assert(bt); |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
380 |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
381 return find(bt, ch); |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
382 } |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
383 |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
384 void |
290
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
385 battle_indicator_hp(struct battle *bt, const struct character *target, long amount) |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
386 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
387 assert(bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
388 assert(target); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
389 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
390 const struct battle_entity *et = find(bt, target); |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
391 struct indicator *id; |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
392 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
393 if (!(bt->effects)) { |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
398
diff
changeset
|
394 tracef("unable to add id without a drawable_stack"); |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
395 return; |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
396 } |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
397 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
398 id = alloc_new0(sizeof (*id)); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
399 id->bti.color = BATTLE_INDICATOR_HP_COLOR; |
290
9948e288925b
rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents:
289
diff
changeset
|
400 id->bti.amount = labs(amount); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
401 |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
402 /* TODO: positionate better. */ |
235
fb304a94a05c
rpg: prepare equipment
David Demelier <markand@malikania.fr>
parents:
232
diff
changeset
|
403 id->dw.x = et->x + target->sprites[CHARACTER_SPRITE_NORMAL]->cellw; |
fb304a94a05c
rpg: prepare equipment
David Demelier <markand@malikania.fr>
parents:
232
diff
changeset
|
404 id->dw.y = et->y + target->sprites[CHARACTER_SPRITE_NORMAL]->cellh; |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
405 id->dw.data = id; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
406 id->dw.update = indicator_update; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
407 id->dw.draw = indicator_draw; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
408 id->dw.finish = indicator_free; |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
409 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
410 battle_indicator_start(&id->bti); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
411 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
412 if (drawable_stack_add(bt->effects, &id->dw) < 0) |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
413 drawable_finish(&id->dw); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
414 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
415 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
416 void |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
417 battle_handle_component(struct battle *bt, const union event *ev, enum battle_component comp) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
418 { |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
419 assert(bt); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
420 assert(ev); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
421 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
422 if (comp & BATTLE_COMPONENT_BAR) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
423 battle_bar_handle(bt->bar, bt, ev); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
424 if ((comp & BATTLE_COMPONENT_ACTIONS) && bt->actions) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
425 action_stack_handle(bt->actions, ev); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
426 } |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
427 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
428 void |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
429 battle_handle(struct battle *bt, const union event *ev) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
430 { |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
431 assert(bt); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
432 assert(ev); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
433 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
434 battle_state_handle(bt->state, bt, ev); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
435 } |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
436 |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
437 void |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
438 battle_update_component(struct battle *bt, unsigned int ticks, enum battle_component comp) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
439 { |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
440 assert(bt); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
441 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
442 if (comp & BATTLE_COMPONENT_ENTITIES) { |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
443 update_entities(bt->team, bt->teamsz, ticks); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
444 update_entities(bt->enemies, bt->enemiesz, ticks); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
445 } |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
446 if (comp & BATTLE_COMPONENT_BAR) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
447 battle_bar_update(bt->bar, bt, ticks); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
448 if ((comp & BATTLE_COMPONENT_ACTIONS) && bt->actions) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
449 action_stack_update(bt->actions, ticks); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
450 if ((comp & BATTLE_COMPONENT_DRAWABLES) && bt->effects) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
451 drawable_stack_update(bt->effects, ticks); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
452 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
453 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
290
diff
changeset
|
454 int |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
455 battle_update(struct battle *bt, unsigned int ticks) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
456 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
457 assert(bt && bt->state); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
458 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
459 return battle_state_update(bt->state, bt, ticks); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
460 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
461 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
462 void |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
463 battle_draw_component(const struct battle *bt, enum battle_component comp) |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
464 { |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
465 assert(bt); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
466 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
467 if ((comp & BATTLE_COMPONENT_BACKGROUND) && texture_ok(bt->background)) |
230
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
468 texture_scale(bt->background, |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
469 0, 0, bt->background->w, bt->background->h, |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
470 0, 0, window.w, window.h, |
86b71e1f9dd5
rpg: add movements in battle
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
471 0.f); |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
472 if (comp & BATTLE_COMPONENT_ENTITIES) { |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
473 draw_entities(bt, bt->team, bt->teamsz); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
474 draw_entities(bt, bt->enemies, bt->enemiesz); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
475 } |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
476 if (comp & BATTLE_COMPONENT_BAR) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
477 battle_bar_draw(bt->bar, bt); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
478 if ((comp & BATTLE_COMPONENT_ACTIONS) && bt->actions) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
479 action_stack_draw(bt->actions); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
480 if ((comp & BATTLE_COMPONENT_DRAWABLES) && bt->effects) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
481 drawable_stack_draw(bt->effects); |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
482 } |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
483 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
484 void |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
485 battle_draw(const struct battle *bt) |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
486 { |
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
487 assert(battle_ok(bt)); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
488 |
315
3bfaaf5342a9
cmake: add support for Visual Studio 2019
David Demelier <markand@malikania.fr>
parents:
314
diff
changeset
|
489 battle_state_draw(bt->state, bt); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
490 } |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
491 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
492 void |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
493 battle_finish(struct battle *bt) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
494 { |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
495 assert(bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
496 |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
497 if (bt->state) |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
498 battle_state_finish(bt->state, bt); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
499 |
398
14ce7c4871e3
rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents:
385
diff
changeset
|
500 free(bt->order); |
192
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
501 memset(bt, 0, sizeof (*bt)); |
4ad7420ab678
rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
502 } |