Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * fireworks.c
  3.  * Copyright (C) 1998 Brainchild Design - http://brainchilddesign.com/
  4.  *
  5.  * Copyright (C) 2001 Chuck Mason <cemason@users.sourceforge.net>
  6.  *
  7.  * Copyright (C) 2002 Florian Schulze <crow@icculus.org>
  8.  *
  9.  * This file is part of Jump'n'Bump.
  10.  *
  11.  * Jump'n'Bump is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * (at your option) any later version.
  15.  *
  16.  * Jump'n'Bump is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  24.  */
  25.  
  26. #include "globals.h"
  27.  
  28. extern unsigned int ban_map[17][22];
  29.  
  30. void fireworks(void)
  31. {
  32.         char *handle;
  33.         int c1, c2;
  34.         int s1, s2, s3;
  35.         char pal[768];
  36.         struct {
  37.                 int used, direction, colour;
  38.                 int x, y;
  39.                 int x_add, y_add;
  40.                 int timer;
  41.                 int anim, frame, frame_tick, image;
  42.         } rabbits[20];
  43.         struct {
  44.                 int x, y;
  45.                 int old_x, old_y;
  46.                 int col;
  47.                 int back[2];
  48.         } stars[300];
  49.  
  50.         register_background(NULL, NULL);
  51.  
  52.         if ((handle = dat_open("level.pcx")) == 0) {
  53.                 strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
  54.                 return;
  55.         }
  56.         read_pcx(handle, mask_pic, JNB_WIDTH*JNB_HEIGHT, pal);
  57.  
  58.         memset(mask_pic, 0, JNB_WIDTH*JNB_HEIGHT);
  59.         register_mask(mask_pic);
  60.  
  61.         recalculate_gob(&rabbit_gobs, pal);
  62.         recalculate_gob(&object_gobs, pal);
  63.  
  64.         memset(ban_map, 0, sizeof(ban_map));
  65.  
  66.         fillpalette(0, 0, 0);
  67.  
  68.         draw_begin();
  69.  
  70.         for (c2 = JNB_HEIGHT - 63; c2 < JNB_HEIGHT; c2++) {
  71.                 clear_lines(0, c2, 1, get_color((c2 - 192) >> 2, pal));
  72.                 clear_lines(1, c2, 1, get_color((c2 - 192) >> 2, pal));
  73.         }
  74.  
  75.         draw_end();
  76.  
  77.         setpalette(0, 256, pal);
  78.  
  79.         for (c1 = 0; c1 < 20; c1++)
  80.                 rabbits[c1].used = 0;
  81.  
  82.         rabbits[0].used = 1;
  83.         rabbits[0].colour = rnd(4);
  84.         rabbits[0].x = (int) (150 + rnd(100)) << 16;
  85.         rabbits[0].y = 256 << 16;
  86.         rabbits[0].x_add = ((int) rnd(65535) << 1) - 65536;
  87.         if (rabbits[0].x_add > 0)
  88.                 rabbits[0].direction = 0;
  89.         else
  90.                 rabbits[0].direction = 1;
  91.         rabbits[0].y_add = -262144 + (rnd(16384) * 5);
  92.         rabbits[0].timer = 30 + rnd(150);
  93.         rabbits[0].anim = 2;
  94.         rabbits[0].frame = 0;
  95.         rabbits[0].frame_tick = 0;
  96.         rabbits[0].image = player_anims[rabbits[0].anim].frame[rabbits[0].frame].image + rabbits[0].colour * 18 + rabbits[0].direction * 9;
  97.  
  98.         draw_begin();
  99.         for (c1 = 0; c1 < 300; c1++) {
  100.                 s1 = rnd(JNB_WIDTH);
  101.                 s2 = rnd(JNB_HEIGHT);
  102.                 s3 = 30 - rnd(7);
  103.                 stars[c1].x = stars[c1].old_x = (s1 << 16);
  104.                 stars[c1].y = stars[c1].old_y = (s2 << 16);
  105.                 stars[c1].col = s3;
  106.                 stars[c1].back[0] = stars[c1].back[1] = get_pixel(0, s1, s2);
  107.         }
  108.         draw_end();
  109.  
  110.         dj_set_nosound(0);
  111.  
  112.         main_info.page_info[0].num_pobs = 0;
  113.         main_info.page_info[1].num_pobs = 0;
  114.         main_info.view_page = 0;
  115.         main_info.draw_page = 1;
  116.  
  117.         while (key_pressed(1) == 0) {
  118.  
  119.                 dj_mix();
  120.                 intr_sysupdate();
  121.  
  122.                 for (c1 = 0; c1 < 300; c1++) {
  123.                         stars[c1].old_x = stars[c1].x;
  124.                         stars[c1].old_y = stars[c1].y;
  125.                         stars[c1].y -= (int) (31 - stars[c1].col) * 16384;
  126.                         if ((stars[c1].y >> 16) < 0)
  127.                                 stars[c1].y += JNB_HEIGHT << 16;
  128.                         if ((stars[c1].y >> 16) >= JNB_HEIGHT)
  129.                                 stars[c1].y -= JNB_HEIGHT << 16;
  130.                 }
  131.  
  132.                 for (c1 = 0, c2 = 0; c1 < 20; c1++) {
  133.                         if (rabbits[c1].used == 1)
  134.                                 c2++;
  135.                 }
  136.                 if ((c2 == 0 && rnd(10000) < 200) || (c2 == 1 && rnd(10000) < 150) || (c2 == 2 && rnd(10000) < 100) || (c2 == 3 && rnd(10000) < 50)) {
  137.                         for (c1 = 0; c1 < 20; c1++) {
  138.                                 if (rabbits[c1].used == 0) {
  139.                                         rabbits[c1].used = 1;
  140.                                         rabbits[c1].colour = rnd(4);
  141.                                         rabbits[c1].x = (int) (150 + rnd(100)) << 16;
  142.                                         rabbits[c1].y = 256 << 16;
  143.                                         rabbits[c1].x_add = ((int) rnd(65535) << 1) - 65536;
  144.                                         if (rabbits[c1].x_add > 0)
  145.                                                 rabbits[c1].direction = 0;
  146.                                         else
  147.                                                 rabbits[c1].direction = 1;
  148.                                         rabbits[c1].y_add = -262144 + (rnd(16384) * 5);
  149.                                         rabbits[c1].timer = 30 + rnd(150);
  150.                                         rabbits[c1].anim = 2;
  151.                                         rabbits[c1].frame = 0;
  152.                                         rabbits[c1].frame_tick = 0;
  153.                                         rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
  154.                                         break;
  155.                                 }
  156.                         }
  157.                 }
  158.  
  159.                 dj_mix();
  160.  
  161.                 main_info.page_info[main_info.draw_page].num_pobs = 0;
  162.  
  163.                 for (c1 = 0; c1 < 20; c1++) {
  164.                         if (rabbits[c1].used == 1) {
  165.                                 rabbits[c1].y_add += 2048;
  166.                                 if (rabbits[c1].y_add > 36864 && rabbits[c1].anim != 3) {
  167.                                         rabbits[c1].anim = 3;
  168.                                         rabbits[c1].frame = 0;
  169.                                         rabbits[c1].frame_tick = 0;
  170.                                         rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
  171.                                 }
  172.                                 rabbits[c1].x += rabbits[c1].x_add;
  173.                                 rabbits[c1].y += rabbits[c1].y_add;
  174.                                 if ((rabbits[c1].x >> 16) < 16 || (rabbits[c1].x >> 16) > JNB_WIDTH || (rabbits[c1].y >> 16) > JNB_HEIGHT) {
  175.                                         rabbits[c1].used = 0;
  176.                                         continue;
  177.                                 }
  178.                                 rabbits[c1].timer--;
  179.                                 if (rabbits[c1].timer <= 0) {
  180.                                         rabbits[c1].used = 0;
  181.                                         for (c2 = 0; c2 < 6; c2++)
  182.                                                 add_object(OBJ_FUR, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 44 + rabbits[c1].colour * 8);
  183.                                         for (c2 = 0; c2 < 6; c2++)
  184.                                                 add_object(OBJ_FLESH, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 76);
  185.                                         for (c2 = 0; c2 < 6; c2++)
  186.                                                 add_object(OBJ_FLESH, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 77);
  187.                                         for (c2 = 0; c2 < 8; c2++)
  188.                                                 add_object(OBJ_FLESH, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 78);
  189.                                         for (c2 = 0; c2 < 10; c2++)
  190.                                                 add_object(OBJ_FLESH, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 79);
  191.                                         dj_play_sfx(SFX_DEATH, SFX_DEATH_FREQ, 64, 0, 0, -1);
  192.                                         continue;
  193.                                 }
  194.                                 rabbits[c1].frame_tick++;
  195.                                 if (rabbits[c1].frame_tick >= player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].ticks) {
  196.                                         rabbits[c1].frame++;
  197.                                         if (rabbits[c1].frame >= player_anims[rabbits[c1].anim].num_frames)
  198.                                                 rabbits[c1].frame = player_anims[rabbits[c1].anim].restart_frame;
  199.                                         rabbits[c1].frame_tick = 0;
  200.                                 }
  201.                                 rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
  202.                                 if (rabbits[c1].used == 1)
  203.                                         add_pob(main_info.draw_page, rabbits[c1].x >> 16, rabbits[c1].y >> 16, rabbits[c1].image, &rabbit_gobs);
  204.                         }
  205.                 }
  206.  
  207.                 dj_mix();
  208.  
  209.                 update_objects();
  210.  
  211.                 draw_begin();
  212.  
  213.                 for (c1 = 0; c1 < 300; c1++) {
  214.                         stars[c1].back[main_info.draw_page] = get_pixel(main_info.draw_page, stars[c1].x >> 16, stars[c1].y >> 16);
  215.                         set_pixel(main_info.draw_page, stars[c1].x >> 16, stars[c1].y >> 16, get_color(stars[c1].col, pal));
  216.                 }
  217.  
  218.                 dj_mix();
  219.  
  220.                 draw_pobs(main_info.draw_page);
  221.                
  222.                 draw_end();
  223.  
  224.                 main_info.draw_page ^= 1;
  225.                 main_info.view_page ^= 1;
  226.  
  227.                 flippage(main_info.view_page);
  228.  
  229.                 wait_vrt(1);
  230.  
  231.                 draw_begin();
  232.  
  233.                 redraw_pob_backgrounds(main_info.draw_page);
  234.  
  235.                 dj_mix();
  236.                 intr_sysupdate();
  237.  
  238.                 for (c1 = 299; c1 >= 0; c1--) {
  239.                         set_pixel(main_info.draw_page, stars[c1].old_x >> 16, stars[c1].old_y >> 16, stars[c1].back[main_info.draw_page]);
  240.                 }
  241.  
  242.                 draw_end();
  243.  
  244.         }
  245.  
  246.         dj_set_nosound(1);
  247.  
  248. }
  249.  
  250.