Gecko hat mir (auf Basis des Skriptes "Torches" aus dem "Realisitc_Effects" Pack) ein Skript geschrieben, mit dessen Hilfe der Sichtradius der Clonks angepasst wird, je nach dem, wo sie sich befinden (Himmel oder Untergrund).
Leider funktioniert es nur fast perfekt. Das Skript passt den Sichtradius nämlich nur korrekt an den Untergrund an, wenn mindestens die Hälfte aller im Spiel befindlichen Clonks sich im Untergrund befinden. Wenn sich nur einer dort befindet, wird der Sichtradius lediglich um 10 verringert.
Das Skript sieht so aus:
#strict
`#appendto CLNK`
protected func Initialize() {
if(GetID()!=TS9Z) return(SetPlrViewRange(0),_inherited());
var id;
Local()=450;
if (id=FindObject(TS9Z))
{ Local()+=Local(0,id); RemoveObject(id); }
SetAction("Wait");}
protected func Initialized() {SetGamma(0,RGB(128-Local()*16,128-Local()*16,128-Local()*16),RGB(255-Local()*30,255-Local()*30,255-Local()*30)); FogofWar();}
//FoW aufrechterhalten bei abgespeicherten Spielen
public func SetTransferZone() {Log("Set"); SetFoW(1,GetOwner());}
public func UpdateTransferZone() {Log("Update"); SetFoW(1,GetOwner());}
/*Alles zusammen nochmal. Und zwar weil beim initialisieren der Startclonks die SetPlrViewRange-Funzion nicht richtig funzt, da zu der Zeit noch garnicht die ganzen TS9Z-Objekte erstellt wurden. Außerdem auch weil man ja die Maussteuerung während des Spiels ausschalten kann (FoW wird dabei auch ausgestellt)*/
public func FogofWar() {
for(var i1=0; i1<GetPlayerCount(); i1++) {
SetFoW(1,i1);
for(var i2=0; i2<GetCrewCount(i1); i2++) {
var zielSichtweite = 450; // Standard und am Tag: 100
if(IsNight()) zielSichtweite = 300; // Tunnel? Dann eine Sichtweite von 50 anstreben
if(GBackSolid(GetX(GetCrew(i1,i2)),GetY(GetCrew(i1,i2))-16) && (GetCrew(i1,i2)->~GetMaterial() == Material("Tunnel"))) zielSichtweite = 200; // Tunnel? Dann eine Sichtweite von 25 anstreben
if(GBackSolid(GetX(GetCrew(i1,i2)),GetY(GetCrew(i1,i2))-16) && (GetCrew(i1,i2)->~GetMaterial() == Material("Tunnel")) && IsNight()) zielSichtweite = 50; // Tunnel? UND Nacht?! Dann eine Sichtweite von 15 anstreben
// Werte aktualisieren. Nicht direkt setzen, damit wir ein verlauf haben.
if(Local() > zielSichtweite) Local() -= 10;
if(Local() < zielSichtweite) Local() += 10;
Message("%d %d",GetCrew(i1,i2),Local(),zielSichtweite);
SetPlrViewRange(Local(),GetCrew(i1,i2)); // und die Variabel Local() setzen
}}}
Ich denke wirklich wichtig ist hier nur die FogofWar() Funktion, welche mit einem Timercall regelmäßig aufgerufen wird.
Ich selbst habe diese Funktion nun wie foglt verändert:
public func FogofWar() {
for(var i1=0; i1<GetPlayerCount(); i1++) {
SetFoW(1,i1);
for(var i2=0; i2<GetCrewCount(i1); i2++) {
zielSichtweite = 400; // Standard und am Tag: 100
if(IsNight()) zielSichtweite = 200; // Nacht? Dann eine Sichtweite von 50 anstreben
if(GBackSolid(GetX(GetCrew(i1,i2)),GetY(GetCrew(i1,i2))-16) && (GetCrew(i1,i2)->~GetMaterial() == Material("Tunnel"))) zielSichtweite = 100; // Tunnel? Dann eine Sichtweite von 25 anstreben if(GBackSolid(GetX(GetCrew(i1,i2)),GetY(GetCrew(i1,i2))-16) && (GetCrew(i1,i2)->~GetMaterial() == Material("Tunnel")) && IsNight()) zielSichtweite = 80; // Tunnel? UND Nacht?! Dann eine Sichtweite von 15 anstreben // Werte aktualisieren. Nicht direkt setzen, damit wir ein verlauf haben.
for (;Local() != zielSichtweite;) {
if(Local() > zielSichtweite) Local() -= 1;
if(Local() < zielSichtweite) Local() += 1;
}
Message("%d %d",GetCrew(i1,i2),Local(),zielSichtweite); //ist nur für Editor sinnvoll, wenn man die genauen Zahlen im Spiel sehen will.
SetPlrViewRange(Local(),GetCrew(i1,i2),1); // und die Variabel Local() setzen
} } return(1);}
Durch diese hinzugefügte for Schleife, wird der Sichtradius so wie er soll für jeden Clonk einzeln korrekt angepasst. Das Problem ist nur, dass damit natürlich der "Verlauf" futsch ist. Es wird halt von einem Frame auf den anderen dann weniger Sichtradius, anstatt dass der Sichtradius in einer Zeit x immer kleiner wird.
Wie kann ich das nun also so schreiben, dass es so funktioniert, wie es soll? (also für jeden Clonk einzeln den sichtradius anpassen und das in einem Verlauf)