Jump to content
The Dark Mod Forums

Translating the TDM GUI


Tels

Recommended Posts

Hi all,

For two weeks I've been playing Dark Mod and I must say you did an excellent job. Even more impressive when consider it's fan-made. My congratulations.

 

:wub:

 

Anyway, I think I can help with Polish translation. I don't have any problems with understanding FMs' text, so translating shouldn't be so difficult.

One thing, I'm an ignorant when it comes to programming, mess up with files etc. I can only write translated text in notepad and send it to you. ;)

 

(Sorry for my English)

 

That would be cool! I'll send you a PM with the details, currently the Polish translation is almost completely missing.

 

Writing the texts in notepad will be fine, no programming knowledge is required.

"The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." -- George Bernard Shaw (1856 - 1950)

 

"Remember: If the game lets you do it, it's not cheating." -- Xarax

Link to comment
Share on other sites

On the other hand, it might help to import the LANG file to Excel (or any other spreadsheet application) and have a separate column for EN and PL. I found that this helped a lot for the German translation. Just import the file and have Excel interpret the tab stops as dividers for the column.

 

Then again, maybe you don't need that at all.

 

 

My Eigenvalue is bigger than your Eigenvalue.

Link to comment
Share on other sites

Hi all,

For two weeks I've been playing Dark Mod and I must say you did an excellent job. Even more impressive when consider it's fan-made. My congratulations.

 

Anyway, I think I can help with Polish translation. I don't have any problems with understanding FMs' text, so translating shouldn't be so difficult.

One thing, I'm an ignorant when it comes to programming, mess up with files etc. I can only write translated text in notepad and send it to you. ;)

 

 

 

why not try using a hex editor? so that you can directly translate the polish.lang file without having to create a text file and then Tels should change the strings in the lang file. :D

 

I suggest notepad++ as hex editor. Wonderful editor. :D

 

 

(Sorry for my English)

there are those who are worse off.(i'm italian):laugh:

 

 

Link to comment
Share on other sites

Here is a progress update:

 

* 7upman send me over 100 revised and added German strings, making German once more a complete translation with only a handful strings missing. Thank you!

* ECHELON send me Italian additions and corrections - italian only missing a handful strings now, too! Thank you!

* @7upman: the CSV idea is nice, I added the ability to gen_lang.pl to output a CSV file with the ID, all the languages and the comment in different columns. Maybe this makes the work of the translators easier.

* finished I18N.pl, it can now parse, sync and rewrite xdata files. So except for custom assets (like sounds/images/movies), the script is done. And these custom assets need manual intervention, anyway.

 

Have updated the first post with the new stats, and the missing-archive on bloodgate.com with the newest revision.

 

The other translation-related work I have been doing over the past days I will post here later once it is more complete.

"The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." -- George Bernard Shaw (1856 - 1950)

 

"Remember: If the game lets you do it, it's not cheating." -- Xarax

Link to comment
Share on other sites

Just a small update:

 

* I18N.pl can now parse and generate new XDATA files (that actually work :D and the TDM code can now also use the translated strings properly! Screenshot from Outpost:

 

post-144-131767928433_thumb.jpg

 

Note that this readable looks like this in the xdata file:

 

readables/outpost/kitchen_menu
{
       precache
       "num_pages" : "1"
       "page1_title" : "#str_20022"
       "page1_body" : "#str_20023"
       "gui_page1" : "guis/readables/sheets/sheet_paper_hand_jd_hand.gui"
       "snd_page_turn" : "readable_page_turn"
}

 

:)

 

The only problem is that the readables on the wall are empty, I am not sure why this is so (never-ending stream of things that D3 does not do right :(

 

post-144-131767934908_thumb.jpg

 

In related news, I noticed today that switching the objectives is broken, it did work a few days/weeks ago. I fear another long GUI debug session is in order *sigh* Take 3 steps forward, 2 steps back...

 

Anyway, more good news in the next post. :)

"The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." -- George Bernard Shaw (1856 - 1950)

 

"Remember: If the game lets you do it, it's not cheating." -- Xarax

Link to comment
Share on other sites

Ok, so please bear with me, this is going to be a longer post. I am using this as a sort of documentation on how the GUI works (or rather: breaks easily...)

 

There is this unfortunate bug with idTech's GUI chocieDefs, namely that they do not support any character above 0x7f (or so) in their texts. That means they are unusuable for any languages with strings with special characters in them, and esp. useless for Russian or other languages which are not using the ASCII set at all.

 

Here is a screenshot that shows how it looks:

 

post-144-131767995953_thumb.jpg

 

You can see that the spanish "ì" is simply missing, while at the bottom, in a normal windowDef, it appears as a small rectangle (beause the font does not contain the lettr). In other words, if the font is fixed, the windowDef will appear correct, while the choiceDef will still be incorrect.

 

It is even worse in languages like Russian, where the entire string is missing, and this results in the nice text "No Choices Defined" to be displayed instead:

 

post-144-131768017418_thumb.jpg

 

Not good at all!

 

(And as an side-note: it seems choiceDefs can only display their choices left-aligned, they ignore any right or center-alignment setting. Another reason to get rid of them.)

 

Now we could wait for the D3 source, and then hope we can easily integrate it into our mod, and then hope we find and fix this bug. However, this is potentially a looong way off, so I opted for working around this problem. Instead of choiceDefs I defined windowDefs (e.g. normal texts), and set them up so that if you click them with the mouse, a command is send to the code, instructing it to change the setting.

 

However, what sounds so easy is rather convoluted:

 

* choiceDefs accept left and right mouse clicks (right click turns the setting backwards). Unfortunately, the GUI code does not let us intercept right mouse clicks (or I haven't found out how that would work). This does not matter for binary choices (right or left click behave identically, flipping the setting), but for settings with more than 3 values this will make it cumbersome for the user (he has to click through all of them to reach the beginning). However, even with right click such settings are not good UI design (the user has an unknown and unseen number of choices, and can only click through the list). Therefor such settings should be changed to use a different way. Doable, but more work than though.

* the GUI handling of "commands" is totally broken in D3. It works like this:

 

Whenever you use a command in the GUI (like set "notime" "1";), a routine in the SDK is called with the command. Unfortunately, the way this works is so bizarre that it is basically broken-by-design. Not only is *every* command send to this routine, but also every *argument*. And every ";". And sometimes additional ";" are sent along. Actually, not every argument. For instance arguments to "play some/music/file" are NOT sent along, so if the code wants to know what the GUI is playing next, it can't get the info. But if you do 'set "noTime" "1";', then the "1" is sent along. Crazy.

 

The only reason the command handling did work was that it scanned each "command" for a list of known strings, and only took action when it saw such a string. (The interesitng thing here is that there was an exception to handle arguments to the "log" command - in this case a flag was set and the next command was logged to the logfile, no matter what).

 

So, if there was ever a command "X" and an argument "X", the code would get confused and do the wrong thing. Not to mention that you could never have other commands with arguments (because the code couldn't tell a command or argument apart), and that the code did a lot of "work" to handle commands like ";" and "1" and so on.

 

So the first step was to completely rewrite the menu command handling code. Unfortunately, we cannot access the engine portion, so we must make the best out of the stream of strings we receive. Therefore a small list of known commands is used to determine the number of arguments, then consume arguments until we have all of them, allthewhile ignoring ";". Then watch for the next command.

 

This works astounishingly good (or so I thought...), so the next step was to use #define magic to define the following commands:

 

#define GLOW_ON_ENTER       onMouseEnter { transition "forecolor" SNORMAL_COLOR SBOLDGLOW_WHITE_COLOR "50"; set "cmd" "play sound/meta/menu/mnu_hover"; }
#define NORMAL_ON_EXIT      onMouseExit { transition "forecolor" SBOLDGLOW_WHITE_COLOR SNORMAL_COLOR "50"; }
#define WHITE_GLOW      GLOW_ON_ENTER NORMAL_ON_EXIT

 

So if you then use "WHITE_GLOW" on a windowDef, it will glow white when the user mouses over it - just like a choiceDef. Then the command handling:

 

#define CHOICE_INIT CHOICE_DEF onTime 20 { set "noTime" "1"; set "cmd"
#define CHOICE_STEP WHITE_GLOW onAction { set "cmd" "play sound/meta/menu/mnu_select"; set "cmd"

 

(GUI #defines cannot end/start inside a string, but they can end in a the middle of a block or command :)

 

You can use these then so:

 

 CHOICE_INIT "initChoice 'tdm_menu_music' '#str_07228' '1;0'" }
 CHOICE_STEP "stepChoice 'tdm_menu_music' '#str_07228' '1;0'"; your action here }

 

This sets up a windowDef that, when the menu is initialized, gets set to the string that represents the current value of tdm_menu_music (value is 0 or 1, the string is the content of #str_07228, e.g. Yes or No).

 

and whenever the user clicks on that windowDef, the command stepChoice is called, advancing the setting by one. In this case it is a boolean choice and the value will toggle.

 

 

This allworks nice, until another D3 engine bug hits us. The GUI has an internal command buffer, and this buffer has a certain, unknown length. And it seems during one frame, all commands are appended to the buffer, which is then at the end of the frame (thats guesswork, tho) parsed and executed. And guess what happens if you add a lot of choiceDefs?

 

Right! The darned buffer overflows, either cutting commands short (e.g. two command suddenly run into each other), or the arguments are simply missing!

 

The only way to prevent this from happening seems to be to "delay" the commands. Thus I ended up with:

 

// There seems to be a limit on how many commands can run during one timestep (buffer or time limit?). Use this to overcome it:
#define CHOICE_INIT_2   CHOICE_DEF onTime 40 { set "noTime" "1"; set "cmd"
#define CHOICE_INIT_3   CHOICE_DEF onTime 60 { set "noTime" "1"; set "cmd"
#define CHOICE_INIT_4   CHOICE_DEF onTime 80 { set "noTime" "1"; set "cmd"
#define CHOICE_INIT_5   CHOICE_DEF onTime 100 { set "noTime" "1"; set "cmd"
#define CHOICE_INIT_6   CHOICE_DEF onTime 120 { set "noTime" "1"; set "cmd"
#define CHOICE_INIT_7   CHOICE_DEF onTime 140 { set "noTime" "1"; set "cmd"

 

and then had to use not more than 6 of each kind...

 

So now it seems to work stable, except that there are sometimes crashes related to the command buffer overflow *sigh* Hopefully I can get this somehow under control :( The crashes seem to be timing-related, e.g. it depends on how full the buffer already is and what other commands are executed in the same frame (like the main menu heartbeat, or the logging commands...)

 

Anyway, screenshots of the result follow in the next post ;)

"The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." -- George Bernard Shaw (1856 - 1950)

 

"Remember: If the game lets you do it, it's not cheating." -- Xarax

Link to comment
Share on other sites

Anyway, after converting almost all choiceDefs, here is the result. I am using Russian here, as it shows the most dramatic effect. But the other (European) languages benefit from this, too:

 

Russian dialog working:

 

post-144-131768171105_thumb.jpg

 

Russian gameplay, controls and video settings working (and looking good :)

 

post-144-131768222833_thumb.jpg post-144-131768227448_thumb.jpg post-144-131768224997_thumb.jpg

 

One thing you might notice in the last screen is that the language selection is now a new subpage in the Video menu. The reasons were hinted at in the post above: the new windowDef settings do not support right click (so you cannot go backwards through the choices), and with so many choices (>5) it becomes cumbersome for the user to select anything, double so because the language causes a reloading of the GUI, which causes a small delay.

 

So here is the new screen:

 

post-144-131768238455_thumb.jpg post-144-131768239997_thumb.jpg

 

(The green checkmark will probably be removed, and instead the selected language will be white-on-red as our other selections are. But after fighting so many hours with the GUI I was just tired and leave this for another day. That should be rather easy. Famous last words :ph34r: ).

 

Now I need sleep. :wacko:

"The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." -- George Bernard Shaw (1856 - 1950)

 

"Remember: If the game lets you do it, it's not cheating." -- Xarax

Link to comment
Share on other sites

Good work! :)

 

That blank readable above might be Tracker 1201 ? :unsure:

 

Ah, good idea, need to check this. If it is, it's not my fault and for once I can ignore a problem :laugh:

 

@MoroseTroll: Happy to please :) And the CC feature is on the TODO list, and hopefully I can fix the fonts (or somebody does help us?) and then continue with the CC feature.

"The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." -- George Bernard Shaw (1856 - 1950)

 

"Remember: If the game lets you do it, it's not cheating." -- Xarax

Link to comment
Share on other sites

I see that Portguese (I'm guessing brazillian) is about 85% complete. Is anyone currently working on it? Because if it's just for that remaining 15%, I can finish it, I'm sure. I know for a fact that it would be a welcome feature for brazillian players. ;) Where can I take a look at the existing translation? (Sorry if I missed any obvious links)

Link to comment
Share on other sites

I see that Portguese (I'm guessing brazillian) is about 85% complete. Is anyone currently working on it? Because if it's just for that remaining 15%, I can finish it, I'm sure. I know for a fact that it would be a welcome feature for brazillian players. ;) Where can I take a look at the existing translation? (Sorry if I missed any obvious links)

 

I'll send you a PM.

"The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." -- George Bernard Shaw (1856 - 1950)

 

"Remember: If the game lets you do it, it's not cheating." -- Xarax

Link to comment
Share on other sites

I see that Portguese (I'm guessing brazillian) is about 85% complete. Is anyone currently working on it? Because if it's just for that remaining 15%, I can finish it, I'm sure. I know for a fact that it would be a welcome feature for brazillian players. ;) Where can I take a look at the existing translation? (Sorry if I missed any obvious links)

 

really 88% represents UNtranslated strings. only 12% have been translated. :laugh:

 

p.s. otherwise (i'm italian translator) I still miss the 95% to be translated.:laugh:

Edited by ECHELON
Link to comment
Share on other sites

Here are some questions for the English native speakers about capitalizatin and item names:

 

We have currently cases like the main headline, and the main menu items, and a lot of buttons in the man menu, which are written like this:

 

* The Dark Mod

* New Mission/Resume Mission/Quit Game etc

* Load Mission

 

While "The Dark Mod" should probably left alone, I am wondering if it shouldn't be New mission, Load game etc.?

 

--------------------------

 

A related topic are inventory names. We currently have "Garden Key", "Silver Key" etc. Should these be "Garden key" in English?

 

--------------------------

 

Likewise, I am trying to normalize inventory names a bit. The reason is that we have many missions where inventory item names are just differing in capitalizaion, or contain an extra "a", etc. To avoid that translators have to translate these items over and over for each mission, it makes sense to add the most often used one to the core dictionary.

 

Trying to find a common ground of good-looking and correct names here. So should "A Book" be "A book"? Furthermore, should inventory items like books, scrolls etc. be named:

 

* "A book"

* or "Book"

 

? The question is important, because if you'd translate it to German, it becomes:

 

* "Ein Buch"

* or "Buch"

 

and this can create overly long item names (think of "Ein Briefbeschwerer" :), as well as look strange if you have:

 

* "A book" (with a)

* "Letter to John" (w/o a)

 

in your item list next to each other.

 

Are there any rules when the "a" should be there? Does "a" signify this is just "one ordinary item out of many with no special purpose", and the missing "a" signify this is the only item of this kind (e.g. there is only one letter to john, but many books)?

 

 

Please answer only the specific bolded questions, and only if you are a native speaker or know English very very good (e.g. bette than me :). Thank you!

"The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." -- George Bernard Shaw (1856 - 1950)

 

"Remember: If the game lets you do it, it's not cheating." -- Xarax

Link to comment
Share on other sites

"New Mission" with both words capitalized looks better than the later. It signifies that the text is a unique heading rather than part of the overall script.

 

Likewise, "Garden Key" designates "Key" as a special word and helps to make it easier to tell where in the inventory context you are. This is less of an issue as the "New Mission" heading above but... better is better. Having the word "Key" capitalized in that context makes it stick-out as a special attribute.

 

The "a" designation is excessive. "Book" works quite well to describe the item any similar scenario would be the same. I will admit that adding "a" to the descriptor does lend a certain archaic quality that goes better with the era of the game but it's an artistic touch that isn't worth it if it breaks consistency with other descriptions alone... much less if it causes problems with translation.

Please visit TDM's IndieDB site and help promote the mod:

 

http://www.indiedb.com/mods/the-dark-mod

 

(Yeah, shameless promotion... but traffic is traffic folks...)

Link to comment
Share on other sites

"New Mission" with both words capitalized looks better than the later. It signifies that the text is a unique heading rather than part of the overall script.

 

Likewise, "Garden Key" designates "Key" as a special word and helps to make it easier to tell where in the inventory context you are. This is less of an issue as the "New Mission" heading above but... better is better. Having the word "Key" capitalized in that context makes it stick-out as a special attribute.

 

The "a" designation is excessive. "Book" works quite well to describe the item any similar scenario would be the same. I will admit that adding "a" to the descriptor does lend a certain archaic quality that goes better with the era of the game but it's an artistic touch that isn't worth it if it breaks consistency with other descriptions alone... much less if it causes problems with translation.

 

I don't think it a problem for translation. In fact, much of these share what has to be said about French: "un livre" (to keep with books) may look odd but adds a bit of flavour. The problem is, all lower case is associated with modernity as far as visuals are concerned, "un Livre" looks... well, just wrong. In a perfect world it would be the second best option as far as flavour goes. But it doesn't LOOK right. "Un Livre" is just the same as for you, "Livre" is, unfortunately, the only real option. It looks formal and doesn't fit the "era" of the game, but looks find with "Acquired": "Acquired a Book" is OK, "Acquired Book" is good, "Acquired A Book" is... wrong. If I'm not mistaken you don't capitalize "special words" that way in English either. To each his own, every language has its section.

 

tl;dr: It's not related to translation, just to GUI consistency on the English parts of things. :)

Edited by Hyeron

"Lie to a liar, for lies are his coin; Steal from a thief, for that is easy; lay a trap for a trickster and catch him at first attempt, but beware of an honest man"

- Arab proverb

Link to comment
Share on other sites

I am wondering if it shouldn't be New mission, Load game etc.?

 

No.

 

Should these be "Garden key" in English?

 

Not necessarily.

 

So should "A Book" be "A book"?

 

Either could be correct.

 

Are there any rules when the "a" should be there?

 

Generally an "a" is used when the item is not particularly significant, but there is no hard and fast rule.

Link to comment
Share on other sites

@nbohr1more and Springheel:

 

Thank you, so in summarizing, we keep both "Garden Key" and "New Mission" (phew, a lot less to edit :) and choose "A Book" ("A Scroll", "A Letter") for the inventory items to be consistent with the keys.

"The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." -- George Bernard Shaw (1856 - 1950)

 

"Remember: If the game lets you do it, it's not cheating." -- Xarax

Link to comment
Share on other sites

Small update:

 

* Found and fixed the problem that the difficult selector was no longer working (menu commands are sent in now lower case to the handler routine)

* Hyeron sent me a massive update of the French translation, making it now complete except a handful strings :wub: Thank you very much! (Updated first post with new statistics)

 

I have heard that the Portuguese translation is coming along very nicely, and an update for Russian has been promised, too! So lets see what the next days bring :)

"The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." -- George Bernard Shaw (1856 - 1950)

 

"Remember: If the game lets you do it, it's not cheating." -- Xarax

Link to comment
Share on other sites

Wow, so long w/o an update again. Time flies like an arrow, fruit flies like a banana. :D

 

Anyway:

 

* RPGista sent in the Portuguese translation - thank you! :wub:

* MoroseTroll sent in an update to Russian - thank you! :wub:

* To not have to answer the same questions every day, I started this article: http://wiki.thedarkmod.com/index.php?title=Translator_Guide

 

The first post has been updated with the newest stats and the packages on my server were also updated.

 

Now the only two incomplete languages are Polish and Spanish. Of course, we also miss other European languages like Dutch, Finnish, Swedish, Hungarian etc. So if you are fluent in one of these languages, and want to help make TDM better, please post here!

 

More news coming later, I need some sleep first.

"The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." -- George Bernard Shaw (1856 - 1950)

 

"Remember: If the game lets you do it, it's not cheating." -- Xarax

Link to comment
Share on other sites

  • 2 weeks later...

Here is a small update: I managed to hack together a utility that can read commands from a textfile, and use these to patch an existing fontimage.dat file.

 

That is you can say:

 

source font_source/carleton/fontimage_48.dat
target ../fonts/english/carleton/fontimage_48.dat
// the texture for this font is 256x256 pixel
dim 256 256

copy_char 0x65 0xe9  // e => é
// 'e' is on 68,32
move_by 0xe9 162 38 // move to where it is on the new texture (new position 230,70 minus old position => movement)
shader 0xe9 fonts/carleton_5_48.tga   // set the right texture file (the TGA here is ignored by D3)
increase_height 0xe9 8		  // increase the height by 8 pixel (27 => 35)

 

and the resulting fontimage_48.dat will be bit-by-bit identical, except that character 0xe9 suddenly works :)

 

In addition to that I also drew up all the accented characters from ISO-8859-1 and some additional ones for Czech.

 

Here is a sneak peek on how this will look:

 

post-144-0-79267700-1319814730_thumb.jpg post-144-0-01715100-1319814744_thumb.jpg

 

Note that a lot of work still remains, the bold/glow variants need to be done, we are still missing some characters, and the command file for patching the characters in is not yet complete (basically only the ones you see at the screenshot are described). Likewise, we need to repeat that for the 24 pixel carleton font (or, I think, we might get away by simply deleting the 24 pixel variant, d3 will then use the 48 pixel variant. I think. Needs more work.

 

 

Personally I will continue my work next week.

"The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." -- George Bernard Shaw (1856 - 1950)

 

"Remember: If the game lets you do it, it's not cheating." -- Xarax

Link to comment
Share on other sites

Oh. My. God. I'm speechless.

 

Would this work with all fonts (assuming accented sources exist)? O_O

Edited by Hyeron

"Lie to a liar, for lies are his coin; Steal from a thief, for that is easy; lay a trap for a trickster and catch him at first attempt, but beware of an honest man"

- Arab proverb

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recent Status Updates

    • Ansome

      Finally got my PC back from the shop after my SSD got corrupted a week ago and damaged my motherboard. Scary stuff, but thank goodness it happened right after two months of FM development instead of wiping all my work before I could release it. New SSD, repaired Motherboard and BIOS, and we're ready to start working on my second FM with some added version control in the cloud just to be safe!
      · 0 replies
    • Petike the Taffer  »  DeTeEff

      I've updated the articles for your FMs and your author category at the wiki. Your newer nickname (DeTeEff) now comes first, and the one in parentheses is your older nickname (Fieldmedic). Just to avoid confusing people who played your FMs years ago and remember your older nickname. I've added a wiki article for your latest FM, Who Watches the Watcher?, as part of my current updating efforts. Unless I overlooked something, you have five different FMs so far.
      · 0 replies
    • Petike the Taffer

      I've finally managed to log in to The Dark Mod Wiki. I'm back in the saddle and before the holidays start in full, I'll be adding a few new FM articles and doing other updates. Written in Stone is already done.
      · 4 replies
    • nbohr1more

      TDM 15th Anniversary Contest is now active! Please declare your participation: https://forums.thedarkmod.com/index.php?/topic/22413-the-dark-mod-15th-anniversary-contest-entry-thread/
       
      · 0 replies
    • JackFarmer

      @TheUnbeholden
      You cannot receive PMs. Could you please be so kind and check your mailbox if it is full (or maybe you switched off the function)?
      · 1 reply
×
×
  • Create New...