Huge code merge. This reflects the current status of my rewrite/restructuring. A...
[supertux.git] / src / scene.c
1 //
2 // C Implementation: scene
3 //
4 // Description: 
5 //
6 //
7 // Author: Tobias Glaesser <tobi.web@gmx.de>, (C) 2004
8 //
9 // Copyright: See COPYING file that comes with this distribution
10 //
11 //
12
13 #include "scene.h"
14
15 void set_defaults(void)
16 {
17   int i;
18
19   /* Reset arrays: */
20
21   for (i = 0; i < NUM_BOUNCY_DISTROS; i++)
22     bouncy_distros[i].alive = NO;
23
24   for (i = 0; i < NUM_BROKEN_BRICKS; i++)
25     broken_bricks[i].alive = NO;
26
27   for (i = 0; i < NUM_BOUNCY_BRICKS; i++)
28     bouncy_bricks[i].alive = NO;
29
30   for (i = 0; i < NUM_BAD_GUYS; i++)
31   {
32     /*bad_guys[i].alive = NO;*/
33     badguy_init(&bad_guys[i]);
34     }
35  
36   for (i = 0; i < NUM_FLOATING_SCORES; i++)
37     floating_scores[i].alive = NO;
38
39   for (i = 0; i < NUM_UPGRADES; i++)
40   {
41     /*upgrades[i].alive = NO;*/
42     upgrade_init(&upgrades[i]);
43     }
44
45   for (i = 0; i < NUM_BULLETS; i++)
46   {
47     /*bullets[i].alive = NO;*/
48     bullet_init(&bullets[i]);
49     }
50
51
52   /* Set defaults: */
53   
54   scroll_x = 0;
55
56   score_multiplier = 1;
57   super_bkgd_time = 0;
58
59   counting_distros = NO;
60   distro_counter = 0;
61
62   endpos = 0;
63
64   /* set current song/music */
65   current_music = LEVEL_MUSIC;
66 }
67
68 /* Add score: */
69
70 void add_score(int x, int y, int s)
71 {
72   int i, found;
73
74
75   /* Add the score: */
76
77   score = score + s;
78
79
80   /* Add a floating score thing to the game: */
81
82   found = -1;
83
84   for (i = 0; i < NUM_FLOATING_SCORES && found == -1; i++)
85     {
86       if (!floating_scores[i].alive)
87         found = i;
88     }
89
90
91   if (found != -1)
92     {
93         floating_score_init(&floating_scores[i],x,y,s);
94     }
95 }
96
97 /* Add a bouncy distro: */
98
99 void add_bouncy_distro(float x, float y)
100 {
101   int i, found;
102
103   found = -1;
104
105   for (i = 0; i < NUM_BOUNCY_DISTROS && found == -1; i++)
106     {
107       if (!bouncy_distros[i].alive)
108         found = i;
109     }
110
111   if (found != -1)
112     {
113       bouncy_distros[found].alive = YES;
114       bouncy_distros[found].x = x;
115       bouncy_distros[found].y = y;
116       bouncy_distros[found].ym = -6;
117     }
118 }
119
120
121 /* Add broken brick pieces: */
122
123 void add_broken_brick(float x, float y)
124 {
125   add_broken_brick_piece(x, y, -4, -16);
126   add_broken_brick_piece(x, y + 16, -6, -12);
127
128   add_broken_brick_piece(x + 16, y, 4, -16);
129   add_broken_brick_piece(x + 16, y + 16, 6, -12);
130 }
131
132
133 /* Add a broken brick piece: */
134
135 void add_broken_brick_piece(float x, float y, float xm, float ym)
136 {
137   int i, found;
138
139   found = -1;
140
141   for (i = 0; i < NUM_BROKEN_BRICKS && found == -1; i++)
142     {
143       if (!broken_bricks[i].alive)
144         found = i;
145     }
146
147   if (found != -1)
148     {
149       broken_bricks[found].alive = YES;
150       broken_bricks[found].x = x;
151       broken_bricks[found].y = y;
152       broken_bricks[found].xm = xm;
153       broken_bricks[found].ym = ym;
154     }
155 }
156
157
158 /* Add a bouncy brick piece: */
159
160 void add_bouncy_brick(float x, float y)
161 {
162   int i, found;
163
164   found = -1;
165
166   for (i = 0; i < NUM_BOUNCY_BRICKS && found == -1; i++)
167     {
168       if (!bouncy_bricks[i].alive)
169         found = i;
170     }
171
172   if (found != -1)
173     {
174       bouncy_bricks[found].alive = YES;
175       bouncy_bricks[found].x = x;
176       bouncy_bricks[found].y = y;
177       bouncy_bricks[found].offset = 0;
178       bouncy_bricks[found].offset_m = -BOUNCY_BRICK_SPEED;
179       bouncy_bricks[found].shape = shape(x, y);
180     }
181 }
182
183
184 /* Add a bad guy: */
185
186 void add_bad_guy(float x, float y, int kind)
187 {
188   int i, found;
189
190   found = -1;
191
192   for (i = 0; i < NUM_BAD_GUYS && found == -1; i++)
193     {
194       if (!bad_guys[i].alive)
195         found = i;
196     }
197
198   if (found != -1)
199     {
200       bad_guys[found].alive = YES;
201       bad_guys[found].mode = NORMAL;
202       bad_guys[found].dying = NO;
203       bad_guys[found].kind = kind;
204       bad_guys[found].x = x;
205       bad_guys[found].y = y;
206       bad_guys[found].xm = 1.3;
207       bad_guys[found].ym = 1.5;
208       bad_guys[found].dir = LEFT;
209       bad_guys[found].seen = NO;
210       timer_init(&bad_guys[found].timer);
211     }
212 }