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