Guaishou 怪兽 - Apophenia 23

Hey everybody! We're proud to announce that we're part of the DevGAMM Awards Steam event this year!

Weird Mart - muuuuu
Announcer voice added
Turtle Game - fibonacci618
  1. Achievement Fix
     - Fixed an issue where the Level 1 achievement was not unlocking properly.
     - The first achievement now unlocks as intended.

  2. Jellyfish Feed Improvements
     - Improved the buoyancy and swimming movement of Jellyfish Feed.
     - They now gently swim and float more naturally underwater, creating a more lively atmosphere.

  3. Trash Disappearance Effect
     - Added a visual effect when trash objects disappear.
     - Enhances overall visual feedback and game polish.

Forsaker:DingDing&Blade - 圣剑提灯制作组

Patch Notes

Thank you very much for playing our game and for providing feedback on any issues you've encountered.

We are currently addressing these issues based on their priority and will be releasing updates periodically.

If you have any questions while playing, please feel free to leave a comment under this post.

You can also join our official QQ Group: 202022271.
Everyone is welcome to join and chat with us there!

This Update Includes:

  1. Archive \[CG Gallery]: Added tooltips for locked entries. Hover over them to view the unlock conditions.

  2. Fixed an issue where certain achievements would not unlock after completing the corresponding character's story.

  3. Adjusted the dialogue in Part 4 of Ian's Chapter 4.

A Ruthless World - Gnoffah!
Doing side quests

This will be long!

A few weeks ago I started working a bit on the next version of the "engine" I have been using for making A Ruthless World (ARW). I got it rolling by branching the engine in git and starting a new project by copying ARW and minimizing it down to a barebones project that goes through boot->menus->level01->level02.

Interestingly when going over and minimizing what was included I found all sorts of small bits and pieces to fix/improve and now have a good list of things I can later move over to the old engine as well, improving the upcoming release of ARW.

Getting stuck in a time loop

A main area of interest was reviewing and trying to improve the game update loop. This is the loop that runs with physics, game logic and render updates.

The current version runs using a requestAnimationFrame, which is the standard approach to running a loop that needs to sync nicely with the browser drawing. There are a few issues however with this when doing a game, in particular if using physics.

requestAnimationFrame will always try to run at the refresh rate of the screen, meaning it can vary from the historically standard rate of 60Hz, to the more modern rates of everything from 90Hz, to 240Hz and above!

For the regular game logic loop this is all good, the faster the refresh rate the smoother and more responsive the game will become. To deal with the difference in update rates you solve it by using a delta value. Where everything happening over time is multiplied with the delta to make the end result the same, regardless of refresh rate. Example: If 60Hz is a delta of 1, then 120Hz will result in a delta of 0.5. As the update will not run exactly at the refresh rate, this delta varies a little bit for each update.

The delta gives a predictable result over time as at a high fresh rate, each update will do less, and at a lower refresh rate each update will do more, making the change happening during a set amount of time be the same.

For physics however this does not work so well. While the overall result will be somewhat the same, physics behave differently based on how often they are updated, regardless of the use of a delta. To solve this you create a fixed time loop, that runs at an as precise rate as possible. This is where using the requestAnimationFrame can be a bit problematic when doing physics and syncing physics positions/rotations to visual graphics position and rotation.

Physics considerations

If the physics update at 60Hz, then all will be good if the screen refresh rate is 60Hz as well. Physics update, game logic updates position of graphics based on the physics data, render draws the graphics when the screen refreshes. All in sync and rendered smoothly.

But already here there will be a small issue. As the physics will have a loop that tries to run at exactly 60Hz, but actual timing of each update will vary slightly, every now and then the physics will either wait one update or do two updates in a game update to keep that fixed update timing. This can cause some stuttering in the render as physics and game logic updates are no longer exactly in sync. This can be fixed, more on that later.

A second issue will be that if the screen is running at a higher refresh rate, say 120Hz, then the game logic update and render will update 120 times a second, but the physics using the fixed rate, will only update 60 times a second. This results in no visual difference for everything using physics, as it will simply be drawn in the same way twice!

You can't simply fix this by also running physics at 120Hz if the screen is capable of 120Hz, because then the physics will behave differently and you can not predict what will happen for those users. Hence you have to pick a fixed physics update rate and stick with it.

Old solution and initial improvements

My old solution was to run the physics at 120Hz, this because the games I make are not that resource hungry and as long as I can run the game at 60Hz on my almost 10 year old iPad I'm within the window of what I want to support.

The old solution was:

  • Game update that runs with a requestAnimationFrame.

  • Physics updates first at 120Hz.

  • Game logic updates at screen refresh rate.

  • Game renders at screen refresh rate.

Main issue

If the screen runs at 60Hz, physics will almost always update twice, directly after each other each game update. Sometimes only once, sometimes three times. This creates a few issues as the timing of the physics update can vary, sometimes two updates happen as fast as the device is capable of, sometimes it waits for a whole screen refresh.

I smoothed this by faking the timing and smoothing out timing values of six frames. This created a quite good result, physics are more stable at 120Hz and there was very little stutter. But there was some stutter...

If the screen runs at 120Hz, or higher, things improve. The physics gets to run with a more even rate and the fake timing and smoothing done will become more "real" automatically from this. Even so there could be some stutters. In all these cases I am talking about stutter as in something moving a bit erratic with 1-2 pixels during a frame or two. It's hardly noticeable but gives a clue that something should be fixed.

First improvement

I added interpolation to the graphics positioning when reading the physics data. This takes the last drawn physics data, the latest known physics data and draws at a value in between the two. Smoothing out motions such as positional movement and rotation. Downside here is that you get lag, so you want to run physics as fast as possible, otherwise you have a character that runs into and inside a wall, then bumps back out as drawn positions become more in sync with the physics data.

This solution works like magic when the physics are slower than the logic and render updates. However, if the physics are faster, then the result is an improvement, but there remains some stutter, even if it is "smoothed". I tried to find improvements, or if something was wrong with the solution, even got an AI involved to review and give suggestions, but nothing gave a better result than what I already had. This led to taking a whole new approach to how to design the game update loop.

New solution

I did many different solutions, even going as far as to split physics updates, game logic updates and render updates into three completely separate update loops and while this felt very cool and advanced, I could not get an improved end result. The small stutter remained. With all the knowledge, fresh testing and a mind that had all the relevant code up-to-date, I took a breath and decided on a final half-cool idea that might work.

Joining physics and logic, separating render.

I decided to create a new update logic for the physics. So that the physics have a precise fixed timing loop and that the game logic also runs in this loop. This will result in the physics and the game logic always being in sync, and the render runs with the requestAnimationFrame and will always render as fast and in sync as the screen refresh rate allows.

And that was about it. No, of course there are issues here. Number one being that what if the screen refresh rate is faster than 120Hz? Then those users will not benefit from the faster response and smoother drawing; it will draw ALL graphics in the same place twice, not only those synced with physics. Solutions ahead!

Web worker

A web worker is a script that runs in a thread separated from the main thread. Meaning if the main thread that runs the whole app is busy, say with rendering, the web worker script will continue running and not get stuck waiting on the render. Same the other way around, if you do something computationally heavy, run it in a web worker and it will not hold up the render.

By using a web worker I created a simple ticker, a loop that runs and simply sends a message at a fixed interval. I used this to run my 120Hz physics loop, making it possible to run a loop that is faster than the requestAnimationFrame on any device regardless of their screen refresh rate.

Then extended it with functionality so that the game logic can add its update to this loop as well, running after the physics update.

Then finally the render runs its update in a requestAnimationFrame and this, it turns out, seems to always run automagically in sync with the rest of the updates. I was expecting to have to do some checks and adjustment to make sure the render always runs when wanted, but so far in all combinations of Hz and devices I have tested it runs exactly as you want it.

But what about those poor 240Hz screen users?

Glad you asked. I updated the old requestAnimationFrame update for the game logic and render, so that it can be used if wanted. The game will then run the physics update with its web worker and the logic update synced with the screen refresh rate and render.

By no longer running the physics in the same requestAnimationFrame update, the previous stutter issue is gone. Mainly because the physics are no longer doing the big jumps with sometimes doing two updates as fast as possible, sometimes only one, sometimes three. Now it stays as close to a real 120Hz rate as possible.

The final touch

The engine runs a 6 updates settle period at the start, where it does not run any active game worlds, this to avoid the quite large variations in frame time that occurs in these initial updates.

I take this opportunity to check the Hz of the game logic update versus the render update and if it turns out that the render update is running at a higher Hz, the game autosets to use the requestAnimationFrame update and enables interpolation. This makes the game logic and render use the full potential of the screen for the best response and smooth render, while the physics keep going at a steady 120Hz, with the addition of smoothing all graphics synced with physics using interpolation.

Of course these settings are available for the user to change if they experience any issues with the auto-configured settings. And yes, this will be added to ARW as well.

Phew! Back to ARW... Wishlist on Steam

Blade & Soul Heroes - NCA Community Team

When

2:00 PM PST. You can also see your time zone here: 

https://everytimezone.com/s/c8b6db84

Estimated Downtime

Updated: 5 Hours

4 hours and 30 minutes

2 hours and 50 minutes

 

Notes

New Content Beginning

  • New Limited Hero: Jinsoyun

    • Additional Heroes: Ayura and Yehara

  • New Region: Hogshead Pastures

    • New Epic Quests: Chapters 21-23

  • New Boss Trial (Solo): Iron Heart Jiangshi

  • New Boss Trial (Party): Dura

  • Additional Bounty Hunt Rank: 11-15

  • Mind Training Level 7

  • Addition of Dungeon Dash Legacy Grounds “Destructive Rock Monster” 

  • Boon Card System

    • This new system allows players to further customize their Heroes with unique abilities, changing how you play in both Field and Tactics combat.  

  • Hero level expansion: 40 > 45

  • Hero skill level expansion: 3/5 > 5/10

  • New Exalted Meteorite

  • New Chronicles

    • Jinsoyun (web toon), Poharan, Somyeong, and Harin

Events

  • Awakening Black Rose

    • Complete a Limited Recruitment to obtain Jinsoyun's exclusive Boon Card!

  • Stellar Wheel Ticket Festa

  • Black Rose Petals: Token of Grudge

    • Clear daily missions and special challenges to earn Tokes of Grudge and Black Rose Petal Coins

  • Portrait of the Dark Emissary

    • Complete the puzzles to reveal all of the Dark Emissary's looks!

  • Covenant of Darkness

    • Log in daily to form a pact with the Dark Emissary, and win Divine Gems and Boon Cards!

  • Adversary of the Black Rose

  • Starlight of Destiny Login Festival

    • Log in daily to win Stellar Wheel Tickets!

  • First Half of Hogshead Pastures Challenge!

    • Clear the first half of Hogshead Pastures and claim special rewards!

New Arrivals in the Shop

  • Pure White Sovereign Jinsoyun

  • Bladestorm Yehara

  • Beach Girl Ayura

  • Genius Engineer Guri

  • Goddess of Change Yura

  • Brilliant Barkeep Naksun

Events and Promotions Ending

  • Limited Hero: Baek Buyong

  • Moonshadow Village's Candy Commotion

  • The Grand Candy Heist: 3 Theives

  • Halloween Magic Wheel Festival

  • Black Rose Blooms in the Night

  • Field Boss Challenge

  • Witch Soha's Growth Magic!

  • Hidden Dragons' Halloween Special Request

  • Trick or Treat Puzzle!

  • Monster Busters: Halloween

  • Halloween Special Shop

  • Recruit Plaque Support Boost

  • Sweet Witch Baek Buyong

  • Night Sentry Soha

  • The Baby Fluffy

  • Single-minded Ju Horang

  • Lone Girl Doyul

Manahex - Erik Svedäng (AB)

This update adds an exciting and much requested feature to Manahex – team play!

You can now create matches where you and another player fight together against another team. If both players of a team are knocked out, the other players gain a shared victory. This game mode also affects some of the spells (namely those that mention the word "enemy", they will not affect your team mate).

So, find a friend and go try your luck on the battlefield!

Kellan Graves: Fallen - Erak

The demo mission has been temporarily deactivated for maintenance.
We’re updating it to reflect recent improvements and new features from the full version of Kellan Graves: Fallen.

To make the descent more accessible to new players, we’ve temporarily reduced the game’s price during this update period.
This is a good time to join the mission and experience the full version while the Echo Division prepares the new demo build.

Once the updated demo is ready, it will return.
Thank you for your patience — and for descending with us into the dark.

Echo Division Command

The Seven Deadly Sins: Origin - durud_h

Together We Run, Bound by Destiny

Greetings, Star Guardians!

This is CM Kurono.

Have you been exploring every corner of Britannia and meeting all kinds of heroes? ( ˶'ᵕ'˶)ෆ

Today, I, CM Kurono, am here to share some sweet battle tips from <The Seven Deadly Sins: Origin>!🍯

From combat styles to hero Elements and even perfect dodges!

I’ve gathered a bunch of helpful tips that every Star Guardian should know, so make sure to check them out!😎

Check out the details below for more information!

MIRAI #167 - Diana Games CA

MIRAI #167 is one of the nominees for Best Game from Portugal at the DevGamm Awards 2025!

We'll be featured at the DevGamm Awards ceremony on November 7th at 18:00 UTC, competing for ‘Best Game from Portugal’ among an incredible lineup of nominees - you can check them all out here! We'll also be in Lisbon on that same day, showcasing our Demo. If fou're nearby or planning to visit, come meet us and play the Demo in person.

And that's not all - our first Steam Playtest is now open!

We're inviting players to try out the demo ahead of release and share their thoughts. After finishing the playtest, a short Google Form will pop up to gather feedback on gameplay, story and overall experience. You can also join our Discord Server to chat directly with us and share more detailed impressions. Simply click "Request Access" on our Steam Page to start playtesting!

A huge thanks to the DevGamm judges for the nomination. See you around!

...