Quad-Queued: 2D RPG Programmed in C# and GDScript)
A downloadable game
[Last updated October 26th, 2025]
The Escapist:
|2D Action RPG| Godot 4 | Solo Developer |
Github with code and scripts: https://github.com/Jea2933
- Code: Developed in C# and GDScript (a variation of Python)
- Music: Being composed in FL Studio
- Art: Currently using public assets. Will eventually be independently drawn with a collaborating artist (currently recruiting)
- The opening cutscene was fully created and animated by myself in Aseprite
Synopsis:
Experience a story from one of four possible characters with unique abilities as you explore four nearly-identical worlds simultaneously. Share your abilities between the other three characters to navigate the world of defend yourselves against enemies.
The main character you select will influence how you experience the story. Your gameplay habits can influence aspects such as the addition or seclusion of additional main characters, dialogue, and story revelations.
---------------------------------------------------------------------------------------
Gameplay Mechanics:
Summary of the most important features:
- You control three characters (eventually, four) that are each exploring their own world. Each world is almost identical to each other with only small differences.
- All three characters share the exact same location at all times across all three worlds. Their actions are also perfectly in-sync, which is how they are able to share abilities efficiently (explained in-depth in the story details section).
- While the characters all have their own unique abilities, they are shared amongst each other. If one character uses their ability, that same ability is used by the other characters as well.
- Example: Player 1 uses their ability -> Player 2 and 3 also use it in their world.
- Using a character's ability will switch to their world and perspective.
Character Switching
- Switch between 3 (eventually, 4) different characters using the 1, 2, or 3 keys respectively.
- Each character belongs to their respective world, which means that switching characters also switches to the world they reside in.
- Character 1 resides in World 1, Character 2 is in World 2, and Character 3 is in World 3
Location and Ability Sharing:
- All characters share the same location across their respective worlds.
- Example: If character 1 moves 5 feet to the left, then all other characters will have moved 5 feet to the left as well.
- Characters also share their abilities between each other across worlds
- Example: If Player 1 teleports 5 feet to the right, Player 2 will have teleported in this same spot in their own world as well.
- Example: If Player 1 teleports 5 feet to the right, Player 2 will have teleported in this same spot in their own world as well.
Character Abilities and Inputs
- Player 1: Shield (Q Key)
- Deploy a shield around the players that protects from all incoming damage and attacks. Can only be used for a set period.
- Player 2: Teleportation (Left mouse click)
- Teleport instantly to any available on-screen location. Brings all characters to this location.
- Player 3: Super Speed (Space bar)
- Activates super speed to increase player speed while significantly slowing enemy movement down, making it easier to dodge attacks. Only lasts for a set period of time.
Auto Switch when using abilities:
- While only one character and world can be on-screen at a time, all characters and worlds still remain active off-screen
- Using a character's abilities, regardless of whether they are on or off-screen, will automatically switch to that character and their world
- Example: While Character 1 is on-screen, using left mouse click (Character 2's ability) will teleport all characters to the mouse's location, while also switching to Character 2 and their world
- This feature is essentially like using a character's abilities in Genshin Impact, but skips the step of having to switch to the character first with number keys
- In this video, I am switching from player 1 (the bear character) to player 2 (the girl) by using player 2's teleportation ability
- Godot switches to the world of the character that owns the ability when it is activated (in this case, it goes to player 2's world as soon as their teleportation power is used).
- Player 2 has the teleportation ability, so it automatically switches to their perspective and world.
Why?
- This is done to allow players to simply use the character's abilities without having to first press a number key to switch to the character first.
- Instead, you can simply use a character's respective ability to switch to their world as well. As characters are always sharing the same location, you are essentially only playing one larger game instead of 3 different ones.
Desired Effect:
- This creates a seamless gameplay experience where players explore 3 different worlds simultaneously by effortlessly switching from player to player by simply using their abilities.
- In the video below, the ability timers at the top left of the screen activate immediately when a character is switched into.
- Common question: "What if you just want to switch to the character without using their abilities?"
- Then you'd press the 1, 2, or 3 keys for the character you want, respectively.
- Their powers are only activated by using their "shortcut" keys (Q, Mouse Click, and Space respectively)
Code and Scripts:
- Game Manager:
- There are two Game Managers- one is in C# (Gamemanager.cs), while the other is in GDScript (GDManager.gd)
- These two global scripts cover most major variables in the game.
- GDManager.gd:
- Character 1 Shield Script: Deep Dive
- The shield is created in my GameManager because it's intended to persist across all three worlds and characters (if Character 1 uses it, Characters 2 and 3 are also protected by it, as it is not bound only to the character's world.
- By instantiating the shield (a simple Sprite2D) within GDManager, the shield can be used regardless of the current world being played.
--------------------------------------------------------------------------------
func use_shield(event):
if event.is_action_pressed("ui_q"):
GameManager.current_world_index = 0
GameManager.current_player_index = 0
if GameManager.player1dead:
return
if shield_timer_stopped:
return
if synced == false:
if GameManager.current_player_index == 0:
if !limited_shield: #if the shield lasts indefinitely
if !GameManager.current_player_index == 0: #if the game is not set to player 1
pass #if the game isn't on player 1 when q is pressed, do nothing
shield_active = !shield_active
if !shield_active:
AudioManager.playSound("res://Audio/shield_gone.ogg")
#shield2.visible = shield_active
print("Player 1's shield is ", "on" if shield_active else "off")
else:
shield_active = !shield_active
shield.visible = shield_active
if shield_active:
AudioManager.playSound("res://Audio/shield_ring.mp3")
shield_timer.start()
print("Player 1's shield is on")
#print("Player 1's shield is ", "on" if shield_active else "off")
else:
AudioManager.playSound("res://Audio/shield_gone.ogg")
print("Player 1's shield is deactivated (from button press)")
shield_timer.stop()
if synced == true:
shield_active = !shield_active
shield.visible = shield_active
if shield_active == true: #if the shield turns on when Q is pressed
shield.get_node("StaticBody2D/CollisionShape2D").disabled = false
shield_timer.start()
if GameManager.current_player_index != 0:
GameManager.current_player_index = 0
GameManager.current_world_index = 0
if shield_active == false: #if the shield becomes inactive on Q press
shield.get_node("StaticBody2D/CollisionShape2D").disabled = true
shield_timer.stop()
shield_timer_stopped = true
shield_timer_short.start()
--------------------------------------------------------------------------------
GDScript: https://gist.github.com/Jea2933/825f8ecb94d66e1ea93ed60939a4beaf
C#: https://gist.github.com/Jea2933/fd6d0f1ffd3a800196e1e90355dde13c
Programming Player Movement (State Machines & Scene Inheritance)
For player movement, I created a base player script for code that all players will use (titled "player.gd"). I then gave each player their own inherited player script that extends from the original player script (titled "player1", "player2", and "player3" respectively).
As of right now, each inherited player script only manages their respective state machines for basic player movement. However, the player's scripts will inevitably grow as I continue to implement each character's own abilities that are exclusive to them.
---------------------------------------------------------------------------------------------
Programming & Development
The game is being made in Godot 4. Most of the scripts so far have been developed in Godot's native language, GDScript. However, recently I have decided to begin incorporating C# into my development process, as this programming language is more universal to other game development workstations such as Unity, and is used almost everywhere in the game development industry. I have began to "adapt" my Level script (originally written in GDScript) into C#, and will continue to use C# over GDScript whenever possible. However, the game as a whole will most likely use scripts from both languages.
Here is the C# adaptation of my Level script that is still being written [Outdated as of 11/12/24, will update soon!]:
https://gist.github.com/Jea2933/8ebd0adca2e1e90d9da105868f965dec
For reference, here is the original Level script, originally written in GDScript:
https://gist.github.com/Jea2933/1924600d5c4db092f4759aab975ac880
I have two global scripts for managing Player and World management, titled PlayerManager & GlobalManager respectively. These scripts are written in C# and keep track of which Character and World is set (however, for now, Character 1 will always be in World 1, Character 2 will always be in World 2, and so on).
---------------------------------------------------------------------------------------------
All Scripts [Currently outdated, will update them soon!]
Game Manager Script: https://gist.github.com/Jea2933/5c967d25942f311149db125f92fa25fb
Level Script:
https://gist.github.com/Jea2933/1924600d5c4db092f4759aab975ac880
Main Player Script:
https://gist.github.com/Jea2933/cd7ac78ba11e8f2c5d90eaac862637b4
(The following scripts are almost identical, but are put here for reference)
Player1 Script:
https://gist.github.com/Jea2933/2e6448acd3f724e3cd1f4f58005af0e4
Player2 Script:
https://gist.github.com/Jea2933/6705163481ea27c13b07761216dca37d
Player3 Script:
https://gist.github.com/Jea2933/4501bf79d98c25e8f7b65931df6a1852
---------------------------------------------------------------------------------------------
Story and Lore Details:
What is really happening?
(The following concepts are technically spoilers for the game, as players will not know about the following information immediately)
- There are four main characters. While each character is exploring their own respective (nearly-identical) world, only one world is actually real: player 1's world.
- While Character 1 is the catalyst for the events in the story, characters 2-4 can be chosen to be the "main character" over Character 1, and the overall story will be told from their perspective.
- "Character 1" is a young boy named Cal, who uses the superhero alias, Bear-Man. He is banished to a world outside of our own with a mixed society of humans, anthropomorphic creatures and inanimate objects brought to life. He explores this world for fun and doesn't particularly have any goals in mind.
- His power is life creation (unbeknownst to him; he believes he is a simple psychic).
- Through the work of a mysterious creature, three additional characters from earth (characters 2, 3, and 4) begin to spontaneously transport into unique worlds that are identical to player 1's.
- These worlds are technically not real and are only slightly different mirrors of player 1's world.
- In this state, all 4 characters are temporarily synced together perfectly, which includes their actions and abilities.
- This synced state is not permanent and eventually, characters 2, 3, and 4 "wake up" back on earth and continue their day-to-day lives.
Reference Diagram:
Character 1 -> His world: Real. Exists outside of our universe. His actions are his own and not influenced by others. He is aware of when characters 2-4 are "present" and synced with him, which allows him to explore his world as if he has four abilities at once.
Characters 2, 3, and 4 -> From earth. Each get teleported to their own copy of Character 1's world. Their worlds are not real. Here, their experience is almost dream-like; their thoughts are not fully their own, and they use abilities they didn't know they had subconsciously in addition to their own. They move across all four worlds synchronously as if they were one person.
| Updated | 5 days ago |
| Status | In development |
| Author | Jacob36 |
| Genre | Role Playing |
Development log
- Untitled Role Playing Game DevlogSep 04, 2024





