c22b21a537
Enhance stage.gd debug output in _on_topmenu_button_pressed function for better state tracking; comment out unnecessary print statements. Update owniverse.gd to introduce new state properties: batch_origins, distribution, and auto_resources; refactor evolute function for improved state management and batch processing. Revise state.gd to clean up debug print statements in add function for better readability and maintainability.
411 lines
13 KiB
GDScript
411 lines
13 KiB
GDScript
extends Control
|
|
|
|
const OWNIVERSE_ITEM = preload("uid://d3xjfxwe3w16v")
|
|
|
|
const SPEED_TEXTURE_NAME_TEMPLATE = "res://ui/topmenu/time&speed/time%s.png"
|
|
|
|
const PAGE_COUNT = 5
|
|
const PAGE_WIDTH = 1080
|
|
const DRAG_TOLERANCE = 360
|
|
const SWIPE_DURATION: float = 0.4
|
|
|
|
@onready var stage_page_scroller: ScrollContainer = $StageRows/PageScroller
|
|
|
|
@onready var item_pages: Array[Control] = [
|
|
$StageRows/PageScroller/HBoxContainer/ForcePage/Forces,
|
|
$StageRows/PageScroller/HBoxContainer/ResourcePage/HBoxContainer/Resources,
|
|
$StageRows/PageScroller/HBoxContainer/StarPage/Stars,
|
|
$StageRows/PageScroller/HBoxContainer/StructurePage/Structures,
|
|
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/Life,
|
|
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/LivingPlanet,
|
|
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ0,
|
|
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ1,
|
|
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ2,
|
|
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ3,
|
|
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ4
|
|
]
|
|
|
|
@onready var page_actions: Dictionary[int, OwniverseAction] = {
|
|
2: $StageRows/PageScroller/HBoxContainer/StarPage/Actions,
|
|
3: $StageRows/PageScroller/HBoxContainer/StructurePage/Actions,
|
|
}
|
|
|
|
@onready var g_item_descriptions: Array = [
|
|
$StageRows/PageScroller/HBoxContainer/ForcePage/Description,
|
|
$StageRows/PageScroller/HBoxContainer/ResourcePage/Description,
|
|
$StageRows/PageScroller/HBoxContainer/StarPage/Description,
|
|
$StageRows/PageScroller/HBoxContainer/StructurePage/Description,
|
|
$StageRows/PageScroller/HBoxContainer/LifePage/Description
|
|
]
|
|
|
|
@onready var date_time: Label = $StageRows/TopMenu/InfoPanel/DateTime
|
|
|
|
@onready var g_speed_icons: Array = [
|
|
$StageRows/TopMenu/InfoPanel/Speed/Speed1,
|
|
$StageRows/TopMenu/InfoPanel/Speed/Speed2,
|
|
$StageRows/TopMenu/InfoPanel/Speed/Speed3,
|
|
$StageRows/TopMenu/InfoPanel/Speed/Speed4,
|
|
$StageRows/TopMenu/InfoPanel/Speed/Speed5,
|
|
$StageRows/TopMenu/InfoPanel/Speed/Speed6,
|
|
$StageRows/TopMenu/InfoPanel/Speed/Speed7,
|
|
$StageRows/TopMenu/InfoPanel/Speed/Speed8
|
|
]
|
|
|
|
@onready var g_time_minus: TextureButton = $StageRows/TopMenu/TimeMinus
|
|
@onready var g_time_plus: TextureButton = $StageRows/TopMenu/TimePlus
|
|
|
|
|
|
var g_tween: Tween = null
|
|
var g_dragged_start: Vector2 = Vector2.ZERO
|
|
var g_scroll_start: int = 0
|
|
#var g_current_page: int = 0
|
|
|
|
var g_last_scroll_updated: int = 0
|
|
|
|
var f_check_swipe: bool = false
|
|
var g_swipe_time_delta: float = 0
|
|
|
|
var g_counters: Dictionary[String, Counter] = {
|
|
"swipe": Counter.new(),
|
|
}
|
|
|
|
var g_active_items: Dictionary = {}
|
|
|
|
var owniverse:Owniverse = Owniverse.new()
|
|
var owniverse_items: Dictionary[String, OwniverseItem] = {}
|
|
var locked_items: Array = []
|
|
|
|
|
|
func set_datetime(value: float):
|
|
date_time.text = str(snapped(value, 0.1))
|
|
|
|
#region Item manipulations: update and visibility
|
|
|
|
|
|
func set_owniverse_item_value() -> void:
|
|
for _item_id in owniverse_items:
|
|
owniverse_items[_item_id].set_label(owniverse.state.amount[_item_id])
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
func _unlock_items():
|
|
if locked_items.size() == 0: return
|
|
var _new_locked_items = []
|
|
for _item_id in locked_items:
|
|
#print(_item_id ' | ', _entity.unlock)
|
|
var _flag_to_unlock = true
|
|
for _elem in owniverse.entities[_item_id].unlock:
|
|
if owniverse.state.stats.total_amount[_elem] < owniverse.entities[_item_id].unlock[_elem]:
|
|
_flag_to_unlock = false
|
|
break
|
|
|
|
if _flag_to_unlock:
|
|
owniverse_items[_item_id].set_visible(true)
|
|
else:
|
|
_new_locked_items.append(_item_id)
|
|
locked_items = _new_locked_items
|
|
|
|
|
|
func _on_indicator_pressed(indicator_name: String, page: int = 0):
|
|
_set_description(indicator_name, page)
|
|
|
|
|
|
func _set_item_description(item: OwniverseItem) -> void:
|
|
var description: String = "[b]" \
|
|
+ Global.get_localized_item_description(item.item_name, "label") \
|
|
+"[/b]" \
|
|
+"\n" \
|
|
+ Global.get_localized_item_description(item.item_name, "description")
|
|
var desc_page = clamp(item.item_page, 0, 4)
|
|
g_item_descriptions[desc_page].text = description
|
|
|
|
|
|
func _set_description(item_name: String, page: int) -> void:
|
|
var description = Global.get_description(item_name + ".Name")
|
|
description += "\n"
|
|
description += Global.get_description(item_name + ".Description")
|
|
g_item_descriptions[page].text = description
|
|
|
|
|
|
func _control_page(item: OwniverseItem) -> void:
|
|
# TODO переписать это ↓
|
|
if !g_active_items.has(item.item_page):
|
|
g_active_items[item.item_page] = null
|
|
|
|
var current_item: OwniverseItem = g_active_items[item.item_page]
|
|
if current_item == item:
|
|
return
|
|
|
|
g_active_items[item.item_page] = item
|
|
|
|
if current_item != null and current_item.item_page == item.item_page:
|
|
current_item.set_selection(false)
|
|
|
|
item.set_selection(true)
|
|
|
|
# subpages
|
|
if item.item_sub_page != -1:
|
|
item_pages[item.item_sub_page].visible = true
|
|
|
|
if current_item == null \
|
|
or current_item.item_sub_page == -1 \
|
|
or current_item.item_sub_page == item.item_sub_page:
|
|
return
|
|
item_pages[current_item.item_sub_page].visible = false
|
|
|
|
|
|
func _init_owniverse_items() -> bool:
|
|
owniverse_items = {}
|
|
for item_id in Global.OwniverseItems:
|
|
var item_props: Dictionary = Global.OwniverseItems[item_id]
|
|
var item: OwniverseItem = OWNIVERSE_ITEM.instantiate()
|
|
if !item_props.has("page"):
|
|
printerr("Item `", item_id, "` has no `page` key.")
|
|
return false
|
|
var page: int = int(item_props.page)
|
|
item_pages[page].add_child(item)
|
|
item.init_button(item_props)
|
|
item.item_activated.connect(item_activated)
|
|
|
|
owniverse_items[item_id] = item
|
|
|
|
return false
|
|
|
|
|
|
func item_activated(item: OwniverseItem) -> void:
|
|
_control_page(item)
|
|
_set_item_description(item)
|
|
|
|
if item.item_id == "S" or item.item_id == "H":
|
|
var _value = owniverse.produce_hs(item.item_id, 100_000)
|
|
|
|
|
|
func _check_counters(delta: float) -> Array:
|
|
var actions: Array = []
|
|
for k in g_counters:
|
|
var cnt: Counter = g_counters[k]
|
|
if not cnt.is_active:
|
|
continue
|
|
|
|
cnt.value += delta
|
|
if cnt.value >= cnt.sec:
|
|
actions.append(k)
|
|
cnt.value = 0
|
|
cnt.is_active = false
|
|
|
|
return actions
|
|
|
|
|
|
#region Swipe and page
|
|
|
|
func _do_actions(actions: Array) -> void:
|
|
for action: String in actions:
|
|
match action:
|
|
"swipe":
|
|
_swipe_to_nearest_page()
|
|
|
|
|
|
func _swipe_to_nearest_page() -> void:
|
|
if stage_page_scroller.scroll_horizontal % PAGE_WIDTH == 0: return
|
|
|
|
var new_page: int = round(1.0 * stage_page_scroller.scroll_horizontal / PAGE_WIDTH)
|
|
|
|
if g_tween != null:
|
|
if g_tween.is_running():
|
|
return
|
|
|
|
g_tween = stage_page_scroller.get_tree().create_tween()
|
|
g_tween.tween_property(stage_page_scroller, "scroll_horizontal",
|
|
new_page * PAGE_WIDTH, SWIPE_DURATION).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT)
|
|
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event is InputEventScreenDrag:
|
|
stage_page_scroller.scroll_horizontal = clamp(
|
|
stage_page_scroller.scroll_horizontal - PAGE_COUNT * event.screen_relative.x,
|
|
0, PAGE_WIDTH * (PAGE_COUNT - 1))
|
|
g_counters.swipe.is_active = true
|
|
g_counters.swipe.value = 0
|
|
elif event is InputEventPanGesture:
|
|
g_counters.swipe.is_active = true
|
|
g_counters.swipe.value = 0
|
|
elif event is InputEventScreenTouch:
|
|
pass
|
|
|
|
|
|
func _set_active_page_actions() -> void:
|
|
for pa in page_actions:
|
|
if !g_active_items.has(pa): continue
|
|
|
|
var item_id: String = g_active_items[pa].item_id
|
|
var entity: OwniverseEntity = owniverse.entities[item_id]
|
|
|
|
#var amount = owniverse.get_available_to_produce(item_id)
|
|
|
|
#var amount = owniverse.get_available_to_produce(entity)
|
|
var amount = owniverse.calculate_max_producible(entity)
|
|
#print(item_id, " : ", amount)
|
|
page_actions[pa].set_actions(item_id, amount)
|
|
|
|
|
|
func _page_action_pressed(page_id: int, action_amount: float) -> void:
|
|
if !g_active_items.has(page_id):
|
|
return
|
|
|
|
var item_id: String = g_active_items[page_id].item_id
|
|
|
|
if action_amount > 0:
|
|
owniverse.produce(item_id, action_amount)
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
func _ready() -> void:
|
|
var inited_result = init_enitities()
|
|
locked_items = inited_result.locked_items
|
|
load_data()
|
|
_init_owniverse_items()
|
|
|
|
g_counters.swipe.sec = 0.2
|
|
|
|
for pa in page_actions:
|
|
page_actions[pa].action_pressed.connect(_page_action_pressed)
|
|
page_actions[pa].page_id = pa
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
|
|
owniverse.evolute(delta)
|
|
set_datetime(owniverse.state.time.year)
|
|
|
|
#owniverse.cycle(delta)
|
|
|
|
#owniverse.cycle_legacy(year_delta)
|
|
|
|
var actions = _check_counters(delta)
|
|
_do_actions(actions)
|
|
|
|
_set_active_page_actions()
|
|
|
|
|
|
func _change_speed(delta: int) -> void:
|
|
|
|
owniverse.speed = owniverse.speed + delta
|
|
|
|
var speed: int = owniverse.speed
|
|
var ind: int = 1
|
|
for icon in g_speed_icons:
|
|
if ind <= speed:
|
|
icon.visible = true
|
|
else:
|
|
icon.visible = false
|
|
ind += 1
|
|
if speed == 1:
|
|
g_time_minus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % "x")
|
|
g_time_plus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % "2")
|
|
elif speed == Global.SPEED_LIMIT:
|
|
g_time_minus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % str(Global.SPEED_LIMIT - 1))
|
|
g_time_plus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % "x")
|
|
else:
|
|
g_time_minus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % str(speed - 1))
|
|
g_time_plus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % str(speed + 1))
|
|
|
|
|
|
func _on_topmenu_button_pressed(ButtonName) -> void:
|
|
print("Debug → ")
|
|
#, owniverse.state)
|
|
for id in owniverse.state.batches:
|
|
var s = owniverse.state.batches[id].size()
|
|
if s != 0:
|
|
print(id, " → ", s)
|
|
#, owniverse.state.batches[id])
|
|
if id == 'HG':
|
|
print(owniverse.state.batches[id])
|
|
|
|
#var s: float = 1E15
|
|
#var z = 1.0
|
|
#for i in range(30):
|
|
#print(i, " | ", z, " | ", " | ", s - z)
|
|
#z *= 10
|
|
print("-------")
|
|
|
|
|
|
func _on_unlock_and_save_timeout() -> void:
|
|
save_data()
|
|
_unlock_items()
|
|
|
|
|
|
#region Init save load routines
|
|
|
|
|
|
func load_data() -> bool:
|
|
# Получаем версию приложения
|
|
var app_version = ProjectSettings.get_setting("application/config/version")
|
|
print("Версия приложения: ", app_version)
|
|
|
|
var game_data: Dictionary = SaveManager.load_data("owniverse", "qwerty")
|
|
if game_data == {}: return false
|
|
#if game_data.get('version', '0.0.1') != 'app_version': return false
|
|
if game_data.get('version', str(app_version)) != '0.1.0':
|
|
print(game_data.get('version', 7))
|
|
print('wrong load version')
|
|
return false
|
|
|
|
owniverse.state = game_data["state"]
|
|
|
|
for item in owniverse.state.amount:
|
|
owniverse.items_to_update[item] = owniverse.state.amount[item]
|
|
return true
|
|
|
|
|
|
func save_data() -> void:
|
|
var game_data: Dictionary = {}
|
|
game_data["state"] = owniverse.state
|
|
|
|
SaveManager.save_data("owniverse", "qwerty", game_data)
|
|
#print("saved ", game_data.version, "\n\n\n")
|
|
|
|
|
|
func init_enitities() -> Dictionary:
|
|
var _result := {
|
|
'locked_items': [],
|
|
}
|
|
for entity_id in Global.OwniverseEntities:
|
|
var entity = OwniverseEntity.new(Global.OwniverseEntities[entity_id])
|
|
owniverse.entities[entity_id] = entity
|
|
|
|
owniverse.state.stats.total_amount[entity_id] = 0
|
|
owniverse.state.amount[entity_id] = 0
|
|
if entity.lifespan > 0:
|
|
owniverse.state.batches[entity.id] = []
|
|
owniverse.add_entity_to_batch(entity_id, 0, 0)
|
|
if entity.group_as != "":
|
|
owniverse.state.amount[entity.group_as] = 0
|
|
|
|
owniverse.state.stats.total_amount[entity.group_as] = 0
|
|
|
|
if entity.unlock != {}:
|
|
owniverse.locked_entities.append(entity)
|
|
_result.locked_items.append(entity.id)
|
|
|
|
if entity.product_per_year_type != "":
|
|
owniverse.auto_production.append(entity)
|
|
|
|
# groups
|
|
if entity.group_as != "":
|
|
if !owniverse.entity_groups.has(entity.group_as):
|
|
owniverse.entity_groups[entity.group_as] = []
|
|
owniverse.entity_groups[entity.group_as].append(entity_id)
|
|
|
|
if entity.event_group != "":
|
|
if !owniverse.entity_event_groups.has(entity.event_group):
|
|
owniverse.entity_event_groups[entity.event_group] = []
|
|
owniverse.entity_event_groups[entity.event_group].append(entity_id)
|
|
|
|
return _result
|
|
|
|
#endregion
|