00001 #include <stdio.h>
00002 #include <allegro.h>
00003 #include "include/supercsbros.h"
00004
00005 int main (void)
00006 {
00007 int nticks;
00008 initialize();
00009 main_menu();
00010 loadsprites();
00011
00012 LOCK_VARIABLE(ticks);
00013 LOCK_FUNCTION(ticker);
00014 install_int_ex(ticker, MSEC_TO_TIMER( (int)(1000 * env->diff_mod)));
00015 env->ticks=0;
00016
00017 while (!key[KEY_ESC])
00018 {
00019
00020 clear(buffer);
00021 player->oldpy = player->y;
00022 player->oldpx = player->x;
00023 nticks = env->ticks;
00024 env->ticks = 0;
00025
00026 for (; nticks >0; nticks--) {
00027 --env->counter;
00028 }
00029
00030 player->collision=0;
00031 checkinput();
00032 check_ground();
00033 updateplayer();
00034 updatebullets();
00035 update_enemies();
00036 draw_crosshair();
00037 updatestats();
00038 updatescore();
00039 updatetime();
00040
00041 vsync();
00042 acquire_screen();
00043 blit(buffer, screen, 0, 0, 0, 0, WIDTH-1, HEIGHT-1);
00044 release_screen();
00045 }
00046
00047 MapFreeMem();
00048 allegro_exit();
00049 return 0;
00050 }
00051
00052
00053
00054 void initialize()
00055 {
00056 allegro_init();
00057
00058 install_timer();
00059 install_keyboard();
00060 install_mouse();
00061
00062 set_color_depth(32);
00063 set_gfx_mode(MODE, WIDTH, HEIGHT, 0, 0);
00064 buffer = create_bitmap (WIDTH, HEIGHT);
00065 clear(buffer);
00066
00067 enable_hardware_cursor();
00068 select_mouse_cursor(MOUSE_CURSOR_ARROW);
00069 show_mouse(screen);
00070
00071 if (MapLoad(map_file))
00072 {
00073 allegro_message("Error reading the map file: %s", map_file);
00074 exit(1);
00075 }
00076 player = malloc(sizeof(SPRITE));
00077 stats = malloc(sizeof(STATS));
00078 env = malloc(sizeof(ENVIRONMENT));
00079
00080 stats->health = 25;
00081 stats->score = 0;
00082 stats->lives = 3;
00083
00084 env->counter = 300;
00085 env->ticks = 0;
00086 env->diff_mod = 2.00;
00087
00088 player->x = 0;
00089 player->y = 0;
00090
00091 OSinit(os_type);
00092 return;
00093 }
00094
00095 void main_menu()
00096 {
00097 int i = 0;
00098 int s = 3;
00099
00100 BITMAP *bg;
00101
00102 BITMAP *menu_items_unselected[3];
00103 BITMAP *menu_items_selected[3];
00104
00105 bg = load_bitmap(bg_file, NULL);
00106 if (!bg) {
00107 allegro_message("Error loading %s", bg);
00108 return;
00109 }
00110 menu_items_unselected[0] = load_bitmap("menus/start_unselected.pcx", NULL);
00111 menu_items_unselected[1] = load_bitmap("menus/settings_unselected.pcx", NULL);
00112 menu_items_unselected[2] = load_bitmap("menus/quit_unselected.pcx", NULL);
00113 menu_items_selected[0] = load_bitmap("menus/start_selected.pcx", NULL);
00114 menu_items_selected[1] = load_bitmap("menus/settings_selected.pcx", NULL);
00115 menu_items_selected[2] = load_bitmap("menus/quit_selected.pcx", NULL);
00116
00117 blit(bg, screen, 0, 0, 0, 0, bg->w, bg->h);
00118 for (i=0; i<3; i++) {
00119 blit(menu_items_unselected[i], screen, 0, 0, 300, (200 + i * 64), SCREEN_W-1, SCREEN_H-1);
00120 }
00121
00122
00123 while (1)
00124 {
00125 mouse_b=0;
00126 if ((mouse_x >= 300) && (mouse_x <= 510) && (mouse_y >= 200) && (mouse_y <= 263)) s = 0;
00127 if ((mouse_x >= 300) && (mouse_x <= 510) && (mouse_y >= 264) && (mouse_y <= 327)) s = 1;
00128 if ((mouse_x >= 300) && (mouse_x <= 510) && (mouse_y >= 328) && (mouse_y <= 392)) s = 2;
00129
00130
00131 if (mouse_b & 1) {
00132 switch (s) {
00133 case 0: break;
00134 case 1:
00135 settings_menu();
00136 blit(bg, screen, 0, 0, 0, 0, bg->w, bg->h);
00137 for (i=0; i<3; i++)
00138 blit(menu_items_unselected[i], screen, 0, 0, 300, (200 + i * 64), SCREEN_W-1, SCREEN_H-1);
00139 break;
00140 case 2: quitgame();
00141 }
00142 if (s == 0) break;
00143 }
00144 }
00145 return;
00146 }
00147
00148 void quitgame()
00149 {
00150 exit(0);
00151 }
00152
00153 void settings_menu()
00154 {
00155 int i;
00156 int s = 0;
00157
00158 BITMAP *settings_bg;
00159 BITMAP *difficulty_level_on[3];
00160 BITMAP *difficulty_level_off[3];
00161 BITMAP *on_unselected, *off_unselected, *done_unselected;
00162 BITMAP *difficulty, *audio;
00163
00164 settings_bg = load_bitmap("menus/settings_bg.pcx", NULL);
00165 blit(settings_bg, screen, 0, 0, 0, 0, settings_bg->w, settings_bg->h);
00166
00167 difficulty = load_bitmap("menus/difficulty.pcx", NULL);
00168 audio = load_bitmap("menus/audio.pcx", NULL);
00169 done_unselected = load_bitmap("menus/done_unselected.pcx", NULL);
00170 on_unselected = load_bitmap("menus/on_unselected.pcx", NULL);
00171 off_unselected = load_bitmap("menus/off_unselected.pcx", NULL);
00172
00173 difficulty_level_off[0] = load_bitmap("menus/a_unselected.pcx", NULL);
00174 difficulty_level_off[1] = load_bitmap("menus/b_unselected.pcx", NULL);
00175 difficulty_level_off[2] = load_bitmap("menus/c_unselected.pcx", NULL);
00176 difficulty_level_on[0] = load_bitmap("menus/a_selected.pcx", NULL);
00177 difficulty_level_on[1] = load_bitmap("menus/b_selected.pcx", NULL);
00178 difficulty_level_on[2] = load_bitmap("menus/c_selected.pcx", NULL);
00179
00180 blit(difficulty, screen,0, 0, 85, 200, difficulty->w, difficulty->h);
00181 blit(audio, screen, 0, 0, 250, 240, audio->w, audio->h);
00182 blit(done_unselected, screen, 0, 0, 270, 280, done_unselected->w, done_unselected->h);
00183 blit(on_unselected, screen, 0, 0, 410, 240, on_unselected->w, on_unselected->h);
00184 blit(off_unselected, screen, 0, 0, 470, 240, off_unselected->w, off_unselected->h);
00185
00186 for (i=0; i<3; i++) {
00187 blit(difficulty_level_off[i], screen, 0, 0, (400 + i * 70), 200, SCREEN_W-1, SCREEN_H-1);
00188 }
00189
00190 while (1)
00191 {
00192
00193 if ((mouse_x >= 400) && (mouse_x <= 460) && (mouse_y >= 200) && (mouse_y <= 240)) s = 0;
00194 if ((mouse_x >= 470) && (mouse_x <= 530) && (mouse_y >= 200) && (mouse_y <= 240)) s = 1;
00195 if ((mouse_x >= 540) && (mouse_x <= 600) && (mouse_y >= 200) && (mouse_y <= 240)) s = 2;
00196 if ((mouse_x >= 410) && (mouse_x <= 460) && (mouse_y >= 241) && (mouse_y <= 280)) s = 3;
00197 if ((mouse_x >= 470) && (mouse_x <= 530) && (mouse_y >= 241) && (mouse_y <= 280)) s = 4;
00198 if ((mouse_x >= 270) && (mouse_x <= 375) && (mouse_y >= 280) && (mouse_y <= 320)) s = 5;
00199
00200
00201 if (mouse_b & 1) {
00202 switch (s) {
00203 case 0: env->diff_mod = 0.42; break;
00204 case 1: env->diff_mod = 0.75; break;
00205 case 2: env->diff_mod = 1.00; break;
00206 case 3: env->audio_enabled = 1; break;
00207 case 4: env->audio_enabled = 0; break;
00208 case 5: break;
00209 }
00210 if (s == 5) break;
00211 }
00212 }
00213 destroy_bitmap(settings_bg);
00214 return;
00215 }
00216
00217 void ticker()
00218 {
00219 ++env->ticks;
00220 return;
00221 }
00222
00223 void updatetime()
00224 {
00225 if (env->counter > 0)
00226 textprintf_ex(screen, font, (WIDTH-100), 5, WHITE, -1, "Time: %d", env->counter);
00227 else
00228 {
00229 allegro_message("You've run out of time. We should do someting now...like restart the level!\n");
00230 restart_level();
00231 }
00232 return;
00233 }
00234
00235 void updatescore()
00236 {
00237 textprintf_ex(buffer, font, 15, 5, WHITE, -1,"Score: %d", stats->score);
00238 textprintf_ex(buffer, font, 105, 5, WHITE, -1, "Lives: %d", stats->lives);
00239 textprintf_ex(buffer, font, 210, 5, WHITE, -1, "Jump: %d", jump);
00240 return;
00241 }
00242
00243 void updatestats()
00244 {
00245 int n;
00246 draw_sprite(buffer, progress, 14, 15);
00247
00248 for (n = 0; n < stats->health; n++) {
00249 draw_sprite(buffer, bar, 15+n*5, 17);
00250 }
00251 textprintf_ex(buffer, font, 300, 5, WHITE, -1, "Player->x: %d", player->x);
00252 textprintf_ex(buffer, font, 450, 5, WHITE, -1, "Player->y: %d", player->y);
00253 textprintf_ex(buffer, font, 300, 20, WHITE, -1, "Difficulty Modifier: %3f", env->diff_mod);
00254 textprintf_ex(buffer, font, 300, 45, WHITE, -1, "Rightfacing: %d", player->rightfacing);
00255 if (jump < 0) {textprintf_ex(buffer, font, 400, 300, WHITE, -1, "FALLING!");}
00256 if (player->collision) {textprintf_ex(buffer, font, 400, 315, WHITE, -1, "Collision!!");}
00257 }
00258
00259
00260 BITMAP *grabframe(BITMAP *source,
00261 int width, int height,
00262 int startx, int starty,
00263 int columns, int frame)
00264 {
00265 BITMAP *temp = create_bitmap(width,height);
00266 int x = startx + (frame % columns) * width;
00267 int y = starty + (frame / columns) * height;
00268 blit(source,temp,x,y,0,0,width,height);
00269 return temp;
00270 }
00271
00272
00273 void loadsprites()
00274 {
00275 int n;
00276
00277
00278 temp = load_bitmap("images/progress.bmp", NULL);
00279 progress = grabframe(temp,130,14,0,0,1,0);
00280 bar = grabframe(temp,6,10,130,2,1,0);
00281 destroy_bitmap(temp);
00282
00283
00284 temp = load_bitmap(player_bitmap, NULL);
00285 for (n=0; n<8; n++)
00286 player_images[n] = grabframe(temp,50,64,0,0,8,n);
00287 destroy_bitmap(temp);
00288
00289 player = malloc(sizeof(SPRITE));
00290 player->x = 80;
00291 player->y = 100;
00292 player->curframe=0;
00293 player->framecount=0;
00294 player->framedelay=6;
00295 player->rightfacing=0;
00296 player->maxframe=7;
00297 player->width=player_images[0]->w;
00298 player->height=player_images[0]->h;
00299 player->collision=0;
00300
00301 temp = load_bitmap(enemy_bitmap1, NULL);
00302 for (n=0; n<8; n++)
00303 mis_1_images[n] = grabframe(temp,50,64,0,0,8,n);
00304 destroy_bitmap(temp);
00305
00306 for (n=0; n<MAX_ENEMIES; n++)
00307 {
00308 enemies[n] = malloc(sizeof(SPRITE));
00309 enemies[n]->alive = 1;
00310 enemies[n]->width = mis_1_images[0]->w;
00311 enemies[n]->height = mis_1_images[0]->h;
00312 enemies[n]->rightfacing = 0;
00313 enemies[n]->xdelay = 4;
00314 enemies[n]->ydelay = 0;
00315 enemies[n]->xcount = 5;
00316 enemies[n]->ycount = 0;
00317 enemies[n]->xspeed = 0;
00318 enemies[n]->yspeed = 0;
00319 enemies[n]->curframe = 0;
00320 enemies[n]->maxframe = 2;
00321 enemies[n]->framecount = 0;
00322 enemies[n]->framedelay = 10;
00323 enemies[n]->animdir = 1;
00324
00325 }
00326 enemies[0]->x = 524; enemies[0]->y = 287;
00327 enemies[1]->x = 1456; enemies[1]->y = 127;
00328 enemies[2]->x = 2316; enemies[2]->y = 286;
00329 enemies[3]->x = 2656; enemies[3]->y = 286;
00330 enemies[4]->x = 3632; enemies[4]->y = 158;
00331 enemies[5]->x = 5256; enemies[5]->y = 446;
00332 enemies[6]->x = 5196; enemies[6]->y = 254;
00333 enemies[7]->x = 5592; enemies[7]->y = 254;
00334 enemies[8]->x = 6280; enemies[8]->y = 319;
00335 enemies[9]->x = 7436; enemies[9]->y = 190;
00336
00337 temp = load_bitmap(boss_bitmap, NULL);
00338 for (n=0; n<8; n++)
00339 boss_images[n] = grabframe(temp,50,64,0,0,8,n);
00340 destroy_bitmap(temp);
00341
00342 boss = malloc(sizeof(SPRITE));
00343 boss->x = 9016 ;
00344 boss->y = 62 ;
00345 boss->curframe = 0;
00346 boss->alive=1;
00347 boss->framecount = 0;
00348 boss->framedelay = 4;
00349 boss->maxframe=7;
00350 boss->width=boss_images[0]->w;
00351 boss->height=boss_images[0]->h;
00352 boss->collision = 0;
00353 boss->rightfacing=0;
00354
00355
00356 bullet_image = load_bitmap("objects/ball.pcx", NULL);
00357
00358 for (n=0; n<MAX_BULLETS; n++) {
00359 bullets[n] = malloc(sizeof(SPRITE));
00360 bullets[n]->alive=0;
00361 bullets[n]->x=0;
00362 bullets[n]->y=0;
00363 bullets[n]->xspeed=6;
00364 bullets[n]->yspeed=0;
00365 bullets[n]->xdelay=0;
00366 bullets[n]->ydelay=0;
00367 bullets[n]->xcount=1;
00368 bullets[n]->ycount=0;
00369 bullets[n]->curframe=0;
00370 bullets[n]->maxframe=0;
00371 bullets[n]->animdir=0;
00372 bullets[n]->framedelay=0;
00373 bullets[n]->framecount=0;
00374 bullets[n]->width=bullet_image->w;
00375 bullets[n]->height=bullet_image->h;
00376 }
00377
00378 }
00379
00380 int inside(int x,int y,int left,int top,int right,int bottom)
00381 {
00382 if (x > left && x < right && y > top && y < bottom)
00383 return 1;
00384 else
00385 return 0;
00386 }
00387
00388 void updatebullet(SPRITE *spr)
00389 {
00390 int n,x,y;
00391 int x1,y1,x2,y2;
00392
00393 updatesprite(spr);
00394
00395 if (spr->x < mapxoff || spr->x > mapxoff + SCREEN_W)
00396 {
00397 spr->alive = 0;
00398 return;
00399 }
00400
00401 for (n=0; n<MAX_ENEMIES; n++)
00402 {
00403 if (enemies[n]->alive)
00404 {
00405
00406 x = spr->x + spr->width/2 - mapxoff;
00407 y = spr->y + spr->height/2 - mapyoff;
00408
00409
00410 x1 = enemies[n]->x - mapxoff;
00411 y1 = enemies[n]->y - mapyoff;
00412 x2 = x1 + enemies[n]->width;
00413 y2 = y1 + enemies[n]->height;
00414
00415
00416 if (inside(x, y, x1, y1, x2, y2))
00417 {
00418 enemies[n]->alive=0;
00419 spr->alive=0;
00420
00421
00422
00423 }
00424 }
00425 }
00426 }
00427
00428 void updatebullets()
00429 {
00430 int n;
00431 for (n=0; n<MAX_BULLETS; n++)
00432 if (bullets[n]->alive)
00433 {
00434 updatebullet(bullets[n]);
00435 draw_sprite(buffer,bullet_image, bullets[n]->x-mapxoff, bullets[n]->y-mapyoff);
00436 }
00437 }
00438
00439 void loadsounds()
00440 {
00441
00442
00443
00444
00445
00446 if (install_sound(DIGI_AUTODETECT, MIDI_NONE, " ") != 0)
00447 {
00448 allegro_message("Error initializing sound system");
00449 return;
00450 }
00451
00452 sounds[villian_Audio] = load_sample("villian_Audio.wav");
00453 if (!sounds[villian_Audio])
00454 {
00455 allegro_message("error reading villian_Audio.wav");
00456 return;
00457 }
00458
00459 sounds[JUMP] = load_sample("jump.wav");
00460 if (!sounds[JUMP])
00461 {
00462 allegro_message("error reading jump.wav");
00463 return;
00464 }
00465
00466 sounds[ITEM] = load_sample("item.wav");
00467 if (!sounds[ITEM])
00468 {
00469 allegro_message("error reading item.wav");
00470 return;
00471 }
00472
00473 sounds[SHOOT] = load_sample("shoot.wav");
00474 if (!sounds[SHOOT])
00475 {
00476 allegro_message("error reading shoot.wav");
00477 return;
00478 }
00479
00480 sounds[HIT] = load_sample("hit.wav");
00481 if (!sounds[HIT])
00482 {
00483 allegro_message("error reading hit.wav");
00484 return;
00485 }
00486
00487 play_sample(sounds[4], VOLUME, PAN, PITCH, FALSE);
00488
00489
00490
00491
00492
00493
00494 }
00495
00496
00497
00498 int collided(int x, int y)
00499 {
00500 BLKSTR *blockdata;
00501 blockdata = MapGetBlock(x/mapblockwidth, y/mapblockheight);
00502 return blockdata->bl;
00503 }
00504
00505 void draw_crosshair()
00506 {
00507
00508
00509
00510 line(buffer, (player->x - 10 - mapxoff), (player->y - mapyoff), (player->x + 10 - mapxoff), (player->y - mapyoff), RED);
00511 line(buffer, (player->x - mapxoff), (player->y - 10 - mapyoff), (player->x - mapxoff), (player->y + 10 - mapyoff), RED);
00512
00513
00514 line(buffer, (player->x - 10 - mapxoff), (player->y - mapyoff + player->height), (player->x + 10 - mapxoff), (player->y - mapyoff + player->height), RED);
00515 line(buffer, (player->x - mapxoff), (player->y - 10 - mapyoff + player->height), (player->x - mapxoff), (player->y + 10 - mapyoff + player->height), RED);
00516
00517
00518 line(buffer, (player->x - 10 - mapxoff + player->width), (player->y - mapyoff), (player->x + 10 - mapxoff + player->width), (player->y - mapyoff), RED);
00519 line(buffer, (player->x - mapxoff + player->width), (player->y - 10 - mapyoff), (player->x - mapxoff + player->width), (player->y + 10 - mapyoff), RED);
00520
00521
00522 line(buffer, (player->x - 10 - mapxoff + player->width), (player->y - mapyoff + player->height), (player->x + 10 - mapxoff + player->width), (player->y - mapyoff + player->height), RED);
00523 line(buffer, (player->x - mapxoff + player->width), (player->y - 10 - mapyoff + player->height), (player->x - mapxoff + player->width), (player->y + 10 - mapyoff + player->height), RED);
00524 return;
00525 }
00526
00527 void restart_level()
00528 {
00529 if (stats->lives > 0)
00530 {
00531 stats->health=25;
00532 env->counter=300;
00533 stats->score=0;
00534 player->x = 80;
00535 player->y = 100;
00536 player->collision=0;
00537 jump = JUMPIT;
00538 }
00539 else
00540 {
00541 allegro_message("Deiner gemütlichkeit is kaput! Exiting game...\n");
00542 exit(0);
00543 }
00544 return;
00545 }
00546
00547 void fire()
00548 {
00549 int n;
00550 for (n=0; n<MAX_BULLETS; n++)
00551 {
00552 if (!bullets[n]->alive)
00553 {
00554 bullets[n]->alive++;
00555 bullets[n]->x = player->x;
00556 bullets[n]->y = player->y + player->height/2;
00557 if (player->rightfacing)
00558 bullets[n]->rightfacing=1;
00559 else
00560 bullets[n]->rightfacing=0;
00561 return;
00562 }
00563 }
00564 }
00565
00566
00567
00568 void checkinput()
00569 {
00570 if (key[KEY_1]) {
00571 if (env->audio_enabled)
00572 play_sample(music, env->audio_volume, env->audio_pan, env->audio_pitch, TRUE);
00573 }
00574 if (key[KEY_2]) {
00575 if (env->audio_enabled)
00576 stop_sample(music);
00577 }
00578 if (key[KEY_S]) {
00579 env->counter = 100000;
00580 remove_timer();
00581 }
00582 if (key[KEY_H]) {
00583 stats->health -= (int)(env->diff_mod * 5);
00584 if (stats->health < 0) {
00585 allegro_message("You die. Your corpse is quickly eaten by a grue.");
00586 stats->lives--;
00587 restart_level();
00588 }
00589 }
00590 if (key[KEY_C]) {
00591 get_cd();
00592 }
00593 if (key[KEY_J]) {
00594 get_jumpdrive();
00595 }
00596 if (key[KEY_W]) {
00597 jump = 45;
00598 }
00599 if (key[KEY_LCONTROL]) {
00600 fire();
00601 }
00602 if (key[KEY_RIGHT]) {
00603 player->rightfacing = 1;
00604 player->x+=4;
00605 if (++player->framecount > player->framedelay) {
00606 player->framecount=0;
00607 if (++player->curframe > player->maxframe)
00608 player->curframe=1;
00609 }
00610 }
00611 else if (key[KEY_LEFT]) {
00612 player->rightfacing = 0;
00613 player->x-=4;
00614 if (++player->framecount > player->framedelay) {
00615 player->framecount=0;
00616 if (++player->curframe > player->maxframe)
00617 player->curframe=1;
00618 }
00619 }
00620 else player->curframe=0;
00621
00622 if (key[KEY_SPACE]) {
00623 do_jump();
00624 }
00625 return;
00626 }
00627
00628
00629
00630 void update_enemies()
00631 {
00632 int n;
00633
00634 for (n=0; n<10; n++) {
00635 if (enemies[n]->alive) {
00636 if ((enemies[n]->x - player->x - mapxoff) <= 600)
00637 enemies[n]->xspeed = 2;
00638 updatesprite(enemies[n]);
00639 draw_sprite(buffer, mis_1_images[enemies[n]->curframe],
00640 enemies[n]->x - mapxoff, enemies[n]->y-mapyoff);
00641 }
00642 }
00643 if (boss->alive) {
00644 draw_sprite(buffer, boss_images[boss->curframe], boss->x-mapxoff, boss->y-mapyoff);
00645 }
00646 }
00647
00648 void updatesprite(SPRITE *spr)
00649 {
00650
00651 if(!spr->rightfacing) {
00652 if (collided(spr->x, spr->y + spr->height) || collided(spr->x, spr->y+5)) {
00653 spr->collision=1;
00654 spr->x = spr->oldpx;
00655 }
00656 }
00657 else {
00658 if (collided(spr->x + spr->width, spr->y + spr->height) || collided(spr->x + spr->width, spr->y+5)) {
00659 spr->collision=1;
00660 spr->x = spr->oldpx;
00661 }
00662 }
00663
00664
00665 if (spr->xcount > spr->xdelay) {
00666 if (spr->rightfacing)
00667 spr->x += spr->xspeed;
00668 else
00669 spr->x -= spr->xspeed;
00670 }
00671
00672 if (++spr->framecount > spr->framedelay) {
00673 spr->framecount = 0;
00674 if (spr->animdir == -1) {
00675 if (--spr->curframe < 0)
00676 spr->curframe = spr->maxframe;
00677 }
00678 else if (spr->animdir == 1) {
00679 if (++spr->curframe > spr->maxframe)
00680 spr->curframe = 0;
00681 }
00682 }
00683 }
00684
00685
00686 void updatemap()
00687 {
00688
00689 mapxoff = player->x + player->width/2 - WIDTH/2 + 10;
00690 mapyoff = player->y + player->height/2 - HEIGHT/2 + 10;
00691
00692
00693 if (mapxoff < 0) mapxoff = 0;
00694 if (mapxoff > (mapwidth * mapblockwidth - WIDTH))
00695 mapxoff = mapwidth * mapblockwidth - WIDTH;
00696 if (mapyoff < 0)
00697 mapyoff = 0;
00698 if (mapyoff > (mapheight * mapblockheight - HEIGHT))
00699 mapyoff = mapheight * mapblockheight - HEIGHT;
00700
00701 MapDrawBG(buffer, mapxoff, mapyoff, 0, 0, WIDTH-1, HEIGHT-1);
00702 MapDrawFG(buffer, mapxoff, mapyoff, 0, 0, WIDTH-1, HEIGHT-1, 0);
00703 return;
00704 }
00705
00706
00707
00708 void updateplayer()
00709 {
00710 if (jump != JUMPIT)
00711 {
00712 if (!(collided(player->x, player->y - jump/5) || collided(player->x + player->width / 2, player->y - jump/5) || collided(player->x + player->width, player->y - jump/5)) ||
00713 collided(player->x, player->y + player->height/2) || collided(player->x + player->width, player->y + player->height/2) ||
00714 collided(player->x, player->height) || collided(player->x + player->width, player->y))
00715 {
00716 player->y -= jump/5;
00717 jump--;
00718 }
00719 else {
00720 jump = 0;
00721 player->collision = 1;
00722 }
00723 }
00724
00725 if (jump<0)
00726 {
00727 if (collided(player->x + player->width/2, player->y + player->height) || collided(player->x + player->width/2, player->y))
00728 {
00729 player->collision=1;
00730 jump = JUMPIT;
00731 while (collided(player->x + player->width/2, player->y + player->height))
00732 player->y -= 2;
00733 }
00734 }
00735
00736 if (player->x == 8600)
00737 boss_battle();
00738 updatesprite(player);
00739 updatemap();
00740
00741 if (player->rightfacing)
00742 draw_sprite(buffer, player_images[player->curframe],
00743 (player->x-mapxoff), (player->y-mapyoff+1));
00744 else
00745 draw_sprite_h_flip(buffer, player_images[player->curframe],
00746 (player->x-mapxoff), (player->y-mapyoff));
00747 return;
00748 }
00749
00750
00751 void get_cd()
00752 {
00753 if (env->audio_enabled) { play_sample(sounds[ITEM], VOLUME, PAN, PITCH, FALSE); }
00754 stats->score += 35;
00755 return;
00756 }
00757
00758
00759 void get_jumpdrive()
00760 {
00761 if (env->audio_enabled) { play_sample(sounds[ITEM], VOLUME, PAN, PITCH, FALSE); }
00762 stats->score += 35;
00763 return;
00764 }
00765
00766
00767 void check_ground()
00768 {
00769 if (jump==JUMPIT) {
00770 if (!collided(player->x + player->width/2, player->y + player->height+5)) {
00771 jump = 0;
00772 player->collision=0;
00773 }
00774 }
00775 }
00776
00777 void do_jump()
00778 {
00779 jump=35;
00780 if (env->audio_enabled)
00781 play_sample(sounds[JUMP], VOLUME, PAN, PITCH, FALSE);
00782 }
00783
00784
00785
00786 void boss_battle()
00787 {
00788 remove_timer();
00789 allegro_message("The Battle Begins Now...");
00790
00791 }
00792
00793
00794
00795 void init_win32()
00796 {
00797 set_window_title(title_string);
00798
00799 return;
00800 }
00801 void init_linux()
00802 {
00803 allegro_message("GNU/Linux has not yet been tested; some options will be disabled");
00804 env->audio_enabled = FALSE;
00805 set_window_title(title_string);
00806 return;
00807 }
00808 void init_unix()
00809 {
00810 env->audio_enabled = FALSE;
00811 set_window_title(title_string);
00812 return;
00813 }
00814
00815
00816
00817
00818
00819
00820 char *OSinit(int number)
00821 {
00822 switch (number)
00823 {
00824 case OSTYPE_WIN3:
00825 case OSTYPE_WIN95:
00826 case OSTYPE_WIN98:
00827 case OSTYPE_WINME:
00828 case OSTYPE_WINNT:
00829 case OSTYPE_WIN2000:
00830 case OSTYPE_WINXP:
00831 init_win32();
00832 break;
00833 case OSTYPE_LINUX:
00834 init_linux();
00835 break;
00836 case OSTYPE_UNIX:
00837 init_unix();
00838 break;
00839 }
00840 return "";
00841 }
00842
00843
00844 END_OF_MAIN();