navi homePPSaboutscreenshotsdownloaddevelopmentforum

How to create a new gametype

I just want to share my experiences from creating Dynamicmatch as a c++ and orxonox newbie. Creating a new gametype is not very difficult - although you produce valuable content for Orxonox.

Where are the concerning source files?

All gametypes are stored in this folder. The most important source files are Gametype.<cc/h> All gametypes inherit the Gametype class. So most of your coding work is just to rewrite some functions.


Don't reinvent the wheel - try to copy and modify as much code from other gametypes as possible.

  1. Know what kind of gametype you want to create.
  2. Play existing gametypes and check which parts you want to adopt.
  3. Search in the concerning source files for code you can adopt.
  4. Start with the basic concept and add features later. (A Todo-List for the features would be nice.)

Testing-Level Creation

  • Level are stored in ../data/levels. You need a level to test your gametype.
  • For testing purposes just copy an existing level and rename it.
  • Don't forget to set gametype = YourGameType in the <level> tag.
  • Put "create a level for my new gametype" on your todo list :-) Later you should try to create a level that is optimized for your new gametype.

Change the AI-behaviour

  • The concerning file is in ../src/orxonox/controllers, called "".
  • You can make the bots stop shooting at certain targets by adding some lines of code in the bool ArtificialController::sameTeam-function as displayed above. The function should return true, if a bot shouldn't attack a certain target. (Since the AI-player is in the same "team".)

Miscellaneous tips - Useful at the beginning

  • Don't forget to add your gametype to the CMakeLists.txt or it won't compile.
  • Compiling with the terminal. Go to the folder of your orxonox branch. The command for compiling is cmake -j3.
  • Don't forget to backup your code via svn. Open a terminal, go to your orxonox branch-folder and type svn ci -m "reason for commitment or summary of latest changes .
  • Gamecommands: to add 2 new bots enter addbots 2, to remove one of them enter killbots 1. To display the scoreboard hit F2.
  • Have a look at enhanced datatypes provided by the std library - especially the map.

Important functions inherited from Gametype

Function nameEffect
allowPawnHitWhenever a player would recieve a hit this function is called - if the function returns false a hit is not possible
allowPawnDamageWhenever a player would recieve damage this function is called - if the function returns false damage is not possible
allowPawnDeathWhenever a player would die this function is called - if the function returns false death is not possible
playerEnteredwhat should happen, when a player entered the "battefield"?
playerLeftwhat should happen, when a player left the "battefield"?
setConfigValuesinterface for menue - to set the config values; ConfigValues are stored in a config file
tickthis function is called whenever a new frame is rendered; dt is the value how much time has passed since the last frame

Already implemented functions

Function EffectExamplesAdditional Info
Scoring Deathmatch, TeamBaseMatch in gametype.h : struct Player→frags_
Change ColourTeamDeathmatch, Dynamicmatch Dynamicmatch::setPlayerColour, Dynamicmatch::setConfigValues()
Countdown UnderAttackUnderAttack::tick, float gameTime_, int timesequence_

Text Output

There are two configurable ways how to display text in a gametype. You can display a line of text via sendStaticMessage() or sendFadingMessage().

  • In constructor: setHUDTemplate("yourgametypeHUD")
  • Use sendStaticMessage() or sendFadingMessage() functions in your gametype to display text
  • Define the look of the text via a ../data/overlays/yourgametypehhud.oxo file. Example: dynamicmatchhud.oxo
  • Include the template in your level file via include("yourgametypehud.oxo")

Level Creation

  • add spawnpoints or teamspawnpoints
  • add comments to structure your level file or to comment out code: <!— Comment —>
  • Basic objects: static entity and movable (rotating) entity
  • add 3D-objects (<Model> with mesh) and its physical form (<collisionShapes>)
    • randomness, loops → lua script
  • Examples:
    • linear movement: tansporter in gametype_underattack.oxw
    • circular movement: rotating satellite in gametype_dynamicmatch.oxw
    • force fields, deadly asteroids, in-game bots: gametype_asteroids.oxw

The Timer object

  • A timer is a object of the Timer class that call a function after a certain time.
  • You can find a short tutorial in /src/libraries/tools/Timer.h or a more detailed one in the wiki.
  • If the second argument is true, you create a timer-loop: The function is called periodically. Else the timer is only called once.
Last modified 3 years ago Last modified on Apr 12, 2017, 11:03:25 PM