annotate libmlk-rpg/mlk/rpg/battle-state-selection.c @ 460:8fa69c770569

examples: fix
author David Demelier <markand@malikania.fr>
date Mon, 27 Feb 2023 09:14:27 +0100
parents b26dd49f69ff
children 91ce23a36143
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
2 * battle-state-selection.c -- battle state (selection)
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
445
773a082f0b91 misc: update copyright years
David Demelier <markand@malikania.fr>
parents: 442
diff changeset
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr>
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 <stdlib.h>
289
63d9fb56c609 rpg: rework selection
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
21 #include <string.h>
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
431
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 398
diff changeset
23 #include <mlk/core/alloc.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 398
diff changeset
24 #include <mlk/core/event.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 398
diff changeset
25 #include <mlk/core/panic.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 398
diff changeset
26 #include <mlk/core/sprite.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 398
diff changeset
27 #include <mlk/core/util.h>
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
433
862b15c3a3ae ui: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 431
diff changeset
29 #include <mlk/ui/theme.h>
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include "battle-bar.h"
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
32 #include "battle-state-item.h"
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
33 #include "battle-state-menu.h"
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
34 #include "battle-state-selection.h"
384
c458441ff472 rpg: more asserts, const and cleanups
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
35 #include "battle-state.h"
c458441ff472 rpg: more asserts, const and cleanups
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
36 #include "battle.h"
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 #include "character.h"
290
9948e288925b rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents: 289
diff changeset
38 #include "inventory.h"
9948e288925b rpg: add support for items in battle
David Demelier <markand@malikania.fr>
parents: 289
diff changeset
39 #include "selection.h"
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 #include "spell.h"
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
42 struct self {
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
43 struct battle_state_selection data;
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 struct battle_state state;
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 };
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 static void
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
48 select_adj_in(struct battle_state_selection *slt, struct battle_entity **entities, size_t entitiesz, int step)
289
63d9fb56c609 rpg: rework selection
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
49 {
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
50 assert(slt->select.index_character != (unsigned int)-1);
289
63d9fb56c609 rpg: rework selection
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
51
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
52 unsigned int newselection = slt->select.index_character;
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 if (step < 0) {
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 while (newselection > 0) {
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
56 if (character_ok(entities[--newselection]->ch)) {
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
57 slt->select.index_character = newselection;
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 break;
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 }
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 } else {
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 while (newselection < entitiesz) {
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
63 if (character_ok(entities[++newselection]->ch)) {
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
64 slt->select.index_character = newselection;
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 break;
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 }
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 }
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 }
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 static void
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
72 select_adj(struct battle_state_selection *slt, const struct battle *bt, int step)
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 {
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
74 if (slt->select.index_side == 0)
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
75 select_adj_in(slt, bt->enemies, bt->enemiesz, step);
289
63d9fb56c609 rpg: rework selection
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
76 else
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
77 select_adj_in(slt, bt->team, bt->teamsz, step);
192
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
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 static void
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
81 handle_keydown(struct battle_state_selection *stl, struct battle *bt, const union mlk_event *ev)
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 {
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
83 assert(ev->type == MLK_EVENT_KEYDOWN);
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 switch (ev->key.key) {
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
86 case MLK_KEY_ESCAPE:
385
3f13dc6c0e37 rpg: separate battle and the bar, closes #2522
David Demelier <markand@malikania.fr>
parents: 384
diff changeset
87 battle_state_menu(bt);
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 break;
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
89 case MLK_KEY_ENTER:
385
3f13dc6c0e37 rpg: separate battle and the bar, closes #2522
David Demelier <markand@malikania.fr>
parents: 384
diff changeset
90 battle_bar_select(bt->bar, bt, &stl->select);
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 break;
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
92 case MLK_KEY_LEFT:
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
93 if (stl->select.allowed_sides & SELECTION_SIDE_ENEMY)
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
94 stl->select.index_side = 0;
289
63d9fb56c609 rpg: rework selection
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
95 break;
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
96 case MLK_KEY_RIGHT:
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
97 if (stl->select.allowed_sides & SELECTION_SIDE_TEAM)
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
98 stl->select.index_side = 1;
289
63d9fb56c609 rpg: rework selection
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
99 break;
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
100 case MLK_KEY_UP:
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
101 select_adj(stl, bt, -1);
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 break;
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
103 case MLK_KEY_DOWN:
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
104 select_adj(stl, bt, +1);
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 break;
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
106 case MLK_KEY_TAB:
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
107 if (stl->select.allowed_kinds == SELECTION_KIND_BOTH)
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
108 stl->select.index_character = -1;
289
63d9fb56c609 rpg: rework selection
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
109 break;
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 default:
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 break;
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 }
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 }
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
114
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 static void
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 draw_cursor(const struct battle *bt, const struct battle_entity *et)
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 {
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 const struct theme *theme = BATTLE_THEME(bt);
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 const struct sprite *cursor = theme->sprites[THEME_SPRITE_CURSOR];
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 int x, y;
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 unsigned int lh;
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
122
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 if (!cursor)
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 return;
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 label_query(&et->name, NULL, &lh);
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 x = et->name.x - cursor->cellw - theme->padding;
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 y = et->name.y + (((int)(lh) - (int)(cursor->cellh)) / 2);
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 sprite_draw(cursor, 1, 2, x, y);
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 }
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 static void
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
135 draw_cursors(const struct battle *bt,
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
136 struct battle_entity * const *entities,
289
63d9fb56c609 rpg: rework selection
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
137 size_t entitiesz)
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 {
289
63d9fb56c609 rpg: rework selection
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
139 for (size_t i = 0; i < entitiesz; ++i) {
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
140 const struct battle_entity *et = entities[i];
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
142 if (et && character_ok(et->ch))
289
63d9fb56c609 rpg: rework selection
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
143 draw_cursor(bt, et);
63d9fb56c609 rpg: rework selection
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
144 }
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 }
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 static void
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
148 handle(struct battle_state *st, struct battle *bt, const union mlk_event *ev)
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 {
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
150 battle_state_selection_handle(st->data, bt, ev);
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 }
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 static void
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 draw(const struct battle_state *st, const struct battle *bt)
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 {
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
156 battle_state_selection_draw(st->data, bt);
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 }
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
158
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 static void
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 finish(struct battle_state *st, struct battle *bt)
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 {
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 (void)bt;
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163
460
8fa69c770569 examples: fix
David Demelier <markand@malikania.fr>
parents: 450
diff changeset
164 mlk_alloc_free(st->data);
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 }
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 void
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
168 battle_state_selection_init(struct battle_state_selection *stl, const struct selection *select)
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
169 {
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
170 assert(stl);
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
171 assert(select);
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
172
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
173 memcpy(&stl->select, select, sizeof (*select));
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
174 }
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
175
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
176 void
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
177 battle_state_selection_handle(struct battle_state_selection *stl, struct battle *bt, const union mlk_event *ev)
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
178 {
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
179 assert(stl);
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
180 assert(bt);
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
181 assert(ev);
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
182
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
183 switch (ev->type) {
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
184 case MLK_EVENT_KEYDOWN:
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
185 handle_keydown(stl, bt, ev);
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
186 break;
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
187 default:
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
188 break;
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
189 }
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
190 }
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
191
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
192 void
384
c458441ff472 rpg: more asserts, const and cleanups
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
193 battle_state_selection_draw(const struct battle_state_selection *stl, const struct battle *bt)
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
194 {
384
c458441ff472 rpg: more asserts, const and cleanups
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
195 assert(stl);
c458441ff472 rpg: more asserts, const and cleanups
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
196 assert(bt);
c458441ff472 rpg: more asserts, const and cleanups
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
197
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
198 battle_draw_component(bt, BATTLE_COMPONENT_ALL);
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
199
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
200 if (stl->select.index_character == -1U) {
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
201 /* All selected. */
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
202 if (stl->select.index_side == 0)
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
203 draw_cursors(bt, bt->enemies, bt->enemiesz);
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
204 else
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
205 draw_cursors(bt, bt->team, bt->teamsz);
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
206 } else {
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
207 /* Select one. */
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
208 if (stl->select.index_side == 0)
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
209 draw_cursor(bt, bt->enemies[stl->select.index_character]);
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
210 else
398
14ce7c4871e3 rpg: overhaul of battle bar
David Demelier <markand@malikania.fr>
parents: 387
diff changeset
211 draw_cursor(bt, bt->team[stl->select.index_character]);
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
212 }
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
213 }
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
214
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
215 void
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
216 battle_state_selection(struct battle *bt, const struct selection *select)
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 {
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 assert(bt);
384
c458441ff472 rpg: more asserts, const and cleanups
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
219 assert(select);
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
220
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
221 struct self *self;
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
222
442
9c3b3935f0aa core: rework allocations
David Demelier <markand@malikania.fr>
parents: 434
diff changeset
223 self = mlk_alloc_new0(1, sizeof (*self));
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
224 self->state.data = self;
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
225 self->state.handle = handle;
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
226 self->state.draw = draw;
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
227 self->state.finish = finish;
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
228
382
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
229 battle_state_selection_init(&self->data, select);
43d155668a55 rpg: expose battle state functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
230 battle_switch(bt, &self->state);
192
4ad7420ab678 rpg: add minimalist battle system, continue #2477 @60h
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 }