186
|
1 #ifdef HAVE_CONFIG_H
|
|
2 # include <config.h>
|
|
3 #endif
|
|
4
|
|
5 #include <stdlib.h>
|
|
6 #include <stdio.h>
|
|
7
|
|
8 #include <glib.h>
|
|
9
|
|
10 #include "paranormal.h"
|
|
11 #include "actuators.h"
|
|
12 #include "pn_utils.h"
|
|
13
|
|
14 /* ******************** misc_floater ******************** */
|
|
15 static struct pn_actuator_option_desc misc_floater_opts[] =
|
|
16 {
|
|
17 { "value", "The colour value for the floater.",
|
|
18 OPT_TYPE_INT, { ival: 255 } },
|
188
|
19 { NULL }
|
186
|
20 };
|
|
21
|
|
22 typedef enum
|
|
23 {
|
|
24 float_up = 0x1,
|
|
25 float_down = 0x2,
|
|
26 float_left = 0x4,
|
|
27 float_right = 0x8,
|
|
28 } FloaterDirection;
|
|
29
|
|
30 struct floater_state_data
|
|
31 {
|
|
32 FloaterDirection dir;
|
|
33 gint x;
|
|
34 gint y;
|
|
35 };
|
|
36
|
|
37 static void
|
|
38 misc_floater_init(gpointer *data)
|
|
39 {
|
|
40 struct floater_state_data *opaque_data = g_new0(struct floater_state_data, 1);
|
|
41 *data = opaque_data;
|
|
42 opaque_data->x = rand() % pn_image_data->width;
|
|
43 opaque_data->y = rand() % pn_image_data->height;
|
|
44 opaque_data->dir = (FloaterDirection) rand() % 15; /* sum of all dir values */
|
|
45 }
|
|
46
|
|
47 static void
|
|
48 misc_floater_cleanup(gpointer data)
|
|
49 {
|
|
50 g_free(data);
|
|
51 }
|
|
52
|
|
53 /*
|
|
54 * This implementation isn't very great.
|
|
55 * Anyone want to improve it? :(
|
|
56 */
|
|
57 static void
|
|
58 misc_floater_exec(const struct pn_actuator_option *opts, gpointer data)
|
|
59 {
|
|
60 struct floater_state_data *opaque_data = (struct floater_state_data *) data;
|
|
61 guchar value = (opts[0].val.ival < 0 || opts[0].val.ival > 255) ? 255 : opts[0].val.ival;
|
|
62
|
|
63 /* determine the root coordinate first */
|
|
64 if (opaque_data->dir & float_up)
|
|
65 opaque_data->y -= 1;
|
|
66 if (opaque_data->dir & float_down)
|
|
67 opaque_data->y += 1;
|
|
68
|
|
69 if (opaque_data->dir & float_left)
|
|
70 opaque_data->x -= 1;
|
|
71 if (opaque_data->dir & float_right)
|
|
72 opaque_data->x += 1;
|
|
73
|
|
74 /* make sure we're within surface boundaries. segfaults suck, afterall. */
|
|
75 if (opaque_data->x + 1 <= pn_image_data->width &&
|
|
76 opaque_data->x - 1 >= 0 &&
|
|
77 opaque_data->y + 1 <= pn_image_data->height &&
|
|
78 opaque_data->y - 1 >= 0)
|
|
79 {
|
|
80 /* draw it. i could use a loop here, but i don't see much reason in it,
|
|
81 * so i don't think i will at this time. -nenolod
|
|
82 */
|
|
83 pn_image_data->surface[0][PN_IMG_INDEX(opaque_data->x, opaque_data->y)] = value;
|
|
84 pn_image_data->surface[0][PN_IMG_INDEX(opaque_data->x + 1, opaque_data->y)] = value;
|
|
85 pn_image_data->surface[0][PN_IMG_INDEX(opaque_data->x - 1, opaque_data->y)] = value;
|
|
86 pn_image_data->surface[0][PN_IMG_INDEX(opaque_data->x, opaque_data->y + 1)] = value;
|
|
87 pn_image_data->surface[0][PN_IMG_INDEX(opaque_data->x, opaque_data->y - 1)] = value;
|
|
88 }
|
|
89
|
|
90 /* check if we need to change direction yet, and if so, do so. */
|
302
|
91 if (pn_new_beat == TRUE)
|
186
|
92 opaque_data->dir = (FloaterDirection) rand() % 15; /* sum of all dir values */
|
|
93
|
|
94 /* now adjust the direction so we stay in boundary */
|
|
95 if (opaque_data->x - 1 <= 0 && opaque_data->dir & float_left)
|
|
96 {
|
|
97 opaque_data->dir &= ~float_left;
|
|
98 opaque_data->dir |= float_right;
|
|
99 }
|
|
100
|
|
101 if (opaque_data->x + 1 >= pn_image_data->width && opaque_data->dir & float_right)
|
|
102 {
|
|
103 opaque_data->dir &= ~float_right;
|
|
104 opaque_data->dir |= float_left;
|
|
105 }
|
|
106
|
|
107 if (opaque_data->y - 1 <= 0 && opaque_data->dir & float_up)
|
|
108 {
|
|
109 opaque_data->dir &= ~float_up;
|
|
110 opaque_data->dir |= float_down;
|
|
111 }
|
|
112
|
|
113 if (opaque_data->y + 1 >= pn_image_data->height && opaque_data->dir & float_down)
|
|
114 {
|
|
115 opaque_data->dir &= ~float_down;
|
|
116 opaque_data->dir |= float_up;
|
|
117 }
|
|
118 }
|
|
119
|
|
120 struct pn_actuator_desc builtin_misc_floater =
|
|
121 {
|
|
122 "misc_floater",
|
|
123 "Floating Particle",
|
|
124 "A floating particle.",
|
|
125 0, misc_floater_opts,
|
|
126 misc_floater_init, misc_floater_cleanup, misc_floater_exec
|
|
127 };
|
|
128
|