Search the Community
Searched results for '/tags/forums/game engines/q=/tags/forums/game engines/' or tags 'forums/game engines/q=/tags/forums/game engines/&'.
-
i am having a hard time searching for specific keyword in bug tracker so i decided to wade into google search and found similar thread with similar issue : https://forums.thedarkmod.com/index.php?/topic/13723-key-drop-melee-animation-glitch/
-
I have got to the end, and found it very challenging and enjoyable. Much appreciated. Some general feedback. 1) The first time I found the Warwick Tower caretaker, I didn't find what I needed to go the next step in the Tower. I went back later, expecting there to be a master key I failed to spot. Which you might expect a caretaker to have. Only because I read in this thread there was a did I know to look for one. A hint in a readable would have seemed appropriate (or did I miss it?) 2) On the outward trip to Fishend, the game was semi-linear, which I found helpful, because it was not always straightforward how to progress to the next area. a) Early on it was evident that the next step was to get into the Art Dealers. b) And when I first reached the Armoury, there seemed no way forward. But because I knew there had to be one, and other options I tried didn't work, I eventually worked out what the route had to be. 3) I eventually found the room with Should I have guessed? Based on ethnicity? 4) I read in this thread what to do about the Clarice objective, but couldn't make it work. So gave up, since it was optional. 5) I did this on Difficult, but only found 7200 out of the target 8000 loot. So clearly I missed stuff, and that's on me. But at least that Objective was optional too.
-
This seems like a futile process to me. We all love TheDarkMod and tremendous work has been done on the engine, but I suspect that when developing a new project, especially commercial, almost everyone would rather go for a more modern engine because the reality is that stealth games are a relatively small niche and you need everything you can get to make people notice and buy your thing. TDM with its historical limits on polycounts (unless switching to lightmaps removed that?) and other features that we're used to and have no problem with but that are not exactly state of the art in my opinion just isn't "it", and it's only going to be less and less "it" over time, despite being a brilliant game on its own. And making the game fully libre just so it can be included in certain distributions' free repos, while stripping out almost everything that makes TDM what it is, the community content, doesn't make sense to me either. If anything that could hurt its reputation because people who tried that wouldn't experience the actual game. I only skimmed parts of the thread, have I missed a good reason to do this? Also, another big issue that I think wasn't spelled out explicitly enough: I too thought that it would be awesome to have TDM on Steam. After looking into it, being educated by others and doing some searching I found out that TDM very likely contains a nontrivial amount of old content that may be seemingly re-licensed as CC-BY-NC, but legally cannot be, as its original license does not allow it. I'm talking specifically about old textures.com content - it uses its own asset license that explicitly disallows being released as CC (because CC allows redistribution anywhere and textures.com license explicitly prohibits that). Yet some of those assets are a part of TDM, and it's likely that nobody knows for sure which ones and how many there are. Textures.com was at one point even recommended as a source to create assets on the wiki. So you may get permission from some old mission author who doesn't even remember that he did this, but his content can still be non-free and in fact infringing on its original license. Realistically nobody cares because there's no damage to textures.com being done (the textures are not being redistributed anywhere, they're "just" being incorrectly rebranded with a license that would allow it), but it makes the whole libre thing even more difficult.
-
EidosMont/Embracer game design deciders or WTF these guys are called have truly improved amazingly: take a niche game, piss off the original fan base by completely redesigning the game, wait 10+ years, then use the annoying redesign once more and make it even more niche by making it VR. But with them, nothing should surprise you anymore. It's a pity, actually. I think the idea of the eye and a thief who finds the thing a few years after Garret's demise would have been quite good... if it had been set up sensibly after the end of Deadly Shadows in the well-known steampunk-medieval setting. The best thing about the trailer is that it contains the warning that the game is being created “in collaboration with Eidos Montreal”. I didn't think those responsible would be so honest. End of announcement.
-
The TDM Unofficial Patch is a personal project of mine to modify some small details that annoyed me in the core game. It wouldn't be possible without many others, so thanks to the whole TDM community for discussions and help, but especially to friendly modders who directly contributed code for it, like Obsttorte, Dragofer, Kingsal, Goldwell, Destined, and snatcher! You can find it under the link below and while over the years there was little progress, in recent times many things have been improved that I never even thought of when I started and some might be worth to be included in the core game. https://www.moddb.com/mods/the-dark-mod/addons/the-dark-mod-unofficial-patch Version Changelog: ------------------ v1.7 20.08.2022 ---- Made loot icon change right back to last tool icon, thanks snatcher. Added new whistle player skill to distract NPCs, thanks to snatcher. Made more lights extinguishable and added info for 4 beta missions. Corrected container bottom fix messing up drawers, thanks Dragofer. Improved unlit behaviour of moveable light sources, thanks snatcher. Corrected lit lamps set to extinguished in maps, thanks to Dragofer. Changed western empire maps so the location of Bridgeport is vague. Added several major city names to the small map, thanks to Kukutoo. Fixed frobing animation not working with bound and carried entities. v1.6 23.07.2022 ---- Improved extinguishing oil lamps, thanks to Dragofer and Obsttorte. Added frobing animation, thanks to Obsttorte, Goldwell and snatcher. Fixed container bottoms and training mission chest, thanks Dragofer. Made doors open faster when running, thanks Obsttorte and snatcher. Added more player tools to training mission and improved text there. Fixed Holy Water doing no damage and Hazard Pay not starting at all. Made all five oil lamps in Sotha's "The Bakery Job" extinguishable. Added blow player skill to snuff out small flames, thanks snatcher. Changed Unarmed icon to make clear that the player always has a bow. v1.5 02.07.2022 ---- Created Invisibility Potion out of cut Speed Potion, thanks Kingsal. Increased arrow head shot damage to both living and undead enemies. Replaced slow matches with easier to handle flints, thanks Kingsal. v1.4 10.03.2022 ---- Replaced Frob Helper with dark Frob Outline and updated to TDM 2.10. Made electric mine stun elite guards too and improved mission names. Renamed mission installation/selection UI mishmash to "activation". v1.3 21.02.2021 ---- Changed flashmine to stunning electric mine and updated to TDM 2.09. Edited more mission names and made threefold candles extinguishable. v1.2 26.08.2020 ---- Updated to TDM 2.08 and fixed custom holywater script compatibility. Added Numbers Scroll showing stealth and loot info, thanks Dragofer. Edited more mission names to avoid truncated descriptions in menus. Added default keys info to training mission and repaired cut lines. v1.1 03.02.2019 ---- Moveable candles can be extinguished directly by frobing the candle. More blackjack immune enemies and inextinguishable candles modified. The key frob distance has been decreased to be that of lockpicking. Holy Water bottles must be thrown directly, but they do more damage. The controls settings menu additions have been updated for TDM 2.07. New mission names have been fixed to fix format and spacing issues. Added looking up and looking down controls for people without mouse. Pointed bad prefabs container open/close sounds to existing effects. Added version info to starting screen and edited some new missions. v1.0 06.05.2018 ---- Many enemies will not become immune to blackjacking when alerted. Oil lamps can be snuffed by frobing, thanks Destined and Obsttorte. The controls settings menu lists that "use" can work on held items. Mission names were syncronized between download and online lists. The controls settings menu lists that "frob" can get or drop items. Astericks were added to official missions to move them to list top. Minor text and format bugs have been fixed in some mission infos.
-
Angling along alleyways, gliding among gamblers, fleecing the financiers, and lip-locking the ladies... Here's the prequel to the earlier-released "Away 1: Air Pocket". That was a bite-sized nautical adventure, but this, the back story, is a full-featured offering. Version 2 (V2) Now Available (2022/03/24). Also BONUS illustrated document: Making of Away 0's Video Cutscenes Why Version 2? V2, built under TDM 2.10, is primarily a spit-and-polish release with little impact on the storyline. While a few of the many changes will be obvious to someone doing a re-visit, most are minor improvements. Also, you can now replay cutscenes without needing a workaround. For more, see the Release Notes. Probably you should wait until after you've played the game at least once to check the docs below out, to avoid getting too many hints. if you get stumped, the Maintenance Guide may be helpful, or the forum thread here. Additional Documents, Available Here and Within the .pk4 These are also included within the .pk4 in the /supplementals/docs/ folder: Away 0 V2 Credits & Acknowledgements.docx Now crediting those with suggestions about V1 Away 0 V2 Maintenance Guide.docx Includes information for potential translators Away 0 Use of Historic Paintings.docx Unchanged from V1 Additional Documents, Available Here Only Away 0 V2 Release Notes - Changes from V1 Release.docx Of most interest to folks giving feedback on V1 BONUS (and NSFW): Making of Away 0's Video Cutscenes.docx Alternative Downloads It is recommended to simply use your installed TDM's mission downloader menu to get this FM (now V2). But if you want to bother with a manual install, here's a link to fetch it: away0.pk4 Version 2 While Version 2 is dmap'd under 2.10, it should still work under 2.09; there are no 2.10-only features used. If you run into problems under 2.09, you can reinstall the old version from here (for a while): away0.pk4 Version 1 (original). Does not includes the Dec 16 2021 patch for then-upcoming TDM 2.10
- 111 replies
-
- 14
-
-
now i want to play syberia the world before unrelatwd , I think with the proliferation of next-generation game engines and the latest graphics effects and features, cards like the rtx 3060/4050 or rx 6600/7600 are like the bottom of the barrel.
-
Fan Mission: The Lieutenant 4: A Reciprocal Gambit by Frost_Salamander
Guest replied to Frost_Salamander's topic in Fan Missions
I think what happens after detection is the major source of jank in this game vis-à-vis tedious alert states and funky running animations, but I've honestly never had any issue with blackjack behavior. It could certainly be better delineated in terms of the animation and hitbox since it's a bit flappy and covers the whole screen, but it's as simple as walking or creeping up to someone and bopping them, I don't get it. The answer is certainly not allowing people to bunny-hop up to guards and KO them on the way past 2 seconds after they've already been alerted, nor just lure them somewhere shadowy and blackjack them on full alert, as seen in the dark engine. The AI is no doubt a long-standing stick in the mud, but I don't think it's blackjacking that's the issue, moreso how detection can work strangely and how most all of the level design goes out the window once the guards are sprinting around the building at full pelt and never going back to idle. -
@chakkmanBefore joining this forum I completed all available fan missions for TDM, but before playing them I had significant experience with other stealth games and fan missions for Thief series and I will tell you that I hated TDM's gameplay for its jankiness, but at the same time, paradoxically, I learned my ways around all those broken mechanics. And yet I still don't think that this jank should be a norm for TDM and your point of view only proves it, because you're not alone who may see things like this when they had better experience in other stealth games. And so this huge pile of gameplay imperfections just does TREMENDOUS disservice to the popularity of TDM, some people may try it and just say to themselves: "Screw this crap, I prefer player friendly games!" and they will be absolutely right. But why I learned to be tolerant to such things? Well, because I saw a lot of passion in all those fan missions I played and still exactly because of this I think that TDM has no right to be so broken. I think that it is mostly thanks to the modding community TDM is not dead, without all the great fan missions barely anybody would ever touch it and they just deserve better platform for their work. The problem here is that TDM wasn't created by a professional game designer, it's harsh but true. As I understand it, the dev team just had their opinion about certain things and instead of doing them in the best way possible they simply ignored all the better examples in the stealth genre.
-
After doing loads of Thief Gold and Thief II missions in the last year or so, I decided to play a TDM mission again, for a change. I'm not sure if it has to do with this particular mission, and the loads of marble floors in it, but, wow... I had my issues with blackjacking before, but, now, even with the indicator on, I miss 9 of 10 K.O.'s, and I have no idea why. Really, this game seriously needs a revision of the hitbox/blackjacking system. It's the biggest crap anyone has ever invented. Maybe someone will tell the person responsible that these systems need a certain amount of tolerance one day. Like, why create a system which is THAT finicky with distances or the area you hit, when most people play on a single screen anyway, where you simply can't measure distance well? Back to Thief fan missions, I guess...
-
I think it's for good. In best case (game would be success and praised by players and critics) we would have new installment in franchise. In worst case (game would be failure and banned by the most) we would have new installment in franchise. Possibly new faces will appear in community. As for "Thief is female" - I don't care. There are Thief 2X and TDM's own Goldwell's mission Noble Affairs so it's not a problem. Making 1998-2004's Garrett some kind of relic from ancient times is not that bad. I have no VR so I hope for non-VR rerelease and/or new non-VR/VR optional game in franchise.
-
The Black Mage ============================================================= Title: The Black Mage Filename: black_mage.pk4 Authors: Grayman, Jack Farmer Testers: datiswous, joebarnin, Shadow, Amadeus, madtaffer, wesp5 Release date: 24.12.2021 (version 1) - 05.03.2022 (version 2) - 23.12.2023 (version 3) Version: 3 (available via in game downloader) ============================================================= Grayman - Mapping, scripting & text for briefing video JackFarmer - Additional mapping & scripting, drafts for readables, conversations and in game comments Amadeus - Revision & editing of all readables, conversations and in game comments Dragofer, joebarnin, datiswous - Troubleshooting ============================================================= Voice Talents (in alphabetical order): AndrosTheOxen - Worried father / Counsel Lester Morlan (fincancial advisor to the lord) Bikerdude - Sami "Sausage" McNulty (the castle's chef) BoyLag - Percy Lockhard (the castle's chronicler) Goldchocobo - Robert (the son of the worried father) / Colton (a fallen Builder) Jedi_Wannabe - Friend of the worried father / Bennett (a fallen Builder) Malasdair - Lt. Godric (chief security officer) New Horizon - Lord Ewan Davenport (the Black Mage) Purgator - The Thief ============================================================= Paintings: New paintings provided by OGDA Grayman avatar painting created by Zerg Rush ============================================================= Assets: New kitchen equipment models provided by STRUNK ============================================================= Geometry: Selected cave architecture orginally created by Bikerdude & Dram for "Blackheart Manor" and later modified for "The Gatehouse" (rearranged with the orignal authors approval) ============================================================= Sound: Wind_rusting trees sound (main menu) taken from freesound.org produced by funwithsound "Madrigal" (briefing video) performed by Anthony Holborne Pub audience sound (briefing video) taken from freesound.org produced by yap-audio-production Footsteps sound (briefing video) taken from freesound.org produced by Nox_Sound Stand up from chair sound (briefing video) taken from freesound.org produced by kupp2 Tape-deck-startup sound (phonogram recording) taken from freesound.org produced by soundjoao Short metal scrape sound (phonogram recording) taken from freesound.org produced by Timbre Chains sound (phonogram recording) taken from freesound.org produced by arnaud-coutancier All other new ambient and sound fx recorded and produced by JackFarmer sometimes with altered sound effects/ambient sounds orginally produced by Gigagooga ============================================================= Video: Story board and sound arrangement by JackFarmer Briefing video produced by SirSmokeALot ============================================================= Known bugs: If you quicksave too soon after killing a fire elemental (within 4-5 seconds), the quickload crashes. (2.09 and 2.10) ============================================================= Production notes: Graymans's son gave this work in progress to the Dark Mod community according to grayman's will in June 2021. After discussions with Dragofer, I overtook this mission in June 2021 and started working on it in September 2021. Since I didn't know what else Grayman had planned, I made up my own story from the end of the briefing. The voice actors did an incredible job. Everyone I asked immediately agreed to complete this work of Grayman. This has now led to a fabulous eight voice actors taking part in this mission - from England, Ireland, Canada and the USA. ============================================================== Let's raise our glasses in Grayman's honor. Otherwise I wish you all happy holidays. Take care of yourself, your loved ones, and all of your friends.
- 151 replies
-
- 27
-
-
-
Mandrasola is a small sized map in which aspiring thief Thomas Porter steals some herbal products from a smuggler. The mission was created by me, Sotha and I wish to thank Bikerdude, BrokenArts and Ocn for playtesting and voice acting. Thanks goes naturally to everyone contributing and making TDM possible. This mission occurs chronologically before the Knighton's Manor, making it the first mission in the Thomas Porter series. Events in chronological order are: Mandrasola, The Knighton's Manor, The Beleaguered Fence, The Glenham Tower and The Transaction. The winter came early and suddenly this year. Weeks of strong blizzards and extremely harsh cold weather hit Bridgeport hard. With the seas completely frozen, a rare occurence indeed, most of the City harbor commerce has stopped completely. Vessels are stuck in the ice and no ship can leave or enter the City, resulting in the availability imported goods declining and their prices skyrocketing. One of these imported items is Mandrasola, a rare herbal product, which is imported overseas from the far southern continents. Mandrasola has its uses in alchemical cures and poisons, but mostly this substance is used for its narcotic qualities by commoners and even the nobility. The problem with Mandrasola is that excessive use is extremely addicting and the withdrawal effects are most grievious. Many are utterly incapable of stopping using Mandrasola and are transformed into quivering human ruins if they do no get their daily dose. And now this expensive and rare substance is running out from the whole City. Me and my fence, Lark Butternose, would love to grab this monopoly to ourselves: selling the last few doses in the City would probably be worth a fortune. According to Lark's sources, there remains only one smuggling lord who still has Mandrasola in stock. The problem is that this individual maintains an exclusive clandestine operation and only supplies a few nobles. Despite our best information gathering efforts we couldn't learn who the smuggler is and where he or she operates. Luckily we have an alternate plan. While searching for Mandrasola related information, we learned that a noblewoman called Lady Ludmilla is addicted to the substance and has paid high prices for small amounts of it. We also know that she has visited frequently someone in the Tanner's Ward waterfront, and since she goes to the area personally we believe she is visiting the smuggler. The plan is simple: I must monitor Ludmilla's most likely entryway to the Waterfront and then follow her to the smugglers hideout. I'd better be very careful around Ludmilla. She must not realise I'm following her or she probably won't lead me to her dealer. Hurting her is also out of the question. After she leads me to the smuggler's hideout, I can take my time to break in carefully and steal all the Mandrasola I can find. While I'm there it wouldn't be a bad idea to grab some loose valuables as well. I've now waited in the blistering cold for a few hours already. Looks like there are a few city watch patrols in the area to complicate matters... I think I heard a womans voice beyond the north gate. That must be lady Ludmilla, I haven't seen many ladies in these parts. I'd better get ready.. Links: Use the ingame downloader to get it. WARNING! Someone always fails to use spoiler tags. I do not recommend reading any further until you've played the mission.
-
Not a new game (2019), but had not seen it before: https://www.gog.com/en/game/mages_initiation_reign_of_the_elements It's from the people that made the King Quest 1-3 remasters (AGD)
-
Hey I just wanted to create a Thread where everybody can post his improvement wishes. I Personally love this mod. There are so many features in it, and because it is a mod created by a community, why not write what could be improved. My wishes are: Some special weapons. I loved T2X and the variety of weapons. Some really hard to find special weapons, like the confusion arrow or a special bomb would be cool. But they have to be very special, for example as a result of a side quest - or maybe a usable torch for easier killing the undead More enemies, I think there will be an improvement, we just got spiders and zombies, but a higher variety is always good. More (custom) conversation. Thats one of the main parts I'm missing - so much flair and atmosphere is getting lost without them. Also some comments from he main charakter would be nice. For example when a guard gets knocked out "hah, now who's the taffer" ... better AI when the hear a voice. They start looking for you, but most of the time I just sneak into another room or a higher area and just have to wait, they should at least get someone with a torch or call other guards for help These are only small parts of the game which could be improved and are only my points of view, maybe it's either not possible to create or it fits not in the design of TDM.
-
For the people eager to play with the latest state of development, two things are provided: regular dev builds source code SVN repository Development builds are created once per a few weeks from the current trunk. They can be obtained via tdm_installer. Just run the installer, check "Get Custom Version" on the first page, then select proper version in "dev" folder on the second page. Name of any dev version looks like devXXXXX-YYYY, where XXXXX and YYYY are SVN revision numbers from which the build was created. The topmost version in the list is usually the most recent one. Note: unless otherwise specified, savegames are incompatible between any two versions of TDM! Programmers can obtain source code from SVN repository. Trunk can be checked out from here: https://svn.thedarkmod.com/publicsvn/darkmod_src/trunk/ SVN root is: https://svn.thedarkmod.com/publicsvn/darkmod_src Build instructions are provided inside repository. Note that while you can build executable from the SVN repository, TDM installation of compatible version is required to run it. Official TDM releases are compatible with source code archives provided on the website, and also with corresponding release tags in SVN. A dev build is compatible with SVN trunk of revision YYYY, where YYYY is the second number in its version (as described above). If you only want to experiment with the latest trunk, using the latest dev build gives you the maximum chance of success. P.S. Needless to say, all of this comes with no support. Although we would be glad if you catch and report bugs before the next beta phase starts
- 2 replies
-
- 15
-
-
-
The Creeps By Mortem Desino Available via the In-Game Downloader (approx. 60 MB) It crawls upon human minds why some are bound up in grave sins. For what does it profit a man if he remains devoted to the nether creatures? Surely such deeds shall earn no portion from the Lord Builder. Such a man has destroyed his high place in Heaven. --Bishop Deifer, Letters to the Builder Clerics This is a small experimental gameplay FM, exploring a few shock/creep/horror capabilities of TDM. It was designed to be played but one time: so give yourself some time to explore a relatively small space. Updated to v1.01 -- July 7, 2012
-
Story: "Sir Barrington, as he likes to be known, enjoys a prestigious reputation of having lavish yet intimate dinner parties. I've heard the tales about what goes on in the noble's dining room, but I believed none of them 'till now. Orbach, a local shop-keep who makes special deliveries to the people of 'high stature' heard Sir Henry Hughbellow raving about Sir Barrington's special 'Elixir', It cures your ails and gives you vigor... By the Hammer, it extends your very life! he exclaimed. Orbach begged Sir Henry for a small sample, and after one sip he was sure that the potion was nothing more than mineral water and spirit. He asked Sir Henry if other folks were as fond of the elixir as he was, and he found out that folks are paying handsomely for these small vials on a weekly basis. Some lords pay for exclusive treatments and bathe in the tonic. Lord Barrington even brings in an occult expert every month, where supposedly the power of the elixir is renewed by the full moon. Never one to pass up the opportunity for a good scam, Orbach has decided to take a cut of this 'elixir' business. He has made an elixir of his own, but needs to convince Sir Henry that it's really the same as the 'magical' tonic that Lord Barrington has been selling. And that's where I come in. Its rumered that Sir Barrington's prized possession is a painting of the revolutionary inventor 'Guillermo de Sohase' the day after he won the Battle of Billinsdune. If I can steal this painting, Orbach can use it to 'prove' that he also got the elixir from Sir Barrington. Once Sir Henry tells all his friends that Orbach's stolen elixir is healing his heart, soothing his pains, and igniting his libido, they'll be lining up at his shop. Its time to go." Build Time: Version 1.0 was speed build of sorts, to build upon Springheels video's with the new modules. Took roughly 20hrs to build but this ended up happening over the space of a few months.http://forums.thedarkmod.com/topic/18808-bikerdudes-speedish-build-using-the-new-modules/?hl=%2Bspeed+%2BbuildThanks: Co-auther: Obstortte for all his custom entities, scripting and showing me a thing or two about perfing.Resource: Springheel - new modulesReadables: nbhor1moreTesters: Bienie, Judith, Abusimplea, Cambridge Spy, Gerberox, MayheM, Amadeus, Goldwell, nbhor1more.Download: - mega Info: Repeat after me, "Read and explore, Read and explore"Known issues: This mission has been heavily tweaked and worked on to provide a playable experience for even low end machines.For very low end PC's please make use of the in-game LOD slider, as not only are details reduced, but the ambient_world fog is removed at the lowest setting.The medium difficulty is partially broken, the mission wont end when the player gets to the exit location. As this is the only issue with that difficulty level, I will fix this when I next update it to include the intro.
- 105 replies
-
- 20
-
-
UPDATE! Version 2 is now available. It addresses most of the issues people have found, but the main highlight is a new in-game map provided by the talented @Airship-Ballet! Unlike version 1, the map isn't in your inventory to start with. You need to find it but it's not hidden. Changelog: https://github.com/FrostSalamander/lt4/releases/tag/2.0 Download: https://drive.proton.me/urls/PV79JTNVAW#7zDvAvipKG0I @nbohr1more could you please update the FM database?
-
For AAA or AA games, Dishonored is probably as good as it gets in terms of understanding the core elements of the game, while it was something entirely different, of course. I must say that I'm not even mad about the developers of Thief 4, for doing it the way they did, as it's a reboot, and it simply reflects their vision of a game like that. It's just that the game is irrelevant to me, as neither the gameplay or lore are on the same level as the original gameplay and lore. TBH, I'm always surprised and stunned again, how good the lore of the original Thief games is. Some real thought, imagination, and humour went into that, which is pretty much spot on in terms of what I like.
-
Fm Down by the Riverside crash to desktop
nbohr1more replied to datiswous's topic in TDM Tech Support
Improved formatting: Thread 38 "Frontend" received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7fffb98006c0 (LWP 1220544)] 0x00007ffff48d5d29 in ?? () from /lib/x86_64-linux-gnu/libGLdispatch.so.0 (gdb) bt #0 0x00007ffff48d5d29 in ?? () from /lib/x86_64-linux-gnu/libGLdispatch.so.0 #1 0x0000000000be43c7 in GLSLProgram::Destroy (this=0x10fe9290) at darkmod_src/renderer/backend/GLSLProgram.cpp:61 #2 0x0000000000bece3e in GLSLProgramManager::LoadFromGenerator(char const*, std::function<void (GLSLProgram*)> const&) (this=0x2107cc0 <programManagerInstance>, name=0x7fffb013a1f0 "ambientEnvironment", generator=...) at darkmod_src/renderer/backend/GLSLProgramManager.cpp:103 #3 0x0000000000bec407 in GLSLProgramManager::Load (this=0x2107cc0 <programManagerInstance>, name=..., defines=...) at darkmod_src/renderer/backend/GLSLProgramManager.cpp:74 #4 0x0000000000cc642f in GLSL_LoadMaterialStageProgram (name=0x7ffed4053f40 "ambientEnvironment") at darkmod_src/renderer/resources/Material.cpp:783 #5 0x0000000000cc9602 in idMaterial::ParseStage (this=0x7ffed40069b0, src=..., trpDefault=TR_REPEAT) at darkmod_src/renderer/resources/Material.cpp:1568 #6 0x0000000000ccd04e in idMaterial::ParseMaterial (this=0x7ffed40069b0, src=...) at darkmod_src/renderer/resources/Material.cpp:2470 #7 0x0000000000ccd626 in idMaterial::Parse (this=0x7ffed40069b0, text=0x7fffb97eda30 "\n\npainting03_L\n{\n\tqer_editorimage\tmodels/darkmod/props/textures/painting03_l_d_ed\n\twood\n\n\tdiffusemap\tmodels/darkmod/props/textures/painting03_l_d\n\tbumpmap\t\tmodels/darkmod/props/textures/painting01_loc"..., textLength=1329) at darkmod_src/renderer/resources/Material.cpp:2559 #8 0x000000000049631d in idDeclLocal::ParseLocal (this=0x57c0bd0) at darkmod_src/framework/DeclManager.cpp:2318 #9 0x000000000049263f in idDeclManagerLocal::FindType (this=0x16fdc00 <declManagerLocal>, type=DECL_MATERIAL, name=0x7ffed40c03f0 "painting03_l", makeDefault=true) at darkmod_src/framework/DeclManager.cpp:1235 #10 0x0000000000494300 in idDeclManagerLocal::FindMaterial (this=0x16fdc00 <declManagerLocal>, name=0x7ffed40c03f0 "painting03_l", makeDefault=true) at darkmod_src/framework/DeclManager.cpp:1633 #11 0x000000000049f3ed in idDeclSkin::Parse (this=0x7ffed4034ad0, text=0x7fffb97ee290 "\n\nportrait_with_skull02_torn\n{\nmodel models/darkmod/decorative/wall/painting01.lwo\nmodel models/darkmod/decorative/wall/painting01_m.lwo\nmodel models/darkmod/decorative/wall/painting01_l.lwo\nmodel mod"..., textLength=404) at darkmod_src/framework/DeclSkin.cpp:78 #12 0x000000000049631d in idDeclLocal::ParseLocal (this=0x59f3e10) at darkmod_src/framework/DeclManager.cpp:2318 #13 0x000000000049263f in idDeclManagerLocal::FindType (this=0x16fdc00 <declManagerLocal>, type=DECL_SKIN, name=0x7ffed408bc6c "portrait_with_skull02_torn", makeDefault=true) at darkmod_src/framework/DeclManager.cpp:1235 #14 0x0000000000494382 in idDeclManagerLocal::FindSkin (this=0x16fdc00 <declManagerLocal>, name=0x7ffed408bc6c "portrait_with_skull02_torn", makeDefault=true) at darkmod_src/framework/DeclManager.cpp:1643 --Type <RET> for more, q to quit, c to continue without paging-- #15 0x000000000055a6bb in idEntity::Event_SetSkin (this=0x7ffed408d324, skinname=0x7ffed408bc6c "portrait_with_skull02_torn") at darkmod_src/game/Entity.cpp:7114 #16 0x0000000000987646 in idClass::ProcessEventArgPtr (this=0x7ffed408d324, ev=0x1f5ef00 <EV_SetSkin>, data=0x7fffb97ee600) at darkmod_src/game/gamesys/Callbacks.cpp:26 #17 0x0000000000a5a847 in idInterpreter::CallEvent (this=0x7ffed408b444, func=0x7ffff7961388, argsize=132) at darkmod_src/game/script/Script_Interpreter.cpp:817 #18 0x0000000000a5b1f7 in idInterpreter::Execute (this=0x7ffed408b444) at darkmod_src/game/script/Script_Interpreter.cpp:1091 #19 0x0000000000a6a0ce in idThread::Execute (this=0x7ffed408b414) at darkmod_src/game/script/Script_Thread.cpp:949 #20 0x0000000000561c23 in idEntity::FrobAction (this=0x16762504, frobMaster=true, isFrobPeerAction=false) at darkmod_src/game/Entity.cpp:9544 #21 0x000000000067d033 in idPlayer::PerformFrob (this=0x156bf4e4, impulseState=EPressed, target=0x16762504, allowUseCurrentInvItem=true) at darkmod_src/game/Player.cpp:11843 #22 0x000000000067d916 in idPlayer::PerformFrob (this=0x156bf4e4) at darkmod_src/game/Player.cpp:12047 #23 0x000000000066884c in idPlayer::PerformImpulse (this=0x156bf4e4, impulse=41) at darkmod_src/game/Player.cpp:5935 #24 0x00000000006696f4 in idPlayer::EvaluateControls (this=0x156bf4e4) at darkmod_src/game/Player.cpp:6347 #25 0x000000000066e72d in idPlayer::Think (this=0x156bf4e4) at darkmod_src/game/Player.cpp:7616 #26 0x00000000005ba9dd in idGameLocal::RunFrame (this=0x16b3a40 <gameLocal>, clientCmds=0x7fffb97eebe0, timestepMs=17, minorTic=false) at darkmod_src/game/Game_local.cpp:3397 #27 0x00000000004cac3c in idSessionLocal::RunGameTic (this=0x17055a0 <sessLocal>, timestepMs=17, minorTic=false) at darkmod_src/framework/Session.cpp:2997 #28 0x00000000004cb020 in idSessionLocal::RunGameTics (this=0x17055a0 <sessLocal>) at darkmod_src/framework/Session.cpp:3043 #29 0x00000000004cb291 in idSessionLocal::FrontendThreadFunction (this=0x17055a0 <sessLocal>) at darkmod_src/framework/Session.cpp:3104 #30 0x00000000004cb6bc in operator() (__closure=0x0, x=0x17055a0 <sessLocal>) at darkmod_src/framework/Session.cpp:3186 #31 0x00000000004cb6e4 in _FUN () at darkmod_src/framework/Session.cpp:3188 #32 0x00007ffff769caa4 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:447 #33 0x00007ffff7729c3c in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78 (gdb) thread 1 [Switching to thread 1 (Thread 0x7ffff7ccf4c0 (LWP 1220498))] #0 0x00007ffff771b4cd in __GI___poll (fds=0x7fffffffd4e8, nfds=1, timeout=1000) at ../sysdeps/unix/sysv/linux/poll.c:29 warning: 29 ../sysdeps/unix/sysv/linux/poll.c: No such file or directory (gdb) bt #0 0x00007ffff771b4cd in __GI___poll (fds=0x7fffffffd4e8, nfds=1, timeout=1000) at ../sysdeps/unix/sysv/linux/poll.c:29 #1 0x00007fffd661d9df in ?? () from /lib/x86_64-linux-gnu/libnvidia-glcore.so.570.124.04 #2 0x00007fffd6603b11 in ?? () from /lib/x86_64-linux-gnu/libnvidia-glcore.so.570.124.04 #3 0x00007ffff3f7a1ec in ?? () from /lib/x86_64-linux-gnu/libGLX_nvidia.so.0 #4 0x00007ffff3f48500 in ?? () from /lib/x86_64-linux-gnu/libGLX_nvidia.so.0 #5 0x0000000000d95c36 in GLimp_SwapBuffers () at darkmod_src/sys/linux/glimp.cpp:76 #6 0x0000000000bf4ba0 in RB_SwapBuffers () at darkmod_src/renderer/backend/tr_backend.cpp:608 #7 0x000000000074adf1 in R_IssueRenderCommands (frameData=0x1fb31a0 <smpFrameData+96>) at darkmod_src/renderer/RenderSystem.cpp:173 #8 0x000000000074c6e6 in idRenderSystemLocal::EndFrame (this=0x1fa7c60 <tr>, frontEndMsec=0x0, backEndMsec=0x0) at darkmod_src/renderer/RenderSystem.cpp:768 #9 0x00000000004c9cb9 in idSessionLocal::UpdateScreen (this=0x17055a0 <sessLocal>, outOfSequence=false) at darkmod_src/framework/Session.cpp:2716 #10 0x000000000047477f in idCommonLocal::Frame (this=0x16de8c0 <commonLocal>) at darkmod_src/framework/Common.cpp:2479 #11 0x0000000000d99481 in main (argc=1, argv=0x7fffffffdd68) at darkmod_src/sys/posix/platform_linux.cpp:490 -
Fm Down by the Riverside crash to desktop
covert_caedes replied to datiswous's topic in TDM Tech Support
Probably makes sense to discuss this issue here instead of in the generic Shadows of Northdale 1 thread (where the same issue occured). I compiled the latest Darkmod source (Debug build) and reproduced the crash with that. The crash indeed does *not* happen in the main thread, but the "Frontend" thread: Thread 38 "Frontend" received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7fffb98006c0 (LWP 1220544)] 0x00007ffff48d5d29 in ?? () from /lib/x86_64-linux-gnu/libGLdispatch.so.0 (gdb) bt #0 0x00007ffff48d5d29 in ?? () from /lib/x86_64-linux-gnu/libGLdispatch.so.0 #1 0x0000000000be43c7 in GLSLProgram::Destroy (this=0x10fe9290) at darkmod_src/renderer/backend/GLSLProgram.cpp:61 #2 0x0000000000bece3e in GLSLProgramManager::LoadFromGenerator(char const*, std::function<void (GLSLProgram*)> const&) (this=0x2107cc0 <programManagerInstance>, name=0x7fffb013a1f0 "ambientEnvironment", generator=...) at darkmod_src/renderer/backend/GLSLProgramManager.cpp:103 #3 0x0000000000bec407 in GLSLProgramManager::Load (this=0x2107cc0 <programManagerInstance>, name=..., defines=...) at darkmod_src/renderer/backend/GLSLProgramManager.cpp:74 #4 0x0000000000cc642f in GLSL_LoadMaterialStageProgram (name=0x7ffed4053f40 "ambientEnvironment") at darkmod_src/renderer/resources/Material.cpp:783 #5 0x0000000000cc9602 in idMaterial::ParseStage (this=0x7ffed40069b0, src=..., trpDefault=TR_REPEAT) at darkmod_src/renderer/resources/Material.cpp:1568 #6 0x0000000000ccd04e in idMaterial::ParseMaterial (this=0x7ffed40069b0, src=...) at darkmod_src/renderer/resources/Material.cpp:2470 #7 0x0000000000ccd626 in idMaterial::Parse (this=0x7ffed40069b0, text=0x7fffb97eda30 "\n\npainting03_L\n{\n\tqer_editorimage\tmodels/darkmod/props/textures/painting03_l_d_ed\n\twood\n\n\tdiffusemap\tmodels/darkmod/props/textures/painting03_l_d\n\tbumpmap\t\tmodels/darkmod/props/textures/painting01_loc"..., textLength=1329) at darkmod_src/renderer/resources/Material.cpp:2559 #8 0x000000000049631d in idDeclLocal::ParseLocal (this=0x57c0bd0) at darkmod_src/framework/DeclManager.cpp:2318 #9 0x000000000049263f in idDeclManagerLocal::FindType (this=0x16fdc00 <declManagerLocal>, type=DECL_MATERIAL, name=0x7ffed40c03f0 "painting03_l", makeDefault=true) at darkmod_src/framework/DeclManager.cpp:1235 #10 0x0000000000494300 in idDeclManagerLocal::FindMaterial (this=0x16fdc00 <declManagerLocal>, name=0x7ffed40c03f0 "painting03_l", makeDefault=true) at darkmod_src/framework/DeclManager.cpp:1633 #11 0x000000000049f3ed in idDeclSkin::Parse (this=0x7ffed4034ad0, text=0x7fffb97ee290 "\n\nportrait_with_skull02_torn\n{\nmodel models/darkmod/decorative/wall/painting01.lwo\nmodel models/darkmod/decorative/wall/painting01_m.lwo\nmodel models/darkmod/decorative/wall/painting01_l.lwo\nmodel mod"..., textLength=404) at darkmod_src/framework/DeclSkin.cpp:78 #12 0x000000000049631d in idDeclLocal::ParseLocal (this=0x59f3e10) at darkmod_src/framework/DeclManager.cpp:2318 #13 0x000000000049263f in idDeclManagerLocal::FindType (this=0x16fdc00 <declManagerLocal>, type=DECL_SKIN, name=0x7ffed408bc6c "portrait_with_skull02_torn", makeDefault=true) at darkmod_src/framework/DeclManager.cpp:1235 #14 0x0000000000494382 in idDeclManagerLocal::FindSkin (this=0x16fdc00 <declManagerLocal>, name=0x7ffed408bc6c "portrait_with_skull02_torn", makeDefault=true) at darkmod_src/framework/DeclManager.cpp:1643 --Type <RET> for more, q to quit, c to continue without paging-- #15 0x000000000055a6bb in idEntity::Event_SetSkin (this=0x7ffed408d324, skinname=0x7ffed408bc6c "portrait_with_skull02_torn") at darkmod_src/game/Entity.cpp:7114 #16 0x0000000000987646 in idClass::ProcessEventArgPtr (this=0x7ffed408d324, ev=0x1f5ef00 <EV_SetSkin>, data=0x7fffb97ee600) at darkmod_src/game/gamesys/Callbacks.cpp:26 #17 0x0000000000a5a847 in idInterpreter::CallEvent (this=0x7ffed408b444, func=0x7ffff7961388, argsize=132) at darkmod_src/game/script/Script_Interpreter.cpp:817 #18 0x0000000000a5b1f7 in idInterpreter::Execute (this=0x7ffed408b444) at darkmod_src/game/script/Script_Interpreter.cpp:1091 #19 0x0000000000a6a0ce in idThread::Execute (this=0x7ffed408b414) at darkmod_src/game/script/Script_Thread.cpp:949 #20 0x0000000000561c23 in idEntity::FrobAction (this=0x16762504, frobMaster=true, isFrobPeerAction=false) at darkmod_src/game/Entity.cpp:9544 #21 0x000000000067d033 in idPlayer::PerformFrob (this=0x156bf4e4, impulseState=EPressed, target=0x16762504, allowUseCurrentInvItem=true) at darkmod_src/game/Player.cpp:11843 #22 0x000000000067d916 in idPlayer::PerformFrob (this=0x156bf4e4) at darkmod_src/game/Player.cpp:12047 #23 0x000000000066884c in idPlayer::PerformImpulse (this=0x156bf4e4, impulse=41) at darkmod_src/game/Player.cpp:5935 #24 0x00000000006696f4 in idPlayer::EvaluateControls (this=0x156bf4e4) at darkmod_src/game/Player.cpp:6347 #25 0x000000000066e72d in idPlayer::Think (this=0x156bf4e4) at darkmod_src/game/Player.cpp:7616 #26 0x00000000005ba9dd in idGameLocal::RunFrame (this=0x16b3a40 <gameLocal>, clientCmds=0x7fffb97eebe0, timestepMs=17, minorTic=false) at darkmod_src/game/Game_local.cpp:3397 #27 0x00000000004cac3c in idSessionLocal::RunGameTic (this=0x17055a0 <sessLocal>, timestepMs=17, minorTic=false) at darkmod_src/framework/Session.cpp:2997 #28 0x00000000004cb020 in idSessionLocal::RunGameTics (this=0x17055a0 <sessLocal>) at darkmod_src/framework/Session.cpp:3043 #29 0x00000000004cb291 in idSessionLocal::FrontendThreadFunction (this=0x17055a0 <sessLocal>) at darkmod_src/framework/Session.cpp:3104 #30 0x00000000004cb6bc in operator() (__closure=0x0, x=0x17055a0 <sessLocal>) at darkmod_src/framework/Session.cpp:3186 #31 0x00000000004cb6e4 in _FUN () at darkmod_src/framework/Session.cpp:3188 #32 0x00007ffff769caa4 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:447 #33 0x00007ffff7729c3c in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78 The main thread calls GLimp_SwapBuffers() at the same time: (gdb) thread 1 [Switching to thread 1 (Thread 0x7ffff7ccf4c0 (LWP 1220498))] #0 0x00007ffff771b4cd in __GI___poll (fds=0x7fffffffd4e8, nfds=1, timeout=1000) at ../sysdeps/unix/sysv/linux/poll.c:29 warning: 29 ../sysdeps/unix/sysv/linux/poll.c: No such file or directory (gdb) bt #0 0x00007ffff771b4cd in __GI___poll (fds=0x7fffffffd4e8, nfds=1, timeout=1000) at ../sysdeps/unix/sysv/linux/poll.c:29 #1 0x00007fffd661d9df in ?? () from /lib/x86_64-linux-gnu/libnvidia-glcore.so.570.124.04 #2 0x00007fffd6603b11 in ?? () from /lib/x86_64-linux-gnu/libnvidia-glcore.so.570.124.04 #3 0x00007ffff3f7a1ec in ?? () from /lib/x86_64-linux-gnu/libGLX_nvidia.so.0 #4 0x00007ffff3f48500 in ?? () from /lib/x86_64-linux-gnu/libGLX_nvidia.so.0 #5 0x0000000000d95c36 in GLimp_SwapBuffers () at darkmod_src/sys/linux/glimp.cpp:76 #6 0x0000000000bf4ba0 in RB_SwapBuffers () at darkmod_src/renderer/backend/tr_backend.cpp:608 #7 0x000000000074adf1 in R_IssueRenderCommands (frameData=0x1fb31a0 <smpFrameData+96>) at darkmod_src/renderer/RenderSystem.cpp:173 #8 0x000000000074c6e6 in idRenderSystemLocal::EndFrame (this=0x1fa7c60 <tr>, frontEndMsec=0x0, backEndMsec=0x0) at darkmod_src/renderer/RenderSystem.cpp:768 #9 0x00000000004c9cb9 in idSessionLocal::UpdateScreen (this=0x17055a0 <sessLocal>, outOfSequence=false) at darkmod_src/framework/Session.cpp:2716 #10 0x000000000047477f in idCommonLocal::Frame (this=0x16de8c0 <commonLocal>) at darkmod_src/framework/Common.cpp:2479 #11 0x0000000000d99481 in main (argc=1, argv=0x7fffffffdd68) at darkmod_src/sys/posix/platform_linux.cpp:490 -
Hi folks, and thanks so much to the devs & mappers for such a great game. After playing a bunch over Christmas week after many years gap, I got curious about how it all went together, and decided to learn by picking a challenge - specifically, when I looked at scripting, I wondered how hard it would be to add library calls, for functionality that would never be in core, in a not-completely-hacky-way. Attached is an example of a few rough scripts - one which runs a pluggable webserver, one which logs anything you pick up to a webpage, one which does text-to-speech and has a Phi2 LLM chatbot ("Borland, the angry archery instructor"). The last is gimmicky, and takes 20-90s to generate responses on my i7 CPU while TDM runs, but if you really wanted something like this, you could host it and just do API calls from the process. The Piper text-to-speech is much more potentially useful IMO. Thanks to snatcher whose Forward Lantern and Smart Objects mods helped me pull example scripts together. I had a few other ideas in mind, like custom AI path-finding algorithms that could not be fitted into scripts, math/data algorithms, statistical models, or video generation/processing, etc. but really interested if anyone has ideas for use-cases. TL;DR: the upshot was a proof-of-concept, where PK4s can load new DLLs at runtime, scripts can call them within and across PK4 using "header files", and TDM scripting was patched with some syntax to support discovery and making matching calls, with proper script-compile-time checking. Why? Mostly curiosity, but also because I wanted to see what would happen if scripts could use text-to-speech and dynamically-defined sound shaders. I also could see that simply hard-coding it into a fork would not be very constructive or enlightening, so tried to pick a paradigm that fits (mostly) with what is there. In short, I added a Library idClass (that definitely needs work) that will instantiate a child Library for each PK4-defined external lib, each holding an eventCallbacks function table of callbacks defined in the .so file. This almost follows the idClass::ProcessEventArgsPtr flow normally. As such, the so/DLL extensions mostly behave as sys event calls in scripting. Critically, while I have tried to limit function reference jumps and var copies to almost the same count as the comparable sys event calls, this is not intended for performance critical code - more things like text-to-speech that use third-party libraries and are slow enough to need their own (OS) thread. Why Rust? While I have coded for many years, I am not a gamedev or modder, so I am learning as I go on the subject in general - my assumption was that this is not already a supported approach due to stability and security. It seems clear that you could mod TDM in C++ by loading a DLL alongside and reaching into the vtable, and pulling strings, or do something like https://github.com/dhewm/dhewm3-sdk/ . However, while you can certainly kill a game with a script, it seems harder to compile something that will do bad things with pointers or accidentally shove a gigabyte of data into a string, corrupt disks, run bitcoin miners, etc. and if you want to do this in a modular way to load a bunch of such mods then that doesn't seem so great. So, I thought "what provides a lot of flexibility, but some protection against subtle memory bugs", and decided that a very basic Rust SDK would make it easy to define a library extension as something like: #[therustymod_lib(daemon=true)] mod mod_web_browser { use crate::http::launch; async fn __run() { print!("Launching rocket...\n"); launch().await } fn init_mod_web_browser() -> bool { log::add_to_log("init".to_string(), MODULE_NAME.to_string()).is_ok() } fn register_module(name: *const c_char, author: *const c_char, tags: *const c_char, link: *const c_char, description: *const c_char) -> c_int { ... and then Rust macros can handle mapping return types to ReturnFloat(...) calls, etc. at compile-time rather than having to add layers of function call indirection. Ironically, I did not take it as far as building in the unsafe wrapping/unwrapping of C/C++ types via the macro, so the addon-writer person then has to do write unsafe calls to take *const c_char to string and v.v.. However, once that's done, the events can then call out to methods on a singleton and do actual work in safe Rust. While these functions correspond to dynamically-generated TDM events, I do not let the idClass get explicitly leaked to Rust to avoid overexposing the C++ side, so they are class methods in the vtable only to fool the compiler and not break Callback.cpp. For the examples in Rust, I was moving fast to do a PoC, so they are not idiomatic Rust and there is little error handling, but like a script, when it fails, it fails explicitly, rather than (normally) in subtle user-defined C++ buffer overflow ways. Having an always-running async executor (tokio) lets actual computation get shipped off fast to a real system thread, and the TDM event calls return immediately, with the caller able to poll for results by calling a second Rust TDM event from an idThread. As an example of a (synchronous) Rust call in a script: extern mod_web_browser { void init_mod_web_browser(); boolean do_log_to_web_browser(int module_num, string log_line); int register_module(string name, string author, string tags, string link, string description); void register_page(int module_num, bytes page); void update_status(int module_num, string status_data); } void mod_grab_log_init() { boolean grabbed_check = false; entity grabbed_entity = $null_entity; float web_module_id = mod_web_browser::register_module( "mod_grab_log", "philtweir based on snatcher's work", "Event,Grab", "https://github.com/philtweir/therustymod/", "Logs to web every time the player grabs something." ); On the verifiability point, both as there are transpiled TDM headers and to mandate source code checkability, the SDK is AGPL. What state is it in? The code goes from early-stage but kinda (hopefully) logical - e.g. what's in my TDM fork - through to basic, what's in the SDK - through to rough - what's in the first couple examples - through to hacky - what's in the fun stretch-goal example, with an AI chatbot talking on a dynamically-loaded sound shader. (see below) The important bit is the first, the TDM approach, but I did not see much point in refining it too far without feedback or a proper demonstration of what this could enable. Note that the TDM approach does not assume Rust, I wanted that as a baseline neutral thing - it passes out a short set of allowed callbacks according to a .h file, so language than can produce dynamically-linkable objects should be able to hook in. What functionality would be essential but is missing? support for anything other than Linux x86 (but I use TDM's dlsym wrappers so should not be a huge issue, if the type sizes, etc. match up) ability to conditionally call an external library function (the dependencies can be loaded out of order and used from any script, but now every referenced callback needs to be in place with matching signatures by the time the main load sequence finishes or it will complain) packaging a .so+DLL into the PK4, with verification of source and checksum tidying up the Rust SDK to be less brittle and (optionally) transparently manage pre-Rustified input/output types some way of semantic-versioning the headers and (easily) maintaining backwards compatibility in the external libraries right now, a dedicated .script file has to be written to define the interface for each .so/DLL - this could be dynamic via an autogenerated SDK callback to avoid mistakes maintaining any non-disposable state in the library seems like an inherently bad idea, but perhaps Rust-side Save/Restore hooks any way to pass entities from a script, although I'm skeptical that this is desirable at all One of the most obvious architectural issues is that I added a bytes type (for uncopied char* pointers) in the scripting to be useful - not for the script to interact with directly but so, for instance, a lib can pass back a Decl definition (for example) that can be held in a variable until the script calls a subsequent (sys) event call to parse it straight from memory. That breaks a bunch of assumptions about event arguments, I think, and likely save/restore. Keen for suggestions - making indexed entries in a global event arg pointer lookup table, say, that the script can safely pass about? Adding CreateNewDeclFromMemory to the exposed ABI instead? While I know that there is no network play at the moment, I also saw somebody had experimented and did not want to make that harder, so also conscious that would need thought about. One maybe interesting idea for a two-player stealth mode could be a player-capturable companion to take across the map, like a capture-the-AI-flag, and pluggable libs might help with adding statistical models for logic and behaviour more easily than scripts, so I can see ways dynamic libraries and multiplayer would be complementary if the technical friction could be resolved. Why am I telling anybody? I know this would not remotely be mergeable, and everyone has bigger priorities, but I did wonder if the general direction was sensible. Then I thought, "hey, maybe I can get feedback from the core team if this concept is even desirable and, if so, see how long that journey would be". And here I am. [EDITED: for some reason I said "speech-to-text" instead of "text-to-speech" everywhere the first time, although tbh I thought both would be interesting]
- 25 replies
-
- 3
-
-
The Dark Mod 2.13 has been released! A new era in accurate AI Vision! When id Software released the Doom 3 modding SDK, The Dark Mod team saw the potential for something more than a multi-player cops vs robbers game like Thievery UT. The sheer amount of access to essential game-play systems meant that a true Thief style experience could potentially be created. One of the first things the team did was to investigate how a light-gem system could be implemented. Having a good way for both the player and AI to know when the player is visible to others is a crucial part of the Thief experience so if we couldn’t build it then the dream of a Thief style experience was over. Fortunately, there were enough parts of the AI visual logic and more than a few stub pieces of the Render code that gave us the ability to build a robust system. The downside of the light-gem system was performance. Even though we did our best to limit the viewport and resolution of the light-gem image captures, often the light-gem would cut FPS in half ( or less ). This was pretty painful, especially since most computers could just barely run vanilla Doom 3 at acceptable FPS. After this system was fully functional, other aspects of AI vision were investigated. Obviously, we could not afford to run the light-gem render for every object or body the AI might see so it was decided that the AI would do a more simplified light-gem calculation for things other than the player. This meant that ( to the AI visual scan ) all light volumes would be either cubes or pyramids with perfect exponential falloff. We would run a line-of-sight check to the objects then ( if it hit ) calculate the pixel brightness by the location of the spot in relation to the center of the light(s). This was far cheaper than rendering the whole scene but heavily impacted accuracy. Many solutions were proposed to improve things but a solution evaded us for years. 2.13 changes things! Now we have a "stochastic sampler" model that does regular measurements of the actual light volume pixels and builds a "running average" of how illuminated different entities are. The days of seeing knocked-out AI in the middle of a bright spotlight get ignored are over. Now all AI and loot entities (etc) essentially have their own light-gem and it performs excellently! Magnificent Mission Management! Daft Mugi has drastically improved the GUI menus for mission management. The Dark Mod mission list and in-game downloader now have a search filter window that follows modern conventions of reducing the listed items as each new letter eliminates a possible matching mission name. Both lists can be sorted by actual name ( The Rats Triumphant ) or Chicago Style ( Rats Triumphant, The ). Additional mission details ( readme data ) can now be scrolled so players can see more information about the mission without having to navigate to the darkmod/fms folders. The menus have also been tuned with smaller font sizes for more practical mission listing and have been hardened against buggy order of operations issues so that you will be far less likely to encounter strange issues or crashes when downloading and installing missions. Parallax Occlusion Mapping! Stgatilov has added the oft requested POM feature to the latest Dark Mod release! WellingtonCrab has coordinated with him to provide examples and check the functionality and quality. Now The Dark Mod is ready to offer a quantum leap in perceived geometric detail with all sorts of surfaces realistically showing 3D parallax rather than the flatter looking normal maps we usually offer. WellingtonCrab also created many texture variants that are tuned to look better with POM enabled. Other Graphics Goodies! Now cubemaps \ environment maps respect more stage keywords. This means that faked reflections on water shaders can now move in relation to the water texture movement offering a more convincing illusion! Subviews ( cameras, portals, mirrors, xray, etc ) can now be nested. You can now have a skybox render in a camera view, etc. Volumetric lights and particles now render in mirrors! Alpha-tested surfaces get alpha shadows in Shadow Maps mode. Tone-mapping now supports range compression to prevent unwanted overbright areas. Arcturus has introduced some new metal materials that use improved cubemaps as well as skyboxes with clouds that use POM! Stability and Performance! The console variable system ( CVAR ) has been improved to be thread safe. This should resolve some rare crashes that involve weapon scripts that rely on CVAR values. We now automatically detect the number of CPU cores and allocate Jobs based on the detected specifications. Level loading has been given more parallel execution optimizations including optimizations for loading audio samples in parallel. Uncapped FPS is enabled by default so Linux players will not have a poor first time experience and many audio and video playback timing bugs that occur only in classic capped mode are avoided. Finally, Linux vsync support has been greatly improved. Improved Training Mission! The Training Mission is supposed to help players understand the basics of Dark Mod game-play and controls. It was created to coincide with The Dark Mod v1.0 and was not significantly altered until TDM v1.08 ( when Bikerdude did some texture replacement for 2.0 standalone and improved the overall visuals ). As such, many new game-play features that were added since 1.0 were never included in the mission. Now the mission has been upgraded to include more game-play features such as the Vine Arrow as well as getting further visual upgrades and EFX Reverb! Drunken AI! Now that the AI have better visual accuracy, Amadeus decided to balance things out by fixing many of the broken behaviors of Drunken AI so that they are more reliable and consistent for use in missions by default ( no need to extensively customize the defs or use scripting to improve them ). Potions! Dragofer and Amadeus have completed the work on the Slowfall potion originally prototyped by VanishedOne. They also incorporated the invisibility potion by Kingsal ! These now have pre-defined slots in the gameplay menu as well as the default shop menu design. Assets Galore! Along with new POM textures, we now have: A new modular pipe set A new Lampion entity Some new Factory Machine entities Ornate wood and stone relief textures A new AI praying animation A new AI smoking animation And many fixes or improvements to existing assets EFX Reverb Location Preset! Frost_Salamander took some time away from his continued work on the excellent “The Lieutenant” series missions to make EFX reverb setup easier for himself and other mission authors. You can now add EFX preset spawnargs to location entities rather than having to use the EFX def file. Translation Packs! Between TDM 1.06 and 2.0 Tels and the translating community started translating many missions but these translations required that the original mission be altered in a way that made it harder for the mission authors to revise. That meant that translation packs were in limbo being hosted by 3rd party sites \ forums along with their orphaned old missions. The translators over at the Darkfate forums came up with an solution by including not only the translation strings in the translation pack but also the altered map files, GUI defs, etc that had translation work done to them. This would leave the original mission untouched but allow translation packs to override some parts. We have gone through the old archives of these translations and have reworked them to work with the latest version of TDM (and the associated missions). Most of the translations are Russian ( due to the continued work of the Darkfate people ) but many of the early TDM missions also have German, Italian, French, etc translations too. Also Nolok contributed a brand new Catalan menu translation! Subtitles! Datiswous has been creating story subtitles for many of the existing missions in the TDM mission database. Most authors have incorporated these into their official releases, otherwise players can still add them to the FM folder. A detailed list of changes can be seen here: https://wiki.thedarkmod.com/index.php?title=What's_new_in_TDM_2.13 To UPDATE, simply run the tdm_installer.exe file in your darkmod folder. Note that tdm_update.exe is no longer supported, but you can download the new installer from the Downloads page if you don’t have it yet. Please be aware that old saved games will not be compatible with 2.13, so finish any missions you might be in the middle of first! Also, some missions created prior to 2.13 may need to be updated so they will be playable in 2.13. Before upgrading, set TDM to use one of the built-in missions ( Training Mission, A New Job, Tears of St Lucia ) then use the in-game mission downloader to check for updates
-
- 33
-
-
-
I'm regularly thrown off by how unnatural the reverb in TDM sounds (and mission authors tend to use too much of it) and by how nonsensical the panning system is up close - you stand in front of a lock you're picking and yet sometimes the picking sound is heard almost entirely from the right and then the door opening sound is heard entirely from the left. I can imagine a trivial geometrical explanation of why that is, but it just doesn't work well in these edge cases. I think there's a ton of potential to improve sound engines in games, for me personally this has a big influence on how immersed I am and how well I remember the game (Bioshock 1 was excellent, despite the fact that the reverb was also kind of crude in it, but it was used well and the sound design was great - I can still remember how it sounds). So I warmly welcome any improvements. But working with sound in various ways is both a big hobby and an occassional source of income for me, so I'm not exactly the average person (though arguably experiences like these are partially what led me to the hobby).