Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / Sichtradius der Clonks variieren
- By Serpens66 (More than 200 posts.) Date 17.10.2014 16:47 Edited 17.10.2014 16:50
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)
Up Topic Deutsch / Hilfestellung / Sichtradius der Clonks variieren

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill