Modding in C# feels incredibly boring and tedious.

Users who are viewing this thread

Godot? Why WHHHHHHHHHYYYYYYYYYYY!!!!!
Because I actually love coding more precisely, creating functions, and toy with randomness and variables. I don't know why, it gives me the giggles. This is why all my mods are so heavy on randomness. Random tests results, random encounters, random loot, random crafting... ! And in godot you have to code everything from the ground up. But then, I don't waste my time trying to learn whether a function should be static or serialized or whatever, but I waste my time creating neat little buggy random systems. As for Unity or unreal or lumberyard, I just can't get into it.
Send my regards to GSanders if you can please, he took over Rigale, and did a huge work on it.
 
At least now we know the "Why" to the question to "Why is it taking over 8 years to make this game". C# coding.

And to anyone thinking they are going to "debate" me on how easy it is to mod using C# nonsense. It took me less than 2 HOURS to figure out how to do core changes to a game in UDK with zero knowledge of Unreal's coding. I did some basic stat changes to some items to see if I could figure it out, got right the first time and on DAY 2, I designed a way to make a glowing effect appear on a sword I also designed. I do have graphics design experience, but it was still the FIRST TIME using the UDK engine for graphical work. AND THAT is the difference between a modern toolkit, and an antiquated one where you better damn well "learn to code" to do much of anything beyond the basics. This isnt 2005 anymore folks, we need a modern devkit. And dont even get me started on how vastly superior Zenimax's dev kits are for modding compared to anything you could hope to do with the Warband. Most of the total conversions for Skyrim and Oblivion were not done by professional coders.

There is no "debate" here. We just plain need a proper modern devkit least we be stuck in the past again.

And to anyone thinking they are going to "debate" me on how easy it is to mod using C# nonsense. It took me less than 2 HOURS to figure out how to do core changes to a game in UDK with zero knowledge of Unreal's coding.
This is not a problem with the language of C#, it's a problem with there being no devtools for bannerlord at the moment. Because guess what? Even if we were using Perl,Python,Ruby,Javascript, etc. right now, we'd still need to hook into the game's internal code, and compile it to a .dll somehow, because there's simply no other way to make substantial mods right now.

You're comparing an SDK to a game engine. What we are doing right now as modders is essentially modifying the game engine directly. It's apples and oranges. If you wanted to modify Unreal's actual game engine,you would be using C++, the same way that we have to use C# at the moment for the same purpose.There IS NO toolkit/devkit/SDK for bannerlord as of present, so your comparisons between a "modern toolkit" and bannerlord modding is pointless at the foundation.

I highly doubt we will need to use reflection and/or harmony just to make mods like this in the future, and that is what a lot of people are hung up on at the moment, and understandably so.

Now, if/when TaleWorlds releases a modkit with documentation and an easy to use scripting language, then maybe you can draw comparisons. Until then, people need to understand that modding the game this early is simply going to me more involved than it will be when the game releases (hopefully). I hate the "it's early access!" excuse, but the fact of the matter is the developers simply haven't prioritized this right now.

I hope you don't take this as an insult, since I'm only on the forum to help answer people's questions where I can, not pretend to be smarter than I am or some other bs. I agree that we don't need a bunch of elitists trying to withhold information just so they are some kind of gatekeeper. I think we agree on a lot, honestly.


Edit:
I just got to this post. I completely agree x1000
 
Last edited:
Personally I really like it. I'm on track of adding a sensible revolts system with the API we have. I'm really enjoying this.
 
> this thread, aka I don't want to put the slightest effort into learning self evident OOP concepts.

C# is redundant? What the actual ****? Have you tried Warband's MS Scripting?

So you're scared/annoyed by "protected", "static", "public," "private", "abstract", "virtual" etc.. eh-kay . Those are actually here to limit redundancy and allow proper system architecture and lower risk of programming mistakes. Ever heard of inheritance, interfaces and delegates? Talk to me about C# redundancy if you grasp how to actually use those efficiently.

Pretty sure the API will allow you to subscribe your functions to trigger-like events like it did in Warband MS since it's pretty simple to do in C# using delegates. The Editor wasn't even released yet and the API isn't complete and documented that you're complaining about something you don't even grasp in the slightest. It's hilarious that some people here also complain about the current state of modding and by the same time compare it to Unity, while Unity also uses C# and has a decade old matured API and Editor.

If you're THAT annoyed by the fact you'll have to use C#, remember that in this given architecture it's perfectly plausible to imagine someone making an LUA extension.

See the good side and consider for a second that no matter how much you dislike it, C# is the most dominant C-type language and learning proper lower level programming rather than higher level coding is probably beneficial to you and the robustness of your code.
 
To add on to what @Odelaly said, you could even, in theory, write all the scripting you want in warband, and get them parsed in C#. The possibilities with this API are endless, and not limited like in Warband.
 
> this thread, aka I don't want to put the slightest effort into learning self evident OOP concepts.

C# is redundant? What the actual ****? Have you tried Warband's MS Scripting?

So you're scared/annoyed by "protected", "static", "public," "private", "abstract", "virtual" etc.. eh-kay . Those are actually here to limit redundancy and allow proper system architecture and lower risk of programming mistakes. Ever heard of inheritance, interfaces and delegates? Talk to me about C# redundancy if you grasp how to actually use those efficiently.

I mean, I think the issue is exactly that he doesn't grasp those concepts, which neither do I really tbf. I mean, I know what an interface is, it's an unimplemented class. Great, but why would you do that? Specifically, I see some interfaces with like one or two void foo() methods and that's it, why not just skip defining that and add those methods directly? Moreover, since they have no return type and no arguments, they basically hold no other information than their name. So, why do that?

The thing is, there's a difference between understanding and applying the standard of a language and following its 'good practices' or dogma. That's akin to culture, which is acquired through working with others. I understand why these interfaces are legal. I understand what you have to do with them if you pass them to a new class. I just don't understand why you would that, how it benefits you, what it's supposed to mean.

Also how is this a low-level language :O this is the exact opposite, everything is structure, relationships, etc... Low-level languages deal in integers and reals and arrays thereof, they have loops, ifs and gotos and sometimes, but not always, a very simple 'close to the metal' explicit memory management system (such as pointers). C is a subset of C++ basically, but C++ is high level where C is low level. That's because the 'high level' or 'low level' describes the highest level of abstraction available to a language, not the lowest.

I'm not too good at C# yet but I'm grateful for having a real programming language to work with. Since it's widely used, you can google stuff. I just can't wait for a release of the core dll sources, if they're ever planning to do it, because a few comments here and there (in the headers especially, explaining what the classes are intended for, if they're scraped, etc...) wouldn't hurt.
 
Well, i wanted to mod for warband but the bloody mess it was made me simply wait for Bannerlord, knowing it would be in C#.
I actually made a lot of PHP being younger and at a very hight level, it was fun and easy to use, but it also taught me every mistake on a large scale project was a pain in the ass. I managed to keep my project running for years simply because i was hunting bad programming behavior while all the competitors were coding like they would on their homepage,thinking it was making them save time, but in the end it simply break all the work at once.
In the end my PHP4 back then was mostly looking like a java project with PHP syntax, and that why it ran smoothly. Being able to do anything with the code is fine when you actually know what you are doing. But every one knows what they are doing better, that's why games are so broken today.

So this being said, i'm pretty happy it's C# actually it's flexible, fast to develop, have a wide documentation and is strong typed. That's the best language possible for large scale projects like M&B total conversions and i'm happy they didn't go for LUA that is another pain in the a**, with a syntax so stupidly inconsistent that you can't do any parser efficiently.

So you do not like C#, alright, why not, i can understand that. Now you are saying UDK is better, that's funny i use UDK too, stop using the build in graphical IDE and get your hands in the code, you will learn what pain is, cause it's not C# under UDK but pure C++ and trust me it's a lot harder than C#. You are speaking about things you do not understand and want to prove you are right, you are not.
Today apps are mostly made in C++ for high performances but .Net, Java and those semi interpreted strong typed languages are preferred when performances are not so important for a really good reason. On the other hand i ever saw a single thing like what was used in warband, and it was in warband, think about it.
 
Well, i wanted to mod for warband but the bloody mess it was made me simply wait for Bannerlord, knowing it would be in C#
Well, I DID mod warband. I kicked my ass, learnt the stuff, and modded it. I didn't quit because "muh not to my standards"
What you C# fanboys dont seem to get is that there are other langages that are MUCH simpler to grasp than this overcomplex piece of arrogant garbage (I am in the process of learning delegates. Just give me a break, please. Seriously, get out of your confort zone, and go see the world, like I am doing by trying to learn this circomvoluted garbage, because I want so much to properly code this game) Of COURSE, those langages and IDE won't check and triple proof every line of code you write to make sure you don't make a mistake, but then, I don't need whatever bull****s stupidity proof system to write a simple function.
I'm not too good at C# yet but I'm grateful for having a real programming language to work with. Since it's widely used, you can google stuff.
+1 the amount of tuts is amazing.
That said, back to intellectual challenge of trying to leisurely, as an electrician, grasp this arrogant garbage.
 
Trying to learn every technical aspect of the system first is the wrong approach. It's the equivalent of learning what a pluperfect subjunctive is before speaking a word of spanish. I learned c++ in about a week by just trying basic stuff out. The syntax is a little weird, but it's still more forgiving than warband.
 
I mean, I think the issue is exactly that he doesn't grasp those concepts, which neither do I really tbf. I mean, I know what an interface is, it's an unimplemented class. Great, but why would you do that? Specifically, I see some interfaces with like one or two void foo() methods and that's it, why not just skip defining that and add those methods directly? Moreover, since they have no return type and no arguments, they basically hold no other information than their name. So, why do that?

The thing is, there's a difference between understanding and applying the standard of a language and following its 'good practices' or dogma. That's akin to culture, which is acquired through working with others. I understand why these interfaces are legal. I understand what you have to do with them if you pass them to a new class. I just don't understand why you would that, how it benefits you, what it's supposed to mean.

Also how is this a low-level language :O this is the exact opposite, everything is structure, relationships, etc... Low-level languages deal in integers and reals and arrays thereof, they have loops, ifs and gotos and sometimes, but not always, a very simple 'close to the metal' explicit memory management system (such as pointers). C is a subset of C++ basically, but C++ is high level where C is low level. That's because the 'high level' or 'low level' describes the highest level of abstraction available to a language, not the lowest.

I'm not too good at C# yet but I'm grateful for having a real programming language to work with. Since it's widely used, you can google stuff. I just can't wait for a release of the core dll sources, if they're ever planning to do it, because a few comments here and there (in the headers especially, explaining what the classes are intended for, if they're scraped, etc...) wouldn't hurt.

Right, interfaces... you'd benefit from using them for a simple reason: you can abstractly reference them like you would an actual object.

For example, let's say I have a method in a 'Weapon' class that is meant to deal damage to other objects, and let's say I want it to damage different types of object such as a 'Character', and a piece of Furniture, let's say a 'Door'. I implement the interface 'IDamagable' that contains the TakeDamage() method on both 'Character" and "Door" classes, that way the Weapon can directly interact with any object that implements the interface (hence the word 'interface' eh), both 'Character' and 'Door', and each of those objects manages how taking damage affects it internally. That's way better than a endless if-elseif-else litany of "if object type A then do damage method B, if object type C then do damage method E" on the 'Weapon' class.

To sum up: given a collision trigger is called, and the Weapon receives a callback with a colliding class object as a parameter...

With interface implemented :
> if colliding Type has interface IDamagable, call TakeDamage method.
Without interface :
> if Type is 'Door', do Method A, if Type is 'Character', do Method B, if Type is 'Balloon,' do Method C, and so on and so on.

I think it's pretty neat, but I must just be irreversibly alienated by the dogma of OOP gurus. Again it's pretty self-evident: an interface suggests utility in interaction, ofcourse there's no point implementing one if you are not planning for your object to have any sort of interaction with another. I don't know what this has to do with "culture", programming is a discipline of applied mathematics (or should be treated like one), there's no 'culture' of mathematics in the sense you're suggesting, there's not a german nor russian nor nigerian way to program or code. There's a bad way, a better way, and the optimal way.

About low level languages. I simply meant that C# is lower level than say LUA or Python. Which it is (LUA for example, is almost completely type-free). Thanks for the definition though.

So this being said, i'm pretty happy it's C# actually it's flexible, fast to develop, have a wide documentation and is strong typed. That's the best language possible for large scale projects like M&B total conversions and i'm happy they didn't go for LUA that is another pain in the a**, with a syntax so stupidly inconsistent that you can't do any parser efficiently.

Right on.

Well, I DID mod warband. I kicked my ass, learnt the stuff, and modded it. I didn't quit because "muh not to my standards"
What you C# fanboys dont seem to get is that there are other langages that are MUCH simpler to grasp than this overcomplex piece of arrogant garbage (I am in the process of learning delegates. Just give me a break, please. Seriously, get out of your confort zone, and go see the world, like I am doing by trying to learn this circomvoluted garbage, because I want so much to properly code this game) Of COURSE, those langages and IDE won't check and triple proof every line of code you write to make sure you don't make a mistake, but then, I don't need whatever bull****s stupidity proof system to write a simple function.

That's a good boy. Breathe in those delegates deeply and exhale all sort of illegal declarations, then typecast all the Vector3s you need to pave your way out of this dark learning tunnel (and make sure to null-reference a bunch of motherduckers cause they ain't instantiated).
 
Code:
    private double BuyPercentage
    {
      get
      {
        return 10.0 / 100.0;
      }
    }
Seriously ?
if colliding Type has interface IDamagable, call TakeDamage method
This is C# ? No it's not. Write this kind of stuff in C# now. And then in Godot (using signals).

That's a good boy. Breathe in those delegates deeply and exhale all sort of illegal declarations, then typecast all the Vector3s you need to pave your way out of this dark learning tunnel.
Great argument mate.
 
Last edited:
Right, interfaces... you'd benefit from using them for a simple reason: you can abstractly reference them like you would an actual object.

For example, let's say I have a method in a 'Weapon' class that is meant to deal damage to other objects, and let's say I want it to damage different types of object such as a 'Character', and a piece of Furniture, let's say a 'Door'. I implement the interface 'IDamagable' that contains the TakeDamage() method on both 'Character" and "Door" classes, that way the Weapon can directly interact with any object that implements the interface (hence the word 'interface' eh), both 'Character' and 'Door', and each of those objects manages how taking damage affects it internally. That's way better than a endless if-elseif-else litany of "if object type A then do damage method B, if object type C then do damage method E" on the 'Weapon' class.

To sum up: given a collision trigger is called, and the Weapon receives a callback with a colliding class object as a parameter...

With interface implemented :
> if colliding Type has interface IDamagable, call TakeDamage method.
Without interface :
> if Type is 'Door', do Method A, if Type is 'Character', do Method B, if Type is 'Balloon,' do Method C, and so on and so on.

Tyvm for the explanation, that actually makes things clearer. The thing I don't understand is how you can even write womething along the lines of:

if(object is of class that implements IDamageable)
call object.TakeDamage()

given the object might not have such a method, the second line would be illegal, right ? Coming from C++ for example, a class either has TakeDamage(), which is known at compile time, or it doesn't. Here you're telling me these things aren't known at compile time but at run time? Or what you mean is you don't actually write the if, but the interface acts as a collection of types, and the compiler checks that the object is instantiated from a class that belongs to a collection of types that has TakeDamage()? Also how can a method perform on variable-typed objects ? I thought variables were typed. In that case the method that calls TakeDamage() has a Chair argument and just calls Chair.TakeDamage(), right?


I think it's pretty neat, but I must just be irreversibly alienated by the dogma of OOP gurus. Again it's pretty self-evident: an interface suggests utility in interaction, ofcourse there's no point implementing one if you are not planning for your object to have any sort of interaction with another.


it's pretty self-evident

it's not if you weren't told ! If I gave you a screwdriver and you'd never seen a screw, would you know what it's for? You'd understand its mechanical properties, how to hold it in your hand, but you wouldn't know what purpose it serves. That's what I'm talking about. Of course, if you carried that screwdriver around for a while, trying on every object to find a purpose for it, you might end up finding its intended use. Or you might instead use it to carve wood, who knows.

I don't know what this has to do with "culture", programming is a discipline of applied mathematics (or should be treated like one), there's no 'culture' of mathematics in the sense you're suggesting, there's not a german nor russian nor nigerian way to program or code. There's a bad way, a better way, and the optimal way.

By culture I don't mean the arbitrary but the transmitted from person to person. In that sense, mathematics is culture much more than anything else. Learning straight from textbooks is the exception rather than the norm. Let me give you a simple example. The textbook says,

" Let f:R->R, f is said to be continuous in x0 iff : forall epsilon > 0, there exists eta > 0, such that forall x in R, |x-x0| < eta implies |f(x0)-f(x)| < epsilon "

The professor says,

"A function is continuous in x0 if for f(x) to be arbitrarily close to f(x0) all you have to ensure is that x is close enough to x0"

According to you, which one is better, and faster, understood? Extrapolating from this, it's obvious mathematics as a whole is taught in the latter way better than the former. To give another, maybe more to the point, example. The differential is defined as such:

"f:E->F is said to be differentiable in x0 if there exists a linear application L0 such that for all x, f(x) = f(x0) + L0(x-x0) + O((x-x0)^2)"

which is all nice and dandy, but how do you go from that to the intuitive understanding of what a differential is? Again, human transmission, not logic but drawings, heuristics. Without these, that's just another definition you'd read, maybe remember, but never really understand the significance of. You might be able to apply it to test if a function is differentiable, but that wouldn't tell you why you'd want to do that.

Anyways, I got a bit off track. As for the definition of culture you were using, it also applies to mathematics and, I imagine, every branch of science.

What I'm trying to make you understand here, is that these things you find obvious are not, and sometimes people don't need help with what to write but rather why they'd write it. That little explanation you gave, though it led me to more questions, actually helped me more than any syntax I might have picked up or knowing what such and such keyword does.
 
Tyvm for the explanation, that actually makes things clearer. The thing I don't understand is how you can even write womething along the lines of:

if(object is of class that implements IDamageable)
call object.TakeDamage()

The interface:
C#:
public interface IDamageable
    {
        void TakeDamage(int dmg);
    }

The classes:

C#:
    public class Person : IDamageable
    {
        public int HP = 100;

        public void TakeDamage(int dmg)
        {
            HP = HP - dmg;
        }
    }
    public class Dog : IDamageable
    {
        public int HP = 100;
        public void TakeDamage(int dmg)
        {
            HP = HP - dmg * 2;
        }
    }

Example:
C#:
            Person John = new Person();
            Dog Dog = new Dog();

            object[] stuff = new object[] { John, 5, Dog, "Blabla" };

            foreach (var obj in stuff)
            {
                if (obj is IDamageable damageableObj) damageableObj.TakeDamage(10);
            }

            Console.WriteLine(John.HP); // 90
            Console.WriteLine(Dog.HP); // 80
 

Cool, thanks, so that confirms the fact that objects in C# can have multiple types. For instance John is Person but also object. Seen as object, you can check if it implements TakeDamage(), but if you assume it's Person, it's obvious from the get-go it does.

So the opposite code

C#:
if ( !(obj is IDamageable damageableObj) ) damageableObj.TakeDamage(10);

also compiles but throws an exception or equivalent at run-time? As in, damageableObj would be null and calling TakeDamage on it would be illegal?
 
Nunu, I understand your frustration, trust me - I really do.

I also started out with modding, both with Lua and Python and while I absolutely love Lua(and absolutely despise Python). C# really isn't that bad, I know it's frustrating from the start and it all seems confusing - I've been there myself.

But in all honesty I think your problem is going full ham into it instead of starting small and working your way up. Most of us here are very happy to try and help in whatever way we can.

Using C# is definitely a move in the right direction as modding will be far, far more versatile. Hell, we can already tweak and change core mechanics of the game very easily with the use of Harmony - and modding isn't even close to fully supported yet. It will only get better.



As for those of y'all comparing Bannerlord to UDK/UE4 and Unity? Really, what are you guys smoking? You're comparing a proprietary game engine initially made by a rather small team to massive powerhouse engines that are specifically designed to offer developers modern toolsets to spit out a whole plethora of various games. Those aren't even remotely comparable.

Game engine development takes years upon years of research and development. It's sad because those developing the game's engine rarely get the praise they deserve. This is probably why it has taken so long for TW, having to more or less re-create their game engine to support more modern features, a better scripting language and to also make it actually moddable.
 
Cool, thanks, so that confirms the fact that objects in C# can have multiple types. For instance John is Person but also object. Seen as object, you can check if it implements TakeDamage(), but if you assume it's Person, it's obvious from the get-go it does.

So the opposite code

C#:
if ( !(obj is IDamageable damageableObj) ) damageableObj.TakeDamage(10);

also compiles but throws an exception or equivalent at run-time? As in, damageableObj would be null and calling TakeDamage on it would be illegal?
I believe it doesn't compile, since the variable "damageableObj" should not be defined in this case.
expr is type varname

Where expr is an expression that evaluates to an instance of some type, type is the name of the type to which the result of expr is to be converted, and varname is the object to which the result of expr is converted if the is test is true.
(...)
If expr is true and is is used with an if statement, varname is assigned within the if statement only. The scope of varname is from the is expression to the end of the block enclosing the if statement. Using varname in any other location generates a compile-time error for use of a variable that has not been assigned.
(C# docs for "is" keyword)
 
Last edited:
if(object is of class that implements IDamageable)
call object.TakeDamage()

given the object might not have such a method, the second line would be illegal, right ? Coming from C++ for example, a class either has TakeDamage(), which is known at compile time, or it doesn't. Here you're telling me these things aren't known at compile time but at run time? Or what you mean is you don't actually write the if, but the interface acts as a collection of types, and the compiler checks that the object is instantiated from a class that belongs to a collection of types that has TakeDamage()? Also how can a method perform on variable-typed objects ? I thought variables were typed. In that case the method that calls TakeDamage() has a Chair argument and just calls Chair.TakeDamage(), right?

From the top of my head.

C#:
// Whatever your Game starts with....
public class Main
{
    void GameStart()
    {
        // instantiate two objects and make the former 'collide' with the latter.
        Weapon sword = new Weapon();
        Character dude = new Character();
        sword.Collide(dude);

        // now make the sword collide with the Axe just for the sake of it.
        Weapon axe = new Weapon();
        sword.Collide(axe);
    }
}

// A base class to inherit from, just incase our objects need to share variables (position, rotation, what have you).
public class GameObject
{

}

public interface IDamagable
{
    void TakeDamage(int damage);
}

public class Weapon : GameObject, IDamagable
{
    public int durability = 100;
    public int cutDamage = 1;

    // Pointer to the interface.
    IDamagable damagable;

    void Collide(GameObject other)
    {
        // If the other GameObject implements the interface...
        if (other is IDamagable)
        {
            // Assign the interface pointer to the GameObject class.
            damagable = other;
            damagable.TakeDamage(cutDamage);
        }
    }

    public void TakeDamage(int damage)
    {
        durability -= damage;
    }
}

public class Character : GameObject, IDamagable
{
    int health = 100;

    public void TakeDamage(int damage)
    {
        health -= (damage*2);
    }
}

EDIT: No override for interface method implementations.

You might be able to apply it to test if a function is differentiable, but that wouldn't tell you why you'd want to do that.

In the context of Mathematics applied to computation, it's clear how you'd want your function to perform: You've got resources that dictate the standard of efficiency, it's not in the abstract, it's problem solving in the context of resource management in the form of bytes. What I formerly meant by 'optimal' is indeed reaching the "ideal" heuristic, as in the function and architecture that best solves your computational problem.

Example: Pathfinding solutions, Dijkstra algorithm vs A*. It's pretty clear which one is most desirable: the optimized one, A*, which is a variant of the former with a better heuristic (as in, it's faster on every pathsolving problem you can throw at it).

I guess your point about culture revolves around learn by practise vs abstract acquisition. Most computational problems have very detailed and efficient approaches documented, it's not Quantum Physics, the litterature is pretty settled, few breakthroughs happen in domain (even the breakthrough of Deep Learning AI is mostly linear algebra being easier to compute thanks to modern hardware and data accumulation), rather small optimization to already existing heuristic approaches and more complex system interconnections.

Hope this helps.
 
Last edited:
Yo @Nunu, I don't know if you do it on purpose but you give off a very hostile attitude to people who are not trying to attack you in any way. you are frustrated and its completely understandable but telling people off because they offer a different perspective is frankly the kind off knee jerk reaction that is not going to help you solve your problem.

learning C# is a pain in the ass if you have to learn it from scratch and also while trying to reverse engineer code from a game that has no support whatsoever. If you really want to mod right now, you'll have to learn C#. I'd advice you to take it out of the bannerlord context and learn it in a more user friendly environment, download Unity engine, go work on some tutorials you'll get a grip on the syntax and as you go you'll get a better understanding of why C# works the way it does, who knows you might even start to like it.

As a game devellopment decision its probably the smartest thing they could have done, its a versatile language that is very optimisable, while being accessible enough for new people (unlike C++, or even C). Every language has its purpose, but the current state of game devellopment doesn't really have a use for surface level languages like Python, you might not like having to do tedious work like declaring if something is a float or an int, but you doing it saves CPU power and memory because your computer doesnt have to do it. and in a micro level yes it feels unnecesary however on a macro, big project level its a make it or break it issue.

Still all the respect for the fact that you started learning this even though its frustrating, I personally got stuck when I started because I kept ****ing up with brackets and then dropped programming for years. which is a shame because I use it pretty regularly nowadays.
 
Back
Top Bottom