Skip to main content

News

Topic: Spectacles: Bruce's Story (Read 36221 times) previous topic - next topic

0 Members and 1 Guest are viewing this topic.
  • N E O
  • [*][*][*][*][*]
  • Administrator
  • Senior Administrator
Re: Spectacles: Bruce's Story
Reply #30
Finally tried out the demo; the battle engine feels very polished! I wish the HUD was simpler to decipher at a glance, especially a stat as important as HP, but I do like that you chose to list an extended turn queue at the top AND that it recalculates when your cursor is on an action. It's little things like that that made the FFX battle system the best TBS in the entire FF series.

  • Fat Cerberus
  • [*][*][*][*][*]
  • Global Moderator
  • Sphere Developer
Re: Spectacles: Bruce's Story
Reply #31
Haha, yes, FFX's battle system is still my favorite in the whole series. I was never a huge fan of ATB (except Chrono Trigger, that was IMO the only game that did ATB right), and the newer FFs seem to be going more towards CPU-controlled allies, which takes all the life out of the experience.  FFXIII is by far the worst, it's just an exercise in button mashing (and even KH did that better!). I couldn't finish it, got past the first few bosses before it became too dull; not even the summon they eventually gave me was enough to save it.
neoSphere 5.9.2 - neoSphere engine - Cell compiler - SSj debugger
forum thread | on GitHub

  • Fat Cerberus
  • [*][*][*][*][*]
  • Global Moderator
  • Sphere Developer
Re: Spectacles: Bruce's Story
Reply #32
Another neat thing in my engine, and I don't know whether FFX had this or not (looking at bosses' attack patterns though, I don't think so)--CPU battlers can also see the turn queue.  I have a function in my AI class that allows the enemy AI to request a turn order prediction if that unit were to use a specified skill.  I use this in the Robert battle: If he can squeeze additional turns in by using a Rank-1 move, he'll throw in a couple uses of Quickstrike for extra damage before using his usual Rank-2 attack.  Makes the battles much more dynamic than simple RNG-based attack patterns.
neoSphere 5.9.2 - neoSphere engine - Cell compiler - SSj debugger
forum thread | on GitHub

  • N E O
  • [*][*][*][*][*]
  • Administrator
  • Senior Administrator
Re: Spectacles: Bruce's Story
Reply #33
That's kinda fcking genius, dude! I've been looking for more AI patterns to study that aren't the usual suspects and that one's a great idea I will certainly add to the eventual "CPU Logic" section of my battle system tutorial (which is also going to discuss Pac-Man ghost logic and the FFXII Gambit System) :)

  • Fat Cerberus
  • [*][*][*][*][*]
  • Global Moderator
  • Sphere Developer
Re: Spectacles: Bruce's Story
Reply #34
Yeah, NEO, if you want a bit of insight into how my engine works without having to sift through too much code, just turn the console on: Open main.js and change:

Code: (javascript) [Select]
var DBG_SHOW_CONSOLE = false;


...to true.  That'll let you see what the battle engine and AI is doing behind the scenes.  I actually built the vast majority of the battle engine with just the console output alone, I only started on the UI once most of the framework was already in place.  Even with full UI the console is still invaluable for me; it comes in real handy when trying to diagnose weird bugs! :P  At some point I should probably implement logging though, if I keep going at the pace I've been I'm going to have so much console output that I won't be able to see it all at once!
neoSphere 5.9.2 - neoSphere engine - Cell compiler - SSj debugger
forum thread | on GitHub

  • Fat Cerberus
  • [*][*][*][*][*]
  • Global Moderator
  • Sphere Developer
Re: Spectacles: Bruce's Story
Reply #35
So now that my battle system is basically complete, I figured I should explain my leveling system as its unlikely to change much from here on out...

Each character has a series of stats ranging from 1-100.  VIT, STR, FOC, etc.  Each stat maintains its own experience counter and level, and the stat obviously goes up as its level increases.  A character's overall level is the average of the levels of all his stats; this "battle level" is used for several calculations, most notably as a component of the damage formula.

When an enemy is slain, the character responsible for the kill gets experience for each of his stats equal to the product of the enemy's battle level and its corresponding base stat.  Base stats are used here to prevent the player cheating by buffing the enemy prior to the kill for more EXP. Note that if the enemy is killed by residual damage (poison, frostbite, zombie+regen...) no stat experience will be given, since the battle engine doesn't keep track of who inflicted a status.

Skills also level up independently, to discourage the player from over-reliance on one or two moves.  When a skill is first learned, it starts af level 1.  The level means different things for each skill, but higher levels are always better. Each time a skill is used, it gains EXP equal to the product of the enemy's battle level and overall base stat average. Again, base stats are used to prevent artificial EXP inflation.
  • Last Edit: June 28, 2013, 02:43:13 am by Lord English
neoSphere 5.9.2 - neoSphere engine - Cell compiler - SSj debugger
forum thread | on GitHub

  • Radnen
  • [*][*][*][*][*]
  • Senior Staff
  • Wise Warrior
Re: Spectacles: Bruce's Story
Reply #36

no stat experience will be given, since the battle engine doesn't keep track of who inflicted a status.


Aww, no achievements. :P

Neat stuff!
If you use code to help you code you can use less code to code. Also, I have approximate knowledge of many things.

Sphere-sfml here
Sphere Studio editor here

  • Fat Cerberus
  • [*][*][*][*][*]
  • Global Moderator
  • Sphere Developer
Re: Spectacles: Bruce's Story
Reply #37
Oh, one thing I forgot to mention: Killing a boss gives the same amount of experience to all party members (including benched), regardless of how it's killed.  I didn't think it would be fair for a boss to only give EXP to the character who felled it since unlike with field enemies, defeating a boss will almost always require a team effort.
neoSphere 5.9.2 - neoSphere engine - Cell compiler - SSj debugger
forum thread | on GitHub

  • Fat Cerberus
  • [*][*][*][*][*]
  • Global Moderator
  • Sphere Developer
Re: Spectacles: Bruce's Story
Reply #38
So I don't know if anyone looked close enough at the code to notice it, but those UI animations that you guys all seemed to love? Those are driven by Scenario! :D
neoSphere 5.9.2 - neoSphere engine - Cell compiler - SSj debugger
forum thread | on GitHub

  • N E O
  • [*][*][*][*][*]
  • Administrator
  • Senior Administrator
Re: Spectacles: Bruce's Story
Reply #39
I didn't look at the code, but I'll be sure to look now ;)

  • Fat Cerberus
  • [*][*][*][*][*]
  • Global Moderator
  • Sphere Developer
Re: Spectacles: Bruce's Story
Reply #40
Just attached some screenshots to the OP, so people who haven't played the demo can see what it looks like.
neoSphere 5.9.2 - neoSphere engine - Cell compiler - SSj debugger
forum thread | on GitHub

  • Fat Cerberus
  • [*][*][*][*][*]
  • Global Moderator
  • Sphere Developer
Re: Spectacles: Bruce's Story
Reply #41
So I've been pretty quiet lately, everyone probably thinks this project fell off the edge of the earth.  But it didn't, just laziness on my part.  But I finally got back into the spirit of coding again, thanks in large part to Radnen's Link library which really makes so many things much easier that I had to do manually before.  So anyway, my latest addition to the battle engine is what I call the Stance system, a more advanced, more flexible iteration of the Defend feature seen in so many RPGs.

A little background before I explain the new system: One of my main goals with Spectacles has always been boss-player equality.  For example, I try to keep status immunities to a minimum (only those that make logical sense given the nature of the boss): the final boss of Bruce's Story is proof of this, not having a single immunity!  This certainly makes the AI routines much more complicated to program, but it's a small price to pay for the added strategic depth.  (This depth is also the reason I allow enemy AIs access to the turn predictor.)

But even worse than excessive status immunities, too many RPGs give their bosses, particularly mid- to late-game storyline bosses, advanced techniques that player-controlled characters simply don't have access to.  Final Fantasy is a prime offender here: Many, MANY bosses have a point in the fight where, if you attack them, they will counterattack, often with something EXTREMELY painful.  The player could never hope to duplicate such a strategy, and this is something I've always considered unfair.  Sure, it makes the fight more challenging, but for all the wrong reasons.

Another gripe of mine is that the Defend command in most battle systems is practically worthless.  Typically it halves damage, but using it in the heat of battle is, in practice, usually tantamount to suicide.  There's almost never a situation where it's better to take a defensive stance over just dishing out a ton of damage in a reckless last stand, and if you really need the damage reduction, you're almost always better served exploiting openings in the enemy's attack pattern to buff the party and then carry on attacking.  In fact, the ONLY good use I've ever found for defending in lieu of damage output is during--you guessed it, a boss's counterattacking phase!  This all almost has me convinced that the usual counterattack implementation for bosses is inherently broken and the Defend command is pretty much only provided to mitigate it.

The Stance system in Spectacles fixes all that.  At present there are three stances: Attack, Defend, and Counter, and both player- and AI-controlled battlers alike can use them.  How it works is this: All units enter the fight in the Attack stance.  This is the standard mode of operation, where units get to choose a move each turn and their next turn is determined by a combination of their immediate AGI stat and the rank of the move used (the higher the rank, the more the next turn is delayed).

The remaining two stances, Defend and Counter, are a bit different.  When a battler's turn comes up, that unit has the option to either choose a move as usual, or change their stance.  The catch is that changing stance represents a commitment: A unit changing stance won't receive another turn until the conditions of the stance are met.  Units in the Defend stance are stuck that way until they take damage (which is then reduced), and Counter-stance units are likewise stuck until their counterattack is activated.

Of course, the Counter stance has an additional level of commitment: When switching stance to Counter, the move to counter with has to be chosen in advance, which requires some strategy.  The upshot, however, is that a move used in a counterattack will be greatly more effective than that same move used from the Attack stance: Damaging moves deal more damage, attack accuracy is set at 100%, and intrinsically inaccurate moves like Munch are more likely to succeed.  This boost in efficacy elevates the Counter stance from useless fluff to a genuinely useful battle tactic: if you have a boss that likes to target one battler and whale on him, just have that unit counterattack with something powerful.  And just as it should be, if you try to abuse the mechanic, you'll get killed in short order.

As for that Defend stance, it may at first seem just as useless as any other Defend command, but it's not: Because of the way the Stance system works, the subtle difference in timing makes all the difference in the world.  In a Final Fantasy battle, for example, it's entirely possible to Defend and then not get hit at all before your next turn (this is less likely to happen in FFX as you can see the turn order ahead of time, but you don't have that luxury with ATB).  Which means, hey, you just wasted a turn defending that you could otherwise have used to damage the enemy or benefit the party.  Nice going, genius!  The Defend stance, however, doesn't end until the character is hit at least once, making it much more valuable strategically.  In addition, Defend in Spectacles also guards against instant-kill moves, halving their damage as with any other damaging attack and thus rendering them survivable.
  • Last Edit: February 21, 2014, 01:33:01 am by Lord English
neoSphere 5.9.2 - neoSphere engine - Cell compiler - SSj debugger
forum thread | on GitHub

  • Radnen
  • [*][*][*][*][*]
  • Senior Staff
  • Wise Warrior
Re: Spectacles: Bruce's Story
Reply #42
Love it. I do find late stage bosses to have that unfair moment. While I do think it was an okay way to up the difficulty or throw a curve-ball, I seriously thought each time they could have come up with something smarter.

Here's hoping to that something smarter. As always, I'll let physical gameplay be the deciding factor in whether or not the system really work in practice as it sounds on paper. But I have faith in this.

And nice Link shoutout. :) This is it's primary use case for games.
If you use code to help you code you can use less code to code. Also, I have approximate knowledge of many things.

Sphere-sfml here
Sphere Studio editor here

  • Fat Cerberus
  • [*][*][*][*][*]
  • Global Moderator
  • Sphere Developer
Re: Spectacles: Bruce's Story
Reply #43
So I mentioned earlier how, as part of my Boss-Player Equality initiative, full status immunities are rare for Spectacles bosses.  I'm going to assume you're wondering how I intend to pull this off without making the whole thing broken in favor of the player.  The answer?  Simply put, status afflictions in many games are simply too broad in scope.  Kingdom Hearts 3D, for example, has the status effects Bind, Slow, and Stop.  As you can imagine, almost every single boss is immune to all three because if they weren't, the battle would be way too easy.  Just cast Stop or Slow every few seconds and whale on the boss until it's dead.  Now keep in mind, most standard enemies are not immune to these, but unless you're doing a LV1 Critical Mode run, it's just as easy to spam attack commands on them, no fancy strategy required.

Final Fantasy is no different here: FFX, for example, has Zombie, which converts healing to damage.  Again, bosses tend to be immune to it because, if they weren't, you could just throw a few Phoenix Downs at the thing for a cheap kill (there is one undead boss late in the game that is a total joke because of this; I can forgive it in this instance because it was appropriate thematically).  Not much fun.  Then you have statuses like Doom, which are so intrinsically broken that even standard enemies start to develop immunity to it by mid-game.

To counter this, statuses in Spectacles are much more specific.  Each status effect serves a specific strategic purpose and, for the most part, keep to that niche.  Many also have counterbalances, such as Ignite, which in addition to dealing some damage each turn, also intensifies incoming Fire damage; however, it weakens incoming Ice damage by the same factor.

To give you a better example of what I mean, here are a few of my statuses:

  • Ignite: Deals Fire damage each cycle, weakening as the status wears off.  Intensifies incoming Fire damage, but cuts Ice damage.

  • Ghost: Intangible; can't be hit by melee or projectile attacks.  Magic still works, however, and another Ghost can bypass the effect.

  • Sleep: Victim gets no turns, however attacks have a high chance of waking them up (odds increase with each cycle) and they will eventually wake on their own, even if not attacked.

  • Zombie: Converts healing (including ReGen) to damage. Another FF mainstay, but to prevent abuse, in Specs Zombified battlers get no effect from drink-class items such as potions.  There is one exception: They will still get Drunk from Alcohol.

neoSphere 5.9.2 - neoSphere engine - Cell compiler - SSj debugger
forum thread | on GitHub

Re: Spectacles: Bruce's Story
Reply #44
I was actually really impressed with the attention put into FF zombie. My favorite part of FF zombie was that heal-stealing from normal-to-zombie hurt (as did zombie-to-normal), but zombie-to-zombie still worked correctly.

And on the undead boss in FFX, it was so much work to kill it the first time, I didn't mind what amounted to a free pass the second time. it was satisfying, even.