458 lines
22 KiB
GDScript
458 lines
22 KiB
GDScript
class_name SignPanel
|
|
extends PanelModule
|
|
|
|
# 每日签到面板:
|
|
# - 负责一周签到路径、累计宝箱、今日签到和补签。
|
|
# - 签到记录从后端读取,按钮状态由 signed_days/continue_count 推导,不硬编码 UI 状态。
|
|
# - 成功领取后刷新接口数据并发放奖励,保证本地显示和后端一致。
|
|
var _pay_bg_path := ""
|
|
var _remedy_item_id := 103008
|
|
var _rows: Array[Dictionary] = []
|
|
var _signed_days: Array[int] = []
|
|
var _claimed_reward_days: Array[int] = []
|
|
var _continue_count := 0
|
|
var _panel: Control
|
|
var _sign_reward_popup: Control
|
|
|
|
const SIGN_PROGRESS_MAX_WIDTH := 383.0
|
|
const SIGN_PROGRESS_SIZE := Vector2(383.0, 25.0)
|
|
const SIGN_PROGRESS_BG_SIZE := Vector2(387.0, 29.0)
|
|
const SIGN_REWARD_DAYS := [3, 5, 7]
|
|
const SIGN_LINE_MASK_RECTS := [
|
|
Rect2(-3.0, -2.0, 94.0, 138.0),
|
|
Rect2(124.0, 8.0, 116.0, 104.0),
|
|
Rect2(234.0, 8.0, 116.0, 104.0),
|
|
Rect2(364.0, 8.0, 116.0, 104.0),
|
|
Rect2(324.0, 148.0, 116.0, 104.0),
|
|
Rect2(184.0, 138.0, 116.0, 104.0),
|
|
Rect2(-1.0, 153.0, 151.0, 104.0)
|
|
]
|
|
|
|
|
|
func setup(options: Dictionary) -> void:
|
|
super.setup(options)
|
|
_pay_bg_path = str(options.get("pay_bg_path", _pay_bg_path))
|
|
_remedy_item_id = int(options.get("remedy_item_id", _remedy_item_id))
|
|
|
|
|
|
func open() -> void:
|
|
_close_modal(false)
|
|
await _refresh_store_house()
|
|
_panel = _ui.create_modal_root("SignPanel")
|
|
var panel_origin := Vector2(4.0, 146.0)
|
|
var group_offset := panel_origin + Vector2(0.0, 60.0)
|
|
_ui.add_scale9_patch(_panel, "PanelBg", _texture_provider.common("c_panel"), Vector2(19.0, 146.0), Vector2(602.0, 663.0), Rect2(122.0, 179.0, 5.0, 4.0))
|
|
_ui.add_texture(_panel, "PanelIcon", _texture_provider.frame(_texture_provider.atlas_path("sign"), "panel_icon_sign_png"), group_offset + Vector2(172.0, -7.0), Vector2(80.0, 65.0), TextureRect.STRETCH_KEEP_ASPECT_CENTERED)
|
|
_ui.add_texture(_panel, "PanelTitle", _texture_provider.frame(_texture_provider.atlas_path("sign"), "panel_title_sign_png"), group_offset + Vector2(252.0, -17.0), Vector2(140.0, 82.0), TextureRect.STRETCH_KEEP_ASPECT_CENTERED)
|
|
_ui.add_scale9_patch(_panel, "PayBg", _texture_provider.standalone(_pay_bg_path), group_offset + Vector2(59.0, 76.0), Vector2(522.0, 547.0), Rect2(65.0, 203.0, 392.0, 9.0))
|
|
_add_sign_progress_bar(_panel, "Progress", group_offset + Vector2(126.5, 200.0))
|
|
_ui.add_texture(_panel, "RoleDecor", _texture_provider.standalone("res://assets/egret/assets/game/createrole/role_zhuangshi.png"), group_offset + Vector2(40.0, 586.0), Vector2(549.0, 77.0))
|
|
_ui.add_texture(_panel, "DecorLeft", _texture_provider.standalone("res://assets/egret/assets/game/pay/pay_zhuangshi.png"), group_offset + Vector2(4.0, 57.0), Vector2(167.0, 269.0))
|
|
var decor_right: TextureRect = _ui.add_texture(_panel, "DecorRight", _texture_provider.standalone("res://assets/egret/assets/game/pay/pay_zhuangshi.png"), group_offset + Vector2(466.0, 57.0), Vector2(167.0, 269.0))
|
|
decor_right.flip_h = true
|
|
_ui.add_texture(_panel, "LineClose", _texture_provider.standalone("res://assets/egret/assets/game/sign/sign_line_close.png"), group_offset + Vector2(96.0, 268.0), Vector2(453.0, 238.0), TextureRect.STRETCH_KEEP_ASPECT_CENTERED)
|
|
var line_segments := Control.new()
|
|
line_segments.name = "LineOpenSegments"
|
|
line_segments.position = Vector2.ZERO
|
|
line_segments.size = _panel_screen_size
|
|
line_segments.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
_panel.add_child(line_segments)
|
|
_ui.add_panel_label(_panel, "WeekTextA", "本周已累计签到", group_offset + Vector2(139.0, 80.0), Vector2(170.0, 30.0), 20, Color.html("#fffbf2"), 2, Color.html("#724f2e"), HORIZONTAL_ALIGNMENT_LEFT)
|
|
_ui.add_scale9_patch(_panel, "DayBg", _texture_provider.frame(_texture_provider.atlas_path("sign"), "inp_day_bg_png"), group_offset + Vector2(319.0, 77.0), Vector2(85.0, 25.0), Rect2(14.0, 12.0, 2.0, 1.0))
|
|
_ui.add_panel_label(_panel, "SignedDayNum", "0", group_offset + Vector2(328.0, 72.0), Vector2(65.0, 35.0), 30, Color.html("#fff500"), 2, Color.html("#724f2e"))
|
|
_ui.add_panel_label(_panel, "WeekTextB", "天", group_offset + Vector2(405.0, 80.0), Vector2(32.0, 30.0), 20, Color.html("#fffbf2"), 2, Color.html("#724f2e"), HORIZONTAL_ALIGNMENT_LEFT)
|
|
|
|
var reward_box_x := [268.5, 356.5, 448.0]
|
|
var reward_box_y := [124.0, 122.0, 129.0]
|
|
var reward_box_days := [3, 5, 7]
|
|
for index in range(3):
|
|
var x := float(reward_box_x[index])
|
|
var box_key := "sign_box0_png" if index == 0 else ("sign_box1_png" if index == 1 else "sign_box2_png")
|
|
var box_size := Vector2(88.0, 89.0) if index == 0 else (Vector2(95.0, 91.0) if index == 1 else Vector2(95.0, 84.0))
|
|
_ui.add_texture_button(_panel, "RewardBox%s" % index, _texture_provider.frame(_texture_provider.atlas_path("sign"), box_key), group_offset + Vector2(x, float(reward_box_y[index])), box_size, "", Callable(self, "_open_sign_reward_popup"), 1)
|
|
_ui.add_panel_label(_panel, "RewardBoxLabel%s" % index, "%s天" % int(reward_box_days[index]), group_offset + Vector2(285.0 + 96.0 * index, 226.0), Vector2(54.0, 28.0), 20, Color.html("#fffbf2"), 2, Color.html("#724f2e"))
|
|
|
|
var positions := [
|
|
Vector2(40.0, 315.0), Vector2(115.0, 222.0), Vector2(261.0, 255.0), Vector2(379.0, 225.0),
|
|
Vector2(460.0, 345.0), Vector2(330.0, 385.0), Vector2(200.0, 395.0)
|
|
]
|
|
var card_bg_positions := [
|
|
Vector2(39.0, 11.0), Vector2(39.0, 11.0), Vector2(19.0, 11.0), Vector2(7.0, 35.0),
|
|
Vector2(19.0, 9.0), Vector2(19.0, 9.0), Vector2(-1.0, 19.0)
|
|
]
|
|
var day_positions := [
|
|
Vector2(61.0, 30.0), Vector2(64.0, 26.0), Vector2(46.0, 21.0), Vector2(37.0, 32.0),
|
|
Vector2(54.0, 24.0), Vector2(50.0, 22.0), Vector2(30.0, 24.0)
|
|
]
|
|
var rotations := [
|
|
20.0, 10.0, 0.0, -25.0, 8.0, 5.0, -8.0
|
|
]
|
|
for index in range(7):
|
|
var day := index + 1
|
|
var card := Control.new()
|
|
card.name = "SignCard%s" % day
|
|
card.position = group_offset + positions[index]
|
|
card.size = Vector2(125.0, 152.0)
|
|
card.set_meta("day", day)
|
|
_panel.add_child(card)
|
|
var card_bg: TextureRect = _ui.add_texture(card, "CardBg", _texture_provider.frame(_texture_provider.atlas_path("sign"), "sign_card_png"), card_bg_positions[index], Vector2(92.0, 114.0))
|
|
card_bg.rotation_degrees = float(rotations[index])
|
|
var day_img: TextureRect = _ui.add_texture(card, "Day", _texture_provider.frame(_texture_provider.atlas_path("sign"), "sign_day%s_png" % day), day_positions[index], Vector2(42.0, 16.0), TextureRect.STRETCH_KEEP_ASPECT_CENTERED)
|
|
day_img.rotation_degrees = float(rotations[index])
|
|
_ui.add_texture(card, "Icon", _texture_provider.common("item_bg"), Vector2(22.0, 42.0), Vector2(64.0, 64.0))
|
|
_ui.add_panel_label(card, "Num", "x0", Vector2(58.0, 101.0), Vector2(62.0, 28.0), 24, Color.html("#b36011"), 2, Color.html("#fcd394"), HORIZONTAL_ALIGNMENT_LEFT)
|
|
_ui.add_texture(card, "Get", _texture_provider.frame(_texture_provider.atlas_path("sign"), "sign_get_png"), Vector2(30.0, 88.0), Vector2(41.0, 35.0))
|
|
var sign_button: Control = _ui.add_texture_button(_panel, "SignButton", _texture_provider.frame(_texture_provider.atlas_path("sign"), "sign_getbutton_png"), panel_origin + Vector2(180.0, 595.0), Vector2(160.0, 57.0), "签到", Callable(self, "_sign_today"), 28)
|
|
var remedy_button: Control = _ui.add_texture_button(_panel, "RemedyButton", _texture_provider.frame(_texture_provider.atlas_path("sign"), "sign_btn_wood_png"), Vector2(357.0, 741.0), Vector2(121.0, 49.0), "补签", Callable(self, "_remedy_sign"), 24)
|
|
_style_label(sign_button.get_node("Label") as Label, 28, Color.WHITE, 2, Color.html("#643591"))
|
|
_style_label(remedy_button.get_node("Label") as Label, 24, Color.WHITE, 2, Color.html("#7d1c1c"))
|
|
_ui.add_panel_label(_panel, "SignCardNum", "", Vector2(326.0, 797.0), Vector2(185.0, 28.0), 18, Color.WHITE, 2, Color.html("#724f2e"))
|
|
_ui.add_texture_button(_panel, "PanelClose", _texture_provider.common("c_btn1"), Vector2(220.0, 813.0), Vector2(200.0, 70.0), "离开", Callable(self, "_close_modal").bind(true), 36)
|
|
_open_modal(_panel)
|
|
await render()
|
|
|
|
|
|
func render() -> void:
|
|
var panel := _panel
|
|
if not _is_current_node(panel, _panel):
|
|
return
|
|
var result: Dictionary = await _activity_api.fetch_sign_list(_token())
|
|
if not _is_current_node(panel, _panel):
|
|
return
|
|
if not result.get("ok", false):
|
|
_show_toast(_response_status_text(result, "签到读取失败"))
|
|
_rows = _game_config.get_sign_config()
|
|
_signed_days.clear()
|
|
_claimed_reward_days.clear()
|
|
_continue_count = 0
|
|
var data = _response_data(result, {})
|
|
if data is Dictionary:
|
|
for row in data.get("list", []):
|
|
if row is Dictionary:
|
|
_signed_days.append(_weekday_for_unix(int(row.get("sign_time", 0))))
|
|
var continue_rows = data.get("continue_list", [])
|
|
if continue_rows is Array:
|
|
_continue_count = continue_rows.size()
|
|
for row in continue_rows:
|
|
if row is Dictionary:
|
|
var reward_day := int(row.get("count", 0))
|
|
if reward_day > 0 and not _claimed_reward_days.has(reward_day):
|
|
_claimed_reward_days.append(reward_day)
|
|
for day in range(1, 8):
|
|
var card := panel.get_node_or_null("SignCard%s" % day) as Control
|
|
var sign_config := _find_config_by_id(_rows, day)
|
|
if card == null or sign_config.is_empty():
|
|
continue
|
|
var reward_costs := _parse_cost_string(str(sign_config.get("days_id", "")))
|
|
var first_reward := reward_costs[0] if not reward_costs.is_empty() else {"item_id": 105002, "count": 0}
|
|
var icon := card.get_node_or_null("Icon") as TextureRect
|
|
if icon != null:
|
|
icon.texture = _get_item_icon_texture(_game_config.get_item_icon_id(int(first_reward.get("item_id", 0))))
|
|
var num_label := card.get_node_or_null("Num") as Label
|
|
if num_label != null:
|
|
num_label.text = "x%s" % int(first_reward.get("count", 0))
|
|
var get_img := card.get_node_or_null("Get") as TextureRect
|
|
if get_img != null:
|
|
get_img.visible = _signed_days.has(day)
|
|
var signed_count := _running_count()
|
|
_update_progress_bar(panel, "Progress", signed_count)
|
|
_update_line_segments(panel)
|
|
_update_reward_boxes(panel, signed_count)
|
|
var day_label := panel.get_node_or_null("SignedDayNum") as Label
|
|
if day_label != null:
|
|
day_label.text = str(signed_count)
|
|
var card_count := _owned_amount(_remedy_item_id)
|
|
var card_label := panel.get_node_or_null("SignCardNum") as Label
|
|
if card_label != null:
|
|
card_label.text = I18nScript.t("剩余补签卡%s张" % card_count)
|
|
var can_sign := not _signed_days.has(_today_weekday())
|
|
_set_texture_button_enabled(panel.get_node_or_null("SignButton") as Control, can_sign, _texture_provider.frame(_texture_provider.atlas_path("sign"), "sign_getbutton_png"), _texture_provider.frame(_texture_provider.atlas_path("sign"), "sign_getbutton_d_png"))
|
|
|
|
|
|
func _sign_today() -> void:
|
|
if _is_busy():
|
|
return
|
|
if _signed_days.has(_today_weekday()):
|
|
_show_toast("今日已签到")
|
|
return
|
|
_set_busy(true)
|
|
var result: Dictionary = await _activity_api.sign_today(_token())
|
|
_set_busy(false)
|
|
if not result.get("ok", false):
|
|
_show_toast(_response_status_text(result, "签到失败"))
|
|
return
|
|
var config := _find_config_by_id(_game_config.get_sign_config(), _today_weekday())
|
|
var reward := str(config.get("days_id", ""))
|
|
_add_reward_items(reward)
|
|
_show_toast("签到成功")
|
|
await _refresh_store_house()
|
|
await render()
|
|
_update_sign_reward_popup()
|
|
|
|
|
|
func _remedy_sign() -> void:
|
|
if _is_busy():
|
|
return
|
|
var day := _remedy_day()
|
|
if day <= 0:
|
|
_show_toast("当前不能补签")
|
|
return
|
|
if _owned_amount(_remedy_item_id) <= 0:
|
|
_show_toast("补签卡不足")
|
|
return
|
|
_set_busy(true)
|
|
var result: Dictionary = await _activity_api.remedy_sign(_token())
|
|
_set_busy(false)
|
|
if not result.get("ok", false):
|
|
_show_toast(_response_status_text(result, "补签失败"))
|
|
return
|
|
var config := _find_config_by_id(_game_config.get_sign_config(), day)
|
|
_add_reward_items(str(config.get("days_id", "")))
|
|
_decrease_warehouse_item(_remedy_item_id, 1)
|
|
_show_toast("补签成功")
|
|
await _refresh_store_house()
|
|
await render()
|
|
_update_sign_reward_popup()
|
|
|
|
|
|
func _open_sign_reward_popup() -> void:
|
|
if not _is_current_node(_panel, _panel):
|
|
return
|
|
_close_sign_reward_popup()
|
|
_sign_reward_popup = Control.new()
|
|
_sign_reward_popup.name = "SignRewardPopup"
|
|
_sign_reward_popup.position = Vector2.ZERO
|
|
_sign_reward_popup.size = _panel_screen_size
|
|
_sign_reward_popup.mouse_filter = Control.MOUSE_FILTER_STOP
|
|
_sign_reward_popup.z_index = 80
|
|
_panel.add_child(_sign_reward_popup)
|
|
|
|
var mask := Button.new()
|
|
mask.name = "Mask"
|
|
mask.position = Vector2.ZERO
|
|
mask.size = _panel_screen_size
|
|
mask.focus_mode = Control.FOCUS_NONE
|
|
_apply_empty_button_style(mask)
|
|
mask.pressed.connect(Callable(self, "_close_sign_reward_popup"))
|
|
_sign_reward_popup.add_child(mask)
|
|
|
|
_ui.add_scale9_patch(_sign_reward_popup, "PopupBg", _texture_provider.common("c_panel2"), Vector2(41.0, 226.0), Vector2(559.0, 519.0), Rect2(117.0, 55.0, 7.0, 9.0))
|
|
_add_sign_progress_bar(_sign_reward_popup, "PopupProgress", Vector2(126.5, 370.0))
|
|
_ui.add_texture(_sign_reward_popup, "PopupRewardBg", _texture_provider.frame(_texture_provider.atlas_path("sign"), "sign_dikuang_png"), Vector2(92.0, 434.0), Vector2(456.0, 227.0))
|
|
_ui.add_texture(_sign_reward_popup, "PopupTitle", _texture_provider.frame(_texture_provider.atlas_path("sign"), "panel_title_sign_png"), Vector2(237.0, 194.0), Vector2(140.0, 82.0), TextureRect.STRETCH_KEEP_ASPECT_CENTERED)
|
|
_ui.add_scale9_patch(_sign_reward_popup, "PopupDayBg", _texture_provider.frame(_texture_provider.atlas_path("sign"), "inp_day_bg_png"), Vector2(319.0, 278.0), Vector2(85.0, 25.0), Rect2(14.0, 12.0, 2.0, 1.0))
|
|
_ui.add_panel_label(_sign_reward_popup, "PopupWeekTextA", "本周已累计签到", Vector2(172.0, 282.0), Vector2(170.0, 30.0), 20, Color.html("#fffbf2"), 2, Color.html("#724f2e"), HORIZONTAL_ALIGNMENT_LEFT)
|
|
_ui.add_panel_label(_sign_reward_popup, "PopupSignedDayNum", "0", Vector2(328.0, 273.0), Vector2(65.0, 35.0), 30, Color.html("#fff500"), 2, Color.html("#724f2e"))
|
|
_ui.add_panel_label(_sign_reward_popup, "PopupWeekTextB", "天", Vector2(405.0, 280.0), Vector2(32.0, 30.0), 20, Color.html("#fffbf2"), 2, Color.html("#724f2e"), HORIZONTAL_ALIGNMENT_LEFT)
|
|
|
|
var popup_box_x := [184.0, 318.0, 463.0]
|
|
var popup_box_y := [304.0, 304.0, 304.0]
|
|
for index in range(3):
|
|
var box_key := "sign_box0_png" if index == 0 else ("sign_box1_png" if index == 1 else "sign_box2_png")
|
|
var box_size := Vector2(88.0, 89.0) if index == 0 else (Vector2(95.0, 91.0) if index == 1 else Vector2(95.0, 84.0))
|
|
_ui.add_texture(_sign_reward_popup, "PopupRewardBox%s" % index, _texture_provider.frame(_texture_provider.atlas_path("sign"), box_key), Vector2(float(popup_box_x[index]), float(popup_box_y[index])), box_size, TextureRect.STRETCH_KEEP_ASPECT_CENTERED)
|
|
_ui.add_panel_label(_sign_reward_popup, "PopupRewardBoxLabel%s" % index, "%s天" % int(SIGN_REWARD_DAYS[index]), Vector2(292.0 + 94.0 * index, 400.0), Vector2(54.0, 28.0), 20, Color.html("#fffbf2"), 2, Color.html("#724f2e"))
|
|
|
|
var item_positions := [Vector2(126.0, 469.0), Vector2(275.0, 469.0), Vector2(417.0, 470.0)]
|
|
for index in range(3):
|
|
var item := Control.new()
|
|
item.name = "PopupRewardItem%s" % index
|
|
item.position = item_positions[index]
|
|
item.size = Vector2(90.0, 90.0)
|
|
item.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
_sign_reward_popup.add_child(item)
|
|
_ui.add_texture(item, "Bg", _texture_provider.common("item_bg"), Vector2.ZERO, Vector2(90.0, 90.0))
|
|
_ui.add_texture(item, "Icon", _texture_provider.common("item_bg"), Vector2(12.0, 12.0), Vector2(66.0, 66.0), TextureRect.STRETCH_KEEP_ASPECT_CENTERED)
|
|
_ui.add_panel_label(item, "Num", "", Vector2(0.0, 65.0), Vector2(90.0, 22.0), 22, Color.html("#7d1c1c"), 0, Color.TRANSPARENT, HORIZONTAL_ALIGNMENT_RIGHT)
|
|
|
|
var get_button: Control = _ui.add_texture_button(_sign_reward_popup, "PopupClaim", _texture_provider.frame(_texture_provider.atlas_path("sign"), "sign_getbutton_png"), Vector2(240.0, 569.0), Vector2(160.0, 57.0), "领取", Callable(self, "_claim_continue_reward"), 28)
|
|
_style_label(get_button.get_node("Label") as Label, 28, Color.WHITE, 2, Color.html("#643591"))
|
|
var close_button: Control = _ui.add_texture_button(_sign_reward_popup, "PopupClose", _texture_provider.common("c_btn3"), Vector2(237.0, 679.0), Vector2(166.0, 58.0), "离开", Callable(self, "_close_sign_reward_popup"), 30)
|
|
_style_label(close_button.get_node("Label") as Label, 30, Color.WHITE, 2, Color.html("#7d1c1c"))
|
|
_update_sign_reward_popup()
|
|
|
|
|
|
func _close_sign_reward_popup() -> void:
|
|
if _sign_reward_popup == null or not is_instance_valid(_sign_reward_popup):
|
|
_sign_reward_popup = null
|
|
return
|
|
_sign_reward_popup.queue_free()
|
|
_sign_reward_popup = null
|
|
|
|
|
|
func _claim_continue_reward() -> void:
|
|
if _is_busy():
|
|
return
|
|
var reward_day := _next_continue_reward_day()
|
|
if reward_day <= 0:
|
|
_show_toast("没有可领取的连续签到奖励")
|
|
return
|
|
var user_id := _player_id()
|
|
if user_id <= 0:
|
|
_show_toast("玩家信息缺失")
|
|
return
|
|
_set_busy(true)
|
|
var result: Dictionary = await _activity_api.claim_continue_sign_gift(_token(), user_id, reward_day)
|
|
_set_busy(false)
|
|
if not result.get("ok", false):
|
|
_show_toast(_response_status_text(result, "领取连续签到奖励失败"))
|
|
return
|
|
var config := _find_config_by_id(_game_config.get_sign_config(), reward_day)
|
|
_add_reward_items(str(config.get("accumulation_id", "")))
|
|
_show_toast("领取成功")
|
|
await _refresh_store_house()
|
|
await render()
|
|
_update_sign_reward_popup()
|
|
|
|
|
|
func _weekday_for_unix(unix_time: int) -> int:
|
|
if unix_time <= 0:
|
|
return 1
|
|
var dt := Time.get_datetime_dict_from_unix_time(unix_time)
|
|
var weekday := int(dt.get("weekday", 1))
|
|
return 7 if weekday == 0 else weekday
|
|
|
|
|
|
func _today_weekday() -> int:
|
|
return _weekday_for_unix(int(Time.get_unix_time_from_system()))
|
|
|
|
|
|
func _running_count() -> int:
|
|
var current := 0
|
|
var max_count := 0
|
|
for day in range(1, 8):
|
|
if _signed_days.has(day):
|
|
current += 1
|
|
max_count = maxi(max_count, current)
|
|
else:
|
|
current = 0
|
|
return max_count
|
|
|
|
|
|
func _eligible_reward_box_count(signed_count: int) -> int:
|
|
if signed_count >= 7:
|
|
return 3
|
|
if signed_count >= 5:
|
|
return 2
|
|
if signed_count >= 3:
|
|
return 1
|
|
return 0
|
|
|
|
|
|
func _next_continue_reward_day() -> int:
|
|
var eligible_count := _eligible_reward_box_count(_running_count())
|
|
for index in range(mini(eligible_count, SIGN_REWARD_DAYS.size())):
|
|
var reward_day := int(SIGN_REWARD_DAYS[index])
|
|
if not _claimed_reward_days.has(reward_day):
|
|
return reward_day
|
|
return 0
|
|
|
|
|
|
func _display_continue_reward_day() -> int:
|
|
var next_day := _next_continue_reward_day()
|
|
return next_day if next_day > 0 else 7
|
|
|
|
|
|
func _add_sign_progress_bar(parent: Control, name: String, position: Vector2) -> Control:
|
|
_ui.add_scale9_patch(parent, "%sBg" % name, _texture_provider.frame(_texture_provider.atlas_path("common2"), "common2_prossbarbg_png"), position, SIGN_PROGRESS_BG_SIZE, Rect2(40.0, 12.0, 40.0, 12.0))
|
|
var clip := Control.new()
|
|
clip.name = "%sClip" % name
|
|
clip.position = position + Vector2(2.0, 2.0)
|
|
clip.size = SIGN_PROGRESS_SIZE
|
|
clip.clip_contents = true
|
|
clip.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
parent.add_child(clip)
|
|
_ui.add_texture(clip, "Art", _texture_provider.frame(_texture_provider.atlas_path("common2"), "common2_prossbar_png"), Vector2.ZERO, SIGN_PROGRESS_SIZE)
|
|
return clip
|
|
|
|
|
|
func _update_progress_bar(parent: Control, name: String, signed_count: int) -> void:
|
|
var clip := parent.get_node_or_null("%sClip" % name) as Control
|
|
if clip == null:
|
|
return
|
|
var ratio := clampf(float(signed_count) / 7.0, 0.0, 1.0)
|
|
clip.visible = ratio > 0.0
|
|
clip.size.x = floorf(SIGN_PROGRESS_MAX_WIDTH * ratio)
|
|
|
|
|
|
func _update_line_segments(panel: Control) -> void:
|
|
var root := panel.get_node_or_null("LineOpenSegments") as Control
|
|
if root == null:
|
|
return
|
|
for child in root.get_children():
|
|
root.remove_child(child)
|
|
child.queue_free()
|
|
var line_texture: Texture2D = _texture_provider.standalone("res://assets/egret/assets/game/sign/sign_line_open.png")
|
|
var line_position := Vector2(100.0, 474.0)
|
|
var mask_origin := Vector2(90.0, 468.0)
|
|
for index in range(mini(SIGN_LINE_MASK_RECTS.size(), 7)):
|
|
var day := index + 1
|
|
if not _signed_days.has(day):
|
|
continue
|
|
var rect: Rect2 = SIGN_LINE_MASK_RECTS[index]
|
|
var clip := Control.new()
|
|
clip.name = "LineOpenDay%s" % day
|
|
clip.position = mask_origin + rect.position
|
|
clip.size = rect.size
|
|
clip.clip_contents = true
|
|
clip.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
root.add_child(clip)
|
|
_ui.add_texture(clip, "Art", line_texture, line_position - clip.position, Vector2(453.0, 238.0), TextureRect.STRETCH_KEEP_ASPECT_CENTERED)
|
|
|
|
|
|
func _update_reward_boxes(panel: Control, signed_count: int) -> void:
|
|
var eligible_count := _eligible_reward_box_count(signed_count)
|
|
for index in range(3):
|
|
var holder := panel.get_node_or_null("RewardBox%s" % index) as Control
|
|
if holder == null:
|
|
continue
|
|
var art := holder.get_node_or_null("Art") as TextureRect
|
|
if art == null:
|
|
continue
|
|
var box_key := "sign_box1_png" if eligible_count > index else ("sign_box2_png" if index == 2 else "sign_box0_png")
|
|
art.texture = _texture_provider.frame(_texture_provider.atlas_path("sign"), box_key)
|
|
|
|
|
|
func _update_sign_reward_popup() -> void:
|
|
if _sign_reward_popup == null or not is_instance_valid(_sign_reward_popup):
|
|
return
|
|
var signed_count := _running_count()
|
|
_update_progress_bar(_sign_reward_popup, "PopupProgress", signed_count)
|
|
var day_label := _sign_reward_popup.get_node_or_null("PopupSignedDayNum") as Label
|
|
if day_label != null:
|
|
day_label.text = str(signed_count)
|
|
var eligible_count := _eligible_reward_box_count(signed_count)
|
|
for index in range(3):
|
|
var box := _sign_reward_popup.get_node_or_null("PopupRewardBox%s" % index) as TextureRect
|
|
if box != null:
|
|
var box_key := "sign_box1_png" if eligible_count > index else ("sign_box2_png" if index == 2 else "sign_box0_png")
|
|
box.texture = _texture_provider.frame(_texture_provider.atlas_path("sign"), box_key)
|
|
var reward_day := _display_continue_reward_day()
|
|
var reward_config := _find_config_by_id(_rows, reward_day)
|
|
var rewards := _parse_cost_string(str(reward_config.get("accumulation_id", "")))
|
|
for index in range(3):
|
|
var item := _sign_reward_popup.get_node_or_null("PopupRewardItem%s" % index) as Control
|
|
if item == null:
|
|
continue
|
|
var has_reward := index < rewards.size()
|
|
item.visible = has_reward
|
|
if not has_reward:
|
|
continue
|
|
var reward := rewards[index]
|
|
var icon := item.get_node_or_null("Icon") as TextureRect
|
|
if icon != null:
|
|
icon.texture = _get_item_icon_texture(_game_config.get_item_icon_id(int(reward.get("item_id", 0))))
|
|
var num := item.get_node_or_null("Num") as Label
|
|
if num != null:
|
|
num.text = "X%s" % int(reward.get("count", 0))
|
|
var can_claim := _next_continue_reward_day() > 0
|
|
_set_texture_button_enabled(_sign_reward_popup.get_node_or_null("PopupClaim") as Control, can_claim, _texture_provider.frame(_texture_provider.atlas_path("sign"), "sign_getbutton_png"), _texture_provider.frame(_texture_provider.atlas_path("sign"), "sign_getbutton_d_png"))
|
|
|
|
|
|
func _remedy_day() -> int:
|
|
var today := _today_weekday()
|
|
for day in range(today - 1, 0, -1):
|
|
if not _signed_days.has(day):
|
|
return day
|
|
return 0
|