mirror of
				https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
				synced 2025-11-04 08:35:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
class_name OnlineLevelContainer
 | 
						|
extends Button
 | 
						|
 | 
						|
var level_name := ""
 | 
						|
var level_author := ""
 | 
						|
var level_thumbnail = null
 | 
						|
var level_id := ""
 | 
						|
var thumbnail_url := ""
 | 
						|
 | 
						|
var ratings := []
 | 
						|
 | 
						|
var difficulty := "Easy"
 | 
						|
var featured = false
 | 
						|
 | 
						|
signal level_selected(container: OnlineLevelContainer)
 | 
						|
 | 
						|
const DIFFICULTY_TO_STAR_TRANSLATION := {
 | 
						|
	"Easy": 0,
 | 
						|
	"Medium": 2,
 | 
						|
	"Hard": 3,
 | 
						|
	"Extreme": 4
 | 
						|
}
 | 
						|
 | 
						|
static var cached_thumbnails := {}
 | 
						|
 | 
						|
func _ready() -> void:
 | 
						|
	set_process(false)
 | 
						|
	setup_visuals()
 | 
						|
 | 
						|
func _process(_delta: float) -> void:
 | 
						|
	if Input.is_action_just_pressed("ui_accept") and visible:
 | 
						|
		level_selected.emit(self)
 | 
						|
 | 
						|
func setup_visuals() -> void:
 | 
						|
	%LevelName.text = Global.sanitize_string(level_name)
 | 
						|
	%LevelAuthor.text = level_author
 | 
						|
	if featured:
 | 
						|
		self_modulate = Color.YELLOW
 | 
						|
	var idx := 0
 | 
						|
	var difficulty_int = DIFFICULTY_TO_STAR_TRANSLATION[difficulty]
 | 
						|
	for i in %DifficultyStars.get_children():
 | 
						|
		i.region_rect.position.x = 32 if idx > difficulty_int else [0, 8, 8, 16, 24][difficulty_int]
 | 
						|
		idx += 1
 | 
						|
	setup_rating_stars()
 | 
						|
	get_thumbnail()
 | 
						|
 | 
						|
func setup_rating_stars() -> void:
 | 
						|
	var rating = calculate_rating()
 | 
						|
	
 | 
						|
	var idx := 0
 | 
						|
	if ratings.is_empty():
 | 
						|
		for i in %RatingStars.get_children():
 | 
						|
			i.region_rect.position.x = 16
 | 
						|
		return
 | 
						|
	for i in %RatingStars.get_children():
 | 
						|
		i.region_rect.position.x = 16 if idx > rating else (0 if abs(idx - rating) >= 0.5 else 8)
 | 
						|
		idx += 1
 | 
						|
 | 
						|
func get_thumbnail() -> void:
 | 
						|
	if cached_thumbnails.has(level_id):
 | 
						|
		%LevelIcon.texture = cached_thumbnails[level_id]
 | 
						|
		$MarginContainer/HBoxContainer/HSplitContainer/LeftHalf/LevelIcon/Error.hide()
 | 
						|
		return
 | 
						|
	if thumbnail_url == "":
 | 
						|
		$MarginContainer/HBoxContainer/HSplitContainer/LeftHalf/LevelIcon/Label.hide()
 | 
						|
		$MarginContainer/HBoxContainer/HSplitContainer/LeftHalf/LevelIcon/Error.show()
 | 
						|
		return
 | 
						|
	$ThumbnailDownloader.request(thumbnail_url, [], HTTPClient.METHOD_GET)
 | 
						|
 | 
						|
func calculate_rating() -> int:
 | 
						|
	var rating := -1.0
 | 
						|
	var total := 0
 | 
						|
	if ratings.is_empty():
 | 
						|
		return 0
 | 
						|
	for i in ratings:
 | 
						|
		total += i
 | 
						|
	rating = total / float(ratings.size())
 | 
						|
	return rating
 | 
						|
 | 
						|
func on_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void:
 | 
						|
	var image = Image.new()
 | 
						|
	if thumbnail_url.contains(".webp"):
 | 
						|
		image.load_webp_from_buffer(body)
 | 
						|
	elif thumbnail_url.contains(".jpeg") or thumbnail_url.contains(".jpg"):
 | 
						|
		image.load_jpg_from_buffer(body)
 | 
						|
	else:
 | 
						|
		image.load_png_from_buffer(body)
 | 
						|
	%LevelIcon.texture = ImageTexture.create_from_image(image)
 | 
						|
	cached_thumbnails[level_id] = %LevelIcon.texture
 |