adding resource limits and archers

This commit is contained in:
hz
2026-05-19 05:11:57 -05:00
parent a5ecb7f585
commit e78eb24543
12 changed files with 241 additions and 39 deletions
@@ -31,6 +31,7 @@ var resource_text := "Gold: --\nWood: --\nOre: --"
var gold_tick_anchor_unix := 0.0
var gold_tick_seconds := 60.0
var train_button: Button
var train_archer_button: Button
var unit_label: Label
var training_box: VBoxContainer
var training_label: Label
@@ -47,6 +48,7 @@ var building_started_unix := 0.0
var building_completes_unix := 0.0
var building_completion_refresh_requested := false
var active_building_label := "Build"
var active_training_label := "Training"
var claim_button: Button
var build_log_camp_button: Button
var build_mine_button: Button
@@ -57,8 +59,10 @@ var selected_can_claim := false
var selected_can_build_log_camp := false
var selected_can_build_mine := false
var selected_can_build_barracks := false
var selected_can_train_archer := false
var selected_is_home := false
var completed_scout_count := 0
var completed_archer_count := 0
var refresh_prompt_active := false
var refresh_request_active := false
@@ -202,6 +206,11 @@ func _build_ui() -> void:
train_button.pressed.connect(_train_scout)
action_buttons.add_child(train_button)
train_archer_button = _small_button("Archer 100g 100w")
train_archer_button.visible = false
train_archer_button.pressed.connect(_train_archer)
action_buttons.add_child(train_archer_button)
claim_button = _small_button("Claim 1 Scout")
claim_button.visible = false
claim_button.pressed.connect(_claim_selected_tile)
@@ -223,8 +232,8 @@ func _build_ui() -> void:
action_buttons.add_child(build_barracks_button)
unit_label = Label.new()
unit_label.text = "Scouts: -- | Queue: --"
unit_label.custom_minimum_size = Vector2(126, 0)
unit_label.text = "Scouts: -- | Archers: -- | Queue: --"
unit_label.custom_minimum_size = Vector2(180, 0)
unit_label.add_theme_font_size_override("font_size", 14)
unit_label.add_theme_color_override("font_color", Color(0.72, 0.82, 0.78))
status_row.add_child(unit_label)
@@ -408,6 +417,7 @@ func _on_tile_selected(q: int, r: int, terrain: String) -> void:
selected_can_build_log_camp = _can_build_log_camp_on_selected_tile()
selected_can_build_mine = _can_build_mine_on_selected_tile()
selected_can_build_barracks = _can_build_barracks_on_selected_tile()
selected_can_train_archer = _selected_tile_has_built_barracks()
_update_action_buttons()
if coordinate_label:
coordinate_label.text = "Selected q:%d r:%d | %s territory" % [q, r, terrain]
@@ -449,6 +459,9 @@ func _update_action_buttons() -> void:
if train_button:
train_button.visible = selected_is_home
train_button.disabled = false
if train_archer_button:
train_archer_button.visible = selected_can_train_archer
train_archer_button.disabled = false
if claim_button:
claim_button.visible = _can_claim_selected_tile()
claim_button.disabled = false
@@ -477,6 +490,21 @@ func _selected_tile_is_home() -> bool:
return owner_username == username and kind == "Home"
func _selected_tile_has_built_barracks() -> bool:
if not grid_view:
return false
var location: Dictionary = grid_view.get_visible_location(selected_q, selected_r)
if location.is_empty():
return false
var username: String = str(session.get("username", ""))
var owner_username: String = str(location.get("ownerUsername", ""))
var building_type: String = _nullable_string(location.get("buildingType", ""))
var building_status: String = _nullable_string(location.get("buildingStatus", ""))
return owner_username == username and building_type == "Barracks" and (building_status == "Built" or building_status.is_empty())
func _session_name() -> String:
if not session.is_empty():
var session_username: String = str(session.get("username", "Signed in"))
@@ -720,11 +748,24 @@ func _on_resources_request_completed(result: int, response_code: int, _headers:
var resources: Dictionary = parsed
var gold: int = int(resources.get("gold", 0))
var gold_per_minute: int = int(resources.get("goldPerMinute", 0))
var gold_capacity: int = int(resources.get("goldCapacity", 500))
var wood: int = int(resources.get("wood", 0))
var wood_per_minute: int = int(resources.get("woodPerMinute", 0))
var wood_capacity: int = int(resources.get("woodCapacity", 100))
var ore: int = int(resources.get("ore", 0))
var ore_per_minute: int = int(resources.get("orePerMinute", 0))
resource_text = "Gold: %d (+%d/min)\nWood: %d (+%d/min)\nOre: %d (+%d/min)" % [gold, gold_per_minute, wood, wood_per_minute, ore, ore_per_minute]
var ore_capacity: int = int(resources.get("oreCapacity", 100))
resource_text = "Gold: %d/%d (+%d/min)\nWood: %d/%d (+%d/min)\nOre: %d/%d (+%d/min)" % [
gold,
gold_capacity,
gold_per_minute,
wood,
wood_capacity,
wood_per_minute,
ore,
ore_capacity,
ore_per_minute
]
gold_label.text = resource_text
var anchor_text: String = str(resources.get("lastGoldGeneratedAtUtc", ""))
@@ -737,7 +778,7 @@ func _on_resources_request_completed(result: int, response_code: int, _headers:
func _load_units() -> void:
var access_token: String = str(session.get("accessToken", ""))
if access_token.is_empty():
unit_label.text = "Scouts: --"
unit_label.text = "Scouts: -- | Archers: -- | Queue: --"
return
if units_request.get_http_client_status() != HTTPClient.STATUS_DISCONNECTED:
@@ -756,12 +797,12 @@ func _load_units() -> void:
func _on_units_request_completed(result: int, response_code: int, _headers: PackedStringArray, body: PackedByteArray) -> void:
if result != HTTPRequest.RESULT_SUCCESS or response_code < 200 or response_code >= 300:
unit_label.text = "Scouts: ?"
unit_label.text = "Scouts: ? | Archers: ? | Queue: ?"
return
var parsed = JSON.parse_string(body.get_string_from_utf8())
if typeof(parsed) != TYPE_DICTIONARY:
unit_label.text = "Scouts: ?"
unit_label.text = "Scouts: ? | Archers: ? | Queue: ?"
return
var units: Dictionary = parsed
@@ -771,12 +812,14 @@ func _on_units_request_completed(result: int, response_code: int, _headers: Pack
training = raw_training
completed_scout_count = int(units.get("completedScouts", 0))
unit_label.text = "Scouts: %d | Queue: %d" % [completed_scout_count, training.size()]
completed_archer_count = int(units.get("completedArchers", 0))
unit_label.text = "Scouts: %d | Archers: %d | Queue: %d" % [completed_scout_count, completed_archer_count, training.size()]
_update_action_buttons()
if training.is_empty():
training_started_unix = 0.0
training_completes_unix = 0.0
active_training_label = "Training"
training_completion_refresh_requested = false
_update_training_bar()
return
@@ -785,6 +828,7 @@ func _on_units_request_completed(result: int, response_code: int, _headers: Pack
return
var active_training: Dictionary = training[0]
active_training_label = _unit_display_name(str(active_training.get("unitType", "Training")))
training_started_unix = _parse_utc_timestamp(str(active_training.get("startedAtUtc", "")))
training_completes_unix = _parse_utc_timestamp(str(active_training.get("completesAtUtc", "")))
training_completion_refresh_requested = false
@@ -792,16 +836,31 @@ func _on_units_request_completed(result: int, response_code: int, _headers: Pack
func _train_scout() -> void:
_request_unit_training("Scout")
func _train_archer() -> void:
if not selected_can_train_archer:
coordinate_label.text = "Select a completed Barracks to train Archers."
return
_request_unit_training("Archer")
func _request_unit_training(unit_type: String) -> void:
var access_token: String = str(session.get("accessToken", ""))
if access_token.is_empty():
coordinate_label.text = "No auth token available. Scout training was not started."
coordinate_label.text = "No auth token available. %s training was not started." % unit_type
return
if train_unit_request.get_http_client_status() != HTTPClient.STATUS_DISCONNECTED:
return
train_button.disabled = true
coordinate_label.text = "Starting scout training..."
if unit_type == "Archer":
train_archer_button.disabled = true
else:
train_button.disabled = true
coordinate_label.text = "Starting %s training..." % unit_type
var error: int = train_unit_request.request(
LOCATIONS_BASE_URL + "/api/units/train",
PackedStringArray([
@@ -809,32 +868,33 @@ func _train_scout() -> void:
"Authorization: Bearer %s" % access_token
]),
HTTPClient.METHOD_POST,
JSON.stringify({ "unitType": "Scout" })
JSON.stringify({ "unitType": unit_type })
)
if error != OK:
train_button.disabled = false
_update_action_buttons()
coordinate_label.text = "Could not contact the unit training service."
func _on_train_unit_request_completed(result: int, response_code: int, _headers: PackedStringArray, body: PackedByteArray) -> void:
train_button.disabled = false
_update_action_buttons()
var text: String = body.get_string_from_utf8()
if result != HTTPRequest.RESULT_SUCCESS:
coordinate_label.text = "Scout training request failed."
coordinate_label.text = "Unit training request failed."
return
if response_code < 200 or response_code >= 300:
coordinate_label.text = "Scout training failed: %s" % text
coordinate_label.text = "Unit training failed: %s" % text
_refresh_player_state()
return
var parsed = JSON.parse_string(text)
if typeof(parsed) == TYPE_DICTIONARY:
var training: Dictionary = parsed
active_training_label = _unit_display_name(str(training.get("unitType", "Training")))
training_started_unix = _parse_utc_timestamp(str(training.get("startedAtUtc", "")))
training_completes_unix = _parse_utc_timestamp(str(training.get("completesAtUtc", "")))
training_completion_refresh_requested = false
coordinate_label.text = "Scout training started. Completion takes 1 minute."
coordinate_label.text = "%s training started. Completion takes 1 minute." % active_training_label
_refresh_player_state()
@@ -1018,12 +1078,12 @@ func _update_training_bar() -> void:
training_bar.value = elapsed / duration
if remaining <= 0:
training_label.text = "Training: ready"
training_label.text = "%s: ready" % active_training_label
if not training_completion_refresh_requested:
training_completion_refresh_requested = true
_load_units()
else:
training_label.text = "Training: %ds" % remaining
training_label.text = "%s: %ds" % [active_training_label, remaining]
_update_progress_panel_visibility()
@@ -1108,6 +1168,16 @@ func _building_display_name(building_type: String) -> String:
return "Build"
func _unit_display_name(unit_type: String) -> String:
match unit_type:
"Scout":
return "Scout"
"Archer":
return "Archer"
_:
return "Training"
func _parse_utc_timestamp(timestamp: String) -> float:
if timestamp.is_empty():
return 0.0