Greetings, Neverwinter Nights players! This release is being developed for personal enjoyment and out of goodwill for our fellow players and creators by unpaid software engineers from the NWN community: - clippy, Daz, Jasperre, niv, shadguy, Soren, tinygiant, virusman With thanks to:
- Cormyr Dalelands players and staff for testing this build and providing invaluable feedback.
- Thomas Dubier at Synacktiv for vulnerability reports.
- All NWN authors and players keeping this game alive. <3
Key Features
- Multisample anti-aliasing and anisotropic filtering now built in.
- Tracy profiler with extensive collection of instrumentation points now compiled in and available to all players and server admins.
- Many new NWScript functions.
- New logging framework.
- Major networking code improvements.
- Major performance improvements.
- Script compiler improvements from the open source release.
- Toolset quality of life improvements.
[ 2024-10-01 15:25:01 CET ] [ Original post ]
It's THE time to check out community content in NWN:EE if you haven't already! Enhanced Editions of Siege of Shadowdale & Tides of Tethyr modules by Luke Scull received beefy updates!
To access the modules, just launch Neverwinter Nights: Enhanced Edition and go to New Game -> Community. You can install them right inside the game, with no external downloads.
Siege of Shadowdale Enhanced Edition 1.5
- Updated Curated Content release.
- Henchmen now follow PC through doors/caves in Southern Farms and Old Skull areas.
- Fixed blood splatter on drow altar in Underdark - Lower Level.
- Implemented tavern store in Old Skull Inn.
- Removed Confusion spell from an instance of Jhessail missed in the previous update.
- Fixed erroneous "continue" in Mourngrym's dialogue.
- Reduced frequency of drow encounters and made minor adjustments to some.
- Henchmen can now be asked to identify equipment.
- Berliad can now cast some cleric spells through dialogue.
- The spell area of effect indicators added in 8193.35 now displays correctly.
- Removed Jhessail's Confusion spell, which would occasionally cause faction issues.
- Adjusted Elminster's spawning location in The Old Skull to reduce the risk of breaking dialogue.
- Rolled the module back to an earlier version of the Toolset. The module should now run on mobile devices.
- Typos fixes.
Crimson Tides of Tethyr Enhanced Edition 1.4
- Updated Curated Content release.
- Arrk journal entry should now always be correctly removed at the end of Part 1.
- Added correct speaker tag to Black Talon conversation.
- Only Salidar is now bumpable in the Temple of Gruumsh to avoid graphical oddities.
- Shadow Fiend is now correctly removed during the orb cutscene.
- Increased size of Solar.
- Updated Sythillis model and fixed crash with 8193.34 (mobile build). Huge thanks to Buddha!
- Added new portraits for Zaranda, Haedrak, and Gamalon courtesy of Faerie Wizard.
- The hill giant in the prelude no longer grants a huge amount of XP to the PC.
- Enemies, including dead enemies, will no longer repeat lines upon perceiving the PC.
- Removed a feat from S'Reek that would cause him not to turn hostile on game version 8193.4.
- The spell area of effect indicators added in 8193.35 now displays correctly.
- The Five can no longer accidentally trap the PC in the Temple of Gruumsh.
- Rolled the module back to an earlier version of the Toolset. The module should now run on mobile devices.
- Typos fixes.
[ 2024-05-17 14:57:27 CET ] [ Original post ]
Hey there everyone! We're releasing a small fix:
- Fixed a crash caused by static lighting on certain tilesets, as mainly seen with the Toolset.
[ 2024-04-19 18:17:30 CET ] [ Original post ]
Greetings again, Neverwinter Nights players! Thank you for all your feedback on the last patch. Engineers from the NWN community worked hard and released a hotfix to reported issues.
Fixed
- Fixed client AoEs sometimes adding duplicate objects.
- Fixed a bug where the client objects appear to be frozen in place until the game is restarted.
- Fixed learning a stacked scroll making the remainder of the stack unusable.
- Fixed a crash that happens after several loadscreens on some Linux systems.
- Fixed the bug report message pointing at the wrong URL.
- Fixed the MacOS binaries not containing the aarch64 build.
- Fixed screen capture tools like OBS and Steam not being able to read the full framebuffer content.
Changed
- Improved the AV warn message.
- Reverted movement teleport fix because it was resulting in jerky WASD movement for some players.
Known issues/Workarounds
- If you see weird glow or texture flickering, turn HDR bloom off.
- On Linux+Mesa only, set the env var `force_gl_names_reuse=true` before launching the game to work around various performance issues. See https://github.com/Beamdog/nwn-issues/issues/444#issuecomment-1962333660 for details.
[ 2024-02-26 16:24:21 CET ] [ Original post ]
Hello Neverwinter Nights players! This release was developed for personal enjoyment and out of goodwill for our fellow players and creators by unpaid software engineers from the NWN community: - clippy, Daz, Jasperre, Liareth, niv, shadguy, Soren, Squatting Monk, tinygiant, virusman To our fellow community: Thank you all for keeping this shared adventure alive.
Highlights
- New HDR-bloom postprocessing effect accumulates overlapping effects more naturally and makes intense colors bleed into the surrounding pixels.
- Improvements to the gameplay UI, such as toggling object highlight by double-pressing TAB.
- Significant performance improvements across the board, both on servers and clients.
- Many new and improved scripting functions, including support for synchronised audio playback and improvements to the scriptable UI.
- Over a hundred bugfixes, including several notorious 20-year-old bugs, such as area objects sometimes showing up too late.
- Script compiler is now open source and available as a standalone tool at https://github.com/niv/neverwinter.nim.
You are cordially invited to join the NWN community developer Discord, here: https://nwn.beamdog.net/discord/ This is a live release of the Development Build from December 2023, all the regressions were found and fixed.
[ 2024-02-15 19:31:50 CET ] [ Original post ]
Hey there everyone! This release is being developed for personal enjoyment and out of goodwill for our fellow players and creators by unpaid software engineers from the NWN community: - clippy, Daz, Jasperre, Liareth, niv, shadguy, Soren, Squatting Monk, tinygiant, virusman To our fellow community: Thank you all for keeping this shared adventure alive.
Highlights
- New HDR-bloom postprocessing effect accumulates overlapping effects more naturally and makes intense colors bleed into the surrounding pixels.
- Improvements to the gameplay UI, such as toggling object highlight by double-pressing TAB.
- Significant performance improvements across the board, both on servers and clients.
- Many new and improved scripting functions, including support for synchronised audio playback and improvements to the scriptable UI.
- Over a hundred bugfixes, including several notorious 20-year-old bugs, such as area objects sometimes showing up too late.
- Script compiler is now open source and available as a standalone tool at https://github.com/niv/neverwinter.nim.
You are cordially invited to join the NWN community developer Discord, here: https://nwn.beamdog.net/discord/ Kindly report issues you find at https://github.com/Beamdog/nwn-issues by following the instructions provided there.
[ 2023-12-05 16:26:03 CET ] [ Original post ]
New curated community content in NWN:EE keeps expanding! An Enhanced Edition of a classic Neverwinter Nights module Crimson Tides of Tethyr by Luke Scull is now available in the game launcher!
A 20-hour adventure with a colorful cast of characters, epic war storyline, and tactically challenging encounters inspired by Baldur's Gate, this Enhanced Edition features rewritten dialogue, visual improvements, bug fixes, new systems and quality-of-life improvements, a new hour of gameplay content, and 100 new lines of voiced dialogue.
Check out more details here!
[ 2023-07-25 10:56:59 CET ] [ Original post ]
What is MythForce?
- Roguelike Dungeon Crawling
- 80s Cartoon Aesthetic
- Take on the forces of Deadalus solo or with up to 3 friends
- Play as a Knight, Mage, Hunter, or Rogue
- Fun
Check it out during Steam Next Fest from June 19th - June 26th Already tried out the demo? Add MythForce to your wishlist and join our Discord: https://discord.gg/MythForce
[ 2023-06-19 17:33:40 CET ] [ Original post ]
Hello adventurers! Today were releasing a new update for Neverwinter Nights: Enhanced Edition. Patch 8193.35 is the result of a year-long love effort by community developers.
Patch Highlights
- AOE Indicator | Spells and spell-like abilities now display a targeting indicator displaying their range and, if appropriate, their AOE shape and size
- 8 Multiclasses | Added support for up to 8 multiclasses, configurable per-module
- Faster Load Times | Improved area load times by up to 100x (!)
- News Section | Added an in-game News UI that shows upcoming patches and community news
- Script-created UI Improvements | NUI (script-created UI) will no longer break input to the game (WASD, drag & drop)
- Play NWN as a Cartoon | Added a new "Toon" post-processing shader as a graphical option
- Goodies for Builders | Hundreds of new functions and goodies for module builders
- Hundreds of Bugfixes & Optimizations | More bugs squashed
Credits
This patch was made entirely by community members: Done entirely for personal enjoyment, out of good will, and with copious amounts of adhesive. Development team: clippy, Daz, Jasperre, Liareth, niv, Soren, tinygiant, virusman With explicit thanks to: The NWNDEV Discord folks. Your testing and support was and is invaluable. The Neverwinter Vault. Nereida and Zwerkules. Everyone in the community!
Bonus Art
As a bonus, here is an updated key art picture for Neverwinter Nights: Hordes of the Underdark by Mike Sass, redrawn with more detail:
[ 2023-05-24 15:16:29 CET ] [ Original post ]
Hello, everyone! A new patch for NWN:EE is being worked on, and you all are cordially invited to participate in playtestingor just playingusing the new branch and its added fixes and features. This effort is being done entirely for personal enjoyment by community members, out of good will and with copious amounts of adhesive. This is a work-in-progress and not a full final patch release yet. The full patch notes are extensive and available inside of the game on the "News" button, as well as here: https://nwn.beamdog.net/docs/ To opt-in, please subscribe to the development channel on Steam or GOG Galaxy (Beamdog Client will follow). Keep an eye on the main menu News button, where available updates will be shown. The above link will also be kept current. To provide feedback, or to just chat with us, please join the Discord: https://discord.gg/a9XN6xKWn8 Before posting there, please take a moment to carefully consider the introductory text in #welcome. See you around! clippy, Daz, Jasperre, Liareth, niv, Soren, tinygiant, virusman With thanks to: The NWNX folks. The Neverwinter Vault. Everyone in the community. neverwintereye
[ 2023-03-16 15:27:05 CET ] [ Original post ]
NWN:EE just received new curated community content! An Enhanced Edition of a classic Neverwinter Nights module Siege of Shadowdale by Luke Scull is now available in the game launcher!
Play Siege of Shadowdale Enhanced Edition with new quests, overhauled graphics & more!
[ 2023-03-15 16:40:22 CET ] [ Original post ]
Greetings, Neverwinter Nights players and modders! A new PC patch for Neverwinter Nights: Enhanced Edition arrives today. This update brings new quality of life improvements and fixes a few regressions introduced by the previous stable update.
Patch notes
Fixes
- Apple M1: Fixed audio crackle when decoding mp3 files, including voiceovers.
- Pathfinding: Fixed a case where pathing was bailed on too early, resulting in incorrect behaviour that was regressed in the previous patch.
- Facelift tilesets tts02 tcm02: Addressed various texture and model issues.
- ResMan: Fixed two memleaks where it wouldnt release loaded data instances.
- Renderer: Minor fixes to animation start consistency.
- Renderer: Fixed animated skinmesh parts going out of sync/being one frame behind.
- Renderer: Fixed rough surfaces having a milky sheen at some viewing aspects, especially when using height maps.
QoL Improvements
- Game: Disable ctrl-drag selection box on clients when server.player-party-control is off (the default). Note that clients will have to reconnect if you toggle this setting while a game is up.
- NWSync: Repositories are now collapsible in the main UI view; this state is remembered in settings.tml.
- NWSync: Module versions can now hold a `localalias` field that is used to backreference for StartNewModule(originalfilename).
- NWSync: Better support for repository-side statistics.
- NWSync: Hide modules, campaigns and adverts with empty name labels.
- NWSync: Dont reject repository.json if advert buttons have empty labels and URLs.
- Launch Game UI/Repo Manager: Fixed Show Advert checkbox label being cut off.
- Launch Game UI: Fixed Advert panel type displaying a STRREF instead of text when no label is defined in repository.json.
Scriptable UI
- Nui: Fixed crash when calling SetGroupLayout() with invalid data.
- Nui: Fixed scrollbar size for textedit.
- Nui: Text can now override border and scrollbars properties.
- Nui: Fixed draw_list scissoring breaking succeeding widget rendering.
- Nui: Fixed draw_list scissoring leaving a stale scissor on the GL stack for nested widgets.
- Nui: Fixed entries in a list view not scissoring draw_list correctly when scrolling out of view.
- Nui: list(): Fixed textedit() widget not working in lists.
- Nui: list(): Scrollbars now configurable.
- Nui: list(): Fix spacers not advancing row layout correctly.
- Nui: Never allow binds to update during construction. This fixes list() array binds degrading to scalar values, among other.
- Nui: textedit(): Fixed placeholder sometimes rendering on the succeeding widget instead.
- Nui: textedit(): Fixed range event triggering too often or with wrong values.
- Nui: Added demo code for spreadsheet UI.
- Nui: Fixed list widget not showing a vertical scrollbar in AUTO mode.
Premium Modules
- Tyrants of the Moonsea: Fixed ship's cabin navigation map occasionally disabling erroneously.
New Script Commands
// Returns the number of script instructions remaining for the currently-running script.
// Once this value hits zero, the script will abort with TOO MANY INSTRUCTIONS.
// The instruction limit is configurable by the user, so if you have a really long-running
// process, this value can guide you with splitting it up into smaller, discretely schedulable parts.
// Note: Running this command and checking/handling the value also takes up some instructions.
int GetScriptInstructionsRemaining();
// Returns a modified copy of jArray with the value order changed according to nTransform:
// * JSON_ARRAY_SORT_ASCENDING, JSON_ARRAY_SORT_DESCENDING
// Sorting is dependent on the type and follows json standards (.e.g. 99 < "100").
// * JSON_ARRAY_SHUFFLE
// Randomises the order of elements.
// * JSON_ARRAY_REVERSE
// Reverses the array.
// * JSON_ARRAY_UNIQUE
// Returns a modified copy of jArray with duplicate values removed.
// Coercable but different types are not considered equal (e.g. 99 != "99"); int/float equivalence however applies: 4.0 == 4.
// Order is preserved.
// * JSON_ARRAY_COALESCE
// Returns the first non-null entry. Empty-ish values (e.g. "", 0) are not considered null, only the json scalar type.
json JsonArrayTransform(json jArray, int nTransform);
// Returns the nth-matching index or key of jNeedle in jHaystack.
// Supported haystacks: object, array
// Ordering behaviour for objects is unspecified.
// Return null when not found or on any error.
json JsonFind(json jHaystack, json jNeedle, int nNth = 0, int nConditional = JSON_FIND_EQUAL);
// Returns a copy of the range (nBeginIndex, nEndIndex) inclusive of jArray.
// Negative nEndIndex values count from the other end.
// Out-of-bound values are clamped to the array range.
// Examples:
// json a = JsonParse("[0, 1, 2, 3, 4]");
// JsonArrayGetRange(a, 0, 1) // => [0, 1]
// JsonArrayGetRange(a, 1, -1) // => [1, 2, 3, 4]
// JsonArrayGetRange(a, 0, 4) // => [0, 1, 2, 3, 4]
// JsonArrayGetRange(a, 0, 999) // => [0, 1, 2, 3, 4]
// JsonArrayGetRange(a, 1, 0) // => []
// JsonArrayGetRange(a, 1, 1) // => [1]
// Returns a null type on error, including type mismatches.
json JsonArrayGetRange(json jArray, int nBeginIndex, int nEndIndex);
// Returns the result of a set operation on two arrays.
// Operations:
// * JSON_SET_SUBSET (v <= o):
// Returns true if every element in jValue is also in jOther.
// * JSON_SET_UNION (v | o):
// Returns a new array containing values from both sides.
// * JSON_SET_INTERSECT (v & o):
// Returns a new array containing only values common to both sides.
// * JSON_SET_DIFFERENCE (v - o):
// Returns a new array containing only values not in jOther.
// * JSON_SET_SYMMETRIC_DIFFERENCE (v ^ o):
// Returns a new array containing all elements present in either array, but not both.
json JsonSetOp(json jValue, int nOp, json jOther);
// Returns the column name of s2DA at nColumn index (starting at 0).
// Returns "" if column nColumn doesn't exist (at end).
string Get2DAColumn(string s2DA, int nColumnIdx);
// Returns the number of defined rows in the 2da s2DA.
int Get2DARowCount(string s2DA);
[ 2021-12-08 18:02:06 CET ] [ Original post ]
Hello, friends. Today, we ship build .34 to DEV. Please test it against your custom content and on your servers! It contains:
Fixes
- Apple M1: Fixed audio crackle when decoding mp3 files, including voiceovers.
- Pathfinding: Fixed a case where pathing was bailed on too early, resulting in incorrect behaviour that was regressed in the previous patch.
- Facelift tilesets tts02 tcm02: Addressed various texture and model issues.
- ResMan: Fixed two memleaks where it wouldnt release loaded data instances.
- Renderer: Minor fixes to animation start consistency.
- Renderer: Fixed animated skinmesh parts going out of sync/being one frame behind.
- Renderer: Fixed rough surfaces having a milky sheen at some viewing aspects, especially when using height maps.
QoL Improvements
- Game: Disable ctrl-drag selection box on clients when server.player-party-control is off (the default). Note that clients will have to reconnect if you toggle this setting while a game is up.
- NWSync: Repositories are now collapsible in the main UI view; this state is remembered in settings.tml.
- NWSync: Module versions can now hold a `localalias` field that is used to backreference for StartNewModule(originalfilename).
- NWSync: Better support for repository-side statistics.
- NWSync: Hide modules, campaigns and adverts with empty name labels.
- NWSync: Dont reject repository.json if advert buttons have empty labels and URLs.
- Launch Game UI/Repo Manager: Fixed Show Advert checkbox label being cut off.
- Launch Game UI: Fixed Advert panel type displaying a STRREF instead of text when no label is defined in repository.json.
Scriptable UI
- Nui: Fixed crash when calling SetGroupLayout() with invalid data.
- Nui: Fixed scrollbar size for textedit.
- Nui: Text can now override border and scrollbars properties.
- Nui: Fixed draw_list scissoring breaking succeeding widget rendering.
- Nui: Fixed draw_list scissoring leaving a stale scissor on the GL stack for nested widgets.
- Nui: Fixed entries in a list view not scissoring draw_list correctly when scrolling out of view.
- Nui: list(): Fixed textedit() widget not working in lists.
- Nui: list(): Scrollbars now configurable.
- Nui: list(): Fix spacers not advancing row layout correctly.
- Nui: Never allow binds to update during construction. This fixes list() array binds degrading to scalar values, among other.
- Nui: textedit(): Fixed placeholder sometimes rendering on the succeeding widget instead.
- Nui: textedit(): Fixed range event triggering too often or with wrong values.
- Nui: Added demo code for spreadsheet UI.
- Nui: Fixed list widget not showing a vertical scrollbar in AUTO mode.
Premium Modules
- Tyrants of the Moonsea: Fixed ship's cabin navigation map occasionally disabling erroneously.
New Script Commands
// Returns the number of script instructions remaining for the currently-running script.
// Once this value hits zero, the script will abort with TOO MANY INSTRUCTIONS.
// The instruction limit is configurable by the user, so if you have a really long-running
// process, this value can guide you with splitting it up into smaller, discretely schedulable parts.
// Note: Running this command and checking/handling the value also takes up some instructions.
int GetScriptInstructionsRemaining();
// Returns a modified copy of jArray with the value order changed according to nTransform:
// * JSON_ARRAY_SORT_ASCENDING, JSON_ARRAY_SORT_DESCENDING
// Sorting is dependent on the type and follows json standards (.e.g. 99 < "100").
// * JSON_ARRAY_SHUFFLE
// Randomises the order of elements.
// * JSON_ARRAY_REVERSE
// Reverses the array.
// * JSON_ARRAY_UNIQUE
// Returns a modified copy of jArray with duplicate values removed.
// Coercable but different types are not considered equal (e.g. 99 != "99"); int/float equivalence however applies: 4.0 == 4.
// Order is preserved.
// * JSON_ARRAY_COALESCE
// Returns the first non-null entry. Empty-ish values (e.g. "", 0) are not considered null, only the json scalar type.
json JsonArrayTransform(json jArray, int nTransform);
// Returns the nth-matching index or key of jNeedle in jHaystack.
// Supported haystacks: object, array
// Ordering behaviour for objects is unspecified.
// Return null when not found or on any error.
json JsonFind(json jHaystack, json jNeedle, int nNth = 0, int nConditional = JSON_FIND_EQUAL);
// Returns a copy of the range (nBeginIndex, nEndIndex) inclusive of jArray.
// Negative nEndIndex values count from the other end.
// Out-of-bound values are clamped to the array range.
// Examples:
// json a = JsonParse("[0, 1, 2, 3, 4]");
// JsonArrayGetRange(a, 0, 1) // => [0, 1]
// JsonArrayGetRange(a, 1, -1) // => [1, 2, 3, 4]
// JsonArrayGetRange(a, 0, 4) // => [0, 1, 2, 3, 4]
// JsonArrayGetRange(a, 0, 999) // => [0, 1, 2, 3, 4]
// JsonArrayGetRange(a, 1, 0) // => []
// JsonArrayGetRange(a, 1, 1) // => [1]
// Returns a null type on error, including type mismatches.
json JsonArrayGetRange(json jArray, int nBeginIndex, int nEndIndex);
// Returns the result of a set operation on two arrays.
// Operations:
// * JSON_SET_SUBSET (v <= o):
// Returns true if every element in jValue is also in jOther.
// * JSON_SET_UNION (v | o):
// Returns a new array containing values from both sides.
// * JSON_SET_INTERSECT (v & o):
// Returns a new array containing only values common to both sides.
// * JSON_SET_DIFFERENCE (v - o):
// Returns a new array containing only values not in jOther.
// * JSON_SET_SYMMETRIC_DIFFERENCE (v ^ o):
// Returns a new array containing all elements present in either array, but not both.
json JsonSetOp(json jValue, int nOp, json jOther);
// Returns the column name of s2DA at nColumn index (starting at 0).
// Returns "" if column nColumn doesn't exist (at end).
string Get2DAColumn(string s2DA, int nColumnIdx);
// Returns the number of defined rows in the 2da s2DA.
int Get2DARowCount(string s2DA);
[ 2021-11-29 18:27:59 CET ] [ Original post ]
Good day to all Neverwinter Nights adventurers!
Beamdog is happy to announce that after several years of hard work, Neverwinter Nights: Enhanced Edition models of player characters and their equipment (armor, weapons and shields) have finally been remade! Thank you kindly for your patience and support over these years!
Attention: using remade models on lower-end machines can lead to potential problems with the game performance.
This is why weve decided to provide a separate link for all our players to download The HD Models & Textures Pack for Neverwinter Nights: Enhanced Edition (4.1 gb). This pack includes updated models of weapons and shields previously released as the Steam Workshop content.
New models now support normal and spec information. All of these pieces can be further modded by the community, which is in line with the base game setup.
[ 2021-11-23 19:17:15 CET ] [ Original post ]
Greetings from the Neverwinter Nights team! Were pushing Build 85.8193.33 to the live branch!
Patch notes:
- Fixed local multiplayer failing with error 110622
- Fixed a crash when some PLT textures failed to load
- Fixed area tile source lights showing up as red when they previously were off after a game save & load
- Fixed some pathfinding regressions where creatures had difficulties leaving corridors/rooms
- Fixed a crash in the GetPlayerDeviceProperty script call when passing in an invalid player object
- Updated Steam SDK to version 152. This should fix the Mac M1 build not running natively when launched from Steam
- Added a message box when the user directory fails to initialise (instead of crashing). This is most commonly caused by Antivirus preventing write access to the Documents directory
[ 2021-09-30 18:02:39 CET ] [ Original post ]
Hello, this beta build is following the previous patch .32, with a few critical fixes:
- Fixed local multiplayer failing with error 110622.
- Fixed a crash when some PLT textures failed to load.
- Fixed area tile source lights showing up as red when they previously were off after a game save & load.
- Fixed some pathfinding regressions where creatures had difficulties leaving corridors/rooms.
- Fixed a crash in the GetPlayerDeviceProperty script call when passing in an invalid player object.
- Updated Steam SDK to version 152. This should fix the Mac M1 build not running natively when launched from Steam.
- Added a message box when the user directory fails to initialise (instead of crashing). This is most commonly caused by Antivirus preventing write access to the Documents directory.
[ 2021-09-28 16:33:21 CET ] [ Original post ]
Greetings, Neverwinter Nights players and modders! Today were releasing Patch 8193.32 for Neverwinter Nights: Enhanced Edition! This update brings dozens of bug fixes and new features including some exciting updates for content creators! Curated community content is also getting a new addition: A Hunt Through The Dark, by Markus Schlegel!
Patch Highlights
- Renderer | Significant performance improvements & better shadows
- New Curated Content | Play as a drow in Markus Schlegels campaign, A Hunt Through The Dark
- Scriptable UI | Module authors can now create custom UI panels!
- Apple M1 support | Owners of Apple M1 devices now will have a much better experience playing NWN:EE!
- More than 100 fixes | Many other new features, script commands & fixes
Changes over build .31
This build is following the beta build from last week, and includes the following changes on top of it:
- Renderer: Fixed SetTextureOverride() not working for custom content.
- Nui/Scriptable UI: Fixed combo() widget not decoding UTF8 correctly.
- ResMan: Fixed RESTYPE_JUI having the wrong ID, and added to nwscript.nss.
- nwscript.nss: Minor text/documentation updates.
Renderer Improvements
Many improvements have been made to the rendering and shadows engine:
- Greatly reduced the amount of CPU time spent on rendering shadows (50-90% less) by moving more work to the shaders and just doing things more intelligently.
- Reduced buffer transfers related to rendering shadows (perf+)
- Fixed some common shadow rendering issues related to "behind" stencil tests. It does not fix every issue, however, and in rare cases, some issues may become more apparent - but all in all, the benefits should outweigh the drawbacks. The old approach can be restored with using "shadowfliporder 1" in the console.
- Shadow and beam volumes now use their own unique shaders.
- Fixed a number of other shadow rendering issues by doing view frustrum clipping in the vertex shaders. This (beyond improving performance) alleviates issues with shadows sometimes being cut off in odd places (and similar).
- The game now uses tiledata bounding box to determine lower clip of shadow volumes. This fixes shadows not being applied to geometry below the z position of the tile.
- The game now adjusts shadow alpha based on the vertical distance between the shadow plane used for drawing projections and the projection source. This gives a more correct shading.
- Removed the experimental optimized shadow rendering toggle. It is now always enabled.
- Added some minor refinements that help reduce the visual oddities caused by shadows being projected by erroneous models.
- Fixed dynamic shadow rendering performance dropping significantly on certain devices due to the new streaming setup.
- Added new debug outputs that help content artists to debug models from within the game. This includes rendering mesh bounding boxes, pivots (centers), emitter and light ranges, as well as shadow volumes. The options are accessible through the normal debug panel (ctrl+shift+f12).
- Optimized generation of shadow volumes to better fit the size of the shadow plane used for rendering shadows. Improves performance in GPU limited situations.
- Fixed an issue that made shadows fade out too quickly at low view angles.
- Fixed an issue with the scene manager that made geometry culling less effective.
- Made the game automatically downsize textures larger than the client GPU supports (instead of just failing to render).
- Optimized the size of the baked font textures to minimize texture memory footprint.
- Tweaked the subsurface light algorithm and made the normal debug outputs also apply for water.
- Removed some redundant GPU data buffer uploads.
- Fixed soft particles reading the screen depth at an offset position, resulting in occasional halos appearing around objects.
- Fixed automatic tile texture rotation (`rotatetexture 1`) causing normal and displacement maps to malfunction.
- Added a new console command printvertexdata. Prints an overview of the amount of memory currently used for vertex data (model geometry) to the client log.
- Fixed rendering unlit models with envmap (chargen colour picker shader issue; Halaster model issue).
- Fixed object view culling not respecting visual transforms, resulting in objects sometimes not appearing if transformed into view.
- Fixed some static parts being removed after having been auto-combined, resulting in erroneous shadows for some static geometry.
- Fixed skinmesh bone hierarchy to initial model layout. This solves certain issues caused by skinmeshed bodyparts being dynamically attached and removed.
- Fixed low quality render mode darkening water too much.
Curated Content: A Hunt Through The Dark
by Markus Schlegel
Presenting the classic six-part campaign by Markus Schlegel - A Hunt Through The Dark! Did you ever want to play the dark side, the bad, the evil, the worst of all, the drow? Take part in a hunting trip through the Underdark. It is on you to enslave goblins, betray comrades and spoil the plans of your leader Mistress Piwiewien or not.
Scriptable UI
Modules can now spawn custom UI panels, either defined in NWScript or JSON datafiles.
- The layouting is done via a constraints solver and currently presents as a row/layout flow.
- Most native widget types available, including lower-level drawing primitives to create your own.
- Data binding is two-way between clients and the module, and allows synchronising sliders, input fields, buttons, and window geometry/properties. Mouse input events are supported as well.
- There is a new include file: nw_inc_nui.nss. There is also a demo script (nw_nui_demo.nss) that showcases some basic widget types. Finally, there is a more complex inspector example (nw_nui_insp.nss) that can show bind values for all open scripted windows.
- See the mentioned include file and demo for starting points. The new nwscript.nss API is reproduced at the end of this document.
NWScript JSON Datatype Support
NWScript now has a new native datatype, `json`. The API is documented at the end of these notes. The engine can also serialise game objects to/from json, similar to how the sql data binder works. There is a new data format .caf for area objects that combines .are and .git, so you can de/serialise areas into a single json object. The serialisation format is compatible with neverwinter.nim. There is a small helper library in nw_inc_gff.nss so you can construct GFF data on the fly (e.g. dynamic area/object creation and spawning). The API also supports JSON Pointer, Diff, Patch and Merge. The SQLite API has been amended for both Campaign DB and custom databases.
Other Features
- Added more GUI events, some suppressible, when the player interacts.
- Added device property queries to get player screen width height and scale.
- Added VM commands to query the game resource manager.
- PLT textures can now be phenotype-specific.
- Added a setting that allows players to control their non-PC party members in the same way as DMs do (drag, ctrl+click, etc). This is off by default, and can be enabled in server settings.
- Mac: Provided universal binary with a build for Apple M1. If you are on M1 and on Steam, you will have to launch the game directly, NOT via Steam, for the binary to run natively. Otherwise, it will run via Rosetta.
- Mac only: GOG Galaxy SDK no longer supported on x64 and arm64 (no native M1 build for the library).
- Mac only: Steam SDK/Workshop not supported on M1 (no native M1 build for the binary).
- Toolset: Added support for custom caster classes.
- Curated Content UI: Added support for promotion panels to show links to the Vault, Wikis, etc.
Smaller Changes
- Script compiler now supports `\xFF` style escape sequences to put arbitrary bytes into a string literal. NB: \x00 will terminate the string, do not use.
- Cleaned up ovr/, moved everything except scripts into keybif.
- Debug UI: You can now use the RunScript/Chunk Debug UI in SP even when DebugMode is off (for testing convenience).
- VM: Store/RetrieveCampaignObject, SqlBindObject, SqlGetObject, ObjectToJson, and JsonToObject now support an additional parameter; bSave/LoadObjectState; which handles local variables, effects, action queue and transition info (for doors and triggers).
- Updated game credits for 2021, moved button out of OC Campaign to top level Movie menu.
Fixes
- Game: Fixed savegames causing creatures in areas re-triggering the OnAreaEnter event. This was causing HotU chapter 3 to malfunction after saving and loading.
- Game: Fixed a rare crash when doors were melee-attacked by a null creature (PW-specific crash).
- Game: Fixed not storing fog clipping distance for areas when saving games.
- Game: Fixed a crash when showing a polymorphed creature on the party bar.
- Game: Fixed Steam Workshop modules not showing up if the .mod extension wasnt all lowercase.
- Toolset: Fixed inconsistencies with shadow rendering.
- Toolset: Fixed second story tile fade in Always mode not working correctly.
- Toolset: Areas are now considered modified when undo stack is changed
- Toolset: Undo now works for mouse wheel object scaling
- Toolset: Undo now works for Adjust Location dialog
- Toolset: Fixed a crash when right-clicking a tile with a recently-selected creature on it.
- Toolset: Fixed Replace All not working in backwards search mode.
- VM: Fixed crash in CreateArea() due to heap-use-after-free
- VM: Fixed a crash when SetResourceOverride was targeting a missing/invalid resource.
- VM: Fixed a memleak every time CopyObject, CreateObject or CreateArea was called.
- VM: Area serialisation: Do not save item state twice to GFF (this would needlessly duplicate temporary effects and local vars into savegames and serialised objects).
- Framelimiter: Opening up the radial menu is no longer considered background/modal.
- Nui: Fixed nuklear receiving input meant for the console.
- Nui: Fixed nuklear eating mouse clicks that should go to the radial menu instead.
Tyrants of the Moonsea
- Prevented use of the map inside the navigation cabin after traveling to a destination.
- Covered some poor camera rotations when transitioning out of the sea map.
- Removed an xp exploit in Ulblyn's conversation.
NWScript API Additions
int GUIEVENT_COMPASS_CLICK = 15;
int GUIEVENT_LEVELUP_CANCELLED = 16;
int GUIEVENT_AREA_LOADSCREEN_FINISHED = 17;
int GUIEVENT_QUICKCHAT_ACTIVATE = 18;
int GUIEVENT_QUICKCHAT_SELECT = 19;
int GUIEVENT_QUICKCHAT_CLOSE = 20;
int GUIEVENT_SELECT_CREATURE = 21;
int GUIEVENT_UNSELECT_CREATURE = 22;
int GUIEVENT_EXAMINE_OBJECT = 23;
int GUIEVENT_OPTIONS_OPEN = 24;
int GUIEVENT_OPTIONS_CLOSE = 25;
int JSON_TYPE_NULL = 0; // Also invalid
int JSON_TYPE_OBJECT = 1;
int JSON_TYPE_ARRAY = 2;
int JSON_TYPE_STRING = 3;
int JSON_TYPE_INTEGER = 4;
int JSON_TYPE_FLOAT = 5;
int JSON_TYPE_BOOL = 6;
// The player's gui width (inner window bounds).
string PLAYER_DEVICE_PROPERTY_GUI_WIDTH = "gui_width";
// The player's gui height (inner window bounds).
string PLAYER_DEVICE_PROPERTY_GUI_HEIGHT = "gui_height";
// The player's gui scale, in percent (factor 1.4 = 140)
string PLAYER_DEVICE_PROPERTY_GUI_SCALE = "gui_scale";
int PLAYER_LANGUAGE_INVALID = -1;
int PLAYER_LANGUAGE_ENGLISH = 0;
int PLAYER_LANGUAGE_FRENCH = 1;
int PLAYER_LANGUAGE_GERMAN = 2;
int PLAYER_LANGUAGE_ITALIAN = 3;
int PLAYER_LANGUAGE_SPANISH = 4;
int PLAYER_LANGUAGE_POLISH = 5;
int PLAYER_DEVICE_PLATFORM_INVALID = 0;
int PLAYER_DEVICE_PLATFORM_WINDOWS_X86 = 1;
int PLAYER_DEVICE_PLATFORM_WINDOWS_X64 = 2;
int PLAYER_DEVICE_PLATFORM_LINUX_X86 = 10;
int PLAYER_DEVICE_PLATFORM_LINUX_X64 = 11;
int PLAYER_DEVICE_PLATFORM_LINUX_ARM32 = 12;
int PLAYER_DEVICE_PLATFORM_LINUX_ARM64 = 13;
int PLAYER_DEVICE_PLATFORM_MAC_X86 = 20;
int PLAYER_DEVICE_PLATFORM_MAC_X64 = 21;
int PLAYER_DEVICE_PLATFORM_IOS = 30;
int PLAYER_DEVICE_PLATFORM_ANDROID_ARM32 = 40;
int PLAYER_DEVICE_PLATFORM_ANDROID_ARM64 = 41;
int PLAYER_DEVICE_PLATFORM_ANDROID_X64 = 42;
int PLAYER_DEVICE_PLATFORM_NINTENDO_SWITCH = 50;
int PLAYER_DEVICE_PLATFORM_MICROSOFT_XBOXONE = 60;
int PLAYER_DEVICE_PLATFORM_SONY_PS4 = 70;
int RESTYPE_RES = 0;
...
int RESTYPE_CAF = 2082;
// Parse the given string as a valid json value, and returns the corresponding type.
// Returns a JSON_TYPE_NULL on error.
// Check JsonGetError() to see the parse error, if any.
// NB: The parsed string needs to be in game-local encoding, but the generated json structure
// will contain UTF-8 data.
json JsonParse(string sJson);
// Dump the given json value into a string that can be read back in via JsonParse.
// nIndent describes the indentation level for pretty-printing; a value of -1 means no indentation and no linebreaks.
// Returns a string describing JSON_TYPE_NULL on error.
// NB: The dumped string is in game-local encoding, with all non-ascii characters escaped.
string JsonDump(json jValue, int nIndent = -1);
// Describes the type of the given json value.
// Returns JSON_TYPE_NULL if the value is empty.
int JsonGetType(json jValue);
// Returns the length of the given json type.
// For objects, returns the number of top-level keys present.
// For arrays, returns the number of elements.
// Null types are of size 0.
// All other types return 1.
int JsonGetLength(json jValue);
// Returns the error message if the value has errored out.
// Currently only describes parse errors.
string JsonGetError(json jValue);
// Create a NULL json value, seeded with a optional error message for JsonGetError().
json JsonNull(string sError = "");
// Create a empty json object.
json JsonObject();
// Create a empty json array.
json JsonArray();
// Create a json string value.
// NB: Strings are encoded to UTF-8 from the game-local charset.
json JsonString(string sValue);
// Create a json integer value.
json JsonInt(int nValue);
// Create a json floating point value.
json JsonFloat(float fValue);
// Create a json bool valye.
json JsonBool(int bValue);
// Returns a string representation of the json value.
// Returns "" if the value cannot be represented as a string, or is empty.
// NB: Strings are decoded from UTF-8 to the game-local charset.
string JsonGetString(json jValue);
// Returns a int representation of the json value, casting where possible.
// Returns 0 if the value cannot be represented as a float.
// Use this to parse json bool types.
// NB: This will narrow down to signed 32 bit, as that is what NWScript int is.
// If you are trying to read a 64 bit or unsigned integer, you will lose data.
// You will not lose data if you keep the value as a json element (via Object/ArrayGet).
int JsonGetInt(json jValue);
// Returns a float representation of the json value, casting where possible.
// Returns 0.0 if the value cannot be represented as a float.
// NB: This will narrow doubles down to float.
// If you are trying to read a double, you will lose data.
// You will not lose data if you keep the value as a json element (via Object/ArrayGet).
float JsonGetFloat(json jValue);
// Returns a json array containing all keys of jObject.
// Returns a empty array if the object is empty or not a json object, with GetJsonError() filled in.
json JsonObjectKeys(json jObject);
// Returns the key value of sKey on the object jObect.
// Returns a null json value if jObject is not a object or sKey does not exist on the object, with GetJsonError() filled in.
json JsonObjectGet(json jObject, string sKey);
// Returns a modified copy of jObject with the key at sKey set to jValue.
// Returns a json null value if jObject is not a object, with GetJsonError() filled in.
json JsonObjectSet(json jObject, string sKey, json jValue);
// Returns a modified copy of jObject with the key at sKey deleted.
// Returns a json null value if jObject is not a object, with GetJsonError() filled in.
json JsonObjectDel(json jObject, string sKey);
// Gets the json object at jArray index position nIndex.
// Returns a json null value if the index is out of bounds, with GetJsonError() filled in.
json JsonArrayGet(json jArray, int nIndex);
// Returns a modified copy of jArray with position nIndex set to jValue.
// Returns a json null value if jArray is not actually an array, with GetJsonError() filled in.
// Returns a json null value if nIndex is out of bounds, with GetJsonError() filled in.
json JsonArraySet(json jArray, int nIndex, json jValue);
// Returns a modified copy of jArray with jValue inserted at position nIndex.
// All succeeding objects in the array will move by one.
// By default (-1), inserts objects at the end of the array ("push").
// nIndex = 0 inserts at the beginning of the array.
// Returns a json null value if jArray is not actually an array, with GetJsonError() filled in.
// Returns a json null value if nIndex is not 0 or -1 and out of bounds, with GetJsonError() filled in.
json JsonArrayInsert(json jArray, json jValue, int nIndex = -1);
// Returns a modified copy of jArray with the element at position nIndex removed,
// and the array resized by one.
// Returns a json null value if jArray is not actually an array, with GetJsonError() filled in.
// Returns a json null value if nIndex is out of bounds, with GetJsonError() filled in.
json JsonArrayDel(json jArray, int nIndex);
// Transforms the given object into a json structure.
// The json format is compatible with what https://github.com/niv/neverwinter.nim@1.4.3+ emits.
// Returns the null json type on errors, or if oObject is not serializable, with GetJsonError() filled in.
// Supported object types: creature, item, trigger, placeable, door, waypoint, encounter, store, area (combined format)
// If bSaveObjectState is TRUE, local vars, effects, action queue, and transition info (triggers, doors) are saved out
// (except for Combined Area Format, which always has object state saved out).
json ObjectToJson(object oObject, int bSaveObjectState = FALSE);
// Deserializes the game object described in jObject.
// Returns OBJECT_INVALID on errors.
// Supported object types: creature, item, trigger, placeable, door, waypoint, encounter, store, area (combined format)
// For areas, locLocation is ignored.
// If bLoadObjectState is TRUE, local vars, effects, action queue, and transition info (triggers, doors) are read in.
object JsonToObject(json jObject, location locLocation, object oOwner = OBJECT_INVALID, int bLoadObjectState = FALSE);
// Returns the element at the given JSON pointer value.
// See https://datatracker.ietf.org/doc/html/rfc6901 for details.
// Returns a json null value on error, with GetJsonError() filled in.
json JsonPointer(json jData, string sPointer);
// Return a modified copy of jData with jValue inserted at the path described by sPointer.
// See https://datatracker.ietf.org/doc/html/rfc6901 for details.
// Returns a json null value on error, with GetJsonError() filled in.
// jPatch is an array of patch elements, each containing a op, a path, and a value field. Example:
// [
// { "op": "replace", "path": "/baz", "value": "boo" },
// { "op": "add", "path": "/hello", "value": ["world"] },
// { "op": "remove", "path": "/foo"}
// ]
// Valid operations are: add, remove, replace, move, copy, test
json JsonPatch(json jData, json jPatch);
// Returns the diff (described as a json structure you can pass into JsonPatch) between the two objects.
// Returns a json null value on error, with GetJsonError() filled in.
json JsonDiff(json jLHS, json jRHS);
// Returns a modified copy of jData with jMerge merged into it. This is an alternative to
// JsonPatch/JsonDiff, with a syntax more closely resembling the final object.
// See https://datatracker.ietf.org/doc/html/rfc7386 for details.
// Returns a json null value on error, with GetJsonError() filled in.
json JsonMerge(json jData, json jMerge);
// Get oObject's local json variable sVarName
// * Return value on error: json null type
json GetLocalJson(object oObject, string sVarName);
// Set oObject's local json variable sVarName to jValue
void SetLocalJson(object oObject, string sVarName, json jValue);
// Delete oObject's local json variable sVarName
void DeleteLocalJson(object oObject, string sVarName);
// Bind an json to a named parameter of the given prepared query.
// Json values are serialised into a string.
// Example:
// sqlquery v = SqlPrepareQueryObject(GetModule(), "insert into test (col) values (@myjson);");
// SqlBindJson(v, "@myjson", myJsonObject);
// SqlStep(v);
void SqlBindJson(sqlquery sqlQuery, string sParam, json jValue);
// Retrieve a column cast as a json value of the currently stepped row.
// You can call this after SqlStep() returned TRUE.
// In case of error, a json null value will be returned.
// In traditional fashion, nIndex starts at 0.
json SqlGetJson(sqlquery sqlQuery, int nIndex);
// This stores a json out to the specified campaign database
// The database name:
// - is case insensitive and it must be the same for both set and get functions.
// - can only contain alphanumeric characters, no spaces.
// The var name must be unique across the entire database, regardless of the variable type.
// If you want a variable to pertain to a specific player in the game, provide a player object.
void SetCampaignJson(string sCampaignName, string sVarName, json jValue, object oPlayer=OBJECT_INVALID);
// This will read a json from the specified campaign database
// The database name:
// - is case insensitive and it must be the same for both set and get functions.
// - can only contain alphanumeric characters, no spaces.
// The var name must be unique across the entire database, regardless of the variable type.
// If you want a variable to pertain to a specific player in the game, provide a player object.
json GetCampaignJson(string sCampaignName, string sVarName, object oPlayer=OBJECT_INVALID);
// Gets a device property/capability as advertised by the client.
// sProperty is one of PLAYER_DEVICE_PROPERTY_xxx.
// Returns -1 if
// - the property was never set by the client,
// - the the actual value is -1,
// - the player is running a older build that does not advertise device properties,
// - the player has disabled sending device properties (Options->Game->Privacy).
int GetPlayerDeviceProperty(object oPlayer, string sProperty);
// Returns the LANGUAGE_xx code of the given player, or -1 if unavailable.
int GetPlayerLanguage(object oPlayer);
// Returns one of PLAYER_DEVICE_PLATFORM_xxx, or 0 if unavailable.
int GetPlayerDevicePlatform(object oPlayer);
// Deserializes the given resref/template into a JSON structure.
// Supported GFF resource types:
// * RESTYPE_CAF (and RESTYPE_ARE, RESTYPE_GIT, RESTYPE_GIC)
// * RESTYPE_UTC
// * RESTYPE_UTI
// * RESTYPE_UTT
// * RESTYPE_UTP
// * RESTYPE_UTD
// * RESTYPE_UTW
// * RESTYPE_UTE
// * RESTYPE_UTM
// Returns a valid gff-type json structure, or a null value with GetJsonError() set.
json TemplateToJson(string sResRef, int nResType);
// Returns the resource location of sResRef.nResType, as seen by the running module.
// Note for dedicated servers: Checks on the module/server side, not the client.
// Returns "" if the resource does not exist in the search space.
string ResManGetAliasFor(string sResRef, int nResType);
// Finds the nNth available resref starting with sPrefix.
// * Set bSearchBaseData to TRUE to also search base game content stored in your game installation directory.
// WARNING: This can be very slow.
// * Set sOnlyKeyTable to a specific keytable to only search the given named keytable (e.g. "OVERRIDE:").
// Returns "" if no such resref exists.
string ResManFindPrefix(string sPrefix, int nResType, int nNth = 1, int bSearchBaseData = FALSE, string sOnlyKeyTable = "");
// Create a NUI window from the given resref(.jui) for the given player.
// * The resref needs to be available on the client, not the server.
// * The token is a integer for ease of handling only. You are not supposed to do anything with it, except store/pass it.
// * The window ID needs to be alphanumeric and short. Only one window (per client) with the same ID can exist at a time.
// Re-creating a window with the same id of one already open will immediately close the old one.
// * See nw_inc_nui.nss for full documentation.
// Returns the window token on success (>0), or 0 on error.
int NuiCreateFromResRef(object oPlayer, string sResRef, string sWindowId = "");
// Create a NUI window inline for the given player.
// * The token is a integer for ease of handling only. You are not supposed to do anything with it, except store/pass it.
// * The window ID needs to be alphanumeric and short. Only one window (per client) with the same ID can exist at a time.
// Re-creating a window with the same id of one already open will immediately close the old one.
// * See nw_inc_nui.nss for full documentation.
// Returns the window token on success (>0), or 0 on error.
int NuiCreate(object oPlayer, json jNui, string sWindowId = "");
// You can look up windows by ID, if you gave them one.
// * Windows with a ID present are singletons - attempting to open a second one with the same ID
// will fail, even if the json definition is different.
// Returns the token if found, or 0.
int NuiFindWindow(object oPlayer, string sId);
// Destroys the given window, by token, immediately closing it on the client.
// Does nothing if nUiToken does not exist on the client.
// Does not send a close event - this immediately destroys all serverside state.
// The client will close the window asynchronously.
void NuiDestroy(object oPlayer, int nUiToken);
// Returns the originating player of the current event.
object NuiGetEventPlayer();
// Gets the window token of the current event (or 0 if not in a event).
int NuiGetEventWindow();
// Returns the event type of the current event.
// * See nw_inc_nui.nss for full documentation of all events.
string NuiGetEventType();
// Returns the ID of the widget that triggered the event.
string NuiGetEventElement();
// Get the array index of the current event.
// This can be used to get the index into an array, for example when rendering lists of buttons.
// Returns -1 if the event is not originating from within an array.
int NuiGetEventArrayIndex();
// Returns the window ID of the window described by nUiToken.
// Returns "" on error, or if the window has no ID.
string NuiGetWindowId(object oPlayer, int nUiToken);
// Gets the json value for the given player, token and bind.
// * json values can hold all kinds of values; but NUI widgets require specific bind types.
// It is up to you to either handle this in NWScript, or just set compatible bind types.
// No auto-conversion happens.
// Returns a json null value if the bind does not exist.
json NuiGetBind(object oPlayer, int nUiToken, string sBindName);
// Sets a json value for the given player, token and bind.
// The value is synced down to the client and can be used in UI binding.
// When the UI changes the value, it is returned to the server and can be retrieved via NuiGetBind().
// * json values can hold all kinds of values; but NUI widgets require specific bind types.
// It is up to you to either handle this in NWScript, or just set compatible bind types.
// No auto-conversion happens.
// * If the bind is on the watch list, this will immediately invoke the event handler with the "watch"
// even type; even before this function returns. Do not update watched binds from within the watch handler
// unless you enjoy stack overflows.
// Does nothing if the given player+token is invalid.
void NuiSetBind(object oPlayer, int nUiToken, string sBindName, json jValue);
// Swaps out the given element (by id) with the given nui layout (partial).
// * This currently only works with the "group" element type, and the special "_window_" root group.
void NuiSetGroupLayout(object oPlayer, int nUiToken, string sElement, json jNui);
// Mark the given bind name as watched.
// A watched bind will invoke the NUI script event every time it's value changes.
// Be careful with binding nui data inside a watch event handler: It's easy to accidentally recurse yourself into a stack overflow.
int NuiSetBindWatch(object oPlayer, int nUiToken, string sBind, int bWatch);
// Returns the nNth window token of the player, or 0.
// nNth starts at 0.
// Iterator is not write-safe: Calling DestroyWindow() will invalidate move following offsets by one.
int NuiGetNthWindow(object oPlayer, int nNth = 0);
// Return the nNth bind name of the given window, or "".
// If bWatched is TRUE, iterates only watched binds.
// If FALSE, iterates all known binds on the window (either set locally or in UI).
string NuiGetNthBind(object oPlayer, int nToken, int bWatched, int nNth = 0);
// Returns the event payload, specific to the event.
// Returns JsonNull if event has no payload.
json NuiGetEventPayload();
// Get the userdata of the given window token.
// Returns JsonNull if the window does not exist on the given player, or has no userdata set.
json NuiGetUserData(object oPlayer, int nToken);
// Sets an arbitrary json value as userdata on the given window token.
// This userdata is not read or handled by the game engine and not sent to clients.
// This mechanism only exists as a convenience for the programmer to store data bound to a windows' lifecycle.
// Will do nothing if the window does not exist.
void NuiSetUserData(object oPlayer, int nToken, json jUserData);
[ 2021-09-22 19:18:16 CET ] [ Original post ]
Hello friends! How have you been doing? The Beamdog team has been hard at work on the next Neverwinter Nights: Enhanced Edition patch! Today, we are shipping release 8193.31 to the development branch of NWN:EE. This is a huge beta patch, with many new and exciting features. We appreciate your assistance in helping us test them, and reporting any/all issues you find.
Highlights
- Significant renderer performance improvements & better shadows.
- New Curated Content: A Hunt Through The Dark, by Markus Schlegel.
- Scriptable UI.
- Apple M1.
- Many other new features, script commands & fixes.
Renderer Improvements
Many improvements have been made to the rendering and shadows engine:
- Greatly reduced the amount of CPU time spent on rendering shadows (50-90% less) by moving more work to the shaders and just doing things more intelligently.
- Reduced buffer transfers related to rendering shadows (perf+)
- Fixed some common shadow rendering issues related to "behind" stencil tests. It does not fix every issue, however, and in rare cases, some issues may become more apparent - but all in all, the benefits should outweigh the drawbacks. The old approach can be restored with using "shadowfliporder 1" in the console.
- Shadow and beam volumes now use their own unique shaders.
- Fixed a number of other shadow rendering issues by doing view frustrum clipping in the vertex shaders. This (beyond improving performance) alleviates issues with shadows sometimes being cut off in odd places (and similar).
- The game now uses tiledata bounding box to determine lower clip of shadow volumes. This fixes shadows not being applied to geometry below the z position of the tile.
- The game now adjusts shadow alpha based on the vertical distance between the shadow plane used for drawing projections and the projection source. This gives a more correct shading.
- Removed the experimental optimized shadow rendering toggle. It is now always enabled.
- Added some minor refinements that help reduce the visual oddities caused by shadows being projected by erroneous models.
- Fixed dynamic shadow rendering performance dropping significantly on certain devices due to the new streaming setup.
- Added new debug outputs that help content artists to debug models from within the game. This includes rendering mesh bounding boxes, pivots (centers), emitter and light ranges, as well as shadow volumes. The options are accessible through the normal debug panel (ctrl+shift+f12).
- Optimized generation of shadow volumes to better fit the size of the shadow plane used for rendering shadows. Improves performance in GPU limited situations.
- Fixed an issue that made shadows fade out too quickly at low view angles.
- Fixed an issue with the scene manager that made geometry culling less effective.
- Made the game automatically downsize textures larger than the client GPU supports (instead of just failing to render).
- Optimized the size of the baked font textures to minimize texture memory footprint.
- Tweaked the subsurface light algorithm and made the normal debug outputs also apply for water.
- Removed some redundant GPU data buffer uploads.
- Fixed soft particles reading the screen depth at an offset position, resulting in occasional halos appearing around objects.
- Fixed automatic tile texture rotation (`rotatetexture 1`) causing normal and displacement maps to malfunction.
- Added a new console command printvertexdata. Prints an overview of the amount of memory currently used for vertex data (model geometry) to the client log.
- Fixed rendering unlit models with envmap (chargen colour picker shader issue; Halaster model issue).
- Fixed object view culling not respecting visual transforms, resulting in objects sometimes not appearing if transformed into view.
- Fixed some static parts being removed after having been auto-combined, resulting in erroneous shadows for some static geometry.
- Fixed skinmesh bone hierarchy to initial model layout. This solves certain issues caused by skinmeshed bodyparts being dynamically attached and removed.
- Fixed low quality render mode darkening water too much.
Curated Content: A Hunt Through The Dark
by Markus Schlegel
Presenting the classic six-part campaign by Markus Schlegel - A Hunt Through The Dark! Did you ever want to play the dark side, the bad, the evil, the worst of all, the drow? Take part in a hunting trip through the Underdark. It is on you to enslave goblins, betray comrades and spoil the plans of your leader Mistress Piwiewien or not.
Scriptable UI
Modules can now spawn custom UI panels, either defined in NWScript or JSON datafiles.
- The layouting is done via a constraints solver and currently presents as a row/layout flow.
- Most native widget types available, including lower-level drawing primitives to create your own.
- Data binding is two-way between clients and the module, and allows synchronising sliders, input fields, buttons, and window geometry/properties. Mouse input events are supported as well.
- There is a new include file: nw_inc_nui.nss. There is also a demo script (nw_nui_demo.nss) that showcases some basic widget types. Finally, there is a more complex inspector example (nw_nui_insp.nss) that can show bind values for all open scripted windows.
- See the mentioned include file and demo for starting points. The new nwscript.nss API is reproduced at the end of this document.
NWScript JSON Datatype Support
NWScript now has a new native datatype, `json`. The API is documented at the end of these notes. The engine can also serialise game objects to/from json, similar to how the sql data binder works. There is a new data format .caf for area objects that combines .are and .git, so you can de/serialise areas into a single json object. The serialisation format is compatible with neverwinter.nim. There is a small helper library in nw_inc_gff.nss so you can construct GFF data on the fly (e.g. dynamic area/object creation and spawning). The API also supports JSON Pointer, Diff, Patch and Merge. The SQLite API has been amended for both Campaign DB and custom databases.
Other Features
- Added more GUI events, some suppressible, when the player interacts.
- Added device property queries to get player screen width height and scale.
- Added VM commands to query the game resource manager.
- PLT textures can now be phenotype-specific.
- Added a setting that allows players to control their non-PC party members in the same way as DMs do (drag, ctrl+click, etc). This is off by default, and can be enabled in server settings.
- Mac: Provided universal binary with a build for Apple M1. If you are on M1 and on Steam, you will have to launch the game directly, NOT via Steam, for the binary to run natively. Otherwise, it will run via Rosetta.
- Mac only: GOG Galaxy SDK no longer supported on x64 and arm64 (no native M1 build for the library).
- Mac only: Steam SDK/Workshop not supported on M1 (no native M1 build for the binary).
- Toolset: Added support for custom caster classes.
- Curated Content UI: Added support for promotion panels to show links to the Vault, Wikis, etc.
Smaller Changes
- Script compiler now supports `\xFF` style escape sequences to put arbitrary bytes into a string literal. NB: \x00 will terminate the string, do not use.
- Cleaned up ovr/, moved everything except scripts into keybif.
- Debug UI: You can now use the RunScript/Chunk Debug UI in SP even when DebugMode is off (for testing convenience).
- VM: Store/RetrieveCampaignObject, SqlBindObject, SqlGetObject, ObjectToJson, and JsonToObject now support an additional parameter; bSave/LoadObjectState; which handles local variables, effects, action queue and transition info (for doors and triggers).
- Updated game credits for 2021, moved button out of OC Campaign to top level Movie menu.
Fixes
- Game: Fixed savegames causing creatures in areas re-triggering the OnAreaEnter event. This was causing HotU chapter 3 to malfunction after saving and loading.
- Game: Fixed a rare crash when doors were melee-attacked by a null creature (PW-specific crash).
- Game: Fixed not storing fog clipping distance for areas when saving games.
- Game: Fixed a crash when showing a polymorphed creature on the party bar.
- Game: Fixed Steam Workshop modules not showing up if the .mod extension wasnt all lowercase.
- Toolset: Fixed inconsistencies with shadow rendering.
- Toolset: Fixed second story tile fade in Always mode not working correctly.
- Toolset: Areas are now considered modified when undo stack is changed
- Toolset: Undo now works for mouse wheel object scaling
- Toolset: Undo now works for Adjust Location dialog
- Toolset: Fixed a crash when right-clicking a tile with a recently-selected creature on it.
- Toolset: Fixed Replace All not working in backwards search mode.
- VM: Fixed crash in CreateArea() due to heap-use-after-free
- VM: Fixed a crash when SetResourceOverride was targeting a missing/invalid resource.
- VM: Fixed a memleak every time CopyObject, CreateObject or CreateArea was called.
- VM: Area serialisation: Do not save item state twice to GFF (this would needlessly duplicate temporary effects and local vars into savegames and serialised objects).
- Framelimiter: Opening up the radial menu is no longer considered background/modal.
- Nui: Fixed nuklear receiving input meant for the console.
- Nui: Fixed nuklear eating mouse clicks that should go to the radial menu instead.
Tyrants of the Moonsea
- Prevented use of the map inside the navigation cabin after traveling to a destination.
- Covered some poor camera rotations when transitioning out of the sea map.
- Removed an xp exploit in Ulblyn's conversation.
NWScript API Additions
int GUIEVENT_COMPASS_CLICK = 15;
int GUIEVENT_LEVELUP_CANCELLED = 16;
int GUIEVENT_AREA_LOADSCREEN_FINISHED = 17;
int GUIEVENT_QUICKCHAT_ACTIVATE = 18;
int GUIEVENT_QUICKCHAT_SELECT = 19;
int GUIEVENT_QUICKCHAT_CLOSE = 20;
int GUIEVENT_SELECT_CREATURE = 21;
int GUIEVENT_UNSELECT_CREATURE = 22;
int GUIEVENT_EXAMINE_OBJECT = 23;
int GUIEVENT_OPTIONS_OPEN = 24;
int GUIEVENT_OPTIONS_CLOSE = 25;
int JSON_TYPE_NULL = 0; // Also invalid
int JSON_TYPE_OBJECT = 1;
int JSON_TYPE_ARRAY = 2;
int JSON_TYPE_STRING = 3;
int JSON_TYPE_INTEGER = 4;
int JSON_TYPE_FLOAT = 5;
int JSON_TYPE_BOOL = 6;
// The player's gui width (inner window bounds).
string PLAYER_DEVICE_PROPERTY_GUI_WIDTH = "gui_width";
// The player's gui height (inner window bounds).
string PLAYER_DEVICE_PROPERTY_GUI_HEIGHT = "gui_height";
// The player's gui scale, in percent (factor 1.4 = 140)
string PLAYER_DEVICE_PROPERTY_GUI_SCALE = "gui_scale";
int PLAYER_LANGUAGE_INVALID = -1;
int PLAYER_LANGUAGE_ENGLISH = 0;
int PLAYER_LANGUAGE_FRENCH = 1;
int PLAYER_LANGUAGE_GERMAN = 2;
int PLAYER_LANGUAGE_ITALIAN = 3;
int PLAYER_LANGUAGE_SPANISH = 4;
int PLAYER_LANGUAGE_POLISH = 5;
int PLAYER_DEVICE_PLATFORM_INVALID = 0;
int PLAYER_DEVICE_PLATFORM_WINDOWS_X86 = 1;
int PLAYER_DEVICE_PLATFORM_WINDOWS_X64 = 2;
int PLAYER_DEVICE_PLATFORM_LINUX_X86 = 10;
int PLAYER_DEVICE_PLATFORM_LINUX_X64 = 11;
int PLAYER_DEVICE_PLATFORM_LINUX_ARM32 = 12;
int PLAYER_DEVICE_PLATFORM_LINUX_ARM64 = 13;
int PLAYER_DEVICE_PLATFORM_MAC_X86 = 20;
int PLAYER_DEVICE_PLATFORM_MAC_X64 = 21;
int PLAYER_DEVICE_PLATFORM_IOS = 30;
int PLAYER_DEVICE_PLATFORM_ANDROID_ARM32 = 40;
int PLAYER_DEVICE_PLATFORM_ANDROID_ARM64 = 41;
int PLAYER_DEVICE_PLATFORM_ANDROID_X64 = 42;
int PLAYER_DEVICE_PLATFORM_NINTENDO_SWITCH = 50;
int PLAYER_DEVICE_PLATFORM_MICROSOFT_XBOXONE = 60;
int PLAYER_DEVICE_PLATFORM_SONY_PS4 = 70;
int RESTYPE_RES = 0;
...
int RESTYPE_CAF = 2082;
// Parse the given string as a valid json value, and returns the corresponding type.
// Returns a JSON_TYPE_NULL on error.
// Check JsonGetError() to see the parse error, if any.
// NB: The parsed string needs to be in game-local encoding, but the generated json structure
// will contain UTF-8 data.
json JsonParse(string sJson);
// Dump the given json value into a string that can be read back in via JsonParse.
// nIndent describes the indentation level for pretty-printing; a value of -1 means no indentation and no linebreaks.
// Returns a string describing JSON_TYPE_NULL on error.
// NB: The dumped string is in game-local encoding, with all non-ascii characters escaped.
string JsonDump(json jValue, int nIndent = -1);
// Describes the type of the given json value.
// Returns JSON_TYPE_NULL if the value is empty.
int JsonGetType(json jValue);
// Returns the length of the given json type.
// For objects, returns the number of top-level keys present.
// For arrays, returns the number of elements.
// Null types are of size 0.
// All other types return 1.
int JsonGetLength(json jValue);
// Returns the error message if the value has errored out.
// Currently only describes parse errors.
string JsonGetError(json jValue);
// Create a NULL json value, seeded with a optional error message for JsonGetError().
json JsonNull(string sError = "");
// Create a empty json object.
json JsonObject();
// Create a empty json array.
json JsonArray();
// Create a json string value.
// NB: Strings are encoded to UTF-8 from the game-local charset.
json JsonString(string sValue);
// Create a json integer value.
json JsonInt(int nValue);
// Create a json floating point value.
json JsonFloat(float fValue);
// Create a json bool valye.
json JsonBool(int bValue);
// Returns a string representation of the json value.
// Returns "" if the value cannot be represented as a string, or is empty.
// NB: Strings are decoded from UTF-8 to the game-local charset.
string JsonGetString(json jValue);
// Returns a int representation of the json value, casting where possible.
// Returns 0 if the value cannot be represented as a float.
// Use this to parse json bool types.
// NB: This will narrow down to signed 32 bit, as that is what NWScript int is.
// If you are trying to read a 64 bit or unsigned integer, you will lose data.
// You will not lose data if you keep the value as a json element (via Object/ArrayGet).
int JsonGetInt(json jValue);
// Returns a float representation of the json value, casting where possible.
// Returns 0.0 if the value cannot be represented as a float.
// NB: This will narrow doubles down to float.
// If you are trying to read a double, you will lose data.
// You will not lose data if you keep the value as a json element (via Object/ArrayGet).
float JsonGetFloat(json jValue);
// Returns a json array containing all keys of jObject.
// Returns a empty array if the object is empty or not a json object, with GetJsonError() filled in.
json JsonObjectKeys(json jObject);
// Returns the key value of sKey on the object jObect.
// Returns a null json value if jObject is not a object or sKey does not exist on the object, with GetJsonError() filled in.
json JsonObjectGet(json jObject, string sKey);
// Returns a modified copy of jObject with the key at sKey set to jValue.
// Returns a json null value if jObject is not a object, with GetJsonError() filled in.
json JsonObjectSet(json jObject, string sKey, json jValue);
// Returns a modified copy of jObject with the key at sKey deleted.
// Returns a json null value if jObject is not a object, with GetJsonError() filled in.
json JsonObjectDel(json jObject, string sKey);
// Gets the json object at jArray index position nIndex.
// Returns a json null value if the index is out of bounds, with GetJsonError() filled in.
json JsonArrayGet(json jArray, int nIndex);
// Returns a modified copy of jArray with position nIndex set to jValue.
// Returns a json null value if jArray is not actually an array, with GetJsonError() filled in.
// Returns a json null value if nIndex is out of bounds, with GetJsonError() filled in.
json JsonArraySet(json jArray, int nIndex, json jValue);
// Returns a modified copy of jArray with jValue inserted at position nIndex.
// All succeeding objects in the array will move by one.
// By default (-1), inserts objects at the end of the array ("push").
// nIndex = 0 inserts at the beginning of the array.
// Returns a json null value if jArray is not actually an array, with GetJsonError() filled in.
// Returns a json null value if nIndex is not 0 or -1 and out of bounds, with GetJsonError() filled in.
json JsonArrayInsert(json jArray, json jValue, int nIndex = -1);
// Returns a modified copy of jArray with the element at position nIndex removed,
// and the array resized by one.
// Returns a json null value if jArray is not actually an array, with GetJsonError() filled in.
// Returns a json null value if nIndex is out of bounds, with GetJsonError() filled in.
json JsonArrayDel(json jArray, int nIndex);
// Transforms the given object into a json structure.
// The json format is compatible with what https://github.com/niv/neverwinter.nim@1.4.3+ emits.
// Returns the null json type on errors, or if oObject is not serializable, with GetJsonError() filled in.
// Supported object types: creature, item, trigger, placeable, door, waypoint, encounter, store, area (combined format)
// If bSaveObjectState is TRUE, local vars, effects, action queue, and transition info (triggers, doors) are saved out
// (except for Combined Area Format, which always has object state saved out).
json ObjectToJson(object oObject, int bSaveObjectState = FALSE);
// Deserializes the game object described in jObject.
// Returns OBJECT_INVALID on errors.
// Supported object types: creature, item, trigger, placeable, door, waypoint, encounter, store, area (combined format)
// For areas, locLocation is ignored.
// If bLoadObjectState is TRUE, local vars, effects, action queue, and transition info (triggers, doors) are read in.
object JsonToObject(json jObject, location locLocation, object oOwner = OBJECT_INVALID, int bLoadObjectState = FALSE);
// Returns the element at the given JSON pointer value.
// See https://datatracker.ietf.org/doc/html/rfc6901 for details.
// Returns a json null value on error, with GetJsonError() filled in.
json JsonPointer(json jData, string sPointer);
// Return a modified copy of jData with jValue inserted at the path described by sPointer.
// See https://datatracker.ietf.org/doc/html/rfc6901 for details.
// Returns a json null value on error, with GetJsonError() filled in.
// jPatch is an array of patch elements, each containing a op, a path, and a value field. Example:
// [
// { "op": "replace", "path": "/baz", "value": "boo" },
// { "op": "add", "path": "/hello", "value": ["world"] },
// { "op": "remove", "path": "/foo"}
// ]
// Valid operations are: add, remove, replace, move, copy, test
json JsonPatch(json jData, json jPatch);
// Returns the diff (described as a json structure you can pass into JsonPatch) between the two objects.
// Returns a json null value on error, with GetJsonError() filled in.
json JsonDiff(json jLHS, json jRHS);
// Returns a modified copy of jData with jMerge merged into it. This is an alternative to
// JsonPatch/JsonDiff, with a syntax more closely resembling the final object.
// See https://datatracker.ietf.org/doc/html/rfc7386 for details.
// Returns a json null value on error, with GetJsonError() filled in.
json JsonMerge(json jData, json jMerge);
// Get oObject's local json variable sVarName
// * Return value on error: json null type
json GetLocalJson(object oObject, string sVarName);
// Set oObject's local json variable sVarName to jValue
void SetLocalJson(object oObject, string sVarName, json jValue);
// Delete oObject's local json variable sVarName
void DeleteLocalJson(object oObject, string sVarName);
// Bind an json to a named parameter of the given prepared query.
// Json values are serialised into a string.
// Example:
// sqlquery v = SqlPrepareQueryObject(GetModule(), "insert into test (col) values (@myjson);");
// SqlBindJson(v, "@myjson", myJsonObject);
// SqlStep(v);
void SqlBindJson(sqlquery sqlQuery, string sParam, json jValue);
// Retrieve a column cast as a json value of the currently stepped row.
// You can call this after SqlStep() returned TRUE.
// In case of error, a json null value will be returned.
// In traditional fashion, nIndex starts at 0.
json SqlGetJson(sqlquery sqlQuery, int nIndex);
// This stores a json out to the specified campaign database
// The database name:
// - is case insensitive and it must be the same for both set and get functions.
// - can only contain alphanumeric characters, no spaces.
// The var name must be unique across the entire database, regardless of the variable type.
// If you want a variable to pertain to a specific player in the game, provide a player object.
void SetCampaignJson(string sCampaignName, string sVarName, json jValue, object oPlayer=OBJECT_INVALID);
// This will read a json from the specified campaign database
// The database name:
// - is case insensitive and it must be the same for both set and get functions.
// - can only contain alphanumeric characters, no spaces.
// The var name must be unique across the entire database, regardless of the variable type.
// If you want a variable to pertain to a specific player in the game, provide a player object.
json GetCampaignJson(string sCampaignName, string sVarName, object oPlayer=OBJECT_INVALID);
// Gets a device property/capability as advertised by the client.
// sProperty is one of PLAYER_DEVICE_PROPERTY_xxx.
// Returns -1 if
// - the property was never set by the client,
// - the the actual value is -1,
// - the player is running a older build that does not advertise device properties,
// - the player has disabled sending device properties (Options->Game->Privacy).
int GetPlayerDeviceProperty(object oPlayer, string sProperty);
// Returns the LANGUAGE_xx code of the given player, or -1 if unavailable.
int GetPlayerLanguage(object oPlayer);
// Returns one of PLAYER_DEVICE_PLATFORM_xxx, or 0 if unavailable.
int GetPlayerDevicePlatform(object oPlayer);
// Deserializes the given resref/template into a JSON structure.
// Supported GFF resource types:
// * RESTYPE_CAF (and RESTYPE_ARE, RESTYPE_GIT, RESTYPE_GIC)
// * RESTYPE_UTC
// * RESTYPE_UTI
// * RESTYPE_UTT
// * RESTYPE_UTP
// * RESTYPE_UTD
// * RESTYPE_UTW
// * RESTYPE_UTE
// * RESTYPE_UTM
// Returns a valid gff-type json structure, or a null value with GetJsonError() set.
json TemplateToJson(string sResRef, int nResType);
// Returns the resource location of sResRef.nResType, as seen by the running module.
// Note for dedicated servers: Checks on the module/server side, not the client.
// Returns "" if the resource does not exist in the search space.
string ResManGetAliasFor(string sResRef, int nResType);
// Finds the nNth available resref starting with sPrefix.
// * Set bSearchBaseData to TRUE to also search base game content stored in your game installation directory.
// WARNING: This can be very slow.
// * Set sOnlyKeyTable to a specific keytable to only search the given named keytable (e.g. "OVERRIDE:").
// Returns "" if no such resref exists.
string ResManFindPrefix(string sPrefix, int nResType, int nNth = 1, int bSearchBaseData = FALSE, string sOnlyKeyTable = "");
// Create a NUI window from the given resref(.jui) for the given player.
// * The resref needs to be available on the client, not the server.
// * The token is a integer for ease of handling only. You are not supposed to do anything with it, except store/pass it.
// * The window ID needs to be alphanumeric and short. Only one window (per client) with the same ID can exist at a time.
// Re-creating a window with the same id of one already open will immediately close the old one.
// * See nw_inc_nui.nss for full documentation.
// Returns the window token on success (>0), or 0 on error.
int NuiCreateFromResRef(object oPlayer, string sResRef, string sWindowId = "");
// Create a NUI window inline for the given player.
// * The token is a integer for ease of handling only. You are not supposed to do anything with it, except store/pass it.
// * The window ID needs to be alphanumeric and short. Only one window (per client) with the same ID can exist at a time.
// Re-creating a window with the same id of one already open will immediately close the old one.
// * See nw_inc_nui.nss for full documentation.
// Returns the window token on success (>0), or 0 on error.
int NuiCreate(object oPlayer, json jNui, string sWindowId = "");
// You can look up windows by ID, if you gave them one.
// * Windows with a ID present are singletons - attempting to open a second one with the same ID
// will fail, even if the json definition is different.
// Returns the token if found, or 0.
int NuiFindWindow(object oPlayer, string sId);
// Destroys the given window, by token, immediately closing it on the client.
// Does nothing if nUiToken does not exist on the client.
// Does not send a close event - this immediately destroys all serverside state.
// The client will close the window asynchronously.
void NuiDestroy(object oPlayer, int nUiToken);
// Returns the originating player of the current event.
object NuiGetEventPlayer();
// Gets the window token of the current event (or 0 if not in a event).
int NuiGetEventWindow();
// Returns the event type of the current event.
// * See nw_inc_nui.nss for full documentation of all events.
string NuiGetEventType();
// Returns the ID of the widget that triggered the event.
string NuiGetEventElement();
// Get the array index of the current event.
// This can be used to get the index into an array, for example when rendering lists of buttons.
// Returns -1 if the event is not originating from within an array.
int NuiGetEventArrayIndex();
// Returns the window ID of the window described by nUiToken.
// Returns "" on error, or if the window has no ID.
string NuiGetWindowId(object oPlayer, int nUiToken);
// Gets the json value for the given player, token and bind.
// * json values can hold all kinds of values; but NUI widgets require specific bind types.
// It is up to you to either handle this in NWScript, or just set compatible bind types.
// No auto-conversion happens.
// Returns a json null value if the bind does not exist.
json NuiGetBind(object oPlayer, int nUiToken, string sBindName);
// Sets a json value for the given player, token and bind.
// The value is synced down to the client and can be used in UI binding.
// When the UI changes the value, it is returned to the server and can be retrieved via NuiGetBind().
// * json values can hold all kinds of values; but NUI widgets require specific bind types.
// It is up to you to either handle this in NWScript, or just set compatible bind types.
// No auto-conversion happens.
// * If the bind is on the watch list, this will immediately invoke the event handler with the "watch"
// even type; even before this function returns. Do not update watched binds from within the watch handler
// unless you enjoy stack overflows.
// Does nothing if the given player+token is invalid.
void NuiSetBind(object oPlayer, int nUiToken, string sBindName, json jValue);
// Swaps out the given element (by id) with the given nui layout (partial).
// * This currently only works with the "group" element type, and the special "_window_" root group.
void NuiSetGroupLayout(object oPlayer, int nUiToken, string sElement, json jNui);
// Mark the given bind name as watched.
// A watched bind will invoke the NUI script event every time it's value changes.
// Be careful with binding nui data inside a watch event handler: It's easy to accidentally recurse yourself into a stack overflow.
int NuiSetBindWatch(object oPlayer, int nUiToken, string sBind, int bWatch);
// Returns the nNth window token of the player, or 0.
// nNth starts at 0.
// Iterator is not write-safe: Calling DestroyWindow() will invalidate move following offsets by one.
int NuiGetNthWindow(object oPlayer, int nNth = 0);
// Return the nNth bind name of the given window, or "".
// If bWatched is TRUE, iterates only watched binds.
// If FALSE, iterates all known binds on the window (either set locally or in UI).
string NuiGetNthBind(object oPlayer, int nToken, int bWatched, int nNth = 0);
// Returns the event payload, specific to the event.
// Returns JsonNull if event has no payload.
json NuiGetEventPayload();
// Get the userdata of the given window token.
// Returns JsonNull if the window does not exist on the given player, or has no userdata set.
json NuiGetUserData(object oPlayer, int nToken);
// Sets an arbitrary json value as userdata on the given window token.
// This userdata is not read or handled by the game engine and not sent to clients.
// This mechanism only exists as a convenience for the programmer to store data bound to a windows' lifecycle.
// Will do nothing if the window does not exist.
void NuiSetUserData(object oPlayer, int nToken, json jUserData);
[ 2021-09-16 15:50:25 CET ] [ Original post ]
Hello, dear friends! Today, we have a development build for you. We appreciate your assistance in testing it, and reporting any issues you find. The module compatibility has once again been bumped - to version 1.85 - due to the new script commands that allow tile/area actions in the radial menu, and a bit more GUI modification.
Fixes
- Renderer: Disabled soft particles on world-aligned emitters; fixes faded/missing effects such as spell mantle.
- Renderer: TSB are now generated correctly for animated/danglies.
- Renderer: Removed creature preloading code; it was doing nothing useful on desktop platforms.
- Renderer: Drawbucket implementation for caching transform lists; also fixes additive blending render issues (such as water making visual effects wavy; water showing geometry from own model).
- Renderer: Fixed highlight gobs ("tab glow") not correctly scaling along visual transforms.
- Renderer: Fixed static placeables incorrectly disabling/breaking animations of non-static placeables with the same model.
- Game: Fixed a memleak in pathfinding.
- Game: Fixed placeables not bumping creatures out of the way when being spawned into an area. #349
- Game/VM: Fixed Get*DurationRemaining returning the wrong value due to time overflow.
- Game: Fixed a rare crash when exiting the game while a NWSync download is in progress.
- Startgame UI: Fixed URL escaping for URLs with long paths.
- Startgame UI: Removed superfluous text warnings about "Clicking link opens browser".
- Startgame UI: Improvements to the promotion panels for custom repositories.
- Startgame UI: Images loaded in the new content browser are now correctly served from cache if no internet connection is available.
- UI: Put most hardcoded strings in StartGame, NWSync and Config panels into the tlk (not translated yet).
- Config: On Windows, codepage is now auto-detected from the system locale.
Tile/Radial actions, surfacemat.2da
- You can now assign custom radial actions on tiles (There is a new module event you can access via SetEventScript).
- surfacemat now support 64 materials, up from 32.
- surfacemat.2da is re/loaded as part of custom content.
// Gets the ID (1..8) of the last tile action performed in OnPlayerTileAction
int GetLastTileActionId();
// Gets the target position in the module OnPlayerTileAction event.
vector GetLastTileActionPosition();
// Gets the player object that triggered the OnPlayerTileAction event.
object GetLastPlayerToDoTileAction();
New Script Commands
You can now pop up or restrict GUI panels. We added a event that triggers clientside interaction with some panels (There is a new module event you can access via SetEventScript).
int GUI_PANEL_PLAYER_DEATH = 0;
int GUI_PANEL_MINIMAP = 2;
int GUI_PANEL_COMPASS = 3;
int GUI_PANEL_INVENTORY = 4;
int GUI_PANEL_PLAYERLIST = 5;
int GUI_PANEL_JOURNAL = 6;
int GUI_PANEL_SPELLBOOK = 7;
int GUI_PANEL_CHARACTERSHEET = 8;
int GUIEVENT_CHATBAR_FOCUS = 1;
int GUIEVENT_CHATBAR_UNFOCUS = 2;
int GUIEVENT_CHARACTERSHEET_SKILL_CLICK = 3;
int GUIEVENT_CHARACTERSHEET_FEAT_CLICK = 4;
int GUIEVENT_EFFECTICON_CLICK = 5;
int GUIEVENT_DEATHPANEL_WAITFORHELP_CLICK = 6;
int GUIEVENT_MINIMAP_MAPPIN_CLICK = 7;
int GUIEVENT_MINIMAP_OPEN = 8;
int GUIEVENT_MINIMAP_CLOSE = 9;
int GUIEVENT_JOURNAL_OPEN = 10;
int GUIEVENT_JOURNAL_CLOSE = 11;
int GUIEVENT_PLAYERLIST_PLAYER_CLICK = 12;
int GUIEVENT_PARTYBAR_PORTRAIT_CLICK = 13;
int GUIEVENT_DISABLED_PANEL_ATTEMPT_OPEN = 14;
// Gets the player that last triggered the module OnPlayerGuiEvent event.
object GetLastGuiEventPlayer();
// Gets the last triggered GUIEVENT_* in the module OnPlayerGuiEvent event.
int GetLastGuiEventType();
// Gets an optional integer of specific gui events in the module OnPlayerGuiEvent event.
// * GUIEVENT_CHATBAR_*: The selected chat channel. Does not indicate the actual used channel.
// 0 = Shout, 1 = Whisper, 2 = Talk, 3 = Party, 4 = DM
// * GUIEVENT_CHARACTERSHEET_SKILL_SELECT: The skill ID.
// * GUIEVENT_CHARACTERSHEET_FEAT_SELECT: The feat ID.
// * GUIEVENT_EFFECTICON_CLICK: The effect icon ID (EFFECT_ICON_*)
// * GUIEVENT_DISABLED_PANEL_ATTEMPT_OPEN: The GUI_PANEL_* the player attempted to open.
int GetLastGuiEventInteger();
// Gets an optional object of specific gui events in the module OnPlayerGuiEvent event.
// * GUIEVENT_MINIMAP_MAPPIN_CLICK: The waypoint the map note is attached to.
// * GUIEVENT_CHARACTERSHEET_*_SELECT: The owner of the character sheet.
// * GUIEVENT_PLAYERLIST_PLAYER_CLICK: The player clicked on.
// * GUIEVENT_PARTYBAR_PORTRAIT_CLICK: The creature clicked on.
// * GUIEVENT_DISABLED_PANEL_ATTEMPT_OPEN: For GUI_PANEL_CHARACTERSHEET, the owner of the character sheet.
object GetLastGuiEventObject();
// Disable a gui panel for the client that controls oPlayer.
// Notes: Will close the gui panel if currently open.
// Does not persist through relogging or in savegames.
// Will fire a GUIEVENT_DISABLED_PANEL_ATTEMPT_OPEN OnPlayerGuiEvent for some gui panels if a player attempts to open them.
// You can still force show a panel with PopUpGUIPanel().
// * nGuiPanel: A GUI_PANEL_* constant, except GUI_PANEL_PLAYER_DEATH.
void SetGuiPanelDisabled(object oPlayer, int nGuiPanel, int bDisabled);
Tyrants of the Moonsea
- one dialog branch in Hlesson's conversation breaks his quest
- fixed a rare situation in the Marel fight where the exit door wouldn't open
- removed Sharalyn's Cloud of Bewilderment spell because it caused in-party hostility
- the Kur-Tharsu areas are now "No PVP" to reduce in-party hostility
Darkness over Daggerford
- a cutscene in smuggler's cave sometimes did not trigger
- a cutscene in smuggler's cave sometimes was aborted early
Known Issues
- The toolset tilefade setting "Always" doesn't work correctly.
[ 2021-07-23 18:42:58 CET ] [ Original post ]
Hello, dear community! We just released a small update for Neverwinter Nights: Enhanced Edition. Thank you all for your continued support read on for details! Today's patch (aka Revision 28) includes:
- Toolset: Fixed a crash when rendering some custom content.
- Nuklear/Nui: Fixed line breaks with non-ASCII characters: Module descriptions for polish and russian should now wrap properly.
- LoadAliases: Fixed DOCINSTALL not working on some systems (Options -> Open Source Licences tab was empty).
- Movies: Fixed EndMovie() not working for nwsync-sourced content, such as Eye of the Beholder (because the manifest had already been unloaded).
[ 2021-07-08 19:25:42 CET ] [ Original post ]
Hello friends, we're now shipping dev build 29! Please note: Modules saved with the toolset of this patch are flagged as Compat 1.84, due to some new script commands. As always, we appreciate your continued support!
Game, Logic and Rules
- Shields: Now take their AC from the BaseAC column, no longer hardcoded. Still only works for the three base shield types!
- Game: Reverted the MoveToObject fRange change; fRange is now once again ignored for that specific breakage. This fixes various issues in custom content modules, notably the elusive wizard in Aielund III Pt 3.
- Game/baseitems: New column IsMonkWeapon replaces all hardcoded checks against BASETYPE_KAMA.
- Game/baseitems: Custom content can now make Flurry Of Blows also work with ranged weapons (when IsMonkWeapon is enabled).
- Game/baseitems: New column WeaponFinesseMinimumCreatureSize. Takes 0/**** or the minimum creature size type needed to finesse.
- Game: Other stealthed/concealed creatures no longer pop up briefly when transitioning into a new area or into a doored-off room.
- Game: Fixed creatures doing a weird shimmy/turny when coming to a stop.
- Game data: Added Neverwinter Chess module from old Bioware demo modules.
Config
- Game/Config: You can now hide player quickchat lines from the chat window (Config->UI->Feedback)
- Config: Exposing codepage setting under Game->Advanced; this should make it easier for Russian language players to set the correct codepage without having to edit settings.tml.
- Config: New option to enable SQLite API tracing to the server log: Show all queries, or just show queries running longer than N msec.
Tech
- Core: Upgraded static openssl to 1.1.1k.
- Core: Upgraded libyuv to latest master upstream.
- Core: Upgraded SQLite to version 3.36.0.
- Renderer: VDO optimisations in preparation for OpenGL 3.3.
- Renderer: The fallback envmap is now a globally shared object, not tied to the scene.
- Renderer: Fixed most visual oddities related to water refraction (fringing, edge gaps, highlight strangeness).
- Renderer: Fixed a regression that prevented custom shader params being set in scripting.
- Renderer: Improved TSB generation, doing away with some visual glitches when adjacent faces had opposing hardness.
- Renderer: Fixed a crash when setting hilite color of party members clients havent seen yet.
- Renderer: Fixed a crash when setting a texture override for a creature object that the client hasnt seen yet.
- Nk/Nui: Image renderer can now render webm.
- Nk/Nui: Fix key repeat not working.
- Nk/Nui/json: NWSync Repository CExoLocStr fields now convert to the local game encoding; should fix various special characters. This means you now need to have the json once again properly encoded as UTF-8. (e.g. module descriptions in Polish)
- Nk/Nui: Copy/Paste now works with Cmd on Mac, instead of Ctrl.
- Game Launcher: Repositories can now advertise websites (such as the Vault on the Curated repo).
- Game Launcher: Modules can now have a list of web links.
- Game Launcher: Repository Info now shows the origin URL.
- NWSync Management UI: Text clarity improvements to the disk space effect of deleting manifests.
- NWSync UI: Sped up manifest loading. Game Launcher and Storage UI should now appear much faster.
- NWSync UI: Fixed the NWSync housekeeping UI no longer popping up when deleting multiple manifests in a row.
- NWSync UI: NWSync Storage UI now remembers selected checkboxes and sorting.
- NWSync: Game no longer crashes when running out of disk space while downloading manifest, shows error instead.
- NWSync/SQLite: We now use soft limits on shard size, not hard limits. This fixes a very rare out of disk error when trying to write metadata even though plenty of free space is available.
- VM: Fixed a crash in reconciling automap data when trying to load a player TURD. #309
- VM: Fixed CopyObject not triggering OnAreaEnter (fixes HotU Beholder caves anti-magic restore)
- VM: Fixed SetCampaignString(, ) resulting in a SQL error. Now it deletes the variable from the database instead. It now also deletes entries when other types are empty.
- VM: GetCurrentlyRunningEvent now has param bInheritParent for cases such as CreatureOnDeath/Damaged returning the wrong event ID otherwise.
- VM: Fixed Area Of Effect sometimes not returning the expected objects due to local object positions in memory not updating correctly. #52
- VM: SQLite: soundex() now available to scripting. https://sqlite.org/lang_corefunc.html#soundex
- VM: SQLite: Math functions now available to scripting. https://sqlite.org/lang_mathfunc.html
- VM: Cassowary: Fixed a crash when calling AddConstraint with invalid math formula. #293
- VM: We had to change how Create/Copy/DestroyArea works. Most prominently:
- Areas you create via Create/Copy now have their own auto-generated resref in the nw_ namespace; they no longer have the same resref as the originating area/template. You cannot influence this. nw_ is also the same namespace that the toolset reserves for game-builtin content, so you shouldnt be able to clobber into it. Instanced areas go into CURRENTGAME:, until they are saved into a .sav. (This also means you can CreateArea with the new template, if you really wanted, though why would you? Youd get the area as it looked like at original instantiation time)
- Areas are now saved to savegames correctly and savegames no longer corrupt when the area count changes.
- Savegames now also store a serialised image of the .are data.
- This means that CreateArea(originalresref) in savegames will now instance the area as saved in the savegame, NOT as designed in the toolset. This is because modules dont actually load anymore after a savegame; the savegame replaces the original module.
- CopyArea now supports assigning a new tag and name directly on instantiation.
- This is a high-risk change, as it touches significant parts of the area load codepath. Wed appreciate thorough testing.
- Movies: We no longer show the Bioware credits for all modules; only the last module in each main campaign.
- Movies: Fixed error/crash when calling EndGame(). Now the game shows no movie instead, and just quits the main menu.
New Script Commands
// Create a RunScript effect.
// Notes: When applied as instant effect, only sOnAppliedScript will fire.
// In the scripts, OBJECT_SELF will be the object the effect is applied to.
// * sOnAppliedScript: An optional script to execute when the effect is applied.
// * sOnRemovedScript: An optional script to execute when the effect is removed.
// * sOnIntervalScript: An optional script to execute every fInterval seconds.
// * fInterval: The interval in seconds, must be >0.0f if an interval script is set.
// Very low values may have an adverse effect on performance.
// * sData: An optional string of data saved in the effect, retrievable with GetEffectString() at index 0.
effect EffectRunScript(string sOnAppliedScript = "", string sOnRemovedScript = "", string sOnIntervalScript = "", float fInterval = 0.0f, string sData = "");
// Get the effect that last triggered an EffectRunScript() script.
// Note: This can be used to get creator or tag, among others, of the EffectRunScript() in one of its scripts.
// * Returns an effect of type EFFECT_TYPE_INVALIDEFFECT when called outside of an EffectRunScript() script.
effect GetLastRunScriptEffect();
// Get the script type (RUNSCRIPT_EFFECT_SCRIPT_TYPE_*) of the last triggered EffectRunScript() script.
// * Returns 0 when called outside of an EffectRunScript() script.
int GetLastRunScriptEffectScriptType();
// Hides the effect icon of eEffect and of all effects currently linked to it.
effect HideEffectIcon(effect eEffect);
// Create an Icon effect.
// * nIconID: The effect icon (EFFECT_ICON_*) to display.
// Using the icon for Poison/Disease will also color the health bar green/brown, useful to simulate custom poisons/diseases.
// Returns an effect of type EFFECT_TYPE_INVALIDEFFECT when nIconID is < 1 or > 255.
effect EffectIcon(int nIconID);
[ 2021-07-08 18:35:59 CET ] [ Original post ]
Hello, everyone! This developent build .28 contains stabilisation fixes. If you were having issues with the toolset on the latest stable release, please try this one.
- Toolset: Fixed the crashing regressed with the previous patch.
- Nuklear/Nui: Fixed line breaks with non-ASCII characters. Module descriptions for Polish and Russian should now wrap properly.
- LoadAliases: Fixed DOCINSTALL not working on some systems (Options -> Open Source Licences tab was empty).
- Movies: Fixed EndMovie() not working for nwsync-sourced content (because the manifest had already been unloaded).
[ 2021-06-29 21:44:37 CET ] [ Original post ]
Hello there! This build is a hotfix to address an issue with single-player save games for curated content. No other changes have been made. As always, please enjoy the game, and have a nice weekend.
[ 2021-06-25 16:24:50 CET ] [ Original post ]
Greetings, dear players and creators! Patch 8193.26 for Neverwinter Nights: Enhanced Edition arrives today! The update includes dozens of features and fixes plus adds two epic adventures to our trove of curated community content! Check out full patch notes below!
Patch Highlights
- New curated community content available! | Our new game launcher continues to grow! Two remarkable modules, Against the Cult of the Reptile God by Rich Barker, and Eye of the Beholder 1 & 2 by Rick Francis are now available to download with a single click!
- Curated community content now playable in Multiplayer | The new curated content UI is now available when running multiplayer games
- Polished fonts | Based on player feedback, weve spent some time improving font rendering!
- Renderer | Many more performance and stability/compatibility improvements
New Curated Content Releases
Were proud to announce two new curated content adventures, released in full cooperation with their authors. With the latest update, you can also play them in multiplayer and Eye of the Beholder by Rick Francis was designed to do just that. So gather your friends, and play the thrilling remake of the classic 1991 release from Strategic Simulations, Inc. Or perhaps you're in the mood to dive into early tabletop AD&D nostalgia? Against the Cult of the Reptile God, by Rich Barker adapts the novice-series module into a smart, single-player dungeon crawl!
N1: Against The Cult of the Reptile God
By Rich Barker
Terror by night! The village of Orlane is dying. Once a small and thriving community, Orlane has become a maze of locked doors and frightened faces. Strangers are shunned, trade has withered. Rumours flourish, growing wilder with each retelling. Terrified peasants flee their homes, abandoning their farms with no explanation. Others simply disappear... The adventure is set in Greyhawk and is based on the original TSR AD&D module N1 : Against the Cult of the Reptile God by Douglas Niles, which was ranked the 19th best AD&D module of all time by Dungeon Magazine. While this conversion has added considerably to the original source material, all of the core elements of the adventure remain. It is a mixture of wilderness, underground, and urban adventure, with a number of unique monsters and items, and some class-specific treasure hoards and rewards. It is suitable for any class, although is harder for rogues. Druids and rangers are particularly well catered for, and can talk to many of the animals. The adventure has a duration of approximately 15 hours, and is designed for starting 1st level characters, who can be expected to progress to around 8th level by the end of the adventure. There are no alignment restrictions, but the storyline is predominantly suitable for good or neutral characters.
Eye of the Beholder
By Rick Francis
A two-part remake of the classic game by Westwood/SSI. The Eye of the Beholder series is designed to be fully multiplayer-compatible!
Eye of the Beholder
A drow spy was captured two nights ago by Oltec, Captain of the Guard. Under interrogation, the drow revealed a disturbing plan. He claimed to be working for a being named "Xanathar". The spy claimed that "Xanathar" is an evil crime lord that inhabits the deepest part of the sewer system. Supposedly, Xanathar magically teleported this drow into the city to spy on the Lords of Waterdeep, but was unable to use his magic to teleport him back underground safely. Speak with Khelben Blackstaff to find out more information that could help you before setting out on your journey.
Legend of Darkmoon
You are summoned by the wizard Khelben Blackstaff, and sent to investigate the dreaded Temple Darkmoon. The heroes of Waterdeep are sent to investigate strange disappearances from villages north of the city in the outline areas of the dark forest. Reports have been made of discoveries of human remains in shallow graves. The clues seem to lead to the Temple Darkmoon, which appears to be a peaceful sanctuary, run by divinely-inspired priests. You must explore the temple, deal with its inhabitants, avoid traps, and battle monsters to discover the temple's evil secrets. Alas, as often happens, appearances are deceiving, and the Temple's dark secret is up to the player to unfold.
Curated Content in Multiplayer
The multiplayer UI now uses the same slick design already offered in single-player. You can now host games with modules downloaded from the curated content list (or any other third party repository used). The repository will be automatically shared with other players, so they will be offered the download transparently (its just like joining a NWSync-enabled persistent world)! Note: Multiplayer is not supported by all modules. Some were designed for singleplayer, and may break in unexpected ways when played with multiple people. Play them at your own risk! In addition, the Start Game UI (for both single and multiplayer) saw the following changes:
- Steam Workshop modules now show up on the Community tab. Each workshop item shows up with all modules grouped as a campaign
- Improved UX when deselecting campaigns or modules
- Campaigns in the list now grey out properly if none of their modules are installed
- Campaigns can now display screenshots
- Modules can now show as published-but-unreleased by setting a future date in the version entry
Renderer
Tons of performance and stability/compatibility improvements went into this patch:
- Fixed the pink screen issue for unsupported GPUs
- Drastically reduced the need for buffer switching by combining vertex arrays (perf+)
- Combined most post-processing shaders into single pass (perf+)
- Custom shader parameters are now properly relinked when another shader is loaded (consistency)
- Early-Z optimisation reenabled via ifdef guard in shaders (perf+) - Note: if using custom shaders for setting alpha on a texture, you must now supply a txi too with an alphamean entry with a value below 1.0
- TSB are now calculated for legacy compiled models at runtime as well (consistency/compat)
- Fixed GL CubeMap load order (compat)
- Fixed env maps for PC models not updating between areas. Now allows default map in txi files
- Now uses the default chrome environment map if the assigned map is missing. Fixes issue with metallic objects becoming transparent (consistency)
- Fixed gamma functions erroneously checking all colour channels, instead of any (consistency)
- Fixed disabling tile light source with TILE_SOURCE_LIGHT_COLOR_BLACK not actually removing the light
- Completely disabled texture downsampling for non-compressed textures
- Fixed crash when releasing PLT
- Added some crash safeguards for broken models
- Adaptive soft particle based on size, should fix missing/faded monk eyes
- Simple shadow perf optimisation
- Fixed setting ambient material for grass
- Fixed a crash when downsizing internal data structures
Fonts
We spent some time improving font rendering after the feedback from the last patch:
- TrueType Fonts renamed to their function, away from font names
- Combined glyph maps so all languages now share the same font files. Brawler is now the default font for high res typeface, since it was the most popular
- Mordred numerals no longer offset old-style
- Added slight adjustments to spacing and padding to make it look better
- You can now tweak font outlines and contrast per-font (via txi)
- Fixed the wrong font appearing in places like the DM chooser
- Increased contrast for the high-res variant
Pathfinding
- Static object removal now properly removes objects from the internal object list. This addresses the cases where a lot of static objects (such as body bags) added and removed over hours, would bog down gameplay
- Fixed creatures not correctly moving towards an interactable object in certain marginal situations. Added better handling of requested distance when moving towards an object
- Abort attempts at pathfinding early if the target destination isnt achievable (perf+)
Gameplay
- Default weapon feats for gloves and bracers now properly set if 2da entry is missing
- Recommended button in chargen/levelup can now be disabled via ruleset.2da entry
- Fixed hit dice validation for RDD
- Fixed creature gobs sometimes erroneously generating really large wind values
Premium Modules
We cleaned up the dataset for the Tyrants of the Moonsea premium module. All content that is already part of the base game has been removed from the DLC download. In addition, the following fixes went in:
Tyrants of the Moonsea
- Camera position no longer resets to top-down when exiting the world map
- Some tile appearances are now correct when "facelift" mode isactive
- The Kur-Tharsu main gate is no longer difficult to attack
- A spider on the Shind Road East spawns in the correct spot
- Removed a minor XP exploit in Thalia's conversation
Darkness over Daggerford
- Camera position no longer resets to top-down when exiting the world map
Other Fixes
- UI/Nuklear: Fixed a crash that would occur when swapping child layouts (clicking around a lot)
- Game: OnPlayerTarget now actually persisted to save games
- Toolset: Fixed not rendering bounding boxes
- Fonts: codepage=cp1251: Added support for a missing cyrillic character
- Nui: codepage=cp1251: Fixed an issue with baking missing glyphs that would break rendered text
- Fixed a regression from the previous development patch where some PLT textures were rendering incorrectly
[ 2021-06-24 17:12:48 CET ] [ Original post ]
Hello, dear community. Today's development patch is a small one: Most importantly, it fixes one crash we found in testing. It also addresses some compatibility issues with the unofficial Cyrillic language support, that hopefully helps our Russian friends maintain their community translation. We know that some strings in the new UI scenes are still not translatable. This will be addressed in a future patch!
Fixes
- Renderer: Fixed a crash in static object walkmesh calculation.
- Start Game UI: Fixed the New/Existing Character UI not doing anything useful.
- Fonts: codepage=cp1251: Added support for a missing Cyrillic character.
- Nui: codepage=cp1251: Fixed line break calculation for Cyrillic text.
[ 2021-06-22 15:46:22 CET ] [ Original post ]
Hello, friends! Today we are releasing patch .24 to the development branch of Neverwinter Nights: Enhanced Edition! This patch addresses some of the concerns raised with the latest stable release, while also bringing consistency, compatibility and performance improvements. As always, we appreciate your feedback and help in bringing these changes to the next stable release!
Start Multiplayer Game UI
The Start Game UI for multiplayer is now also using the new design that singleplayer already offers. You can now host a game from the curated content repository, or any other third party repository used. The repository will be automatically shared with other players, so that they will be offered the download transparently, same as if joining a NWSync-enabled persistent world. In addition, the Start Game UI (both SP and MP) saw the following changes:
- NewGame UI: Steam Workshop modules now show up on the Community tab. Each workshop item shows up with all modules grouped as a campaign
- NewGame UI: Allow selecting panels even if they are already selected (allows going back to the info text)
- NewGame UI: Campaigns in the list now grey out properly if no contained modules are installed
- NewGame UI: Campaigns can now show screenshots as well
- NewGame UI: Modules can now show as published-but-unreleased by setting a future date in the version entry
Fonts
We spent some time working on font rendering after the feedback received after the latest stable release:
- Fonts: TrueType Fonts renamed to their function, away from font names
- Fonts: Combined glyph maps so all languages now share the same font files. Brawler is now the default font for high res typeface, since it was the most popular
- Fonts: Mordred numerals no longer offset old-style
- Fonts: Slight adjustments to spacing and padding to make it look better
- Fonts: You can now tweak font outlines and contrast per-font (via txi)
- Fonts: Fixed the wrong font appearing in places like the DM chooser
- Fonts: Increased contrast for the high-res variant
Renderer
A lot of performance and stability/compatibility improvements went into this patch:
- Renderer: Fixed pink screen on unsupported older GPUs
- Renderer: Drastically reduced the need for buffer switching by combining vertex arrays (perf+)
- Renderer: PLT are now constructed on the GPU (perf+)
- Renderer: Combined all post-processing shaders into single unit (perf+)
- Renderer: Custom shader parameters are now properly relinked when another shader is loaded (consistency)
- Renderer: Shadows are now rendered entirely via VBO (perf+)
- Renderer: Early-Z optimisation reenabled via ifdef guard in shaders (perf+)
- Renderer: TSB are now calculated for legacy compiled models at runtime as well (consistency/compat)
- Renderer: Fixed GL CubeMap load order (compat)
- Renderer: Fixed env maps for PC models not updating between areas. Now allows default map in txi files, handling missing maps better (consistency)
- Renderer: Fixed gamma functions erroneously checking all colour channels, instead of any (consistency)
- Renderer: Fixed disabling tile light source with TILE_SOURCE_LIGHT_COLOR_BLACK not actually removing the light
- Renderer: Completely disabled texture downsampling for non-compressed textures
- Renderer: Fixed crash when releasing PLT
- Renderer: Added some crash safeguards for broken models
- Renderer: Adaptive soft particle based on size, should fix missing/faded monk eyes
- Renderer: Explicitly set PLT alpha mean values to fix issues with custom content such as robes not showing properly
- Renderer: Simple shadow perf optimisation
- Renderer: Fix setting ambient material for grass
- Renderer: Fix skinmesh bodyparts not rendering
- Renderer: Fix the renderaabb command not working
- Fixed a crash when downsizing internal data structures
Pathfinding
- Pathfinding: Static object removal now properly removes objects from the internal object list. This fixes cases where a lot of static objects (such as body bags) added and removed over hours, would bog down gameplay
- Pathfinding: Fix creatures not correctly moving towards a interactible object in certain marginal situations. Better handling of requested distance when moving towards an object
- Pathfinding: Abort attempts at pathing early if the target destination isnt achievable anyways (perf+)
Game
- Game: Default weapon feats for gloves and bracers now properly set if 2da entry is missing #317
- Game: Recommended button in chargen/levelup can now be disabled via ruleset.2da entry
- Game: Fixed hit dice validation for RDD
- Game: Fixed creature gobs sometimes erroneously generating really large wind values #320
Premium Modules
We cleaned up the data set for the Tyrants of the Moonsea premium module. All content that is also part of the basegame has been removed from the DLC download. In addition, the following fixes went in:
Tyrants of the Moonsea
- Camera position no longer resets to top-down when exiting the world map
- Some tile appearances were incorrect when "facelift" mode was active
- The Kur-Tharsu main gate was difficult to attack
- A spider on the Shind Road East spawned in the wrong spot
- Removed a minor XP exploit in Thalia's conversation
Darkness over Daggerford
- Camera position no longer resets to top-down when exiting the world map
Other Fixes
- UI/Nuklear: Fixed a crash that would occur when swapping child layouts (clicking around a lot)
- Game: OnPlayerTarget now actually persisted to savegames
- Toolset: Fixed not rendering bounding boxes
[ 2021-06-17 17:41:40 CET ] [ Original post ]
Greetings friends! Were launching a new patch for Neverwinter Nights: Enhanced Edition with some of the biggest feature sets yet! Todays update brings a new game launcher with featured community content, performance improvements, plus hundreds of fixes. Check out full details on Patch 8193.23 below...
Patch Highlights
New Game Launcher | A new game launcher highlights some amazing community content thats free for everyone! New Portraits | Added three new character portraits (sourced from the community portrait contest) TrueType Font | Added full TrueType font (TTF) support throughout the game, for clearer and more adaptive text (as well as fractional/decimal point UI scaling) Pathfinding Improvements | Smoother movement and navigation Performance Improvements | Enjoy smoother gameplay with significant performance improvements Bug Fixes | Hundreds of bug fixes and polish features added New Scripts | Added dozens of new script commands for use in custom servers, including improved scaling and transformation (lerping) Water Graphics | Added realistic water reflections and refractions
New Game Launcher with Community Highlights
This patch ships with a new (singleplayer) game launcher. It showcases all campaigns and premium modules with header images, descriptions, screenshots, and more. Weve also added a repository of community content, hosted by Beamdog. This gives all players easier access to some amazing (and free) community adventures. For example, we are honoured to offer both the full Aielund Saga by Savant, and the Auren Saga (Almraiven / Shadewood) by Fester Pot. Now all you need to do to play them is click Download (...and wait a bit).
Aielund Saga
By Savant
Embark on a journey through the Kingdom of Aielund, a realm weakened by war and beset by enemies from without and within. Defend the people of Aielund against monsters from mythology, and ones that clothe themselves in a more human form. Uncover evidence of foul play, delve into the deepest caves, travel the breadth of the land and even the planes of reality. Secure the kingdom from foes more powerful than you can imagine, while you rise from simple mercenaries into the mightiest of heroic legends.
Auren Saga
By PJH
The Auren Society of Weavers draw their power from a Weave that spans into the Land of the Dead. It allows such members to grasp a better understanding of the spirits that roam that realm and use it to their advantage. It is this very Weave one will use to scour murderous scenes and unravel the mysterious deaths that surround the region of Calimshan.
TrueType Fonts and UI scaling
The game now supports TrueType fonts (and fractional/decimal point UI scaling). This means when you adjust the User Interface the text scales much more clearly for readability. Note: Currently, fonts cannot be overridden by custom content, but we are looking at options for a future release.
Water Visuals
Weve added brand new water visuals! Water now has realistic reflections and refractions to make your adventures more beautiful.
Art Changes
- Added three contest winner portraits to base game (Aragnosh: human male, Seafaref: half-elf female, Seafarem: half-elf male)
- Fixed torch model flicker
- Fixed forest facelift tileset (ttf02) referring to missing envmap, resulting in transparent metal textures
Pathfinding Improvements
We have been carefully making some changes to pathfinding to improve efficiency and reliability. Here are some of the technical details of the changes:
- Pathfinding on Windows, macOS and Linux no longer uses simplified pathfinding at certain distances.
- Fixed inaccurate calculation of grid step tolerance when using grid pathfinding.
- Fixed potential endless loops with ActionMoveAwayFromLocation.
- Fixed inconsistencies between when to use Z when comparing distances, which would result in certain actions failing when they shouldn't
- Added lacking safety checks which was causing pathfinding to floor performance if trying to interact with a door that was unreachable
- Server settings: Removed experimental enhanced pathfinding toggle (now always on).
- Fixed some minor errors related to collision resulting in imprecisions
- Fixed interacting with objects when Z-offset was implied (e.g. stairs). This should alleviate some troubles where having to manually force the PC near the object before it would interact
- Fixed a case where creatures failed to pathfind to a near point in a straight line
New Scripting
Visual Object Transform Lerping
Script commands can now transform objects smoothly over time. All existing visual transform types (translate, rotate, scale) can be applied this way, and there is a built in selection of algorithms available.
New Script Commands
This release adds a set of new script commands: // Returns the currently executing event (EVENT_SCRIPT_*) or 0 if not determinable. // Note: Will return 0 in DelayCommand/AssignCommand. ExecuteScript(Chunk) will inherit their event ID from their parent event. int GetCurrentlyRunningEvent(); // Get the integer parameter of eEffect at nIndex. // * nIndex bounds: 0 >= nIndex < 8. // * Some experimentation will be needed to find the right index for the value you wish to determine. // Returns: the value or 0 on error/when not set. int GetEffectInteger(effect eEffect, int nIndex); // Get the float parameter of eEffect at nIndex. // * nIndex bounds: 0 >= nIndex < 4. // * Some experimentation will be needed to find the right index for the value you wish to determine. // Returns: the value or 0.0f on error/when not set. float GetEffectFloat(effect eEffect, int nIndex); // Get the string parameter of eEffect at nIndex. // * nIndex bounds: 0 >= nIndex < 6. // * Some experimentation will be needed to find the right index for the value you wish to determine. // Returns: the value or "" on error/when not set. string GetEffectString(effect eEffect, int nIndex); // Get the object parameter of eEffect at nIndex. // * nIndex bounds: 0 >= nIndex < 4. // * Some experimentation will be needed to find the right index for the value you wish to determine. // Returns: the value or OBJECT_INVALID on error/when not set. object GetEffectObject(effect eEffect, int nIndex); // Get the vector parameter of eEffect at nIndex. // * nIndex bounds: 0 >= nIndex < 2. // * Some experimentation will be needed to find the right index for the value you wish to determine. // Returns: the value or {0.0f, 0.0f, 0.0f} on error/when not set. vector GetEffectVector(effect eEffect, int nIndex); // Check if nBaseItemType fits in oTarget's inventory. // Note: Does not check inside any container items possessed by oTarget. // * nBaseItemType: a BASE_ITEM_* constant. // * oTarget: a valid creature, placeable or item. // Returns: TRUE if the baseitem type fits, FALSE if not or on error. int GetBaseItemFitsInInventory(int nBaseItemType, object oTarget); // Get oObject's local cassowary variable reference sVarName // * Return value on error: empty solver // * NB: cassowary types are references, same as objects. // Unlike scalars such as int and string, solver references share the same data. // Modifications made to one reference are reflected on others. cassowary GetLocalCassowary(object oObject, string sVarName); // Set a reference to the given solver on oObject. // * NB: cassowary types are references, same as objects. // Unlike scalars such as int and string, solver references share the same data. // Modifications made to one reference are reflected on others. void SetLocalCassowary(object oObject, string sVarName, cassowary cSolver); // Delete local solver reference. // * NB: cassowary types are references, same as objects. // Unlike scalars such as int and string, solver references share the same data. // Modifications made to one reference are reflected on others. void DeleteLocalCassowary(object oObject, string sVarName); // Clear out this solver, removing all state, constraints and suggestions. // This is provided as a convenience if you wish to reuse a cassowary variable. // It is not necessary to call this for solvers you simply want to let go out of scope. void CassowaryReset(cassowary cSolver); // Add a constraint to the system. // * The constraint needs to be a valid comparison equation, one of: >=, ==, <=. // * This implementation is a linear constraint solver. // * You cannot multiply or divide variables and expressions with each other. // Doing so will result in a error when attempting to add the constraint. // (You can, of course, multiply or divide by constants). // * fStrength must be >= CASSOWARY_STRENGTH_WEAK && <= CASSOWARY_STRENGTH_REQUIRED. // * Any referenced variables can be retrieved with CassowaryGetValue(). // * Returns "" on success, or the parser/constraint system error message. string CassowaryConstrain(cassowary cSolver, string sConstraint, float fStrength = CASSOWARY_STRENGTH_REQUIRED); // Suggest a value to the solver. // * Edit variables are soft constraints and exist as an optimisation for complex systems. // You can do the same with Constrain("v == 5", CASSOWARY_STRENGTH_xxx); but edit variables // allow you to suggest values without having to rebuild the solver. // * fStrength must be >= CASSOWARY_STRENGTH_WEAK && < CASSOWARY_STRENGTH_REQUIRED // Suggested values cannot be required, as suggesting a value must not invalidate the solver. void CassowarySuggestValue(cassowary cSolver, string sVarName, float fValue, float fStrength = CASSOWARY_STRENGTH_STRONG); // Get the value for the given variable, or 0.0 on error. float CassowaryGetValue(cassowary cSolver, string sVarName); // Gets a printable debug state of the given solver, which may help you debug // complex systems. string CassowaryDebug(cassowary cSolver); // Overrides a given strref to always return sValue instead of what is in the TLK file. // Setting sValue to "" will delete the override void SetTlkOverride(int nStrRef, string sValue=""); // Constructs a custom itemproperty given all the parameters explicitly. // This function can be used in place of all the other ItemPropertyXxx constructors // Use GetItemProperty{Type,SubType,CostTableValue,Param1Value} to see the values for a given itemproperty. itemproperty ItemPropertyCustom(int nType, int nSubType=-1, int nCostTableValue=-1, int nParam1Value=-1);
NWScript Debugger
Weve revived the script debugger with several improvements:
- Added back script debugger binary into bin/win32/.
- Added configuration keys to UI.
- Fixed incorrect address parsing resulting in it not connecting. Also fixes setting debugger addresses other than localhost.
- Fixed heap overflow parsing NDB files resulting in crashes.
- Now renders all internal fields of CGameEffect.
- Now renders all internal state of CScriptEvent.
- Now renders cswysolver and sqlquery types instead of crashing in pitiful confusion.
- Will no longer attempt to launch from within nwmain, you now need to run the binary by hand. On the plus side, it should now work on Linux and Mac (via wine/wine32to64).
Other Feature Changes
In addition to the major features listed above, weve added dozens of minor polish features to improve the game:
- GUI/NUI: Implemented floating point UI scaling.
- UI: Allow exceeding safe UI scale if needed for accessibility reasons. There is a toggle under Config->UI->Accessibility->Advanced.
- GUI/NUI: Implemented TTF font rendering.
- Input: Added new manual config key game.language.codepage that can be used to force a different codepage (e.g. cp1251 for cyrillic). Together with a TTF override, this should allow modding in compatibility for russian language overrides.
- NUI: Implemented 9-slice gui skinning.
- NUI: Now using a cassowary constraint solver system to layout widgets
- Floating damage numbers are now colourised based on the damage type taken.
- Add config toggle that allows showing damage numbers as totals or split
- NUI: Redesigned the Options UI.
- NUI: Redesigned the NWSync Storage Management UI. (Now called Storage in the menu, and also accessible via the new game launcher).
- NUI: Fixed up some other UI panels to layout properly even when scaled.
- NUI: Added a panel to show Open Source Licences to config UI.
- NUI: Made sound effects more immersive/in line with base UI usage (different click noises depending on widget).
- GUI: Added a windowed/fullscreen/borderless dropdown to the Config UI and fixed the mode sometimes not initialising correctly.
- Async loading of files and images via http streaming. (Backend system work)
- ResMan: Movies can now be stored and played from override, ERF (hak, mod) and NWSync.
- SQLite: Added a configurable busy timeout, so that just externally running something on a campaign/nwsync database doesnt immediately abort queries running in the game. (3s default)
- SQLite: Added builtin functions for NWCompressedBuf compression, base64 de/encode, and hashing. See SQLITE_Readme.md in data.
- NWSync: Client now downloads wbm movie files if part of the manifest.
- HTTP: Added a disk caching service to avoid repeated requests; added alias CACHE: (USERDIR/cache) by default. Configurable in settings, default max size is 100MB.
- Base: Game windowed size is now 1024x768 by default, because some UI just got too big.
- Base: TLK files now have a local cache, improving repeated lookup performance.
- Base: API cleanup for NWNX support
- Server: Removed some superfluous service updates (very minor perf).
- Renderer: Tweaks to palettes for PLTs to prevent metallic looks. Tweaks to PLTs for armour to prevent alpha dithering. Check out the comparison here
- Renderer: Added unique shader for particles, with soft particle rendering and enabled particle blending with fog. Check out soft particle shader here and fog rendering here
- Renderer: Improved colour overflow for transparent objects. Check out the comparison here
- Renderer: Implemented proper OpenGL buffer orphaning
- Renderer: Unified and simplified the shader setup, allowing the default vs/fslit_nm/sm shaders to be used for all standard PBR setups
- Renderer: Made displacement offset a uniform that can be passed from materials to set a base level. To use it, add parameter float DisplacementOffset in a material. By default, the shaders assume the base (zero) level of the heightmap is 1 (white), so if base level is 0.6, the value needs to be -0.4, etc
- Renderer: Made alpha level adhere to Fresnel effects at high shader quality.
- Renderer/Debug UI: Added a dropdown to select various rendering modes helpful for debugging (Material modes, Lighting channels, ..)
- Renderer: Improvements to FBO, grant all shaders access to color and depth buffer textures
- Renderer: Quickbar icons can now reload via SetTextureOverride.
- Renderer: Fixed broken normal and tangent generation for skinmeshes due to invalidated render hints. Improved shader picking based on tangets/handedness.
- Renderer: Shader compilation errors are now printed to the game log file.
- Renderer: Separated out area wide lighting from area point lights. (Small perf improvement)
- Renderer/OVT: WALKDIST and RUNDIST now scales properly with visual transforms for you, in order to keep footsteps in sync
- Renderer: Added material files for icy tileset so that ice no longer appears metallic
- Renderer: Added material files for male and female old human heads so their hair no longer appears metallic
Fixes
In addition to feature changes, this patch release also contains a sizeable selection of bug fixes:
- Fixed main menu music not playing when intro movies are skipped.
- Renderer: Fixed a bad hashing algo for PLT textures resulting in excessive cache misses.
- Renderer: Fixed incorrectly initialised null textures in some cases, resulting in incorrect textures and unnecessary texture binds.
- Renderer: Removed redundant skinmesh bone remapping. Slight performance improvement, especially for models with many nodes.
- Renderer: Made texture management more efficient, streamline for future changes to PBR.
- Renderer/ResMan: Disabled the async model loader. Addresses the bodyparts missing issue. #145
- Renderer: Maximum number of bones of a single skinmesh is now 64, to match mobile. This should fix the case where the game runs with 1-2fps on some GPUs.
- Renderer: Fixed crashes due to NULL textures.
- Renderer: Fixed crashing due to broken skinmesh models.
- Renderer: Regression: Fixed compiled light models having issues due to memory misalignment/struct packing.
- Renderer: Fixed an issue that would potentially cause scenes using custom shaders to malfunction in the event that a user changes video options in game.
- Renderer: Fix text input caret pulsing when paused. Fix caret colouring following text in some situations
- Renderer: Safeguard against crashes when an animation was missing
- Renderer: Optimised animesh buffer uploading; reduce time spent on GUI rendering.
- Renderer: Make the `decal` property actually disable lighting, rather than just self-illuminating brightly. Fixed some GUI scenes by adding decal to txis.
- Renderer: Fixed issue with darkness and similar negative light effects always being pushed to the end of the light priority list.
- Renderer: Fixed tile lights being added to the BSP before having their radii set (causing minor imprecisions)
- Renderer: Fixed an issue with setting custom shaders when objects were using just one material for all parts while having more than one part
- Renderer: Fixed a minor regression with the high contrast shader
- Renderer: Removed a good chunk of dead/redundant code
- Nuklear: Fixed a memleak that would degrade long play sessions
- VM: Fixed crash when calling DestroyArea() on a invalid object.
- VM: Stopped ExecuteScriptChunk from writing !chunk.ndb to override.
- VM: sqlite commands: Added missing newline in log output.
- VM: Fixed issue in string handling (also: VM: SubString()) that would have resulted in memory leaks or crashes.
- Game: Dont use weapon AB for ranged touch attacks anymore.
- Fixes to passive attack target selection. This should address Cleave etc. sometimes failing to find a followup target. #172
- Game: Effect Miss Chance/Blind Fighting: Fix erroneous re-roll against target concealment, fix effect being ignored against blind fighting. #15
- Game: Fixed error in levelup validation related to SkillpointModifierAbility being starred out #180
- Game: Fixed ResistSpell() when called from AOE spell scripts.
- Game: Fixed classstat modifiers applying incorrectly to polymorph. #185
- Fixed the DM flag being set incorrectly on player characters when copying files around. #216
- Fixed a rare crash in game object update netcode when writing out the party state of a player that just exited
- Fixed a loop wraparound overflow game hang/crash when removing effect icons
- Game: Fixed a crash when the game tried to write a log entry as it was shutting down
- Emitters: fixed them not interpolating if not both size_y start and end were set (correct behaviour is to do if either is non-zero)
- Game: Never allow the window size to shrink below (100, 100). This works around the case where the window was too small to spot or resize back up
- Fixed a crash when clicking the Recommended button on chargen package selection with no packages available
- Fixed a string type conversion error resulting in some empty strings in UI
- http: Made http errors more verbose. Verbosity is Friend
- Fixed nwsync-enabled savegames not loading due to missing TLK error
- Input: Character input is now correctly converted from the language charset. This should address broken polish text input
- NUI: Fixed codepage glyphs cutting text off due to incorrectly-set codepage.
- NUI: Fix window flickering from (0,0) to center pos on first frame after opening.
- NUI: Fix window sometimes scaling down to (0,0).
- NUI: Pressing Escape now closes the currently focused window.
- NUI: Fixed UI not properly hiding when pressing Alt-F4/X to close the game.
- NUI Skinning: Made font white in all widgets, instead of grey.
- NUI Skinning: Skinned text input box.
- NUI Skinning: Title bars now look like native windows.
- NUI Skinning: Close/Minimise buttons match native style.
- NUI Skinning: Fixed combo box style.
- NUI Skinning: Window and group borders are now rendered 9-sliced.
- NUI Skinning: Fixed scrollbars not aligning properly.
- NUI: Fixed windows not properly auto-centering when ui-scaled.
- NUI: Fixed line fitting code to no longer repeat words when word-wrapping; improved performance to only do line flowing once.
- NUI/GUI: Fixed TTF font rendering for Polish. #191 #235
- GUI: Fixed input caret; now back with extra cyan and more blinkage.
- GUI: Fixed password input box not accepting your passwords, no matter how good they were.
- Movie player: Optimised so it doesnt create the movie texture as often.
- Toolset: Fixed floating point drifting for X/YOrientation
- Toolset: Now reads DEVELOPMENT: (but it might not live-reload the same as the game would).
- Toolset: Fixed some backgrounds not filling the full icon pane. #240
- Linux: Fixed exclusive(fullscreen) and borderless window modes.
- ResMan: Fixed crash that could happen when exiting the game, especially seen after failing to load a savegame.
- Renderer: Restore the check for bumpshinytexture, fixing regression where meshes appeared transparent or invisible #298
- Renderer: Fixed static lights not updating properly. #290
- Config UI: Dont show horizontal scrollbar when UI scaled.
- VM: Fixed SetColor() not updating in some cases (such as heads/hair)
- Savegames: When loading a savegame with a missing manifest, attempt to load the newest manifest of the same UUID instead (upgrade path for New Game UI modules). Emit a message to the client log indicating such - no UI support for showing this yet.
Known Issues
Steam Workshop | Modules in the Steam Workshop do not show in the game launcher
[ 2021-05-20 16:25:15 CET ] [ Original post ]
Greetings, dear community! This patch release contains another set of small bug fixes and improvements that will hopefully see us shipping this to the stable branch really soon. Thank you for reporting any issues you find! Your help will catch all the corner cases with multiplayer and custom content we cannot test for.
Fixes
- Renderer: Minor tweaks to water shader parameters to make it look more natural.
- Pathfinding: Fixed a case where creatures failed to path to a near point in a straight line.
- New Game Launcher: Show author line on campaign tabs.
- New Game Launcher: Show advisory about potential savegame/manifest mismatch issues when downloading new versions.
- New Game Launcher: Allow selecting campaign tabs when a module in the same campaign is selected.
- Fix adding custom repositories.
- New Game Launcher: Added a small spacer between campaigns and modules in custom content repos.
- New Game Launcher: Empty bottom bar on the Official content tab is now hidden.
- New Game Launcher: Campaigns are now deselected when selecting a non-campaign module on the same pane that have both.
- Savegames: When loading a savegame with a missing manifest, attempt to load the newest manifest of the same UUID instead (upgrade path for New Game UI modules). Emit a message to the client log indicating such - no UI support for showing this yet.
- NWSync: Client now downloads wbm movie files if part of the manifest.
- Pathfinding: Addressed regression where NPCs fail to open doors. #285
- Pathfinding: Fixed interacting with objects when Z-offset was implied (e.g. stairs). This should alleviate some troubles where having to manually force the PC near the object before it would interact.
- UI: Allow exceeding safe UI scale if needed for accessibility reasons. There is a toggle under Config->UI->Accessibility->Advanced.
- UI: Now clamp lower bound of UI scale to 1.0.
- UI: horizontal window constraint is now 900 instead of 960 before requiring scaling.
- Nui: Fixed more panels erroneously showing a horizontal scrollbar when scaled.
Art
- Art: Shifted collision box for tcn_udoor_01 #313
[ 2021-05-03 16:05:05 CET ] [ Original post ]
Hello, friends! A new patch marks another iteration towards an upcoming stable release. Please help us test this build and report any issues you spot.
New Game UI
- Content is now presented as Official vs Community, instead of Campaigns vs Standalone.
- Search filtering works better, can now filter by campaign names, authors.
- More consistently-styled button sizes and UI elements.
- Kingmaker, ShadowGuard and WitchesWake have been moved out of Premium into extra content on the Official content tab.
- Filled in missing screenshots on the Premium modules.
- Module sort order is now persisted to configuration
- Various text/wording changes.
Water shader
- More uniform appearance between shader quality modes.
- Improve refraction and reflection precision/quality.
- Water renders now after shadows and the SSAO pass.
- Waves more natural-looking.
- Translucence is now relative to source texture alpha.
- Translucence now shadows the surface beneath the water.
NWScript Debugger
- Added back script debugger binary into bin/win32/.
- Added configuration keys to UI.
- Fixed incorrect address parsing resulting in it not connecting. Also fixes setting debugger addresses other than localhost.
- Fixed heap overflow parsing NDB files resulting in crashes.
- Now renders all internal fields of CGameEffect.
- Now renders all internal state of CScriptEvent.
- Now renders cswysolver and sqlquery types instead of crashing in pitiful confusion.
- Will no longer attempt to launch from within nwmain, you now need to run the binary by hand. On the plus side, it should now work on Linux and Mac (via wine/wine32to64).
Other
- Linux: Fixed exclusive(fullscreen) and borderless window modes.
- ResMan: Fixed crash that could happen when exiting the game, especially seen after failing to load a savegame.
- Renderer: Restore the check for bumpshinytexture, fixing regression where meshes appeared transparent or invisible #298
- Renderer: Tweaked horizontal TTF font spacing a bit more to make it match old visual feel.
- Renderer: Fix regression introduced with previous preview where static tile lights didnt update properly.
- Renderer: Fixed static lights not updating properly. #290
- Nui: Fixed some windows not centering properly when UI-scaled.
- Nui: Limited UI scale so that new game/options windows will still fit. #288
- Config UI: Dont show horizontal scrollbar when UI scaled.
- Config: Add toggle that allows showing damage numbers as totals or split.
- nwhak: Fixed it not starting.
- VM: Fixed GetObjectVisualTransform stack underflowing on existing modules (.21 regression)
- VM: SetTlkOverride now parses tokens
- Game: Fixed SetColor() not updating in some cases (such as heads/hair)
- Game: Fix attacking non-creature objects #302
- Game: Fixed DM character creation. #294
- TTF/Fonts: Pixel alignment now respects GUI scale, improving rendering quality
- Fonts: Fix some characters in codepages (, etc) not showing correctly #278 #279
- Fonts: Fixed text in password fields not showing up
- Fonts: Enable flexible font spacing; fixes dialog UI being cut off when many options are present
- Fonts: Make ingame fonts space out less
- Fonts: Fixed caret no longer showing on top of text
- MP UI: Fixed another potential crash running custom modules.
- NWSync hosting mode: Fixed rules not being reloaded properly after the initial manifest was added to the embedded server, resulting in missing creatures in Aielund Saga due to wrong appearance.2da having loaded.
- Pathing: Fixed failing to update move click action when setting new target #286
- Input: Added new manual config key game.language.codepage that can be used to force a different codepage (e.g. cp1251 for cyrillic). Together with a TTF override, this should restore compatibility for russian language overrides.
- Toolset: Fixed some backgrounds not filling the full icon pane. #240
- Art: Fixed forest facelift tileset (ttf02) referring to missing envmap, resulting in transparent metal textures.
[ 2021-04-16 17:41:21 CET ] [ Original post ]
Fair greetings, one and all! This development build is a huge one. As usual, you can use it to play on .20.1 servers (current stable release); and wed like to encourage you to do so and report any issues you find with us! Thank you.
Executive overview
- A new game launcher UI that also includes a curated content repository, free for everyone (see below)
- Full TTF font support throughout the game, for clearer and more adaptive text rendering
- Fractional/floating-point UI scaling
- Better UI skinning
- Game/renderer performance improvements
- Renderer: soft particle support, blending with fog
- Water: Screen-space refractions and reflections
- Pathfinding improvements
- Visual Object Transform Lerping (smooth transitions)
- New advanced script commands
- Three new portraits sourced from the community portrait contest
- Hundreds of fixes and smaller features
Curated Content
This patch ships with a new (singleplayer) game launcher UI. It showcases all campaigns and premiums in a nicer way, with header images and descriptions; access to screenshots, and more. There is a split view for Premium and user modules, as well as filtering and search facilities. We also bring in a curated content repository, hosted by Beamdog, that gives all players access to selected community content. To start with, we are honoured to offer both the full Aielund Saga by Savant, and the Auren Saga (Almraiven/Shadewood) by Fester Pot. All you need to do to play them is click Download and wait a bit. As part of this development patch release cycle, we will be reaching out to others that have authored widely popular modules on the Neverwinter Vault and elsewhere. The UI also allows adding third party content repositories, which can be hosted by anyone without going through the Beamdog curation process. This new UI, and the curated content repository bundled with the game now, is a work in progress. We will be making changes and improvements in the future.
TTF and UI scaling
The game now supports TTF fonts, and decimal UI scaling (e.g. 1.3x, not just 1x, 2x).
Water improvements
Visual Object Transform lerping
Visual effects applied via scripting can now lerp. This means that, for example, a creature size change can appear smoothly over a configured time, and not instant.
All existing visual transforms can be interpolated this way. To accommodate this, the script API has been amended:
float SetObjectVisualTransform(object oObject, int nTransform, float fValue, int nLerpType = OBJECT_VISUAL_TRANSFORM_LERP_NONE, float fLerpDuration = 0.0, int bPauseWithGame = TRUE);
int OBJECT_VISUAL_TRANSFORM_LERP_NONE = 0; // 1
int OBJECT_VISUAL_TRANSFORM_LERP_LINEAR = 1; // x
int OBJECT_VISUAL_TRANSFORM_LERP_SMOOTHSTEP = 2; // x * x * (3 - 2 * x)
int OBJECT_VISUAL_TRANSFORM_LERP_INVERSE_SMOOTHSTEP = 3; // 0.5 - sin(asin(1.0 - 2.0 * x) / 3.0)
int OBJECT_VISUAL_TRANSFORM_LERP_EASE_IN = 4; // (1 - cosf(x * M_PI * 0.5))
int OBJECT_VISUAL_TRANSFORM_LERP_EASE_OUT = 5; // sinf(x * M_PI * 0.5)
int OBJECT_VISUAL_TRANSFORM_LERP_QUADRATIC = 6; // x * x
int OBJECT_VISUAL_TRANSFORM_LERP_SMOOTHERSTEP = 7; // (x * x * x * (x * (6.0 * x - 15.0) + 10.0))
New script commands
// Returns the currently executing event (EVENT_SCRIPT_*) or 0 if not determinable.
// Note: Will return 0 in DelayCommand/AssignCommand. ExecuteScript(Chunk) will inherit their event ID from their parent event.
int GetCurrentlyRunningEvent();
// Get the integer parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 8.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or 0 on error/when not set.
int GetEffectInteger(effect eEffect, int nIndex);
// Get the float parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 4.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or 0.0f on error/when not set.
float GetEffectFloat(effect eEffect, int nIndex);
// Get the string parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 6.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or "" on error/when not set.
string GetEffectString(effect eEffect, int nIndex);
// Get the object parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 4.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or OBJECT_INVALID on error/when not set.
object GetEffectObject(effect eEffect, int nIndex);
// Get the vector parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 2.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or {0.0f, 0.0f, 0.0f} on error/when not set.
vector GetEffectVector(effect eEffect, int nIndex);
// Check if nBaseItemType fits in oTarget's inventory.
// Note: Does not check inside any container items possessed by oTarget.
// * nBaseItemType: a BASE_ITEM_* constant.
// * oTarget: a valid creature, placeable or item.
// Returns: TRUE if the baseitem type fits, FALSE if not or on error.
int GetBaseItemFitsInInventory(int nBaseItemType, object oTarget);
// Get oObject's local cassowary variable reference sVarName
// * Return value on error: empty solver
// * NB: cassowary types are references, same as objects.
// Unlike scalars such as int and string, solver references share the same data.
// Modifications made to one reference are reflected on others.
cassowary GetLocalCassowary(object oObject, string sVarName);
// Set a reference to the given solver on oObject.
// * NB: cassowary types are references, same as objects.
// Unlike scalars such as int and string, solver references share the same data.
// Modifications made to one reference are reflected on others.
void SetLocalCassowary(object oObject, string sVarName, cassowary cSolver);
// Delete local solver reference.
// * NB: cassowary types are references, same as objects.
// Unlike scalars such as int and string, solver references share the same data.
// Modifications made to one reference are reflected on others.
void DeleteLocalCassowary(object oObject, string sVarName);
// Clear out this solver, removing all state, constraints and suggestions.
// This is provided as a convenience if you wish to reuse a cassowary variable.
// It is not necessary to call this for solvers you simply want to let go out of scope.
void CassowaryReset(cassowary cSolver);
// Add a constraint to the system.
// * The constraint needs to be a valid comparison equation, one of: >=, ==, <=.
// * This implementation is a linear constraint solver.
// * You cannot multiply or divide variables and expressions with each other.
// Doing so will result in a error when attempting to add the constraint.
// (You can, of course, multiply or divide by constants).
// * fStrength must be >= CASSOWARY_STRENGTH_WEAK && <= CASSOWARY_STRENGTH_REQUIRED.
// * Any referenced variables can be retrieved with CassowaryGetValue().
// * Returns "" on success, or the parser/constraint system error message.
string CassowaryConstrain(cassowary cSolver, string sConstraint, float fStrength = CASSOWARY_STRENGTH_REQUIRED);
// Suggest a value to the solver.
// * Edit variables are soft constraints and exist as an optimisation for complex systems.
// You can do the same with Constrain("v == 5", CASSOWARY_STRENGTH_xxx); but edit variables
// allow you to suggest values without having to rebuild the solver.
// * fStrength must be >= CASSOWARY_STRENGTH_WEAK && < CASSOWARY_STRENGTH_REQUIRED
// Suggested values cannot be required, as suggesting a value must not invalidate the solver.
void CassowarySuggestValue(cassowary cSolver, string sVarName, float fValue, float fStrength = CASSOWARY_STRENGTH_STRONG);
// Get the value for the given variable, or 0.0 on error.
float CassowaryGetValue(cassowary cSolver, string sVarName);
// Gets a printable debug state of the given solver, which may help you debug
// complex systems.
string CassowaryDebug(cassowary cSolver);
// Overrides a given strref to always return sValue instead of what is in the TLK file.
// Setting sValue to "" will delete the override
void SetTlkOverride(int nStrRef, string sValue="");
// Constructs a custom itemproperty given all the parameters explicitly.
// This function can be used in place of all the other ItemPropertyXxx constructors
// Use GetItemProperty{Type,SubType,CostTableValue,Param1Value} to see the values for a given itemproperty.
itemproperty ItemPropertyCustom(int nType, int nSubType=-1, int nCostTableValue=-1, int nParam1Value=-1);
Pathfinding
- Makes PC pathfinding no longer use simplified pathfinding at certain distances. Given that PC pathfinding is given more time, it is generally well able to handle this and benefit from it.
- Fixed inaccurate calculation of grid step tolerance when using grid pathfinding.
- Fixed potential endless loops with ActionMoveAwayFromLocation.
- Fixed inconsistencies between when to use Z when comparing distances, which would result in certain actions failing when they shouldn't.
- Adds lacking safety checks which was causing pathfinding to floor performance if trying to interact with a door that was unreachable.
- Server settings: Removed experimental enhanced pathfinding toggle (now always on).
- Fixed some minor errors related to collision resulting in imprecisions.
Other Features
- GUI/NUI: Implemented floating point UI scaling.
- GUI/NUI: Implemented TTF font rendering.
- NUI: Implemented 9-slice gui skinning.
- NUI: Now using a cassowary constraint solver system to layout widgets.
- Floating damage numbers are now colourised based on the damage type taken.
- NUI: Redesigned the Options UI.
- NUI: Redesigned the NWSync Storage Management UI. (Now called Storage in the menu, and also accessible via the new game launcher).
- NUI: Fixed up some other UI panels to layout properly even when scaled.
- NUI: Added a panel to show Open Source Licences to config UI.
- NUI: Made sound effects more immersive/in line with base UI usage (different click noises depending on widget).
- GUI: Added a windowed/fullscreen/borderless dropdown to the Config UI and fixed the mode sometimes not initialising correctly.
- Async loading of files and images via http streaming. (Backend system work)
- ResMan: Movies can now be stored and played from override, ERF (hak, mod) and NWSync.
- SQLite: Added a configurable busy timeout, so that just externally running something on a campaign/nwsync database doesnt immediately abort queries running in the game. (3s default)
- SQLite: Added builtin functions for NWCompressedBuf compression, base64 de/encode, and hashing. See SQLITE_Readme.md in data.
- HTTP: Added a disk caching service to avoid repeated requests; added alias CACHE: (USERDIR/cache) by default. Configurable in settings, default max size is 100MB.
- Base: Game windowed size is now 1024x768 by default, because some UI just got too big.
- Base: TLK files now have a local cache, improving repeated lookup performance.
- Base: API cleanup for NWNX support
- Server: Removed some superfluous service updates (very minor perf).
- Renderer: Tweaks to palettes for PLTs to prevent metallic looks. Tweaks to PLTs for armour to prevent alpha dithering: https://nwn.beamdog.net/web/compare/custom_mat/
- Renderer: Added unique shader for particles; now with soft particle rendering; enable particle blending with fog: https://nwn.beamdog.net/web/compare/softparticles/, https://nwn.beamdog.net/web/compare/particles_fog/
- Renderer: Improved colour overflow for transparent objects: https://nwn.beamdog.net/web/compare/alpha_overflow/
- Renderer: Implemented proper OpenGL buffer orphaning.
- Renderer: Unified and simplified the shader setup, allowing the default vs/fslit_nm/sm shaders to be used for all standard PBR setups.
- Renderer: Made displacement offset a uniform that can be passed from materials to set a base level. To use it, add parameter float DisplacementOffset in a material. By default, the shaders assume the base (zero) level of the heightmap is 1 (white), so if base level is 0.6, the value needs to be -0.4, etc.
- Renderer: Made alpha level adhere to Fresnel effects at high shader quality.
- Renderer/Debug UI: Added a dropdown to select various rendering modes helpful for debugging (Material modes, Lighting channels, ..)
- Renderer: Improvements to FBO, grant all shaders access to color and depth buffer textures
- Renderer: Quickbar icons can now reload via SetTextureOverride #121
- Renderer: Fixed broken normal and tangent generation for skinmeshes due to invalidated render hints. Improved shader picking based on tangets/handedness.
- Renderer: Shader compilation errors are now printed to the game log file.
- Renderer: Separated out area wide lighting from area point lights. (Small perf improvement).
- Renderer/OVT: WALKDIST and RUNDIST now scales properly with visual transforms for you, in order to keep footsteps in sync.
- Renderer: Added material files for icy tileset.
- Renderer: Added material files for male and female old human heads so their hair no longer appears metallic.
Fixes
- Fixed main menu music not playing when intro movies are skipped.
- Renderer: Fixed a bad hashing algo for PLT textures resulting in excessive cache misses.
- Renderer: Fixed incorrectly initialised null textures in some cases, resulting in incorrect textures and unnecessary texture binds.
- Renderer: Removed redundant skinmesh bone remapping. Slight performance improvement, especially for models with many nodes.
- Renderer: Made texture management more efficient, streamline for future changes to PBR.
- Renderer/ResMan: Disabled the async model loader. Addresses the bodyparts missing issue. #145
- Renderer: Maximum number of bones of a single skinmesh is now 64, to match mobile. This should fix the case where the game runs with 1-2fps on some GPUs.
- Renderer: Fixed crashes due to NULL textures.
- Renderer: Fixed crashing due to broken skinmesh models.
- Renderer: Regression: Fixed compiled light models having issues due to memory misalignment/struct packing.
- Renderer: Fixed an issue that would potentially cause scenes using custom shaders to malfunction in the event that a user changes video options in game.
- Renderer: Fix text input caret pulsing when paused. Fix caret colouring following text in some situations.
- Renderer: Safeguard against crashes when an animation was missing
- Renderer: Optimised animesh buffer uploading; reduce time spent on GUI rendering.
- Renderer: Make the `decal` property actually disable lighting, rather than just self-illuminating brightly. Fixed some GUI scenes by adding decal to txis.
- Renderer: Fixed issue with darkness and similar negative light effects always being pushed to the end of the light priority list.
- Renderer: Fixed tile lights being added to the BSP before having their radii set (causing minor imprecisions.)
- Renderer: Fixed an issue with setting custom shaders when objects were using just one material for all parts while having more than one part.
- Renderer: Fixed a minor regression with the high contrast shader.
- Renderer: Removed a good chunk of dead/redundant code.
- Nuklear: Fixed a memleak that would degrade long play sessions
- VM: Fixed crash when calling DestroyArea() on a invalid object.
- VM: Stopped ExecuteScriptChunk from writing !chunk.ndb to override.
- VM: sqlite commands: Added missing newline in log output.
- VM: Fixed issue in string handling (also: VM: SubString()) that would have resulted in memory leaks or crashes.
- Game: Dont use weapon AB for ranged touch attacks anymore.
- Fixes to passive attack target selection. This should address Cleave etc. sometimes failing to find a followup target. #172
- Game: Effect Miss Chance/Blind Fighting: Fix erroneous re-roll against target concealment, fix effect being ignored against blind fighting. #15
- Game: Fixed error in levelup validation related to SkillpointModifierAbility being starred out #180
- Game: Fixed ResistSpell() when called from AOE spell scripts.
- Game: Fixed classstat modifiers applying incorrectly to polymorph. #185
- Fixed the DM flag being set incorrectly on player characters when copying files around. #216
- Fixed a rare crash in game object update netcode when writing out the party state of a player that just exited.
- Fixed a loop wraparound overflow game hang/crash when removing effect icons.
- Game: Fixed a crash when the game tried to write a log entry as it was shutting down.
- Emitters: fixed them not interpolating if not both size_y start and end were set (correct behaviour is to do if either is non-zero).
- Game: Never allow the window size to shrink below (100, 100). This works around the case where the window was too small to spot or resize back up0.
- Fixed a crash when clicking the Recommended button on chargen package selection with no packages available.
- Fixed a string type conversion error resulting in some empty strings in UI
- http: Made http errors more verbose. Verbosity is Friend.
- Fixed nwsync-enabled savegames not loading due to missing TLK error.
- Input: Character input is now correctly converted from the language charset. This should address broken polish text input.
- NUI: Fixed codepage glyphs cutting text off due to incorrectly-set codepage.
- NUI: Fix window flickering from (0,0) to center pos on first frame after opening.
- NUI: Fix window sometimes scaling down to (0,0).
- NUI: Pressing Escape now closes the currently focused window.
- NUI: Fixed UI not properly hiding when pressing Alt-F4/X to close the game.
- NUI Skinning: Made font white in all widgets, instead of grey.
- NUI Skinning: Skinned text input box.
- NUI Skinning: Title bars now look like native windows.
- NUI Skinning: Close/Minimise buttons match native style.
- NUI Skinning: Fixed combo box style.
- NUI Skinning: Window and group borders are now rendered 9-sliced.
- NUI Skinning: Fixed scrollbars not aligning properly.
- NUI: Fixed windows not properly auto-centering when ui-scaled.
- NUI: Fixed line fitting code to no longer repeat words when word-wrapping; improved performance to only do line flowing once.
- NUI: Fixed layouting reflow triggering once per frame when UI-scaled.
- NUI/GUI: Fixed TTF font rendering for Polish. #191 #235
- GUI: Fixed input caret; now back with extra cyan and more blinkage.
- GUI: Fixed password input box not accepting your passwords, no matter how good they were.
- Movie player: Optimised so it doesnt create the movie texture as often.
- Toolset: Fixed floating point drifting for X/YOrientation
- Toolset: Now reads DEVELOPMENT: (but it might not live-reload the same as the game would).
Art
- Added three content winner portraits to base game (aragnosh/human male, seafaref/halfelf female, seafarem/halfelf male).
- Fixed torch model flicker.
[ 2021-03-11 21:00:14 CET ] [ Original post ]
Greetings Adventurers,
We just launched Patch 8193.20 for Neverwinter Nights: Enhanced Edition! The update adds scores of features & fixes to the core campaigns, premium modules and toolsets. Todays patch also addresses the voiceover issue for non-english localizations.
Huge thanks to our amazing community for helping to test out the beta versions of this patch we couldnt have done it without you!
Check out the Patch Highlights & Full Details below!
Patch Highlights
- Non-English Voiceover: We fixed the issue causing english voiceover to play for non-english localizations
- NPC Movement: We improved the movement/navigation of Non-Player Characters (NPCs) and Creatures
- Multiplayer: We fixed a server-side issue and increased the module description size so players get the full details
- Dozens of Fixes: Weve added dozens of fixes to improve the overall experience in adventures, toolsets and the Dungeon Master Client
- New Scripting Functionality: See details below!
Patch Notes
NPC Movement
- Improved navigation of NPCs and Creatures
- Creatures now move in a logical direction when they are bumped or pushed
Performance Improvements
- Optimized Hardness (placeable damage resistance) in the game so it no longer imposes heavy impact on server loads
Fixes
- Non-English localizations now use correct voiceovers
- Fixed the multiplayer UI not saving the network port configuration
- Increased module description size to avoid cutting off text in the multiplayer browser
- Fixed an issue causing invalid skill point messages and preventing level ups
- Fixed a rare crash when loading custom content models
- Fixed a crash occurring in character selection when existing character files have an invalid player class or race
- Added a fix to make sure NPCs, like Deekin, level up correctly
- Fixed issues in the Premium Module Darkness over Daggerford
- Fixed an issue with the Daggerford Wagon
- Fixed minor issues in the Great Cheese Caper quest
Graphics
- Improved the appearance of armor and metals
- Shadows now fade more smoothly in relation to distance, height and angles.
- The Dynamic Contrast Shader now has adjustable settings in the options menu
- The Depth of Field Shader now has adjustable settings in the options menu
- Lights now fade in and out out more smoothly
- Texture animations now animate consistently
- Fixed the water shader showing seams
- Water now always uses the env map
- Grass now fades in smoothly rather than appearing abruptly
- Skyfade fog coloured model below the horizon now covers below area, so missing meshes and keyholing show a black backdrop
Renderer Improvements
- Optimised renderer GL buffer handling
- Fixed clear colour erroneously reverting to black when loading into an area if a game object was received at exactly the wrong time
- Fixed some erratic keyholing behaviour in certain situations
- Reduced the number of shader reloads
- Fixed dropped items floating too far over the ground
- Fixed weather not correctly cleaning up after lightning events, sometimes resulting in heavy FPS drops
- Fixed skin meshes (cloaks, robes) occasionally being warped or dislocated when animating
- Normal maps are now read as two-channel textures (three are still supported, but this was needed for BC5)
- Water reflections now ignore subsurface alpha
- Env map tex coords are now always calculated per-fragment in HQ mode
- Specular lighting now ignores material transparency
- Refined light occlusion calculations
- Shared material uniform data is now reset for each draw call. This fixes issues where a material incorrectly adopts parameters from the previously-rendered, if the current material has none.
NWSync Optimizations
- Dedicated servers can now load their module data from a specially prepared NWSync repository, instead of having to have a copy of the module and hak files. (This mainly benefits big servers that have a CI/CD pipeline set up.)
- Added argument -moduleurl, from which the module data will be sourced
- Added a new optional argument -modulehash; which is considered to be `latest` if omitted
- Generate the server/module repository with --with-module
- You can reuse the public repository to save on duplication/disk space; or use a separate/private one. If you reuse the same repository and do not want to leak the module data, turn off http content listing and write the data with --no-latest.
- Data is stored in SERVERHOME/nwsync (this works the same as on the client). It will auto-prune old data if the group_id matches. The rest is left up to you.
Content Updates
- Added half-dragon tail to half-dragon blueprint
- Added missing texture for worldmap placeables
- Rendered new icons for the gem shields
- Fixed Tanarukk Blueprints, Factions & Script
- Fixed some tile models resulting in Access Violation in the toolset
- Set all weapons for Ambient and Diffuse of 100% (1 1 1), in alignment with the new graphics & lighting
- Fixes to Shadow, Mesh and Bounding Boxes
- Added in several missing art models and portraits, along with toolset blueprints (DoD Flags, Signs, & Duke Painting; Tyrants Flowering Plants & Wavy Water 1x1, Invisible Ground 4x4, Worldmaps - Floor and Wall-Mounted)
- Rebuilt placeable walkmeshes on several larger models to be 3D instead of a flat plane
- Low Ambient Values raised to 1 1 1 (to allow other forms of tinting)
- Shields/Cloaks/Robes: Compiled shield models and turned Ambient and Diffuse values to 1.0 1.0 1.0, so area lighting and tinting can have fullest effect as well as clothing matched-up from race-to-race
- Skybox, Black: Added missing model
- XP3 placeables: Many fixes for useability, shadows, z-fighting, walkmesh, and appearance
- XP3 Gem Golems: Adjusted appearance for proper translucency & shine (creatures/weapons/shields)
- Daggerford & Tyrants of the Moonsea Placeables: Reworked placeable Use nodes to strict 13-character length requirement, cleaned up PWK walkmesh settings
- Glass and Metal textures: Fixed TXI settings, added an alpha channel to maps for specularity and custom environment mapping (new textures)
- Candles (Non-Ambient): Added a dynamic light with shadowing (Disclaimer: nearby props must not be set to Static in order to cast shadows, but work much better than Ambient lights)
- Elven Lanterns: Fixed candle flame not showing through panes and added ambient/dynamic versions, as with candles
- Kochrachon: Fixed deformed arms & a floating "thumb"
- Appearance.2DA: Curst Swordsman: Removed undesired environmental mapping
- Kobolds/Goblins/Orcs/Golems/Giants: Added default environmental mapping
- Orcus (Blueprint): Added missing creature hide and Wand to inventory
- Gem Greatswords, Warhammers, Shields and Placeable Gemstones: Fixed UV's and self-illumination settings
- Doortypes.2DA: Added proper blueprint ref's for the two new elven doors (TTF02)
- Loadscreens.2DA: Added default tileset entries for DoD and Tyrants loadscreens
- Placeables.2DA: Fixed various settings on placeable entries
- PlaceablePalStd.ITP: Added new entries for missing blueprints, removed a couple bogus entries
- Portraits.2DA: Added missing entries, for missing blueprints
- Tailmodel.2DA: Changed entry 5000 from "karandas" to "Half-Dragon"
- PLC_C10 (Placeable Door): Fixed a bad set of Use Nodes (secret door fix)
- TNO01: Fixed a SQRT Domain error in TNO01 Boat (at last!)
- TNO01: Fixed a crash in TNO01 Ship1 and Market Stall, Long: caused by too many mesh parts
- TNO01: Fixed chimney & window animations in Inn, Coach 2x2
- TTF02 and TTS02 Doors: Fixed DWK naming and settings
- TTF02 Water: Fixed bad transparency settings in stream tiles (as seen through tree branches)
- TSS13 (Seaships): Added edge tiles TSS13_edge.2DA
- TSS13_C07_04: Fixed a bad water reference
- TCN_UDoor_02: Fixed a shifted walkmesh and transition mesh (you could transition the door w/o opening)
- TDM01_O11_01: Replaced a missing face in the doorway mesh
- TCN01_A06_01: Fixed some meshes which had shifted from bas X-Forms
- TRM02.SET: Added a missing crosser entry
- TCM02.SET: Fixed typos in a couple tile names
- TCM02: Replaced small/misaligned water meshes on several tiles
- IIT_Torch02: Adjusted smoke to be much more minimal than a standard torch
- TTF02_I07_02: Removed a bunch of extra/ugly tree foliage meshes
- TTF02_T13-14_01: Set meshes from Render 0 to 1, fixed UV's on tent flap, added bottom mesh to lean-to
- TWC03_C53_01, TWC03_C54_06: Fixed broken fireplace animations, added a woodpile for fuel
- TDE01, TNI02, and TSW01: Restored the "Lightning Tiles" in TDE01, TNI02, and TSW01, added animloops for shutdown where needed
Toolset
- Fixed some shadows not rendering properly
- Fixed VFX emitters not rendering properly
Other Updates
- Fixed minimap data being assigned incorrectly when deleting an area via VM::DestroyArea
- Fixed cloaks and robes not inheriting visual transform animation speed
- Fixed items losing the possessor reference when failing to merge a stack out of a container, resulting in dead/unusable items and eventually a crash
- Hide Second Story Tiles setting is now disabled by default
- Linux binaries are now built against Debian Stretch (9), fixing requirements to Debian 9, Ubuntu 18.04 LTS, or newer. This should take care of the glibc issues some folks were seeing, as well as the stray libsndio linkage
- Danglymesh is now properly frozen when the game is paused
- Model loader: Set mesh ambient and diffuse to vec3(1.0) by default
- NWSync command line args now verify the URL and Hash formats
- Fixed an issue where the first texture in a material was replaced with the NULL texture after an area change
- Fixed classstat abilities modifiers not being considered for feat requirements on levelup, when the abilities are gained on the very same level
- Fixed class stat ability modifiers sometimes not updating after a levelup (for example, for STR damage bonus)
- Fixed blank value in SkillPointModifierAbility in racialtypes.2da failing ELC
- Debug UI: Fixed a client crash in the NWScript Widget when inputting a invalid object ID
- nwscript.nss: Added missing tileset resref constants
- Config: The default value for 2D/3D bias is now 1.0 which should fix sound effect quietness (you need to reset it manually in Options if you want to try this)
- Scripting:
- Fixed material parameters not being updated for single float changes
- Cutscenes: Fixed Hide Second Story Tiles not being saved/restored correctly
- Cutscenes: Fixed camera being reset with incorrect values despite VM::StoreCameraFacing not having been called
- ActivatePortal: Fixed some cases where NAT punchthrough or relaying failed to work
- Fixed a crash when calling area management functions twice (e.g. CopyArea(CopyArea()))
- EnterTargetingMode() now also triggers when the user cancels out, with the target area or object returned as INVALID_OBJECT
- Material filenames and params now allow underscore
New Scripting Functionality
// Sets the current hitpoints of oObject. // * You cannot destroy or revive objects or creatures with this function. // * For currently dying PCs, you can only set hitpoints in the range of -9 to 0. // * All other objects need to be alive and the range is clamped to 1 and max hitpoints. // * This is not considered damage (or healing). It circumvents all combat logic, including damage resistance and reduction. // * This is not considered a friendly or hostile combat action. It will not affect factions, nor will it trigger script events. // * This will not advise player parties in the combat log. void SetCurrentHitPoints(object oObject, int nHitPoints);
[ 2020-12-15 17:59:29 CET ] [ Original post ]
Greetings everyone! Were just about ready to ship Patch 8193.20 for Neverwinter Nights: Enhanced Edition but we need your help to test the Beta (Round 2)! Based on your feedback from the latest beta test, weve updated the build of the next Neverwinter Nights: Enhanced Edition patch with a few fixes. Huge thanks to all testers for their feedback on this! Now we'd like to gather your thoughts on the new build: Is it stable & solid? Is it ready for release? Let us know!
How to Participate:
- In your Steam Library, Right-Click Neverwinter Nights: Enhanced Edition and choose Properties
- Click on the Beta Tab
- Choose the build8193.20 in the drop down menu
- Play the Beta on Steam
- Vote in the Comments Below, or on the Beamdog Forums
- Yes, it's Ready to Release! - or - No, it's not ready (please explain)
Patch Highlights:
Last month we shipped an epic patch with some huge graphical upgrades. This month were looking to tackle a few bugs that the big patch introduced, and improve the overall polish of our favorite RPG.
- Fixes issue where Non-English voice overs played in English
- Fixes several crashes in campaigns, menus & toolset
- Refines the shaders and lighting renderers added in the last patch
- Added a few fixes based on user feedback in the previous test, including the hardness fix
Vote on the Beta (Round 2)!
- Yes, Ready to Release!
- No, It's not ready (please explain)
[ 2020-12-01 19:12:10 CET ] [ Original post ]
Fixes
- Reverted placeable Hardness behaviour to again ignore non-physical damage.
- Fixed RDD NPCs not levelling up correctly in some cases (for example, Deekin).
[ 2020-12-01 18:27:36 CET ] [ Original post ]
Greetings adventurers, Were just about ready to ship Patch 8193.19 for Neverwinter Nights: Enhanced Edition but we need your help to test the Beta! Last month we shipped an epic patch with some huge graphical upgrades. This month were looking to tackle a few bugs that big patch introduced, and improve the overall polish of our favorite RPG.
How to Participate:
- In your Steam Library, Right-Click Neverwinter Nights: Enhanced Edition and choose Properties
- Click on the Beta Tab
- Choose the build8193.19 in the drop down menu
- Play the Beta on Steam
- Comment Below to Vote: [Yes, Ready to Release!] / [Not Ready! (please explain)]
- > or Vote on the Beamdog Forums here!
Patch Highlights:
- Fixes issue where Non-English voice overs played in English
- Fixes several crashes in campaigns, menus & toolset
- Refines the shaders and lighting renderers added in the last patch
Vote Below: Yes, Ready to Release! / Not Ready! (please explain)
[ 2020-11-23 21:14:35 CET ] [ Original post ]
Hello, dear community! This is dev patch 82.8193.19. As always, it is cross-compatible with all 8193-series releases, though newer features will not work on older servers, and vice versa. Please test, and report any issues you find. Thank you!
Fixes
- Fixed dropped items floating too far over the ground.
- VM: Fixed a crash when calling area management functions twice (e.g. CopyArea(CopyArea())).
- Fixed a crash when a character file in localvault has a invalid racialtype or class.
- Art: Fixed some tile models resulting in Access Violation in the toolset.
[ 2020-11-10 17:17:18 CET ] [ Original post ]
Hello friends! We're shipping Dev Patch 8193.18 today. This is stabilisation and bugfixes, with just a tiny selection of existing feature improvements.
Changes
- VM: EnterTargetingMode() now also triggers when the user cancels out, with the target area or object returned as INVALID_OBJECT.
- Pathfinding: Creature bumping should now pick a more logical displacement direction for the bump.
- Pathfinding: Further improvements to AI pathing.
- Refactored Hardness to no longer be an effect; gain ~5% cpu time improvement on heavy server loads.
- VM: Material filenames and params now allow underscores.
- nwscript.nss: Added missing tileset resref constants.
- Multiplayer browser: Bumped module description size to 1KB, to avoid needless cutoff.
- Linux binaries are now built against Debian Stretch (9), fixing requirements to Debian 9, Ubuntu 18.04 LTS, or newer. This should take care of the glibc issues some folks were seeing, as well as the stray libsndio linkage.
- Config: The default value for 2D/3D bias is now 1.0. This should fix sound effect quietness. You need to reset it manually in Options if you want to try this.
Fixes
- Renderer: Fixed weather not correctly cleaning up after lightning events, sometimes resulting in heavy FPS drops.
- Renderer: Fixed skinmeshes (cloaks, robes) occasionally being warped or dislocated when animating.
- Renderer: Normal maps are now read as two-channel textures (three are still supported, but this was needed for BC5).
- Renderer: Water reflections now ignore subsurface alpha.
- Renderer: env map tex coords are now always calculated per-fragment in HQ mode.
- Renderer: Specular lighting now ignores material transparency.
- Renderer: Refined light occlusion calculations.
- Renderer: Shared material uniform data is now reset for each draw call. This fixes issues where a material incorrectly adopts parameters from the previously-rendered, if the current material has none.
- Multiplayer Server UI: Fixed server port not being saved.
- VM: Fixed material parameters not being updated for single float changes.
- VM: Cutscenes: Fixed Hide Second Story Tiles not being saved/restored correctly. #137
- VM: Cutscenes: Fixed camera being reset with incorrect values despite VM::StoreCameraFacing not having been called. #126
- VM: ActivatePortal: Fixed some cases where NAT punchthrough or relaying failed to work.
- Fixed a regression in ValidateCharacter that resulted in invalid skill point messages. #180
- Fixed blank value in SkillPointModifierAbility in racialtypes.2da failing ELC. #180
- Fixed a rare crash when loading custom content models.
Premiums
- DoD: Addressed two minor issues related to the Great Cheese Caper quest
Art
- Set all weapons for Ambient and Diffuse of 100% (1 1 1), in alignment with the new graphics & lighting
- TCN_UDoor_02: Fixed a shifted walkmesh and transition mesh (you could transition the door w/o opening)
- TSS13_C07_04: Fixed a bad water reference
- PLC_C10 (Placeable Door): Fixed a bad set of Use Nodes (secret door fix)
- TDM01_O11_01: Replaced a missing face in the doorway mesh (#183)
- TCN01_A06_01: Fixed some meshes which had shifted from bas X-Forms (#178)
- TTF02_T13-14_01: Set meshes from Render 0 to 1, fixed UV's on tent flap, added bottom mesh to lean-to (#186)
- Orcus (Blueprint): Added missing creature hide and Wand to inventory (#177)
- TWC03_C53_01, TWC03_C54_06: Fixed broken fireplace animations, added a woodpile for fuel (#188)
- Gem Greatswords, Warhammers, Shields and Placeable Gemstones: Fixed UV's and self-illumination settings (#174)
- TRM02.SET Added a missing crosser entry (#194)
- TCM02.SET Fixed typos in a couple tile names (#196)
- TCM02 Replaced small/misaligned water meshes on several tiles (#195)
- IIT_Torch02 Adjusted smoke to be much more minimal than a standard torch (#189)
- TTF02_I07_02: Removed a bunch of extra/ugly tree foliage meshes (#181)
- Rendered new icons for the gem shields (#174)
- Fixed Tanarukk Blueprints, Factions & Script (#198)
[ 2020-11-05 19:02:00 CET ] [ Original post ]
Changes
- Config: Hide secondary story tiles is now disabled by default.
- Dynamic contrast shader now has config options for intensity and midpoint.
- Depth of Field shader should now behave better; added configuration option for used focusing type.
- Armour/metals are now rendered with more detail and less blotches.
- Shadows now fade out more smoothly in relation to distance and height/angle.
Fixes
- Fixed the localisations not loading some keytable content (like voiceovers).
- Lighting: Fixed an issue in the light range calculation that resulted in lights occasionally flicking off/on rather than fading out smoothly.
- Renderer: Optimised renderer GL buffer handling.
- Fix texture animations sometimes not animating. #68
- Renderer: Fixed clear colour erroneously reverting to black when loading into an area if a game object was received at exactly the wrong time.
- Fixed the water shader showing seams.
- Water now always uses the env map.
- Danglymesh is now properly frozen when the game is paused.
- Grass: Fixed fade-in Z fighting/shimmering when viewing from above, fixed grass appearing abruptly instead of fading in smoothly.
- Skyfade fog coloured model below the horizon now covers below area, so missing meshes and keyholing show a black backdrop.
- Fixed minimap data being assigned incorrectly when deleting an area via VM::DestroyArea.
- Fixed cloaks and robes not inheriting visual transform animation speed. #159
- Fixed items losing the possessor reference when failing to merge a stack out of a container, resulting in dead/unusable items and eventually a crash.
- Model loader: Set mesh ambient and diffuse to vec3(1.0) by default.
- NWSync command line args now verify the URL and Hash formats.
- Debug UI: Fixed a client crash in the NWScript Widget when inputting a invalid object ID. #141
- Fixed an issue where the first texture in a material was replaced with the NULL texture after an area change.
- Fixed classstat abilities modifiers not being considered for feat requirements on levelup, when the abilities are gained on the very same level. #45
- Fixed classstat ability modifiers sometimes not updating after a levelup (for example, for STR damage bonus).
- Renderer: Fixed some erratic keyholing behaviour in certain situations.
- Renderer: Reduced the number of shader reloads.
Toolset
- Toolset: Fixed shadow rendering with fog disabled.
- Toolset: Fixed VFX emitters not rendering properly. #162
- Toolset: Fixed some shadows not rendering properly.
Art Fixes
- Fixed a crash in TNO01 Ship1 and Market Stall, Long: caused by too many mesh parts
- TTF02 and TTS02 Doors: Fixed DWK naming and settings
- TTF02 Water: Fixed bad transparency settings in stream tiles (as seen through tree branches)
- TSS13 (Seaships): Added edge tiles TSS13_edge.2DA
- TNO01: Fixed chimney & window animations in Inn, Coach 2x2
- Shields/Cloaks/Robes (all): Turned Ambient and Diffuse values to 1.0 1.0 1.0, so area lighting and tinting can have fullest effect as well as clothing matched-up from race-to-race. Compiled shield models
- Skybox, Black: Added missing model
- Restored the "Lightning Tiles" in TDE01, TNI02, and TSW01, added animloops for shutdown where needed
- XP3 placeables: Many fixes for useability, shadows, z-fighting, walkmesh, and appearance
- XP3 Gem Golems: Adjusted appearance for proper translucency & shine (creatures/weapons/shields)
- Daggerford & Tyrants of the Moonsea Placeables:
- Reworked placeable Use nodes to strict 13-character length requirement, cleaned up PWK walkmesh settings
- Shadow, Mesh and Bounding Box fixes
- Rebuilt placeable walkmeshes on several larger models to be 3D instead of a flat plane
- Low Ambient Values raised to 1 1 1 (to allow other forms of tinting)
- Added in several missing art models and portraits, along with toolset blueprints (DoD Flags, Signs, & Duke Painting; Tyrants Flowering Plants & Wavy Water 1x1, Invisible Ground 4x4, Worldmaps - Floor and Wall-Mounted)
- Added half-dragon tail to Half-Dragon blueprint
- Added missing texture for worldmap placeables
- Glass and Metal textures: Fixed TXI settings, added an alpha channel to maps for specularity and custom environment mapping (new textures)
- Candles (Non-Ambient): Added a dynamic light with shadowing (Disclaimer: nearby props must not be set to Static in order to cast shadows, but work much better than Ambient lights)
- Elven Lanterns, Fixed candle flame not showing through panes, added ambient/dynamic versions as with candles
- Fixed a SQRT Domain error in TNO01 Boat (at last!)
- Kochrachon: Fixed deformed arms & a floating "thumb"
- Appearance.2DA
- Curst Swordsman: Removed undesired environmental mapping
- Kobolds/Goblins/Orcs/Golems/Giants/a few others: Added default environmental mapping
- Doortypes.2DA
- Added proper blueprint ref's for the two new elven doors (TTF02)
- Loadscreens.2DA
- Added default tileset entries for DoD and Tyrants loadscreens
- Placeables.2DA
- Fixed various settings on placeable entries
- PlaceablePalStd.ITP
- Added new entries for missing blueprints, removed a couple bogus entries
- Portraits.2DA
- Added missing entries, for missing blueprints
- Tailmodel.2DA
- Changed entry 5000 from "karandas" to "Half-Dragon"
Premiums
- DoD: Fixed use node on the Daggerford Wagon in the dev hak
Using NWSync Serverside
The linux/macos nwserver binaries can now bootstrap from NWSync instead of having to have a copy of all hak data.
- New argument -moduleurl, from which the module data will be sourced.
- New optional argument -modulehash; which is considered to be `latest` if omitted.
- You need to generate the server/module repository with --with-module.
- You can reuse the public repository to save on duplication/disk space; or use a separate/private one. If you reuse the same repository and do not want to leak the module data, turn off http content listing and write the data with --no-latest.
- Data is stored in SERVERHOME/nwsync, same as on the client. It will auto-prune old data if the group_id matches, also same as the client. The rest is left up to you.
New Scripting Functionality
// Sets the current hitpoints of oObject.
// * You cannot destroy or revive objects or creatures with this function.
// * For currently dying PCs, you can only set hitpoints in the range of -9 to 0.
// * All other objects need to be alive and the range is clamped to 1 and max hitpoints.
// * This is not considered damage (or healing). It circumvents all combat logic, including damage resistance and reduction.
// * This is not considered a friendly or hostile combat action. It will not affect factions, nor will it trigger script events.
// * This will not advise player parties in the combat log.
void SetCurrentHitPoints(object oObject, int nHitPoints);
[ 2020-10-05 17:55:15 CET ] [ Original post ]
Hello! This is a hotfix patch to 8193.15, which we released yesterday. The changes in this patch are clientside only. You do not need to upgrade your dedicated server if it is already on .15 for full feature support.
Fixes
- Fixed the game not starting when a language override was selected
- The music tracks added in the DOD/TOTM content release now show up properly in the toolset (instead of "Bad Strref")
- The game no longer tries to read the N: drive when trying to load a non-existent supermodel
- nwscript.nss: Fixed error in description of StringToObject
Known Issues
This is a (incomplete) list of known issues on this build. Items on this list do not need to be reported!
- Ability score bonuses from levelstat (class progression) do not contribute toward feat requirements when the score increase is received on the same levelup.
- Non-functional anti-aliasing and anisotropic filtering settings have been removed pending a potential future reimplementation. We suggest you use the driver control panel to force it meanwhile, if so desired.
- UI: Nuklear-based UI (NWSync, Configuration) does not observe ui scaling
- UI: Nuklear-based UI (NWSync, Configuration) is not skinned as beautiful as can be
- UI: Nuklear-based UI (NWSync, Configuration) does not close with the Esc key
- UI: Nuklear-based UI (NWSync, Configuration) is only partially translated or labels are less descriptive than they could be
- Water renderer does not use the area environment map, resulting in unseemly seams
- VM: DestroyArea() sometimes erroneously removes the wrong minimap data on clients, resulting in black/unexplored areas.
- Hosting a module from within the DM client does not update/show the creator palettes correctly
- Items dropped on the ground appear to be floating slightly. This is a clientside rendering issue and does not require server/module adjustments by you!
- Items dropped on tables fall through (mesh hit check). This is also clientside only and does not require you to fix things in the module/in scripting!
- There is a memleak on the main menu. It does not manifest in game.
[ 2020-09-16 19:17:19 CET ] [ Original post ]
Greetings, friends!
Today we release Patch 8193.15 for Neverwinter Nights: Enhanced Edition! This update is big the biggest the game has seen since its original release in 2018. Were introducing a new lighting engine to enhance the graphics, dozens of toolset updates, plus plenty more features and fixes. Read on for all the details! As always, this patch is network-compatible within the current major version (8193), including the old stable release .13; so you can play on servers with it that have not yet upgraded (though the majority of the new features will not work). To get the full experience, you will have to update both server and clients to this release. Singleplayer modules made with this new patch 1.81 cannot be played on older versions, however.
New Lighting Engine
This patch includes a new enhanced lighting engine, that is governed by the same principles as you would see in other modern games that aim for realistic lighting. The aim is both to allow much higher quality future content, but also to enhance the visual quality of existing content. These are the main elements of this new lighting engine:
- Physically based rendering (PBR), with emulation of specular reflection, surface roughness, Fresnel-effects and gamma correction. All in all, this gives a more realistic and natural look.
- Tone mapping that prevents color distortion of bright lights and enables overbright.
- Per-pixel lighting rather than per-vertex of the old setup, yielding much more precise light illumination levels relative to distance.
- Full dynamic lighting, supporting up to 32 dynamic lights (previously NWN effectively only supported 6).
New Water Rendering
Water presentation has also been improved significantly. It now renders full dynamic light reflections, including sun and moon. It also shows wave displacement based on area wide and local wind sources (such as explosions) much more realistically than the previous water did. As with the other lighting changes, some areas may appear differently, and builders using tile lights will now see them in the reflections, and may wish to edit an areas lights so that both the area and the reflections appear as desired. There are configuration options in the UI to turn this feature off. Again, please visit this link to see the improvements to water in action: https://nwn.beamdog.net/web/8193.14-comparison-shots/
Grass Rendering
Grass is now rendered sorted by distance, fixing transparency issues and making it look denser and more natural. The comparison link posted above has visual examples of this. Grass rendering also has been heavily optimised and should no longer pose a performance consideration, even in scenes with lots of it.
Other miscellaneous graphical improvements
Models spawned by visual effects now have fog properly applied and are not self-illuminated with a bright light anymore. This makes content spawned as visual effect render identical to other in game content, making things such as VFX spawned tiles and character equipment appear more natural.
Content import from Ossian premium modules
This patch includes all content from Darkness over Daggerford and Tyrants of the Moonsea.
- Tileset facelifts for the Forest and Rural Winter tileset, crafted by Zwerkules
- Medieval City, Medieval Rural, and Mountain Snow sets, also by Zwerkules
- Lizardfolk Interior microset
- Seaships microset
- Additions to several tilesets:
- Several new docking ships groups, and a thatched-roof building, in Castle Exterior, Rural
- New doorway tiles for Crypts and City Interior
- 476 assorted placeables
- 13 creature models
- 3 shields, the Wand of Orcus, and a brass candlestick 'torch'
- A complete "time of day" skybox texture set for the Icy, Clear sky skybox
- 42 ambient Music tracks
- 54 load screens
- 25 assorted ambient sounds
- 5 sound sets (for specific new creatures)
- Palettes and blueprints for all imported Ossian content: Items, Creatures, and Placeables
Player Dungeon Master Mode
Players can now acquire and relinquish DM privileges during normal play, assuming they know the DM password. A player DM will have all of the normal dungeon master ruleset amenities: Their player character will turn invincible; they will be able to cast any spell they wish, and their skill checks will always be made against max. However, player DMs will not gain features specific to DM characters: Their feat list will not include all the DM abilities, and they will not walk any faster. They will also not join the DM party/faction, so they will not be able to see all player parties. Dedicated servers can turn this off in configuration. To enter player DM mode, you can use the console commands (`dm_login
// Returns TRUE if the given player-controlled creature has DM privileges
// gained through a player login (as opposed to the DM client).
// Note: GetIsDM() also returns TRUE for player creature DMs.
int GetIsPlayerDM(object oCreature);
As a consequence, GetIsDM() will now return TRUE for player DMs. Previously, you could rely on this being static per-connection, as true DMs could not drop their privileges.
Pathfinding improvements
Pathfinding quality in placeable and creature-heavy areas has been significantly improved, beyond the optimisations already done in 8193.13. Your character should no longer get stuck on random placeables, or not find their way around other creatures.
Conversation script parameters
You can now specify script parameters in the toolset conversation editor, and these parameters can be queried via new the new script command:
// Returns the script parameter value for a given parameter name.
// Script parameters can be set for conversation scripts in the toolset's
// Conversation Editor, or for any script with SetScriptParam().
// * Will return "" if a parameter with the given name does not exist.
string GetScriptParam(string sParamName);
There is also a script command to set parameters when invoking other scripts via ExecuteScript.
// Set a script parameter value for the next script to be run.
// Call this function to set parameters right before calling ExecuteScript().
void SetScriptParam(string sParamName, string sParamValue);
Scripted access to SQLite databases
Full access to the sqlite API has been added. You can access the following databases:
- Campaign: Databases spanning modules and savegames, living in database/.
- Module: A database attached to the running module, persisted to savegames.
- Player: Each player character has a database attached that gets saved to the character .bic file when saving to a vault (local/server), or exporting the character in singleplayer. It also gets saved to savegames.
Scripted mouse targeting mode
You can now trigger cursor targeting mode from scripting:
// Makes oPC enter a targeting mode, letting them select an object as a target
// If a PC selects a target, it will trigger the module OnPlayerTarget event.
void EnterTargetingMode(object oPC, int nValidObjectTypes = OBJECT_TYPE_ALL, int nMouseCursorId = MOUSECURSOR_MAGIC);
// Gets the target object in the module OnPlayerTarget event.
// Returns the area object when the target is the ground.
object GetTargetingModeSelectedObject();
// Gets the target position in the module OnPlayerTarget event.
vector GetTargetingModeSelectedPosition();
// Gets the player object that triggered the OnPlayerTarget event.
object GetLastPlayerToSelectTarget();
A new module event has been added to support this.
Caveat: The toolset cannot currently configure this module event. You need to set it via SetEventScript() at module load.
New script actions related to item property usage
These script commands allow NWScript to properly trigger item property usage, circumventing the Talent system.
// Returns the number of uses per day remaining of the given item and item property.
// * Will return 0 if the given item does not have the requested item property,
// or the item property is not uses/day.
int GetItemPropertyUsesPerDayRemaining(object oItem, itemproperty ip);
// Sets the number of uses per day remaining of the given item and item property.
// * Will do nothing if the given item and item property is not uses/day.
// * Will constrain nUsesPerDay to the maximum allowed as the cost table defines.
void SetItemPropertyUsesPerDayRemaining(object oItem, itemproperty ip, int nUsesPerDay);
// Queue an action to use an active item property.
// * oItem - item that has the item property to use
// * ip - item property to use
// * object oTarget - target
// * nSubPropertyIndex - specify if your itemproperty has subproperties (such as subradial spells)
// * bDecrementCharges - decrement charges if item property is limited
void ActionUseItemOnObject(object oItem, itemproperty ip, object oTarget, int nSubPropertyIndex = 0, int bDecrementCharges = TRUE);
// Queue an action to use an active item property.
// * oItem - item that has the item property to use
// * ip - item property to use
// * location lTarget - target location (must be in the same area as item possessor)
// * nSubPropertyIndex - specify if your itemproperty has subproperties (such as subradial spells)
// * bDecrementCharges - decrement charges if item property is limited
void ActionUseItemAtLocation(object oItem, itemproperty ip, location lTarget, int nSubPropertyIndex = 0, int bDecrementCharges = TRUE);
Override hilite colour on objects
You can now override the mouse-over (hilite) colour on objects.
// Sets oObject's hilite color to nColor
// The nColor format is 0xRRGGBB; -1 clears the color override.
void SetObjectHiliteColor(object oObject, int nColor = -1);
Custom mouse cursors
You can now override the mouse cursor a ingame object presents. Additionally, mouse cursors have been unhardcoded, so you can add more via custom content (see MOUSECURSOR_CUSTOM_00).
// Sets the cursor (MOUSECURSOR_*) to use when hovering over oObject
void SetObjectMouseCursor(object oObject, int nCursor = -1);
ProgFX have been unhardcoded
A new 2da, progfx.2da has been added, that links visualeffect.2da columns. This allows for adding additional custom skin effects, beams, MIRVs, etc.
Texture replacements
You can now replace individual textures on objects at runtime.
// Replace's oObject's texture sOld with sNew.
// Specifying sNew = "" will restore the original texture.
// If sNew cannot be found, the original texture will be restored.
// sNew must refer to a simple texture, not PLT
void ReplaceObjectTexture(object oObject, string sOld, string sNew = "");
Walk animations have been unhardcoded
You can add new walk anims by naming them `walk_002`, `walk_003`, etc. (001 is walkdead, 002 is hardcoded to walkinj)
Weather Types Unhardcoded
Added new 2da: weatherypes.2da; which - unsurprising, considering the name - unhardcodes weather types.
Scripted wind management
The game now allows much finer-grained scripted control over the wind data.
// Sets the detailed wind data for oArea
// The predefined values in the toolset are:
// NONE: vDirection=(1.0, 1.0, 0.0), fMagnitude=0.0, fYaw=0.0, fPitch=0.0
// LIGHT: vDirection=(1.0, 1.0, 0.0), fMagnitude=1.0, fYaw=100.0, fPitch=3.0
// HEAVY: vDirection=(1.0, 1.0, 0.0), fMagnitude=2.0, fYaw=150.0, fPitch=5.0
void SetAreaWind(object oArea, vector vDirection, float fMagnitude, float fYaw, float fPitch);
Visual effects can now use PLT textures
Visual effects can now refer to PLT textures. The layer colours/indices are inherited from the object the effect is applied to (such as creatures).
Visual effects can now be scaled, rotated, and translated
When applying a visual effect, you can now scale, rotate and translate it, in relation to the parented object. The script commands have been extended to support this:
effect EffectVisualEffect(int nVisualEffectId, int nMissEffect=FALSE, float fScale=1.0f, vector vTranslate=[0.0,0.0,0.0], vector vRotate=[0.0,0.0,0.0]);
effect EffectBeam(int nBeamVisualEffect, object oEffector, int nBodyPart, int bMissEffect=FALSE, float fScale=1.0f, vector vTranslate=[0.0,0.0,0.0], vector vRotate=[0.0,0.0,0.0]);
Modules and HAKs can now contain more than 16k items
The game can now load more than 16356 resources from ERF containers (modules and haks).
New Configuration UI
The game options UI has been replaced with a new implementation that now allows access to all of the new configuration options. The Debug UI configuration tab has been removed as a consequence. This UI is still work in progress, but it is useful enough to include now.
Debug UI has been revamped, including a new NWScript evaluation helper
The debug UI has been rewritten to be leaner and expose more useful features. You can now toggle DebugMode, renderaab, rendertilepathnodes via checkboxes. A new widget has been added that allows evaluating NWScript snippets on the running server (assuming you have DM privileges, or are in DebugMode).
Local variable access has been sped up significantly
Local variable access on objects is now O(n) in the worst case, but usually significantly faster than that. This is especially noticeable when you have thousands of variables on a single object. Previously, this could take up to 500ms to read a single variable; now access is below 10ms in these scenarios.
Art Changes
- TDT01_G02_01,TDT01_G02_01,TDT01_G08_01: Repaired walkmeshes, #46
- Repaired DAG01.set file to NOT offer unsupported height transitions #70
- Eliminated a SQRT Domain error in a couple Treehouse Side Log Tiles (TTF02_B01_02,TTF02_B01_12) #76
- TTF01_G04_05: Fixed bad texture assignment, tweaked alpha for better blending #77
- TTF01_C01_02: Replaced wintery leaf texture from Winter tileset w/ proper Forest texture #77
- TTF01_G01_01: Fixed a typo in TTF01.set which kept minimap from showing up #77
- TCN01_Water01.tga: Increased size to 256x256, cleaned up tiling seams
- TRM02: Recompiled a few tiles throwing SQRT domain errors #72
- TDE01_H07_01: Fixed a bad texture assignment and UV's, added lava spouts to either side of bridge (w/ animloop01 toggle) #122
- TDE01_A08_01: Adjusted lava mesh 0.382cm to eliminate a visible seam with neighboring tiles #117
- PTM_CardTable1: Fixed Bounding Box #109
- TDS01_D07_01: Fixed a SQRT domain error
- Reworked a few creature blueprints to more closely match 3E #95
- Fixed bad collisions in tn_sdoor_04 and tn_sdoor_16
- Repaired city exterior tcn_a11_01
- Compiled 165 more models in tno01
- TNO01_V02_03: Fixed splash VFX on waterfall (back onto its own animloop, waterfall animation still intermittent)
- TWC03_A04_07: Fixed broken/blinking chandelier candle animations
- Repaired bounding box on Candlestick torch; changed light to yellow 5m; repaired mesh and fixed smoke placement #95
- Removed erroneous palette entry from Birds category #107
- Compiled ~200 models (mostly for DODEE)
- TTF02 & TTS02: Baked a new set of minimaps, to add missing waters and roads
- TNO01: Fixed 3x1 and 4x1 Ship (Grass Set) for floating meshes (X-form)
- TTS02: Replaced Road to Bridge texture, fixed walkmesh
- Placeable Fog Emitters: Added missing mf_smoke texture
- Daggerford & Tyrants of the Moonsea Placeables:
- Reworked placeable Use nodes on card table, and a couple other placeables (#110)
- Shadow and Mesh fixes
- Bounding Box fixes
- PX2_G02 (Dragon Statue): Fixed flipped collision
- Emerald Golem: Set the skinmesh so golems body would also be translucent
- TNO01: Fixed tiles from Grass group that were using tno01_dirt03 City ground (#152)
- PLC_F06 (Catapult): Fixed shadows on multiple meshes, welded parts and gave it a proper rope texture
- TTS02: Several Shadow Fixes, Mesh Fixes
- TNO01: Restored 3 thatch houses (Grass section) that never made palette. New doors added to doortypes.2da (tn_sdoor_03, tn_sdoor_25)
- TDM01: Mining Platform 2 (2x2) Fixed an animloop that wouldn't shut off, and added one for the molten forge tile
- TWC03_A02_07: Fixed a broken fireplace animation
- TTS02 & TTF02: Shadow fixes, new & fixed animations (w/ new animloop options), a-nodes for transparency (water etc. blends properly)
- TSS13 (Seaships): Fixed several boats that were causing a toolset crash #142
Miscellaneous Script Commands
The StringToObject() script command can be used as the reverse of ObjectToString().
// Convert sHex, a string containing a hexadecimal object id,
// into a object reference. Counterpart to ObjectToString().
object StringToObject(string sHex);
Miscellaneous Improvements
- Texture pack support has been removed. All texture pack content has been merged into nwn_base.key.
- GUI: The bright ambient light has been disabled in UI scenes. This results in a more natural look in chargen and the compass.
- Nui: Windows now store position, size and collapse state in tml
- Nui: Modal windows now autosize to parent
- nwsync: increased check batch size for verifying existing data, dramatically speeding up process
- nwsync: increased local recv buffer size, speeding up transfers on low framerates
- WriteTimestampedLogEntry() now gets sent to all players as a console/debug message, if the server is in DebugMode. This is mostly useful for singleplayer module testing, when the module author uses the game log for debugging.
- ExoConfig: Trap and highlight colors are now stored as hex codes.
- DDS textures now support BC4 and BC5 encodings, to provide higher quality DDS options for greyscale and two-channel textures, such as height or specularity.
- Config UI: Added graphical presets: Low, Good, Best.
- Config UI: Added a configuration setting: General Shader/Lighting Quality.
- Shaders: Defines BUILD_VERSION and BUILD_REVISION expose build info.
Fixes
- Renderer: Fixed needlessly recalculating static lights in full dynamic light mode; this used to impact performance heavily with some specific static tile lights.
- Fixed grass occasionally overlapping, resulting in flickering.
- Fixed wind direction variation being offset by 120 degrees at peak.
- SQLite: No longer emit error: schema has changed non-errors when related to migrations.
- VM::DestroyArea() will now also fail with return code -2 if players are currently on a load screen transitioning into the area.
- Fixed large creatures intruding into your personal space. #124
- Config: The experimental Aggressive Texture Caching option has been removed (it is now on for everyone).
- Sending WriteTimestampedLogEntry messages to clients in DebugMode can now be toggled off with a setting.
- NUI expand/minimize chevrons have been inverted.
- Chat Panes: When in split mode, second chat pane now shows CONSOLE-level messages (debug messages, etc) #18
- Character generation: Spell school strrefs are now actually read from the 2da
- VM: Script situations now always keep a hold of the actual bytecode they are spawned from. This fixes the game doing funny things when the underlying compiled script file is swapped out. This also fixes code closures from within ExecuteScriptChunk (and the Debug UI).
- Store and load TemplateResRef from gff for door object types (so that GetResRef() does not return ). #100
- Dead players now call CNWSArea::DecrementPlayersInArea() #105
- VM::AdjustAlignment(): fixed ALIGNMENT_ALL echoing wrong axis labels #55
- VM::AdjustAlignment(): Game will now render the actual alignment shift that has happened, instead of the requested one: AdjustAlignment(-100) when at 50 will now say "You have shifted by -35" (to get you to 15, where the good/evil notchiness is) instead of "You have shifted by -100" but still putting you to 15.
- VM::AdjustAlignment(): Game will now not render any feedback if no alignment shift occurred (previously, it would render "Your alignment has shifted by -100" if you requested -100, even if you were already at rock bottom).
- Object hilite state is now properly persisted to GFF.
- Fixed the game crashing or reading invalid memory when quickslotting spells as a DM.
- Fixed a crash happening with drag & drop of inventory icons.
- Area transition screens on the client no longer partially render a grey overlay.
- Drag selection rendering in DM client was fixed.
- The nwhak.exe binary has moved into bin/, out of util/.
- Fixed heap overflow in ExoString::Insert (VM::Insert, dm_dumplocals)
- DestroyArea(): no longer skip the last object; this used to leave things in object space attached to nothing
- Movies: search path now prefers userdirectory over install, allowing users to override base movies.
- GUI: Nuklear-based UI now emits sounds when clicking buttons. #5
- GUI: The button Remove Server from Favorites in MP ui has been made to work once again.
- GPU vendor optimisations are now detected automatically; the config key optimize-buffer-updates has been removed.
- ambientmusic.2da: Fixed ids #80
- VM: A memleak in PostString has been fixed.
Toolset
- Toolset: Fixed bearing not being saved for placeables and doors
- Toolset: texture pack selector was removed.
- Toolset: Removed errant OK label in Area Properties #59
- Toolset: Portrait backgrounds in object properties have been fixed.
- Toolset: Update static lighting after changing tile light properties.
- Toolset: The Bearing float should no longer flap sign when saving out the area gff.
- Toolset: Improved script editor responsiveness as well as save/load module performance.
- Toolset: Area view settings are now applied to all open tabs.
- Toolset: A menu option to toggle AABB rendering was added.
- Toolset: No longer select last-opened module in save UI.
- Toolset: The UI for caching scripts has been removed, as the underlying system has been disabled for a while. It was pointless and counterproductive from a performance standpoint.
- Toolset is now linked to 32bit oal-soft. Hopefully no more sound woes.
Campaigns and Premiums
- Campaign SoU: Fixed the Baby Achievement
- TotM: Small fix for floating placeables in Elmwood
[ 2020-09-15 16:34:39 CET ] [ Original post ]
Hello, dear community! This is development build 8193.15, which stabilises the previous .14 release. This is in all likelihood the last release before a stable patch, right around the corner.
Tileset Facelifts
- Added Forest and Rural Winter Facelift tilesets.
- Added configuration option to transparently use facelift variants of Forest and Rural Winter instead of default tilesets for official Campaigns and DLC. (Custom content wanting to use these tilesets for existing areas will have to change the tileset in the .are file reference manually; the tilesets are hotswappable after all. Or build new areas with the Facelift tilesets.)
Features
- Config UI: Added graphical presets: Low, Good, Best.
- Added a configuration setting: General Shader/Lighting Quality.
- Polished metal (armour, etc) to now be a bit more shiny again.
- Renderer: Water random noise is now a noise texture, same as keyholing. This improves water performance significantly.
- Shaders: Defines BUILD_VERSION and BUILD_REVISION expose build info.
Fixes
- Fixed dying creatures sometimes spawning a random VFX.
- Renderer: Fixed grass occasionally overlapping, resulting in flickering.
- Renderer: Removed artifacts appearing when shadow optimization was enabled.
- Renderer: Fixed dynamic lights taking too long to fade in (FPS-dependent issue).
- Renderer: Fixed some grayscale textures erroneously showing up with a tint.
- Renderer: Fixed needlessly recalculating static lights in full dynamic light mode; this used to impact performance heavily with some specific static tile lights.
- Renderer: Minor tweaks to the appearance of the water shader, as well as some lighting parameters.
- Fixed wind direction variation being offset by 120 degrees at peak.
- [Linux] nwserver: no longer include libsndio in dependency list.
- Config UI: Slider values now editable via keyboard input (Just click the text label).
- Config UI: Fix floating point values incorrectly showing as modified when at default value.
- PlayerDM mode: Player DMs no longer auto-explore areas fully on enter as a native DM would.
- SQLite: No longer emit error: schema has changed non-errors when related to migrations.
- VM: DestroyArea will now also fail with return code -2 if players are currently on a load screen transitioning into the area.
Toolset
- Toolset: Fixed area shadows rendering incorrectly/without fog applied.
- Toolset: Fixed a crash in Area Statistics. #139
Art
- TTF02 & TTS02: Baked a new set of minimaps, to add missing waters and roads
- TNO01: Fixed 3x1 and 4x1 Ship (Grass Set) for floating meshes (X-form)
- TTS02: Replaced Road to Bridge texture, fixed walkmesh
- Placeable Fog Emitters: Added missing mf_smoke texture
- Daggerford & Tyrants of the Moonsea Placeables:
- Reworked placeable Use nodes on card table, and a couple other props (#110)
- Shadow and Mesh fixes
- Bounding Box fixes
- PX2_G02 (Dragon Statue): Fixed flipped collision
- Emerald Golem: Set the skinmesh so golems body would also be translucent
- TNO01: Fixed tiles from Grass group that were using tno01_dirt03 City ground (#152)
- PLC_F06 (Catapult): Fixed shadows on multiple meshes, welded parts and gave it a proper rope texture
- TTS02: Several Shadow Fixes, Mesh Fixes
- TNO01: Restored 3 thatch houses (Grass section) that never made palette. New doors added to doortypes.2da (tn_sdoor_03, tn_sdoor_25)
- TDM01: Mining Platform 2 (2x2) Fixed an animloop that wouldn't shut off, and added one for the molten forge tile
- TWC03_A02_07: Fixed a broken fireplace animation
- TTS02 & TTF02: Shadow fixes, new & fixed animations (w/ new animloop options), a-nodes for transparency (water etc. blends properly)
- TSS13 (Seaships): Fixed several boats that were causing a toolset crash #142
Weather Types Unhardcoded
Added new 2da: weatherypes.2da; which - unsurprising, considering the name - unhardcodes weather types.
[ 2020-09-09 19:30:20 CET ] [ Original post ]
Hello Neverwinter friends! Today is the day for a new development patch, and it is a big one. Please test it thoroughly, as we intend this to hit stable in the coming weeks! This patch is compatible with the current stable (8193.13), so you can play on servers with it that have not yet upgraded. However, some of the new features will not work on servers. To get the full experience, you will have to update both server and clients to this patch.
New Lighting Engine
This patch includes a new enhanced lighting engine, that is governed by the same principles as you would see in other modern games that aim for realistic lighting. The aim is both to allow much higher quality future content, but also in large to enhance the visual quality of existing content. Pictures say more than a thousand words: https://nwn.beamdog.net/web/8193.14-comparison-shots/ The blue dot in the middle can slide left and right to compare before/after. The left side is the old/current render; the right side is the new lighting engine. These are the main elements of this new lighting engine:
- Physically based rendering (PBR), with emulation of specular reflection, surface roughness, Fresnel-effects and gamma correction. All in all, this gives a more realistic and natural look.
- Tone mapping that prevents color distortion of bright lights and enables overbright.
- Per-pixel lighting rather than per-vertex of the old setup, yielding much more precise light illumination levels relative to distance.
- Full dynamic lighting, supporting up to 32 dynamic lights (previously NWN effectively only supported 6).
New Water Rendering
Water presentation has also been improved significantly. It now renders full dynamic light reflections, including sun and moon. It also shows wave displacement based on area wide and local wind sources (such as explosions) much more realistically than the previous water did. As with the other lighting changes, some areas may appear differently, and builders using tile lights will now see them in the reflections, and may wish to edit an areas lights so that both the area and the reflections appear as desired. There are configuration options in the UI to turn this feature off. Again, please visit this link to see the improvements to water in action: https://nwn.beamdog.net/web/8193.14-comparison-shots/
Grass Rendering
Grass is now rendered sorted by distance, fixing transparency issues and making it look denser and more natural. The comparison link posted above has visual examples of this. Grass rendering also has been heavily optimised and should no longer pose a performance consideration, even in scenes with lots of it.
Other miscellaneous graphical improvements
Models spawned by visual effects now have fog properly applied and are not self-illuminated with a bright light anymore. This makes content spawned as visual effect render identical to other in game content, making things such as VFX spawned tiles and character equipment appear more natural.
Content import from Ossian premium modules
This patch includes all content from Darkness over Daggerford and Tyrants of the Moonsea, except the Rural Forest and Winter tileset facelifts by Zwerkules.
- Medieval City, Medieval Rural, and Mountain Snow sets, by Zwerkules
- Lizardfolk Interior microset
- Seaships microset
- Additions to several tilesets:
- Several new docking ships groups, and a thatched-roof building, in Castle Exterior, Rural
- New doorway tiles for Crypts and City Interior
- 476 assorted placeables
- 13 creature models
- 3 shields, the Wand of Orcus, and a brass candlestick 'torch'
- A complete "time of day" skybox texture set for the Icy, Clear sky skybox
- 42 ambient Music tracks
- 54 load screens
- 25 assorted ambient sounds
- 5 sound sets (for specific new creatures)
- Palettes and blueprints for all imported Ossian content: Items, Creatures, and Placeables
Player Dungeon Master Mode
Players can now acquire and relinquish DM privileges during normal play, assuming they know the DM password. A player DM will have all of the normal dungeon master ruleset amenities: Their player character will turn invincible; they will be able to cast any spell they wish, and their skill checks will always be made against max. However, player DMs will not gain features specific to DM characters: Their feat list will not include all the DM abilities, and they will not walk any faster. They will also not join the DM party/faction, so they will not be able to see all player parties. Dedicated servers can turn this off in configuration. To enter player DM mode, you can use the console commands (`dm_login
// Returns TRUE if the given player-controlled creature has DM privileges
// gained through a player login (as opposed to the DM client).
// Note: GetIsDM() also returns TRUE for player creature DMs.
int GetIsPlayerDM(object oCreature);
As a consequence, GetIsDM() will now return TRUE for player DMs. Previously, you could rely on this being static per-connection, as true DMs could not drop their privileges.
Pathfinding improvements
Pathfinding quality in placeable and creature-heavy areas has been significantly improved, beyond the optimisations already done in 8193.13. Your character should no longer get stuck on random placeables, or not find their way around other creatures.
Conversation script parameters
You can now specify script parameters in the toolset conversation editor, and these parameters can be queried via new the new script command:
// Returns the script parameter value for a given parameter name.
// Script parameters can be set for conversation scripts in the toolset's
// Conversation Editor, or for any script with SetScriptParam().
// * Will return "" if a parameter with the given name does not exist.
string GetScriptParam(string sParamName);
There is also a script command to set parameters when invoking other scripts via ExecuteScript.
// Set a script parameter value for the next script to be run.
// Call this function to set parameters right before calling ExecuteScript().
void SetScriptParam(string sParamName, string sParamValue);
Scripted access to SQLite databases
Full access to the sqlite API has been added. You can access the following databases:
- Campaign: Databases spanning modules and savegames, living in database/.
- Module: A database attached to the running module, persisted to savegames.
- Player: Each player character has a database attached that gets saved to the character .bic file when saving to a vault (local/server), or exporting the character in singleplayer. It also gets saved to savegames.
Scripted mouse targeting mode
You can now trigger cursor targeting mode from scripting:
// Makes oPC enter a targeting mode, letting them select an object as a target
// If a PC selects a target, it will trigger the module OnPlayerTarget event.
void EnterTargetingMode(object oPC, int nValidObjectTypes = OBJECT_TYPE_ALL, int nMouseCursorId = MOUSECURSOR_MAGIC);
// Gets the target object in the module OnPlayerTarget event.
// Returns the area object when the target is the ground.
object GetTargetingModeSelectedObject();
// Gets the target position in the module OnPlayerTarget event.
vector GetTargetingModeSelectedPosition();
// Gets the player object that triggered the OnPlayerTarget event.
object GetLastPlayerToSelectTarget();
A new module event has been added to support this.
Caveat: The toolset cannot currently configure this module event. You need to set it via SetEventScript() at module load.
New script actions related to item property usage
These script commands allow NWScript to properly trigger item property usage, circumventing the Talent system.
// Returns the number of uses per day remaining of the given item and item property.
// * Will return 0 if the given item does not have the requested item property,
// or the item property is not uses/day.
int GetItemPropertyUsesPerDayRemaining(object oItem, itemproperty ip);
// Sets the number of uses per day remaining of the given item and item property.
// * Will do nothing if the given item and item property is not uses/day.
// * Will constrain nUsesPerDay to the maximum allowed as the cost table defines.
void SetItemPropertyUsesPerDayRemaining(object oItem, itemproperty ip, int nUsesPerDay);
// Queue an action to use an active item property.
// * oItem - item that has the item property to use
// * ip - item property to use
// * object oTarget - target
// * nSubPropertyIndex - specify if your itemproperty has subproperties (such as subradial spells)
// * bDecrementCharges - decrement charges if item property is limited
void ActionUseItemOnObject(object oItem, itemproperty ip, object oTarget, int nSubPropertyIndex = 0, int bDecrementCharges = TRUE);
// Queue an action to use an active item property.
// * oItem - item that has the item property to use
// * ip - item property to use
// * location lTarget - target location (must be in the same area as item possessor)
// * nSubPropertyIndex - specify if your itemproperty has subproperties (such as subradial spells)
// * bDecrementCharges - decrement charges if item property is limited
void ActionUseItemAtLocation(object oItem, itemproperty ip, location lTarget, int nSubPropertyIndex = 0, int bDecrementCharges = TRUE);
Override hilite colour on objects
You can now override the mouse-over (hilite) colour on objects.
// Sets oObject's hilite color to nColor
// The nColor format is 0xRRGGBB; -1 clears the color override.
void SetObjectHiliteColor(object oObject, int nColor = -1);
Custom mouse cursors
You can now override the mouse cursor a ingame object presents. Additionally, mouse cursors have been unhardcoded, so you can add more via custom content (see MOUSECURSOR_CUSTOM_00).
// Sets the cursor (MOUSECURSOR_*) to use when hovering over oObject
void SetObjectMouseCursor(object oObject, int nCursor = -1);
ProgFX have been unhardcoded
A new 2da, progfx.2da has been added, that links visualeffect.2da columns. This allows for adding additional custom skin effects, beams, MIRVs, etc.
Texture replacements
You can now replace individual textures on objects at runtime
// Replace's oObject's texture sOld with sNew.
// Specifying sNew = "" will restore the original texture.
// If sNew cannot be found, the original texture will be restored.
// sNew must refer to a simple texture, not PLT
void ReplaceObjectTexture(object oObject, string sOld, string sNew = "");
Walk animations have been unhardcoded
You can add new walk anims by naming them `walk_002`, `walk_003`, etc. (001 is walkdead, 002 is hardcoded to walkinj)
Scripted wind management
The game now allows much finer-grained scripted control over the wind data.
// Sets the detailed wind data for oArea
// The predefined values in the toolset are:
// NONE: vDirection=(1.0, 1.0, 0.0), fMagnitude=0.0, fYaw=0.0, fPitch=0.0
// LIGHT: vDirection=(1.0, 1.0, 0.0), fMagnitude=1.0, fYaw=100.0, fPitch=3.0
// HEAVY: vDirection=(1.0, 1.0, 0.0), fMagnitude=2.0, fYaw=150.0, fPitch=5.0
void SetAreaWind(object oArea, vector vDirection, float fMagnitude, float fYaw, float fPitch);
Visual effects can now use PLT textures
Visual effects can now refer to PLT textures. The layer colours/indices are inherited from the object the effect is applied to (such as creatures).
Visual effects can now be scaled, rotated, and translated
When applying a visual effect, you can now scale, rotate and translate it, in relation to the parented object. The script commands have been extended to support this:
effect EffectVisualEffect(int nVisualEffectId, int nMissEffect=FALSE, float fScale=1.0f, vector vTranslate=[0.0,0.0,0.0], vector vRotate=[0.0,0.0,0.0]);
effect EffectBeam(int nBeamVisualEffect, object oEffector, int nBodyPart, int bMissEffect=FALSE, float fScale=1.0f, vector vTranslate=[0.0,0.0,0.0], vector vRotate=[0.0,0.0,0.0]);
Modules and HAKs can now contain more than 16k items
The game can now load more than 16356 resources from ERF containers (modules and haks).
New Configuration UI
The game options UI has been replaced with a new implementation that now allows access to all of the new configuration options. The Debug UI configuration tab has been removed as a consequence. This UI is still work in progress, but it is useful enough to include now in the development patch.
Debug UI has been revamped, including a new NWScript evaluation helper
The debug UI has been rewritten to be leaner and expose more useful features. You can now toggle DebugMode, renderaab, rendertilepathnodes via checkboxes. A new widget has been added that allows evaluating NWScript snippets on the running server (assuming you have DM privileges, or are in DebugMode).
Local variable access has been sped up significantly
Local variable access on objects is now O(n) in the worst case, but usually significantly faster than that. This is especially noticeable when you have thousands of variables on a single object. Previously, this could take up to 500ms to read a single variable; now access is below 10ms in these scenarios.
Art Changes
- TDT01_G02_01,TDT01_G02_01,TDT01_G08_01: Repaired walkmeshes, #46
- Repaired DAG01.set file to NOT offer unsupported height transitions #70
- Eliminated a SQRT Domain error in a couple Treehouse Side Log Tiles (TTF02_B01_02,TTF02_B01_12) #76
- TTF01_G04_05: Fixed bad texture assignment, tweaked alpha for better blending #77
- TTF01_C01_02: Replaced wintery leaf texture from Winter tileset w/ proper Forest texture #77
- TTF01_G01_01: Fixed a typo in TTF01.set which kept minimap from showing up #77
- TCN01_Water01.tga: Increased size to 256x256, cleaned up tiling seams
- TRM02: Recompiled a few tiles throwing SQRT domain errors #72
- TDE01_H07_01: Fixed a bad texture assignment and UV's, added lava spouts to either side of bridge (w/ animloop01 toggle) #122
- TDE01_A08_01: Adjusted lava mesh 0.382cm to eliminate a visible seam with neighboring tiles #117
- PTM_CardTable1: Fixed Bounding Box #109
- TDS01_D07_01: Fixed a SQRT domain error
- Reworked a few creature blueprints to more closely match 3E #95
- Fixed bad collisions in tn_sdoor_04 and tn_sdoor_16
- Repaired city exterior tcn_a11_01
- Compiled 165 more models in tno01
- TNO01_V02_03: Fixed splash VFX on waterfall (back onto its own animloop, waterfall animation still intermittent)
- TWC03_A04_07: Fixed broken/blinking chandelier candle animations
- Repaired bounding box on Candlestick torch; changed light to yellow 5m; repaired mesh and fixed smoke placement #95
- Removed erroneous palette entry from Birds category #107
- Compiled ~200 models (mostly for DODEE)
Miscellaneous Script Commands
The StringToObject() script command can be used as the reverse of ObjectToString().
// Convert sHex, a string containing a hexadecimal object id,
// into a object reference. Counterpart to StringToObject().
object StringToObject(string sHex);
Miscellaneous Improvements
- Texture pack support has been removed. All texture pack content has been merged into nwn_base.key.
- GUI: The bright ambient light has been disabled in UI scenes. This results in a more natural look in chargen and the compass.
- Nui: Windows now store position, size and collapse state in tml
- Nui: Modal windows now autosize to parent
- nwsync: increased check batch size for verifying existing data, dramatically speeding up process
- nwsync: increased local recv buffer size, speeding up transfers on low framerates
- WriteTimestampedLogEntry() now gets sent to all players as a console/debug message, if the server is in DebugMode. This is mostly useful for singleplayer module testing, when the module author uses the game log for debugging.
- ExoConfig: Trap and highlight colors are now stored as hex codes.
- DDS textures now support BC4 and BC5 encodings, to provide higher quality DDS options for greyscale and two-channel textures, such as height or specularity.
- The data build now includes a 2da.zip, containing all 2da files from the build.
Fixes
- Fixed large creatures intruding into your personal space. #124
- Config: The experimental Aggressive Texture Caching option has been removed (it is now on for everyone).
- Sending WriteTimestampedLogEntry messages to clients in DebugMode can now be toggled off with a setting.
- NUI expand/minimize chevrons have been inverted.
- Chat Panes: When in split mode, second chat pane now shows CONSOLE-level messages (debug messages, etc) #18
- Character generation: Spell school strrefs are now actually read from the 2da
- VM: Script situations now always keep a hold of the actual bytecode they are spawned from. This fixes the game doing funny things when the underlying compiled script file is swapped out. This also fixes code closures from within ExecuteScriptChunk (and the Debug UI).
- Store and load TemplateResRef from gff for door object types (so that GetResRef() does not return ). #100
- Dead players now call CNWSArea::DecrementPlayersInArea() #105
- VM::AdjustAlignment(): fixed ALIGNMENT_ALL echoing wrong axis labels #55
- VM::AdjustAlignment(): Game will now render the actual alignment shift that has happened, instead of the requested one: AdjustAlignment(-100) when at 50 will now say "You have shifted by -35" (to get you to 15, where the good/evil notchiness is) instead of "You have shifted by -100" but still putting you to 15.
- VM::AdjustAlignment(): Game will now not render any feedback if no alignment shift occurred (previously, it would render "Your alignment has shifted by -100" if you requested -100, even if you were already at rock bottom).
- Object hilite state is now properly persisted to GFF.
- Fixed the game crashing or reading invalid memory when quickslotting spells as a DM.
- Fixed a crash happening with drag & drop of inventory icons.
- Area transition screens on the client no longer partially render a grey overlay.
- Drag selection rendering in DM client was fixed.
- The nwhak.exe binary has moved into bin/, out of util/.
- Fixed heap overflow in ExoString::Insert (VM::Insert, dm_dumplocals)
- DestroyArea(): no longer skip the last object; this used to leave things in object space attached to nothing
- Movies: search path now prefers userdirectory over install, allowing users to override base movies.
- GUI: Nuklear-based UI now emits sounds when clicking buttons. #5
- GUI: The button Remove Server from Favorites in MP ui has been made to work once again.
- GPU vendor optimisations are now detected automatically; the config key optimize-buffer-updates has been removed.
- ambientmusic.2da: Fixed ids #80
- Fixed a off-by-one issue when adding journal entries.
- VM: A memleak in PostString has been fixed.
Toolset
- Toolset: Fixed bearing not being saved for placeables and doors
- Toolset: texture pack selector was removed.
- Toolset: Removed errant OK label in Area Properties #59
- Toolset: Portrait backgrounds in object properties have been fixed.
- Toolset: Update static lighting after changing tile light properties.
- Toolset: The Bearing float should no longer flap sign when saving out the area gff.
- Toolset: Improved script editor responsiveness as well as save/load module performance.
- Toolset: Area view settings are now applied to all open tabs.
- Toolset: A menu option to toggle AABB rendering was added.
- Toolset: No longer select last-opened module in save UI.
- Toolset: The UI for caching scripts has been removed, as the underlying system has been disabled for a while. It was pointless and counterproductive from a performance standpoint.
- Toolset is now linked to 32bit oal-soft. Hopefully no more sound woes.
Campaigns and Premiums
- Campaign SoU: Fixed the Baby Achievement
- TotM: Small fix for floating placeables in Elmwood
[ 2020-08-07 19:11:38 CET ] [ Original post ]
Hello, everyone! Today, we are shipping patch 8193.13 to the stable branch of the game. This patch is crossplay-compatible with all 8193 game releases, but we recommend upgrading to the newest version to gain access to the latest features! We'd like to thank you, our faithful and patient community, for your help in providing feedback, reporting bugs, and testing our development branch in between!
Fixes
- The .lod file parser now parses files not ending in a newline correctly.
Art
- TNO01_V02_03: Fixed splash VFX on waterfall (not on its own animloop, waterfall animation still intermittent).
- TCN01_E09_01: Bad orientation on meshes caused shifting and blank spots.
- TNO01.SET: Pathfinding, Orientation & Visibility Fixes.
- TN_GDOOR_08: Reverted to original art, addresses non-clickable area transitions at edge of map.
Toolset
- Creature Wizard: remove stray "-1" text #50
- Area tile light color picker no longer shows blank colors #49
- Inventory window now renders icon backgrounds properly #47
Premium
- Tyrants of the Moonsea: Fixed 3 shifted cliff sets (placeables) in Elmwood
Pathfinding
Pathfinding performance has been improved drastically; especially on big areas with a lot of static placeables (up to 90% reduction in CPU time spent on pathing). A new configuration toggle has been added: server.experimental.enhanced-pathfinding; it defaults to on. With this option, combat AI will be much smarter in pathing to their target and thus impact the module experience/difficulty somewhat. We appreciate your feedback on this change. If you need this OFF on your server for whatever reason, just turn this flag off in settings.tml.
Features
- Script errors are now logged to the server log.
- SSAO performance and accuracy has been improved.
- Dynamic contrast performance and accuracy has been improved.
- Depth of field performance and accuracy has been improved. A new configuration value can be used to set the amount in addition to turning it on and off.
- Sharpen performance and accuracy has been improved.
- Visual effects, emitters, lens flares are now subject to post processing.
- CLI nwserver now shows proper help for NWSync-related parameters.
- Framebuffer: View and projection matrices are now accessible properly.
- Framebuffer: Alpha testing on FB effect pass was disabled; fixes background colour appearing erroneously on low alpha.
- Framebuffer: Depth testing was disabled on FB effect pass; fixes background colour appearing erroneously for objects close to screen pane.
- Framebuffer: All lights (static and dynamic) are now enabled for FB effect passes; fixes them not applying to tinted emitters.
- Many more .ini options have been migrated to .tml.
Fixes
- Savegame support for offline NWSync modules has been fixed (by shuffling CURRENTGAME resman priority for NWSync only). Effectively, offline NWSync modules now have a lower HAK priority. HAK priority for non-NWSync games is the same as before.
- VM: SetEventScript properly returns TRUE on success. #9
- VM: SetEventScript no longer crashes when passing in invalid constants.
- VM: GetCampaignVector now properly returns the Z value of stored vectors. #10
- ActivatePortal no longer erroneously shows character selection if a character is sent along. #2
- Chargen now allows lowering stats back under 11 for non-caster primaries. #3
- Texture caching was improved.
- Script/effect timers no longer overflow when the duration is more than a day.
- PostString() strings are no longer hidden when the radial menu opens. #11
- settings.tml is no longer erroneously half-truncated when the game crashes while saving out the file.
- BootPC() no longer crashes the server if called twice on the same player #6
- Fixed textures getting erroneously evicted between module loads #7
- VM: We fixed a memleak in AssignCommand, DelayCommand, ActionDoCommand
- VM: We fixed a memleak when removing effects from objects
- NWSync: We addressed an issue where sqlite3 would fail to open NWSync databases on non-ANSI path names
- Lighting: Light priority selection was improved. Distance/far dynamic lights should no longer override closer - more important - lights. (This can be turned off with the option graphics.experimental.enhanced-light-managing)
- Config: A corner case where server favourites and history was not saved was fixed.
- VM: GetSpellSaveDC now uses the SpellcastingAbility column, instead of the PrimaryMod column. #27
- VM: A pathfinding issue in RandomWalk() was fixed, where calling the function sometimes did nothing.
- VM: PostString() strings are now rendered in sort order.
- A heap buffer read overflow in pathfinding was addressed, that could previously have resulted in some jerky movement when blocked by a door or placeable.
- SSAO fbo: We exorcised some spooky ghosting that manifested when panning the camera.
- [NVIDIA] Toolset: It should no longer be necessary to force threaded optimisation off manually.
- Toolset: Music and Ambient Sounds can now be loaded from ResMan (haks) if listed in the 2da.
- [Linux] Server command line help now includes nwsync-related args.
- Server: We optimised gff validation performance. Even very large character files with lots of local vars should no longer hang needlessly.
- Fixed an issue that were causing custom dynamic race models to always use the human texture variant. #31
- Changed the movie render scale to fit-to-window.
- Fixed renderaabb not showing up properly on all tiles. #43
- Fixed skylight beams (forest sunbeams, etc.) not rendering properly in all cases.
- VM: Fix script commands not properly accessing area UUIDs. #41
- CampaignDB: Fix RetrieveCampaignVector returning zeroed out vectors. #44
- Fixed a heap overflow read when spawning a encounter list.
- Linear filtering on post processing passes has been disabled. This takes care of yet more (subtle) ghosting.
- [Windows] OpenAL: Fix crash when no sound devices are available.
- [Windows] OpenAL: DLL was replaced with OpenAL Soft, fixing launch crashes when OpenAL was not installed.
- [Windows] OpenAL: Address issues with sounds disappearing during long play sessions.
- [Windows] OpenAL: Fix issues with sounds disappearing when too many sounds are playing at the same time.
- VM: DestroyArea() now behaves the same as DestroyObject(): Instead of destroying the area immediately, it schedules it for removal immediately after script exit. This fixes accessing freed memory when destroying an area from an area event.
- VM: GetCasterLevel() now returns 0 for AOEs instead of crashing. #34
- classes.2da: fix not using SpellcastingAbil for non-memorising casters. #39
- [Windows] nwhak.exe: Add support for ktx, ttf, sql, tml, sq3, lod file types.
- [Windows] We fixed settings.tml sometimes not being written out properly.
Toolset
- Access violation when compiling scripts with nested structs has been fixed.
New Script Commands
// Returns the build number of oPlayer (i.e. 8193).
// Returns 0 if the given object isn't a player or did not advertise their build info.
int GetPlayerBuildVersionMajor(object oPlayer);
// Returns the patch revision of oPlayer (i.e. 8).
// Returns 0 if the given object isn't a player or did not advertise their build info.
int GetPlayerBuildVersionMinor(object oPlayer);
Art & Content
- Doors on area edges have been fixed. #13
- TTF01_T13_01, TTF01_S13_01: Fixed torches to work properly w/ Source Lights & w/o glowing meshes, and a campfire emitter that never shut off
- TTF01_P10_01: Restored missing waterfall animation, with an animloop to control it
- TDC01_Q02_01: Restored missing animated meshes from Bioware Source files, and merged them back into the tile
- TWC03_C43_02 (SET File): Set the X-position to 0.0 instead of a negative scientific number
- TNO01_M53_(11-14): Repaired a bad texture assignment, and closed a seam running along two tile edges
- Bad campfire animation on TTF01_T13_01
- Fixed stringy shadows on Driftwoods 1&2, Market Stall 01, Dragon Statue, and Castle Rural tiles TNO01_A06_01, TNO01_B51_02, & TNO01_C01_02
- Driftwood 2, TNO01_A06_01: Fixed Shadows (again)
- Alchemist Apparatus 1 & 2: Shadow, UV, Mesh & Walkmesh fixes
- TN_SDOOR_02 Fixed a broken/missing animation (#26)
- TN_SDOOR_19 Reclassified as Type=Door (#29)
- TNO_V00_09 Fixed ground texture (now set back to Grass) (#25)
- TNO01_Chain01.DDS Cleaned up the alpha channel and texture shape, resized to 2x (512 x 256) (#23)
- TNO01_B70_01 Repaired misplaced geometry (#22)
- TCN01_J17_01 Repaired misplaced geometry, fixed animation to use an animloop (and allow shutdown)
- TTZ01_EDGE.2da Added an entry to accomodate elevated stream with grass (used to show up blank-edged)
- NW_IT_ARMHE007.uti Removed the unnecessary 50 charges for Thieves' Hood (#24)
Premium Modules
- Kingmaker: Missing assets from 1.0 have been restored, including script sources
- Shadow Guard: Script sources are now included
- Witches Wake: Script sources are now included
- Darkness over Daggerford, Tyrants of the Moonsea: New door tiles to replace the Placeable Doors; assorted tile fixes to enable drive-through transitions
- Darkness over Daggerford: Replaced a missing door in the Stronghold
- Darkness over Daggerford: Fixed stringy shadows on the Kocharan model
- Tyrants of the Moonsea: Fixed a bad campfire animation on TTF01_T13_01 (Facelift version)
- Tyrants of the Moonsea: Fixed door with bad orientation in TCM02, as well as Melvaunt Shipyards (Entrance to Resting Place of the Whip)
- Darkness over Daggerford: Fixed a crash with the Kocharan model (only when compiled and spawned via script)
- Tyrants of the Moonsea: Rearranged placeables that shifted and blocked a doorway in Zhentil Keep (when the door was opened).
Toolset
- Removed the warning dialogue that shows when opening a module with haks.
- Added a setting to always open module directories.
- The outdated and unused registry read + warning UI has been purged.
- Conversation editor opening time has been optimised.
- Modules are now sorted alphabetically and the last-opened module is selected by default.
- Modern UI skinning has been enabled.
- The tabbed UI is now on by default.
- Fixed a crash when pasting objects from a closed area.
- Fixed a bug in placeable properties UI where it would open the wrong dialogue file.
[ 2020-05-13 19:31:23 CET ] [ Original post ]
Fixes
- Changed the movie render scale to fit-to-window.
- Fixed renderaabb not showing up properly on all tiles. #43
- Fixed skylight beams (forest sunbeams, etc.) not rendering properly in all cases.
- VM: Fix script commands not properly accessing area UUIDs. #41
- CampaignDB: Fix RetrieveCampaignVector returning zeroed out vectors. #44
- Fixed a heap overflow read when spawning a encounter list.
- Linear filtering on post processing passes has been disabled. This takes care of yet more (subtle) ghosting.
- [Windows] OpenAL: Fix crash when no sound devices are available.
- [Windows] OpenAL: DLL was replaced with OpenAL Soft, fixing launch crashes when OpenAL was not installed.
- [Windows] OpenAL: Address issues with sounds disappearing during long play sessions.
- [Windows] OpenAL: Fix issues with sounds disappearing when too many sounds are playing at the same time.
- VM: DestroyArea() now behaves the same as DestroyObject(): Instead of destroying the area immediately, it schedules it for removal immediately after script exit. This fixes accessing freed memory when destroying an area from an area event.
- VM: GetCasterLevel() now returns 0 for AOEs instead of crashing. #34
- classes.2da: fix not using SpellcastingAbil for non-memorising casters. #39
- [Windows] nwhak.exe: Add support for ktx, ttf, sql, tml, sq3, lod file types.
- [Windows] We fixed settings.tml sometimes not being written out properly.
Toolset
- Removed the warning dialogue that shows when opening a module with haks.
- Added a setting to always open module directories.
- The outdated and unused registry read + warning UI has been purged.
- Conversation editor opening time has been optimised.
- Modules are now sorted alphabetically and the last-opened module is selected by default.
- Modern UI skinning has been enabled.
- The tabbed UI is now on by default.
- Fixed a crash when pasting objects from a closed area.
- Fixed a bug in placeable properties UI where it would open the wrong dialogue file.
Premium
- DoD - Fixed a crash with the Kocharan model (only when compiled and spawned via script)
- Tyrants - Rearranged placeables that shifted and blocked a doorway in Zhentil Keep (when the door was opened).
Art
- Driftwood 2, TNO01_A06_01: Fixed Shadows (again)
- Alchemist Apparatus 1 & 2: Shadow, UV, Mesh & Walkmesh fixes
- TN_SDOOR_02 Fixed a broken/missing animation (#26)
- TN_SDOOR_19 Reclassified as Type=Door (#29)
- TNO_V00_09 Fixed ground texture (now set back to Grass) (#25)
- TNO01_Chain01.DDS Cleaned up the alpha channel and texture shape, resized to 2x (512 x 256) (#23)
- TNO01_B70_01 Repaired misplaced geometry (#22)
- TCN01_J17_01 Repaired misplaced geometry, fixed animation to use an animloop (and allow shutdown)
- TTZ01_EDGE.2da Added an entry to accomodate elevated stream with grass (used to show up blank-edged)
Data
- NW_IT_ARMHE007.uti Removed the unnecessary 50 charges for Thieves' Hood (#24)
[ 2020-05-06 19:14:43 CET ] [ Original post ]
Fixes
- Lighting: Light priority selection was improved. Distance/far dynamic lights should no longer override closer - more important - lights. (This can be turned off with the option graphics.experimental.enhanced-light-managing)
- Config: A corner case where server favourites and history was not saved was fixed.
- VM: GetSpellSaveDC now uses the SpellcastingAbility column, instead of the PrimaryMod column. #27
- VM: A pathfinding issue in RandomWalk() was fixed, where calling the function sometimes did nothing.
- VM: PostString() strings are now rendered in sort order.
- A heap buffer read overflow in pathfinding was addressed, that could previously have resulted in some jerky movement when blocked by a door or placeable.
- SSAO fbo: We exorcised some spooky ghosting that manifested when panning the camera.
- [NVIDIA] Toolset: It should no longer be necessary to force threaded optimisation off manually.
- Toolset: Music and Ambient Sounds can now be loaded from ResMan (haks) if listed in the 2da.
- [Linux] Server command line help now includes nwsync-related args.
- Server: We optimised gff validation performance. Even very large character files with lots of local vars should no longer hang needlessly.
- Fixed an issue that were causing custom dynamic race models to always use the human texture variant. #31
Content Changes
- Bad campfire animation on TTF01_T13_01
- Fixed stringy shadows on Driftwoods 1&2, Market Stall 01, Dragon Statue, and Castle Rural tiles TNO01_A06_01, TNO01_B51_02, & TNO01_C01_02
Premium: Darkness over Daggerford
- Replaced a missing door in the Stronghold
- Fixed stringy shadows on the Kocharan model
Premium: Tyrants of the Moonsea
- Fixed a bad campfire animation on TTF01_T13_01 (Facelift version)
- Fixed door with bad orientation in TCM02, as well as Melvaunt Shipyards (Entrance to Resting Place of the Whip)
[ 2020-04-24 16:46:51 CET ] [ Original post ]
Hello friends, We just released a patch for Dark Dreams of Furiae, the new premium module for Neverwinter Nights: Enhanced Edition from developers at Silverstring Media and Phantom Compass. PATCH DETAILS
- Fixed various faction issues involving the Harasi NPC, which sometimes blocked module progression.
[ 2020-04-22 18:23:47 CET ] [ Original post ]
Pathfinding
Pathfinding performance has been improved drastically; especially on big areas with a lot of static placeables (up to 90% reduction in CPU time spent on pathing). A new configuration toggle has been added: server.experimental.enhanced-pathfinding; it defaults to on. With this option, combat AI will be much smarter in pathing to their target and thus impact the module experience/difficulty somewhat. We appreciate your feedback on this change. If you need this OFF on your server for whatever reason, just turn this flag off in settings.tml.
Features
- Script errors are now logged to the server log.
- SSAO performance and accuracy has been improved.
- Dynamic contrast performance and accuracy has been improved.
- Depth of field performance and accuracy has been improved. A new configuration value can be used to set the amount in addition to turning it on and off.
- Sharpen performance and accuracy has been improved.
- Visual effects, emitters, lens flares are now subject to post processing.
- CLI nwserver now shows proper help for NWSync-related parameters.
- Framebuffer: View and projection matrices are now accessible properly.
- Framebuffer: Alpha testing on FB effect pass was disabled; fixes background colour appearing erroneously on low alpha.
- Framebuffer: Depth testing was disabled on FB effect pass; fixes background colour appearing erroneously for objects close to screen pane.
- Framebuffer: All lights (static and dynamic) are now enabled for FB effect passes; fixes them not applying to tinted emitters.
- Many more .ini options have been migrated to .tml.
Fixes
- Savegame support for offline NWSync modules has been fixed (by shuffling CURRENTGAME resman priority for NWSync only). Effectively, offline NWSync modules now have a lower HAK priority. HAK priority for non-NWSync games is the same as before.
- VM: SetEventScript properly returns TRUE on success. #9
- VM: SetEventScript no longer crashes when passing in invalid constants.
- VM: GetCampaignVector now properly returns the Z value of stored vectors. #10
- ActivatePortal no longer erroneously shows character selection if a character is sent along. #2
- Chargen now allows lowering stats back under 11 for non-caster primaries. #3
- Texture caching was improved.
- Script/effect timers no longer overflow when the duration is more than a day.
- PostString() strings are no longer hidden when the radial menu opens. #11
- settings.tml is no longer erroneously half-truncated when the game crashes while saving out the file.
- BootPC() no longer crashes the server if called twice on the same player #6
- Fixed textures getting erroneously evicted between module loads #7
- VM: We fixed a memleak in AssignCommand, DelayCommand, ActionDoCommand
- VM: We fixed a memleak when removing effects from objects
- NWSync: We addressed an issue where sqlite3 would fail to open NWSync databases on non-ANSI path names
Toolset
- Access violation when compiling scripts with nested structs has been fixed.
New Script Commands
// Returns the build number of oPlayer (i.e. 8193).
// Returns 0 if the given object isn't a player or did not advertise their build info.
int GetPlayerBuildVersionMajor(object oPlayer);
// Returns the patch revision of oPlayer (i.e. 8).
// Returns 0 if the given object isn't a player or did not advertise their build info.
int GetPlayerBuildVersionMinor(object oPlayer);
Tileset Changes
- Doors on area edges have been fixed. #13
- TTF01_T13_01, TTF01_S13_01: Fixed torches to work properly w/ Source Lights & w/o glowing meshes, and a campfire emitter that never shut off
- TTF01_P10_01: Restored missing waterfall animation, with an animloop to control it
- TDC01_Q02_01: Restored missing animated meshes from Bioware Source files, and merged them back into the tile
- TWC03_C43_02 (SET File): Set the X-position to 0.0 instead of a negative scientific number
- TNO01_M53_(11-14): Repaired a bad texture assignment, and closed a seam running along two tile edges
Premium Modules
- Kingmaker: Missing assets from 1.0 have been restored, including script sources
- Shadow Guard: Script sources are now included
- Witches Wake: Script sources are now included
- Darkness over Daggerford, Tyrants of the Moonsea: New door tiles to replace the Placeable Doors; assorted tile fixes to enable drive-through transitions
[ 2020-04-09 15:43:05 CET ] [ Original post ]
Developers at Silverstring Media & Phantom Compass just launched a brand new module for Neverwinter Nights: Enhanced Edition. Dark Dreams of Furiae is a mystery adventure on the edge of hell! Get it now > $4.99 USD
Features
- 10 hours of brand new gameplay for Neverwinter Nights: Enhanced Edition
- Solo and co-play
- Original Music Score
- Takes characters from level 5 to 8
- Time is of the essence: day/night cycle marches on; your choices bring new events
- Daily news sheet adapts to your decisions and gives adventure clues
- Based on the Planescape D&D campaign setting
- Events coincide with official D&D tabletop campaign, Baldur's Gate: Descent into Avernus
Story
Set in the planar city of Furiae on the edge of hell, Dark Dreams of Furiae coincides directly with the official Dungeons & Dragons tabletop campaign, Baldur's Gate: Descent Into Avernus!
Dark Dreams of Furiae:
A City on the Edge of Hell
In the fallen city of Furiae, ruled by devils and despots, a quiet war wages for the hearts and minds of the people. Into this chaos, a new arcane substance is smuggled: worldwine. Worldwine is deadly to devils, and turns mortals into dream-addled fanatics. Fight to save a damned city in this planar mystery adventure
[ 2020-03-24 17:07:56 CET ] [ Original post ]
Looking for a new adventure?
Developers at & Silverstring Media & Phantom Compass just announced a new module for Neverwinter Nights: Enhanced Edition. The Dark Dreams of Furiae DLC is coming soon to Steam, GOG and the Beamdog Store. Wishlist on Steam today!
Features
- 10 hours of brand new gameplay for Neverwinter Nights: Enhanced Edition
- Solo and co-op play
- Original Music Score
- Takes characters from level 5 to 8
- Time is of the essence: day/night cycle marches on; your choices bring new events
- Daily news sheet adapts to your decisions and gives adventure clues
- Based on the Planescape D&D campaign setting
- Events coincide with official D&D tabletop campaign, Baldur's Gate: Descent into Avernus
STORY
Set in the planar city of Furiae on the edge of hell, Dark Dreams of Furiae coincides directly with the official Dungeons & Dragons tabletop campaign, Baldur's Gate: Descent into Avernus! Dark Dreams of Furiae: A City on the Edge of Hell In the fallen city of Furiae, ruled by devils and despots, a quiet war wages for the hearts and minds of the people. Into this chaos, a new arcane substance is smuggled: worldwine. Worldwine is deadly to devils, and turns mortals into dream-addled fanatics. Fight to save a damned city in this planar mystery adventure
[ 2020-03-18 21:37:15 CET ] [ Original post ]
Hello friends, Today we're shipping a hefty new patch for Neverwinter Nights: Enhanced Edition on Windows, macOS and Linux! Huge thanks goes out to our heroic community members who helped test the many features and fixes in previous development patches over the last several months. Read on for details!
Patch Details
- Patch 1.80 (Version 8193.9)
- Contains cumulative features / fixes since Patch 1.79 (version 8193.5)
- For platforms Windows, macOS & Linux, available from Steam, GOG and the Beamdog Store.
New Features
Customise weapons-related feats in baseitems.2da
Weapons-related feats (Focus, Epic Focus, Spec, Epic Spec, Improved Crit, Overwhelming Crit, Devastating Crit, Weapon of Choice) can now be customised on a per-baseitem case. Please refer to baseitems.2da for the new columns: WeaponFocusFeat EpicWeaponFocusFeat WeaponSpecializationFeat EpicWeaponSpecializationFeat WeaponImprovedCriticalFeat EpicWeaponOverwhelmingCriticalFeat EpicWeaponDevastatingCriticalFeat WeaponOfChoiceFeat
Custom weapon visual effects
Weapons can now have custom visual effects (in addition to the stock fire, ice, electricity, etc.) Please refer to the new file iprp_visualfx.2da for details.
Custom spellcaster classes
We've added (somewhat partial) support for custom spellcaster classes by "unhardcoding" a lot of the builtin constants and references. Please refer to classes.2da for the new columns: MemorizesSpells SpellbookRestricted PickDomains PickSchool LearnScroll Arcane ASF SpellcastingAbil SpellTableColumn CLMultiplier MinCastingLevel MinAssociateLevel CanCastSpontaneously Note that not all combinations are valid. We recommend cloning one of the existing caster classes and then start customising from there. When adding spellcasting to new classes, remember to also update existing columns. There is also a new ruleset entry: COMPANION_LEVELS_STACK, defaulting to 0.
Level of Detail
You can now specify LODs via a new file type ".lod". When the game loads the model mymodel.mdl, it will look up mymodel.lod. Inside that file, add the following lines:
mymodel_0
40 mymodel_1
80.5 mymodel_2
The game supports LOD files with up to three levels, as shown above. You may omit the last entry. The first line is the high-resolution model; the other two are meant to be lower-resolution model files, that will be dynamically swapped out as the camera reaches the given distance.
Please note that LODs are highly dependent on the screen resolution of the client. The actual mechanisms here need to still be figured out; but for now, we'd suggest choosing LOD distances as if the user had a 1080p screen. To support other resolutions, there is a configuration slider in the debug settings (Ctrl-Shift-F12, select "Config", key: "graphics.lod.scale-factor") that users can influence LOD distances with.
Animation Slots
The game now supports 50 more custom animation slots (LOOPING_CUSTOM21 -> 70).
Script call to swap out textures on the fly
A new script call was added:
// Makes oPC load texture sNewName instead of sOldName.
// If oPC is OBJECT_INVALID, it will apply the override to all active players
// Setting sNewName to "" will clear the override and revert to original.
void SetTextureOverride(string sOldName, string sNewName = "", object oPC = OBJECT_INVALID);
Changes made through this call will appear immediately on clients.
NWSync
When downloading something via NWSync, disk writes now happen asynchronously while more content is downloaded. This should minimise occurrences of "Waiting On Storage". If this is giving you grief, you can turn it off in settings via the key "nwsync.transfer.flush.async". The NWSync Downloader UI was swapped out with a new version, which is now rendered in Nuklear. It has a fancy graph and a pause button. Finally, the Storage Manager (Options -> NWSync) now has two tabs: Servers, and Modules. Server manifests (i.e. when joining a PW that offers files) show up in the Server tab. The Modules tab will show all singleplayer/offline modules you have downloaded via NWSync. To facilitate this, the Storage Manager UI now can download offline modules for you; however, by default, no remote repositories offering this are added to your game. Stay tuned on the community websites for upcoming download repositories of offline modules! Modules downloaded this way will show up under "Other Modules" when clicking Singleplayer -> New Game.
New Scripting Functions
GetSpecialization(), GetDomain()
int DOMAIN_AIR = 0;
int DOMAIN_ANIMAL = 1;
int DOMAIN_DEATH = 3;
int DOMAIN_DESTRUCTION = 4;
int DOMAIN_EARTH = 5;
int DOMAIN_EVIL = 6;
int DOMAIN_FIRE = 7;
int DOMAIN_GOOD = 8;
int DOMAIN_HEALING = 9;
int DOMAIN_KNOWLEDGE = 10;
int DOMAIN_MAGIC = 13;
int DOMAIN_PLANT = 14;
int DOMAIN_PROTECTION = 15;
int DOMAIN_STRENGTH = 16;
int DOMAIN_SUN = 17;
int DOMAIN_TRAVEL = 18;
int DOMAIN_TRICKERY = 19;
int DOMAIN_WAR = 20;
int DOMAIN_WATER = 21;
// Returns oCreature's spell school specialization in nClass (SPELL_SCHOOL_* constants)
// Unless custom content is used, only Wizards have spell schools
// Returns -1 on error
int GetSpecialization(object oCreature, int nClass = CLASS_TYPE_WIZARD);
// Returns oCreature's domain in nClass (DOMAIN_* constants)
// nDomainIndex - 1 or 2
// Unless custom content is used, only Clerics have domains
// Returns -1 on error
int GetDomain(object oCreature, int nDomainIndex = 1, int nClass = CLASS_TYPE_CLERIC);
PostString()
int SCREEN_ANCHOR_TOP_LEFT = 0;
int SCREEN_ANCHOR_TOP_RIGHT = 1;
int SCREEN_ANCHOR_BOTTOM_LEFT = 2;
int SCREEN_ANCHOR_BOTTOM_RIGHT = 3;
int SCREEN_ANCHOR_CENTER = 4;
// Displays sMsg on oPC's screen.
// The message is displayed on top of whatever is on the screen, including UI elements
// nX, nY - coordinates of the first character to be displayed. The value is in terms
// of character 'slot' relative to the nAnchor anchor point.
// If the number is negative, it is applied from the bottom/right.
// nAnchor - SCREEN_ANCHOR_* constant
// fLife - Duration in seconds until the string disappears.
// nRGBA, nRGBA2 - Colors of the string in 0xRRGGBBAA format. String starts at nRGBA,
// but as it nears end of life, it will slowly blend into nRGBA2.
// nID - Optional ID of a string. If not 0, subsequent calls to PostString will
// remove the old string with the same ID, even if it's lifetime has not elapsed.
// Only positive values are allowed.
// sFont - If specified, use this custom font instead of default console font.
void PostString(object oPC, string sMsg, int nX = 0, int nY = 0, int nAnchor = SCREEN_ANCHOR_TOP_LEFT, float fLife = 10.0f, int nRGBA = 2147418367, int nRGBA2 = 2147418367, int nID = 0, string sFont="");
Performance
Overall game performance has been improved drastically - in some cases, up by 200%. Lower bound performance should be vastly improved, especially on slower hardware.
- Perf optimisation: Timer-related updates with many AI objects.
- Perf optimisation: The config system is now smarter in tracking updates.
- Perf optimisation: Shadows are now much cheaper on the cpu.
- Perf optimisation: Texture units are now managed more efficiently.
- Perf optimisation: Transformation matrix updates have been optimised.
- Perf optimisation: Buffer uploads to the GPU have been made smarter.
- Perf optimisation: Texture caching has been optimised.
- A new renderhint "NormalTangents" was added, that omits checking for specular maps.
- Perf optimisation: nwsync setup and updates now avoid excess memcpys and should be much faster.
Pathfinding
Pathfinding when clicking near objects was improved:
Fixes to Wyvern: Crown of Cormyr
- The module now includes all script sources
- Fixed "horse hat", and "cannot mount, your tail is in the way" issues
- Lucinda's Warhorse sometimes vanished upon creation, in Thunderstone
- Empty joust journal entries now read properly
- Tile repairs (Castle Barrow, end game bridge, a couple odds & ends)
- Soundset.2da conflicts with Heros of Neverwinter fixed
- Realigned all horse and snake blue prints to use proper soundsets
- Removed duplicate/conflicting SET, ITP, 2DA and TGA files
- Lifted a Z-fighting prop in Jousting Grounds
- Replaced missing doors in Polter's Fort (Lower/Upper)
- Fixed broken transition between Wyvernwater Castle Stables and Wyvernwater Castle
Fixes to Pirates Of The Sword Coast
- The module now includes all script sources
- Eliminated content from haks duplicated in XP3.bif, merged 2DA's where possible
- Performance fixes for PotSC-Exclusive tiles (TCN01)
- Fixed a few cases where henchmen could go hostile in cutscenes and break the game
Misc
- Module compatibility has been bumped to 1.80.
- ResMan can now use more than 256MB of memory for caching. There is a configuration option to specify the percentage of detected physical memory that ResMan can use. Additionally, new defaults in place will avoid I/O churn, resulting in vastly improved performance in complex scenes.
- [Windows] We fixed large strings, such as chat logs, disappearing if they exceed 1024 characters.
- We addressed an issue where models/resources would leak over when hopping servers, sometimes resulting in a crash.
- We updated the crash reporter text and URL.
- The data build has been updated, containing the mentioned tileset fixes (ovr/ has been cleaned out into the keyfiles as well, in case you were wondering).
- ruleset.2da now exposes the following chargen-related constants: CHARGEN_ENABLED_PHENOTYPES, CHARGEN_ABILITY_COST_INCREMENT2, CHARGEN_ABILITY_COST_INCREMENT3, CHARGEN_ABILITY_COST_INCREMENT4, CHARGEN_BASE_ABILITY_MIN, CHARGEN_BASE_ABILITY_MIN_PRIMARY, CHARGEN_BASE_ABILITY_MAX, CHARGEN_ABILITY_NEUTRAL_VALUE, CHARGEN_ABILITY_MODIFIER_INCREMENT, CHARGEN_SKILL_MAX_LEVEL_1_BONUS
- Chargen combinations with any domain, school, spell, and companion should now work fine.
- Radial subspell count has been upped to 8 (from 5).
- Chargen now allows customisation of class, race, gender, and alignment starting clothes (chargenclothes.2da).
- We fixed cls_stat_ tables erroneously being read off by one when validating characters.
- [Windows] We fixed fullscreen resolution not being detected on first start.
- We fixed Creature and Heartbeat logging settings being conflated.
- We fixed GetCasterLevel() on AOEs/SLAs erroneously invalid values.
- We fixed Linux Steam CD key provisioning.
- Fixed tile path nodes not showing up.
- We fixed ground triggers disappearing or losing tint.
- Lighting oddities in GUI scenes with some advanced shader mechanisms have been addressed.
- The premium module Wyvern: Crown Of Cormyr no longer crashes the game.
- The GetDurationRemaining-like script calls now work properly when the duration is longer than one day.
- The game now defaults to fullscreen on all platforms except MacOS.
- [Mac] Screen Edge Camera Turning when using the MacOS builtin maximise works again.
- CopyObject() with a new tag specified no longer erroneously adds the object to the old tag lookup.
- The player name is now properly sent to the server even if the Remember checkbox is not checked.
- racialtypes.2da no longer divides by zero when the FeatPerLevel columns are 0.
- The lightning flash model was resized to full even large screens.
- pregen.2da now contains all builtin bics so they don't litter the character selection anymore.
- The parameter +password on the command line was fixed.
- Human female PLT textures now fall back to male if missing.
- Intro movies now again play correctly.
- Windows server now shows and advertises the patch revision.
- The NWSync Downloader now shows a more verbose error if it is unavailable.
- A crash in chargen when adding more lines to skills.2da has been fixed.
- A rare nullptr dereference when adding unknown party members has been fixed.
- ActivatePortal() now properly uses relays if needed.
- Learn Scroll no longer hangs the server.
- ELC for Sorcerer and Bards with too many spells has been fixed.
- Class IDs > 15 now get spells in the radial.
- Support for >17 bones.
- When reading configuration variables, 't' and 'true' are now valid trueish.
- When reading configuration environment override variables, . and - are now replaced with _.
- Spells in the spellbook are now sorted (alphabetically). You can turn this off in settings.tml: ui.spellbook.sort-spells
- New ruleset.2da toggle: ALLOW_CUSTOM_PORTRAITS (in chargen)
Fixes
- The priorities of userpatch, modules, haks, and override have been restored.
- We fixed a shader issue that would result in illumination appearing on content that was intended to be black (e.g. the tile borders in the Dungeon tileset).
- We fixed mipmaps not being generated for non-compressed textures.
Toolset
- Toolset now allows selection of heads from custom slots 50-99.
- The up and down arrow keys for Adjust Position now progress in perfect sequence.
- We fixed a bug where double-clicking on an area entry could cause parts of the toolbar to grey out.
- We fixed a truncation issue when using search & replace in the script editor.
- You can now add a NAME CExoString field to your custom tileset palettes, instead of having to put a STRREF.
- Object descriptions over 2000 characters long are no longer truncated.
- The toolset no longer crashes when moving the start location between areas open in multiple tabs.
- A group of raised objects now retains their z-level when moved.
- The script editor no longer freezes when trying to compile **/**.
- Shield equipping logic in the creature editor was fixed.
Tileset changes
- Collision (250+) Added necessary spacing for "drive-through" transitions, and fixed faulty walkmeshes
- Lighting (150+) Fixed lights with improper flags set, for performance.
- Emitters & Animations (150+) Tiles with bad settings on emitters, and improper animation sequences, were fixed
- All doors in game (192) checked for animations, transitions, collision. Transition meshes changed to reflect door art.
- Over 850 optimization and beauty fixes for Castle Exterior, Rural set imported from the Tyrants of the Moonsea premium module
- Major pathfinding fixes for Castle Exterior, Rural
- A handful of new doors to fit the tile art better
- A new "Doorcap, Interior" Feature Tile for TNI02 and TNI01, to allow drive-through transitions for doors placed on very edges of areas
- Doors with improper orientation arrows were fixed where discovered, as well as negative values in the SET files
- Off-height and blocking walkmeshes fixed for bridges in Sea Caverns and Steamworks sets
- Repaired 2 TNO01 tiles for SQRT Error
- Repaired the 2x2 smithy in TNI01, and made the DoorCap, interior a unique tile
- Fixed a shadow leak in the hobgoblin head model (seen in WCoC intro cutscene)
- Performance fixes for TCN01 (stock assets)
- Fixed a blocky water VFX on a TCN01 Temple's fountain (TCN01_W03_01)
- Fixed blocky smoke on a couple forest campfires (TTF01_T13_01 and TTF01_S16_01)
- Repaired a few reported broken walkmeshes, in various sets
- Fixed a regression in 2 water tiles, appearing in Blacklake District et.al.
[ 2020-03-17 16:36:31 CET ] [ Original post ]
Greetings! Patch 8193.8 on the Development branch fixes all known regressions introduced by .7; and brings in some neat, new features for you to play with. Please help us test it and report any bugs you find!
Improvements
- Spells in the spellbook are now sorted (alphabetically). You can turn this off in settings.tml: ui.spellbook.sort-spells
- New ruleset.2da toggle: ALLOW_CUSTOM_PORTRAITS (in chargen)
- Pathfinding when clicking near objects was improved:
Fixes
- "No preparations left" spell cast issues were addressed.
- Fixed casting spells from some cleric domains.
- Fixed assigned spells in the UI losing metamagic or spontaneous flags.
- We fixed players losing the party or party members.
- Players can now, once again, finish chargen with customised packages.
- We fixed non-english languages missing some voices and sound effects.
New Scripting Functions
GetSpecialization(), GetDomain()
int DOMAIN_AIR = 0;
int DOMAIN_ANIMAL = 1;
int DOMAIN_DEATH = 3;
int DOMAIN_DESTRUCTION = 4;
int DOMAIN_EARTH = 5;
int DOMAIN_EVIL = 6;
int DOMAIN_FIRE = 7;
int DOMAIN_GOOD = 8;
int DOMAIN_HEALING = 9;
int DOMAIN_KNOWLEDGE = 10;
int DOMAIN_MAGIC = 13;
int DOMAIN_PLANT = 14;
int DOMAIN_PROTECTION = 15;
int DOMAIN_STRENGTH = 16;
int DOMAIN_SUN = 17;
int DOMAIN_TRAVEL = 18;
int DOMAIN_TRICKERY = 19;
int DOMAIN_WAR = 20;
int DOMAIN_WATER = 21;
// Returns oCreature's spell school specialization in nClass (SPELL_SCHOOL_* constants)
// Unless custom content is used, only Wizards have spell schools
// Returns -1 on error
int GetSpecialization(object oCreature, int nClass = CLASS_TYPE_WIZARD);
// Returns oCreature's domain in nClass (DOMAIN_* constants)
// nDomainIndex - 1 or 2
// Unless custom content is used, only Clerics have domains
// Returns -1 on error
int GetDomain(object oCreature, int nDomainIndex = 1, int nClass = CLASS_TYPE_CLERIC);
PostString()
int SCREEN_ANCHOR_TOP_LEFT = 0;
int SCREEN_ANCHOR_TOP_RIGHT = 1;
int SCREEN_ANCHOR_BOTTOM_LEFT = 2;
int SCREEN_ANCHOR_BOTTOM_RIGHT = 3;
int SCREEN_ANCHOR_CENTER = 4;
// Displays sMsg on oPC's screen.
// The message is displayed on top of whatever is on the screen, including UI elements
// nX, nY - coordinates of the first character to be displayed. The value is in terms
// of character 'slot' relative to the nAnchor anchor point.
// If the number is negative, it is applied from the bottom/right.
// nAnchor - SCREEN_ANCHOR_* constant
// fLife - Duration in seconds until the string disappears.
// nRGBA, nRGBA2 - Colors of the string in 0xRRGGBBAA format. String starts at nRGBA,
// but as it nears end of life, it will slowly blend into nRGBA2.
// nID - Optional ID of a string. If not 0, subsequent calls to PostString will
// remove the old string with the same ID, even if it's lifetime has not elapsed.
// Only positive values are allowed.
// sFont - If specified, use this custom font instead of default console font.
void PostString(object oPC, string sMsg, int nX = 0, int nY = 0, int nAnchor = SCREEN_ANCHOR_TOP_LEFT, float fLife = 10.0f, int nRGBA = 2147418367, int nRGBA2 = 2147418367, int nID = 0, string sFont="");
Fixes to Wyvern: Crown of Cormyr
- The module now includes all script sources
- Fixed "horse hat", and "cannot mount, your tail is in the way" issues
- Lucinda's Warhorse sometimes vanished upon creation, in Thunderstone
- Empty joust journal entries now read properly
- Tile repairs (Castle Barrow, end game bridge, a couple odds & ends)
- Soundset.2da conflicts with Heros of Neverwinter fixed
- Realigned all horse and snake blue prints to use proper soundsets
- Removed duplicate/conflicting SET, ITP, 2DA and TGA files
- Lifted a Z-fighting prop in Jousting Grounds
- Replaced missing doors in Polter's Fort (Lower/Upper)
- Fixed broken transition between Wyvernwater Castle Stables and Wyvernwater Castle
Fixes to Pirates Of The Sword Coast
- The module now includes all script sources
- Eliminated content from haks duplicated in XP3.bif, merged 2DA's where possible
- Performance fixes for PotSC-Exclusive tiles (TCN01)
- Fixed a few cases where henchmen could go hostile in cutscenes and break the game
Tileset changes
- Off-height and blocking walkmeshes fixed for bridges in Sea Caverns and Steamworks sets
- Repaired 2 TNO01 tiles for SQRT Error
- Repaired the 2x2 smithy in TNI01, and made the DoorCap, interior a unique tile
- Fixed a shadow leak in the hobgoblin head model (seen in WCoC intro cutscene)
- Performance fixes for TCN01 (stock assets)
- Fixed a blocky water VFX on a TCN01 Temple's fountain (TCN01_W03_01)
- Fixed blocky smoke on a couple forest campfires (TTF01_T13_01 and TTF01_S16_01)
- Repaired a few reported broken walkmeshes, in various sets
[ 2020-03-10 18:50:51 CET ] [ Original post ]
Hello, friends. This development patch brings NWN:EE to version 8193.7. You can crossplay on all 8193 servers, as well as with friends on the same major version! We appreciate any and all testing on this! Tileset changes
- Collision (250+) Added necessary spacing for "drive-through" transitions, and fixed faulty walkmeshes
- Lighting (150+) Fixed lights with improper flags set, for performance.
- Emitters & Animations (150+) Tiles with bad settings on emitters, and improper animation sequences, were fixed
- All doors in game (192) checked for animations, transitions, collision. Transition meshes changed to reflect door art.
- Over 850 optimization and beauty fixes for Castle Exterior, Rural set imported from the Tyrants of the Moonsea premium module
- Major pathfinding fixes for Castle Exterior, Rural
- A handful of new doors to fit the tile art better
- A new "Doorcap, Interior" Feature Tile for TNI02 and TNI01, to allow drive-through transitions for doors placed on very edges of areas
- Doors with improper orientation arrows were fixed where discovered, as well as negative values in the SET files
- The data build has been updated, containing the above-mentioned tileset fixes (ovr/ has been cleaned out into the keyfiles as well, in case you were wondering).
- ruleset.2da now exposes the following chargen-related constants: CHARGEN_ENABLED_PHENOTYPES, CHARGEN_ABILITY_COST_INCREMENT2, CHARGEN_ABILITY_COST_INCREMENT3, CHARGEN_ABILITY_COST_INCREMENT4, CHARGEN_BASE_ABILITY_MIN, CHARGEN_BASE_ABILITY_MIN_PRIMARY, CHARGEN_BASE_ABILITY_MAX, CHARGEN_ABILITY_NEUTRAL_VALUE, CHARGEN_ABILITY_MODIFIER_INCREMENT, CHARGEN_SKILL_MAX_LEVEL_1_BONUS
- Chargen combinations with any domain, school, spell, and companion should now work fine.
- Radial subspell count has been upped to 8 (from 5).
- Chargen now allows customisation of class, race, gender, and alignment starting clothes (chargenclothes.2da).
- Perf optimisation: Timer-related updates with many AI objects.
- Perf optimisation: The config system is now smarter in tracking updates.
- Perf optimisation: Shadows are now much cheaper on the cpu.
- Perf optimisation: Texture units are now managed more efficiently.
- Perf optimisation: Transformation matrix updates have been optimised.
- Perf optimisation: Buffer uploads to the GPU have been made smarter.
- Perf optimisation: Texture caching has been optimised.
- A new renderhint "NormalTangents" was added, that omits checking for specular maps.
- Perf optimisation: nwsync setup and updates now avoid excess memcpys and should be much faster.
- We fixed cls_stat_ tables erroneously being read off by one when validating characters.
- [Windows] We fixed fullscreen resolution not being detected on first start.
- We fixed Creature and Heartbeat logging settings being conflated.
- We fixed GetCasterLevel() on AOEs/SLAs erroneously invalid values.
- We fixed Linux Steam CD key provisioning.
- Fixed tile path nodes not showing up.
- We fixed ground triggers disappearing or losing tint.
- Lighting oddities in GUI scenes with some advanced shader mechanisms have been addressed.
- WCOC no longer crashes the game.
- The GetDurationRemaining-like script calls now work properly when the duration is longer than one day.
- The game now defaults to fullscreen on all platforms except MacOS.
- [Mac] Screen Edge Camera Turning when using the MacOS builtin maximise works again.
- CopyObject() with a new tag specified no longer erroneously adds the object to the old tag lookup.
- The player name is now properly sent to the server even if the Remember checkbox is not checked.
- racialtypes.2da no longer divides by zero when the FeatPerLevel columns are 0.
- The lightning flash model was resized to full even large screens.
- pregen.2da now contains all builtin bics so they don't litter the character selection anymore.
- The parameter +password on the command line was fixed.
- Human female PLT textures now fall back to male if missing.
- Intro movies now again play correctly.
- Windows server now shows the patch revision (.7).
- The NWSync Downloader now shows a more verbose error if it is unavailable.
- A crash in chargen when adding more lines to skills.2da has been fixed.
- A rare nullptr dereference when adding unknown party members has been fixed.
- ActivatePortal() now properly uses relays if needed.
- Learn Scroll no longer hangs the server.
- ELC for Sorcerer and Bards with too many spells has been fixed.
- Class IDs > 15 now get spells in the radial.
- Support for >17 bones.
- When reading configuration variables, 't' and 'true' are now valid trueish.
- Custom weapon visual effects are no longer off by one in the 2da.
- When reading configuration environment override variables, . and - are now replaced with _.
- Custom tokens are no longer erroneously cleared when reloading a module.
- The script editor no longer freezes when trying to compile **/**.
- Shield equipping logic in the creature editor was fixed.
[ 2020-02-27 18:45:30 CET ] [ Original post ]
Happy New Year, friends! Were kicking off 2020 with a brand new development patch for you to play with! Development Patch 8193.6 focuses on creation for both single player and multiplayer. This dev patch is best suited for our content creator community, as it requires technical knowledge of our toolsets (and a willingness to endure a few issues). We hope you have some fun breaking these features fair warning: were expecting there to be some outstanding bugs in this build. This patch is network-compatible with all other 8193 releases; however, new features will not work when the patch revision differs (and characters may fail to pass ELC). Check out the full patch notes below! All the best, - Beamdog NWNEE Team
Customise weapons-related feats in baseitems.2da
Weapons-related feats (Focus, Epic Focus, Spec, Epic Spec, Improved Crit, Overwhelming Crit, Devastating Crit, Weapon of Choice) can now be customised on a per-baseitem case. Please refer to baseitems.2da for the new columns: WeaponFocusFeat EpicWeaponFocusFeat WeaponSpecializationFeat EpicWeaponSpecializationFeat WeaponImprovedCriticalFeat EpicWeaponOverwhelmingCriticalFeat EpicWeaponDevastatingCriticalFeat WeaponOfChoiceFeat
Custom weapon visual effects
Weapons can now have custom visual effects (in addition to the stock fire, ice, electricity, etc.) Please refer to the new file iprp_visualfx.2da for details.
Custom spellcaster classes
We've added (somewhat partial) support for custom spellcaster classes by "unhardcoding" a lot of the builtin constants and references. Please refer to classes.2da for the new columns: MemorizesSpells SpellbookRestricted PickDomains PickSchool LearnScroll Arcane ASF SpellcastingAbil SpellTableColumn CLMultiplier MinCastingLevel MinAssociateLevel CanCastSpontaneously Note that not all combinations are valid. We recommend cloning one of the existing caster classes and then start customising from there. When adding spellcasting to new classes, remember to also update existing columns. There is also a new ruleset entry: COMPANION_LEVELS_STACK, defaulting to 0.
Level of Detail
You can now specify LODs via a new file type ".lod". When the game loads the model mymodel.mdl, it will look up mymodel.lod. Inside that file, add the following lines:
mymodel_0
40 mymodel_1
80.5 mymodel_2
The game supports LOD files with up to three levels, as shown above. You may omit the last entry. The first line is the high-resolution model; the other two are meant to be lower-resolution model files, that will be dynamically swapped out as the camera reaches the given distance.
Please note that LODs are highly dependent on the screen resolution of the client. The actual mechanisms here need to still be figured out; but for now, we'd suggest choosing LOD distances as if the user had a 1080p screen. To support other resolutions, there is a configuration slider in the debug settings (Ctrl-Shift-F12, select "Config", key: "graphics.lod.scale-factor") that users can influence LOD distances with.
Animation Slots
The game now supports 50 more custom animation slots (LOOPING_CUSTOM21 -> 70).
Script call to swap out textures on the fly
A new script call was added:
// Makes oPC load texture sNewName instead of sOldName.
// If oPC is OBJECT_INVALID, it will apply the override to all active players
// Setting sNewName to "" will clear the override and revert to original.
void SetTextureOverride(string sOldName, string sNewName = "", object oPC = OBJECT_INVALID);
Changes made through this call will appear immediately on clients.
NWSync
When downloading something via NWSync, disk writes now happen asynchronously while more content is downloaded. This should minimise occurrences of "Waiting On Storage". If this is giving you grief, you can turn it off in settings via the key "nwsync.transfer.flush.async". The NWSync Downloader UI was swapped out with a new version, which is now rendered in Nuklear. It has a fancy graph and a pause button. Finally, the Storage Manager (Options -> NWSync) now has two tabs: Servers, and Modules. Server manifests (i.e. when joining a PW that offers files) show up in the Server tab. The Modules tab will show all singleplayer/offline modules you have downloaded via NWSync. To facilitate this, the Storage Manager UI now can download offline modules for you; however, by default, no remote repositories offering this are added to your game. To add a remote repository, add the following lines to your settings.tml (right at the top is fine, the game will sort them in properly on next launch):
[[nwsync.downloader.repositories]]
name = "NWVault"
url = "http://sync.neverwintervault.org/"
To actually generate a repository of your own that can offer singleplayer modules for download, you need to generate NWSync manifests that have module contents in them (nwsync_write --with-module --group-id N ...). Finally, add all manifests into a big json array in modules.json in the repository root (the nwsync_write tooling will update soon to do this for you). See the sample repository if it is unclear.
Modules downloaded this way will show up under "Other Modules" when clicking Singleplayer -> New Game.
Texture Binding
There is a new, experimental, texture caching system in place that will speed up GL texture binding, depending on your hardware (especially if you are CPU-bound). It is enabled by default, but you can turn it off via the config flag graphics.experimental.aggressive-texture-caching, if it turns out to have issues. We have seen - depending on scene complexity and the amount of texture maps in use - dramatic performance improvements. We'd appreciate feedback on this.
Shader Issues
We fixed a shader issue that would result in illumination appearing on content that was intended to be black (e.g. the tile borders in the Dungeon tileset).
Texture Issues
We fixed mipmaps not being generated for non-compressed textures.
ResMan
ResMan can now use more than 256MB of memory for caching. There is a configuration option to specify the percentage of detected physical memory that ResMan can use. Additionally, new defaults in place will avoid I/O churn, resulting in vastly improved performance in complex scenes.
ResMan Priorities
The priorities of userpatch, modules, haks, and override have been restored.
Toolset
- Toolset now allows selection of heads from custom slots 50-99.
- The up and down arrow keys for Adjust Position now progress in perfect sequence.
- We fixed a bug where double-clicking on an area entry could cause parts of the toolbar to grey out.
- We fixed a truncation issue when using search & replace in the script editor.
- You can now add a NAME CExoString field to your custom tileset palettes, instead of having to put a STRREF.
- Object descriptions over 2000 characters long are no longer truncated.
- The toolset no longer crashes when moving the start location between areas open in multiple tabs.
- A group of raised objects now retains their z-level when moved.
Miscellanea
- [Windows] We fixed large strings, such as chat logs, disappearing if they exceed 1024 characters.
- We addressed an issue where models/resources would leak over when hopping servers, sometimes resulting in a crash.
- We updated the crash reporter text and URL.
Have a great start into 2020!
[ 2020-01-13 23:45:10 CET ] [ Original post ]
Hello everyone! We'd like to wish you a relaxing holiday season with dear ones, and the time to do the things you love most as you ring in a brand new year. See you in 2020!
Fixes
- We restored ResMan priority behavior with regards to haks vs. modules.
- We fixed CopyObject not duplicating a item if the target inventory or location was not valid.
- The toolset no longer truncates Description and Comments fields.
- A potential crash fix inside the HTTP library when running NWSync repeatedly.
- The ResMan debug UI has gained a few more buttons to help custom content authors.
- There is a new resman configuration option to log failed resource lookups.
- We fixed a bug where in singleplayer, the 2da cache would not clear properly between module runs with differing custom content.
- Object hilite state and colors is now configurable - clientside - in settings.tml.
[ 2019-12-19 18:48:02 CET ] [ Original post ]
8193.4 contains small, incremental fixes to the stable branch! Thank you all for reporting these issues. We know there are remaining open problems - we'll get to them in future incremental patches.
Fixes
- We fixed a thread race in the game client when receiving network packets on the builtin server, resulting in issues connecting to local servers.
- We fixed the configuration option server.restore-spell-uses-on-login.
- Palemaster natural AC progression has been restored to what it should be (it was off by one level after 4).
- The script call ActivatePortal() has been fixed to no longer show Cryptographic Handshake Error.
- A small memory issue in RESREF handling was addressed, that could occasionally crash clients when transitioning via ActivatePortal().
- The toolset will no longer try to deallocate the starting location when closing an area that does not have it.
[ 2019-12-13 17:39:22 CET ] [ Original post ]
Hello, again! Today we are shipping 8193.3 to the stable branch. This update includes all of the changes contained in 8193.1 and 8193.2!
Fixes
- Toolset sound and ambient music has been raised from the dead.
[ 2019-12-10 16:09:36 CET ] [ Original post ]
Greetings! We're fixing some more things in this minor update to 8193.1. Again, this release is (mostly) compatible with the current stable release, 8193. Please test it thoroughly and report issues to us; as this is intended to replace 8193 on stable very soon.
Fixes
- Yet another fix to CampaignDB, where it incorrectly imported records marked as deleted. We would suggest re-running the campaigndb import if you are facing problems because of this.
- A fix to CampaignDB where it emitted (harmless but confusing) error messages about empty strings and objects being imported.
- The game now remembers fullscreen mode when toggling via Alt-Enter.
- The game now remembers window position and size separately for for fullscreen and windowed mode.
- When toggling out of borderless window mode, the window decorations (title bar) no longer become invisible.
- On MacOS only, fullscreen mode now defaults to borderless instead of exclusive. There is now a configuration key ("graphics.window.fullscreen.toggle-to-borderless") to affect this if you do not like the default.
- NWSync: The "nwsync" directory is now being created properly.
- NWSync: The UI will not crash the game when NWSync had failed to initialise. In addition, it will show the initialisation error in the UI if one is available.
- NWSync: The UI now properly shows the Close button and an advisory message when nothing had been downloaded yet.
- Debug UI: Toggling it via Ctrl-Shift-F12 will now be remembered across game restarts.
- Debug Ui: The Config tree gained a text search.
- The "development" alias now works on dedicated servers too.
- The crashiness in all the premium modules should be fixed.
[ 2019-12-09 18:51:38 CET ] [ Original post ]
Hello everyone. This build is a hotfix for 8193, which has shipped on Monday to the stable branch. You can play on non-hotfixed 8193 servers with this, and you can update your server to this build and players on the current stable branch will still be able to connect, though some ELC issues may unfortunately present on chargen. A NWNX build will be available momentarily. We would like to encourage you to test this build, so that it can migrate to stable in a timely manner!
Fixes
- We fixed the toolset build.
- A serious issue in CampaignDB has been fixed where it incorrectly imported floating point values.
- CopyObject with a new, different tag will not stack into existing items anymore.
- The NWSync UI in Options now closes properly when clicking X.
- A crash when running CampaignDB migrations has been fixed.
- CampaignDB migrations will no longer overwrite values already in sqlite3.
- The game language is now taken from Steam as intended. To facilitate this, the previous configuration value "game.language" has been superseded by "game.language.override", which defaults to "". You can still set a value there to override what Steam offers, or when you run the game outside of Steam.
- Class Stat Gain: We fixed RDD not passing ELC.
- Class Stat Gain: We fixed feat perquisites not being met due to class stat gain abilities.
- Class Stat Gain: We fixed the NWScript function GetAbilityScore() not including glass stat gain abilities when calculating the return value.
- Class Stat Gain: Adjusted abilities are now rendered in character selection.
- Class Stat Gain: We fixed CON sourced from statgain not increasing hitpoints in some cases.
- Class Stat Gain: Same for Natural AC bonus.
- Class Stat Gain: Setting ability changes on Level 1 now works properly.
- Class Stat Gain: Strength Damage Bonus calculation now shows up in the combat info part of the charsheet.
- Class Stat Gain: Class modifier is now rendered in the Ability text field on levelup.
- Class Stat Gain: Skill validation on levelup has been fixed.
- Class Stat Gain: Spell availability will now take statgain into account.
- Class Stat Gain: Bonus spells will now take statgain into account.
- The checkbox "Enable Dialog Zoom" now actually does what it advertises.
- The server autosave interval in the Advanced Server Options now works.
- The Tile Fade UI buttons have been fixed to properly select, save and restore configuration.
- We fixed the difficulty slider sometimes not saving properly when clicking OK.
Known Issues
- The Infinite Dungeons premium module is a bit crashy.
- The Wyvern Crown Of Cormyr premium is missing some new art that makes it unplayable.
- CopyObject on a henchman makes the copy be hostile.
- Keyholing does not affect visual-transformed placeables.
- Some game installs fail to create the "nwsync" directory in Documents/Neverwinter Nights. If you are facing that issue, simply create it manually for now.
- Game windowed/fullscreen behaviour is not optimal. For now, to switch into Fullscreen, you can try one of the following: Edit settings.tml and set "graphics.window.mode" to "exclusive"; or press Ctrl-Shift-F12, click Config, and find and select the window-mode option, then click Commit at the top.
[ 2019-12-06 16:43:31 CET ] [ Original post ]
The new patch for #NeverwinterNights: Enhanced Edition on PC (1.79) is finally here! Thanks to our amazing community for your patience.
Check out the list of improvements, including bug fixes, 64bit support, achievements, keyholing, toolset updates & more in our patch notes below.
This patch also brings crossplay compatibility with Nintendo Switch and Xbox One!
Major Features
-=-=-=-=-=-=-=
* Both client and server are now 64bit binaries. We do not provide 32bit binaries anymore as of this patch. (The binary directories in the game install are now misnamed; we didn't change this yet but will in a future patch.)
* CodeBase (Bioware Campaign Database) has been replaced with sqlite3, as the old database code would not work when compiled with a 64bit compiler. All new database files end up in the database/ directory in your user home. They have the extension .sqlite3. Old database files will be imported once at module startup.
* Achievements have been added to the Steam release. These are the same as have been available on Android for a while. There is a Debug UI panel that allows you to clear previously-achieved achievements if youd like to start fresh.
* A new configuration system has been put in place. Most client and server config is now stored in a file called settings.tml, instead of nwn and nwnplayer ini.
* We're changing how networking is done in NWN:EE, with the following benefits: Cryptographic server and client identity authentication; full network encryption to prevent traffic snooping - and in the case of public servers via the master, connection hijacking; floating connections (you might be able to IP/port-hop and retain your connection); better use of compression; and no more host/port confusion when connecting multiple times from behind the same LAN.
* Networking/Crypto: Servers can now have fixed identities that persist between restarts. This identity is stored in a file named cryptographic_secret in the user home. Leaking this identity allows others to impersonate your server, much in the same way as leaking a private CD key. Favourites and History storage will now use server identities if available, so that floating IP/port servers can be found again easily.
* We ported keyholing from Android. It is turned ON by default, but can be turned off with a console command (KeyholeToggle) or the configuration setting. There are also bindable keys.
* New main menu background art. (Also configurable in settings.tml)
* A management UI for NWSync was added to the Options dialog. It allows players to remove downloaded data they dont want anymore.
* New script calls (see below).
Further Features
-=-=-=-=-=-=-=-=
* Shaders now support #include. Use with care: It's not a real preprocessor, just a verbatim string replace.
* NWSync now cleans up downloaded manifest mappings when getting updates from known servers. It will not remove unreferenced data yet (as desktop users might not want to lose it), but that will come next.
* NWSync will automatically reconnect you to the server if you are still around after the download finishes (based on keyboard/mouse input detection).
* A debug UI for advanced users to showcase experimental new features and UI scenes has been implemented (Ctrl+Shift+F12 to access).
* A lot of new configuration keys have been added, too numerous to list here.
Configuration will be imported from ini files. Once imported, the .ini will not be written anymore (but left in place in case you want to go back to a previous build).
All configuration keys can be overridden via ENV variables (useful for automated server setups), like so: NWN_CONFIG_SET_key, where key is the fully-qualified configuration key.
Some configuration still remains in .ini files; these will be migrated as we go along.
The .tml file is in TOML format and has a full schema embedded for better introspection and tool-based editing.
The debug UI offers access to the full new configuration system.
* The game now defaults to windowed mode (instead of exclusive fullscreen) on new installs.
* The game will now remember the window position between restarts when in windowed mode.
* A simple frame limiter has been added, which can be used to reduce CPU/GPU usage on battery-constrained devices. It is accessible through the Debug UI as explained below.
* Walking/Running with shift held down is now an invertible config toggle. This is also accessible through the Debug UI.
* NWSync now automatically purges outdated server manifests, removing stale and unneeded data. Manifests are considered outdated if they are coming from the same server URL and carry the same group_id (see NWSync documentation).
* NWSync can now download offline modules from preconfigured servers. This is a experimental feature and only accessible via the Debug UI, and requires adding a specially-prepared repository.
* The debug UI offers to purge unwanted nwsync manifests and all associated data. This will eventually be turned into a more user-friendly UI.
* Music and ambient sounds are now loaded through ResMan and can thus be in hak and nwsync.
* The game will now read plain mp3 files (the .bmu extension rename is still required, because this extension is used in all existing resources/haks).
* The game user home (i.e. Documents/Neverwinter Nights) is now provisioned development directory, which detects changes and content is reloaded at runtime. This directory sits at the very top of the resources search path (unlike override/, which is sitting below ERF containers such as HAKs).
NB: This content reload only affects resource types that are not cached. For example, it can be used to inject scripts or GFF data, but not replace textures on the fly.
ResMan resource management and priorities has been rewritten. The debug UI can show this to you.
* [Linux/Mac only] The game can now optionally mmap() all core game resources. This speeds up loading times drastically on some systems. This is turned off by default.
* We have added a script command to JIT-compile and run a chunk of NWScript.
* We have added functionality that allows attaching UUIDs to objects. These UUIDs are persisted to GFF and can be used by authors to identify items across module restarts, among other use cases.
* Script calls that serialise/deserialise objects (StoreCampaignObject and CopyObject as of now) can now work with the following object types: Creatures, Items, Placeables, Waypoints, Stores, Doors, Triggers.
* Model compiler: Added a new alias to nwn.ini: MODELCOMPILER (instead of clobbering the installation directory)
* New console command: compileloadedmodels (comppiles all loaded models, including binary)
* New console command: compileloadedasciimodels (compiles all loaded models, only ascii)
* New console command: compilemodel
[ 2019-12-03 01:58:51 CET ] [ Original post ]
This patch is the Release Candidate for 1.79, which will be released in a few days. Please help test this build! Specifically, if you run a server, you can help ensure a smooth transition by trying this build out. Server download packages and a docker image are available later today; NWNX:EE will update soon as well.
Known Issues/Caveats
- CopyObject() now also copies the plot flag for creatures and items. This used to not be the case, but copying the plot flag is more consistent since it matches all other script calls for copying objects (i.e. CopyItem()).
- If you have recent CampaignDB progress stored in SQLite, it will be overwritten (sorry!) as part of the data migration this patch introduces. If you wish to avoid this, clear out the relevant files in your-user-directory/database. Progress would have been created when playing modules making use of this feature with the most recent dev patch, but still having older database files from game version 1.78.
- Polish and Czech charsets cannot render or type some characters. This will be addressed with a followup patch (that will remain compatible with 1.79).
Features
- A management UI for NWSync was added to the Options dialog. It allows players to remove downloaded data they dont want anymore.
- Experimental area precaching has been added. It is guarded behind a configuration toggle and defaults to off.
- The old campaignDB files are now properly imported again at first module start.
Fixes
- The premium modules have been fixed to once again run on 64 bit without crashing. The fix was to strip the DRM! There are no script sources in the package yet due to time constraints on this patch, but we will be providing them in the future.
- We fixed Tangent Space Basis calculations. Again.
- The nwsyncdl console command will now fetch /latest properly if no hash is given. Again.
- We fixed the script call CopyItem not properly copying item description overrides.
- We fixed CopyObject() not properly copying the faction of a creature.
- We fixed Store/RetrieveCampaignObject() not properly storing/retrieving the faction of a creature.
- Player characters stored/copied now end up in the Commoner faction (it used to be a the PC faction; with no valid party).
- We fixed a crash that happened when trying to RetrieveCampaignObject a creature with an invalid faction.
- We fixed the game not properly reconnecting immediately after clicking Cancel during a connection attempt.
- We fixed legacy CD keys not being sent properly to the server during the connection process.
- Network relays have been fixed.
- We fixed some memory management issues in CExoResMan, where having a lot of RAM would make it evict cached resources early.
- The Examine Panel now scales its UI properly.
- We now return to the premium selection UI when cancelling out of running a premium module, instead of the normal module selection.
[ 2019-12-02 23:24:47 CET ] [ Original post ]
Yet another patch with which we are working towards a stable patch release. Not far off now! We appreciate any and all bug reports and feedback your testing will generate.
Known Issues/Caveats
- Networking relays are still nonfunctional. We will have to address further-reaching changes to the network protocol for the upcoming console release. Any related fixes and features, such as better NAT traversal, have been postponed for now.
- Polish and Czech charsets cannot render or type some characters.
- Old campaign database files written with patch 8187 or earlier cannot be read, as the underlying format has changed.
- Looping Music (such as battle tracks) can occasionally crash the game.
Features
- A new toolset build has been added. See the Toolset section below for details.
- New console command: cfg
[value] to change config values. - A new keybind has been added that allows toggling Keyholing.
- Configuration keys to set min-height (from ground level), min-radius (percentage of screen), and max-radius (also percentage of screen) for keyholing have been added. These are available through the Debug UI and by editing settings.tml.
- A configuration key that allows toggling keyholing alongside tooltip (TAB, by default) has been added. It is available through the Debug UI and by editing settings.tml.
- DM Creator Palettes can now contain plain CExoString entries in addition to STRREFs. Strictly speaking, this was possible before (node name was DELETE_ME); weve renamed that node to - surprise - NAME to make it prettier. This is especially useful for tileset authors.
- Module compatibility has been bumped to 1.79 due to the added script commands and the above itp change.
Fixes
- [Windows] The game does not crash anymore when wiggling the window. If you are curious - this was a result of Windows queueing up window moved messages while you held on to the window and then dumping them onto NWN all at once; overrunning a bounded queue before the game had a chance to clear it out. Other platfoms did not exhibit this behaviour.
- [Windows] We fixed the dedicated server always autosaving even when it was disabled via the UI. To disable autosaving, set interval to 0; same as before. We fixed the config option ui.floating-text-feedback being conflated with ui.party.invite-popup.enabled.
- We fixed campaign progress being reset to an earlier state when replaying and finishing previously-completed modules.
- The console command `nwsyncdl` has been raised from the dead.
- A nullptr deref in the expression parser of TestStringAgainstPattern has been fixed. It triggered when trying to match empty groups following a token (i.e. hello()).
- We fixed a crash when unloading compiled skinmesh models.
- We fixed a crash when loading uncompiled skinmesh models that had invalid array lengths for the bone array.
- The uncompiled model parser now skips empty lines. This will NOT fix invalid array lengths. Models that have invalid array lengths in any definition will still behave erratically and/or not animate and/or just be broken, but at least it wont crash anymore.
- We fixed a memleak in loading tile walkmeshes.
- We fixed a memleak in internal string handling.
Toolset
This toolset release brings it in line with patch version 1.5.0.2 as seen in the Beta Toolset release thread.
Toolset: Features
- Added support for visual transforms The new options are available in Adjust Location dialog You can use Ctrl+Mousewheel to quickly scale objects Visual transforms currently only work on creatures, items, doors and non-static placeables
- Added support for opening multiple areas in tabs Tabs are disabled by default. To enable them, go to Toolset settings -> Area editor -> Open areas in tabs, then restart the Toolset. To close a tab, right-click on the tab and choose 'Close' in the context menu.
- Inventory editor improvements - added key bindings Move selection with arrow keys Set Infinite flag with 'I' key Delete items with 'Delete' key After deleting, it now switches to the next item in the list
- Significantly optimized Build Module and Update Instances, as well as some minor operations like expanding an area that is not currently open
Toolset: Fixes
The Toolset is now built using a newer version of the C++ compiler. We have fixed most of the bugs caused by this change, but there might be a few regressions. If you see any issues that did not exist in the Toolset shipped with 1.78, please help us fix them by reporting them to us.
- Additional fixes for "sqrt domain" errors on fancymapped content
- Fixed reputation editing in Faction Editor
- Fixed renaming areas in the main area list
- The Toolset now properly saves Z translation when it's the only transform defined
- Fixed access violation when dragging equipped items to trash
- Fix toolbar icons becoming disabled when double clicking on objects in the area list
- Fixed Unicode issues in Creature properties dialog
- Fixed Z translations not saving
- Fixed undo issues when using tabs
- Fixed fog rendering when using tabs
- Fixed Unicode issues in Token Selector dialog
- Visual transforms are now reset when static flag is set on a placeable
- Fixed tab order for rotation fields in Adjust Location dialog
- Fixed "sqrt domain" errors on some fancymapped content
- Fixed Update Instances dialog layout
- A memory leak that was observed when switching between areas has finally been fixed
- Test Module now correctly passes -userdirectory to the game when launching it
[ 2019-10-10 15:20:04 CET ] [ Original post ]
Yet another stabilising patch! This one fixes a long-outstanding memleak that manifested when players stuck around for a while with skinmeshes on screen (robes, cloaks, certain monsters). It was framerate-dependent, and for some people, this resulted in memory exhaustion and crashes after anywhere between 30 minutes and a few hours. We appreciate any and all bug reports and feedback your testing will generate.
Known Issues/Caveats
- Networking relays are still nonfunctional. We will have to address further-reaching changes to the network protocol for the upcoming console release. Any related fixes and features, such as better NAT traversal, have been postponed for now.
- Polish and Czech charsets cannot render or type some characters.
- Old campaign database files written with patch 8187 or earlier cannot be read, as the underlying format has changed.
- The toolset build inside this development patch is currently outdated. You can find the most recent beta toolset here.
Features
- New main menu background art. (Also configurable in settings.tml)
Fixes
- A serious memleak when rendering skinmeshed objects was fixed.
- A memleak when calculating tangent space basis was fixed.
- An issue where the internal resource manager would needlessly evict recently used files under memory pressure was fixed, which had resulted in disk churn.
- NWSync: We now wont do shard compaction on desktop platforms by default, as this resulted in needless IO and wait time for players (the feature is meant to save storage on certain console platforms).
[ 2019-10-01 16:18:21 CET ] [ Original post ]
We're still working towards a stable patch. This is one step closer, knocking off a few required items off the TODO list for it. We appreciate any and all bug reports and feedback your testing will generate.
Known Issues/Caveats
- Networking relays are still nonfunctional. We will have to address further-reaching changes to the network protocol for the upcoming console release. Any related fixes and features, such as better NAT traversal, have been postponed for now.
- Polish and Czech charsets cannot render or type some characters.
- Old campaign database files written with patch 8187 or earlier cannot be read, as the underlying format has changed.
- The toolset build inside this development patch is currently outdated. You can find the most recent beta toolset here.
Features
- Model compiler: Added a new alias to nwn.ini: MODELCOMPILER (instead of clobbering the installation directory)
- New console command: compileloadedmodels (comppiles all loaded models, including binary)
- New console command: compileloadedasciimodels (compiles all loaded models, only ascii)
- New console command: compilemodel
(specific model, will load and unload it for you even if it is not currently loaded) - New command line switch: nwmain.exe compilemodel
(same as the above console command; will compile the model and exit the game immediately) - NWSync now shows network and storage speed separately while downloading.
- The NWSync networking protocol has been extended to support multiple language-specific and user-selectable optional manifests in the future (but the client itself cannot fetch them yet - sorry!).
- We have rewritten large parts of the NWSync storage system to better support the upcoming console releases. Your existing data should - barring bugs - remain unaffected.
- New command line switch: nwmain.exe compilemodel
Fixes
- NWScript: GetEffectSpellId() was erroneously returning 65535 instead of -1 for effects with no spell.
- SSL is not a forced requirement for NWSync anymore.
- For SSL, OCSP stapling verification is now off. There is a configuration key to globally re-enable it, if users so desire.
- We fixed the configuration option ruleset.hide-hitpoints-gained-on-level erroneously taking the value of ruleset.always-roll-max-hitpoints-on-levelup.
- [Linux] Switching to fullscreen and back will now preserve window position and dimensions.
- We fixed difficulty selection being off by one.
- We fixed the mouse wheel scrolling nuklear-based UI even though the cursor was not hovering over it.
- We addressed a custom content-related crash when adding invalid items to merchants.
- A handful of UI-crashes inside NWSync have been fixed.
- The crash reporter now says which OS it came from.
- We fixed an issue where playing wav ambient sounds would confuse the resource manager into either leaking or freeing memory excessively.
- We fixed some achievements not triggering properly: Hoard Mode, Dragons are Friends not Fodder, Hardcore Morag, Hardcore Heurodis, and Hardcore Mephistopheles.
- Campaign progress now unlocks only the current campaign instead of all.
- Game autosaving is now a boolean toggle, and the interval is configurable between 1 and 30 minutes.
- Interval-based game autosaving no longer triggers in singleplayer.
[ 2019-09-26 17:42:20 CET ] [ Original post ]
Hail adventurers!
We released a new premium module for Neverwinter Nights: Enhanced Edition from the developers of Darkness Over Daggerford, Ossian Studios.
Tyrants of the Moonsea is available now on Steam!
Based on the original module by Luke Scull, this newly enhanced adventure vastly expands the former module by adding 70% more story and gameplay, plus new art and audio!
Tyrants of the Moonsea
The harsh frontier land known as the Moonsea is besieged by demons. A mysterious cult has arisen, bent on death and destruction. Amid the chaos, war is imminent between the powerful city-states and their tyrannical rulers.
Accompanied by the dwarf merchant Madoc, you approach the town of Voonlar just as the worst snowstorm of the year hits. You soon discover that only you can prevent the total annihilation of the Moonsea at the hands of a legendary and ancient evil...
Features
A 20+ hour high-level adventure set in the perilous Moonsea region of the Forgotten Realms! Featuring new monsters, new tilesets, 35 minutes of new music, and 1,000 lines of new character VO.
- An expansion-sized high-level adventure with 20+ hours of gameplay
- Use the world map to explore 18 areas in the Moonsea region including Zhentil Keep, Cormanthor, Thar, and prominent city-states.
- Recruit from 5 different companions for your party
- 5 new monsters to do battle with
- 14 new character portraits
- 35 minutes of inspiring new music including exhilarating combat tracks
- 1,000 lines of new character VO
Deluxe Bundle!
We've added to the Neverwinter Nights: Enhanced Edition Deluxe Bundle:
- Tyrants of the Moonsea
- Tyrants of the Moonsea Official Soundtrack
Complete your bundle & save on ALL enhanced NWN:EE products!
Steam Daily Deal: 75% OFF
Get Neverwinter Nights: Enhanced Edition! Join the community today & snag the classic D&D adventure today and open the gates to scores of community content, premium modules, DM Toolsets, persistent worlds and more...
[ 2019-08-22 17:20:34 CET ] [ Original post ]
Today's Deal: Save 75% on Neverwinter Nights: Enhanced Edition!*
Look for the deals each day on the front page of Steam. Or follow us on twitter or Facebook for instant notifications wherever you are!
*Offer ends Saturday at 10AM Pacific Time
[ 2019-08-22 17:05:00 CET ] [ Original post ]
From the developers of acclaimed adventure Darkness Over Daggerford, Ossian Studios, comes a new premium module for Neverwinter Nights: Enhanced Edition --> Tyrants of the Moonsea!
Based on the original module by Luke Scull, this new, enhanced version of Tyrants of the Moonsea vastly expands this former premium module by adding 70% more story and gameplay, as well as a a large amount of new art and audio content. Read on for details!
STORY
The harsh frontier land known as the Moonsea is besieged by demons. A mysterious cult has arisen, bent on death and destruction. Amid the chaos, war is imminent between the powerful city-states and their tyrannical rulers.
Accompanied by the dwarf merchant Madoc, you approach the town of Voonlar just as the worst snowstorm of the year hits. You soon discover that only you can prevent the total annihilation of the Moonsea at the hands of a legendary and ancient evil...
FEATURES
A 20+ hour high-level adventure set in the perilous Moonsea region of the Forgotten Realms! Featuring new monsters, new tilesets, 35 minutes of new music, and 1,000 lines of new character VO.
- An expansion-sized high-level adventure with 20+ hours of gameplay
- Use the world map to explore 18 areas in the Moonsea region including Zhentil Keep, Cormanthor, Thar, and prominent city-states.
- Recruit from 5 different companions for your party
- 5 new monsters to do battle with
- 14 new character portraits
- 35 minutes of inspiring new music including exhilarating combat tracks
- 1,000 lines of new character VO
PLUS - THE ORIGINAL SOUNDTRACK!
Composed by Mark Braga, Kalen Smith and Will Musser, the inspiring original soundtrack for Tyrants of the Moonsea will also be available on Steam!
[ 2019-08-20 16:45:39 CET ] [ Original post ]
This is a stabilisation effort following 8188. Were working towards a stable patch before the new renderer will happen. Please help test, your feedback is invaluable!
Known Issues/Caveats
- Networking relays are still nonfunctional. We will have to address further-reaching changes to the network protocol for the upcoming console release. Any related fixes and features, such as better NAT traversal, have been postponed for now.
- Old CampaignDB files remain unreadable (for now, see below).
- GetEffectSpellId() returns the wrong value for invalid spells (65535 instead of -1).
Features
- Nuklear-based UI is now skinned with textures loaded from ResMan. The skin is a placeholder and the art is work in progress. New options to configure the used font have been added.
- All HTTP traffic now requires valid HTTPS certificates, with proper OCSP stapling enabled. The game does not speak to http servers anymore (except localhost for testing). This includes all NWSync repositories.
Fixes
- Running the game and server on Linux systems has been fixed.
- NWSync SQLite migration stability has been improved. They are now defined in code, and no longer in the installation directory. The schema, of course, remains public.
- The game no longer renders white boxes where console font should be. This should also fix the issues where other text overlays and opening the radial menu sometimes result in huge white boxes all over the screen.
- The effect limit configuration keys have been uncapped. They used to be limited to [1, default]; they now are [0, 255]. Beware: You may run into strange behaviour if you exceed a total bonus/penalty of -128, 127 or 255 regardless of configuration; since some values are internally typed with 8 bits.
- Hosting local multiplayer games on Mac and Linux, where the system hostname is not resolvable through DNS, has been fixed.
- The server config "Server vault by player name" does not require "Sticky player names" enabled anymore to work. This will help servers that want to set up custom authentication schemes.
- We fixed an issue where the threadpool would not spawn enough worker threads if your CPU had less than three (virtual) cores.
Ruleset
- New column in racialtypes.2da: SkillPointModifierAbility. This column determines the ability which will provide additional skill points on level up. Can be blank. (INT by default, obviously).
- New should-really-be-self-explanatory ruleset.2da constants: MULTIPLE_ATTACKS_BAB_PENALTY_MULTIPLIER_MONK, MULTIPLE_ATTACKS_BAB_PENALTY_MULTIPLIER, SPELLCRAFT_NUM_RANKS_PER_SAVE_BONUS
- ruleset.2da entry lookup has been sped up.
Changed Script Commands
- The effect limit accessors now adhere to the configuration constraints. Values set through these will always override the user-configured values for the running module only.
[ 2019-08-14 16:50:45 CET ] [ Original post ]
Hello everyone! This development patch brings in a features that lay the groundwork for a followup patch to the stable branch. We are releasing this to the dev branch now so that you can help us test it and provide feedback on the direction things are taking. Thus, this patch contains a lot of experimental features with moderate chance for breakage. Please report any issues you might face on our bug tracker - https://support.baldursgate.com/projects/nwn-ee-public-bugs. We're aware it's been a long wait since our last patch. Thank you for your patience! We assure you, we are still hard at work on Neverwinter Nights: Enhanced Edition. Please note that this patch does not represent the full set of features we are working on. Instead, we have split away partial changes so that the community could test and evaluate them while were working on other features including the new graphics rendering engine, improved NWSync capabilities, and softening up more parts of the ruleset. This patch introduces backwards-breaking changes to save games and character files (specifically, the Red Dragon Disciple). Please read the patch notes carefully and make backups of your saves and characters.
Known Issues/Caveats in this patch
- Networking relays are still nonfunctional. We will have to address further-reaching changes to the network protocol for the upcoming console release. Any related fixes and features, such as better NAT traversal, have been postponed for now.
- Rendering console text (the yellow debug console) sometimes renders white squares instead.
- Old CampaignDB files ("CodeBase", "Bioware DB", "FoxPro", etc) remain unreadable (for now, see below).
Features
- Both client and server are now 64bit binaries. We do not provide 32bit binaries anymore as of this patch. (The binary directories in the game install are now misnamed; we didn't change this yet but will in a future patch.)
- Achievements have been added to the Steam release. These are the same as have been available on Android for a while. There is a Debug UI panel that allows you to clear previously-achieved achievements if youd like to start fresh. Please note that they will remain flagged as Hidden until support for them hits the stable branch.
- CodeBase (Bioware Campaign Database) has been replaced with sqlite3, as the old database code would not work when compiled with a 64bit compiler. Moving forward, we will be writing new, minimal code to import existing CodeBase entries; but for now, old data remains inaccessible. All new database files end up in the database/ directory in your user home. They have the extension .sqlite3.
- A debug UI for advanced users to showcase experimental new features and UI scenes has been implemented (Ctrl+Shift+F12 to access).
- A new configuration system has been put in place. Most client and server config is now stored in a file called settings.tml, instead of nwn and nwnplayer ini.
- A lot of new configuration keys have been added, too numerous to list here.
- Configuration will be imported from ini files. Once imported, the .ini will not be written anymore (but left in place in case you want to go back to a previous build).
- All configuration keys can be overridden via ENV variables (useful for automated server setups), like so: NWN_CONFIG_SET_key, where key is the fully-qualified configuration key.
- Some configuration still remains in .ini files; these will be migrated as we go along.
- The .tml file is in TOML format and has a full schema embedded for better introspection and tool-based editing.
- The debug UI offers access to the full new configuration system.
- Networking/Crypto: Servers can now have fixed identities that persist between restarts. This identity is stored in a file named cryptographic_secret in the user home. Leaking this identity allows others to impersonate your server, much in the same way as leaking a private CD key. Favourites and History storage will now use server identities if available, so that floating IP/port servers can be found again easily.
- The game now defaults to windowed mode (instead of exclusive fullscreen) on new installs.
- The game will now remember the window position between restarts when in windowed mode.
- A simple frame limiter has been added, which can be used to reduce CPU/GPU usage on battery-constrained devices. It is accessible through the Debug UI as explained below.
- Walking/Running with shift held down is now an invertible config toggle. This is also accessible through the Debug UI.
- NWSync now automatically purges outdated server manifests, removing stale and unneeded data. Manifests are considered outdated if they are coming from the same server URL and carry the same group_id (see NWSync documentation).
- NWSync can now download offline modules from preconfigured servers. This is a experimental feature and only accessible via the Debug UI, and requires adding a specially-prepared repository.
- The debug UI offers to purge unwanted nwsync manifests and all associated data. This will eventually be turned into a more user-friendly UI.
- Music and ambient sounds are now loaded through ResMan and can thus be in hak and nwsync.
- The game will now read plain mp3 files (the .bmu extension rename is still required, because this extension is used in all existing resources/haks).
- The game user home (i.e. Documents/Neverwinter Nights) is now provisioned development directory, which detects changes and content is reloaded at runtime. This directory sits at the very top of the resources search path (unlike override/, which is sitting below ERF containers such as HAKs).
- NB: This content reload only affects resource types that are not cached. For example, it can be used to inject scripts or GFF data, but not replace textures on the fly.
- ResMan resource management and priorities has been rewritten. The debug UI can show this to you.
- [Linux/Mac only] The game can now optionally mmap() all core game resources. This speeds up loading times drastically on some systems. This is turned off by default.
- We have added a script command to JIT-compile and run a chunk of NWScript.
- We have added functionality that allows attaching UUIDs to objects. These UUIDs are persisted to GFF and can be used by authors to identify items across module restarts, among other use cases.
- Script calls that serialise/deserialise objects (StoreCampaignObject and CopyObject as of now) can now work with the following object types: Creatures, Items, Placeables, Waypoints, Stores, Doors, Triggers.
Fixes
- C++: Thousands of cases of undefined behaviour have been addressed. A lot of code duplication has been removed in the process.
- KTX texture loading order has been fixed.
- The Load/Save dialogue now properly removes savegames from the resource manager when exiting the UI.
- GL Render Culling was fixed (i.e. flickering trees and keyholing showing backfaces of geometry instead of punching through).
- We fixed invalid user savegames being deleted on read errors; for example when erroneously storing savegames in subdirectories, or when AV denies access to reading the .sav.
- Automatic tangent generation has been fixed.
- Steam CD key retrieval should be more robust; and in the case of errors, will emit a useful support token that can be used to follow up with Beamdog.
- A memleak in script evaluation was fixed.
- SetPhenoType: The constraint condition was too narrow in clamping the phenotype; this has been fixed.
- SetName() on areas now sends the configured language, instead of English.
- The rather arbitrary builtin effect icon limit has been removed.
- Object Visual Transforms: We now send VTs for newly-created doors and placeables. Some inefficiencies in network updates have been removed.
- Material Shader Params: Some inefficiencies in network updates have been removed.
- The server now waits 3 seconds before attempting to list with the master, allowing a module to load in non-interactive use.
- Running a local multiplayer game now should never reject the primary player if the master is unreachable.
- A case where arturo texture animations failed to animate has been addressed.
- A bug in the creature serialisation code (for StoreCampaignObject) has been addressed where it would erroneously embed transient object IDs for inventory items, resulting in issues when loading this creature again in a persistent world setting.
- A nullptr deref crash related to funny/zombie-walking a player was fixed.
- A nullptr deref crash when clicking placeables without a valid player creature was fixed.
- A thread race crash during sound system initialisation was fixed.
- A nullptr deref crash when the server sends a weapon switch request for a creature where the model did not yet load was fixed.
- A selection of nullptr deref crashes when the server sends a creature update for a non-existing creature were fixed.
- A case where encounters containing creatures only of the same CR would fail to select the proper amount/difficulty was fixed.
Ruleset
- classes.2da: New column StatGainTable. This column contains a table that describes ability and natural AC progression per level.
- Palemaster Natural AC progression has been changed to use this mechanism.
- Dragon Disciple Natural AC and Ability progression has been changed as well. As a consequence of this change, existing creatures will be stripped of their baked-in modifiers; thus changing characters/saves irreversibly and making them invalid with older game versions. Character changes are tracked in the character file itself: A new field DataMigration has been added to the GFF CreatureStats struct to accommodate this. In the interest of transparency, changes made to character files are published in the patch notes, below. If you want to return to a previous game version, make sure to create a backup first.
- racialtypes.2da: New columns to configure extra skill points and feats at first level.
- racialtypes.2da: New columns to configure the skill points modifier at first level.
- racialtypes.2da: New columns to configure Ability Point Buy.
- racialtypes.2da: New columns to configure normal feat progression.
- ruleset.2da: New 2da added that contains a set of builtin ruleset defines. These defines were previously hardcoded in the game engine and are now overridable on a per-module basis. No explicit guarantees of functionality are given due to their scope and amount; however we will gladly listen for feedback on what works, what doesnt work as expected, and what needs changing to accommodate further use cases. We reserve the right to change and remove entries with future patches.
Irreversible character data migrations in this patch
- DataMigration < 1: Dragon Disciple Class:
- if (level >= 10) STR -= 4;
- if (level >= 4) STR -= 2;
- if (level >= 2) STR -= 2;
- if (level >= 7) CON -= 2;
- if (level >= 9) INT -= 2;
- if (level >= 10) CHA -= 2;
- // Note: Natural AC was already calculated at runtime and not persisted to character data.
New Script Commands
// Execute a script chunk.
// The script chunk runs immediately, same as ExecuteScript().
// The script is jitted in place and currently not cached: Each invocation will recompile the script chunk.
// Note that the script chunk will run as if a separate script. This is not eval().
// By default, the script chunk is wrapped into void main() {}. Pass in bWrapIntoMain = FALSE to override.
// Returns "" on success, or the compilation error.
string ExecuteScriptChunk(string sScriptChunk, object oObject = OBJECT_SELF, int bWrapIntoMain = TRUE);
// Returns a UUID. This UUID will not be associated with any object.
// The generated UUID is currently a v4.
string GetRandomUUID();
// Returns the given objects' UUID. This UUID is persisted across save boundaries,
// like Save/RestoreCampaignObject and save games.
//
// Thus, reidentification is only guaranteed in scenarios where players cannot introduce
// new objects (i.e. servervault servers).
//
// UUIDs are guaranteed to be unique in any single running game.
//
// If a loaded object would collide with a UUID already present in the game, the
// object receives no UUID and a warning is emitted to the log. Requesting a UUID
// for the new object will generate a random one.
//
// This UUID is useful to, for example:
// - Safely identify servervault characters
// - Track serialisable objects (like items or creatures) as they are saved to the
// campaign DB - i.e. persistent storage chests or dropped items.
// - Track objects across multiple game instances (in trusted scenarios).
//
// Currently, the following objects can carry UUIDs:
// Items, Creatures, Placeables, Triggers, Doors, Waypoints, Stores,
// Encounters, Areas.
//
// Will return "" (empty string) when the given object cannot carry a UUID.
string GetObjectUUID(object oObject);
// Forces the given object to receive a new UUID, discarding the current value.
void ForceRefreshObjectUUID(object oObject);
// Looks up a object on the server by it's UUID.
// Returns OBJECT_INVALID if the UUID is not on the server.
object GetObjectByUUID(string sUUID);
[ 2019-08-06 18:28:43 CET ] [ Original post ]
Hello, friends!
Weve been substantially updating the Neverwinter Nights Toolset, and want you to test our newest build which adds tons of fixes, optimizations, & new features!
Grab the new Neverwinter Nights: Enhanced Edition Toolset build at this link, test it out, and share your feedback!
We've uploaded an out-of-band update for the Toolset so that content creators could test it without having to wait for a patch (which will take a while with the work on the renderer and 64-bit integration).
Check out a small video illustrating new features: https://www.facebook.com/Beamdog/videos/2319128681662635/
[ 2019-04-04 19:29:26 CET ] [ Original post ]
We're shipping a quick pre-holidays development patch for Neverwinter Nights: Enhanced Edition. We're at 8187 now!
Changes
- We ported keyholing from Android. It is turned ON by default, but can be turned off with a console command (KeyholeToggle) or the setting in nwn.ini. A UI setting will be added before the next stable patch ships.
- Shaders now support #include. Use with care: It's not a real preprocessor, just a verbatim string replace.
- We're changing how networking is done in NWN:EE, with the following benefits: Cryptographic server and client identity authentication; full network encryption to prevent traffic snooping - and in the case of public servers via the master, connection hijacking; floating connections (you might be able to IP/port-hop and retain your connection); better use of compression; and no more host/port confusion when connecting multiple times from behind the same LAN.
- NWSync now cleans up downloaded manifest mappings when getting updates from known servers. It will not remove unreferenced data yet (as desktop users might not want to lose it), but that will come next.
- NWSync will automatically reconnect you to the server if you are still around after the download finishes (based on keyboard/mouse input detection).
Fixes
- Performance and memory usage improvements at NWSync startup.
- History/Favorites have been fixed to once again show what has been saved to the .ini.
- We fixed the SetName and SetHiddenWhenEquipped script commands not reliably updating all clients.
- We fixed some doors becoming unclickable after having been destroyed, despite having a scripted transition present.
- We fixed the script compiler sometimes confusing functions where the full name of one is a prefix of the other ("Action" <-> "ActionTwo").
- We fixed module content (hak, tlk, nwsync) not properly unloading when disconnecting from a server.
- We fixed a bug where resources were indexed twice when loading a module, resulting in prolonged load/connect times.
- We fixed an issue where sending visual transforms or material updates for creatures only seen on the party bar, but not yet in an area, crashed clients.
Known Issues
- Relay network functionality is not yet functional for this new patch. This will not impact connectivity, unless both server and client are behind very restrictive NAT.
[ 2018-12-21 21:29:58 CET ] [ Original post ]
Todays the day for Android Neverwinter Nights fans! Neverwinter Nights: Enhanced Edition has just launched on Google Play and it's cross-play compatible with desktop versions!
NWN:EE on Google Play introduces true type font, new main menu art, achievements, bug fixes, features, and more which Steam and other desktop players will be seeing in future patches.
Check out the Google Play trailer here: https://youtu.be/5qAYBJ-boEE
Find out more on the Beamdog blog: http://blog.beamdog.com/2018/12/neverwinter-nights-enhanced-edition.html
Check out NWN:EE on Google Play: https://play.google.com/store/apps/details?id=com.beamdog.nwnandroid&hl=en
[ 2018-12-04 18:21:43 CET ] [ Original post ]
Today, we are shipping Development Build 8186 to the stable branch of Neverwinter Nights: Enhanced Edition as 1.78! This is the very same build that was recently updated on the development branch and contains no changes since then. The previous build (8181) is available as a Steam branch, so you can switch back if your favorite persistent world needs more time to update. To do so, select 'oldstable' under the beta dropdown list in the Neverwinter Nights: Enhanced Edition Steam properties.
New Feature: NWSync
This update contains a major new feature called NWSync, which will allow players to easily download required content data as they join servers, without having to manually manage HAK and TLK files. In this first iteration, this will mostly benefit persistent worlds, as it requires special setup on the server owner's part. For details on this feature, please see the source repository that contains all the needed tooling and links to the most up-to-date documentation, here: https://github.com/Beamdog/nwsync.
Client Changes
Features:
- We added a new console variable that enables a over-time FPS display. Type "fpstrace 1" into the game console to enable.
- You can type `Gamma x` in the console, where x is a floating point value larger than 0. The default is 2.2. This value is persisted to nwn.ini (under a new configuration key). Gamma only affects the rendered ingame scenery, not menus or UI, as it is applied through a FBO shader, not GL/system-wide gamma correction.
- The game now supports normal DDS textures without having to mangle the header.
- The game now supports KTX texture containers.
- The game now writes out all Aliases to nwn.ini even if the file already existed.
- We bumped the default maximum texture memory to 256MB. Previous settings of 64MB are rewritten to this value. The new minimum is 96MB. The bigger-by-default texture memory should improve stability in some situations.
- We fixed lighting uniforms not assigning properly on some GPU drivers. This should address some flickering and maybe improve stability.
- Premium Modules don't show in "Other Modules" anymore.
- Yet another crash for creature appearances with PERSPACE=0 has been addressed.
- The multiplayer server browser now shows a progress window when downloading the server list. It also switched over to libcurl, which should prove to be much more reliable than the previous solution.
- The chat window will not capture mouse clicks anymore, only scroll events. This means you can once again click through it to action the game world.
Server Changes
Fixes:
- Greater Sanctuary interacting incorrectly with True Seeing has been fixed.
- A rare server hang when a relayed player suddenly regains direct connectivity has been fixed.
- A bug in RetrieveCampaignObject has been fixed that resulted in a double free issue, crashing the game. This was another 1.69 issue that was unearthed by us switching to VS2017 for the Windows build.
[ 2018-11-20 21:14:02 CET ] [ Original post ]
Same week, new patch! 8186 contains another update preparing for the next stable release. We'd like to thank the online PW community for their help in testing NWSync. Your feedback has been incredibly helpful in making NWSync a reality! With the Android beta now released, we're looking to keep feature parity by pushing a new release on both platforms; leading to a stable release for desktop that is cross-play compatible with Android.
Changes
- You can now configure in nwn.ini the number of concurrent connections used to download NWSync data from server repositories. The default has been bumped to 20 (up from 5). This increases performance significantly.
- The major version has been bumped to 1.78 in preparation for releasing this as stable. Unless major issues crop up, this is the next stable build.
- NWSync documentation is being rewritten to be easier to read and include more needed detail.
[ 2018-11-15 20:54:14 CET ] [ Original post ]
New week, new patch. 8185 contains stabilization fixes for a upcoming stable release. As always, we appreciate your support in testing development patches. With the upcoming Android beta, we are looking to keep feature parity by pushing a stable release soon.
Fixes
- The chat window will not capture mouse clicks anymore, only scroll events. This means you can once again click through it to action the game world.
- Greater Sanctuary interacting incorrectly with True Seeing has been fixed.
- A rare server hang when a relayed player suddenly regains direct connectivity has been fixed.
- A bug in RetrieveCampaignObject has been fixed that resulted in a double free issue, crashing the game. This was another 1.69 issue that was unearthed by us switching to VS2017 for the Windows build.
- NWSync has been sped up by avoiding yet more memory copying.
- Minor shader update to remove light specularity components, as they are handled by the light diffuse uniforms.
Upcoming/Errata
- We have not yet been able to work on documentation and use-cases with HOWTOs. This has not been forgotten and will be done.
- Greater Sanctuary may not sync properly to clients after they re/connect.
- There is a known issue where static tile lighting sometimes does not update in the toolset, and even rarer, in the game. We are looking into this as we work on the renderer.
- The NWSync client part is still lacking a way to remove manifest data or expire old manifests in a more fine-grained fashion.
[ 2018-11-13 21:34:47 CET ] [ Original post ]
We're sending Dev patch 8184 your way! This patch refactors the NWSync client-side storage concept in a major way. Data is now sharded out to multiple databases, to support Android file systems on MicroSD cards, where files cannot grow larger than 2GB, give or take. As part of this refactor, the game will both save and load faster as de/compression, reading and writing can be done in parallel (on multi-core systems with fast SSDs at least). Additionally, this change will make it much easier on the system to vacuum deleted data in the background, and free up disk space. Unfortunately, part of this change means that previously-downloaded data will be left sitting in your userhome/nwsync/ directory, as it is not migrated automatically. You can delete the file "nwsync.sqlite3" if you still have it from testing previous dev patches. To backfill this data, a re-download will be required.
Features
- NWSync client-side storage is sharded out to many databases in a round-robin fashion, as described above.
- We bumped the default maximum texture memory to 256MB. Previous settings of 64MB are rewritten to this value. The new minimum is 96MB. The bigger-by-default texture memory should improve stability in some situations.
Fixes
- We fixed a regression we introduced (when porting platform-specific code to C++14) where CodeBase database files ("Bioware Campaign Database") were written out corrupted on Linux and Mac, resulting in crashes. Unfortunately, the only way to revert from this is to manually delete the affected database files (in userhome/database/).
- The base shaders have been fixed to once again correctly render UI elements on older/obscure hardware.
Upcoming/Errata
- There was no time yet to address the question of documentation and use-cases with HOWTOs. This has not been forgotten, and will be done before the next patch.
- Specifically, things left to do before NWSync can hit the Stable branch include (Warning, technical stuff!): Handling out of space errors gracefully; Improvements to the serverside repository format and download process to use fewer, bigger files and range requests; Potentially automatically expiring and removing deprecated persistent world data when their data set updates; Providing tools for players to manually remove data inside NWSync they don't want anymore.
[ 2018-11-02 19:58:19 CET ] [ Original post ]
This is patch 8183 for the Development branch of NWN:EE! This patch is a quick iteration on the previous Development patch. Build 8182 introduced NWSync, a feature allowing clients to download needed gameplay data from servers without having to manually hunt down HAK and TLK files.
Fixes
- We fixed a performance issue indexing/reading NWSync manifests on Windows. Data should now load at least as fast as it would with HAKs.
Fix-tures
- Gamma functionality is back: You can type `Gamma x` in the console, where x is a floating point value larger than 0. The default is 2.2. This value is persisted to nwn.ini (under a new configuration key). Gamma only affects the rendered ingame scenery, not menus or UI, as it is applied through a FBO shader, not GL/system-wide gamma correction. There is no slider yet, sorry.
- NWSync memory management was refactored to be as zero-copy as possible, eventually paving the way for streaming compression (to deliver, e.g., full movies). Right now, the suggested optimal file size for individually synced files is under 20MB.
- All shaders have seen revision to be more efficient and future-proofed for extensions like Roughness and Glow Maps.
- The game now writes out all Aliases to nwn.ini even if the file already existed.
Features
- NWSync now has an Alias entry in nwn.ini, which allows moving data to a more suitable place if so desired.
- Downloading the initial manifest now shows progress, instead of letting the user guess. This is relevant for big manifests, which may grow to megabytes in size for servers using the CEP and more.
- The multiplayer server browser now shows a progress window when downloading the server list. It also switched over to libcurl, which should prove to be much more reliable than the previous solution.
Coming Soon, and Known Issues
- There will be a utility to introspect and prune the client-side storage.
- There will be a utility to (pre-)download manifest/server data without the game running.
- We're aware the NWSync documentation is very bare bones right now, and aimed at the technical user. It will see a lot of improvement before a stable release, including example use-cases and HOWTOs for each. Current work-in-progress documentation can be found here: https://docs.google.com/document/d/1eYRTd6vzk7OrLpr2zlwnUk7mgUsyiZzLoR6k54njBVI.
- Server-side repository management utilities are exhibiting some issues on Windows. We're looking into the problem
[ 2018-10-24 19:01:06 CET ] [ Original post ]
NWN:EE Development Update 8182 is being rolled out. This patch contains a major new feature: NWSync, a mechanism to transparently and automatically download user content when joining a multiplayer server. The first development release now exists to serve as an invitation to test for the community.
Features
- The game now supports normal DDS textures without having to mangle the header.
- The game now supports KTX texture containers.
- We added a new console variable that enables a over-time FPS display. Type "fpstrace 1" into the game console to enable.
Optimisation
- We added a (off-by-default) experimental toggle that prevents needless texture switching. It should yield about 10-20% more FPS depending on the scene rendered. You can toggle it, to see the difference, via the console variable glCacheTextureBinds 0/1.
Fixes
- We fixed lighting uniforms not assigning properly on some GPU drivers. This should address some flickering and maybe improve stability.
- Premium Modules don't show in "Other Modules" anymore.
- Yet another crash for creature appearances with PERSPACE=0 has been addressed.
NWSync
We merged in experimental support for NWSync. The first implementation of this allows transparent multiplayer server content downloads, and requires special setup by the server admin to make functional. The preliminary manual, including instructions and system details, can be read here: https://docs.google.com/document/d/1eYRTd6vzk7OrLpr2zlwnUk7mgUsyiZzLoR6k54njBVI Note that if you are from The Future, then this URL might have changed or disappeared. Please check the official documentation in lang/en/docs instead. Again, this is experimental, and we are shipping this to the development branch early so persistent world admins and interested parties can test it. This is a very complex technical feature and we fully expect that we will have to ship more development patches to address found issues. Ultimately, this feature can only grow into what it should be with feedback and guidance from those that will be heavily employing it.
[ 2018-10-19 23:16:11 CET ] [ Original post ]
We're shipping build 8181 to Stable today. This is the same build that has been on the Development branch for a short while now. If you'd like to stay on 1.76 until your favourite persistent world has migrated, please select the "oldstable" branch in Steam. For a full changelog compared to 1.76, read on.
Client Changes
Features:
- Three new player-selectable portraits; Heavyline, Skandii, and Lanteri.
- We fixed certain armour pads (specifically, belts and shoulder pads) disappearing when re-equipping a item.
- We fixed a floating point inaccuracy that made the player character skew aside ever so slightly when WASDing.
- The conversation UI has been fixed to not shift off screen when using UI scaling and having the Inventory/Char sheet open at the same time.
- We fixed a double-free in the PLT system, which has lead to crashes when multiple objects with the same texture would show.
- We fixed held equipment not becoming transparent when the character model did so (for example, when casting Invisibility.)
- The game now asks you for a CD key, instead of erroring with a confusing message, when Steam CD key retrieval fails for any reason.
- HW Mouse is now the default on Linux, as to avoid WindowManager-related mouse click point offset issues resulting from UI scaling.
- We made all DLC portraits now show up for character creation in all modules, regardless of portrait.2da entries.
Content Creation Changes
Features:
- Toolset: The script editor now shows variables and constant declarations on double click.
- Toolset: The recent modules list has been expanded to 10 entries.
- Toolset: The compiler include limit has been bumped to 128.
- Toolset: Area ambient sounds and music has been brought back to life.
- Toolset: We removed the requirement that the mouse be over an object to translate it on the Z-axis (with Alt+Left Mouse Button).
- Toolset: The tile properties light select color UI is no longer truncated when using windows-native screen scaling.
Server Changes
Fixes:
- Server resource management on Linux in certain memory configurations has been fixed.
- Crashes in nwscript functions resulting from bad parameters have been addressed: CopyItemAndModify, GetNearestCreatureToLocation
- A crash when reloading LTRs was fixed.
- Linux only: Database names are now case-insensitive, so DestroyCampaignDatabase() now works as expected.
- Linux/Mac only: We fixed the server spinning a thread needlessly if stdin gets closed.
[ 2018-10-02 19:09:04 CET ] [ Original post ]
We're shipping Neverwinter Nights: Enhanced Edition Development Build 8181 shortly after 8180 to address community-found feedback and issues. This build is the next release candidate for 1.77.
Fixes
- We made all DLC portraits now show up for character creation in all modules, regardless of portrait.2da entries.
- We fixed some objects with fancymapping not rendering in the Toolset.
- Linux/Mac only: We fixed the server spinning a thread needlessly if stdin gets closed.
- The macOS dedicated server now doesn't fail due to a missing libGalaxy.dylib.
[ 2018-09-27 16:27:31 CET ] [ Original post ]
We're now shipping Neverwinter Nights: Enhanced Edition Development Build 8180. This build is a potential release candidate for 1.77.
Features
- We added three new player-selectable portraits; Heavyline, Skandii, and Lanteri.
- Toolset: The script editor now shows variables and constant declarations on double click.
- Toolset: The recent modules list has been expanded to 10 entries.
- Toolset: The compiler include limit has been bumped to 128.
Fix-tures
- The game now asks you for a CD key, instead of erroring with a confusing message, when Steam CD key retrieval fails for any reason.
- HW Mouse is now the default on Linux, as to avoid WindowManager-related mouse click point offset issues resulting from UI scaling.
Fixes
- We fixed certain armour pads (specifically, belts and shoulder pads) disappearing when re-equipping a item.
- Server resource management on Linux in certain memory configurations has been fixed.
- We fixed a floating point inaccuracy that made the player character skew aside ever so slightly when WASDing.
- The conversation UI has been fixed to not shift off screen when using UI scaling and having the Inventory/Char sheet open at the same time.
- We fixed held equipment not becoming transparent when the character model did so (for example, when casting Invisibility.)
- Toolset: Area ambient sounds and music has been brought back to life.
- Toolset: We removed the requirement that the mouse be over an object to translate it on the Z-axis (with Alt+Left Mouse Button).
- Toolset: The tile properties light select color UI is no longer truncated when using windows-native screen scaling.
- We fixed a double-free in the PLT system, which has lead to crashes when multiple objects with the same texture would show.
- A crash when reloading LTRs was fixed.
- Crashes in nwscript functions resulting from bad parameters have been addressed: CopyItemAndModify, GetNearestCreatureToLocation
- Linux only: Database names are now case-insensitive, so DestroyCampaignDatabase() now works as expected.
Known Issues
- The macOS dedicated server is missing a packaged libGalaxy.dylib. This can be worked around by copying the one from the client .app bundle (nwmain.app/Contents/MacOS/libGalaxy.dylib) into the same directory as the server binary.
[ 2018-09-20 21:57:14 CET ] [ Original post ]
The next stable patch for Neverwinter Nights: Enhanced Edition is live! If you have been following the Development branch announcements, you know what’s coming! This patch focuses on stabilisation and addresses issues found since the previous update shipped. In particular, the patch includes fixes for the majority of Intel-GPU related crashes. The full list of changes since v1.75 (Build 8176) is:
Client Changes
Features
- We added a new experimental full screen shader effect: Sharpen. It’s disabled by default, so you have to go into Options, Advanced Effects to try it out.
- MacOS now defaults to “Desktop” style fullscreen mode (Borderless Fullscreen). This allows you to switch spaces. To make use of it on existing setups, set FullScreenDesktopMode=1 in nwn.ini.
- The name generator tables for all races (including custom) are now configurable in racialtypes.2da.
- We turned Depth Of Field off by default (only for new installs). This will be re-enabled once it works better in conversations.
- The SSAO FBO has been updated to use 25% fewer GPU cycles.
- We addressed one of the major crashes people were seeing on Intel GPUs. Matters should now be much improved for some players, however we are continuing to work on Intel-related issues.
- The high contrast shader has been tweaked so that the fog colour is not impacted anymore.
- Issues with playing Premium Modules in multiplayer have been addressed.
- We fixed a resource management issue when entering areas; resulting in crashes on area load screens.
- Loading save games now works with encrypted premium module saves.
- We fixed where object visual transforms would not apply immediately when spawning or loading objects into an area.
- Text bubbles now move alongside any applied visual transforms.
- Some people were seeing “Could not translate address” when attempting to connect to servers, especially when attempting to connect via icon shortcuts. This has been fixed.
- Area Transitions clickable state is now sent to clients indiscriminately, which previously resulted in them turning into the wrong colour, hiding them from DMs, and making transitioning harder.
- We’re making it so that door boxes now again don’t have a highlight when mousing over them. (This was a very sneaky regression introduced by making the script call SetTransitionTarget work).
- We fixed a crash when area of effect VFXes would attempt to animate in an area that was just unloaded on the client.
- We fixed a game crash that happened in updating a creature without a valid animation base.
- The chat window sizes now load properly for all users.
- We allow server admins to disable relay functionality if they so desire. (nwnplayer.ini: “Network Relays Enabled”)
- We fixed a game crash while updating the appearance of a creature without a valid body appearance.
- The game client doesn’t hang or crash anymore when receiving a very large data packet; such as character files, area data, or DM palettes.
- We fixed the game hanging or lagging when no audio device is available.
- We fixed a crash when a dedicated server would save a game, where a logged-out player was in Defensive Stance mode.
- We fixed a crash when exiting from a module with HAKs loaded.
- The UI scale for Dialogues with scroll bars has been fixed.
- We excluded localhost (127.0.0.1) from ever being relayed in order to fix a confusing error message for users.
Content Creation Changes
Fixes
- Script Compiler: We now allow escaping backslashes (“\”).
[ 2018-07-11 20:19:17 CET ] [ Original post ]
Neverwinter Nights: Enhanced Edition Development Build 8179 is now available. This build is a release candidate for 1.76. Thank you all for your assistance in hunting down bugs and testing these development builds.
Fixes
- We addressed the majority of Intel-GPU related crashes. However, we will not rest until all of them are resolved.
Details
This patch is tiny as far as the log goes, as it specifically addresses the Intel crash issue. Some players on very specific and hard to reproduce Intel GPU and driver combinations, were seeing severe crashing on area load screens and many situations with heavy NPC activity. Unfortunately, this is not a complete fix for the issue, but it has shown to be a great improvement for the majority of players. We are aware of a separate, though much less frequently occurring, crash that we are still chasing down. We are also very much aware of related performance issues on some Intel setups (stuttering when loading into heavy activity). However, finding and fixing these will take more time than this patch cycle allowed, as we wanted to get this fix out as soon as feasible.
A Fix For 8176
To ease pain on the current stable patch, we've prepared a binary for players to plug into existing install that contains the backported crash fix. This is not shipped to everyone automatically, so if you are seeing crashes on Intel hardware, you will have to apply the patch by hand until the next official release. Instructions:
- Download the zip file here.
- Extract the contained .exe into your game install, bin/win32 directory. On Steam, you can find this via "Browse Local Files" when going into the game properties. On the Beamdog Client, you can find it by clicking "Open Game Location" under game options.
- When extracting, make sure to overwrite the existing nwmain.exe.
- Please note that both Steam and Beamdog Client will revert to the non-fixed binary if you run a Verify.
[ 2018-07-06 18:29:06 CET ] [ Original post ]
Neverwinter Nights: Enhanced Edition Development Build 8178 is now up. This release is a step towards the next official NWN:EE update that will address many of the issues discovered since 1.75. The full list of changes since Build 8177 is:
Features
- We added a new experimental full screen shader effect: Sharpen. It’s disabled by default, so you have to go into Options, Advanced Effects to try it out.
- MacOS now defaults to “Desktop” style fullscreen mode (Borderless Fullscreen). This allows you to switch spaces. To make use of it on existing setups, set FullScreenDesktopMode=1 in nwn.ini.
- We added another uniform to the game (int playerInCutscene), which will be used to improve the Depth Of Field FBO.
- The game now shows the git commit it was built from in the title bar, the options menu, and the server consoles.
Fixes
- We fixed a crash when exiting from a module with HAKs loaded.
- We fixed where object visual transforms would not apply immediately when spawning or loading objects into an area.
- The UI scale for Dialogues with scroll bars has been fixed.
- We excluded localhost (127.0.0.1) from ever being relayed in order to fix a confusing error message for users.
[ 2018-06-22 19:39:40 CET ] [ Original post ]
Neverwinter Nights: Enhanced Edition Development Build 8177 is now available. The full list of changes since v1.75 (Build 8176) is:
Known issues that will be addressed in a future patch
- We continue to work with Intel engineers to track down the crash and performance issues we’re seeing on Intel HD GPUs.
- On Linux, mouse clicks are offset from the cursor location when using UI scaling. Edit nwn.ini and set “Enable HardwareMouse=1” to work around this.
- The game will hang when NPCs bump into a creature with a PERSPACE value of 0 in appearance.2da (For example, the CEP Armor Stand Dummy).
- The game might crash when exiting a server with haks.
- Object Visual Transforms don't always apply immediately on spawned objects.
- The mouseover/tab text bubble is offset when using Object Visual Transforms.
Features
- The SSAO FBO has been updated to use 25% fewer GPU cycles.
- The high contrast shader has been tweaked so that the fog colour is not impacted anymore.
- The name generator tables for all races (including custom) are now configurable in racialtypes.2da.
- We added more shader uniforms to support upcoming Depth Of Field changes.
Fixes
- Connecting to a dedicated server hosting a premium module resulted in the resource image being reopened after loading character data, which made ResMan then read freed memory on resources loaded for character generation/select. This hopefully fixes some of the Infinite Dungeon multiplayer issues that were seen.
- We fixed a resource management issue when entering areas; resulting in crashes on area load screens.
- Area Transitions clickable state is now sent to clients indiscriminately, which previously resulted in them turning into the wrong colour, hiding them from DMs, and making transitioning harder.
- Script Compiler: We now allow escaping backslashes (“\”).
- We’re making it so that door boxes now again don’t have a highlight when mousing over them. (This was a very sneaky regression introduced by making the script call SetTransitionTarget work).
- We fixed a crash when area of effect VFXes would attempt to animate in an area that was just unloaded on the client.
- We fixed a game crash that happened in updating a creature without a valid animation base.
- We turned Depth Of Field off by default (only for new installs). This will be re-enabled once it works better in conversations.
- The chat window sizes now load properly for all users.
- We allow server admins to disable relay functionality if they so desire. (nwnplayer.ini: “Network Relays Enabled”)
- We fixed a game crash while updating the appearance of a creature without a valid body appearance.
- Loading save games now works with encrypted premium module saves.
- The game client doesn’t hang or crash anymore when receiving a very large data packet; such as character files, area data, or DM palettes.
- We fixed the game hanging or lagging when no audio device is available.
- We fixed a crash when a dedicated server would save a game, where a logged-out player was in Defensive Stance mode.
- Some people were seeing “Could not translate address” when attempting to connect to servers, especially when attempting to connect via icon shortcuts.
[ 2018-06-15 20:30:15 CET ] [ Original post ]
Beamdog and Ossian Studios are excited to announce the award winning premium module Darkness over Daggerford has been enhanced for Neverwinter Nights: Enhanced Edition!
This expansion-size adventure has 25+ hours of story-rich gameplay, 12 new music tracks, 12 new character portraits, new voice over, and nearly 500 gameplay improvements over the original!
Neverwinter Nights: Darkness over Daggerford is now available on Steam for $9.99 USD and will be coming soon to Beamdog.com and other stores.
http://blog.beamdog.com/2018/06/neverwinter-nights-darkness-over.html
[ 2018-06-01 17:46:09 CET ] [ Original post ]
We're shipping the next stable patch for Neverwinter Nights: Enhanced Edition. If you have been following the Development branch and it's announcements, you will know what to expect! The full list of changes since v1.74 (Build 8166) is:
Server Changes
Features
- The player cap for a single server has been increased to 255 (from 96).(Hint: You can still reserve DM slots by setting a lower limit.)
- Increased the maximum player name length from 32 characters to 127.
- NWScript: Fixed a crash in GetAreaSize() when it was called with the module as the area.
- We added some basic protection against packet flooding that was seen recently.
- Player name checks are now case-insensitive for purposes of locking names to public keys.
- Translations/LocStrings: We’ve made it so that when looking up translated strings (for example, in object descriptions), we first consider the opposite gender before falling back to english.
- Networking: We fixed some issues with masterserver DNS resolving that would, in rare circumstances, drop servers from the master list.
- The Whirlwind attack feat has been fixed.
- We fixed an issue with some creatures not spawning lootable corpses.
- We fixed the following script events for player characters: OnDamaged, OnSpellCastAt, OnMeleeAttacked, OnPerception, and OnCombatRoundEnd.
- We fixed a crash where ActionTakeItem would fail to deposit an item in a full inventory.
- We fixed the server time getting stuck if the module had many areas.
- We fixed a very rare crash when removing many areas via DestroyArea() in one script.
- We fixed SetTransitionTarget() not propagating to clients in all cases.
- Doors can now once again initiate conversations with players (via nw_g0_conversat).
- Also, the game engine does not assign this script to doors, placeables and creatures with no script set anymore, instead just defaulting to it as a temporary override.
Client Changes
Features
- The race selection UI in character generation is now a list (instead of pre-defined buttons) just like class selection.
- Races can now have an icon; defined in the new “Icon” column in racialtypes.2da. This is up to custom content, as we do not currently ship icons for the builtin races.
- New dynamic contrast shader by Søren Møller (Zarathustra217).
- New SSAO shader by Søren Møller (Zarathustra217).
- New Depth Of Field shader by Søren Møller (Zarathustra217).
- Materials: .mtr files can now specify “renderhint”; mesh-specific definitions overrides this.
- Materials: Meshes don’t require a texture if a .mtr was set.
- Materials: In the mesh definition, “bitmap”/”texture0” can be used to define the material instead of “materialname”.
- The Chat Log and Combat Log UI now remember their size between play sessions (in the .ini); they also remember split mode/combined mode.
- UI: All-metallic colours are now animated in the character creation colour picker UI.
- NWN:EE can now accept cyrillic key input again; and display as well, if a suitable (community-made) font override is provided. This is a stopgap measure to support our russian friends while we work on proper UTF-8 support.
- Linux Fullscreen Mode is now properly supported.
- SDL has been updated.
- A crash when joining a server with haks was fixed.
- The multiplayer server browser UI has been fixed to work properly on 1080x2.
- The multiplayer server browser now default-sorts by player count, descending.
- Steam Workshop now logs to the player log for activity (like progress).
- Movie playback on case-sensitive file systems (Linux) and languages with mismatching case movie files has been fixed.
- Garbled sound issues have been fixed.
- We fixed stopping/resuming audio playback when a audio device is (re)connected.
- UI: We fixed the flickering text on loading screens.
- Saving and loading ShadowGuard premium module savegames has been fixed.
- UI: We fixed Escape not working on some main menu panels.
- Renderer: We fixed rendering animated meshes without animations as static (for example, seen as disappearing water on tno01_v20_02).
- Death Attack now shows properly in feat messages in the combat log.
- Incorrectly rendered armour part colours in character generation have been fixed.
- We added a workaround for an issue where servers would get confused by multiple clients behind NAT on on the same port.
- Crash handlers have been improved to address issues with people not seeing the crash message, or not finding the right files to attach to a report.
- We’re now applying FBOs (full-screen post processing effects) in a predefined order to avoid visual corruption when un/checking them in the UI.
- We fixed the Connect button on the Server Details pane not working properly.
- We also fixed the Previous/Next buttons not greying out the Connect button as required.
- HAK and TLK preloading is now checked immediately upon connection; not after character creation. This fixes an issue where players would attempt to join a server with missing haks, only to be kicked after character creation.
- The polish high-res font has been amended to include all needed special characters.
- We fixed a crash in the 2D sound system.
- We fixed an issue in the 3D sound system that would sometimes stutter or hang the game.
- A client crash that would happen when the server sent a visual effect while the client was on a loading screen was addressed.
- A client crash that would happen when the server sent a invalid placeable update was fixed.
- We fixed inventory PLT icons sometimes displaying the wrong colours.
- We addressed some issues with the builtin texture cache sometimes returning the wrong or no image, resulting in visual corruption on layered textures.
- We fixed a crash issue with saving games when the thumbnail could not be generated.
- We fixed the game crashing while exiting a module/game with a floating popup bubble active.
Content Creation Changes
Features
- Object Visual Transformations: You can now scale, translate, rotate the following game objects: Creatures (including players), Items (including held/wielded), Placeables (dynamic only), Doors. You can also adjust the animation speed independently from object scale. This transformation is visual only and has no effect on walkmesh or personal space. (See Scripting Commands below.)
- Materials: We’ve added script calls that allow overriding shader uniforms on materials.
- Double quotes (“) can now be escaped in nwscript (”).
- The toolset can now open unpacked modules: You need to have it unpacked in a directory the same name as the .mod file (without the .mod extension).
- Toolset: You can now move objects along the Z axis by holding down the Alt key and moving the mouse.
- We added the livestream contest winner portrait (po_exornova).
- A crash in the script compiler has been fixed when many includes were nested.
- Utils: We’ve re-added nwhak.exe and gffeditor.exe to the torrent. nwhak.exe now understands all new res types (like .mtr).
- An issue where custom content tiles could not be laid down in the toolset (notably, Seasonal Forest) was fixed.
- We fixed “Stereo WAV in 3D Positional Sound” popping up erroneously in the toolset.
- We fixed the toolset not displaying spells or feats on character sheets.
- We fixed "sqrt DOMAIN error" showing up on binary models without valid tangent data.
New Scripting Commands
int OBJECT_VISUAL_TRANSFORM_SCALE = 10;
int OBJECT_VISUAL_TRANSFORM_ROTATE_X = 21;
int OBJECT_VISUAL_TRANSFORM_ROTATE_Y = 22;
int OBJECT_VISUAL_TRANSFORM_ROTATE_Z = 23;
int OBJECT_VISUAL_TRANSFORM_TRANSLATE_X = 31;
int OBJECT_VISUAL_TRANSFORM_TRANSLATE_Y = 32;
int OBJECT_VISUAL_TRANSFORM_TRANSLATE_Z = 33;
int OBJECT_VISUAL_TRANSFORM_ANIMATION_SPEED = 40;
// Gets a visual transform on the given object.
// - oObject can be any valid Creature, Placeable, Item or Door.
// - nTransform is one of OBJECT_VISUAL_TRANSFORM_*
// Returns the current (or default) value.
float GetObjectVisualTransform(object oObject, int nTransform);
// Sets a visual transform on the given object.
// - oObject can be any valid Creature, Placeable, Item or Door.
// - nTransform is one of OBJECT_VISUAL_TRANSFORM_*
// - fValue depends on the transformation to apply.
// Returns the old/previous value.
float SetObjectVisualTransform(object oObject, int nTransform, float fValue);
// Sets an integer material shader uniform override.
// - sMaterial needs to be a material on that object.
// - sParam needs to be a valid shader parameter already defined on the material.
void SetMaterialShaderUniformInt(object oObject, string sMaterial, string sParam, int nValue);
// Sets a vec4 material shader uniform override.
// - sMaterial needs to be a material on that object.
// - sParam needs to be a valid shader parameter already defined on the material.
// - You can specify a single float value to set just a float, instead of a vec4.
void SetMaterialShaderUniformVec4(object oObject, string sMaterial, string sParam, float fValue1, float fValue2 = 0.0, float fValue3 = 0.0, float fValue4 = 0.0);
// Resets material shader parameters on the given object:
// - Supply a material to only reset shader uniforms for meshes with that material.
// - Supply a parameter to only reset shader uniforms of that name.
// - Supply both to only reset shader uniforms of that name on meshes with that material.
void ResetMaterialShaderUniforms(object oObject, string sMaterial = "", string sParam = "");
Build 8176
v1.75 carries build 8176, which has not been shipped to Development. However, to keep you in the loop, the following changes were made since 8175: Fixes
- We fixed mainhand weapon visual effects not updating correctly.
- We disabled audio hotplugging on Mac, as that resulted in severe audio stuttering. We also reduced the reinitialisation interval to 3 seconds, in case other platforms/systems are affected by this. Audio hotplugging on Mac will be re-enabled once we have time to properly develop and test a fix.
Build 8166
We added a Steam branch called "oldstable", which still contains Build 8166. If you have multiplayer servers that are still on 8166, you can stick to that branch and keep playing until they upgrade.
[ 2018-06-01 15:56:00 CET ] [ Original post ]
Development build 8175 for Neverwinter Nights: Enhanced Edition is here. This build is the new and likely last release candidate for 1.75! We very much appreciate any feedback that comes in from the community. Please try to break this build, and if you are adventurous, even update your server. Let us know if you run into any issues on the usual channels.
Known Issues
- We continue to work with Intel engineers to track down the crash and performance issues we’re seeing on Intel HD GPUs. The moment we have a solution or workaround, we will ship a hotfix.
- We are aware of some premium modules not working properly in multiplayer, and are looking into that.
Fixes
- A crash in the sound system, most noticeable in the UI when clicking buttons. This may also fix 3d audio sources stuttering and hanging the game client.
- We fixed an issue where the server time could become stuck when the module has many areas.
- We fixed a very rare potential crash when removing many areas via DestroyArea() in the same script.
- The SetTransitionTarget() script call did not always propagate changes to clients.
- The “sqrt DOMAIN error” happening in the Toolset on compiled models without tangent data should finally be fixed.
- A client crash was fixed when the server was attempting to add a visual effect while the client did not have an area loaded.
- A client crash was fixed when the server was attempting to update a placeable the client did not know about.
- An issue was fixed where doors would not be able to initiate conversations was fixed. The same change also fixes that the game would auto-assign a script to object events, instead of just overriding a empty one.
- We fixed inventory PLT icons sometimes displaying the wrong colours.
- We fixed an issue where the texture cache would sometimes pull the wrong image, potentially resulting in visual corruption on PLT textures.
- We fixed a saving a game crashing when the thumbnail image could not be created.
- The DOF shader has seen minor improvements to the blurring algorithm used.
- The SSAO shader has seen minor improvements to improve visual accuracy.
- We fixed the game crashing while exiting a module/game with a floating popup bubble active.
- Beamdog credits have been updated.
[ 2018-05-30 22:09:59 CET ] [ Original post ]
Development build 8174 for Neverwinter Nights: Enhanced Edition is now available. This build is the release candidate for 1.75! We would appreciate any and all testing you can give it. If all goes well, we will ship this build as 1.75. This will give NWNX:EE time to prepare ahead of time, and also allow server admins to test and migrate over the coming days. We'll make sure to keep everyone appraised on timing!
Known Issues
- We are working with Intel engineers to track down the crash and performance issues we’re seeing on Intel HD GPUs.
- We are aware of some premium modules not working properly in multiplayer, and are looking into that.
Features
- We’ve added a new, more dynamic depth of field shader kindly provided by Søren Møller.
- We added the livestream contest winner portrait (po_exornova).
Fixes
- Regression: We fixed the New Game server settings UI not being interactable.
- Regression: We fixed the New Game server settings UI disappearing after backing out from character selection.
- The Polish high-res font has been amended to include all needed special characters.
- HAK and TLK preloading is now checked immediately upon connection; not after character creation. This fixes an issue where players would attempt to join a server with missing haks, only to be kicked after character creation.
- We fixed the Connect button on the Server Details pane not working properly.
- We also fixed the Previous/Next buttons not greying out the Connect button as required. We fixed a crash where ActionTakeItem would fail to deposit an item in a full inventory.
- We fixed OnMeleeAttacked and OnDamaged not firing on creatures.
- We fixed the character creation model viewer crashing for racial type appearances without a valid model.
- We fixed the racial selection screen title having the class selection title.
- We fixed Linux Fullscreen mode.
- We fixed “Stereo WAV in 3D Positional Sound” popping up erroneously in the toolset.
- We fixed the toolset not displaying spells or feats on character sheets.
- We’re now applying FBOs (full-screen post processing effects) in a predefined order to avoid visual corruption when un/checking them in the UI.
[ 2018-05-25 20:05:21 CET ] [ Original post ]
Development build 8172 for Neverwinter Nights: Enhanced Edition is now available.
Known Issues
- We are working with Intel engineers to track down the crash and performance issues we’re seeing on Intel HD GPUs. https://trello.com/c/DX1qC8mG/121-known-issues
- We are aware of some premium modules not working properly in multiplayer, and are looking into that.
- (Since 8171) The creature script events “OnDamaged” and “OnMeleeAttacked” regressed and do not work correctly. We’re already fixing it, but it did not make this build by less than two hours.
Features
- The race selection UI in character generation is now a list (instead of pre-defined buttons) just like class selection.
- Races can now have an icon; defined in the new “Icon” column in racialtypes.2da. This is up to custom content, as we do not currently ship icons for the builtin races.
Fixes
- Death Attack now shows properly in feat messages in the combat log. Incorrectly rendered armour part colours in character generation have been fixed.
- We added a workaround for an issue where servers would get confused by multiple clients behind NAT on on the same port.
- An issue where custom content tiles could not be laid down in the toolset (notably, Seasonal Forest) was fixed.
- Crash handlers have been improved to address issues with people not seeing the crash message, or not finding the right files to attach to a report.
- A crash was fixed when tiles with emitters would not have a valid animation node (for example, on the Steamworks tileset).
[ 2018-05-18 18:03:52 CET ] [ Original post ]
Development build 8171 for Neverwinter Nights: Enhanced Edition is available now. We intend to ship the next stable release (1.75) soon. Please give this development patch a good test, and as always - your issue reports on support.baldursgate.com are read and appreciated. As usual, we will be collaborating with the NWNXEE developers to make sure everything is ready for persistent worlds to migrate in a timely manner.
Known Issues
- We are working with Intel engineers to track down the crash and performance issues we’re seeing on Intel HD GPUs.
Features
- Material shader params (added in 8170) are now persisted to gff data (player character vaults, save games).
Fixes
- We fixed a crash when setting shader parameters on objects without an animation base.
- ShadowGuard premium module autosave/quicksave naming has been corrected.
- A crash when joining a server with haks was fixed.
- The Whirlwind attack feat has been fixed.
- We fixed an issue with some creatures not spawning lootable corpses.
- We fixed the area background fog going all black in some areas.
- We fixed the following script events for player characters: OnSpellCastAt, OnMeleeAttacked, OnPerception, and OnCombatRoundEnd.
[ 2018-05-11 18:06:22 CET ] [ Original post ]
Neverwinter Nights: Enhanced Edition 8170 has shipped to the development branch today. We're now stabilising and working our way towards a 1.75 stable release in the coming weeks.
Known Issues
- We are working with Intel engineers to track down the crash and performance issues we’re seeing on Intel HD GPUs.
- We are aware of the Whirlwind bug. It will be addressed soon.
Fixes
- Sound: We fixed an issue where playing weapon hit sounds would access freed memory, sometimes resulting in playing the wrong sound.
- UI: We fixed the flickering text on loading screens.
- UI: We fixed Escape not working on some main menu panels.
- Renderer: We fixed rendering animated meshes without animations as static (for example, seen as disappearing water on tno01_v20_02).
- Object Visual Transforms: We fixed an issue where held-item scaling would reset after a spell was cast.
- Networking: We fixed some issues with masterserver DNS resolving that would, in rare circumstances, drop servers from the master list.
Features
- Materials: We’ve added script calls that allow overriding shader uniforms on materials. This is still work in progress. Yet more flexibility is to come.
- Translations/LocStrings: We’ve made it so that when looking up translated strings (for example, in object descriptions), we first consider the opposite gender before falling back to english.
- Networking: We’re working on detecting port-hopping resulting from bad NAT on the server side.
- UI: All-metallic colours are now animated in the character creation colour picker UI.
- Toolset: You can now move objects along the Z axis by holding down the Alt key and moving the mouse.
- Utils: We’ve re-added nwhak.exe and gffeditor.exe to the game download. nwhak.exe now understands all new res types (like .mtr).
NWScript Additions
// Sets an integer material shader uniform override.
// - sMaterial needs to be a material on that object.
// - sParam needs to be a valid shader parameter already defined on the material.
void SetMaterialShaderUniformInt(object oObject, string sMaterial, string sParam, int nValue);
// Sets a vec4 material shader uniform override.
// - sMaterial needs to be a material on that object.
// - sParam needs to be a valid shader parameter already defined on the material.
// - You can specify a single float value to set just a float, instead of a vec4.
void SetMaterialShaderUniformVec4(object oObject, string sMaterial, string sParam, float fValue1, float fValue2 = 0.0, float fValue3 = 0.0, float fValue4 = 0.0);
// Resets material shader parameters on the given object:
// - Supply a material to only reset shader uniforms for meshes with that material.
// - Supply a parameter to only reset shader uniforms of that name.
// - Supply both to only reset shader uniforms of that name on meshes with that material.
void ResetMaterialShaderUniforms(object oObject, string sMaterial = "", string sParam = "");
[ 2018-05-04 20:37:04 CET ] [ Original post ]
Neverwinter Nights: Enhanced Edition development build 8169 is coming your way. Enjoy these patch notes as the build uploads.
Known Issues
- We are working with Intel engineers to track down the crash and performance issues we’re seeing on Intel HD GPUs. Other
- We renamed “Head Start” on Beamdog Client to “Development” to avoid further confusion. “Development” is the Beta branch where new test releases will ship just like with Head Start before. Persistent Worlds are advised to stick to the stable branch.
- Beamdog credits updated
Fixes
- NWN:EE can now accept cyrillic key input again; and display as well, if a suitable (community-made) font override is provided. This is a stopgap measure to support our russian friends while we work on proper UTF-8 support.
- NWScript: Fixed a crash in GetAreaSize() when it was called with the module as the area.
- We added some basic protection against packet flooding that was seen recently.
- We fixed stopping/resuming audio playback when a audio device is (re)connected.
- Saving and loading ShadowGuard premium module savegames has been fixed.
- Player name checks are now case-insensitive for purposes of locking names to public keys.
Features
- New dynamic contrast shader version by Søren Møller (Zarathustra217).
- New SSAO shader version by Søren Møller (Zarathustra217).
- The player cap for a single server has been increased to 255 (from 96). (Hint: You can still reserve DM slots by setting a lower limit.)
- The Chat Log and Combat Log UI now remember their size between play sessions (in the .ini); they also remember split mode/combined mode.
- Object Visual Transformations: You can now scale, translate, rotate the following game objects: Creatures (including players), Items (including held/wielded), Placeables (dynamic only), Doors. You can also adjust the animation speed independently from object scale. This transformation is visual only and has no effect on walkmesh or personal space.
NWScript Additions
int OBJECT_VISUAL_TRANSFORM_SCALE = 10;
int OBJECT_VISUAL_TRANSFORM_ROTATE_X = 21;
int OBJECT_VISUAL_TRANSFORM_ROTATE_Y = 22;
int OBJECT_VISUAL_TRANSFORM_ROTATE_Z = 23;
int OBJECT_VISUAL_TRANSFORM_TRANSLATE_X = 31;
int OBJECT_VISUAL_TRANSFORM_TRANSLATE_Y = 32;
int OBJECT_VISUAL_TRANSFORM_TRANSLATE_Z = 33;
int OBJECT_VISUAL_TRANSFORM_ANIMATION_SPEED = 40;
// Gets a visual transform on the given object.
// - oObject can be any valid Creature, Placeable, Item or Door.
// - nTransform is one of OBJECT_VISUAL_TRANSFORM_*
// Returns the current (or default) value.
float GetObjectVisualTransform(object oObject, int nTransform);
// Sets a visual transform on the given object.
// - oObject can be any valid Creature, Placeable, Item or Door.
// - nTransform is one of OBJECT_VISUAL_TRANSFORM_*
// - fValue depends on the transformation to apply.
// Returns the old/previous value.
float SetObjectVisualTransform(object oObject, int nTransform, float fValue);
[ 2018-04-27 18:09:02 CET ] [ Original post ]
Known Issues Since Last Build
Ongoing Intel-related crashing problems. The team continues to work on this issue.
Fixes
- Sound: Some undefined behaviour fixes that would have resulted in audio corruption.
- Movie playback on case-sensitive file systems (Linux) and languages with mismatching case movie files has been fixed.
- SDL has been updated to fix more of the remaining window handling/fullscreen issues.
- A buffer overflow in the script compiler has been fixed when many includes were nested.
- A buffer overflow in the script compiler for terrifyingly large scripts has been fixed.
- Toolset: Music delay changing after area save has been fixed.
- Aurora (renderer): Performance optimisation where we don’t re-upload some vertex data to the GPU every frame needlessly.
Features
- The multiplayer server browser now default-sorts by player count, descending.
- Steam Workshop now logs to the player log for activity (like progress).
- Double quotes (“) can now be escaped in nwscript (”).
- The toolset can now open unpacked modules: You need to have it unpacked in a directory the same name as the .mod file (without the .mod extension).
- Materials: .mtr files can now specify “renderhint”; mesh-specific definitions overrides this.
- Materials: Meshes don’t require a texture if a .mtr was set.
- Materials: In the mesh definition, “bitmap”/”texture0” can be used to define the material instead of “materialname”.
[ 2018-04-17 19:14:00 CET ] [ Original post ]
last week v8167 was released on the Development Build containing a few small changes.
Known Issues Since Last Build
- Intel related crashing issues.
Other Fixes
- The multiplayer server browser UI has been fixed to work properly on 2x scaled UI at 1080p.
Features
- Increased maximum player name length from 32 characters to 127.
[ 2018-04-10 16:07:13 CET ] [ Original post ]
Last week v8167 was released on the Development Build containing a few small changes.
Known Issues Since Last Build
- Intel related crashing issues.
Other Fixes
- The multiplayer server browser UI has been fixed to work properly on 2x scaled UI at 1080p.
Features
- Increased maximum player name length from 32 characters to 127.
[ 2018-04-10 16:07:13 CET ] [ Original post ]
Great news for Neverwinter Nights fans! Neverwinter Nights: Enhanced Edition is now live on Steam! Catch the official launch day blog here: http://blog.beamdog.com/2018/03/neverwinter-nights-enhanced-edition_27.html A full changelog taking us from NWN 1.69 to today's Neverwinter Nights: Enhanced Edition is available here: https://www.beamdog.com/files/release_notes/nwnee_release_notes_final.pdf And watch (or re-watch) today's NWN:EE launch day livestream on YouTube: https://youtu.be/S-NA55IW4ZM
[ 2018-03-27 22:46:54 CET ] [ Original post ]
Neverwinter Nights: Enhanced Edition v8166 is now available on Steam and Beamdog. We’re closing in on the March 27 release date fast! This build brings Steam and Beamdog versions back in line and focuses on camera, audio, and part-based item/character issues.
Known Issues
- We are still looking into the Intel Integrated GPU-related crashes on Windows.
- Windows players using the server tool may experience save game corruption if they load the game from a save game rather than a module and then attempt to save the game via the server tool while nobody is logged into the server. In cases like this, please save your game while at least one player is still online.
Fixes
- Fixed clipping/popping on some music tracks.
- Fixed distortion/crackling on music.
- Switched to using OpenALSoft to allow surround sound to work properly.
- Fixed an issue with positional audio listener orientation that was causing undefined behavior.
- Removed UI options that are no longer relevant with OpenAL.
- Fixed case sensitivity issues with opening music files.
- Fixed an array bounds issue in the MP3 decoder.
- Paste (as in copy/paste) has been fixed.
- Fixed the issue where part-based rendering would not attach properly; like crossbows, slings, tails and wings.
- Fixed the camera issue where switching to Drive Mode would lock the zoom-axis erroneously.
- Fixed the camera issue where it would start tilted down in some cases.
- We fixed ANSI-encoding of text (sorry, not UTF-8 yet) in all input modes.
- Everything the NWN chat font supports should now work.
- The console doesn’t emit (or `, depending) anymore when opening it.
- The console cannot be closed anymore with the console-open key. The reason for this is that some console commands require ; i.e. workshopupload. Use ESC instead.
- You can now type ~ and ` in the console.
- We fixed an issue where UI click positions would sometimes not line up with the buttons after switching window mode or resizing the game window.
Features
- Lighting and normal-mapping on static objects has been improved.
- Added a pointer on CGameObject dedicated to NWNX use.
- Numpad Return now acts the same as Enter on the main key block.
- Re-enabled 2x UI scaling on 1080p. Some main menu elements do not fit yet. We plan to update the screens that break so they play nice at 1080p.
nwn.ini
- Under Display Options, you can now set glFinishBeforeFBO=1. This will cost about 20% performance, but will fix post-process rendering issues on some setups, particularly Intel. When turned on, you’ll notice filter “leaking” into the next, producing visual artifacts (You can test this on the console by typing glFinishBeforeFBO=1). The alternative is to only run one post-process filter.
- You can turn on Borderless Window mode by setting Borderless=1 under Display Options.
- You can use DESKTOP-style fullscreen mode (“borderless fullscreen”) by setting FullScreenDesktopMode=1 under Display Options. FullScreen needs to be enabled as well for this to work.
[ 2018-03-23 18:20:20 CET ] [ Original post ]
Neverwinter Nights: Enhanced Edition Patch 8165 is now available on Steam-only. This patch contains Linux-only fixes required for pre-release testing. 8165 will temporarily disable cross play between Steam and Beamdog players. We plan to follow up with another patch in the very near future that will address issues introduced in 8164 and brings Steam and Beamdog versions back in line.
Fixes:
- Added missing libraries required for Ubuntu users to play
Known issues:
- At 2x UI Scaling on a 1080p monitor, some buttons in multiplayer matching are cut off at the bottom of the screen. To work around this, disable 2x UI Scaling while choosing your multiplayer options, then re-enable 2x UI Scaling.
[ 2018-03-22 18:42:04 CET ] [ Original post ]
Busy times at Beamdog! With the March 27 Steam release less than two weeks away, the team is locking down features and fixes. Build 8164 is now available on Steam and Beamdog.com.
Known Issues
- We are still looking into the Intel Integrated GPU-related performance regressions, especially on Mac.
- We are also looking into the Intel Integrated GPU-related crashes on Windows.
- Crossbows & slings have a split/twisted appearance and animation. A fix is planned for 8165.
Fixes
- A crash has been fixed with the toolset that would trigger when re-opening a conversation from search results.
- The toolset should now run on Wine again.
- Toolset script compiler no longer crashes when attempting to include a missing script.
- The toolset now defaults to the NWN user directory when im/exporting erfs.
- The camera bounds as configurable in the .ini now default to 1.69 values (unlocked).
- Toolset crash when deleting an area with a uppercase resref was fixed.
- The multiplayer server list doesn’t select a random server on open anymore.
- The multiplayer server view now displays the server game type properly.
- Combining parts no longer causes some geometry to sometimes disappear.
- Normal mapped static lighting no longer causes lighting to be black for some static geometry.
- Skin animations for parts that are attached now synch up exactly to the attached object and will no longer animate a few frames behind in certain situations.
- Skybox position is now centered on the character, so skybox warping will no longer be apparent when you’re at the edge of large maps.
Features
- Game and server binaries now error out if no data files can be found, instead of crashing.
- The console open/close key can now be typed in the game chat bar.
- Some further memleaks in the Toolset were fixed.
- The toolset script editor now accepts cyrillic/non-ascii input.
- The toolset script compiler identifier limit has been bumped to 16K (from 8K; error manifested was “IDENTIFIER LIST FULL” for some very complex scripts).
- The toolset keeps variables on triggers and encounters when repainting their polygon.
- The toolset is now much faster when opening object properties.
- Steam workshop now supports tags. Simply create a tags.txt file in your project root, containing the tags you want to assign to your upload, one per line.
Toolset area editor improvements:
- Selected objects now don't move on single click
- The object properties dialog opens on double click
- Support for undo/redo operations on object move actions added
NWScript
New functions: GetEventScript, SetEventScript to set NWScript event handlers on any supported object (including PCs).
[ 2018-03-16 17:49:13 CET ] [ Original post ]
During Friday’s livestream, Beamdog CEO Trent Oster and Studio Director Phillip Daigle announced the March 27 release date of Neverwinter Nights: Enhanced Edition on Steam and showed the new look of the Hall of Justice from the Wailing Death campaign.
Find out more in the livestream recap! --> http://blog.beamdog.com/2018/03/march-9-livestream-recap.html
[ 2018-03-10 16:10:57 CET ] [ Original post ]
The latest update to the Development build is here. Lots of exciting stuff here including re-enabling multiplayer for some premium modules. Enjoy!
New Known Issues Since Last Build
The default values for the camera changes in 8163 were too narrow and will be fixed in 8164. If you need this fixed for 8163, simply edit your nwnplayer.ini to contain these values:
[Control Options]
CameraMaxPitch=89.000000
CameraMinDist=1.000000
Fixes
- The multiplayer server list will now properly highlight passworded servers in red.
- The software mouse cursor will no longer hide behind certain UI elements, such as Quit Game.
- The Toolset can now properly select WBM movies instead of BIK.
- Premium Modules now work in multiplayer again. (Note that some modules are not meant to be played in multiplayer and their scripting/design might prevent proper functioning.)
- Some crashes in the UPnP mechanism were fixed.
- Water static lighting problems have been fixed.
- The combining of parts with similar attributes has been re-enabled with support for the new data streams (tangents, additional texture coord streams, vertex color). This should boost performance back to where it was prior to the addition of the new streams.
Features
- The camera limits can now be adjusted in nwnplayer.ini (see below).
- Joining a multiplayer game through the Friends system, while already playing on a server, has been improved.
Configuration
CameraMinPitch, CameraMaxPitch, CameraMinDist, CameraMaxDist in nwnplayer.ini can be used to adjust the camera limits. (They are written on first start to give you the default values).
[ 2018-03-07 18:09:21 CET ] [ Original post ]
Neverwinter Nights: Enhanced Edition Patch 8162 is here and it brings all kinds of multiplayer goodness! Thanks to all our Steam players for trying out builds 8160 and 8161 in the new Development branch.
Fixes
- A memory leak was fixed in the Toolset that would exhibit every time after a script was compiled.
- We now compile the Linux binaries with 64-bit-only filesystem API support (so that nwserver runs properly inside docker-on-mac/windows).
- Fixed a crash in the Toolset when trying to static-light a mesh with zero vertices (as seen by some custom tilesets, and the humongous bell).
- A fix to Steam thumbnails to update properly on changes, not just on initial upload.
- We fixed the Toolset crashing on Intel GPUs.
- A huge shadows-related memleak was fixed in the toolset that would happen when loading areas.
- “Input player name” is no longer covered by the Direct Connect UI.
- LAN “Connect” button now works as expected.
- Toolset now remembers window position between starts.
- Servers displayed in the History/Favourites panel now grey out properly when they are unknown to the masterserver.
Features
- Relays! We added experimental support to carry your connection over authenticated relays, hosted on our end. This is fully automatic and transparent for both players (a relay connection will be chosen if all other attempts fail) and server hosts (servers and scripting will still “see” the actual client IP), and is meant to take care of all remaining connection issues that cannot be handled with UDP hole punching.
- We added support for the material file format (.mtr) as described in last weeks’ patch notes; reproduced below for your convenience.
- Per-vertex static lighting now works properly when normal mapping is enabled: we use a stream that indicates the direction of the brightest light from the location of the vertex, and approximate normal mapping using that information.
- Clicking on “Join Game” in the Steam friends list while already connected to another server will now be handled more gracefully.
- History/Favourites now displays server data from the masterserver list to avoid connection issues.
- LAN enumeration has been slightly improved to find multiple servers on the same host.
- Server listing speed has been improved.
- Toolset performance when loading/accessing placeable-related functions has been improved.
- Toolset performance when working with the object tree in area view has been improved.
- Rendering performance has been improved. (This is not the Skybox issue; we’re still looking into this).
- Windows game and server will now use UPnP to automatically attempt a port map.
NWScript
New script commands:// Get if oPlayer is currently connected over a relay (instead of directly). // Returns FALSE for any other object, including OBJECT_INVALID. int GetIsPlayerConnectionRelayed(object oPlayer);
What follows is a sample material file that includes examples for all currently supported fields:customshaderVS vsSkinned // Specifies a custom vertex shader: vsSkinned.shd customshaderFS fsFancyNew // Specifies a custom fragment shader: fsFancyNew.shd texture0 myDecal // Specifies a texture that will be bound to texUnit0 in the fragment shader. Will override bitmap/tetxure0 in the model texture1 myMask // Binds to texUnit1 in the fragment shader. We support up to fifteen of these textures: texture0 - texture14. parameter float vDiffuse 0.8 1.0 0.65 1.0 // Creates a 4-float parameter that will be bound to a shader uniform of the same name (if it exists) parameter float fModulator 0.5 // Creates a float parameter that will be bound to a shader uniform of the same name (if it exists) parameter int iCount 2 // Creates an int parameter that will be bound to a shader uniform of the same name (if it exists)
To use a material like this one on a mesh, simple add the following line in the .mdl file: materialname myNewMaterial
[ 2018-03-05 17:32:22 CET ] [ Original post ]
Build 8161 is now available in the Neverwinter Nights: Enhanced Edition Development branch. These features and fixes will make their way into the main branch after testing.
The Development branch is available on the Beta tab after opening the game properties menu.
Fixes
- A huge shadows-related memleak was fixed in the toolset that would happen when loading areas.
- “Input player name” is no longer covered by the Direct Connect UI.
- LAN “Connect” button now works as expected.
- Toolset now remembers window position between starts.
- Servers displayed in the History/Favourites panel now grey out properly when they are unknown to the masterserver.
Features
- LAN enumeration has been slightly improved to find multiple servers on the same host.
- Server listing speed has been improved.
- Toolset performance when loading/accessing placeable-related functions has been improved.
- Toolset performance when working with the object tree in area view has been improved.
- Rendering performance has been improved. (This is not the Skybox issue; we’re still looking into this).
- Windows game and server will now use UPnP to automatically attempt a port map.
[ 2018-02-28 17:09:28 CET ] [ Original post ]
We heard you like betas for your betas. The Development beta branch for Neverwinter Nights: Enhanced Edition has just been opened.
This development branch will remain open beyond the launch of NWN:EE for brave souls to supply feedback on early versions of features and fixes. Access it through the Beta tab after opening the game properties menu.
A full list of Development beta branch patch notes will be published as we release new builds.
Development Beta v8160 Patch Notes
Fixes
- A memory leak was fixed in the Toolset that would exhibit every time after a script was compiled.
- We now compile the Linux binaries with 64-bit-only filesystem API support (so that nwserver runs properly inside docker-on-mac/windows).
Regression Fixes
- Fixed a crash in the Toolset when trying to static-light a mesh with zero vertices (as seen by some custom tilesets, and the humongous bell).
- A fix to Steam thumbnails to update properly on changes, not just on initial upload.
- We fixed the Toolset crashing on Intel GPUs.
Features
- Relays! We added experimental support to carry your connection over authenticated relays, hosted on our end. This is fully automatic and transparent for both players (a relay connection will be chosen if all other attempts fail) and server hosts (servers and scripting will still “see” the actual client IP), and is meant to take care of all remaining connection issues that cannot be handled with UDP hole punching.
- We added support for the material file format (.mtr) as described in last weeks’ patch notes. Find those here: http://blog.beamdog.com/2018/02/nwnee-8159-patch-notes-and-steam-beta.html
- Per-vertex static lighting now works properly when normal mapping is enabled: we use a stream that indicates the direction of the brightest light from the location of the vertex, and approximate normal mapping using that information.
- Clicking on “Join Game” in the Steam friends list while already connected to another server will now be handled more gracefully.
- History/Favourites now displays server data from the masterserver list to avoid connection issues.
New script command
// Get if oPlayer is currently connected over a relay (instead of directly).
// Returns FALSE for any other object, including OBJECT_INVALID.
int GetIsPlayerConnectionRelayed(object oPlayer);
[ 2018-02-23 22:53:10 CET ] [ Original post ]
Neverwinter Nights: Enhanced Edition patch 8159 is here and so begins the beta on Steam!
All Head Start owners from Beamdog.com have been provided a Steam key to participate. Join the fun by pre-ordering on Beamdog!
Over the next few weeks, we’d love to hear feedback from Steam players on Friend Lists, Steam Workshop, stability, and about any translation errors.
Find out more in today's blog: http://blog.beamdog.com/2018/02/nwnee-8159-patch-notes-and-steam-beta.html …
Don't forget to tune into the weekly Beamdog livestream on Twitch to get the latest Neverwinter Nights: Enhanced Edition news. We'll be live at 10am PT https://www.twitch.tv/beamdog
[ 2018-02-15 23:56:57 CET ] [ Original post ]
Last week's update introduced a number of features in preparation for a beta on Steam. It also gave us a first glimpse of the brand new Aribeth character model, now available to view through Steam Workshop. While not final, this model shows the standard for future Neverwinter Nights: Enhanced Edition content.
Catch the full stream here:
https://youtu.be/jaLoDNLP7Z0
Steam Beta
Steam beta keys will be available this week. Watch for future announcements here and on Beamdog's social channels for more information.
If you can't wait, pop on over to our beta Discord and request a key from BeamdogBetaManager.
https://discord.gg/fRKuujh
[ 2018-02-12 17:29:53 CET ] [ Original post ]
Curious about what's coming for Neverwinter Nights: Enhanced Edition in future Head Start updates? Want to help decide what should be added to NWN:EE?
We've set up Trello boards to help!
Check out the NWN:EE Roadmap --> https://trello.com/b/K0…/neverwinter-nights-enhanced-edition
Vote for your favorite features & fixes in the Input board --> https://trello.com/b/Lb79bbgy/neverwinter-nights-input
[ 2017-12-18 22:06:54 CET ] [ Original post ]
- Neverwinter Nights Binaries - Linux [14.98 M]
- Neverwinter Nights: Enhanced Edition Infinite Dungeons
- Neverwinter Nights: Enhanced Edition Wyvern Crown of Cormyr
- Neverwinter Nights: Enhanced Edition Pirates of the Sword Coast
- Neverwinter Nights: Enhanced Edition Heroes of Neverwinter Portrait Pack
- Neverwinter Nights: Enhanced Edition Darkness Over Daggerford
- Neverwinter Nights: Enhanced Edition Tyrants of the Moonsea
- Neverwinter Nights: Enhanced Edition Dark Dreams of Furiae
Slink through the shadows as a deadly half-elven rogue, wield fearsome magics as a powerful gnomish sorcerer, vanquish your foes as an armor-clad dwarven paladin... whatever hero you create, incredible adventures await.
Discover magic, wonder, and danger at every turn on your own or with friends in these classic Dungeons & Dragons adventures.
Enhanced Features:
- Improved Display: Your portrait, combat bar, inventory, and other UI elements adjust in size based on your chosen resolution including 1080p and 4k.
- Advanced Graphics Options: Pixel shaders and post-processing effects make for crisper, cleaner visuals. Enable contrast, vibrance, and depth of field options as preferred.
- Community Endorsed: Original developers have teamed with key members of the Neverwinter Nights community to curate important fan-requested improvements to support players, storytellers, and modders.
- Backwards Compatibility: Works with save games, modules, and mods from the original Neverwinter Nights. A galaxy of community created content awaits.
All the content of Neverwinter Nights Diamond Edition:
The original Neverwinter Nights campaign: Find yourself at the center of intrigue, betrayal, and dark magic in Neverwinter Nights. Journey through dangerous cities, monster filled dungeons and deep into uncharted wilderness in search of the cure for a cursed plague ravaging the city of Neverwinter.Two expansion packs:
- Shadows of Undrentide: Another adventure begins in Shadows of Undrentide! Charged by your master to recover four ancient artifacts, travel from the Silver Marches to unravel mysteries of a long-dead magical civilization.
- Hordes of the Underdark: Continue the adventure started in Shadows of Undrentide and journey into the ever-more bizarre and hostile depths of Undermountain to challenge a gathering evil.
Discover over 40 hours of new stories, then go on to sample the hundreds of modules created by community members just like you.
- Kingmaker
- ShadowGuard
- Witch’s Wake
Dungeon Master Client: Become the storyteller! Control monsters, creatures, and characters your players will meet over the course of an adventure.
- OS: Ubuntu 18.04 or equivalent
- Processor: Intel Core i3 3rd gen or equivalentMemory: 4 GB RAM
- Memory: 4 GB RAM
- Graphics: OpenGL 3.3 compatible with 2 GB of VRAM
- Storage: 12 GB available space
[ 6105 ]
[ 1061 ]