10 Commits
1.0.0 ... 1.0.1

Author SHA1 Message Date
JHDev2006
0b40efc9f7 you can no longer duplicate the player in the editor, whoops! 2025-09-13 19:57:59 +01:00
JHDev2006
9f6f9c40c5 made it so coins actually coin 2025-09-13 19:53:31 +01:00
Joe H
6c5f57a9a4 Merge pull request #18 from katorovitalo/main
100 coins now give a one up
2025-09-13 19:52:49 +01:00
katorovitalo
c8140f41f0 Update Global.gd 2025-09-13 14:46:51 -04:00
JHDev2006
d2b0c9e282 Merge branch 'main' of https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public 2025-09-13 19:37:43 +01:00
JHDev2006
82b8fa901a Fixed LSS level loading, actually working 2025-09-13 19:37:41 +01:00
Joe H
62103e8e50 Update README.md 2025-09-13 17:57:02 +01:00
Joe H
53e7da5670 Update issue templates 2025-09-13 17:56:23 +01:00
Joe H
09c6f081f2 Update README.md 2025-09-13 17:46:34 +01:00
Joe H
b0349707cf Update README.md 2025-09-13 17:25:26 +01:00
10 changed files with 147 additions and 32 deletions

25
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,25 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Do '...'
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.

View File

@@ -5,6 +5,8 @@ A Remake / Celebration of the original 'Super Mario Bros.' games. Features new l
### Art by [@krystalphantasm.bsky.social](https://bsky.app/profile/krystalphantasm.bsky.social/post/3lvgmgvjeks2f) ### Art by [@krystalphantasm.bsky.social](https://bsky.app/profile/krystalphantasm.bsky.social/post/3lvgmgvjeks2f)
### Download: https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public/releases
# Requires an original SMB1 NES ROM to play! None of the original assets are contained in the source code, unless it was originally made by us! # Requires an original SMB1 NES ROM to play! None of the original assets are contained in the source code, unless it was originally made by us!
# This does NOT act as a replacement for the original Super Mario Bros. games. Super Mario Bros. & Super Mario Bros.: The Lost Levels, can be played now on Nintendo Switch, through Nintendo Switch Online # This does NOT act as a replacement for the original Super Mario Bros. games. Super Mario Bros. & Super Mario Bros.: The Lost Levels, can be played now on Nintendo Switch, through Nintendo Switch Online
@@ -35,9 +37,11 @@ You are more than welcome to contribute any fixes / improvements you'd like, sim
## Issues ## Issues
When opening an issue, please keep it to one report, per post, and try and be as helpful as possible, when telling me what has occured, so that its as easy to fix as possible. When opening an issue, please keep it to one report, per post, and try and be as helpful as possible, when telling me what has occured, so that its as easy to fix as possible.
Please do not open issues, for feature requests, suggestions, or opinions. BUG REPORTS ONLY
## Known Issues ## Known Issues
There are a couple known issues, mainly due to being built off of Godot, and these issues existing in the engine itself. There are a couple known issues, mainly due to being built off of Godot, and these issues existing in the engine itself.
- Steam deck controls do not work natively, you can circumvent this by setting up controller bindings to emulate keys instead, apologies.
- Physics are weird, when interacting with corners + the camera barrier - Physics are weird, when interacting with corners + the camera barrier
- Drop shadows jitter when playing with "Smooth Rendering" - Drop shadows jitter when playing with "Smooth Rendering"
- Several entities jitter at times. - Several entities jitter at times.

View File

@@ -368,11 +368,11 @@ layout_mode = 2
focus_mode = 0 focus_mode = 0
[node name="ScrollContainer" parent="BG/Border/Levels/VBoxContainer/LevelInfo/SelectedLevel/MarginContainer/HBoxContainer/HSplitContainer/LeftHalf/LevelInfo" index="0"] [node name="ScrollContainer" parent="BG/Border/Levels/VBoxContainer/LevelInfo/SelectedLevel/MarginContainer/HBoxContainer/HSplitContainer/LeftHalf/LevelInfo" index="0"]
scroll_horizontal = 46 scroll_horizontal = 200
is_active = true is_active = true
[node name="ScrollContainer2" parent="BG/Border/Levels/VBoxContainer/LevelInfo/SelectedLevel/MarginContainer/HBoxContainer/HSplitContainer/LeftHalf/LevelInfo" index="1"] [node name="ScrollContainer2" parent="BG/Border/Levels/VBoxContainer/LevelInfo/SelectedLevel/MarginContainer/HBoxContainer/HSplitContainer/LeftHalf/LevelInfo" index="1"]
scroll_horizontal = 55 scroll_horizontal = 8
is_active = true is_active = true
[node name="Panel" type="PanelContainer" parent="BG/Border/Levels/VBoxContainer/LevelInfo"] [node name="Panel" type="PanelContainer" parent="BG/Border/Levels/VBoxContainer/LevelInfo"]
@@ -383,7 +383,7 @@ theme_override_styles/panel = ExtResource("8_psbt7")
[node name="AutoScrollContainer" type="ScrollContainer" parent="BG/Border/Levels/VBoxContainer/LevelInfo/Panel"] [node name="AutoScrollContainer" type="ScrollContainer" parent="BG/Border/Levels/VBoxContainer/LevelInfo/Panel"]
layout_mode = 2 layout_mode = 2
mouse_filter = 2 mouse_filter = 2
scroll_vertical = 33 scroll_vertical = 54
horizontal_scroll_mode = 3 horizontal_scroll_mode = 3
vertical_scroll_mode = 3 vertical_scroll_mode = 3
script = ExtResource("24_wf6nb") script = ExtResource("24_wf6nb")
@@ -569,12 +569,12 @@ layout_mode = 2
focus_mode = 0 focus_mode = 0
[node name="ScrollContainer" parent="BG/Border/Levels/VBoxContainer/LSSLevelInfo/SelectedOnlineLevel/MarginContainer/HBoxContainer/HSplitContainer/LeftHalf/LevelInfo" index="0"] [node name="ScrollContainer" parent="BG/Border/Levels/VBoxContainer/LSSLevelInfo/SelectedOnlineLevel/MarginContainer/HBoxContainer/HSplitContainer/LeftHalf/LevelInfo" index="0"]
scroll_horizontal = 7 scroll_horizontal = 30
is_active = true is_active = true
auto_connect_focus = false auto_connect_focus = false
[node name="ScrollContainer2" parent="BG/Border/Levels/VBoxContainer/LSSLevelInfo/SelectedOnlineLevel/MarginContainer/HBoxContainer/HSplitContainer/LeftHalf/LevelInfo" index="1"] [node name="ScrollContainer2" parent="BG/Border/Levels/VBoxContainer/LSSLevelInfo/SelectedOnlineLevel/MarginContainer/HBoxContainer/HSplitContainer/LeftHalf/LevelInfo" index="1"]
scroll_horizontal = 55 scroll_horizontal = 8
is_active = true is_active = true
auto_connect_focus = false auto_connect_focus = false
@@ -587,7 +587,7 @@ theme_override_styles/panel = ExtResource("8_psbt7")
[node name="AutoScrollContainer" type="ScrollContainer" parent="BG/Border/Levels/VBoxContainer/LSSLevelInfo/Panel"] [node name="AutoScrollContainer" type="ScrollContainer" parent="BG/Border/Levels/VBoxContainer/LSSLevelInfo/Panel"]
layout_mode = 2 layout_mode = 2
mouse_filter = 0 mouse_filter = 0
scroll_vertical = 33 scroll_vertical = 54
horizontal_scroll_mode = 3 horizontal_scroll_mode = 3
script = ExtResource("24_wf6nb") script = ExtResource("24_wf6nb")
direction = 1 direction = 1
@@ -703,6 +703,7 @@ focus_mode = 2
[connection signal="pressed" from="BG/Border/Levels/VBoxContainer/LSSLevelInfo/HBoxContainer/ViewOnLSS" to="BG/Border/Levels/VBoxContainer/LSSLevelInfo" method="open_lss"] [connection signal="pressed" from="BG/Border/Levels/VBoxContainer/LSSLevelInfo/HBoxContainer/ViewOnLSS" to="BG/Border/Levels/VBoxContainer/LSSLevelInfo" method="open_lss"]
[connection signal="request_completed" from="BG/Border/Levels/VBoxContainer/LSSLevelInfo/Description" to="BG/Border/Levels/VBoxContainer/LSSLevelInfo" method="on_request_completed"] [connection signal="request_completed" from="BG/Border/Levels/VBoxContainer/LSSLevelInfo/Description" to="BG/Border/Levels/VBoxContainer/LSSLevelInfo" method="on_request_completed"]
[connection signal="request_completed" from="BG/Border/Levels/VBoxContainer/LSSLevelInfo/DownloadLevel" to="BG/Border/Levels/VBoxContainer/LSSLevelInfo" method="level_downloaded"] [connection signal="request_completed" from="BG/Border/Levels/VBoxContainer/LSSLevelInfo/DownloadLevel" to="BG/Border/Levels/VBoxContainer/LSSLevelInfo" method="level_downloaded"]
[connection signal="sprites_updated" from="BGM/ResourceSetter" to="BGM" method="play"]
[connection signal="cancelled" from="CharacterSelect" to="BG/Border/Levels/VBoxContainer/LevelInfo" method="reopen"] [connection signal="cancelled" from="CharacterSelect" to="BG/Border/Levels/VBoxContainer/LevelInfo" method="reopen"]
[editable path="BG/Border/Levels/VBoxContainer/LevelInfo/SelectedLevel"] [editable path="BG/Border/Levels/VBoxContainer/LevelInfo/SelectedLevel"]

View File

@@ -671,7 +671,6 @@ collision_mask = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="CameraCenterJoint/LeftWall"] [node name="CollisionShape2D" type="CollisionShape2D" parent="CameraCenterJoint/LeftWall"]
rotation = 1.5707964 rotation = 1.5707964
shape = SubResource("RectangleShape2D_t1xso") shape = SubResource("RectangleShape2D_t1xso")
disabled = true
one_way_collision = true one_way_collision = true
[node name="RightWall" type="StaticBody2D" parent="CameraCenterJoint"] [node name="RightWall" type="StaticBody2D" parent="CameraCenterJoint"]
@@ -682,7 +681,6 @@ collision_mask = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="CameraCenterJoint/RightWall"] [node name="CollisionShape2D" type="CollisionShape2D" parent="CameraCenterJoint/RightWall"]
rotation = -1.5707964 rotation = -1.5707964
shape = SubResource("RectangleShape2D_jl70t") shape = SubResource("RectangleShape2D_jl70t")
disabled = true
one_way_collision = true one_way_collision = true
[node name="Sprite2D" type="Sprite2D" parent="CameraCenterJoint"] [node name="Sprite2D" type="Sprite2D" parent="CameraCenterJoint"]

View File

@@ -425,7 +425,7 @@ func pick_tile(tile_position := Vector2i.ZERO) -> void:
mode = 0 mode = 0
current_tile_source = tile_layer_nodes[current_layer].get_cell_source_id(tile_position) current_tile_source = tile_layer_nodes[current_layer].get_cell_source_id(tile_position)
current_tile_coords = tile_layer_nodes[current_layer].get_cell_atlas_coords(tile_position) current_tile_coords = tile_layer_nodes[current_layer].get_cell_atlas_coords(tile_position)
elif entity_tiles[current_layer].has(tile_position): elif entity_tiles[current_layer].has(tile_position) and entity_tiles[current_layer][tile_position] is not Player:
mode = 1 mode = 1
current_entity_scene = load(entity_tiles[current_layer][tile_position].scene_file_path) current_entity_scene = load(entity_tiles[current_layer][tile_position].scene_file_path)
current_spawn_offset = entity_tiles[current_layer][tile_position].get_meta("tile_offset") current_spawn_offset = entity_tiles[current_layer][tile_position].get_meta("tile_offset")

View File

@@ -171,9 +171,6 @@ func _ready() -> void:
set_power_state_frame() set_power_state_frame()
if Global.level_editor == null: if Global.level_editor == null:
recenter_camera() recenter_camera()
await get_tree().create_timer(0.1, false).timeout
for i in [$CameraCenterJoint/LeftWall/CollisionShape2D, $CameraCenterJoint/RightWall/CollisionShape2D]:
i.set_deferred("disabled", false)
func apply_character_physics() -> void: func apply_character_physics() -> void:
var path = "res://Assets/Sprites/Players/" + character + "/CharacterInfo.json" var path = "res://Assets/Sprites/Players/" + character + "/CharacterInfo.json"

View File

@@ -74,10 +74,10 @@ var coins := 0:
set(value): set(value):
coins = value coins = value
if coins >= 100:# if coins >= 100:#
coins = coins % 100
if Settings.file.difficulty.inf_lives == 0 and (Global.current_game_mode != Global.GameMode.CHALLENGE and Global.current_campaign != "SMBANN"): if Settings.file.difficulty.inf_lives == 0 and (Global.current_game_mode != Global.GameMode.CHALLENGE and Global.current_campaign != "SMBANN"):
lives += floor(coins / 100.0) lives += floor(coins / 100.0)
AudioManager.play_sfx("1_up", get_viewport().get_camera_2d().get_screen_center_position()) AudioManager.play_sfx("1_up", get_viewport().get_camera_2d().get_screen_center_position())
coins = coins % 100
var time := 300 var time := 300
var lives := 3 var lives := 3
var world_num := 1 var world_num := 1

View File

@@ -70,11 +70,11 @@ func level_downloaded(result: int, response_code: int, headers: PackedStringArra
var json = JSON.parse_string(string) var json = JSON.parse_string(string)
var file = FileAccess.open("user://custom_levels/downloaded/" + level_id + ".lvl", FileAccess.WRITE) var file = FileAccess.open("user://custom_levels/downloaded/" + level_id + ".lvl", FileAccess.WRITE)
var data = null var data = null
if json.levelData is Array: if json.levelData.data is Array:
data = get_json_from_bytes(json.levelData) data = get_json_from_bytes(json.levelData.data)
else: else:
data = json.levelData data = json.levelData
file.store_string(JSON.stringify(data)) file.store_string(JSON.stringify(str_to_var(data)))
file.close() file.close()
%Download.hide() %Download.hide()
%OnlinePlay.show() %OnlinePlay.show()
@@ -82,7 +82,11 @@ func level_downloaded(result: int, response_code: int, headers: PackedStringArra
func play_level() -> void: func play_level() -> void:
var file_path := "user://custom_levels/downloaded/" + level_id + ".lvl" var file_path := "user://custom_levels/downloaded/" + level_id + ".lvl"
LevelEditor.level_file = JSON.parse_string(FileAccess.open(file_path, FileAccess.READ).get_as_text()) var file = JSON.parse_string(FileAccess.open(file_path, FileAccess.READ).get_as_text())
LevelEditor.level_file = file
var info = file["Info"]
LevelEditor.level_author = info["Author"]
LevelEditor.level_name = info["Name"]
level_play.emit() level_play.emit()
func get_json_from_bytes(json := []) -> String: func get_json_from_bytes(json := []) -> String:

View File

@@ -25,10 +25,10 @@ var current_device_brand := 0
var input_event: InputEvent = null var input_event: InputEvent = null
const button_id_translation := [ const button_id_translation := [
["A", "B", "~"], ["A", "B", ""],
["B", "A", "&"], ["B", "A", ""],
["X", "Y", "%"], ["X", "Y", ""],
["Y", "X", "{"], ["Y", "X", ""],
["Select", "-", "Share"], ["Select", "-", "Share"],
"Home", "Home",
["Start", "+", "Options"], ["Start", "+", "Options"],

View File

@@ -7,9 +7,9 @@ advanced_options=false
dedicated_server=false dedicated_server=false
custom_features="" custom_features=""
export_filter="all_resources" export_filter="all_resources"
include_filter="*.bgm, *.txt" include_filter="*.bgm, *.mp3, *.txt"
exclude_filter="" exclude_filter=""
export_path="../builds/Windows/SMB1R.exe" export_path="../Exports/Windows/SMB1R.exe"
patches=PackedStringArray() patches=PackedStringArray()
encryption_include_filters="" encryption_include_filters=""
encryption_exclude_filters="" encryption_exclude_filters=""
@@ -80,7 +80,7 @@ custom_features=""
export_filter="all_resources" export_filter="all_resources"
include_filter="*.bgm, *.mp3, *.txt" include_filter="*.bgm, *.mp3, *.txt"
exclude_filter="" exclude_filter=""
export_path="../builds/Linux/SMB1R.x86_64" export_path="../Exports/Linux/SMB1R.x86_64"
patches=PackedStringArray() patches=PackedStringArray()
encryption_include_filters="" encryption_include_filters=""
encryption_exclude_filters="" encryption_exclude_filters=""
@@ -117,16 +117,16 @@ dotnet/embed_build_outputs=false
[preset.2] [preset.2]
name="Windows Desktop 32" name="Linux 32"
platform="Windows Desktop" platform="Linux"
runnable=false runnable=false
advanced_options=true advanced_options=false
dedicated_server=false dedicated_server=false
custom_features="" custom_features=""
export_filter="all_resources" export_filter="all_resources"
include_filter="*.bgm, *.txt" include_filter=""
exclude_filter="" exclude_filter=""
export_path="../builds/Win32/SMB1R.exe" export_path="../Exports/Linux 32/SMB1R.x86_32"
patches=PackedStringArray() patches=PackedStringArray()
encryption_include_filters="" encryption_include_filters=""
encryption_exclude_filters="" encryption_exclude_filters=""
@@ -137,6 +137,92 @@ script_export_mode=2
[preset.2.options] [preset.2.options]
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
shader_baker/enabled=false
binary_format/architecture="x86_32"
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="#!/usr/bin/env bash
export DISPLAY=:0
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
\"{temp_dir}/{exe_name}\" {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
[preset.3]
name="Linux ARM64"
platform="Linux"
runnable=false
advanced_options=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter="*.bgm, *.mp3, *.txt"
exclude_filter=""
export_path="../Exports/LinuxARM/SMB1R.arm64"
patches=PackedStringArray()
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.3.options]
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
shader_baker/enabled=false
binary_format/architecture="arm64"
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="#!/usr/bin/env bash
export DISPLAY=:0
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
\"{temp_dir}/{exe_name}\" {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
[preset.4]
name="Windows Desktop 32"
platform="Windows Desktop"
runnable=false
advanced_options=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter="*.bgm, *.txt"
exclude_filter=""
export_path="../Exports/Windows32/SMB1R.exe"
patches=PackedStringArray()
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.4.options]
custom_template/debug="" custom_template/debug=""
custom_template/release="" custom_template/release=""
debug/export_console_wrapper=1 debug/export_console_wrapper=1
@@ -183,7 +269,7 @@ ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debu
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
Remove-Item -Recurse -Force '{temp_dir}'" Remove-Item -Recurse -Force '{temp_dir}'"
[preset.3] [preset.5]
name="Windows Desktop ARM" name="Windows Desktop ARM"
platform="Windows Desktop" platform="Windows Desktop"
@@ -194,7 +280,7 @@ custom_features=""
export_filter="all_resources" export_filter="all_resources"
include_filter="" include_filter=""
exclude_filter="" exclude_filter=""
export_path="../builds/Arm64/SMB1R.exe" export_path="../Exports/WindowsARM/SMB1R.exe"
patches=PackedStringArray() patches=PackedStringArray()
encryption_include_filters="" encryption_include_filters=""
encryption_exclude_filters="" encryption_exclude_filters=""
@@ -203,7 +289,7 @@ encrypt_pck=false
encrypt_directory=false encrypt_directory=false
script_export_mode=2 script_export_mode=2
[preset.3.options] [preset.5.options]
custom_template/debug="" custom_template/debug=""
custom_template/release="" custom_template/release=""