
Teleportieren war in der Umsetzung ziemlich kompliziert, bzw. hat einige bestehende Probleme aufgezeigt.
Für die Reichweite von Einheiten habe ich bislang einfach einen Kreis/Ellipse gezeichnet, aber dank der Höhenunterschiede auf dem Terrain ist das nicht genau genug. Das Teleportieren hat einen eingeschränkten Wirkungskreis, also musste ich eine neue Kreisfunktion schreiben die sich an das Terrain anpasst. Das führte schlussendlich dazu, dass ich eine Linienfunktion geschrieben habe die sich an das Terrain anpasst, die ich dann für den Kreis verwendet habe. Vermutlich nicht die polygonsparendste Lösung, aber es funktioniert gut genug für jetzt.
Alle Einheitendefinitionen befinden sich in JSON Dateien (mit etwas JS) und ich wollte keine Ausnahmen machen. Damit wäre das Spiel in Zukunft auch Modbar, bzw. die ganzen Einheiten sind eigentlich schon ein Mod.
Eine Beispieldefinition, von der 4-Kopf-Rad-Einheit aka Wheel.
Code: Alles auswählen
wheel:{
//teleports friendly units
class:"f",
cap:-4,
hp:30,
move:2,
vis:16,
flag:ORGANIC,
attitude:ATTI_PEACE,
break:{
img:vec2(16,16),
va:0,
vz:0
},
anim:{
idle:{
fps:4,
img:vlist([16,16,16,16,16,17,18,19],16)
},
walk:{
fps:4,
img:vlist([16,17,18,19],16)
},
},
pitch:[1.4,0.1],
sound:womanSound,
action:[
{
name:"teleport",
desc:"move a friendly unit to a new position",
limit:-1,
live:1,
action:(clickStore)=>{
//first value should be a friendly unit
let unit = clickStore[0];
//second value should be a grid
let cell = clickStore[1];
_em_.createOnBreak("disintegrate", unit);
unit.moveTo(cell.gpos);
_em_.createOnBreak("disintegrate", unit);
return true;
},
position:[
{friend:1, range:10, cb:(obj)=>obj.s==1 && !obj.fixed && !obj.dead, color:COL_RED },
{pos:0, range:10, outline: COL_RED, color: new Color(0,0.6,0)}
]
}
],
upgrade:[ bloodRestore ]
}
Alle Aktionen müssen über die Konfiguration + Script gelöst werden können. Damit das Teleportieren geht, muss zuerst ein Subjekt ausgewählt werden und danach ein Ziel.