Alpha 0.5.0 released. Important features combat overhaul, a targeting system, smoother movement, new cows, and bug fixes!
A few of the highlights:
Killing NPCs now grants experience! Go forth and conquer!
The input system module in charge of handling keys was improved to support multiple keypresses in unison, as well as better support for repeat-triggered key events.
Party unit frames have been improved in that they now indicate when a party member is offline as well as when a party member is in a separate instance.
An NPC and player targeting system was finally implemented. Players may target characters by simply clicking on them, however NPCs with quests or dialog cannot be targeted in this way currently. NPCs and non-party player characters can also be targeted by pressing the TAB key. This will cycle through all NPCs in the general vicinity of the player. Likewise, players can cycle through their party members by pressing the '`' key.
Combat received a complete redesign this release cycle. Combat functions similar to how consuming food works: via pressing the assigned action button / hotkey. Melee attacks are treated as a directed area of effect centered around the player. More damage is typically applied to the characters in front of the player, but this can vary from weapon to weapon. Ranged attack require a target to perform. Once a target is selected and the weapon is launched or fired, the projectile or missile will travel in a straight line to the target. If there is another attackable target in the line of fire, they will take the attack instead of the intended target.
Movement via the keyboard should be much smoother now. Also, players will find that both WASD and the arrow keys work for movement, as an alternate keybind set has been added for movement.
Cows got a visual upgrade this release. Moo.
Axes are now usable as a weapon in addition to their intended purpose. They do more damage than bare hands, but less than their sword counterpart.
The candle recipe has been redesigned to more resemble a candle.
There is currently one known issue with this release:
- Upon initial login, the unit frames may not render correctly. A simple reload and login should fix the issue.
The full changelog is listed below:
The full changelog is listed below:
- Fixed an issue that was causing net.lugdunon.state.sprite.Sprite.animateOnce() to animate for roughly eternity.
- Fixed an issue that could leave a player with no action selected if an item was removed programmatically from the action bar.
- If an action is performed by a character and the main player is further than 40 tiles from the point of action, the client will not be notified. This will keep those pesky zombies from announcing their attacks from half a world away.
- Fixed an issue that made ranged combat on unsuspecting, yet agressive NPCs akin to shooting fish in a barrel. Default aggro drop radius increased to 30 tiles (max bow range is 20 tiles).
- Stone outcroppings are now susceptible to pickaxes as well as bare hands. Pickaxes are faster and more efficient, yielding on average more items per attempt.
- Sand piles and clay deposits are now susceptible to bare hands as well as shovels. Shovels are faster and more efficient, yielding on average more items per attempt.
- Due to popular demand, the candle recipe has been fixed to be more ‘candle like’.
- Quest ‘A Light in the Darkness.’ updated to reflect new candle recipe.
- Quest ‘Hot Potato.’ now grants the player a bronze sword, a bronze bound bow, and 64 stone arrows upon completion. Happy adventuring!
- Killing NPCs now grants experience!
- Added /who and /online aliases for the /list online players console command.
- Fixed some issues with party location / status discrepancies when relogging.
- Refactored input system with respect to key events. Multiple key events at a given time are now allowed, and repeated trigger of keydown events are processed in the same way (and with the same 3 frame / 51ms interval) as mouse and tap retrigger events.
- Target cycling now has a retrigger interval of 255ms.
- Chat console history cycling now has a retrigger interval of 255ms.
- Added a blur event to the input system. This event is triggered if the main window loses focus or if an in game dialog is opened.
- Fixed an issue that sometimes caused the default action to be triggered (bare hands attack) when leaving a dialog.
- Added net.lugdunon.ui.unitFrame.TargetFrame.updateIndicatorType() to the client side API. This will update the target indicator if the target’s state has changed.
- Added a CharacterSerializer.INSTANCE_ID_FLAG for serializing the player’s current instance id.
- Added excludePortraitless property to assetManager.listSpriteDefinitions().
- Fixed an issue with orientation setting on path completion.
- Added net.lugdunon.character.NonPlayerCharacter.isHostile() to client side API. Returns true if the NPC in question will attack a player on sight.
- Refactored sprites to increase their usefulness beyond that of just characters.
- Sprite selector dialog will now only show sprites that have portraits (are capable of being associated with a character).
- Added defaultFrameSet property to sprite definitions.
- Refactored unit frame code to make things more modular and extendable. Unit frames now must adhere to a specific API (defined in net.lugdunon.ui.unitFrame.IUnitFrame) in order to respond to events that are of importance to maintaining a unit frame’s state.
- Target and player unit frames should now properly handle a player’s instancing.
- Added game.callUnitFrames(fun,args) to the client side API.
- Added game.listUnitFrames() to the client side API.
- Added game.getUnitFrame(id) to the client side API.
- Added game.callUnitFrames(fun,args) to the client side API.
- Added game.registerUnitFrame(unitFrameClass) to the client side API.
- Added a target indicator that appears when a player has targeted a character. The target indicator has three states to indicate the danger of a targeted character: friendly (green), neutral (gold), hostile (red).
- When a player is activated on the server, their target property is cleared.
- Client side prediction implemented for free movement. This should help to alleviate the jerkiness that has been present in that method of movement.
- Added a set of alternate keybinds for free movement.
- WASD and arrow keys are now bound to free movement by default.
- Implemented ‘enemy’ NPC and party ‘tab’ targeting. By repeatedly pressing the tab key (or ‘`’ key in the case of party members) you can cycle through available targets.
- Added net.lugdunon.input.keybind.target.CycleEnemyTargetKeybinding to client side codebase.
- Added net.lugdunon.input.keybind.target.CyclePartyTargetKeybinding to client side codebase.
- Stubbed out support for a treatAsTakeOne method for stack interaction in the inventory screen.
- Default volume setting for master volume reduced to 50% of maximum.
- Default volume setting for music volume reduced to 75% of maximum.
- Added net.lugdunon.ui.unitFrame.PartyFrame.nextMember(member) to client side API.
- Unit frame portrait canvas now has rounded corners.
- Added a portrait object to the sprite definition. This defines the frameSet and viewing rectangle for rendering a portrait based on the sprite definition.
- Both ranged and melee attacks completely refactored. The attack itself is triggered via hotkey or action button press. Ranged attacks also require the presence of a target.
- Fixed an issue with not setting the character’s orientation on the client side during free movement.
- Fixed an issue with the net.lugdunon.state.sprite.Sprite.animateOnce() function always returning to the idle sets instead of the current frame set.
- actionHandler item property moved to the root props object, insted of the tool def.
- net.lugdunon.ui.ActionButtonType.isRetriggerable() added to client side API.
- net.lugdunon.states.tiledGame.actions.ItemAction.isRetriggerable() added to client side API. An item action is considered retriggerable if it is a macro, a simple or a complex trigger.
- Axe melee animation added to default art assets.
- net.lugdunon.command.core.play.MeleeWeaponSwingCommand added.
- net.lugdunon.command.core.play.RangedWeaponFireCommand added.
- Added net.lugdunon.math.Point.wrap(int max, Point p) method to the server side API.
- Removed the code for turning when attacking if the effectiveness modifier is 0 as this is no longer needed due to the AOE nature of melee attacks.
- Fixed orientation setting code in net.lugdunon.command.core.player.PlayerFreeMoveCommand in the client side code base.
- Added net.lugdunon.state.character.Character.setOrientation(int orientation, boolean noUpdate) method to client side API to disable client updates when setting orientation.
- Added the concept of trigger methods to the net.lugdunon.state.item.action.IActionHandler. This helps differentiate between an action fired by hotkey or clicking on the action button, vs an action fired by clicking on an item in the game world.
- Added an inputMethod property to the net.lugdunon.state.item.action.IActionHandler.handleUse() function call in the client side API.
- Cows got a makeover.
- Characters can now set a ‘target’ character.
- Completely refactored cursor display and action when cursor is over a character. The cursor will display as the default pointer, and clicking on a character will now target them.
- Characters can also target party members by clicking on their unit frame in the party window.
- Fixed an issue that was resulting in window location properties being stored incorrectly.
- Hitting the options toggle key (escape by default) with a target selected will instead clear your target. Hitting the key with no target will cause the options window to open.
- Added net.lugdunon.item.Item.prototype.getToolDef() to the client side API.
- Added net.lugdunon.item.Item.prototype.getWeaponDef() to the client side API.
- Added net.lugdunon.state.item.Item.hasActionPresenceInstance() to the server side API.
- Added an inputBegan property to net.lugdunon.state.item.action.IActionHandler.IActionHandler.handleUse() in the client side API.
- Added net.lugdunon.states.tiledGame.TiledGame.overChar property to the client side API.
- Added a net.lugdunon.ui.unitFrame.TargetFrame class and html def to the client side API.
- Added net.lugdunon.command.core.play.TargetCharacterCommand.
- Both net.lugdunon.state.character.Character and net.lugdunon.state.item.PlaceableItemInstance extend net.lugdunon.math.Locatable (in the case of net.lugdunon.state.character.Character it is actually net.lugdunon.math.SubTileLocatable).
- net.lugdunon.state.item.action.IActionHandler.isSimpleTrigger() replaced with net.lugdunon.state.item.action.IActionHandler.getTriggerMode() and returns one of three modes: TRIGGER_MODE_NONE,TRIGGER_MODE_SIMPLE,TRIGGER_MODE_COMPLEX.
- Added net.lugdunon.state.item.action.MeleeWeaponActionHandler.
- Axes can now be used as tools and weapons.
- net.lugdunon.character.Character.prototype.actionPerformedWith() on the client side now takes an action type in addition to the itemDef.
- ActionPresence split into two classes, ActionPresence and ActionPresenceInstance. ActionPresence now acts as a dictionary of sorts for various ActionPresenceInstances.