diff --git a/Globals.gd b/Globals.gd
index 78dc25d..353c07e 100644
--- a/Globals.gd
+++ b/Globals.gd
@@ -13,7 +13,7 @@ var OceanNavGrid = null
var IslandNavGrid = null
var hex_size = 128
-var debug_nav = true
+var debug_nav = false
# Called when the node enters the scene tree for the first time.
func _ready():
diff --git a/assets/Yeah.png b/assets/Yeah.png
new file mode 100644
index 0000000..29485ac
Binary files /dev/null and b/assets/Yeah.png differ
diff --git a/assets/Yeah.png.import b/assets/Yeah.png.import
new file mode 100644
index 0000000..5b15d35
--- /dev/null
+++ b/assets/Yeah.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Yeah.png-e875d971d004375e7d655e960f859fdd.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/Yeah.png"
+dest_files=[ "res://.import/Yeah.png-e875d971d004375e7d655e960f859fdd.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
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/pirate_with_shovel.svg b/assets/pirate_with_shovel.svg
index a65786c..91f4add 100644
--- a/assets/pirate_with_shovel.svg
+++ b/assets/pirate_with_shovel.svg
@@ -25,15 +25,15 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="2.8"
- inkscape:cx="201.04361"
- inkscape:cy="80.467705"
+ inkscape:zoom="0.98994949"
+ inkscape:cx="263.67284"
+ inkscape:cy="10.726653"
inkscape:document-units="mm"
inkscape:current-layer="layer2"
showgrid="false"
- inkscape:window-width="1916"
+ inkscape:window-width="956"
inkscape:window-height="1041"
- inkscape:window-x="0"
+ inkscape:window-x="960"
inkscape:window-y="37"
inkscape:window-maximized="0"
fit-margin-top="0"
@@ -49,7 +49,7 @@
image/svg+xml
-
+
diff --git a/assets/shovel.svg b/assets/shovel.svg
new file mode 100644
index 0000000..74b561c
--- /dev/null
+++ b/assets/shovel.svg
@@ -0,0 +1,93 @@
+
+
+
+
diff --git a/assets/shovel.svg.import b/assets/shovel.svg.import
new file mode 100644
index 0000000..d8d8ac9
--- /dev/null
+++ b/assets/shovel.svg.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/shovel.svg-008b29b052e7f004096ee9ed0e7f010d.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/shovel.svg"
+dest_files=[ "res://.import/shovel.svg-008b29b052e7f004096ee9ed0e7f010d.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
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/scenes/Game.tscn b/scenes/Game.tscn
index 4eb447b..f29d4ef 100644
--- a/scenes/Game.tscn
+++ b/scenes/Game.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=14 format=2]
+[gd_scene load_steps=16 format=2]
[ext_resource path="res://scenes/World.gd" type="Script" id=1]
[ext_resource path="res://scenes/Grid.gd" type="Script" id=2]
@@ -9,6 +9,8 @@
[ext_resource path="res://scenes/Editor.gd" type="Script" id=7]
[ext_resource path="res://scenes/GridHighlight.gd" type="Script" id=8]
[ext_resource path="res://assets/boat.svg" type="Texture" id=9]
+[ext_resource path="res://assets/shovel.svg" type="Texture" id=10]
+[ext_resource path="res://assets/Yeah.png" type="Texture" id=11]
[sub_resource type="DynamicFont" id=1]
size = 27
@@ -273,15 +275,62 @@ margin_bottom = 221.0
rect_min_size = Vector2( 100, 100 )
text = "Birdy"
+[node name="DigButton" type="Button" parent="World/UI/VBoxContainer"]
+margin_top = 242.0
+margin_right = 115.0
+margin_bottom = 342.0
+rect_min_size = Vector2( 100, 100 )
+text = "Dig"
+
+[node name="SuccessMessage" type="Control" parent="World/UI"]
+visible = false
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -20.0
+margin_top = -20.0
+margin_right = 20.0
+margin_bottom = 20.0
+rect_scale = Vector2( 0.5, 0.5 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="TextureRect" type="TextureRect" parent="World/UI/SuccessMessage"]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -706.0
+margin_top = -264.0
+margin_right = 706.0
+margin_bottom = 264.0
+texture = ExtResource( 11 )
+stretch_mode = 4
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="DigSites" type="Node2D" parent="World"]
+
[node name="PlayerChar" type="KinematicBody2D" parent="World"]
script = ExtResource( 5 )
-[node name="pirate" type="Sprite" parent="World/PlayerChar"]
+[node name="Pirate" type="Sprite" parent="World/PlayerChar"]
scale = Vector2( 0.45498, 0.45498 )
texture = ExtResource( 3 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="World/PlayerChar"]
+[node name="Shovel" type="Sprite" parent="World/PlayerChar"]
+visible = false
+scale = Vector2( 0.455, 0.455 )
+texture = ExtResource( 10 )
+
+[node name="DigTimer" type="Timer" parent="World/PlayerChar"]
+one_shot = true
+
[node name="Camera" type="Camera2D" parent="World"]
current = true
@@ -313,3 +362,4 @@ render_target_update_mode = 1
[connection signal="pressed" from="World/UI/TopContainer/Button" to="World" method="_on_generate_button_pressed"]
[connection signal="pressed" from="World/UI/VBoxContainer/MapButton" to="World" method="_on_MapButton_pressed"]
[connection signal="pressed" from="World/UI/VBoxContainer/BirdyButton" to="World" method="_on_BirdyButton_pressed"]
+[connection signal="pressed" from="World/UI/VBoxContainer/DigButton" to="World" method="_on_DigButton_pressed"]
diff --git a/scenes/Island.gd b/scenes/Island.gd
index c6a6033..377a08a 100644
--- a/scenes/Island.gd
+++ b/scenes/Island.gd
@@ -135,6 +135,11 @@ func get_tile_by_world_coord(world_coord: Vector2):
return null
+func is_point_on_treasure_site(world_coord: Vector2):
+ var local_coord = get_local_coord_by_world_coord(world_coord)
+ return treasure_local_coords != null and local_coord == treasure_local_coords
+
+
func is_point_on_landing_site(world_coord: Vector2):
return (Globals.WorldToHex(world_coord) - Globals.WorldToHex(landing_site_world)).length_squared() < 1
diff --git a/scenes/World.gd b/scenes/World.gd
index 528a668..192d331 100644
--- a/scenes/World.gd
+++ b/scenes/World.gd
@@ -6,6 +6,7 @@ onready var GridHighlight = get_node("GridHighlight")
onready var Editor = get_node("../Editor")
onready var Islands = get_node("Islands")
+onready var DigSites = get_node("DigSites")
onready var EditIslandButton = get_node("UI/TopContainer/EditIslandButton")
onready var WorldCamera = get_node("Camera")
onready var OffsetValueLabel = get_node("UI/TopContainer/OffsetValue")
@@ -13,6 +14,7 @@ onready var ZoomValueLabel = get_node("UI/TopContainer/ZoomValue")
onready var HexCoordValueLabel = get_node("UI/TopContainer/HexCoordValue")
onready var WorldCoordValueLabel = get_node("UI/TopContainer/WorldCoordValue")
onready var TileTypeValueLabel = get_node("UI/TopContainer/TileTypeValue")
+onready var SuccessMessage = get_node("UI/SuccessMessage")
onready var PlayerChar = get_node("PlayerChar")
onready var PlayerBoat = get_node("PlayerBoat")
onready var FPSValueLabel = get_node("UI/TopContainer/FPSValue")
@@ -25,6 +27,9 @@ onready var BirdyTimer = get_node("Birdy/Timer")
var Island = preload("Island.gd")
var SpringDamper = preload("res://SpringDamper.gd")
+var DigSiteSprite = preload("res://assets/digsite.svg")
+var DigSiteTreasureSprite = preload("res://assets/treasuredigsite.svg")
+
var hex_grid_bbox = [[0,0], [10,10]]
var hex_hover = Vector2.ZERO
@@ -61,7 +66,9 @@ func _ready():
# Set player starting position
PlayerChar.position = Globals.HexGrid.get_hex_center(Vector2(0,0))
-
+ PlayerChar.connect("dig_stopped", self, "on_dig_stopped")
+
+ self.connect("treasure_found", self, "on_treasure_found")
func _process(delta):
if is_editor_active():
@@ -119,6 +126,12 @@ func clear_islands():
for island in Islands.get_children():
Islands.remove_child(island)
island.queue_free()
+
+
+func clear_digsites():
+ for digsite in DigSites.get_children():
+ DigSites.remove_child(digsite)
+ digsite.queue_free()
func get_tile_type(world_coord: Vector2):
@@ -140,6 +153,14 @@ func add_island_at(file_name, offset_world: Vector2):
func is_editor_active():
return Editor == null or not Editor.is_active()
+
+func check_player_on_treasure():
+ if current_island == null:
+ return false
+
+ return current_island.is_point_on_treasure_site(Globals.HexToWorld(PlayerChar.cur_tile))
+
+
func check_island_location_valid(new_island):
var grid_origin_world_coord = Globals.HexToWorld(Vector2(0,0))
if new_island.get_tile_by_world_coord(grid_origin_world_coord) != null:
@@ -163,6 +184,9 @@ func place_treasure():
treasure_island.treasure_local_coords = grass_tiles[randi() % len(grass_tiles)]
+ if Globals.debug_nav:
+ treasure_island.highlight_treasure = true
+
treasure_island.update()
func render_treasure_map():
@@ -190,26 +214,43 @@ func render_treasure_map():
IslandMap.texture = IslandMapRenderer.get_texture()
-func generate():
+func reset():
PlayerChar.transform.origin = Vector2.ZERO
PlayerChar.position = Vector2.ZERO
PlayerChar.target = Vector2.ZERO
+ hex_line_path = []
+ player_navigation_path = []
+ player_path_plan_start = null
+ player_path_plan_end = null
+
+ current_island = null
treasure_island = null
+ clear_islands()
+ clear_digsites()
+
+ SuccessMessage.visible = false
+
+func generate():
+ reset()
+
var rng = RandomNumberGenerator.new()
rng.randomize()
-
- clear_islands()
+ randomize()
+
var radius = 800
- var num_islands = 10
- var island_index_offset = randi() % 10
+ var num_islands = 4
+
+ var island_files = []
+ for i in range (num_islands):
+ island_files.append("res://islands/pirate_game_island_" + str(i) + ".island")
+ island_files.shuffle()
for i in range (num_islands):
var island = Island.new()
- var island_index = (i + island_index_offset) % 10
- var file_name = "res://islands/pirate_game_island_" + str(island_index) + ".island"
+ var file_name = island_files[i]
island.load_island(file_name)
var rand_coord = Vector2(rng.randi_range(-radius, radius), rng.randi_range(-radius, radius))
@@ -234,7 +275,7 @@ func generate():
Islands.add_child(island)
num_islands = Islands.get_child_count()
- treasure_island = Islands.get_child(randi() % num_islands)
+ treasure_island = Islands.get_child(rng.randi() % num_islands)
place_treasure()
@@ -291,6 +332,7 @@ func update_current_island():
func on_enter_island(island):
print ("Entering island")
+ PlayerChar.on_enter_island()
current_island = island
anchor_tile = PlayerChar.prev_tile
landing_tile = PlayerChar.cur_tile
@@ -303,11 +345,31 @@ func on_enter_island(island):
func on_leave_island(island):
print ("Leaving island")
+ PlayerChar.on_leave_island()
island.is_active = false
island.landing_site_local_coord = null
island.update()
+func on_dig_stopped():
+ print ("Dig stopped!")
+ var dig_site = Sprite.new()
+ dig_site.transform.origin = Globals.HexToWorld(PlayerChar.cur_tile)
+
+ if check_player_on_treasure():
+ emit_signal("treasure_found")
+ on_treasure_found()
+ dig_site.texture = DigSiteTreasureSprite
+ else:
+ dig_site.texture = DigSiteSprite
+
+ DigSites.add_child(dig_site)
+
+
+func on_treasure_found():
+ SuccessMessage.visible = true
+
+
func check_player_near_anchor():
if current_island == null:
return false
@@ -315,6 +377,7 @@ func check_player_near_anchor():
var anchor_world = Globals.HexToWorld(anchor_tile)
return (PlayerChar.position - anchor_world).length() < Globals.hex_size
+
func update_navigation_target_ocean(start_world: Vector2, target_world: Vector2):
var start_coord = Globals.WorldToHex(start_world)
var goal_coord = Globals.WorldToHex(target_world)
@@ -326,12 +389,10 @@ func update_navigation_target_ocean(start_world: Vector2, target_world: Vector2)
var direct_path = Globals.WorldLineToHexTiles(start_world, target_world)
if get_tile_type(start_world) != null and current_island != null and len(direct_path) > 1:
- print ("type 0: ", get_tile_type(direct_path[0]))
- print ("type 1: ", get_tile_type(direct_path[1]))
- print ("on landing site: ", current_island.is_point_on_landing_site (start_world))
+# print ("on landing site: ", current_island.is_point_on_landing_site (start_world))
if current_island.is_point_on_landing_site (start_world):
if get_tile_type(direct_path[1]) == null:
- print ("starting from landing site")
+# print ("starting from landing site")
direct_path.pop_front()
start_coord = Globals.WorldToHex(direct_path.front())
else:
@@ -350,7 +411,7 @@ func update_navigation_target_ocean(start_world: Vector2, target_world: Vector2)
print ("Could not find path!")
return
- print ("Using ", Globals.WorldToHex(direct_path.back()), " instead of ", goal_coord, " as goal.")
+# print ("Using ", Globals.WorldToHex(direct_path.back()), " instead of ", goal_coord, " as goal.")
goal_coord = Globals.WorldToHex(direct_path.back())
island_landing_site_world = last_removed
@@ -375,12 +436,10 @@ func update_navigation_target_ocean(start_world: Vector2, target_world: Vector2)
func update_navigation_target_island(start_world: Vector2, target_world: Vector2):
- print ("Navigating Island")
var start_coord = Globals.WorldToHex(start_world)
var goal_coord = Globals.WorldToHex(target_world)
var path = Globals.IslandNavGrid.find_path(start_coord, goal_coord)
- print ("Path length: ", len(path))
for target in path.slice(0,-1):
var target_world_coord = Globals.HexToWorld(target.axial_coords)
var target_type = get_tile_type(target_world_coord)
@@ -396,7 +455,6 @@ func update_player_navigation_target(target_world: Vector2):
var start_timestamp = OS.get_system_time_msecs()
var player_near_anchor = check_player_near_anchor()
- print ("Player near anchor: ", player_near_anchor)
if current_island != null:
update_navigation_target_island(start_world, target_world)
@@ -408,7 +466,6 @@ func update_player_navigation_target(target_world: Vector2):
update_navigation_target_ocean(start_world, target_world)
var planning_duration_msec = OS.get_system_time_msecs() - start_timestamp
- print ("Planning took ", round(planning_duration_msec), "ms.")
update()
@@ -489,3 +546,8 @@ func _on_BirdyButton_pressed():
BirdyTimer.one_shot = true
BirdyTimer.start(birdy_duration)
+
+func _on_DigButton_pressed():
+ print ("dig pressed")
+ if PlayerChar.state == PlayerChar.State.Walking:
+ PlayerChar.on_dig_start()
diff --git a/scenes/pirate.gd b/scenes/pirate.gd
index 2a49921..4c6c2e2 100644
--- a/scenes/pirate.gd
+++ b/scenes/pirate.gd
@@ -2,13 +2,29 @@ extends KinematicBody2D
export (int) var speed = 200
+enum State {
+ Sailing,
+ Walking,
+ Digging
+}
+
+signal dig_stopped
+
+onready var Shovel = get_node("Shovel")
+onready var DigTimer = get_node("DigTimer")
+
var velocity = Vector2()
var target = Vector2()
var prev_tile = null # Hex coords of previous tile
var cur_tile = null # Hex coords of current tile
+var state = State.Sailing
func get_input():
velocity = Vector2()
+
+ if state == State.Digging:
+ return
+
if Input.is_action_pressed("walk_right"):
velocity.x += 1
if Input.is_action_pressed("walk_left"):
@@ -29,13 +45,30 @@ func _physics_process(_delta):
if tile != cur_tile:
prev_tile = cur_tile
cur_tile = tile
+
+ Shovel.visible = state == State.Digging
# Called when the node enters the scene tree for the first time.
func _ready():
position = Vector2(0,0)
+ DigTimer.connect("timeout", self, "on_dig_stop")
-# Called every frame. 'delta' is the elapsed time since the previous frame.
-#func _process(delta):
-# pass
+func on_enter_island():
+ state = State.Walking
+
+
+func on_leave_island():
+ state = State.Sailing
+
+
+func on_dig_start():
+ print ("Start digging")
+ state = State.Digging
+ DigTimer.start(1.0)
+
+
+func on_dig_stop():
+ state = State.Walking
+ emit_signal ("dig_stopped")