Estás usando un navegador desactualizado. Es posible que no muestre este u otros sitios web correctamente. Deberías actualizar o usar un navegador alternativo.
🔧 Site instability resolved. You can report double-posts and broken attachments. For bigger issues, use the Technical Grievances thread.
🇵🇦 Nuestro primer dominio localizado está en español en kiwifarms.pa. Our first localized domain is on Spanish on kiwifarms.pa.
Want to keep track of this thread?
Accounts can bookmark posts, watch threads for updates, and jump back to where you stopped reading. Create account
not a gamedev but from what i've seen 'entity component system' is mostly just another way to describe doing OOP, no?
like, instead of 'objects' you call your things 'entities' and maybe you don't do the big deep inheritance hierarchies and polymorphism as much as OOP textbooks tell you to, but at the end of the day you still work with class based things that have data members and member functions (or fields and methods or however you want to call it)
I haven't looked at this for a while; my understanding is that you associated the components with the entity, which is just a reference/identifier.
The component can be just structs holding data. A struct is a known size, which means it helps with data locality, and thus you get a performance benefit because there aren't any cache misses.
not a gamedev but from what i've seen 'entity component system' is mostly just another way to describe doing OOP, no?
like, instead of 'objects' you call your things 'entities' and maybe you don't do the big deep inheritance hierarchies and polymorphism as much as OOP textbooks tell you to, but at the end of the day you still work with class based things that have data members and member functions (or fields and methods or however you want to call it)
It's more like SoA than AoS if that makes sense, instead of a pointer/reference/value for a field, it's an index into a pool of the component.
It's really nice because you get the advantages of uniform striding, (assuming no variable length data), which makes a lot of code easier to write
Opus is killing it on CyberChud. Performance optimizations, aesthetic palettization techniques, headless benchmarking, mipmapping, bug fixes and more. I've only encountered a genuine regression when using Sonnet. At worst Opus does things in a way that mildly offends my strict memory management ideology, but would be considered normal and perfectly fine in any other codebase. To save tokens on my basic 'Pro' plan I just clear context and one-shot entire projects. No planning phase. It implemented mipmapping in a single prompt, and I see nothing wrong the code.
Maybe LLMs work really well on codebases where everything is immediately accessible and nothing is a black-box or API call.
It's more like SoA than AoS if that makes sense, instead of a pointer/reference/value for a field, it's an index into a pool of the component.
It's really nice because you get the advantages of uniform striding, (assuming no variable length data), which makes a lot of code easier to write
dynamic typing = the types of variables/parameters/expressions aren't fixed (and thus not validated) at compile time
dynamic object model = the structure of user-defined types (classes/structs) isn't fixed (and thus not validated) at compile time
So they're similar concepts. A dynamic object model (at the language-level) only makes sense with dynamic typing, I think - so you could view it as a extension of dynamic typing, that seems to be common among dynamic languages.
I also feel like the concept of static-vs-dynamic typing is a bit blurry, anyway. Like if your code passes around lots of values as `object` in C# / `Object` in Java / etc., then is that really still fully statically-typed code?
Thank you for sharing positive experiences. There's a lot of FUD out there right now. I've had similar experiences, but I've been doing LLM-assisted dev work for a couple years now, as even early versions helped paper over some of my weaknesses as a developer. (Biggest is that schooling drilled me to think about programs as a logician, which had a huge negative impact on my "velocity"; LLM inference papers it all over with generic code that I can adapt quickly.) But IT work provides much less revenue for me than other things at the moment, so I'm not a pro any more.
dynamic typing = the types of variables/parameters/expressions aren't fixed (and thus not validated) at compile time
dynamic object model = the structure of user-defined types (classes/structs) isn't fixed (and thus not validated) at compile time
So they're similar concepts. A dynamic object model (at the language-level) only makes sense with dynamic typing, I think - so you could view it as a extension of dynamic typing, that seems to be common among dynamic languages.
Thematically related maybe, but you can have the two in any combination: dynamic typing + dynamic objects (Python, JS, Lua), dynamic typing + static objects (Common Lisp), static typing + static objects (C, Java, ...) and static typing + dynamic objects. I don't know why you'd want the last one, but you could specify certain attributes on an object together with their type while treating other attributes as having some fixed type like string. I could see that happen in a weird DSL.
I also feel like the concept of static-vs-dynamic typing is a bit blurry, anyway. Like if your code passes around lots of values as `object` in C# / `Object` in Java / etc., then is that really still fully statically-typed code?
It's certainly blurry. A dynamically typed language is technically a statically typed language where every variable has the top type ("object", usually), which is why some people propose calling them unityped instead. Never really took off though, I think.
What I love about the 'binding a table' pattern is that it completely decouples the semantics of where the memory comes from from the object itself
In my personal project, for every type with attached memory, I define a "bind_buffers" and "detach_buffers" function, and it composes super well.
I use exclusively system pages for memory, but were I to go insane and use malloc, I could very easily
I recently learned that postgres coerces boolean values to strings and numbers and all kinds of bullshit.
Like I'm doing this project in a dynamically typed language, which is fine. I know that for my purposes, I'll need to deliberately impose types on values from untrusted sources (and parts of my code in general).
But still, I expected that when I pass a value to be inserted into a table with typed fields, that it should throw some sort of error when I try to insert the wrong type. Not just silently insert something that sorta looks correct if you squint at it.
I recently learned that postgres coerces boolean values to strings and numbers and all kinds of bullshit.
Like I'm doing this project in a dynamically typed language, which is fine. I know that for my purposes, I'll need to deliberately impose types on values from untrusted sources (and parts of my code in general).
But still, I expected that when I pass a value to be inserted into a table with typed fields, that it should throw some sort of error when I try to insert the wrong type. Not just silently insert something that sorta looks correct if you squint at it.
Opus is killing it on CyberChud. Performance optimizations, aesthetic palettization techniques, headless benchmarking, mipmapping, bug fixes and more. I've only encountered a genuine regression when using Sonnet. At worst Opus does things in a way that mildly offends my strict memory management ideology, but would be considered normal and perfectly fine in any other codebase. To save tokens on my basic 'Pro' plan I just clear context and one-shot entire projects. No planning phase. It implemented mipmapping in a single prompt, and I see nothing wrong the code.
Maybe LLMs work really well on codebases where everything is immediately accessible and nothing is a black-box or API call.
Opus is great. I have had regressions happen when I've let the session go on longer than I probably should do, and each time it was from a simple error, Claude for what ever reason wourld work from an earlier version of a file from the same session. I was able to solve this by having Claude provide updated files in a drop.zip which includes a manifest that contains the operation for each file, and a hash of the expected file on disk. I apply the drop with a script which validates everything before doing any operation. Since establishing this flow, I don't think I've even had the original issue, I think having the structured flow helps Claude keep basic sanity, even when context lengths are becoming burdensome.
I save the drops to one directory, it routes it to the right project. Since I am using the web browser version, saving to various directories and manually overriding files was becoming a source of tedious friction. A nice bonus of adding these guard rails is that it had made working on multiple projects and deployment of changes in general much smoother. I am sure this kind of thing is already obvious for many, I am not doing anything complex or novel here. For me it serves as a reminder that a big part of what makes Claude and agents in general so powerful is the simple tooling built around them, and that no matter what level you are at you can see big gains from simple work flow tweaks.
I am curious if you or any others use similar simple workflows when working with AI that is providing you files to be applied manually.
Below is some console output of applying a drop. I don't have this step automatically build, but that could also easily be done. I provide a build/restart command and verify steps in the output. The verify steps are nice for me keeping track when I have multiple things cooking.
I did, then I switched to OpenCode. I run it in a container and only give it a copy of the code and any APIs/SDKs it should need. I did finally give the container cmake and the arm compiler so it can at least test build the project. Because I run mostly slow local models I mostly give it instructions and then come back later and see what it fucked up. It's told to commit to the local git tree but doesn't have push access or anything else.
Same. And I'm still consistently surprised by how well it works. I can ask it how something is done and it generates code that works perfectly. I can drop a source file and tell it to review it and it finds bugs that I've overlooked.
I have opencode find me subtle bugs I may have missed with tests. AI is really good at doing that. I also have it suggest me solutions. AWS is a complex beast, and I certainly don't know all of it. I can have it suggest me stuff from the actual docs.
I also migrated a bunch of URLs from one environment and had it write me a nice little script to update all the URLs.
Update: I'm going through the Crafting Interpreters book. It's useful, but I don't like it.
I appreciate that the full code is in the book and commented on. I don't like that, to save space and make writing clear instructions easier, he presented it in a top-down way, where he'd provide a use first and an implementation later -- this is a professional's approach, not a learner's. This presentation makes the learning process not far removed from copypasting stackoverflow snippets jeet style. So, to counteract this, because his book is in Java, I'm also writing the interpreter in Python with no classes other than struct-like dataclasses, to force myself to actually think.
Second, while the core text is not hard (so far), there are optional questions and exercises that are. I don't mind the absence of solution for exercises (possible reasons: too opinionated for a textbook, no place in the printed book and having to keep parity with it, wanting to keep the book easy -- a gay reason but still a reason), but no answers are provided for the questions, which is extremely semitic behavior.
I also found out that languages with meaningful whitespace are a massive pain to implement. (The toy language in the book doesn't use whitespace.)
Update: I'm going through the Crafting Interpreters book. It's useful, but I don't like it.
I appreciate that the full code is in the book and commented on. I don't like that, to save space and make writing clear instructions easier, he presented it in a top-down way, where he'd provide a use first and an implementation later -- this is a professional's approach, not a learner's. This presentation makes the learning process not far removed from copypasting stackoverflow snippets jeet style. So, to counteract this, because his book is in Java, I'm also writing the interpreter in Python with no classes other than struct-like dataclasses, to force myself to actually think.
Second, while the core text is not hard (so far), there are optional questions and exercises that are. I don't mind the absence of solution for exercises (possible reasons: too opinionated for a textbook, no place in the printed book and having to keep parity with it, wanting to keep the book easy -- a gay reason but still a reason), but no answers are provided for the questions, which is extremely semitic behavior.
I also found out that languages with meaningful whitespace are a massive pain to implement. (The toy language in the book doesn't use whitespace.)
the way python does meaningful whitespace is by emitting an indent token when indentation increases and a dedent token when indentation decreases, this way its no different to brackets from the parsers point of view
the way python does meaningful whitespace is by emitting an indent token when indentation increases and a dedent token when indentation decreases, this way its no different to brackets from the parsers point of view
I would say the tokenizing is where the massive pain lies, since most language tokenizers are able to discard all irrelevant whitespace (i.e. not in a string or something) from the start.
As an aside, I hate load bearing whitespace. It deeply offends my sensibilities and I hate using languages with it.
I'm not ashamed, I brought up Ren'Py as an example and fanfiction writers as a possible audience. I don't call it visual novels because:
(1) visual novels are supposed to have art and music, and for many wannabe authors those are the sticking points. I specifically want to carve out a mini-genre where players will not expect art and music.
(2) some visual novels don't have choices or have too few (basically which underage girl you want to fuck now) and all of them expect completionism and "seeing all content", I want to emphasize frequent and varied choices and encourage "games that you can win", and if you win the game, you're *done*, you aren't expected to chase down every cuck scenario for achievements and end your playthough on a downer.
(3) I am personally *old* and come from a gamebook and text adventure background, I learned to program by trying to solve a puzzle in a delisted demo version of an obscure text adventure. Over 20 years have passed between me playing my first text adventure (Enchanter) and my first visual novel (Pigeonfucking Simulator; I liked it). I love Arcanum and Planescape: Torment; I haven't played Disco Elysium but it seems to be close to what I'm aiming at, too. There is a "Disco framework" for Ren'Py, made by a fujo. /aside
The problem with text adventures with choices is languages for them either suck (Twine, possibly Ink -- the interpreter crashes on my computer) or are substantially proprietary (Choicescript and possibly Yarnspinner).
I don't know if there've been similar pronouncements from Yarnspinner owners but
1. they *sell* interpreter addons for $50 a pop.
2. they tell people to buy interpreter addons if they're "using Yarnspinner in a commercial game" even if they don't need the addon.
3. Yarn Spinner is proudly located on the land of the muwinina and palawa people. Sovereignty was never ceded.
4. The use of the Yarn Spinner trademark should not show Yarn Spinner, the Yarn Spinner team, Yarn Spinner Pty. Ltd., Secret Lab Pty Ltd, or any related group or entity in an false or derogatory manner, or in association with any hate speech, or criminal or illegal activities.
I don't want to tell people to take chances, for them to end up eating a default judgment and getting their lives ruined by a trannyfucking piece of shit.
Anyway, the important point is that a lot of "code", unlike real code, will be just text in a natural language, and I want there to be as few extra symbols as possible getting in the way of text. And I personally think it's easier to write dialogue options indented (I do that when taking notes on paper and in text files); and if there are already indents, I might as well make them load-bearing and get rid of brackets and braces.
the way python does meaningful whitespace is by emitting an indent token when indentation increases and a dedent token when indentation decreases, this way its no different to brackets from the parsers point of view
I sure hope it's this easy. I'm on Chapter 5 (5% through the book) and there's already stuff in it that apparently requires the dragon book and automata theory to fully understand.
(1) visual novels are supposed to have art and music, and for many wannabe authors those are the sticking points. I specifically want to carve out a mini-genre where players will not expect art and music.
I like this. The way I'd do it is by requiring the ending to have at least three ends (let's say three objects/structs/Good/Bad/Neutr) on the backend.
I'd also make it obligatory to have game states in the game, so that you cannot complete a project unless you choose between serving tea or coffee scene in the default project. How you implement it is up to you.
class Intent() ___init___(self, words: list[str]): -> Intent if isinstance(list): self.words = words # do some validation to make every string lower HERE [...]
__contains__(self, word) -> bool: # usecase: if word in intent -> most likely the right intent # e.g. tea in friendly -> True # rape in friendly -> False if word.lower() in self.words: return True else: return False
I wrote this code on the toilet so don't expect it to work. It's shit.