From 2a90bfaaad954fea65d0ae8df13de5af6e057ba4 Mon Sep 17 00:00:00 2001 From: Joa Frehner Date: Wed, 8 Nov 2023 16:20:06 +0100 Subject: [PATCH] Region pathfinding von einem seperaten Projekt rein gepastet. Wird noch nicht funktionieren. --- ...n.bmp-0e69595e5ec48ab400945277c9828255.md5 | 3 + ....bmp-0e69595e5ec48ab400945277c9828255.stex | Bin 0 -> 264 bytes Client/font/Leerzeichen.bmp.import | 35 ++ Server/region/Region.gd | 370 ++++++++++++++++-- Server/region/Region.tscn | 109 +----- 5 files changed, 379 insertions(+), 138 deletions(-) create mode 100644 Client/.import/Leerzeichen.bmp-0e69595e5ec48ab400945277c9828255.md5 create mode 100644 Client/.import/Leerzeichen.bmp-0e69595e5ec48ab400945277c9828255.stex create mode 100644 Client/font/Leerzeichen.bmp.import diff --git a/Client/.import/Leerzeichen.bmp-0e69595e5ec48ab400945277c9828255.md5 b/Client/.import/Leerzeichen.bmp-0e69595e5ec48ab400945277c9828255.md5 new file mode 100644 index 0000000..f08f82f --- /dev/null +++ b/Client/.import/Leerzeichen.bmp-0e69595e5ec48ab400945277c9828255.md5 @@ -0,0 +1,3 @@ +source_md5="a47db4bc7df31e2470e9663216138fec" +dest_md5="ff372a0a033369ebd292e33a30b28788" + diff --git a/Client/.import/Leerzeichen.bmp-0e69595e5ec48ab400945277c9828255.stex b/Client/.import/Leerzeichen.bmp-0e69595e5ec48ab400945277c9828255.stex new file mode 100644 index 0000000000000000000000000000000000000000..b9ea3434e8c73c482e8444b5dfd2a7f5c22a8f18 GIT binary patch literal 264 zcmZ>F2@X+UU|;}Y79a+)*cpN38z2sMbqWabbaQ(EWrqb=_*?<9_2mz+3)m|Nc-)e& z>g5y=5cz2z#i9}6%(!#wTeC?eh8kaXNIWg)ka)V9#o*NYKc8>(DlYoZHQ6lTQf2p+ z852Ahas@;Zj&WY_bUO5-f6iLv4LT9sk4o95c^AaFaku_)=G$@M7rV@YMG4aU`3$ui zL^fOrliG7sR_qAF`FO?)7OGOQS0*g^88oB!iK(#01F5T1B0}OXKI>De>DnE{{EuPh zr%TBR4CgpshD1$#JinOz%&J)_YKKmJn$9k=nkDSKPqI&Pp^H`anRRcC0uC%c>E&FW HtHB8X3iD@f literal 0 HcmV?d00001 diff --git a/Client/font/Leerzeichen.bmp.import b/Client/font/Leerzeichen.bmp.import new file mode 100644 index 0000000..8277361 --- /dev/null +++ b/Client/font/Leerzeichen.bmp.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Leerzeichen.bmp-0e69595e5ec48ab400945277c9828255.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://font/Leerzeichen.bmp" +dest_files=[ "res://.import/Leerzeichen.bmp-0e69595e5ec48ab400945277c9828255.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Server/region/Region.gd b/Server/region/Region.gd index 4a025d4..e43956b 100644 --- a/Server/region/Region.gd +++ b/Server/region/Region.gd @@ -1,35 +1,345 @@ extends Node2D -var inventory = {} +var tiles = [] -# Called when the node enters the scene tree for the first time. -func _ready(): - PlayerManager.subMenuOpen = false - pass # Replace with function body. +var superTiles=[] -func Buildings(tile, army): -# if region.faction == army.faction or worldtile != buildings(): #RegionOwner or worldtile == leer? -# if setPresent() == true: - return - -func mine(tile, army): - if Buildings(tile, army) == true: - if army.inventory.eschenwood() >= 30 or army.inventory.xp() >= 200: #inventory not properly defined yet, might need change -# var minekoordinate = Player.Tile #Player.Tile = Aktuelles Feld auf dem der Spieler sein soll. -# minekoordinate = earth.Tile #Building Sprite Tile - var buildingtime = 5 - var finish = buildingtime + ['turn'] #finish = Gebäude fertig - if finish == ['turn']: - preload("res://region/MineSmall.tscn").instance() - - - - - -func endTurn(): - pass +var tileRect = Vector2(10,11) -# Called every frame. 'delta' is the elapsed time since the previous frame. -#func _process(delta): -# pass - +var boardUnits = [ + { + "coords":Vector2(0,4), + "faction":"playerFaction", + "superUnit":false, + "type":"default", + "id":14231, + "maxMoveAp": 10, + "maxAp": 10, + "moveAp": 10, + "ap": 10, + }, + { + "coords":Vector2(6,4), + "faction":"playerFaction", + "superUnit":true, + "type":"default", + "id":14232, + "maxMoveAp": 10, + "maxAp": 10, + "moveAp": 10, + "ap": 10, + }, + { + "coords":Vector2(0,2), + "faction":"enemyFaction", + "superUnit":false, + "type":"default", + "id":14233, + "maxMoveAp": 10, + "maxAp": 10, + "moveAp": 10, + "ap": 10, + }, +] + +func _ready():#this mostly just builds a bunch of stuff + buildWorld() + +func buildWorld(): + tiles = buildTiles(tileRect.x,tileRect.y) + superTiles = buildSuperTiles(tiles) + +func nextRound():#this sends a nextRound signal to units on the board and refreshes their ap. + print("next turn") + for unit in boardUnits: + unit.moveAp = unit.maxMoveAp + unit.ap = unit.maxAp + print(unit.ap) + +func buildTiles(x,y):#this creates the tiles array and adds all the tile-dictionaries. Also sets ground-type. + var tilesToReturn = [] + var currentX = 0 + var currentY = 0 + var roadTiles = [] #client.get_node("TileMap").roadTiles + roadTiles.append(Vector2(2,4)) + roadTiles.append(Vector2(1,4)) + roadTiles.append(Vector2(3,4)) + roadTiles.append(Vector2(4,4)) + var mountainTiles = [] + mountainTiles.append(Vector2(2,3)) + mountainTiles.append(Vector2(1,3)) + mountainTiles.append(Vector2(3,3)) + mountainTiles.append(Vector2(4,3)) + var type = "grass" + for i in x: + var column = [] + currentY = 0 + for z in y: + type = "grass" + if roadTiles.has(Vector2(currentX,currentY)): + type = "road" + if mountainTiles.has(Vector2(currentX,currentY)): + type = "mountain" + var currentTile = { + "coords":null, + "vertices":[], + "verticeExplored":false, + "verticeDistance":[INF,INF,INF,INF,INF,INF,INF,INF], + "type":"grass", + "route":[] + } + currentTile.type = type + currentTile.coords = Vector2(currentX,currentY) + column.append(currentTile.duplicate()) + currentY += 1 + tilesToReturn.append(column) + currentX += 1 + return setVertices(tilesToReturn) + +func setVertices(templateTiles):#this finds the connection a tile has to other tiles. name is bad. + var tileToAdapt + var x = 0 + for row in templateTiles: + var y = 0 + for line in row: + tileToAdapt = templateTiles[x][y] +# print("\n") +# print("x:",x, " y:",y) + if templateTiles.size() > x+1: + if x ==0 and y == 2: + pass + if templateTiles[x].size() > (y+1): + setDistance(templateTiles[x][y+1], tileToAdapt, 0, false) + if templateTiles[x].size() > (x+1) and templateTiles[x+1].size() > (y+1):#returns null sometimes?? + setDistance(templateTiles[x+1][y+1], tileToAdapt, 1, true) + if templateTiles.size() > (x+1): + setDistance(templateTiles[x+1][y], tileToAdapt, 2, false) + if templateTiles[x].size() > (x+1) and templateTiles[x+1].size() > (y-1)and y-1 >=0: + setDistance(templateTiles[x+1][y-1], tileToAdapt, 3, true) + if templateTiles.size() > (y-1) and y-1 >=0: + setDistance(templateTiles[x][y-1], tileToAdapt, 4, false) + if templateTiles[x].size() > (x-1) and templateTiles[x-1].size() > (y-1)and x-1 >=0 and y-1 >=0: + setDistance(templateTiles[x-1][y-1], tileToAdapt, 5, true) + if templateTiles.size() > (x-1) and x-1 >=0: + setDistance(templateTiles[x-1][y], tileToAdapt, 6, false) + if templateTiles[x].size() > (x-1) and templateTiles[x-1].size() > (y+1)and x-1 >=0: + setDistance(templateTiles[x-1][y+1], tileToAdapt, 7, true) +# print("Tiles procedurally: ",tileToAdapt) + y+=1 + x+=1 + return templateTiles + +func setDistance(target, origin, index, diagonal = false):#this sets the distances to the connections between tiles. + if not diagonal: + match target.type: + "grass": + origin.verticeDistance[index] = 5 + "road": + origin.verticeDistance[index] = 2 + "mountain": + origin.verticeDistance[index] = INF + "enemyOccupied": + origin.verticeDistance[index] = INF + else: + match target.type: + "grass": + origin.verticeDistance[index] = 8 + "road": + origin.verticeDistance[index] = 3 + "mountain": + origin.verticeDistance[index] = INF + "enemyOccupied": + origin.verticeDistance[index] = INF + +func buildSuperTiles(templateTiles): + var superTilesToReturn = [] + var x = 0 + var y = 0 + for i in range(tileRect.x-1): + var column=[] + for line in range(tileRect.y-1): + var newSuperTile = { + "coords":null, + "vertices":[], + "verticeExplored":false, + "verticeDistance":[INF,INF,INF,INF,INF,INF,INF,INF], + "type":"grass", + "route":[], + "underTiles":[] + } + newSuperTile.underTiles.append(templateTiles[x][y]) + newSuperTile.underTiles.append(templateTiles[x][y+1]) + newSuperTile.underTiles.append(templateTiles[x+1][y]) + newSuperTile.underTiles.append(templateTiles[x+1][y+1]) + newSuperTile.coords = Vector2(x,y) + column.append(newSuperTile) + y+=1 + superTilesToReturn.append(column) + x+=1 + y=0 + return setSuperVertices(superTilesToReturn) + +func setSuperVertices(templateTiles): + var tileToAdapt + var x = 0 + for row in templateTiles: + var y = 0 + for line in row: + tileToAdapt = templateTiles[x][y] +# print("\n") +# print("x:",x, " y:",y) + if templateTiles.size() > x+1: + if templateTiles[x].size() > (y+1): + setSuperDistance(templateTiles[x][y+1], tileToAdapt, 0, false) + if templateTiles[x].size() > (x+1) and templateTiles[x+1].size() > (y+1): + setSuperDistance(templateTiles[x+1][y+1], tileToAdapt, 1, true) + if templateTiles.size() > (x+1): + setSuperDistance(templateTiles[x+1][y], tileToAdapt, 2, false) + if templateTiles[x].size() > (x+1) and templateTiles[x+1].size() > (y-1)and y-1 >=0: + setSuperDistance(templateTiles[x+1][y-1], tileToAdapt, 3, true) + if templateTiles.size() > (y-1)and y-1 >=0: + setSuperDistance(templateTiles[x][y-1], tileToAdapt, 4, false) + if templateTiles[x].size() > (x-1) and templateTiles[x-1].size() > (y-1)and x-1 >=0 and y-1 >=0: + setSuperDistance(templateTiles[x-1][y-1], tileToAdapt, 5, true) + if templateTiles.size() > (x-1)and x-1 >=0: + setSuperDistance(templateTiles[x-1][y], tileToAdapt, 6, false) + if templateTiles[x].size() > (x-1) and templateTiles[x-1].size() > (y+1)and x-1 >=0: + setSuperDistance(templateTiles[x-1][y+1], tileToAdapt, 7, true) +# print("Tiles procedurally: ",tileToAdapt) + y+=1 + x+=1 + return templateTiles + +func setSuperDistance(target,origin,index,diagonal = false): + var totalDistance = 0 + for tile in target.underTiles: + if not diagonal: + match tile.type: + "grass": + totalDistance += 5 + "road": + totalDistance += 2 + "mountain": + totalDistance += INF + "enemyOccupied": + totalDistance += INF + else: + match tile.type: + "grass": + totalDistance += 8 + "road": + totalDistance += 3 + "mountain": + totalDistance += INF + "enemyOccupied": + totalDistance += INF + origin.verticeDistance[index] = totalDistance/target.underTiles.size() + +func moveUnit(path,unitID): + var apCost = 0 + var unit = getUnitById(unitID) + var occupiedTiles=getOccupiedTiles(unit)[0] + var enemyOccupiedTiles=getOccupiedTiles(unit)[1] + var tiles = addEnemyOccupiedTilesToMap(enemyOccupiedTiles) +# lie check + if occupiedTiles.has(path[-1]): + return false + if unit.superUnit == true: + if occupiedTiles.has(path[-1]+Vector2(0,0)) or occupiedTiles.has(path[-1]+Vector2(1,0)) or occupiedTiles.has(path[-1]+Vector2(0,1)) or occupiedTiles.has(path[-1]+Vector2(1,1)): + return false +# overlap check + if path[0] != unit.coords: + return false + for i in range(path.size()-1): + var coordDirection = Vector2((path[i+1].x - path[i].x) , (path[i+1].y-path[i].y)) +# movement check + if abs(path[i].x - path[i+1].x)>1 and abs(path[i].y - path[i+1].y)>1: + return false +# distance check + var currTile = tiles[path[i].x][path[i].y] + var nextTile = tiles[path[i+1].x][path[i+1].y] + var directionIndex + if coordDirection == Vector2(0,1): + directionIndex = 0 + if coordDirection == Vector2(1,1): + directionIndex = 1 + if coordDirection == Vector2(1,0): + directionIndex = 2 + if coordDirection == Vector2(1,-1): + directionIndex = 3 + if coordDirection == Vector2(0,-1): + directionIndex = 4 + if coordDirection == Vector2(-1,-1): + directionIndex = 5 + if coordDirection == Vector2(-1,0): + directionIndex = 6 + if coordDirection == Vector2(-1,1): + directionIndex = 7 + apCost += currTile.verticeDistance[directionIndex] +# collision check + if unit.superUnit == true: + if enemyOccupiedTiles.has(path[i+1]+Vector2(0,0)) or enemyOccupiedTiles.has(path[i+1]+Vector2(1,0)) or enemyOccupiedTiles.has(path[i+1]+Vector2(0,1)) or enemyOccupiedTiles.has(path[i+1]+Vector2(1,1)): + return false + else: + if enemyOccupiedTiles.has(path[i+1]): + return false + if apCost > unit.moveAp+unit.ap: + return false + if unit.moveAp < apCost: + unit.ap -= (apCost-unit.moveAp) + unit.moveAp = 0 + else: + unit.moveAp -= apCost + unit.coords = path[-1] + for boardUnit in boardUnits: + if boardUnit.id == unit.id: + boardUnit.coords = unit.coords + print(path," NEXT ",unit.coords) + return [path, apCost] +# return validated path and ap and then execute it + +func getUnitById(unitId): + for unit in boardUnits: + if unit.id == unitId: + return unit + return null + +func getOccupiedTiles(forUnit):#looks into boardUnits to find their position and adds each of them to the occupiedTiles array. + var selectedFaction + if forUnit == null: + selectedFaction = "playerFaction" + else: + selectedFaction = forUnit.faction + var occupiedTiles = [] + var enemyOccupiedTiles = [] + for unit in boardUnits: + if unit != forUnit: + if !unit.superUnit: + occupiedTiles.append(unit.coords) + else: + occupiedTiles.append(Vector2(unit.coords.x, unit.coords.y)) + occupiedTiles.append(Vector2(unit.coords.x, unit.coords.y+1)) + occupiedTiles.append(Vector2(unit.coords.x+1, unit.coords.y)) + occupiedTiles.append(Vector2(unit.coords.x+1, unit.coords.y+1)) + if PlayerManager.checkdiplo(selectedFaction, unit.faction) == "enemies": + if !unit.superUnit: + enemyOccupiedTiles.append(unit.coords) + else: + enemyOccupiedTiles.append(Vector2(unit.coords.x, unit.coords.y)) + enemyOccupiedTiles.append(Vector2(unit.coords.x, unit.coords.y+1)) + enemyOccupiedTiles.append(Vector2(unit.coords.x+1, unit.coords.y)) + enemyOccupiedTiles.append(Vector2(unit.coords.x+1, unit.coords.y+1)) + return [occupiedTiles,enemyOccupiedTiles] + +func addEnemyOccupiedTilesToMap(enemyOccupiedTiles):#this creates the tiles array and adds all the tile-dictionaries. Also sets ground-type. + var mapTiles = tiles.duplicate(true) + var currentX = 0 + for tile in enemyOccupiedTiles: + mapTiles[tile.x][tile.y].type = "enemyOccupied" + return mapTiles + +func getTiles(unit): + if unit == null or !unit.superUnit: + return setVertices(addEnemyOccupiedTilesToMap(getOccupiedTiles(unit)[1])) + else: + return buildSuperTiles(setVertices(addEnemyOccupiedTilesToMap(getOccupiedTiles(unit)[1]))) diff --git a/Server/region/Region.tscn b/Server/region/Region.tscn index 518cca7..8cb3da2 100644 --- a/Server/region/Region.tscn +++ b/Server/region/Region.tscn @@ -1,11 +1,6 @@ -[gd_scene load_steps=16 format=2] +[gd_scene load_steps=9 format=2] [ext_resource path="res://region/Region.gd" type="Script" id=1] -[ext_resource path="res://images/region/regiontiles.png" type="Texture" id=2] -[ext_resource path="res://region/regionGround.gd" type="Script" id=3] -[ext_resource path="res://army/Stack2x1.tscn" type="PackedScene" id=4] -[ext_resource path="res://region/ressourcenodes/Mountain.tscn" type="PackedScene" id=5] -[ext_resource path="res://region/building/Building.tscn" type="PackedScene" id=6] [ext_resource path="res://Camera2D.gd" type="Script" id=7] [ext_resource path="res://region/RegionUI.tscn" type="PackedScene" id=8] [ext_resource path="res://menues/smallbtn.tscn" type="PackedScene" id=9] @@ -13,112 +8,10 @@ [ext_resource path="res://menues/toggleResearch.gd" type="Script" id=11] [ext_resource path="res://menues/research.tscn" type="PackedScene" id=12] [ext_resource path="res://items/Item.tscn" type="PackedScene" id=13] -[ext_resource path="res://region/MineSmall.tscn" type="PackedScene" id=14] - -[sub_resource type="TileSet" id=1] -0/name = "regiontiles.png 0" -0/texture = ExtResource( 2 ) -0/tex_offset = Vector2( 0, 0 ) -0/modulate = Color( 1, 1, 1, 1 ) -0/region = Rect2( 128, 0, 128, 128 ) -0/tile_mode = 0 -0/occluder_offset = Vector2( 0, 0 ) -0/navigation_offset = Vector2( 0, 0 ) -0/shape_offset = Vector2( 0, 0 ) -0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -0/shape_one_way = false -0/shape_one_way_margin = 0.0 -0/shapes = [ ] -0/z_index = 0 -1/name = "regiontiles.png 1" -1/texture = ExtResource( 2 ) -1/tex_offset = Vector2( 0, 0 ) -1/modulate = Color( 1, 1, 1, 1 ) -1/region = Rect2( 480, 0, 128, 128 ) -1/tile_mode = 0 -1/occluder_offset = Vector2( 0, 0 ) -1/navigation_offset = Vector2( 0, 0 ) -1/shape_offset = Vector2( 0, 0 ) -1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -1/shape_one_way = false -1/shape_one_way_margin = 0.0 -1/shapes = [ ] -1/z_index = 0 -2/name = "regiontiles.png 2" -2/texture = ExtResource( 2 ) -2/tex_offset = Vector2( 0, 0 ) -2/modulate = Color( 1, 1, 1, 1 ) -2/region = Rect2( 224, 384, 128, 128 ) -2/tile_mode = 0 -2/occluder_offset = Vector2( 0, 0 ) -2/navigation_offset = Vector2( 0, 0 ) -2/shape_offset = Vector2( 0, 0 ) -2/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -2/shape_one_way = false -2/shape_one_way_margin = 0.0 -2/shapes = [ ] -2/z_index = 0 -3/name = "regiontiles.png 3" -3/texture = ExtResource( 2 ) -3/tex_offset = Vector2( 0, 0 ) -3/modulate = Color( 1, 1, 1, 1 ) -3/region = Rect2( 0, 128, 128, 128 ) -3/tile_mode = 0 -3/occluder_offset = Vector2( 0, 0 ) -3/navigation_offset = Vector2( 0, 0 ) -3/shape_offset = Vector2( 0, 0 ) -3/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -3/shape_one_way = false -3/shape_one_way_margin = 0.0 -3/shapes = [ ] -3/z_index = 0 -4/name = "regiontiles.png 4" -4/texture = ExtResource( 2 ) -4/tex_offset = Vector2( 0, 0 ) -4/modulate = Color( 1, 1, 1, 1 ) -4/region = Rect2( 128, 128, 128, 128 ) -4/tile_mode = 0 -4/occluder_offset = Vector2( 0, 0 ) -4/navigation_offset = Vector2( 0, 0 ) -4/shape_offset = Vector2( 0, 0 ) -4/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -4/shape_one_way = false -4/shape_one_way_margin = 0.0 -4/shapes = [ ] -4/z_index = 0 [node name="Region" type="Node2D"] script = ExtResource( 1 ) -[node name="ground" type="TileMap" parent="."] -tile_set = SubResource( 1 ) -cell_size = Vector2( 128, 128 ) -format = 1 -tile_data = PoolIntArray( -65537, 1, 0, -131072, 1, 0, -131071, 1, 0, -131070, 1, 0, -131069, 1, 0, -131068, 1, 0, -131067, 1, 0, -131066, 1, 0, -131065, 1, 0, -131064, 1, 0, -131063, 1, 0, -131062, 1, 0, -131061, 1, 0, -131060, 1, 0, -131059, 1, 0, -131058, 1, 0, -1, 1, 0, -65536, 1, 0, -65535, 1, 0, -65534, 1, 0, -65533, 1, 0, -65532, 1, 0, -65531, 1, 0, -65530, 1, 0, -65529, 1, 0, -65528, 1, 0, -65527, 1, 0, -65526, 1, 0, -65525, 1, 0, -65524, 1, 0, -65523, 1, 0, -65522, 1, 0, -65521, 1, 0, -65520, 1, 0, 65535, 1, 0, 0, 0, 0, 1, 0, 0, 2, 2, 0, 3, 2, 0, 4, 2, 0, 5, 2, 0, 6, 2, 0, 7, 2, 0, 8, 1, 0, 9, 1, 0, 10, 1, 0, 11, 1, 0, 12, 1, 0, 13, 1, 0, 14, 1, 0, 15, 1, 0, 16, 1, 0, 131071, 1, 0, 65536, 0, 0, 65537, 0, 0, 65538, 2, 0, 65539, 2, 0, 65540, 2, 0, 65541, 2, 0, 65542, 2, 0, 65543, 2, 0, 65544, 1, 0, 65545, 1, 0, 65546, 1, 0, 65547, 1, 0, 65548, 1, 0, 65549, 1, 0, 65550, 1, 0, 65551, 1, 0, 65552, 1, 0, 196607, 1, 0, 131072, 0, 0, 131073, 0, 0, 131074, 2, 0, 131075, 4, 0, 131076, 4, 0, 131077, 0, 0, 131078, 2, 0, 131079, 2, 0, 131080, 1, 0, 131081, 1, 0, 131082, 1, 0, 131083, 1, 0, 131084, 1, 0, 131085, 1, 0, 131086, 1, 0, 131087, 1, 0, 131088, 1, 0, 131089, 1, 0, 131090, 1, 0, 131091, 1, 0, 131092, 1, 0, 131093, 1, 0, 131094, 1, 0, 262143, 1, 0, 196608, 4, 0, 196609, 4, 0, 196610, 4, 0, 196611, 4, 0, 196612, 4, 0, 196613, 0, 0, 196614, 2, 0, 196615, 2, 0, 196616, 1, 0, 196617, 1, 0, 196618, 1, 0, 196619, 1, 0, 196620, 1, 0, 196621, 1, 0, 196622, 1, 0, 196623, 1, 0, 196625, 1, 0, 196626, 1, 0, 196627, 1, 0, 196628, 1, 0, 196629, 1, 0, 196630, 1, 0, 327678, 1, 0, 327679, 1, 0, 262144, 0, 0, 262145, 0, 0, 262146, 3, 0, 262147, 3, 0, 262148, 3, 0, 262149, 0, 0, 262150, 1, 0, 262151, 1, 0, 262152, 1, 0, 262153, 1, 0, 262154, 1, 0, 262155, 1, 0, 262156, 1, 0, 262157, 1, 0, 262158, 1, 0, 262159, 1, 0, 393214, 1, 0, 393215, 1, 0, 327680, 1, 0, 327681, 1, 0, 327682, 1, 0, 327683, 1, 0, 327684, 1, 0, 327685, 1, 0, 327686, 1, 0, 327687, 1, 0, 327688, 1, 0, 327689, 1, 0, 327690, 1, 0, 327692, 1, 0, 327693, 1, 0, 327694, 1, 0, 327695, 1, 0, 458750, 1, 0, 458751, 1, 0, 393216, 1, 0, 393217, 1, 0, 393218, 1, 0, 393219, 1, 0, 393220, 1, 0, 393221, 1, 0, 393222, 1, 0, 393223, 1, 0, 393224, 1, 0, 393225, 1, 0, 393226, 1, 0, 393227, 1, 0, 393228, 1, 0, 393229, 1, 0, 393230, 1, 0, 393231, 1, 0, 524287, 1, 0, 458752, 1, 0, 458753, 1, 0, 458754, 1, 0, 458755, 1, 0, 458756, 1, 0, 458757, 1, 0, 458758, 1, 0, 458759, 1, 0, 458760, 1, 0, 458761, 1, 0, 458762, 1, 0, 458763, 1, 0, 458764, 1, 0, 458765, 1, 0, 458766, 1, 0, 458767, 1, 0, 589823, 1, 0, 524288, 1, 0, 524289, 1, 0, 524290, 1, 0, 524291, 1, 0, 524292, 1, 0, 524293, 1, 0, 524294, 1, 0, 524295, 1, 0, 524296, 1, 0, 524297, 1, 0, 524298, 1, 0, 524299, 1, 0, 524300, 1, 0, 524301, 1, 0, 524302, 1, 0, 524303, 1, 0, 655359, 1, 0, 589824, 1, 0, 589825, 1, 0, 589826, 1, 0, 589827, 1, 0, 589828, 1, 0, 589829, 1, 0, 589831, 1, 0, 589832, 1, 0, 589833, 1, 0, 589834, 1, 0, 589835, 1, 0, 655367, 1, 0 ) -script = ExtResource( 3 ) - -[node name="units" type="Node" parent="ground"] - -[node name="Stack" parent="ground/units" instance=ExtResource( 4 )] -position = Vector2( 128, 256 ) - -[node name="ressources" type="Node" parent="ground"] - -[node name="Mountain" parent="ground/ressources" instance=ExtResource( 5 )] -position = Vector2( 256, 768 ) - -[node name="buildings" type="Node" parent="ground"] - -[node name="Node2D" parent="ground/buildings" instance=ExtResource( 6 )] -position = Vector2( 730, 700 ) - -[node name="mine" type="Node2D" parent="ground/buildings"] -position = Vector2( 574, 569 ) - -[node name="MineSmall" parent="ground/buildings/mine" instance=ExtResource( 14 )] -position = Vector2( 1, 0 ) -scale = Vector2( 0.427155, 0.427155 ) - [node name="Camera2D" type="Camera2D" parent="."] current = true drag_margin_left = 0.0