static int gen_monster(lua_State* L) { GameState* gs = lua_get_gamestate(L); MTwist& mt = gs->rng(); int nargs = lua_gettop(L); GeneratedLevel* level = lua_togenlevel(L, 1); enemy_id etype = enemy_from_lua(L, 2); Region r = lua_toregion(L, 3); int amount = nargs >= 4 ? lua_tointeger(L, 4) : 1; bool success = generate_enemy(*level, mt, etype, r, gs->teams().default_enemy_team(), amount); lua_pushboolean(L, success); return 1; }
/** init_model: Used to initialize the values of a given model. * It takes a pointer to a model and changes it's values * to set values, instead of having to call all of the * functions individually. * * @param: modelPtr * A pointer to an object of the Model structure type. * * @return: none * */ void init_model(struct Model *modelPtr) { int i; set_score(modelPtr, 0); /* initialize score to 0 */ set_player_move_requested(modelPtr, 0, 0); set_player_deltaX(modelPtr, 0, 8); set_player_deltaY(modelPtr, 0, 8); set_player_cor(modelPtr, 0, 20, 160); /* set player 1's position in play area */ set_player_alive(modelPtr, 0, 0); /* set player 1's alive state to true */ for(i = 0; i < NUM_ENEMIES; i++) { generate_enemy(modelPtr, i); } }
/* Purpose: Moves the enemy ship to a new coordinate, and resets it if needed Param: pointer to model enemy num: 0 = enemy 1, 1 = enemy 2, ... */ void move_enemy_ship(struct Model *modelPtr, UINT16 enemy) { UINT16 enemy_posX; UINT16 enemy_deltaX; /* Get enemy's current position, and "speed" */ enemy_posX = get_enemy_posX(modelPtr, enemy); enemy_deltaX = get_enemy_deltaX(modelPtr, enemy); /* Update the enemies position if it isn't on the left side of the screen */ if (enemy_posX <= 568) { enemy_posX -= enemy_deltaX; set_enemy_cor(modelPtr, enemy, enemy_posX, get_enemy_posY(modelPtr,enemy)); } else { /* If it is on the left side of the screen, then generate a new starting position */ generate_enemy(modelPtr, enemy); } }
void gameLoop() { // Set our game data shipRow = 55; shipCol = 0; enemyCol = 225; enemy_num = 0; projectile_num = 0; time_diff = 0; kills = 0; REG_DISPCNT = MODE3 | BG2_ENABLE; EntityClass player_ship; initialize_entity( &player_ship, SHIP_WIDTH, SHIP_HEIGHT, shipRow, shipCol ); EntityClass enemy; initialize_entity( &enemy, 0, 0, 0, 0 ); enemies[max_enemies+1] = enemy; while (lives != 0) { // Check if player won the level. if( kills == 10 ) { state = WIN; break; } // Draw background drawImage3( 0, 0, BACKGROUND_WIDTH, BACKGROUND_HEIGHT, background ); // Draw ship draw_entity( &player_ship, ship ); // Generate enemy if( time_diff <= 0 && enemy_num < 10 ) { time_diff = 75; int rand_row = ( rand() % (120+1-20) ) + 20; generate_enemy( rand_row, enemyCol ); } // Draw Enemy update_enemies(); // Draw each projectile update_projectiles(); // Check if player is dead. if( is_player_dead( &player_ship ) == 1 ) { lives--; gameLoop(); } check_collisions(); remove_old_projectiles(); remove_old_enemies(); // Draw lives for( int i = 0; i < lives; i++ ) { drawImage3( 140, 170 + ( i * 25 ), SHIP_WIDTH, SHIP_HEIGHT, ship ); } waitForVblank(); // If player hits 'select' return to titleScreen and start game over. if( KEY_DOWN_NOW( BUTTON_SELECT ) ) { state = TITLE; break; } // Player Actions if( KEY_DOWN_NOW( BUTTON_DOWN ) ) { if( get_row( &player_ship ) < 121 ) move_entity( &player_ship, 2, 0 ); } if( KEY_DOWN_NOW( BUTTON_UP ) ) { if( get_row( &player_ship ) > 20 ) move_entity( &player_ship, -2, 0 ); } if( KEY_DOWN_NOW( BUTTON_A ) ) { while( KEY_DOWN_NOW( BUTTON_A ) ) { ; } fire_weapon( &player_ship ); } time_diff--; } if( lives == 0 ) { state = GAME_OVER; } else if( state == WIN ) return; }