home.social

#lambgamedev — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #lambgamedev, aggregated by home.social.

fetched live
  1. Here is a WIP of the Zelda 64-style camera targeting system. It needs improvement, but I'm really unsure as to how to go about fixing it 😅

    The project is called
    Slayer64 and is being developed by WINDBREKER
    :)

    I'm pretty proud of what I've made so far! I've come a long way since first starting to learn Godot ^^

    None of this could have been made without
    @keyschain's help! She is inseparably important!

    #zelda #ocarinaoftime #oot #legendofzelda #godot #godotdev #indiedev #lambgamedev

  2. Here is a WIP of the Zelda 64-style camera targeting system. It needs improvement, but I'm really unsure as to how to go about fixing it 😅

    The project is called
    Slayer64 and is being developed by WINDBREKER
    :)

    I'm pretty proud of what I've made so far! I've come a long way since first starting to learn Godot ^^

    None of this could have been made without
    @keyschain's help! She is inseparably important!

    #zelda #ocarinaoftime #oot #legendofzelda #godot #godotdev #indiedev #lambgamedev

  3. Here is a WIP of the Zelda 64-style camera targeting system. It needs improvement, but I'm really unsure as to how to go about fixing it 😅

    The project is called
    Slayer64 and is being developed by WINDBREKER
    :)

    I'm pretty proud of what I've made so far! I've come a long way since first starting to learn Godot ^^

    None of this could have been made without
    @keyschain's help! She is inseparably important!

    #zelda #ocarinaoftime #oot #legendofzelda #godot #godotdev #indiedev #lambgamedev

  4. made a very simple 2D Zelda-style camera. might work on it more as practice

    #godot #zelda #gamedev #lambgamedev

  5. made a very simple 2D Zelda-style camera. might work on it more as practice

    #godot #zelda #gamedev #lambgamedev

  6. made a very simple 2D Zelda-style camera. might work on it more as practice

    #godot #zelda #gamedev #lambgamedev

  7. Urge to make every game going forward for the Ayn Thor and Anbernic RG DS...rising.... Must r-r-resist...

    #lambgamedev

  8. Urge to make every game going forward for the Ayn Thor and Anbernic RG DS...rising.... Must r-r-resist...

    #lambgamedev

  9. Urge to make every game going forward for the Ayn Thor and Anbernic RG DS...rising.... Must r-r-resist...

    #lambgamedev

  10. I think I've reached a point where it's good enough and I can move on. I can't figure out how to get the "danger zone" flash animation working, but oh well, maybe in another 10 months I'll take another crack at it.

    #lambgamedev #indiedev #gamedev #godot #zelda

  11. I think I've reached a point where it's good enough and I can move on. I can't figure out how to get the "danger zone" flash animation working, but oh well, maybe in another 10 months I'll take another crack at it.

    #lambgamedev #indiedev #gamedev #godot #zelda

  12. I think I've reached a point where it's good enough and I can move on. I can't figure out how to get the "danger zone" flash animation working, but oh well, maybe in another 10 months I'll take another crack at it.

    #lambgamedev #indiedev #gamedev #godot #zelda

  13. I think I've reached a point where it's good enough and I can move on. I can't figure out how to get the "danger zone" flash animation working, but oh well, maybe in another 10 months I'll take another crack at it.

    #lambgamedev #indiedev #gamedev #godot #zelda

  14. The game I helped work on is out!


    TEMPEST
    BECOME ARMAGEDDON
    It's a retro-style FPS where you play as a samurai with a gun and you shoot alien invaders in feudal Japan!!
    You can play it in your browser
    here!

    Unfortunately, none of my work made it into the release, but we all did put a lot of effort into it! Please give it a try and if you have an Itch account feel free to
    rate Tempest on the 32-Bit Winter Jam!

    You can read about my unfinished work on
    Tempest on my website!

    #gamedev #indiedev #godot #32bitjam #32bitwinterjam #lambgamedev

    RE: https://transfem.social/notes/agvm2w81s7lj190q

  15. The game I helped work on is out!


    TEMPEST
    BECOME ARMAGEDDON
    It's a retro-style FPS where you play as a samurai with a gun and you shoot alien invaders in feudal Japan!!
    You can play it in your browser
    here!

    Unfortunately, none of my work made it into the release, but we all did put a lot of effort into it! Please give it a try and if you have an Itch account feel free to
    rate Tempest on the 32-Bit Winter Jam!

    You can read about my unfinished work on
    Tempest on my website!

    #gamedev #indiedev #godot #32bitjam #32bitwinterjam #lambgamedev

    RE: https://transfem.social/notes/agvm2w81s7lj190q

  16. The game I helped work on is out!


    TEMPEST
    BECOME ARMAGEDDON
    It's a retro-style FPS where you play as a samurai with a gun and you shoot alien invaders in feudal Japan!!
    You can play it in your browser
    here!

    Unfortunately, none of my work made it into the release, but we all did put a lot of effort into it! Please give it a try and if you have an Itch account feel free to
    rate Tempest on the 32-Bit Winter Jam!

    You can read about my unfinished work on
    Tempest on my website!

    #gamedev #indiedev #godot #32bitjam #32bitwinterjam #lambgamedev

    RE: https://transfem.social/notes/agvm2w81s7lj190q

  17. I'm not restarting the 3D Zelda project, but the broken health bar always bugged me, so I got to thinking about it more today and with a little perseverance I did it! It also works if you change the HP by amounts other than 1.

    It's little moments like these that make me think that maybe game dev isn't impossible for me, just that it requires a
    lot of thinking, breaking concepts down into smaller tasks, and time away from problems.

    class_name HudHealth
    extends Node
    
    
    const NAME_HEART: String = "HudHeart" ## The name of each heart node. Used to identify heart nodes from other nodes.
    const HRT_SECTIONS: int = 4 ## Don't change this from 4, everything breaks otherwise.
    
    
    export var hrt: PackedScene ## The heart scene
    export var hp: int = 0 setget _hp_set
    func _hp_set(value: int = hp) -> void:
    	hp = clamp(value, 0, hp_max)
    export var hp_max: int = 3 * HRT_SECTIONS ## Determines the maxmimum amount of health the player has. Every 4 hp adds a new heart to the health bar.
    export var grid_collumns: int = 10 ## Determines how many hearts can be in a row before a new row is started.
    
    onready var grid = $"../Grid"
    onready var btn_add = $"../ButtonAdd"
    onready var btn_subtract = $"../ButtonSubtract"
    onready var lbl_debug = $"../LblDebug"
    
    
    var target_heart: int ## Determines which heart in the grid should be segmented.
    
    
    
    func _ready() -> void:
    	grid.columns = grid_collumns
    
    # Empty any heart nodes that might already be children of the grid node
    	for i in grid.get_child_count():
    		if grid.get_child(i).name.begins_with(NAME_HEART):
    			grid.get_child(i).name = "_REMOVE" # Necessary for some reason or else future HudHeart node names will continue counting as if the previous ones were still there despite those already being deleted. Very strange.
    			grid.get_child(i).queue_free()
    		else:
    			printerr("There were stray nodes in the HudHealth grid node at child " + str(i) + ", name " + grid.get_child(i).name + ". Deleted.")
    			grid.get_child(i).queue_free()
    # Add hearts to grid
    	for i in ceil(hp_max / HRT_SECTIONS):
    		var h: Control = hrt.instance()
    		grid.add_child(h, true)
    		get_node("../Grid/HudHeart" + str(i) + "/Heart").value = 0 # Make all hearts' values 0
    # Ensures grid h-separation and v-separation are appropriate
    	for i in grid.get_child_count():
    		if grid.get_child(i).name.begins_with(NAME_HEART):
    			var h: TextureProgress = grid.get_child(i).get_child(0)
    			grid.add_constant_override("hseparation", h.rect_size.x)
    			grid.add_constant_override("vseparation", h.rect_size.y)
    			break # Only needs to happen once.
    
    	update_hud_health()
    
    
    func update_hud_health() -> void:
    	target_heart = ceil(float(hp) / HRT_SECTIONS) - 1 # find the target heart based on player's HP
    
    	for i in grid.get_child_count():
    		if grid.get_child(i).name.begins_with(NAME_HEART):
    			var h: TextureProgress = get_node("../Grid/HudHeart" + str(i) + "/Heart")
    # Handle all hearts before the target heart
    			if i < target_heart:
    				h.value = HRT_SECTIONS
    # Handle the target heart
    			if i == target_heart:
    				h.value = hp % HRT_SECTIONS
    				if hp % HRT_SECTIONS == 0:
    					 h.value = HRT_SECTIONS
    # Handle all hearts after the target heart
    			if i > target_heart:
    				h.value = 0
    
    	lbl_debug.text = "HP: " + str(hp) + "\nTarget Heart: " + str(target_heart) + "\nModulo: " + str(hp % HRT_SECTIONS)
    
    
    func _on_ButtonAdd_button_up():
    	hp += 1
    	_hp_set()
    	update_hud_health()
    
    
    func _on_ButtonSubtract_button_up():
    	hp -= 1
    	_hp_set()
    	update_hud_health()

    I'd like to improve it to the point where the bar fills and depletes smoothly like it does in
    Breath of the Wild, but that seems like adding complications to a currently working and serviceable solution.

    #zelda #gamedev #indiedev #indiegames #godot #lambgamedev

    RE: https://transfem.social/notes/a80qv4k7f6po6olz

  18. I'm not restarting the 3D Zelda project, but the broken health bar always bugged me, so I got to thinking about it more today and with a little perseverance I did it! It also works if you change the HP by amounts other than 1.

    It's little moments like these that make me think that maybe game dev isn't impossible for me, just that it requires a
    lot of thinking, breaking concepts down into smaller tasks, and time away from problems.

    class_name HudHealth
    extends Node
    
    
    const NAME_HEART: String = "HudHeart" ## The name of each heart node. Used to identify heart nodes from other nodes.
    const HRT_SECTIONS: int = 4 ## Don't change this from 4, everything breaks otherwise.
    
    
    export var hrt: PackedScene ## The heart scene
    export var hp: int = 0 setget _hp_set
    func _hp_set(value: int = hp) -> void:
    	hp = clamp(value, 0, hp_max)
    export var hp_max: int = 3 * HRT_SECTIONS ## Determines the maxmimum amount of health the player has. Every 4 hp adds a new heart to the health bar.
    export var grid_collumns: int = 10 ## Determines how many hearts can be in a row before a new row is started.
    
    onready var grid = $"../Grid"
    onready var btn_add = $"../ButtonAdd"
    onready var btn_subtract = $"../ButtonSubtract"
    onready var lbl_debug = $"../LblDebug"
    
    
    var target_heart: int ## Determines which heart in the grid should be segmented.
    
    
    
    func _ready() -> void:
    	grid.columns = grid_collumns
    
    # Empty any heart nodes that might already be children of the grid node
    	for i in grid.get_child_count():
    		if grid.get_child(i).name.begins_with(NAME_HEART):
    			grid.get_child(i).name = "_REMOVE" # Necessary for some reason or else future HudHeart node names will continue counting as if the previous ones were still there despite those already being deleted. Very strange.
    			grid.get_child(i).queue_free()
    		else:
    			printerr("There were stray nodes in the HudHealth grid node at child " + str(i) + ", name " + grid.get_child(i).name + ". Deleted.")
    			grid.get_child(i).queue_free()
    # Add hearts to grid
    	for i in ceil(hp_max / HRT_SECTIONS):
    		var h: Control = hrt.instance()
    		grid.add_child(h, true)
    		get_node("../Grid/HudHeart" + str(i) + "/Heart").value = 0 # Make all hearts' values 0
    # Ensures grid h-separation and v-separation are appropriate
    	for i in grid.get_child_count():
    		if grid.get_child(i).name.begins_with(NAME_HEART):
    			var h: TextureProgress = grid.get_child(i).get_child(0)
    			grid.add_constant_override("hseparation", h.rect_size.x)
    			grid.add_constant_override("vseparation", h.rect_size.y)
    			break # Only needs to happen once.
    
    	update_hud_health()
    
    
    func update_hud_health() -> void:
    	target_heart = ceil(float(hp) / HRT_SECTIONS) - 1 # find the target heart based on player's HP
    
    	for i in grid.get_child_count():
    		if grid.get_child(i).name.begins_with(NAME_HEART):
    			var h: TextureProgress = get_node("../Grid/HudHeart" + str(i) + "/Heart")
    # Handle all hearts before the target heart
    			if i < target_heart:
    				h.value = HRT_SECTIONS
    # Handle the target heart
    			if i == target_heart:
    				h.value = hp % HRT_SECTIONS
    				if hp % HRT_SECTIONS == 0:
    					 h.value = HRT_SECTIONS
    # Handle all hearts after the target heart
    			if i > target_heart:
    				h.value = 0
    
    	lbl_debug.text = "HP: " + str(hp) + "\nTarget Heart: " + str(target_heart) + "\nModulo: " + str(hp % HRT_SECTIONS)
    
    
    func _on_ButtonAdd_button_up():
    	hp += 1
    	_hp_set()
    	update_hud_health()
    
    
    func _on_ButtonSubtract_button_up():
    	hp -= 1
    	_hp_set()
    	update_hud_health()

    I'd like to improve it to the point where the bar fills and depletes smoothly like it does in
    Breath of the Wild, but that seems like adding complications to a currently working and serviceable solution.

    #zelda #gamedev #indiedev #indiegames #godot #lambgamedev

    RE: https://transfem.social/notes/a80qv4k7f6po6olz

  19. I'm not restarting the 3D Zelda project, but the broken health bar always bugged me, so I got to thinking about it more today and with a little perseverance I did it! It also works if you change the HP by amounts other than 1.

    It's little moments like these that make me think that maybe game dev isn't impossible for me, just that it requires a
    lot of thinking, breaking concepts down into smaller tasks, and time away from problems.

    class_name HudHealth
    extends Node
    
    
    const NAME_HEART: String = "HudHeart" ## The name of each heart node. Used to identify heart nodes from other nodes.
    const HRT_SECTIONS: int = 4 ## Don't change this from 4, everything breaks otherwise.
    
    
    export var hrt: PackedScene ## The heart scene
    export var hp: int = 0 setget _hp_set
    func _hp_set(value: int = hp) -> void:
    	hp = clamp(value, 0, hp_max)
    export var hp_max: int = 3 * HRT_SECTIONS ## Determines the maxmimum amount of health the player has. Every 4 hp adds a new heart to the health bar.
    export var grid_collumns: int = 10 ## Determines how many hearts can be in a row before a new row is started.
    
    onready var grid = $"../Grid"
    onready var btn_add = $"../ButtonAdd"
    onready var btn_subtract = $"../ButtonSubtract"
    onready var lbl_debug = $"../LblDebug"
    
    
    var target_heart: int ## Determines which heart in the grid should be segmented.
    
    
    
    func _ready() -> void:
    	grid.columns = grid_collumns
    
    # Empty any heart nodes that might already be children of the grid node
    	for i in grid.get_child_count():
    		if grid.get_child(i).name.begins_with(NAME_HEART):
    			grid.get_child(i).name = "_REMOVE" # Necessary for some reason or else future HudHeart node names will continue counting as if the previous ones were still there despite those already being deleted. Very strange.
    			grid.get_child(i).queue_free()
    		else:
    			printerr("There were stray nodes in the HudHealth grid node at child " + str(i) + ", name " + grid.get_child(i).name + ". Deleted.")
    			grid.get_child(i).queue_free()
    # Add hearts to grid
    	for i in ceil(hp_max / HRT_SECTIONS):
    		var h: Control = hrt.instance()
    		grid.add_child(h, true)
    		get_node("../Grid/HudHeart" + str(i) + "/Heart").value = 0 # Make all hearts' values 0
    # Ensures grid h-separation and v-separation are appropriate
    	for i in grid.get_child_count():
    		if grid.get_child(i).name.begins_with(NAME_HEART):
    			var h: TextureProgress = grid.get_child(i).get_child(0)
    			grid.add_constant_override("hseparation", h.rect_size.x)
    			grid.add_constant_override("vseparation", h.rect_size.y)
    			break # Only needs to happen once.
    
    	update_hud_health()
    
    
    func update_hud_health() -> void:
    	target_heart = ceil(float(hp) / HRT_SECTIONS) - 1 # find the target heart based on player's HP
    
    	for i in grid.get_child_count():
    		if grid.get_child(i).name.begins_with(NAME_HEART):
    			var h: TextureProgress = get_node("../Grid/HudHeart" + str(i) + "/Heart")
    # Handle all hearts before the target heart
    			if i < target_heart:
    				h.value = HRT_SECTIONS
    # Handle the target heart
    			if i == target_heart:
    				h.value = hp % HRT_SECTIONS
    				if hp % HRT_SECTIONS == 0:
    					 h.value = HRT_SECTIONS
    # Handle all hearts after the target heart
    			if i > target_heart:
    				h.value = 0
    
    	lbl_debug.text = "HP: " + str(hp) + "\nTarget Heart: " + str(target_heart) + "\nModulo: " + str(hp % HRT_SECTIONS)
    
    
    func _on_ButtonAdd_button_up():
    	hp += 1
    	_hp_set()
    	update_hud_health()
    
    
    func _on_ButtonSubtract_button_up():
    	hp -= 1
    	_hp_set()
    	update_hud_health()

    I'd like to improve it to the point where the bar fills and depletes smoothly like it does in
    Breath of the Wild, but that seems like adding complications to a currently working and serviceable solution.

    #zelda #gamedev #indiedev #indiegames #godot #lambgamedev

    RE: https://transfem.social/notes/a80qv4k7f6po6olz

  20. I'm not restarting the 3D Zelda project, but the broken health bar always bugged me, so I got to thinking about it more today and with a little perseverance I did it! It also works if you change the HP by amounts other than 1.

    It's little moments like these that make me think that maybe game dev isn't impossible for me, just that it requires a
    lot of thinking, breaking concepts down into smaller tasks, and time away from problems.

    class_name HudHealth
    extends Node
    
    
    const NAME_HEART: String = "HudHeart" ## The name of each heart node. Used to identify heart nodes from other nodes.
    const HRT_SECTIONS: int = 4 ## Don't change this from 4, everything breaks otherwise.
    
    
    export var hrt: PackedScene ## The heart scene
    export var hp: int = 0 setget _hp_set
    func _hp_set(value: int = hp) -> void:
    	hp = clamp(value, 0, hp_max)
    export var hp_max: int = 3 * HRT_SECTIONS ## Determines the maxmimum amount of health the player has. Every 4 hp adds a new heart to the health bar.
    export var grid_collumns: int = 10 ## Determines how many hearts can be in a row before a new row is started.
    
    onready var grid = $"../Grid"
    onready var btn_add = $"../ButtonAdd"
    onready var btn_subtract = $"../ButtonSubtract"
    onready var lbl_debug = $"../LblDebug"
    
    
    var target_heart: int ## Determines which heart in the grid should be segmented.
    
    
    
    func _ready() -> void:
    	grid.columns = grid_collumns
    
    # Empty any heart nodes that might already be children of the grid node
    	for i in grid.get_child_count():
    		if grid.get_child(i).name.begins_with(NAME_HEART):
    			grid.get_child(i).name = "_REMOVE" # Necessary for some reason or else future HudHeart node names will continue counting as if the previous ones were still there despite those already being deleted. Very strange.
    			grid.get_child(i).queue_free()
    		else:
    			printerr("There were stray nodes in the HudHealth grid node at child " + str(i) + ", name " + grid.get_child(i).name + ". Deleted.")
    			grid.get_child(i).queue_free()
    # Add hearts to grid
    	for i in ceil(hp_max / HRT_SECTIONS):
    		var h: Control = hrt.instance()
    		grid.add_child(h, true)
    		get_node("../Grid/HudHeart" + str(i) + "/Heart").value = 0 # Make all hearts' values 0
    # Ensures grid h-separation and v-separation are appropriate
    	for i in grid.get_child_count():
    		if grid.get_child(i).name.begins_with(NAME_HEART):
    			var h: TextureProgress = grid.get_child(i).get_child(0)
    			grid.add_constant_override("hseparation", h.rect_size.x)
    			grid.add_constant_override("vseparation", h.rect_size.y)
    			break # Only needs to happen once.
    
    	update_hud_health()
    
    
    func update_hud_health() -> void:
    	target_heart = ceil(float(hp) / HRT_SECTIONS) - 1 # find the target heart based on player's HP
    
    	for i in grid.get_child_count():
    		if grid.get_child(i).name.begins_with(NAME_HEART):
    			var h: TextureProgress = get_node("../Grid/HudHeart" + str(i) + "/Heart")
    # Handle all hearts before the target heart
    			if i < target_heart:
    				h.value = HRT_SECTIONS
    # Handle the target heart
    			if i == target_heart:
    				h.value = hp % HRT_SECTIONS
    				if hp % HRT_SECTIONS == 0:
    					 h.value = HRT_SECTIONS
    # Handle all hearts after the target heart
    			if i > target_heart:
    				h.value = 0
    
    	lbl_debug.text = "HP: " + str(hp) + "\nTarget Heart: " + str(target_heart) + "\nModulo: " + str(hp % HRT_SECTIONS)
    
    
    func _on_ButtonAdd_button_up():
    	hp += 1
    	_hp_set()
    	update_hud_health()
    
    
    func _on_ButtonSubtract_button_up():
    	hp -= 1
    	_hp_set()
    	update_hud_health()

    I'd like to improve it to the point where the bar fills and depletes smoothly like it does in
    Breath of the Wild, but that seems like adding complications to a currently working and serviceable solution.

    #zelda #gamedev #indiedev #indiegames #godot #lambgamedev

    RE: https://transfem.social/notes/a80qv4k7f6po6olz

  21. I'm learning programming :3

    Here's a thing I made. It sorts high scores for a local leaderboard. It must follow a
    [[HISCORE, DATETIME, NAME], [...], [...]] format (or at least the first two items must be high score and date-time).

    class LeaderboardSort:
    	## Sorts duplicate scores prioritizing the earlier datetime.
    	static func sort_duplicate_scores(a, b) -> bool:
    		if a[1] < b[1]:
    			return true
    		return false
    
    	## Sorts scores.
    	static func sort_scores(a, b) -> bool:
    		if a[0] > b[0]:
    			return true
    		return false
    
    
    ## Sorts the leaderboard array from highest to lowest score and handleds duplicate scores.
    ## Leaderboard array must be arranged like so: [HISCORE, int(Time.get_datetime_string_from_system(true)), "PLAYER_NAME"]
    func sort_leaderboard(lb: Array) -> void:
    	lb.sort_custom(LeaderboardSort, "sort_duplicate_scores") # This one must be done before sort_scores()
    	lb.sort_custom(LeaderboardSort, "sort_scores")

    It worked out for me! Let me know if there are any errors.

    Looking up "godot leaderboard" online yielded a whole lot of nothing. There was SilentWolf and SimpleBoards, but a whole plugin to just do high score sorting seemed over the top to me. So, I decided to try to make a high score sorter myself. Thankfully, Godot has
    sort_custom() that makes it a lot simpler.

    No idea what "static" functions do or what separates them from regular functions, but the Editor was telling me they gotta be static. I looked it up and the explanations aren't that helpful.

    #godot #gdscript #gamedev #indiedev #lambgamedev

  22. I'm learning programming :3

    Here's a thing I made. It sorts high scores for a local leaderboard. It must follow a
    [[HISCORE, DATETIME, NAME], [...], [...]] format (or at least the first two items must be high score and date-time).

    class LeaderboardSort:
    	## Sorts duplicate scores prioritizing the earlier datetime.
    	static func sort_duplicate_scores(a, b) -> bool:
    		if a[1] < b[1]:
    			return true
    		return false
    
    	## Sorts scores.
    	static func sort_scores(a, b) -> bool:
    		if a[0] > b[0]:
    			return true
    		return false
    
    
    ## Sorts the leaderboard array from highest to lowest score and handleds duplicate scores.
    ## Leaderboard array must be arranged like so: [HISCORE, int(Time.get_datetime_string_from_system(true)), "PLAYER_NAME"]
    func sort_leaderboard(lb: Array) -> void:
    	lb.sort_custom(LeaderboardSort, "sort_duplicate_scores") # This one must be done before sort_scores()
    	lb.sort_custom(LeaderboardSort, "sort_scores")

    It worked out for me! Let me know if there are any errors.

    Looking up "godot leaderboard" online yielded a whole lot of nothing. There was SilentWolf and SimpleBoards, but a whole plugin to just do high score sorting seemed over the top to me. So, I decided to try to make a high score sorter myself. Thankfully, Godot has
    sort_custom() that makes it a lot simpler.

    No idea what "static" functions do or what separates them from regular functions, but the Editor was telling me they gotta be static. I looked it up and the explanations aren't that helpful.

    #godot #gdscript #gamedev #indiedev #lambgamedev

  23. I'm learning programming :3

    Here's a thing I made. It sorts high scores for a local leaderboard. It must follow a
    [[HISCORE, DATETIME, NAME], [...], [...]] format (or at least the first two items must be high score and date-time).

    class LeaderboardSort:
    	## Sorts duplicate scores prioritizing the earlier datetime.
    	static func sort_duplicate_scores(a, b) -> bool:
    		if a[1] < b[1]:
    			return true
    		return false
    
    	## Sorts scores.
    	static func sort_scores(a, b) -> bool:
    		if a[0] > b[0]:
    			return true
    		return false
    
    
    ## Sorts the leaderboard array from highest to lowest score and handleds duplicate scores.
    ## Leaderboard array must be arranged like so: [HISCORE, int(Time.get_datetime_string_from_system(true)), "PLAYER_NAME"]
    func sort_leaderboard(lb: Array) -> void:
    	lb.sort_custom(LeaderboardSort, "sort_duplicate_scores") # This one must be done before sort_scores()
    	lb.sort_custom(LeaderboardSort, "sort_scores")

    It worked out for me! Let me know if there are any errors.

    Looking up "godot leaderboard" online yielded a whole lot of nothing. There was SilentWolf and SimpleBoards, but a whole plugin to just do high score sorting seemed over the top to me. So, I decided to try to make a high score sorter myself. Thankfully, Godot has
    sort_custom() that makes it a lot simpler.

    No idea what "static" functions do or what separates them from regular functions, but the Editor was telling me they gotta be static. I looked it up and the explanations aren't that helpful.

    #godot #gdscript #gamedev #indiedev #lambgamedev

  24. Oh to be in an 8-person game studio making chill games about life, fun, and growing old...

    #lambgamedev #indiegamedev #indiedev #gamedev

  25. Oh to be in an 8-person game studio making chill games about life, fun, and growing old...

    #lambgamedev #indiegamedev #indiedev #gamedev

  26. Oh to be in an 8-person game studio making chill games about life, fun, and growing old...

    #lambgamedev #indiegamedev #indiedev #gamedev

  27. I think I may have kinda killed it at programming this one thing in the game, I'm so happy

    No idea if it's gonna continue to work later on, but it works now!!!!

    #lambgamedev

  28. I think I may have kinda killed it at programming this one thing in the game, I'm so happy

    No idea if it's gonna continue to work later on, but it works now!!!!

    #lambgamedev

  29. I think I may have kinda killed it at programming this one thing in the game, I'm so happy

    No idea if it's gonna continue to work later on, but it works now!!!!

    #lambgamedev

  30. I made a little breakthrough in game programming yippee yippee

    #lambgamedev

  31. I made a little breakthrough in game programming yippee yippee

    #lambgamedev

  32. I made a little breakthrough in game programming yippee yippee

    #lambgamedev

  33. 2+ years of game dev experience
    0 video games finished
    They call her.....Lamb.....


    #lambgamedev

  34. 2+ years of game dev experience
    0 video games finished
    They call her.....Lamb.....


    #lambgamedev

  35. 2+ years of game dev experience
    0 video games finished
    They call her.....Lamb.....


    #lambgamedev

  36. A very cool idea: developing an arcade game in Godot for a Raspberry Pi (or alternative), sticking that bad boy in an arcade cabinet.

    Bonus points if it uses a CRT TV monitor.

    #godot #gamedev #indiedev #lambgamedev #arcadegames #retrodev

  37. A very cool idea: developing an arcade game in Godot for a Raspberry Pi (or alternative), sticking that bad boy in an arcade cabinet.

    Bonus points if it uses a CRT TV monitor.

    #godot #gamedev #indiedev #lambgamedev #arcadegames #retrodev

  38. A very cool idea: developing an arcade game in Godot for a Raspberry Pi (or alternative), sticking that bad boy in an arcade cabinet.

    Bonus points if it uses a CRT TV monitor.

    #godot #gamedev #indiedev #lambgamedev #arcadegames #retrodev

  39. Godot 4.5 just came out and oh my goodness the features, the features...

    I've been using 3.5.3 for so long that once I dip my toes into 4.5 or 4.6 or 4.7 whenever those come out it's going to feel like I'm 10 years old again

    #lambgamedev

  40. Godot 4.5 just came out and oh my goodness the features, the features...

    I've been using 3.5.3 for so long that once I dip my toes into 4.5 or 4.6 or 4.7 whenever those come out it's going to feel like I'm 10 years old again

    #lambgamedev

  41. Godot 4.5 just came out and oh my goodness the features, the features...

    I've been using 3.5.3 for so long that once I dip my toes into 4.5 or 4.6 or 4.7 whenever those come out it's going to feel like I'm 10 years old again

    #lambgamedev

  42. Godot 4.5 just came out and oh my goodness the features, the features...

    I've been using 3.5.3 for so long that once I dip my toes into 4.5 or 4.6 or 4.7 whenever those come out it's going to feel like I'm 10 years old again

    #lambgamedev

  43. I have whipped up a quick and dirty PlayStation 2 ghosting/motion blur/frame blending effect!

    ## Creates a PlayStation 2-like frame blending effect.
    ##
    ## Add to _process(). The frame blending effect is applied to the area 
    ## within the boundaries of the texture_rect node.
    ## It is recommended to only set the alpha to less than 1.
    func frame_blend(texture_rect: TextureRect, alpha: float = 0.5, use_frame_post_draw: bool = true, viewport: Viewport = get_viewport()) -> void:
    	alpha = clamp(alpha, 0.0, 1.0) # Alpha values are 0 through 1
    
    	var image: Image = Image.new()
    	var texture: ImageTexture = ImageTexture.new()
    
    	image = viewport.get_texture().get_data() # FORMAT_RGBAH
    	image.flip_y() # Images start out upside-down. This turns it rightside-up.
    	if use_frame_post_draw:
    		yield(VisualServer, "frame_post_draw") # Changes the vibe.
    	texture.create_from_image(image) # Turn Image to ImageTexture
    	texture_rect.modulate.a = alpha # Changes the opacity of the frame blending
    	texture_rect.texture = texture # Applies the image of the last frame to the texture_rect

    I've been very preoccupied lately. I apologize about the lack of game dev updates, but I've got a lot on my plate right now and those important things takes priority.

    #gamedev #godot #lambgamedev #playstation2 #playstation1 #ps2 #ps1 #psx #indiedev

  44. I have whipped up a quick and dirty PlayStation 2 ghosting/motion blur/frame blending effect!

    ## Creates a PlayStation 2-like frame blending effect.
    ##
    ## Add to _process(). The frame blending effect is applied to the area 
    ## within the boundaries of the texture_rect node.
    ## It is recommended to only set the alpha to less than 1.
    func frame_blend(texture_rect: TextureRect, alpha: float = 0.5, use_frame_post_draw: bool = true, viewport: Viewport = get_viewport()) -> void:
    	alpha = clamp(alpha, 0.0, 1.0) # Alpha values are 0 through 1
    
    	var image: Image = Image.new()
    	var texture: ImageTexture = ImageTexture.new()
    
    	image = viewport.get_texture().get_data() # FORMAT_RGBAH
    	image.flip_y() # Images start out upside-down. This turns it rightside-up.
    	if use_frame_post_draw:
    		yield(VisualServer, "frame_post_draw") # Changes the vibe.
    	texture.create_from_image(image) # Turn Image to ImageTexture
    	texture_rect.modulate.a = alpha # Changes the opacity of the frame blending
    	texture_rect.texture = texture # Applies the image of the last frame to the texture_rect

    I've been very preoccupied lately. I apologize about the lack of game dev updates, but I've got a lot on my plate right now and those important things takes priority.

    #gamedev #godot #lambgamedev #playstation2 #playstation1 #ps2 #ps1 #psx #indiedev

  45. I have whipped up a quick and dirty PlayStation 2 ghosting/motion blur/frame blending effect!

    ## Creates a PlayStation 2-like frame blending effect.
    ##
    ## Add to _process(). The frame blending effect is applied to the area 
    ## within the boundaries of the texture_rect node.
    ## It is recommended to only set the alpha to less than 1.
    func frame_blend(texture_rect: TextureRect, alpha: float = 0.5, use_frame_post_draw: bool = true, viewport: Viewport = get_viewport()) -> void:
    	alpha = clamp(alpha, 0.0, 1.0) # Alpha values are 0 through 1
    
    	var image: Image = Image.new()
    	var texture: ImageTexture = ImageTexture.new()
    
    	image = viewport.get_texture().get_data() # FORMAT_RGBAH
    	image.flip_y() # Images start out upside-down. This turns it rightside-up.
    	if use_frame_post_draw:
    		yield(VisualServer, "frame_post_draw") # Changes the vibe.
    	texture.create_from_image(image) # Turn Image to ImageTexture
    	texture_rect.modulate.a = alpha # Changes the opacity of the frame blending
    	texture_rect.texture = texture # Applies the image of the last frame to the texture_rect

    I've been very preoccupied lately. I apologize about the lack of game dev updates, but I've got a lot on my plate right now and those important things takes priority.

    #gamedev #godot #lambgamedev #playstation2 #playstation1 #ps2 #ps1 #psx #indiedev

  46. I have whipped up a quick and dirty PlayStation 2 ghosting/motion blur/frame blending effect!

    ## Creates a PlayStation 2-like frame blending effect.
    ##
    ## Add to _process(). The frame blending effect is applied to the area 
    ## within the boundaries of the texture_rect node.
    ## It is recommended to only set the alpha to less than 1.
    func frame_blend(texture_rect: TextureRect, alpha: float = 0.5, use_frame_post_draw: bool = true, viewport: Viewport = get_viewport()) -> void:
    	alpha = clamp(alpha, 0.0, 1.0) # Alpha values are 0 through 1
    
    	var image: Image = Image.new()
    	var texture: ImageTexture = ImageTexture.new()
    
    	image = viewport.get_texture().get_data() # FORMAT_RGBAH
    	image.flip_y() # Images start out upside-down. This turns it rightside-up.
    	if use_frame_post_draw:
    		yield(VisualServer, "frame_post_draw") # Changes the vibe.
    	texture.create_from_image(image) # Turn Image to ImageTexture
    	texture_rect.modulate.a = alpha # Changes the opacity of the frame blending
    	texture_rect.texture = texture # Applies the image of the last frame to the texture_rect

    I've been very preoccupied lately. I apologize about the lack of game dev updates, but I've got a lot on my plate right now and those important things takes priority.

    #gamedev #godot #lambgamedev #playstation2 #playstation1 #ps2 #ps1 #psx #indiedev