added icons and xml to livewp directory in debian rules
[shermanaquarium] / sherman-aquarium / shermans / matrix.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4
5 #include "draw.h"
6 #include "aquarium.h"
7 #include "over.h"
8
9 #include "matrix.h"
10
11 /*
12   - Matrix scroller "plugin" for Sherman's aquarium -
13
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.
17 */
18
19 #define LETTERS 28
20
21
22
23 static gboolean *pauselist = NULL;
24 static int *charnum = NULL;
25
26 static unsigned char **fallindata = NULL;
27
28
29 static int bright_x[8];
30 static int bright_y[8];
31 static int bright_num;
32 static int xrows, yrows;
33
34
35 static SA_Image matrix_dark, matrix_bright;
36
37
38 void make_matrix_line(int row, int start, int length)
39 {
40     int i,k,j;
41     AquariumData *ad;
42
43     ad = aquarium_get_settings_ptr();
44
45     for(i = start; i < (start + length); i++){
46         j = g_rand_int_range(ad->rnd, 0, LETTERS+5);
47         if(j < LETTERS){
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);
51         }
52         else {
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;
56         } 
57         i = k;
58     }
59 }
60
61
62 void matrix_init(void)
63 {
64   
65     if(matrix_dark.pixbuf != NULL)
66       g_object_unref(matrix_dark.pixbuf);
67
68     if(matrix_bright.pixbuf != NULL)
69       g_object_unref(matrix_dark.pixbuf);
70
71     load_image("matrix1.png",
72                &matrix_dark,
73                LETTERS);
74
75     load_image("matrix2.png",
76                &matrix_bright,
77                LETTERS);
78
79 }
80
81 void matrix_exit(void)
82 {
83
84     matrix_end();
85
86     if(matrix_dark.pixbuf != NULL)
87         g_object_unref(matrix_dark.pixbuf);
88
89     if(matrix_bright.pixbuf != NULL)
90         g_object_unref(matrix_bright.pixbuf);
91
92     matrix_dark.pixbuf = NULL;
93     matrix_bright.pixbuf = NULL;
94
95
96 }
97
98 void matrix_start(void)
99 {
100     int i;
101     AquariumData *ad;
102
103     ad = aquarium_get_settings_ptr();
104
105     xrows = (ad->xmax / matrix_dark.width) + 2;
106     yrows = (ad->ymax / matrix_dark.height) + 2;
107
108     if(pauselist != NULL)
109       g_free(pauselist);
110
111     if(charnum != NULL)
112       g_free(charnum);
113
114     if(fallindata != NULL)
115       g_free(fallindata);
116
117     pauselist = g_malloc0(sizeof(gboolean) * xrows);
118     charnum = g_malloc0(sizeof(int) * xrows);
119     fallindata = g_malloc0(sizeof(char *) * xrows);
120
121
122     bright_num = g_rand_int_range(ad->rnd, 0, 8);
123
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);
127     }
128
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);
135     }
136
137 }
138
139
140 void matrix_end(void)
141 {
142     int i;
143
144     if(fallindata != NULL){
145         for(i = 0; i < xrows; i++){
146             if(fallindata[i] != NULL)
147                 g_free(fallindata[i]);
148         }
149         g_free(fallindata);
150     }
151
152     if(pauselist != NULL)
153         g_free(pauselist);
154
155     if(charnum != NULL)
156         g_free(charnum);
157
158     charnum = NULL;
159     pauselist = NULL;
160     fallindata = NULL;
161        
162 }
163
164 void matrix_update(void)        
165 {
166     AquariumData *ad;
167     int j, i, k, y, x = -4, c, a = 0;
168     int sum = 0;
169
170     ad = aquarium_get_settings_ptr();
171
172     for(j = 0;j < xrows; j++){
173         y=0;
174
175         if(charnum[j] < (2 * yrows - 5)) 
176           a = 5;
177         else 
178           a = 2 * yrows-charnum[j];
179     
180         for(k = charnum[j]; k < (charnum[j] + a); k++)
181             sum += (int)fallindata[j][k];
182     
183         if(sum == 0 && pauselist[j] == -79){
184             if(g_rand_int_range(ad->rnd, 0, 5) == 4) 
185                 pauselist[j] = 10;
186         }
187         else
188             pauselist[j] = -79;
189      
190         if(pauselist[j] <= 0){
191             charnum[j]--;
192             if(charnum[j] <= 0) charnum[j] = 2 * yrows;
193         }
194         else
195             pauselist[j]--;
196
197         c = charnum[j];
198
199         /* Draw all falling signs in a row */
200
201         for(;;){ /* */
202
203             over_draw(x, y, (int)fallindata[j][c],
204                       matrix_dark.width,
205                       matrix_dark.height,
206                       matrix_dark.image);
207       
208             if(c == yrows / 2)
209                 make_matrix_line(j, yrows, yrows);
210      
211             if(c == 3 * yrows / 2)
212                 make_matrix_line(j,0, yrows);
213
214             if(c >= 2 * yrows) 
215               c = 0;
216
217             c++;
218             y += matrix_dark.height;
219             if(y > ad->ymax) 
220               break;
221         }
222         x += matrix_dark.width;
223
224     }
225
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),
230                   matrix_bright.width,
231                   matrix_bright.height,
232                   matrix_bright.image);
233     }
234
235 }
236