mirror of
https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
synced 2025-12-05 19:20:19 -08:00
Marathon + ANN Medal Icons on World Select
Marathon mode and ANN now show the highest ranking achieved on all levels when applicable. So if you manage to get a gold medal on every level, but get a bronze on one, then it'll display a bronze medal for your world completion. Side note: Why the fuck was the only solution to the GPU particle emitting behavior to make a massive array of node paths. I hate this! This sucks! Joe, why did you do that? And why was it the only thing I could find that worked?
This commit is contained in:
parent
1407c0824b
commit
02c71107cf
7 changed files with 1125 additions and 272 deletions
Binary file not shown.
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.9 KiB |
File diff suppressed because one or more lines are too long
|
|
@ -2,21 +2,21 @@
|
|||
|
||||
[ext_resource type="PackedScene" uid="uid://dntk2js0tu3y2" path="res://Scenes/Prefabs/UI/WorldSelect.tscn" id="1_fvn0p"]
|
||||
|
||||
[node name="WorldSelect" instance=ExtResource("1_fvn0p")]
|
||||
[node name="WorldSelect" unique_id=110172661 instance=ExtResource("1_fvn0p")]
|
||||
world_offset = 8
|
||||
num_of_worlds = 4
|
||||
|
||||
[node name="Slot1" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" index="0"]
|
||||
[node name="Slot1" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" parent_id_path=PackedInt32Array(181733477) index="0" unique_id=1293243576]
|
||||
focus_neighbor_left = NodePath("../Slot5")
|
||||
|
||||
[node name="Slot5" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" index="4"]
|
||||
[node name="Slot5" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" parent_id_path=PackedInt32Array(181733477) index="4" unique_id=286713451]
|
||||
focus_neighbor_right = NodePath("../Slot1")
|
||||
|
||||
[node name="Slot6" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" index="5"]
|
||||
[node name="Slot6" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" parent_id_path=PackedInt32Array(181733477) index="5" unique_id=1911479070]
|
||||
visible = false
|
||||
|
||||
[node name="Slot7" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" index="6"]
|
||||
[node name="Slot7" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" parent_id_path=PackedInt32Array(181733477) index="6" unique_id=1681952344]
|
||||
visible = false
|
||||
|
||||
[node name="Slot8" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" index="7"]
|
||||
[node name="Slot8" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" parent_id_path=PackedInt32Array(181733477) index="7" unique_id=576787431]
|
||||
visible = false
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -54,6 +54,11 @@ var best_level_warpless_times := [
|
|||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1]
|
||||
]
|
||||
|
||||
|
|
@ -95,7 +100,12 @@ const SMB1_LEVEL_GOLD_WARPLESS_TIMES := [
|
|||
[22, 22, 17, 16], # World 5
|
||||
[21, 25, 18, 16], # World 6
|
||||
[20, 38, 25, 23], # World 7
|
||||
[40, 24, 24, 50] # World 8
|
||||
[40, 24, 24, 50], # World 8
|
||||
[-1, -1, -1, -1], # World 9
|
||||
[-1, -1, -1, -1], # World A
|
||||
[-1, -1, -1, -1], # World B
|
||||
[-1, -1, -1, -1], # World C
|
||||
[-1, -1, -1, -1] # World D
|
||||
]
|
||||
|
||||
const SMBLL_LEVEL_GOLD_WARPLESS_TIMES := [
|
||||
|
|
@ -107,6 +117,11 @@ const SMBLL_LEVEL_GOLD_WARPLESS_TIMES := [
|
|||
[28, 39, 23, 29],
|
||||
[21, 26, 32, 36],
|
||||
[24, 27, 25, 60],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1]
|
||||
]
|
||||
|
||||
const SMB1_LEVEL_GOLD_ANY_TIMES := {
|
||||
|
|
@ -135,6 +150,11 @@ const SMBS_LEVEL_GOLD_TIMES := [
|
|||
[24, 21, 23, 20],
|
||||
[24, 40, 30, 27],
|
||||
[30, 35, 30, 43],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1],
|
||||
[-1, -1, -1, -1]
|
||||
]
|
||||
|
||||
const SMB1_WARP_LEVELS := ["1-2", "4-2"]
|
||||
|
|
@ -262,7 +282,7 @@ func load_best_times(campaign = Global.current_campaign) -> void:
|
|||
return
|
||||
best_time_campaign = campaign
|
||||
best_level_any_times.clear()
|
||||
for world_num in 8:
|
||||
for world_num in 13:
|
||||
for level_num in 4:
|
||||
var path = Global.config_path.path_join("marathon_recordings/" + campaign + "/" + str(world_num + 1) + "-" + str(level_num + 1) + ".json")
|
||||
if FileAccess.file_exists(path):
|
||||
|
|
|
|||
|
|
@ -213,7 +213,6 @@ func setup_visuals() -> void:
|
|||
var clamp_icon = clamp([cur_level[1][0] * icon_size[0], cur_level[1][1] * icon_size[1]], [0, 0], grid_size)
|
||||
i.get_node("Icon").texture = cur_icon
|
||||
i.get_node("Icon").region_rect = Rect2(clamp_icon[0], clamp_icon[1], icon_size[0], icon_size[1])
|
||||
print(clamp_icon)
|
||||
i.get_node("Icon/Number").region_rect.position.y = clamp(NUMBER_Y.find(level_theme) * 12, 0, 9999)
|
||||
i.get_node("Icon/Number").region_rect.position.x = (idx) * 12
|
||||
i.get_node("Icon/RankMedal").visible = Global.current_campaign == "SMBANN"
|
||||
|
|
@ -241,7 +240,6 @@ func update_score() -> void:
|
|||
func update_pb() -> void:
|
||||
if has_speedrun_stuff == false: return
|
||||
var best_warpless_time = SpeedrunHandler.best_level_warpless_times[Global.world_num - 1][selected_level]
|
||||
print(SpeedrunHandler.best_level_warpless_times)
|
||||
var best_any_time = SpeedrunHandler.best_level_any_times.get(str(Global.world_num) + "-" + str(selected_level + 1), -1)
|
||||
%FullRunPB.text = "--:--:--" if best_warpless_time == -1 else SpeedrunHandler.gen_time_string(SpeedrunHandler.format_time(best_warpless_time))
|
||||
%WarpRunPB.text = "--:--:--" if best_any_time == -1 else SpeedrunHandler.gen_time_string(SpeedrunHandler.format_time(best_any_time))
|
||||
|
|
|
|||
|
|
@ -2,6 +2,10 @@ extends Control
|
|||
|
||||
var selected_world := 0
|
||||
|
||||
@export var has_speedrun_stuff := false
|
||||
@export var has_challenge_stuff := false
|
||||
@export var has_disco_stuff := false
|
||||
|
||||
@export var world_offset := 0
|
||||
|
||||
@export var num_of_worlds := 7
|
||||
|
|
@ -23,9 +27,47 @@ const NUMBER_Y := [
|
|||
"Volcano"
|
||||
]
|
||||
|
||||
const RANK_MEDALS := preload("res://Assets/Sprites/UI/RankMedals.png")
|
||||
|
||||
func _ready() -> void:
|
||||
for i in %SlotContainer.get_children():
|
||||
i.focus_entered.connect(slot_focused.bind(i.get_index()))
|
||||
# SkyanUltra: lowkey kind of hate you joe for how this
|
||||
# is implemented but ngl it works so why complain i guess
|
||||
var slot_container = [
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot1/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot1/Icon/Medal/Full/PRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot2/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot2/Icon/Medal/Full/PRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot3/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot3/Icon/Medal/Full/PRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot4/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot4/Icon/Medal/Full/PRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot5/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot5/Icon/Medal/Full/PRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot6/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot6/Icon/Medal/Full/PRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot7/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot7/Icon/Medal/Full/PRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot8/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot8/Icon/Medal/Full/PRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot9/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot9/Icon/Medal/Full/PRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot10/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot10/Icon/Medal/Full/PRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot11/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot11/Icon/Medal/Full/PRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot12/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot12/Icon/Medal/Full/PRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot13/Icon/Medal/Full/SRankParticles,
|
||||
$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot13/Icon/Medal/Full/PRankParticles,
|
||||
]
|
||||
for i in slot_container:
|
||||
start_particle(i)
|
||||
|
||||
func start_particle(particle: GPUParticles2D) -> void:
|
||||
await get_tree().create_timer(randf_range(0, 5)).timeout
|
||||
particle.emitting = true
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
if active:
|
||||
|
|
@ -66,8 +108,54 @@ func setup_visuals() -> void:
|
|||
i.get_node("Icon").texture = resource_getter.get_resource(CustomLevelContainer.ICON_TEXTURES[0 if (idx <= 3 or idx >= 8) and Global.current_campaign != "SMBANN" else 1])
|
||||
i.get_node("Icon/Number").region_rect.position.y = clamp(NUMBER_Y.find(level_theme) * 12, 0, 9999)
|
||||
i.get_node("Icon/Number").region_rect.position.x = (idx + world_offset) * 12
|
||||
setup_marathon_bits(i.get_node("Icon/Medal"), i.get_node("Icon/Medal/Full"), idx + world_offset)
|
||||
setup_disco_bits(i.get_node("Icon/Medal"), i.get_node("Icon/Medal/Full"), i.get_node("Icon/Medal/Full/SRankParticles"), i.get_node("Icon/Medal/Full/PRankParticles"), idx + world_offset)
|
||||
idx += 1
|
||||
|
||||
func setup_disco_bits(medal_outline: TextureRect, medal: NinePatchRect, s_rank_pfx: GPUParticles2D, p_rank_pfx: GPUParticles2D, world_num := 1) -> void:
|
||||
if has_disco_stuff == false: return
|
||||
var saved_rank_ids = []
|
||||
var lowest_rank = -1
|
||||
for i in 4:
|
||||
saved_rank_ids.append(DiscoLevel.level_ranks[SaveManager.get_level_idx(world_num + 1, i + 1)])
|
||||
for rank in DiscoLevel.RANK_IDs.size():
|
||||
if DiscoLevel.RANK_IDs[rank] == saved_rank_ids[i] and (lowest_rank > rank + 1 or lowest_rank < 0):
|
||||
lowest_rank = rank + 1
|
||||
medal_outline.visible = true
|
||||
medal.texture = RANK_MEDALS
|
||||
medal.visible = lowest_rank != -1
|
||||
var medal_rect_x = lowest_rank * 8
|
||||
medal.region_rect = Rect2(medal_rect_x, 16, 8, 8)
|
||||
s_rank_pfx.visible = lowest_rank == 6
|
||||
p_rank_pfx.visible = lowest_rank == 7
|
||||
|
||||
|
||||
func setup_marathon_bits(medal_outline: TextureRect, medal: NinePatchRect, world_num := 1) -> void:
|
||||
if has_speedrun_stuff == false: return
|
||||
var saved_medal_ids = []
|
||||
for i in 4:
|
||||
var best_warpless_time = SpeedrunHandler.best_level_warpless_times[world_num][i]
|
||||
var best_any_time = SpeedrunHandler.best_level_any_times.get(str(world_num + 1) + "-" + str(i + 1), -1)
|
||||
var gold_warpless_time = SpeedrunHandler.LEVEL_GOLD_WARPLESS_TIMES[Global.current_campaign][world_num][i]
|
||||
var gold_any_time := -1.0
|
||||
if SpeedrunHandler.LEVEL_GOLD_ANY_TIMES[Global.current_campaign].has(str(world_num + 1) + "-" + str(i + 1)):
|
||||
gold_any_time = SpeedrunHandler.LEVEL_GOLD_ANY_TIMES[Global.current_campaign][str(world_num + 1) + "-" + str(i + 1)]
|
||||
var medal_id = -1
|
||||
for o in SpeedrunHandler.MEDAL_CONVERSIONS:
|
||||
var target_time = gold_warpless_time * SpeedrunHandler.MEDAL_CONVERSIONS[o]
|
||||
medal_id += 1 if SpeedrunHandler.met_target_time(best_warpless_time, target_time) else 0
|
||||
saved_medal_ids.append(medal_id)
|
||||
if gold_any_time != -1:
|
||||
medal_id = -1
|
||||
for o in SpeedrunHandler.MEDAL_CONVERSIONS:
|
||||
var target_time = gold_any_time * SpeedrunHandler.MEDAL_CONVERSIONS[o]
|
||||
medal_id += 1 if SpeedrunHandler.met_target_time(best_any_time, target_time) else 0
|
||||
saved_medal_ids.append(medal_id)
|
||||
medal_outline.visible = true
|
||||
medal.visible = saved_medal_ids.min() >= 0
|
||||
var medal_rect_x = saved_medal_ids.min() * 8
|
||||
medal.region_rect = Rect2(medal_rect_x, 0, 8, 8)
|
||||
|
||||
func handle_input() -> void:
|
||||
if Input.is_action_just_pressed("ui_accept"):
|
||||
if SaveManager.visited_levels.substr((selected_world + world_offset) * 4, 4) == "0000" and not Global.debug_mode and selected_world != 0:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue