12 - Matrix scroller "plugin" for Sherman's aquarium -
14 Yes, I know this is really out of the subject.
15 But one afternoon I was bored and felt for doing
16 this and nothing else.
23 static gboolean *pauselist = NULL;
24 static int *charnum = NULL;
26 static unsigned char **fallindata = NULL;
29 static int bright_x[8];
30 static int bright_y[8];
31 static int bright_num;
32 static int xrows, yrows;
35 static SA_Image matrix_dark, matrix_bright;
38 void make_matrix_line(int row, int start, int length)
43 ad = aquarium_get_settings_ptr();
45 for(i = start; i < (start + length); i++){
46 j = g_rand_int_range(ad->rnd, 0, LETTERS+5);
48 j = g_rand_int_range(ad->rnd, 2, 14);
49 for( k = i; ((k < (i + j)) && (k < (start + length))); k++)
50 fallindata[row][k] = g_rand_int_range(ad->rnd, 1, LETTERS);
53 j = g_rand_int_range(ad->rnd, 10, 15);
54 for(k = i; ((k < (i + j)) && (k < (length + start))); k++)
55 fallindata[row][k] = 0;
62 void matrix_init(void)
65 if(matrix_dark.pixbuf != NULL)
66 g_object_unref(matrix_dark.pixbuf);
68 if(matrix_bright.pixbuf != NULL)
69 g_object_unref(matrix_dark.pixbuf);
71 load_image("matrix1.png",
75 load_image("matrix2.png",
81 void matrix_exit(void)
86 if(matrix_dark.pixbuf != NULL)
87 g_object_unref(matrix_dark.pixbuf);
89 if(matrix_bright.pixbuf != NULL)
90 g_object_unref(matrix_bright.pixbuf);
92 matrix_dark.pixbuf = NULL;
93 matrix_bright.pixbuf = NULL;
98 void matrix_start(void)
103 ad = aquarium_get_settings_ptr();
105 xrows = (ad->xmax / matrix_dark.width) + 2;
106 yrows = (ad->ymax / matrix_dark.height) + 2;
108 if(pauselist != NULL)
114 if(fallindata != NULL)
117 pauselist = g_malloc0(sizeof(gboolean) * xrows);
118 charnum = g_malloc0(sizeof(int) * xrows);
119 fallindata = g_malloc0(sizeof(char *) * xrows);
122 bright_num = g_rand_int_range(ad->rnd, 0, 8);
124 for(i = 0; i < bright_num; i++){
125 bright_x[i] = g_rand_int_range(ad->rnd, 0, xrows);
126 bright_y[i] = g_rand_int_range(ad->rnd, 0, yrows);
129 for(i = 0; i < xrows; i++){
130 pauselist[i] = FALSE;
131 fallindata[i] = g_malloc0(2 * yrows + 2);
132 make_matrix_line(i, 0, yrows);
133 make_matrix_line(i, yrows, yrows);
134 charnum[i] = g_rand_int_range(ad->rnd, 0, 2 * yrows);
140 void matrix_end(void)
144 if(fallindata != NULL){
145 for(i = 0; i < xrows; i++){
146 if(fallindata[i] != NULL)
147 g_free(fallindata[i]);
152 if(pauselist != NULL)
164 void matrix_update(void)
167 int j, i, k, y, x = -4, c, a = 0;
170 ad = aquarium_get_settings_ptr();
172 for(j = 0;j < xrows; j++){
175 if(charnum[j] < (2 * yrows - 5))
178 a = 2 * yrows-charnum[j];
180 for(k = charnum[j]; k < (charnum[j] + a); k++)
181 sum += (int)fallindata[j][k];
183 if(sum == 0 && pauselist[j] == -79){
184 if(g_rand_int_range(ad->rnd, 0, 5) == 4)
190 if(pauselist[j] <= 0){
192 if(charnum[j] <= 0) charnum[j] = 2 * yrows;
199 /* Draw all falling signs in a row */
203 over_draw(x, y, (int)fallindata[j][c],
209 make_matrix_line(j, yrows, yrows);
211 if(c == 3 * yrows / 2)
212 make_matrix_line(j,0, yrows);
218 y += matrix_dark.height;
222 x += matrix_dark.width;
226 for(i = 0; i < bright_num; i++){
227 over_draw(bright_x[i] * matrix_bright.width - 4,
228 bright_y[i] * matrix_bright.height,
229 g_rand_int_range(ad->rnd, 1, LETTERS),
231 matrix_bright.height,
232 matrix_bright.image);