[HOI 3] Neue Einheitenklasse,AirCav,Eisenbahngeschütz

  • Calmer
  • Calmers Avatar Autor
  • Besucher
9 Jahre 7 Monate her - 9 Jahre 7 Monate her #1 von Calmer
Zum Einheiten bauen sind folgende Schritte notwendig:
(Beispielbrigade wird hier Luftkavallerie sein, ein Klassiker ;))

  • I. Schritt - Das Grundgerüst.

    Grundsätzlich ist der Ausgangspunkt einer jeden Einheit eine simple .txt datei in dir/units. Um Anzufangen reicht es vollkommen eine neue Datei zu erstellen, da es keine Datei gibt, in der diese registriert werden müssen.
    Als Beispiel erschaffen wir nun eine neue air_cavalry_brigade.txt
    Es sollte definitiv eine klarer Name gewählt werden, da dieser als String dient.
    (Ich bin mir nicht sicher, ob HOI bereits aus dem Dateinamen oder erst aus dem Dateianfang den String zieht. Es erscheint mir aber sinnvoll, schon aus Übersichtlichkeitsgründen, beides gleich zu bezeichnen.)
    Als Beispiel nun ein kopierter Eintrag aus der Panzer-Brigade mit einigen kleinen Änderungen:

    air_cavalry_brigade = {  
     
            #General
            type = land            
    	sprite = Tank
    	active = no
     
     
         	#Size Definitions       
    	max_strength = 30
    	default_organisation = 30
    	default_morale = 0.30
    	officers = 100
     
    	#Building Costs        
    	build_cost_ic = 9.00
    	build_cost_manpower = 2.33
    	build_time = 190
     
    	#Misc Abilities
    	maximum_speed = 6.00
    	transport_weight = 20.00
    	supply_consumption = 1.33
    	fuel_consumption = 1.50
    	radio_strength = 1
     
    	#Defensive Abilities
    	defensiveness = 4.67
    	toughness = 4.00
    	softness = 0.20
    	air_defence = 0.80
     
    	#Offensive Abilities
    	suppression = 0.00
    	soft_attack = 2.33
    	hard_attack = 2.33
    	air_attack = 0.33
     
    	urban = {
    		attack = -0.40
    		defence = -0.10
    	}
       	amphibious =    { attack = -0.60 }
        	river =         { attack = -0.20 }
       	marsh = 	{ attack = -0.10 
    			  movement = -0.10
    			}
    	jungle = 	{ attack = -0.40
    			  movement = -0.4
    			}
    	forest = 	{ attack = -0.30
    			  movement = -0.4
    			}
    	woods = 	{ attack = -0.05 }
    	mountain = 	{ attack = -0.20 
    			  movement = -0.1
    			}
    	hills =         {attack = -0.10   }
     
    	combat_width = 2
     
    	completion_size = 1.7
    	on_completion = armour_practical
     
    	priority = 10
     
    }

    Der größte Teil davon ist ja relativ simpel zu verstehen und erklärt sich von selbst. Folgende Anmerkungen:

    a.) Gut auf den String am Anfang achten!

    b.) Folgende Kommentierungen zu einzelnen Werten:
      In #General
    • type = XXX | Land,Air,Naval <= Welche Einheitenart
    • sprite = XXX | infantry, tank, etc <= Welche "Familie" von Sprites (Ich weiß noch nicht wo diese Sprites definiert werden)
    • active = XXX | yes/no <= Ob die Einheit von Anfang an baubar ist, ohne dass sie zB erst durch Forschung aktiviert wird.
    • is_buildable = XXX | yes/no <= Ob die Einheit baubar ist. Derzeitige Beispiele für no: HQ-Brigaden und Partisanen-Brigaden.

      Spezialwerte für Landeinheiten:
    • can_paradrop = XXX | yes/no <= Ob die Einheit per Fallschirm verbracht werden.

      Spezialwerte für Marineeinheiten:
    • capital = XXX |yes/no <= Ob die Einheit ein Großkampfschiff ist. Leichte Einheiten (escorts) gibt es dementsprechend bei no.
    • hull = X |Zahlenwert <= Ich habe noch keine Ahnung was die Hüllengröße im Spiel macht, aber je größer der Pott, desto größer die Werte.
    • transport = XXX |yes/no <= Ob die Einheiten über See transportieren kann. Dies gilt nur bei Schiffen, bei der Luftwaffe wird das anscheinend komplett über das mögliche Transportgewicht gemacht bzw. ist hardcoded (was ich nicht glaube)
    • is_sub = XXX |yes/no <= Ob die Einheit ein U-Boot ist. Ich habe noch nicht getestet ob das mit capital = yes kollidiert, aber ein U-Boot Träger zB ist möglich.
    • carrier_size = X |Zahlenwert <= Wie viele CAGs ein Träger tragen kann (In seiner Grundform, da sich dieser Wert durch Forschung vergrößert (s.u.))

      Spezialwerte für Lufteinheiten:
    • is_cag = XXX |yes/no <= Ob die Einheit ein Trägergeschwader ist und dementsprechend auf Trägern stationiert werden kann. Weitere Effekte unbekannt.
    • is_bomber = XXX |yes/no <= Ob die Einheit ein Bomber ist. CAS, TAC, V1, V2, Marine, Strategischer Bomb. und das Transportflugzeug haben diesen Wert, MR, AJ, RAJ nicht. CAG auch nicht, aber der bekommt die Werte wohl über is_cag. Was das genau macht weiß ich noch nicht.

    Diese Werte müssen nicht immer in den Dateien drinnen stehen, sprich bis auf type und sprite ist das alles Wahlweise.

    Was ich nocht nicht einschätzen kann, ist "priority = XXX". Ich vermute aber stark, dass dies kein KI-Baubefehl ist, sondern angibt, wo die neue Einheit sich in der Einheitenauflistung einordnet. Zum Beispiel habe ich die Luftkavallerie mit "priority = 10", welche ganz oben eingeordnet wurde. Der U-Träger hatte "priority = 3" und war im unteren Mittelfeld.

    Zu beachten ist, dass dies immer die Grundwerte bei der Aktivierungsforschung sind. Der Rest wird entsprechend über Technologien gesteuert (s.u.)

    Unsere Einheit existiert nun. Hurrah!

  • II. Schritt - Der Name.
    Als nächstes wollen wir natürlich, dass unsere Einheit auch im Spiel einen Namen hat und nicht nur der von uns geschaffene String auftaucht.

    Ansatzpunkt ist die dir/localisation/units.csv.
    Hier gehen wir zu "#Unit names" und fügen am Ende zwei neue Zeilen ein, die den grundsätzlichen .csv Ansprüchen genügen, nur dass hinter dem x jetzt noch ,,; kommt....
    Wichtig sind, dass es zwei sind, einmal der Name und einmal die Kurzbezeichnung (StringName_short).
    Zum Beispiel:

    air_cavalry_brigade;Air Cavalry;Air Cavalry;Air Cavalry;;Air Cavalry;;;;;;;;;x,,;
    air_cavalry_brigade_short;AirCav;AirCav;AirCav;;AirCav;;;;;;;;;x,,;


    Und schon haben wir einen schicken Namen im Spiel!

  • III. Schritt - Die Grafik.

    Hier nur die Anweisung für Counter, da das Rätsel um die Sprites noch nicht gelöst ist. (Nachdem ich aber eben gesehen habe, dass schon einer aus dem Forum den Schweden ihre HOI3.exe eigene repariert hat um den Konsumgüterfehler zu beheben, behaupte ich mal das es nicht lange dauert, bis das auch geht. :dmp_09: )
    Grundsätzlich werden diese aber durch die .txt in dir/units angesteuert s.O.

    Insgesamt werden drei verschiedene Counter-Texturen im .dds Format benötigt und zwar jeweils in:

    dir/gfx/mapitems/counters
    dir/gfx/mapitems/mapcounters
    dir/gfx/mapitems/smallcounters

    Ich habe erstmal einfach die jeweilige .dds der anti_air_brigade kopiert und entsprechend bezeichnet. Dateiname sollte im unseren Beispiel zB dir/gfx/mapitems/counters/air_cavalry_brigade.dds sein. Anderen Namen sind möglich s.u. Wichtig ist, dass man natürlich dreimal verschiedene Dateien braucht.
    Über ein Plugin kann mandie .dds dann relativ einfach bearbeiten. Ich habe beim abspeichern irgendetwas falsch gemacht, so dass die schwarze Fläche meines Heeresflieger-Counters in Game angezeigt wurde. Da muss ich nochmal etwas rumspielen.

    Als nächstes brauchen wir in dir/gfx/models/ ein Modelbild für unsere Einheit. Im unseren Beispiel dir/gfx/models/air_cavalry_brigade_0.tga. Das _0 steht für die Multi-Level Bilder (s.u.). Auch hier habe ich die Luftabwehr erstmal als Dummy entsprechend kopiert und umbenannt.

    Schließlich müssen wir unsere counter noch im Spiel registrieren. Dazu öffnen wir dir/interface/counters.gfx
    und fügen zB folgende Einträge hinzu:
    spriteType = {
    	  name = "GFX_counter_air_cavalry_brigade"
    	  texturefile = "gfx/mapitems/counters/air_cavalry_brigade.dds"
    	  noOfFrames = 1
    	  norefcount = yes
    }
     
    spriteType = {
    	  name = "GFX_map_counter_air_cavalry_brigade"
    	  texturefile = "gfx/mapitems/mapcounters/air_cavalry_brigade.dds"
    	  noOfFrames = 1
    	  norefcount = yes
    }
     
    spriteType = {
    	  name = "GFX_small_counter_air_cavalry_brigade"
    	  texturefile = "gfx/mapitems/smallcounters/air_cavalry_brigade.dds"
    	  noOfFrames = 1
    	  norefcount = yes
    }



    Nun können wir unsere Einheit auch sehen!
  • IV. Schritt - Die Aktivierung und Technik.

    Wenn wir nicht "active = yes" in unserer Einheiten .txt gewählt haben (und die Einheit nicht nur über Events kommen soll), müssen wir sie durch eine Technologie freischalten lassen.
    Bei meiner Beispiels Kavallerie kann man das zB so machen:

    Man öffnet dir/technologies/Secret Weapons.txt und fügt hinter "helecopters = {..." "activate_unit = air_cavalry_brigade" ein. Wichtig auch hier wieder der korrekte Stringname.

    Nun wird durch die Helokopter Geheimtechnologie unsere Brigade freigeschaltet.

    Des Weiteren wollen wir natürlich, dass unsere Einheit auch diese lustigen kleinen Komponenten bekommt, die man in der Einheitenübersicht sieht (Welches Gewehr, geschütz, Doktrin, etc.). Grundsätzlich sind diese nur die Visualisierung der Technologieboni und -modifikatoren die der Einheit zu gewiesen werden.

    als Beispiel in der Infanterietechnik

    cavalry_smallarms = {

    cavalry_brigade = {
    soft_attack = 0.5

    }
    ...


    wird zu

    cavalry_smallarms = {

    cavalry_brigade = {
    soft_attack = 0.5

    }
    air_cavalry_brigade = {
    soft_attack = 0.5

    }

    ...


    Und schon kriegt unsere Luftkavallerie die neusten Karabiner, was auch in der Einheitenübersicht angeben wird.

    Will man austauschbare Komponenten wie bei Schiffen muss man scheinbar "can_upgrade = no" hinzufügen. Einfach mal in den Marinetechniken schauen. Stimmt das ist das ganze Komponentensystem Schwachsinn. Warum? Anstatt verschiedene Pakete zu haben, die relativ verschiedene Werte geben (zB eine Luftabwehrkonfiguration für Kreuzer mit Hohen Boni auf Luftabwehr aber Abzügen auf Seeangriff und verteidigung), kann ich immer nur die vorhergegangenen Modelle als Alternativen nehmen, die durch diese Unendlichkeitstechniken entstehen... Und da man immer die modernsten nimmt ist das ganze noch nutzloser als die immer mitgebauten Marinebrigaden aus Vanila Arma. Aber ich werde nochmal etwas rumprobieren.
  • V. Schritt - Die Namen und Modelle.
    Als nächstes brauchen wir natürlich noch einen schicken Namen für unsere neuen Einheiten.
    Für das Beispiel Deutschland, gehen wir nach dir/common/countries/germany.txt und fügen im Bereich "unit_names = { ... }" folgende zeilen hinzu:
    air_cavalry_brigade = {
    		"1. Luftkavallerie-Division"  
    	}

    Nun wird eine Division unserer Einheiten korrekt als 1. Luftkavallerie gebaut. Eine direkte Vergabe von Namen für die Brigaden selber scheint gegenwärtig nicht möglich. Einziger Ansatzpunkt ist, dass in den dir/history/units .txt Dateien über den Befehl "regiment = { type = infantry_brigade name = "Infanterie Regiment 27" historical_model = 2 }" es grundsätzlich möglich sein kann. Aber wie man das in die common files einfügt?

    Schließlich wollen wir noch Multi Level für unsere Einheit festlegen. Schließlich wollen wir ja, dass sich das Bildchen und der Name mit der Zeit ändert und wir auch etwas von unseren neuen Luftkavalleriekarabinern haben.

    Grundsätzlich ist es nicht mehr wie in HOI2, dass eine Einheit von vorne rein verschiedene Level hat und von einem zum nächsten aufgerüstet wird und man immer über diese levels Bilder, namen, etc verteilt.
    In HOI3 gibt es die Basiseinheit, die durch die Erforschung von neuen Techniken immer bessere Werte bekommt.

    Aufgrund dieses Fortschrittes wird auf zweierlei weise der Einheiten Level festgelegt.

    Zunächst gibt es eine generelle Regelung, die das Spiel selbst durchführt. Nehmen wir als Beispiel Leichte Panzer. Hier ist der Techtree so aufgebaut, dass es vier Komponenten gibt die erforscht werden können. Ohne jede Forschung außer der Freischaltung startet die Einheit auf Level (I). Erforscht man nun eine Komponente mehr, so wird sie zu (I)+*, das bleibt so bis man drei Komponenten eins weiter erforscht hat, dann wird (II)+* draus, obwohl eigentlich noch eine Komponente fehlt...
    Bei vier Komponenten springt er dann 'zurück' auf (II). Wird wohl nen kleiner Bug sein.

    Wenn ich die Techsyntax richtig verstehe ist der Eintrag
    allow = {
    		infantry_activation = 1
    	}

    Bei den jeweiligen Subtechs der Auslöser, wobei infantry_activation die Übertechnik ist.
    Ganz richtig kann das aber nicht sein, da Die spezialisierten Infanterien (Marines, Fallis, Gebirgsjäger) ihre Verbesserung auch über die Sub-Infanterietechniken beziehen, aber nicht so verknüpft sind...
    Also weitersuchen...


    Die zweite Möglichkeit ist es diese Level selbst festzulegen um zB einen bestimmten Panzer zu simulieren.
    Diese Daten sind dann in dir/units/models und eigentlich simpel aufgebaut.

    Nach einigen Testläufen behaupte ich einfach mal vorläufig, dass HOI3 der Landes-Tag im Namen der Datei ausreicht um die darin festgelegten Models zuzuordnen. Was den Zusatz ARM/SHIP/Planes angeht teste ich nun weiter, in dem ich versuche meiner Infanterie Namen zu zu weisen...



    Durch dir/localisation/models.csv werden jedoch in klassischer Weise die Model-Namen zu gewiesen. Das gleich bei den Bildern mit STRINGNAME_ZAHL als indikator für das Level.
  • VI. Schritt - KI.
    Wird auch noch nachgetragen, wie man die KI dazubekommt die neuen Einheiten zu bauen und zu benutzen.
  • VII. Schritt - Nachwehen.
    Folgendes stört mich noch:
    • Kein Brigadenwechsel durch Upgrade. Sprich eine leichte Panzer-Brigade bleibt immer eine leichte Panzer-Brigade. Sie wird durch Upgrades zwar moderner, wird aber nie eine mittlere Panzer-Brigade. Da aber genau dies in HOI2 drinnen war, hoffe ich das man das doch noch irgendwie hinbekommt...
    • Über die Komponenten ließ ich mich schon aus, da wird weiter geforscht.



Letzte Änderung: 9 Jahre 7 Monate her von Calmer.

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Willkommens Ribbon
Mehr
9 Jahre 6 Monate her #2 von Lord Rommel
Ja. Der Code. Dat ihr den braucht, ist mir auch erst gestern wieda eingefallen ;)

Hier mal die Codes:
Nicht über die Werte wundern ;) Wollte erstmal den Effekt testen :helmi_23:
Als 1. die neue Unit-Datei:

eisenbahn_artillery_brigade = {
type = land
sprite = Infantry
active = yes

#Size Definitions
max_strength = 10
default_organisation = 30
default_morale = 0.30
officers = 100

#Building Costs
build_cost_ic = 1.00
build_cost_manpower = 1.33
build_time = 3

#Misc Abilities
maximum_speed = 1.20
transport_weight = 25.00
supply_consumption = 1.00
fuel_consumption = 0.00
radio_strength = 1

#Defensive Abilities
defensiveness = 4.67
toughness = 2.00
softness = 2.00
air_defence = 1.00

#Offensive Abilities
suppression = 0.00
soft_attack = 7.33
hard_attack = 5.33
air_attack = 0.10

amphibious = { attack = -0.80 }
marsh = { attack = -0.10 }
jungle = { attack = -0.30 }
forest = { attack = -0.30 }
woods = { attack = -0.05 }
fort = { attack = 8.00 }

combat_width = 0

completion_size = 0.6
on_completion = artillery_practical

priority = 3

}


Die Unit.cvs:

eisenbahn_artillery_brigade;Eisenbahngeschütz;Eisenbahngeschütz;Eisenbahngeschütz;;Eisenbahngeschütz;;;;;;;;;x,,
eisenbahn_artillery_brigade_short;Eisenbahnartillerie;Eisenbahnartillerie;Eisenbahnartillerie;;Eisenbahnartillerie;;;;;;;;;x,,


Die Counters:

spriteType = {
name = "GFX_counter_eisenbahn_artillery_brigade"
texturefile = "gfx/mapitems/counters/eisenbahn_artillery_brigade.dds"
noOfFrames = 1
norefcount = yes
}

spriteType = {
name = "GFX_map_counter_eisenbahn_artillery_brigade"
texturefile = "gfx/mapitems/mapcounters/eisenbahn_artillery_brigade.dds"
noOfFrames = 1
norefcount = yes
}

spriteType = {
name = "GFX__small_counter_eisenbahn_artillery_brigade"
texturefile = "gfx/mapitems/smallcounters/eisenbahn_artillery_brigade.dds"
noOfFrames = 1
norefcount = yes
}


Die GFX/Mapitmecounters:

Counters: eisenbahn_artillery_brigade.dds
Mapcounters: eisenbahn_artillery_brigade.dds
Smallcounters: eisenbahn_artillery_brigade.dds


Die Common/Countries/Germany:

unit_names = {

eisenbahn_artillery_brigade = {
"Eisenbahn-Artillerie-Batterie 710" "Eisenbahn-Artillerie-Batterie 712" "Eisenbahn-Artillerie-Batterie 713" "Eisenbahn-Artillerie-Batterie 701" "Eisenbahn-Artillerie-Batterie 725"
"Eisenbahn-Artillerie-Batterie 765" "Eisenbahn-Artillerie-Batterie 686" "Eisenbahn-Artillerie-Batterie 688" "Eisenbahn-Artillerie-Batterie 749"
}


DIe Models.cvs:

GER_eisenbahn_artillery_brigade_0;15cm Kanone (E);15cm Kanone (E);15cm Kanone (E);;15cm Kanone (E);;;;;;;;;x
GER_eisenbahn_artillery_brigade_1;17cm Kanone (E);17cm Kanone (E);17cm Kanone (E);;17cm Kanone (E);;;;;;;;;x
GER_eisenbahn_artillery_brigade_2;24cm Kanone (E);24cm Kanone (E);24cm Kanone (E);;24cm Kanone (E);;;;;;;;;x
GER_eisenbahn_artillery_brigade_3;28cm Kanone K5 (E);28cm Kanone K5 (E);28cm Kanone K5 (E);;28cm Kanone K5 (E);;;;;;;;;x
GER_eisenbahn_artillery_brigade_4;28cm Kanone K5 Langer Bruno (E);28cm Kanone K5 Langer Bruno (E);28cm Kanone K5 Langer Bruno (E);;28cm Kanone K5 Langer Bruno (E);;;;;;;;;x
GER_eisenbahn_artillery_brigade_5;28cm Kanone K5 schwerer Bruno (E);28cm Kanone K5 schwerer Bruno (E);28cm Kanone K5 schwerer Bruno (E);;28cm Kanone K5 schwerer Bruno (E);;;
GER_eisenbahn_artillery_brigade_6;38cm Kanone Siegfried (E);38cm Kanone Siegfried (E);38cm Kanone Siegfried (E);;38cm Kanone Siegfried (E);;;;;;;;;x
GER_eisenbahn_artillery_brigade_7;80cm Kanone Dora;80cm Kanone Dora;80cm Kanone Dora;;80cm Kanone Dora;;;;;;;;;x
GER_eisenbahn_artillery_brigade_8;80cm Kanone Gustav;80cm Kanone Gustav;80cm Kanone Gustav;;80cm Kanone Gustav;;;;;;;;;x


Dat sollte alles sein.
Erstmal keine Forschungsanbindung.

DAnke für die Hilfe :helmi_130:

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Werbung

Moderatoren: AndurilMagic1111
Powered by Kunena Forum