[HN Gopher] Show HN: I wrote my own RTS game engine in C ___________________________________________________________________ Show HN: I wrote my own RTS game engine in C Author : epermyakov Score : 685 points Date : 2021-05-12 16:44 UTC (6 hours ago) (HTM) web link (github.com) (TXT) w3m dump (github.com) | ghostbrainalpha wrote: | Do you develop this game on Twitch at all? I'd love to watch the | work being done. | optymizer wrote: | As someone who's working on his own game engine in C, I applaud | you for releasing an engine, a game and with such great code | quality! | | Thank you for open sourcing it as well. I've already learnt a | thing or two by skimming the code. | geniium wrote: | Well done! Very nice to see that this is still possible :) | Rendello wrote: | I love the wooden AT-AT. | kleer001 wrote: | I think that's Babba Yaga's house with chicken legs. | Andrew_nenakhov wrote: | It got two legs, so it's more like AT-ST | logical_proof wrote: | There is an AT-AT right next to them. | mouldysammich wrote: | This is very cool, In my head, writing a game engine seems like | one of the real 'final frontier' projects -- an os, a | compiler/language, a game engine all feel like similar levels of | project insane complexity with limitless scope. | | Every time I've attempted even the basics of graphics programming | I very much get scared off when it doesnt click quickly (if | anyone has tips on how to get into it, it would surely be | appreciated :)) | idiotsecant wrote: | Sometimes I feel like i'm an untalented, unproductive waste of | oxygen. | | Then I see a post like this and know for sure that I am. | [deleted] | AnIdiotOnTheNet wrote: | Eh, yeah, it can feel like that, but the probably reality is | that you just have different priorities in life. Especially as | you get older and it starts to sink in how finite your time is, | you can't let yourself be fooled into thinking you _have_ to | accomplish certain things to be worthy. | | I program, rock climb, ride bikes, and write. For any given one | of those I can easily find 10,000 people who are more | accomplished than I am and often at a younger age. I accept | that I will never be that good at any of them, not because I | _can 't_ be, but because I don't want to invest that much of | myself into one of them. There's nothing wrong with that. | weerd wrote: | Don't discount the creativity, intelligence, and dedication | it takes to create something like this. Chances are you | actually _can 't_, even if you did make it a priority. | ironmagma wrote: | Nonsense. Sure, they wouldn't make this exact game, but | neither would the entire rest of the population who is | capable of making a project like this. Most people are | roughly the same in terms of physical and mental | capability, and if you need to convince yourself of that, | think about how fast a computer can do an arbitrary thing | versus how fast a human can, or how different a mouse's | musical intellect is from a human's. | oogabooga123 wrote: | > Most people are roughly the same in terms of physical | and mental capability | | This is a story we stop telling kids around the end of | high school. We tell this story because, as a child, | being told you're dumb can stunt intellectual growth, or | being told you're not physically capable can stop kids | from forming a habit of exercising. | ironmagma wrote: | I don't mean it in the way it's sometimes expressed as, | "you can train anyone to do anything," I mean it in the | sense that the 50%ile capable person is really all things | considered, not that different from the 95%ile capable | person. The range is just not that high. A person can | only accomplish so much in the day and with the animal | body we are given. Compare that to a computer, which for | many tasks, can accomplish things at a rate 10,000,000 | times faster than a human. | oogabooga123 wrote: | > I mean it in the sense that the 50%ile capable person | is really all things considered, not that different from | the 95%ile capable person. | | You must be living on a different planet from me. I can | kind of see how someone might be tempted to just say "you | know what, you're right" and let you keep on thinking | that, though. | ironmagma wrote: | Maybe it's born out of all these times I've seen "10x | engineers" hired, or "very senior" managers who will | "change everything." There's just not that much that one | human can do that is fundamentally different from what | the median human can, so these hires are almost always | overblown. | fao_ wrote: | Both my parents are MENSAns. I agree with the parent | poster, there isn't specifically anything special about | being a 95%ile, and most of the members of the 95%ile | that have joined MENSA aren't massively successful, any | more than anyone on the middle of the bell curve. | | It's not, what you have. It's what you do with it. I | struggle with some things my parents find easy, vice | versa, most of the 95%ile that I know have various mental | health problems or other hidden disabilities that make | daily life difficult -- especially achieving something | like this. | | And Feynman went far with being just an ordinary person | supposedly slightly lower on the bell curve. | | The only thing that actually tangibly matters is | dedication and sweat, and how much time and effort you're | willing to put in to something. | | edit: of course, that's not to outright say that an IQ | test or _however you want to measure cognitive "capital"_ | isn't valuable in some aspect -- it does measure | _something_ , after all. Less fighter pilots died in | training once they started selecting using early IQ tests | (Source is a psych book from the 80s I skimmed a few | years back :P). But that's an extreme case. For projects | like this, for most of the things you will ever, ever | want to do, it outright does not matter and the emphasis | on it in programming and "intellectual circles" (on the | internet, I don't think anyone in real life actually | gives a shit outside of college admissions) is massively | overblown. | christiansakai wrote: | You can still be a consumer/buyer, like me. Together we make | the world go round and around. | ysavir wrote: | It's easy to feel discouraged, but keep in mind: | | 1. The author didn't write this overnight. The oldest commits | go back to Oct. 2017, three and a half years ago. Imagine what | you could accomplish if you worked on something for three and a | half years. | | 2. There are many things we can do with our time, and | ultimately we do them all to be happy. Don't measure your own | worth by how much product you leave behind. Measure it instead | by how happy you are today. Most likely the OP wrote this code | because working on it made them happy, and that's great. For | many of us, though, the activities that make us happy don't | have biproducts. But that doesn't detract from how happy those | activities make us. Value the things that you do because they | make you happy, not because they appear impressive when held | against some external grading scheme. | | Edit: list formatting | nonbirithm wrote: | I wish more people like the author of the OP would feel free | to admit things like they were compelled to finish the | project because they couldn't see anything else they felt | like doing with their time, so that's simply where all the | time went. That would make perfect sense in my mind, and | restore a notion of calm. | | One problem is making assumptions that the author is trying | to prove something by a clear display of superiority. The | code itself is of a high quality, from what other people are | saying. But it's probably only because so much effort was put | in for three years on it. | | Also, I have to wonder how many other doors the author left | closed because he spent so much time on this project. Was | there anything else of a similar impact that he contributed | to for all those years? And what of the other things he may | have passed up? | | Some projects will consume you. They will be the tantalizing | activity pulling you away from Friday night dinner parties | with people you don't understand and other miscellaneous | outings that are comparatively less interesting. You | constantly think you're leaving something unsaid or undone | away from a keyboard. In some cases you feel obligated to | continue for no reason other than having already come so | close to accomplishing the thing, sunk costs and all. | | With some projects, hypothetically, if someone is to see me | in a cafe with nothing better to do, I'm almost certainly | going to wrap up my current conversation after a point and | take out my laptop to continue working. That is how my life | is structured with those projects. That is how they affect my | actions day after day. It isn't necessarily a life of glory. | | Working on projects and having the finished product in my | hands is not what brings me happiness; it merely staves off | misery. It fills a void in my life that was agonizing up to | that point. My theory is that if your goal is to avoid misery | and despair at any cost, and have the means to do so, you can | be driven out of desperation to accomplish substantial | things. Other people could see what I did and make their own | guesses as to what it took. But really I was only trying to | prevent myself from becoming undone. It was simply too | irritating of a problem for me to leave alone. I'll probably | never be able to fully explain why. It certainly wasn't | because I was trying to prove something to other people. | | But I'm only speaking from my personal experience. It's not | like I actually understand why the author did what he did. | People just don't seem to know at the moment, and maybe | that's where the air of sadness over suddenly seeing this | accomplishment come out of nowhere originates. There's | nothing to counterbalance the impact of learning of its | existence within a split second with what actually went on | behind the scenes for many orders of magnitude longer. | e_tm_ wrote: | Came here to say this. Kudos to the author. | markus_zhang wrote: | How about we setup a plan to develop something similar and | stick to it for a few months and see what happens? | | I mean this is definitely a piece of gem, but nothing is | exactly high tech or hugely difficult. And if you don't think | you can make it, you can lower the target and create a, say, a | 2d rpg engine that emulates Ultima IV or Pool of Radiance, | those pioneers of RPG. For art assets you can use free | resources or purchase inexpensive ones. | | I really think that's achievable for pretty much every | programmer. After all in some universities they give you a | similar task as a project for advanced game programming | classes. | p1esk wrote: | I blame Netflix instead | hutzlibu wrote: | Blaming is easy. | | Start doing things is easy, too. | | Finishing stuff, is hard. | | The trick is to gradually work your way up from small, | completed projects. If you start big, you probably fail big. | deckard1 wrote: | Yep. All big projects started as small projects. | | The hard part is justifying the time spent on a project. | You often start a project and feel like it's not the best | use of your time. That you may be the only one to use the | project or find value in the project and that's enough to | kill motivation. Why start a business if the vast majority | of businesses fail? Why start a business when there is | already so much competition? Why write a novel when there | is no hope of selling it? Then there are the "I'm too old | for..." thoughts. | | These thoughts eat away at people. | | If someone pointed me to my purpose project and told me if | I were to keep at it that I would find guaranteed success, | then I would have an infinite well of energy at my | disposal. But of course, no one is there to tell you that. | einpoklum wrote: | 1. Fight try to measure yourself up against the most talented | person you can think of. Can you code? Well, then, there are | plenty of FOSS projects in the languages you know which could | use your help. Can't code? Not a problem, do QA work then, | that's important and very useful and not enough people do it | seriously. | | 2. Seek self-fulfillment and purpose in other aspects of your | life. I am 100% sure the people around you - family, community, | neighborhood, etc. - could use someone who devotes some time | for doing good. Sure, it might not be what you had assumed you | would gain fame and glory doing, but so what? | | I'd be more specific but obviously I don't know anything about | you or where you live or what you do. | Hydraulix9899 wrote: | The power is within you to change that, you know? | etaioinshrdlu wrote: | Another thing that blew my mind recently was that Rollercoaster | Tycoon, a fairly complex game, was hand written in x86 | assembly... | | Although, this is less crazy when you think about how heavily you | can use macros, and sort of roll your own high-level language | yourself. | m_mueller wrote: | > use macros, and sort of roll your own high-level language | yourself. | | See also Engelbart & Co. Amazing how productive this approach | can be. | ashdev wrote: | This is super impressive considering it's written in C. Well done | and keep it up. | lucasverra wrote: | Just came to congratulate the human effort! One can only imagine | the hours of frustation to bypass to produce this (oneman) | production. Enjoy the first page of HN ! | Dzugaru wrote: | This is huge. I have a pet RTS project too, and the stuff is | really complex. The information on large-scale pathfinding for | example (ClearPath etc.) is scarce. And I do it on Unity3D/C#, | doing this on homemade engine is pure insanity. | tomcam wrote: | Who does the artwork? It's definitely pro quality. Please tell me | it's not also the developer because I may want to kill myself at | this point. | RhodoGSA wrote: | Looking through the assets on github, it seems he has done some | work himself and gotten some off OpenGameArt.org | aiisjustanif wrote: | Hahaha, my thoughts are similar. | 6581 wrote: | According to the Steam page: "I am a one-man development team | doing everything from writing the engine from scratch in C99 to | modeling all the 3D assets in Blender." | tomcam wrote: | Goodbye, cruel world. | jart wrote: | Goodbye, goodbye... goodbye. | legerdemain wrote: | Is that a reference to the Monkees' Porpoise Song? | panopticon wrote: | 2D art or 3D art? If the former, it looks like some of that is | from existing art (e.g., "Bear Rider" is clearly from https://e | n.wikipedia.org/wiki/Bogatyr#/media/File:Viktor_Vas...). | | The latter is made by the developer, but I wouldn't call those | assets "pro quality". This isn't to diminish the astonishing | amount of effort that went into the project though! | johnwheeler wrote: | After seeing this... | | Newbie: "I need to start programming!" | | Veteran: "I should stop programming." | charlie_hebert wrote: | Awesome looking project. | | I couldn't find any tests in the project. How do you test things | and maintain it? | trevor-e wrote: | This looks like some high-quality code so I was also looking | forward to learn how good unit tests look in C. Was surprised | to not find any, at least for the engine part of the code. | qwertox wrote: | The Engine Summary is really impressive for a solo project. | dilap wrote: | Are the unit behaviors coded in C, or some scripting/config | language? | epermyakov wrote: | All the fundamental behaviours (movement, combat, resource | harvesting) are implemented in C. | | The engine uses Python as a scripting/config language. You can | use it to hook into a lot of events pushed from the engine core | (unit got selected, unit started movement, unit started | harvesting, etc.) and customize or change the unit behaviours. | garaetjjte wrote: | Why Python though (and not lua or something)? It is rather | annoying to use as embedded language. | epermyakov wrote: | My initial idea was that I wanted a more "sexy" language | for scripting. Python is a lot more popular and (arguably) | more enjoyable to use than Lua. There's a lot of cool stuff | like list comprehensions. Plus I had a selfish reason of | just wanting to learn more Python and fool around with the | CPython code. | | Over the duration of the project, I really did learn to | appreciate why Lua is embedded into games and Python isn't. | Lua is really small and you have full control over | everything. And you're eventually going to need that | control when you implement features like reflection, | pausing the game, etc. CPython is this big shared library | that does its' own thing and you have a lot less control | over. The parts where it just doesn't expose enough through | its' API do do what you want is a real huge pain. I ended | up writing a bunch of code to serialize all the internal | data structures and this was a massive chore. Also you have | a lot less control over CPython's performance and memory | allocations. | | I didn't really appreciate these things when I started the | project so hence I went with Python. But since I ended up | doing it, I guess you can still enjoy the benefits of it. | dilap wrote: | Interesting; thx for the answer! | kleer001 wrote: | Oh wow, that's pretty darn cool. | | I like the Babba Yaga as a unit, lol! | SavantIdiot wrote: | Impressive! And excellent coding style. I attempted to write an | RTS at least 5 times in the past 30 years and could never stay | focused, so I'm seriously impressed by this. In C no less! | | How did you stay focused? And how did you segment the work? It | requires progressive refinement to coordinate all of the systems. | Wondering what order you took. | Thaxll wrote: | Looking at: https://www.youtube.com/watch?v=xleJeiOHHh4 the FPS | seems very bad, is it an issue on the capture side? Nice and | clean C otherwise! | abledon wrote: | yeah what is it like 15 fps? The repo says " It is made in the | image of old classics, but incorporating some modern ideas." | | But does that mean low FPS too? | bennysomething wrote: | Can I ask how old are you and how long you've been programming | for? This is an amazing achievement. | feinte wrote: | The devlog videos are great : https://github.com/eduard- | permyakov/permafrost-engine#devlog | | Thank you so much for making this in the open and documenting | everything ! | OOPMan wrote: | Why the engine internals exposed using Python 2.7 rather than | Python 3? | | Regardless of how you feel about Python 2 vs Python 3...one is | officially EOL and the other isn't... | beaconstudios wrote: | That's awesome! It's always exciting to see not only low level | game development, but also RTS development - my favourite | childhood genre. I think C has much underutilised potential as a | game dev language, especially as data oriented design (eg ECS) is | coming into prominence. | | I'm also building an open source game in my spare time, although | it's nowhere near as far along as this (and I'm also a massive | noob at game dev) - it's a civ-type game in three.js designed to | showcase bottom up organising behaviour; think age of empires 2, | if the villagers determined their own behaviour. I shared it on | HN years ago but shelved it until recently when I was looking for | a fun project to pick back up - | https://github.com/ajeffrey/civarium. | djoldman wrote: | Quick question: all the goto fail's where fail: | return false; | | This is just to perhaps change return false to something else in | the future, correct? Else why not just return false everywhere | instead of goto fail | alksjdalkj wrote: | Not sure if this is the author's reason but I find it helpful | to have a single return point from functions. Much easier to | follow code paths. | | You'll see this in some places in Linux's source too. | slim wrote: | Not op, but that's obviously in case you need to do something | more complicated than returning false later. It's good practice | namdnay wrote: | I think it's to cleanly show when he is using his pseudo- | exception handling system. So goto fail would be "throw" | unknown_error wrote: | Wow, this is incredibly impressive! | | As a web dev, I feel a moment of satisfaction when I manage to | make a heading look right on both desktop and mobile. Lol, what | you've done is several orders of magnitude more difficult... I | could spend a lifetime coding and not even know how to start | drawing the first pixel. Kudos!! | vajrabum wrote: | I got to poking around and found this reddit posting in which the | author describes the features of the engine which includes an | embedded python interpreter and saving restoring python state. | https://www.reddit.com/r/C_Programming/comments/gwg5u5/openg... | vajrabum wrote: | Here's a trailer for a game the developer built using the | engine https://www.youtube.com/watch?v=xleJeiOHHh4 and a devlog | describing how he persists python interpreter state. | https://www.youtube.com/watch?v=ch-zjn05gxQ | offtop5 wrote: | Any reason why you went with GPL. | | Unless you only want to encourage open source video games, this | is much more restrictive than an outright commercial license. | Have you considered dual licensing at all, maybe I send you | $1,000 or so and I get to use this in a commercial project. | | I absolutely love rts's , I love looking at a project like this | but I don't know if I'd be open to developing an Open source One | tomcam wrote: | Amazing work, you mad lad. And not that many lines of code in my | opinion--you're good. Do you feel you are missing any error | handling or other infrastructure? How do you feel about C as a | vehicle for that size project? Looks quite manageable to me. | epermyakov wrote: | Over the long development cycle of the project, I've | accumulated a nice little library of data structures, | allocators, and utilities (mostly in src/lib). Between those | and the low-level engine systems such as the task scheduler and | event system which have a generic API for any other system to | make use of, I believe I have good foundations in place to | develop new engine systems relatively easily. Of course, this | required the initial investment of laying these foundations. | | Most error handling just consists of checking the return value | of a call and propagating it up to the caller if necessary. | Sometimes I also set an errno-like variable with an error | message to check it in the top-level code. It's a bit wordy but | obvious and sufficiently good for all my use cases. | | I don't think C limits the size of the project. It's all about | good organization and coming up with the right higher-level | protocols/conventions. This, IMHO, is what allows or prevents | the code size from scaling gracefully. | tomcam wrote: | My experience in C as well. Have been questioning my own | sanity over the years when I read about the language because | I get such a different impressions of it from people on this | very site, so it's a relief to get your perspective. | throwaway88j wrote: | Are there any features you would like in C that would make | things easier? I'm writing a c compiler and adding low | hanging stuff such as removing forward declarations and | supporting multiple returns. One thing I'm flip flopping on | is function overloading for example. I'd appreciate your | opinion. | epermyakov wrote: | I guess the "shtick" of C is that it has a small and | obvious feature set. The readability and style of | programming follows from that. As you start adding more and | more language features and constructs, you start getting | all the other languages that were derived from C and you no | longer have C. | | During the development of the project, I had a thought that | it would be nice to have a RAII/defer mechanism to get rid | of repetitive code for freeing resources at the end of a | function. But I'm not sure if that's really necessary since | you can just put the 'free' calls at the end of the | function and insert some labels between them in a kind of | 'stack'. This perhaps is more in the spirit of the language | - a bit more wordy, but having less voodoo done by the | compiler. | throwaway88j wrote: | Interesting, I think defer as a statement might not be | too much magic but it would be too complicated for my | mostly single-pass approach. | | Thank you for your response. | TravHatesMe wrote: | Not OP but based on his comment about checking return | values of stuff.. would be nice to have lightweight | exceptions. could improve readability and debuggability, | less if statements, generally easier to propagate errors up | the call stack. my 2cents. | visualradio wrote: | Before substantially modifying the language, make sure your | parser can still load vanilla C header files with no new | features. | | This way if you accidentally create a new language, | programmers will still be able to load existing C header | files without having to manually write and maintain FFI | bindings. | hermitdev wrote: | One question I have (and please don't take this as criticism | or judgement, it's purely curiosity): why Python 2 and not | Python 3? Was it because of when you started working on this, | or were there some architectural/design issues that prevented | use of Python 3? | epermyakov wrote: | Eh, I don't have a great justification why Python 2 should | be used over Python 3. I made this choice like 3 years ago | when I didn't know too much about Python. That's it. Since | I wrote some code against the C API of the interpreter and | made a whole bunch of scripts already, it's a massive chore | to migrate. Classic story, I know. If I were to start a | similar project today, I would attempt to use Python 3 | first. | | That being said, I did come across some discussions (ex: | https://stackoverflow.com/questions/34724057/embed- | python3-w...) where it is not possible to strip the | standard library from Python 3. I think the use case of | embedding strictly the interpreter without any "batteries" | is not popular and thus has not been that well-maintained. | I've not tested this in practice, however. | hermitdev wrote: | Cool. Thanks for the response. It's definitely an | interesting project. As a long-time RTS fan, I'll be | following this project closely. I hope to have some time | soon to come back and give it a more thorough read. | nattaylor wrote: | I was curious about this too and looked around a bit. I see | he has to do some inspection of python interpreter -- so | maybe that, coupled with demos already within in python2 | are enough inertia to stay back on version 2. | Scarbutt wrote: | Shifting attention to keep every lib updated is a | distraction from getting things done. | blux wrote: | Coming from C++, the main thing I am missing in C is generic | data structures. Having to resort to macros to implement | generic vectors (https://github.com/eduard- | permyakov/permafrost-engine/blob/m...) I find cumbersome to | say the least. It is also hard to beat the performance of the | STL data structures when implementing something seemingly | straightforward like a vector type. | ilikeisometric wrote: | The pathfinding video is awesome! Could you do a video on the | rendering mechanism? | lelanthran wrote: | Since it's GPL, maybe someone can package it for Debian? | tekno45 wrote: | I hope this inspires someone to make a new kick ass RTS. I really | miss the OG WC3 days. | apocolyps6 wrote: | Check out Back2Warcraft and W3Champions if you haven't yet | gtirloni wrote: | I checked the websites and I don't know what I'm looking at. | What games are being played? | rubidium wrote: | Age of Empires 2 has experienced a resurgence recently. | bfors wrote: | Some people from Blizzard formed a company named Frost Giant | and are apparently working on a new RTS. | grawprog wrote: | This looks really awesome. The screenshots from the demo game | take me back to Warcraft 3 days. The code is clear and well | organized. Everything about this project is well done and | extremely professional looking. | jokoon wrote: | Did you implement netcode? A deterministic approach or not? | | I have to admit that would be quite the single feature I would be | curious to learn about. | | All I know about RTS netcode is that if there are N players, each | players "commits" an order, in a turn by turn manner, and all the | game code, physics and behavior etc is entirely deterministic, | which guarantees that all clients are always synchronized and | don't need to share state (well there is some hashing system to | detect if there is a bad sync, and I don't know if it's possible | to rewind and cancel things). | | A RTS netcode doesn't seem difficult to implement, but making a | deterministic RTS doesn't seem so easy, I think, especially if | you have boids and other pathfinding cool things. | Arnavion wrote: | Interesting license choice - GPLv3 with a linking exception so | that the final binary and other independent libraries are not | GPLed. Is this common for game engines? | CraigJPerry wrote: | Very nice code quality. | | C gets a hard time and this code base highlights some of the | modern features C is missing by its use of perfectly clear | workarounds. E.g. The prefix "namespacing" done here works just | fine, easy to understand. The go-style visibility approach is | growing on me lately and it works well here. | | C does deserve some of the criticism right enough, e.g. the same | macros re-defined in a few places - it'd be nice if c had a | better way than its version of macros although its not actually a | problem here because the macros aren't really big enough to have | subtle sharp edges. | | Ahh a beautifully written project, just shows that maybe C is | entirely workable in the right hands. | kungito wrote: | Workable for what? Is this production ready? How many | refactorings can this code survive? Don't get me wrong, I | haven't read this code so I'm not talking about this project | spcifically, but I keep getting triggered by the apologism | about languages with poor or no types. Can we finally drop this | myth about "bad languages are good when used by smart people"? | bsder wrote: | > Ahh a beautifully written project, just shows that maybe C is | entirely workable in the right hands. | | And because it is in _C_ , you can talk to it from Nim, Python, | Rust, etc. | | And scripting is a very big part of RTS games. | aydwi wrote: | > And because it is in C | | I'm curious, what difference does it make if it was written | in, say, Rust, or C++. Wouldn't you still be able to talk to | it in a similar way? What's so special about C in this | context? | steveklabnik wrote: | You can expose a C ABI from Rust, and some folks do, but it | takes some work. Some people don't find that acceptable. | tdhz77 wrote: | To me, If it solves the problem it's acceptable. | chris37879 wrote: | The thing that's always special about C, it's basically the | default goto programming language for calling from higher | level code, most languages that support FFI do so by being | able to communicate with C apis and having tools written | around C. C also lacks more complex things like classes, | it's much easier to build up a complex piece of software | from C building blocks bound to your language. Think of | like a struct that has a set of functions that operate on | it. You can map that basically directly to a class | definition in most higher level languages and then wrap up | the c implementation details like memory management behind | the scenes so you can produce a nice clean api in your | chosen language to use. | | This practice is fairly common in python when you're | dealing with AI (I'm sure there's other examples, but this | is the one that sticks out to me.) SDKs like TensorFlow are | written in a lower level language (C++ I think for TF) and | then FFI called from python, so you can end up with a | function like initTensorFlow() and calling it is enough to | bring TF online and ready to start processing other data. | | And you may be thinking "Well, I can do all that in rust or | go or <insert prefered language here>" and of course you | can, ultimately it's all just a linker and compiler | deciding where to put code and data in an executable, but C | is the defacto standard and more tools from more languages | are going to work well with it than say, rust or go. Which, | now that I think about it, is probably why Rust supports | defining a c api for your code, so it's easier to call from | other platforms. Rust specifically tries to play nice with | being embedded in existing projects because it makes it | easier to adopt rust incrementally. | | Just my $0.02 | bsder wrote: | C constructs normally map 1:1 in most languages. It's rare | for a modern language to not be able to do all the things | that C does. And, even if it's a little weird, it's not too | hard to give out an escape hatch because the features | aren't that advanced. | | C++ constructs--not so much. | | Does your language allow overloaded functions? If not, | okay, you have to map that somehow (probably name | mangling). | | Oh, your language has a different notion of inheritance | than C++, well, now you need to map vtables somehow. | | And what does your system do about exceptions? | Constructors/Destructors? Does it agree with the standard | library about what a String is? What about memory | allocation? etc. | | Even if the C++ ABI was perfectly described and | standardized, mapping to it is always going to be error | prone and clunky relative to the C ABI (which is just a lot | simpler). | | If you want a good example, look at what it takes to use | Vulkan via the C API/ABI--which is an exemplary | implementation of an API, in my opinion. Look at the hoops | you go through with loaders, structs that have type fields | in them, extension fields so that you can add functionality | without breaking compatibility, etc. All of that extra | "gunk" is the kind of thing that C++ hides normally that | gets terribly exposed when you have to cross an ABI | boundary. | visualradio wrote: | If a project requires an open API like OpenGL, SDL, Vulkan | which is documented and defined using ANSI C or C99 language | constructs, then some amount of C is required regardless of the | merits of the language. With high level language with large | community maybe someone writes and maintains wrapper, library, | or FFI binding for you but this relies on economy of scale and | out-sourcing work. If a programmer doesn't understand a C API | then writing a binding to a function they don't understand in | order to test it is a point of friction which encourages | returning to plain C. Ideally more of the "Better C" languages | would retain ability to parse and compile vanilla C header | files without manual binding. Zig attempts this but reduces the | cognitive simplicity of the language by using structs as | namespaces for holding local function definitions rather than | as "plain old data". | whateveracct wrote: | > Ideally more of the "Better C" languages would retain | ability to parse and compile vanilla C header files without | manual binding. | | I've been doing a lot of zero-copy FFI work in Haskell. It | became quite mechanical to create 100% literal bindings to C | libs (Pointers and all), and it's nice to use it directly in | Haskell as-is. I'm hoping I can write a simple tool to do | exactly what you describe. | visualradio wrote: | For programmers which need to consume C APIs ideally the | tool is the standard compiler. Eeverything gets handled at | compile time without the need for community-maintained | cache of bindings. New language designers start with a C | compiler which handles header files, then extend compiler | to also parse NewLang files. The in-memory representation | is loaded from both source types, without throwing away the | C functionality. In NewLang there is some standard | namespace and calling convention. | @importc "stdio.h" num : I32 : 123456789 fd | : c:int : c:open(c:"file.txt", c:O_RDONLY) :: | c:print("file:%d number:%d\n", fd, num) | | But nothing more, everything else is handled by compiler. | whateveracct wrote: | For a "Better C" language, that would be wonderful. | | For my Haskell ideas, generating Haskell from headers | automatically feels like the best route. Especially if | it's configurable to some degree. It's common that you | can better type a C API with Haskell than C ever could. | Usually with techniques like IO, phantom types, GADTs, | and the new linear types. | visualradio wrote: | The chicken-and-egg problem is where programmers don't | know how the C API works well enough to provide function- | specific type annotation or library-specific | configuration settings, but want to try calling the API | anyway because they are following a tutorial written in C | or C++. In this situation if there is no "dumb" binding | mode builtin to the language the programmer is likely to | abandon the language and go back to writing C or C++ | until they get the IO working and something displayed on | screen. | camjohnson26 wrote: | What's the reason for serializing the full engine state for the | save/load functionality? Seems like a lot of complexity. | mcdevilkiller wrote: | I guess because RTS games are soft-realtime systems and need | precise control of everything. RTS multiplayer logic is some | of the most complex I've ever seen, these games are basically | distributed computing frameworks. | ludamad wrote: | As someone who has made a custom engine - and intended at first | for it to be an RTS engine - kudos. Huge accomplishment :) | rsweeney21 wrote: | adfa | chmod775 wrote: | After leaving some pretty negative comments on many 'code | submissions' my expectations were fairly low and I was expecting | another novice-level project of subpar engineering. | | Well. Looks like I'll have to adjust my expectations. This is | above and far beyond what I would dare criticize or probably | could produce myself. | | Teaches me to not bunch "Show HN: my npm package you should | totally use in production" with "Show HN: my C passion project of | 3 years". | hombre_fatal wrote: | You couldn't find a way to give the OP props without writing | yet another negative comment about the code that some people | submit? | phnofive wrote: | It can be a challenge. | chmod775 wrote: | Suppose I could but chose not to? It's not like I also listed | each of them. | | I also don't have a problem with people submitting bad code. | | I however will speak up when people submit _horrible_ code | wrapped in a npm package and there 's a real risk of someone | unsuspecting accidentally using it. | Taylor_OD wrote: | If you made me put a number on it 1 and 4 show HN posts that | hit the front page are pretty impressive. The other 3 get there | from a mix of "hot" tech, a good title, and a slow news day. | smoldesu wrote: | +1 for this. A lot of people lack scope when they submit their | programs, which is mostly fine since HN ranks posts by upvotes. | This is really one of those "bigger fish" moments for sure, | though. | einpoklum wrote: | I like how chicken + resources = wooden chicken tank. | Datenstrom wrote: | Truly beautiful code. It is so clearly structured and written I | feel like I could dive in an work on it easily if needed, that is | quite rare. | tomcam wrote: | I love that aspect of it. Maintainable code just makes me feel | good | [deleted] | mr_cyborg wrote: | This is incredible. Great work! | | I recently looked at making a really simple RTS using something | like Unity and I was surprised how little love that genre gets | from a lot of engines. | 0xbeefeed wrote: | Absolute madlad. | neatze wrote: | > Permafrost Engine is licensed under the GPLv3, with a special | linking exception. | | This is most awesome thing, I wish more projects would use | linking exception! | | Just in case someone will reuse code on server side; why not to | use AGPL instead of GPL ? | chc wrote: | What's strange is the README says this, but I don't see a | linking exception in the actual license. | neatze wrote: | It's per source code file, and it is not explicitly defined | what is and what is not an engine API calls. ___________________________________________________________________ (page generated 2021-05-12 23:00 UTC)