annotate libmlk-adventure/adventure/action/spawner.c @ 273:e28429dbdaaf

adventure: uniform actions
author David Demelier <markand@malikania.fr>
date Sat, 12 Dec 2020 12:31:23 +0100
parents a49ae1b6ea4f
children f89a53abb314
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
260
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * spawner.c -- spawn battle while moving
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <math.h>
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <stdlib.h>
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <core/alloc.h>
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <core/game.h>
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <core/util.h>
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <rpg/map.h>
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include "spawner.h"
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
273
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
31 static inline unsigned int
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
32 distance(const struct spawner *s)
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
33 {
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
34 unsigned int gap_x = fmax(s->last_x, s->map->player_x) -
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
35 fmin(s->last_x, s->map->player_x);
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
36 unsigned int gap_y = fmax(s->last_y, s->map->player_y) -
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
37 fmin(s->last_y, s->map->player_y);
260
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
273
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
39 return fmin(s->steps, gap_x + gap_y);
260
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 }
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 static bool
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 update(struct action *act, unsigned int ticks)
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 {
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 (void)ticks;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
273
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
47 struct spawner *s = act->data;
260
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
273
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
49 if (s->map->player_movement) {
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
50 s->steps -= distance(s);
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
51 s->last_x = s->map->player_x;
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
52 s->last_y = s->map->player_y;
260
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
53
273
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
54 if (s->steps == 0) {
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
55 s->steps = util_nrand(s->low, s->high);
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
56
260
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 /* TODO: start battle here. */
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 return false;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 }
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 }
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 return false;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 }
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
273
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
65 void
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
66 spawner_init(struct spawner *s)
260
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 {
273
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
68 assert(s);
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
69
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
70 s->last_x = s->map->player_x;
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
71 s->last_y = s->map->player_y;
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
72 s->steps = util_nrand(s->low, s->high);
260
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 }
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 struct action *
273
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
76 spawner_new(struct spawner *s)
260
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 {
273
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
78 assert(s);
260
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
273
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
80 s->action.data = s;
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
81 s->action.update = update;
260
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
273
e28429dbdaaf adventure: uniform actions
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
83 return &s->action;
260
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 }