You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

406 lines
8.7 KiB

  1. #include <stdlib.h>
  2. #include <math.h>
  3. #include "common.h"
  4. static void draw_small_explosion( int x, int y, int frame );
  5. static void draw_big_explosion( int x, int y, int frame );
  6. static void draw_huge_explosion( int x, int y, int frame );
  7. void init_explosions( game *g, explosions *ex )
  8. {
  9. int i;
  10. for( i = 0; i < EXPLOSIONS; i++ )
  11. {
  12. ex->n[i] = 0;
  13. ex->x[i] = -1;
  14. ex->y[i] = -1;
  15. ex->vx[i] = -1;
  16. ex->vy[i] = -1;
  17. ex->type[i] = 0;
  18. }
  19. }
  20. void add_explosion( game *g, explosions *ex, int x, int y, int vx, int vy, int type )
  21. {
  22. int i;
  23. for( i = 0; i < EXPLOSIONS; i++ )
  24. {
  25. if( ex->n[i] <= 0 )
  26. {
  27. ex->x[i] = x;
  28. ex->y[i] = y;
  29. ex->vx[i] = vx;
  30. ex->vy[i] = vy;
  31. switch( type )
  32. {
  33. case 1: ex->n[i] = 13; break;
  34. case 2: ex->n[i] = 30; break;
  35. case 0: default: ex->n[i] = 7; break;
  36. }
  37. ex->type[i] = type;
  38. break;
  39. }
  40. }
  41. }
  42. void draw_explosions( game *g, explosions *ex )
  43. {
  44. int i;
  45. for( i = 0; i < EXPLOSIONS; i++ )
  46. {
  47. if( ex->n[i] <= 0 )
  48. {
  49. continue;
  50. }
  51. #if 0
  52. GFX_COLOR( GREEN );
  53. GFX_GOTO( ex->x[i] + 3, ex->y[i] );
  54. switch( GET_RAND(0,3) )
  55. {
  56. case 0:
  57. GFX_WRITE( 'p' );
  58. GFX_WRITE( 'i' );
  59. GFX_WRITE( 'f' );
  60. break;
  61. case 1:
  62. GFX_WRITE( 'p' );
  63. GFX_WRITE( 'a' );
  64. GFX_WRITE( 'f' );
  65. break;
  66. case 2:
  67. GFX_WRITE( 'p' );
  68. GFX_WRITE( 'o' );
  69. GFX_WRITE( 'u' );
  70. GFX_WRITE( 'f' );
  71. break;
  72. }
  73. GFX_WRITE( '!' );
  74. #endif
  75. switch( ex->type[i] )
  76. {
  77. case 2:
  78. draw_huge_explosion( ex->x[i], ex->y[i], ex->n[i] );
  79. break;
  80. case 1:
  81. draw_big_explosion( ex->x[i], ex->y[i], ex->n[i] );
  82. break;
  83. case 0:
  84. default:
  85. draw_small_explosion( ex->x[i], ex->y[i], ex->n[i] );
  86. break;
  87. }
  88. }
  89. }
  90. void update_explosions( game *g, explosions *ex )
  91. {
  92. int i;
  93. for( i = 0; i < EXPLOSIONS; i++ )
  94. {
  95. if( ex->n[i] > 0 )
  96. {
  97. ex->x[i] += ex->vx[i];
  98. ex->y[i] += ex->vy[i];
  99. ex->n[i]--;
  100. }
  101. }
  102. }
  103. static void draw_small_explosion( int x, int y, int frame )
  104. {
  105. switch( frame )
  106. {
  107. default:
  108. case 6:
  109. GFX_COLOR( YELLOW );
  110. GFX_GOTO( x, y );
  111. GFX_WRITE( '+' );
  112. break;
  113. case 5:
  114. GFX_COLOR( YELLOW );
  115. GFX_GOTO( x, y );
  116. GFX_WRITE( 'o' );
  117. break;
  118. case 4:
  119. GFX_COLOR( YELLOW );
  120. GFX_GOTO( x, y-1 );
  121. GFX_WRITE( '_' );
  122. GFX_GOTO( x-1, y );
  123. GFX_WRITE( ')' );
  124. GFX_WRITE( '_' );
  125. GFX_WRITE( '(' );
  126. break;
  127. case 3:
  128. GFX_COLOR( YELLOW );
  129. GFX_GOTO( x-1, y-1 );
  130. GFX_WRITE( '.' );
  131. GFX_WRITE( '_' );
  132. GFX_WRITE( ',' );
  133. GFX_GOTO( x-1, y );
  134. GFX_WRITE( ')' );
  135. GFX_WRITE( '_' );
  136. GFX_WRITE( '(' );
  137. GFX_GOTO( x-1, y+1 );
  138. GFX_WRITE( '\'' );
  139. GFX_WRITE( ' ' );
  140. GFX_WRITE( '`' );
  141. break;
  142. case 2:
  143. GFX_COLOR( YELLOW );
  144. GFX_GOTO( x-1, y-1 );
  145. GFX_WRITE( '.' );
  146. GFX_WRITE( 'v' );
  147. GFX_WRITE( ',' );
  148. GFX_GOTO( x-1, y );
  149. GFX_WRITE( '>' );
  150. GFX_WRITE( ' ' );
  151. GFX_WRITE( '<' );
  152. GFX_GOTO( x-1, y+1 );
  153. GFX_WRITE( '\'' );
  154. GFX_WRITE( '^' );
  155. GFX_WRITE( '`' );
  156. break;
  157. case 1:
  158. GFX_COLOR( WHITE );
  159. GFX_GOTO( x-1, y-1 );
  160. GFX_WRITE( '.' );
  161. GFX_WRITE( ' ' );
  162. GFX_WRITE( ',' );
  163. GFX_GOTO( x-1, y );
  164. GFX_WRITE( ' ' );
  165. GFX_WRITE( ' ' );
  166. GFX_WRITE( ' ' );
  167. GFX_GOTO( x-1, y+1 );
  168. GFX_WRITE( '\'' );
  169. GFX_WRITE( ' ' );
  170. GFX_WRITE( '`' );
  171. break;
  172. }
  173. }
  174. static void draw_big_explosion( int x, int y, int frame )
  175. {
  176. GFX_COLOR( YELLOW );
  177. switch( frame )
  178. {
  179. default:
  180. case 12:
  181. GFX_GOTO( x, y );
  182. GFX_WRITE( '+' );
  183. break;
  184. case 11:
  185. GFX_GOTO( x, y );
  186. GFX_WRITE( 'o' );
  187. break;
  188. case 10:
  189. GFX_GOTO( x, y-1 );
  190. GFX_WRITE( '_' );
  191. GFX_GOTO( x-1, y );
  192. GFX_WRITE( ')' );
  193. GFX_WRITE( '_' );
  194. GFX_WRITE( '(' );
  195. break;
  196. case 9:
  197. GFX_GOTO( x-1, y-1 );
  198. GFX_WRITE( '.' );
  199. GFX_WRITE( '_' );
  200. GFX_WRITE( ',' );
  201. GFX_GOTO( x-1, y );
  202. GFX_WRITE( ')' );
  203. GFX_WRITE( '_' );
  204. GFX_WRITE( '(' );
  205. GFX_GOTO( x-1, y+1 );
  206. GFX_WRITE( '\'' );
  207. GFX_WRITE( ' ' );
  208. GFX_WRITE( '`' );
  209. break;
  210. case 8:
  211. GFX_GOTO( x-1, y-1 );
  212. GFX_WRITE( '.' );
  213. GFX_WRITE( 'v' );
  214. GFX_WRITE( ',' );
  215. GFX_GOTO( x-1, y );
  216. GFX_WRITE( '>' );
  217. GFX_WRITE( ' ' );
  218. GFX_WRITE( '<' );
  219. GFX_GOTO( x-1, y+1 );
  220. GFX_WRITE( '\'' );
  221. GFX_WRITE( '^' );
  222. GFX_WRITE( '`' );
  223. break;
  224. case 6:
  225. GFX_COLOR( RED );
  226. case 7:
  227. case 5:
  228. GFX_GOTO( x-2, y-1 );
  229. GFX_WRITE( '_' );
  230. GFX_WRITE( '\\' );
  231. GFX_WRITE( '~' );
  232. GFX_WRITE( '/' );
  233. GFX_WRITE( '_' );
  234. GFX_GOTO( x-2, y );
  235. GFX_WRITE( '>' );
  236. GFX_WRITE( ' ' );
  237. GFX_WRITE( ' ' );
  238. GFX_WRITE( ' ' );
  239. GFX_WRITE( '<' );
  240. GFX_GOTO( x-2, y+1 );
  241. GFX_WRITE( '~' );
  242. GFX_WRITE( '/' );
  243. GFX_WRITE( '_' );
  244. GFX_WRITE( '\\' );
  245. GFX_WRITE( '~' );
  246. break;
  247. case 3:
  248. GFX_COLOR( RED );
  249. case 4:
  250. case 2:
  251. GFX_GOTO( x-2, y-1 );
  252. GFX_WRITE( '_' );
  253. GFX_WRITE( '\\' );
  254. GFX_WRITE( ' ' );
  255. GFX_WRITE( '/' );
  256. GFX_WRITE( '_' );
  257. GFX_GOTO( x-2, y );
  258. GFX_WRITE( '_' );
  259. GFX_WRITE( ' ' );
  260. GFX_WRITE( ' ' );
  261. GFX_WRITE( ' ' );
  262. GFX_WRITE( '_' );
  263. GFX_GOTO( x-2, y+1 );
  264. GFX_WRITE( ' ' );
  265. GFX_WRITE( '/' );
  266. GFX_WRITE( ' ' );
  267. GFX_WRITE( '\\' );
  268. GFX_WRITE( ' ' );
  269. break;
  270. case 1:
  271. GFX_COLOR( WHITE );
  272. GFX_GOTO( x-2, y-1 );
  273. GFX_WRITE( '.' );
  274. GFX_WRITE( ' ' );
  275. GFX_WRITE( '\'' );
  276. GFX_WRITE( ' ' );
  277. GFX_WRITE( ',' );
  278. GFX_GOTO( x-2, y );
  279. GFX_WRITE( ' ' );
  280. GFX_WRITE( ' ' );
  281. GFX_WRITE( ' ' );
  282. GFX_WRITE( ' ' );
  283. GFX_WRITE( ' ' );
  284. GFX_GOTO( x-2, y+1 );
  285. GFX_WRITE( '\'' );
  286. GFX_WRITE( ' ' );
  287. GFX_WRITE( '.' );
  288. GFX_WRITE( ' ' );
  289. GFX_WRITE( '`' );
  290. break;
  291. }
  292. }
  293. static void draw_circle( int x, int y, float r );
  294. static void draw_huge_explosion( int x, int y, int frame )
  295. {
  296. float r = 1.5 * (30 - frame);
  297. GFX_COLOR( BLUE );
  298. draw_circle( x, y, r );
  299. r += 0.7;
  300. GFX_COLOR( CYAN );
  301. draw_circle( x, y, r );
  302. r += 0.7;
  303. GFX_COLOR( WHITE );
  304. draw_circle( x, y, r );
  305. }
  306. static void draw_circle( int x, int y, float r )
  307. {
  308. #if 1
  309. float c;
  310. for( c = 0 ; c <= 90 ; c += 1 )
  311. {
  312. float dx = 0.5 + r * 2.0 * sin( c * M_PI / 180.0 );
  313. float dy = 0.5 + r * cos( c * M_PI / 180.0 );
  314. GFX_GOTO( x + dx, y + dy );
  315. GFX_WRITE( '#' );
  316. GFX_GOTO( x - dx, y + dy );
  317. GFX_WRITE( '#' );
  318. GFX_GOTO( x + dx, y - dy );
  319. GFX_WRITE( '#' );
  320. GFX_GOTO( x - dx, y - dy );
  321. GFX_WRITE( '#' );
  322. }
  323. #endif
  324. #if 0
  325. int dx,dy,a2,b2, S, T;
  326. float a = r*8, b = r*2;
  327. a2 = a*a;
  328. b2 = b*b;
  329. dx = 0;
  330. dy = b;
  331. S = a2*(1-2*b) + 2*b2;
  332. T = b2 - 2*a2*(2*b-1);
  333. GFX_GOTO( x + dx, y + dy );
  334. GFX_WRITE( '#' );
  335. GFX_GOTO( x - dx, y + dy );
  336. GFX_WRITE( '#' );
  337. GFX_GOTO( x + dx, y - dy );
  338. GFX_WRITE( '#' );
  339. GFX_GOTO( x - dx, y - dy );
  340. GFX_WRITE( '#' );
  341. do
  342. {
  343. if (S<0)
  344. {
  345. S += 2*b2*(2*x+3);
  346. T += 4*b2*(x+1);
  347. dx++;
  348. }
  349. else if (T<0)
  350. {
  351. S += 2*b2*(2*x+3) - 4*a2*(dy-1);
  352. T += 4*b2*(x+1) - 2*a2*(2*dy-3);
  353. dx++;
  354. dy--;
  355. }
  356. else
  357. {
  358. S -= 4*a2*(dy-1);
  359. T -= 2*a2*(2*dy-3);
  360. dy--;
  361. }
  362. GFX_GOTO( x + dx, y + dy );
  363. GFX_WRITE( '#' );
  364. GFX_GOTO( x - dx, y + dy );
  365. GFX_WRITE( '#' );
  366. GFX_GOTO( x + dx, y - dy );
  367. GFX_WRITE( '#' );
  368. GFX_GOTO( x - dx, y - dy );
  369. GFX_WRITE( '#' );
  370. }
  371. while (dy>0);
  372. #endif
  373. }