Erstellen einer TiberianDawn Mod mit Visual Studio 2019

Nov 27, 2004
3
5
220
Da schon mehrfach im Discord gefragt wurde hier ein kurzes Tutorial zum erstellen von TD Mods auch für nicht Programmierer. ;)

Im Gegensatz zu Red Alert hat Tiberian Dawn KEINE konfigurierbare rules.ini Datei. Es gibt eine pseudo rules ini aber diese wird nicht aufgerufen.
Zum erstellen von Mods ist es daher zwingend erforderlich den C++ Code zu modifizieren. Aber keine Sorge es sieht schwieriger aus als es ist. :)

Erstellen einer TiberianDawn Mod mit dem CnC Remastered Source Code

1. Code runterladen https://github.com/electronicarts/CnC_Remastered_Collection

Optional (für Fortgeschrittene) gleich das Repository forken (Button oben rechts in Github) und ein eigenes Repository erstellen. So können spätere offizielle patches mit "git pull" schneller reingezogen werden und andere Modder können an dem Mod Code mitarbeiten. In der Windows Konsole mit "git clone https://github.com/MEINGITHUBACCOUNT/CnC_Remastered_Collection.git" eine lokale Kopie erstellen und fortfahren mit 2. (Falls git nicht installiert ist https://git-scm.com/)

2. Visual Studio Community Edition & C++ Desktop/Spiele Entwicklung Package installieren



3. Windows 8.1 SDK installieren


4. Die Projektmappe CnCRemastered.sln in Visual Studio 2019 öffnen und über "Projekt" -> "Projekt neu ausrichten" wählen damit das Projekt umgeschrieben wird auf version 2019

5. In den Projekt Optionen WINDOWS_IGNORE_PACKING_MISMATCH eintragen unter

Project Settings > C/C++ > Code Generation > Struct Member Alignment

6. In TiberianDawn.rc den include "afxres.h" durch "windows.h" ersetzen

7. Gewünschte Änderungen an Einheiten machen und Projektmappe builden(erstellen)

Als ein gutes Beispiel dient der NUKETANK den man findet wenn man im code nach PETROGLYPH_EXAMPLE_MOD sucht.
Die Werte sind auch ganz gut dokumentiert. Am interessantesten für die meisten sind wohl NAME, AMMO, STRENGTH, SIGHTRANGE, COST, SPEED, ARMOR

Die Werte sind in folgenden Dateien konfigurierbar
Infantrie -> IDATA.cpp
Fahrzeuge -> UDATA.cpp
Flugzeuge -> AADATA.cpp
Gebäude -> BDATA.cpp
Waffengattungen -> BBDATA.cpp
Mauern, Overlays -> ODATA.cpp
Animationen -> ADATA.cpp

Die definifierten Werte der Konstanten wie z.B. MPH_KINDA_SLOW findet man im DEFINES.h

WICHTIG! Die Reihenfolge der Werte des jeweiligen Constructors müssen gleich bleiben!

C++:
#ifdef PETROGLYPH_EXAMPLE_MOD

// Nuke tank
static UnitTypeClass const UnitNukeTank(
    UNIT_NUKE_TANK,
    TXT_HTANK,                              // NAME:            Text name of this unit type.
    "NTNK",                                 // NAME:            Text name of this unit type.
    ANIM_ART_EXP1,                          // EXPLOSION:   Type of explosion when destroyed.
    7,                              // Build level.
    STRUCTF_TEMPLE,         // Building prerequisite.
        true,               // Can this be a goodie surprise from a crate?
        true,               // Is a leader type?
        false,          // Only has eight facings?
        false,          // Always use the given name for the vehicle?
        false,          //  Is this a typical transport vehicle?
        false,          // Can it be crushed by a heavy vehicle?
        true,               // Can this unit squash infantry?
        false,          // Does this unit harvest Tiberium?
        false,          // Is invisible to radar?
        true,               // Is selectable by player?
        true,               // Can it be a target for attack or move?
        false,          // Is it insignificant (won't be announced)?
        false,          // Is it immune to normal combat damage?
        true,               // Is it equipped with a combat turret?
        false,          // Fires multiple shots in quick succession?
        true,               // Can it be repaired in a repair facility?
        true,               // Can the player construct or order this unit?
        true,               // Is there a crew inside?
        false,          // Does it have a rotating radar dish?
        false,          // Is there an associated firing animation?
        false,          // Must the turret be in a locked down position while moving?
        true,               // Does it lay tracks while moving?
        true,               // Is this a gigundo-rotund-enormous unit?
        false,          // Is the unit's art as "chunky" cardinal facing only?
        false,          // Is the unit capable of cloaking?
        false,          // Does the unit have a constant animation?
    -1,                                     // AMMO:            Number of shots it has (default).
    600,                                        // STRENGTH:    Strength (in damage points).
    6,                                          // SIGHTRANGE:  Range of sighting.
    1500,                                       // COST:            Cost to build (Credits).
    10,                                     // SCENARIO:    Starting availability scenario.
    80,80,                                  // RISK/RWRD:   Risk/reward rating values.
    HOUSEF_MULTI1|
    HOUSEF_MULTI2|
    HOUSEF_MULTI3|
    HOUSEF_MULTI4|
    HOUSEF_MULTI5|
    HOUSEF_MULTI6|
    HOUSEF_JP|
    HOUSEF_BAD,                             // OWNABLE:     Ownable by house (bit field).
    WEAPON_NUKE_LOB,WEAPON_NONE,
    ARMOR_STEEL,                            // ARMOR:       Armor type
    SPEED_TRACK,                            // MOVE:            Locomotion type.
    MPH_KINDA_SLOW,                     // SPEED:       Miles per hour.
    3,                                          // ROT:         Rate of turn (degrees per tick).
    0,                                          // Turret center offset along body centerline.
    MISSION_HUNT                            // ORDERS:      Default order to give new unit.
);

#endif PETROGLYPH_EXAMPLE_MOD

8. Kompilierte DLL TiberianDawn.dll aus Verzeichnis "bin/Win32" in CnCRemastered/Mods/Tiberian_Dawn/MeineMod/Data verzeichnis kopieren


9. JSON Konfigurationsdatei CnCRemastered/Mods/Tiberian_Dawn/MeineMod/ccmod.json hinzufügen

JSON:
{
    "name": "TestMod",
    "description": "Test",
    "author": "Tester",
    "load_order": 1,
    "version_low": 0,
    "version_high": 1,
    "game_type": "TD"
}

10. Mod im Spiel unter Optionen auswählen und testen.
 
Last edited: