Add the Imperial Guardian event (Gaion's event) - #992
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…event Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The monster spawns of the fortress maps are spawned by the event, zone by zone. Their zone and day, which were only known from comments, are defined in one table, which is used by the map initializers and the data update. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ts and the data Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sses get into rage The monsters use the skills of the original game with their animations, which hit the target or an area and may stun. The rage of the bosses is configurable and disabled by default. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… client The directions of the spawns were the ones of the game client, but OpenMU uses them plus one, so the gates were rotated. The terrain of the client already blocks the gates with the water attribute, like the original server does, so this attribute has to be removed to open a gate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… skipped wait The game client doesn't know the trap monster and shows a default model for it, so the traps are invisible like in the original game. The timer of the client follows the countdown, when the entering phase was skipped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The timer is set by the zones and read by the timer loop, which run in different tasks. Its type and end are now replaced together and read with Volatile, like the zone, so they always match. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…doesn't know Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…l game Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, this is a thorough implementation. The zone loop, gate/terrain handling, ticket consumption only after a successful enter, and the idempotent update plugin all look good. Blocking: merge conflict in Minor (non-blocking):
I'll merge once the conflict is resolved. The Azure Pipelines failure is a known credits issue, not caused by this PR. Generated by Claude Code |
…ardian-event # Conflicts: # src/GameServer/RemoteView/MiniGames/Extensions.cs # src/GameServer/RemoteView/MiniGames/ShowMiniGameEnterResultViewPlugIn.cs # src/Persistence/Initialization/Updates/UpdateVersion.cs
- Sort the update after the ones of master by its creation date. - Don't add a byte order mark to MiniGameManager.cs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the review!
Done. I merged The Crywolf PR #1005 also used
Reverted (3354ea9). Now the diff only contains the new
Yes, it's intended, and both paths behave the same:
If you'd rather exclude the event maps, e.g. by
Agreed, I left it as it is. 🤖 Generated with Claude Code |
|
Re-reviewed at 3354ea9. The merge with Generated by Claude Code |
The imperial guardian event (MUnique#992) takes 121. CreatedAt is the actual date of the renumbering, like CODING_RULES.md asks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes #892
Summary
This adds the Imperial Guardian event (also known as Gaion's event or the Secromicon quest chain) as a new mini game. It covers the whole chain which is described in #892:
Like the other events, it's a clean-room implementation based on the behaviour of the original game. No server code was copied.
How the points of #892 are covered
Thanks to @didiconcs for the gap analysis, it was a good starting point. Point by point:
Scraps → Gaion's Order. The original game has no NPC turn-in for this. The scraps are stacked in the inventory, and a full stack of five turns into a Gaion's Order.
SuspiciousScrapOfPaperStackedPlugIndoes this, likeSignOfDimensionsStackedPlugInfor the Doppelganger event. The scraps had no drop item group yet, so the update adds one: 0.1 % from monsters of level 32 and above.Day-of-week gating. There is one mini game definition per day, from Monday (1) to Sunday (7). Each day has its own map and entrance: Monday/Thursday on fortress 1, Tuesday/Friday on fortress 2, Wednesday/Saturday on fortress 3, Sunday on fortress 4. Each day also spawns its own monsters and boss. The spawns carry a wave number of
day * 10 + zone. For testing,FixedDayin the configuration forces a day.Secromicon Fragments. The side bosses of Monday to Saturday drop the fragments:
This is configurable in
FragmentDropsandFragmentCountChances. The existing Chaos Goblin mix (1,000,000 zen, 100 %) turns them into the Complete Secromicon. That mix is what the original servers use too, so it stays as it is.Sunday dungeon. Fortress 4 is only used on Sunday, and only with a Complete Secromicon.
The entry NPC is Jerint (522), which now opens its event window (
NpcWindow.JerintGaionEvententry). Lugard was already wired up for the Doppelganger event in #973.Behaviour
F7 01, and the server answers withF7 02.IsPartyRequired), and each party has at most 5 players.MiniGameMapCreationPolicy.OnePerParty).StandbyDuration, 60 s) and is then played forZoneDuration(10 min).StartNextZoneWhenCleared).F7 04.0x46.NonPlayerCharacter.IsInvisiblewas added andObserverToWorldViewAdapterfilters them out.0x69). These hit the target or an area and can stun.MonsterSkills,SkillChance).RageHealthPercentage) is available, but disabled by default.F7 06.ExperienceRewards,SundayExperienceMultiplier).ImperialGuardianFeaturePlugIn. The drops of the bosses are left to the admins; only the fragments and scraps are included.Other changes
Monster.TeleportAsync, used by the monster skills.AttackableExtensions.ApplyStunEffectAsync(Player, TimeSpan).NonPlayerCharacter.IsInvisible, described above.F7 01,F7 02,F7 04,F7 06with docs. The client structs aren't packed, so the sizes include the padding.ImperialGuardianSpawns), with their day, zone and direction. Before, those were only known from comments.Update plugin
AddImperialGuardianDataUpdatePlugIn(version 119, not mandatory) does the following on existing databases:It checks for existing data by id, so applying it twice changes nothing. A test covers this.
Tests
ImperialGuardianEventDefinitionTestImperialGuardianRemoteViewTestsSuspiciousScrapOfPaperStackedPlugInTestImperialGuardianDataTest: a new database and the update applied twice.Built with
-p:ci=true; all four test suites pass.Tested in game with the Season 6 client (MuMain), all seven days with
FixedDay:🤖 Generated with Claude Code