TL;DR: Should I stick with Godot 3, or jump to Godot 4?

I'm returning to Godot and game dev after a few years hiatus. I've done things like create a hex map and camera controller entirely in C++, a TPS controller in C++, and other minor things using gdscript. I'm wanting to start using C#, and will for this project. My first question is this, should I stick with Godot 3, or jump to Godot 4?

I had AI whip up a player controller:

using Godot;

public class PlayerController : KinematicBody
{
    private const float Speed = 5f;
    private const float RotationSpeed = 4f;
    private Vector3 motion = Vector3.Zero;

    public override void _PhysicsProcess(float delta)
    {
        // Handle player movement
        motion = Vector3.Zero;
        if (Input.IsActionPressed("ui_right"))
            motion.x += 1;
        if (Input.IsActionPressed("ui_left"))
            motion.x -= 1;
        if (Input.IsActionPressed("ui_down"))
            motion.z += 1;
        if (Input.IsActionPressed("ui_up"))
            motion.z -= 1;

        motion = motion.Normalized() * Speed;

        MoveAndSlide(motion * delta, Vector3.Up);

        // Handle player rotation to look at the mouse
        var ray = GetViewport().GetCamera().ProjectRayOrigin(GetViewport().GetMousePosition());
        var raycast = GetViewport().GetWorld().DirectSpaceState.IntersectRay(GlobalTransform.origin, ray, new Godot.Collections.Array { this }, 1);
        if (raycast.Count > 0 && raycast["collider"] is Spatial collider)
        {
            var lookDir = (collider.GlobalTransform.origin - GlobalTransform.origin).Normalized();
            var targetRotation = lookDir.Rotation().y;
            Rotation = new Vector3(0, targetRotation, 0);
        }

        // Handle shooting
        if (Input.IsActionJustPressed("fire"))
        {
            var bullet = (Bullet)GD.Load<PackedScene>("res://Bullet.tscn").Instance();
            GetParent().AddChild(bullet);
            bullet.GlobalTransform = GlobalTransform;
            bullet.Velocity = GlobalTransform.basis.z.Normalized() * bullet.Speed;
        }
    }
}

In a world much like our own, you are a scavenger with a troubled history. Your parents died at a young age, but for people like you, that isn't uncommon. You use drugs like amphetamine and you are fully aware of the negative consequences it's having on not only your own life, but those of your fellow associates. You play as Valkyrie.

Valkyrie is a compelling character whose story is shaped by a series of significant events, personal struggles, and a relentless pursuit of justice. From her physical appearance to her inner conflicts, every aspect of her being carries depth and complexity.

Physical Appearance: Valkyrie possesses an arresting presence, standing tall with an athletic figure that exudes both strength and grace. Her long, flowing blond hair cascades down her back in soft waves, catching the light and adding to her ethereal aura. Her piercing ice blue eyes, often filled with a mix of sorrow and determination, seem to hold untold stories. One cannot help but be captivated by the haunting beauty and resilience that radiates from her.

The Scar Under Her Left Eye: A distinctive scar etches a path beneath Valkyrie's left eye, a permanent mark of the car crash that tragically claimed her mother's life. It serves as a visible reminder of the profound loss and pain she endured at a young age. The scar, slightly raised and textured, tells a story of tragedy and resilience, symbolizing the indomitable spirit that resides within Valkyrie.

The Demon Within: Deep within Valkyrie's heart resides a dormant demon, an entity that both intimidates and unsettles those who cross her path. This internal presence adds an air of mystery and unease to her character. Though dormant, the demon's influence is felt in subtle ways, as if it is waiting for the opportune moment to awaken and unleash its dark power.

Bubbly Personality to Somber Demeanor: Prior to the loss of her mother and witnessing her father's overdose, Valkyrie was known for her bubbly personality. She exuded an infectious energy, radiating positivity and joy. However, the weight of these tragic events caused a profound shift within her. The color seemed to drain from her psyche, leaving her with a somber and muted demeanor. Laughter became rare, replaced by a quiet resolve that emanated from her core.

Battle with Addiction: Valkyrie's life took a tumultuous turn when she found herself entangled in the grip of addiction. Despite her initial intentions to use methamphetamine in a controlled manner, the allure of the drug and the escape it offered proved to be a dangerous dance. She witnessed the destructive power of addiction firsthand, not only through her father's demise but also through her own struggles. Valkyrie found herself teetering on the edge, the line between control and chaos becoming increasingly blurred.

The Dance with Darkness: Valkyrie's encounters with addiction created an ongoing battle within her soul. The demon that resided within her seemed to grow stronger, urging her towards self-destruction and chaos. Yet, Valkyrie possessed a strength that transcended her darkest moments. Even in the throes of temptation, she found the willpower to resist. Her determination to avoid succumbing to the demons that haunted her family became a driving force, a flicker of light within the darkness.

Transformation and Pursuit of Sobriety: After months of dancing with the demon, Valkyrie reached a breaking point. She stared into the abyss of addiction and saw the devastating impact it had on her life and the lives of those around her. It was at this critical juncture that she found the strength within herself to embark on a journey towards sobriety. Valkyrie sought the support of loved ones, professional help, and various rehabilitation resources. Her path to recovery was fraught with challenges and setbacks, but she remained resolute in her commitment to break free from the shackles of addiction.

The Power of Redemption: As Valkyrie gained clarity and distance from her dark past, she transformed into a beacon of hope and redemption. Her experiences provided a unique perspective, fueling her unwavering passion for justice and protecting the vulnerable. She became a fierce advocate for those who had fallen victim to addiction and sought to break the cycle of pain and despair. Valkyrie's dedication to making a positive impact in the world became a driving force in her life, propelling her forward with an unyielding sense of purpose.

Intimidation and Passion for Justice: Valkyrie's journey and the demons she wrestled with granted her an aura of intensity and gravitas. Her unwavering commitment to justice became legendary, even surpassing the local arbitrator. Her passion burned like a fierce flame, illuminating the darkness that threatened to engulf society. It was this fierce dedication that both intimidated and inspired those who encountered her. Valkyrie's presence commanded respect, challenging others to question their own values and actions.

Internal Conflict and Dissociation: The battle between good and evil within Valkyrie reached beyond her struggles with addiction. Deep within her soul, a constant internal conflict raged. The dormant demon within her heart whispered dark temptations, urging her towards violent retribution against those responsible for the demons that haunted her. However, Valkyrie refused to succumb to these destructive impulses. Instead, she developed a coping mechanism that involved dissociation. Whenever the urge to use methamphetamine or the darkness within threatened to consume her, she entered a state of dissociation, detaching herself from reality. In these moments, she became an observer in her own internal struggle, navigating the fragile line between righteousness and vengeance.

Valkyrie's character is an intricate tapestry woven with the threads of loss, addiction, redemption, and an unyielding pursuit of justice. She stands as a symbol of resilience, an embodiment of the strength that can emerge from the depths of despair. Valkyrie's journey is one of self-discovery and transformation, as she battles the demons within and without, seeking not only her own salvation but also the betterment of the world around her.

  • xyz replied to this.

    Lousifr Jump to 4 if you don't have any significant amount of 3.x code already developed.
    Nice character writeup 👏

    I'm very wary when people start to argue about justice… the fact is that different people have very different understanding of it… and very often these understandings do not coincide…

    If it's a big project and you don't have any work yet, I think you should use 4.x. But as far as I know C# in Godot is still very unstable.

      Tomcat GDScript is terribly slow. As much as my current PC could handle it, I’ve had a computer that couldn’t handle it. As such, GDScript isn’t an option imo. I know native works, but I don’t want to have to compile the entire game for every test. Last time I used it, I had to write the entire scene in the base node also, so it can get to be a challenge. GDScript feels sloppy also. It’s worse than python, so I figure I’d use C#. It’s been supported for years… thanks for the thought food, I’ll think more about which language(s) I’ll use. I'll probably end up rewriting most of it in native when I get parts of it finished.

      Justice is an objective concept, but at the end of the day, all understanding is subjective. Is it just, the people who sold her the drugs saw being a dealer as the only profitable way forward? Is it unjust, they were raised with their fathers in jail and turned to the only role models around? Is it just, they lace their drugs with fentanyl to get their clientele addicted and coming back for more? I would say that is very muddy as these children are raised in an environment that promotes these behaviors, but Valkyrie should be allowed her own twisted sense of justice, whatever it be. Also, I'm gonna rewrite portions of her story as I go along, but I felt satisfied with where it is for now.

        Lousifr GDScript is terribly slow.

        Yep, it's recommended to write the performance-critical parts of your code in another language. C++ for example.

        Justice is an objective concept

        Justice is a very subjective notion. The simplest example is "L'État c'est moi" (The State is me!) ©️

        I would not like to get into a discussion about drugs… it's dangerously close to politics (in fact — these are overlapping fields).

          I feel wrong writing this reply, as it is argumentative. FIDLAR.

          Tomcat in another language.

          C# has been supported for at least 4 years. I'll use it until I have issues.

          Tomcat Justice is a very subjective notion.

          As are all notions, objectivity doesn't truly exist in the human experience, as all understanding is subjective. The idea of justice however, is to find the objective truth and issue reparation accordingly.

          Tomcat The simplest example is "L'État c'est moi"

          Yes, kings operated according to their own rule book. That doesn't mean everything they did was just.

          Tomcat I would not like to get into a discussion about drugs…

          Then let's not? Why are we even arguing in the first place? lmao. I understand the unease with the subject matter however. I want to write a story that is uneasy, yet has elements of beauty within.

            Lousifr Since you're presenting the concept here, I'd also like to hear a bit about your game mechanics, as well as core gameplay loops.

              Lousifr Yes, kings operated according to their own rule book.

              Everyone has their own "rule book". 😹

              Why are we even arguing in the first place?

              Well my project is about social relationships and I'm interested in getting a little caught up in the issue and hearing different opinions.

                xyz Just standard TDS mechanics, but it's about story, all about story. This is a project that'll hopefully keep me interested as a come back to Godot. It's been years since I last was apart of this community. Gameplay loop: See bad guy? Shoot. Actually idk. Maybe some stealth aspects... Avoid the cops at first, as you struggle with addiction, then join sides as you fight dealers and gang members? Maybe Co Operative Person aspects.

                Honestly, with AI (ChatGPT > Bard, IMO) writing stories is easy af if you have creative energy/originality. I didn't even intend for Valkyrie to become a game character tbh. Might totally change the narrative to be some guy joining the french foreign legion, then having governments fear him. IDFK, I just am currently unemployed so want to do this again.

                Tomcat Well my project is about social relationships

                I am most certainly interested in your project now.

                  Lousifr I am most certainly interested in your project now.

                  A little bit about the project here. Not the article itself but more in the discussion of it. In short, an alternative to the The Sims (3), with the elaboration of simulation of social relationships.

                  But I'm starting with a very small task.

                    Lousifr I know native works, but I don’t want to have to compile the entire game for every test.

                    First let me just preface this with the statement that if you like and prefer C# then of course use C#, I'm not trying to dissuade. However with that stated and the above quoted, if you are using GDExtension or GDNative(depending on the engine version) you should not need to recompile the whole engine/game each time. Especially with GDExtension, you might implement a new node to have the performance critical functionality built into it, but once it's done, as a dll plugin it should not need any recompiling unless you update the engine to a version featuring ABI or API breaks/changes.

                      Megalomaniak
                      I haven't done this for years, so pretty much all of that went over my head. JK, I am not saying to compile the engine every time, just recompile the binaries for the game I create. I was doing everything in C++ because that's what ultimately felt most comfortable. GDScript isn't even python. Python would be very workable. I didn't much care for it. You are speaking of plugins and API's. I'm talking game logic. You speak of a higher level than my own. I created a hexmap first in gdscript, then translated it to C++. and created the camera controller. My programming skills aren't the most refined in terms of OpenGL. I created a triangle. I have no business writing engines, I am self taught. Engine writing is college level stuff, and my intention isn't to pursue a CS degree (Psych studied). 25 however, so it might not, but hopefully will happen.

                      Tomcat
                      Makes me think of the game paradox is creating. Start small. Who knows.

                      My thoughts on it are that you work out an outline similar to what you have, then concentrate on gameplay and work on it till it's fun. That's what people are going to be doing most of time when they aren't listening or reading dialog.