1 /* drawing.c */
2 
3 # include <stdio.h>
4 # include <stdlib.h>
5 # include "SDL2/SDL.h"
6 # include "SDL2/SDL_image.h"
7 # include "SDL2/SDL_mixer.h"
8 
9 # include "structs.h"
10 
drawscreen(SDL_Renderer * renderer,uint stagedata[][22][32],SDL_Texture * tiles,uint room[],uint counter[],uint changeflag,Mix_Chunk * fx[],uint changetiles)11 void drawscreen (SDL_Renderer *renderer,uint stagedata[][22][32],SDL_Texture *tiles,uint room[],uint counter[],uint changeflag,Mix_Chunk *fx[],uint changetiles) {
12 
13 	int coordx = 0;
14 	int coordy = 0;
15 	SDL_Rect srctiles = {0,0,8,8};
16 	SDL_Rect destiles = {0,0,8,8};
17 	uint data = 0;
18 
19 	for (coordy=0; coordy<=21; coordy++) {
20 		for (coordx=0; coordx<=31; coordx++) {
21 			data = stagedata[room[0]][coordy][coordx];
22 			if ((data > 0) && (data != 99)) {
23 				destiles.x = coordx * 8;
24 				destiles.y = coordy * 8;
25 				if (data < 200) {
26 					srctiles.w = 8;
27 					srctiles.h = 8;
28 					if (data < 101) {
29 						srctiles.y = 0;
30 						if (data == 84) /* Cross brightness */
31 							srctiles.x = (data - 1) * 8 + (counter[0]/8 * 8);
32 						else
33 							srctiles.x = (data - 1) * 8;
34 					}
35 					else {
36 						if (data == 154) {
37 							srctiles.x=600 + ((counter[0] / 8) * 16);
38 							srctiles.y=0;
39 							srctiles.w=16;
40 							srctiles.h=24;
41 						}
42 						else {
43 							srctiles.y = 8;
44 							srctiles.x = (data - 101) * 8;
45 						}
46 					}
47 				}
48 				if ((data > 199) && (data < 300)) {
49 					srctiles.x = (data - 201) * 48;
50 					srctiles.y = 16;
51 					srctiles.w = 48;
52 					srctiles.h = 48;
53 				}
54 				if ((data > 299) && (data < 399)) {
55 					srctiles.x = 96 + ((data - 301) * 8);
56 					srctiles.y = 16;
57 					srctiles.w = 8;
58 					srctiles.h = 8;
59 					/* Door movement */
60 					if ((room[0] == 7) && ((counter[1] > 59) && (counter[1] < 71))) {
61 						if ((data == 347) || (data == 348) || (data == 349) || (data == 350)) {
62 							destiles.x += 2;
63 							if ((data == 350) && (counter[1] == 70))
64 								Mix_PlayChannel(-1, fx[3], 0); /* Sound of door */
65 						}
66 					}
67 				}
68 				/* Hearts */
69 				if ((data > 399) && (data < 405)) {
70 					srctiles.x = 96 + ((data - 401) * 8) + (32 * (counter[0] / 15));
71 					srctiles.y = 24;
72 					srctiles.w = 8;
73 					srctiles.h = 8;
74 				}
75 				/* Crosses */
76 				if ((data > 408) && (data < 429)) {
77 					srctiles.x = 96 + ((data - 401) * 8) + (32 * (counter[1] / 23));
78 					srctiles.y = 24;
79 					srctiles.w = 8;
80 					srctiles.h = 8;
81 				}
82 
83 				if ((data > 499) && (data < 599)) {
84 					srctiles.x = 96 + ((data - 501) * 8);
85 					srctiles.y = 32;
86 					srctiles.w = 8;
87 					srctiles.h = 8;
88 				}
89 				if ((data > 599) && (data < 650)) {
90 					srctiles.x = 96 + ((data - 601) * 8);
91 					srctiles.y = 56;
92 					srctiles.w = 8;
93 					srctiles.h = 8;
94 				}
95 				if (data == 650) { /* Cup */
96 					srctiles.x = 584;
97 					srctiles.y = 87;
98 					srctiles.w = 16;
99 					srctiles.h = 16;
100 				}
101 				destiles.w = srctiles.w;
102 				destiles.h = srctiles.h;
103 				if ((data == 152) || (data == 137) || (data == 136)) {
104 					if (changeflag == 0) {
105 						srctiles.y = srctiles.y + (changetiles * 120);
106 						SDL_RenderCopy(renderer,tiles,&srctiles,&destiles);
107 					}
108 				}
109 				else {
110 					srctiles.y = srctiles.y + (changetiles * 120);
111 					SDL_RenderCopy(renderer,tiles,&srctiles,&destiles);
112 				}
113 			}
114 		}
115 	}
116 
117 }
118 
statusbar(SDL_Renderer * renderer,SDL_Texture * tiles,int room[],int lifes,int crosses,SDL_Texture * fonts,uint changetiles)119 void statusbar (SDL_Renderer *renderer,SDL_Texture *tiles,int room[],int lifes,int crosses,SDL_Texture *fonts,uint changetiles) {
120 
121 	SDL_Rect srcbar = {448,104,13,12};
122 	SDL_Rect desbar = {0,177,13,12};
123 	SDL_Rect srcnumbers = {0,460,10,10};
124 	SDL_Rect desnumbers = {18,178,10,10};
125 	SDL_Rect srctext = {0,0,140,20};
126 	SDL_Rect destext = {115,176,136,18};
127 	int i = 0;
128 
129 	/* Show heart and crosses sprites */
130 	if (changetiles == 1)
131 		srcbar.y = 224;
132 	SDL_RenderCopy(renderer,tiles,&srcbar,&desbar);
133 	srcbar.x = 461;
134 	srcbar.w = 12;
135 	desbar.x = 32;
136 	SDL_RenderCopy(renderer,tiles,&srcbar,&desbar);
137 
138 	for (i=0; i<=2; i++) {
139 		switch (i) {
140 			case 0: srcnumbers.x = lifes * 10;
141 							SDL_RenderCopy(renderer,fonts,&srcnumbers,&desnumbers);
142 							break;
143 			case 1: if (crosses < 10) {
144 								desnumbers.x = 50;
145 								srcnumbers.x = crosses * 10;
146 								SDL_RenderCopy(renderer,fonts,&srcnumbers,&desnumbers);
147 							}
148 							else {
149 								desnumbers.x = 50;
150 								srcnumbers.x = 10;
151 								SDL_RenderCopy(renderer,fonts,&srcnumbers,&desnumbers);
152 								desnumbers.x = 55;
153 								srcnumbers.x = (crosses - 10) * 10;
154 								SDL_RenderCopy(renderer,fonts,&srcnumbers,&desnumbers);
155 							}
156 							break;
157 			case 2: if ((room[0] > 0) && (room[0] < 4)) {
158 								srctext.y = (room[0] - 1) * 20;
159 								SDL_RenderCopy(renderer,fonts,&srctext,&destext);
160 							}
161 							if (room[0] > 4) {
162 								srctext.y = (room[0] - 2) * 20;
163 								SDL_RenderCopy(renderer,fonts,&srctext,&destext);
164 							}
165 							break;
166 		}
167 
168 	}
169 
170 }
171 
drawrope(struct enem enemies,SDL_Renderer * renderer,SDL_Texture * tiles,uint changetiles)172 void drawrope (struct enem enemies,SDL_Renderer *renderer,SDL_Texture *tiles,uint changetiles) {
173 
174 	int i = 0;
175 	int blocks = 0;
176 	int j = 0;
177 	SDL_Rect srctile = {424,8,16,8};
178 	SDL_Rect destile = {0,0,16,8};
179 
180 	for (i=2; i<6; i++) {
181 		blocks = (enemies.y[i] - (enemies.limleft[i] - 8)) / 8;
182 		for (j=0; j<=blocks; j++) {
183 			srctile.y = 8 + (changetiles * 120);
184 	  	destile.x = enemies.x[i];
185 	  	destile.y = (enemies.limleft[i] - 8) + (8 * j);
186 			SDL_RenderCopy(renderer,tiles,&srctile,&destile);
187 		}
188 	}
189 
190 }
191 
drawshoots(float proyec[],SDL_Texture * tiles,SDL_Renderer * renderer,struct enem * enemies,uint changetiles)192 void drawshoots (float proyec[],SDL_Texture *tiles,SDL_Renderer *renderer,struct enem *enemies,uint changetiles) {
193 /* Shoots from skeletons & gargoyles */
194 
195 	SDL_Rect srctile = {656,24,16,8};
196 	SDL_Rect destile = {0,0,0,0};
197 	int i = 0;
198 	int n = 0;
199 
200 	srctile.y = 24 + (changetiles * 120);
201 
202   for (n=0; n<=4; n+=2) {
203 		if (proyec[n] > 0) {
204 	  	i = proyec[n+1];
205 	  	if (enemies->type[i] == 15) {
206 				srctile.h = 16;
207 				srctile.x = 640 - (16 * enemies->direction[i]);
208 	  	}
209 
210 	  	/* Move shoot */
211 	  	if (enemies->direction[i] == 1) {
212 				if (proyec[n] > enemies->limleft[i])
213 				  proyec[n] -= 2.5;
214 				else {
215 				  enemies->fire[i] = 0;
216 				  enemies->speed[i] = 0;
217 				  proyec[n] = 0;
218 				}
219 	  	}
220 	  	else {
221 				if (proyec[n] < enemies->limright[i])
222 		  		proyec[n] += 2.5;
223 				else {
224 		  		enemies->fire[i] = 0;
225 				  enemies->speed[i] = 0;
226 				  proyec[n] = 0;
227 				}
228 	  	}
229 	  	destile.w = srctile.w;
230 			destile.h = srctile.h;
231 
232 	  	/* Draw shoot */
233 	  	switch (enemies->direction[i]) {
234 				case 0: if ((proyec[n] < (enemies->limright[i] - 8)) && (proyec[n] != 0)) {
235 								  destile.x = proyec[n];
236 								  destile.y = enemies->y[i] + 8;
237 									SDL_RenderCopy(renderer,tiles,&srctile,&destile);
238 								}
239 								break;
240 				case 1: if (proyec[n] > (enemies->limleft[i] + 8)) {
241 								  destile.x = proyec[n];
242 								  destile.y = enemies->y[i] + 8;
243 									SDL_RenderCopy(renderer,tiles,&srctile,&destile);
244 								}
245 								break;
246 	  	}
247 		}
248 
249 	}
250 
251 }
252 
showparchment(SDL_Renderer * renderer,uint * parchment)253 void showparchment (SDL_Renderer *renderer,uint *parchment) {
254 
255 	SDL_Texture *yparchment = NULL;
256 
257 	switch (*parchment) {
258 		case 3: yparchment = IMG_LoadTexture(renderer, DATADIR "/graphics/parchment1.png");
259 						break;
260 		case 8:	yparchment = IMG_LoadTexture(renderer, DATADIR "/graphics/parchment2.png");
261 						break;
262 		case 12: yparchment = IMG_LoadTexture(renderer, DATADIR "/graphics/parchment3.png");
263 						 break;
264 		case 14: yparchment = IMG_LoadTexture(renderer, DATADIR "/graphics/parchment4.png");
265 						 break;
266 		case 16: yparchment = IMG_LoadTexture(renderer, DATADIR "/graphics/parchment5.png");
267 						 break;
268 		case 21: yparchment = IMG_LoadTexture(renderer, DATADIR "/graphics/parchment6.png");
269 						 break;
270 
271 	}
272 
273 	SDL_RenderCopy(renderer,yparchment,NULL,NULL);
274 	SDL_DestroyTexture(yparchment);
275 
276 }
277 
redparchment(SDL_Renderer * renderer,struct hero * jean)278 void redparchment (SDL_Renderer *renderer,struct hero *jean) {
279 
280 	SDL_Texture *rparchment = IMG_LoadTexture(renderer, DATADIR "/graphics/redparch.png");
281 	SDL_RenderCopy(renderer,rparchment,NULL,NULL);
282 	SDL_DestroyTexture(rparchment);
283 
284 	jean->flags[6] = 4;
285 
286 }
287 
blueparchment(SDL_Renderer * renderer,struct hero * jean)288 void blueparchment (SDL_Renderer *renderer,struct hero *jean) {
289 
290 	SDL_Texture *bparchment = IMG_LoadTexture(renderer, DATADIR "/graphics/blueparch.png");
291 	SDL_RenderCopy(renderer,bparchment,NULL,NULL);
292 	SDL_DestroyTexture(bparchment);
293 
294 }