Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

 
Advanced search

1393497 Posts in 67076 Topics- by 60009 Members - Latest Member: amandaparsons

July 24, 2021, 12:44:48 AM

Need hosting? Check out Digital Ocean
(more details in this thread)
TIGSource ForumsCommunityDevLogsCodename: Mystery Babylon - Tactical RPG
Pages: 1 [2] 3
Print
Author Topic: Codename: Mystery Babylon - Tactical RPG  (Read 4608 times)
Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #20 on: February 25, 2021, 09:34:31 AM »

Here for a mini-update.


if you like 20 second videos: https://streamable.com/c1vv89

Starting phases of our battle system. Hoping to add some more polish and be back this weekend with more updates.

You can also see the testing walk cycle for our new knight map sprite. Trying to get rid of all Suikoden rips.

I also tested our pixel battlers in this scene, and it looks awesome (I, for one, cannot wait to unplug these 3D animations with their annoying Quaternions):


« Last Edit: February 25, 2021, 10:43:18 AM by Copywright » Logged


Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #21 on: February 27, 2021, 10:58:36 AM »


(full video: https://streamable.com/oh68nw)

The birth of a combat loop.

Dissolve shader + pixelated 3D models = niceee  Tongue

Also implemented experience gain for Units. I suppose next up is to begin implementations for Unit's Classes. Then, begin working on AI.

Line of sight is already plugged into our system:




So making a simple AI should be pretty easy. It ties into our heightmap, so units cannot see tiles that are higher than their currently occupied tile (by 2).
« Last Edit: February 27, 2021, 11:11:12 AM by Copywright » Logged


Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #22 on: February 28, 2021, 10:00:29 AM »

Taking it relatively easy this weekend, and working on adding aesthetics and sound.


video only, because... sound: https://streamable.com/o3x74a


I found some great placeholder music and royalty free sound effect packs to use.

So far I:

  • Got Footsteps by surface type integrated with our ScriptableObject Tiles. (so any given unit has a set of sounds based on where they are walking/running)
  • Basic UI sounds for selecting/deselecting unit
  • Music!

I'm using Master AAA Sound plugin from the asset store. It's been really easy to setup and I can already see it's utility. Setting up buses for sounds, and being able to manipulate volume for a certain sect of sounds (SFX, Music, Voice Acting, etc.) will come in handy when it's options menu time.

Eventually, I will add sounds to all UI, battle actions, etc.  I'll probably leave this stuff for the weekends and work on core mechanics during the week.
Logged


Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #23 on: March 08, 2021, 11:59:15 AM »

Been a while since my last update.

Likely, because gifs of longer lengths are problematic to post...

Really wish this site did inline videos.

Anyhow, I've made a good deal of progress on my battle system. I've also began the first steps to mod support. Fire Emblem has a pretty active modding community as does software like SRPG Studio, so I want to add a great deal of mod support in my end product.

I am working on a website this week. All older updates can be seen here.

Will post future updates here as well.
Logged


Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #24 on: March 12, 2021, 02:36:21 PM »

Finished the website. Doing a mobile version tomorrow.

I added the Zenovia, our first magic-based unit:


(video: https://streamable.com/4pzqqt)

Also got multi-attacks to work. I am experimenting with unfiltered 3D models, and seeing how I like it that way. However, 2D battle sprites are in the works:




I'm not quite sure which I prefer, but 2D sprites would be the way to go if I really want to make the game moddable. I cut framerate from 60 (!!!!) to 10 (that's better).

I also got a WIP on a custom battle background:




Anyway, I'll be focusing on getting our combat loop completed while art assets are being made.

  • Player Archer Unit
  • Player Axe Unit
  • Turns & Phases
  • Enemy AI
« Last Edit: March 12, 2021, 03:22:45 PM by Copywright » Logged


Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #25 on: March 16, 2021, 12:38:07 PM »

https://streamable.com/k610ba

2 Minute video showcasing Turns/Phases and AI.

At least, the start of it's implementation.

Looking to release weekly alpha builds start this Sunday. To that end, I've put new unit creation on the back burner to deliver the core gameplay first. 'll trickle them in with each new build.

The plan is to release an alpha weekly/biweekly until a June/July Kickstarter campaign where we'd release our first beta.



Happy about that one!

The 3D model set I'll use for battle:

https://streamable.com/siy5c8

Not sure how I'm going to animate attacks for the model... I'm hoping I'll be able splice animations myself. If I fail, I'll have to seek paid animations for mounted units :T

Using the Horse Animset Pro, which doesn't have sword/spear support.
« Last Edit: March 16, 2021, 12:46:07 PM by Copywright » Logged


Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #26 on: March 18, 2021, 08:18:12 PM »

https://drive.google.com/file/d/1uizs549T_zLqlqEZsBW1xPmu-F0TMEZK/view?usp=sharing

Working on a few things. Got some notes on art direction and GUI. First clean alpha build.

Didnt add a tutorial yet, so:

Z is the action Button. X is to go back. Space Bar to bring up weapon stats in the inventory menu. Also... don't die.

I figure releasing builds will be good practice in ensuring my work is deployable to production and gaining good feedback, if any.

Planning to release again this weekend, and go weekly/biweekly from there. I'll probably be pushing new versions to the same link, though.
« Last Edit: March 18, 2021, 10:34:12 PM by Copywright » Logged


liva
Level 0
**



View Profile
« Reply #27 on: March 20, 2021, 07:43:27 AM »

Really nice work!

May I ask why are you using different sprites for battle?
Logged

Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #28 on: March 20, 2021, 09:43:05 AM »

Really nice work!

May I ask why are you using different sprites for battle?

Thanks alot!

Those are 3D models and they're placeholder. The 60 frame 2D animation was costly to make, but I've cut frame rate down to 8-10 frames. But, they're still about 8-11 animations per battle sprite at about $60-70 per sprite.

I definitely plan to replace them with 2D sprites as soon as I can.

---




Working on a new starting screen.

Also I haven't shared the finished battle background (currently viewable in the current alpha):




I am preparing to begin a dialogue system by setting up animated talking portraits.






Current Goals:

  • Add 3 more player units
  • Complete basis of Dialogue System
  • Create new map before this one as a narrative intro & tutorial battle

I got permission from the creator of Exit Fate to utilize his sprites (credit to SCF Works): https://imgur.com/a/wnWQcGh


Currently working on adding these two units:

Jacques -- the former templar




This is a sprite from Exit Fate. I plan to have it edited to match the portrait and perform costume edits to add cloth and armor plating to match the 3D model:

https://sketchfab.com/3d-models/ravens-s2-templar-knight-preview-0ad600f019414d15b2d3a2fb47e331a2

Currently Unnamed -- Lady Archer




model: https://sketchfab.com/3d-models/archer-posed-94868fee3e49434aa5c18626d6e5ccfb

Her sprite edit is already underway. Her portrait will have to be edited to add bangs.

These portraits were created from the excellent recently released tool: https://aamatniekss.itch.io/pixelart-portrait-maker

The plan for portraits is to commission any necessary edits to the face and have half-body sprite pixeled in. I'm also pursuing getting squinting and eyes closed states for each portrait -- to simulate blinking or just for more variations of emotion like being suspicious or sleeping.


----

Scenario so far: they ride in on a carriage like it’s Skyrim but as paid passengers. He lets them off and they approach the road to the fort. Knights hold them up, dialogue ensues, and then we have our first tutorial-ish map.

You kill the 5 knights and take their armor since stealth fails and make it past the gatekeeper, into the fort interior. Then, probably they try to act natural inside the castle until the guy is like

“Oi, that’s Frank’s armor! I’d recognize those dents any where! I jus’ gave em fresh ones in our sparring match! Dis guy ain’t Frank!”

Something like that (or maybe exactly that, because it’s hilarious lol). Indoor combat time.


---


I will have to finish adding all the units, get our dialogue system up and running, and have a horse, carriage, and medieval NPC taxi guy sprite done (but I may be able to piggyback on Exit Fate's sprite for this one).

I am also working on transitions between combat and post-combat gameplay. Once the clear condition for the battle is reached, the player will traverse the map in a more tradition RPG manner. 4 directional walks/runs on the map with collisions and NPC interaction.

---

When all of this is complete, I can release a more complete feeling alpha. It will end right before you enter the castle and go to a coming soon screen.

Why?

Because I've commissioned Gecimen to complete the tileset for the fort interior. It will likely look a lot like the interior level I shared months ago, but with more rooms (and a tileset I can sue commercially).

So until that's done, we're stuck with outdoor levels.
« Last Edit: March 20, 2021, 10:04:55 AM by Copywright » Logged


Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #29 on: March 22, 2021, 10:24:29 AM »

This week and likely beyond, I am working on a pretty ambitious AI system.

Since there's developers making similar games following along, I'll go in detail.

Our current AI is very simple and in it's infancy. It simply checks if any enemy units are within range and attacks the weakest one/the one that stands to lose the most damage.

Which is nice, for a starting point. But, I'm envisioning a few different elements of AI behavior (whether it's enemy, allied or neutral).

I'm going to do a deep dive in the endgame for AI.


Utility AI


This is the talk that inspired my current approach. I was planning to use Behavior Trees, until I found this. For those who do not want to watch the talk; in a nutshell is a system that allows AI to decide what to do in a more human manner. It weighs the importance of each potential action and chooses the one that's most important at the time.

The logarithmic math behind constructing curves was intimidating, though. If you watch the talk, you'll see what I mean. I was thinking: "If only I could visually setup these curves, so I don't have to do math..."

Then, I remembered the Day & Night Lighting system had a similar curve editor within Unity. It's based on AnimationCurve. Typically used in Animation, but easily could be used as a curve to return the value of a number (which is essentially what it does in Animation as well).

Then, I found DecisionFlex which gives you a Utility AI framework to use, along with AnimationCurve based editors. Jackpot!

So, now I'm currently learning to use DecisionFlex and will either keep using it or end up customizing it for my purposes down the road.


Why does that matter here?
Now, that's the technical part of the picture. Why does it matter for this game, though?

This is how I envision it applying to combat AI.

So far, I've defined three model numbers that are important in decision making (currently trying to keep them within a scale of 0-1):

1. Need To Heal

    
Code:
1 - Unit.CurrentHealth / Unit.MaxHealth



2. Am I Armed?

Basically, for each weapon in my inventory, do I have a wieldable weapon that is not broken? If I'm a Swordsman with 6 bows in my inventory, I am basically unarmed.

For this one, I don't think it's necessary to use a decimal: simply 0 if am unarmed and 1 if I am armed. Essentially, true or false.

3. Immediate Threat

This is one is complex, and yet very important. I'll share the formula and an example:

Our threat formula:

Code:
Accuracy * (1 - (CurrentHealth - PotentialDamage) / CurrentHealth)

Example:

So say I am an AI and I have 25/30 health. 2 units are in my attack/vision range. Unit #1 can deal me 5 damage with a chance of landing that is 85%. Unit #2 can deal me 19 damage with a landing chance of 27%.

Odds are, I'm only going to take the 5 damage at 85%, right? So the threat level isn't that high

So the 5 dmg, 85% chance = .85(1-(25-5)/25 = 0.17

And your 19 at 27% = .27(1-(25-19)/25 = .189

Take that for each unit within range that can attack you and add it up, with a maximum of 1 and minimum of 0.

In this case, the threat score is 0.359.

Threat Scores Get Tricky
Another scenario:

I am an AI unit standing out in the open, no cover or allies around me. There are 8 enemy units within my movement/vision range. Let's say that of those 8 units, only 1 is able to attack me from long range (2 squares away).

So in reality, my worst case scenario is taking 5 attacks, not 9.

Which means, I have to check each enemy's potential attack points. The logic for this already exists in the system. We can use these attack points to TRY to forecast which units will attack me and from where.

I say "try", because there's zero ways for an Ai to predict with certainty what the player will choose to do. Now, if it's 5 Player controlled Units and 3 AI Ally units, we can predict the attack order of the Ally units. For Player Units, instead we will sort them based on who stands to deal the AI the most damage.

Another thing that must be considered is the order of the phases: Who is going to attack me soonest?

The order of the phases goes like this:

1. Player
2. Enemy
3. Other Enemy
4. Ally
5. Neutral

So if I'm an Enemy (Phase #2), my first priority is to detect attacks from:

Other Enemy --> Ally --> Neutral --> Player

In that order.


So, to accurately forecast Immediate Threat, we'll start with potential attackers of those groups first.

Though, this may not really end up being so necessary. We might be ok with simply sorting by which potential attackers stand to hurt the AI the most, regardless of which team it's on.

I'll experiment with that.

Phew. So that's Immediate Threat, it's a really important metric to track on a Unit by Unit basis.



Decisions For AI To Make
The AI will have to accurately decide when to:

Attack
Example:

Current Health: 15/20
Weapon Durability: 1 Steel Sword -- 30/35 uses left
Enemies Within Vision: 4

NeedToHeal: .25
ThreatLevel: .63
AmIArmed: true

The ThreatLevel is higher than my NeedToHeal, plus I'm armed. I'm attacking.

Defend
Say, I am a pretty high defense unit. There's a squishy healer in my movement range who's ThreatLevel is 0.95, dude's probably about to die.

My own ThreatLevel if I move to that position is about 0.56 and having blocked on of his potential attack points, his ThreatLevel falls to about 0.72.

I would do it, because my risk of death is less than his. The scores for this gets higher for defense of Leadership units who provide Morale boosts (I'll talk about Morale later, because this is already too much).

Another big factor of defense depends on clear conditions. Say, a clear condition is for you to seize a castle or base camp. The closer your proximity and potential move range to that destination, the higher the score foe defending and cutting off your advance will be.

I'll also have to figure out getting higher defense melee units to take the frontline and get ranged archers/mages to take the rear.

Retreat
Current Health: 3/20
Weapon Durability: 1 Steel Sword -- 30/35 uses left
Enemies Within Vision: 2

NeedToHeal: .85
ThreatLevel: .9
AmIArmed: true

I really need to Heal, but first, I should retreat outside of enemy range to use my Heal Item. Or retreat to the position of the nearest healer.

Another scenario is if AmIArmed is false.

I am retreating, no matter what the Threat Level or Need To Heal is. I will seek an item shop or go trade with a friendly unit that has a wieldable weapon.

Heal
Current Health: 3/20
Weapon Durability: 1 Steel Sword -- 30/35 uses left
Enemies Within Vision: 2

NeedToHeal: .85
ThreatLevel: .1
AmIArmed: true

The threat level has decreased and I still need to heal. I can now find the nearest healer or use a healing item.

This means something different for Staff Wielders. If their own NeedToHeal is low, but they are within move/staff range of a Unit who's NeedToHeal is rather high, then they will decide to Heal the unit with the high NeedToHeal.

Since the capability of attack is rather low for healers, I plan to always have them prioritize healing over attack.


That about wraps it up...

When doing a system like this it's best go piece by piece, which what I plan to do. There is the issue of having units be TOO smart, which would kill to "fun" factor.

Personally, I feel like making a dumb AI is easier than a smart one. I can always start with dominating intelligence, then set Intelligence Levels for AI. Which can vary on a Unit-to-Unit basis or based on the difficulty level you play on.

That's all for me. Wish me luck, I'll need it...
« Last Edit: March 22, 2021, 10:37:58 AM by Copywright » Logged


Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #30 on: March 28, 2021, 12:17:40 PM »

Back for another update.

The Utility AI approach using DecisionFlex has been working on pretty well thus far!

I've broken decision-making down into three metrics:

  • Threat Level
  • Need To Heal
  • Need To Retreat

The code for AI is now abstracted out into single responsibility classes, and doesn't clutter the AIUnit class anymore. Plus, there's no huge switch statements or if-statements any longer. After choosing the highest utility score, the AI pretty much works as a FSM. There's an FSM for each Action: Attack, Defend, Retreat, and Heal which has a list of Behavior classes. Based on certain things, it'll choose the best behavior to execute on the AIUnit...

So, in the end, it's Utility AI with FSM flavoring Smiley

I've successfully modeled those actions info floats between 0-1 and setup AnimationCurve-based equations to return a utility score for each action. You'll notice, Need To Defend is not implement yet. I anticipate this one will be much more intensive to do correctly: defending weaker units/units who can potentially die based on their Threat Levels, blocking movement towards points of interest to keep enemy proximity as high as possible, defending leadership units.

Good deal to account for in Defense behavior, so I'm leaving it last.

That said, Attack, Heal, and Retreat are relatively easier by comparison. Attack is pretty much implemented, where they currently prioritize which unit stands to be killed or pulled closest to death. I will need to add another behavior for prioritizing attacks on leadership/key units, if they're within vision range.

As for Retreat, it's still in progress. I've got one Retreat behavior, which basically tells the AI to run as far away from the enemies within sight, while as close as possible to allies within sight (if there's allies within sight). The code is using expensive LINQ calls, but I figure since these behavior will only execute once, it's not so bad. Lots more to do in Retreat before I move on.

However, I had to take a pause and start working on healing in our game. The code allowed for it, but there was just no implementation or GUI for it. Usually, AIs will only retreat when badly wounded (though, I want to add a check based on the strength of the sighted enemies and the combined strength of the AI's allies within vision to decide if he should flat out flee). When a hurt AI retreats, I want them to use a healing potion if they have one. Or, retreat to the closest healer (who has not moved yet).

So, I did a quick GUI and implementation of healing and made some ScriptableObject Items for healing. Looks like this:





Looks decent! I probably will reserve this graphic for when a healer heals a Unit on the map. I want to get a "drink potion" animation for these sprites, and simple increase their mini health bar without any fancy particle effects.


In other news, I got a few programmers interested in working on the game. I have to move our repo to private and setup git and lfs, get Trello up and running, add bots to our Discord for GitHub and Trello. Got a nice little project management flow up and running. I was using Unity Collaborate before, but there's no branching... It's like we'd all just be pushing to master main, though we're working on different stuff. Though, we've run into weird git issues with Unity thinking files were serialized with later version or huge amounts of changed files are pulling from LFS... what a pain. Hopefully, we reach git equilibrium and can have branches and pull request smoothly.




In the art department, things have been going quite well.

I started getting portraits customized and have began a reskin of all our UI to pixel art based textures:




Starting with dialogue boxes.

I realized that the Canvas Scaler component on our Unity UI is set to my monitor's resolution... not the game's native resolution: 480x270.

We're fixing that with this new UI reskin; I'll be porting our canvases to use 480x270 and hopefully get better scaling UI and UI that fits the aesthetic a bit better. Though, I will miss the UI I slaved in GIMP over... especially that Inventory UI, that one was sort of slick!

Unusable at the current resolution I'm showing it at though so... it is what it is.

I got my first custom tileset and it's great. Basically, it's inspired by the earlier indoor level I made using non-commercial tiles... but they're way better:




The tileset was all walls, floors, roofs, and a statue (which is really the heavy lifting, props are way easier to do artistically). Bare essentials, I'm working on having custom props (tables, banners, chairs, etc.) made.

The props in the second gif are using that non-commercial tileset apart from the carpet and statues. I will use them to build levels and swap out with the custom props I'll have made in the coming weeks.



That's about all I have right now, things are moving along pretty well! If I hit a wall with AI and I can't make a Deep Blue level godly AI, I might contract someone to help out with that stuff. But, it's way less intimidating that I thought so far.

Still going full-time until a June/July Kickstarter campaign!
Logged


logophil
Level 0
**



View Profile WWW
« Reply #31 on: March 28, 2021, 12:39:30 PM »

Always nice to see more tactical RPGs in progress - good luck with the project!

Really wish this site did inline videos.

You can actually post youtube videos inline just by typing a particular form of the url, here's how I posted the game trailer in my thread (ignoring the brackets):

<https://www.youtube.com/watch?v=hSCzxEaR2GY>
Logged

vivaladav
Level 1
*



View Profile WWW
« Reply #32 on: March 28, 2021, 09:54:39 PM »

Uh, I don't know if it's taboo to open source a game that aims to be commercial, but I don't particularly care at this stage. All Asset Store tools are gitignored, though Tongue

So GitHub is here: https://github.com/hjoseph96/divinity_soul
Have you changed your mind about going open-source?

At least that link doesn't seem to work.
Logged

Creating "Virtueror, the virtual conqueror" (RTS + 4x + RPG)

[Wishlist on Steam]
[TIGS devlog][YouTube devlog][website]
Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #33 on: March 28, 2021, 10:20:44 PM »

Uh, I don't know if it's taboo to open source a game that aims to be commercial, but I don't particularly care at this stage. All Asset Store tools are gitignored, though Tongue

So GitHub is here: https://github.com/hjoseph96/divinity_soul
Have you changed your mind about going open-source?

At least that link doesn't seem to work.


Yeah, since I have other programmers and we MUST use GitHub instead of Unity Collaborate, I had to ungitignore all my Asset Store stuff. Funny thing is, some of them live in the Plugins/ directory, so they werent gitignored before  Cheesy

I personally wouldn't mind being open source, but to avoid inadvertently sharing Asset Store stuff, I went private. Not really because I care much about my own code, really.

Always nice to see more tactical RPGs in progress - good luck with the project!

Really wish this site did inline videos.

You can actually post youtube videos inline just by typing a particular form of the url, here's how I posted the game trailer in my thread (ignoring the brackets):

<https://www.youtube.com/watch?v=hSCzxEaR2GY>

Oh, I didn't know that. I mainly upload to Streamable because it's easier. I'll try to see if the same syntax works?

Thanks, by the way!
Logged


Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #34 on: April 02, 2021, 06:22:17 PM »

Alright, time for another update.

I made a good amount of progress on Retreat AI:



The Ai will decide to retreat based on their likelihood of death and their amount of remaining health. They will run towards to farthest destination away from sighted enemies and closest to any sighted allies. If they have a healing item, they'll use it.

More to do here.




I was forced to take a break from AI to complete some other tasks, or they'd be left undone. On example is our animated portraits controller to handle randomized blinking and talking animations:



We're also working on our dialogue system to integrate with articy: draft 3. What you see there is the starting of our text engine based on Text Animator in the Asset Store. It was between that and Super Text Mesh and price was a big factor. Plus, it seemed lighter weight.

It did not support timed animations and it's built-in behaviors would loop indefinitely, so we had to modify the source code for the base class & add new functionality to smoothly have animations return to place rather than abruptly stopping.

I imagine our Dialogue System for Unity plugin integration will take some time to integrate. I've owned the plugin since forever and it seems to be used in plenty of production games. I am being wary of reliance on too man plugins, but these seem like a lesser evil. If anything, articy has it's own built-in unity exporter so we may custom build our own tailor made solution, if the plugin doesn't accelerate us and we spent time having to learn it's mechanisms rather than building gameplay.


EDIT: After seeing that their scripting API is one page... we'll just use articy's export function. Either as JSON or using it's built in importer. JSON sounds like a more reliable bet to me.





I think this is the final 3D model I will rig and edit animations for, since we're officially moving to 2D battle sprites. It will take a few weeks until we swap them all out. (Actually, there's ~3 more units I need to add to the map, one enemy archer and two player units who's models I never got around to setting up).

Mages/Archers are even worse -- they have start attacking - charge attack - release attack animations. Usually, I create all these from one animation and keyframe them all together.

Someone asked how I am handling hitboxes/collision detection for my battle system and seemed dissatisfied to find I was using AnimationEvents. The two Battler classes store references to one another and can call public methods when the need arises: ie TakeDamage(). They said using triggers/colliders was better performance wise, but it doesn't really make much sense to do that here. The sprites are stationary and often are not even in the same vicinity. I only use trigger/collider for magic projectiles.



The latest thing in very early stages is non-combat map navigation. Which much more akin to something out of a traditional RPG:



(full video: https://streamable.com/ncqppw)
(behind the scenes: https://streamable.com/9xys80)

If you watch the behind the scenes, you will understand why I hate this system of doing things (yet cannot fathom a wise way to handle it) the Tiled TMX Importer I use from the Asset Store is great and combined everything to a Tilemap -- which is great. But, the TilemapCollider component wont allow me to disable colliders on certain tiles... at least I can't find a way to do this without messing with the root TileAsset at runtime which I want to refrain from. So I end up having to do these OnTriggerEnter2D OnTriggerExit2D calls to dynamically disable TilemapColliders and change sorting layers for a given Tile Layer in the map. Sometimes, I'm changing and reverting multiple Tile Layer in one trigger.

There's many ways this can get potentially messy and tedious -- I'm all ears for a wiser implementation. I guess I could try to put everything on the same layer and use y-sorting? Or tediously map my levels in a way that I predetermine which tiles are pass-behind layers or not. And yet, there are times when a tile shouldn't have collision and when it should. For instance, I want to be able to walk behind/under the roof tiles. But, when I'm on the roof, I need the edges of the roof colliders to keep me from walking onto the dirt (or appearing to).

The only solution I can think of is migrating back to SuperTiled2Unity which treats each tile as a GameObject.... which will require reprogramming of our Grid System that relies on Tilemap.

*sigh*

I think I'm stuck with this implementation until I can hire a programmer smarter than me  Tired Addicted



More Art/Visual updates:
Working on transitioning to Pixel Animated Battle Sprites:








UI Redesign in progress -- redoing

More Animated Portraits to plug in:





Lots of new sprites, too.









I have a mind to go for a Kickstarter by June 15th,
but I have zero marketing buzz since the game is still so early. Thus, I figure make it a goal release a really good alpha by June 15th while marketing better-- getting a mailing list, gifs on twitter/imgur.

I am definitely working on getting the graphics for my campaign ready along with lots of concept art and branding sheet work.

So I might ACTUALLY launch a campaign by July 13th, which is also my birthday  Hand Metal Left Lips Sealed Hand Metal Right

So, I'll be setting up Mailchimp into my game's website and likely whipping up some quick CSS for a mobile version (even though it's a PC game?).

That's about all for now, be back next week  Gentleman

« Last Edit: April 03, 2021, 07:18:14 AM by Copywright » Logged


Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #35 on: April 09, 2021, 10:01:47 PM »

We had a great week  Toast Left

Forgive me as I try to relearn bbcode (Markdown, plz...)

Non-Combat Exploration

We are pretty close to closing the book on the navigation and collision detection aspects of this one. I conquered walk-behind, finally. The advice from the Tiled Discord paid off, and we’re now using completely hand-drawn (by yours truly) polygon colliders for our collision detection on our map.

It is a bit tedious, but Tiled is really flexible with the tools, like Snap to Grid, etc. that make it a breeze once you get the hang it. The bonus is I don’t have to do the enable/disable stuff nearly as often, and when I do, it’s precise enough that I can choose specific colliders to enable/disable.

Ok let’s do an in-game and in-engine visual:

In-game

Video: https://streamable.com/k8kozs


In-Unity

Video: https://streamable.com/d1j2xf


A look at how our Tiled setup works:
https://streamable.com/k404vz


After getting that done, I went ahead and added Footsteps and Jumping. There's no Gravity, so I am using a handy MathParabola to simulate gravity and apply more "artificial gravity" after the jump reaches it's peak.

I'll link a streamable link -- mainly to hear the footsteps and see jumping:

https://streamable.com/ldx37o
https://streamable.com/wk12th

What jumping looks like in the editor:




Jumping might get a bit more polish, SFX and maybe a dust pixel particle effect that spawn upon landing.

After that, I'll begin working on transitions between maps, you know, the whole fade out & leave this area and enter on this part of this area business.





UI Reskin - 90% Done





Still doing quality checks this weekend, stull like colors, font sizing, positioning, sizing, etc. -- I'll share more once I do.




Group AI Behavior

There's an idea of `AIGroup`'s and a overall `AITeamManger` (for each non-player controlled phases, `Enemy`, OtherEnemy`, so on).



Using the above image, there's the idea of roles for each group that will change as the situation demands:

1. Vanguard/Frontlines
Job: Seek out and Engage the Enemy -- Halt their advance towards critical defense points
Example: Say that the door to the fort is a "Seize" point, using FE as an example. The vanguard's job is to limit your movement and block your path by using formations to block your movement range. Then, engage in combat.

They are the head that drives the advance, everyone else is merely providing support and following where they lead. I didn't want to do stuff like manually setting "choke points" or manually setting certain units to "defend or attack", it felt cheap. I wanted every unit to be able to make the decision on an individual or group level.

The issue was: How will the AI know where to go? There's literally 10,000 tiles in this one map (if not a bit more).

The answer we found sufficient was for the role of seeking and patrolling for the enemies to be left to the front-line. There will be times when they're stationary until they see incoming enemies and times when they are actively searching (but don't exactly know where you are until you're within vision range).

They're the head of the snake, the other groups are the body that follows, in a nutshell.

2. Flank Defenders
Based on the position of the enemy, other `AIGroup`s will move to defend their "flanks". In this case in the screenshot above, the flanks are  `Direction.Left` and `Direction.Right`, because the enemy is approaching from the South.

Basically, this role is to follow the vanguard and camp outside of their move range to guard from anyone trying to go around them or attack from the sides. If the vanguard is decimated, they will become the new vanguard and rush in to fight.

There's two Flank Defenders per Vanguard Group.

3. Backup
Their role is simple -- backup the Flank Defenders and the Vanguard. An excess pool of units that can fulfill either role above as the situation demands.


That's about it. The `AITeamManager` will be responsible for deploying and setting these responsibilities. `AIUnit`s will be able to dynamically leave/join these Groups as well and act on their own. Perhaps, there will be "PersonalityTypes" for Units, that will effect the way they make decisions, but for now it's all hivemind behavior first, then we'll program the erratic behavior.

A big inspiration for this AI system was Total War's "Combat AI":

[youtube]https://www.youtube.com/watch?v=XBzTJOYgW0M>[/youtube]
[youtube]https://www.youtube.com/watch?v=KL_AAGSivbI&start=551[/youtube]
[youtube]https://www.youtube.com/zPsvSDJkejA[/youtube]

(someone please tell me how to bbcode...)

I figure, being free from their real-time constraints doing a similar system in a turn-based manner will require less engineering -- aiming for for a "triumph of simplicity" as they put in the the video.


We began implementation and it's going pretty well. I was on a call with the engineer I got on board to handle this while myself and the other programmer deal with our growing backlog -- he's made great progress.

  • Units in an AIGroup are able to dynamically form formations
  • Vanguard Role as been implemented, and they actively build formations to halt enemy advance towards points of interest (ie. a castle entry point).
  • We have a custom Editor script: "Formation Builder" where we can play Minesweeper and click squares on a grid to define a custom formation, that is then stored in a DB-like ScriptableObject. AIGroups have ObservableLists, that can take will update as the custom formations are updated.

Really exciting stuff, we were in a discord call, so I don't have footage -- but I will share it net week as it undoubtedly will only get more awesome in that time.






Art Dump

Let's start off with our star of the show: Pixel Art based battle sprites:


Video: https://streamable.com/gnyvd5

https://streamable.com/wm0gzb

Our artist on battle sprites is doing an excellent job -- even though he partially hates my guts from all the revisions (from which I will be chilling on requesting lol).

These are great -- there's some post-processing magic happening here though:

https://streamable.com/ngi2di

Just some color grading along with some fancy filters to mimic cloud movement.

Super proud of the work being done in this department, paired with our new UI, these battle sprites will be awesome. This new presentation will be key in our goal for a strong alpha by June 15th!


We're starting the game in a carriage that's en-route to this fort map you're all probably accustomed to seeing:




Mockup of how it will look in game:



We've remastered a few of our sprites:











That's about all we did last week. I would invite you to my more informal devlog over at FEUniverse, where I post because it's easier for me and there's some cool stuff there and a strong modding (romhacking/fangame) community there.

In other news, I did pay the $100 bucks to get on Steam Wishlist, but my page is still a WIP -- working on getting more gameplay to show, screenshots, and have some cool concept art in the works.

Until next week!
« Last Edit: April 09, 2021, 10:13:00 PM by Copywright » Logged


Alain
Level 4
****



View Profile WWW
« Reply #36 on: April 11, 2021, 11:16:58 PM »

Great update, a lot of things happening on many fronts! I am intrigued by the gif visualizing your camera frame in Unity. Looking at the corresponding in-game gif, I realized that the camera is really cinematic. Nice job!
Logged

Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #37 on: April 17, 2021, 04:54:58 PM »

Great update, a lot of things happening on many fronts! I am intrigued by the gif visualizing your camera frame in Unity. Looking at the corresponding in-game gif, I realized that the camera is really cinematic. Nice job!

Much appreciated! I saw your video about marketing for indie games and I've been hard at work on a branding sheet.

Our camera system is tied to the "heightmaps" that I draw in Tiled, our level editor:



It's used in other features like Line of Sight, but we have a "Height Dependent Zoom" that adjusts the camera zoom further out based on a tile's given "height".

It's been really handy!






Back again to report this week's progress.


Map & Room Transitions

I worked on this one, there was a lot more to it then I believed when I first began. Due to the fact that the game is been incubating within mostly one scene (Fort Outdoor), the minute we decided to start doing level to level (or in Unity terms -- Scene to Scene) transitions, this called for a refactoring to our architecture.

After searching for best practices and finding most people just use DontDestroyOnLoad for their singleton/reusable objects and scripts, I found this Stack Overflow about "Manager Scenes". I really liked that structure -- having one top-level scene where persistent objects and scripts live such as Audio, UI, User Input, Lighting Configurations, and Level Loading logic. Basically, this is a scene that houses all our Singletons that can be ported on between scenes.

I implemented that setup, and while it has it's drawbacks being that you must remember to add a Scene you're working on "Additively" and "Set Active Scene", lest you be bombarded by error related to the Scene's "Entry Point" script never firing and certain scripts never being initialized...

Code:

public interface IInitializable
{
    void Init();
}

public class EntryPoint : SerializedMonoBehaviour, IInitializable
{
    [SerializeField] private bool _InitOnAwake = true;
    public bool InitOnAwake { get => _InitOnAwake; }
    public IInitializable[] ToInit;

    private void Awake()
    {
        if (_InitOnAwake)
            Init();
    }

    public void Init()
    {
        for (var i = 0; i < ToInit.Count(); i++)
        {
            //if (i == ToInit.Length - 1)
            var initializable = ToInit[i];
            initializable.Init();
        }
    }
}


That's our EntryPoint, it's really just something to ensure order of initialization and it lives in every scene. The problem is, the Awake only fires on the "Active Scene"... but writing this out just gave me a lightbulb on how to fix this (if the "Manager Scene" is the active scene and there's > 1 EntryPoint component found, stick them at the last indices of the ToInit list!).


Anyway, there was dealing with that migration of code and structure then debugging and testing it stringently.


After that, I got working on Map Transitions, switching between scenes and spawning at a given grid cell on the destination level. Which went smoothly, aside from my foray with ProCamera2D, a plugin we use for our camera system. It's been super handu so far, but I noticed an issue where the camera REFUSES to move instantly to a position upon spawning -- it'll typically always tween to the CameraTarget.

Which created bugs, for my usecase. To avoid modifying the source code, which would just get overwritten after the package updates, I end up having to do a super hacky workaround involved toggling all the camera's fields and disabling/re-enabling the  script tactfully.. which I hate doing. I reached out to the plugin developer about it for support -- I hope he offers a fix or advice on where I possibly went wrong.


1: 30 Video: https://streamable.com/dux3h4

For the map-to-map transitions, you'll notice no oddness with the camera upon spawning in the new level, thanks to my hacky workaround. However, when I transition between rooms in the Fort Interior (near the end of the gif), you'll notice the camera tween away from a distance to reach the player's position.

That's the undesired behavior from ProCamera2D at work, since I haven't repeated by hacky workaround there... ahh third party plugins. Anyway, if the developer fails to give support, then I'll just modify the source and remain on that version and use the repurpose the code strictly to my usecase.

EDIT: UPDATE - I found ProCamera2D.UpdateType and UpdateType.ManualUpdate -- worked like a charm. I'm able to switch to ManualUpdate during Map/Room transitions, use Move(insertOutrageouslyLargeSpeedHere), and mimic an instant movement -- then switch back to UpdateType.LateUpdate. Never got support from Luis though, guess I'll pat myself on the back for digging into code that isn't mine.


The good news is since migrating to this new architecture, adding new levels and doin map/room transitions will be a breeze.


AI Update


Full Video: https://streamable.com/5gbkjp

In the previous update, I shared our AI approach. Above, you can see our current progress.

To explain what you’re seeing, the green squares are the paths to take to reach the formation. Every Unit in the Group in working towards reaching their assigned place in the formation. The Grey squares show the formation they’re trying to build. At that point, he had it set to “Horizontal Line”.

However, we have a Formation Builder, allowing us to create formations to be built at runtime by AIGroups dynamically:



The Vanguard role is pretty much complete, they’re driving all the action. They set the target points for all the other AIGroups, sort of the driving wheel.

The two AIGroups behind him are Flank Defenders. Originally, I intended that every Vanguard Group only have 2 Flank Defender AIGroups, but he’s made it in a way that we can have as many as we want and they’ll position themselves in the best manner to assist the Vanguard Group they’re assigned to guard.

In the video near the end, you can see he moves our PlayerUnits to the right. Once he does, the Flank Defenders immediately move to cut off their escape, while the Vanguard recovers.

The AI is smart enough to know where to position itself to do so, really awesome.

There’s a few things left to wrap up for Flank Defenders and Group AI.

In the video, you’ll notice that they’re all just moving their max Movement range to reach their assigned destination in the formation. BUT, we’ll want the AIGroups to be able to move in a way that they hold their formation – a way where all the units can reach and yet keep their formation.

The current behavior is cool for situations where the AI wants to move quickly to a target – more time constraints where the enemy needs to quickly reach a position or rout an enemy.

But, for instances where they’re in a mainly defensive position, we’ll want them to hold their formations and do their absolute best NOT to break them – since you’ll have to come to them in the end.

That’s where AI is in a nutshell, exciting stuff.

Next Steps are:

  • Adding the other Teams:

    Ally, Other Enemy, and Neutral Teams to test the fluidity of our behavior and decision making when there’s many teams in a battle map.

    This one should be fun, yet difficult. An AIGroup's role can change pretty quickly. Say, a bunch OtherEnemy units spawn within a Flank Defender’s Line of Sight. They’ll have to decide whether to keep defending the Vanguard or engage the new threat (essentially becoming a new Vanguard themselves).

  • Adding Leadership Units and a Morale System
  • Fleshing out Individual Behaviors and adding an AIUnit “Personality” features.

    How likely is the unit to cooperate in a Group? Is he a bloodthirsty loose cannon? Or is he coward, who’ll flee and disregard goals once he’s hurt a little?

    Or a hotshot Unit who simply loves war and doesn’t need to group up.

    Situations like that.



AND that’s AI. It’s a long road, but once it’s finished — oh, baby  Hand Any Key Hand Any Key Hand Shake Left

Adding Walk-Behind / Hiding for Battle Mode

Unlike non-combat exploration, we haven't added the ability to walk behind solid objects in battle mode, yet. However, after doing this for non-combat mode, it only made sense to refactor our Grid System to take into account the many tiles at a given cell in a grid, but their respective sorting layers.

Example being: I am walking BEHIND the fort wall, yet walking ON the dirt tile hidden behind it.

We are through most the refactoring that must be done for this, the last step is modifying our level editor to dynamically mark certain cells as impassable for Units on certain sorting/rendering layers.



Once this is done, we'll be able to display both allied and enemy units that are hidden behind tiles using our finished Silhouette shader:



This will be tied to LOS -- so hidden enemies WONT be displayed until they've been sighted by any allied unit. Same applies vice versa, players can hide this way as well. It'll be an interesting mechanic to toy with!





Art Dump

Battle Sprites



Finishing up our Sword Knight's animation set.



Got a critical attack animation for Sword Knight. The in-game animation will be quite different timing wise, and I’ll add some camera shake juice. But, with all the Map Transitions and carriages – it’s been a lot going on. So, I’ll plug this in soon.

Most likely significantly slow down the wind up, then BLAM release the dragon and shake the screen. I always have fun keyframing these.

Upcoming animations:




The process for these is basically rotoscoping. It's been working out pretty well, thus far.

While I'm at it, I'll pop in a perspective test we ran on the first WIP of our Fort Interior battle background:


Full video: https://streamable.com/0h5s6f

You'll see me messing with my shader settings, trying to get the moving shader tor remain static, since we're indoors. I believe this one will be another masterpiece, I have faith!


Carriages

In the process of rigging these spritesheets together and programming a Controller for Carriages.


Full Video: https://streamable.com/tz0mua


Full Video: https://streamable.com/ws3blh

In the videos, you'll see me testing synchronous animations for all the horses, and asynchronous manually. In the controller, I'll likely add support for both versions of animation and see what sticks.

I also had some interior tiles done:



The game's demo will begin in this carriage, so I'm pumped to have it done.


New Tiles

I've commissioned all the tiles I'll need to build every level for the Kickstarter demo, so we should be set on that front now. It's just a matter of delivery time now. I may need to commission some props/specific tiles as needed, but I'm happy that we've covered the basis of what we'll need for the demo.




Music

Got a new composer and a new main theme:

https://streamable.com/5eyig8

https://soundcloud.com/andrew-livecchi/babylon-main-theme/s-wDDvUEQWzqc
« Last Edit: April 17, 2021, 08:16:04 PM by Copywright » Logged


Copywright
Level 0
***


Vague Katti Wielder


View Profile WWW
« Reply #38 on: May 08, 2021, 05:03:58 PM »

We're on Steam, Wishlist us

Trello Board

Github

I've reopen our Github repo. Sprites, Tilesets, Asset Store stuff is missing. Scripts are open source.

Dialog System

I've chosen articy: draft 3 as middleware for our game's dialogue. It has a pretty robust API and we're nearly through complete support.



In Articy


full video: https://streamable.com/f0bd1y

In Game

We've also added normal NPC dialogs in world space:


(https://streamable.com/6skd53)

This feature is nearly complete, with a few lingering bugs to fix.





(https://streamable.com/wmigpy)

We've completed a Input-based Carriage Controller, next is adding an automated pathfinding implementation

I've also hooked up the interior map, where the game demo will begin:


(https://streamable.com/f0bd1y)

Working on getting sitting versions of all our player sprites for this map, and we'll be good.





(https://streamable.com/cmbm88)

AI's "Tight Formation" mode. Here, every AIGroup will move while maintaining it's formation -- so it will only move if the formation won't be broken and every Unit can reach.

Group AI is nearly complete, we've implemented a Morale system based around Leadership units.

We're planning to throw a Player + Ally vs Enemy, Other Enemy, Neutral battle royale to stress test our AI. That should be the next two weeks of work.





Minor feature, I've added Jumping to battle system. If there's remaining Move Points, the unit may move after jumping.





(https://streamable.com/143r2q)

I created this short scene in HDRP Unity as a mockup for a tease trailer/video to show before our Start Screen. I hope to either get it pixel animated or 2D animation.

Either way is expensive. But, it'll make a difference.

In any case, I thoroughly enjoyed making this scene. What CMB would be if it were 3D. The sequel will definitely be 3D.




Art Dump

Two weeks back, I got my first piece of concept art which will serve as our cover art:



It's awesome.

I commissioned the same artist to colorize our world map to be used in-game:



Our first completed animation set for enemy Sword Knight is done -- lots more battle animations to be completed:





We also completed this battle background for the "Fort Interior" level:



« Last Edit: May 09, 2021, 11:35:06 AM by Copywright » Logged


Alain
Level 4
****



View Profile WWW
« Reply #39 on: May 09, 2021, 10:26:13 PM »

Congratulations on the Steam page! I can't wait to see the colored version of the map Smiley
Logged

Pages: 1 [2] 3
Print
Jump to:  

Theme orange-lt created by panic