Comment by mschuster91

Comment by mschuster91 2 days ago

40 replies

To u/db48x whose post got flagged and doesn't reappear despite me vouching for it as I think they have a point (at least for modern games): GTA San Andreas was released in 2004. Back then, YAML was in its infancy (2001) and JSON was only standardized informally in 2006, and XML wasn't something widely used outside of the Java world.

On top of that, the hardware requirements (256MB of system RAM, and the PlayStation 2 only had 32MB) made it enough of a challenge to get the game running at all. Throwing in a heavyweight parsing library for either of these three languages was out of the question.

Magma7404 2 days ago

The comment reappeared, and while you're right about using proper libraries to handle data, it doesn't excuse the "undefined behavior (uninitialized local variables)" that I still see all the time despite all the warning and error flags that can be fed to the compiler.

Most of the time, the programmers who do this do not follow the simple rule that Stroustrup said which is to define or initialize a variable where you declare it (i.e. declare it before using it), and which would solve a lot of bugs in C++.

  • trinix912 2 days ago

    While it doesn't excuse the bad habits, we do have to keep in mind C++98 (or whatever more ancient was used back then) didn't have the simple initializers we now take for granted. You couldn't just do 'Type myStruct = {};' to null-initialize it, you had to manually NULL all nested fields. God forbid you change the order of the variables in the struct if you're nesting them and forget to update it everywhere. It was just considerably more practical to do 'Type myStruct;' then set the fields when needed.

    • badc0ffee 2 days ago

      You could always `bzero` or `memset` the entire struct to 0.

      • trinix912 2 days ago

        But only if it contains strictly POD members, otherwise it's UB.

    • mrighele a day ago

      I haven't been using C++ for a number of years but I think you could set the default values of fields even back then. Something like

          struct test {
              int my_int = 0;
              int* my_ptr = std::nullptr;
          };
      
      Or is this something more recent ?

      You cannot initialize them with a different value unless you also write a constructor, but it not the issue here (since you are supposed to read them from the file system)

      • MrRadar a day ago

        That's C++11 syntax. Before then you'd have to manually initialize them in every constructor, with a hand-written default constructor as a minimum:

            struct test {
                int my_int;
                int *my_ptr;
                
                test() : my_int(0), my_ptr(NULL) {}
            };
  • Yeask 2 days ago

    And it did not matter at all. The game shipped and was a success.

    • ryandrake 2 days ago

      This is the thing that drives artists and craftsmen to despair and drink: That a flawed, buggy, poor quality work can be "successful" while something beautiful and technically perfect can fail.

      • soulofmischief 2 days ago

        San Andreas might be rough under the hood, but on the surface it was nothing short of a masterpiece of game design. The engine was so complex and the cities felt alive, and the game could handle a lot of general nonsense. Still one of my favorite go-to games.

      • butlike 2 days ago

        The job of the artist is to take the years of expertise and distill it down into something "enjoyable." The hardest mental hurdle to get over is that people just don't care about the technicals being perfect. Hell, the final product doesn't even need to be beautiful; it just needs to be arresting.

        • RHSeeger 2 days ago

          Heck, sometimes the thing that's most interesting about a work is people arguing over whether or not it's art.

      • RHSeeger 2 days ago

        One artist can take months painting a picture of a landscape where everything is perfect. And the next artist can throw 4 colors of paint at a wall. The fact that lots of people enjoy the work of the second artist doesn't invalidate the work of the first. The two artists are focusing on different things; and it's possible for both of them to be successful at reaching their goals.

      • Yeask a day ago

        Some artist also think "is mot music because it has no guitars".

        The standars "artist" have are atificial and snoby.

        How can Deadmau5/whatever EDM artist sell so much?

    • usefulcat a day ago

      Let's be clear that it was a success very much in spite of UB, not because of it. And there was still a cost--likely at least hundreds of person-hours spent fixing other similar bugs due to UB (if not more).

      I worked in gamedev around the time this game was made and this would have been very much an ordinary, everyday kind of bug. The only really exceptional thing about it is that it was discovered after such a long time.

      • [removed] a day ago
        [deleted]
  • mschuster91 2 days ago

    > it doesn't excuse the "undefined behavior (uninitialized local variables)" that I still see all the time despite all the warning and error flags that you can feed to the compiler.

    Yeah but we're talking about a 2004 game that was pretty rushed after 2002's Vice City (and I wouldn't be surprised if the bug in the ingestion code didn't exist there as well, just wasn't triggered due to the lack of planes except that darn RC Chopper and RC plane from that bombing run mission). Back then, the tooling to spot UB and code smell didn't even exist or, if at all, it was very rudimentary, or the warnings that did come up were just ignored because everything seemed to work.

db48x 2 days ago

You’re not entirely wrong, but a library doesn’t have to be “heavyweight” in order to be bulletproof. And you can load the library during startup and then unload it after; it doesn’t have to stick around for the whole run time of the game. Modern OSes will reclaim the pages after you stop using them, if there is memory pressure. Of course the PS2 didn’t do that I am sure.

  • rfoo 2 days ago

    Meanwhile, in a certain modern OS, unloading a library is too broken to the point that people are discouraged to do so... Try to unload GLib [0] from your process :p

    [0] https://docs.gtk.org/glib/

    • wat10000 a day ago

      Unloading C libraries is fundamentally fraught with peril. It's incredibly difficult to ensure that no dangling pointers to the library remain when it's unloaded. It's really fun to debug, too. The code responsible for the crash literally is not present in the process at the time of the crash!

bluedino 2 days ago

Why weren't binary files used like I would expect in the 1990's DOS game? fread into a struct and all that

  • epcoa 2 days ago

    By the 2000s, portability was a concern for most titles. Certainly anything targeted at a rapidly changing console market back then.

    • coldpie 2 days ago

      Definitely, and architectures back then were far less standardized. The Xbox 360 was a big-endian PowerPC CPU, the PS2 had a custom RISC-based CPU. On the desktop, this was still the era of PowerPC-based Macs. Far easier (and I would argue safer) to use a standard, portable sscanf-like function with some ascii text, than figure out how to bake your binaries into every memory and CPU layout combination you might care about.

  • CamouflagedKiwi a day ago

    Easier for internal development. Non- or less technical team members can tweak values without having to rebuild these binary files. Possibly also easier for lightweight modding externally as well.

    This isn't that uncommon - look at something like Diablo 2 which has a huge amount of game data defined from text files (I think these are encoded to binary when shipped but it was clearly useful to give the game a mode where it'd load them all from text on startup).

  • mrguyorama a day ago

    Video games are made by a lot of non-programmers who will be much more comfortable adjusting values in a text file than they are hex editing something.

    Besides, the complaint about not having a heavyweight parser here is weird. This is supposed to be "trusted data", you shouldn't have to treat the file as a threat, so a single line sscanf that's just dumping parsed csv attributes into memory is pretty great IMO.

    Definitely initialize variables when it comes to C though.

[removed] 2 days ago
[deleted]
PhilipRoman a day ago

Wow I had no idea YAML was that old. I always thought it was created some time around when CI/CD became popular. Now I'm really curious how it ended up as a superset of JSON.

ceejayoz 2 days ago

Vouching seems to be time-lagged and require more than one.

[removed] 2 days ago
[deleted]
[removed] 2 days ago
[deleted]
kevin_thibedeau 2 days ago

The flaw isn't the language. The issue is a 0.5x programmer not knowing to avoid sscanf() and failing to default and validate the results. This could be handled competently with strtok() parsing the lines without needing a more complicated file format.

  • butlike 2 days ago

    Worked fine on the target machines and the "0.5x programmer" got to see their family for winter holiday. Or are you saying they should have defensively programmed around a bug manifesting 21 years later and skip seeing their family during crunch time?

    To be honest, I just don't like how you disparaged the programmer out-of-context. Talk is cheap.

    • db48x 2 days ago

      Using a well–written third–party library would not increase the development time; it would in fact reduce it. No risk of missing Christmas there.

      • trinix912 2 days ago

        Well-written 3rd party serialization libraries weren't exactly easy to come by 20 years ago, at least from what I can recall. Your best bet was using an XML library, but XML parsing was quite resource heavy. Many that seemed well designed turned out to be a security nightmare (Java serialization).

  • danbolt a day ago

    I’ll be the first to defend the greybeards I’ve befriended and learned from in AAA, but having seen codebases of that age and earlier, the “meta” around game development was different back then. I think the internet really changed things for the better.

    Your average hire for the time might have been self-taught with the occasional C89 tutorial book and two years of Digipen. Today’s graduates going into games have fallen asleep to YouTube lectures of Scott Meyers and memorized all the literature on a fixed timestep.

    • fragmede a day ago

      Otoh, the Internet has meant that nothing is ever finished, there's always an update to download.