Putting the 'role' back in role-playing games since 2002.
Donate to Codex
Good Old Games
  • Welcome to rpgcodex.net, a site dedicated to discussing computer based role-playing games in a free and open fashion. We're less strict than other forums, but please refer to the rules.

    "This message is awaiting moderator approval": All new users must pass through our moderation queue before they will be able to post normally. Until your account has "passed" your posts will only be visible to yourself (and moderators) until they are approved. Give us a week to get around to approving / deleting / ignoring your mundane opinion on crap before hassling us about it. Once you have passed the moderation period (think of it as a test), you will be able to post normally, just like all the other retards.

Which programming language did you choose and why?

The Avatar

Pseudodragon Studios
Developer
Joined
Jan 15, 2016
Messages
336
Location
The United States of America
C++ is such a mess and terrible for productive game development. Number one reason why I haven't gotten on board with Unreal Engine yet. I have better things to do with my time than recover from crashes or try to parse obtuse compile errors.
 

Krice

Arcane
Developer
Joined
May 29, 2010
Messages
1,387
Which languages have you used professionally (not as hobby)

These days being a "professional" tells nothing. In fact in game development it most likely tells you are a mediocre programmer, if not bad. I have programmed over 30 years and I'm a master level C++ programmer. That's a merit I just gave to myself.
 

Rincewind

Magister
Patron
Joined
Feb 8, 2020
Messages
2,572
Location
down under
Codex+ Now Streaming!
Just curious, how many years have you worked in large development teams professionally? Which languages have you used professionally (not as hobby) to be so sure about your assessment of the merits of C++? Also, have you read the book or do you have any idea what's in it?

20 years of professional work in videogames there, games, 3D engines, and emulators, millions of units shipped (PC and consoles).
And most of it in C++ because it's the industry standard. It's a kludge though, and I dislike what they're trying to do now.
They're trying to recover some errors from C++98 but it's a bit late IMO. It's time to move to Rust or Ada for instance :)

If I had to do an indie game myself and if I didn't have to take portability, consoles and performance into account, I'd go for a Lisp, maybe Racket.
Because you have very high expressivity, you can easily build a DSL for your game, you have lots of documentation, a good FFI and a decent performance.

These are words of wisdom, we are in full agreement. The thing is, pretty much everybody comes to the same conclusion after using C++ in anger for prolonged periods of time in non-toy hobby projects. It can be a practical choice for many reasons in a commercial context (availability of devs, tooling, libraries, etc.) but mainly because of inertia, not because of the inherent good qualities of the language. Usually the argument is that the cost of switching the whole team to something else is just not worth it for say 30-50% increase in productivity (although that's really hard to quantify). I have met very few experienced C++ coders who don't have at least *some* serious grudges against the language.

The biggest problem with C++ is that it tries to maintain low-level control just like C, but it also tries to be a multiparadigm high-level language, albeit not very successfully compared to other better options (LISP, Scheme, Haskell, Smalltalk, Scala, hell even Lua and Java). So in the end it's just not high-level enough to make development a joy, while the extra features over C make reasoning about low-level code often problematic. Hence, most sensible people just use C++ for the engine or other performance critical tasks nowadays, everything else is written in something more pleasant and productive. Writing an entire game in C++ makes very little sense nowadays, and if you're not doing anything performance critical, ditching C++ altogether is probably your best bet.

I also love the Lisp family of languages, they take fluid interactive development to a whole new level with the REPL. It's a bit like seeing the light for the first time for people who are used to the regular compile/run/test cycle (it certainly was a life-changing experience for me). People are really trying to approximate this modify-at-runtime experience (whether consciously or not) with all these DLL reloading tricks and embedding Lua or some other scripting language for the game logic (but it's a far cry from the promised land of LISP).

For the record, I have 17 years of commercial experience myself, mostly Scala/Java in the last 10+ years for SaaS companies. Much less C++, mostly converting legacy C++ code to Java, but I have used it long enough to develop a distaste for it. I started out with C and x86 assembly, so I've done my share of low-level coding. In my hobby projects I'm currently using Nim as a C substitute (it's actually much more than that, but ultimately it transpiles to C), otherwise I'm just playing around with LISP/Scheme and the likes.
 

Rincewind

Magister
Patron
Joined
Feb 8, 2020
Messages
2,572
Location
down under
Codex+ Now Streaming!
Which languages have you used professionally (not as hobby)

These days being a "professional" tells nothing. In fact in game development it most likely tells you are a mediocre programmer, if not bad. I have programmed over 30 years and I'm a master level C++ programmer. That's a merit I just gave to myself.

I won't take time to refute these claims because you're obviously a hobbyist (no disrespect, just an observation). Just some advice in the friendliest way, please don't get it the wrong way: always keep an open mind and spend some time getting familiar with different tools and approaches to development (and to everything in life, really), then you can really compare and judge their merits appropriately. You don't need to defend C++ or anything, I'm not taking it away from you. They're just tools, they're not an extension you. Don't be attached to them.

Just approach new things with an open mind and be curious. Who knows, you might even learn something interesting that you'd enjoy, maybe enjoy even more than your current tools? Would that be a bad thing? You won't know until you tried.
 

Stormcrowfleet

Aeon & Star Interactive
Developer
Joined
Sep 23, 2009
Messages
1,034
I'm new in this domain (changing career in my 30s). Started coding schools and all. Learning Java and OOP. My question is general: why some of you have problem with OOP in general or C++ in specific ? I'm genuinely curious. After reading this here a couple of hours ago I went and searched the internet for more on this to learn about that point of view. I'm just a beginner so a lot went over my head, or some of it was just vitriol tbh and had no real arguments. To me, programming paradigm (at my level) are just ways to tackle on problems with a specific set of tools (which of course, will lend to types of solutions). I don't see why this or that paradigm would be "dangerous" or not. Also, what would be the alternative ? I'm saying again, just to be sure: I'm 100% curious and genuine about those questions, I don't know enough to judge anything or anyone.
 

Rincewind

Magister
Patron
Joined
Feb 8, 2020
Messages
2,572
Location
down under
Codex+ Now Streaming!
You have a very healthy attitude towards the topic, my friend, so let me offer my perspective. It would be interesting to see other experienced folks such as Tramboi to chime in as well.

As a foreword, explaining all this is a bit tricky, because what I'm gonna tell you is based on 20+ years of coding experience (17 of which is coding 8 hours a day professionally). So many of the finer points wouldn't make too much sense until you actually experienced them in practice yourself. You know, like reading books about riding a bicycle vs actually riding it yourself. Many things look good on paper, sure, but the pain points become only obvious if you actually the use the tool day in, day out.

First, of all, if you're just starting out, you cannot go wrong with learning Java and the Java-brand of OOP first. You just gotta learn the main concepts of programming first and a wide variety of languages are fine for that. Depending on your goals, however, you might want to branch out/move on to other languages that might make development easier, more fun, quicker and so on. And there are so many factors to consider, for example:
  • are you going to do this professionally? (because then there might be a language that you just have to use in a particular field or industry, whether you like or not, so you must learn that to get employed)
  • are you just doing this for fun in your spare time? (then you can pick pretty much anything)
  • what sort of program are you intending to write? (you'd pick different languages for server-side development, different languages for performance-critical tasks, etc.)
  • how are you going to distribute your program? (if at all) (if you need to produce native executables, that restricts your choice of languages quite a bit)
  • availability of tools, learning materials, libraries, etc.

OOP

Okay, so one of the problems with "mainstream OOP" is how it's implemented in Java and C++ and many other mainstream languages is actually a gimped version of the original vision of "object-orientedness". The original idea of building your program as objects that talk to each other via messages is coming from Smalltalk, which is an old dynamic language. But that's quite different to how OOP is realised in C++ and Java and the likes. C++ has evolved out of C, then Java out of C++, and their version of OOP is basically realised via method calls (objects in C++ are really just C structs, plus some dynamic dispatch VTABLE of function pointers for runtime polymorphism, and Java is quite similiar), whereas in Smalltalk-like languages it's more like objects having little "mailboxes" where they receive messages from other objects and then decide what to do with those messages. (As a side-note, OOP as realised in Objective-C is much closer to the "original true spirit" of using objects and is quite a joy to use. There's many other things to dislike about it, sure, and it's ultimate a hack on top of C, but their dynamic message passing OOP implementation is still quite nice).

A fun fact, the original inventor of OOP is quite horrified by how his idea of OOP was implemented in C++/Java etc., he has expressed this numerous times that this is definitely not what he had in mind. Gosling, one of the main inventors of Java has also said it many times in interviews when asked what would he do differently if he had a chance to re-design Java: "I would leave out the objects" (I'm paraphrasing).

Now, this doesn't mean, of course, that the Java/C++ brand of OOP is totally worthless and garbage; it has been proven to be actually quite useful to tackle certain types of problems. The prime examples are simulations and graphical user interfaces. Well, and because many (most?) games are about simulating a large number of various entities interacting with each other, OOP is kind of a good fit there. But OOP is not a *generally* useful paradigm for solving all sorts of programming problems, it's important to keep that in mind.

Once you've learned the basics of Java, I really recommend going through the Effective Java book. It teaches you how to use the Java-styled OOP the best possible way, while also highlighting problems and common OOP pitfalls. It's really a goldmine of useful information and it's meant for the working programmer, it's 100% practical advice. Most of the concepts presented in the book are applicable to C++, C#, Python or any other language that uses the C++/Java style of OOP. It contains invaluable tips and best practices about mutability vs immutability, correct API design, serialisation, etc. that are generally applicable to programming in any language. It's a quite dense book and most of it just wouldn't make much sense for beginners, it's more aimed at intermediate level devs who have encountered the problems presented in the book in real-life already. But when you're ready, it will take you to the next level as a developer, trust me.

C++

C++ is a strange animal... First of all, unless you really must use C++ for some reason (e.g. developing for consoles where you just have to interact with SDKs written in C/C++), it's almost invariably the wrong choice for new projects nowadays. The language just contains too much cruft accumulated over decades, it's overly complex and tedious to use, especially as a beginner. You can spend many years just learning the intricacies of C++, which of it's many features are actually useful, etc etc.

The reason why it's still used is because it's quite ubiquitous, you can compile C++ for every imaginable hardware to produce standalone executables and it's low-level enough so there's usually a way to utilise any low-level feature that the OS and the CPU provides (e.g. using SIMD vector instructions which you cannot easily use (or at all) in Java, C#, JavaScript and other high-level languages). You can do your own memory management in C++ (well, you must), which can be a huge advantage or a huge disadvantage, depending on your needs. In most high level languages you cannot really influence how memory is allocated/freed or in what pattern; it turns out with modern CPU this can have serious performance implications. So people writing high-performance 3D engines, ray-tracers, video encoders, scientific software that need to utilise the CPU/memory system to the maximum often just bite the bullet and use C++ because they simply just need the low-level access. But as I said, the language is tedious to use compared to other high-level languages readily available nowadays, so what most people resort to is to write just a small performance critical core in C++ and the rest in some much more productive and pleasant to use high level language. A very typical combo for game development is C++ for the 3D engine and Lua for everything else. For non-AAA 3D games or 2D games you don't even need C++, you can most likely get away with just using Lua or some other high-level language.

In short, in 2020, if you're just starting out, learning C++ is a not a good investment of your time, unless you're absolutely sure you will need it (e.g. you want to become an engine-developer in the gaming industry). If I were you, I'd just learn some basic/intermediate C as it's always useful to know how things work under the hood with pointers, how is the memory laid out, etc. A good way to think about C is as a cross-platform high-level assembly language. It is kind of timeless and it might come in handy for you because practically all high level languages can interface with native C code, so you could write most of your program in a high-level language and only convert some performance-critical sections to C later, if needed.

To sum up, C++ won't really teach you any high-level programming concepts that other, better high-level languages wouldn't in a much more enjoyable fashion (e.g. no need for manual memory management, no weird crashes when you did something wrong, etc.)

Scheme/LISP

This point might be controversial to some, but I personally strongly believe that if you want to become a really good programmer, you'll need to become at least a bit familiar with Scheme or LISP at some point in your career. Why is that so? Well, most programmers are familiar with the "traditional" ways of writing programs, so you write your source code, compile your program, then test it, then make modifications and repeat the whole cycle. What if I told you that you could modify a program while it's running, experiment with it without having to recompile, replace functions, change variables, basically all that you can imagine (and more!)? It's actually way more flexible than the stuff you can do with a regular debugger, it's really an interactive process that has to be experienced, it's magical.

The truth is, you might never actually get to use Scheme or LISP commercially or even in hobby projects, but just getting familiar with the language sort of rewires your brain permanently (for the better!), it gives you new insights into writing computer programs and you will be able to carry this knowledge over to any language you happen to use in your work.

One of the best ways to get acquainted with Scheme/LISP is in my opinion it the classic "Structure and Interpretation of Computer Programs" MIT university textbook. The full text is available online for free, plus you can watch the original lecture videos from 1986, they're very motivational and contain a wealth of good advice. Also, try to solve all the exercises from the book, if you're just reading it you'd get maybe just 10% of its potential value.

https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html

https://www.youtube.com/watch?v=-J_xL4IGhJA&list=PLE18841CABEA24090

Conclusion

My recommendation to become a well-rounded programmer:
  • continue learning Java, read the Effective Java book when you're ready (you could substitute Java with C#, but you can always pick up the other later, they're not that different)
  • learn at least on dynamic scripting language (Lua is nice, but so is Python)
  • learn C to understand how the machine is really working (beginner/intermediate level is enough, unless you really need to do low-level stuff routinely)
  • get at least a bit familiar with Scheme/LISP to broaden your horizons (!!!)
  • optionally, if you want to do web development, JavaScript is a must (the language is improving and it has some good parts, but it lets you pick up bad habits if you learn it as your first language, so I'd avoid it unless you really need it)
With this foundation you can become productive in pretty much any other mainstream language easily when needed.

And this is long enough already, if you have further questions, just ask!
 

Krice

Arcane
Developer
Joined
May 29, 2010
Messages
1,387
tldr; Yes, these people who are against OOP are funny, because they are so clueless. Most of them use OOP anyway, but not as it was designed. Their view is limited and narrow, just as everything they do and think in their life. If OOP is so bad, why don't they use strict procedural or functional style? Well, don't expect anyone to answer that question. Btw, I don't need any kids to tell me that I have to learn new things, I know pretty much everything about programming in all kind of languages and paradigms.
 

7h30n

Augur
Joined
Aug 14, 2012
Messages
311
Also, I'd like to add that what people most often forget about C++, but is actually a major producitivity killer, are the compile times. In a professional environment when you work on large C++ codebases, this edit-compile-run loop Rincewind mentioned becomes a significant time waster. For example, at my previous job I've actually tracked my work hours spent on compiling, editing and meetings. It turned out compiling took 20% of my work day. So for 8 hour work day, that would amount to around 1.5 hours of doing nothing. This tracked compilation times includes the incremental compilation after small edits, and it simply adds up over time! When I introduced Common Lisp to that company, they were blown away that you can edit and test your program while it is running.

Now, I'm working at another company using Rust, and although it's much better designed than C++, it still has that issue of a terrible edit-compile-run cycle. I'm kind of moving in the direction of not-caring anymore and always keeping a Switch near me so I can just play something while waiting for longer periods.

Rincewind's recommendation are excellent, though I'd emphasize that you really have to grok SICP at some point if you really care about software engineering profession. Also, for any people starting from scratch, I'd just skip Java & C# on Rinceinwind's list, because if you learn C & Python first, you'll have 0 issues learning Java & C# on the fly later if needed.
 

Tramboi

Prophet
Patron
Joined
May 4, 2009
Messages
1,228
Location
Paris by night
Sound advice, Rincewind and 7h30n !

I'd say learn C and ASM to get a sense on how things really work underneath. And learn a very high level language. Recommandations for Scheme and SICP totally make sense (I like to Racket myself).
Both angles will be needed to make you a rounded up programmer.
This said if you won't devote your life to programming, learning only a good HLL is a good tradeoff. Preferably not Python, it has lots of libraries but it brings nothing to the table, so learn it afterwards when you need it.

By the way Rincewind, it still makes sense to have a lot of game logic in C++ if you're making a RTS or Infinifactory :)
A friend who works on such a game in Unity/C# does a lot of GPGPU to work around the limitations of the ecosystem.
I used to love C++ for this unique blend of very low-level code and higher level abstractions but t's became a monster.
Always hated Java, too. JVM + no free functions + no generics (a long time ago).
Shame about the Rust compile times though, but they're getting better, and some software needs the correctness and safety so keep your Switch along mate :)
Or have several checkouts of your project to work on several tasks (I prefer lurking the Codex of course).

Cheers guys, keep on the good code !
 
Joined
Oct 26, 2016
Messages
2,001
Visual Basic 6 is an Object Orientation language with a UI supported tool suite.
It also has features like connecting to databases through ADO to Access.
In addition you have a UI paradigm for programming, where the programmer can lay down objects by simply dragging off a toolbox onto a form and then clicking that object to add functionality. This makes setting up a GUI a breeze!
I would recommend it.
 

Rincewind

Magister
Patron
Joined
Feb 8, 2020
Messages
2,572
Location
down under
Codex+ Now Streaming!
By the way Rincewind, it still makes sense to have a lot of game logic in C++ if you're making a RTS or Infinifactory

Yeah, I can imagine that's true for massive simulations if you need to run them on a console/PC. Although I'd say even in that case D/Rust/Nim would be a nicer alternative, if you can afford to use them. But there's no doubt about the performance aspect, higher-level languages might fall short there.

For server side simulations it's less of an issue though, you can just buy bigger servers. I believe EVE Online still use Stackless Python for that, using green-threads for simulating the game objects (I think they're called fibers in Stackless). Running on a single core, actually, so scaling up is a bit problematic for them :D

Btw, Java is quite barebones, I agree, and I wouldn't like to go back to plain old Java myself either, if I can avoid it... Been doing (mostly) pure-FP server side stuff in Scala for the last 4 years, so it would be a bit of a culture shock :) The newer JVM languages are actually quite nice (Scala, Kotlin, Clojure), they give you first-class functions, closures and all niceties. They're still not LISP/Scheme though :D What I find nice about the JVM is that it provides cross-platform concurrency constructs, OS-threads, async, etc. Plus generally the Java collections library is quite usable and comprehensive (what I really hated about C++ was the STL, gives me flashbacks...) The lack of SIMD support is probably the biggest issue with the JVM, in general.

Nice chat guys!
 

Rincewind

Magister
Patron
Joined
Feb 8, 2020
Messages
2,572
Location
down under
Codex+ Now Streaming!
Also, for any people starting from scratch, I'd just skip Java & C# on Rinceinwind's list, because if you learn C & Python first, you'll have 0 issues learning Java & C# on the fly later if needed.

I agree with this, C & Python is a better combo. I just didn't want to confuse the OP too much, I assumed he's already on his way learning Java etc, so might as well then continue with it.
 

Rincewind

Magister
Patron
Joined
Feb 8, 2020
Messages
2,572
Location
down under
Codex+ Now Streaming!
your odds of getting to pick what language/tools you get to use on anything but a hobby project are near zero tbh

So true. And if you're doing it as a carreer in programming, then you want continuity in your CV, not jumping from one language to another every few years. Well, that's the reality of it...
 

ChaDargo

Arcane
Joined
Feb 19, 2018
Messages
425
Location
Texas
I'm a newb at programming, going back to school for a BS in comp sci. In my spare time I study this:

https://htdp.org/2018-01-06/Book/

Also thinking of learning C, just as a foundation in something that is ubiquitous. Anyone think I should just focus on Lisp/Scheme/Racket?
 

Rincewind

Magister
Patron
Joined
Feb 8, 2020
Messages
2,572
Location
down under
Codex+ Now Streaming!
I'm a newb at programming, going back to school for a BS in comp sci. In my spare time I study this:

https://htdp.org/2018-01-06/Book/

Also thinking of learning C, just as a foundation in something that is ubiquitous. Anyone think I should just focus on Lisp/Scheme/Racket?

If I absolutely had to narrow it down to two languages, I'd say learn C and Scheme. Heard good things about HTPD but haven't read it myself. You can't go wrong with SICP though, I highly recommend it, it's mandatory content if you're serious about this programming business :)

I recommend this for C, a classic:

https://www.amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628
 

ChaDargo

Arcane
Joined
Feb 19, 2018
Messages
425
Location
Texas
I'm a newb at programming, going back to school for a BS in comp sci. In my spare time I study this:

https://htdp.org/2018-01-06/Book/

Also thinking of learning C, just as a foundation in something that is ubiquitous. Anyone think I should just focus on Lisp/Scheme/Racket?

If I absolutely had to narrow it down to two languages, I'd say learn C and Scheme. Heard good things about HTPD but haven't read it myself. You can't go wrong with SICP though, I highly recommend it, it's mandatory content if you're serious about this programming business :)

I recommend this for C, a classic:

https://www.amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628

I've spent hundreds of hours researching this topic, and I came to the conclusion to learn Racket (via DrRacket and HTDP) and to learn C. I'm using C Programming, a Modern Approach. SICP was too comp sci oriented for me. HTDP actually gets me programming and solving puzzles in a beginner version of Racket. They call it BSL (beginner student language). As you progress, they open up the language to be more hands-on. It's absolutely the most amazing thing I've ever seen, but I'm just a newb lol
 

Tramboi

Prophet
Patron
Joined
May 4, 2009
Messages
1,228
Location
Paris by night
I've spent hundreds of hours researching this topic, and I came to the conclusion to learn Racket (via DrRacket and HTDP) and to learn C. I'm using C Programming, a Modern Approach. SICP was too comp sci oriented for me. HTDP actually gets me programming and solving puzzles in a beginner version of Racket. They call it BSL (beginner student language). As you progress, they open up the language to be more hands-on. It's absolutely the most amazing thing I've ever seen, but I'm just a newb lol
You can't go wrong with those, man !
You're on the right tracks to become a good programmer :bro:

HTDP is a good book and I have lots of respect for the authors.
 
Last edited:

Rincewind

Magister
Patron
Joined
Feb 8, 2020
Messages
2,572
Location
down under
Codex+ Now Streaming!
SICP was too comp sci oriented for me. HTDP actually gets me programming and solving puzzles in a beginner version of Racket.

Yeah, SICP is comp sci and maths heavy, true, which might put some people off. You can always pick it up later if you want to. You have chosen a solid path forward and it's important that you enjoy the process, so yeah, stay curious and have fun! :)
 

Arbiter

Scholar
Joined
Apr 22, 2020
Messages
2,555
Location
Poland
Now, I'm working at another company using Rust, and although it's much better designed than C++, it still has that issue of a terrible edit-compile-run cycle. I'm kind of moving in the direction of not-caring anymore and always keeping a Switch near me so I can just play something while waiting for longer periods.

Rust is a nice language, but it appears that it failed to achieve mainstream adoption. It might go the way of D, which was also a better language, but failed to build a critical mass in the industry. C++ is also incorporating some features from Rust, e.g. move semantics. Look at JVM: newer languages like Groovy, Scala, Kotlin are more pleasant to work with, but much less popular. Java remains relevant by simply adopting best features from those languages.
 
Joined
May 19, 2018
Messages
415
Been having a blast learning python and C++. Honestly, I started with those two because Python is just fun to learn, has that tangible sense of progress; C++ Primer’s syntax “just clicked”.
 

Urthor

Prophet
Patron
Joined
Mar 22, 2015
Messages
1,877
Pillars of Eternity 2: Deadfire
Also, for any people starting from scratch, I'd just skip Java & C# on Rinceinwind's list, because if you learn C & Python first, you'll have 0 issues learning Java & C# on the fly later if needed.

I agree with this, C & Python is a better combo. I just didn't want to confuse the OP too much, I assumed he's already on his way learning Java etc, so might as well then continue with it.

I did Python first, honestly it was a really shit idea and I learnt an awful lot more when I went to Java even though Python pays my rent these days.

C would probably work, being a hipster in Kotlin or Rust would probably work as well, but I am a huge recommender that the absolute first thing a learner programmer programs is in a typed language.

If you don't do your Hello World/Fizzbuzz in a typed language Python isn't going to make sense because a lot of debugging is tracking what type a variable has mentally, you'll be screwed no matter how easy Python is to read.

Been having a blast learning python and C++. Honestly, I started with those two because Python is just fun to learn, has that tangible sense of progress; C++ Primer’s syntax “just clicked”.

Getting up a head of steam with a programming book is worth its weight in gold yeah, don't let that go it's so hard to get a good rhythm.
 

Arbiter

Scholar
Joined
Apr 22, 2020
Messages
2,555
Location
Poland
I am using C++ for my game engine. I have not decided what to use for game logic and UI. I would like to use multithreading in game logic, which rules out many scripting languages.
 

As an Amazon Associate, rpgcodex.net earns from qualifying purchases.
Back
Top Bottom