The new forums will be named Coin Return (based on the most recent vote)! You can check on the status and timeline of the transition to the new forums here.
Please vote in the Forum Structure Poll. Polling will close at 2PM EST on January 21, 2025.
[Game Dev] I don't have a publisher. What I do have are a very particular set of skills.
It's kind of interesting, noticing how different the mindset for developing skills is between creative writing and game dev.
Most modern writing advice will tell you that if you don't read short fiction and don't want to write short fiction, you shouldn't write short fiction (advice was different in years past, where short fiction was an important step on the path to publication).
Pretty much every game dev advice along those lines is the opposite, i.e. you should make a million little casual games before you do anything else.
Of course, I can see the reasons for it to some extent, how to program a health system and respawn logic for Space Invaders carries over to a AAA MMO cleaner than, say, writing a character for a 5000 word story does to writing a character for a 100,000 word story.
Though a lot of indie dev advice also seems heavily focused on programming rather than making games. Feels like the majority of hobbyists I've seen seem more interested in taking on unique programming challenges than completing a game. edit: Feels like maybe I'm letting my frustrations cast shade in a way I didn't mean to. More accurate to say that I've found it easier to find discussion and advice on the programming aspects of development/development of games that rely on more intricate programming than, say, in-depth discussion of the nuance of different ammo economies.
All this to say that I'm still occasionally second-guessing just jumping into what I wanted to make first (well, something a bit lighter but with features that will carry over almost unchanged into a later project) instead of trying to remake pong etc. But not so much that I'm changing course.
Anyway, I'm off work today and have nothing on my schedule, so I think I'm going to try to put 8-10 hours into getting this first level somewhere close to done (gameplay/story/etc-wise, aesthetically it's lol). Scope of it crept quite a bit and I lost some energy once I had to start making decisions, but it's all been to its benefit.
Well I don't think anybody is really saying that you should make games you don't give a shit about. But in game dev there are a ton of logistical issues with making a big ambitious project by yourself. Like if your dream is to make a AAA MMO as a hobby project... that's impossible. Perhaps you're more realistic and your dream is to be hired to work on said MMO - even then, completed projects are likely more impressive to a recruiter than abandoned moonshots, and it's important for motivation to have goals that are attainable.
I am doing both as an amateur, and really feel that shipping/publishing is half of the skillset.
-Making small games and writing short novellas is a good way to practice the art of finishing.
-Having a release is a nice bulwark against imposter syndrome from which you can self-critique without losing motivation.
-Gets your obsession out of the way and allows you to move on to something that might suit your talent/proclivities/capacities better.
-Game specific you experience the whole life cycle, figuring out why and how to get reviews, build for dev videos, link to social media...
Against that, the churn of modern Indie publishing in both writing and games. You will absolutely be competing with people who are natural born or experience grown marketers why put 99% of their effort into marketing a pizza box with pasta glued on.
So, never read the reviews in this day and age translates to never check your KDP stats or downloads. You justn'eed to care enough about the consumer to see if your marketing works. Write/dev for yourself.
But finish, and publish, and start over. Smaller/shorter games and books will make that easier.
I'm been dipping my toes into Blender and animation in UE and I'm Not Having A Good Time, but I know there's a very good chance my sibling doesn't have the follow-through to do their part when the time comes and it's useful for prototyping stuff, so...
It's weird, because looking at all the pieces of the process it should be the kind of thing I pick up quickly, even if I don't have the artistic sense cultivated to make good use of it.
But instead I just feel like I'm drowning at all times.
I'm been dipping my toes into Blender and animation in UE and I'm Not Having A Good Time, but I know there's a very good chance my sibling doesn't have the follow-through to do their part when the time comes and it's useful for prototyping stuff, so...
It's weird, because looking at all the pieces of the process it should be the kind of thing I pick up quickly, even if I don't have the artistic sense cultivated to make good use of it.
But instead I just feel like I'm drowning at all times.
Blender has a pretty steep learning curve at first, especially the fiddly UI regarding creating and shifting view windows, or getting stuck in a mode where you don't find the button you need.
Don't know UE but if it uses state machines for animation, that's also likely to be idiosyncratic if you're used to simple keyframe animation. Adding inverse kinematics etc. makes for much more frustration...
I don't know if that ever stops unless you are a dedicated animator, it's always been my weak spot.
So, an update! I've returned to my previous grid-based UI frontend, and simplified the back of it a lot (who needs a command queue? probably me but it's gone!).
I updated the movement to go north-south - east-west and the purple is where I started on the selection of a mapsquare. The idea is that you will move that selection around, with the camera following. I'll use a brighter material to highlight the selected mapsquare, which is why the purple (that just deletes the existant material)
That's it for now, pretty easy after implementing the UI, and once I have the highlight material working, I can add a button that both creates a 'tiling' and instantiates the prefab specified in it across the whole map wherever that tiling applies. That functionality is mostly already present, but it'll conclude the 'port to mobile' journey.
I hadn't gotten around to creating an 'identity card' for the tiling, which will be next. That'll be a less clunky way to set up the different attributes of a tiling. And at that point lots of testing to fill the map with tilings, save, load, repeat.
Then I have to add in an 'undo list' of tilings to have some undo levels on the map, and a UI to just see the existing tiling identity cards in a grid and delete them from there. Those are quality of life issues, and I'm going to have to start looking at the map generation again where I left some feature creep unimplemented. No use looking far beyond that, but I might be able to get it in shape enough to present it at a local gamedev group, which I'm sure will trigger 'oh you made a bad clunky *existing asset*'.
I'm having trouble figuring out the right point between 'this boss never fucking lets up or gets off you' and 'this boss just stares at you glassy-eyed sometimes' with my first boss.
Might just be that any time he's not moving, instead of feeling tension or thinking about what I should do next to defeat him, I'm wondering what his AI is doing and wondering if he's staring too long or realizing I need to make some of his idle animations unable to play once he's aggroed since if he's close enough to hit me but has no attacks available for a split second he enters the Idle animation state which can fire off looking around or snuffling the ground or...
It's tricky, because my feeling that my zombie-like enemies were too pathetic and too easily ignored ended up being completely disconnected from how anyone who playtested the first little bit for me actually experienced them.
Which I guess makes sense. I went and watched a no-hit run of RE2make and it was pretty similar to how I interact with my own zombies, just zero threat, walk around them, walk through them during some animations, etc. Same as how you interact with Dark Souls mobs after a bit, just jogging around doing what you need to do, annihilating any hollows that get in the way without really caring about what they're trying to do.
But knowing that I can't perceive it clearly doesn't magically make me able to tell how others will, at least not yet. Maybe with more experience. Maybe I need to set a 'dev difficulty' that makes everything but the player move faster.
Probably would be a good idea to add some pattern where it would intentionally get some distance for...something. Maybe run around a bit to build up speed then do a high speed line charge that doesn't track? Since it really does glue itself to you at the moment. It's crazed and cursed so maybe it just randomly gets distracted to attack things in the environment.
Maybe I'll let him be this aggro but give him a stamina system. Or, rather, use the token system that's meant to keep multiple enemies from overwhelming you. Make 'breathing heavily in place' his least favored 'attack' but his only one that costs zero tokens and make tokens return slower than they normally would.
At least I was able to make use of the animations and whatnot that came with this random free pig asset to make something that genuinely feels like a decent boss. Speeding things up, slowing things down, adding and adjusting root motion as needed, allowing tracking during certain parts of animations but not others. Like there was this one 'combo attack' animation where it walks forward swinging its head right and left and finishes with a leap. Realistically the leap was pointless, either the head swings got you or you just watched it wander away, leap at nothing, and awkwardly turn around since it lacked any kind of turn-in-place animations.
So I made it so that during that jump, it can rotate despite being in an animation montage that would normally prevent that AND gains the ability to rotate far faster than I allow it to on foot. So now the jump is repositioning instead of just an awkward waste.
Of course, for the way my game works, just making a boss that would fit in a Soulslike is only part of it. Need to make it so you can do interesting stuff with the environment and spells based on information you've picked up previously. So plenty of work ahead. But hey, progress.
Maybe I'll be willing to show my work here soon, even if it's still all ugly as shit.
It's maddening how much time I've dedicated to a relatively tiny problem.
I don't want my boar boss to turn in place if it ends up faced away from the player, I want it to run forward and arc around to face the player again.
Somehow this is the one problem where no one has a quick solution to offer in the Unreal Source discord. You would think that since cars and the like need to move this way, someone would have a quick response.
So now I'm experimenting with having the enemy detect that it's facing the wrong way and using a running turn animation with root motion to get back around (it overshoots or undershoots), using Unreal's EQS system to find points at the corner of a cone to move to until it's turned back around (it pauses at each point), or moving along a spline (I'm working on this now, I'll try a tiny little bit of curve reused until it hits the proper facing and dynamically adjusting a single spline to follow to the correct facing, not sure how I'll make it avoid running into trees and stuff).
I should just ignore it, this is hardly an impediment to getting this level passably playable, but now I'm in too deep.
I'll say this: if it's your first boss and it doesn't feel difficult enough, leave it right there until multiple people who aren't you issue the same complaint. Very few people are going to complain if your first boss is a cakewalk (and those who would should be ignored). But they will absolutely complain if it's too hard. Even if you later succumb to "difficulty that was tuned to challenge the devs", people will appreciate it if it kicks in later (ideally, after the Steam refund window...........).
My favorite musical instrument is the air-raid siren.
I'll say this: if it's your first boss and it doesn't feel difficult enough, leave it right there until multiple people who aren't you issue the same complaint. Very few people are going to complain if your first boss is a cakewalk (and those who would should be ignored). But they will absolutely complain if it's too hard. Even if you later succumb to "difficulty that was tuned to challenge the devs", people will appreciate it if it kicks in later (ideally, after the Steam refund window...........).
It's not difficulty in this case, just a question of what that pause of action feels like to someone who isn't me, the person who knows that means cooldowns lined up and the boss doesn't have anything to do.
That said, I went ahead and took its idle breathing animation, lowered the head, sped it up, and looped it a few times to reuse as an 'exhausted breathing' thing that will kick in when it has nothing else to do.
I also have a tolerable arcing turn solution worked out, ended up going back to the EQS system and figuring out how that was supposed to work with my behavior tree smoothly (I was running the query in a sequence with the moveto node, when I needed it to be attached to my moveto node as a service that runs a few times per second to update the location it's aiming for).
Still need some mandatory effects (a dust cloud or something to show the radius where you'll be affected by it's jump attack isn't just aesthetic, for example) and then to set up stuff like environmental exploits/a tailored spell/the clues throughout the level that lead to those things. Also want at least one alternative way to get through the level working and to replace some of my temp dialogue.
Biggest problem that I know is just straight up Wrong isn't easily fixed at the moment, which is that the scale of this last bit of level is way off. Takes way too long to walk from one point of interest to another, especially if you have to walk back. Just have to let it be a problem until it's time to redo things to look nice. Or add some sort of traversal thing for this section of the map, I guess.
Back to long sessions again after getting over the thing that was holding me up--I talked about it as a problem I was aware of but just needed to ignore until it was time to remake it properly, but it really was freezing me up to know I'd made part of the level too big and that it was going to feel bad no matter what.
Fortunately, with the help of someone on the Unreal Source discord (Mathew W, actually, who has a pretty widely-recommended Youtube channel for UE4/5 guides) I was able to figure out how to get the lasso tool to actually grab everything in the box, even stuff that was occluded, so I could grab entire buildings and their contents, put them in folders like they should have been from the start, and move them around while walling off a lot of the wasted space.
Turns out that as soon as I knew I could fix that it was easy to gogogo again. Should have this section finished up today after moping around on it for much longer than it warranted.
So, my game editor broke in a big way. I vaguely remember implementing a specific thing; dual materials for each gameobject, one dark, one lit, to show the selection. And thinking- I'll just implement that on the first level of map generation to test the new movement script.
Well, that obviously broke using the higher levels of map generation, which each add complexity. But I couldn't track down exactly where this happened.
(illustration of a broken map fill)
Turns out when refilling the map, if the code that generates map types (ints) would return an older hardcoded map type, the refill function would empty the spot in the array that stores the map, but then not fill it.
That took a lot of tracking down, and then I had to figure out exactly where I was getting the hardcoded ints from.
And that let to this audit result:
step 1: start typefromXY
step 2: inside typefrom XY :get Biomeresult. Default result is 902
step 3: inside typefrom XY :return if mapfillselector = 0; As
step 4: inside typefrom XY : get citymaptype. Default result is 904
step 5: inside typefrom XY : inside citymaptype: get int hGrid.LineValue. default is 'currentvalue' is 904 set by citymaptype
step 6: inside typefrom XY : inside citymaptype: inside hGrid.LineValue: get *MapSquareState* hgrid.getState.
step 7: inside typefrom XY : inside citymaptype: inside hGrid.LineValue: inside hgrid.getState: First Default if (originalType == 0){return new MapSquareState(0);//skip the whole thing;}
step 8: inside typefrom XY : inside citymaptype: inside hGrid.LineValue: inside hgrid.getState: Second Default is lineType new MapSquareState(55150)
step 9: inside typefrom XY : inside citymaptype: inside hGrid.LineValue: inside hgrid.getState: return if (position == mapClosest) is lineType (55150)
step 10: inside typefrom XY : inside citymaptype: inside hGrid.LineValue: inside hgrid.getState: set startNode = GridNodeFromGridPos(closest);
step 11: inside typefrom XY : inside citymaptype: inside hGrid.LineValue: inside hgrid.getState: get test = findPixel(startNode, position). default is 911
step 12: inside typefrom XY : inside citymaptype: inside hGrid.LineValue: inside hgrid.getState: inside findPixel: get HexFill(startNode, position). default is new Vector3Int(999, 99, 99);
and hexfill is only the first of several functions that end up creating the map.
Now there's a lot to deal with here...
-First off, the result of all of this is a single int, mapType . I first get that from 'Biome' which is the default. All of the later functions end up overwriting that single int, or returning the original int.
-Secondly, this mess grew organically, and there are several layers I don't need. Citymaptype and LineValue don't really do anything.
-Third, the intent was to at one point have a table that allows checking which mapType may overwrite which mapType. So that the hexBridge function can draw over the canal generated by the original hexFill function.
So, a big change has to be made. MapSquareState will become MapType. And MapType will become a list of ints. I will set these to 1 as the 'unset' value, then start from the bottom to the top adding the biomes, canals and seas, hex infills (simple), hex infills (complex), hex borders (lines), and then internal canals with lines, bridges with onramps, and finally, in the future, 'stamps'.
So storing arrays (or lists) in an array, always fun. One good thing is that I won't have to rerun my map generation functions each time I refresh the map, instead the map refresher will poll the selected drawing level, and then do the thing to 'draw' i.e. put the right prefabs in the right places.
That said, all the while this will all be broken, because I won't have found my original bug. i know that the bug should be due to the hardcoded mapTypes no longer corresponding to the prefabs made from CSV file defined types. For example, I hardcoded 100 as 'sea' and that is now 99100.
But, changing the CSV values, as far as I remember, did not cause the bug. Creating the prefabs from a class with the new dual material caused the bug. But I also don't think that adding dual material to all the prefab types is going to fix the bug... fun!
I finally finished my first web game! I'm having some DNS trouble with my domain, but I'll post more details and a link soon. I ended up building a web version of Poetry for Neanderthals for playing over Zoom, and I'm really proud of the results.
I'll do some more UI polish soon, but I'm planning on keeping it fairly utilitarian since UX isn't my speciality. If you don't know the rules to the game it might not make much sense, but it's pretty fun!
The app is built on Next.js with Redux, and hosted on Firebase to sync data changes across clients. I've got user authentication and OAuth providers, but it's optional for creating/joining a lobby. I put a bunch of work into nice-to-have features, and separating out game logic from common functionality for future re-use.
I've got some more ideas for future projects I want to pursue next, but I made a push to finish this project first because I knew it was important. I really hit my stride towards the end as the months of architecture prep started to pay off, so I think I can start pumping things out pretty fast now. Stay tuned!
If anybody does Zoom hangouts etc and is up for trying a new game, I'd love to get some playtesting! We had a lot of fun playing this game in our hybrid work socials, with a much jankier implementation than this. This is the first place I'm posting it so I'd appreciate even just poking around with multiple devices, iOS in particular since I've only tested on my Pixel. You can go through a game solo or with all players in one team for co-op.
If anybody does Zoom hangouts etc and is up for trying a new game, I'd love to get some playtesting! We had a lot of fun playing this game in our hybrid work socials, with a much jankier implementation than this. This is the first place I'm posting it so I'd appreciate even just poking around with multiple devices, iOS in particular since I've only tested on my Pixel. You can go through a game solo or with all players in one team for co-op.
The 'create lobby' button was greyed out for me, had to create a profile on the top right, just used my Gmail account.
A message to our community: Unity is canceling the Runtime Fee
After deep consultation with our community, customers, and partners, we’ve made the decision to cancel the Runtime Fee for our games customers, effective immediately. Non-gaming Industry customers are not impacted by this modification.
Not super surprising, they're still down 90% from their all time stock high, it was an "everyone disliked that" moment and their financials haven't improved
If anybody does Zoom hangouts etc and is up for trying a new game, I'd love to get some playtesting! We had a lot of fun playing this game in our hybrid work socials, with a much jankier implementation than this. This is the first place I'm posting it so I'd appreciate even just poking around with multiple devices, iOS in particular since I've only tested on my Pixel. You can go through a game solo or with all players in one team for co-op.
The 'create lobby' button was greyed out for me, had to create a profile on the top right, just used my Gmail account.
Ah thanks, a player name is required but the error UI is pretty subtle. I'll add an error message and a default value. Now that I look at it in light mode, the text input also doesn't look much like an input which was probably your issue.
Not super surprising, they're still down 90% from their all time stock high, it was an "everyone disliked that" moment and their financials haven't improved
Damn, I decided to poke around with my lighting and post-processing because I was at a bit of an impasse on other stuff I was working on, now it's hard to turn my brain off and ignore it to get back to the other stuff.
It's taken blood sweat and tears but the spaghetti code has been refactored, and I now have my hexes back:
That said, I barely understand the code that generates these, let alone the line bundles. Been too long since I wrote it. Presumably, I can work my way down the calls to resurrect those, too.
But something is wrong in the code that takes the mapType int and matches it to a Tiling, or the code that then adds the wanted prefab. It still doesn't survive a result that it cannot find in the lists.
So the next step should be to create some failsafe defaults for those functions that I can also spot easily.
Every time I see a low poly model quickly thrown together by someone else, I'm stricken by two thoughts back to back:
Maybe I could learn to do this right after all without messing up my rhythm, instead of just surrendering immediately and actively aiming for trash nonsense when I need a filler model
No, you moron, don't undervalue the skills of others, you will drown if you enter those waters, only commit to that if you have no other choice after everything else is done
I don't think either thought is completely wrong, so I guess I should aim for 'actually try to make it look right, but if it's not working just move forward with whatever you've got anyway' so I can at least attempt to develop that skill.
Every time I see a low poly model quickly thrown together by someone else, I'm stricken by two thoughts back to back:
Maybe I could learn to do this right after all without messing up my rhythm, instead of just surrendering immediately and actively aiming for trash nonsense when I need a filler model
No, you moron, don't undervalue the skills of others, you will drown if you enter those waters, only commit to that if you have no other choice after everything else is done
I don't think either thought is completely wrong, so I guess I should aim for 'actually try to make it look right, but if it's not working just move forward with whatever you've got anyway' so I can at least attempt to develop that skill.
I don't think basic modeling skills are something you can totally avoid.
Even if you buy models from elsewhere, you likely have to clean them up, fix the UVs, check the rigging etc.
For freebie models that's a certainty.
I always feel modeling from scratch is quicker than cleaning up models from elsewhere.
But then I came to gamedev from the 3D modeling side...
Every time I see a low poly model quickly thrown together by someone else, I'm stricken by two thoughts back to back:
Maybe I could learn to do this right after all without messing up my rhythm, instead of just surrendering immediately and actively aiming for trash nonsense when I need a filler model
No, you moron, don't undervalue the skills of others, you will drown if you enter those waters, only commit to that if you have no other choice after everything else is done
I don't think either thought is completely wrong, so I guess I should aim for 'actually try to make it look right, but if it's not working just move forward with whatever you've got anyway' so I can at least attempt to develop that skill.
I don't think basic modeling skills are something you can totally avoid.
Even if you buy models from elsewhere, you likely have to clean them up, fix the UVs, check the rigging etc.
For freebie models that's a certainty.
I always feel modeling from scratch is quicker than cleaning up models from elsewhere.
But then I came to gamedev from the 3D modeling side...
Yeah, I know someone needs to model and animate even if you're buying both. The initial plan was just that it would be Not Me doing it.
The good news is that I've finally stopped spinning my wheels and committed to a particular approach to resources for my magic system, at least committed enough to implement it and see how I feel about it over the course of a full level, which was the last thing I needed to solve before I could start making serious progress again.
Environmental magic alignment and intensity determines which normal spells you can cast for free (which includes, like, needing to rely more on block or dodge depending on the environment since the other might not be free), limited supply of personal mana (which doesn't regenerate on its own) which lets you cast other base spells, ammo/catalyst system (with some catalysts being for a few different spells) for the very strong versions of spells. Then make quite a few enemies that can be downed or otherwise disabled or avoided for a while for free, but require resources or some environmental interaction to put down for real.
I'm a little tempted to make it so that you just have a 'defense' button that blocks or dodges depending on what the environment favors, and have your free attack change between two options the same way, but options are nice if I can keep it from being annoying to control...
The previous hex generation code was set up to run three checks one after another, each with a startnode slightly offset. These checks returned a result only if it found the pixel to be in certain relation to the start nodes of the hex. I overlooked the case where almost all pixels are 'above' the lowest startnode checked. I used to have a maximum value for that beyond which no result was returned but that got lost somewhere along the way.
This caused me to lose a day of free time just to hunt down that specific bug.... But having done so, I now have glorious line bundles lining my hexes! Well, on some, that is, but I think the debugging of that little issue is going to take me less time. (famous last words).
During the debugging I removed one level of functions, againt simplifying my code. And while I hope to soon return to the load/save and UI features, the next time I look at the map generation, the code should be a bit easier to grok.
So, fixed the lines. Removed the dual materials for select/unselect from where I had them and added them to the prefabs list. Given that prefabs may have multiple children made them lists.
Set the UI up to display the selected prefab's identity photp and name.
Set the walker up to update the 9grid shown in the UI. Poll the lines and biomes for colors that match the ,9grid types.
And then we get this
Started this madness 3 years ago but it's starting to come together.
Next up is a button to add prefabs onto the map, which also creates tilings, etc...
Spent a bit of time learning the basics of the Unreal sequencer so I can make cutscenes and the like, plus learning more about how to use my dialogue tree plugin.
Also working on completely nailing down the details of my character's basic spell kit and how I want it to interact with environmental mana. I have it all working in a way that's fine, but I'm not 100% satisfied yet. Melee, ranged, block, dodge. Environmental mana is what it sounds like, with dark volumes and light volumes that can overlap and can be changed in intensity by stuff you do in a level. Focus is your MP, can be restored through exploration and consumables but doesn't regenerate on its own.
Melee is just a melee slash that scales up a bit when the environmental mana substantially favors dark. A little dull and doesn't have a Focus spending option yet. Maybe a sequence of swings where subsequent attacks within a window have an increasing Focus cost and increasing damage?
Ranged is a set of three arrows/bolts/darts, fired one at a time, that scale up a bit when the environmental mana substantially favors light. Need to kill the enemy they're stuck in, physically retrieve them, or spend Focus to detonate them to get them back to shoot again.
Block turns incoming damage into recoverable damage, but if you take a clean hit before you recover you'll lose it. Focus cost is reduced by light mana in the environment and increased by dark mana in the environment (can be free if there's enough light relative to dark).
Dodge is iframes, you move in the direction a bit and everything is shadowy for a second. Inverse of Block at the moment, Focus cost decreased by dark and increased by light and can be free.
Still have a lot of ideas to churn through, though, particularly with block. I might allow block without Focus even in a dark environment for a quick, brief block with a cooldown, so parry timing or nothing at all. I might make it always work and then vary the details with the environment. Like the more light, the faster you recover the gray health. Or in a high-light environment you get a true block that completely removes some incoming damage. Or the parry window scales with light. Or there's a gray health maximum that scales with light, so that your ability to block multiple hits or big hits is contingent on it being a light-favored environment. Or make taking a hit with your block held past the parry window take Focus, scaled to the damage and light level, such that blocking in a darker environment is really pricey.
My thoughts for dodge are less all over the place, I should probably let it work but without iframes if you can't afford the Focus cost.
And of course it's irrelevant at this stage of things, except to remind myself to keep ideas free instead of piling too much stuff onto the base kit, but spells will have variants and completely different spells that can replace them on a button further into the game. A big ground-covering light-aligned dodge without iframes, alternate melee that changes it up the way a different weapon might in another game, etc.
Realized that if I don't solve it now, solving it later would be a nightmare, and not solving it isn't an option, so I decided it was time to separate out my spells from my character.
Was thinking about making each spell a separate actor or actor component, but decided instead that I'd just bite the bullet and learn to use the Gameplay Ability System that's actually for this sort of thing. Mostly because every time I'm trying to solve a problem in AI or interactions with whatever and I see all these super handy interactions with Gameplay Tags popping up, I wished I was using it anyway...
Been taking a break because Satisfactory was occupying the "builder" part of my brain, but React Jam starts today, which is a great fit for my project and might give me some help with publicity. I'm working on a MMO Minesweeper concept that I'd already been thinking about doing as my next project, and it happens to fit the "retro minimalism" theme perfectly. I have a bunch of ideas for stretch goals but for now I'll see how long it takes me just to get a shared infinite board running.
I have a few days left on the jam and am making good progress, I now have the majority of the game logic working. I spent a bunch of time on performance because I was initially thinking of making the board infinite, but I ran into too many issues and I realized that it probably wasn't good for the multiplayer concept anyway for the players to have infinite space. So I settled on just doing a very large board - it's broken up into more traditionally sized segments which will be reset if you hit a mine.
I did still spend a lot of time on performance and Firestore billing considerations, because they charge both per-read and for total bandwidth usage. So I don't store any tile state on the server, I only store a random seed for each segment and the user events for in-progress segments, which is used to reconstruct them in the UI. I also debounce the network requests if you are quickly clearing tiles so they won't cause as many updates for all users.
I got through most of the learning pains of GAS and went ahead and got a lot of things working better under the hood and ready for various things to come. Maybe I should have just waited on that so I could have finished the level in September for the mental milestone but eh, I'm doing fine on momentum.
Then I went back to working on the updated version of my starting area/tutorial. Have 6 days until I need to work again, so I miiiight be able to wrap up the tutorial, finish up a few things on the other maps of the first level, and have something playable from start to finish.
UI is currently my big blind spot. I can make my basic HUD and dialogue stuff work the way I want and make small adjustments, but when I think of making a pause screen with all sorts of layered menus pulling data from all over, I'm not sure where to start. Especially with the CommonUI stuff for easy layering of stuff and navigation with kbam/controller/anything you throw at it. So how long it takes me to really be done with this first level depends on how long it takes for me to pick that up and how much I want to dedicate to doing it right versus just getting it done.
The game is fully working now! I'm really happy with how it turned out and I've got more ideas for features and improvements I want to add, but I'm going to take a break for D4: VoH. I did my best to make it performant for mobile, but I think it has some room for improvement still.
Each difficulty's board is shared with all players, and can be reset when it's done. In the future I want to add player progression and incentives, maybe a competitive mode.
The game is fully working now! I'm really happy with how it turned out and I've got more ideas for features and improvements I want to add, but I'm going to take a break for D4: VoH. I did my best to make it performant for mobile, but I think it has some room for improvement still.
Each difficulty's board is shared with all players, and can be reset when it's done. In the future I want to add player progression and incentives, maybe a competitive mode.
I think there is a bug where a board isn't complete even if all the non mine cells are clicked, when a mine is left marked as a ?:
That sector isn't being colored green like the completed ones, but I can't unmark that ? and change it to a mine flag (probably because I didn't set it?).
Oh good catch, it looks like my schema doesn't work properly when multiple users are toggling the same tile. I can make it more robust but I'll need to do a bit of refactoring.
Oh good catch, it looks like my schema doesn't work properly when multiple users are toggling the same tile. I can make it more robust but I'll need to do a bit of refactoring.
I think that having all the cells that are not mines clicked counts as a win condition in normal minesweeper, but I could be wrong.
I think you're right, because all the mobile clones I've played force you to mark them anyway and it always bothers me. I'm fairly certain my dad never even marked them, he just speedran it.
Yeah you're right, I always flag things and never understood what the question mark was even for, lol. But I'm not actually very good at it, I need to read up on more of the deduction techniques.
Flagging is important though because it lets you multiclear tiles by clicking fulfilled numbers. In the original that was done by clicking both buttons at once, but I changed it to work with either left or right click.
Question mark is for "high risk but unclear" tiles. Say your first click is a 7. Mark all surrounding as ,? and move on
It also exists because unless your puzzle generator as a 'no guesses required mode' most minesweeper puzzles require guessing to solve (IE there are situations where you cannot know for sure what move is safe, and you have no 'safe' moves to choose). ?s help keep track of those and save those sections of the puzzle for when you have the most possible information.
That leads into a suggestion for a future improvement: a 'no guesses' mode where it does not generate puzzles that require guessing (this is not trivial though).
I did notice a bug: There were times where clicking a cell to reveal it would instead flag it as a mine or as a question mark. I for-sure left clicked. It could be a synchronization issue where the cell had been flagged by someone else, but I was playing pretty late at night and I wasn't seeing other user activity in the puzzle.
I got the button to clear the whole puzzle before all the sectors were solved. I'm not sure if that is intentional or not.
Another suggestion if you continue to work on it: Sometimes, you come back and the board is totally different. A "hey the board you played on last time finished!" message would not be amis
It's a shame I don't see any way to profit from game dev in near future. I'm pretty sure that if I could get someone to hand me $12k so I could scrape by on my share of bills for a year, I'd be content to spend 12 hours a day in Unreal Editor.
Maybe I'll make an serious attempt at the artistic half of the equation after I get everything in this first level perfect from a gameplay and UI perspective...
Posts
I am doing both as an amateur, and really feel that shipping/publishing is half of the skillset.
-Making small games and writing short novellas is a good way to practice the art of finishing.
-Having a release is a nice bulwark against imposter syndrome from which you can self-critique without losing motivation.
-Gets your obsession out of the way and allows you to move on to something that might suit your talent/proclivities/capacities better.
-Game specific you experience the whole life cycle, figuring out why and how to get reviews, build for dev videos, link to social media...
Against that, the churn of modern Indie publishing in both writing and games. You will absolutely be competing with people who are natural born or experience grown marketers why put 99% of their effort into marketing a pizza box with pasta glued on.
So, never read the reviews in this day and age translates to never check your KDP stats or downloads. You justn'eed to care enough about the consumer to see if your marketing works. Write/dev for yourself.
But finish, and publish, and start over. Smaller/shorter games and books will make that easier.
It's weird, because looking at all the pieces of the process it should be the kind of thing I pick up quickly, even if I don't have the artistic sense cultivated to make good use of it.
But instead I just feel like I'm drowning at all times.
Blender has a pretty steep learning curve at first, especially the fiddly UI regarding creating and shifting view windows, or getting stuck in a mode where you don't find the button you need.
Don't know UE but if it uses state machines for animation, that's also likely to be idiosyncratic if you're used to simple keyframe animation. Adding inverse kinematics etc. makes for much more frustration...
I don't know if that ever stops unless you are a dedicated animator, it's always been my weak spot.
I updated the movement to go north-south - east-west and the purple is where I started on the selection of a mapsquare. The idea is that you will move that selection around, with the camera following. I'll use a brighter material to highlight the selected mapsquare, which is why the purple (that just deletes the existant material)
That's it for now, pretty easy after implementing the UI, and once I have the highlight material working, I can add a button that both creates a 'tiling' and instantiates the prefab specified in it across the whole map wherever that tiling applies. That functionality is mostly already present, but it'll conclude the 'port to mobile' journey.
I hadn't gotten around to creating an 'identity card' for the tiling, which will be next. That'll be a less clunky way to set up the different attributes of a tiling. And at that point lots of testing to fill the map with tilings, save, load, repeat.
Then I have to add in an 'undo list' of tilings to have some undo levels on the map, and a UI to just see the existing tiling identity cards in a grid and delete them from there. Those are quality of life issues, and I'm going to have to start looking at the map generation again where I left some feature creep unimplemented. No use looking far beyond that, but I might be able to get it in shape enough to present it at a local gamedev group, which I'm sure will trigger 'oh you made a bad clunky *existing asset*'.
Might just be that any time he's not moving, instead of feeling tension or thinking about what I should do next to defeat him, I'm wondering what his AI is doing and wondering if he's staring too long or realizing I need to make some of his idle animations unable to play once he's aggroed since if he's close enough to hit me but has no attacks available for a split second he enters the Idle animation state which can fire off looking around or snuffling the ground or...
It's tricky, because my feeling that my zombie-like enemies were too pathetic and too easily ignored ended up being completely disconnected from how anyone who playtested the first little bit for me actually experienced them.
Which I guess makes sense. I went and watched a no-hit run of RE2make and it was pretty similar to how I interact with my own zombies, just zero threat, walk around them, walk through them during some animations, etc. Same as how you interact with Dark Souls mobs after a bit, just jogging around doing what you need to do, annihilating any hollows that get in the way without really caring about what they're trying to do.
But knowing that I can't perceive it clearly doesn't magically make me able to tell how others will, at least not yet. Maybe with more experience. Maybe I need to set a 'dev difficulty' that makes everything but the player move faster.
Probably would be a good idea to add some pattern where it would intentionally get some distance for...something. Maybe run around a bit to build up speed then do a high speed line charge that doesn't track? Since it really does glue itself to you at the moment. It's crazed and cursed so maybe it just randomly gets distracted to attack things in the environment.
Maybe I'll let him be this aggro but give him a stamina system. Or, rather, use the token system that's meant to keep multiple enemies from overwhelming you. Make 'breathing heavily in place' his least favored 'attack' but his only one that costs zero tokens and make tokens return slower than they normally would.
At least I was able to make use of the animations and whatnot that came with this random free pig asset to make something that genuinely feels like a decent boss. Speeding things up, slowing things down, adding and adjusting root motion as needed, allowing tracking during certain parts of animations but not others. Like there was this one 'combo attack' animation where it walks forward swinging its head right and left and finishes with a leap. Realistically the leap was pointless, either the head swings got you or you just watched it wander away, leap at nothing, and awkwardly turn around since it lacked any kind of turn-in-place animations.
So I made it so that during that jump, it can rotate despite being in an animation montage that would normally prevent that AND gains the ability to rotate far faster than I allow it to on foot. So now the jump is repositioning instead of just an awkward waste.
Of course, for the way my game works, just making a boss that would fit in a Soulslike is only part of it. Need to make it so you can do interesting stuff with the environment and spells based on information you've picked up previously. So plenty of work ahead. But hey, progress.
Maybe I'll be willing to show my work here soon, even if it's still all ugly as shit.
I don't want my boar boss to turn in place if it ends up faced away from the player, I want it to run forward and arc around to face the player again.
Somehow this is the one problem where no one has a quick solution to offer in the Unreal Source discord. You would think that since cars and the like need to move this way, someone would have a quick response.
So now I'm experimenting with having the enemy detect that it's facing the wrong way and using a running turn animation with root motion to get back around (it overshoots or undershoots), using Unreal's EQS system to find points at the corner of a cone to move to until it's turned back around (it pauses at each point), or moving along a spline (I'm working on this now, I'll try a tiny little bit of curve reused until it hits the proper facing and dynamically adjusting a single spline to follow to the correct facing, not sure how I'll make it avoid running into trees and stuff).
I should just ignore it, this is hardly an impediment to getting this level passably playable, but now I'm in too deep.
I'm "kupiyupaekio" on Discord.
It's not difficulty in this case, just a question of what that pause of action feels like to someone who isn't me, the person who knows that means cooldowns lined up and the boss doesn't have anything to do.
That said, I went ahead and took its idle breathing animation, lowered the head, sped it up, and looped it a few times to reuse as an 'exhausted breathing' thing that will kick in when it has nothing else to do.
I also have a tolerable arcing turn solution worked out, ended up going back to the EQS system and figuring out how that was supposed to work with my behavior tree smoothly (I was running the query in a sequence with the moveto node, when I needed it to be attached to my moveto node as a service that runs a few times per second to update the location it's aiming for).
Still need some mandatory effects (a dust cloud or something to show the radius where you'll be affected by it's jump attack isn't just aesthetic, for example) and then to set up stuff like environmental exploits/a tailored spell/the clues throughout the level that lead to those things. Also want at least one alternative way to get through the level working and to replace some of my temp dialogue.
Biggest problem that I know is just straight up Wrong isn't easily fixed at the moment, which is that the scale of this last bit of level is way off. Takes way too long to walk from one point of interest to another, especially if you have to walk back. Just have to let it be a problem until it's time to redo things to look nice. Or add some sort of traversal thing for this section of the map, I guess.
Fortunately, with the help of someone on the Unreal Source discord (Mathew W, actually, who has a pretty widely-recommended Youtube channel for UE4/5 guides) I was able to figure out how to get the lasso tool to actually grab everything in the box, even stuff that was occluded, so I could grab entire buildings and their contents, put them in folders like they should have been from the start, and move them around while walling off a lot of the wasted space.
Turns out that as soon as I knew I could fix that it was easy to gogogo again. Should have this section finished up today after moping around on it for much longer than it warranted.
Well, that obviously broke using the higher levels of map generation, which each add complexity. But I couldn't track down exactly where this happened.
(illustration of a broken map fill)
Turns out when refilling the map, if the code that generates map types (ints) would return an older hardcoded map type, the refill function would empty the spot in the array that stores the map, but then not fill it.
That took a lot of tracking down, and then I had to figure out exactly where I was getting the hardcoded ints from.
And that let to this audit result:
and hexfill is only the first of several functions that end up creating the map.
Now there's a lot to deal with here...
-First off, the result of all of this is a single int, mapType . I first get that from 'Biome' which is the default. All of the later functions end up overwriting that single int, or returning the original int.
-Secondly, this mess grew organically, and there are several layers I don't need. Citymaptype and LineValue don't really do anything.
-Third, the intent was to at one point have a table that allows checking which mapType may overwrite which mapType. So that the hexBridge function can draw over the canal generated by the original hexFill function.
So, a big change has to be made. MapSquareState will become MapType. And MapType will become a list of ints. I will set these to 1 as the 'unset' value, then start from the bottom to the top adding the biomes, canals and seas, hex infills (simple), hex infills (complex), hex borders (lines), and then internal canals with lines, bridges with onramps, and finally, in the future, 'stamps'.
So storing arrays (or lists) in an array, always fun. One good thing is that I won't have to rerun my map generation functions each time I refresh the map, instead the map refresher will poll the selected drawing level, and then do the thing to 'draw' i.e. put the right prefabs in the right places.
That said, all the while this will all be broken, because I won't have found my original bug. i know that the bug should be due to the hardcoded mapTypes no longer corresponding to the prefabs made from CSV file defined types. For example, I hardcoded 100 as 'sea' and that is now 99100.
But, changing the CSV values, as far as I remember, did not cause the bug. Creating the prefabs from a class with the new dual material caused the bug. But I also don't think that adding dual material to all the prefab types is going to fix the bug... fun!
I'll do some more UI polish soon, but I'm planning on keeping it fairly utilitarian since UX isn't my speciality. If you don't know the rules to the game it might not make much sense, but it's pretty fun!
https://youtu.be/rHji9ysnr3A
The app is built on Next.js with Redux, and hosted on Firebase to sync data changes across clients. I've got user authentication and OAuth providers, but it's optional for creating/joining a lobby. I put a bunch of work into nice-to-have features, and separating out game logic from common functionality for future re-use.
I've got some more ideas for future projects I want to pursue next, but I made a push to finish this project first because I knew it was important. I really hit my stride towards the end as the months of architecture prep started to pay off, so I think I can start pumping things out pretty fast now. Stay tuned!
If anybody does Zoom hangouts etc and is up for trying a new game, I'd love to get some playtesting! We had a lot of fun playing this game in our hybrid work socials, with a much jankier implementation than this. This is the first place I'm posting it so I'd appreciate even just poking around with multiple devices, iOS in particular since I've only tested on my Pixel. You can go through a game solo or with all players in one team for co-op.
The 'create lobby' button was greyed out for me, had to create a profile on the top right, just used my Gmail account.
Ah thanks, a player name is required but the error UI is pretty subtle. I'll add an error message and a default value. Now that I look at it in light mode, the text input also doesn't look much like an input which was probably your issue.
Edit: Fixed!
It's clear where their future intentions lie.
That said, I barely understand the code that generates these, let alone the line bundles. Been too long since I wrote it. Presumably, I can work my way down the calls to resurrect those, too.
But something is wrong in the code that takes the mapType int and matches it to a Tiling, or the code that then adds the wanted prefab. It still doesn't survive a result that it cannot find in the lists.
So the next step should be to create some failsafe defaults for those functions that I can also spot easily.
I don't think either thought is completely wrong, so I guess I should aim for 'actually try to make it look right, but if it's not working just move forward with whatever you've got anyway' so I can at least attempt to develop that skill.
I don't think basic modeling skills are something you can totally avoid.
Even if you buy models from elsewhere, you likely have to clean them up, fix the UVs, check the rigging etc.
For freebie models that's a certainty.
I always feel modeling from scratch is quicker than cleaning up models from elsewhere.
But then I came to gamedev from the 3D modeling side...
Yeah, I know someone needs to model and animate even if you're buying both. The initial plan was just that it would be Not Me doing it.
The good news is that I've finally stopped spinning my wheels and committed to a particular approach to resources for my magic system, at least committed enough to implement it and see how I feel about it over the course of a full level, which was the last thing I needed to solve before I could start making serious progress again.
Environmental magic alignment and intensity determines which normal spells you can cast for free (which includes, like, needing to rely more on block or dodge depending on the environment since the other might not be free), limited supply of personal mana (which doesn't regenerate on its own) which lets you cast other base spells, ammo/catalyst system (with some catalysts being for a few different spells) for the very strong versions of spells. Then make quite a few enemies that can be downed or otherwise disabled or avoided for a while for free, but require resources or some environmental interaction to put down for real.
I'm a little tempted to make it so that you just have a 'defense' button that blocks or dodges depending on what the environment favors, and have your free attack change between two options the same way, but options are nice if I can keep it from being annoying to control...
The previous hex generation code was set up to run three checks one after another, each with a startnode slightly offset. These checks returned a result only if it found the pixel to be in certain relation to the start nodes of the hex. I overlooked the case where almost all pixels are 'above' the lowest startnode checked. I used to have a maximum value for that beyond which no result was returned but that got lost somewhere along the way.
This caused me to lose a day of free time just to hunt down that specific bug.... But having done so, I now have glorious line bundles lining my hexes! Well, on some, that is, but I think the debugging of that little issue is going to take me less time. (famous last words).
During the debugging I removed one level of functions, againt simplifying my code. And while I hope to soon return to the load/save and UI features, the next time I look at the map generation, the code should be a bit easier to grok.
Set the UI up to display the selected prefab's identity photp and name.
Set the walker up to update the 9grid shown in the UI. Poll the lines and biomes for colors that match the ,9grid types.
And then we get this
Started this madness 3 years ago but it's starting to come together.
Next up is a button to add prefabs onto the map, which also creates tilings, etc...
https://youtu.be/w6aNn8KL_tw?si=w2Vml4UuluaGs8Ih
Also working on completely nailing down the details of my character's basic spell kit and how I want it to interact with environmental mana. I have it all working in a way that's fine, but I'm not 100% satisfied yet. Melee, ranged, block, dodge. Environmental mana is what it sounds like, with dark volumes and light volumes that can overlap and can be changed in intensity by stuff you do in a level. Focus is your MP, can be restored through exploration and consumables but doesn't regenerate on its own.
Still have a lot of ideas to churn through, though, particularly with block. I might allow block without Focus even in a dark environment for a quick, brief block with a cooldown, so parry timing or nothing at all. I might make it always work and then vary the details with the environment. Like the more light, the faster you recover the gray health. Or in a high-light environment you get a true block that completely removes some incoming damage. Or the parry window scales with light. Or there's a gray health maximum that scales with light, so that your ability to block multiple hits or big hits is contingent on it being a light-favored environment. Or make taking a hit with your block held past the parry window take Focus, scaled to the damage and light level, such that blocking in a darker environment is really pricey.
My thoughts for dodge are less all over the place, I should probably let it work but without iframes if you can't afford the Focus cost.
And of course it's irrelevant at this stage of things, except to remind myself to keep ideas free instead of piling too much stuff onto the base kit, but spells will have variants and completely different spells that can replace them on a button further into the game. A big ground-covering light-aligned dodge without iframes, alternate melee that changes it up the way a different weapon might in another game, etc.
Was thinking about making each spell a separate actor or actor component, but decided instead that I'd just bite the bullet and learn to use the Gameplay Ability System that's actually for this sort of thing. Mostly because every time I'm trying to solve a problem in AI or interactions with whatever and I see all these super handy interactions with Gameplay Tags popping up, I wished I was using it anyway...
I did still spend a lot of time on performance and Firestore billing considerations, because they charge both per-read and for total bandwidth usage. So I don't store any tile state on the server, I only store a random seed for each segment and the user events for in-progress segments, which is used to reconstruct them in the UI. I also debounce the network requests if you are quickly clearing tiles so they won't cause as many updates for all users.
Here's a WIP preview:
https://youtu.be/q153ePMMCRk
Then I went back to working on the updated version of my starting area/tutorial. Have 6 days until I need to work again, so I miiiight be able to wrap up the tutorial, finish up a few things on the other maps of the first level, and have something playable from start to finish.
UI is currently my big blind spot. I can make my basic HUD and dialogue stuff work the way I want and make small adjustments, but when I think of making a pause screen with all sorts of layered menus pulling data from all over, I'm not sure where to start. Especially with the CommonUI stuff for easy layering of stuff and navigation with kbam/controller/anything you throw at it. So how long it takes me to really be done with this first level depends on how long it takes for me to pick that up and how much I want to dedicate to doing it right versus just getting it done.
https://www.bigminesweeper.com/
Each difficulty's board is shared with all players, and can be reset when it's done. In the future I want to add player progression and incentives, maybe a competitive mode.
I think there is a bug where a board isn't complete even if all the non mine cells are clicked, when a mine is left marked as a ?:
That sector isn't being colored green like the completed ones, but I can't unmark that ? and change it to a mine flag (probably because I didn't set it?).
I think that having all the cells that are not mines clicked counts as a win condition in normal minesweeper, but I could be wrong.
Flagging is important though because it lets you multiclear tiles by clicking fulfilled numbers. In the original that was done by clicking both buttons at once, but I changed it to work with either left or right click.
It also exists because unless your puzzle generator as a 'no guesses required mode' most minesweeper puzzles require guessing to solve (IE there are situations where you cannot know for sure what move is safe, and you have no 'safe' moves to choose). ?s help keep track of those and save those sections of the puzzle for when you have the most possible information.
That leads into a suggestion for a future improvement: a 'no guesses' mode where it does not generate puzzles that require guessing (this is not trivial though).
I did notice a bug: There were times where clicking a cell to reveal it would instead flag it as a mine or as a question mark. I for-sure left clicked. It could be a synchronization issue where the cell had been flagged by someone else, but I was playing pretty late at night and I wasn't seeing other user activity in the puzzle.
I got the button to clear the whole puzzle before all the sectors were solved. I'm not sure if that is intentional or not.
works much better than I expected though, kudos
Maybe I'll make an serious attempt at the artistic half of the equation after I get everything in this first level perfect from a gameplay and UI perspective...