[-] soulsource@discuss.tchncs.de 24 points 9 hours ago

It's not "either side". One "side" is making games, the other is screaming slurs.

[-] soulsource@discuss.tchncs.de 6 points 15 hours ago

You have Debian experience? Then stick to it. It may be boring, but boring is good. That means it doesn't need much maintenance, and that it just works.

[-] soulsource@discuss.tchncs.de 17 points 1 day ago

They have done that already. It's called Kylin.

[-] soulsource@discuss.tchncs.de 3 points 2 days ago

Yep. And the worst part is the Fear-of-Missing-Out when disabling them.

Like, there is nothing stopping you from just not doing the kingdom management mini-game, except that nagging feeling that you might actually miss out on some content...

[-] soulsource@discuss.tchncs.de 1 points 2 days ago

Currently? Potionomics. I just wanted something that I can finish quickly, because of the upcoming release of House of Light, but now I am still not done with my play-through, so I kinda cannot start House of Light just yet.

But in a couple of days, as soon as I am done with Potionomics?

House of Light. And that for quite some time, I expect.

[-] soulsource@discuss.tchncs.de 4 points 2 days ago

And the predecessor, Pathfinder: Kingmaker is amazing too.

[-] soulsource@discuss.tchncs.de 3 points 4 days ago

I haven't done much Rust coding this year yet, mainly because I am trying to learn Lean4 and spent the last couple of months writing a (partially) formally validated (but not very fast) Binary Heap in Lean4.

However, a few days ago I had an inspiration at night, that brought me back to my Rust spare time project: The visual novel engine I had started last year.

For now I only did a relatively small change, but it's one that will save me a lot of time (and nerves) later on. I am using a Free Monad based embedded Domain Specific Language for writing the game logic. The change now was to wrap that Free Monad in a State Monad Transformer, which I use to store the game state in.

This idea seems to be working surprisingly well, and that has given me enough motivation to return to this project and to keep developing it further for now.


Long and boring explanation with way too much detail:

Sorry for going on a tangent, but there is a Rust-specific detail that makes this cool beyond the usual advantages of using a State Monad Transformer, and I cannot stop myself from sharing.

For composing a large Free Monad, do-notation is more or less a must-have. However, do-notation in Rust only works well with types that implement Copy. If you want to use any other type in do-notation, you can only access variables of it in the following two lines. An attempt to access the data later will lead to an ownership problem (explained here). I have tried to overcome this by adding additional syntax to do-notation, but that is a crutch at best.

So, this is where the State Monad Transformer comes in. It side-steps this problem by moving the state out of the do-notation block into the Free Monad's Pure-nodes. That way it is readily available via the State Monad Transformer's get()/put() functions, and the "use within two lines" limitation is not a big issue any more, as one can always get the value on one line, do something with it in the next line, and write the result back on the second line.

[-] soulsource@discuss.tchncs.de 26 points 1 week ago

I am not in the position to decide which tech we use at the studio, however, as a Senior my voice is certainly heard when it comes to tech decisions.

And for Unity I can only say: No tech is worth the risk of dealing with such a shady company.

[-] soulsource@discuss.tchncs.de 61 points 1 month ago

I would rather trust GamingOnLinux here:

While it is not in any way officially supported by Valve, they have now released Windows drivers for the newer Steam Deck OLED model.

(emphasis mine)

[-] soulsource@discuss.tchncs.de 31 points 4 months ago

Acquisitions felt kinda cool when Microsoft was dishing them out like nobody’s business prior to the pandemic.

No, it did not. Consolidation usually is bad for employees and customers, and anyone who hasn't been living under a rock for the last 150 years has had plenty of opportunities to observe this.

[-] soulsource@discuss.tchncs.de 29 points 5 months ago

Yes and No.

In the short term the answer is a clear "yes", as it allows players to play nearly all Windows games on Linux without modifications, and game developers to ship their games on Linux without any extra costs.

In the long term it might have a bad effect on the market, as it further helps to cement Microsoft's control over multimedia APIs, since game developers now have little incentive now to target anything other than DirectX...

In this case it's a bit weird though, as the game lists Linux as supported platform, but obviously just ships the Windows build with Proton instead of having a native Linux build that uses open cross-platform APIs.

[-] soulsource@discuss.tchncs.de 49 points 1 year ago

I can only speak out of my own experience, which is mostly C++, C#, C and Rust, but I also know a bit of Haskell, Java, Fortran, PHP, Visual Basic, and, to my deepest regret, also JavaScript.

For additional context: I have been working in game development for the last 7 years, my main language is C++ for Unreal, but I've also worked on some Unity projects with C# as main language. Before I switched to game dev I worked in material science, and used C, mostly. I use Rust for my spare time projects, and the game company I work at is planning to introduce it into our Unreal projects some point later this year.

Of all the languages I mentioned above, (Safe) Rust and Haskell are the only ones that have not yet made me scream at my PC, or hit my head against the desk.

So, some of the reasons why I personally love Rust:

  • Rust is extremely simple compared to the other languages I mentioned above. If you read the official introduction you know all you need to write Safe Rust code.
  • Rust's syntax is elegant. It's not as elegant as Haskell, but it's a lot more elegant than any C-based language.
  • Rust is (mostly) type safe. There are (nearly) no implicit conversions.
  • Rust is memory-safe, without the runtime overhead that garbage collected languages incur.
    • This is a bit of a neutral point though. The Rust compiler will complain if you make mistakes in memory management. Unlike in managed languages, you still need to do the memory management by hand, and find a working solution for it.
  • The memory management model of Rust ("borrow checker") makes data dependencies explicit. This automatically leads to better architecture that reflects dependencies, because if the architecture doesn't match them, development will become an uphill battle against the borrow checker.
  • Due to the borrow checker, you can use references extensively, and rely on the referenced object to valid, and also that it is up-to-date (because it cannot be muted or go out of scope as long as you hold the reference).
  • Traits are an amazing way to abstract over types. Either at zero-cost (static dispatch), or, in the rare cases where it's needed, using virtual function tables.
  • Rust aims to have no undefined behaviour. If it compiles the behaviour of the code is well defined.
    • This, together with the borrow checker, ensures that there are (nearly) no "weird bugs". Where in C++ one quite regularly hits issues that at first glimpse seem impossible, and only can be explained after several days of research on cppreference ("oh, so the C++ standard says that if this piece of code gets compiled on a full moon on a computer with a blue power LED, it's undefined behaviour"), that almost never happens in Rust.
  • Macros in Rust are amazing. There are macros-by-example that work by pattern-matching, but there are also procedural macros, which are Rust functions that take Rust code as input, and generate Rust code as output. This gives you amazing power, and one of the most impressive examples is the Serde serialization framework, that allows you to add serialization to your data types simply by adding an attribute.
  • Tooling for Rust is pretty good. The Rust compiler is well known for its helpful error messages. The rust-analyzer plugin for Visual Studio Code is great too. (It also works with vim, Qt Creator and others, but the but Visual Studio Code works best imho.)

The points mentioned above mostly apply to Safe Rust though. Unsafe Rust is a different story.

This brings us to the downsides. Rust isn't perfect. Far from it, actually. Here are some of the things that aren't great about Rust.

  • No Higher Kinded Types. This is my main issue with Rust. Even C++ has them (as usual for C++ in a horrible un-ergonomic and utterly confusing way). If Rust had Higher Kinded Types, the language could have been simpler still. For instance, there would have been no need for the async keyword in the language itself.
  • Unsafe Rust is hard. In my opinion even harder than C++, because of Rust's aliasing rules. Unlike C++, Rust doesn't allow mutable memory aliasing. That's because mutable aliasing can never happen in Safe Rust, and not supporting it improves performance. This means that when writing Unsafe Rust, one has to be careful about aliasing.
    • Luckily one only rarely needs Unsafe Rust, usually only in order to call functions from other languages. Still, it's hard, and I'd generally suggest to use an automated code generator like cxx.rs for interfacing with other languages.
  • Interior Mutability. I understand why it exists, but it breaks a lot of the guarantees that make Rust a great language. So, my conclusion is that one should avoid it as much as possible.

However, the upsides clearly outweigh the downsides imho.

tl;dr If a (Safe) Rust program compiles, chances are pretty high that it also works. This makes programming with it quite enjoyable.

1

At work we are currently investigating how we could add a reasonably sane optional type for blueprint.

We have modified the native TOptional type heavily, to make it more convenient, by adding Map()/Bind()/Flatten() methods.

Now we would like to add a similarly convenient optional type for Blueprint use.

We have already started working on a UBlueprintCompilerExtension to detect invalid pin connections, but we haven't started on the actual data type itself.

Does anyone know about a plugin that offers this functionality?

Or, alternatively some good resources on how one can write custom Blueprint graph nodes with wildcard pins?

view more: next ›

soulsource

joined 1 year ago