When I made Nora's Mouse Chase! for p8jam2 last month, it left me unsatisfied. So I started work on my own 2D game engine again. At first I was making it from scratch, but then I realized all the C libraries I had gathered made up basically the same thing as LÖVE anyway, so I switched to using that as the base. There were some other snags and I've had to basically start over a few times, but I'm working out the details as I go.
I don't have anything to show for my work yet, so I don't know why I'm posting... And I certainly don't know why I'm posting it here, of all places. Maybe I just really adore this quiet little corner of the Internet.
Anyway, I've given this project the working name of Nora-Net. The goal? A decentralized online multiplayer game engine and service, capable of supporting at least 100 players per server (although ideally somewhere around 1024 players would be amazing), where the game itself can be edited cooperatively online by admins who can upload new scripts and sprites on the fly and build the world together.
In one sense, the continuing efforts where pico-hotel left off. In another, a decent replacement for BYOND and Second Life, with realtime action gaming in mind. I want Nora-Net to be able to support puzzle games, platformers, and RPGs all just as effortlessly, with a Bitcoin Wallet type of client-side account registration and identification to access server-side save data which servers can share with eachother if set up to allow it.
I want this to be something I can go to as my game engine of choice for all my future projects, an engine capable of virtually any 2D game imaginable, supporting singleplayer, multiplayer, and massively multiplayer, with optimized renderig and networking behind the scenes. I want to run a Mii-like character creation service on it which exports finished character head sprites in a variety of sizes, styles, and poses for other games on the engine to use with their own body sprites to make a unified-yet-customizable avatar for you to take with you everywhere, whether that head is getting tacked on to a space marine or used as a portrait when you win or lose a round of Puzzle & Flower Land 3.
This is too big of a project for me to tackle alone, and I know it. I also have no income and approximately two years left before my life will almost certainly take a turn for worse. But what the hell, let's see where this road takes me anyway. It'll be fun.
◁ ▷ △ ▽ - Move
Ⓧ - Interact, continue dialog
Ⓞ - Speed up dialog
◁ ▷ △ ▽ - Change selection
Ⓧ - Activate
Ⓞ - Cancel / Back
Standard Pico-8 keyboard assignments:
Arrow keys = ◁ ▷ △ ▽
Z,C,N = Ⓞ
X,V,M = Ⓧ
P,Enter = Pause menu (useful for resetting the game to play it again)
For the best experience, take the time to try interacting with all the objects, too!
Have fun catting around!
Thank you everyone for your support.
Here's my post-jam development diary / full disclosure wrap-up thing:
Nora is my mascot character. She was thoughtfully designed ahead of time to be the epitome of adorable innocence. The large art at the top of the post is actually a piece of rough concept art for her that I worked together with an artist to produce, and it actually took a bit of work to get her to where she is today.
I had been meaning to flesh out her world and create additional characters to play off of her personality for a while now, and I figured the jam would be a perfect way to motivate myself to get something out there.
I was actually hoping all along that I'd get to make an RPG, because RPGs are rare on the Pico-8. When jam theme voting came up, I cast a dual vote for Blob and Useless Power-up. That way, if Blob was selected, I would benefit by having standard RPG slimes to fight against (and cute moe blobs for characters!) while everyone else foolishly used the built-in circle tool to try and do wacky blob physics games. And if Nora gets a Useless Powerup instead I could easily make that an RPG McGuffin of some kind... So either way I'm good, right? With that settled, I began work on pixel art.
And then the jam turned out to be about Chain Reaction. Crap.
How am I supposed to make these 16x16 pixel overworld walking catgirl sprites into the embodiment of a "chain reaction"? At first I doubled-back, thought I could change my design into another charming but simple puzzle game where you place a dog to move forward and scare a cat, which moves away from the dog to scare a mouse, which moves away from the cat to collect the cheese... That's a puzzle game, right? I have vague memories of a puzzle game like that actually existing at some point, but I couldn't remember the details to really make it work... It would be boring to make a puzzle game if I can't figure out any intricacies to make it require some thought! At any rate, the first early alpha version went by this design (see "Earlier versions:" below), hence the little info box which is now missing from the current version of the header image.
Uh oh. It looks like someone else had the same idea as me, and they seem to remember the rules better than I do as well. It was a game about using a mouse to scare an elephant into a cage or something, right?
Well, since I don't want to risk my jam entry being redundant and I don't remember how to make that fun anyway, I'm back to figuring out how to make an RPG with a "chain reaction" twist. The results became the finished product: A battle system where instead of selecting the attack you want to use (so that you can just spam the enemy's weakness over and over), you have to figure out how to connect multiple attacks together into a big chain to deal significant damage.
My fatal mistake was trying to keep the overworld aspect of the game, rather than just focusing on the combat system. Because this project was still about fleshing out Nora's world, which was important to me. I already had sprites for all four directions set up, so it would be a waste to throw them away changing my plans again, right?
I ended up working obsessively, pouring hours into this project all week long, slowly adding more dialogue, more rooms, more scenery objects... Then I realized my second mistake: The combat system is like nothing anyone has ever seen before, so it needs a full proper tutorial before people will grasp how to use it. And if you don't know how to play, you can't win the game.
After packing a full tutorial, a bunch of overworld NPCs and dialogue, a wacky scripting system for dialog-triggered events and the like, and then finally getting around to implimenting skills to use up your MP and drastically reduce the luck factor for players who know what they're doing, all in a newfangled object-oriented system that uses up more code space for the sake of making everything much easier to handle and find your way around...
I ran out of tokens. Oops.
So, the finished product ended up having only two battles (I had planned a third, final boss, with gimmicks and a true ending) and thus was very light on gameplay despite being packed to the brim with solid content. If I had instead only made the combat screen and cycled through enemies randomly (including recolors), I could've had potentially endless hours of gameplay. Instead it's something short and cute that you play once and never touch again, much like my previous Pico-8 Jam entry, Frog Home.
I guess I just love to tell a story.
- Web player desynchronizes audio when lagging (nothing I can do about that, try restarting your web browser or closing your excess tabs)
- Pico-8 font is hard to read (might consider wasting space fitting in another font or something)
- Only one silly little music track. :(
- No good display for elemental weaknesses, you'll have to pay attention to the numbers.
- There was supposed to be an optional final boss with some gimmicks that I couldn't fit under the code limit, let alone write another ending for. If the ending feels wrong, that's partly why.
- I see you messing with the palette again zep, cut it out... D:
Zep made me an adorable little plastic coaster commemorating Frog Home.
So I turned the design back into a little Pico-8 cart.
Sorry it's so barebones, I just wanted to share with everyone. An amusing way to upscale a little sprite, I guess?
Just a "music" cart.
It shouldn't desynch even if the web client lags because the floating text spawns the music.
I've been in a sleepy and depressed slump all day. This sucks...
I should ditch Pico-Hotel because what I'm basically inventing here is a convoluted 2D content platform designed to be an open multi-user world. The problem is, it would only be accessible to like 3 to 5 people total, due to requiring both manual invites to a dropbox folder and Pico-8 itself... A platform (Pico-Hotel), delivered by a platform (Dropbox), running on a platform (Pico-8), running on a computer platform, connected to the Internet. Gah, that's slicing the cake way too thin!! At some point it isn't worth it anymore!
And Pico-8 as a whole? Pico-8 is a "programmer game". A toy meant to pose itself as a puzzle to you, even if it takes the guise of a fully fledged content development platform and sandbox. Even though Zep gives content creators all rights to their own creations on his platform (at the very least, explicitly in their HTML5 exported form), the restrictions are ultimately and invariably too intense to make any game or experience of a large enough scale to merit me being able to make any money off of what I do here.
Now, I don't want money. I'm absolutely happy to be here, to be working on cute little things and met with praise and matched by the unique and interesting creations of other talented programmers like me. But my life isn't going to be stable for much longer unless I do something, and I want to stand on my own by peddling the content I've lovingly crafted myself, if I must do something to obtain money at all. I am capable and deserving of as much respect and independence, aren't I?
But I can't do that here. ... So ...
I don't know. I've got big ambitions and no means to achieve them anyway, so what's the point. Even if I'm somewhere else, working on something else, it'd all be meaningless in the end either way...
Here's my generic "Look everyone! I made raindrops!" cart, since the theme is rain.
If it sounds absolutely horrible, don't use the web player. The web player skips frames, which does not bode well when the raindrops themselves are playing the music.
If it still sounds absolutely horrible, I'm sorry for being terrible at music. I will try harder next time.
Press Z to frog. Go do frog stuff.
This is now a complete game and solvable. It'll tell you when it's over.
Puzzle games are meant to have solid mechanics, so unless a frog starts floating, you're probably not actually stuck and it's probably not a bug.
Hi. I'm JTE. In case you were wondering, here's my life story, I guess? Be warned this is all just a depressed self-pandering wall-o-text rant about nothing in particular that I wrote while suffering from undernourishment.
I'm 26 years old, dropped out of college, and never worked a day in my life. I've been programming since I was 13 years old, filling up entire notebooks with shitty BASIC scripts learned from a maddeningly outdated 1982 textbook, even though I didn't have any significant time with a computer or an Internet connection until late in 2002, and before then it's always been my life's dream to program amazing videogames for the endless enjoyment of others.
My goal in everything I do has always been to feel closer to my friends over the Internet, because I am an intensely introverted shut-in in real life with no friends and no life at all outside of this computer. Therefore, I only play multiplayer games, usually only with people I know, and I only want to make games I can show or play with them.
I am awake and asleep at all hours of the day, and I've been like this for at least 8 years now, never getting exercise and watching my body and mind slowly wither away to nothing while holding out hope that "one day" I'll be together with my closest friends and loved ones who live all across the world, even though I completely lack any source of income at all and am largely incapable of functioning in larger communities and crowds.
I could say that I'd "like" to have a well-paying job doing the one thing I'm good at (that is, programming logical things that don't require significant mathematical algorithms), but I completely fail to have the social skills, physical condition, and/or drive to actively seek out and obtain such employment. Lately I have the attention span of a cat, too, and can't even finish my personal projects, getting stuck and/or burning myself out.
That's not to say I don't have skill or talent, though.
I am the JTE who learned programming by modding the Doom engine to program SRB2, writing new rendering code, game logic, and bug fixes that make SRB2 stand strong as a popular contender against some of the other most feature-filled and modern Doom engines even today.
I am the JTE who made an online netplay Cave Story engine (now defunct) and a Cave Story music input plug-in for WinAmp (Still works! But WinAmp has gone bankrupt and changed ownership...), both implementing my own interpreters for the wacky custom formats using limited research and a lot of fine-tuning, before NXengine existed and before Nicalis came along to claim all copyrights to it and largely shut the fan community down.
I am the JTE who programmed the first ever custom Minecraft server completely from scratch to deal with moderation in the early, limited-world environment, when water/lava floods and intense griefing ran unchecked and even the most basic of anti-cheat checks were nonexistent in vanilla.
I am the JTE who who holds admin rights over the tarnished ashes of what used to be the official Kid Radd forum and holds a secondary email address of JTE@KidRadd.org
I am the JTE who has tripped over virtually every bug in the current version of Pico-8 in my quest to surpass all limits and expectations struggling to make Pico-8 Kid Radd, PicoWare Inc. and "Pico-Hotel" a reality, even though almost none of my friends will be able to see them.
And I am proud of everything I have accomplished. Even though I sit on the path of self-destruction, on a train ride to ruination, as everything I've done means nothing at all and my name is virtually unknown.
Notch got rich selling Minecraft for $2 billion.
I, personally, kickstarted the modding community that's so large of a reason it even had such a large and extended success.
I invented the first open-source building tools and custom game modes that spread like wildfire and fostered a mentality of making your own improvements that continues today, before which there was only map generators, shitty text console command hacks, and the idea that inventing new game modes and mobs would be "stealing money from Notch". (A laughable thought nowadays, I know.) And hardly anyone even remembers me, not even Notch.
So here I struggle, popping in and out of small communities, releasing wondrous things, and here I die, forgotten and unattended to. Because the way of the world doesn't matter to me at all, I'm really just doing it because I want to feel closer to my only friends, who are all so far away...
so very, very far away...
I've been using the Pico-8 for a while now, since it's pretty much everything I've ever wanted in a "fantasy console", and I would have made one almost exactly like it (albeit with a larger palette and looser limits, perhaps...) if and when designing and programming one myself. So to skip that entire process and jump straight into making nifty little widgets and toys for this device... Well it's been quite a dream come true!
That said, Pico-8 is far from being without issues, and more keep cropping up the more I play with it. So, outside of bug reports, here's a small laundry list of things I "want", or would be nice to have at some point...
Note: This is a blog post, an off-the-cuff rattling of random things I personally would desire. I'm not expecting it to be directly acted on or hotly debated or anything like that, this just keeps track of what I want so I don't forget, you know?
The ability to call non-system functions without arguments in the same way as system functions, eg. as "run" instead of "run()". Maybe before trying to process the input as a Lua script, it should try to see if there's a global variable by that name first, and if that variable is a function, call it?! There's no reason to make such a distinction in most cases.
How about a find(needle,haystack) function? It would search strings for substrings or arrays for values and return a number from 1 to #haystack where it's found or nil, false, 0, -1, or whatever when it's not.
I often find myself needing a pause button, even if it's not a game button. The only way to pause a game right now, if it's not in the web player (which can be paused by clicking on it, as counter-intuitive as that sounds!), is to press Esc to kill the entire program, which often has unfortunate side effects like stopping the music or reverting the map, sprite, and sound data.
If it doesn't already, when Lua "runs out of memory", it should first try to garbage collect and see if that frees enough space to keep going.
I need the type() function back so I can have mixed type arrays again. Without it, and without tostring(), there's no way to avoid accidentally crashing the script trying to concatenate arbitrary values to print debug text and whatnot... I'm forced to carefully distinguish variables and keep it all totally separate. Bogus, man!
I want the _G table back so I can iterate through variables in the global namespace or "construct" variable names by string concatenation. It would have to be lower-cased to _g in Pico-8 due to the whole mono-case thing it has going on.
load()'s silent failure is a troublemaker, and there isn't an exists()... So either make load() return a meaningful value (a boolean perhaps) or add an exists() that checks for a file or make ls() return a list of files or something... Come on...
Change the hardcoded _mainloop function so that it works more like this: function _mainloop() local must_draw = true while _update or _draw do if _update then _update() end if _draw and (must_draw or stat(1) < 1.0) then _draw() must_draw = false else must_draw = true end flip() end end (This was the closest approximation I was able to make without knowing the actual script source.) That way, programs can have only an _update loop or only a _draw loop, swap them out, or even terminate the main loop by removing them both. There is currently no way to exit the main loop otherwise, as far as I'm aware.
- I miss metatables, but considering Pico-8's constraints they're not high on my priority list for the return of...