crq-yml
Joined 2 years ago
Joined 2 years ago
Downtown SF has not had lively nightlife in most living memory, but the commuter crowd filled it up and gave it some bustle. That era ended with 2019 and all the activity has shifted to the neighborhoods, which always had the better activity destinations.
That's all there really is to it: Mosaic added image support. Investors got excited and asked if the images could animate, if they could record click data and credit card data, if they could add video and additional presentational elements. Holistic user experiences were secondary.
To move forward we have to accept that most of this wasn't an accident and it needs some breaking changes.
The principal thing that changes in this story is that Waymo centralizes the responsibility for the risk-taking, and therefore is easier to hold accountable than a horde of interchangable gig workers, impulsive teenagers, etc. When a Waymo car actually does damage, they don't enjoy the same cost structure as the rest of us. The probability is high that they reached a utilitarian conclusion on the bike lane issue favoring their current approach as "the best across all key metrics". Those metrics can be changed by enforcement, or by fixing the streets. They can use words like "unrealistic" but they are mostly speaking within a particular legislative and infrastructural reality. That reality can change if we expect it to, but it means going back on the individual-responsibility outlook.
There was definitely a tendency to do "compose on the piano, then arrange" with a lot of the early chiptune workflows though. With Galway's stuff there is more reliance on proceduralism to get those long evolving sequences, something which is actually easier to access when it's built from source files and you can define rhythms, chords, dynamics, modulation as forms of indirection.
If you are really doing "personal" computing, you can't scale to the point where you need to think about monorepo vs anything else, you don't have access to departments of specialists, and it is unergonomic to expect yourself to pretend scaling is a thing you will want just because the software ecosystem is shaped that way by default, when your real problem fits in a spreadsheet. Everything you do with data ultimately must be crunched down into something legible within your own bandwidth. This is something everyone who pursues personal information management tooling in their lives ultimately has to come to terms with - overdoing it and ending up with a useless pile of notes and references instead of good distilled information is a typical outcome.
The thing that changed during the 90's is that mechanical sympathy became optional to achieving a large production. The data input defining the game world was decoupled into assets authored in disconnected ways and "crunched down" to optimized forms - scans, video, digital painting, 3D models. RCT exhibits some of this, too, in that it's using PCM audio samples and prerendered sprites. If the game weren't also a massive agent simulator it would be unremarkable in its era. But even at this time more complex scripting and treating gameplay code as another form of asset was becoming normalized in more genres.
From the POV of getting a desired effect and shipping product, it's irrelevant to engage with mechanical sympathy, but it turns out that it's a thing that players gradually unravel, appreciate and optimize their own play towards if they stick with it and play to competitive extremes, speedrun, mod, etc.
The 64kb FPS QUOD released earlier this year is a good example of what can happen by staying committed to this philosophy even today: the result isn't particularly ambitious as a game design, but it isn't purely a tech demo, nor does it feel entirely arbitrary, nor did it take an outrageous amount of time to make(about one year, according to the dev).
I suggest using Rosetta Code as a learning resource for Forth idioms.
Microblog: https://gamemaking.social/@SpindleyQ/115058149348319018
But Forth taken holistically is a do-anything-anytime imperative language, not just "concatenative" or "postfix". It has a stack but the stack is an implementation detail, not a robust abstraction. If you want to do larger scale things you don't pile more things on the stack, you start doing load and store and random access, inventing the idioms as you go along to load more and store more. This breaks all kinds of tooling models that rely on robust abstractions with compiler-enforced boundaries. I briefly tested to see what LLMs would do with it and gave up quickly because it was a complete rewrite every single time.
Now, if we were talking about a simplistic stack machine it might be more relevant, but that wouldn't be the same model of computation.
While the feature is useful, in some senses it's not terribly important to have a sound be exact, because you're giving a performance to the circumstance. Acoustic instruments react to temperature and humidity and all of that - it worked fine for thousands of years of music.
I get the sense that the application of armies of agents is actually a scaled-up Lisp curse - Gas Town's entire premise is coding wizardry, the emphasis on abstract goals and values, complete with cute, impenetrable naming schemes. There's some corollary with "programs are for humans to read and computers to incidentally execute" here. Ultimately the program has to be a person addressing another person, or nature, and as such it has to evolve within the whole.
When you have the experience, you already know how long it takes to implement the majority of the game, when we're speaking of these early 2D games using bitmaps, tiles, small animations and some monospace text. The gameplay code is game-jam sized in most instances, so a majority of it was I/O code and asset pipelines. You can chart a safe course to get through one tiny project, and then another, and another, and build a best-of the routines that worked. The coding style would be assembly-like at this time even if they were using C - no deep callstacks, mostly imperative "load and store", which allows for a lower level form of reuse than is typical these days by breaking down the larger algorithm into "load", "mutate", "mutate", "mutate", "store" each as separate routines. So you end up with some tight code when you get to run it through a lot of projects. Softdisk provided the opportunity for building that and getting paid.