Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "blast_it.h"
- #include "gui.h"
- #include "game.h"
- #include <stdlib.h>
- #include <stdio.h>
- #include <math.h>
- void detect_collision_exp(Game* game, Explosion* exp);
- void move_enemy(Game * game, Enemy * enemy);
- void plaats_enemies(Game* game);
- void add_powerup(Game* game,int x,int y);
- void freeze_enemies(Game* game);
- void increment_score(Game* game,Enemy* enemy);
- int spread(Game * game, Explosion * exp, int dir);
- void move_player(Game * game, int dir);
- void lineOfFire(Game * game, Explosion * exp, int dir);
- void init_game(Game * game, int level_nr)
- {
- LevelInfo level_info = {10,10,1,DESERT,0.5,2,1,0.5};
- Player player={1*TILE_SIZE,1*TILE_SIZE,EAST,3,20};
- Level level;
- init_level(&level,level_info);
- game->game_over=0;
- game->level=level;
- game->score=0;
- gui_set_level_info(&level_info);
- game->player=player;
- plaats_enemies(game);
- gui_start_timer();
- }
- void plaats_enemies(Game* game){
- int aantalEnemies=game->level.level_info.nr_of_enemies;
- Enemy enemy = {0, 0, EAST,0,1,0,0};
- game->enemies=(Enemy*)calloc(aantalEnemies,sizeof(Enemy));
- while(aantalEnemies>0){
- int i= (rand() % (game->level.level_info.height-2)+1);
- int j= (rand() % (game->level.level_info.width-2)+1);
- if(aantalEnemies==1&&game->level.level_info.spawn_boss){
- enemy.is_boss=1;
- enemy.remaining_lives=3;
- }
- if(game->level.entities[i][j].type==EMPTY_SPACE&&!(i==1&&j==1)&&!(i==1&&j==2)&&!(i==2&&j==1)){
- enemy.x=j*TILE_SIZE;
- enemy.y=i*TILE_SIZE;
- game->enemies[game->level.level_info.nr_of_enemies-aantalEnemies]=enemy;
- aantalEnemies--;
- }
- }
- game->enemies_left=game->level.level_info.nr_of_enemies;
- }
- void do_game_loop(Game * game)
- {
- int stop = 0;
- while(!stop) {
- check_game_input(game);
- update_game(game);
- render_game(game);
- if(game->game_over||game->enemies_left==0)
- stop=1;
- }
- if(game->game_over){
- gui_set_game_over();
- }
- else gui_set_finished_level(game->score);
- destroy_level(&game->level);
- }
- void check_game_input(Game * game)
- {
- int movement = gui_is_movement_key_down();
- int moves[4] = {(movement&UP)==UP,(movement&RIGHT)==RIGHT,(movement&DOWN)==DOWN,(movement&LEFT)==LEFT};
- int i;
- game->input.hasMoved=0;
- for (i=0;i<4;i++){
- (game->input).moves[i]=moves[i];
- game->input.hasMoved+=moves[i];
- }
- game->input.dropBomb = gui_is_space_pressed();
- }
- void update_game(Game * game)
- {
- /* Do player movement */
- do_player_movement(game);
- /* Check enemies (move, collision with player) */
- do_enemy_ai(game);
- /* Process bonus items */
- process_bonus_items(game);
- /* Process bombs */
- process_bombs(game);
- }
- void render_game(Game * game)
- {
- int i;
- for(i=0;i<game->enemies_left;i++){
- gui_add_enemy(&game->enemies[i]);
- }
- render_level(&game->level);
- gui_add_player(&game->player);
- gui_draw_buffer();
- gui_set_bombs_left(game->player.remaining_bombs);
- gui_set_enemies_left(game->enemies_left);
- }
- void destroy_game(Game * game)
- {
- free(game->enemies);
- free(game->level.entities);
- }
- void do_player_movement(Game * game){
- Player* player=&game->player;
- int prevx=player->x;
- int prevy=player->y;
- int centx=prevx+(TILE_SIZE/2);
- int centy=prevy+(TILE_SIZE/2);
- if(game->input.hasMoved){
- int i;
- for(i=0;i<4;i++){
- //MOVEMENT
- if(game->input.moves[i]){
- move_player(game, i);
- }
- }
- //ORIENTATION
- if(game->player.x>prevx){
- game->player.orientation=EAST;
- }
- else if (game->player.x<prevx) {
- game->player.orientation=WEST;
- }
- if(game->player.y>prevy){
- game->player.orientation=SOUTH;
- }
- else if(game->player.y<prevy) {
- game->player.orientation=NORTH;
- }
- if(game->player.x==prevx&&game->player.y==prevy){
- for(i=0;i<4;i++)
- if(game->input.moves[i]==1){
- game->player.orientation=i;
- }
- }
- }
- if(game->input.dropBomb){
- if(game->player.remaining_bombs>0){
- int x=(centx/TILE_SIZE);
- int y=(centy/TILE_SIZE);
- if(game->level.entities[y][x].type==EMPTY_SPACE){
- Bomb bom={BOMB,x*TILE_SIZE,y*TILE_SIZE,BOMB_TICKS};
- game->level.entities[y][x].type=BOMB;
- game->level.entities[y][x].bomb=bom;
- game->player.remaining_bombs--;
- }
- }
- }
- }
- void move_player(Game * game, int dir){
- int x = game->player.x;
- int y = game->player.y;
- int dy = -((dir+1)%2)*(pow((double)-1,dir/2));
- int dx = (dir%2)*(pow((double)-1,(dir-1)/2));
- if(x%TILE_SIZE==0&&y%TILE_SIZE==0){
- if(game->level.entities[(y/TILE_SIZE)+dy][(x/TILE_SIZE)+dx].type!=OBSTACLE&&game->level.entities[(y/TILE_SIZE)+dy][(x/TILE_SIZE)+dx].type!=BOMB){
- game->player.x+=dx*PLAYER_MOVEMENT_INCREMENT;
- game->player.y+=dy*PLAYER_MOVEMENT_INCREMENT;
- }
- } else {
- int xm = x%TILE_SIZE;
- int ym = y%TILE_SIZE;
- game->player.x+=(xm/(xm-(xm!=1)))*dx*PLAYER_MOVEMENT_INCREMENT;
- game->player.y+=(ym/(ym-(ym!=1)))*dy*PLAYER_MOVEMENT_INCREMENT;
- }
- }
- void do_enemy_ai(Game * game)
- {
- int i;
- for(i=0;i<game->enemies_left;i++){
- Enemy enemy=game->enemies[i];
- int verschil=30;//oneindig
- if(enemy.frozen==0){
- move_enemy(game,game->enemies+i);
- }
- else{
- (game->enemies+i)->frozen--;
- }
- if(enemy.y==game->player.y){
- verschil=abs((enemy.x-game->player.x));
- }
- else if(enemy.x==game->player.x){
- verschil=abs((enemy.y-game->player.y));
- }
- if(verschil<15){
- game->game_over=1;
- }
- }
- }
- void move_enemy(Game * game, Enemy * enemy){
- int x = enemy->x;
- int y = enemy->y;
- int move_dir = enemy->move_direction;
- if(x%TILE_SIZE==0&&y%TILE_SIZE==0){
- int movement[4]={0,0,0,0};
- int i;
- for(i = 0; i < 4; i++){
- int dy = -((i+1)%2)*(pow((double)-1,i/2));
- int dx = (i%2)*(pow((double)-1,(i-1)/2));
- if(game->level.entities[(y/TILE_SIZE)+dy][(x/TILE_SIZE)+dx].type!=OBSTACLE&&game->level.entities[(y/TILE_SIZE)+dy][(x/TILE_SIZE)+dx].type!=BOMB)
- movement[i]=rand()+1;
- }
- if(movement[move_dir]>0){
- // Enemy loopt niet IN een explosie
- /*int dy = -((move_dir+1)%2)*(pow((double)-1,move_dir/2));
- int dx = (move_dir%2)*(pow((double)-1,(move_dir-1)/2));
- if(game->level.entities[(y/TILE_SIZE)+dy][(x/TILE_SIZE)+dx].type==EXPLOSION){
- movement[move_dir]=0;
- }
- else*/
- // Indien enemy nog naar voren kan, willen we niet dat hij al omkeert
- movement[(move_dir+2)%4] = 0;
- }
- move_dir=0;
- for(i=0;i<4;i++){
- if(movement[i]>movement[move_dir])
- move_dir = i;
- }
- if(movement[move_dir]==0)
- return;
- enemy->move_direction=(ORIENTATION) move_dir;
- }
- enemy->x+= (move_dir%2)*(pow((double)-1,(move_dir-1)/2))*ENEMY_MOVEMENT_INCREMENT*pow(((double)BOSS_MOVEMENT_INCREMENT)/ENEMY_MOVEMENT_INCREMENT,enemy->is_boss);
- enemy->y+= -((move_dir+1)%2)*(pow((double)-1,move_dir/2))*ENEMY_MOVEMENT_INCREMENT*pow(((double)BOSS_MOVEMENT_INCREMENT)/ENEMY_MOVEMENT_INCREMENT,enemy->is_boss);
- }
- void process_bonus_items(Game * game){
- int centx=(game->player.x+(TILE_SIZE/2))/TILE_SIZE;
- int centy=(game->player.y+(TILE_SIZE/2))/TILE_SIZE;
- if(game->level.entities[centy][centx].type==POWERUP){
- Powerup up=game->level.entities[centy][centx].powerup;
- EmptySpace emp={EMPTY_SPACE,centx*TILE_SIZE,centy*TILE_SIZE};
- if(up.powerup_type==EXTRA_BOMB){
- game->player.remaining_bombs++;
- }
- else if(up.powerup_type==EXTRA_POWER){
- if(game->player.current_bomb_power<PLAYER_MAX_POWER)
- game->player.current_bomb_power++;
- }
- else if(up.powerup_type==FREEZE_ENEMIES){
- freeze_enemies(game);
- }
- game->level.entities[centy][centx].type=EMPTY_SPACE;
- game->level.entities[centy][centx].empty_space=emp;
- }
- }
- void freeze_enemies(Game* game){
- int i;
- for(i=0;i<game->enemies_left;i++){
- game->enemies[i].frozen=FREEZE_DURATION;
- }
- }
- void add_powerup(Game* game,int x,int y){
- int getal= rand()%100;
- int ratio=(int)100*game->level.level_info.bonus_spawn_ratio;
- if(getal<ratio){
- Powerup power={POWERUP,x,y,EXTRA_POWER};
- int i=rand()%3;
- if(i==0){
- power.powerup_type=EXTRA_BOMB;
- }
- else if(i==1){
- power.powerup_type=EXTRA_POWER;
- }
- else if(i==2){
- power.powerup_type=FREEZE_ENEMIES;
- }
- game->level.entities[y/TILE_SIZE][x/TILE_SIZE].type=POWERUP;
- game->level.entities[y/TILE_SIZE][x/TILE_SIZE].powerup=power;
- }
- }
- void process_bombs(Game * game)
- {
- int i;
- int j;
- for(i=0;i<game->level.level_info.height;i++)
- for(j=0;j<game->level.level_info.width;j++){
- if(game->level.entities[i][j].type==BOMB){
- Bomb* bom=&game->level.entities[i][j].bomb;
- if(bom->ticks_left>0){
- bom->ticks_left--;
- }
- else{
- int power = game->player.current_bomb_power;
- Explosion exp={EXPLOSION,bom->x,bom->y,{power,power,power,power},power,EXPLOSION_TICKS};
- //Spread berekenen
- detect_collision_exp(game,&exp);
- game->level.entities[i][j].type=EXPLOSION;
- game->level.entities[i][j].explosion=exp;
- }
- } else {
- if(game->level.entities[i][j].type==EXPLOSION){
- Explosion* exp=&game->level.entities[i][j].explosion;
- if(exp->ticks_left>0){
- exp->ticks_left--;
- {
- int k;
- for(k=0;k<4;k++){
- lineOfFire(game, exp, k);
- detect_collision_exp(game, exp);
- }
- }
- }
- else{
- EmptySpace emp={EMPTY_SPACE,exp->x,exp->y};
- game->level.entities[i][j].type=EMPTY_SPACE;
- game->level.entities[i][j].empty_space=emp;
- }
- }
- }}
- }
- void increment_score(Game* game,Enemy* enemy){
- if(enemy->is_boss){
- game->score+=SCORE_BOSS;
- }
- else{
- int plus=BASE_SCORE_ENEMY-gui_get_timer_score();
- if(plus>0)
- game->score+=plus;
- }
- }
- void detect_collision_exp(Game* game, Explosion* exp){
- int i;
- // Voor de vier orientaties de spread berekenen
- for(i=0;i<4;i++){
- exp->spread[i] = spread(game, exp, i);
- }
- }
- int spread(Game * game, Explosion * exp, int dir){
- int i=1;
- int cox=exp->x/TILE_SIZE;
- int coy=exp->y/TILE_SIZE;
- int spread = 0;
- int dy = -((dir+1)%2)*(pow((double)-1,dir/2));
- int dx = (dir%2)*(pow((double)-1,(dir-1)/2));
- int cnt = 1;
- while(i<=exp->spread[dir]&&cnt){
- if(game->level.entities[coy+dy*i][cox+dx*i].type==OBSTACLE){
- spread+=game->level.entities[coy+dy*i][cox+dx*i].obstacle.is_destructable;
- cnt=0;
- } else {
- int k = 0;
- while(k<game->enemies_left&&cnt){
- Enemy* enemy=&game->enemies[k];
- int encox=(enemy->x+(TILE_SIZE/2))/TILE_SIZE;
- int encoy=(enemy->y+(TILE_SIZE/2))/TILE_SIZE;
- if(encox==(cox)+(dx*i)&&encoy==coy+(dy*i))
- cnt = 0;
- k++;
- }
- spread++;
- }
- i++;
- }
- return spread;
- }
- void lineOfFire(Game * game, Explosion * exp, int dir){
- int cox=exp->x/TILE_SIZE;
- int coy=exp->y/TILE_SIZE;
- int dy = -((dir+1)%2)*(pow((double)-1,dir/2));
- int dx = (dir%2)*(pow((double)-1,(dir-1)/2));
- int i;
- for(i = 1; i <= exp->spread[dir]; i++){
- if(game->level.entities[coy+dy*i][cox+dx*i].type==OBSTACLE){
- EmptySpace emp={EMPTY_SPACE,(cox+dx*i)*TILE_SIZE,(coy+dy*i)*TILE_SIZE};
- game->level.entities[coy+dy*i][cox+dx*i].type=EMPTY_SPACE;
- game->level.entities[coy+dy*i][cox+dx*i].empty_space=emp;
- add_powerup(game,(cox+dx*i)*TILE_SIZE,(coy+dy*i)*TILE_SIZE);
- } else {
- int k;
- for(k=0;k<game->enemies_left;k++){
- Enemy* enemy=&game->enemies[k];
- int encox=(enemy->x+(TILE_SIZE/2))/TILE_SIZE;
- int encoy=(enemy->y+(TILE_SIZE/2))/TILE_SIZE;
- if(encox==(cox)+(dx*i)&&encoy==coy+(dy*i)&&!enemy->is_boss){
- add_powerup(game,(cox+dx*i)*TILE_SIZE,(coy+dy*i)*TILE_SIZE);
- increment_score(game,enemy);
- game->enemies[k]=game->enemies[game->enemies_left-1];
- game->enemies_left--;
- if(game->enemies_left>0)
- game->enemies=(Enemy*)realloc(game->enemies,game->enemies_left*sizeof(Enemy));
- k--;
- }
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment