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 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 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")