• 2 Posts
  • 323 Comments
Joined 3 years ago
cake
Cake day: June 15th, 2023

help-circle





  • Someday I have to replay the trilogy. All four parts.

    The games are great - though there are two things that urk me. For one, the player character, Rufus, is just unbearable. The other point of critique is the depiction and role of Goal, who, in the first game, is basically the personified damsel-in-distress trope. In the other parts she gets a bit of agency, but she is still frequently portrayed as the victim who needs help. Mostly the victim of Rufus’ carelessness and lack of empathy, by the way (did I mention he is unbearable?). What Rufus causes her to suffer through in the second game, while not sexual, feels really rape-y, and since Rufus is the player character, it hurts having to do this to progress the story. Actually, that is true for most of the things Rufus does - and therefore the player has to do. It is pretty clear that a character will be worse off afterwards, but one has to do it nevertheless. And this repeats again, and again, and again.

    Okay, seems I’ve written myself into rage. This sounds way more negative than the games actually are. In fact, they are really funny, as long as you manage to accept that you play as a less-than-likeable anti-hero. It’s a bit like Untitled Goose Game, though the consequences of Rufus’ actions tend to be much worse. Still, if you want to have fun with Deponia, you need to approach it with the same mindset: Lighthearted fun, usually at the (sometimes severe) costs of an NPC.





  • I think you have done way more work than would be needed to learn Rust. I mean, it certainly is useful knowledge if you want to do any of those things in Rust, but it’s definitely not needed to learn Rust.

    The Book (the Rust language guide) assumes that you know some other language first, but you don’t need to be an expert in anything in order to start learning Rust. If you understand the basic concepts of branching, loops, recursion and function calls, you are good to go.

    There are of course other concepts you will encounter in Rust (like Algebraic Data Types, Polymorphism, Ownership,…), but those are all explained in the Rust Book, so there really is no need to learn them in advance.


  • Also an “encrypted email host” needs to process the metadata in order to deliver the mail. For mail that needs to be sent to a different server, the receipient’s mail address needs to be decrypted in any case. Even for mail that has a local receipient there is as far as I know (beware: not an expert) no server software that can do this without decrypting the metadata first.

    The connection between the sender/receipient and their respective mail server is encrypted (with any decent mail hoster, at least - and both users can check the encryption in their mail client), so the metadata isn’t publicly readable during this connection.

    Server-to-server communication is a different story though… This could in theory be unencrypted (it almost always is encrypted though), and as a user one needs to trust one’s mail hoster and the mail hoster of the receipient that they support encryption for server-to-server messages…

    Still, I don’t think there is much to gain by adding yet another layer of encryption to the metadata. In the end it’s just going to be encrypted metadata in an encrypted connection, where the same parties have decryption keys for both, the metadata encryption and the encrypted connection…

    With an encrypted message body it’s different, as that’s irrelevant for the delivery of the mail, and therefore no mail hoster needs to be able to decrypt it.


  • The best part is the job opening…

    Actively use and promote AI-assisted development tools to increase team efficiency and code quality

    Probably the boss of the person who had to write the job opening demanded they include something about AI, and the person who wrote it decided to turn their sarcasm up to 100. The only way to make it more clear would have been sarcastic casing:

    Actively use and promote AI-assisted development tools to InCrEaSe TeAm EfFiCiEnCy AnD cOdE qUaLiTy




  • The actual writing of course isn’t pure. Loading isn’t either, but we only support loading on level transition, so we can supply the data already when constructing the game state. Saving is done by gathering all the data that should be saved in a struct, what is pure and happens at a well defined point in the frame, where the game state is known to be consistent (-> I think it’s after all systems have been updated), and then this struct is written out to a file.


  • As said, we try to. Not that we managed to reach this ideal in any existing project yet. We did manage to get Auto-Save implemented without affecting the “purity” of computations, but as you said, achievements and analytics are a PITA. I think those are possible with pure computations too, but we did not yet manage to build the game architecture in a way that makes that work. Yet.

    I’m currently on a research project to investigate how much of a game we can move into pure Embedded Domain Specific Languages. So, basically a set of gameplay scripting languages that enforce the “everything that happens during the frame is pure” constraint. Buuut, again, this project is still at its early stages, and under very strict budget constraints, so I cannot say yet if the outcome will be a feasible architecture or not…


  • Every function has side effects and variables will need to be modified in multiple places in the same frame

    We try to avoid exactly that, because it is what caused us man-years of bug-hunting and bug-fixing over our past projects. Our end-goal (that is still very far away…) would be to have the state from the previous frame and the user inputs, do only pure computations based on this data, and write out a new state before rendering the current frame.

    We do use C++ though (because Unreal, and console platforms), what makes this extra hard, because C++ is a language for writing bugs, not for writing software.