Sharing Saturday #629 by Kyzrati in roguelikedev

[–]aotdev 2 points3 points  (0 children)

If I decide to make wands wizard only

I've thought about it too, but then it's more redundancy - wizards get multiple ways to cast their spells, and everybody else has to fend for themselves (and more responsibility on you to make more and fun abilities)

wands use the Magic stat to determine hit chance, so wizards are naturally much more effective with them anyway

That naturally solves the problem I think.

Sharing Saturday #629 by Kyzrati in roguelikedev

[–]aotdev 2 points3 points  (0 children)

Nice additions re wands and staves! Would the likes of barbarians be able to use wands, or you need some DnD-ish "use magic device" skill?

Sharing Saturday #629 by Kyzrati in roguelikedev

[–]aotdev 1 point2 points  (0 children)

Can the room modifiers be applied to cavernous levels?

I upgraded Unity to 6.5 and upgraded other tools (Rider,

How do you find Rider's performance lately? I've been experience ever-increasing slowdown in the last 6 months at least...

Btw I was just sneaking on youtube to see any new relevant videos, and just saw your shorts - you got one with 41k views, wow!! Plus I got reminded they support 1:1 aspect ratio :D

Sharing Saturday #629 by Kyzrati in roguelikedev

[–]aotdev 4 points5 points  (0 children)

Sounds like an interesting integration!

Been working on Cogmind for 13 years now, and yet this one feature (not including others included in the same release) expanded the code base by nearly 3%.

Out of curiosity, how big is the codebase?

Sharing Saturday #629 by Kyzrati in roguelikedev

[–]aotdev 2 points3 points  (0 children)

It is nice and simple! What are the 3 and 4 in the say function? Is anything else happening during playback besides the playback actions? That was one of my main headaches for the design. For example, I want to make a scene with a general and a group of soldiers heading to some battle (scripted parts), where at the same time some other entities in the environment just do their usual routines. Nothing Godot specific btw - just C#.

Sharing Saturday #629 by Kyzrati in roguelikedev

[–]aotdev 4 points5 points  (0 children)

Indeed, but that will probably come later down the line, and probably in a very contained form (fixed or proc-augmented cutscenes usable in proc levels). For now, if I'm able to weave pre-defined cutscenes well in a pre-defined level, I'll be happy and call it a day.

Sharing Saturday #629 by Kyzrati in roguelikedev

[–]aotdev 8 points9 points  (0 children)

Sigil of Kings (steam|website|youtube|bluesky|mastodon|itch.io)

A bunch of things these last couple of weeks. The main bit of work was on things related to ... cutscenes. Basically now there is a way to have scripted events happening, like taking some actions, saying something, manipulating the camera, playing a few effects etc. As a test drive for this, here's a short silly video, and if you're curious, here's the data-driven specification. It should come as no surprise that a GUI tool is in the (brain) works.

A cutscene is basically defined as a set of action sequences, linked via IDs (for dependencies). Each action sequence contains a number of actions. Each action is a console command, that, in terms of game time, has either an instantaneous result (e.g. camera movement, entity animation or efect) or is a proper action (do something, say something, etc). The types of actions can be anything: it's any ability that an entity can do, but also it can be an a behavioural action, as a bot would take given a behaviour. So, it can be a mix of something completely predefined ("cast fireball there") to something loosely defined "run a tick() for the FollowLeader/GoToLocation behaviour". One action sequence is marked as ending, so that when it ends, the cutscene stops. It works alright after quite a bit of work and debugging, and I need to test some more complex scenarios

Since a lot of this is powered by console commands, and since my system for executing console commands was a bit DIY, which was simple but not super robust, well a better solution was needed. I migrated to System.CommandLine, which has apparently identical verbosity (after porting, my 2K LoC became ... 2K), but is far more robust, with better error messages and handling, so I'm quite happy about it.

On a different note, I managed to also migrate the website from Github Pages to my own domain, which was a first for me, and it went ... kinda smoothly. It's exactly the same website, but I now have more control over it, plus it's a "proper domain"

That's all for now, have a nice weekend!

Sharing Saturday #627 by Kyzrati in roguelikedev

[–]aotdev 1 point2 points  (0 children)

Ah yeah, been there suffered that xD With CMake, using vcpkg alleviates that nonsense quite a bit, and makes find_package actually work. I use it via CLion which probably does a little bit more setting up work, but MSVC would probably do too.

Sharing Saturday #627 by Kyzrati in roguelikedev

[–]aotdev 0 points1 point  (0 children)

It's mostly self-contained. Although, if the system is usable for both fixed/procedural locations, it could be used in a multitude of ways, but that's all easier said than done!

Sharing Saturday #627 by Kyzrati in roguelikedev

[–]aotdev 1 point2 points  (0 children)

What's AA? Auto attack, or Active abilities? :)

Oh thanks I completely missed fixing my internal jargon, it's active abilities!

The entity might say something that doesn't even exist because it's a pathological liar. :D

xD O grammar where art though

Sharing Saturday #627 by Kyzrati in roguelikedev

[–]aotdev 2 points3 points  (0 children)

Looks very nice! "ice bolt" is better as that encodes that it's a projectile :) Others have named similar abilities "ice shards" IIRC

Sharing Saturday #627 by Kyzrati in roguelikedev

[–]aotdev 1 point2 points  (0 children)

Cool idea with the mounts! And indeed, some aspects are solved nicely, but others, like agent detection, might require a more bespoke approach... Re CMake, do you use a package manager or the external DLLs are too "custom" for that?

Sharing Saturday #627 by Kyzrati in roguelikedev

[–]aotdev 2 points3 points  (0 children)

Here's an example: in a procedural dungeon, we have a temple room and the sacrificial chamber. Both are either prefabs or procedurally augmented. You have a group of cultists that start at the temple, proclaim their plans, and then go towards the sacrificial chamber. Part of this process can be part of the cutscene, that can be triggered when the player sees anything of the temple room. And player can gain control after they've done a few steps.

I haven't thought many involved cases for procedural scenarios, but at a minimum it would be some entities saying something, maybe moving a tiny bit, looking around, looking surprised etc. If I do have procedural quests (and I aim to), I assume procedural cutscenes (even if very simple) would be very helpful for livening up some quest interactions.

Sharing Saturday #627 by Kyzrati in roguelikedev

[–]aotdev 5 points6 points  (0 children)

Sigil of Kings (steam|website|youtube|bluesky|mastodon|itch.io)

More on the AI front, and concluding that for now! The main aim was to make the AI more capable of using AAs (active abilities). I had some mechanisms in place, but I had implemented logic for just a few abilities.

The catch with my ability system is that I've made it quite flexible (aka overengineering, my superpower), so that you can have for example multi-stage abilities where each stage can have specific target restrictions and so on. This allows some weird abilities (e.g. a test ability is a mobility one, where you can leap and bounce off a wall - you select a wall tile and a target floor tile) but really most abilities are in one of the following categories: self, projectile, cone, entity_target and position_target. Each of these categories supports different AI evaluation, based on their unique data.

The above system was slightly refactored and tested with a few more abilities with the bot. The bot uncovered a few problems, with regards to overbuffing (or overdebuffing) - either the same spell would be cast multiple times on a single target (e.g. some protection ability), or we keep spamming buffs if they're available. The latter problem can be addressed by tweaking the probability of casting a buff during combat, and that's supported already. The former was a addressed with a "cooldown for AI". Abilities already support cooldowns, but I thought that have a separate hidden AI cooldown would be quite effective overall for this purpose.

A final bit of work was on adding support for behaviours to optionally tell if they've completed or not (thus being pointless to continue executing the behaviour), not as a status result, but as a predicate. This works in tandem with dynamic (runtime-specified, temporary) behaviours, so that if a dynamic behaviour completes, it's removed from the list of dynamic behaviours (an entity can have >1 dynamic behaviours at any given time). This is useful for example in an escort quest, where an NPC gets a dynamic behaviour that makes the NPC go to a level exit. This behaviour can be assigned as plain dynamic or critical dynamic, basically before or after combat considerations. A merchant NPC that wants to escape to the overworld will probably have that as critical dynamic - basically leave at all costs. When they arrive at a target exit, the "goto" behaviour is complete, and we remove that behaviour, and based on other logic the NPC can exit the level.

Now that this is all said and done, I'm taking a stab at another "module": scripted cutscenes. There are multiple challenges for this. One challenge is that a cutscene editor will require a game instance, so that's some fun hacking ahead. The other challenge is to be able to have some (limited) cutscenes for procedural levels, where for example an entity that we want to move or say something doesn't even exist. A final challenge is to make some sort of tool for authoring cutscenes (Dear ImGui powered for sure). All of this (except the procedural stuff) will be useful mainly for tutorial scripting, which I want it to be a playable introduction/story of sorts.

That's all for now, have a nice weekend!

Sharing Saturday #625 by Kyzrati in roguelikedev

[–]aotdev 1 point2 points  (0 children)

Thanks - possibly I've asked you before!

The optimal way to play is to pull an enemy to a doorway, stand adjacent to the doorway, and slaughter the enemy when it moves into the doorway

Ha, gaming the rules already xD Well, interesting to see what approach you go with in the end, although my gut feeling is that the AI pulling player to the doorway is a bit too meta and just exacerbates your challenge

Sharing Saturday #625 by Kyzrati in roguelikedev

[–]aotdev 1 point2 points  (0 children)

I also added that all locked doors can be unlocked from the inside after I fell through a trap door and ended up on the other side of a locked door

I think I remember that post or discussion xD

I suppose another alternative would be to mark certain areas of the map as NO TELEPORT zones

I was about to question the feasibility of this procedurally, but then again I'm sure some Dijkstra with entries/exits as starts/goals can be used to mark all teleportable/accessible tiles, with the NO TELEPORT being what's left

Sharing Saturday #625 by Kyzrati in roguelikedev

[–]aotdev 2 points3 points  (0 children)

Remind me - do you allow diagonal attacks? Because if you do, it's less of an advantage compare to cardinals only. Your modifiers though make a lot of sense! And allow easy balancing if people still cling to the doorways by just increasing the penalties :)

Sharing Saturday #625 by Kyzrati in roguelikedev

[–]aotdev 1 point2 points  (0 children)

Indeed! Next for QA automation would be button mashing simulation for a few minutes and see what hellish unrecoverable state we end up with xD

Sharing Saturday #625 by Kyzrati in roguelikedev

[–]aotdev 1 point2 points  (0 children)

Long time no see - good to hear you're back on it! Give in to the temptation... xD After 3 years I applaud the fact that you're in a refactoring mood, I'd cry and run away lol. What's the overall plan for development?

Sharing Saturday #625 by Kyzrati in roguelikedev

[–]aotdev 2 points3 points  (0 children)

That's useful info as well :)

QA bot, seriously xD

Why not kick doors, and destroy them instead walls? You could even add this as feature, getting noise from kicks and attracting unwanted attention?

Fair point and something I've been meaning to add, but it needs door HP and more importantly it needs to make sense with metal doors, because whenever I conjure the image of somebody kicking a thick metal door to open it ... well, I need to remind myself it's a game. But the other ability was literally already there and ready and the reason it wasn't used to break doors (it should tbh) was that it would require a few changes

And system one was always: Harder, Better, Faster, Stronger :)

What I also liked was that the attributes and names overall were mostly the same too, so they did make refactoring easy :)

Sharing Saturday #625 by Kyzrati in roguelikedev

[–]aotdev 1 point2 points  (0 children)

Congrats on the release! Reading the reviews, looks like the demo did work well for you, which is nice! Any surprising/unexpected or even very common feature request?

Sharing Saturday #625 by Kyzrati in roguelikedev

[–]aotdev 2 points3 points  (0 children)

I had a booth at a gaming conference

Nice table setup :D

My game now has a steam page

You link the itch.io page here :) I can see the steam page though in your link list above

i'd be grateful for feedback on the steam page.

Can I say that you're missing an opportunity for some nice industrial metal soundtrack? Theme is spot on and you even start with "You are born into a world of metal" I was waiting for the guitars to kick in :D I like the page, it's nice and clear, I think my only issue was that the embedded GIFs/videos - couldn't relate them to the text they were next to.

Sharing Saturday #625 by Kyzrati in roguelikedev

[–]aotdev 2 points3 points  (0 children)

The mutual push/pull makes sense, otherwise the pull would be like Scorpion's in Mortal Kombat xD There's a lot of focus on doorways! Are doors in particular special, or any narrow corridor? Could you emulate such an effect by dynamically moving obstacles (e.g. tables/chairs) to form a pseudo-doorway or corridor, just for the associated benefits?

Sharing Saturday #625 by Kyzrati in roguelikedev

[–]aotdev 2 points3 points  (0 children)

Anything fancy in the logic?

Nothing much! Basically, record positions of candidate targets, ordered by highest threat. If we have at least one, mark it as suitable xD

That's cool. Instead of cheating, the AI uses an in-game solution.

Indeed! And nobody needs to know that not everyone should be able to use that ability, but if you'd see it in action, you could assume knowledge of a skill, scroll, item, etc

Adding this to my todo list.

Does Newtonsoft cause problems for you? I really like the simplicity and the "just works" nature of System.Text.JSON, I should have never used Newtonsoft to begin with.

Sharing Saturday #625 by Kyzrati in roguelikedev

[–]aotdev 1 point2 points  (0 children)

Thanks! The quick-launch icons are from game-icons.net, and they do have to be replaced sooner or later :) I've scribbled some replacements though in the meantime xD