https://wiki.thedarkmod.com/api.php?action=feedcontributions&user=Tels&feedformat=atom
The DarkMod Wiki - User contributions [en]
2024-03-29T15:40:21Z
User contributions
MediaWiki 1.39.5
https://wiki.thedarkmod.com/index.php?title=I18N_-_Charset&diff=18049
I18N - Charset
2015-01-05T14:28:23Z
<p>Tels: tweaks</p>
<hr />
<div>== Introduction ==<br />
<br />
The D3 code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, special charsets are used. The fonts (Carleton for the menu f.i.) are build/patched so that the right characters appear in the right place.<br />
<br />
== Encodings ==<br />
<br />
=== all.lang ===<br />
<br />
This file is in '''UTF-8''', and converted with the help of the script '''devel/gen_lang.pl''':<br />
<br />
perl devel/gen_lang.pl<br />
<br />
This ensures that the generated language files are in their proper encodings (see below).<br />
<br />
=== All other language files ===<br />
<br />
Note that the language files (f.i. '''strings/german.lang''') as well as the readables and the FM dictionariaries are expected to be in the following encodings:<br />
<br />
* '''Czech''', '''Hungarian''', '''Slovak''', '''Polish:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-2 ISO-8859-2] ('''not WIN-1250!)<br />
* '''Russian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/Win-1251 WIN-1251]<br />
* '''French:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-15 ISO-8859-15]<br />
* '''Romanian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-16 ISO-8859-16] <br />
* '''All other languages:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1 ISO-8859-1] (German, Dutch, Danish, Swedish, Portuguese, etc.)<br />
<br />
<br />
{{infobox|The core dictionaries are automatically generated in the right encoding, but make sure that you use the right encoding for the FM dictionary, too!}}<br />
<br />
== Character remapping ==<br />
<br />
The characters are remapped upon loading the dictionary/readable, from their native encoding to the special one that TDM uses and that is described here. Responsible for the remapping are [[I18N - Character mapping|mapping files]], f.i. "strings/czech.map". If a map file for a specific language is not found, "strings/default.map" is used instead, if this is not found, no remapping takes place.<br />
<br />
See '''[[I18N - Character mapping|Character mapping]]''' for more information.<br />
<br />
=== European Languages ===<br />
<br />
This mapping is used for European languages, f.i. '''Czech''', '''French''', '''German''', '''Spanish''', '''Portuguese''', '''Polish'''. Note that the double accented characters in Hungarian '''Ő, ő, Ű and ű''' look a bit different from '''Ö, ö, Ü and ü'''!<br />
<br />
In the table below, the original ISO 8859-1 characters are given in ''()'' below the TDM character.<br />
<br />
'''Color code:'''<br />
<br />
{{box|#f0d0d0|Character not usable by TDM|Unusable}}{{box|#d0e0d0|Character not yet used in TDM|Unused}}{{box|#c0ffc0|Character displayed in v1.08 or newer|Usable in v1.08}}{{box|#80f080|Character displayed in v2.03 or newer|Usable in v2.03}}{{box|#d0d0f0|Changed from the ISO-8859-1 default, usable by TDM 1.0 or newer|Changed from ISO 8859-1}}<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 95%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!<br />
!…0<br />
!…1<br />
!…2<br />
!…3<br />
!…4<br />
!…5<br />
!…6<br />
!…7<br />
!…8<br />
!…9<br />
!…A<br />
!…B<br />
!…C<br />
!…D<br />
!…E<br />
!…F<br />
<br />
|-<br />
!0…<br />
|align='center' style='background: #f0d0d0'|00<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|01<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|02<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|03<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|04<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|05<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|06<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|07<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|08<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|09<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0F<br>'''–'''<br />
<br />
|-<br />
!1…<br />
|align='center' style='background: #f0d0d0'|10<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|11<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|12<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|13<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|14<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|15<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|16<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|17<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|18<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|19<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1F<br>'''–'''<br />
<br />
|-<br />
!2…<br />
|align='center'|20<br>'''&nbsp;'''<br />
|align='center'|21<br>'''!'''<br />
|align='center'|22<br>'''"'''<br />
|align='center'|23<br>'''#'''<br />
|align='center'|24<br>'''$'''<br />
|align='center'|25<br>'''%'''<br />
|align='center'|26<br>'''&'''<br />
|align='center'|27<br>'''''''<br />
|align='center'|28<br>'''('''<br />
|align='center'|29<br>''')'''<br />
|align='center'|2A<br>'''*'''<br />
|align='center'|2B<br>'''+'''<br />
|align='center'|2C<br>''','''<br />
|align='center'|2D<br>'''-'''<br />
|align='center'|2E<br>'''.'''<br />
|align='center'|2F<br>'''/'''<br />
<br />
|-<br />
!3…<br />
|align='center'|30<br>'''0'''<br />
|align='center'|31<br>'''1'''<br />
|align='center'|32<br>'''2'''<br />
|align='center'|33<br>'''3'''<br />
|align='center'|34<br>'''4'''<br />
|align='center'|35<br>'''5'''<br />
|align='center'|36<br>'''6'''<br />
|align='center'|37<br>'''7'''<br />
|align='center'|38<br>'''8'''<br />
|align='center'|39<br>'''9'''<br />
|align='center'|3A<br>''':'''<br />
|align='center'|3B<br>''';'''<br />
|align='center'|3C<br>'''<'''<br />
|align='center'|3D<br>'''='''<br />
|align='center'|3E<br>'''>'''<br />
|align='center'|3F<br>'''?'''<br />
<br />
|-<br />
!4…<br />
|align='center'|40<br>'''@'''<br />
|align='center'|41<br>'''A'''<br />
|align='center'|42<br>'''B'''<br />
|align='center'|43<br>'''C'''<br />
|align='center'|44<br>'''D'''<br />
|align='center'|45<br>'''E'''<br />
|align='center'|46<br>'''F'''<br />
|align='center'|47<br>'''G'''<br />
|align='center'|48<br>'''H'''<br />
|align='center'|49<br>'''I'''<br />
|align='center'|4A<br>'''J'''<br />
|align='center'|4B<br>'''K'''<br />
|align='center'|4C<br>'''L'''<br />
|align='center'|4D<br>'''M'''<br />
|align='center'|4E<br>'''N'''<br />
|align='center'|4F<br>'''O'''<br />
<br />
|-<br />
!5…<br />
|align='center'|50<br>'''P'''<br />
|align='center'|51<br>'''Q'''<br />
|align='center'|52<br>'''R'''<br />
|align='center'|53<br>'''S'''<br />
|align='center'|54<br>'''T'''<br />
|align='center'|55<br>'''U'''<br />
|align='center'|56<br>'''V'''<br />
|align='center'|57<br>'''W'''<br />
|align='center'|58<br>'''X'''<br />
|align='center'|59<br>'''Y'''<br />
|align='center'|5A<br>'''Z'''<br />
|align='center'|5B<br>'''['''<br />
|align='center'|5C<br>'''\'''<br />
|align='center'|5D<br>''']'''<br />
|align='center'|5E<br>'''^'''<br />
|align='center'|5F<br>'''_'''<br />
<br />
|-<br />
!6…<br />
|align='center'|60<br>'''`'''<br />
|align='center'|61<br>'''a'''<br />
|align='center'|62<br>'''b'''<br />
|align='center'|63<br>'''c'''<br />
|align='center'|64<br>'''d'''<br />
|align='center'|65<br>'''e'''<br />
|align='center'|66<br>'''f'''<br />
|align='center'|67<br>'''g'''<br />
|align='center'|68<br>'''h'''<br />
|align='center'|69<br>'''i'''<br />
|align='center'|6A<br>'''j'''<br />
|align='center'|6B<br>'''k'''<br />
|align='center'|6C<br>'''l'''<br />
|align='center'|6D<br>'''m'''<br />
|align='center'|6E<br>'''n'''<br />
|align='center'|6F<br>'''o'''<br />
<br />
|-<br />
!7…<br />
|align='center'|70<br>'''p'''<br />
|align='center'|71<br>'''q'''<br />
|align='center'|72<br>'''r'''<br />
|align='center'|73<br>'''s'''<br />
|align='center'|74<br>'''t'''<br />
|align='center'|75<br>'''u'''<br />
|align='center'|76<br>'''v'''<br />
|align='center'|77<br>'''w'''<br />
|align='center'|78<br>'''x'''<br />
|align='center'|79<br>'''y'''<br />
|align='center'|7A<br>'''z'''<br />
|align='center'|7B<br>'''{'''<br />
|align='center'|7C<br>'''|'''<br />
|align='center'|7D<br>'''}'''<br />
|align='center'|7E<br>'''~'''<br />
|align='center' style='background: #d0e0d0'|7F<br>'''�'''<br />
<br />
|-<br />
!8…<br />
|align='center' style='background: #c0ffc0'|80<br>'''Ň'''<br />
|align='center' style='background: #c0ffc0'|81<br>'''Ś'''<br />
|align='center' style='background: #c0ffc0'|82<br>'''Ć'''<br />
|align='center' style='background: #c0ffc0'|83<br>'''Ż'''<br />
|align='center' style='background: #c0ffc0'|84<br>'''Ź'''<br />
|align='center' style='background: #c0ffc0'|85<br>'''Ŝ'''<br />
|align='center' style='background: #c0ffc0'|86<br>'''Ĉ'''<br />
|align='center' style='background: #c0ffc0'|87<br>'''Ẑ'''<br />
|align='center' style='background: #c0ffc0'|88<br>'''Ô'''<br />
|align='center' style='background: #c0ffc0'|89<br>'''Ŕ'''<br />
|align='center' style='background: #c0ffc0'|8A<br>'''Ǔ'''<br />
|align='center' style='background: #c0ffc0'|8B<br>'''Ă'''<br />
|align='center' style='background: #c0ffc0'|8C<br>'''Ń'''<br />
|align='center' style='background: #80f080'|8D<br>'''Ș'''<br />
|align='center' style='background: #80f080'|8E<br>'''Ț'''<br />
|align='center' style='background: #d0e0d0'|8F<br>'''�'''<br />
<br />
|-<br />
!9…<br />
|align='center' style='background: #80f080'|90<br>'''đ'''<br />
|align='center' style='background: #c0ffc0'|91<br>'''ś'''<br />
|align='center' style='background: #c0ffc0'|92<br>'''ć'''<br />
|align='center' style='background: #c0ffc0'|93<br>'''ż'''<br />
|align='center' style='background: #c0ffc0'|94<br>'''ź'''<br />
|align='center' style='background: #c0ffc0'|95<br>'''ŝ'''<br />
|align='center' style='background: #c0ffc0'|96<br>'''ĉ'''<br />
|align='center' style='background: #c0ffc0'|97<br>'''ẑ'''<br />
|align='center' style='background: #c0ffc0'|98<br>'''ô'''<br />
|align='center' style='background: #c0ffc0'|99<br>'''ŕ'''<br />
|align='center' style='background: #c0ffc0'|9A<br>'''ǔ'''<br />
|align='center' style='background: #c0ffc0'|9B<br>'''ă'''<br />
|align='center' style='background: #c0ffc0'|9C<br>'''ń'''<br />
|align='center' style='background: #80f080'|9D<br>'''ș'''<br />
|align='center' style='background: #80f080'|9E<br>'''ț'''<br />
|align='center' style='background: #d0e0d0'|9F<br>'''�'''<br />
<br />
|-<br />
!A…<br />
|align='center'|A0<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Non-breaking_space NBSP]'''<br />
|align='center' style='background: #d0d0f0'|A1<br>'''ň'''<br>(¡)'''<br />
|align='center' style='background: #d0d0f0'|A2<br>'''Ű'''<br>(¢)'''<br />
|align='center' style='background: #d0d0f0'|A3<br>'''ě'''<br>(£)'''<br />
|align='center' style='background: #d0d0f0'|A4<br>'''ű'''<br>(¤)'''<br />
|align='center' style='background: #d0d0f0'|A5<br>'''Ě'''<br>(¥)'''<br />
|align='center' style='background: #d0d0f0'|A6<br>'''Š'''<br>(¦)'''<br />
|align='center'|A7<br>'''§'''<br />
|align='center' style='background: #d0d0f0'|A8<br>'''š'''<br>(¨)'''<br />
|align='center' style='background: #d0d0f0'|A9<br>'''Ů'''<br>(©)'''<br />
|align='center' style='background: #d0d0f0'|AA<br>'''Ą'''<br>(ª)'''<br />
|align='center' style='background: #d0d0f0'|AB<br>'''Ę'''<br>(«)'''<br />
|align='center' style='background: #d0d0f0'|AC<br>'''Č'''<br>(¬)'''<br />
|align='center'|AD<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Soft_hyphen SHY]'''<br />
|align='center' style='background: #d0d0f0'|AE<br>'''č'''<br>(®)'''<br />
|align='center' style='background: #d0d0f0'|AF<br>'''ů'''<br>(¯)'''<br />
<br />
|-<br />
!B…<br />
|align='center' style='background: #d0d0f0'|B0<br>'''Ő'''<br>(°)'''<br />
|align='center' style='background: #d0d0f0'|B1<br>'''Ł'''<br>(±)'''<br />
|align='center' style='background: #d0d0f0'|B2<br>'''Ť'''<br>(²)'''<br />
|align='center' style='background: #d0d0f0'|B3<br>'''Ď'''<br>(³)'''<br />
|align='center' style='background: #d0d0f0'|B4<br>'''Ž'''<br>(´)'''<br />
|align='center' style='background: #d0d0f0'|B5<br>'''ł'''<br>(µ)'''<br />
|align='center' style='background: #d0d0f0'|B6<br>'''ť'''<br>(¶)'''<br />
|align='center' style='background: #d0d0f0'|B7<br>'''ď'''<br>(·)'''<br />
|align='center' style='background: #d0d0f0'|B8<br>'''ž'''<br>(¸)'''<br />
|align='center' style='background: #d0d0f0'|B9<br>'''ő'''<br>(¹)'''<br />
|align='center' style='background: #d0d0f0'|BA<br>'''ą'''<br>(º)'''<br />
|align='center' style='background: #d0d0f0'|BB<br>'''ę'''<br>(»)'''<br />
|align='center' style='background: #d0d0f0'|BC<br>'''Œ'''<br>(¼)'''<br />
|align='center' style='background: #d0d0f0'|BD<br>'''œ'''<br>(½)'''<br />
|align='center' style='background: #d0d0f0'|BE<br>'''Ÿ'''<br>(¾)'''<br />
|align='center'|BF<br>'''¿'''<br />
<br />
|-<br />
!C…<br />
|align='center'|C0<br>'''À'''<br />
|align='center'|C1<br>'''Á'''<br />
|align='center'|C2<br>'''Â'''<br />
|align='center'|C3<br>'''Ã'''<br />
|align='center'|C4<br>'''Ä'''<br />
|align='center'|C5<br>'''Å'''<br />
|align='center'|C6<br>'''Æ'''<br />
|align='center'|C7<br>'''Ç'''<br />
|align='center'|C8<br>'''È'''<br />
|align='center'|C9<br>'''É'''<br />
|align='center'|CA<br>'''Ê'''<br />
|align='center'|CB<br>'''Ë'''<br />
|align='center'|CC<br>'''Ì'''<br />
|align='center'|CD<br>'''Í'''<br />
|align='center'|CE<br>'''Î'''<br />
|align='center'|CF<br>'''Ï'''<br />
<br />
|-<br />
!D…<br />
|align='center'|D0<br>'''Ð'''<br />
|align='center'|D1<br>'''Ñ'''<br />
|align='center'|D2<br>'''Ò'''<br />
|align='center'|D3<br>'''Ó'''<br />
|align='center'|D4<br>'''Ô'''<br />
|align='center'|D5<br>'''Õ'''<br />
|align='center'|D6<br>'''Ö'''<br />
|align='center' style='background: #d0d0f0'|D7<br>'''Ř'''<br>(×)'''<br />
|align='center'|D8<br>'''Ø'''<br />
|align='center'|D9<br>'''Ù'''<br />
|align='center'|DA<br>'''Ú'''<br />
|align='center'|DB<br>'''Û'''<br />
|align='center'|DC<br>'''Ü'''<br />
|align='center'|DD<br>'''Ý'''<br />
|align='center'|DE<br>'''Þ'''<br />
|align='center'|DF<br>'''ß'''<br />
<br />
|-<br />
!E…<br />
|align='center'|E0<br>'''à'''<br />
|align='center'|E1<br>'''á'''<br />
|align='center'|E2<br>'''â'''<br />
|align='center'|E3<br>'''ã'''<br />
|align='center'|E4<br>'''ä'''<br />
|align='center'|E5<br>'''å'''<br />
|align='center'|E6<br>'''æ'''<br />
|align='center'|E7<br>'''ç'''<br />
|align='center'|E8<br>'''è'''<br />
|align='center'|E9<br>'''é'''<br />
|align='center'|EA<br>'''ê'''<br />
|align='center'|EB<br>'''ë'''<br />
|align='center'|EC<br>'''ì'''<br />
|align='center'|ED<br>'''í'''<br />
|align='center'|EE<br>'''î'''<br />
|align='center'|EF<br>'''ï'''<br />
<br />
|-<br />
!F…<br />
|align='center'|F0<br>'''ð'''<br />
|align='center'|F1<br>'''ñ'''<br />
|align='center'|F2<br>'''ò'''<br />
|align='center'|F3<br>'''ó'''<br />
|align='center'|F4<br>'''ô'''<br />
|align='center'|F5<br>'''õ'''<br />
|align='center'|F6<br>'''ö'''<br />
|align='center' style='background: #d0d0f0'|F7<br>'''ř'''<br>(÷)'''<br />
|align='center'|F8<br>'''ø'''<br />
|align='center'|F9<br>'''ù'''<br />
|align='center'|FA<br>'''ú'''<br />
|align='center'|FB<br>'''û'''<br />
|align='center'|FC<br>'''ü'''<br />
|align='center'|FD<br>'''ý'''<br />
|align='center'|FE<br>'''þ'''<br />
|align='center'|FF<br>'''ÿ'''<br />
<br />
|}<br />
<br />
=== Russian ===<br />
<br />
The character '''0xFF''' (я) is mapped to '''0xB6''' upon loading. Therefore any Russian font must contain я at the place 0xB6.<br />
<br />
=== Asian Languages (Korean, Chinese, Japanese) ===<br />
<br />
The original D3 had support for these languages, so it might be possible to add them to TDM, too. At the moment, however, we lack the fonts and translators. Also, writing from right-to-left (Hebrew) or top-down (Japanese) might be tricky or outright impossible in our GUI without more work in the C++ code. Plus, these languages use more than 256 different characters, and an 8 bit table will not hold these.<br />
<br />
== Statistics ==<br />
<br />
Some of the special characters are used more often then others. Here is a statistic over the entire string set of the TDM core, from TDM v1.08, showing the top 50 most-used characters (excluding a-z, 0-9 and russian characters):<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 85%" cellspacing=0 cellpadding=2<br />
<br />
|-<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
<br />
|-<br />
|1<br />
|í<br />
|715<br />
|<br />
|25<br />
|ć<br />
|67<br />
|<br />
<br />
|-<br />
|2<br />
|é<br />
|674<br />
|<br />
|26<br />
|è<br />
|65<br />
|<br />
<br />
|-<br />
|3<br />
|á<br />
|524<br />
|<br />
|27<br />
|ú<br />
|56<br />
|<br />
<br />
|-<br />
|4<br />
|ø<br />
|303<br />
|Danish<br />
|28<br />
|ê<br />
|52<br />
|<br />
<br />
|-<br />
|5<br />
|č<br />
|288<br />
|<br />
|29<br />
|ö<br />
|48<br />
|German<br />
<br />
|-<br />
|6<br />
|ó<br />
|283<br />
|<br />
|30<br />
|É<br />
|46<br />
|<br />
<br />
|-<br />
|7<br />
|ü<br />
|270<br />
|German<br />
|31<br />
|ñ<br />
|37<br />
|<br />
<br />
|-<br />
|8<br />
|ł<br />
|203<br />
|Polish<br />
|32<br />
|õ<br />
|32<br />
|<br />
<br />
|-<br />
|9<br />
|æ<br />
|200<br />
|Danish<br />
|33<br />
|ń<br />
|26<br />
|<br />
<br />
|-<br />
|10<br />
|ě<br />
|182<br />
|<br />
|34<br />
|Ł<br />
|24<br />
|<br />
<br />
|-<br />
|11<br />
|ř<br />
|175<br />
|Czech<br />
|35<br />
|Š<br />
|21<br />
|<br />
<br />
|-<br />
|12<br />
|ã<br />
|168<br />
|<br />
|36<br />
|â<br />
|21<br />
|<br />
<br />
|-<br />
|13<br />
|ž<br />
|148<br />
|Czech<br />
|37<br />
|ź<br />
|20<br />
|<br />
<br />
|-<br />
|14<br />
|ý<br />
|142<br />
|<br />
|38<br />
|ß<br />
|18<br />
|German<br />
<br />
|-<br />
|15<br />
|ę<br />
|141<br />
|<br />
|39<br />
|Ó<br />
|18<br />
|<br />
<br />
|-<br />
|16<br />
|ą<br />
|140<br />
|<br />
|40<br />
|ň<br />
|15<br />
|<br />
<br />
|-<br />
|17<br />
|ż<br />
|119<br />
|<br />
|41<br />
|Ú<br />
|15<br />
|<br />
<br />
|-<br />
|18<br />
|å<br />
|109<br />
|Danish<br />
|42<br />
|Á<br />
|13<br />
|<br />
<br />
|-<br />
|19<br />
|š<br />
|99<br />
|<br />
|43<br />
|î<br />
|12<br />
|<br />
<br />
|-<br />
|20<br />
|ś<br />
|97<br />
|<br />
|44<br />
|ť<br />
|11<br />
|<br />
<br />
|-<br />
|21<br />
|ç<br />
|91<br />
|<br />
|45<br />
|ô<br />
|9<br />
|<br />
<br />
|-<br />
|22<br />
|ä<br />
|86<br />
|German<br />
|46<br />
|Ž<br />
|8<br />
|<br />
<br />
|-<br />
|23<br />
|à<br />
|83<br />
|<br />
|47<br />
|Ż<br />
|7<br />
|<br />
<br />
|-<br />
|24<br />
|ů<br />
|77<br />
|<br />
|48<br />
|Č<br />
|7<br />
|<br />
<br />
|-<br />
|25<br />
|ć<br />
|67<br />
|<br />
|49<br />
|ù<br />
|6<br />
|<br />
<br />
|}<br />
<br />
Althought ö, ä and ü do not appear that often, with only these and Ü, Ö, Ä and ß, the entire German language works. So adding these letters to the fonts is quite important. <br />
<br />
Preferable, all foreign letters would be added to the fonts (see [[Font Patcher]]). However, if time permits only adding a few, '''í''' would be more important than say '''ô'''.<br />
<br />
[[Category:Fonts]]<br />
<br />
{{i18n}}* [[Font Patcher]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_Charset&diff=18048
I18N - Charset
2015-01-05T14:24:34Z
<p>Tels: /* Statistics */</p>
<hr />
<div>== Introduction ==<br />
<br />
The D3 code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, special charsets are used. The fonts (Carleton for the menu f.i.) are build/patched so that the right characters appear in the right place.<br />
<br />
== Encodings ==<br />
<br />
=== all.lang ===<br />
<br />
This file is in '''UTF-8''', and converted with the help of the script '''devel/gen_lang.pl''':<br />
<br />
perl devel/gen_lang.pl<br />
<br />
This ensures that the generated language files are in their proper encodings (see below).<br />
<br />
=== All other language files ===<br />
<br />
Note that the language files (f.i. '''strings/german.lang''') as well as the readables and the FM dictionariaries are expected to be in the following encodings:<br />
<br />
* '''Czech''', '''Hungarian''', '''Slovak''', '''Polish:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-2 ISO-8859-2] ('''not WIN-1250!)<br />
* '''Russian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/Win-1251 WIN-1251]<br />
* '''French:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-15 ISO-8859-15]<br />
* '''Romanian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-16 ISO-8859-16] <br />
* '''All other languages:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1 ISO-8859-1] (German, Dutch, Danish, Swedish, Portuguese, etc.)<br />
<br />
<br />
{{infobox|The core dictionaries are automatically generated in the right encoding, but make sure that you use the right encoding for the FM dictionary, too!}}<br />
<br />
== Character remapping ==<br />
<br />
The characters are remapped upon loading the dictionary/readable, from their native encoding to the special one that TDM uses and that is described here. Responsible for the remapping are [[I18N - Character mapping|mapping files]], f.i. "strings/czech.map". If a map file for a specific language is not found, "strings/default.map" is used instead, if this is not found, no remapping takes place.<br />
<br />
See '''[[I18N - Character mapping|Character mapping]]''' for more information.<br />
<br />
== European Languages ==<br />
<br />
This mapping is used for European languages, f.i. '''Czech''', '''French''', '''German''', '''Spanish''', '''Portuguese''', '''Polish'''. Note that the double accented characters in Hungarian '''Ő, ő, Ű and ű''' look a bit different from '''Ö, ö, Ü and ü'''!<br />
<br />
In the table below, the original ISO 8859-1 characters are given in ''()'' below the TDM character.<br />
<br />
'''Color code:'''<br />
<br />
{{box|#f0d0d0|Character not usable by TDM|Unusable}}{{box|#d0e0d0|Character not yet used in TDM|Unused}}{{box|#c0ffc0|Character displayed in v1.08 or newer|Usable in v1.08}}{{box|#80f080|Character displayed in v2.03 or newer|Usable in v2.03}}{{box|#d0d0f0|Changed from the ISO-8859-1 default, usable by TDM 1.0 or newer|Changed from ISO 8859-1}}<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 95%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!<br />
!…0<br />
!…1<br />
!…2<br />
!…3<br />
!…4<br />
!…5<br />
!…6<br />
!…7<br />
!…8<br />
!…9<br />
!…A<br />
!…B<br />
!…C<br />
!…D<br />
!…E<br />
!…F<br />
<br />
|-<br />
!0…<br />
|align='center' style='background: #f0d0d0'|00<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|01<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|02<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|03<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|04<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|05<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|06<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|07<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|08<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|09<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0F<br>'''–'''<br />
<br />
|-<br />
!1…<br />
|align='center' style='background: #f0d0d0'|10<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|11<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|12<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|13<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|14<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|15<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|16<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|17<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|18<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|19<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1F<br>'''–'''<br />
<br />
|-<br />
!2…<br />
|align='center'|20<br>'''&nbsp;'''<br />
|align='center'|21<br>'''!'''<br />
|align='center'|22<br>'''"'''<br />
|align='center'|23<br>'''#'''<br />
|align='center'|24<br>'''$'''<br />
|align='center'|25<br>'''%'''<br />
|align='center'|26<br>'''&'''<br />
|align='center'|27<br>'''''''<br />
|align='center'|28<br>'''('''<br />
|align='center'|29<br>''')'''<br />
|align='center'|2A<br>'''*'''<br />
|align='center'|2B<br>'''+'''<br />
|align='center'|2C<br>''','''<br />
|align='center'|2D<br>'''-'''<br />
|align='center'|2E<br>'''.'''<br />
|align='center'|2F<br>'''/'''<br />
<br />
|-<br />
!3…<br />
|align='center'|30<br>'''0'''<br />
|align='center'|31<br>'''1'''<br />
|align='center'|32<br>'''2'''<br />
|align='center'|33<br>'''3'''<br />
|align='center'|34<br>'''4'''<br />
|align='center'|35<br>'''5'''<br />
|align='center'|36<br>'''6'''<br />
|align='center'|37<br>'''7'''<br />
|align='center'|38<br>'''8'''<br />
|align='center'|39<br>'''9'''<br />
|align='center'|3A<br>''':'''<br />
|align='center'|3B<br>''';'''<br />
|align='center'|3C<br>'''<'''<br />
|align='center'|3D<br>'''='''<br />
|align='center'|3E<br>'''>'''<br />
|align='center'|3F<br>'''?'''<br />
<br />
|-<br />
!4…<br />
|align='center'|40<br>'''@'''<br />
|align='center'|41<br>'''A'''<br />
|align='center'|42<br>'''B'''<br />
|align='center'|43<br>'''C'''<br />
|align='center'|44<br>'''D'''<br />
|align='center'|45<br>'''E'''<br />
|align='center'|46<br>'''F'''<br />
|align='center'|47<br>'''G'''<br />
|align='center'|48<br>'''H'''<br />
|align='center'|49<br>'''I'''<br />
|align='center'|4A<br>'''J'''<br />
|align='center'|4B<br>'''K'''<br />
|align='center'|4C<br>'''L'''<br />
|align='center'|4D<br>'''M'''<br />
|align='center'|4E<br>'''N'''<br />
|align='center'|4F<br>'''O'''<br />
<br />
|-<br />
!5…<br />
|align='center'|50<br>'''P'''<br />
|align='center'|51<br>'''Q'''<br />
|align='center'|52<br>'''R'''<br />
|align='center'|53<br>'''S'''<br />
|align='center'|54<br>'''T'''<br />
|align='center'|55<br>'''U'''<br />
|align='center'|56<br>'''V'''<br />
|align='center'|57<br>'''W'''<br />
|align='center'|58<br>'''X'''<br />
|align='center'|59<br>'''Y'''<br />
|align='center'|5A<br>'''Z'''<br />
|align='center'|5B<br>'''['''<br />
|align='center'|5C<br>'''\'''<br />
|align='center'|5D<br>''']'''<br />
|align='center'|5E<br>'''^'''<br />
|align='center'|5F<br>'''_'''<br />
<br />
|-<br />
!6…<br />
|align='center'|60<br>'''`'''<br />
|align='center'|61<br>'''a'''<br />
|align='center'|62<br>'''b'''<br />
|align='center'|63<br>'''c'''<br />
|align='center'|64<br>'''d'''<br />
|align='center'|65<br>'''e'''<br />
|align='center'|66<br>'''f'''<br />
|align='center'|67<br>'''g'''<br />
|align='center'|68<br>'''h'''<br />
|align='center'|69<br>'''i'''<br />
|align='center'|6A<br>'''j'''<br />
|align='center'|6B<br>'''k'''<br />
|align='center'|6C<br>'''l'''<br />
|align='center'|6D<br>'''m'''<br />
|align='center'|6E<br>'''n'''<br />
|align='center'|6F<br>'''o'''<br />
<br />
|-<br />
!7…<br />
|align='center'|70<br>'''p'''<br />
|align='center'|71<br>'''q'''<br />
|align='center'|72<br>'''r'''<br />
|align='center'|73<br>'''s'''<br />
|align='center'|74<br>'''t'''<br />
|align='center'|75<br>'''u'''<br />
|align='center'|76<br>'''v'''<br />
|align='center'|77<br>'''w'''<br />
|align='center'|78<br>'''x'''<br />
|align='center'|79<br>'''y'''<br />
|align='center'|7A<br>'''z'''<br />
|align='center'|7B<br>'''{'''<br />
|align='center'|7C<br>'''|'''<br />
|align='center'|7D<br>'''}'''<br />
|align='center'|7E<br>'''~'''<br />
|align='center' style='background: #d0e0d0'|7F<br>'''�'''<br />
<br />
|-<br />
!8…<br />
|align='center' style='background: #c0ffc0'|80<br>'''Ň'''<br />
|align='center' style='background: #c0ffc0'|81<br>'''Ś'''<br />
|align='center' style='background: #c0ffc0'|82<br>'''Ć'''<br />
|align='center' style='background: #c0ffc0'|83<br>'''Ż'''<br />
|align='center' style='background: #c0ffc0'|84<br>'''Ź'''<br />
|align='center' style='background: #c0ffc0'|85<br>'''Ŝ'''<br />
|align='center' style='background: #c0ffc0'|86<br>'''Ĉ'''<br />
|align='center' style='background: #c0ffc0'|87<br>'''Ẑ'''<br />
|align='center' style='background: #c0ffc0'|88<br>'''Ô'''<br />
|align='center' style='background: #c0ffc0'|89<br>'''Ŕ'''<br />
|align='center' style='background: #c0ffc0'|8A<br>'''Ǔ'''<br />
|align='center' style='background: #c0ffc0'|8B<br>'''Ă'''<br />
|align='center' style='background: #c0ffc0'|8C<br>'''Ń'''<br />
|align='center' style='background: #80f080'|8D<br>'''Ș'''<br />
|align='center' style='background: #80f080'|8E<br>'''Ț'''<br />
|align='center' style='background: #d0e0d0'|8F<br>'''�'''<br />
<br />
|-<br />
!9…<br />
|align='center' style='background: #80f080'|90<br>'''đ'''<br />
|align='center' style='background: #c0ffc0'|91<br>'''ś'''<br />
|align='center' style='background: #c0ffc0'|92<br>'''ć'''<br />
|align='center' style='background: #c0ffc0'|93<br>'''ż'''<br />
|align='center' style='background: #c0ffc0'|94<br>'''ź'''<br />
|align='center' style='background: #c0ffc0'|95<br>'''ŝ'''<br />
|align='center' style='background: #c0ffc0'|96<br>'''ĉ'''<br />
|align='center' style='background: #c0ffc0'|97<br>'''ẑ'''<br />
|align='center' style='background: #c0ffc0'|98<br>'''ô'''<br />
|align='center' style='background: #c0ffc0'|99<br>'''ŕ'''<br />
|align='center' style='background: #c0ffc0'|9A<br>'''ǔ'''<br />
|align='center' style='background: #c0ffc0'|9B<br>'''ă'''<br />
|align='center' style='background: #c0ffc0'|9C<br>'''ń'''<br />
|align='center' style='background: #80f080'|9D<br>'''ș'''<br />
|align='center' style='background: #80f080'|9E<br>'''ț'''<br />
|align='center' style='background: #d0e0d0'|9F<br>'''�'''<br />
<br />
|-<br />
!A…<br />
|align='center'|A0<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Non-breaking_space NBSP]'''<br />
|align='center' style='background: #d0d0f0'|A1<br>'''ň'''<br>(¡)'''<br />
|align='center' style='background: #d0d0f0'|A2<br>'''Ű'''<br>(¢)'''<br />
|align='center' style='background: #d0d0f0'|A3<br>'''ě'''<br>(£)'''<br />
|align='center' style='background: #d0d0f0'|A4<br>'''ű'''<br>(¤)'''<br />
|align='center' style='background: #d0d0f0'|A5<br>'''Ě'''<br>(¥)'''<br />
|align='center' style='background: #d0d0f0'|A6<br>'''Š'''<br>(¦)'''<br />
|align='center'|A7<br>'''§'''<br />
|align='center' style='background: #d0d0f0'|A8<br>'''š'''<br>(¨)'''<br />
|align='center' style='background: #d0d0f0'|A9<br>'''Ů'''<br>(©)'''<br />
|align='center' style='background: #d0d0f0'|AA<br>'''Ą'''<br>(ª)'''<br />
|align='center' style='background: #d0d0f0'|AB<br>'''Ę'''<br>(«)'''<br />
|align='center' style='background: #d0d0f0'|AC<br>'''Č'''<br>(¬)'''<br />
|align='center'|AD<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Soft_hyphen SHY]'''<br />
|align='center' style='background: #d0d0f0'|AE<br>'''č'''<br>(®)'''<br />
|align='center' style='background: #d0d0f0'|AF<br>'''ů'''<br>(¯)'''<br />
<br />
|-<br />
!B…<br />
|align='center' style='background: #d0d0f0'|B0<br>'''Ő'''<br>(°)'''<br />
|align='center' style='background: #d0d0f0'|B1<br>'''Ł'''<br>(±)'''<br />
|align='center' style='background: #d0d0f0'|B2<br>'''Ť'''<br>(²)'''<br />
|align='center' style='background: #d0d0f0'|B3<br>'''Ď'''<br>(³)'''<br />
|align='center' style='background: #d0d0f0'|B4<br>'''Ž'''<br>(´)'''<br />
|align='center' style='background: #d0d0f0'|B5<br>'''ł'''<br>(µ)'''<br />
|align='center' style='background: #d0d0f0'|B6<br>'''ť'''<br>(¶)'''<br />
|align='center' style='background: #d0d0f0'|B7<br>'''ď'''<br>(·)'''<br />
|align='center' style='background: #d0d0f0'|B8<br>'''ž'''<br>(¸)'''<br />
|align='center' style='background: #d0d0f0'|B9<br>'''ő'''<br>(¹)'''<br />
|align='center' style='background: #d0d0f0'|BA<br>'''ą'''<br>(º)'''<br />
|align='center' style='background: #d0d0f0'|BB<br>'''ę'''<br>(»)'''<br />
|align='center' style='background: #d0d0f0'|BC<br>'''Œ'''<br>(¼)'''<br />
|align='center' style='background: #d0d0f0'|BD<br>'''œ'''<br>(½)'''<br />
|align='center' style='background: #d0d0f0'|BE<br>'''Ÿ'''<br>(¾)'''<br />
|align='center'|BF<br>'''¿'''<br />
<br />
|-<br />
!C…<br />
|align='center'|C0<br>'''À'''<br />
|align='center'|C1<br>'''Á'''<br />
|align='center'|C2<br>'''Â'''<br />
|align='center'|C3<br>'''Ã'''<br />
|align='center'|C4<br>'''Ä'''<br />
|align='center'|C5<br>'''Å'''<br />
|align='center'|C6<br>'''Æ'''<br />
|align='center'|C7<br>'''Ç'''<br />
|align='center'|C8<br>'''È'''<br />
|align='center'|C9<br>'''É'''<br />
|align='center'|CA<br>'''Ê'''<br />
|align='center'|CB<br>'''Ë'''<br />
|align='center'|CC<br>'''Ì'''<br />
|align='center'|CD<br>'''Í'''<br />
|align='center'|CE<br>'''Î'''<br />
|align='center'|CF<br>'''Ï'''<br />
<br />
|-<br />
!D…<br />
|align='center'|D0<br>'''Ð'''<br />
|align='center'|D1<br>'''Ñ'''<br />
|align='center'|D2<br>'''Ò'''<br />
|align='center'|D3<br>'''Ó'''<br />
|align='center'|D4<br>'''Ô'''<br />
|align='center'|D5<br>'''Õ'''<br />
|align='center'|D6<br>'''Ö'''<br />
|align='center' style='background: #d0d0f0'|D7<br>'''Ř'''<br>(×)'''<br />
|align='center'|D8<br>'''Ø'''<br />
|align='center'|D9<br>'''Ù'''<br />
|align='center'|DA<br>'''Ú'''<br />
|align='center'|DB<br>'''Û'''<br />
|align='center'|DC<br>'''Ü'''<br />
|align='center'|DD<br>'''Ý'''<br />
|align='center'|DE<br>'''Þ'''<br />
|align='center'|DF<br>'''ß'''<br />
<br />
|-<br />
!E…<br />
|align='center'|E0<br>'''à'''<br />
|align='center'|E1<br>'''á'''<br />
|align='center'|E2<br>'''â'''<br />
|align='center'|E3<br>'''ã'''<br />
|align='center'|E4<br>'''ä'''<br />
|align='center'|E5<br>'''å'''<br />
|align='center'|E6<br>'''æ'''<br />
|align='center'|E7<br>'''ç'''<br />
|align='center'|E8<br>'''è'''<br />
|align='center'|E9<br>'''é'''<br />
|align='center'|EA<br>'''ê'''<br />
|align='center'|EB<br>'''ë'''<br />
|align='center'|EC<br>'''ì'''<br />
|align='center'|ED<br>'''í'''<br />
|align='center'|EE<br>'''î'''<br />
|align='center'|EF<br>'''ï'''<br />
<br />
|-<br />
!F…<br />
|align='center'|F0<br>'''ð'''<br />
|align='center'|F1<br>'''ñ'''<br />
|align='center'|F2<br>'''ò'''<br />
|align='center'|F3<br>'''ó'''<br />
|align='center'|F4<br>'''ô'''<br />
|align='center'|F5<br>'''õ'''<br />
|align='center'|F6<br>'''ö'''<br />
|align='center' style='background: #d0d0f0'|F7<br>'''ř'''<br>(÷)'''<br />
|align='center'|F8<br>'''ø'''<br />
|align='center'|F9<br>'''ù'''<br />
|align='center'|FA<br>'''ú'''<br />
|align='center'|FB<br>'''û'''<br />
|align='center'|FC<br>'''ü'''<br />
|align='center'|FD<br>'''ý'''<br />
|align='center'|FE<br>'''þ'''<br />
|align='center'|FF<br>'''ÿ'''<br />
<br />
|}<br />
<br />
== Russian ==<br />
<br />
The character '''0xFF''' (я) is mapped to '''0xB6''' upon loading. Therefore any Russian font must contain я at the place 0xB6.<br />
<br />
== Asian Languages (Korean, Chinese, Japanese) ==<br />
<br />
The original D3 had support for these languages, so it might be possible to add them to TDM, too. At the moment, however, we lack the fonts and translators. Also, writing from right-to-left (Hebrew) or top-down (Japanese) might be tricky or outright impossible in our GUI without more work in the C++ code.<br />
<br />
== Statistics ==<br />
<br />
Some of the special characters are used more often then others. Here is a statistic over the entire string set of the TDM core, from TDM v1.08, showing the top 50 most-used characters (excluding a-z, 0-9 and russian characters):<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 85%" cellspacing=0 cellpadding=2<br />
<br />
|-<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
<br />
|-<br />
|1<br />
|í<br />
|715<br />
|<br />
|25<br />
|ć<br />
|67<br />
|<br />
<br />
|-<br />
|2<br />
|é<br />
|674<br />
|<br />
|26<br />
|è<br />
|65<br />
|<br />
<br />
|-<br />
|3<br />
|á<br />
|524<br />
|<br />
|27<br />
|ú<br />
|56<br />
|<br />
<br />
|-<br />
|4<br />
|ø<br />
|303<br />
|Danish<br />
|28<br />
|ê<br />
|52<br />
|<br />
<br />
|-<br />
|5<br />
|č<br />
|288<br />
|<br />
|29<br />
|ö<br />
|48<br />
|German<br />
<br />
|-<br />
|6<br />
|ó<br />
|283<br />
|<br />
|30<br />
|É<br />
|46<br />
|<br />
<br />
|-<br />
|7<br />
|ü<br />
|270<br />
|German<br />
|31<br />
|ñ<br />
|37<br />
|<br />
<br />
|-<br />
|8<br />
|ł<br />
|203<br />
|Polish<br />
|32<br />
|õ<br />
|32<br />
|<br />
<br />
|-<br />
|9<br />
|æ<br />
|200<br />
|Danish<br />
|33<br />
|ń<br />
|26<br />
|<br />
<br />
|-<br />
|10<br />
|ě<br />
|182<br />
|<br />
|34<br />
|Ł<br />
|24<br />
|<br />
<br />
|-<br />
|11<br />
|ř<br />
|175<br />
|Czech<br />
|35<br />
|Š<br />
|21<br />
|<br />
<br />
|-<br />
|12<br />
|ã<br />
|168<br />
|<br />
|36<br />
|â<br />
|21<br />
|<br />
<br />
|-<br />
|13<br />
|ž<br />
|148<br />
|Czech<br />
|37<br />
|ź<br />
|20<br />
|<br />
<br />
|-<br />
|14<br />
|ý<br />
|142<br />
|<br />
|38<br />
|ß<br />
|18<br />
|German<br />
<br />
|-<br />
|15<br />
|ę<br />
|141<br />
|<br />
|39<br />
|Ó<br />
|18<br />
|<br />
<br />
|-<br />
|16<br />
|ą<br />
|140<br />
|<br />
|40<br />
|ň<br />
|15<br />
|<br />
<br />
|-<br />
|17<br />
|ż<br />
|119<br />
|<br />
|41<br />
|Ú<br />
|15<br />
|<br />
<br />
|-<br />
|18<br />
|å<br />
|109<br />
|Danish<br />
|42<br />
|Á<br />
|13<br />
|<br />
<br />
|-<br />
|19<br />
|š<br />
|99<br />
|<br />
|43<br />
|î<br />
|12<br />
|<br />
<br />
|-<br />
|20<br />
|ś<br />
|97<br />
|<br />
|44<br />
|ť<br />
|11<br />
|<br />
<br />
|-<br />
|21<br />
|ç<br />
|91<br />
|<br />
|45<br />
|ô<br />
|9<br />
|<br />
<br />
|-<br />
|22<br />
|ä<br />
|86<br />
|German<br />
|46<br />
|Ž<br />
|8<br />
|<br />
<br />
|-<br />
|23<br />
|à<br />
|83<br />
|<br />
|47<br />
|Ż<br />
|7<br />
|<br />
<br />
|-<br />
|24<br />
|ů<br />
|77<br />
|<br />
|48<br />
|Č<br />
|7<br />
|<br />
<br />
|-<br />
|25<br />
|ć<br />
|67<br />
|<br />
|49<br />
|ù<br />
|6<br />
|<br />
<br />
|}<br />
<br />
Althought ö, ä and ü do not appear that often, with only these and Ü, Ö, Ä and ß, the entire German language works. So adding these letters to the fonts is quite important. Likewise, í is more important than say ô.<br />
<br />
[[Category:Fonts]]<br />
<br />
{{i18n}}* [[Font Patcher]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_Charset&diff=18047
I18N - Charset
2015-01-05T14:23:44Z
<p>Tels: add free characters</p>
<hr />
<div>== Introduction ==<br />
<br />
The D3 code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, special charsets are used. The fonts (Carleton for the menu f.i.) are build/patched so that the right characters appear in the right place.<br />
<br />
== Encodings ==<br />
<br />
=== all.lang ===<br />
<br />
This file is in '''UTF-8''', and converted with the help of the script '''devel/gen_lang.pl''':<br />
<br />
perl devel/gen_lang.pl<br />
<br />
This ensures that the generated language files are in their proper encodings (see below).<br />
<br />
=== All other language files ===<br />
<br />
Note that the language files (f.i. '''strings/german.lang''') as well as the readables and the FM dictionariaries are expected to be in the following encodings:<br />
<br />
* '''Czech''', '''Hungarian''', '''Slovak''', '''Polish:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-2 ISO-8859-2] ('''not WIN-1250!)<br />
* '''Russian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/Win-1251 WIN-1251]<br />
* '''French:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-15 ISO-8859-15]<br />
* '''Romanian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-16 ISO-8859-16] <br />
* '''All other languages:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1 ISO-8859-1] (German, Dutch, Danish, Swedish, Portuguese, etc.)<br />
<br />
<br />
{{infobox|The core dictionaries are automatically generated in the right encoding, but make sure that you use the right encoding for the FM dictionary, too!}}<br />
<br />
== Character remapping ==<br />
<br />
The characters are remapped upon loading the dictionary/readable, from their native encoding to the special one that TDM uses and that is described here. Responsible for the remapping are [[I18N - Character mapping|mapping files]], f.i. "strings/czech.map". If a map file for a specific language is not found, "strings/default.map" is used instead, if this is not found, no remapping takes place.<br />
<br />
See '''[[I18N - Character mapping|Character mapping]]''' for more information.<br />
<br />
== European Languages ==<br />
<br />
This mapping is used for European languages, f.i. '''Czech''', '''French''', '''German''', '''Spanish''', '''Portuguese''', '''Polish'''. Note that the double accented characters in Hungarian '''Ő, ő, Ű and ű''' look a bit different from '''Ö, ö, Ü and ü'''!<br />
<br />
In the table below, the original ISO 8859-1 characters are given in ''()'' below the TDM character.<br />
<br />
'''Color code:'''<br />
<br />
{{box|#f0d0d0|Character not usable by TDM|Unusable}}{{box|#d0e0d0|Character not yet used in TDM|Unused}}{{box|#c0ffc0|Character displayed in v1.08 or newer|Usable in v1.08}}{{box|#80f080|Character displayed in v2.03 or newer|Usable in v2.03}}{{box|#d0d0f0|Changed from the ISO-8859-1 default, usable by TDM 1.0 or newer|Changed from ISO 8859-1}}<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 95%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!<br />
!…0<br />
!…1<br />
!…2<br />
!…3<br />
!…4<br />
!…5<br />
!…6<br />
!…7<br />
!…8<br />
!…9<br />
!…A<br />
!…B<br />
!…C<br />
!…D<br />
!…E<br />
!…F<br />
<br />
|-<br />
!0…<br />
|align='center' style='background: #f0d0d0'|00<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|01<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|02<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|03<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|04<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|05<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|06<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|07<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|08<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|09<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0F<br>'''–'''<br />
<br />
|-<br />
!1…<br />
|align='center' style='background: #f0d0d0'|10<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|11<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|12<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|13<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|14<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|15<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|16<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|17<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|18<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|19<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1F<br>'''–'''<br />
<br />
|-<br />
!2…<br />
|align='center'|20<br>'''&nbsp;'''<br />
|align='center'|21<br>'''!'''<br />
|align='center'|22<br>'''"'''<br />
|align='center'|23<br>'''#'''<br />
|align='center'|24<br>'''$'''<br />
|align='center'|25<br>'''%'''<br />
|align='center'|26<br>'''&'''<br />
|align='center'|27<br>'''''''<br />
|align='center'|28<br>'''('''<br />
|align='center'|29<br>''')'''<br />
|align='center'|2A<br>'''*'''<br />
|align='center'|2B<br>'''+'''<br />
|align='center'|2C<br>''','''<br />
|align='center'|2D<br>'''-'''<br />
|align='center'|2E<br>'''.'''<br />
|align='center'|2F<br>'''/'''<br />
<br />
|-<br />
!3…<br />
|align='center'|30<br>'''0'''<br />
|align='center'|31<br>'''1'''<br />
|align='center'|32<br>'''2'''<br />
|align='center'|33<br>'''3'''<br />
|align='center'|34<br>'''4'''<br />
|align='center'|35<br>'''5'''<br />
|align='center'|36<br>'''6'''<br />
|align='center'|37<br>'''7'''<br />
|align='center'|38<br>'''8'''<br />
|align='center'|39<br>'''9'''<br />
|align='center'|3A<br>''':'''<br />
|align='center'|3B<br>''';'''<br />
|align='center'|3C<br>'''<'''<br />
|align='center'|3D<br>'''='''<br />
|align='center'|3E<br>'''>'''<br />
|align='center'|3F<br>'''?'''<br />
<br />
|-<br />
!4…<br />
|align='center'|40<br>'''@'''<br />
|align='center'|41<br>'''A'''<br />
|align='center'|42<br>'''B'''<br />
|align='center'|43<br>'''C'''<br />
|align='center'|44<br>'''D'''<br />
|align='center'|45<br>'''E'''<br />
|align='center'|46<br>'''F'''<br />
|align='center'|47<br>'''G'''<br />
|align='center'|48<br>'''H'''<br />
|align='center'|49<br>'''I'''<br />
|align='center'|4A<br>'''J'''<br />
|align='center'|4B<br>'''K'''<br />
|align='center'|4C<br>'''L'''<br />
|align='center'|4D<br>'''M'''<br />
|align='center'|4E<br>'''N'''<br />
|align='center'|4F<br>'''O'''<br />
<br />
|-<br />
!5…<br />
|align='center'|50<br>'''P'''<br />
|align='center'|51<br>'''Q'''<br />
|align='center'|52<br>'''R'''<br />
|align='center'|53<br>'''S'''<br />
|align='center'|54<br>'''T'''<br />
|align='center'|55<br>'''U'''<br />
|align='center'|56<br>'''V'''<br />
|align='center'|57<br>'''W'''<br />
|align='center'|58<br>'''X'''<br />
|align='center'|59<br>'''Y'''<br />
|align='center'|5A<br>'''Z'''<br />
|align='center'|5B<br>'''['''<br />
|align='center'|5C<br>'''\'''<br />
|align='center'|5D<br>''']'''<br />
|align='center'|5E<br>'''^'''<br />
|align='center'|5F<br>'''_'''<br />
<br />
|-<br />
!6…<br />
|align='center'|60<br>'''`'''<br />
|align='center'|61<br>'''a'''<br />
|align='center'|62<br>'''b'''<br />
|align='center'|63<br>'''c'''<br />
|align='center'|64<br>'''d'''<br />
|align='center'|65<br>'''e'''<br />
|align='center'|66<br>'''f'''<br />
|align='center'|67<br>'''g'''<br />
|align='center'|68<br>'''h'''<br />
|align='center'|69<br>'''i'''<br />
|align='center'|6A<br>'''j'''<br />
|align='center'|6B<br>'''k'''<br />
|align='center'|6C<br>'''l'''<br />
|align='center'|6D<br>'''m'''<br />
|align='center'|6E<br>'''n'''<br />
|align='center'|6F<br>'''o'''<br />
<br />
|-<br />
!7…<br />
|align='center'|70<br>'''p'''<br />
|align='center'|71<br>'''q'''<br />
|align='center'|72<br>'''r'''<br />
|align='center'|73<br>'''s'''<br />
|align='center'|74<br>'''t'''<br />
|align='center'|75<br>'''u'''<br />
|align='center'|76<br>'''v'''<br />
|align='center'|77<br>'''w'''<br />
|align='center'|78<br>'''x'''<br />
|align='center'|79<br>'''y'''<br />
|align='center'|7A<br>'''z'''<br />
|align='center'|7B<br>'''{'''<br />
|align='center'|7C<br>'''|'''<br />
|align='center'|7D<br>'''}'''<br />
|align='center'|7E<br>'''~'''<br />
|align='center' style='background: #d0e0d0'|7F<br>'''�'''<br />
<br />
|-<br />
!8…<br />
|align='center' style='background: #c0ffc0'|80<br>'''Ň'''<br />
|align='center' style='background: #c0ffc0'|81<br>'''Ś'''<br />
|align='center' style='background: #c0ffc0'|82<br>'''Ć'''<br />
|align='center' style='background: #c0ffc0'|83<br>'''Ż'''<br />
|align='center' style='background: #c0ffc0'|84<br>'''Ź'''<br />
|align='center' style='background: #c0ffc0'|85<br>'''Ŝ'''<br />
|align='center' style='background: #c0ffc0'|86<br>'''Ĉ'''<br />
|align='center' style='background: #c0ffc0'|87<br>'''Ẑ'''<br />
|align='center' style='background: #c0ffc0'|88<br>'''Ô'''<br />
|align='center' style='background: #c0ffc0'|89<br>'''Ŕ'''<br />
|align='center' style='background: #c0ffc0'|8A<br>'''Ǔ'''<br />
|align='center' style='background: #c0ffc0'|8B<br>'''Ă'''<br />
|align='center' style='background: #c0ffc0'|8C<br>'''Ń'''<br />
|align='center' style='background: #80f080'|8D<br>'''Ș'''<br />
|align='center' style='background: #80f080'|8E<br>'''Ț'''<br />
|align='center' style='background: #d0e0d0'|8F<br>'''�'''<br />
<br />
|-<br />
!9…<br />
|align='center' style='background: #80f080'|90<br>'''đ'''<br />
|align='center' style='background: #c0ffc0'|91<br>'''ś'''<br />
|align='center' style='background: #c0ffc0'|92<br>'''ć'''<br />
|align='center' style='background: #c0ffc0'|93<br>'''ż'''<br />
|align='center' style='background: #c0ffc0'|94<br>'''ź'''<br />
|align='center' style='background: #c0ffc0'|95<br>'''ŝ'''<br />
|align='center' style='background: #c0ffc0'|96<br>'''ĉ'''<br />
|align='center' style='background: #c0ffc0'|97<br>'''ẑ'''<br />
|align='center' style='background: #c0ffc0'|98<br>'''ô'''<br />
|align='center' style='background: #c0ffc0'|99<br>'''ŕ'''<br />
|align='center' style='background: #c0ffc0'|9A<br>'''ǔ'''<br />
|align='center' style='background: #c0ffc0'|9B<br>'''ă'''<br />
|align='center' style='background: #c0ffc0'|9C<br>'''ń'''<br />
|align='center' style='background: #80f080'|9D<br>'''ș'''<br />
|align='center' style='background: #80f080'|9E<br>'''ț'''<br />
|align='center' style='background: #d0e0d0'|9F<br>'''�'''<br />
<br />
|-<br />
!A…<br />
|align='center'|A0<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Non-breaking_space NBSP]'''<br />
|align='center' style='background: #d0d0f0'|A1<br>'''ň'''<br>(¡)'''<br />
|align='center' style='background: #d0d0f0'|A2<br>'''Ű'''<br>(¢)'''<br />
|align='center' style='background: #d0d0f0'|A3<br>'''ě'''<br>(£)'''<br />
|align='center' style='background: #d0d0f0'|A4<br>'''ű'''<br>(¤)'''<br />
|align='center' style='background: #d0d0f0'|A5<br>'''Ě'''<br>(¥)'''<br />
|align='center' style='background: #d0d0f0'|A6<br>'''Š'''<br>(¦)'''<br />
|align='center'|A7<br>'''§'''<br />
|align='center' style='background: #d0d0f0'|A8<br>'''š'''<br>(¨)'''<br />
|align='center' style='background: #d0d0f0'|A9<br>'''Ů'''<br>(©)'''<br />
|align='center' style='background: #d0d0f0'|AA<br>'''Ą'''<br>(ª)'''<br />
|align='center' style='background: #d0d0f0'|AB<br>'''Ę'''<br>(«)'''<br />
|align='center' style='background: #d0d0f0'|AC<br>'''Č'''<br>(¬)'''<br />
|align='center'|AD<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Soft_hyphen SHY]'''<br />
|align='center' style='background: #d0d0f0'|AE<br>'''č'''<br>(®)'''<br />
|align='center' style='background: #d0d0f0'|AF<br>'''ů'''<br>(¯)'''<br />
<br />
|-<br />
!B…<br />
|align='center' style='background: #d0d0f0'|B0<br>'''Ő'''<br>(°)'''<br />
|align='center' style='background: #d0d0f0'|B1<br>'''Ł'''<br>(±)'''<br />
|align='center' style='background: #d0d0f0'|B2<br>'''Ť'''<br>(²)'''<br />
|align='center' style='background: #d0d0f0'|B3<br>'''Ď'''<br>(³)'''<br />
|align='center' style='background: #d0d0f0'|B4<br>'''Ž'''<br>(´)'''<br />
|align='center' style='background: #d0d0f0'|B5<br>'''ł'''<br>(µ)'''<br />
|align='center' style='background: #d0d0f0'|B6<br>'''ť'''<br>(¶)'''<br />
|align='center' style='background: #d0d0f0'|B7<br>'''ď'''<br>(·)'''<br />
|align='center' style='background: #d0d0f0'|B8<br>'''ž'''<br>(¸)'''<br />
|align='center' style='background: #d0d0f0'|B9<br>'''ő'''<br>(¹)'''<br />
|align='center' style='background: #d0d0f0'|BA<br>'''ą'''<br>(º)'''<br />
|align='center' style='background: #d0d0f0'|BB<br>'''ę'''<br>(»)'''<br />
|align='center' style='background: #d0d0f0'|BC<br>'''Œ'''<br>(¼)'''<br />
|align='center' style='background: #d0d0f0'|BD<br>'''œ'''<br>(½)'''<br />
|align='center' style='background: #d0d0f0'|BE<br>'''Ÿ'''<br>(¾)'''<br />
|align='center'|BF<br>'''¿'''<br />
<br />
|-<br />
!C…<br />
|align='center'|C0<br>'''À'''<br />
|align='center'|C1<br>'''Á'''<br />
|align='center'|C2<br>'''Â'''<br />
|align='center'|C3<br>'''Ã'''<br />
|align='center'|C4<br>'''Ä'''<br />
|align='center'|C5<br>'''Å'''<br />
|align='center'|C6<br>'''Æ'''<br />
|align='center'|C7<br>'''Ç'''<br />
|align='center'|C8<br>'''È'''<br />
|align='center'|C9<br>'''É'''<br />
|align='center'|CA<br>'''Ê'''<br />
|align='center'|CB<br>'''Ë'''<br />
|align='center'|CC<br>'''Ì'''<br />
|align='center'|CD<br>'''Í'''<br />
|align='center'|CE<br>'''Î'''<br />
|align='center'|CF<br>'''Ï'''<br />
<br />
|-<br />
!D…<br />
|align='center'|D0<br>'''Ð'''<br />
|align='center'|D1<br>'''Ñ'''<br />
|align='center'|D2<br>'''Ò'''<br />
|align='center'|D3<br>'''Ó'''<br />
|align='center'|D4<br>'''Ô'''<br />
|align='center'|D5<br>'''Õ'''<br />
|align='center'|D6<br>'''Ö'''<br />
|align='center' style='background: #d0d0f0'|D7<br>'''Ř'''<br>(×)'''<br />
|align='center'|D8<br>'''Ø'''<br />
|align='center'|D9<br>'''Ù'''<br />
|align='center'|DA<br>'''Ú'''<br />
|align='center'|DB<br>'''Û'''<br />
|align='center'|DC<br>'''Ü'''<br />
|align='center'|DD<br>'''Ý'''<br />
|align='center'|DE<br>'''Þ'''<br />
|align='center'|DF<br>'''ß'''<br />
<br />
|-<br />
!E…<br />
|align='center'|E0<br>'''à'''<br />
|align='center'|E1<br>'''á'''<br />
|align='center'|E2<br>'''â'''<br />
|align='center'|E3<br>'''ã'''<br />
|align='center'|E4<br>'''ä'''<br />
|align='center'|E5<br>'''å'''<br />
|align='center'|E6<br>'''æ'''<br />
|align='center'|E7<br>'''ç'''<br />
|align='center'|E8<br>'''è'''<br />
|align='center'|E9<br>'''é'''<br />
|align='center'|EA<br>'''ê'''<br />
|align='center'|EB<br>'''ë'''<br />
|align='center'|EC<br>'''ì'''<br />
|align='center'|ED<br>'''í'''<br />
|align='center'|EE<br>'''î'''<br />
|align='center'|EF<br>'''ï'''<br />
<br />
|-<br />
!F…<br />
|align='center'|F0<br>'''ð'''<br />
|align='center'|F1<br>'''ñ'''<br />
|align='center'|F2<br>'''ò'''<br />
|align='center'|F3<br>'''ó'''<br />
|align='center'|F4<br>'''ô'''<br />
|align='center'|F5<br>'''õ'''<br />
|align='center'|F6<br>'''ö'''<br />
|align='center' style='background: #d0d0f0'|F7<br>'''ř'''<br>(÷)'''<br />
|align='center'|F8<br>'''ø'''<br />
|align='center'|F9<br>'''ù'''<br />
|align='center'|FA<br>'''ú'''<br />
|align='center'|FB<br>'''û'''<br />
|align='center'|FC<br>'''ü'''<br />
|align='center'|FD<br>'''ý'''<br />
|align='center'|FE<br>'''þ'''<br />
|align='center'|FF<br>'''ÿ'''<br />
<br />
|}<br />
<br />
== Russian ==<br />
<br />
The character '''0xFF''' (я) is mapped to '''0xB6''' upon loading. Therefore any Russian font must contain я at the place 0xB6.<br />
<br />
== Asian Languages (Korean, Chinese, Japanese) ==<br />
<br />
The original D3 had support for these languages, so it might be possible to add them to TDM, too. At the moment, however, we lack the fonts and translators. Also, writing from right-to-left (Hebrew) or top-down (Japanese) might be tricky or outright impossible in our GUI without more work in the C++ code.<br />
<br />
== Statistics ==<br />
<br />
Some of the special characters are used more often then others. Here is a statistic over the entire string set of the TDM core, showing the top 50 most-used characters (excluding a-z, 0-9 and russian characters):<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 85%" cellspacing=0 cellpadding=2<br />
<br />
|-<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
<br />
|-<br />
|1<br />
|í<br />
|715<br />
|<br />
|25<br />
|ć<br />
|67<br />
|<br />
<br />
|-<br />
|2<br />
|é<br />
|674<br />
|<br />
|26<br />
|è<br />
|65<br />
|<br />
<br />
|-<br />
|3<br />
|á<br />
|524<br />
|<br />
|27<br />
|ú<br />
|56<br />
|<br />
<br />
|-<br />
|4<br />
|ø<br />
|303<br />
|Danish<br />
|28<br />
|ê<br />
|52<br />
|<br />
<br />
|-<br />
|5<br />
|č<br />
|288<br />
|<br />
|29<br />
|ö<br />
|48<br />
|German<br />
<br />
|-<br />
|6<br />
|ó<br />
|283<br />
|<br />
|30<br />
|É<br />
|46<br />
|<br />
<br />
|-<br />
|7<br />
|ü<br />
|270<br />
|German<br />
|31<br />
|ñ<br />
|37<br />
|<br />
<br />
|-<br />
|8<br />
|ł<br />
|203<br />
|Polish<br />
|32<br />
|õ<br />
|32<br />
|<br />
<br />
|-<br />
|9<br />
|æ<br />
|200<br />
|Danish<br />
|33<br />
|ń<br />
|26<br />
|<br />
<br />
|-<br />
|10<br />
|ě<br />
|182<br />
|<br />
|34<br />
|Ł<br />
|24<br />
|<br />
<br />
|-<br />
|11<br />
|ř<br />
|175<br />
|Czech<br />
|35<br />
|Š<br />
|21<br />
|<br />
<br />
|-<br />
|12<br />
|ã<br />
|168<br />
|<br />
|36<br />
|â<br />
|21<br />
|<br />
<br />
|-<br />
|13<br />
|ž<br />
|148<br />
|Czech<br />
|37<br />
|ź<br />
|20<br />
|<br />
<br />
|-<br />
|14<br />
|ý<br />
|142<br />
|<br />
|38<br />
|ß<br />
|18<br />
|German<br />
<br />
|-<br />
|15<br />
|ę<br />
|141<br />
|<br />
|39<br />
|Ó<br />
|18<br />
|<br />
<br />
|-<br />
|16<br />
|ą<br />
|140<br />
|<br />
|40<br />
|ň<br />
|15<br />
|<br />
<br />
|-<br />
|17<br />
|ż<br />
|119<br />
|<br />
|41<br />
|Ú<br />
|15<br />
|<br />
<br />
|-<br />
|18<br />
|å<br />
|109<br />
|Danish<br />
|42<br />
|Á<br />
|13<br />
|<br />
<br />
|-<br />
|19<br />
|š<br />
|99<br />
|<br />
|43<br />
|î<br />
|12<br />
|<br />
<br />
|-<br />
|20<br />
|ś<br />
|97<br />
|<br />
|44<br />
|ť<br />
|11<br />
|<br />
<br />
|-<br />
|21<br />
|ç<br />
|91<br />
|<br />
|45<br />
|ô<br />
|9<br />
|<br />
<br />
|-<br />
|22<br />
|ä<br />
|86<br />
|German<br />
|46<br />
|Ž<br />
|8<br />
|<br />
<br />
|-<br />
|23<br />
|à<br />
|83<br />
|<br />
|47<br />
|Ż<br />
|7<br />
|<br />
<br />
|-<br />
|24<br />
|ů<br />
|77<br />
|<br />
|48<br />
|Č<br />
|7<br />
|<br />
<br />
|-<br />
|25<br />
|ć<br />
|67<br />
|<br />
|49<br />
|ù<br />
|6<br />
|<br />
<br />
|}<br />
<br />
Althought ö, ä and ü do not appear that often, with only these and Ü, Ö, Ä and ß, the entire German language works. So adding these letters to the fonts is quite important. Likewise, í is more important than say ô.<br />
<br />
[[Category:Fonts]]<br />
<br />
{{i18n}}* [[Font Patcher]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=SEED_-_Cloning&diff=18015
SEED - Cloning
2014-11-20T17:06:18Z
<p>Tels: fix template usage</p>
<hr />
<div>{{infobox|Note: This is a design document and not actually implemented or available yet!}}<br />
<br />
== Regular vs. Random layouts ==<br />
<br />
The current [[SEED]] system lets you only generate randomly placed entity. And although the "randomness" and the placement probability can be influenced, you still cannot control entirely where (or when) entities will be generated.<br />
<br />
However, for some applications it is important to generate regular layouts. For instance you want a row of trees, or a regular grid of grave stones, or an irregular grid of bushes, or even a 3D grid of entities. <br />
<br />
Likewise, sometimes you want a few randomly placed entities standing net to each other, and then repeat this (or a similar) group a few times.<br />
<br />
<!-- TODO: Insert screenshots of these scenarios --><br />
<br />
== SEED "clone" ==<br />
<br />
The spawnargs starting with '''clone''' (or '''seed_clone''' if set on a target entity) will achieve the desired effects. In the following we only describe the "seed_xxx" variants that are set on a target entity or target class. If you set the same spawnarg without the "seed_" prefix on the SEED entity itself, it will affect all target entities in the same manner, unless overridden by the target class' spawnargs:<br />
<br />
=== seed_clone_strategy ===<br />
<br />
String, one of the following:<br />
<br />
* '''none''' (the default) - entities of this class will not be cloned after placement<br />
* '''regular''' - a single row, a 2D array or a 3D array of entities, see '''[[#seed_clone_ofs|seed_clone_ofs]]<br />
* '''random''' - randomly offset clones<br />
<br />
=== seed_clone_count_min/seed_clone_count_max ===<br />
<br />
Integer, defaults 1. Gives the minimum and maximum number of clones. For each entity position, will be randomly chosen between these values. Note that if you set minimum and maximum to different values, then the final count is subject to adjustment depending on the GUI setting '''Object details''', where f.i. "Lowest" will bias the count to be lower, and "Highest" will bias the count to be higher.<br />
<br />
If '''seed_clone_strategy''' is "regular", you can also give two or three numbers:<br />
<br />
This will generate 5x3 entities:<br />
<br />
<pre><br />
"seed_clone_count_min" "5,3"<br />
"seed_clone_count_max" "5,3"<br />
</pre><br />
<br />
This will generate a cube of 2x3x4 entities:<br />
<br />
<pre><br />
"seed_clone_count_min" "2,3,4"<br />
"seed_clone_count_max" "2,3,4"<br />
</pre><br />
<br />
=== seed_clone_ofs_min/seed_clone_ofs_max ===<br />
<br />
Either:<br />
<br />
* One integer, defaults 16. Used when "seed_clone_strategy" is "random".<br />
* Three integers, defaults to "16,16,16". Used when "seed_clone_strategy" is "regular", then it will offset each entity by the amount given in each axis, depending on what '''seed_clone_count_min''' is.<br />
<br />
Full example:<br />
<br />
<pre><br />
"seed_clone_count_min" "2,3,4"<br />
"seed_clone_count_max" "2,3,4"<br />
"seed_clone_ofs_min" "4,4,4"<br />
"seed_clone_ofs_max" "8,8,8"<br />
</pre><br />
<br />
This will generate a cube of 2,3,4 entities, and each entity will be offset between 4 and 8 units from the next entity.<br />
<br />
{{editing}}<br />
{{Seed}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=SEED_-_Usage&diff=18007
SEED - Usage
2014-11-09T11:13:06Z
<p>Tels: add links</p>
<hr />
<div>== Introduction ==<br />
<br />
{{infobox|Note: '''It is recommended that you read the pages about [[LOD]] and [[SEED]] first!'''}}<br />
<br />
The SEED System (available in TDM from v1.04 on) enables you to overcome the built-in entity limit, as well as randomly generate entities. But since the system is new and it might still be unclear on how and when to use it, this page provides a few real-map scenarios with examples:<br />
<br />
== Usage cases ==<br />
<br />
=== Random Loot Generator ===<br />
<br />
Place a small SEED entity ('''atdm:SEED''') in your map, plus three loot entities. Target these from the SEED and set the following spawnargs (enter them in DR without the quotes!) on the SEED:<br />
<br />
<pre><br />
"max_entities" "1"<br />
"remove" "1"<br />
</pre><br />
<br />
This means all the loot entities will be of the same probability, but only one of them will ever be generated. Also, the "remove 1" means the SEED will remove itself after spawning the other entity.<br />
<br />
Note: Players expect that the loot in a map is stable, e.g. when they play it again, they get the same amount of loot from the same places. While you can break this expectation f.i. by randomly spawning a loot piece in different places, having different loot pieces in the ''''same'''' place might confuse people. To avoid this, make the loot amount on all the entities targeted by this SEED the same, but choose different entities (like a bottle of wine, a statue and a plate).<br />
<br />
=== Random Decorator ===<br />
<br />
Just like in the loot case, place your [[SEED]] entity, target the entities, and set their '''seed_score''' spawnargs to the wanted distribution, then either set '''density''' or '''max_entities''' on the SEED. Useful for:<br />
<br />
* putting in random crates, barrels and junk into basements<br />
* decorating a field with flowers<br />
* putting in glasses and bottles on a shelf<br />
<br />
etc.<br />
<br />
You'll find some pre-made entities for spawning random food, junk or other things under '''Darkmod/Randoms''' inside the DarkRadiant menu "Create entity" accessible with {{RMB}}.<br />
<br />
Note: When building such things by yourself, it it more efficient to use the following spawnargs on the SEED to avoid having to place entities first:<br />
<br />
<pre><br />
"remove" "1" // remove the SEED entity after spawning the entities<br />
"max_entities" "4"<br />
"template" "atdm:moveable_food_apple"<br />
"template_count" "3"<br />
"template_skin" "tdm_fruit_brownish"<br />
"template_1" "atdm:moveable_food_pear"<br />
"template_1_count" "2"<br />
</pre><br />
<br />
This would spawn at most 3 apples and at most 2 pears, but overall not more than 4 entities. Remember to make the SEED space big enough so that all to-be spawned entities will fit!<br />
<br />
See [[SEED - Templates via Spawnargs]] for more details.<br />
<br />
{{infobox|Do not confuse spawn_class with spawnclass, this will make the SEED stop working!}}<br />
<br />
=== Overcome the entity limit ===<br />
<br />
Suppose you have already placed manually a few hundred or even thousand entities in your map, and start to run into the entity limit. Or, if you have hundreds of entities under the [[LOD]] system, their thinking uses up time.<br />
<br />
In this scenario you can use the SEED system as an entity manager. Just tell it to not take it's targets as entity templates to create new entities, but instead as the class of already existing entities it should watch. All the entities inside the SEED area of the given class will then be added under control of the SEED, so they just keep their positions, rotation and skin, but they get potentially hidden and removed/respawned when nec. Best of both worlds.<br />
<br />
Just target one of your existing entities from your SEED by selecting first the SEED, then selecting the target, then pressing {{CTRL}}+{{key|K}}) and put the following spawnarg this entity:<br />
<br />
<pre><br />
"seed_watch_brethren" "1"<br />
</pre><br />
<br />
See [[SEED - Watching entities|this article]] for a longer explanation with images and reasons why to use this. <br />
<br />
=== Generate Huge Scenes ===<br />
<br />
{{red|Section not done yet}}<br />
<br />
=== Add Detail depending on the Level of Detail ===<br />
<br />
Examples:<br />
<br />
* http://forums.thedarkmod.com/topic/12107-announcement-seed-system/page__view__findpost__p__286786<br />
* http://forums.thedarkmod.com/topic/12107-announcement-seed-system/page__view__findpost__p__286825<br />
<br />
=== TODO ===<br />
<br />
* Screenshots <br />
* example maps<br />
* more clear instructions<br />
<br />
{{seed}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Installation&diff=17999
Installation
2014-10-28T19:10:49Z
<p>Tels: use wiki-style numberings</p>
<hr />
<div>'''Intended article audience:''' players, general users<br />
<br />
__TOC__<br />
<br />
== Quick install ==<br />
<br />
==== Downloading ====<br />
You can either:<br />
<br />
*Use our dedicated downloader.<br />
*Download a full archive of version 2.0 from MODDB - http://www.moddb.com/mods/the-dark-mod/downloads<br />
*Download a full archive of version 2.0 via a bittorrent [https://thepiratebay.sx/torrent/9024163 tracker]<br />
<br />
See below for system specific instructions.<br />
<br />
==== Install on Windows ====<br />
<br />
If you download version 2.0 archive, this puts you directly at step 4 below - <br />
<br />
# Create a folder anywhere you like named "darkmod". Saved games will not load properly if you call it anything else.<br />
# Download the [http://www.fidcal.com/darkuser/tdm_update_win.zip TDM Updater] <br />
# Extract the '''tdm_update.exe''' from the downloaded ZIP and copy it into your '''darkmod''' directory. <br />
# Run tdm_update.exe. The installer will connect to one of our download mirrors and start the download process.<br />
# Be patient and wait. The download weighs > 2.2 GB and will probably take a while.<br />
# After installation, you'll find an executable TheDarkMod.exe in your darkmod folder. Use this to start ''The Dark Mod''.<br />
<br />
== Prerequisites ==<br />
<br />
==== Operating Systems supported ====<br />
*Windows (2000/XP/Vista/Win7)<br />
*Linux<br />
<br />
==== General ====<br />
:At a minimum, you'll need a machine which is capable of running the Doom 3 game on comfortably high settings. The team recommends adding more RAM and a bit more CPU to the basic requirements, however, otherwise running the larger maps will be difficult.<br />
<br />
==== Hard Disk Space ====<br />
:A rough estimate of how much disk space required is '''3-4gb'''. As TDM is under continual development this is likely to increase slowly over time.<br />
<br />
:Breakdown of the estimate:<br />
::* For the base TDM package you need around 2.5 GB.<br />
::* Plus a variable amount of space you need for downloaded FM packages...<br />
::* ... and also a variable amount of space for screenshots, savegames, etc.<br />
<br />
:* Sizes of '''Fan Missions (known as FMs)''' vary, depending on how much custom content (models, textures, audio, etc) the FM authors chooses to include. If they're mostly using the stock TDM content, FMs are usually very small (1 to 10 MB). FM's with large amounts of custom content can be quite large (20 to 60 MB+). However, all content is pre-compressed. For more information, please see [[Fan Missions for The Dark Mod]].<br />
:*Savegames vary in size; they can be a few MB per save depending on the size of the FM.<br />
:*Screenshots sizes depend on the screen resolution you're using (~2 MB per shot).<br />
<br />
==== References ====<br />
:See the article [[Known System Configurations]] for a growing collection of system configurations and the corresponding user feedback.<br />
<br />
==== Troubleshooting the application ====<br />
The '''thedarkmod''' executable will generate a small logfile, <tt>tdmlauncher.log</tt>, each time it is invoked. The log file is located right next to the executable and might give some useful insight if the game fails to load.<br />
<br />
== First Startup ==<br />
* Please take your time to read through [[The Dark Mod Gameplay]] article to get familiar with the game.<br />
* TDM ships with a Training Mission which is designed to introduce you to the various gameplay elements TDM has to offer. It is recommended to play through this mission first, even if you've played other stealth games before.<br />
* Adjust the settings in the menus if needed (like screen resolution and gameplay settings).<br />
* See also the [[Performance Tweaks]] article to make TDM run a little bit faster if you're on a lower end machine.<br />
* If you encounter a problem, please check the [[FAQ]]. If you can't find an answer there, you can leave a post in the TDM Support forum.<br />
<br />
== Installing and Running Fan Missions ==<br />
<br />
Fan Missions can be downloaded from inside the TDM menu. Go to "New Mission" and click on "Get new missions".<br />
<br />
Alternatively, you can go to [http://www.thedarkmod.com/missions/ www.thedarkmod.com] to get hold of mission packages available for The Dark Mod. Each FM is contained in a PK4 file, which contains all the files necessary to run the mission. Sometimes missions also have an optional _l10n.pk4 file; these contain the content for all other languages than English.<br />
<br />
See the full article [[Installing and Running Fan Missions]] for a detailed explanation.<br />
<br />
== See also ==<br />
* [[tdm_update]] - If you have trouble running the installer/updater.<br />
* [[FAQ]] - Frequently Asked Questions and their answers.<br />
* [[Hosting The Dark Mod]]<br />
<br />
{{installation}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_List_of_TDM_translators&diff=17974
I18N - List of TDM translators
2014-10-12T16:39:33Z
<p>Tels: add Anderson as romanian translator</p>
<hr />
<div>This document can be used to find someone who can translate new strings or an FM into the wanted language. <br />
<br />
Note that translators are working for free and on their own, so they can refuse to translate anything at any time :)<br />
<br />
{|class="wikitable sortable" border=1 style="border-collapse: collapse; font-size: 90%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!style="background: #d0d0d0" width=20%|Language<br />
!style="background: #d0d0d0"|Translators<br />
<br />
|-<br />
|Czech<br />
|[http://forums.thedarkmod.com/user/3373-ppoe/ PPoe]<br />
<br />
|-<br />
|Danish<br />
|[http://forums.thedarkmod.com/user/1995-snobel/ snobel]<br />
<br />
|-<br />
|Dutch<br />
|<br />
<br />
|-<br />
|Finnish<br />
|<br />
<br />
|-<br />
|French<br />
|[http://forums.thedarkmod.com/user/2125-briareos-h/ Briareos H], [http://forums.thedarkmod.com/user/3287-hyeron/ Hyeron]<br />
<br />
|-<br />
|German<br />
|[http://forums.thedarkmod.com/user/3427-7upman/ 7upman], [http://forums.thedarkmod.com/user/144-tels/ Tels], [http://forums.thedarkmod.com/user/11230-obsttorte/ Obsttorte]<br />
<br />
|-<br />
|Hungarian<br />
|<br />
<br />
|-<br />
|Italian<br />
|[http://forums.thedarkmod.com/user/8412-echelon/ ECHELON], [http://forums.thedarkmod.com/user/8518-knymed/ Knymed]<br />
<br />
|-<br />
|Norsk<br />
|<br />
<br />
|-<br />
|Polish<br />
|[http://forums.thedarkmod.com/user/8481-maruda/ Maruda]<br />
<br />
|-<br />
|Portuguese<br />
|[http://forums.thedarkmod.com/user/8474-rpgista/ RPGista]<br />
<br />
|-<br />
|Romanian<br />
|[http://forums.thedarkmod.com/user/23762-anderson/ Anderson]<br />
<br />
|-<br />
|Russian<br />
|[http://forums.thedarkmod.com/user/8407-keeper-riff/ Keeper_riff], MoroseTroll<br />
<br />
|-<br />
|Spanish<br />
|<span style="border-bottom: 1px dotted black; cursor:help" title="conact per email only: rubereaglenest at gmail">Ruber Eaglenest</span><br />
<br />
|-<br />
|Swedish<br />
|<br />
<br />
|}<br />
<br />
{{i18n}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_Charset&diff=17954
I18N - Charset
2014-10-05T16:52:49Z
<p>Tels: darker green for new chars</p>
<hr />
<div>== Introduction ==<br />
<br />
The D3 code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, special charsets are used. The fonts (Carleton for the menu f.i.) are build/patched so that the right characters appear in the right place.<br />
<br />
== Encodings ==<br />
<br />
=== all.lang ===<br />
<br />
This file is in '''UTF-8''', and converted with the help of the script '''devel/gen_lang.pl''':<br />
<br />
perl devel/gen_lang.pl<br />
<br />
This ensures that the generated language files are in their proper encodings (see below).<br />
<br />
=== All other language files ===<br />
<br />
Note that the language files (f.i. '''strings/german.lang''') as well as the readables and the FM dictionariaries are expected to be in the following encodings:<br />
<br />
* '''Czech''', '''Hungarian''', '''Slovak''', '''Polish:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-2 ISO-8859-2] ('''not WIN-1250!)<br />
* '''Russian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/Win-1251 WIN-1251]<br />
* '''French:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-15 ISO-8859-15]<br />
* '''Romanian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-16 ISO-8859-16] <br />
* '''All other languages:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1 ISO-8859-1] (German, Dutch, Danish, Swedish, Portuguese, etc.)<br />
<br />
<br />
{{infobox|The core dictionaries are automatically generated in the right encoding, but make sure that you use the right encoding for the FM dictionary, too!}}<br />
<br />
== Character remapping ==<br />
<br />
The characters are remapped upon loading the dictionary/readable, from their native encoding to the special one that TDM uses and that is described here. Responsible for the remapping are [[I18N - Character mapping|mapping files]], f.i. "strings/czech.map". If a map file for a specific language is not found, "strings/default.map" is used instead, if this is not found, no remapping takes place.<br />
<br />
See '''[[I18N - Character mapping|Character mapping]]''' for more information.<br />
<br />
== European Languages ==<br />
<br />
This mapping is used for European languages, f.i. '''Czech''', '''French''', '''German''', '''Spanish''', '''Portuguese''', '''Polish'''. Note that the double accented characters in Hungarian '''Ő, ő, Ű and ű''' look a bit different from '''Ö, ö, Ü and ü'''!<br />
<br />
In the table below, the original ISO 8859-1 characters are given in ''()'' below the TDM character.<br />
<br />
'''Color code:'''<br />
<br />
{{box|#f0d0d0|Character not displayed by TDM or not defined|Unused/Unusable}}{{box|#c0ffc0|Character displayed in v1.08 or newer|Usable in v1.08}}{{box|#80f080|Character displayed in v2.03 or newer|Usable in v2.03}}{{box|#d0d0f0|Changed from the ISO-8859-1 default|Changed from ISO 8859-1}}<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 95%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!<br />
!…0<br />
!…1<br />
!…2<br />
!…3<br />
!…4<br />
!…5<br />
!…6<br />
!…7<br />
!…8<br />
!…9<br />
!…A<br />
!…B<br />
!…C<br />
!…D<br />
!…E<br />
!…F<br />
<br />
|-<br />
!0…<br />
|align='center' style='background: #f0d0d0'|00<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|01<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|02<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|03<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|04<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|05<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|06<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|07<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|08<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|09<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0F<br>'''–'''<br />
<br />
|-<br />
!1…<br />
|align='center' style='background: #f0d0d0'|10<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|11<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|12<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|13<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|14<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|15<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|16<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|17<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|18<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|19<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1F<br>'''–'''<br />
<br />
|-<br />
!2…<br />
|align='center'|20<br>'''&nbsp;'''<br />
|align='center'|21<br>'''!'''<br />
|align='center'|22<br>'''"'''<br />
|align='center'|23<br>'''#'''<br />
|align='center'|24<br>'''$'''<br />
|align='center'|25<br>'''%'''<br />
|align='center'|26<br>'''&'''<br />
|align='center'|27<br>'''''''<br />
|align='center'|28<br>'''('''<br />
|align='center'|29<br>''')'''<br />
|align='center'|2A<br>'''*'''<br />
|align='center'|2B<br>'''+'''<br />
|align='center'|2C<br>''','''<br />
|align='center'|2D<br>'''-'''<br />
|align='center'|2E<br>'''.'''<br />
|align='center'|2F<br>'''/'''<br />
<br />
|-<br />
!3…<br />
|align='center'|30<br>'''0'''<br />
|align='center'|31<br>'''1'''<br />
|align='center'|32<br>'''2'''<br />
|align='center'|33<br>'''3'''<br />
|align='center'|34<br>'''4'''<br />
|align='center'|35<br>'''5'''<br />
|align='center'|36<br>'''6'''<br />
|align='center'|37<br>'''7'''<br />
|align='center'|38<br>'''8'''<br />
|align='center'|39<br>'''9'''<br />
|align='center'|3A<br>''':'''<br />
|align='center'|3B<br>''';'''<br />
|align='center'|3C<br>'''<'''<br />
|align='center'|3D<br>'''='''<br />
|align='center'|3E<br>'''>'''<br />
|align='center'|3F<br>'''?'''<br />
<br />
|-<br />
!4…<br />
|align='center'|40<br>'''@'''<br />
|align='center'|41<br>'''A'''<br />
|align='center'|42<br>'''B'''<br />
|align='center'|43<br>'''C'''<br />
|align='center'|44<br>'''D'''<br />
|align='center'|45<br>'''E'''<br />
|align='center'|46<br>'''F'''<br />
|align='center'|47<br>'''G'''<br />
|align='center'|48<br>'''H'''<br />
|align='center'|49<br>'''I'''<br />
|align='center'|4A<br>'''J'''<br />
|align='center'|4B<br>'''K'''<br />
|align='center'|4C<br>'''L'''<br />
|align='center'|4D<br>'''M'''<br />
|align='center'|4E<br>'''N'''<br />
|align='center'|4F<br>'''O'''<br />
<br />
|-<br />
!5…<br />
|align='center'|50<br>'''P'''<br />
|align='center'|51<br>'''Q'''<br />
|align='center'|52<br>'''R'''<br />
|align='center'|53<br>'''S'''<br />
|align='center'|54<br>'''T'''<br />
|align='center'|55<br>'''U'''<br />
|align='center'|56<br>'''V'''<br />
|align='center'|57<br>'''W'''<br />
|align='center'|58<br>'''X'''<br />
|align='center'|59<br>'''Y'''<br />
|align='center'|5A<br>'''Z'''<br />
|align='center'|5B<br>'''['''<br />
|align='center'|5C<br>'''\'''<br />
|align='center'|5D<br>''']'''<br />
|align='center'|5E<br>'''^'''<br />
|align='center'|5F<br>'''_'''<br />
<br />
|-<br />
!6…<br />
|align='center'|60<br>'''`'''<br />
|align='center'|61<br>'''a'''<br />
|align='center'|62<br>'''b'''<br />
|align='center'|63<br>'''c'''<br />
|align='center'|64<br>'''d'''<br />
|align='center'|65<br>'''e'''<br />
|align='center'|66<br>'''f'''<br />
|align='center'|67<br>'''g'''<br />
|align='center'|68<br>'''h'''<br />
|align='center'|69<br>'''i'''<br />
|align='center'|6A<br>'''j'''<br />
|align='center'|6B<br>'''k'''<br />
|align='center'|6C<br>'''l'''<br />
|align='center'|6D<br>'''m'''<br />
|align='center'|6E<br>'''n'''<br />
|align='center'|6F<br>'''o'''<br />
<br />
|-<br />
!7…<br />
|align='center'|70<br>'''p'''<br />
|align='center'|71<br>'''q'''<br />
|align='center'|72<br>'''r'''<br />
|align='center'|73<br>'''s'''<br />
|align='center'|74<br>'''t'''<br />
|align='center'|75<br>'''u'''<br />
|align='center'|76<br>'''v'''<br />
|align='center'|77<br>'''w'''<br />
|align='center'|78<br>'''x'''<br />
|align='center'|79<br>'''y'''<br />
|align='center'|7A<br>'''z'''<br />
|align='center'|7B<br>'''{'''<br />
|align='center'|7C<br>'''|'''<br />
|align='center'|7D<br>'''}'''<br />
|align='center'|7E<br>'''~'''<br />
|align='center' style='background: #f0d0d0'|7F<br>'''–'''<br />
<br />
|-<br />
!8…<br />
|align='center' style='background: #c0ffc0'|80<br>'''Ň'''<br />
|align='center' style='background: #c0ffc0'|81<br>'''Ś'''<br />
|align='center' style='background: #c0ffc0'|82<br>'''Ć'''<br />
|align='center' style='background: #c0ffc0'|83<br>'''Ż'''<br />
|align='center' style='background: #c0ffc0'|84<br>'''Ź'''<br />
|align='center' style='background: #c0ffc0'|85<br>'''Ŝ'''<br />
|align='center' style='background: #c0ffc0'|86<br>'''Ĉ'''<br />
|align='center' style='background: #c0ffc0'|87<br>'''Ẑ'''<br />
|align='center' style='background: #c0ffc0'|88<br>'''Ô'''<br />
|align='center' style='background: #c0ffc0'|89<br>'''Ŕ'''<br />
|align='center' style='background: #c0ffc0'|8A<br>'''Ǔ'''<br />
|align='center' style='background: #c0ffc0'|8B<br>'''Ă'''<br />
|align='center' style='background: #c0ffc0'|8C<br>'''Ń'''<br />
|align='center' style='background: #80f080'|8D<br>'''Ș'''<br />
|align='center' style='background: #80f080'|8E<br>'''Ț'''<br />
|align='center' style='background: #f0d0d0'|8F<br>'''–'''<br />
<br />
|-<br />
!9…<br />
|align='center' style='background: #80f080'|90<br>'''đ'''<br />
|align='center' style='background: #c0ffc0'|91<br>'''ś'''<br />
|align='center' style='background: #c0ffc0'|92<br>'''ć'''<br />
|align='center' style='background: #c0ffc0'|93<br>'''ż'''<br />
|align='center' style='background: #c0ffc0'|94<br>'''ź'''<br />
|align='center' style='background: #c0ffc0'|95<br>'''ŝ'''<br />
|align='center' style='background: #c0ffc0'|96<br>'''ĉ'''<br />
|align='center' style='background: #c0ffc0'|97<br>'''ẑ'''<br />
|align='center' style='background: #c0ffc0'|98<br>'''ô'''<br />
|align='center' style='background: #c0ffc0'|99<br>'''ŕ'''<br />
|align='center' style='background: #c0ffc0'|9A<br>'''ǔ'''<br />
|align='center' style='background: #c0ffc0'|9B<br>'''ă'''<br />
|align='center' style='background: #c0ffc0'|9C<br>'''ń'''<br />
|align='center' style='background: #80f080'|9D<br>'''ș'''<br />
|align='center' style='background: #80f080'|9E<br>'''ț'''<br />
|align='center' style='background: #f0d0d0'|9F<br>'''–'''<br />
<br />
|-<br />
!A…<br />
|align='center'|A0<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Non-breaking_space NBSP]'''<br />
|align='center' style='background: #d0d0f0'|A1<br>'''ň'''<br>(¡)'''<br />
|align='center' style='background: #d0d0f0'|A2<br>'''Ű'''<br>(¢)'''<br />
|align='center' style='background: #d0d0f0'|A3<br>'''ě'''<br>(£)'''<br />
|align='center' style='background: #d0d0f0'|A4<br>'''ű'''<br>(¤)'''<br />
|align='center' style='background: #d0d0f0'|A5<br>'''Ě'''<br>(¥)'''<br />
|align='center' style='background: #d0d0f0'|A6<br>'''Š'''<br>(¦)'''<br />
|align='center'|A7<br>'''§'''<br />
|align='center' style='background: #d0d0f0'|A8<br>'''š'''<br>(¨)'''<br />
|align='center' style='background: #d0d0f0'|A9<br>'''Ů'''<br>(©)'''<br />
|align='center' style='background: #d0d0f0'|AA<br>'''Ą'''<br>(ª)'''<br />
|align='center' style='background: #d0d0f0'|AB<br>'''Ę'''<br>(«)'''<br />
|align='center' style='background: #d0d0f0'|AC<br>'''Č'''<br>(¬)'''<br />
|align='center'|AD<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Soft_hyphen SHY]'''<br />
|align='center' style='background: #d0d0f0'|AE<br>'''č'''<br>(®)'''<br />
|align='center' style='background: #d0d0f0'|AF<br>'''ů'''<br>(¯)'''<br />
<br />
|-<br />
!B…<br />
|align='center' style='background: #d0d0f0'|B0<br>'''Ő'''<br>(°)'''<br />
|align='center' style='background: #d0d0f0'|B1<br>'''Ł'''<br>(±)'''<br />
|align='center' style='background: #d0d0f0'|B2<br>'''Ť'''<br>(²)'''<br />
|align='center' style='background: #d0d0f0'|B3<br>'''Ď'''<br>(³)'''<br />
|align='center' style='background: #d0d0f0'|B4<br>'''Ž'''<br>(´)'''<br />
|align='center' style='background: #d0d0f0'|B5<br>'''ł'''<br>(µ)'''<br />
|align='center' style='background: #d0d0f0'|B6<br>'''ť'''<br>(¶)'''<br />
|align='center' style='background: #d0d0f0'|B7<br>'''ď'''<br>(·)'''<br />
|align='center' style='background: #d0d0f0'|B8<br>'''ž'''<br>(¸)'''<br />
|align='center' style='background: #d0d0f0'|B9<br>'''ő'''<br>(¹)'''<br />
|align='center' style='background: #d0d0f0'|BA<br>'''ą'''<br>(º)'''<br />
|align='center' style='background: #d0d0f0'|BB<br>'''ę'''<br>(»)'''<br />
|align='center' style='background: #d0d0f0'|BC<br>'''Œ'''<br>(¼)'''<br />
|align='center' style='background: #d0d0f0'|BD<br>'''œ'''<br>(½)'''<br />
|align='center' style='background: #d0d0f0'|BE<br>'''Ÿ'''<br>(¾)'''<br />
|align='center'|BF<br>'''¿'''<br />
<br />
|-<br />
!C…<br />
|align='center'|C0<br>'''À'''<br />
|align='center'|C1<br>'''Á'''<br />
|align='center'|C2<br>'''Â'''<br />
|align='center'|C3<br>'''Ã'''<br />
|align='center'|C4<br>'''Ä'''<br />
|align='center'|C5<br>'''Å'''<br />
|align='center'|C6<br>'''Æ'''<br />
|align='center'|C7<br>'''Ç'''<br />
|align='center'|C8<br>'''È'''<br />
|align='center'|C9<br>'''É'''<br />
|align='center'|CA<br>'''Ê'''<br />
|align='center'|CB<br>'''Ë'''<br />
|align='center'|CC<br>'''Ì'''<br />
|align='center'|CD<br>'''Í'''<br />
|align='center'|CE<br>'''Î'''<br />
|align='center'|CF<br>'''Ï'''<br />
<br />
|-<br />
!D…<br />
|align='center'|D0<br>'''Ð'''<br />
|align='center'|D1<br>'''Ñ'''<br />
|align='center'|D2<br>'''Ò'''<br />
|align='center'|D3<br>'''Ó'''<br />
|align='center'|D4<br>'''Ô'''<br />
|align='center'|D5<br>'''Õ'''<br />
|align='center'|D6<br>'''Ö'''<br />
|align='center' style='background: #d0d0f0'|D7<br>'''Ř'''<br>(×)'''<br />
|align='center'|D8<br>'''Ø'''<br />
|align='center'|D9<br>'''Ù'''<br />
|align='center'|DA<br>'''Ú'''<br />
|align='center'|DB<br>'''Û'''<br />
|align='center'|DC<br>'''Ü'''<br />
|align='center'|DD<br>'''Ý'''<br />
|align='center'|DE<br>'''Þ'''<br />
|align='center'|DF<br>'''ß'''<br />
<br />
|-<br />
!E…<br />
|align='center'|E0<br>'''à'''<br />
|align='center'|E1<br>'''á'''<br />
|align='center'|E2<br>'''â'''<br />
|align='center'|E3<br>'''ã'''<br />
|align='center'|E4<br>'''ä'''<br />
|align='center'|E5<br>'''å'''<br />
|align='center'|E6<br>'''æ'''<br />
|align='center'|E7<br>'''ç'''<br />
|align='center'|E8<br>'''è'''<br />
|align='center'|E9<br>'''é'''<br />
|align='center'|EA<br>'''ê'''<br />
|align='center'|EB<br>'''ë'''<br />
|align='center'|EC<br>'''ì'''<br />
|align='center'|ED<br>'''í'''<br />
|align='center'|EE<br>'''î'''<br />
|align='center'|EF<br>'''ï'''<br />
<br />
|-<br />
!F…<br />
|align='center'|F0<br>'''ð'''<br />
|align='center'|F1<br>'''ñ'''<br />
|align='center'|F2<br>'''ò'''<br />
|align='center'|F3<br>'''ó'''<br />
|align='center'|F4<br>'''ô'''<br />
|align='center'|F5<br>'''õ'''<br />
|align='center'|F6<br>'''ö'''<br />
|align='center' style='background: #d0d0f0'|F7<br>'''ř'''<br>(÷)'''<br />
|align='center'|F8<br>'''ø'''<br />
|align='center'|F9<br>'''ù'''<br />
|align='center'|FA<br>'''ú'''<br />
|align='center'|FB<br>'''û'''<br />
|align='center'|FC<br>'''ü'''<br />
|align='center'|FD<br>'''ý'''<br />
|align='center'|FE<br>'''þ'''<br />
|align='center'|FF<br>'''ÿ'''<br />
<br />
|}<br />
<br />
== Russian ==<br />
<br />
The character '''0xFF''' (я) is mapped to '''0xB6''' upon loading. Therefore any Russian font must contain я at the place 0xB6.<br />
<br />
== Asian Languages (Korean, Chinese, Japanese) ==<br />
<br />
The original D3 had support for these languages, so it might be possible to add them to TDM, too. At the moment, however, we lack the fonts and translators. Also, writing from right-to-left (Hebrew) or top-down (Japanese) might be tricky or outright impossible in our GUI without more work in the C++ code.<br />
<br />
== Statistics ==<br />
<br />
Some of the special characters are used more often then others. Here is a statistic over the entire string set of the TDM core, showing the top 50 most-used characters (excluding a-z, 0-9 and russian characters):<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 85%" cellspacing=0 cellpadding=2<br />
<br />
|-<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
<br />
|-<br />
|1<br />
|í<br />
|715<br />
|<br />
|25<br />
|ć<br />
|67<br />
|<br />
<br />
|-<br />
|2<br />
|é<br />
|674<br />
|<br />
|26<br />
|è<br />
|65<br />
|<br />
<br />
|-<br />
|3<br />
|á<br />
|524<br />
|<br />
|27<br />
|ú<br />
|56<br />
|<br />
<br />
|-<br />
|4<br />
|ø<br />
|303<br />
|Danish<br />
|28<br />
|ê<br />
|52<br />
|<br />
<br />
|-<br />
|5<br />
|č<br />
|288<br />
|<br />
|29<br />
|ö<br />
|48<br />
|German<br />
<br />
|-<br />
|6<br />
|ó<br />
|283<br />
|<br />
|30<br />
|É<br />
|46<br />
|<br />
<br />
|-<br />
|7<br />
|ü<br />
|270<br />
|German<br />
|31<br />
|ñ<br />
|37<br />
|<br />
<br />
|-<br />
|8<br />
|ł<br />
|203<br />
|Polish<br />
|32<br />
|õ<br />
|32<br />
|<br />
<br />
|-<br />
|9<br />
|æ<br />
|200<br />
|Danish<br />
|33<br />
|ń<br />
|26<br />
|<br />
<br />
|-<br />
|10<br />
|ě<br />
|182<br />
|<br />
|34<br />
|Ł<br />
|24<br />
|<br />
<br />
|-<br />
|11<br />
|ř<br />
|175<br />
|Czech<br />
|35<br />
|Š<br />
|21<br />
|<br />
<br />
|-<br />
|12<br />
|ã<br />
|168<br />
|<br />
|36<br />
|â<br />
|21<br />
|<br />
<br />
|-<br />
|13<br />
|ž<br />
|148<br />
|Czech<br />
|37<br />
|ź<br />
|20<br />
|<br />
<br />
|-<br />
|14<br />
|ý<br />
|142<br />
|<br />
|38<br />
|ß<br />
|18<br />
|German<br />
<br />
|-<br />
|15<br />
|ę<br />
|141<br />
|<br />
|39<br />
|Ó<br />
|18<br />
|<br />
<br />
|-<br />
|16<br />
|ą<br />
|140<br />
|<br />
|40<br />
|ň<br />
|15<br />
|<br />
<br />
|-<br />
|17<br />
|ż<br />
|119<br />
|<br />
|41<br />
|Ú<br />
|15<br />
|<br />
<br />
|-<br />
|18<br />
|å<br />
|109<br />
|Danish<br />
|42<br />
|Á<br />
|13<br />
|<br />
<br />
|-<br />
|19<br />
|š<br />
|99<br />
|<br />
|43<br />
|î<br />
|12<br />
|<br />
<br />
|-<br />
|20<br />
|ś<br />
|97<br />
|<br />
|44<br />
|ť<br />
|11<br />
|<br />
<br />
|-<br />
|21<br />
|ç<br />
|91<br />
|<br />
|45<br />
|ô<br />
|9<br />
|<br />
<br />
|-<br />
|22<br />
|ä<br />
|86<br />
|German<br />
|46<br />
|Ž<br />
|8<br />
|<br />
<br />
|-<br />
|23<br />
|à<br />
|83<br />
|<br />
|47<br />
|Ż<br />
|7<br />
|<br />
<br />
|-<br />
|24<br />
|ů<br />
|77<br />
|<br />
|48<br />
|Č<br />
|7<br />
|<br />
<br />
|-<br />
|25<br />
|ć<br />
|67<br />
|<br />
|49<br />
|ù<br />
|6<br />
|<br />
<br />
|}<br />
<br />
Althought ö, ä and ü do not appear that often, with only these and Ü, Ö, Ä and ß, the entire German language works. So adding these letters to the fonts is quite important. Likewise, í is more important than say ô.<br />
<br />
[[Category:Fonts]]<br />
<br />
{{i18n}}* [[Font Patcher]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_Charset&diff=17953
I18N - Charset
2014-10-05T16:26:12Z
<p>Tels: correct typo</p>
<hr />
<div>== Introduction ==<br />
<br />
The D3 code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, special charsets are used. The fonts (Carleton for the menu f.i.) are build/patched so that the right characters appear in the right place.<br />
<br />
== Encodings ==<br />
<br />
=== all.lang ===<br />
<br />
This file is in '''UTF-8''', and converted with the help of the script '''devel/gen_lang.pl''':<br />
<br />
perl devel/gen_lang.pl<br />
<br />
This ensures that the generated language files are in their proper encodings (see below).<br />
<br />
=== All other language files ===<br />
<br />
Note that the language files (f.i. '''strings/german.lang''') as well as the readables and the FM dictionariaries are expected to be in the following encodings:<br />
<br />
* '''Czech''', '''Hungarian''', '''Slovak''', '''Polish:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-2 ISO-8859-2] ('''not WIN-1250!)<br />
* '''Russian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/Win-1251 WIN-1251]<br />
* '''French:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-15 ISO-8859-15]<br />
* '''Romanian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-16 ISO-8859-16] <br />
* '''All other languages:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1 ISO-8859-1] (German, Dutch, Danish, Swedish, Portuguese, etc.)<br />
<br />
<br />
{{infobox|The core dictionaries are automatically generated in the right encoding, but make sure that you use the right encoding for the FM dictionary, too!}}<br />
<br />
== Character remapping ==<br />
<br />
The characters are remapped upon loading the dictionary/readable, from their native encoding to the special one that TDM uses and that is described here. Responsible for the remapping are [[I18N - Character mapping|mapping files]], f.i. "strings/czech.map". If a map file for a specific language is not found, "strings/default.map" is used instead, if this is not found, no remapping takes place.<br />
<br />
See '''[[I18N - Character mapping|Character mapping]]''' for more information.<br />
<br />
== European Languages ==<br />
<br />
This mapping is used for European languages, f.i. '''Czech''', '''French''', '''German''', '''Spanish''', '''Portuguese''', '''Polish'''. Note that the double accented characters in Hungarian '''Ő, ő, Ű and ű''' look a bit different from '''Ö, ö, Ü and ü'''!<br />
<br />
In the table below, the original ISO 8859-1 characters are given in ''()'' below the TDM character.<br />
<br />
'''Color code:'''<br />
<br />
{{box|#f0d0d0|Character not displayed by TDM or not defined|Unused/Unusable}}{{box|#c0ffc0|Character displayed in v1.08 or newer|Usable in v1.08}}{{box|#90f090|Character displayed in v2.03 or newer|Usable in v2.03}}{{box|#d0d0f0|Changed from the ISO-8859-1 default|Changed from ISO 8859-1}}<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 95%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!<br />
!…0<br />
!…1<br />
!…2<br />
!…3<br />
!…4<br />
!…5<br />
!…6<br />
!…7<br />
!…8<br />
!…9<br />
!…A<br />
!…B<br />
!…C<br />
!…D<br />
!…E<br />
!…F<br />
<br />
|-<br />
!0…<br />
|align='center' style='background: #f0d0d0'|00<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|01<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|02<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|03<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|04<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|05<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|06<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|07<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|08<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|09<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0F<br>'''–'''<br />
<br />
|-<br />
!1…<br />
|align='center' style='background: #f0d0d0'|10<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|11<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|12<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|13<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|14<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|15<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|16<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|17<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|18<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|19<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1F<br>'''–'''<br />
<br />
|-<br />
!2…<br />
|align='center'|20<br>'''&nbsp;'''<br />
|align='center'|21<br>'''!'''<br />
|align='center'|22<br>'''"'''<br />
|align='center'|23<br>'''#'''<br />
|align='center'|24<br>'''$'''<br />
|align='center'|25<br>'''%'''<br />
|align='center'|26<br>'''&'''<br />
|align='center'|27<br>'''''''<br />
|align='center'|28<br>'''('''<br />
|align='center'|29<br>''')'''<br />
|align='center'|2A<br>'''*'''<br />
|align='center'|2B<br>'''+'''<br />
|align='center'|2C<br>''','''<br />
|align='center'|2D<br>'''-'''<br />
|align='center'|2E<br>'''.'''<br />
|align='center'|2F<br>'''/'''<br />
<br />
|-<br />
!3…<br />
|align='center'|30<br>'''0'''<br />
|align='center'|31<br>'''1'''<br />
|align='center'|32<br>'''2'''<br />
|align='center'|33<br>'''3'''<br />
|align='center'|34<br>'''4'''<br />
|align='center'|35<br>'''5'''<br />
|align='center'|36<br>'''6'''<br />
|align='center'|37<br>'''7'''<br />
|align='center'|38<br>'''8'''<br />
|align='center'|39<br>'''9'''<br />
|align='center'|3A<br>''':'''<br />
|align='center'|3B<br>''';'''<br />
|align='center'|3C<br>'''<'''<br />
|align='center'|3D<br>'''='''<br />
|align='center'|3E<br>'''>'''<br />
|align='center'|3F<br>'''?'''<br />
<br />
|-<br />
!4…<br />
|align='center'|40<br>'''@'''<br />
|align='center'|41<br>'''A'''<br />
|align='center'|42<br>'''B'''<br />
|align='center'|43<br>'''C'''<br />
|align='center'|44<br>'''D'''<br />
|align='center'|45<br>'''E'''<br />
|align='center'|46<br>'''F'''<br />
|align='center'|47<br>'''G'''<br />
|align='center'|48<br>'''H'''<br />
|align='center'|49<br>'''I'''<br />
|align='center'|4A<br>'''J'''<br />
|align='center'|4B<br>'''K'''<br />
|align='center'|4C<br>'''L'''<br />
|align='center'|4D<br>'''M'''<br />
|align='center'|4E<br>'''N'''<br />
|align='center'|4F<br>'''O'''<br />
<br />
|-<br />
!5…<br />
|align='center'|50<br>'''P'''<br />
|align='center'|51<br>'''Q'''<br />
|align='center'|52<br>'''R'''<br />
|align='center'|53<br>'''S'''<br />
|align='center'|54<br>'''T'''<br />
|align='center'|55<br>'''U'''<br />
|align='center'|56<br>'''V'''<br />
|align='center'|57<br>'''W'''<br />
|align='center'|58<br>'''X'''<br />
|align='center'|59<br>'''Y'''<br />
|align='center'|5A<br>'''Z'''<br />
|align='center'|5B<br>'''['''<br />
|align='center'|5C<br>'''\'''<br />
|align='center'|5D<br>''']'''<br />
|align='center'|5E<br>'''^'''<br />
|align='center'|5F<br>'''_'''<br />
<br />
|-<br />
!6…<br />
|align='center'|60<br>'''`'''<br />
|align='center'|61<br>'''a'''<br />
|align='center'|62<br>'''b'''<br />
|align='center'|63<br>'''c'''<br />
|align='center'|64<br>'''d'''<br />
|align='center'|65<br>'''e'''<br />
|align='center'|66<br>'''f'''<br />
|align='center'|67<br>'''g'''<br />
|align='center'|68<br>'''h'''<br />
|align='center'|69<br>'''i'''<br />
|align='center'|6A<br>'''j'''<br />
|align='center'|6B<br>'''k'''<br />
|align='center'|6C<br>'''l'''<br />
|align='center'|6D<br>'''m'''<br />
|align='center'|6E<br>'''n'''<br />
|align='center'|6F<br>'''o'''<br />
<br />
|-<br />
!7…<br />
|align='center'|70<br>'''p'''<br />
|align='center'|71<br>'''q'''<br />
|align='center'|72<br>'''r'''<br />
|align='center'|73<br>'''s'''<br />
|align='center'|74<br>'''t'''<br />
|align='center'|75<br>'''u'''<br />
|align='center'|76<br>'''v'''<br />
|align='center'|77<br>'''w'''<br />
|align='center'|78<br>'''x'''<br />
|align='center'|79<br>'''y'''<br />
|align='center'|7A<br>'''z'''<br />
|align='center'|7B<br>'''{'''<br />
|align='center'|7C<br>'''|'''<br />
|align='center'|7D<br>'''}'''<br />
|align='center'|7E<br>'''~'''<br />
|align='center' style='background: #f0d0d0'|7F<br>'''–'''<br />
<br />
|-<br />
!8…<br />
|align='center' style='background: #c0ffc0'|80<br>'''Ň'''<br />
|align='center' style='background: #c0ffc0'|81<br>'''Ś'''<br />
|align='center' style='background: #c0ffc0'|82<br>'''Ć'''<br />
|align='center' style='background: #c0ffc0'|83<br>'''Ż'''<br />
|align='center' style='background: #c0ffc0'|84<br>'''Ź'''<br />
|align='center' style='background: #c0ffc0'|85<br>'''Ŝ'''<br />
|align='center' style='background: #c0ffc0'|86<br>'''Ĉ'''<br />
|align='center' style='background: #c0ffc0'|87<br>'''Ẑ'''<br />
|align='center' style='background: #c0ffc0'|88<br>'''Ô'''<br />
|align='center' style='background: #c0ffc0'|89<br>'''Ŕ'''<br />
|align='center' style='background: #c0ffc0'|8A<br>'''Ǔ'''<br />
|align='center' style='background: #c0ffc0'|8B<br>'''Ă'''<br />
|align='center' style='background: #c0ffc0'|8C<br>'''Ń'''<br />
|align='center' style='background: #90f090'|8D<br>'''Ș'''<br />
|align='center' style='background: #90f090'|8E<br>'''Ț'''<br />
|align='center' style='background: #f0d0d0'|8F<br>'''–'''<br />
<br />
|-<br />
!9…<br />
|align='center' style='background: #90f090'|90<br>'''đ'''<br />
|align='center' style='background: #c0ffc0'|91<br>'''ś'''<br />
|align='center' style='background: #c0ffc0'|92<br>'''ć'''<br />
|align='center' style='background: #c0ffc0'|93<br>'''ż'''<br />
|align='center' style='background: #c0ffc0'|94<br>'''ź'''<br />
|align='center' style='background: #c0ffc0'|95<br>'''ŝ'''<br />
|align='center' style='background: #c0ffc0'|96<br>'''ĉ'''<br />
|align='center' style='background: #c0ffc0'|97<br>'''ẑ'''<br />
|align='center' style='background: #c0ffc0'|98<br>'''ô'''<br />
|align='center' style='background: #c0ffc0'|99<br>'''ŕ'''<br />
|align='center' style='background: #c0ffc0'|9A<br>'''ǔ'''<br />
|align='center' style='background: #c0ffc0'|9B<br>'''ă'''<br />
|align='center' style='background: #c0ffc0'|9C<br>'''ń'''<br />
|align='center' style='background: #90f090'|9D<br>'''ș'''<br />
|align='center' style='background: #90f090'|9E<br>'''ț'''<br />
|align='center' style='background: #f0d0d0'|9F<br>'''–'''<br />
<br />
|-<br />
!A…<br />
|align='center'|A0<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Non-breaking_space NBSP]'''<br />
|align='center' style='background: #d0d0f0'|A1<br>'''ň'''<br>(¡)'''<br />
|align='center' style='background: #d0d0f0'|A2<br>'''Ű'''<br>(¢)'''<br />
|align='center' style='background: #d0d0f0'|A3<br>'''ě'''<br>(£)'''<br />
|align='center' style='background: #d0d0f0'|A4<br>'''ű'''<br>(¤)'''<br />
|align='center' style='background: #d0d0f0'|A5<br>'''Ě'''<br>(¥)'''<br />
|align='center' style='background: #d0d0f0'|A6<br>'''Š'''<br>(¦)'''<br />
|align='center'|A7<br>'''§'''<br />
|align='center' style='background: #d0d0f0'|A8<br>'''š'''<br>(¨)'''<br />
|align='center' style='background: #d0d0f0'|A9<br>'''Ů'''<br>(©)'''<br />
|align='center' style='background: #d0d0f0'|AA<br>'''Ą'''<br>(ª)'''<br />
|align='center' style='background: #d0d0f0'|AB<br>'''Ę'''<br>(«)'''<br />
|align='center' style='background: #d0d0f0'|AC<br>'''Č'''<br>(¬)'''<br />
|align='center'|AD<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Soft_hyphen SHY]'''<br />
|align='center' style='background: #d0d0f0'|AE<br>'''č'''<br>(®)'''<br />
|align='center' style='background: #d0d0f0'|AF<br>'''ů'''<br>(¯)'''<br />
<br />
|-<br />
!B…<br />
|align='center' style='background: #d0d0f0'|B0<br>'''Ő'''<br>(°)'''<br />
|align='center' style='background: #d0d0f0'|B1<br>'''Ł'''<br>(±)'''<br />
|align='center' style='background: #d0d0f0'|B2<br>'''Ť'''<br>(²)'''<br />
|align='center' style='background: #d0d0f0'|B3<br>'''Ď'''<br>(³)'''<br />
|align='center' style='background: #d0d0f0'|B4<br>'''Ž'''<br>(´)'''<br />
|align='center' style='background: #d0d0f0'|B5<br>'''ł'''<br>(µ)'''<br />
|align='center' style='background: #d0d0f0'|B6<br>'''ť'''<br>(¶)'''<br />
|align='center' style='background: #d0d0f0'|B7<br>'''ď'''<br>(·)'''<br />
|align='center' style='background: #d0d0f0'|B8<br>'''ž'''<br>(¸)'''<br />
|align='center' style='background: #d0d0f0'|B9<br>'''ő'''<br>(¹)'''<br />
|align='center' style='background: #d0d0f0'|BA<br>'''ą'''<br>(º)'''<br />
|align='center' style='background: #d0d0f0'|BB<br>'''ę'''<br>(»)'''<br />
|align='center' style='background: #d0d0f0'|BC<br>'''Œ'''<br>(¼)'''<br />
|align='center' style='background: #d0d0f0'|BD<br>'''œ'''<br>(½)'''<br />
|align='center' style='background: #d0d0f0'|BE<br>'''Ÿ'''<br>(¾)'''<br />
|align='center'|BF<br>'''¿'''<br />
<br />
|-<br />
!C…<br />
|align='center'|C0<br>'''À'''<br />
|align='center'|C1<br>'''Á'''<br />
|align='center'|C2<br>'''Â'''<br />
|align='center'|C3<br>'''Ã'''<br />
|align='center'|C4<br>'''Ä'''<br />
|align='center'|C5<br>'''Å'''<br />
|align='center'|C6<br>'''Æ'''<br />
|align='center'|C7<br>'''Ç'''<br />
|align='center'|C8<br>'''È'''<br />
|align='center'|C9<br>'''É'''<br />
|align='center'|CA<br>'''Ê'''<br />
|align='center'|CB<br>'''Ë'''<br />
|align='center'|CC<br>'''Ì'''<br />
|align='center'|CD<br>'''Í'''<br />
|align='center'|CE<br>'''Î'''<br />
|align='center'|CF<br>'''Ï'''<br />
<br />
|-<br />
!D…<br />
|align='center'|D0<br>'''Ð'''<br />
|align='center'|D1<br>'''Ñ'''<br />
|align='center'|D2<br>'''Ò'''<br />
|align='center'|D3<br>'''Ó'''<br />
|align='center'|D4<br>'''Ô'''<br />
|align='center'|D5<br>'''Õ'''<br />
|align='center'|D6<br>'''Ö'''<br />
|align='center' style='background: #d0d0f0'|D7<br>'''Ř'''<br>(×)'''<br />
|align='center'|D8<br>'''Ø'''<br />
|align='center'|D9<br>'''Ù'''<br />
|align='center'|DA<br>'''Ú'''<br />
|align='center'|DB<br>'''Û'''<br />
|align='center'|DC<br>'''Ü'''<br />
|align='center'|DD<br>'''Ý'''<br />
|align='center'|DE<br>'''Þ'''<br />
|align='center'|DF<br>'''ß'''<br />
<br />
|-<br />
!E…<br />
|align='center'|E0<br>'''à'''<br />
|align='center'|E1<br>'''á'''<br />
|align='center'|E2<br>'''â'''<br />
|align='center'|E3<br>'''ã'''<br />
|align='center'|E4<br>'''ä'''<br />
|align='center'|E5<br>'''å'''<br />
|align='center'|E6<br>'''æ'''<br />
|align='center'|E7<br>'''ç'''<br />
|align='center'|E8<br>'''è'''<br />
|align='center'|E9<br>'''é'''<br />
|align='center'|EA<br>'''ê'''<br />
|align='center'|EB<br>'''ë'''<br />
|align='center'|EC<br>'''ì'''<br />
|align='center'|ED<br>'''í'''<br />
|align='center'|EE<br>'''î'''<br />
|align='center'|EF<br>'''ï'''<br />
<br />
|-<br />
!F…<br />
|align='center'|F0<br>'''ð'''<br />
|align='center'|F1<br>'''ñ'''<br />
|align='center'|F2<br>'''ò'''<br />
|align='center'|F3<br>'''ó'''<br />
|align='center'|F4<br>'''ô'''<br />
|align='center'|F5<br>'''õ'''<br />
|align='center'|F6<br>'''ö'''<br />
|align='center' style='background: #d0d0f0'|F7<br>'''ř'''<br>(÷)'''<br />
|align='center'|F8<br>'''ø'''<br />
|align='center'|F9<br>'''ù'''<br />
|align='center'|FA<br>'''ú'''<br />
|align='center'|FB<br>'''û'''<br />
|align='center'|FC<br>'''ü'''<br />
|align='center'|FD<br>'''ý'''<br />
|align='center'|FE<br>'''þ'''<br />
|align='center'|FF<br>'''ÿ'''<br />
<br />
|}<br />
<br />
== Russian ==<br />
<br />
The character '''0xFF''' (я) is mapped to '''0xB6''' upon loading. Therefore any Russian font must contain я at the place 0xB6.<br />
<br />
== Asian Languages (Korean, Chinese, Japanese) ==<br />
<br />
The original D3 had support for these languages, so it might be possible to add them to TDM, too. At the moment, however, we lack the fonts and translators. Also, writing from right-to-left (Hebrew) or top-down (Japanese) might be tricky or outright impossible in our GUI without more work in the C++ code.<br />
<br />
== Statistics ==<br />
<br />
Some of the special characters are used more often then others. Here is a statistic over the entire string set of the TDM core, showing the top 50 most-used characters (excluding a-z, 0-9 and russian characters):<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 85%" cellspacing=0 cellpadding=2<br />
<br />
|-<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
<br />
|-<br />
|1<br />
|í<br />
|715<br />
|<br />
|25<br />
|ć<br />
|67<br />
|<br />
<br />
|-<br />
|2<br />
|é<br />
|674<br />
|<br />
|26<br />
|è<br />
|65<br />
|<br />
<br />
|-<br />
|3<br />
|á<br />
|524<br />
|<br />
|27<br />
|ú<br />
|56<br />
|<br />
<br />
|-<br />
|4<br />
|ø<br />
|303<br />
|Danish<br />
|28<br />
|ê<br />
|52<br />
|<br />
<br />
|-<br />
|5<br />
|č<br />
|288<br />
|<br />
|29<br />
|ö<br />
|48<br />
|German<br />
<br />
|-<br />
|6<br />
|ó<br />
|283<br />
|<br />
|30<br />
|É<br />
|46<br />
|<br />
<br />
|-<br />
|7<br />
|ü<br />
|270<br />
|German<br />
|31<br />
|ñ<br />
|37<br />
|<br />
<br />
|-<br />
|8<br />
|ł<br />
|203<br />
|Polish<br />
|32<br />
|õ<br />
|32<br />
|<br />
<br />
|-<br />
|9<br />
|æ<br />
|200<br />
|Danish<br />
|33<br />
|ń<br />
|26<br />
|<br />
<br />
|-<br />
|10<br />
|ě<br />
|182<br />
|<br />
|34<br />
|Ł<br />
|24<br />
|<br />
<br />
|-<br />
|11<br />
|ř<br />
|175<br />
|Czech<br />
|35<br />
|Š<br />
|21<br />
|<br />
<br />
|-<br />
|12<br />
|ã<br />
|168<br />
|<br />
|36<br />
|â<br />
|21<br />
|<br />
<br />
|-<br />
|13<br />
|ž<br />
|148<br />
|Czech<br />
|37<br />
|ź<br />
|20<br />
|<br />
<br />
|-<br />
|14<br />
|ý<br />
|142<br />
|<br />
|38<br />
|ß<br />
|18<br />
|German<br />
<br />
|-<br />
|15<br />
|ę<br />
|141<br />
|<br />
|39<br />
|Ó<br />
|18<br />
|<br />
<br />
|-<br />
|16<br />
|ą<br />
|140<br />
|<br />
|40<br />
|ň<br />
|15<br />
|<br />
<br />
|-<br />
|17<br />
|ż<br />
|119<br />
|<br />
|41<br />
|Ú<br />
|15<br />
|<br />
<br />
|-<br />
|18<br />
|å<br />
|109<br />
|Danish<br />
|42<br />
|Á<br />
|13<br />
|<br />
<br />
|-<br />
|19<br />
|š<br />
|99<br />
|<br />
|43<br />
|î<br />
|12<br />
|<br />
<br />
|-<br />
|20<br />
|ś<br />
|97<br />
|<br />
|44<br />
|ť<br />
|11<br />
|<br />
<br />
|-<br />
|21<br />
|ç<br />
|91<br />
|<br />
|45<br />
|ô<br />
|9<br />
|<br />
<br />
|-<br />
|22<br />
|ä<br />
|86<br />
|German<br />
|46<br />
|Ž<br />
|8<br />
|<br />
<br />
|-<br />
|23<br />
|à<br />
|83<br />
|<br />
|47<br />
|Ż<br />
|7<br />
|<br />
<br />
|-<br />
|24<br />
|ů<br />
|77<br />
|<br />
|48<br />
|Č<br />
|7<br />
|<br />
<br />
|-<br />
|25<br />
|ć<br />
|67<br />
|<br />
|49<br />
|ù<br />
|6<br />
|<br />
<br />
|}<br />
<br />
Althought ö, ä and ü do not appear that often, with only these and Ü, Ö, Ä and ß, the entire German language works. So adding these letters is quite important.<br />
<br />
[[Category:Fonts]]<br />
<br />
{{i18n}}* [[Font Patcher]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_Charset&diff=17952
I18N - Charset
2014-10-05T16:22:24Z
<p>Tels: add definition for đ (lower case crossed Đ)</p>
<hr />
<div>== Introduction ==<br />
<br />
The D3 code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, special charsets are used. The fonts (Carleton for the menu f.i.) are build/patched so that the right characters appear in the right place.<br />
<br />
== Encodings ==<br />
<br />
=== all.lang ===<br />
<br />
This file is in '''UTF-8''', and converted with the help of the script '''devel/gen_lang.pl''':<br />
<br />
perl devel/gen_lang.pl<br />
<br />
This ensures that the generated language files are in their proper encodings (see below).<br />
<br />
=== All other language files ===<br />
<br />
Note that the language files (f.i. '''strings/german.lang''') as well as the readables and the FM dictionariaries are expected to be in the following encodings:<br />
<br />
* '''Czech''', '''Hungarian''', '''Slovak''', '''Polish:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-2 ISO-8859-2] ('''not WIN-1250!)<br />
* '''Russian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/Win-1251 WIN-1251]<br />
* '''French:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-15 ISO-8859-15]<br />
* '''Romanian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-16 ISO-8859-16] <br />
* '''All other languages:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1 ISO-8859-1] (German, Dutch, Danish, Swedish, Portuguese, etc.)<br />
<br />
<br />
{{infobox|The core dictionaries are automatically generated in the right encoding, but make sure that you use the right encoding for the FM dictionary, too!}}<br />
<br />
== Character remapping ==<br />
<br />
The characters are remapped upon loading the dictionary/readable, from their native encoding to the special one that TDM uses and that is described here. Responsible for the remapping are [[I18N - Character mapping|mapping files]], f.i. "strings/czech.map". If a map file for a specific language is not found, "strings/default.map" is used instead, if this is not found, no remapping takes place.<br />
<br />
See '''[[I18N - Character mapping|Character mapping]]''' for more information.<br />
<br />
== European Languages ==<br />
<br />
This mapping is used for European languages, f.i. '''Czech''', '''French''', '''German''', '''Spanish''', '''Portuguese''', '''Polish'''. Note that the double accented characters in Hungarian '''Ő, ő, Ű and ű''' look a bit different from '''Ö, ö, Ü and ü'''!<br />
<br />
In the table below, the original ISO 8859-1 characters are given in ''()'' below the TDM character.<br />
<br />
'''Color code:'''<br />
<br />
{{box|#f0d0d0|Character not displayed by TDM or not defined|Unused/Unusable}}{{box|#c0ffc0|Character displayed in v1.08 or newer|Usable in v1.08}}{{box|#90f090|Character displayed in v2.03 or newer|Usable in v2.03}}{{box|#d0d0f0|Changed from the ISO-8859-1 default|Changed from ISO 8859-1}}<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 95%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!<br />
!…0<br />
!…1<br />
!…2<br />
!…3<br />
!…4<br />
!…5<br />
!…6<br />
!…7<br />
!…8<br />
!…9<br />
!…A<br />
!…B<br />
!…C<br />
!…D<br />
!…E<br />
!…F<br />
<br />
|-<br />
!0…<br />
|align='center' style='background: #f0d0d0'|00<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|01<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|02<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|03<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|04<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|05<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|06<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|07<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|08<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|09<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0F<br>'''–'''<br />
<br />
|-<br />
!1…<br />
|align='center' style='background: #f0d0d0'|10<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|11<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|12<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|13<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|14<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|15<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|16<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|17<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|18<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|19<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1F<br>'''–'''<br />
<br />
|-<br />
!2…<br />
|align='center'|20<br>'''&nbsp;'''<br />
|align='center'|21<br>'''!'''<br />
|align='center'|22<br>'''"'''<br />
|align='center'|23<br>'''#'''<br />
|align='center'|24<br>'''$'''<br />
|align='center'|25<br>'''%'''<br />
|align='center'|26<br>'''&'''<br />
|align='center'|27<br>'''''''<br />
|align='center'|28<br>'''('''<br />
|align='center'|29<br>''')'''<br />
|align='center'|2A<br>'''*'''<br />
|align='center'|2B<br>'''+'''<br />
|align='center'|2C<br>''','''<br />
|align='center'|2D<br>'''-'''<br />
|align='center'|2E<br>'''.'''<br />
|align='center'|2F<br>'''/'''<br />
<br />
|-<br />
!3…<br />
|align='center'|30<br>'''0'''<br />
|align='center'|31<br>'''1'''<br />
|align='center'|32<br>'''2'''<br />
|align='center'|33<br>'''3'''<br />
|align='center'|34<br>'''4'''<br />
|align='center'|35<br>'''5'''<br />
|align='center'|36<br>'''6'''<br />
|align='center'|37<br>'''7'''<br />
|align='center'|38<br>'''8'''<br />
|align='center'|39<br>'''9'''<br />
|align='center'|3A<br>''':'''<br />
|align='center'|3B<br>''';'''<br />
|align='center'|3C<br>'''<'''<br />
|align='center'|3D<br>'''='''<br />
|align='center'|3E<br>'''>'''<br />
|align='center'|3F<br>'''?'''<br />
<br />
|-<br />
!4…<br />
|align='center'|40<br>'''@'''<br />
|align='center'|41<br>'''A'''<br />
|align='center'|42<br>'''B'''<br />
|align='center'|43<br>'''C'''<br />
|align='center'|44<br>'''D'''<br />
|align='center'|45<br>'''E'''<br />
|align='center'|46<br>'''F'''<br />
|align='center'|47<br>'''G'''<br />
|align='center'|48<br>'''H'''<br />
|align='center'|49<br>'''I'''<br />
|align='center'|4A<br>'''J'''<br />
|align='center'|4B<br>'''K'''<br />
|align='center'|4C<br>'''L'''<br />
|align='center'|4D<br>'''M'''<br />
|align='center'|4E<br>'''N'''<br />
|align='center'|4F<br>'''O'''<br />
<br />
|-<br />
!5…<br />
|align='center'|50<br>'''P'''<br />
|align='center'|51<br>'''Q'''<br />
|align='center'|52<br>'''R'''<br />
|align='center'|53<br>'''S'''<br />
|align='center'|54<br>'''T'''<br />
|align='center'|55<br>'''U'''<br />
|align='center'|56<br>'''V'''<br />
|align='center'|57<br>'''W'''<br />
|align='center'|58<br>'''X'''<br />
|align='center'|59<br>'''Y'''<br />
|align='center'|5A<br>'''Z'''<br />
|align='center'|5B<br>'''['''<br />
|align='center'|5C<br>'''\'''<br />
|align='center'|5D<br>''']'''<br />
|align='center'|5E<br>'''^'''<br />
|align='center'|5F<br>'''_'''<br />
<br />
|-<br />
!6…<br />
|align='center'|60<br>'''`'''<br />
|align='center'|61<br>'''a'''<br />
|align='center'|62<br>'''b'''<br />
|align='center'|63<br>'''c'''<br />
|align='center'|64<br>'''d'''<br />
|align='center'|65<br>'''e'''<br />
|align='center'|66<br>'''f'''<br />
|align='center'|67<br>'''g'''<br />
|align='center'|68<br>'''h'''<br />
|align='center'|69<br>'''i'''<br />
|align='center'|6A<br>'''j'''<br />
|align='center'|6B<br>'''k'''<br />
|align='center'|6C<br>'''l'''<br />
|align='center'|6D<br>'''m'''<br />
|align='center'|6E<br>'''n'''<br />
|align='center'|6F<br>'''o'''<br />
<br />
|-<br />
!7…<br />
|align='center'|70<br>'''p'''<br />
|align='center'|71<br>'''q'''<br />
|align='center'|72<br>'''r'''<br />
|align='center'|73<br>'''s'''<br />
|align='center'|74<br>'''t'''<br />
|align='center'|75<br>'''u'''<br />
|align='center'|76<br>'''v'''<br />
|align='center'|77<br>'''w'''<br />
|align='center'|78<br>'''x'''<br />
|align='center'|79<br>'''y'''<br />
|align='center'|7A<br>'''z'''<br />
|align='center'|7B<br>'''{'''<br />
|align='center'|7C<br>'''|'''<br />
|align='center'|7D<br>'''}'''<br />
|align='center'|7E<br>'''~'''<br />
|align='center' style='background: #f0d0d0'|7F<br>'''–'''<br />
<br />
|-<br />
!8…<br />
|align='center' style='background: #c0ffc0'|80<br>'''Ň'''<br />
|align='center' style='background: #c0ffc0'|81<br>'''Ś'''<br />
|align='center' style='background: #c0ffc0'|82<br>'''Ć'''<br />
|align='center' style='background: #c0ffc0'|83<br>'''Ż'''<br />
|align='center' style='background: #c0ffc0'|84<br>'''Ź'''<br />
|align='center' style='background: #c0ffc0'|85<br>'''Ŝ'''<br />
|align='center' style='background: #c0ffc0'|86<br>'''Ĉ'''<br />
|align='center' style='background: #c0ffc0'|87<br>'''Ẑ'''<br />
|align='center' style='background: #c0ffc0'|88<br>'''Ô'''<br />
|align='center' style='background: #c0ffc0'|89<br>'''Ŕ'''<br />
|align='center' style='background: #c0ffc0'|8A<br>'''Ǔ'''<br />
|align='center' style='background: #c0ffc0'|8B<br>'''Ă'''<br />
|align='center' style='background: #c0ffc0'|8C<br>'''Ń'''<br />
|align='center' style='background: #90f090'|8D<br>'''Ș'''<br />
|align='center' style='background: #90f090'|8E<br>'''Ț'''<br />
|align='center' style='background: #f0d0d0'|8F<br>'''–'''<br />
<br />
|-<br />
!9…<br />
|align='center' style='background: #90f090'|90<br>'''đ'''<br />
|align='center' style='background: #c0ffc0'|91<br>'''ś'''<br />
|align='center' style='background: #c0ffc0'|92<br>'''ć'''<br />
|align='center' style='background: #c0ffc0'|93<br>'''ż'''<br />
|align='center' style='background: #c0ffc0'|94<br>'''ź'''<br />
|align='center' style='background: #c0ffc0'|95<br>'''ŝ'''<br />
|align='center' style='background: #c0ffc0'|96<br>'''ĉ'''<br />
|align='center' style='background: #c0ffc0'|97<br>'''ẑ'''<br />
|align='center' style='background: #c0ffc0'|98<br>'''ô'''<br />
|align='center' style='background: #c0ffc0'|99<br>'''ŕ'''<br />
|align='center' style='background: #c0ffc0'|9A<br>'''ǔ'''<br />
|align='center' style='background: #c0ffc0'|9B<br>'''ă'''<br />
|align='center' style='background: #c0ffc0'|9C<br>'''ń'''<br />
|align='center' style='background: #90f090'|8D<br>'''ș'''<br />
|align='center' style='background: #90f090'|9E<br>'''ț'''<br />
|align='center' style='background: #f0d0d0'|9F<br>'''–'''<br />
<br />
|-<br />
!A…<br />
|align='center'|A0<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Non-breaking_space NBSP]'''<br />
|align='center' style='background: #d0d0f0'|A1<br>'''ň'''<br>(¡)'''<br />
|align='center' style='background: #d0d0f0'|A2<br>'''Ű'''<br>(¢)'''<br />
|align='center' style='background: #d0d0f0'|A3<br>'''ě'''<br>(£)'''<br />
|align='center' style='background: #d0d0f0'|A4<br>'''ű'''<br>(¤)'''<br />
|align='center' style='background: #d0d0f0'|A5<br>'''Ě'''<br>(¥)'''<br />
|align='center' style='background: #d0d0f0'|A6<br>'''Š'''<br>(¦)'''<br />
|align='center'|A7<br>'''§'''<br />
|align='center' style='background: #d0d0f0'|A8<br>'''š'''<br>(¨)'''<br />
|align='center' style='background: #d0d0f0'|A9<br>'''Ů'''<br>(©)'''<br />
|align='center' style='background: #d0d0f0'|AA<br>'''Ą'''<br>(ª)'''<br />
|align='center' style='background: #d0d0f0'|AB<br>'''Ę'''<br>(«)'''<br />
|align='center' style='background: #d0d0f0'|AC<br>'''Č'''<br>(¬)'''<br />
|align='center'|AD<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Soft_hyphen SHY]'''<br />
|align='center' style='background: #d0d0f0'|AE<br>'''č'''<br>(®)'''<br />
|align='center' style='background: #d0d0f0'|AF<br>'''ů'''<br>(¯)'''<br />
<br />
|-<br />
!B…<br />
|align='center' style='background: #d0d0f0'|B0<br>'''Ő'''<br>(°)'''<br />
|align='center' style='background: #d0d0f0'|B1<br>'''Ł'''<br>(±)'''<br />
|align='center' style='background: #d0d0f0'|B2<br>'''Ť'''<br>(²)'''<br />
|align='center' style='background: #d0d0f0'|B3<br>'''Ď'''<br>(³)'''<br />
|align='center' style='background: #d0d0f0'|B4<br>'''Ž'''<br>(´)'''<br />
|align='center' style='background: #d0d0f0'|B5<br>'''ł'''<br>(µ)'''<br />
|align='center' style='background: #d0d0f0'|B6<br>'''ť'''<br>(¶)'''<br />
|align='center' style='background: #d0d0f0'|B7<br>'''ď'''<br>(·)'''<br />
|align='center' style='background: #d0d0f0'|B8<br>'''ž'''<br>(¸)'''<br />
|align='center' style='background: #d0d0f0'|B9<br>'''ő'''<br>(¹)'''<br />
|align='center' style='background: #d0d0f0'|BA<br>'''ą'''<br>(º)'''<br />
|align='center' style='background: #d0d0f0'|BB<br>'''ę'''<br>(»)'''<br />
|align='center' style='background: #d0d0f0'|BC<br>'''Œ'''<br>(¼)'''<br />
|align='center' style='background: #d0d0f0'|BD<br>'''œ'''<br>(½)'''<br />
|align='center' style='background: #d0d0f0'|BE<br>'''Ÿ'''<br>(¾)'''<br />
|align='center'|BF<br>'''¿'''<br />
<br />
|-<br />
!C…<br />
|align='center'|C0<br>'''À'''<br />
|align='center'|C1<br>'''Á'''<br />
|align='center'|C2<br>'''Â'''<br />
|align='center'|C3<br>'''Ã'''<br />
|align='center'|C4<br>'''Ä'''<br />
|align='center'|C5<br>'''Å'''<br />
|align='center'|C6<br>'''Æ'''<br />
|align='center'|C7<br>'''Ç'''<br />
|align='center'|C8<br>'''È'''<br />
|align='center'|C9<br>'''É'''<br />
|align='center'|CA<br>'''Ê'''<br />
|align='center'|CB<br>'''Ë'''<br />
|align='center'|CC<br>'''Ì'''<br />
|align='center'|CD<br>'''Í'''<br />
|align='center'|CE<br>'''Î'''<br />
|align='center'|CF<br>'''Ï'''<br />
<br />
|-<br />
!D…<br />
|align='center'|D0<br>'''Ð'''<br />
|align='center'|D1<br>'''Ñ'''<br />
|align='center'|D2<br>'''Ò'''<br />
|align='center'|D3<br>'''Ó'''<br />
|align='center'|D4<br>'''Ô'''<br />
|align='center'|D5<br>'''Õ'''<br />
|align='center'|D6<br>'''Ö'''<br />
|align='center' style='background: #d0d0f0'|D7<br>'''Ř'''<br>(×)'''<br />
|align='center'|D8<br>'''Ø'''<br />
|align='center'|D9<br>'''Ù'''<br />
|align='center'|DA<br>'''Ú'''<br />
|align='center'|DB<br>'''Û'''<br />
|align='center'|DC<br>'''Ü'''<br />
|align='center'|DD<br>'''Ý'''<br />
|align='center'|DE<br>'''Þ'''<br />
|align='center'|DF<br>'''ß'''<br />
<br />
|-<br />
!E…<br />
|align='center'|E0<br>'''à'''<br />
|align='center'|E1<br>'''á'''<br />
|align='center'|E2<br>'''â'''<br />
|align='center'|E3<br>'''ã'''<br />
|align='center'|E4<br>'''ä'''<br />
|align='center'|E5<br>'''å'''<br />
|align='center'|E6<br>'''æ'''<br />
|align='center'|E7<br>'''ç'''<br />
|align='center'|E8<br>'''è'''<br />
|align='center'|E9<br>'''é'''<br />
|align='center'|EA<br>'''ê'''<br />
|align='center'|EB<br>'''ë'''<br />
|align='center'|EC<br>'''ì'''<br />
|align='center'|ED<br>'''í'''<br />
|align='center'|EE<br>'''î'''<br />
|align='center'|EF<br>'''ï'''<br />
<br />
|-<br />
!F…<br />
|align='center'|F0<br>'''ð'''<br />
|align='center'|F1<br>'''ñ'''<br />
|align='center'|F2<br>'''ò'''<br />
|align='center'|F3<br>'''ó'''<br />
|align='center'|F4<br>'''ô'''<br />
|align='center'|F5<br>'''õ'''<br />
|align='center'|F6<br>'''ö'''<br />
|align='center' style='background: #d0d0f0'|F7<br>'''ř'''<br>(÷)'''<br />
|align='center'|F8<br>'''ø'''<br />
|align='center'|F9<br>'''ù'''<br />
|align='center'|FA<br>'''ú'''<br />
|align='center'|FB<br>'''û'''<br />
|align='center'|FC<br>'''ü'''<br />
|align='center'|FD<br>'''ý'''<br />
|align='center'|FE<br>'''þ'''<br />
|align='center'|FF<br>'''ÿ'''<br />
<br />
|}<br />
<br />
== Russian ==<br />
<br />
The character '''0xFF''' (я) is mapped to '''0xB6''' upon loading. Therefore any Russian font must contain я at the place 0xB6.<br />
<br />
== Asian Languages (Korean, Chinese, Japanese) ==<br />
<br />
The original D3 had support for these languages, so it might be possible to add them to TDM, too. At the moment, however, we lack the fonts and translators. Also, writing from right-to-left (Hebrew) or top-down (Japanese) might be tricky or outright impossible in our GUI without more work in the C++ code.<br />
<br />
== Statistics ==<br />
<br />
Some of the special characters are used more often then others. Here is a statistic over the entire string set of the TDM core, showing the top 50 most-used characters (excluding a-z, 0-9 and russian characters):<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 85%" cellspacing=0 cellpadding=2<br />
<br />
|-<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
<br />
|-<br />
|1<br />
|í<br />
|715<br />
|<br />
|25<br />
|ć<br />
|67<br />
|<br />
<br />
|-<br />
|2<br />
|é<br />
|674<br />
|<br />
|26<br />
|è<br />
|65<br />
|<br />
<br />
|-<br />
|3<br />
|á<br />
|524<br />
|<br />
|27<br />
|ú<br />
|56<br />
|<br />
<br />
|-<br />
|4<br />
|ø<br />
|303<br />
|Danish<br />
|28<br />
|ê<br />
|52<br />
|<br />
<br />
|-<br />
|5<br />
|č<br />
|288<br />
|<br />
|29<br />
|ö<br />
|48<br />
|German<br />
<br />
|-<br />
|6<br />
|ó<br />
|283<br />
|<br />
|30<br />
|É<br />
|46<br />
|<br />
<br />
|-<br />
|7<br />
|ü<br />
|270<br />
|German<br />
|31<br />
|ñ<br />
|37<br />
|<br />
<br />
|-<br />
|8<br />
|ł<br />
|203<br />
|Polish<br />
|32<br />
|õ<br />
|32<br />
|<br />
<br />
|-<br />
|9<br />
|æ<br />
|200<br />
|Danish<br />
|33<br />
|ń<br />
|26<br />
|<br />
<br />
|-<br />
|10<br />
|ě<br />
|182<br />
|<br />
|34<br />
|Ł<br />
|24<br />
|<br />
<br />
|-<br />
|11<br />
|ř<br />
|175<br />
|Czech<br />
|35<br />
|Š<br />
|21<br />
|<br />
<br />
|-<br />
|12<br />
|ã<br />
|168<br />
|<br />
|36<br />
|â<br />
|21<br />
|<br />
<br />
|-<br />
|13<br />
|ž<br />
|148<br />
|Czech<br />
|37<br />
|ź<br />
|20<br />
|<br />
<br />
|-<br />
|14<br />
|ý<br />
|142<br />
|<br />
|38<br />
|ß<br />
|18<br />
|German<br />
<br />
|-<br />
|15<br />
|ę<br />
|141<br />
|<br />
|39<br />
|Ó<br />
|18<br />
|<br />
<br />
|-<br />
|16<br />
|ą<br />
|140<br />
|<br />
|40<br />
|ň<br />
|15<br />
|<br />
<br />
|-<br />
|17<br />
|ż<br />
|119<br />
|<br />
|41<br />
|Ú<br />
|15<br />
|<br />
<br />
|-<br />
|18<br />
|å<br />
|109<br />
|Danish<br />
|42<br />
|Á<br />
|13<br />
|<br />
<br />
|-<br />
|19<br />
|š<br />
|99<br />
|<br />
|43<br />
|î<br />
|12<br />
|<br />
<br />
|-<br />
|20<br />
|ś<br />
|97<br />
|<br />
|44<br />
|ť<br />
|11<br />
|<br />
<br />
|-<br />
|21<br />
|ç<br />
|91<br />
|<br />
|45<br />
|ô<br />
|9<br />
|<br />
<br />
|-<br />
|22<br />
|ä<br />
|86<br />
|German<br />
|46<br />
|Ž<br />
|8<br />
|<br />
<br />
|-<br />
|23<br />
|à<br />
|83<br />
|<br />
|47<br />
|Ż<br />
|7<br />
|<br />
<br />
|-<br />
|24<br />
|ů<br />
|77<br />
|<br />
|48<br />
|Č<br />
|7<br />
|<br />
<br />
|-<br />
|25<br />
|ć<br />
|67<br />
|<br />
|49<br />
|ù<br />
|6<br />
|<br />
<br />
|}<br />
<br />
Althought ö, ä and ü do not appear that often, with only these and Ü, Ö, Ä and ß, the entire German language works. So adding these letters is quite important.<br />
<br />
[[Category:Fonts]]<br />
<br />
{{i18n}}* [[Font Patcher]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_Charset&diff=17951
I18N - Charset
2014-10-05T15:43:49Z
<p>Tels: add ț, ș, Ț and Ș</p>
<hr />
<div>== Introduction ==<br />
<br />
The D3 code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, special charsets are used. The fonts (Carleton for the menu f.i.) are build/patched so that the right characters appear in the right place.<br />
<br />
== Encodings ==<br />
<br />
=== all.lang ===<br />
<br />
This file is in '''UTF-8''', and converted with the help of the script '''devel/gen_lang.pl''':<br />
<br />
perl devel/gen_lang.pl<br />
<br />
This ensures that the generated language files are in their proper encodings (see below).<br />
<br />
=== All other language files ===<br />
<br />
Note that the language files (f.i. '''strings/german.lang''') as well as the readables and the FM dictionariaries are expected to be in the following encodings:<br />
<br />
* '''Czech''', '''Hungarian''', '''Slovak''', '''Polish:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-2 ISO-8859-2] ('''not WIN-1250!)<br />
* '''Russian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/Win-1251 WIN-1251]<br />
* '''French:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-15 ISO-8859-15]<br />
* '''Romanian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-16 ISO-8859-16] <br />
* '''All other languages:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1 ISO-8859-1] (German, Dutch, Danish, Swedish, Portuguese, etc.)<br />
<br />
<br />
{{infobox|The core dictionaries are automatically generated in the right encoding, but make sure that you use the right encoding for the FM dictionary, too!}}<br />
<br />
== Character remapping ==<br />
<br />
The characters are remapped upon loading the dictionary/readable, from their native encoding to the special one that TDM uses and that is described here. Responsible for the remapping are [[I18N - Character mapping|mapping files]], f.i. "strings/czech.map". If a map file for a specific language is not found, "strings/default.map" is used instead, if this is not found, no remapping takes place.<br />
<br />
See '''[[I18N - Character mapping|Character mapping]]''' for more information.<br />
<br />
== European Languages ==<br />
<br />
This mapping is used for European languages, f.i. '''Czech''', '''French''', '''German''', '''Spanish''', '''Portuguese''', '''Polish'''. Note that the double accented characters in Hungarian '''Ő, ő, Ű and ű''' look a bit different from '''Ö, ö, Ü and ü'''!<br />
<br />
In the table below, the original ISO 8859-1 characters are given in ''()'' below the TDM character.<br />
<br />
'''Color code:'''<br />
<br />
{{box|#f0d0d0|Character not displayed by TDM or not defined|Unused/Unusable}}{{box|#c0ffc0|Character displayed in v1.08 or newer|Usable in v1.08}}{{box|#90f090|Character displayed in v2.03 or newer|Usable in v2.03}}{{box|#d0d0f0|Changed from the ISO-8859-1 default|Changed from ISO 8859-1}}<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 95%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!<br />
!…0<br />
!…1<br />
!…2<br />
!…3<br />
!…4<br />
!…5<br />
!…6<br />
!…7<br />
!…8<br />
!…9<br />
!…A<br />
!…B<br />
!…C<br />
!…D<br />
!…E<br />
!…F<br />
<br />
|-<br />
!0…<br />
|align='center' style='background: #f0d0d0'|00<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|01<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|02<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|03<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|04<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|05<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|06<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|07<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|08<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|09<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0F<br>'''–'''<br />
<br />
|-<br />
!1…<br />
|align='center' style='background: #f0d0d0'|10<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|11<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|12<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|13<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|14<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|15<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|16<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|17<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|18<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|19<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1F<br>'''–'''<br />
<br />
|-<br />
!2…<br />
|align='center'|20<br>'''&nbsp;'''<br />
|align='center'|21<br>'''!'''<br />
|align='center'|22<br>'''"'''<br />
|align='center'|23<br>'''#'''<br />
|align='center'|24<br>'''$'''<br />
|align='center'|25<br>'''%'''<br />
|align='center'|26<br>'''&'''<br />
|align='center'|27<br>'''''''<br />
|align='center'|28<br>'''('''<br />
|align='center'|29<br>''')'''<br />
|align='center'|2A<br>'''*'''<br />
|align='center'|2B<br>'''+'''<br />
|align='center'|2C<br>''','''<br />
|align='center'|2D<br>'''-'''<br />
|align='center'|2E<br>'''.'''<br />
|align='center'|2F<br>'''/'''<br />
<br />
|-<br />
!3…<br />
|align='center'|30<br>'''0'''<br />
|align='center'|31<br>'''1'''<br />
|align='center'|32<br>'''2'''<br />
|align='center'|33<br>'''3'''<br />
|align='center'|34<br>'''4'''<br />
|align='center'|35<br>'''5'''<br />
|align='center'|36<br>'''6'''<br />
|align='center'|37<br>'''7'''<br />
|align='center'|38<br>'''8'''<br />
|align='center'|39<br>'''9'''<br />
|align='center'|3A<br>''':'''<br />
|align='center'|3B<br>''';'''<br />
|align='center'|3C<br>'''<'''<br />
|align='center'|3D<br>'''='''<br />
|align='center'|3E<br>'''>'''<br />
|align='center'|3F<br>'''?'''<br />
<br />
|-<br />
!4…<br />
|align='center'|40<br>'''@'''<br />
|align='center'|41<br>'''A'''<br />
|align='center'|42<br>'''B'''<br />
|align='center'|43<br>'''C'''<br />
|align='center'|44<br>'''D'''<br />
|align='center'|45<br>'''E'''<br />
|align='center'|46<br>'''F'''<br />
|align='center'|47<br>'''G'''<br />
|align='center'|48<br>'''H'''<br />
|align='center'|49<br>'''I'''<br />
|align='center'|4A<br>'''J'''<br />
|align='center'|4B<br>'''K'''<br />
|align='center'|4C<br>'''L'''<br />
|align='center'|4D<br>'''M'''<br />
|align='center'|4E<br>'''N'''<br />
|align='center'|4F<br>'''O'''<br />
<br />
|-<br />
!5…<br />
|align='center'|50<br>'''P'''<br />
|align='center'|51<br>'''Q'''<br />
|align='center'|52<br>'''R'''<br />
|align='center'|53<br>'''S'''<br />
|align='center'|54<br>'''T'''<br />
|align='center'|55<br>'''U'''<br />
|align='center'|56<br>'''V'''<br />
|align='center'|57<br>'''W'''<br />
|align='center'|58<br>'''X'''<br />
|align='center'|59<br>'''Y'''<br />
|align='center'|5A<br>'''Z'''<br />
|align='center'|5B<br>'''['''<br />
|align='center'|5C<br>'''\'''<br />
|align='center'|5D<br>''']'''<br />
|align='center'|5E<br>'''^'''<br />
|align='center'|5F<br>'''_'''<br />
<br />
|-<br />
!6…<br />
|align='center'|60<br>'''`'''<br />
|align='center'|61<br>'''a'''<br />
|align='center'|62<br>'''b'''<br />
|align='center'|63<br>'''c'''<br />
|align='center'|64<br>'''d'''<br />
|align='center'|65<br>'''e'''<br />
|align='center'|66<br>'''f'''<br />
|align='center'|67<br>'''g'''<br />
|align='center'|68<br>'''h'''<br />
|align='center'|69<br>'''i'''<br />
|align='center'|6A<br>'''j'''<br />
|align='center'|6B<br>'''k'''<br />
|align='center'|6C<br>'''l'''<br />
|align='center'|6D<br>'''m'''<br />
|align='center'|6E<br>'''n'''<br />
|align='center'|6F<br>'''o'''<br />
<br />
|-<br />
!7…<br />
|align='center'|70<br>'''p'''<br />
|align='center'|71<br>'''q'''<br />
|align='center'|72<br>'''r'''<br />
|align='center'|73<br>'''s'''<br />
|align='center'|74<br>'''t'''<br />
|align='center'|75<br>'''u'''<br />
|align='center'|76<br>'''v'''<br />
|align='center'|77<br>'''w'''<br />
|align='center'|78<br>'''x'''<br />
|align='center'|79<br>'''y'''<br />
|align='center'|7A<br>'''z'''<br />
|align='center'|7B<br>'''{'''<br />
|align='center'|7C<br>'''|'''<br />
|align='center'|7D<br>'''}'''<br />
|align='center'|7E<br>'''~'''<br />
|align='center' style='background: #f0d0d0'|7F<br>'''–'''<br />
<br />
|-<br />
!8…<br />
|align='center' style='background: #c0ffc0'|80<br>'''Ň'''<br />
|align='center' style='background: #c0ffc0'|81<br>'''Ś'''<br />
|align='center' style='background: #c0ffc0'|82<br>'''Ć'''<br />
|align='center' style='background: #c0ffc0'|83<br>'''Ż'''<br />
|align='center' style='background: #c0ffc0'|84<br>'''Ź'''<br />
|align='center' style='background: #c0ffc0'|85<br>'''Ŝ'''<br />
|align='center' style='background: #c0ffc0'|86<br>'''Ĉ'''<br />
|align='center' style='background: #c0ffc0'|87<br>'''Ẑ'''<br />
|align='center' style='background: #c0ffc0'|88<br>'''Ô'''<br />
|align='center' style='background: #c0ffc0'|89<br>'''Ŕ'''<br />
|align='center' style='background: #c0ffc0'|8A<br>'''Ǔ'''<br />
|align='center' style='background: #c0ffc0'|8B<br>'''Ă'''<br />
|align='center' style='background: #c0ffc0'|8C<br>'''Ń'''<br />
|align='center' style='background: #90f090'|8D<br>'''Ș'''<br />
|align='center' style='background: #90f090'|8E<br>'''Ț'''<br />
|align='center' style='background: #f0d0d0'|8F<br>'''–'''<br />
<br />
|-<br />
!9…<br />
|align='center' style='background: #f0d0d0'|90<br>'''–'''<br />
|align='center' style='background: #c0ffc0'|91<br>'''ś'''<br />
|align='center' style='background: #c0ffc0'|92<br>'''ć'''<br />
|align='center' style='background: #c0ffc0'|93<br>'''ż'''<br />
|align='center' style='background: #c0ffc0'|94<br>'''ź'''<br />
|align='center' style='background: #c0ffc0'|95<br>'''ŝ'''<br />
|align='center' style='background: #c0ffc0'|96<br>'''ĉ'''<br />
|align='center' style='background: #c0ffc0'|97<br>'''ẑ'''<br />
|align='center' style='background: #c0ffc0'|98<br>'''ô'''<br />
|align='center' style='background: #c0ffc0'|99<br>'''ŕ'''<br />
|align='center' style='background: #c0ffc0'|9A<br>'''ǔ'''<br />
|align='center' style='background: #c0ffc0'|9B<br>'''ă'''<br />
|align='center' style='background: #c0ffc0'|9C<br>'''ń'''<br />
|align='center' style='background: #90f090'|8D<br>'''ș'''<br />
|align='center' style='background: #90f090'|9E<br>'''ț'''<br />
|align='center' style='background: #f0d0d0'|9F<br>'''–'''<br />
<br />
|-<br />
!A…<br />
|align='center'|A0<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Non-breaking_space NBSP]'''<br />
|align='center' style='background: #d0d0f0'|A1<br>'''ň'''<br>(¡)'''<br />
|align='center' style='background: #d0d0f0'|A2<br>'''Ű'''<br>(¢)'''<br />
|align='center' style='background: #d0d0f0'|A3<br>'''ě'''<br>(£)'''<br />
|align='center' style='background: #d0d0f0'|A4<br>'''ű'''<br>(¤)'''<br />
|align='center' style='background: #d0d0f0'|A5<br>'''Ě'''<br>(¥)'''<br />
|align='center' style='background: #d0d0f0'|A6<br>'''Š'''<br>(¦)'''<br />
|align='center'|A7<br>'''§'''<br />
|align='center' style='background: #d0d0f0'|A8<br>'''š'''<br>(¨)'''<br />
|align='center' style='background: #d0d0f0'|A9<br>'''Ů'''<br>(©)'''<br />
|align='center' style='background: #d0d0f0'|AA<br>'''Ą'''<br>(ª)'''<br />
|align='center' style='background: #d0d0f0'|AB<br>'''Ę'''<br>(«)'''<br />
|align='center' style='background: #d0d0f0'|AC<br>'''Č'''<br>(¬)'''<br />
|align='center'|AD<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Soft_hyphen SHY]'''<br />
|align='center' style='background: #d0d0f0'|AE<br>'''č'''<br>(®)'''<br />
|align='center' style='background: #d0d0f0'|AF<br>'''ů'''<br>(¯)'''<br />
<br />
|-<br />
!B…<br />
|align='center' style='background: #d0d0f0'|B0<br>'''Ő'''<br>(°)'''<br />
|align='center' style='background: #d0d0f0'|B1<br>'''Ł'''<br>(±)'''<br />
|align='center' style='background: #d0d0f0'|B2<br>'''Ť'''<br>(²)'''<br />
|align='center' style='background: #d0d0f0'|B3<br>'''Ď'''<br>(³)'''<br />
|align='center' style='background: #d0d0f0'|B4<br>'''Ž'''<br>(´)'''<br />
|align='center' style='background: #d0d0f0'|B5<br>'''ł'''<br>(µ)'''<br />
|align='center' style='background: #d0d0f0'|B6<br>'''ť'''<br>(¶)'''<br />
|align='center' style='background: #d0d0f0'|B7<br>'''ď'''<br>(·)'''<br />
|align='center' style='background: #d0d0f0'|B8<br>'''ž'''<br>(¸)'''<br />
|align='center' style='background: #d0d0f0'|B9<br>'''ő'''<br>(¹)'''<br />
|align='center' style='background: #d0d0f0'|BA<br>'''ą'''<br>(º)'''<br />
|align='center' style='background: #d0d0f0'|BB<br>'''ę'''<br>(»)'''<br />
|align='center' style='background: #d0d0f0'|BC<br>'''Œ'''<br>(¼)'''<br />
|align='center' style='background: #d0d0f0'|BD<br>'''œ'''<br>(½)'''<br />
|align='center' style='background: #d0d0f0'|BE<br>'''Ÿ'''<br>(¾)'''<br />
|align='center'|BF<br>'''¿'''<br />
<br />
|-<br />
!C…<br />
|align='center'|C0<br>'''À'''<br />
|align='center'|C1<br>'''Á'''<br />
|align='center'|C2<br>'''Â'''<br />
|align='center'|C3<br>'''Ã'''<br />
|align='center'|C4<br>'''Ä'''<br />
|align='center'|C5<br>'''Å'''<br />
|align='center'|C6<br>'''Æ'''<br />
|align='center'|C7<br>'''Ç'''<br />
|align='center'|C8<br>'''È'''<br />
|align='center'|C9<br>'''É'''<br />
|align='center'|CA<br>'''Ê'''<br />
|align='center'|CB<br>'''Ë'''<br />
|align='center'|CC<br>'''Ì'''<br />
|align='center'|CD<br>'''Í'''<br />
|align='center'|CE<br>'''Î'''<br />
|align='center'|CF<br>'''Ï'''<br />
<br />
|-<br />
!D…<br />
|align='center'|D0<br>'''Ð'''<br />
|align='center'|D1<br>'''Ñ'''<br />
|align='center'|D2<br>'''Ò'''<br />
|align='center'|D3<br>'''Ó'''<br />
|align='center'|D4<br>'''Ô'''<br />
|align='center'|D5<br>'''Õ'''<br />
|align='center'|D6<br>'''Ö'''<br />
|align='center' style='background: #d0d0f0'|D7<br>'''Ř'''<br>(×)'''<br />
|align='center'|D8<br>'''Ø'''<br />
|align='center'|D9<br>'''Ù'''<br />
|align='center'|DA<br>'''Ú'''<br />
|align='center'|DB<br>'''Û'''<br />
|align='center'|DC<br>'''Ü'''<br />
|align='center'|DD<br>'''Ý'''<br />
|align='center'|DE<br>'''Þ'''<br />
|align='center'|DF<br>'''ß'''<br />
<br />
|-<br />
!E…<br />
|align='center'|E0<br>'''à'''<br />
|align='center'|E1<br>'''á'''<br />
|align='center'|E2<br>'''â'''<br />
|align='center'|E3<br>'''ã'''<br />
|align='center'|E4<br>'''ä'''<br />
|align='center'|E5<br>'''å'''<br />
|align='center'|E6<br>'''æ'''<br />
|align='center'|E7<br>'''ç'''<br />
|align='center'|E8<br>'''è'''<br />
|align='center'|E9<br>'''é'''<br />
|align='center'|EA<br>'''ê'''<br />
|align='center'|EB<br>'''ë'''<br />
|align='center'|EC<br>'''ì'''<br />
|align='center'|ED<br>'''í'''<br />
|align='center'|EE<br>'''î'''<br />
|align='center'|EF<br>'''ï'''<br />
<br />
|-<br />
!F…<br />
|align='center'|F0<br>'''ð'''<br />
|align='center'|F1<br>'''ñ'''<br />
|align='center'|F2<br>'''ò'''<br />
|align='center'|F3<br>'''ó'''<br />
|align='center'|F4<br>'''ô'''<br />
|align='center'|F5<br>'''õ'''<br />
|align='center'|F6<br>'''ö'''<br />
|align='center' style='background: #d0d0f0'|F7<br>'''ř'''<br>(÷)'''<br />
|align='center'|F8<br>'''ø'''<br />
|align='center'|F9<br>'''ù'''<br />
|align='center'|FA<br>'''ú'''<br />
|align='center'|FB<br>'''û'''<br />
|align='center'|FC<br>'''ü'''<br />
|align='center'|FD<br>'''ý'''<br />
|align='center'|FE<br>'''þ'''<br />
|align='center'|FF<br>'''ÿ'''<br />
<br />
|}<br />
<br />
== Russian ==<br />
<br />
The character '''0xFF''' (я) is mapped to '''0xB6''' upon loading. Therefore any Russian font must contain я at the place 0xB6.<br />
<br />
== Asian Languages (Korean, Chinese, Japanese) ==<br />
<br />
The original D3 had support for these languages, so it might be possible to add them to TDM, too. At the moment, however, we lack the fonts and translators. Also, writing from right-to-left (Hebrew) or top-down (Japanese) might be tricky or outright impossible in our GUI without more work in the C++ code.<br />
<br />
== Statistics ==<br />
<br />
Some of the special characters are used more often then others. Here is a statistic over the entire string set of the TDM core, showing the top 50 most-used characters (excluding a-z, 0-9 and russian characters):<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 85%" cellspacing=0 cellpadding=2<br />
<br />
|-<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
<br />
|-<br />
|1<br />
|í<br />
|715<br />
|<br />
|25<br />
|ć<br />
|67<br />
|<br />
<br />
|-<br />
|2<br />
|é<br />
|674<br />
|<br />
|26<br />
|è<br />
|65<br />
|<br />
<br />
|-<br />
|3<br />
|á<br />
|524<br />
|<br />
|27<br />
|ú<br />
|56<br />
|<br />
<br />
|-<br />
|4<br />
|ø<br />
|303<br />
|Danish<br />
|28<br />
|ê<br />
|52<br />
|<br />
<br />
|-<br />
|5<br />
|č<br />
|288<br />
|<br />
|29<br />
|ö<br />
|48<br />
|German<br />
<br />
|-<br />
|6<br />
|ó<br />
|283<br />
|<br />
|30<br />
|É<br />
|46<br />
|<br />
<br />
|-<br />
|7<br />
|ü<br />
|270<br />
|German<br />
|31<br />
|ñ<br />
|37<br />
|<br />
<br />
|-<br />
|8<br />
|ł<br />
|203<br />
|Polish<br />
|32<br />
|õ<br />
|32<br />
|<br />
<br />
|-<br />
|9<br />
|æ<br />
|200<br />
|Danish<br />
|33<br />
|ń<br />
|26<br />
|<br />
<br />
|-<br />
|10<br />
|ě<br />
|182<br />
|<br />
|34<br />
|Ł<br />
|24<br />
|<br />
<br />
|-<br />
|11<br />
|ř<br />
|175<br />
|Czech<br />
|35<br />
|Š<br />
|21<br />
|<br />
<br />
|-<br />
|12<br />
|ã<br />
|168<br />
|<br />
|36<br />
|â<br />
|21<br />
|<br />
<br />
|-<br />
|13<br />
|ž<br />
|148<br />
|Czech<br />
|37<br />
|ź<br />
|20<br />
|<br />
<br />
|-<br />
|14<br />
|ý<br />
|142<br />
|<br />
|38<br />
|ß<br />
|18<br />
|German<br />
<br />
|-<br />
|15<br />
|ę<br />
|141<br />
|<br />
|39<br />
|Ó<br />
|18<br />
|<br />
<br />
|-<br />
|16<br />
|ą<br />
|140<br />
|<br />
|40<br />
|ň<br />
|15<br />
|<br />
<br />
|-<br />
|17<br />
|ż<br />
|119<br />
|<br />
|41<br />
|Ú<br />
|15<br />
|<br />
<br />
|-<br />
|18<br />
|å<br />
|109<br />
|Danish<br />
|42<br />
|Á<br />
|13<br />
|<br />
<br />
|-<br />
|19<br />
|š<br />
|99<br />
|<br />
|43<br />
|î<br />
|12<br />
|<br />
<br />
|-<br />
|20<br />
|ś<br />
|97<br />
|<br />
|44<br />
|ť<br />
|11<br />
|<br />
<br />
|-<br />
|21<br />
|ç<br />
|91<br />
|<br />
|45<br />
|ô<br />
|9<br />
|<br />
<br />
|-<br />
|22<br />
|ä<br />
|86<br />
|German<br />
|46<br />
|Ž<br />
|8<br />
|<br />
<br />
|-<br />
|23<br />
|à<br />
|83<br />
|<br />
|47<br />
|Ż<br />
|7<br />
|<br />
<br />
|-<br />
|24<br />
|ů<br />
|77<br />
|<br />
|48<br />
|Č<br />
|7<br />
|<br />
<br />
|-<br />
|25<br />
|ć<br />
|67<br />
|<br />
|49<br />
|ù<br />
|6<br />
|<br />
<br />
|}<br />
<br />
Althought ö, ä and ü do not appear that often, with only these and Ü, Ö, Ä and ß, the entire German language works. So adding these letters is quite important.<br />
<br />
[[Category:Fonts]]<br />
<br />
{{i18n}}* [[Font Patcher]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_List_of_TDM_translators&diff=17950
I18N - List of TDM translators
2014-10-05T13:25:56Z
<p>Tels: link some more names to the forum</p>
<hr />
<div>This document can be used to find someone who can translate new strings or an FM into the wanted language. <br />
<br />
Note that translators are working for free and on their own, so they can refuse to translate anything at any time :)<br />
<br />
{|class="wikitable sortable" border=1 style="border-collapse: collapse; font-size: 90%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!style="background: #d0d0d0" width=20%|Language<br />
!style="background: #d0d0d0"|Translators<br />
<br />
|-<br />
|Czech<br />
|[http://forums.thedarkmod.com/user/3373-ppoe/ PPoe]<br />
<br />
|-<br />
|Danish<br />
|[http://forums.thedarkmod.com/user/1995-snobel/ snobel]<br />
<br />
|-<br />
|Dutch<br />
|<br />
<br />
|-<br />
|Finnish<br />
|<br />
<br />
|-<br />
|French<br />
|[http://forums.thedarkmod.com/user/2125-briareos-h/ Briareos H], [http://forums.thedarkmod.com/user/3287-hyeron/ Hyeron]<br />
<br />
|-<br />
|German<br />
|[http://forums.thedarkmod.com/user/3427-7upman/ 7upman], [http://forums.thedarkmod.com/user/144-tels/ Tels], [http://forums.thedarkmod.com/user/11230-obsttorte/ Obsttorte]<br />
<br />
|-<br />
|Hungarian<br />
|<br />
<br />
|-<br />
|Italian<br />
|[http://forums.thedarkmod.com/user/8412-echelon/ ECHELON], [http://forums.thedarkmod.com/user/8518-knymed/ Knymed]<br />
<br />
|-<br />
|Norsk<br />
|<br />
<br />
|-<br />
|Polish<br />
|[http://forums.thedarkmod.com/user/8481-maruda/ Maruda]<br />
<br />
|-<br />
|Portuguese<br />
|[http://forums.thedarkmod.com/user/8474-rpgista/ RPGista]<br />
<br />
|-<br />
|Romanian<br />
|<!--[http://forums.thedarkmod.com/user/23762-anderson/ Anderson]--><br />
<br />
|-<br />
|Russian<br />
|[http://forums.thedarkmod.com/user/8407-keeper-riff/ Keeper_riff], MoroseTroll<br />
<br />
|-<br />
|Spanish<br />
|<span style="border-bottom: 1px dotted black; cursor:help" title="conact per email only: rubereaglenest at gmail">Ruber Eaglenest</span><br />
<br />
|-<br />
|Swedish<br />
|<br />
<br />
|}<br />
<br />
{{i18n}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_List_of_TDM_translators&diff=17949
I18N - List of TDM translators
2014-10-05T13:21:10Z
<p>Tels: add swedish</p>
<hr />
<div>This document can be used to find someone who can translate new strings or an FM into the wanted language. <br />
<br />
Note that translators are working for free and on their own, so they can refuse to translate anything at any time :)<br />
<br />
{|class="wikitable sortable" border=1 style="border-collapse: collapse; font-size: 90%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!style="background: #d0d0d0" width=20%|Language<br />
!style="background: #d0d0d0"|Translators<br />
<br />
|-<br />
|Czech<br />
|PPoe<br />
<br />
|-<br />
|Danish<br />
|snobel<br />
<br />
|-<br />
|Dutch<br />
|<br />
<br />
|-<br />
|Finnish<br />
|<br />
<br />
|-<br />
|French<br />
|Briareos H, Hyeron<br />
<br />
|-<br />
|German<br />
|[http://forums.thedarkmod.com/user/3427-7upman/ 7upman], [http://forums.thedarkmod.com/user/144-tels/ Tels], [http://forums.thedarkmod.com/user/11230-obsttorte/ Obsttorte]<br />
<br />
|-<br />
|Hungarian<br />
|<br />
<br />
|-<br />
|Italian<br />
|[http://forums.thedarkmod.com/user/8412-echelon/ ECHELON], Knymed<br />
<br />
|-<br />
|Norsk<br />
|<br />
<br />
|-<br />
|Polish<br />
|[http://forums.thedarkmod.com/user/8481-maruda/ Maruda]<br />
<br />
|-<br />
|Portuguese<br />
|[http://forums.thedarkmod.com/user/8474-rpgista/ RPGista]<br />
<br />
|-<br />
|Romanian<br />
|<!--[http://forums.thedarkmod.com/user/23762-anderson/ Anderson]--><br />
<br />
|-<br />
|Russian<br />
|[http://forums.thedarkmod.com/user/8407-keeper-riff/ Keeper_riff], MoroseTroll<br />
<br />
|-<br />
|Spanish<br />
|<span style="border-bottom: 1px dotted black; cursor:help" title="conact per email only: rubereaglenest at gmail">Ruber Eaglenest</span><br />
<br />
|-<br />
|Swedish<br />
|<br />
<br />
|}<br />
<br />
{{i18n}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_List_of_TDM_translators&diff=17948
I18N - List of TDM translators
2014-10-05T13:20:39Z
<p>Tels: add romanian</p>
<hr />
<div>This document can be used to find someone who can translate new strings or an FM into the wanted language. <br />
<br />
Note that translators are working for free and on their own, so they can refuse to translate anything at any time :)<br />
<br />
{|class="wikitable sortable" border=1 style="border-collapse: collapse; font-size: 90%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!style="background: #d0d0d0" width=20%|Language<br />
!style="background: #d0d0d0"|Translators<br />
<br />
|-<br />
|Czech<br />
|PPoe<br />
<br />
|-<br />
|Danish<br />
|snobel<br />
<br />
|-<br />
|Dutch<br />
|<br />
<br />
|-<br />
|Finnish<br />
|<br />
<br />
|-<br />
|French<br />
|Briareos H, Hyeron<br />
<br />
|-<br />
|German<br />
|[http://forums.thedarkmod.com/user/3427-7upman/ 7upman], [http://forums.thedarkmod.com/user/144-tels/ Tels], [http://forums.thedarkmod.com/user/11230-obsttorte/ Obsttorte]<br />
<br />
|-<br />
|Hungarian<br />
|<br />
<br />
|-<br />
|Italian<br />
|[http://forums.thedarkmod.com/user/8412-echelon/ ECHELON], Knymed<br />
<br />
|-<br />
|Norsk<br />
|<br />
<br />
|-<br />
|Polish<br />
|[http://forums.thedarkmod.com/user/8481-maruda/ Maruda]<br />
<br />
|-<br />
|Portuguese<br />
|[http://forums.thedarkmod.com/user/8474-rpgista/ RPGista]<br />
<br />
|-<br />
|Romanian<br />
|<!--[http://forums.thedarkmod.com/user/23762-anderson/ Anderson]--><br />
<br />
|-<br />
|Russian<br />
|[http://forums.thedarkmod.com/user/8407-keeper-riff/ Keeper_riff], MoroseTroll<br />
<br />
|-<br />
|Spanish<br />
|<span style="border-bottom: 1px dotted black; cursor:help" title="conact per email only: rubereaglenest at gmail">Ruber Eaglenest</span><br />
<br />
|}<br />
<br />
{{i18n}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_Character_mapping&diff=17947
I18N - Character mapping
2014-10-03T11:55:20Z
<p>Tels: correct link to font patcher</p>
<hr />
<div>The D3 code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, a special font is used (Carleton for the menu f.i.). These fonts are build/patched so that the right characters appear in the right place.<br />
<br />
== Encodings ==<br />
<br />
Note that the language files (f.i. strings/german.lang) as well as the readables and the FM dictionariaries are expected to be in the following encodings:<br />
<br />
* '''Czech''', '''Polish:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-2 ISO-8859-2] ('''not WIN-1250!)<br />
* '''Russian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/Win-1251 WIN-1251]<br />
* '''All other languages:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1 ISO-8859-1]<br />
<br />
=== Remapping ===<br />
<br />
The characters are remapped upon loading the dictionary/readable from their source encoding (e.g. ISO 8859-2) to the special character map TDM uses. Responsible for this are mapping files, f.i. "strings/czech.map". If a map file for a specific language is not found, "strings/default.map" is used instead. <br />
<br />
The content of a map file is wrapped in '''{''' and '''}''', and each mapping consists of two hexadecimal numbers, the source and the target character number.<br />
<br />
== Examples ==<br />
<br />
For russian:<br />
<br />
<pre><br />
{<br />
0xFF 0xB6 // я<br />
}<br />
</pre><br />
<br />
For European languages in ISO 8859-2 charset (f.i. Czech):<br />
<br />
<pre><br />
// a comment<br />
{<br />
0xF2 0xA1 // ň<br />
0xDB 0xA2 // Ű (similiar to Ü, used in Hungarian)<br />
0xFB 0xA4 // ű<br />
0xA9 0xA6 // Š<br />
0xB9 0xA8 // š<br />
0xA1 0xAA // Ą<br />
0xC8 0xAC // Č<br />
0xCA 0xAB // Ę<br />
0xE8 0xAE // č<br />
0xD5 0xB0 // Ő (similiar to Ö, used in Hungarian)<br />
0xA3 0xB1 // Ł<br />
0xAb 0xB2 // Ť<br />
0xCF 0xB3 // Ď<br />
0xAC 0xB4 // Ž<br />
0xB3 0xB5 // ł<br />
0xBf 0xB6 // ż<br />
0xEF 0xB7 // ď<br />
0xBE 0xB8 // ž<br />
0xF5 0xB9 // ő (similiar to ö, used in Hungarian)<br />
0xB1 0xBA // ą<br />
0xEA 0xBB // ę<br />
0xF8 0xF7 // ř<br />
0xD8 0xD7 // Ř<br />
0xEC 0xA3 // ě<br />
0xCC 0xA5 // Ě<br />
0xD9 0xA9 // Ů<br />
0xF9 0xAF // ů<br />
0xBB 0xB6 // ť<br />
}<br />
</pre><br />
{{i18n}}* [[Font Patcher]]<br />
<br />
[[Category:fonts]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Twosided&diff=17946
Twosided
2014-10-03T11:40:18Z
<p>Tels: fix link to bugtracker</p>
<hr />
<div>Surfaces with the '''twosided''' keyword in their shader simply get their data doubled, so they get rendered twice, once from front and once from back. Here is a visual explanation.<br />
<br />
:[[Image:Twosided pane.png|340px]] [[Image:Twosided cylinder.png|340px]]<br />
<br />
<br />
The surfaces are doubled by [[FinishSurfaces()]] during model load. This means that if you have a model with a two-sided surface and a skin that switches to a one-sided surface, the surface will still be two-sided (as skin changes do not change the model). Likewise, if the surface is one-sided, but the skin surface is two-sided, the model will stay one-sided. This is tracked as [http://bugs.thedarkmod.com/view.php?id=2297 bug #2297].<br />
<br />
== See also ==<br />
<br />
* [[FinishSurfaces()]]<br />
* [[SEED]]<br />
* [[Creating LOD Models]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=LOD&diff=17945
LOD
2014-10-03T11:27:15Z
<p>Tels: remove outdated note</p>
<hr />
<div>A '''Level of Detail''' (LOD) system can be used to bring more details to the screen while still speeding up rendering. See [http://en.wikipedia.org/wiki/Level_of_detail Wikipedia] for an introduction.<br />
<br />
== The new LOD System - Overview ==<br />
<br />
[[Image:TheDarkMod LOD System Overview.png]]<br />
<br />
SVG version of the above graphic [http://bloodgate.com/mirrors/tdm/TheDarkMod_LOD_System.svg here].<br />
<br />
{{infobox|Note: Fade in and fade out '''only''' work via ''[[alpha-fading]]'', so on materials that use an alpha blend and don't respond to lighting.|bg=#f09090|fg=yellow}}<br />
<br />
== How to use LOD in your TDM map ==<br />
<br />
To enable the LOD system, use either one of the pre-made LOD-enabled entities in your map (most of these are defined in '''def/tdm_lod.def''') or set '''dist_check_period''' to a number greater than 0.<br />
<br />
Note: The '''dist_check_period''' spawnarg needs to be combined with one of "hide_distance" or "lod_X_distance" and "model_lod_X", "skin_lod_X" or "noshadows_lod_X" to have any effect!<br />
<br />
See also '''[[LOD Bias]]''' for how to hide individual entities depending on the menu setting.<br />
<br />
== GUI Setting ==<br />
<br />
There is a new GUI setting, called [[Object detail| '''Object detail''' ]]. You'll find it under <tt>'''Settings - Video - Advanced'''</tt>. It consist of multiple levels, where '''Normal''' is the default. Lower settings cause the LOD distances to shrink, meaning entities switch sooner to the low-quality version and vanish sooner. Higher settings are the opposite, increasing the quality, but may be decreasing the FPS.<br />
<br />
Mappers should design and test their map with the '''Normal''' setting on a typical modern PC (e.g. not too old and not high-end gaming rig either), and preferable also test on some slower and faster machines.<br />
<br />
== Entities ==<br />
<br />
Supported entity types:<br />
* Models that don't move (i.e. func static models)<br />
<br />
''From TDM version 2.03:''<br />
* Animated models like waving flags and laundry (i.e. anything with spawnclass idAnimated)<br />
* AI<br />
* Animated attachments to AI<br />
<br />
=== Example entities ===<br />
<br />
* atdm:nature_pine_skeleton (just the tree trunk)<br />
* atdm:nature_pine (Pine + particle leaves slowly swaying)<br />
* atdm:nature_tree_stump<br />
<br />
More can be found in the "Nature" folder with the DarkRadiant "Create entity" command.<br />
<br />
== Spawnargs ==<br />
<br />
=== min_lod_bias/max_lod_bias ===<br />
<br />
See [[LOD Bias]] for how to hide individual entities depending on the menu setting.<br />
<br />
=== hide_distance ===<br />
<br />
In D3 units. When set to a value > 0, then the entity will be hidden if it is further away than this distance from the player.<br />
<br />
Note: This might cause "popping", e.g. the entity will suddenly vanish or appear. See '''lod_fadeout_range''' for how to avoid this.<br />
<br />
The actual value used from this spawnarg is modified by the menu setting "Object detail", so make to sure to test with this setting at "Normal".<br />
<br />
=== lod_normal_distance ===<br />
<br />
From TDM v1.05 onwards: This spawnarg defines a '''minimum''' distance from the player where the entity will ignore settings lower than '''Normal'''. This can be used to enforce a certain minimum distance so that players who set the detail level to '''Low''' or '''Lowest''' still do not experience entities popping in and out when being very close.<br />
<br />
If this spawnarg is not set, it defaults to '''500 units'''. Avoid setting this spawnarg too high or even equal or higher than "hide_distance". This would only result in the menu setting "Object detail" being fixed at "Normal", e.g. players could never lower the quality settings to achive better frame rates. Do so only in rare cases where important entities would otherwise vanish in front of the eyes of the player.<br />
<br />
=== lod_hide_probability ===<br />
<br />
If '''lod_hide_distance''' is true, this spawnarg controls what the probabiliy of this entity vanishing is. Values range from 0.0 (will never vanish) to 1.0 (will certainly vanish). Whether a particular entity vanishes is computed at map start, so an entity either stays or vanishes, but does not change during the map play time.<br />
<br />
Example:<br />
<br />
"lod_hide_probability" "0.2"<br />
<br />
If you place X identical entities, about 20% of them will vanish at the '''hide_distance''' and 80% will stay.<br />
<br />
This can be used to "thin out" forests at a distance without having them vanish completely.<br />
<br />
=== lod_X_distance ===<br />
<br />
In D3 units. Sets the distance from where on LOD X is used. Will be valid until the next defined lod_(X+1)_distance, or infinty if there is no further LOD distance set.<br />
<br />
To change the appearance of the entity inside this LOD, use the following spawnargs with a matching X:<br />
<br />
==== model_lod_X ====<br />
<br />
Set the model the entity displays inside this LOD. If not set, uses the model from LOD 0 e.g. the one from the "model" spawnarg.<br />
<br />
''From TDM version 2.03:''<br />
<br />
A special value "be_still" is supported for animated models. Setting model_lod_X to "be_still" for a LOD level means: stop the animation but don't switch model.<br />
<br />
==== skin_lod_X ====<br />
<br />
Set the skin the entity displays uses this LOD. If not set, uses the skin from LOD 0 e.g. the one from the "skin" spawnarg.<br />
<br />
==== noshadows_lod_X ====<br />
<br />
Boolean. If set, the entity casts no shadows while in this LOD zone.<br />
<br />
==== offset_lod_X ====<br />
Vector. Origin offset that can be applied to the replacement model if it doesn't naturally line up with the original.<br />
<br />
==== lod_fadein_range ====<br />
<br />
{{infobox|Note: Fade in and fade out only work via ''[[alpha-fading]]'', so on materials that use an alpha blend and don't respond to lighting.|bg=#f09090|fg=yellow}}<br />
<br />
In D3 units. If set to non-zero, then the object will start hidden and begin to fade in at '''lod_1_distance''' - '''lod_fadein_range''' and be completely (100% opacity) visible at '''lod_1_distance'''. This can be used to create entities that only appear in some distance but not close up.<br />
<br />
==== lod_fadeout_range ====<br />
<br />
{{infobox|Note: Fade in and fade out only work via ''[[alpha-fading]]'', so on materials that use an alpha blend and don't respond to lighting.|bg=#f09090|fg=yellow}}<br />
<br />
In D3 units. If set to non-zero, then the object will not vanish suddenly at '''hide_distance''', but start to fade out and be completely invisible at '''hide_distance''' + '''lod_fadeoutrange'''. Defaults to 0.<br />
<br />
=== no_lod ===<br />
:''This spawnarg will be available in TDM version 2.03''<br />
Set "no_lod" "1" to disable LOD completely on an entity. Useful if you want to make use of a LOD entity but use a custom setup.<br />
<br />
== Increasing the LOD steps ==<br />
<br />
The number of possible LOD steps is fixed in code and defined in '''game/misc.h''' as a constant. The current<br />
value is 7, meaning that there are 5 different rendering possibilities beside level 0 (the original) and level 6 (the object is hidden). That should be enough even for huge outdoor maps.<br />
<br />
== Performance ==<br />
<br />
Profiling showed that 3000 thinking entities consume about 7% CPU time. So if you use only a few hundred or thousand LOD entities, the performance of the extra thinking time is very small compared to the benefits of having only a few entities actually visible around the player. <br />
<br />
== Example ==<br />
<br />
At it's simplest, model, dist_check_period, hide_distance, lod_1_distance and model_lod_1 are used:<br />
[[File:Lod_test2.png|thumb|right|click for full size]]<br />
* '''model ''RegularModelName''''' -- point this to the fully detailed model<br />
* '''dist_check_period 0.5''' -- time in seconds between distance checks<br />
* '''hide_distance 400'''<br />
* '''lod_1_distance 100'''<br />
* '''model_lod_1 ''LessDetailedModelName''''' -- lower detail model<br />
* '''lod_2_distance 200''' -- (optional further step)<br />
* '''model_lod_2 ''LowerDetailModelName''''' -- even lower detail model (optional further step)<br />
<br />
== History ==<br />
<br />
Doom3 did not have any LOD system at all. The first steps of such a system were added in TDM by supporting a '''hide_distance''' spawnarg, which made entities hide or portals close once they were further away than this distance. The LOD system in TDM was totally rewritten for v1.04. <br />
<br />
Support for animated models and AI was added in TDM version 2.03. More details are available on the [http://bugs.thedarkmod.com/view.php?id=3770 bugtracker].<br />
<br />
=== Comparison ===<br />
<br />
Here we compare the new (v1.04) to the old system (until v1.02):<br />
<br />
* The old system had only two levels: 0 (original model), and 1 (entity is hidden)<br />
* Due to a typo, all thinking for the LOD entities happened in the first half of the interval. That means if you set the intervall to 1 s, all entities did their distance check between 0 and 0.5 seconds, and none between 0.5 and 1 second and so on. This lead to fluctuating frame rates.<br />
<br />
The new system:<br />
<br />
* Supports up to 7 levels (last is ''hide''), more can easily be done with a recompile<br />
* You can use less levels if you want<br />
* Thinking is distributed over the entire interval<br />
* makes scenes with thousands of entities possible<br />
* Can not only switch the model, but also change the skin (f.i. use less expensive glass shaders) and turn shadows off<br />
* Can hide only a fraction of all entities of the same class (''thinning out'')<br />
* Allows the player (via the settings menu) to control the quality vs. speed<br />
<br />
== See also ==<br />
<br />
* [[LOD Bias]]<br />
* [[Creating LOD Models]] with only Gimp/Photoshop and DarkRadiant<br />
* [[List of LOD Models]]<br />
* [[SEED]] - Random entity placement and distant culling<br />
<br />
{{editing}} {{scripting}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Writing_script_objects&diff=17944
Writing script objects
2014-10-03T11:19:36Z
<p>Tels: Tels moved page Writing script objects to Writing Script Objects</p>
<hr />
<div>#REDIRECT [[Writing Script Objects]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Writing_Script_Objects&diff=17943
Writing Script Objects
2014-10-03T11:19:36Z
<p>Tels: Tels moved page Writing script objects to Writing Script Objects</p>
<hr />
<div>== Introduction ==<br />
<br />
A '''script object''' is an object that is written in the idTech4 scripting language, and an be attached to arbitrary entities. Each entity can have '''only one''' script object.<br />
<br />
Script objects can call script events, these provide access to functions provided by the C++ code. They also have access to the [[spawnargs]] of the entity they are attached to, other entities (and their spawnargs!), as well as global functions (like "sys.wait"), and [[CVARs]].<br />
<br />
An script object should have at least a definition, and one constructor. To prevent that inclusion of that script file defines the object twice, we also use "ifndef" and "define" to guard against this.<br />
<br />
== Writing your own Script Object ==<br />
<br />
Here is an example:<br />
<br />
<pre><br />
#ifndef __NAME_HERE__<br />
#define __NAME_HERE__<br />
<br />
object the_script_object_name_here<br />
{<br />
/**<br />
* Define a float variable that the script code can access. The "m_" prefix<br />
* will remind us that this is a member:<br />
**/<br />
float m_updatePeriod;<br />
<br />
/**<br />
* Define the constructor, will be called automatically _once_:<br />
*/<br />
void init();<br />
<br />
/**<br />
* Optional: Define a routine that gets called when a savegame is loaded:<br />
*/<br />
void RestoreScriptObject();<br />
<br />
/**<br />
* Optional: Define a routine that can work periodically.<br />
*/<br />
void updateLoop();<br />
};<br />
<br />
// now define the routines and their code<br />
void the_script_object_name_here::init()<br />
{<br />
// print out that we are constructed for debugging:<br />
sys.println ("the_script_object_name_here::init() called");<br />
<br />
// initialize our member from a spanwarg from the entity this<br />
// script object is attached to:<br />
m_updatePeriod = getFloatKey( "update_period" );<br />
<br />
// Done now. If you want to do some work be done periodically,<br />
// call it here once, and let it loop.<br />
updateLoop();<br />
};<br />
<br />
void the_script_object_name_here::RestoreScriptObject()<br />
{<br />
// print out that we are constructed for debugging:<br />
sys.println ("the_script_object_name_here::RestoreScriptObject() called");<br />
<br />
// We have to do nothing by default, everything is already restored<br />
// but if your script object plays some sounds, you might want to<br />
// restart them here. <br />
}<br />
<br />
void the_script_object_name_here::updateLoop()<br />
{<br />
// endless loop<br />
while (1)<br />
{<br />
<br />
// do something here<br />
<br />
// then wait the wanted time, and do it again:<br />
wait( m_updatePeriod );<br />
}<br />
}<br />
<br />
#endif // __NAME_HERE__<br />
</pre><br />
<br />
For a more complete example see '''script/tdm_location_settings.script'''.<br />
<br />
=== Constructor ===<br />
<br />
The constructor <tt>init()</tt> is called by the engine for each script object during the first frame after spawning the entity. You <tt>main()</tt> routine should therefore do '''<tt>sys.waitFrame()</tt> before accessing any script objects.<br />
<br />
Note that inherited script objects get <tt>init()</tt> called from all the classes they inherit from. So make sure that inherited classes do not do things twice in their constructors.<br />
<br />
=== Self ===<br />
<br />
If you want to pass the script object to other functions, use '''<tt>self</tt>''':<br />
<br />
sys.remove(self);<br />
<br />
=== Inheritance ===<br />
<br />
Script objects can inherit from other objects:<br />
<br />
<pre><br />
object my_subclass : the_script_object_name_here<br />
{<br />
/**<br />
* Define a new routine in addition to the inherited ones<br />
*/<br />
void newUpdateLoop();<br />
}<br />
void my_subclass::newUpdateLoop()<br />
{<br />
sys.waitFrame();<br />
updateLoop(); // call the inherited method<br />
}<br />
</pre><br />
<br />
=== Accessing Methods ===<br />
<br />
If your entity has a scriptobject, and you want to call a method on that script object from a variable, you need to use the right class name instead of plain '''entity''':<br />
<br />
<pre><br />
entity my_ent = $my_entity;<br />
my_ent.updateLoop(); // error, normal entities don't have the script event<br />
<br />
the_script_object_name_here my_ent = $my_entity;<br />
my_ent.updateLoop(); // works<br />
<br />
$my_entity.updateLoop(); // also works<br />
</pre><br />
<br />
=== Notes ===<br />
<br />
* Avoid method names that already exist in the C++ code. For instance "Restore()", "Save()", "Spawn()" etc. These all might cause unwanted side-effects or crashes. They also make it impossible to be called from the C++ code.<br />
* It is sensible to put your script object in its own file.<br />
<br />
<br />
{{infobox|Note: Make sure to include it from '''script/tdm_custom_scripts.script''', and '''not''' from your main map script. Otherwise savegames cannot be loaded!}}<br />
<br />
== Pre-made Script Objects ==<br />
<br />
TDM already contains some useful script objects that you can attach to entities, see [[Script objects]] for a list.<br />
<br />
{{scripting}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Writing_Script_Objects&diff=17942
Writing Script Objects
2014-10-03T11:19:17Z
<p>Tels: add more info</p>
<hr />
<div>== Introduction ==<br />
<br />
A '''script object''' is an object that is written in the idTech4 scripting language, and an be attached to arbitrary entities. Each entity can have '''only one''' script object.<br />
<br />
Script objects can call script events, these provide access to functions provided by the C++ code. They also have access to the [[spawnargs]] of the entity they are attached to, other entities (and their spawnargs!), as well as global functions (like "sys.wait"), and [[CVARs]].<br />
<br />
An script object should have at least a definition, and one constructor. To prevent that inclusion of that script file defines the object twice, we also use "ifndef" and "define" to guard against this.<br />
<br />
== Writing your own Script Object ==<br />
<br />
Here is an example:<br />
<br />
<pre><br />
#ifndef __NAME_HERE__<br />
#define __NAME_HERE__<br />
<br />
object the_script_object_name_here<br />
{<br />
/**<br />
* Define a float variable that the script code can access. The "m_" prefix<br />
* will remind us that this is a member:<br />
**/<br />
float m_updatePeriod;<br />
<br />
/**<br />
* Define the constructor, will be called automatically _once_:<br />
*/<br />
void init();<br />
<br />
/**<br />
* Optional: Define a routine that gets called when a savegame is loaded:<br />
*/<br />
void RestoreScriptObject();<br />
<br />
/**<br />
* Optional: Define a routine that can work periodically.<br />
*/<br />
void updateLoop();<br />
};<br />
<br />
// now define the routines and their code<br />
void the_script_object_name_here::init()<br />
{<br />
// print out that we are constructed for debugging:<br />
sys.println ("the_script_object_name_here::init() called");<br />
<br />
// initialize our member from a spanwarg from the entity this<br />
// script object is attached to:<br />
m_updatePeriod = getFloatKey( "update_period" );<br />
<br />
// Done now. If you want to do some work be done periodically,<br />
// call it here once, and let it loop.<br />
updateLoop();<br />
};<br />
<br />
void the_script_object_name_here::RestoreScriptObject()<br />
{<br />
// print out that we are constructed for debugging:<br />
sys.println ("the_script_object_name_here::RestoreScriptObject() called");<br />
<br />
// We have to do nothing by default, everything is already restored<br />
// but if your script object plays some sounds, you might want to<br />
// restart them here. <br />
}<br />
<br />
void the_script_object_name_here::updateLoop()<br />
{<br />
// endless loop<br />
while (1)<br />
{<br />
<br />
// do something here<br />
<br />
// then wait the wanted time, and do it again:<br />
wait( m_updatePeriod );<br />
}<br />
}<br />
<br />
#endif // __NAME_HERE__<br />
</pre><br />
<br />
For a more complete example see '''script/tdm_location_settings.script'''.<br />
<br />
=== Constructor ===<br />
<br />
The constructor <tt>init()</tt> is called by the engine for each script object during the first frame after spawning the entity. You <tt>main()</tt> routine should therefore do '''<tt>sys.waitFrame()</tt> before accessing any script objects.<br />
<br />
Note that inherited script objects get <tt>init()</tt> called from all the classes they inherit from. So make sure that inherited classes do not do things twice in their constructors.<br />
<br />
=== Self ===<br />
<br />
If you want to pass the script object to other functions, use '''<tt>self</tt>''':<br />
<br />
sys.remove(self);<br />
<br />
=== Inheritance ===<br />
<br />
Script objects can inherit from other objects:<br />
<br />
<pre><br />
object my_subclass : the_script_object_name_here<br />
{<br />
/**<br />
* Define a new routine in addition to the inherited ones<br />
*/<br />
void newUpdateLoop();<br />
}<br />
void my_subclass::newUpdateLoop()<br />
{<br />
sys.waitFrame();<br />
updateLoop(); // call the inherited method<br />
}<br />
</pre><br />
<br />
=== Accessing Methods ===<br />
<br />
If your entity has a scriptobject, and you want to call a method on that script object from a variable, you need to use the right class name instead of plain '''entity''':<br />
<br />
<pre><br />
entity my_ent = $my_entity;<br />
my_ent.updateLoop(); // error, normal entities don't have the script event<br />
<br />
the_script_object_name_here my_ent = $my_entity;<br />
my_ent.updateLoop(); // works<br />
<br />
$my_entity.updateLoop(); // also works<br />
</pre><br />
<br />
=== Notes ===<br />
<br />
* Avoid method names that already exist in the C++ code. For instance "Restore()", "Save()", "Spawn()" etc. These all might cause unwanted side-effects or crashes. They also make it impossible to be called from the C++ code.<br />
* It is sensible to put your script object in its own file.<br />
<br />
<br />
{{infobox|Note: Make sure to include it from '''script/tdm_custom_scripts.script''', and '''not''' from your main map script. Otherwise savegames cannot be loaded!}}<br />
<br />
== Pre-made Script Objects ==<br />
<br />
TDM already contains some useful script objects that you can attach to entities, see [[Script objects]] for a list.<br />
<br />
{{scripting}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Scripting_basics&diff=17941
Scripting basics
2014-10-03T11:07:17Z
<p>Tels: add link to script objects</p>
<hr />
<div>TDM (Dooom 3) scripts are text files containing script code in a proprietary syntax. By convention, they are given a <tt>.script</tt> extension. Game-wide script files are located in the <tt>script</tt> directory, while map-specific script files are located in the same directory as the corresponding map.<br />
<br />
== Starting with scripting ==<br />
<br />
This article is an overview over the basics of scripting. If you are impatient and just want to implement a specific functionality, see [[My first map script]] for a start into scripting. <br />
<br />
== Syntax ==<br />
<br />
TDM scripts have a vaguely C++-like syntax, though they are nowhere near as powerful as C++. They have standard braces-and-semicolons syntax, and a notion of "classes". Class members are defined inside a class declaration and defined separately, rather like C++. Unlike C++, there are no separate header files; everything goes into one script file.<br />
<br />
Scripts have only a few data types:<br />
<br />
* <tt>float</tt> - A number, integer or floating point.<br />
* <tt>boolean</tt> - can be false or true.<br />
* <tt>string</tt> - A string (sequence of characters).<br />
* <tt>vector</tt> - Three numbers in one variable; useful for representing locations, velocities, etc.<br />
* <tt>entity</tt> - A reference to an entity (a pointer, in C++ parlance).<br />
<br />
Note the complete lack of a dedicated integer type (use <tt>float</tt> instead), or any ability to define complex data structures! If data structures are needed, they are typically created in the SDK and ''scriptevents'' (see below) are provided to allow scripts to manipulate them.<br />
<br />
For a more detailed specification of the script syntax, see [https://modwiki.xnet.fi/SCRIPT_%28file_format%29 Modwiki's SCRIPT file reference].<br />
<br />
=== The float data type ===<br />
All numeric values are stored in '''float''' data types, which is the only numeric type. Neither int, double nor short, unsigned or other numeric keywords known from C exist in D3 Scripting. Still, most of the operators are applicable, like ++, +, -, +=, *=, etc.<br />
<br />
=== The boolean data type ===<br />
The data type boolean can only hold two values, namely true or false (TRUE or FALSE work as well). Behind the scenes, this is just another float variable.<br />
<br />
Note: you can also use float as argument of conditional expressions, like this:<br />
float myFloat = 1; // this will evaluate to TRUE when used in conditional expr.<br />
if (myFloat) {<br />
// do something, <br />
}<br />
<br />
=== The string data type ===<br />
Strings hold sequences of characters, like the keys or values of entity spawnargs. Their use is quite intuitive, the + operator can be used to concatenate them:<br />
string myStr = $player1.getKey("name"); // Retrieve the value of the "name" spawnarg of the player entity<br />
myStr = "The name of player 1 is " + myStr + "\n";<br />
sys.println(myStr); // Print the text to the console<br />
<br />
=== The vector data type ===<br />
The data type vector implements a three-component vector. As arrays and their native operator [] is not implemented in D3 scripting, the elements of vectors are accessed like this:<br />
vector myVec; // declare a new vector<br />
myVec_x = 20; // access only the X part of the vector<br />
myVec_y = 0; // access only the Y part<br />
myVec_z = 0; // access only the Z part<br />
// myVec now holds the 3D vector <20,0,0><br />
Alternatively, you can assign a string to a vector variable, like this (the string gets converted correctly, but be sure to use '''single quotes'''):<br />
myVec = '0 10 0';<br />
As an example, the '''getOrigin()''' methods return a vector.<br />
<br />
You can compare vectors by using the 'X Y Z' syntax:<br />
<br />
<pre><br />
vector myv = '1 0 0';<br />
if (myv == '1 0 0')<br />
{<br />
// do something<br />
}<br />
</pre><br />
<br />
=== The entity data type ===<br />
References to other entities are stored in the '''entity''' data type. Entities can be looked up by name, like this:<br />
entity myEnt; // declare myEnt to be of type entity<br />
myEnt = $player1; // Let myEnt refer to the player entity, which by convention has the name "player1".<br />
The entity data type can be compared to the pointers (that's also how they are stored internally).<br />
<br />
==== The NULL entity ====<br />
<br />
There also exists a NULL entity, named '''$null_entity'''. It can be used to compare an entity to NULL, to see if it points to a valid entity. Some script events return NULL to signal "no such entity exists".<br />
<br />
==== Entity types from Script Objects ====<br />
<br />
If you declare a [[Script objects|script object]] with:<br />
<br />
<pre><br />
object my_entity_type<br />
{<br />
float getMyCount();<br />
};<br />
<br />
my_entity_type::getMyCount()<br />
{<br />
return 2;<br />
}<br />
</pre><br />
<br />
you can then later declare variables to be of that type. This is important to call methods on these entities, as otherwise your own defined methods are not accessible:<br />
<br />
<pre><br />
entity my_name;<br />
my_name.getMyCount(); // error, normal entities do not have a script event getMyCount<br />
<br />
my_entity_type my_name_2;<br />
my_name_2.getMyCount(); // works<br />
<br />
my_entity_type my_name_3 = my_name; // casts from "entity" to "my_entity_type"<br />
my_name_3.getMyCount(); // works<br />
</pre><br />
<br />
=== The sys entity ===<br />
Script events always have to be called on an entity, like this:<br />
$player1.kill(); // kill the player<br />
However, there are a lot of script events which are unrelated to a specific entity, like cos(), sin(), spawn() and such. These "generic" events are invoked on the '''sys''' entity, like this:<br />
entity myLight = sys.spawn("light_moving"); // spawn a new light entity<br />
myLight.setOrigin($player1.getOrigin()); // move it to the point where the player is currently residing<br />
<br />
=== Script Events ===<br />
<br />
A script event is a pre-made function that does something for you, usually to some game item you specify, just when you write it in your code (like $item.eventX(); does X to item). Sometimes it wants parameters or arguments to run (the stuff in parentheses) and will give an error if you don't put the arguments in the parentheses in exactly the way it wants, with the right number of them & right data types, etc. And some of them return values too, especially the "get" functions, which are handed over to a variable (e.g., X = getValue();, now X has the value. If X is an entity, you can even act on X as if it's the entity itself. Just be sure the data type of X and Value are the same, e.g. float, or string, or entity, etc, or you'll get an error).<br />
<br />
'''Q. What are some common or useful script events for editing?'''<br />
<br />
'''A.''' A list of all Doom3 and TDM script events are listed in two files (open with a text editor): scripts/doom_events.script, scripts/tdm_events.script. Proper syntax for the Doom3 events is here [http://www.modwiki.net/wiki/Script_events_%28Doom_3%29]. Note that TDM has some of its own script events, like setFrobable (in the tdm_events.script list). A quick list of common or useful script events good for editing is here: [[Script_Events_User-Friendly_List]], with syntax and description, and including TDM events. It doesn't list all script events and all details, just common & useful ones for actual mapping IMO.<br />
<br />
You can find a list of existing script events in the following file:<br />
<br />
* scripts/tdm_events.script<br />
<br />
== Discovery (or, why is TDM ignoring my script file?) ==<br />
<br />
TDM will automatically find and load some kinds of files, such as .def files. However, it does not do the same for script files; if you merely create a .script file and place it in the <tt>script</tt> directory, it will be not loaded.<br />
<br />
There are two ways to use a script:<br />
<br />
* Place it in a map script. '''This is the recommended way for mappers'''. Map scripts are loaded when the corresponding map is loaded. They must be given the same name and placed in the same location as the corresponding map file, but with a .script extension instead of a .map extension. For example, the map script for <tt>maps/mydir/mymap.map</tt> must be called <tt>maps/mydir/mymap.script</tt>. Map scripts are used to implement map-specific behaviours; as such, mappers will often use them but mod coders typically won't.<br />
<br />
* You can place your code in a file called <tt>script/tdm_custom_scripts.script</tt>. Never use '''<tt>script/tdm_main.script</tt>''' - this contains all the scripts that are provided by the main engine.<br />
<br />
Most of the TDM-specific scripts, including <tt>tdm_ai_base.script</tt>, are <tt>#include</tt>d from <tt>tdm_main.script</tt>. We could also put further <tt>#include</tt> directives into <tt>tdm_ai_base.script</tt>, and so on. As long as a script gets <tt>#include</tt>d at least once, it will get loaded in all maps. Note that you should be careful not to <tt>#include</tt> the same script twice, or TDM will complain about multiple definitions - one common way to avoid accidental double-inclusion is to place so-called "inclusion guards" in your script file (C/C++ programmers will be familiar with this kind of preprocessor trickery):<br />
#ifndef __TDM_YOUR_SCRIPT_NAME__<br />
#define __TDM_YOUR_SCRIPT_NAME__<br />
<br />
// your code here will get included exactly once<br />
<br />
#endif //__YOUR_SCRIPT_NAME__<br />
<br />
== Script invocation ==<br />
<br />
'''TODO:''' Describe the various ways in which functions in script files can get called.<br />
<br />
{{infobox|The <tt>tdm_main</tt> function in <tt>script/tdm_main.script</tt> will be called right before the level starts to load. It's not recommended to put map-specific scripting in there. For map-specific script setup, use the map's own script file and place a <tt>void main()</tt> function in there, which will get called by the game.}}<br />
<br />
In addition to using your own <tt>main()</tt> function, make sure you first add a <tt>sys.waitFrame()</tt> in it. Otherwise the <tt>init()</tt> function from some scriptobjects has not been run, and you can get strange bugs from uninitialized variables:<br />
<br />
<pre><br />
void main()<br />
{<br />
sys.waitFrame(); // wait for init() routines to finish<br />
// add your code below:<br />
}<br />
</pre><br />
<br />
=== How do I run a script in-game? ===<br />
<br />
A few common ways of calling a script object thread in-game are <br />
# creating a target_callscriptfunction entity with the spawnarg: "call" "<name of your script object>", then creating some other entity (such as a button or [[Triggers|trigger brush]]) that "targets" that entity; <br />
# creating a button with the property "state_change_callback" "<script object>", which runs the script when pushed or triggered, <br />
# Using [[Location_Settings#Script_calls]] to call a script when you enter or leave a location; <br />
# triggering a script with the [[Objectives_Editor]] when you fulfill or fail an objective (possibly a hidden objective only for triggering the script); <br />
# A script can call another thread in itself with the "thread" function; see the command in the link below. <br />
# An entity can call a script when it spawns. Add a property/value either in the .def file or as a spawnarg on the entity: "ScriptEvent void <script object>(<parameters>);". <br />
# The script "void main();" is always called at game start. So if you add code under that heading in your script file, it will run at game start. <br />
There are other methods too. (Note, if you call a persistent script, i.e., it runs all game, be especially sure to avoid performance hits, or make it non-persistent if possible, that is, you "kill" it at some point in the game so it doesn't hog resources.)<br />
<br />
== Interfacing with the SDK ==<br />
<br />
No language can operate usefully in a vacuum - at some point it needs to go out and do stuff.<br />
<br />
'''TODO:''' Describe the various ways in which the SDK can interface with Doom 3 scripts; scriptevents, scriptvars (instances of idScriptVar), etc.<br />
<br />
Vanilla Doom 3 script reference: https://modwiki.xnet.fi/Script_events_%28Doom_3%29<br />
<br />
Also need refs for Dark Mod's scriptevents.<br />
<br />
== Things that don't exist in scripting ==<br />
<br />
This is a non-comprehensive list of things that don't exist, but may be expected or known from other languages:<br />
<br />
* structs<br />
* pointers (including dereference operators ->, *)<br />
* integers (use floats instead)<br />
* arrays (including the array operator[])<br />
* exceptions<br />
* "crashes" (you cannot call scriptEvents on entities, which do not have the event - the script will not compile and TDM will not load)<br />
* char data types, which implies that const char* is also missing (use string instead)<br />
* private/public/protected<br />
* multiple inheritance<br />
<br />
== See also ==<br />
<br />
* [[My first map script]]<br />
* [[Script objects]]<br />
<br />
{{scripting}}<br />
{{todo}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Scripting_basics&diff=17940
Scripting basics
2014-10-03T11:04:26Z
<p>Tels: add more info</p>
<hr />
<div>TDM (Dooom 3) scripts are text files containing script code in a proprietary syntax. By convention, they are given a <tt>.script</tt> extension. Game-wide script files are located in the <tt>script</tt> directory, while map-specific script files are located in the same directory as the corresponding map.<br />
<br />
== Starting with scripting ==<br />
<br />
This article is an overview over the basics of scripting. If you are impatient and just want to implement a specific functionality, see [[My first map script]] for a start into scripting. <br />
<br />
== Syntax ==<br />
<br />
TDM scripts have a vaguely C++-like syntax, though they are nowhere near as powerful as C++. They have standard braces-and-semicolons syntax, and a notion of "classes". Class members are defined inside a class declaration and defined separately, rather like C++. Unlike C++, there are no separate header files; everything goes into one script file.<br />
<br />
Scripts have only a few data types:<br />
<br />
* <tt>float</tt> - A number, integer or floating point.<br />
* <tt>boolean</tt> - can be false or true.<br />
* <tt>string</tt> - A string (sequence of characters).<br />
* <tt>vector</tt> - Three numbers in one variable; useful for representing locations, velocities, etc.<br />
* <tt>entity</tt> - A reference to an entity (a pointer, in C++ parlance).<br />
<br />
Note the complete lack of a dedicated integer type (use <tt>float</tt> instead), or any ability to define complex data structures! If data structures are needed, they are typically created in the SDK and ''scriptevents'' (see below) are provided to allow scripts to manipulate them.<br />
<br />
For a more detailed specification of the script syntax, see [https://modwiki.xnet.fi/SCRIPT_%28file_format%29 Modwiki's SCRIPT file reference].<br />
<br />
=== The float data type ===<br />
All numeric values are stored in '''float''' data types, which is the only numeric type. Neither int, double nor short, unsigned or other numeric keywords known from C exist in D3 Scripting. Still, most of the operators are applicable, like ++, +, -, +=, *=, etc.<br />
<br />
=== The boolean data type ===<br />
The data type boolean can only hold two values, namely true or false (TRUE or FALSE work as well). Behind the scenes, this is just another float variable.<br />
<br />
Note: you can also use float as argument of conditional expressions, like this:<br />
float myFloat = 1; // this will evaluate to TRUE when used in conditional expr.<br />
if (myFloat) {<br />
// do something, <br />
}<br />
<br />
=== The string data type ===<br />
Strings hold sequences of characters, like the keys or values of entity spawnargs. Their use is quite intuitive, the + operator can be used to concatenate them:<br />
string myStr = $player1.getKey("name"); // Retrieve the value of the "name" spawnarg of the player entity<br />
myStr = "The name of player 1 is " + myStr + "\n";<br />
sys.println(myStr); // Print the text to the console<br />
<br />
=== The vector data type ===<br />
The data type vector implements a three-component vector. As arrays and their native operator [] is not implemented in D3 scripting, the elements of vectors are accessed like this:<br />
vector myVec; // declare a new vector<br />
myVec_x = 20; // access only the X part of the vector<br />
myVec_y = 0; // access only the Y part<br />
myVec_z = 0; // access only the Z part<br />
// myVec now holds the 3D vector <20,0,0><br />
Alternatively, you can assign a string to a vector variable, like this (the string gets converted correctly, but be sure to use '''single quotes'''):<br />
myVec = '0 10 0';<br />
As an example, the '''getOrigin()''' methods return a vector.<br />
<br />
You can compare vectors by using the 'X Y Z' syntax:<br />
<br />
<pre><br />
vector myv = '1 0 0';<br />
if (myv == '1 0 0')<br />
{<br />
// do something<br />
}<br />
</pre><br />
<br />
=== The entity data type ===<br />
References to other entities are stored in the '''entity''' data type. Entities can be looked up by name, like this:<br />
entity myEnt; // declare myEnt to be of type entity<br />
myEnt = $player1; // Let myEnt refer to the player entity, which by convention has the name "player1".<br />
The entity data type can be compared to the pointers (that's also how they are stored internally).<br />
<br />
==== The NULL entity ====<br />
<br />
There also exists a NULL entity, named '''$null_entity'''. It can be used to compare an entity to NULL, to see if it points to a valid entity. Some script events return NULL to signal "no such entity exists".<br />
<br />
==== event tpyes from script objects ====<br />
<br />
If you declare a script object with:<br />
<br />
<pre><br />
object my_entity_type<br />
{<br />
float getMyCount();<br />
};<br />
<br />
my_entity_type::getMyCount()<br />
{<br />
return 2;<br />
}<br />
</pre><br />
<br />
you can then later declare variables to be of that type. This is important to call methods on these entities, as otherwise your own defined methods are not accessible:<br />
<br />
<pre><br />
entity my_name;<br />
my_name.getMyCount(); // error, normal entities do not have a script event getMyCount<br />
<br />
my_entity_type my_name_2;<br />
my_name_2.getMyCount(); // works<br />
<br />
my_entity_type my_name_3 = my_name; // casts from "entity" to "my_entity_type"<br />
my_name_3.getMyCount(); // works<br />
</pre><br />
<br />
=== The sys entity ===<br />
Script events always have to be called on an entity, like this:<br />
$player1.kill(); // kill the player<br />
However, there are a lot of script events which are unrelated to a specific entity, like cos(), sin(), spawn() and such. These "generic" events are invoked on the '''sys''' entity, like this:<br />
entity myLight = sys.spawn("light_moving"); // spawn a new light entity<br />
myLight.setOrigin($player1.getOrigin()); // move it to the point where the player is currently residing<br />
<br />
=== Script Events ===<br />
<br />
A script event is a pre-made function that does something for you, usually to some game item you specify, just when you write it in your code (like $item.eventX(); does X to item). Sometimes it wants parameters or arguments to run (the stuff in parentheses) and will give an error if you don't put the arguments in the parentheses in exactly the way it wants, with the right number of them & right data types, etc. And some of them return values too, especially the "get" functions, which are handed over to a variable (e.g., X = getValue();, now X has the value. If X is an entity, you can even act on X as if it's the entity itself. Just be sure the data type of X and Value are the same, e.g. float, or string, or entity, etc, or you'll get an error).<br />
<br />
'''Q. What are some common or useful script events for editing?'''<br />
<br />
'''A.''' A list of all Doom3 and TDM script events are listed in two files (open with a text editor): scripts/doom_events.script, scripts/tdm_events.script. Proper syntax for the Doom3 events is here [http://www.modwiki.net/wiki/Script_events_%28Doom_3%29]. Note that TDM has some of its own script events, like setFrobable (in the tdm_events.script list). A quick list of common or useful script events good for editing is here: [[Script_Events_User-Friendly_List]], with syntax and description, and including TDM events. It doesn't list all script events and all details, just common & useful ones for actual mapping IMO.<br />
<br />
You can find a list of existing script events in the following file:<br />
<br />
* scripts/tdm_events.script<br />
<br />
== Discovery (or, why is TDM ignoring my script file?) ==<br />
<br />
TDM will automatically find and load some kinds of files, such as .def files. However, it does not do the same for script files; if you merely create a .script file and place it in the <tt>script</tt> directory, it will be not loaded.<br />
<br />
There are two ways to use a script:<br />
<br />
* Place it in a map script. '''This is the recommended way for mappers'''. Map scripts are loaded when the corresponding map is loaded. They must be given the same name and placed in the same location as the corresponding map file, but with a .script extension instead of a .map extension. For example, the map script for <tt>maps/mydir/mymap.map</tt> must be called <tt>maps/mydir/mymap.script</tt>. Map scripts are used to implement map-specific behaviours; as such, mappers will often use them but mod coders typically won't.<br />
<br />
* You can place your code in a file called <tt>script/tdm_custom_scripts.script</tt>. Never use '''<tt>script/tdm_main.script</tt>''' - this contains all the scripts that are provided by the main engine.<br />
<br />
Most of the TDM-specific scripts, including <tt>tdm_ai_base.script</tt>, are <tt>#include</tt>d from <tt>tdm_main.script</tt>. We could also put further <tt>#include</tt> directives into <tt>tdm_ai_base.script</tt>, and so on. As long as a script gets <tt>#include</tt>d at least once, it will get loaded in all maps. Note that you should be careful not to <tt>#include</tt> the same script twice, or TDM will complain about multiple definitions - one common way to avoid accidental double-inclusion is to place so-called "inclusion guards" in your script file (C/C++ programmers will be familiar with this kind of preprocessor trickery):<br />
#ifndef __TDM_YOUR_SCRIPT_NAME__<br />
#define __TDM_YOUR_SCRIPT_NAME__<br />
<br />
// your code here will get included exactly once<br />
<br />
#endif //__YOUR_SCRIPT_NAME__<br />
<br />
== Script invocation ==<br />
<br />
'''TODO:''' Describe the various ways in which functions in script files can get called.<br />
<br />
{{infobox|The <tt>tdm_main</tt> function in <tt>script/tdm_main.script</tt> will be called right before the level starts to load. It's not recommended to put map-specific scripting in there. For map-specific script setup, use the map's own script file and place a <tt>void main()</tt> function in there, which will get called by the game.}}<br />
<br />
In addition to using your own <tt>main()</tt> function, make sure you first add a <tt>sys.waitFrame()</tt> in it. Otherwise the <tt>init()</tt> function from some scriptobjects has not been run, and you can get strange bugs from uninitialized variables:<br />
<br />
<pre><br />
void main()<br />
{<br />
sys.waitFrame(); // wait for init() routines to finish<br />
// add your code below:<br />
}<br />
</pre><br />
<br />
=== How do I run a script in-game? ===<br />
<br />
A few common ways of calling a script object thread in-game are <br />
# creating a target_callscriptfunction entity with the spawnarg: "call" "<name of your script object>", then creating some other entity (such as a button or [[Triggers|trigger brush]]) that "targets" that entity; <br />
# creating a button with the property "state_change_callback" "<script object>", which runs the script when pushed or triggered, <br />
# Using [[Location_Settings#Script_calls]] to call a script when you enter or leave a location; <br />
# triggering a script with the [[Objectives_Editor]] when you fulfill or fail an objective (possibly a hidden objective only for triggering the script); <br />
# A script can call another thread in itself with the "thread" function; see the command in the link below. <br />
# An entity can call a script when it spawns. Add a property/value either in the .def file or as a spawnarg on the entity: "ScriptEvent void <script object>(<parameters>);". <br />
# The script "void main();" is always called at game start. So if you add code under that heading in your script file, it will run at game start. <br />
There are other methods too. (Note, if you call a persistent script, i.e., it runs all game, be especially sure to avoid performance hits, or make it non-persistent if possible, that is, you "kill" it at some point in the game so it doesn't hog resources.)<br />
<br />
== Interfacing with the SDK ==<br />
<br />
No language can operate usefully in a vacuum - at some point it needs to go out and do stuff.<br />
<br />
'''TODO:''' Describe the various ways in which the SDK can interface with Doom 3 scripts; scriptevents, scriptvars (instances of idScriptVar), etc.<br />
<br />
Vanilla Doom 3 script reference: https://modwiki.xnet.fi/Script_events_%28Doom_3%29<br />
<br />
Also need refs for Dark Mod's scriptevents.<br />
<br />
== Things that don't exist in scripting ==<br />
<br />
This is a non-comprehensive list of things that don't exist, but may be expected or known from other languages:<br />
<br />
* structs<br />
* pointers (including dereference operators ->, *)<br />
* integers (use floats instead)<br />
* arrays (including the array operator[])<br />
* exceptions<br />
* "crashes" (you cannot call scriptEvents on entities, which do not have the event - the script will not compile and TDM will not load)<br />
* char data types, which implies that const char* is also missing (use string instead)<br />
* private/public/protected<br />
* multiple inheritance<br />
<br />
== See also ==<br />
<br />
* [[My first map script]]<br />
<br />
{{scripting}}<br />
{{todo}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Scripting_basics&diff=17939
Scripting basics
2014-10-03T10:56:29Z
<p>Tels: update info</p>
<hr />
<div>TDM (Dooom 3) scripts are text files containing script code in a proprietary syntax. By convention, they are given a <tt>.script</tt> extension. Game-wide script files are located in the <tt>script</tt> directory, while map-specific script files are located in the same directory as the corresponding map.<br />
<br />
== Starting with scripting ==<br />
<br />
This article is an overview over the basics of scripting. If you are impatient and just want to implement a specific functionality, see [[My first map script]] for a start into scripting. <br />
<br />
== Syntax ==<br />
<br />
TDM scripts have a vaguely C++-like syntax, though they are nowhere near as powerful as C++. They have standard braces-and-semicolons syntax, and a notion of "classes". Class members are defined inside a class declaration and defined separately, rather like C++. Unlike C++, there are no separate header files; everything goes into one script file.<br />
<br />
Scripts have only a few data types:<br />
<br />
* <tt>float</tt> - A number, integer or floating point.<br />
* <tt>boolean</tt> - can be false or true.<br />
* <tt>string</tt> - A string (sequence of characters).<br />
* <tt>vector</tt> - Three numbers in one variable; useful for representing locations, velocities, etc.<br />
* <tt>entity</tt> - A reference to an entity (a pointer, in C++ parlance).<br />
<br />
Note the complete lack of a dedicated integer type (use <tt>float</tt> instead), or any ability to define complex data structures! If data structures are needed, they are typically created in the SDK and ''scriptevents'' (see below) are provided to allow scripts to manipulate them.<br />
<br />
For a more detailed specification of the script syntax, see [https://modwiki.xnet.fi/SCRIPT_%28file_format%29 Modwiki's SCRIPT file reference].<br />
<br />
=== The float data type ===<br />
All numeric values are stored in '''float''' data types, which is the only numeric type. Neither int, double nor short, unsigned or other numeric keywords known from C exist in D3 Scripting. Still, most of the operators are applicable, like ++, +, -, +=, *=, etc.<br />
<br />
=== The boolean data type ===<br />
The data type boolean can only hold two values, namely true or false (TRUE or FALSE work as well). Behind the scenes, this is just another float variable.<br />
<br />
Note: you can also use float as argument of conditional expressions, like this:<br />
float myFloat = 1; // this will evaluate to TRUE when used in conditional expr.<br />
if (myFloat) {<br />
// do something, <br />
}<br />
<br />
=== The string data type ===<br />
Strings hold sequences of characters, like the keys or values of entity spawnargs. Their use is quite intuitive, the + operator can be used to concatenate them:<br />
string myStr = $player1.getKey("name"); // Retrieve the value of the "name" spawnarg of the player entity<br />
myStr = "The name of player 1 is " + myStr + "\n";<br />
sys.println(myStr); // Print the text to the console<br />
<br />
=== The vector data type ===<br />
The data type vector implements a three-component vector. As arrays and their native operator [] is not implemented in D3 scripting, the elements of vectors are accessed like this:<br />
vector myVec; // declare a new vector<br />
myVec_x = 20;<br />
myVec_y = 0;<br />
myVec_z = 0;<br />
// myVec now holds the 3D vector <20,0,0><br />
Alternatively, you can assign a string to a vector variable, like this (the string gets converted correctly, but be sure to use '''single quotes'''):<br />
myVec = '0 10 0';<br />
As an example, the '''getOrigin()''' methods return a vector.<br />
<br />
=== The entity data type ===<br />
References to other entities are stored in the '''entity''' data type. Entities can be looked up by name, like this:<br />
entity myEnt; // declare myEnt to be of type entity<br />
myEnt = $player1; // Let myEnt refer to the player entity, which by convention has the name "player1".<br />
The entity data type can be compared to the pointers (that's also how they are stored internally) - there also exists a NULL entity, named '''$null_entity'''.<br />
<br />
=== The sys entity ===<br />
Script events always have to be called on an entity, like this:<br />
$player1.kill(); // kill the player<br />
However, there are a lot of scriptEvents which are unrelated to a specific entity, like cos(), sin(), spawn() and such. These "generic" events are invoked on the '''sys''' entity, like this:<br />
entity myLight = sys.spawn("light_moving"); // spawn a new light entity<br />
myLight.setOrigin($player1.getOrigin()); // move it to the point where the player is currently residing<br />
<br />
=== Script Events ===<br />
<br />
A script event is a pre-made object that does something for you, usually to some game item you specify, just when you write it in your code (like $item.eventX(); does X to item). Sometimes it wants parameters or arguments to run (the stuff in parentheses) and will give an error if you don't put the arguments in the parentheses in exactly the way it wants, with the right number of them & right data types, etc. And some of them return values too, especially the "get" functions, which are handed over to a variable (e.g., X = getValue();, now X has the value. If X is an entity, you can even act on X as if it's the entity itself. Just be sure the data type of X and Value are the same, e.g. float, or string, or entity, etc, or you'll get an error).<br />
<br />
'''Q. What are some common or useful script events for editing?'''<br />
<br />
'''A.''' A list of all Doom3 and TDM script events are listed in two files (open with a text editor): scripts/doom_events.script, scripts/tdm_events.script. Proper syntax for the Doom3 events is here [http://www.modwiki.net/wiki/Script_events_%28Doom_3%29]. Note that TDM has some of its own script events, like setFrobable (in the tdm_events.script list). A quick list of common or useful script events good for editing is here: [[Script_Events_User-Friendly_List]], with syntax and description, and including TDM events. It doesn't list all script events and all details, just common & useful ones for actual mapping IMO.<br />
<br />
You can find a list of existing script events in the following file:<br />
<br />
* scripts/tdm_events.script<br />
<br />
== Discovery (or, why is TDM ignoring my script file?) ==<br />
<br />
TDM will automatically find and load some kinds of files, such as .def files. However, it does not do the same for script files; if you merely create a .script file and place it in the <tt>script</tt> directory, it will be not loaded.<br />
<br />
There are two ways to use a script:<br />
<br />
* Place it in a map script. '''This is the recommended way for mappers'''. Map scripts are loaded when the corresponding map is loaded. They must be given the same name and placed in the same location as the corresponding map file, but with a .script extension instead of a .map extension. For example, the map script for <tt>maps/mydir/mymap.map</tt> must be called <tt>maps/mydir/mymap.script</tt>. Map scripts are used to implement map-specific behaviours; as such, mappers will often use them but mod coders typically won't.<br />
<br />
* You can place your code in a file called <tt>script/tdm_custom_scripts.script</tt>. Never use '''<tt>script/tdm_main.script</tt>''' - this contains all the scripts that are provided by the main engine.<br />
<br />
Most of the TDM-specific scripts, including <tt>tdm_ai_base.script</tt>, are <tt>#include</tt>d from <tt>tdm_main.script</tt>. We could also put further <tt>#include</tt> directives into <tt>tdm_ai_base.script</tt>, and so on. As long as a script gets <tt>#include</tt>d at least once, it will get loaded in all maps. Note that you should be careful not to <tt>#include</tt> the same script twice, or TDM will complain about multiple definitions - one common way to avoid accidental double-inclusion is to place so-called "inclusion guards" in your script file (C/C++ programmers will be familiar with this kind of preprocessor trickery):<br />
#ifndef __TDM_YOUR_SCRIPT_NAME__<br />
#define __TDM_YOUR_SCRIPT_NAME__<br />
<br />
// your code here will get included exactly once<br />
<br />
#endif //__YOUR_SCRIPT_NAME__<br />
<br />
== Script invocation ==<br />
<br />
'''TODO:''' Describe the various ways in which functions in script files can get called.<br />
<br />
{{infobox|The <tt>tdm_main</tt> function in <tt>script/tdm_main.script</tt> will be called right before the level starts to load. It's not recommended to put map-specific scripting in there. For map-specific script setup, use the map's own script file and place a <tt>void main()</tt> function in there, which will get called by the game.}}<br />
<br />
In addition to using your own <tt>main()</tt> function, make sure you first add a <tt>sys.waitFrame()</tt> in it. Otherwise the <tt>init()</tt> function from some scriptobjects has not been run, and you can get strange bugs from uninitialized variables:<br />
<br />
<pre><br />
void main()<br />
{<br />
sys.waitFrame(); // wait for init() routines to finish<br />
// add your code below:<br />
}<br />
</pre><br />
<br />
=== How do I run a script in-game? ===<br />
<br />
A few common ways of calling a script object thread in-game are <br />
# creating a target_callscriptfunction entity with the spawnarg: "call" "<name of your script object>", then creating some other entity (such as a button or [[Triggers|trigger brush]]) that "targets" that entity; <br />
# creating a button with the property "state_change_callback" "<script object>", which runs the script when pushed or triggered, <br />
# Using [[Location_Settings#Script_calls]] to call a script when you enter or leave a location; <br />
# triggering a script with the [[Objectives_Editor]] when you fulfill or fail an objective (possibly a hidden objective only for triggering the script); <br />
# A script can call another thread in itself with the "thread" function; see the command in the link below. <br />
# An entity can call a script when it spawns. Add a property/value either in the .def file or as a spawnarg on the entity: "ScriptEvent void <script object>(<parameters>);". <br />
# The script "void main();" is always called at game start. So if you add code under that heading in your script file, it will run at game start. <br />
There are other methods too. (Note, if you call a persistent script, i.e., it runs all game, be especially sure to avoid performance hits, or make it non-persistent if possible, that is, you "kill" it at some point in the game so it doesn't hog resources.)<br />
<br />
== Interfacing with the SDK ==<br />
<br />
No language can operate usefully in a vacuum - at some point it needs to go out and do stuff.<br />
<br />
'''TODO:''' Describe the various ways in which the SDK can interface with Doom 3 scripts; scriptevents, scriptvars (instances of idScriptVar), etc.<br />
<br />
Vanilla Doom 3 script reference: https://modwiki.xnet.fi/Script_events_%28Doom_3%29<br />
<br />
Also need refs for Dark Mod's scriptevents.<br />
<br />
== Things that don't exist in scripting ==<br />
<br />
This is a non-comprehensive list of things that don't exist, but may be expected or known from other languages:<br />
<br />
* structs<br />
* pointers (including dereference operators ->, *)<br />
* integers (use floats instead)<br />
* arrays (including the array operator[])<br />
* exceptions<br />
* "crashes" (you cannot call scriptEvents on entities, which do not have the event - the script will not compile and TDM will not load)<br />
* char data types, which implies that const char* is also missing (use string instead)<br />
* private/public/protected<br />
* multiple inheritance<br />
<br />
== See also ==<br />
<br />
* [[My first map script]]<br />
<br />
{{scripting}}<br />
{{todo}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=My_first_map_script&diff=17938
My first map script
2014-10-03T10:56:09Z
<p>Tels: add note about init()</p>
<hr />
<div>== Create the script file ==<br />
<br />
If your map is called for example '''maps/mydir/mymap.map''', you must create a text file '''maps/mydir/mymap.script'''.<br />
<br />
== The contents ==<br />
<br />
The map script needs to contain a main function. This function is called at the very start of your map, e.g. when the map is loaded for the first time. So if you want something to happen later, you need to pause the script and then do something. Here is an example:<br />
<br />
<pre><br />
// This is a comment and gets ignored by the script engine<br />
<br />
// the main function does not take arguments nor returns something<br />
void main () { <br />
<br />
sys.waitFrame(); // always wait one frame before doing anything in main()<br />
// this ensures that the init() routines have all finished<br />
<br />
sys.wait(100); // wait 100 seconds<br />
<br />
/* $entityName here acts upon a specific entity. Be careful, if you rename<br />
the entity in DR, your script will break! $player1 is the player entity,<br />
and this only works in single player mode. However, there is no multiplayer<br />
in TDM, so we can safely use it for now: */<br />
<br />
// put some information in the console<br />
sys.println("Going to kill the entity " + $player1.getName() );<br />
<br />
$player1.kill(); // kill the player<br />
}<br />
</pre><br />
<br />
Other useful things:<br />
<br />
* $entity.remove() - removes an entity from the game<br />
* sys.waitFrame() - waits until the next frame<br />
<br />
== Includes ==<br />
<br />
To organize your scripts, you can put different parts, for instance routines, into their own file and then include it. <br />
<br />
<pre><br />
#include script/myscript.script<br />
</pre><br />
<br />
{{infobox|Note: These include lines '''MUST''' go into a file called '''script/tdm_custom_scripts.script''' (and not your main map script), otherwise savegames cannot be loaded back!}}<br />
<br />
== See also ==<br />
<br />
* [[Scripting basics]]<br />
<br />
{{scripting}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Template:Whatsnew&diff=17937
Template:Whatsnew
2014-10-03T08:54:46Z
<p>Tels: add v1.08</p>
<hr />
<div><noinclude><br />
This template displays a "See also" section with links to other changelogs. Also:{{template-help|name=whatsnew|sort=Whatsnew}}<br />
<br />
Here is a preview:<br />
-----<br />
== See also ==<br />
<br />
* '''[[What's new in TDM 2.02]]''' (Older releases: [[What's new in TDM 2.01|v2.01]], [[What's new in TDM 2.00|v2.00]], [[What's new in TDM 1.08|v1.08]], [[What's new in TDM 1.07|v1.07]], [[What's new in TDM 1.06|v1.06]], [[What's new in TDM 1.05|v1.05]], [[What's new in TDM 1.04|v1.04]], [[What's new in TDM 1.03|v1.03]], [[What's new in TDM 1.02|v1.02]], [[What's new in TDM 1.01|v1.01]])<br />
<br />
</noinclude><br />
<includeonly><br />
== See also ==<br />
<br />
* '''[[What's new in TDM 2.02]]''' (Older releases: [[What's new in TDM 2.01|v2.01]], [[What's new in TDM 2.00|v2.00]], [[What's new in TDM 1.08|v1.08]], [[What's new in TDM 1.07|v1.07]], [[What's new in TDM 1.06|v1.06]], [[What's new in TDM 1.05|v1.05]], [[What's new in TDM 1.04|v1.04]], [[What's new in TDM 1.03|v1.03]], [[What's new in TDM 1.02|v1.02]], [[What's new in TDM 1.01|v1.01]])<br />
* [http://thedarkmod.com/downloads.php Download TDM]<br />
<br />
[[Category:What's New|{{{sort|{{PAGENAME}}}}}]]<br />
</includeonly></div>
Tels
https://wiki.thedarkmod.com/index.php?title=Template:Whatsnew&diff=17936
Template:Whatsnew
2014-10-03T08:53:27Z
<p>Tels: a better list of versions (shorter)</p>
<hr />
<div><noinclude><br />
This template displays a "See also" section with links to other changelogs. Also:{{template-help|name=whatsnew|sort=Whatsnew}}<br />
<br />
Here is a preview:<br />
-----<br />
== See also ==<br />
<br />
* '''[[What's new in TDM 2.02]]''' (Older releases: [[What's new in TDM 2.01|v2.01]], [[What's new in TDM 2.00|v2.00]], [[What's new in TDM 1.07|v1.07]], [[What's new in TDM 1.06|v1.06]], [[What's new in TDM 1.05|v1.05]], [[What's new in TDM 1.04|v1.04]], [[What's new in TDM 1.03|v1.03]], [[What's new in TDM 1.02|v1.02]], [[What's new in TDM 1.01|v1.01]])<br />
<br />
</noinclude><br />
<includeonly><br />
== See also ==<br />
<br />
* '''[[What's new in TDM 2.02]]''' (Older releases: [[What's new in TDM 2.01|v2.01]], [[What's new in TDM 2.00|v2.00]], [[What's new in TDM 1.07|v1.07]], [[What's new in TDM 1.06|v1.06]], [[What's new in TDM 1.05|v1.05]], [[What's new in TDM 1.04|v1.04]], [[What's new in TDM 1.03|v1.03]], [[What's new in TDM 1.02|v1.02]], [[What's new in TDM 1.01|v1.01]])<br />
* [http://thedarkmod.com/downloads.php Download TDM]<br />
<br />
[[Category:What's New|{{{sort|{{PAGENAME}}}}}]]<br />
</includeonly></div>
Tels
https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.03&diff=17935
What's new in TDM 2.03
2014-10-03T08:48:35Z
<p>Tels: add not-released header</p>
<hr />
<div><!-- keywords whats new --><br />
See the [http://bugs.thedarkmod.com/roadmap_page.php?version_id=66 roadmap] on our bugtracker.<br />
<!--See also the [http://bugs.thedarkmod.com/changelog_page.php changelog] on our bugtracker.--><br />
{{notreleasedyet|2.03}}<br />
<!--{{released|2.03|2014-0x-0x}}--><br />
== AI ==<br />
<br />
* AI will react if they are hit by an opening door (grayman)<br />
<br />
== Coding ==<br />
<br />
* The loading bar now accurate reflects the amount of time it takes a mission to load (grayman)<br />
* the LOD system has been extended to cover AI and animated objects (SteveL)<br />
<br />
== Assets ==<br />
<br />
* numerous new models and skins have been added to the mod (Springheel)<br />
* several new light entities have been added (Springheel)<br />
* A number of entities are now using the LOD system by default, allowing for higher poly models close up (Springheel)<br />
* loot textures have been given more shine to make them a bit easier to pick out (Springheel)<br />
<br />
== GUIs ==<br />
<br />
* Main menu now lists the currently installed mission (grayman)<br />
<br />
== Scripting ==<br />
<br />
* Various script events for string manipulation have been added. (Tels)<br />
<br />
<!--<br />
== Internationalization (I18N) ==<br />
<br />
* Updated the German translation. (Tels)<br />
* Swedish can now be selected in the menu (the translation is still missing). (Tels)<br />
--><br />
<br />
{{whatsnew|sort=203}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=What%27s_New_in_2.03&diff=17934
What's New in 2.03
2014-10-03T08:45:05Z
<p>Tels: Tels moved page What's New in 2.03 to What's new in TDM 2.03: Make titles consistent</p>
<hr />
<div>#REDIRECT [[What's new in TDM 2.03]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.03&diff=17933
What's new in TDM 2.03
2014-10-03T08:45:05Z
<p>Tels: Tels moved page What's New in 2.03 to What's new in TDM 2.03: Make titles consistent</p>
<hr />
<div><!-- keywords whats new --><br />
See the [http://bugs.thedarkmod.com/roadmap_page.php?version_id=66 roadmap] on our bugtracker.<br />
<!--See also the [http://bugs.thedarkmod.com/changelog_page.php changelog] on our bugtracker.--><br />
<br />
== AI ==<br />
<br />
* AI will react if they are hit by an opening door (grayman)<br />
<br />
== Coding ==<br />
<br />
* The loading bar now accurate reflects the amount of time it takes a mission to load (grayman)<br />
* the LOD system has been extended to cover AI and animated objects (SteveL)<br />
<br />
== Assets ==<br />
<br />
* numerous new models and skins have been added to the mod (Springheel)<br />
* several new light entities have been added (Springheel)<br />
* A number of entities are now using the LOD system by default, allowing for higher poly models close up (Springheel)<br />
* loot textures have been given more shine to make them a bit easier to pick out (Springheel)<br />
<br />
== Guis ==<br />
<br />
* Main menu now lists the currently installed mission (grayman)<br />
<br />
== Scripting ==<br />
<br />
* Various script events for string manipulation have been added. (Tels)<br />
<br />
<!--<br />
== Internationalization (I18N) ==<br />
<br />
* Updated the German translation. (Tels)<br />
* Swedish can now be selected in the menu (the translation is still missing). (Tels)<br />
--><br />
<br />
{{whatsnew|sort=203}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.02&diff=17932
What's new in TDM 2.02
2014-10-03T08:44:09Z
<p>Tels: add the release tag</p>
<hr />
<div><!-- keywords whats new --><br />
See also the [http://bugs.thedarkmod.com/changelog_page.php?version_id=65 changelog] on our bugtracker.<br />
{{released|2.02|2014-05-29}}<br />
<br />
== AI ==<br />
<br />
* AI will now notice if you blatantly interrupt a door they are opening or closing. (grayman)<br />
* AI now have a chance to make comments about being pickpocketed, and become more suspicious if they notice something during the player's pickpocket attempt (grayman)<br />
* AI process lights more accurately when looking for bodies, loot, etc. (grayman)<br />
* AI will now be able to use buttons and switches when operating doors. (grayman)<br />
<br />
== Code ==<br />
<br />
* A "bunny-hopping" exploit that allowed silent crouch-jumping has been fixed (SteveL)<br />
* A bug that was causing loud sounds to drop off more quickly than they should in a number of maps has been fixed. AI will now react more appropriately to noise arrows and yells for help. (grayman)<br />
* An exploit that allowed players to push or block AI with movable objects has been fixed (grayman)<br />
* An "AI Hearing" slider has been added to the Settings menu (grayman)<br />
* Blackjacking from inside the optimal range is less likely to fail (New Horizon)<br />
* New script events allow map scripts to access mission statistics: number of KOs, stealth score etc (Zbyl)<br />
<br />
== Assets ==<br />
<br />
* New "Moor" character models have been added (Springheel)<br />
* New "Moor" vocal set (script: Springheel, Acting: Goldwell)<br />
* a few new architectural models/textures (Springheel)<br />
* lean and urinate animations (Sotha)<br />
<br />
{{whatsnew|sort=202}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.01&diff=17931
What's new in TDM 2.01
2014-10-03T08:42:59Z
<p>Tels: fix headline levels and category sorting</p>
<hr />
<div><!-- keywords whats new --><br />
See also the [http://bugs.thedarkmod.com/changelog_page.php?version_id=63 changelog] on our bugtracker.<br />
{{released|2.01|2014-01-29}}<br />
<br />
== AI ==<br />
<br />
* Graphical improvements: Most female characters have been updated with better rigging, improved meshes and textures. ''(Springheel)''<br />
* All female heads and a couple male heads have been improved. ''(Springheel)''<br />
* Revenants slightly more resistant to sword blows; more vulnerable to holy water.<br />
* Skeletons more vulnerable to holy water.<br />
<br />
<br />
== Combat ==<br />
<br />
* Some new weapon sounds added. ''(Springheel)''<br />
* AI far more likely to lunge forward while attacking, making it more difficult to dodge by running backwards. ''(Springheel)''<br />
* Bug that caused AI to do double damage when hitting player has been fixed ''(grayman)''<br />
* Slight adjustments to combat difficulty settings to make lower setting easier and higher setting harder. ''(Springheel)''<br />
<br />
<br />
== Code ==<br />
<br />
* Calling folder something other than "darkmod" will no longer cause error when loading games. ''(taaaki)''<br />
* Fixes to the way AI detect bodies. ''(grayman)'' <br />
* Hitting "use" while reading static readable no longer consumes inventory item. ''(grayman)'' <br />
<br />
<br />
== Assets ==<br />
<br />
* New dungeon chain models added ''(HMart)''<br />
<br />
{{whatsnew|sort=201}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.02&diff=17930
What's new in TDM 2.02
2014-10-03T08:42:03Z
<p>Tels: fix headline levels (use level 2) and category sorting</p>
<hr />
<div><!-- keywords whats new --><br />
<!-- keywords whats new --><br />
See also the [http://bugs.thedarkmod.com/changelog_page.php?version_id=65 changelog] on our bugtracker.<br />
<br />
<br />
== AI ==<br />
<br />
* AI will now notice if you blatantly interrupt a door they are opening or closing. (grayman)<br />
* AI now have a chance to make comments about being pickpocketed, and become more suspicious if they notice something during the player's pickpocket attempt (grayman)<br />
* AI process lights more accurately when looking for bodies, loot, etc. (grayman)<br />
* AI will now be able to use buttons and switches when operating doors. (grayman)<br />
<br />
== Code ==<br />
<br />
* A "bunny-hopping" exploit that allowed silent crouch-jumping has been fixed (SteveL)<br />
* A bug that was causing loud sounds to drop off more quickly than they should in a number of maps has been fixed. AI will now react more appropriately to noise arrows and yells for help. (grayman)<br />
* An exploit that allowed players to push or block AI with movable objects has been fixed (grayman)<br />
* An "AI Hearing" slider has been added to the Settings menu (grayman)<br />
* Blackjacking from inside the optimal range is less likely to fail (New Horizon)<br />
* New script events allow map scripts to access mission statistics: number of KOs, stealth score etc (Zbyl)<br />
<br />
== Assets ==<br />
<br />
* New "Moor" character models have been added (Springheel)<br />
* New "Moor" vocal set (script: Springheel, Acting: Goldwell)<br />
* a few new architectural models/textures (Springheel)<br />
* lean and urinate animations (Sotha)<br />
<br />
{{whatsnew|sort=202}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.03&diff=17929
What's new in TDM 2.03
2014-10-03T08:37:08Z
<p>Tels: fix headline levels (level 1 is reserved for the main article name), add roadmap link, correct sorting in category, add script events new</p>
<hr />
<div><!-- keywords whats new --><br />
See the [http://bugs.thedarkmod.com/roadmap_page.php?version_id=66 roadmap] on our bugtracker.<br />
<!--See also the [http://bugs.thedarkmod.com/changelog_page.php changelog] on our bugtracker.--><br />
<br />
== AI ==<br />
<br />
* AI will react if they are hit by an opening door (grayman)<br />
<br />
== Coding ==<br />
<br />
* The loading bar now accurate reflects the amount of time it takes a mission to load (grayman)<br />
* the LOD system has been extended to cover AI and animated objects (SteveL)<br />
<br />
== Assets ==<br />
<br />
* numerous new models and skins have been added to the mod (Springheel)<br />
* several new light entities have been added (Springheel)<br />
* A number of entities are now using the LOD system by default, allowing for higher poly models close up (Springheel)<br />
* loot textures have been given more shine to make them a bit easier to pick out (Springheel)<br />
<br />
== Guis ==<br />
<br />
* Main menu now lists the currently installed mission (grayman)<br />
<br />
== Scripting ==<br />
<br />
* Various script events for string manipulation have been added. (Tels)<br />
<br />
<!--<br />
== Internationalization (I18N) ==<br />
<br />
* Updated the German translation. (Tels)<br />
* Swedish can now be selected in the menu (the translation is still missing). (Tels)<br />
--><br />
<br />
{{whatsnew|sort=203}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_Charset&diff=17896
I18N - Charset
2014-09-05T09:18:20Z
<p>Tels: add swedish and polish to the list of "what charset to use"</p>
<hr />
<div>== Introduction ==<br />
<br />
The D3 code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, special charsets are used. The fonts (Carleton for the menu f.i.) are build/patched so that the right characters appear in the right place.<br />
<br />
== Encodings ==<br />
<br />
=== all.lang ===<br />
<br />
This file is in '''UTF-8''', and converted with the help of the script '''devel/gen_lang.pl''':<br />
<br />
perl devel/gen_lang.pl<br />
<br />
This ensures that the generated language files are in their proper encodings (see below).<br />
<br />
=== All other language files ===<br />
<br />
Note that the language files (f.i. '''strings/german.lang''') as well as the readables and the FM dictionariaries are expected to be in the following encodings:<br />
<br />
* '''Czech''', '''Hungarian''', '''Slovak''', '''Polish:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-2 ISO-8859-2] ('''not WIN-1250!)<br />
* '''Russian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/Win-1251 WIN-1251]<br />
* '''French:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-15 ISO-8859-15]<br />
* '''All other languages:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1 ISO-8859-1] (German, Dutch, Danish, Swedish, Portuguese, etc.)<br />
<br />
<br />
{{infobox|The core dictionaries are automatically generated in the right encoding, but make sure that you use the right encoding for the FM dictionary, too!}}<br />
<br />
== Character remapping ==<br />
<br />
The characters are remapped upon loading the dictionary/readable, from their native encoding to the special one that TDM uses and that is described here. Responsible for the remapping are [[I18N - Character mapping|mapping files]], f.i. "strings/czech.map". If a map file for a specific language is not found, "strings/default.map" is used instead, if this is not found, no remapping takes place.<br />
<br />
See '''[[I18N - Character mapping|Character mapping]]''' for more information.<br />
<br />
== European Languages ==<br />
<br />
This mapping is used for European languages, f.i. '''Czech''', '''French''', '''German''', '''Spanish''', '''Portuguese''', '''Polish'''. Note that the double accented characters in Hungarian '''Ő, ő, Ű and ű''' look a bit different from '''Ö, ö, Ü and ü'''!<br />
<br />
In the table below, the original ISO 8859-1 characters are given in ''()'' below the TDM character.<br />
<br />
'''Color code:'''<br />
<br />
{{box|#f0d0d0|Character not displayed by TDM or not defined|Unusable}}{{box|#c0ffc0|Character displayed in v1.08 or newer|Usable in v1.08}}{{box|#d0d0f0|Changed from the ISO-8859-1 default|Changed}}<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 95%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!<br />
!…0<br />
!…1<br />
!…2<br />
!…3<br />
!…4<br />
!…5<br />
!…6<br />
!…7<br />
!…8<br />
!…9<br />
!…A<br />
!…B<br />
!…C<br />
!…D<br />
!…E<br />
!…F<br />
<br />
|-<br />
!0…<br />
|align='center' style='background: #f0d0d0'|00<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|01<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|02<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|03<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|04<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|05<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|06<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|07<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|08<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|09<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0F<br>'''–'''<br />
<br />
|-<br />
!1…<br />
|align='center' style='background: #f0d0d0'|10<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|11<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|12<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|13<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|14<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|15<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|16<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|17<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|18<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|19<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1F<br>'''–'''<br />
<br />
|-<br />
!2…<br />
|align='center'|20<br>'''&nbsp;'''<br />
|align='center'|21<br>'''!'''<br />
|align='center'|22<br>'''"'''<br />
|align='center'|23<br>'''#'''<br />
|align='center'|24<br>'''$'''<br />
|align='center'|25<br>'''%'''<br />
|align='center'|26<br>'''&'''<br />
|align='center'|27<br>'''''''<br />
|align='center'|28<br>'''('''<br />
|align='center'|29<br>''')'''<br />
|align='center'|2A<br>'''*'''<br />
|align='center'|2B<br>'''+'''<br />
|align='center'|2C<br>''','''<br />
|align='center'|2D<br>'''-'''<br />
|align='center'|2E<br>'''.'''<br />
|align='center'|2F<br>'''/'''<br />
<br />
|-<br />
!3…<br />
|align='center'|30<br>'''0'''<br />
|align='center'|31<br>'''1'''<br />
|align='center'|32<br>'''2'''<br />
|align='center'|33<br>'''3'''<br />
|align='center'|34<br>'''4'''<br />
|align='center'|35<br>'''5'''<br />
|align='center'|36<br>'''6'''<br />
|align='center'|37<br>'''7'''<br />
|align='center'|38<br>'''8'''<br />
|align='center'|39<br>'''9'''<br />
|align='center'|3A<br>''':'''<br />
|align='center'|3B<br>''';'''<br />
|align='center'|3C<br>'''<'''<br />
|align='center'|3D<br>'''='''<br />
|align='center'|3E<br>'''>'''<br />
|align='center'|3F<br>'''?'''<br />
<br />
|-<br />
!4…<br />
|align='center'|40<br>'''@'''<br />
|align='center'|41<br>'''A'''<br />
|align='center'|42<br>'''B'''<br />
|align='center'|43<br>'''C'''<br />
|align='center'|44<br>'''D'''<br />
|align='center'|45<br>'''E'''<br />
|align='center'|46<br>'''F'''<br />
|align='center'|47<br>'''G'''<br />
|align='center'|48<br>'''H'''<br />
|align='center'|49<br>'''I'''<br />
|align='center'|4A<br>'''J'''<br />
|align='center'|4B<br>'''K'''<br />
|align='center'|4C<br>'''L'''<br />
|align='center'|4D<br>'''M'''<br />
|align='center'|4E<br>'''N'''<br />
|align='center'|4F<br>'''O'''<br />
<br />
|-<br />
!5…<br />
|align='center'|50<br>'''P'''<br />
|align='center'|51<br>'''Q'''<br />
|align='center'|52<br>'''R'''<br />
|align='center'|53<br>'''S'''<br />
|align='center'|54<br>'''T'''<br />
|align='center'|55<br>'''U'''<br />
|align='center'|56<br>'''V'''<br />
|align='center'|57<br>'''W'''<br />
|align='center'|58<br>'''X'''<br />
|align='center'|59<br>'''Y'''<br />
|align='center'|5A<br>'''Z'''<br />
|align='center'|5B<br>'''['''<br />
|align='center'|5C<br>'''\'''<br />
|align='center'|5D<br>''']'''<br />
|align='center'|5E<br>'''^'''<br />
|align='center'|5F<br>'''_'''<br />
<br />
|-<br />
!6…<br />
|align='center'|60<br>'''`'''<br />
|align='center'|61<br>'''a'''<br />
|align='center'|62<br>'''b'''<br />
|align='center'|63<br>'''c'''<br />
|align='center'|64<br>'''d'''<br />
|align='center'|65<br>'''e'''<br />
|align='center'|66<br>'''f'''<br />
|align='center'|67<br>'''g'''<br />
|align='center'|68<br>'''h'''<br />
|align='center'|69<br>'''i'''<br />
|align='center'|6A<br>'''j'''<br />
|align='center'|6B<br>'''k'''<br />
|align='center'|6C<br>'''l'''<br />
|align='center'|6D<br>'''m'''<br />
|align='center'|6E<br>'''n'''<br />
|align='center'|6F<br>'''o'''<br />
<br />
|-<br />
!7…<br />
|align='center'|70<br>'''p'''<br />
|align='center'|71<br>'''q'''<br />
|align='center'|72<br>'''r'''<br />
|align='center'|73<br>'''s'''<br />
|align='center'|74<br>'''t'''<br />
|align='center'|75<br>'''u'''<br />
|align='center'|76<br>'''v'''<br />
|align='center'|77<br>'''w'''<br />
|align='center'|78<br>'''x'''<br />
|align='center'|79<br>'''y'''<br />
|align='center'|7A<br>'''z'''<br />
|align='center'|7B<br>'''{'''<br />
|align='center'|7C<br>'''|'''<br />
|align='center'|7D<br>'''}'''<br />
|align='center'|7E<br>'''~'''<br />
|align='center' style='background: #f0d0d0'|7F<br>'''–'''<br />
<br />
|-<br />
!8…<br />
|align='center' style='background: #c0ffc0'|80<br>'''Ň'''<br />
|align='center' style='background: #c0ffc0'|81<br>'''Ś'''<br />
|align='center' style='background: #c0ffc0'|82<br>'''Ć'''<br />
|align='center' style='background: #c0ffc0'|83<br>'''Ż'''<br />
|align='center' style='background: #c0ffc0'|84<br>'''Ź'''<br />
|align='center' style='background: #c0ffc0'|85<br>'''Ŝ'''<br />
|align='center' style='background: #c0ffc0'|86<br>'''Ĉ'''<br />
|align='center' style='background: #c0ffc0'|87<br>'''Ẑ'''<br />
|align='center' style='background: #c0ffc0'|88<br>'''Ô'''<br />
|align='center' style='background: #c0ffc0'|89<br>'''Ŕ'''<br />
|align='center' style='background: #c0ffc0'|8A<br>'''Ǔ'''<br />
|align='center' style='background: #c0ffc0'|8B<br>'''Ă'''<br />
|align='center' style='background: #c0ffc0'|8C<br>'''Ń'''<br />
|align='center' style='background: #f0d0d0'|8D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|8E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|8F<br>'''–'''<br />
<br />
|-<br />
!9…<br />
|align='center' style='background: #f0d0d0'|90<br>'''–'''<br />
|align='center' style='background: #c0ffc0'|91<br>'''ś'''<br />
|align='center' style='background: #c0ffc0'|92<br>'''ć'''<br />
|align='center' style='background: #c0ffc0'|93<br>'''ż'''<br />
|align='center' style='background: #c0ffc0'|94<br>'''ź'''<br />
|align='center' style='background: #c0ffc0'|95<br>'''ŝ'''<br />
|align='center' style='background: #c0ffc0'|96<br>'''ĉ'''<br />
|align='center' style='background: #c0ffc0'|97<br>'''ẑ'''<br />
|align='center' style='background: #c0ffc0'|98<br>'''ô'''<br />
|align='center' style='background: #c0ffc0'|99<br>'''ŕ'''<br />
|align='center' style='background: #c0ffc0'|9A<br>'''ǔ'''<br />
|align='center' style='background: #c0ffc0'|9B<br>'''ă'''<br />
|align='center' style='background: #c0ffc0'|9C<br>'''ń'''<br />
|align='center' style='background: #f0d0d0'|9D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|9E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|9F<br>'''–'''<br />
<br />
|-<br />
!A…<br />
|align='center'|A0<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Non-breaking_space NBSP]'''<br />
|align='center' style='background: #d0d0f0'|A1<br>'''ň'''<br>(¡)'''<br />
|align='center' style='background: #d0d0f0'|A2<br>'''Ű'''<br>(¢)'''<br />
|align='center' style='background: #d0d0f0'|A3<br>'''ě'''<br>(£)'''<br />
|align='center' style='background: #d0d0f0'|A4<br>'''ű'''<br>(¤)'''<br />
|align='center' style='background: #d0d0f0'|A5<br>'''Ě'''<br>(¥)'''<br />
|align='center' style='background: #d0d0f0'|A6<br>'''Š'''<br>(¦)'''<br />
|align='center'|A7<br>'''§'''<br />
|align='center' style='background: #d0d0f0'|A8<br>'''š'''<br>(¨)'''<br />
|align='center' style='background: #d0d0f0'|A9<br>'''Ů'''<br>(©)'''<br />
|align='center' style='background: #d0d0f0'|AA<br>'''Ą'''<br>(ª)'''<br />
|align='center' style='background: #d0d0f0'|AB<br>'''Ę'''<br>(«)'''<br />
|align='center' style='background: #d0d0f0'|AC<br>'''Č'''<br>(¬)'''<br />
|align='center'|AD<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Soft_hyphen SHY]'''<br />
|align='center' style='background: #d0d0f0'|AE<br>'''č'''<br>(®)'''<br />
|align='center' style='background: #d0d0f0'|AF<br>'''ů'''<br>(¯)'''<br />
<br />
|-<br />
!B…<br />
|align='center' style='background: #d0d0f0'|B0<br>'''Ő'''<br>(°)'''<br />
|align='center' style='background: #d0d0f0'|B1<br>'''Ł'''<br>(±)'''<br />
|align='center' style='background: #d0d0f0'|B2<br>'''Ť'''<br>(²)'''<br />
|align='center' style='background: #d0d0f0'|B3<br>'''Ď'''<br>(³)'''<br />
|align='center' style='background: #d0d0f0'|B4<br>'''Ž'''<br>(´)'''<br />
|align='center' style='background: #d0d0f0'|B5<br>'''ł'''<br>(µ)'''<br />
|align='center' style='background: #d0d0f0'|B6<br>'''ť'''<br>(¶)'''<br />
|align='center' style='background: #d0d0f0'|B7<br>'''ď'''<br>(·)'''<br />
|align='center' style='background: #d0d0f0'|B8<br>'''ž'''<br>(¸)'''<br />
|align='center' style='background: #d0d0f0'|B9<br>'''ő'''<br>(¹)'''<br />
|align='center' style='background: #d0d0f0'|BA<br>'''ą'''<br>(º)'''<br />
|align='center' style='background: #d0d0f0'|BB<br>'''ę'''<br>(»)'''<br />
|align='center' style='background: #d0d0f0'|BC<br>'''Œ'''<br>(¼)'''<br />
|align='center' style='background: #d0d0f0'|BD<br>'''œ'''<br>(½)'''<br />
|align='center' style='background: #d0d0f0'|BE<br>'''Ÿ'''<br>(¾)'''<br />
|align='center'|BF<br>'''¿'''<br />
<br />
|-<br />
!C…<br />
|align='center'|C0<br>'''À'''<br />
|align='center'|C1<br>'''Á'''<br />
|align='center'|C2<br>'''Â'''<br />
|align='center'|C3<br>'''Ã'''<br />
|align='center'|C4<br>'''Ä'''<br />
|align='center'|C5<br>'''Å'''<br />
|align='center'|C6<br>'''Æ'''<br />
|align='center'|C7<br>'''Ç'''<br />
|align='center'|C8<br>'''È'''<br />
|align='center'|C9<br>'''É'''<br />
|align='center'|CA<br>'''Ê'''<br />
|align='center'|CB<br>'''Ë'''<br />
|align='center'|CC<br>'''Ì'''<br />
|align='center'|CD<br>'''Í'''<br />
|align='center'|CE<br>'''Î'''<br />
|align='center'|CF<br>'''Ï'''<br />
<br />
|-<br />
!D…<br />
|align='center'|D0<br>'''Ð'''<br />
|align='center'|D1<br>'''Ñ'''<br />
|align='center'|D2<br>'''Ò'''<br />
|align='center'|D3<br>'''Ó'''<br />
|align='center'|D4<br>'''Ô'''<br />
|align='center'|D5<br>'''Õ'''<br />
|align='center'|D6<br>'''Ö'''<br />
|align='center' style='background: #d0d0f0'|D7<br>'''Ř'''<br>(×)'''<br />
|align='center'|D8<br>'''Ø'''<br />
|align='center'|D9<br>'''Ù'''<br />
|align='center'|DA<br>'''Ú'''<br />
|align='center'|DB<br>'''Û'''<br />
|align='center'|DC<br>'''Ü'''<br />
|align='center'|DD<br>'''Ý'''<br />
|align='center'|DE<br>'''Þ'''<br />
|align='center'|DF<br>'''ß'''<br />
<br />
|-<br />
!E…<br />
|align='center'|E0<br>'''à'''<br />
|align='center'|E1<br>'''á'''<br />
|align='center'|E2<br>'''â'''<br />
|align='center'|E3<br>'''ã'''<br />
|align='center'|E4<br>'''ä'''<br />
|align='center'|E5<br>'''å'''<br />
|align='center'|E6<br>'''æ'''<br />
|align='center'|E7<br>'''ç'''<br />
|align='center'|E8<br>'''è'''<br />
|align='center'|E9<br>'''é'''<br />
|align='center'|EA<br>'''ê'''<br />
|align='center'|EB<br>'''ë'''<br />
|align='center'|EC<br>'''ì'''<br />
|align='center'|ED<br>'''í'''<br />
|align='center'|EE<br>'''î'''<br />
|align='center'|EF<br>'''ï'''<br />
<br />
|-<br />
!F…<br />
|align='center'|F0<br>'''ð'''<br />
|align='center'|F1<br>'''ñ'''<br />
|align='center'|F2<br>'''ò'''<br />
|align='center'|F3<br>'''ó'''<br />
|align='center'|F4<br>'''ô'''<br />
|align='center'|F5<br>'''õ'''<br />
|align='center'|F6<br>'''ö'''<br />
|align='center' style='background: #d0d0f0'|F7<br>'''ř'''<br>(÷)'''<br />
|align='center'|F8<br>'''ø'''<br />
|align='center'|F9<br>'''ù'''<br />
|align='center'|FA<br>'''ú'''<br />
|align='center'|FB<br>'''û'''<br />
|align='center'|FC<br>'''ü'''<br />
|align='center'|FD<br>'''ý'''<br />
|align='center'|FE<br>'''þ'''<br />
|align='center'|FF<br>'''ÿ'''<br />
<br />
|}<br />
<br />
== Russian ==<br />
<br />
The character '''0xFF''' (я) is mapped to '''0xB6''' upon loading. Therefore any Russian font must contain я at the place 0xB6.<br />
<br />
== Asian Languages (Korean, Chinese, Japanese) ==<br />
<br />
The original D3 had support for these languages, so it might be possible to add them to TDM, too. At the moment, however, we lack the fonts and translators. Also, writing from right-to-left (Hebrew) or top-down (Japanese) might be tricky or outright impossible in our GUI without more work in the C++ code.<br />
<br />
== Statistics ==<br />
<br />
Some of the special characters are used more often then others. Here is a statistic over the entire string set of the TDM core, showing the top 50 most-used characters (excluding a-z, 0-9 and russian characters):<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 85%" cellspacing=0 cellpadding=2<br />
<br />
|-<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
<br />
|-<br />
|1<br />
|í<br />
|715<br />
|<br />
|25<br />
|ć<br />
|67<br />
|<br />
<br />
|-<br />
|2<br />
|é<br />
|674<br />
|<br />
|26<br />
|è<br />
|65<br />
|<br />
<br />
|-<br />
|3<br />
|á<br />
|524<br />
|<br />
|27<br />
|ú<br />
|56<br />
|<br />
<br />
|-<br />
|4<br />
|ø<br />
|303<br />
|Danish<br />
|28<br />
|ê<br />
|52<br />
|<br />
<br />
|-<br />
|5<br />
|č<br />
|288<br />
|<br />
|29<br />
|ö<br />
|48<br />
|German<br />
<br />
|-<br />
|6<br />
|ó<br />
|283<br />
|<br />
|30<br />
|É<br />
|46<br />
|<br />
<br />
|-<br />
|7<br />
|ü<br />
|270<br />
|German<br />
|31<br />
|ñ<br />
|37<br />
|<br />
<br />
|-<br />
|8<br />
|ł<br />
|203<br />
|Polish<br />
|32<br />
|õ<br />
|32<br />
|<br />
<br />
|-<br />
|9<br />
|æ<br />
|200<br />
|Danish<br />
|33<br />
|ń<br />
|26<br />
|<br />
<br />
|-<br />
|10<br />
|ě<br />
|182<br />
|<br />
|34<br />
|Ł<br />
|24<br />
|<br />
<br />
|-<br />
|11<br />
|ř<br />
|175<br />
|Czech<br />
|35<br />
|Š<br />
|21<br />
|<br />
<br />
|-<br />
|12<br />
|ã<br />
|168<br />
|<br />
|36<br />
|â<br />
|21<br />
|<br />
<br />
|-<br />
|13<br />
|ž<br />
|148<br />
|Czech<br />
|37<br />
|ź<br />
|20<br />
|<br />
<br />
|-<br />
|14<br />
|ý<br />
|142<br />
|<br />
|38<br />
|ß<br />
|18<br />
|German<br />
<br />
|-<br />
|15<br />
|ę<br />
|141<br />
|<br />
|39<br />
|Ó<br />
|18<br />
|<br />
<br />
|-<br />
|16<br />
|ą<br />
|140<br />
|<br />
|40<br />
|ň<br />
|15<br />
|<br />
<br />
|-<br />
|17<br />
|ż<br />
|119<br />
|<br />
|41<br />
|Ú<br />
|15<br />
|<br />
<br />
|-<br />
|18<br />
|å<br />
|109<br />
|Danish<br />
|42<br />
|Á<br />
|13<br />
|<br />
<br />
|-<br />
|19<br />
|š<br />
|99<br />
|<br />
|43<br />
|î<br />
|12<br />
|<br />
<br />
|-<br />
|20<br />
|ś<br />
|97<br />
|<br />
|44<br />
|ť<br />
|11<br />
|<br />
<br />
|-<br />
|21<br />
|ç<br />
|91<br />
|<br />
|45<br />
|ô<br />
|9<br />
|<br />
<br />
|-<br />
|22<br />
|ä<br />
|86<br />
|German<br />
|46<br />
|Ž<br />
|8<br />
|<br />
<br />
|-<br />
|23<br />
|à<br />
|83<br />
|<br />
|47<br />
|Ż<br />
|7<br />
|<br />
<br />
|-<br />
|24<br />
|ů<br />
|77<br />
|<br />
|48<br />
|Č<br />
|7<br />
|<br />
<br />
|-<br />
|25<br />
|ć<br />
|67<br />
|<br />
|49<br />
|ù<br />
|6<br />
|<br />
<br />
|}<br />
<br />
Althought ö, ä and ü do not appear that often, with only these and Ü, Ö, Ä and ß, the entire German language works. So adding these letters is quite important.<br />
<br />
[[Category:Fonts]]<br />
<br />
{{i18n}}* [[Font Patcher]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Internationalization&diff=17895
Internationalization
2014-09-05T08:59:15Z
<p>Tels: combine two sections</p>
<hr />
<div>This article deals with the localisation/translation of both TDM itself, as well as [[Fan Missions]].<br />
<br />
{{infobox|{{red|The I18N support in TDM will only work with v1.07 or newer.}}}}<br />
<br />
== I18N, L10N? ==<br />
<br />
I18N stands for '''internationalisation''' (the 18 means there are 18 letters missing between I and N), and L10N stands for '''localisation'''.<br />
<br />
In TDM this means that both the menu, the HUD and all the readable content (shown in in-game GUIs) in a mission can be shown in the language the user selects.<br />
<br />
{{infobox|Note: There is not yet support for subtitles. This will come with the next version.}}<br />
<br />
== For Users ==<br />
<br />
You can switch the language of TDM in the '''Settings''' menu under '''Video''', '''General'''. The language is stored in the CVAR '''sys_lang''' (Note: in v1.07, it was stored in tdm_lang).<br />
<br />
Switching the language does not require a restart, except for switching between Russian and Western languages. There the game will inform you that you need to restart it manually, or the display will not look correct.<br />
<br />
Changing the language will change the language of the HUD, as well as the inventory immidiately. It can also be done during a mission. <br />
<br />
<br />
{{infobox|'''Note:''' Not all FMs are yet multi-lingual, and for these certain inventory items, the objectives, or readables might appear in English. See the '''[[I18N Status|list of already internationalized FMs]]''' and their status.}}<br />
<br />
<br />
== For Mappers ==<br />
<br />
As a mapper, you want to reach an audience as wide as possible with your FM. One way is to provide alternative language versions of your map. There are two ways that can be achieved:<br />
<br />
# You can ignore the issue, and hope that somebody else modifies your FM and provides a translation. The past shows that the changes that someone does this are slim, tho. Only a handful of FMs were every translated, most of them only into one other language. That is because modifying and translating an FM are quite a lot of work, and translators would rather just translate things than to muck around with your PK4 file.<br />
# You can (from v1.07 on) build in support for translation from the beginning, and make the work for translators easier.<br />
<br />
The second point can achieved in two ways:<br />
<br />
# You build the FM with hard-coded strings like 'Silver Key', and then use [[I18N.pl]] to transform the FM into a package that can have external dictionaries. That might be easier to work with in DR (as DR itself has no support for dictionaries yet), but the script might not be 100% correct and you may need to manually help it out. However, this is a step that needs to be done only once.<br />
# You build your FM with string templates like '''"#str_23456"''' (use the range 20000 … 89999) instead of hard-coded names, and supply an external dictionary with these strings.<br />
<br />
In both cases, translating your mission becomes super easy, there is only one file with all the strings in place, and this can be easily edited.<br />
<br />
=== FM specific dictionaries ===<br />
<br />
Please see the main article about [[I18N - Translating Fan Missions|about translating FMs]] for details.<br />
<br />
=== Choosing Names ===<br />
<br />
The TDM core dictionary contains a lot of strings, both for inventory items like keys, for locations, monster names, jobs, titles and descriptions. If possible, use one of these names. That has the advantage that the translation is already provided in many languages. For instance, instead of "a silvery key", use if possible "Silver Key" (if you plan on converting your mission with [[I18N.pl]]) or "#str_10000" (if you are doing it manually).<br />
<br />
Browse through ''strings/all.lang'' to see which strings are available.<br />
<br />
=== Inventory Item Names with multiple lines ===<br />
<br />
If you have an inventor item name which is very long, you can insert '''\n''' to split it up into two (but not more!) lines:<br />
<br />
"#str_20000" "This is a very very\nlong item name."<br />
<br />
You should try in the game to see how it looks, so that both lines are roughly the same length.<br />
<br />
=== Support in DR ===<br />
<br />
Darkradiant currently does not support the dictionaries, so strings will look like "#str_07118" instead of the "OK". This is tracked here: http://bugs.angua.at/view.php?id=2845<br />
<br />
<br />
== For Developers ==<br />
<br />
=== CVAR tdm_lang ===<br />
<br />
'''tdm_lang''' was only used before TDM 2.0 and is obsolete.<br />
<br />
=== CVAR sys_lang ===<br />
<br />
The [[CVAR]] '''sys_lang''' contains the current language as English lower-case string, e.g. "english", "german", "portuguese" etc. This variable is controlled by the GUI via a call back into the SDK code, which switches the language underneath, and also reloads the GUI.<br />
<br />
{{infobox|If you change the CVAR manually (via the console f.i.), you need to restart TDM so it works!}}<br />
<br />
=== Code ===<br />
<br />
The main translation object is of the class CI18N (which is short for "Class Internationalization") and lives in ''framework/I18N.cpp'' and ''framework/I18N.h'' (in v1.07, it was in ''Darkmod/I18N.cpp'' and ''Darkmod/I18N.h'').<br />
<br />
=== Charset ===<br />
<br />
The TDM (old D3) code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, an special charset (based on ISO 8859-1 with modifications) is used. The details can be found [[I18N - Charset|on this page]].<br />
<br />
=== New Strings ===<br />
<br />
If you need to add a new string, follow these steps:<br />
<br />
* search for a fitting, free ID in '''strings/all.lang'''.<br />
* Add your string there. If possible, add any translation you can, or ask the translators to translate it for you.<br />
* re-generate the language files with '''perl devel/gen_lang.pl'''<br />
<br />
Note that if the translations for the new strings (or any other string) are missing, the script will substitute the English variant - so you should always have at least the English variant.<br />
<br />
The other translations are optional, but if they are added later, you need to re-run '''perl devel/gen_lang.pl'''! See also the next point:<br />
<br />
{{infobox|{{red|Always edit all.lang with a UTF-8 editor and keep it in UTF-8.}}}}<br />
<br />
{{infobox|{{red|Never edit the other language files manually, they will be regenerated and your edits will be lost.}}}}<br />
<br />
=== Adding a new i18n language ===<br />
The TDM i18n system works by having the translated strings given individual numbers. These numbers are included from separate language files at compile time, and then replaced with the language strings at runtime.<br />
<br />
==== Relevant files ====<br />
<br />
* all.lang - all the languages<br />
* devel/gen_lang.pl - perl script for breaking up the all.lang master file<br />
* (language).lang - the individual language files, eg english.lang or german.lang<br />
* (language).map - a [[character mapping file]], eg german.map<br />
<br />
==== Very basic overview of the process ====<br />
<br />
* Edit the file "all.lang". Just copy the english language section to the end of the file and rename the new section. '''Make sure you use a Unicode editor and all.lang stays in UTF-8!'''<br />
* Add the correct entry for the language name in '''strings/all.lang''' after the names in the range of 2460 .. 2500 (unless it already exists). The language name is to be expected in the local name, e.g. it is "Deutsch" in the english translation<br />
, not "German". If the language name contains characters that cannot be represented in the current charset of the language, please use either the special characters from ISO-8859-1, or an translitertion like "Bulgarian"<br />
* if possible, add the same entries in languages that do not use ISO-8859-1<br />
* Run the perl script '''devel/gen_lang.pl''' To do this, you need to have commit access to the developer SVN. This will "break up" the all.lang file into separate files for each translated language.<br />
* If nec, create a new ".map" file by copying one of the existing .map files in "strings/".<br />
* Add the new ".lang" file (and possible ".map" file) to SVN.<br />
<br />
The new strings should now be accessible at the next start of TDM.<br />
<br />
=== Missing Translations ===<br />
<br />
The following will generate files called "missing_language.txt" in the darkmod directory:<br />
<br />
perl devel/gen_lang.pl --missing<br />
<br />
Note that the script can no differentiate between a string that was not translated, and a string that is the same even after translation. An example is "Normal" in English, and German. This will be listed as missing string in '''missing_german.txt'''.<br />
<br />
To avoid that, add the following comment:<br />
<br />
"#str_03005" "Normal" // stays the same<br />
<br />
to each language variant where the string is unchanged after translation.<br />
<br />
Since it can be a bother to ask translators for a new string translation every other day, the current solution is to gather strings for a while, then regenerate the missing_xyz.txt files, and then ask the translators for a translation.<br />
<br />
See also the [[I18N - List of TDM translators|List of TDM translators]].<br />
<br />
=== Relocating String IDs ===<br />
<br />
{{infobox|Note: Relocation of string IDs can only be done either before release, or when it is clear that this string is not used by any FM, otherwise you break FMs!}}<br />
<br />
perl devel/rename_string.pl FIRSTOLDID FRISTNEWID COUNT<br />
<br />
Example:<br />
<br />
perl devel/rename_string.pl 2236 2298 2<br />
<br />
=== GUI ===<br />
<br />
In v1.07 there was a bug in '''choiceDef''' inside the GUI, which did not allow other characters than a-z. To work around this '''choiceDef''' bug, two new main menu commands were added, called "initChoice" and "stepChoice". However, for v1.08, the bug is fixed in the main code (due to the source code now being available), so the work-arounds were removed.<br />
<br />
<br />
== Known bugs ==<br />
<br />
At the moment only a few things are still not working:<br />
<br />
* Not all fonts contain accented characters yet.<br />
* [[Darkradiant]] does not support the '''#str_01234''' strings yet.<br />
* Doom3 does not render/support all characters (f.i. 0xFF in Russian, 0xF7 .. 0x9F in Western). To work around this, the characters are remapped (moved) during load. See [[I18N - Charset]] for details on this.<br />
<br />
{{i18n}} {{editing}} {{sdk}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Internationalization&diff=17894
Internationalization
2014-09-05T08:55:07Z
<p>Tels: adding a new language, correction to CVAR</p>
<hr />
<div>This article deals with the localisation/translation of both TDM itself, as well as [[Fan Missions]].<br />
<br />
{{infobox|{{red|The I18N support in TDM will only work with v1.07 or newer.}}}}<br />
<br />
== I18N, L10N? ==<br />
<br />
I18N stands for '''internationalisation''' (the 18 means there are 18 letters missing between I and N), and L10N stands for '''localisation'''.<br />
<br />
In TDM this means that both the menu, the HUD and all the readable content (shown in in-game GUIs) in a mission can be shown in the language the user selects.<br />
<br />
{{infobox|Note: There is not yet support for subtitles. This will come with the next version.}}<br />
<br />
== For Users ==<br />
<br />
You can switch the language of TDM in the '''Settings''' menu under '''Video''', '''General'''. The language is stored in the CVAR '''sys_lang''' (Note: in v1.07, it was stored in tdm_lang).<br />
<br />
Switching the language does not require a restart, except for switching between Russian and Western languages. There the game will inform you that you need to restart it manually, or the display will not look correct.<br />
<br />
Changing the language will change the language of the HUD, as well as the inventory immidiately. It can also be done during a mission. <br />
<br />
<br />
{{infobox|'''Note:''' Not all FMs are yet multi-lingual, and for these certain inventory items, the objectives, or readables might appear in English. See the '''[[I18N Status|list of already internationalized FMs]]''' and their status.}}<br />
<br />
<br />
== For Mappers ==<br />
<br />
As a mapper, you want to reach an audience as wide as possible with your FM. One way is to provide alternative language versions of your map. There are two ways that can be achieved:<br />
<br />
# You can ignore the issue, and hope that somebody else modifies your FM and provides a translation. The past shows that the changes that someone does this are slim, tho. Only a handful of FMs were every translated, most of them only into one other language. That is because modifying and translating an FM are quite a lot of work, and translators would rather just translate things than to muck around with your PK4 file.<br />
# You can (from v1.07 on) build in support for translation from the beginning, and make the work for translators easier.<br />
<br />
The second point can achieved in two ways:<br />
<br />
# You build the FM with hard-coded strings like 'Silver Key', and then use [[I18N.pl]] to transform the FM into a package that can have external dictionaries. That might be easier to work with in DR (as DR itself has no support for dictionaries yet), but the script might not be 100% correct and you may need to manually help it out. However, this is a step that needs to be done only once.<br />
# You build your FM with string templates like '''"#str_23456"''' (use the range 20000 … 89999) instead of hard-coded names, and supply an external dictionary with these strings.<br />
<br />
In both cases, translating your mission becomes super easy, there is only one file with all the strings in place, and this can be easily edited.<br />
<br />
=== FM specific dictionaries ===<br />
<br />
Please see the main article about [[I18N - Translating Fan Missions|about translating FMs]] for details.<br />
<br />
=== Choosing Names ===<br />
<br />
The TDM core dictionary contains a lot of strings, both for inventory items like keys, for locations, monster names, jobs, titles and descriptions. If possible, use one of these names. That has the advantage that the translation is already provided in many languages. For instance, instead of "a silvery key", use if possible "Silver Key" (if you plan on converting your mission with [[I18N.pl]]) or "#str_10000" (if you are doing it manually).<br />
<br />
Browse through ''strings/all.lang'' to see which strings are available.<br />
<br />
=== Inventory Item Names with multiple lines ===<br />
<br />
If you have an inventor item name which is very long, you can insert '''\n''' to split it up into two (but not more!) lines:<br />
<br />
"#str_20000" "This is a very very\nlong item name."<br />
<br />
You should try in the game to see how it looks, so that both lines are roughly the same length.<br />
<br />
=== Support in DR ===<br />
<br />
Darkradiant currently does not support the dictionaries, so strings will look like "#str_07118" instead of the "OK". This is tracked here: http://bugs.angua.at/view.php?id=2845<br />
<br />
<br />
== For Developers ==<br />
<br />
=== CVAR tdm_lang ===<br />
<br />
'''tdm_lang''' was only used before TDM 2.0 and is obsolete.<br />
<br />
=== CVAR sys_lang ===<br />
<br />
The [[CVAR]] '''sys_lang''' contains the current language as English lower-case string, e.g. "english", "german", "portuguese" etc. This variable is controlled by the GUI via a call back into the SDK code, which switches the language underneath, and also reloads the GUI.<br />
<br />
{{infobox|If you change the CVAR manually (via the console f.i.), you need to restart TDM so it works!}}<br />
<br />
=== Code ===<br />
<br />
The main translation object is of the class CI18N (which is short for "Class Internationalization") and lives in ''framework/I18N.cpp'' and ''framework/I18N.h'' (in v1.07, it was in ''Darkmod/I18N.cpp'' and ''Darkmod/I18N.h'').<br />
<br />
=== Charset ===<br />
<br />
The TDM (old D3) code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, an special charset (based on ISO 8859-1 with modifications) is used. The details can be found [[I18N - Charset|on this page]].<br />
<br />
=== New Strings ===<br />
<br />
If you need to add a new string, follow these steps:<br />
<br />
* search for a fitting, free ID in '''strings/all.lang'''.<br />
* Add your string there. If possible, add any translation you can, or ask the translators to translate it for you.<br />
* re-generate the language files with '''perl devel/gen_lang.pl'''<br />
<br />
Note that if the translations for the new strings (or any other string) are missing, the script will substitute the English variant - so you should always have at least the English variant.<br />
<br />
The other translations are optional, but if they are added later, you need to re-run '''perl devel/gen_lang.pl'''! See also the next point:<br />
<br />
{{infobox|{{red|Always edit all.lang with a UTF-8 editor and keep it in UTF-8.}}}}<br />
<br />
{{infobox|{{red|Never edit the other language files manually, they will be regenerated and your edits will be lost.}}}}<br />
<br />
=== New Languages ===<br />
<br />
If you need to add a new language, follow these steps:<br />
<br />
* Add a section in '''strings/all.lang'''<br />
* add the correct entry for the language name in '''strings/all.lang''' after the names in the range of 2460 .. 2500 (unless it already exists). The language name is to be expected in the local name, e.g. it is "Deutsch" in the english translation<br />
, not "German". If the language name contains characters that cannot be represented in the current charset of the language, please use either the special characters from ISO-8859-1, or an translitertion like "Bulgarian"<br />
* if possible, add the same entries in languages that do not use ISO-8859-1<br />
* run '''perl devel/gen_lang.pl''' to generate the new "*.lang" file. <br />
* If nec, create a new ".map" file by copying one of the existing .map files in "strings/".<br />
* Add the new ".lang" file (and possible ".map" file) to SVN.<br />
<br />
=== Missing Translations ===<br />
<br />
The following will generate files called "missing_language.txt" in the darkmod directory:<br />
<br />
perl devel/gen_lang.pl --missing<br />
<br />
Note that the script can no differentiate between a string that was not translated, and a string that is the same even after translation. An example is "Normal" in English, and German. This will be listed as missing string in '''missing_german.txt'''.<br />
<br />
To avoid that, add the following comment:<br />
<br />
"#str_03005" "Normal" // stays the same<br />
<br />
to each language variant where the string is unchanged after translation.<br />
<br />
Since it can be a bother to ask translators for a new string translation every other day, the current solution is to gather strings for a while, then regenerate the missing_xyz.txt files, and then ask the translators for a translation.<br />
<br />
See also the [[I18N - List of TDM translators|List of TDM translators]].<br />
<br />
=== Relocating String IDs ===<br />
<br />
{{infobox|Note: Relocation of string IDs can only be done either before release, or when it is clear that this string is not used by any FM, otherwise you break FMs!}}<br />
<br />
perl devel/rename_string.pl FIRSTOLDID FRISTNEWID COUNT<br />
<br />
Example:<br />
<br />
perl devel/rename_string.pl 2236 2298 2<br />
<br />
<br />
=== Adding a new i18n language ===<br />
The TDM i18n system works by having the translated strings given individual numbers. These numbers are included from separate language files at compile time, and then replaced with the language strings at runtime.<br />
<br />
====Relevant files====<br />
* all.lang - all the languages<br />
* devel/gen_lang.pl - perl script for breaking up the all.lang master file<br />
* (language).lang - the individual language files, eg english.lang or german.lang<br />
<br />
====Very basic overview of the translation process====<br />
* Edit the file "all.lang". Just copy the english language section to the end of the file and rename the new section.<br />
* Run the perl script "devel/gen_lang.pl" To do this, you need to have commit access to the developer SVN. This will "break up" the all.lang file into separate files for each translated language.<br />
* The new strings should now be accessible at next compile time.<br />
<br />
=== GUI ===<br />
<br />
In v1.07 there was a bug in '''choiceDef''' inside the GUI, which did not allow other characters than a-z. To work around this '''choiceDef''' bug, two new main menu commands were added, called "initChoice" and "stepChoice". However, for v1.08, the bug is fixed in the main code (due to the source code now being available), so the work-arounds were removed.<br />
<br />
<br />
== Known bugs ==<br />
<br />
At the moment only a few things are still not working:<br />
<br />
* Not all fonts contain accented characters yet.<br />
* [[Darkradiant]] does not support the '''#str_01234''' strings yet.<br />
* Doom3 does not render/support all characters (f.i. 0xFF in Russian, 0xF7 .. 0x9F in Western). To work around this, the characters are remapped (moved) during load. See [[I18N - Charset]] for details on this.<br />
<br />
{{i18n}} {{editing}} {{sdk}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Template:Whatsnew&diff=17893
Template:Whatsnew
2014-08-15T16:46:03Z
<p>Tels: add 2.02</p>
<hr />
<div><noinclude><br />
This template displays a "See also" section with links to other changelogs. Also:{{template-help|name=whatsnew|sort=Whatsnew}}<br />
</noinclude><br />
<includeonly><br />
== See also ==<br />
<br />
* [[What's new in TDM 2.02]]<br />
* [[What's new in TDM 2.01]]<br />
* [[What's new in TDM 2.00]]<br />
* [[What's new in TDM 1.08]]<br />
* [[What's new in TDM 1.07]]<br />
* [[What's new in TDM 1.06]]<br />
* [[What's new in TDM 1.05]]<br />
* [[What's new in TDM 1.04]]<br />
* [[What's new in TDM 1.03]]<br />
* [[What's new in TDM 1.02]]<br />
* [[What's new in TDM 1.01]]<br />
* [http://thedarkmod.com/downloads.php Download TDM]<br />
<br />
[[Category:What's New|{{{sort|{{PAGENAME}}}}}]]<br />
</includeonly></div>
Tels
https://wiki.thedarkmod.com/index.php?title=Script_objects&diff=17892
Script objects
2014-08-13T18:36:43Z
<p>Tels: fix typos and the menu settings are now included</p>
<hr />
<div>== Introduction ==<br />
<br />
A '''script object''' is an object that is written in the idTech4 scripting language, and an be attached to arbitrary entities. Each entity can have '''only one''' script object, but one script object can be attached to multiple entities.<br />
<br />
To use a script object on an entity, give it the spawnarg '''scriptobject''' set to the name of the script object. For your convience, TDM already contains a few useful script objects, here is a list:<br />
<br />
== List of script objects ==<br />
<br />
<br />
=== tdm_alarm ===<br />
<br />
A script object that sounds an alarm sound that can be heard by AI as suspicious sound, as well as a player audible sound.<br />
<br />
Functions:<br />
<br />
void start_alarm();<br />
void stop_alarm();<br />
<br />
See [[atdm:alarm_sound]] on how to use it.<br />
<br />
<br />
=== tdm_suicide ===<br />
<br />
<pre><br />
"scriptobject" "tdm_suicide"<br />
"remove_delay" "100" // remove this entity 100 seconds after spawning it<br />
</pre><br />
<br />
Note: In TDM v1.03 the delay '''must be''' >= 1, or the script will wait 360 seconds. In TDM v1.04, the time can also be between 0 and 1 second, for instance 0.5 seconds.<br />
<br />
Note #3: From TDM v1.04 onwards, any entity with this script object will activate its targets right before it removes itself. This can be used to trigger things after a certain time from map start has passed, and is used f.i. by the new "atdm:vanishing_platform" entity.<br />
<br />
<br />
=== tdm_light_holder ===<br />
<br />
<pre><br />
"scriptobject" "tdm_light_holder"<br />
"extinguished" "1" // the light starts off, but can be lit by the player<br />
</pre><br />
<br />
This is typical attached to either lights (an electrical lamp f.i.) or light holders (a candle holder with attached candle + flame, or a torch with attached flame). This script object has handy methods to toggle all lights that this holder has, regardless how many (multiple flames?) or where (flame on holder or flame on candle on holder?).<br />
<br />
This script object also makes the entity react to stims (f.i. fire, water and gas), and/or triggers like when you link a button/lever/trigger to this entity.<br />
<br />
<br />
=== tdm_gui_message ===<br />
<br />
This script object is attached to an '''atdm:gui_message''' entity, and the entity shows a message to the player, based on cvars and spawnargs. You can use this script object for the "popup" messages that appear on the upper left corner (f.i. to give the player hints) or for screeen overlays like in a movie, where it says f.i. "Random Town, past midnight". Where the message appears and how it looks is entirely customizable by using a different gui.<br />
<br />
See [[Popup messages]] for more information.<br />
<br />
==== CVARs ====<br />
<br />
* '''tdm_show_trainer_messages''' - if true, trainer messages are shown, if false, suppressed<br />
<br />
==== Spawnargs ====<br />
<br />
<br />
* '''show'''- The time in seconds the message is shown, will be longer by approx. one second to fade the message out. If set to 0, shows the message for 6 seconds plus 1s fade out.<br />
* '''lines''' - Number of lines the text has<br />
* '''text''' - The text to be shown on the message.<br />
* '''gui''' - Name of the GUI file, defaults to ''guis/tdm_message.gui''<br />
* '''wait''', '''delay''' - These two are inherited from '''atdm:target_callobjectfunction''' and set the "wait" between triggers and the initial "delay" before the messsage show.<br />
* '''fade_out_time''' - Defaults to 1, in seconds. This time is waited for the GUI to fade out, then the message is forcefully removed. If you use a different gui with "gui", then set this spawnarg to match the fadeout time of your gui.<br />
* '''auto_trigger''' - Boolean, if true, the msg is triggered "delay" seconds after map load automatically.<br />
* '''force''' - Boolean, if true, the msg is always shown, regardless of the menu setting (e.g. the CVAR).<br />
<br />
==== Notes ====<br />
<br />
# Currently messages just overlay each other on the screen. So if a later messages is displayed while an old message is still there, they fade over from the old one to the new one.<br />
# If the player then steps back into the first trigger, the old message is not displayed again, because it is still waiting around.<br />
<br />
<br />
=== tdm_voice ===<br />
<br />
A script object for atdm:voice, which can play voices (or any other sounds) so they appear to come from the player. Can be used for voice overs and narrator effects. Both effects use the volume in two different CVARs, so their volume can be controlled separately. <br />
<br />
How to use:<br />
<br />
# Place an '''atdm:voice''' entity in your map (location does not matter, and you need only one)<br />
# Place multiple '''atdm:voice_trigger''' entities in your map<br />
# link your '''atdm:voice_trigger''' entities to '''your atdm:voice''' entity ({{key|CTRL}}+{{key|K}} in [[DarkRadiant]])<br />
<br />
Give the following spawnargs to the '''atdm:voice_trigger''' entities:<br />
<br />
<pre><br />
"snd_say" "sound_you_want_to_play" // generic, male or female<br />
"as_player" "1" // if the player should say things<br />
"as_player" "0" // if the speaker (from off) should say things<br />
</pre><br />
<br />
The difference between "as_player" "0" and "1" is the volume as set in the menu.<br />
<br />
==== CVARS ====<br />
<br />
* tdm_voice_player_volume<br />
* tdm_voice_from_off_volume<br />
* Menu settings<br />
<br />
'''Unsupported''' options (taken out because the team doesn't want to add them):<br />
<br />
* CVAR: tdm_player_is_female<br />
* Spawnarg: "snd_say_female" "female_sound_you_want_to_play" // overrides snd_say if the player is female<br />
<br />
== See also ==<br />
<br />
* [[Writing script objects]]<br />
<br />
{{scripting}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Script_Events_User-Friendly_List&diff=17891
Script Events User-Friendly List
2014-08-13T18:31:55Z
<p>Tels: the old content was horrible outdated, replaced it with a link to the current list</p>
<hr />
<div>#REDIRECT [[TDM_Script_Reference]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_Charset&diff=17890
I18N - Charset
2014-08-11T18:39:44Z
<p>Tels: add link to character remapping, make table smaller</p>
<hr />
<div>== Introduction ==<br />
<br />
The D3 code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, special charsets are used. The fonts (Carleton for the menu f.i.) are build/patched so that the right characters appear in the right place.<br />
<br />
== Encodings ==<br />
<br />
=== all.lang ===<br />
<br />
This file is in '''UTF-8''', and converted with the help of the script '''devel/gen_lang.pl''':<br />
<br />
perl devel/gen_lang.pl<br />
<br />
This ensures that the generated language files are in their proper encodings (see below).<br />
<br />
=== All other language files ===<br />
<br />
Note that the language files (f.i. '''strings/german.lang''') as well as the readables and the FM dictionariaries are expected to be in the following encodings:<br />
<br />
* '''Czech''', '''Hungarian''', '''Slovak''', '''Polish:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-2 ISO-8859-2] ('''not WIN-1250!)<br />
* '''Russian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/Win-1251 WIN-1251]<br />
* '''French:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-15 ISO-8859-15]<br />
* '''All other languages:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1 ISO-8859-1] (German, Dutch, Danish, etc.)<br />
<br />
<br />
{{infobox|The core dictionaries are automatically generated in the right encoding, but make sure that you use the right encoding for the FM dictionary, too!}}<br />
<br />
== Character remapping ==<br />
<br />
The characters are remapped upon loading the dictionary/readable, from their native encoding to the special one that TDM uses and that is described here. Responsible for the remapping are [[I18N - Character mapping|mapping files]], f.i. "strings/czech.map". If a map file for a specific language is not found, "strings/default.map" is used instead, if this is not found, no remapping takes place.<br />
<br />
See '''[[I18N - Character mapping|Character mapping]]''' for more information.<br />
<br />
== European Languages ==<br />
<br />
This mapping is used for European languages, f.i. '''Czech''', '''French''', '''German''', '''Spanish''', '''Portuguese''', '''Polish'''. Note that the double accented characters in Hungarian '''Ő, ő, Ű and ű''' look a bit different from '''Ö, ö, Ü and ü'''!<br />
<br />
In the table below, the original ISO 8859-1 characters are given in ''()'' below the TDM character.<br />
<br />
'''Color code:'''<br />
<br />
{{box|#f0d0d0|Character not displayed by TDM or not defined|Unusable}}{{box|#c0ffc0|Character displayed in v1.08 or newer|Usable in v1.08}}{{box|#d0d0f0|Changed from the ISO-8859-1 default|Changed}}<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 95%" cellspacing=0 cellpadding=2 width=100%<br />
<br />
|-<br />
!<br />
!…0<br />
!…1<br />
!…2<br />
!…3<br />
!…4<br />
!…5<br />
!…6<br />
!…7<br />
!…8<br />
!…9<br />
!…A<br />
!…B<br />
!…C<br />
!…D<br />
!…E<br />
!…F<br />
<br />
|-<br />
!0…<br />
|align='center' style='background: #f0d0d0'|00<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|01<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|02<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|03<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|04<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|05<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|06<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|07<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|08<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|09<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|0F<br>'''–'''<br />
<br />
|-<br />
!1…<br />
|align='center' style='background: #f0d0d0'|10<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|11<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|12<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|13<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|14<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|15<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|16<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|17<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|18<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|19<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1A<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1B<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1C<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|1F<br>'''–'''<br />
<br />
|-<br />
!2…<br />
|align='center'|20<br>'''&nbsp;'''<br />
|align='center'|21<br>'''!'''<br />
|align='center'|22<br>'''"'''<br />
|align='center'|23<br>'''#'''<br />
|align='center'|24<br>'''$'''<br />
|align='center'|25<br>'''%'''<br />
|align='center'|26<br>'''&'''<br />
|align='center'|27<br>'''''''<br />
|align='center'|28<br>'''('''<br />
|align='center'|29<br>''')'''<br />
|align='center'|2A<br>'''*'''<br />
|align='center'|2B<br>'''+'''<br />
|align='center'|2C<br>''','''<br />
|align='center'|2D<br>'''-'''<br />
|align='center'|2E<br>'''.'''<br />
|align='center'|2F<br>'''/'''<br />
<br />
|-<br />
!3…<br />
|align='center'|30<br>'''0'''<br />
|align='center'|31<br>'''1'''<br />
|align='center'|32<br>'''2'''<br />
|align='center'|33<br>'''3'''<br />
|align='center'|34<br>'''4'''<br />
|align='center'|35<br>'''5'''<br />
|align='center'|36<br>'''6'''<br />
|align='center'|37<br>'''7'''<br />
|align='center'|38<br>'''8'''<br />
|align='center'|39<br>'''9'''<br />
|align='center'|3A<br>''':'''<br />
|align='center'|3B<br>''';'''<br />
|align='center'|3C<br>'''<'''<br />
|align='center'|3D<br>'''='''<br />
|align='center'|3E<br>'''>'''<br />
|align='center'|3F<br>'''?'''<br />
<br />
|-<br />
!4…<br />
|align='center'|40<br>'''@'''<br />
|align='center'|41<br>'''A'''<br />
|align='center'|42<br>'''B'''<br />
|align='center'|43<br>'''C'''<br />
|align='center'|44<br>'''D'''<br />
|align='center'|45<br>'''E'''<br />
|align='center'|46<br>'''F'''<br />
|align='center'|47<br>'''G'''<br />
|align='center'|48<br>'''H'''<br />
|align='center'|49<br>'''I'''<br />
|align='center'|4A<br>'''J'''<br />
|align='center'|4B<br>'''K'''<br />
|align='center'|4C<br>'''L'''<br />
|align='center'|4D<br>'''M'''<br />
|align='center'|4E<br>'''N'''<br />
|align='center'|4F<br>'''O'''<br />
<br />
|-<br />
!5…<br />
|align='center'|50<br>'''P'''<br />
|align='center'|51<br>'''Q'''<br />
|align='center'|52<br>'''R'''<br />
|align='center'|53<br>'''S'''<br />
|align='center'|54<br>'''T'''<br />
|align='center'|55<br>'''U'''<br />
|align='center'|56<br>'''V'''<br />
|align='center'|57<br>'''W'''<br />
|align='center'|58<br>'''X'''<br />
|align='center'|59<br>'''Y'''<br />
|align='center'|5A<br>'''Z'''<br />
|align='center'|5B<br>'''['''<br />
|align='center'|5C<br>'''\'''<br />
|align='center'|5D<br>''']'''<br />
|align='center'|5E<br>'''^'''<br />
|align='center'|5F<br>'''_'''<br />
<br />
|-<br />
!6…<br />
|align='center'|60<br>'''`'''<br />
|align='center'|61<br>'''a'''<br />
|align='center'|62<br>'''b'''<br />
|align='center'|63<br>'''c'''<br />
|align='center'|64<br>'''d'''<br />
|align='center'|65<br>'''e'''<br />
|align='center'|66<br>'''f'''<br />
|align='center'|67<br>'''g'''<br />
|align='center'|68<br>'''h'''<br />
|align='center'|69<br>'''i'''<br />
|align='center'|6A<br>'''j'''<br />
|align='center'|6B<br>'''k'''<br />
|align='center'|6C<br>'''l'''<br />
|align='center'|6D<br>'''m'''<br />
|align='center'|6E<br>'''n'''<br />
|align='center'|6F<br>'''o'''<br />
<br />
|-<br />
!7…<br />
|align='center'|70<br>'''p'''<br />
|align='center'|71<br>'''q'''<br />
|align='center'|72<br>'''r'''<br />
|align='center'|73<br>'''s'''<br />
|align='center'|74<br>'''t'''<br />
|align='center'|75<br>'''u'''<br />
|align='center'|76<br>'''v'''<br />
|align='center'|77<br>'''w'''<br />
|align='center'|78<br>'''x'''<br />
|align='center'|79<br>'''y'''<br />
|align='center'|7A<br>'''z'''<br />
|align='center'|7B<br>'''{'''<br />
|align='center'|7C<br>'''|'''<br />
|align='center'|7D<br>'''}'''<br />
|align='center'|7E<br>'''~'''<br />
|align='center' style='background: #f0d0d0'|7F<br>'''–'''<br />
<br />
|-<br />
!8…<br />
|align='center' style='background: #c0ffc0'|80<br>'''Ň'''<br />
|align='center' style='background: #c0ffc0'|81<br>'''Ś'''<br />
|align='center' style='background: #c0ffc0'|82<br>'''Ć'''<br />
|align='center' style='background: #c0ffc0'|83<br>'''Ż'''<br />
|align='center' style='background: #c0ffc0'|84<br>'''Ź'''<br />
|align='center' style='background: #c0ffc0'|85<br>'''Ŝ'''<br />
|align='center' style='background: #c0ffc0'|86<br>'''Ĉ'''<br />
|align='center' style='background: #c0ffc0'|87<br>'''Ẑ'''<br />
|align='center' style='background: #c0ffc0'|88<br>'''Ô'''<br />
|align='center' style='background: #c0ffc0'|89<br>'''Ŕ'''<br />
|align='center' style='background: #c0ffc0'|8A<br>'''Ǔ'''<br />
|align='center' style='background: #c0ffc0'|8B<br>'''Ă'''<br />
|align='center' style='background: #c0ffc0'|8C<br>'''Ń'''<br />
|align='center' style='background: #f0d0d0'|8D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|8E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|8F<br>'''–'''<br />
<br />
|-<br />
!9…<br />
|align='center' style='background: #f0d0d0'|90<br>'''–'''<br />
|align='center' style='background: #c0ffc0'|91<br>'''ś'''<br />
|align='center' style='background: #c0ffc0'|92<br>'''ć'''<br />
|align='center' style='background: #c0ffc0'|93<br>'''ż'''<br />
|align='center' style='background: #c0ffc0'|94<br>'''ź'''<br />
|align='center' style='background: #c0ffc0'|95<br>'''ŝ'''<br />
|align='center' style='background: #c0ffc0'|96<br>'''ĉ'''<br />
|align='center' style='background: #c0ffc0'|97<br>'''ẑ'''<br />
|align='center' style='background: #c0ffc0'|98<br>'''ô'''<br />
|align='center' style='background: #c0ffc0'|99<br>'''ŕ'''<br />
|align='center' style='background: #c0ffc0'|9A<br>'''ǔ'''<br />
|align='center' style='background: #c0ffc0'|9B<br>'''ă'''<br />
|align='center' style='background: #c0ffc0'|9C<br>'''ń'''<br />
|align='center' style='background: #f0d0d0'|9D<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|9E<br>'''–'''<br />
|align='center' style='background: #f0d0d0'|9F<br>'''–'''<br />
<br />
|-<br />
!A…<br />
|align='center'|A0<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Non-breaking_space NBSP]'''<br />
|align='center' style='background: #d0d0f0'|A1<br>'''ň'''<br>(¡)'''<br />
|align='center' style='background: #d0d0f0'|A2<br>'''Ű'''<br>(¢)'''<br />
|align='center' style='background: #d0d0f0'|A3<br>'''ě'''<br>(£)'''<br />
|align='center' style='background: #d0d0f0'|A4<br>'''ű'''<br>(¤)'''<br />
|align='center' style='background: #d0d0f0'|A5<br>'''Ě'''<br>(¥)'''<br />
|align='center' style='background: #d0d0f0'|A6<br>'''Š'''<br>(¦)'''<br />
|align='center'|A7<br>'''§'''<br />
|align='center' style='background: #d0d0f0'|A8<br>'''š'''<br>(¨)'''<br />
|align='center' style='background: #d0d0f0'|A9<br>'''Ů'''<br>(©)'''<br />
|align='center' style='background: #d0d0f0'|AA<br>'''Ą'''<br>(ª)'''<br />
|align='center' style='background: #d0d0f0'|AB<br>'''Ę'''<br>(«)'''<br />
|align='center' style='background: #d0d0f0'|AC<br>'''Č'''<br>(¬)'''<br />
|align='center'|AD<br>'''[https://secure.wikimedia.org/wikipedia/en/wiki/Soft_hyphen SHY]'''<br />
|align='center' style='background: #d0d0f0'|AE<br>'''č'''<br>(®)'''<br />
|align='center' style='background: #d0d0f0'|AF<br>'''ů'''<br>(¯)'''<br />
<br />
|-<br />
!B…<br />
|align='center' style='background: #d0d0f0'|B0<br>'''Ő'''<br>(°)'''<br />
|align='center' style='background: #d0d0f0'|B1<br>'''Ł'''<br>(±)'''<br />
|align='center' style='background: #d0d0f0'|B2<br>'''Ť'''<br>(²)'''<br />
|align='center' style='background: #d0d0f0'|B3<br>'''Ď'''<br>(³)'''<br />
|align='center' style='background: #d0d0f0'|B4<br>'''Ž'''<br>(´)'''<br />
|align='center' style='background: #d0d0f0'|B5<br>'''ł'''<br>(µ)'''<br />
|align='center' style='background: #d0d0f0'|B6<br>'''ť'''<br>(¶)'''<br />
|align='center' style='background: #d0d0f0'|B7<br>'''ď'''<br>(·)'''<br />
|align='center' style='background: #d0d0f0'|B8<br>'''ž'''<br>(¸)'''<br />
|align='center' style='background: #d0d0f0'|B9<br>'''ő'''<br>(¹)'''<br />
|align='center' style='background: #d0d0f0'|BA<br>'''ą'''<br>(º)'''<br />
|align='center' style='background: #d0d0f0'|BB<br>'''ę'''<br>(»)'''<br />
|align='center' style='background: #d0d0f0'|BC<br>'''Œ'''<br>(¼)'''<br />
|align='center' style='background: #d0d0f0'|BD<br>'''œ'''<br>(½)'''<br />
|align='center' style='background: #d0d0f0'|BE<br>'''Ÿ'''<br>(¾)'''<br />
|align='center'|BF<br>'''¿'''<br />
<br />
|-<br />
!C…<br />
|align='center'|C0<br>'''À'''<br />
|align='center'|C1<br>'''Á'''<br />
|align='center'|C2<br>'''Â'''<br />
|align='center'|C3<br>'''Ã'''<br />
|align='center'|C4<br>'''Ä'''<br />
|align='center'|C5<br>'''Å'''<br />
|align='center'|C6<br>'''Æ'''<br />
|align='center'|C7<br>'''Ç'''<br />
|align='center'|C8<br>'''È'''<br />
|align='center'|C9<br>'''É'''<br />
|align='center'|CA<br>'''Ê'''<br />
|align='center'|CB<br>'''Ë'''<br />
|align='center'|CC<br>'''Ì'''<br />
|align='center'|CD<br>'''Í'''<br />
|align='center'|CE<br>'''Î'''<br />
|align='center'|CF<br>'''Ï'''<br />
<br />
|-<br />
!D…<br />
|align='center'|D0<br>'''Ð'''<br />
|align='center'|D1<br>'''Ñ'''<br />
|align='center'|D2<br>'''Ò'''<br />
|align='center'|D3<br>'''Ó'''<br />
|align='center'|D4<br>'''Ô'''<br />
|align='center'|D5<br>'''Õ'''<br />
|align='center'|D6<br>'''Ö'''<br />
|align='center' style='background: #d0d0f0'|D7<br>'''Ř'''<br>(×)'''<br />
|align='center'|D8<br>'''Ø'''<br />
|align='center'|D9<br>'''Ù'''<br />
|align='center'|DA<br>'''Ú'''<br />
|align='center'|DB<br>'''Û'''<br />
|align='center'|DC<br>'''Ü'''<br />
|align='center'|DD<br>'''Ý'''<br />
|align='center'|DE<br>'''Þ'''<br />
|align='center'|DF<br>'''ß'''<br />
<br />
|-<br />
!E…<br />
|align='center'|E0<br>'''à'''<br />
|align='center'|E1<br>'''á'''<br />
|align='center'|E2<br>'''â'''<br />
|align='center'|E3<br>'''ã'''<br />
|align='center'|E4<br>'''ä'''<br />
|align='center'|E5<br>'''å'''<br />
|align='center'|E6<br>'''æ'''<br />
|align='center'|E7<br>'''ç'''<br />
|align='center'|E8<br>'''è'''<br />
|align='center'|E9<br>'''é'''<br />
|align='center'|EA<br>'''ê'''<br />
|align='center'|EB<br>'''ë'''<br />
|align='center'|EC<br>'''ì'''<br />
|align='center'|ED<br>'''í'''<br />
|align='center'|EE<br>'''î'''<br />
|align='center'|EF<br>'''ï'''<br />
<br />
|-<br />
!F…<br />
|align='center'|F0<br>'''ð'''<br />
|align='center'|F1<br>'''ñ'''<br />
|align='center'|F2<br>'''ò'''<br />
|align='center'|F3<br>'''ó'''<br />
|align='center'|F4<br>'''ô'''<br />
|align='center'|F5<br>'''õ'''<br />
|align='center'|F6<br>'''ö'''<br />
|align='center' style='background: #d0d0f0'|F7<br>'''ř'''<br>(÷)'''<br />
|align='center'|F8<br>'''ø'''<br />
|align='center'|F9<br>'''ù'''<br />
|align='center'|FA<br>'''ú'''<br />
|align='center'|FB<br>'''û'''<br />
|align='center'|FC<br>'''ü'''<br />
|align='center'|FD<br>'''ý'''<br />
|align='center'|FE<br>'''þ'''<br />
|align='center'|FF<br>'''ÿ'''<br />
<br />
|}<br />
<br />
== Russian ==<br />
<br />
The character '''0xFF''' (я) is mapped to '''0xB6''' upon loading. Therefore any Russian font must contain я at the place 0xB6.<br />
<br />
== Asian Languages (Korean, Chinese, Japanese) ==<br />
<br />
The original D3 had support for these languages, so it might be possible to add them to TDM, too. At the moment, however, we lack the fonts and translators. Also, writing from right-to-left (Hebrew) or top-down (Japanese) might be tricky or outright impossible in our GUI without more work in the C++ code.<br />
<br />
== Statistics ==<br />
<br />
Some of the special characters are used more often then others. Here is a statistic over the entire string set of the TDM core, showing the top 50 most-used characters (excluding a-z, 0-9 and russian characters):<br />
<br />
{|class="wikitable" border=1 style="border-collapse: collapse; font-size: 85%" cellspacing=0 cellpadding=2<br />
<br />
|-<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
|Rank<br />
|Occurances<br />
|Letter<br />
|Remarks<br />
<br />
|-<br />
|1<br />
|í<br />
|715<br />
|<br />
|25<br />
|ć<br />
|67<br />
|<br />
<br />
|-<br />
|2<br />
|é<br />
|674<br />
|<br />
|26<br />
|è<br />
|65<br />
|<br />
<br />
|-<br />
|3<br />
|á<br />
|524<br />
|<br />
|27<br />
|ú<br />
|56<br />
|<br />
<br />
|-<br />
|4<br />
|ø<br />
|303<br />
|Danish<br />
|28<br />
|ê<br />
|52<br />
|<br />
<br />
|-<br />
|5<br />
|č<br />
|288<br />
|<br />
|29<br />
|ö<br />
|48<br />
|German<br />
<br />
|-<br />
|6<br />
|ó<br />
|283<br />
|<br />
|30<br />
|É<br />
|46<br />
|<br />
<br />
|-<br />
|7<br />
|ü<br />
|270<br />
|German<br />
|31<br />
|ñ<br />
|37<br />
|<br />
<br />
|-<br />
|8<br />
|ł<br />
|203<br />
|Polish<br />
|32<br />
|õ<br />
|32<br />
|<br />
<br />
|-<br />
|9<br />
|æ<br />
|200<br />
|Danish<br />
|33<br />
|ń<br />
|26<br />
|<br />
<br />
|-<br />
|10<br />
|ě<br />
|182<br />
|<br />
|34<br />
|Ł<br />
|24<br />
|<br />
<br />
|-<br />
|11<br />
|ř<br />
|175<br />
|Czech<br />
|35<br />
|Š<br />
|21<br />
|<br />
<br />
|-<br />
|12<br />
|ã<br />
|168<br />
|<br />
|36<br />
|â<br />
|21<br />
|<br />
<br />
|-<br />
|13<br />
|ž<br />
|148<br />
|Czech<br />
|37<br />
|ź<br />
|20<br />
|<br />
<br />
|-<br />
|14<br />
|ý<br />
|142<br />
|<br />
|38<br />
|ß<br />
|18<br />
|German<br />
<br />
|-<br />
|15<br />
|ę<br />
|141<br />
|<br />
|39<br />
|Ó<br />
|18<br />
|<br />
<br />
|-<br />
|16<br />
|ą<br />
|140<br />
|<br />
|40<br />
|ň<br />
|15<br />
|<br />
<br />
|-<br />
|17<br />
|ż<br />
|119<br />
|<br />
|41<br />
|Ú<br />
|15<br />
|<br />
<br />
|-<br />
|18<br />
|å<br />
|109<br />
|Danish<br />
|42<br />
|Á<br />
|13<br />
|<br />
<br />
|-<br />
|19<br />
|š<br />
|99<br />
|<br />
|43<br />
|î<br />
|12<br />
|<br />
<br />
|-<br />
|20<br />
|ś<br />
|97<br />
|<br />
|44<br />
|ť<br />
|11<br />
|<br />
<br />
|-<br />
|21<br />
|ç<br />
|91<br />
|<br />
|45<br />
|ô<br />
|9<br />
|<br />
<br />
|-<br />
|22<br />
|ä<br />
|86<br />
|German<br />
|46<br />
|Ž<br />
|8<br />
|<br />
<br />
|-<br />
|23<br />
|à<br />
|83<br />
|<br />
|47<br />
|Ż<br />
|7<br />
|<br />
<br />
|-<br />
|24<br />
|ů<br />
|77<br />
|<br />
|48<br />
|Č<br />
|7<br />
|<br />
<br />
|-<br />
|25<br />
|ć<br />
|67<br />
|<br />
|49<br />
|ù<br />
|6<br />
|<br />
<br />
|}<br />
<br />
Althought ö, ä and ü do not appear that often, with only these and Ü, Ö, Ä and ß, the entire German language works. So adding these letters is quite important.<br />
<br />
[[Category:Fonts]]<br />
<br />
{{i18n}}* [[Font Patcher]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=I18N_-_Character_mapping&diff=17889
I18N - Character mapping
2014-08-11T18:29:17Z
<p>Tels: remove outdated note</p>
<hr />
<div>The D3 code that handles the GUI bitmap font can only load a specific range of bytes as characters. To get the most out of the available entries, a special font is used (Carleton for the menu f.i.). These fonts are build/patched so that the right characters appear in the right place.<br />
<br />
== Encodings ==<br />
<br />
Note that the language files (f.i. strings/german.lang) as well as the readables and the FM dictionariaries are expected to be in the following encodings:<br />
<br />
* '''Czech''', '''Polish:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-2 ISO-8859-2] ('''not WIN-1250!)<br />
* '''Russian:''' [https://secure.wikimedia.org/wikipedia/en/wiki/Win-1251 WIN-1251]<br />
* '''All other languages:''' [https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1 ISO-8859-1]<br />
<br />
=== Remapping ===<br />
<br />
The characters are remapped upon loading the dictionary/readable from their source encoding (e.g. ISO 8859-2) to the special character map TDM uses. Responsible for this are mapping files, f.i. "strings/czech.map". If a map file for a specific language is not found, "strings/default.map" is used instead. <br />
<br />
The content of a map file is wrapped in '''{''' and '''}''', and each mapping consists of two hexadecimal numbers, the source and the target character number.<br />
<br />
== Examples ==<br />
<br />
For russian:<br />
<br />
<pre><br />
{<br />
0xFF 0xB6 // я<br />
}<br />
</pre><br />
<br />
For European languages in ISO 8859-2 charset (f.i. Czech):<br />
<br />
<pre><br />
// a comment<br />
{<br />
0xF2 0xA1 // ň<br />
0xDB 0xA2 // Ű (similiar to Ü, used in Hungarian)<br />
0xFB 0xA4 // ű<br />
0xA9 0xA6 // Š<br />
0xB9 0xA8 // š<br />
0xA1 0xAA // Ą<br />
0xC8 0xAC // Č<br />
0xCA 0xAB // Ę<br />
0xE8 0xAE // č<br />
0xD5 0xB0 // Ő (similiar to Ö, used in Hungarian)<br />
0xA3 0xB1 // Ł<br />
0xAb 0xB2 // Ť<br />
0xCF 0xB3 // Ď<br />
0xAC 0xB4 // Ž<br />
0xB3 0xB5 // ł<br />
0xBf 0xB6 // ż<br />
0xEF 0xB7 // ď<br />
0xBE 0xB8 // ž<br />
0xF5 0xB9 // ő (similiar to ö, used in Hungarian)<br />
0xB1 0xBA // ą<br />
0xEA 0xBB // ę<br />
0xF8 0xF7 // ř<br />
0xD8 0xD7 // Ř<br />
0xEC 0xA3 // ě<br />
0xCC 0xA5 // Ě<br />
0xD9 0xA9 // Ů<br />
0xF9 0xAF // ů<br />
0xBB 0xB6 // ť<br />
}<br />
</pre><br />
{{i18n}}* [[Font patcher]]<br />
<br />
[[Category:fonts]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Template:I18n&diff=17888
Template:I18n
2014-08-10T18:12:35Z
<p>Tels: fix link to bug tracker</p>
<hr />
<div><noinclude>This template inserts the ''See Also'' section on I18N related articles.</noinclude><includeonly><br />
== See Also ==<br />
<br />
* [[Internationalization|I18N]] - Main article<br />
* [[I18N - Translator's Guide|Translator's Guide]], [[I18N - Translating Fan Missions|Translating FMs]] and the [[I18N - List of TDM translators|list of translators]]<br />
* [[I18N - Charset|The charset TDM fonts use]]<br />
* [http://modetwo.net/darkmod/index.php?/topic/12863-translating-the-tdm-gui/ Forum Thread]<br />
* [http://bugs.thedarkmod.com/view.php?id=2779 Bug Tracker entry #2779]<br />
* [[I18N.pl]] - a script to transform a FM into a mission and I18N data<br />
* [[I18N Status]] - Which FMs are translated into which language<br />
* [[Text Decals for Signs etc.]]<br />
<br />
[[Category:I18N]]<br />
</includeonly></div>
Tels
https://wiki.thedarkmod.com/index.php?title=Font_Patcher&diff=17882
Font Patcher
2014-08-08T14:24:38Z
<p>Tels: tweaks</p>
<hr />
<div>== Introduction ==<br />
<br />
This utility allows you to "patch" a '''fontImage.dat''' file, e.g. change different characters and values without having the other characters being affected (a common problem with [[Font_Conversion_%26_Repair|q3font]], f.i.).<br />
<br />
The script reads in a '''fontImage.dat''' file, a file with commands, then executes each command and then writes out the modified '''fontImage.dat''' file. Here is an example command file:<br />
<br />
<pre><br />
source font_source/carleton/fontimage_48.dat<br />
target ../fonts/english/carleton/fontimage_48.dat<br />
// the texture for this font is 256x256 pixel<br />
dim 256 256<br />
<br />
copy_char 0x43 0xac // copy all fields from C to the new character Č<br />
move_by 0xac 74 -52 // new position 174, 19 minus 100, 71<br />
shader 0xac fonts/carleton_6_48.tga // set the right texture file (the .tga is ignored by TDM)<br />
extend_top 0xac 8 // extend the character 8 pixel on the top<br />
</pre><br />
<br />
The order of commands does usually not matter, unless you want for instance to copy a character and then modify it, in this case the ''[[#copy|copy]]'' command must obviously come before any modifications to the character.<br />
<br />
=== Patching multiple fonts ===<br />
<br />
The modified '''fontImage.dat''' file will be written out automatically at the end of the parsing stage. <br />
If you want to patch more than one fontImage.dat file, you need to use two seperate command files and call the font patcher twice.<br />
<br />
== Commands ==<br />
<br />
=== #include ===<br />
<br />
Includes the specified file in place of this line. Example:<br />
<br />
#include devel/font_source/copy_letters.txt<br />
<br />
=== #define ===<br />
<br />
Defines a new text macro. Example:<br />
<br />
<pre><br />
#define H_EXTEND 1<br />
</pre><br />
<br />
From here on "H_EXTEND" will be replaced with "1" like in this example:<br />
<br />
<pre><br />
extend_botton 0x65 H_EXTEND<br />
</pre><br />
<br />
which will look like this to the font patcher:<br />
<br />
<pre><br />
extend_botton 0x65 1<br />
</pre><br />
<br />
=== copy_char ===<br />
<br />
Copy all fields from the source character to the target character:<br />
<br />
copy_char 0x43 0xac<br />
<br />
Afterwards character '''0xac''' will look exactly the same as '''0x43''' (C).<br />
<br />
=== dump ===<br />
<br />
This will print all the fields for the character 0x65 (in this case "a") to the console:<br />
<br />
dump 0x65<br />
<br />
=== extend_bottom ===<br />
<br />
Extend the character at the bottom by the specified number of pixels (see ''[[#dim|dim]]''):<br />
<br />
extend_bottom 0xac 8<br />
<br />
=== extend_top ===<br />
<br />
Extend the character at the top by the specified number of pixels (see ''[[#dim|dim]]''):<br />
<br />
extend_top 0xac 8<br />
<br />
''increase_height'' is an alias for this command.<br />
<br />
=== move_by ===<br />
<br />
Moves the origin of the character bitmap by the specified number of pixels relatively to the original origin, and relative to the size of the texture (which you need to set beforehand with ''[[#dim|dim]]''):<br />
<br />
move_by 0xac 74 -52<br />
<br />
This is often used to "relocate" the place where a character is painted on the texture from one<br />
texture to the other, by using it in combination with ''[[#shader|shader]]''.<br />
<br />
=== shader ===<br />
<br />
Each character is painted on a TGA (or better DDS) file, and this command lets you set the<br />
name of this file. Note that we specify here ".tga", even tho the actual files are ".dds", and<br />
also note that we do not store the language here. In this example, the real file used would be '''dds/fonts/english/carleton_6_48.dds''' - TDM will do this automatically for us:<br />
<br />
shader 0xac fonts/carleton_6_48.tga<br />
<br />
=== source ===<br />
<br />
Sets the source font image file. Example:<br />
<br />
source font_source/carleton/fontimage_48.dat<br />
<br />
=== target ===<br />
<br />
Sets the target font image file. Example:<br />
<br />
target ../fonts/english/carleton/fontimage_48.dat<br />
<br />
=== scale ===<br />
<br />
Scale the character by X and Y as factors. Example to make the character 10% bigger:<br />
<br />
scale 0xEF 1.1 1.1<br />
<br />
=== decrease_width ===<br />
<br />
Reduce the width of the character by so many pixels:<br />
<br />
decrease_width 0x65 2<br />
<br />
=== increase_width ===<br />
<br />
Increase the width of the character by so many pixels:<br />
<br />
increase_width 0x65 2<br />
<br />
=== increase_xskip ===<br />
<br />
Each character has, in addition to it's with, a paramter '''xSkip''', which defines how many pixels are skipped after rendering the character. Unlike real [https://en.wikipedia.org/wiki/Kerning Kerning], this value is independent of the following character.<br />
<br />
It does thus define the spacing between characters. With this command, you can increase the space:<br />
<br />
increase_xskip 0x65 2<br />
<br />
=== decrease_xskip ===<br />
<br />
Reduces the '''xSkip''' parameter. See [[#increase_xskip]] for details.<br />
<br />
decrease_xskip 0x65 2<br />
<br />
== Requirements ==<br />
<br />
* Needs Perl.<br />
<br />
== See also ==<br />
<br />
* [http://www.bloodgate.com/mirrors/tdm/pub/scripts/font_patcher/ Download font_patcher.pl and examples]<br />
* [[I18N_-_Charset|The charsets used by TDM]]<br />
* [[Font Conversion & Repair]]<br />
* [[I18N]]<br />
<br />
[[Category:Fonts]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Font_Patcher&diff=17881
Font Patcher
2014-08-08T14:21:15Z
<p>Tels: small tweaks</p>
<hr />
<div>== Introduction ==<br />
<br />
This utility allows you to "patch" a '''fontImage.dat''' file, e.g. change different characters and values without having the other characters being affected (a common problem with [[Font_Conversion_%26_Repair|q3font]], f.i.).<br />
<br />
The script reads in a '''fontImage.dat''' file, a file with commands, then executes each command and then writes out the modified '''fontImage.dat''' file. Here is an example command file:<br />
<br />
<pre><br />
source font_source/carleton/fontimage_48.dat<br />
target ../fonts/english/carleton/fontimage_48.dat<br />
// the texture for this font is 256x256 pixel<br />
dim 256 256<br />
<br />
copy_char 0x43 0xac // copy all fields from C to the new character Č<br />
move_by 0xac 74 -52 // new position 174, 19 minus 100, 71<br />
shader 0xac fonts/carleton_6_48.tga // set the right texture file (the .tga is ignored by TDM)<br />
extend_top 0xac 8 // extend the character 8 pixel on the top<br />
</pre><br />
<br />
The order of commands does usually not matter, unless you want for instance to copy a character and then modify it, in this case the ''[[#copy|copy]]'' command must obviously come before any modifications to the character.<br />
<br />
=== Patching multiple fonts ===<br />
<br />
The modified '''fontImage.dat''' file will be written out automatically at the end of the parsing stage. <br />
If you want to patch more than one fontImage.dat file, you need to use two seperate command files and call the font patcher twice.<br />
<br />
== Commands ==<br />
<br />
=== #include ===<br />
<br />
Includes the specified file in place of this line. Example:<br />
<br />
#include devel/font_source/copy_letters.txt<br />
<br />
=== #define ===<br />
<br />
Defines a new text macro. Example:<br />
<br />
<pre><br />
#define H_EXTEND 1<br />
</pre><br />
<br />
From here on "H_EXTEND" will be replaced with "1" like in this example:<br />
<br />
<pre><br />
extend_botton 0x65 H_EXTEND<br />
</pre><br />
<br />
which will look like this to the font patcher:<br />
<br />
<pre><br />
extend_botton 0x65 1<br />
</pre><br />
<br />
=== copy_char ===<br />
<br />
Copy all fields from the source character to the target character:<br />
<br />
copy_char 0x43 0xac<br />
<br />
Afterwards character '''0xac''' will look exactly the same as '''0x43''' (C).<br />
<br />
=== dump ===<br />
<br />
This will print all the fields for the character 0x65 (in this case "a") to the console:<br />
<br />
dump 0x65<br />
<br />
=== extend_bottom ===<br />
<br />
Extend the character at the bottom by the specified number of pixels (see ''[[#dim|dim]]''):<br />
<br />
extend_bottom 0xac 8<br />
<br />
=== extend_top ===<br />
<br />
Extend the character at the top by the specified number of pixels (see ''[[#dim|dim]]''):<br />
<br />
extend_top 0xac 8<br />
<br />
''increase_height'' is an alias for this command.<br />
<br />
=== move_by ===<br />
<br />
Moves the origin of the character bitmap by the specified number of pixels relatively to the original origin, and relative to the size of the texture (which you need to set beforehand with ''[[#dim|dim]]''):<br />
<br />
move_by 0xac 74 -52<br />
<br />
This is often used to "relocate" the place where a character is painted on the texture from one<br />
texture to the other, by using it in combination with ''[[#shader|shader]]''.<br />
<br />
=== shader ===<br />
<br />
Each character is painted on a TGA (or better DDS) file, and this command lets you set the<br />
name of this file. Note that we specify here ".tga", even tho the actual files are ".dds", and<br />
also note that we do not store the language here. In this example, the real file used would be '''dds/fonts/english/carleton_6_48.dds''' - TDM will do this automatically for us:<br />
<br />
shader 0xac fonts/carleton_6_48.tga<br />
<br />
=== source ===<br />
<br />
Sets the source font image file. Example:<br />
<br />
source font_source/carleton/fontimage_48.dat<br />
<br />
=== target ===<br />
<br />
Sets the target font image file. Example:<br />
<br />
target ../fonts/english/carleton/fontimage_48.dat<br />
<br />
=== scale ===<br />
<br />
Scale the character by X and Y as factors. Example to make the character 10% bigger:<br />
<br />
scale 0xEF 1.1 1.1<br />
<br />
=== decrease_width ===<br />
<br />
Reduce the width of the character by so many pixels:<br />
<br />
decrease_width 0x65 2<br />
<br />
=== increase_width ===<br />
<br />
Increase the width of the character by so many pixels:<br />
<br />
increase_width 0x65 2<br />
<br />
=== increase_xskip ===<br />
<br />
Each character has, in addition to it's with, a paramter xSkip, which defines how many pixels are skipped after rendering the character. This thus defines the place where the next character is places, and thus the spacing between characters. With this command, you can increase this:<br />
<br />
increase_xskip 0x65 2<br />
<br />
=== decrease_xskip ===<br />
<br />
Reduces the xSkip parameter. See [[#increase_xskip]] for details.<br />
<br />
decrease_xskip 0x65 2<br />
<br />
== See also ==<br />
<br />
* [http://www.bloodgate.com/mirrors/tdm/pub/scripts/font_patcher/ Download font_patcher.pl and examples]<br />
* [[I18N_-_Charset|The charsets used by TDM]]<br />
* [[Font Conversion & Repair]]<br />
* [[I18N]]<br />
<br />
[[Category:Fonts]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=TDM_Release_Mechanics&diff=17524
TDM Release Mechanics
2014-02-01T12:52:31Z
<p>Tels: add wiki steps</p>
<hr />
<div>This article describes the process of creating a TDM point release. It will be fleshed out over the next few days/weeks.<br />
<br />
The team is using a version control system (SVN) for development, and the objective is to create a set of PK4 file from the repository which can be uploaded to the TDM mirrors. Let's go through this step by step:<br />
<br />
= Development = <br />
Just for the sake of completeness, this step includes the regular development between two TDM releases. This day-to-day development is always happening on the trunk, so all commits are ending up there. Stuff gets broken, stuff gets fixed, stuff gets evaluated, some might be ripped out again.<br />
<br />
= Branching off =<br />
At some point the team decides that it might be time for a new release - a so-called branch date (some sort of semi-freeze) is suggested and agreed upon. To this date, team members are supposed to wrap up their pending changes and commit them to the trunk. About two to three weeks are long enough of a time span for people to get everything into SVN. <br />
<br />
Once the deadline arrives, the '''release branch''' is created: [[Image:Create release branch.png|right|350px]]<br />
* Update your darkmod working copy.<br />
* Update the darkmod_src repository too.<br />
* Right-click the darkmod folder to create the branch<br />
** Select SVN > Branch/Tag...<br />
** A new dialog appears asking for a URL. Enter a URL like this: [https://server/svn/darkmod/branches/release1.xx https://<darkmod_server_here>/svn/darkmod/branches/release1.xx] where xx is replaced by whatever version the next release will be. <br />
** You'll probably want to switch to the new branch once it is created, so make sure the check button at the bottom of the dialog is active.<br />
** Hit OK to let the SVN server create the branch (the server will create a copy of the trunk, placing it at the URL you specified. It might be notable that the files are not physically copied, the branch requires a marginal amount of additional server space).<br />
* The same should happen with the darkmod_src repository, the code needs to be frozen as well. Perform the same steps as above, using the URL scheme [https://server/svn/darkmod_src/branches/release1.xx https://<darkmod_server_here>/svn/darkmod_src/branches/release1.xx]<br />
<br />
At this point there are two new branches, one for the darkmod repo, one for darkmod_src. Consider them a snapshot of the trunk at the point in time you created the branch. <br />
<br />
'''Important:''' commits to the trunk won't affect this newly created branch. The team members not involved in the release can just continue working as usual. Also note that if you as branch creator had the check button ("switch working copy") activated, your working copy has been ''switched'' to the release branch. ''Your commits will go to the branch'', keep that in mind. To learn how to ''merge'' stuff between the trunk and the release branch, see below.<br />
<br />
= Compile Game Binaries =<br />
Before the PK4 files can be assembled into a release package, the code from darkmod_src needs to be re-compiled for the Windows and Linux platforms. This is to make sure that the release is built from the most recent (and hopefully most stable) source. If you're not a coder, you can either ask your fellow coders to switch to the branch and compile the tdm_gameNN.pk4 for you, or you can bite the bullet and follow the [[TDM Compilation Guide]] to compile it yourself. As Windows user, I recommend setting up an Ubuntu 10.04 32-Bit instance in VirtualBox. The downside of using virtualisation is that compilation takes 30-40 Minutes depending on your CPU power, but you at least don't need a dual-boot setup, let alone a second PC. <br />
<br />
Make sure you compile a '''release build''' (debug builds are terribly slow), I also recommend re-compiling everything from scratch everytime you build a binary:<br />
* Windows/VC++: Menu ''Build'' > ''Rebuild Solution''<br />
* Linux: <tt>scons -c && scons BUILD="release" BUILD_GAMEPAK="1"</tt> <br />
<br />
Once compiled, make sure that the tdm_game01.pk4 is updated with the newly compiled DLL and the tdm_game02.pk4 is copied over from darkmod_src (where it is created after compilation) to darkmod and commit these two files ''to the branch''.<br />
<br />
Also commit TheDarkMod.exe and thedarkmod.x86 ''to the branch''.<br />
<br />
= Compile tdm_update =<br />
tdm_update must be built separately for both Windows and Linux.<br />
<br />
Make sure you compile a '''release build''', and recompile everything from scratch:<br />
* Windows/VC++: Menu ''Build'' > ''Rebuild tdm_update_mfc''<br />
* Linux: descend into the tdm_update directory and then do <tt>scons -c && scons BUILD="release"</tt><br />
<br />
Once compiled, copy the results into the darkmod folder:<br />
<br />
* Windows/VC++: bin/GuiUpdater/tdm_update.exe -> darkmod/tdm_update.exe<br />
* Linux: tdm_update.linux -> darkmod/tdm_update.linux<br />
<br />
Commit these ''to the branch''.<br />
<br />
= The Manifest =<br />
The "manifest" is a huge text files listing all the files that are nominated to go into the release. Not all files in SVN are supposed to be released (like test files, test maps, other broken or unfinished stuff), so we need a white list. The manifest text file is located in the SVN repository: '''devel/manifests/darkmod.txt'''<br />
<br />
== Building the Manifest ==<br />
<br />
Note: This section is more or less for your understanding, '''you don't need to manually generate the manifest anymore''' as this step is part of the automated process running on the TDM server itself.<br />
<br />
The manifest file is generated by the tdm_package application. (The tdm_package sources are in the darkmod_src repository, in a subfolder called tdm_update. There is a VC++ 2010 solution and a sconscript for Linux and Mac builds available. You don't need to compile it if you're in Windows, there is a pre-compiled version in the darkmod repo as well, in the devel/packager folder.) <br />
<br />
After the generation step the file '''devel/manifests/darkmod.txt''' will have been updated. You might want to review the modifications the script made to that file and commit it to the release branch if you're satisfied.<br />
<br />
== What is included in the Manifest ==<br />
The package application is using the file <tt>devel/manifests/darkmod_maps.txt</tt> to decide whether to include or exclude stuff. In a first internal step the script will include all files in specific folders:<br />
<br />
# Include all these files (but without parsing them like maps), each<br />
# statement will include files (from SVN) in that folder:<br />
INCLUDE def/<br />
INCLUDE dds/<br />
...<br />
INCLUDE video/<br />
INCLUDE xdata/<br />
As visible in the above example, the sharp character # is used to denote comments. Put that at the beginning of a line to disable the statement.<br />
<br />
As next step the algorithm will exclude certain files matching the regular expressions in EXCLUDE statements like this:<br />
EXCLUDE dds/darkmod/test<br />
In 95% of the cases it's enough to just specify the path of the files you want to exclude (use forward slashes), but you can do more fancy stuff like this:<br />
EXCLUDE models/md5/chars/undead/revenant/.*.md5anim<br />
EXCLUDE ^(dds/)?models/md5/chars/undead/revenant<br />
The first line will exclude all MD5ANIM files in the revenant folder. The second line will exclude all files in models/md5/chars/undead/revenant '''and''' the ones in '''dds/'''models/md5/chars/undead/revenant (the dds/ part is marked to be optional). <br />
<br />
In summary, all files that are INCLUDE'd as denoted above and afterwards manage to get through the hundreds of lines of EXCLUDE filters will end up in the manifest file.<br />
<br />
= Distribute files into PK4s =<br />
Each of the roughly 15000 files in the manifest needs to be sorted into the correct PK4. This is done by defining a rules in the file <tt>devel/manifests/darkmod_pk4s.txt</tt>. Each of the lines there defines a PK4 and which files go into it:<br />
# Miscellaneous stuff (GL Progs, Script, Language Files, Rope Arrow)<br />
tdm_base01.pk4: ^glprogs, ^script, ^strings, sound\.wav, _emptyname\.wav, ^models/md5/environments, ^dds/models/md5/environments, ...<br />
Again, lines starting with the sharp # character denote comments.<br />
<br />
Leftmost is the PK4 filename, followed by a colon character. To the right of the colon a list comma-separated patterns is defined, whereas each pattern is interpreted as regular expression. As with the <tt>darkmod_maps.txt</tt> you don't need to know very much about regular expressions to define those rules, it's usually enough to write the folder names and use wildcards like <tt>.*.md5anim</tt><br />
<br />
= Build the Package =<br />
The package is built right on the TDM server - there is a full darkmod repository checked out on the server's filesystem, and it will be processed through some scripts that are listening to your commands.<br />
<br />
Once triggered, the process goes roughly like this, I'll comment on these steps below:<br />
<br />
* The working copy is reverted, such that it is clean.<br />
* The working copy is switched to the release branch of the version you're about to release (it must exist at this point).<br />
* The working copy is implicitly updated by the switch operation.<br />
* The manifest is generated.<br />
* The full set of PK4 files is generated (it takes a while, the server CPU is not very powerful).<br />
* The differential package is generated.<br />
* The files are copied to a public folder reachable through HTTP such that it can be tested by the team. The team will test it by storing a manipulated tdm_mirrors.txt file next to their tdm_update application.<br />
<br />
== Prepare the packaging process ==<br />
A few steps need to be done before kicking off the process on the server.<br />
<br />
* The release branch must be created, with a specific naming convention: https://darkmod_server_here/svn/darkmod/branches/releaseY.XX where Y is the major version and XX is the two-digit minor version, e.g. "release1.08".<br />
* The inclusion statements in the <tt>darkmod_maps.txt</tt> file need to be up to date, make sure everything is committed to the branch.<br />
* The <tt>tdm_version.txt</tt> file should be containing the correct version number, it's located in <tt>devel/release/tdm_version.txt</tt>. Commit that change to the release branch, needless to say.<br />
<br />
== Kicking off the packaging process ==<br />
There is a special admin page on the server which can be used to kick off the process. The URL has been [http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/ posted on the forums before], greebo or grayman know the URL. It's password protected, so you'll be asked to enter credentials. Once there, you can enter the two version numbers, the one you're building, and the previous one (the latest released one). E.g.: 1.08 and 1.07. It's sufficient to enter the currently released one, e.g. 1.07, into the second field and the website will automatically fill in the next version number in the first field - you can override it if really necessary.<br />
<br />
Once you start the process you'll be presented a text window with some progress information, and you can watch the messages emitted by the svn client and the tdm_package application running on the server. It takes a while, about half an hour, until the package is built.<br />
<br />
= Prepare the internal package test =<br />
The team needs to have access to the package as created above for internal testing, so tell them to download a specially prepared tdm_mirrors.txt. You can find one attached to the first post here: http://forums.thedarkmod.com/topic/13179-packaging-and-testing-107/<br />
<br />
The linked post above already contains a few instructions you can copy from. Basically, instruct the team to use the <tt>--keep-mirrors</tt> switch when starting the tdm_update application, and to copy the tdm_mirrors.txt file into their test folder before running it. If the <tt>--keep-mirrors</tt> option is omitted the updater will connect to the regular TDM update mirrors, which is not the point.<br />
<br />
= The Test & Bugfix cycle =<br />
Once the testers post their bug reports, the dev team needs to get moving to fix them. It's recommended that all fixes will be committed to the trunk (both for darkmod and darkmod_src repos), and the release manager should merge the changes into the release branch.<br />
<br />
== Merge Fixes into the Release Branch ==<br />
Let's assume there is a fix that got committed to darkmod SVN in order to fix an issue discovered in the test package. Proceed like this to merge it to the release branch. <br />
* Make sure your local working copy is switched to the release branch. <br />
* Now right-click the darkmod folder and choose SVN > Merge<br />
* Select ''Merge a range of revisions''<br />
* As ''URL to merge from'' use the address of the trunk: [https://server/svn/darkmod/trunk https://<darkmod_server>/svn/darkmod/trunk]<br />
* In the field revision range to merge you need to specify which exact change you intend to merge. It's easier if you click the "Show Log" button right next to the entry field to view the SVN Log of the trunk. You can either select a single commit, or you can select a range of commits. Perhaps double-check the changes of that checkin.<br />
* Hit ''Next'', then ''Merge''.<br />
* Important: the changes will be incorporated into your ''working copy''. If you want these changes to actually be stored in the release branch, you need to perform the ''commit''.<br />
<br />
Special note for code changes: once these are committed to darkmod_src turnk, you need to merge them just like described above. Then you're going to recompile the game binaries (I recommend from scratch) and commit the tdm_game01.pk4 / tdm_game02.pk4 files to the darkmod release branch too.<br />
<br />
== Update the Test Package ==<br />
Re-package the TDM package, as described above. Just make sure everything is committed to the release branch and kick off another build process.<br />
<br />
== Test again ==<br />
Inform your testers about the update and which things got changed since the last test. Instruct them to update their test installation (don't forget to mention --keep-mirrors) and enter the next round of testing.<br />
<br />
= Release Time: Upload & Cleanup =<br />
Once the day has come to release the next version, connect to the TDM server using a secure shell (SSH) client, like [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY].<br />
<br />
Follow these steps, there are some things that need to be done afterwards, they are necessary for the ''next'' release to function properly:<br />
<br />
* Rebuild binaries from scratch, place in darkmod folder, and commit the darkmod folder.<br />
* 7-zip the Windows gamex86.pdb and TheDarkMod.pdb files and place them in the trunk darkmod/devel/release/debugging/2.0x folder. Add that folder to SVN and commit it.<br />
* Update the darkmod 2.0x branch tree and merge the just-placed debugging files to that branch. Commit the 2.0x branch.<br />
* Create the final package remotely as described above (through the website). <br />
* The above step will generate a new crc_info.txt and a tdm_version_info.txt file on the server.<br />
* Copy this crc_info.txt and tdm_version_info.txt to the folder packaging/darkmod/devel/release/version_info/2.0x and commit:<br />
** <tt>cd /data/tdm_releases/packaging/darkmod/devel/release/version_info</tt> <br />
** <tt>mkdir 2.0x</tt> (replace the x)</tt> <br />
** <tt>cd 2.0x</tt> <br />
** <tt>cp /data/www/tdm_update/crc_info.txt .</tt> <br />
** <tt>cp /data/www/tdm_update/tdm_version_info.txt .</tt> <br />
** <tt>cd ..</tt><br />
** <tt>svn add 2.0x</tt><br />
** <tt>svn ci --username=<YOUR_SVN_USER> -m "<YOUR COMMIT MESSAGE>"</tt><br />
* Check in the newly generated manifest, it should still be in the folder where the packaging script left it:<br />
** <tt>cd /data/tdm_releases/packaging/darkmod/devel/manifests</tt><br />
** <tt>svn ci --username=<YOUR_SVN_USER> -m "<YOUR COMMIT MESSAGE>"</tt><br />
* Create a tag for the darkmod and darkmod_src repositories (/tags/2.0x) - copy it from the latest revision in the corresponding release branch.<br />
** Switch your darkmod working copy to the 2.0x release branch<br />
** Choose SVN > Branch/Tag and fill in the dialog fields with the following:<br />
*** From WC/URL: https://svn.thedarkmod.com/svn/darkmod/branches/release2.0x<br />
*** To Path: /tags/2.0x<br />
*** Log message: Tag for 2.0x release<br />
*** Create a copy in the repository from: HEAD revision in the repository<br />
** Same goes for the darkmod_src repository, just replace /darkmod/ with /darkmod_src/ above.<br />
* Copy package from /data/www/tdm_update to /data/tdm_releases/2.0x/ for archiving. The next package process will need it there.<br />
** cd /data/tdm_releases<br />
** mkdir 2.0x<br />
** cp -r /data/www/tdm_update/* 2.0x<br />
* Copy /data/tdm_releases/1.05/index.html to /data/tdm_releases/2.0x<br />
* Move all differential packages back to /data/www/tdm_update<br />
** <tt>mv /data/tdm_releases/2.0x/tdm_update_1.0*.zip /data/www/tdm_update</tt><br />
** <tt>mv /data/tdm_releases/2.0x/tdm_update_2.0*.zip /data/www/tdm_update</tt><br />
* Copy the one differential update package updating to the new 2.0x version back to /data/tdm_releases/2.0x<br />
** <tt>cp /data/www/tdm_update/tdm_update_2.0y_to_2.0x.zip to /data/tdm_releases/2.0x</tt> (y = x-1)<br />
* At this point, the /data/tdm_releases/2.0x folder contains a valid TDM 2.0x release, the one that will be pushed to all the mirrors. Examine it for double safety.<br />
* Examine the upload_to_all_mirrors.sh shell script, to see if it fits your needs.<br />
* Start uploading to all mirrors.<br />
** <tt>./upload_to_all_mirrors.sh 2.0x</tt><br />
* Update tdm_mirrors.txt and tdm_version.xml on thedarkmod.com/update: ask Springheel or somebody with website access to do that. The tdm_mirrors.txt file is probably fine, but the tdm_version.xml needs to be updated.<br />
<br />
== Update the Wiki ==<br />
<br />
The wiki contains one page for each release. You can find them all in the [[:Category:What's New]] category. <br />
<br />
First update the current release page:<br />
<br />
* Change the "roadmap" link on the current release to a "changelog" link by swapping ''"roadmap_page.php?version_id=XX"'' with ''"changelog_page.php?version=XX"''.<br />
* Add the ''<nowiki>{{released|2.01|2014-01-30}}</nowiki>'' Template on top of the current release page with the correct date.<br />
<br />
Then add a new page for the next release. To do this, add a link to it in this template: [[Template:Whatsnew]] by editing it. After saving the template, a link to the new release version page appears in the list and in the category. Edit this page and insert some text into it (you can copy it from an older release page).<br />
<br />
Also insert a link to the current roadmap on the bugtracker, you can find out the version_id by looking at [http://bugs.thedarkmod.com/roadmap_page.php the roadmap page]. <br />
<br />
<br />
= Glossary =<br />
* Release Fileset: the PK4 files forming the actual release. <br />
* SVN: an acronym for Subversion, a version control system<br />
* Commit: The process of a team member uploading files to the SVN repository - a commit always creates a new SVN revision.<br />
* Mirrors: The servers where the PK4 files are stored for download by the updater.<br />
* updater: The TDM Updater executable, used for downloading and updating TDM.<br />
* binary: Source code is compiled into so-called binaries. This can be an executable (.exe) file or a module (.dll/.so).<br />
* darkmod_src: The code repository holding all the TDM source files, including the tdm_update application.<br />
* branch: A tree in the SVN repository. Several branches can co-exist side-by-side without interfering.<br />
* trunk: The main branch where all the ongoing development is happening.<br />
<br />
{{todo}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.00&diff=17523
What's new in TDM 2.00
2014-02-01T12:40:10Z
<p>Tels: change roadmap link to changelog</p>
<hr />
<div><!-- keywords whats new --><br />
See also the [http://bugs.angua.at/changelog_page.php?version_id=59 changelog] on our bugtracker.<br />
{{released|2.00|2013-10-08}}<br />
<br />
== Changes / Features / Issues fixed ==<br />
<br />
* [http://bugs.angua.at/view.php?id=578 #578]: falling on a lowering platform doesn't properly subtract the relative velocity, so you get more hurt than you should (Design/Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=1104 #1104]: Gas arrows leak through glass and doors (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=1184 #1184]: Glass doors - spawnarg to disable portal closing (Mapping) (grayman)<br />
* [http://bugs.angua.at/view.php?id=1188 #1188]: Target entity for easy changing of AI sound loss on portals (Mapping) (grayman)<br />
* [http://bugs.angua.at/view.php?id=1771 #1771]: Need minimum time (or some control method) between barks of different alert levels (AI)(angua)<br />
* [http://bugs.angua.at/view.php?id=2416 #2416]: Sleeping AI can fall through the ground when they wake up (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=2527 #2527]: Give weapons to archers (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=2533 #2533]: Archers run into player at melee range (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=2624 #2624]: Buggy AI prop lantern (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=2682 #2682]: Savegame names with dots overwrite each other (Loading\Saving) (tels)<br />
* [http://bugs.angua.at/view.php?id=2752 #2752]: Changing AIs from neutral to enemies during game does not work unless the AIs bump into each other. (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=2829 #2829]: Flashbombs should reduce AI hearing as well. (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=2924 #2924]: AI react too fast to missing objects (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=2925 #2925]: AI should look at target when warning (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=2953 #2953]: Add _Propogated_ material-specific bounce sounds to ragdolls (Coding) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=2964 #2964]: Combat: Enemy AI get stuck after hitting each other once (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=2966 #2966]: Get rid of hardcoded ~/doom3 path on Linux (coding) (tels)<br />
* [http://bugs.angua.at/view.php?id=3009 #3009]: Blocking AI in chair traps them in place (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3042 #3042]: Open visportals do not propagate sound loss to player. (Sound System) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3100 #3100]: Having an unaccessible path_flee_point breaks AI fleeing behavior (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3108 #3108]: Merge 7318's 3D Skybox Code (coding) (7318 and grayman)<br />
* [http://bugs.angua.at/view.php?id=3125 #3125]: Revising Framework/FileSystem for clarity (coding) (taaaki)<br />
* [http://bugs.angua.at/view.php?id=3128 #3128]: Movable Oil lamps behave strangely (Script/Def) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3140 #3140]: Use &quot;taking fire&quot; soundshader when AI hit by arrows (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3159 #3159]: Update longsword model (Models) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3166 #3166]: After putting away sword AI still uses weapon_idle (Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3181 #3181]: Examine which barks should propogate to friendly AI (AI) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3182 #3182]: Idle animations can interrupt idle barks. (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3195 #3195]: Prevent TDM from running as root (coding) (taaaki)<br />
* [http://bugs.angua.at/view.php?id=3201 #3201]: Replace D3 Heads (Models) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3202 #3202]: Mute AI can engage in greetings (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3203 #3203]: Crouch-walking on stone can NEVER alert AI (AI) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3209 #3209]: Missing idMover::Events (Coding) (tels)<br />
* [http://bugs.angua.at/view.php?id=3217 #3217]: Need script event to set text of objective (Objectives) (tels)<br />
* [http://bugs.angua.at/view.php?id=3223 #3223]: Add ability for individual entities to randomly not spawn (Coding) (tels)<br />
* [http://bugs.angua.at/view.php?id=3228 #3228]: Adding Sound loss on regular visportals (Sound System) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3232 #3232]: add a way for scripts to query the TDM version (Script/Def) (tels)<br />
* [http://bugs.angua.at/view.php?id=3239 #3239]: getRadius() script event is missing from lights (Script/Def) (tels)<br />
* [http://bugs.angua.at/view.php?id=3257 #3257]: Remove D3 setup scripts (Coding) (tels)<br />
* [http://bugs.angua.at/view.php?id=3258 #3258]: Stealth score doesn't include arrow alerts? (Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3259 #3259]: I18n.pl missing certain inventory name-setting syntax (coding) (tels)<br />
* [http://bugs.angua.at/view.php?id=3260 #3260]: Change the way scriptEvents are declared (Coding) (greebo)<br />
* [http://bugs.angua.at/view.php?id=3261 #3261]: Updater and in-game downloader choke on some HTTP responses (TDM Updater)(tels)<br />
* [http://bugs.angua.at/view.php?id=3263 #3263]: snd_opened does not work on sliding doors (Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3264 #3264]: Noshadows_lod_x spawnarg actually affects (x-1) LOD (Coding) (tels)<br />
* [http://bugs.angua.at/view.php?id=3271 #3271]: add getDifficultyLevel() script event (Script/Def) (tels)<br />
* [http://bugs.angua.at/view.php?id=3277 #3277]: Add getBoolKey() to scripting interface (Script/Def) (tels)<br />
* [http://bugs.angua.at/view.php?id=3278 #3278]: Snow particle effect dosent render in certain situations: (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3280 #3280]: AI Used to take cover from player; no longer working (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3282 #3282]: add getShouldered(), getDragged() and getGrabbed() script events (Script/Def) (tels)<br />
* [http://bugs.angua.at/view.php?id=3285 #3285]: atdm:ai_townsfolk_commoner has broken skin (Def / Setup) (tels)<br />
* [http://bugs.angua.at/view.php?id=3286 #3286]: Eating food can crash with ERROR:idRenderWorld::UpdateEntityDef: index = -1 (coding)(tels)<br />
* [http://bugs.angua.at/view.php?id=3287 #3287]: MapShutdown() is called twice during shutdown (Coding) (tels)<br />
* [http://bugs.angua.at/view.php?id=3288 #3288]: add floor() and ceil() script events (Script/Def) (tels)<br />
* [http://bugs.angua.at/view.php?id=3289 #3289]: add setViewAngles() to idPlayer (Script/Def) (tels)<br />
* [http://bugs.angua.at/view.php?id=3290 #3290]: When getting up, sitting AI might use the getting up from sleeping animation (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3291 #3291]: AI play wrong vocal when drowning (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3292 #3292]: Wrong objective level names in end mission screen (Design/Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3293 #3293]: Water Impact sounds (Sound) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3294 #3294]: Integrated Mission Downloader has inconsistent mission handling (for some missions) (Tweaking) (tels)<br />
* [http://bugs.angua.at/view.php?id=3297 #3297]: There is no ko_script spawnarg for AI. (Design/Coding) (tels)<br />
* [http://bugs.angua.at/view.php?id=3302 #3302]: Placing the playerstart inside a trigger_once_entityname causes crash. (Coding) (tels)<br />
* [http://bugs.angua.at/view.php?id=3307 #3307]: The &quot;finished mission&quot; mark is missing on line 10 (GUI) (tels)<br />
* [http://bugs.angua.at/view.php?id=3309 #3309]: Too easy to kill AI with arrows. (Def / Setup) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3310 #3310]: Civilian AI should flee when encountering dead body. (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3313 #3313]: Picked pockets are counted twice (Design/Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3314 #3314]: Found bodies of enemies killed by player do not count to 'Bodies found' (Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3315 #3315]: Second identical item pickpocketed does not count to &quot;Pockets picked&quot; statistic (Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3316 #3316]: Pickup messages for stackable objects do not include count information. (Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3317 #3317]: AI need ability to react to sudden deaths of nearby AI (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3318 #3318]: Find someone to do Yandros's script (sound) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3322 #3322]: pagan belt is black (AI) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3323 #3323]: Need support for AI greeting pagans and beggars (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3325 #3325]: Need barks for civilians fleeing after seeing body (AI) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3330 #3330]: Correct incorrect AI ranks (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3331 #3331]: AI have several problems when entering Combat (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3332 #3332]: Some electric lights not working recently (Def / Setup) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3335 #3335]: Replace D3 impact sounds (Sound) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3338 #3338]: AI Greetings should have additional limits (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3340 #3340]: Sound is leaking out of area it shouldn't (Sound) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3341 #3341]: AI do not do random head-turning when searching? (AI) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3343 #3343]: Human AIs don't see monsters (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3345 #3345]: Flame based lights not working in Standalone TDM (Coding) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3347 #3347]: Next batch of sounds to replace (Sound) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3348 #3348]: Rig new skeleton (AI) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3349 #3349]: Rusted builder needs new arms and legs (AI) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3351 #3351]: Game crashes on load if no FM in fms folder. (TDM Launcher) (taaaki)<br />
* [http://bugs.angua.at/view.php?id=3353 #3353]: Crashing Upon Approaching Mine(s) With Lockpicks Drawn To Disarm (Saving/Loading) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3355 #3355]: AI react too quickly to barks that include messages (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3356 #3356]: AI respond too quickly to audible alerts (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3357 #3357]: Fleeing AI problem at path_flee (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3358 #3358]: Cannonball damages player differently than AI (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3360 #3360]: Standalone textures needed (Textures) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3361 #3361]: atdm:moveable_torch1 does not extinguish if dropped sideways (Script/Def) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3363 #3363]: Drop body sound using blackjack sheath? (Sound) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3368 #3368]: Envshot is broken in TheDarkMod.exe (coding) (taaaki)<br />
* [http://bugs.angua.at/view.php?id=3370 #3370]: Moveables can hurt the player and AI (Physics) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3372 #3372]: AI not playing pain animation (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3373 #3373]: Builder2 vocals missing monster barks (AI) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3375 #3375]: Sleeping Builder in Outpost not sleeping (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3381 #3381]: Briefing videos are broken (GUI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3385 #3385]: Blood Decals not dropping? (textures) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3386 #3386]: Blood Decals fading away (textures)(grayman)<br />
* [http://bugs.angua.at/view.php?id=3387 #3387]: Change the TDM revision number from 1.09 to 2.00 (Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3388 #3388]: Issue with Transaction scripted scene *spoilers* (Def / Setup) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3389 #3389]: Inaccurate AI positioning on elevators (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3390 #3390]: Door Handling -- AI couldn't open half-open door. (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3391 #3391]: Allow warnings and crashes when def entities don't exist (Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3392 #3392]: flickering light entities not working properly (Def / Setup) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3393 #3393]: TDM 2.00 crashes Alberic's Curse (Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3394 #3394]: Ragdoll AI not propagating sounds properly (Sound) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3395 #3395]: Create/re-enable voice volume slider in main menu (Sound) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3396 #3396]: Need to distinguish between sleeping on bed and sleeping on floor (AI) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3397 #3397]: Stange sound distortion in Let Sleeping Thieves Lie (Sound) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3399 #3399]: Func_portals disable info_locationseperator entities. (Design/Coding) (grayman)<br />
* [http://bugs.angua.at/view.php?id=3401 #3401]: Drowning broken? (Def / Setup) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3402 #3402]: atdm:lamp_electric_square_1_lit is too bright (Def / Setup) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3403 #3403]: Alpha layer borked in texture - textures/darkmod/decals/dirt/stain01bwet (textures) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3404 #3404]: Gas arrows not putting out torches? (Physics) (Springheel)<br />
* [http://bugs.angua.at/view.php?id=3406 #3406]: [GUI] Voice audio settings are not translated (tels) <br />
* [http://bugs.angua.at/view.php?id=3410 #3410]: [Distribution] TDM 2.0 beta exits with error code on startup (taaaki) <br />
* [http://bugs.angua.at/view.php?id=3411 #3411]: [Coding] Common difficulty names are not translated (tels) <br />
* [http://bugs.angua.at/view.php?id=3413 #3413]: [Sound] Swimming and splashing (jump into water) do not propagate sound to AI (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3414 #3414]: [AI] Eliminate or reduce wavering in AI walk (grayman) <br />
* [http://bugs.angua.at/view.php?id=3415 #3415]: [AI] AI greeting can occur too often for stationary AI or multiple AI in a group (grayman) <br />
* [http://bugs.angua.at/view.php?id=3419 #3419]: [Coding] in-game downloader does not randomize the server URLs (tels) <br />
* [http://bugs.angua.at/view.php?id=3420 #3420]: [AI] Daggers don't have replacement anims (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3422 #3422]: [AI] AI ignore breaking glass of gas arrow (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3423 #3423]: [AI] Idle barks during searches (grayman) <br />
* [http://bugs.angua.at/view.php?id=3424 #3424]: [AI] A group of guards can search for too long (grayman) <br />
* [http://bugs.angua.at/view.php?id=3425 #3425]: [AI] New walk causes clipping with pauldrons (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3426 #3426]: [AI] Head 06 has see-through mouth (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3430 #3430]: [AI] AI giving 'return to idle' bark after search (grayman) <br />
* [http://bugs.angua.at/view.php?id=3431 #3431]: [AI] AI think they see you when coming out of blind state. (grayman) <br />
* [http://bugs.angua.at/view.php?id=3432 #3432]: [Textures] Some decals not transparent enough (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3435 #3435]: [AI] Zombie missing a sound/swing for melee attack (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3438 #3438]: [AI] There should be no rampdown barks in Observant State (grayman) <br />
* [http://bugs.angua.at/view.php?id=3440 #3440]: [Def / Setup] Zombies should not take damage from arrows; visual indicator needed (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3443 #3443]: [Sound] Weight "question" greetings higher (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3445 #3445]: [AI] AI goes into alert_idle because of rats. (grayman) <br />
* [http://bugs.angua.at/view.php?id=3448 #3448]: [AI] An AI passing a conversation is allowed to greet the conversation AI (grayman) <br />
* [http://bugs.angua.at/view.php?id=3449 #3449]: [AI] Alert index check problem in conversations (grayman) <br />
* [http://bugs.angua.at/view.php?id=3450 #3450]: [AI] Zombie IK not on (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3452 #3452]: [Physics] Moveable planks don't fall realistically (grayman) <br />
* [http://bugs.angua.at/view.php?id=3455 #3455]: [Sound] Something is wrong with soundprop to player (grayman) <br />
* [http://bugs.angua.at/view.php?id=3461 #3461]: [Sound] Check player volume for footsteps (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3462 #3462]: [AI] AI should turn head to look at doors opening (grayman) <br />
* [http://bugs.angua.at/view.php?id=3468 #3468]: [AI] Zombies kneel while searching (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3471 #3471]: [Sound] Default "snd_footstep" not playing for AI (grayman) <br />
* [http://bugs.angua.at/view.php?id=3473 #3473]: [Animation] AI sometimes get "stuck" leaning back (grayman) <br />
* [http://bugs.angua.at/view.php?id=3476 #3476]: [Models] Nobleman head has bad weighting around mouth (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3484 #3484]: [AI] Sword attachment points need adjusting (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3485 #3485]: [Coding] Landing when crouched makes no noise (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3487 #3487]: [AI] Sleepers are giving "to_observant" barks (grayman) <br />
* [http://bugs.angua.at/view.php?id=3489 #3489]: [Sound] Readables making incorrect impact sound (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3492 #3492]: [AI] AI vision tests (grayman) <br />
* [http://bugs.angua.at/view.php?id=3496 #3496]: [AI] "Surprise Bark" interrupts other barks and seems out of place (grayman) <br />
* [http://bugs.angua.at/view.php?id=3497 #3497]: [Sound] Need snd_state5 vocal (grayman) <br />
* [http://bugs.angua.at/view.php?id=3498 #3498]: [AI] Some alert barks are out of place with latched alerts (grayman) <br />
* [http://bugs.angua.at/view.php?id=3499 #3499]: [Sound] Need More Zombie Footsteps (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3500 #3500]: [Graphics] Bad particle (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3502 #3502]: [AI] Zombie not making water footstep sounds (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3505 #3505]: [AI] Create 'no_alert_idle' spawnarg (grayman) <br />
* [http://bugs.angua.at/view.php?id=3506 #3506]: [AI] AI should turn head to look at doused lights (grayman) <br />
* [http://bugs.angua.at/view.php?id=3510 #3510]: [AI] AI doesn't complete relight (grayman) <br />
* [http://bugs.angua.at/view.php?id=3511 #3511]: [Textures] New textures (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3517 #3517]: [Def / Setup] Player water impact makes too much noise (Springheel) <br />
* [http://bugs.angua.at/view.php?id=3524 #3524]: [Coding] Certain lights not contributing to illumination (grayman) <br />
* [http://bugs.angua.at/view.php?id=3544 #3544]: [Sound] Hum from electric lights is very annoying (grayman) <br />
* [http://bugs.angua.at/view.php?id=3552 #3552]: [AI] drunk_acuity_factor is applied twice to sleepers (grayman) <br />
* [http://bugs.angua.at/view.php?id=3554 #3554]: [Objectives] atdm:target_setobjective_component_state doesn't work (grayman) <br />
* [http://bugs.angua.at/view.php?id=3557 #3557]: [Coding] Clicking Objectives option from Failed Screen causes crash (taaaki)<br />
<br />
<br />
== AI ==<br />
<br />
* Builder default head replaced by new model (Springheel)<br />
* Upgrades to Commoner mesh and textures; several new skins added (Springheel)<br />
<br />
[[Image:Commoners old.gif|800px|center|Click to see a comparison]]<br />
<br />
* Unarmed AI will flee if a they find a body (grayman)<br />
* AI now react differently if they see someone killed vs finding the body later (grayman)<br />
* Corrected a bug that caused a pair of AI to greet each other once, and then never again. (grayman)<br />
* AI now react to the sounds of bodies falling to the ground<br />
* neutral and friendly AI will now greet the player<br />
<br />
== Animations ==<br />
<br />
* Updated walk animations (Arcturus)<br />
* new zombie animations (Arcturus)<br />
<br />
== Entities/Skins/Models ==<br />
<br />
<br />
== Sounds ==<br />
<br />
Too many to list<br />
<br />
See also [[Standalone_Progress]]<br />
<br />
== Coding ==<br />
<br />
* Support for flying AI added (angua)<br />
* Players can no longer hide in shadows created by objects they are carrying (Rebb)<br />
* Bodies now make noise when they fall into water. (Springheel)<br />
* AI will not be so easily killed (corrected combat settings that were modifying AI HP by -50 (!) on Normal setting). (Springheel)<br />
* Visportals can now block sounds to the player as well as the AI. Mappers have a great deal more flexibility in controlling how much sound doors and windows block. (grayman)<br />
* 7318's new skybox code has been added allowing for HL2 style skyboxes (7318 and Grayman)<br />
<br />
<br />
=== Scripting Interface ===<br />
<br />
The scripting interface has been greatly enhanced to make it more versatile:<br />
<br />
* Script events need now only be declared on the SDK side (greebo).<br />
* There are many new functions (tels):<br />
** to modify objectives<br />
** transform numbers (ceil(), floor(), getBoolKey())<br />
** determine the difficulty level<br />
** call functions when an AI is knocked out<br />
** get the entity that the player drags, shoulders or has grabbed<br />
<br />
== Textures ==<br />
<br />
Too many to list.<br />
<br />
See also [[Standalone_Progress]]<br />
<br />
== Standalone TDM ==<br />
<br />
* Four D3 heads replaced by new models (Springheel)<br />
* D3 Zombie replaced by new mesh (greebo)<br />
* Beggar model is completely updated to remove D3 parts (Springheel)<br />
* Replacement spider sounds (Springheel)<br />
* skeleton model replaced with new mesh (Mr. Lemonyfresh)<br />
<br />
== Translation ==<br />
<br />
Significant contributions over the course of 2.0 development. Last documented in [[Translation]]<br />
<br />
{{whatsnew|sort=200}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.01&diff=17522
What's new in TDM 2.01
2014-02-01T12:39:36Z
<p>Tels: add release date (might be not entirely accurate, please fix)</p>
<hr />
<div><!-- keywords whats new --><br />
<!-- keywords whats new --><br />
See also the [http://bugs.angua.at/changelog_page.php?version_id=63 changelog] on our bugtracker.<br />
{{released|2.01|2014-01-30}}<br />
<br />
= AI =<br />
<br />
* Graphical improvements: Most female characters have been updated with better rigging, improved meshes and textures. ''(Springheel)''<br />
* All female heads and a couple male heads have been improved. ''(Springheel)''<br />
* Revenants slightly more resistant to sword blows; more vulnerable to holy water.<br />
* Skeletons more vulnerable to holy water.<br />
<br />
<br />
= Combat =<br />
<br />
* Some new weapon sounds added. ''(Springheel)''<br />
* AI far more likely to lunge forward while attacking, making it more difficult to dodge by running backwards. ''(Springheel)''<br />
* Bug that caused AI to do double damage when hitting player has been fixed ''(grayman)''<br />
* Slight adjustments to combat difficulty settings to make lower setting easier and higher setting harder. ''(Springheel)''<br />
<br />
<br />
= Code =<br />
<br />
* Calling folder something other than "darkmod" will no longer cause error when loading games. ''(taaaki)''<br />
* Fixes to the way AI detect bodies. ''(grayman)'' <br />
* Hitting "use" while reading static readable no longer consumes inventory item. ''(grayman)'' <br />
<br />
<br />
= Assets =<br />
<br />
* New dungeon chain models added ''(HMart)''<br />
<br />
<br />
{{whatsnew|sort=200}}</div>
Tels
https://wiki.thedarkmod.com/index.php?title=Template:Whatsnew&diff=17512
Template:Whatsnew
2014-01-26T10:47:18Z
<p>Tels: add 2.01</p>
<hr />
<div><noinclude><br />
This template displays a "See also" section with links to other changelogs. Also:{{template-help|name=whatsnew|sort=Whatsnew}}<br />
</noinclude><br />
<includeonly><br />
== See also ==<br />
<br />
* [[What's new in TDM 2.01]]<br />
* [[What's new in TDM 2.00]]<br />
* [[What's new in TDM 1.08]]<br />
* [[What's new in TDM 1.07]]<br />
* [[What's new in TDM 1.06]]<br />
* [[What's new in TDM 1.05]]<br />
* [[What's new in TDM 1.04]]<br />
* [[What's new in TDM 1.03]]<br />
* [[What's new in TDM 1.02]]<br />
* [[What's new in TDM 1.01]]<br />
* [http://thedarkmod.com/downloads.php Download TDM]<br />
<br />
[[Category:What's New|{{{sort|{{PAGENAME}}}}}]]<br />
</includeonly></div>
Tels
https://wiki.thedarkmod.com/index.php?title=What%27s_New_in_2.01&diff=17511
What's New in 2.01
2014-01-26T10:45:47Z
<p>Tels: Tels moved page What's New in 2.01 to What's new in TDM 2.01: Use the same format for every "What's new" page.</p>
<hr />
<div>#REDIRECT [[What's new in TDM 2.01]]</div>
Tels
https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.01&diff=17510
What's new in TDM 2.01
2014-01-26T10:45:47Z
<p>Tels: Tels moved page What's New in 2.01 to What's new in TDM 2.01: Use the same format for every "What's new" page.</p>
<hr />
<div><!-- keywords whats new --><br />
See also the [http://bugs.thedarkmod.com/roadmap_page.php roadmap] <!-- http://bugs.thedarkmod.com/roadmap_page.php] --> on our bugtracker.<br />
<br />
<br />
= AI =<br />
<br />
* Graphical improvements: Most female characters have been updated with better rigging, improved meshes and textures. ''(Springheel)''<br />
* All female heads and a couple male heads have been improved. ''(Springheel)''<br />
* Revenants slightly more resistant to sword blows; more vulnerable to holy water.<br />
* Skeletons more vulnerable to holy water.<br />
<br />
<br />
= Combat =<br />
<br />
* Some new weapon sounds added. ''(Springheel)''<br />
* AI far more likely to lunge forward while attacking, making it more difficult to dodge by running backwards. ''(Springheel)''<br />
* Bug that caused AI to do double damage when hitting player has been fixed ''(grayman)''<br />
* Slight adjustments to combat difficulty settings to make lower setting easier and higher setting harder. ''(Springheel)''<br />
<br />
<br />
= Code =<br />
<br />
* Calling folder something other than "darkmod" will no longer cause error when loading games. ''(taaaki)''<br />
* Fixes to the way AI detect bodies. ''(grayman)'' <br />
* Hitting "use" while reading static readable no longer consumes inventory item. ''(grayman)'' <br />
<br />
<br />
= Assets =<br />
<br />
* New dungeon chain models added ''(HMart)''<br />
<br />
<br />
{{whatsnew|sort=200}}</div>
Tels