annotate libmlk-adventure/adventure/actions/spawner.c @ 260:60a214ec1ab4

adventure: change the way states are stored
author David Demelier <markand@malikania.fr>
date Sun, 06 Dec 2020 22:50:48 +0100
parents
children bfde372bf152
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
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 struct self {
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 struct action action;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 struct map *map;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 int last_x;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 int last_y;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 unsigned int steps;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 };
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 static inline unsigned int
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 distance(const struct self *self)
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 unsigned int gap_x = fmax(self->last_x, self->map->player_x) -
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 fmin(self->last_x, self->map->player_x);
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 unsigned int gap_y = fmax(self->last_y, self->map->player_y) -
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 fmin(self->last_y, self->map->player_y);
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 return fmin(self->steps, gap_x + gap_y);
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 }
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 static bool
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 update(struct action *act, unsigned int ticks)
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 {
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 (void)ticks;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 struct self *self = act->data;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 if (self->map->player_movement) {
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 self->steps -= distance(self);
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 self->last_x = self->map->player_x;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 self->last_y = self->map->player_y;
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 if (self->steps == 0) {
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 /* TODO: start battle here. */
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 return false;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 }
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 }
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
67
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 return false;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 }
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 static void
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 finish(struct action *act)
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 free(act->data);
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 }
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 struct action *
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 spawner_new(struct map *map, unsigned int low, unsigned int high)
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 {
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 assert(map);
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
81
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 struct self *self;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 self = alloc_new0(sizeof (*self));
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 self->map = map;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 self->last_x = map->player_x;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 self->last_y = map->player_y;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 self->steps = nrand(low, high);
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
89
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 self->action.data = self;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 self->action.update = update;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 self->action.finish = finish;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
93
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 return &self->action;
60a214ec1ab4 adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 }