237 lines
7.3 KiB
Haxe
237 lines
7.3 KiB
Haxe
package states
|
|
{
|
|
import data.CSV_Data;
|
|
import data.TileData;
|
|
import global.Registry;
|
|
import org.flixel.FlxG;
|
|
import org.flixel.FlxPoint;
|
|
import org.flixel.FlxSprite;
|
|
import org.flixel.FlxState;
|
|
import org.flixel.FlxTilemap;
|
|
import org.flixel.system.FlxTile;
|
|
/**
|
|
* ...
|
|
* @author Seagaia
|
|
*/
|
|
class MinimapState extends PushableFlxState
|
|
{
|
|
|
|
public var minimap:FlxTilemap;
|
|
private var blank_tile_index:Int=9;
|
|
|
|
/* contants, screen width and height, used for centering the map */
|
|
private var sw:Int=160;
|
|
private var sh:Int=180;
|
|
|
|
public static var visited:Dynamic={ STREET:new Array(), BEDROOM:new Array(), REDCAVE:new Array(), CROWD:new Array(), APARTMENT:new Array(), CIRCUS:new Array(), HOTEL:new Array(), FIELDS:new Array(), CLIFF:new Array(), OVERWORLD:new Array(), BEACH:new Array(), REDSEA:new Array(), FOREST:new Array(), SUBURB:new Array(), TRAIN:new Array(), SPACE:new Array(), TERMINAL:new Array()};
|
|
public static var minimap_strings:Array<Dynamic>=new Array("","","","","","","","","","","","","","","","");
|
|
|
|
public static var minimap_areas:Array<Dynamic>=new Array("STREET", "BEDROOM", "REDCAVE", "CROWD", "APARTMENT", "CIRCUS", "HOTEL","FIELDS","CLIFF","OVERWORLD","BEACH","REDSEA","FOREST","SUBURB","TRAIN","SPACE","TERMINAL");
|
|
|
|
public var is_finished:Bool=false;
|
|
|
|
public var entrance:FlxSprite=new FlxSprite();
|
|
public var player_marker:FlxSprite=new FlxSprite();
|
|
public var player_marker_blink_timer:Float=0;
|
|
public var player_marker_blink_timer_max:Float=0.4;
|
|
public var has_map:Bool=false;
|
|
|
|
public var nr_times_coords_set:Int=0;
|
|
public var invalid:Bool=false;
|
|
|
|
public function new()
|
|
{
|
|
|
|
trace("Initializing Minimap");
|
|
minimap=new FlxTilemap();
|
|
minimap.loadMap("0,2", TileData.Minimap_Tiles, 7, 7);
|
|
reset_minimap();
|
|
|
|
add(minimap);
|
|
add(entrance);
|
|
|
|
add(player_marker);
|
|
|
|
setAll("scrollFactor", new FlxPoint(0, 0));
|
|
|
|
}
|
|
public static function save_delete_routine():Void {
|
|
visited["STREET"]=new Array();
|
|
visited["BEDROOM"]=new Array();
|
|
visited["CROWD"]=new Array();
|
|
visited["REDCAVE"]=new Array();
|
|
visited["APARTMENT"]=new Array();
|
|
visited["CIRCUS"]=new Array();
|
|
visited["HOTEL"]=new Array();
|
|
|
|
visited["FOREST"]=new Array();
|
|
visited["CLIFF"]=new Array();
|
|
visited["BEACH"]=new Array();
|
|
visited["REDSEA"]=new Array();
|
|
visited["OVERWORLD"]=new Array();
|
|
visited["FIELDS"]=new Array();
|
|
|
|
visited["SPACE"]=new Array();
|
|
visited["TERMINAL"]=new Array();
|
|
visited["SUBURB"]=new Array();
|
|
visited["TRAIN"]=new Array();
|
|
|
|
MinimapState.minimap_strings=new Array("","","","","","","","","","","","","","","","","");
|
|
}
|
|
|
|
public function get_minimap():FlxTilemap {
|
|
if(has_map)return minimap;
|
|
return null;
|
|
}
|
|
private function reset_minimap():Void {
|
|
|
|
nr_times_coords_set=0;
|
|
is_finished=false;
|
|
|
|
|
|
if(CSV_Data.minimap_csv.hasOwnProperty(Registry.CURRENT_MAP_NAME)){
|
|
player_marker.makeGraphic(3, 3, 0xffff5949);
|
|
entrance.makeGraphic(3, 3, 0xff0d52af);
|
|
}
|
|
|
|
|
|
var idx:Int=minimap_areas.indexOf(Registry.CURRENT_MAP_NAME);
|
|
if(idx==-1){
|
|
visible=false;
|
|
invalid=true;
|
|
has_map=false;
|
|
return;
|
|
}
|
|
visible=true;
|
|
|
|
minimap.null_buffer(0);// Force a redraw?
|
|
minimap.loadMap(new CSV_Data.minimap_csv[Registry.CURRENT_MAP_NAME], TileData.Minimap_Tiles, 7, 7);
|
|
set_coords(minimap);// Set alignment of minimap
|
|
|
|
var tmap:FlxTilemap=new FlxTilemap;
|
|
// If we have not yet initialized this according to the serialized
|
|
// minimap state, then mark all rooms as not visited
|
|
if(minimap_strings[idx]=="" || minimap_strings[idx]==null){
|
|
for(i in 0...minimap.totalTiles){
|
|
visited[Registry.CURRENT_MAP_NAME].push(0);
|
|
}
|
|
// Otherwise use a dirty hack to get the visited data
|
|
} else {
|
|
tmap.loadMap(minimap_strings[idx], TileData.Minimap_Tiles, 7, 7);
|
|
visited[Registry.CURRENT_MAP_NAME]=tmap.getData();
|
|
}
|
|
|
|
|
|
|
|
minimap.draw();// Maybe redraw??
|
|
update_map();// Make rooms invisible if not visited yet
|
|
|
|
set_marker_coords();// Set entrance/player spot etc
|
|
}
|
|
|
|
|
|
|
|
override public function update():Void
|
|
{
|
|
|
|
player_marker_blink_timer +=FlxG.elapsed;
|
|
if(player_marker_blink_timer>player_marker_blink_timer_max){
|
|
player_marker.visible=!player_marker.visible;
|
|
player_marker_blink_timer=0;
|
|
}
|
|
|
|
super.update();
|
|
}
|
|
|
|
public function stuff_for_pause_state():Void {
|
|
|
|
if(CSV_Data.minimap_csv.hasOwnProperty(Registry.CURRENT_MAP_NAME)){
|
|
// UPdate a room as visited
|
|
update_visited_array(Registry.CURRENT_MAP_NAME, Registry.CURRENT_GRID_X, Registry.CURRENT_GRID_Y);
|
|
// Reload the uncovered rooms
|
|
minimap.loadMap(new CSV_Data.minimap_csv[Registry.CURRENT_MAP_NAME], TileData.Minimap_Tiles, 7, 7)
|
|
// Redraw the map
|
|
update_map();
|
|
// MOve markers
|
|
set_marker_coords();
|
|
}
|
|
}
|
|
|
|
override public function push(_parent:FlxState):Void
|
|
{
|
|
if(minimap_areas.indexOf(Registry.CURRENT_MAP_NAME)!=-1){
|
|
is_finished=false;
|
|
minimap.loadMap(new CSV_Data.minimap_csv[Registry.CURRENT_MAP_NAME], TileData.Minimap_Tiles, 7, 7)
|
|
update_visited_array(Registry.CURRENT_MAP_NAME, Registry.CURRENT_GRID_X, Registry.CURRENT_GRID_Y);
|
|
update_map();
|
|
minimap_strings[minimap_areas.indexOf(Registry.CURRENT_MAP_NAME)]=FlxTilemap.arrayToCSV(visited[Registry.CURRENT_MAP_NAME],minimap.widthInTiles);
|
|
set_marker_coords();
|
|
}
|
|
super.push(_parent);
|
|
}
|
|
|
|
public function init_minimap():Void {
|
|
if(minimap_areas.indexOf(Registry.CURRENT_MAP_NAME)!=-1){
|
|
invalid=false;
|
|
is_finished=false;
|
|
has_map=true;
|
|
minimap.visible=player_marker.visible=entrance.visible=true;
|
|
player_marker.exists=true;
|
|
reset_minimap();
|
|
minimap.loadMap(new CSV_Data.minimap_csv[Registry.CURRENT_MAP_NAME], TileData.Minimap_Tiles,7, 7)
|
|
update_visited_array(Registry.CURRENT_MAP_NAME, Registry.CURRENT_GRID_X, Registry.CURRENT_GRID_Y);
|
|
minimap_strings[minimap_areas.indexOf(Registry.CURRENT_MAP_NAME)]=FlxTilemap.arrayToCSV(visited[Registry.CURRENT_MAP_NAME],minimap.widthInTiles);
|
|
update_map();
|
|
set_marker_coords();
|
|
} else {
|
|
has_map=false;
|
|
invalid=true;
|
|
minimap.visible=player_marker.visible=entrance.visible=false;
|
|
player_marker.exists=false;
|
|
}
|
|
}
|
|
|
|
public function set_coords(map:FlxTilemap):Void {
|
|
|
|
minimap.x=60 +(100 - map.width)/ 2;
|
|
minimap.y=Registry.HEADER_HEIGHT +(100 - map.height)/ 2;
|
|
|
|
}
|
|
override public function destroy():Void
|
|
{
|
|
// Calls the level up, destroys all things added to this state
|
|
super.destroy();
|
|
}
|
|
|
|
public function update_visited_array(mapName:String, gx:Int, gy:Int):Void {
|
|
if(!invalid){
|
|
if(minimap==null)return;
|
|
var idx:Int=gy * minimap.widthInTiles + gx;
|
|
trace("Updated!", gx, gy);
|
|
visited[mapName][idx]=1;
|
|
// Update the serialized map state
|
|
minimap_strings[minimap_areas.indexOf(Registry.CURRENT_MAP_NAME)]=FlxTilemap.arrayToCSV(visited[Registry.CURRENT_MAP_NAME], minimap.widthInTiles);
|
|
|
|
}
|
|
}
|
|
|
|
private function update_map():Void
|
|
{
|
|
for(i in 0...minimap.widthInTiles * minimap.heightInTiles){
|
|
if(1 !=visited[Registry.CURRENT_MAP_NAME][i]){
|
|
minimap.setTileByIndex(i, blank_tile_index, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
private function set_marker_coords():Void
|
|
{
|
|
if(nr_times_coords_set<2){
|
|
nr_times_coords_set++;
|
|
entrance.x=minimap.x + 2 + Registry.CURRENT_GRID_X * 7;
|
|
entrance.y=minimap.y + 2 + Registry.CURRENT_GRID_Y * 7;
|
|
}
|
|
player_marker.x=minimap.x + 2 + Registry.CURRENT_GRID_X * 7;
|
|
player_marker.y=minimap.y + 2 + Registry.CURRENT_GRID_Y * 7;
|
|
}
|
|
} |