Translate
Appearance
Text
This page always uses small font size
Width
Color (beta)
This tool does not work without JavaScript. JavaScript is disabled, failed to work, or this browser is unsupported.
Translations:Development/Page display title/ceb
Development
You need translation rights to translate messages.Get permission
Loading...
Latest updatesAll changes
Suggestions
In other languages
Need more help?Ask for more information
This article aims to introduce you into DDNet '''''development''''', since it's an open-source game, it relies on random people kind enough to contribute to it on their free time.
Translations:Development/1/ceb
This article aims to introduce you into DDNet '''''development''''', since it's an open-source game, it relies on random people kind enough to contribute to it on their free time.
You need translation rights to translate messages.Get permission
Loading...
Latest updatesAll changes
Suggestions
In other languages
Need more help?Ask for more information
It is extremely recommended to set up a Linux environment to begin programming in DDNet for the following reasons (as of now):
*Most DDNet contributors actually use Linux to contribute.
*Easier package management, you can easily install all the needed libraries and begin contributing.
*This article doesn't have yet a Windows version and is focused on Linux.
First and foremost, DDNet is coded using the C++ programming language, you will need to be fairly familiar with it, but you can also know the basics and learn more with it.
Some useful resources to learn C++:
*[https://www.learncpp.com/ learncpp.com]
*[https://en.cppreference.com/w/ cppreference.com]
*Your search engine of preference
The source code of DDNet is managed using [https://git-scm.com/ Git], a version control system, an essential tool to collaborate with multiple developers.
If you don't have git yet in your Linux distribution, make sure to install it, for example in most debian/ubuntu based distributions: <code>sudo apt install git</code>.
The source code is located on [https://github.com/ddnet/ddnet Github], you can get the source code by cloning without the need of an account, but if you want to ever put your changes to the official source code you will need one.
If you are not familiar with git/github you can learn the basics here: [https://docs.github.com/en/get-started/quickstart/hello-world Hello World - Github]
If you are on Linux, you can install all the needed dependencies by reading the README on the DDNet github page: https://github.com/ddnet/ddnet#dependencies-on-linux--macos
<syntaxhighlight lang="bash">
sudo pacman -S --needed base-devel cmake curl ffmpeg freetype2 git glew glslang gmock libnotify libpng opusfile python rust sdl2 spirv-tools sqlite vulkan-headers vulkan-icd-loader wavpack x264
</syntaxhighlight>
<syntaxhighlight lang="bash">
sudo apt install build-essential cargo cmake git glslang-tools google-mock libavcodec-extra libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libcurl4-openssl-dev libfreetype6-dev libglew-dev libnotify-dev libogg-dev libopus-dev libopusfile-dev libpng-dev libsdl2-dev libsqlite3-dev libssl-dev libvulkan-dev libwavpack-dev libx264-dev python3 rustc spirv-tools
</syntaxhighlight>
We use CMake to control the compilation process, if you have all the dependencies installed, it's as easy as following these commands (make sure you are on the DDNet folder):
<syntaxhighlight lang="bash">
sudo xcode-select -s /Library/Developer/CommandLineTools
</syntaxhighlight>
Here are some general bits of information:
*Currently, the source code is compiled with the C++17 standard, but you will see that many parts of the code are more C-like since only mostly new code uses C++17 stuff.
*<code>std::string</code> is rarely used, char arrays plus using <code>system.h</code> methods for handling them are the norm.
*Most I/O code, formatting and printing is done using <code>system.h</code> provided methods.
Since DDNet is a cross-platform game, an abstraction layer over that is needed to make development easier, this directory contains many useful functions to handle that.
Here lies the game engine, it handles most stuff that is not gameplay related, such as graphics, sound, network, etc.
This game uses its own hierarchical object-oriented entity system, the main class to which all other entities derive from is <code>CEntity</code> located in <code>src/game/server/entity.h</code>.
These entities are managed by the game world located here <code>src/game/server/gameworld.h</code>
*[https://github.com/ddnet/ddnet/blob/master/src/game/server/entities/character.h CCharacter]: Represents a [[Special:MyLanguage/Common_Terminology#Tee|tee]] that is alive, it is instantiated when a tee spawns and deleted when it dies.
* [https://github.com/ddnet/ddnet/blob/master/src/game/server/player.h CPlayer] contains information not related to the [[Common Terminology/fr#Tee|Tee]] (nickname, flag, etc.).
The client side is made up of components, these are classes that inherit [https://github.com/ddnet/ddnet/blob/master/src/game/client/component.h CComponent] defined in <code>src/game/client/component.h</code>. These components can implement the virtual methods such as <code>OnInit</code>, <code>OnMessage</code>, etc. to provide their functionality.
The network protocol is mostly generated by python scripts that output C++ code, for example, <code>datasrc/network.py</code> defines all network packets.
The ongoing discussion on code conventions is located here: [https://github.com/ddnet/ddnet/issues/2945 ddnet#2945]
<blockquote>
This style puts the brace associated with a control statement on the next line, indented to the same level as the control statement. Statements within the braces are indented to the next level.
</blockquote>
Must be prefixed by <code>C</code> (for legacy reasons this is ignored for structs in some places, such as in graphics code) or <code>I</code> for interfaces. New <code>struct</code>s should be prefixed by <code>S</code>.
Should be ''screaming snake case [https://en.wikipedia.org/wiki/Snake_case]'', for example: <code>MAX_PLAYERS</code>
<syntaxhighlight lang="cpp">
enum
{
FAKETUNE_FREEZE = 1,
FAKETUNE_SOLO = 2,
FAKETUNE_NOJUMP = 4,
FAKETUNE_NOCOLL = 8,
FAKETUNE_NOHOOK = 16,
FAKETUNE_JETPACK = 32,
FAKETUNE_NOHAMMER = 64,
};
</syntaxhighlight>
*The names of variables contain 3 parts: qualifier, prefix and name.
*Variable names should start with uppercase unless they are 1 char long without any prefix or qualifier, for example: <code>i</code>, <code>x</code>, <code>y</code>.
*Variables can have more than 1 qualifier (or zero) and more than 1 prefix (or zero).
*<code>m</code> for member variables: <code>m_MyVariable</code>.
*<code>s</code> for static variables: <code>s_MyStaticVariable</code>, <code>ms_MyStaticMemberVariable</code>.
*<code>g</code> for global variables with external linkage: <code>gs_MyGlobalStaticVar</code>.
*<code>p</code> for pointers: <code>pMyPointer</code>, <code>m_pCharacter</code>, <code>ppMyPointerToPointer</code>.
*<code>a</code> for arrays: <code>aMyArray</code>, <code>aBuf</code>.
*<code>v</code> for <code>std::vector</code>s: <code>vMyVector</code>, <code>vpvMyVectorOfPointersToVectors</code>.
*<code>fn</code> for functions: <code>pfnMyCallback</code>, <code>m_papfnMyPointerToArrayOfCallbacks</code>.
<syntaxhighlight lang="cpp">
char aBuf[128];
str_format(aBuf, sizeof(aBuf), "number: %d", 2);
</syntaxhighlight>
See [https://cplusplus.com/reference/cstdio/printf/ printf documentation] for a list of all format specifiers.
===Iterating over all players===
<syntaxhighlight lang="cpp">
for(int i = 0; i < MAX_CLIENTS; i++)
{
// Server-side
CPlayer *pPlayer = GameServer()->m_apPlayers[i];
}
</syntaxhighlight>
<syntaxhighlight lang="cpp">
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "wikiprint", "Hello from the ddnet wiki!");
</syntaxhighlight>
<syntaxhighlight lang="cpp">
int i = 2;
dbg_msg("wikiprint", "Hello from the ddnet wiki: %d", i);
</syntaxhighlight>
===Translating text in the client===
<code>Localize</code> can be used in the game client to get the translation for a specific string from the language file selected by the user.<syntaxhighlight lang="cpp">
DoButton(..., Localize("Connect"), ...);
</syntaxhighlight>The string can also contain format specifiers. The translated string must contain the same format specifiers.<syntaxhighlight lang="cpp">
char aBuf[128];
str_format(aBuf, sizeof(aBuf), Localize("%d of %d servers"), NumServers, TotalServers);
</syntaxhighlight>A script is used to scan the code for calls to <code>Localize</code> and collect the strings to update the translation files. For this reason, the call to <code>Localize</code> must not contain any other code, or the script cannot determine the text correctly.<syntaxhighlight lang="cpp">
// Do NOT do this:
const char *pStr = Localize(Team == TEAM_RED ? "Red team" : "Blue team");
// Do this instead:
const char *pStr = Team == TEAM_RED ? Localize("Red team") : Localize("Blue team");
</syntaxhighlight>
*[https://edgarluque.com/blog/ui-code-ddnet/ UI Code in DDraceNetwork] by [[Special:MyLanguage/User:Ryozuki|Ryozuki]]
*[https://edgarluque.com/blog/intro-to-ddnet/ An intro to the DDraceNetwork game source code] by [[Special:MyLanguage/User:Ryozuki|Ryozuki]]
*[https://edgarluque.com/blog/code-conventions-in-ddnet/ Code conventions in DDraceNetwork] by [[Special:MyLanguage/User:Ryozuki|Ryozuki]]
*[https://edgarluque.com/blog/chat-command-ddracenetwork/ Implementing a chat command in DDraceNetwork] by [[Special:MyLanguage/User:Ryozuki|Ryozuki]]
*[https://codedoc.ddnet.org/ Auto generated docs]
*[https://ddnet.org/libtw2-doc/ Technical documentation of Teeworlds file formats and network protocol]
*[https://heinrich5991.github.io/blog/blog/one-tick-unfreeze The Anatomy of a One Tick Unfreeze]
*[https://www.youtube.com/playlist?list=PLhJkqAQmOh5LyYOfnMy4PJB6CSZltQyTc Teeworlds programming YouTube tutorial] by [[User:ChillerDragon|ChillerDragon]]
*[https://chillerdragon.github.io/teeworlds-protocol/ Teeworlds 0.6/0.7 network protocol documentation] by [[User:ChillerDragon|ChillerDragon]]
Values put together by Patiga
Special Thanks to Jupstar
Segment Scaling:
body: 100%
feet: 150%
eyes: 120%
eye blink: 45%
hand: 93.75%
Positioning:
64/64 = 1 = width or height of the body segment
body: 4/64 up
feet:
10/64 down
7/64 left/right
eyes:
0.125 up
0.05 left/right
eye movement:
dir = angle of eyes (view angle), right = 0
eyes:
x: cos(dir) * 0.125
y: sin(dir) * 0.1
each eye (away from the other):
x: abs(cos(dir)) * 0.01
Loading messages...
0% translated, 0% reviewed
Retrieved from "https://wiki.ddnet.org/wiki/Special:Translate"