adding resource limits and archers
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user