Table of Contents

SectorMania - Objekteigenschaften

Hier wird festgehalten, über welche Werte und Eigenschaften ein Spielobjekt verfügt.

Gameplay-Werte

Schaden, Hitpoints etc. Aus Gründen eines deterministischen Spielverlaufs muss dafür Sorge getragen werden, dass für das Einlesen der Werte an keiner Stelle ein Fließkommawert benutzt wird. Es braucht also einen String-Parser, der meinen selbstgebauten Fixed-Datentyp direkt einlesen kann.

Für Schaden würde ich vorschlagen, dass jede Einheit einem bestimmten Schadenstyp zugeordnet ist, gegen den andere Einheiten Schwächen haben können. Im Prinzip umgekehrt wie bei Earth (Schwäche als Multiplikator des Schadens), nur dass die Schadenskategorien eben nicht sinnlos fest sind, sondern einfach durch hochzählenden int beliebig festgelegt werden. Dadurch kann jede Einheit einen individuellen Schadenstyp haben und jede Einheit kann individuell gegen jede andere mit Stärken oder Schwächen (Schwäche < oder > 1) ausgestattet werden. Der Einfachheit halber hat jede Einheit nur einen Schadenstyp, das ist für unsere Zwecke vollauf ausreichend. Keiner dieser Werte wird ingame angezeigt, weil das den Spieler potentiell nur verwirren würde.

Allgemein

Roboter und Fahrzeuge

Gebäude

Geschütze

Projektile

Grafische Darstellung

Die grafische Darstellung umfasst im Wesentlichen die Anordnung der Meshes, aus denen sich das Objekt zusammensetzt, sowie Animationen, Partikeleffekte und Materialien passend zum aktuellen Zustand der Einheiten.

Meshes

Meshes können entweder an Nodes oder an Bones anderer Meshes gehängt werden. Für jedes Objekt existiert eine Root Node bei (0,0,0), weitere Nodes müssen explizit definiert werden. Bones werden implizit über das jeweilige Mesh angesprochen. In diesem Sinne gibt es kein Hauptmesh und Submeshes, es gibt nur Meshes, die an irgendeiner Stelle an das Objekt angehangen werden, i. A. also wenigstens ein Mesh an die Root Node. Für jedes Mesh muss auch das Standard-Material (templatisiert über Spielerfarbe) angegeben werden.

Objektzustände

Alles andere kommt eigentlich nur bei bestimmten Objektzuständen zutrage. Wenn ich nichts vergessen habe, kann sich eine Einheit in einem oder mehreren der folgenden Zustände befinden:

Zu jedem Zustand können für jedes einzelne Mesh Animationen festgelegt werden, die während des Zustands abgespielt werden. Außerdem können Partikeleffekte an Nodes oder Bones angehängt werden (z. B. Schmauchspuren, Fabrikdampf etc.), auch können Materialien überschrieben werden (beschädigte Objekte).

Waffenrohre

Weiterhin muss definiert werden, von wo aus Schüsse starten (und wie diese aussehen), also Nodes oder Bones als Waffenrohre deklarieren. Dazu braucht es auch noch die Info, ob alle Rohre gleichzeitig (z. B. Psycho) oder abwechselnd (z. B. Raketenwerfer) feuern sollen (aber das ist eigentlich wieder eine Gameplay-Sache).

Beispiel

Ein Entwurf für eine Beschreibungsdatei für einen Roboter:

<?xml version="1.0" encoding="utf-8"?>
<robot id="grunt">
  <basic>
    <!-- Number of hitpoints -->
	<hitpoints>300</hitpoints>
	<!-- Damage multipliers to increase or reduce damage taken from a specific damage type -->
	<damage_mult type="1">1.2</damage_mult>
	<damage_mult type="4">0.9</damage_mult>
	<!-- The bounding radius specifies the space the object occupies on the map -->
	<bounding_rad>15.0</bounding_rad>
	<!-- Define hitboxes for projectile collision -->
	<hitbox x1="-5.0" y1="-5.0" z1="0.0" x2="0.0" y2="0.0" z2="5.0" />
	<hitbox x1="0.0" y1="0.0" z1="0.0" x2="5.0" y2="5.0" z2="10.0" />
  </basic>
 
  <moving>
    <!-- The unit's velocity -->
	<velocity>20.0</velocity>
	<!-- Turnspeed -->
	<turnspeed>5.0</turnspeed>
  </moving>
 
  <weapon>
    <!-- The type of damage this unit deals -->
	<damage_type>0</damage_type>
	<!-- The amount of damage the unit deals -->
	<damage>25.0</damage>
	<!-- Variance of the damage dealt -->
	<damage_variance>2.0</damage_variance>
	<!-- Probability that this unit hits the driver of a vehicle instead of the vehicle. -->
	<hit_driver_prob>0.05</hit_driver_prob>
	<!-- Time in game ticks for firing a single shot -->
	<shoot_duration>30</shoot_duration>
	<!-- Relative time after which the projectile is created when firing -->
	<shoot_out>0.7</shoot_out>
	<!-- Time in game ticks between two shots -->
	<shoot_pause>50</shoot_pause>
	<!-- Projectile object to be used with this weapon -->
	<projectile>grunt_projectile</projectile>
	<!-- Range of fire -->
	<shoot_range>30.0</shoot_range>
	<!-- Does the unit need to stand still when shooting? -->
	<shoot_stand>true</shoot_stand>
	<!-- Weapon turning in horizontal: Min/max/default angle in degrees and turn speed in degrees/gametick-->
	<horiz_angle min="-45" max="45" default="0" speed="1" />
	<!-- Weapon turning in vertical: Min/max/default angle in degrees and turn speed -->
	<vert_angle min="-15" max="30" default="0" speed="0.5" />
	<!-- How many of the barrels defined in the rendering section actually fire per shot? -->
	<barrels>1</barrels>
  </weapon>
 
 
  <rendering>
    <!-- Define nodes to attach meshes etc. to -->
    <node x="0" y="0" z="0">root</node>
 
	<!-- Define the meshes and their placement -->
	<mesh material="grunt_mat" attach="node" id="root">grunt</mesh>
 
	<!-- Define the unit's states and the animations and particle effects accompanying those -->
	<state name="idle0">
	  <animation loop="false">grunt:idle0</animation>
	</state>
 
	<state name="moving">
	  <animation loop="true">grunt:walking</animation>
	</state>
 
	<state name="shooting">
	  <animation loop="false">grunt:shooting</animation>
	  <particle attach="bone" id="grunt:weapon">grunt_smoke</particle>
	</state>
 
	<!-- Declare bones or nodes as weapon barrels, this is where the projectiles will be emerging from -->
	<barrel type="bone" id="grunt:weapon" />
  </rendering>
 
 
</robot>