| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -6,6 +6,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				#include <vector>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				#include <string>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				#include <sstream>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				#include <fstream>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				#include <map>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				#include <ctime>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -18,6 +19,8 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				using std::vector;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				using std::string;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				using std::ostringstream;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				using std::istringstream;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				using std::ifstream;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				using std::map;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				using std::pair;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -42,13 +45,38 @@ void GameScreen::reset() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				//If a sample needs to be played while it is still being played, it will be stopped first.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				//Admittedly this was a hack solution to the fact that my sound effect samples are too long. 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				//In future projects I will use a better program for sound effect creation that does not have a large minimum length for audio export.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				void play(ALLEGRO_SAMPLE_INSTANCE* x) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				void GameScreen::play(ALLEGRO_SAMPLE_INSTANCE* x) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if (al_get_sample_instance_playing(x)) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						al_stop_sample_instance(x);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					al_play_sample_instance(x);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				void GameScreen::build_enemy_queue() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					string line;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					ifstream enemies_file("enemies.txt");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if (enemies_file.is_open()) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						while (getline(enemies_file, line)) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							NewEnemy next;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							istringstream curr_line(line);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							string element;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							//Get enemy type (when there's other types of enemies I'll fix this)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							getline(curr_line, element, ',');
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							next.e_type = Enemy; 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							//Get appearance time
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							getline(curr_line, element, ',');
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							next.when = stoi(element);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							//Get position
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							getline(curr_line, element, ',');
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							next.x = stoi(element);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							enemy_q.push_back(next);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					enemies_file.close();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				void GameScreen::run(ALLEGRO_FONT* font) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					ALLEGRO_EVENT_QUEUE* event_queue = NULL;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					event_queue = al_create_event_queue();
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -58,6 +86,11 @@ void GameScreen::run(ALLEGRO_FONT* font) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					timer = al_create_timer(1.0 / FPS);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					al_register_event_source(event_queue, al_get_timer_event_source(timer));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					build_enemy_queue();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					bool more_enemies = true;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					NewEnemy next_enemy = enemy_q.back();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					enemy_q.pop_back();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					//MapLoad((char*)"level.fmp", 1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					map_y = TILE_SIZE * LEVEL_LEN;
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -132,7 +165,22 @@ void GameScreen::run(ALLEGRO_FONT* font) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								next_state = Exit;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							if (more_enemies && map_y >= next_enemy.when) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								Ship* new_e = new Ship(next_enemy.e_type);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								new_e->set_sprite(sprites["Enemy"]);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								new_e->reset_pos(next_enemy.x, 0 - new_e->height + 1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								objects.enemies.push_back(new_e);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								if (enemy_q.size() > 0) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
									next_enemy = enemy_q.back();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
									enemy_q.pop_back();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
									more_enemies = false;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
										
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							//Global refresh
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							objects.move_enemies();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							al_clear_to_color(al_map_rgb(0, 0, 0));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							redraw(font);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							al_flip_display();
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -216,6 +264,7 @@ void GameScreen::run(ALLEGRO_FONT* font) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					//Garbage collection
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					//MapFreeMem();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					objects.destroy_objects();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					al_destroy_event_queue(event_queue);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					al_destroy_timer(timer);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |