|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T g
Length: 6373 (0x18e5) Types: TextFile Names: »game.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/X/Xrobots/game.c«
/* * game.c -- xrobots v1.0 * * Most of the game logic is here. */ #include "game.h" #include "score.h" /* some of these are global */ int human_x, human_y, last_human_x, last_human_y; int robot_array[MAXX][MAXY], robot_array_bak[MAXX][MAXY]; /* These arrays are filled with the robots and the heaps * They do not include the player(human). */ int score; int num_robots; int level; int game_active; int sonic_used; /*----------------------------------------------------------------------*/ void new_game() { score = 0; level = 0; sonic_used = 1; game_active = 1; new_level(); update_score(score); } /*----------------------------------------------------------------------*/ void add_score(n) int n; { score += 10 * n; /* ten points for each wasted robot. */ num_robots -= n; if(n) update_score(score); } /*----------------------------------------------------------------------*/ void new_level() { int x,y,tmp; reset_sonic_button(); if(!sonic_used) { score += 50; /* bonus for not using sonic screwdriver on last level*/ update_score(score); } sonic_used = 0; level++; num_robots = tmp = level*5; for_each /* clean out both the robot arrays */ { robot_array[x][y] = EMPTY; robot_array_bak[x][y] = EMPTY; } human_x = (int)random()%MAXX; /* assign human to new space */ human_y = (int)random()%MAXY; robot_array[human_x][human_y] = ROBOT; while(tmp--) { x = (int)random()%MAXX; y = (int)random()%MAXY; if(robot_array[x][y] == ROBOT) tmp++; /* space already occupied */ robot_array[x][y] = ROBOT; } robot_array[human_x][human_y] = EMPTY; display_level(); display_possible_moves(); } /*----------------------------------------------------------------------*/ int chase() { /* chase() returns the number of robots that were wasted in each call. */ /* after each call, be sure to check if all the robots are dead */ int x,y; int newx,newy; int num_wasted = 0; for_each { robot_array_bak[x][y] = robot_array[x][y]; if(robot_array[x][y] != HEAP) robot_array[x][y] = 0; } for_each { if(robot_array_bak[x][y] != ROBOT) continue; if(x>human_x) /* move toward the human */ newx = x-1; else if(x<human_x) newx = x+1; else newx = x; if(y>human_y) newy = y-1; else if(y<human_y) newy = y+1; else newy = y; # ifdef DEBUG printf("moving (%d,%d) to (%d,%d)\n",x,y,newx,newy); # endif /* check to see if a robot or heap was already in that spot */ if(robot_array[newx][newy] == ROBOT) { robot_array[newx][newy] = HEAP; num_wasted += 2; continue; } if(robot_array[newx][newy] == HEAP) { num_wasted++; continue; } /* move robot to new location */ robot_array[newx][newy] = ROBOT; } return(num_wasted); } /*----------------------------------------------------------------------*/ void undo_chase() { int x,y; for_each robot_array[x][y] = robot_array_bak[x][y]; } /*----------------------------------------------------------------------*/ void teleport() { int num_wasted; if(!game_active) return; do { human_x = (int)random()%MAXX; /* pick a spot not already occupied */ human_y = (int)random()%MAXY; } while(robot_array[human_x][human_y] != EMPTY); show_teleport(); num_wasted = chase(); if(robot_array[human_x][human_y] != EMPTY) { /* death... */ undo_chase(); /* it is a matter of preference to clear the screen when you die... */ display_level(); do_death(); check_score(score); game_active = 0; return; } display_level(); score += num_robots; /* bonus for teleporting */ score += num_wasted * 10; /* score for any that collided */ num_robots -= num_wasted; update_score(score); if(!num_robots) new_level(); else display_possible_moves(); } /*----------------------------------------------------------------------*/ void sonic_screwdriver() { /* remove the neighboring robots by calling chase(), then clear out */ /* the human's position of robots */ int num_wasted; if(!game_active) return; if(sonic_used) return; sonic_used = 1; show_sonic(); num_wasted = chase(); if(robot_array[human_x][human_y] == ROBOT) add_score(1); robot_array[human_x][human_y] = EMPTY; last_human_x = human_x; last_human_y = human_y; show_movement(); add_score(num_wasted); if(!num_robots) new_level(); else display_possible_moves(); } /*----------------------------------------------------------------------*/ void wait_for_em() { /* call chase until any robot is breathing right down the human's neck */ int num_wasted; if(!game_active) return; for(;;) { num_wasted = chase(); if(!num_robots) { add_score(num_wasted); new_level(); break; } if(robot_array[human_x][human_y] != EMPTY) { /* backout of latest chase() and break loop */ undo_chase(); break; } add_score(num_wasted); show_movement(); } display_possible_moves(); } /*----------------------------------------------------------------------*/ int can_go(x,y) int x,y; { /* check if (x,y) is a legit move. */ if( INYRANGE(y-1) ) { if( INXRANGE(x-1) ) if(robot_array[x-1][y-1] == ROBOT) return 0; if( INXRANGE(x) ) if(robot_array[x][y-1] == ROBOT) return 0; if( INXRANGE(x+1) ) if(robot_array[x+1][y-1] == ROBOT) return 0; } if( INYRANGE(y) ) { if( INXRANGE(x-1) ) if(robot_array[x-1][y] == ROBOT) return 0; if( INXRANGE(x) ) { if(robot_array[x][y] == ROBOT) return 0; if(robot_array[x][y] == HEAP) return 0; } if( INXRANGE(x+1) ) if(robot_array[x+1][y] == ROBOT) return 0; } if( INYRANGE(y+1) ) { if( INXRANGE(x-1) ) if(robot_array[x-1][y+1] == ROBOT) return 0; if( INXRANGE(x) ) if(robot_array[x][y+1] == ROBOT) return 0; if( INXRANGE(x+1) ) if(robot_array[x+1][y+1] == ROBOT) return 0; } if( !INXRANGE(x) ) return 0; if( !INYRANGE(y) ) return 0; return 1; } /*----------------------------------------------------------------------*/