All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Unit testing;
- Event system;
- Skill usage prerequisites + effects conditions;
- Store/Load data in-between runs.
- Monters can have a Loot component with xp/sp reward on killing
- xp/sp rewards are notified in system chat
- An experience table is loaded, players can level up when earning enough xp (with level up animation broadcasted)
- Monster data wasn't populated correctly at creation (while regular npcs were ok)
- HealEffect (instant + over time)
- ResurrectionEffect (single target + aura targetting)
- Resurrection confirmation modal for players
- Some big numbers are locale-formatted for readability (e.g. during server initialization)
- Load basic NPC table:
id,name,title, defaulttitleColor,typeandbaseSpeed - Can spawn a NPC by its name (case-insensitive)
NonPlayableActorrenamed toNpcWorldstores actors in a single container now instead of one container per type
- No more function name in exception formatting
- World:
- can look up any actor by GameObjectId
- Skill:
- Load operating type (active, passive, etc.)
- Load physical/magical status
- Split target type (single target, AoE, aura…) from target nature (ennemy, friendly, self…)
- Demonstration skills: instant buff, toggle buff, single target damage, multiple targets damage, poison over time…
- Casting speed is dependent on mAtkSpeed/pAtkSpeed depending on physical/magical status
- Abnormal Effects:
- Buff and damage effects (instant + DoT) added
- Can be reapplied or canceled
- Toggle effect
- Logs are better aligned
- Stats have been revamped (no more Stats+ComputedStats)
- Application loop was updating twice in a row every updates
- HeaderOnlyPackets because they couldn't specify a name (would've needed
std::basic_fixed_string)
- Check all RSA operations
- Show packet sending source location (login server)
- Improved exception logs (login server)
- Auto-regen wasn't triggering
- source location is shown when sending a packet
- packet name is shown when sending
Packet::finalize()is not needed anymore, thus removing an additional state
- Program exit code indicated failure in case of success
- Packets are now correctly (shallow) copied
- packet encrypt/decrypt (game server) were needlessly complicated
- common's CMakeLists' link targets are now used implicitely in dependant targets
- packet log format improved
- HP/MP/CP regeneration tick system
- Login server can handle multiple users concurrently
- Login server can be stopped gracefully with CTRL+C
- SkillAction
- Actions can be canceled
- Gauge during skill animation
- Position can be deserialized
- Durations are serialized in a more uniform (and correct) way
Actor::takeDamage()- Trying to learn an undefined skill no longer leads to an exception
- Action's performer is now stored for easy access
- Packet hexdumping is disabled by default now
- Skill animation duration was wrongly truncated during parsing
- Actors can be scheduled for deletion
- Dead NPCs disappear after 5s
- GameObject deletion packet (makes objects disappear on screen)
- Ensure character removal from world in all scenarios (restart, exit, connection severed)
- Player is correctly unset from character in all scenarios
- Utility to get distance between two positions/actors
- Surrounding actors are sent to player entering world
- Equality operator shortcut for Actors
World::broadcastAround()now checks distance around emitter
- Damage can be inflicted and actor status is broadcasted to listeners
- The actor dies when HP reaches zero
- TargetClear was not working anymore
- Monster targets display correct HP bar
- Groundwork for status broadcasting to listeners
- Reworked HP/MP/CP/Weight from ActorStatus to Stats+ComputedStats
- Cannot attack oneself
- Can now send system messages to player, with argument support
- Player is greeted upon entering the world
- Characters created are restored as long as the server doesn't stop
- Moved code related to character previews into World
- Some packets have been moved to their own implementation file
- Dual weapons (swords, fists and bare fists) now inflict two hits as per their animation
- AttackAction keeps track of the initial target so that the action completes even if player changes target
- AttackAction is more generic around the attacker type (Character vs. NPC/Monster)
- NPC doesn't scream anymore when hit
- Simple packet broadcasting to all characters
- Remove player and its characters from World on connection closed
- Automatic test character now gets a unique name on creation
- Packet logs indicate to/from which session they are related to
- First ECS systems implementation
- Characters' attack stance toggles off after 5s
- Action system is more fleshed out: current/next action algorithm, queueing actions, interruptible…
- Game loop doesn't overuse the CPU when there's nothing much going on
- Replace
OptionalRef = std::option<std::reference_wrapper<T>>with my ownOptRefimplementation (to avoid writing the uglyopt->get()all the damn time)
- In-game time
- Can trigger sunset/sunrise events
- NPCs can talk
- auto-attacking (attack stance, timed to atk speed)
- Arrows are automatically equipped with bow (PoC)
- Can look items up from ItemTemplate::id in ItemStorage
- Dual weapons display correctly (dual fists, dual swords)