diff options
Diffstat (limited to 'TemplePushing.c4s/Locals.c4d/Sonne.c4d/Script.c')
| -rw-r--r-- | TemplePushing.c4s/Locals.c4d/Sonne.c4d/Script.c | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/TemplePushing.c4s/Locals.c4d/Sonne.c4d/Script.c b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/Script.c new file mode 100644 index 0000000..ded97c5 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/Script.c @@ -0,0 +1,191 @@ +/*-- Sonne --*/ + +#strict + +local SonneX, SonneY; + +func IsLight() { return(1); } + +// Initialisierung +protected func Initialize() +{ + // In den Hintergrund mit dir. + SetCategory(C4D_StaticBack()|C4D_Background()); + // Action setzen + SetAction("SeiBrav"); + // Nur für den Herrn und Meister sichtbar + SetVisibility (VIS_Owner(), this()); + if(!FindObject(GetID())) + // Das erste Sonnen-Objekt prüft nur, dass jeder Spieler auch sein Umweltobjekt hat + { + SetOwner(-1,this()); // Unparteiisch sein! + SetCategory(1,this()); // Nicht bewegen + SetAction("IchWillNurSpielerZaehlen"); + return(); + } +} + +// Sucht einen Spieler, der keine Sonne hat (-1 für Erfolglos) +private func FindeFreienSpieler() +{ + for(var i=0; i<16; ++i) + if(GetPlayerName(i)&&(!FindObjectOwner(GetID(),i))) + return(i); + return(-1); +} + +// Prüft alle Spieler durch, ob denn auch jeder seine Sonne hat +protected func PruefeAlleSpieler() +{ + var FreierSpieler; + while((FreierSpieler=FindeFreienSpieler())!=-1) + ErstelleLenseflare(FreierSpieler); +} + +// Erstellt eine Sonne und weist ihm einen Besitzer zu +private func ErstelleLenseflare(FuerDiesenSpieler) +{ + CreateObject(GetID(),0,0,FuerDiesenSpieler); +} + + +// Von "SeiBrav" aufgerufen +protected func TuWasBraves() +{ + // Bei vorhandenem Lenseflare (mit integrierter Sonne) kann dieses Objekt gelöscht werden + if(ObjectCount(LENS)) + { + RemoveObject(this()); + return(); + } + // Hat es seinen Besitzer verloren? :( + if((!GetPlayerName(GetOwner())) || GetOwner()==-1) + { + RemoveObject(this()); + return(); + } + // Sonnenposition anpassen + BerechneSonne(); + SetPosition(SonneX,SonneY); + // Nachts ausblenden + if(IsDay()) + SetVisibility (VIS_Owner()); + else + SetVisibility (VIS_None()); + // Sofern der Spieler alleine ist, blenden + var VektorDist=GibVektorDist(GetOwner()); + if(GetPlayerCount()==1) + if(IsDay()) + { + var Gelbstich = BoundBy((500-VektorDist)/5,0,100); // Prozentangabe 0 = weit weg, 100 = nahe; 500 Pixel sind dabei "weit weg" + SetGamma (RGB(000+(30*Gelbstich)/100,000+(30*Gelbstich)/100,000), + RGB(128+(60*Gelbstich)/100,128+(60*Gelbstich)/100,128), + RGB(255,255,255), GammaRampe_Lenseflare()); + } +} + +// Interner Kruscht! +// Bildschirmmittelpunkt +private func GibMittelpunktX(iSpieler) +{ + if(IsNetwork()) + return(GetX(GetCursor(iSpieler))); + else + return(GetPlrViewX(iSpieler)); +} + +private func GibMittelpunktY(iSpieler) +{ + if(IsNetwork()) + return(GetY(GetCursor(iSpieler))); + else + return(GetPlrViewY(iSpieler)); +} + +// Sonnenkoordinate +private func BerechneSonne() +{ + BerechneSonneX(); + BerechneSonneY(); +} +private func BerechneSonneX() +{ + var ZeitObjekt = FindObject(TIME); + if(!ZeitObjekt) + SonneX = LandscapeWidth() / 2; + else + { + // Da die Winkelangaben aufgrund ihres Integer-Wesens zu ungenau für eine schöne Laufbahn sind + // muss hier getrickst werden. Über Sin/Cos werden die Eckpunkte eines n-Ecks errechnet, auf den Linien + // dazwischen fährt dann die Sonne. + var Winkel = GibTageszeit()*360/100 +90; + var VonEck = LandscapeWidth()/2+Cos(Winkel,LandscapeWidth()/2); + Winkel = (GibTageszeit()+1)*360/100 +90; + var ZuEck = LandscapeWidth()/2+Cos(Winkel,LandscapeWidth()/2); + // Wieviele Ticks verstreichen während einem "Punkt" bei Tageszeit? + // Sprich: Wieviele Zwischenschritte liegen zwischen VonEck und ZuEck? + var Zwischenschritte = PrivateCall(ZeitObjekt,"TimeResolution") / 100; + // Schrittweite in 1/100000 Pixel + var Schrittweite = (ZuEck-VonEck)*100000 / (Zwischenschritte*TIME_Tick()); + // Wieviel TIME-Ticks sind seit der letzten "vollen" Tageszeit vergangen? + var Vergangen = Local(1, ZeitObjekt) - GibTageszeit()*100; + Vergangen=Vergangen*TIME_Tick()+FrameCounter()%10; + SonneX = VonEck + (Vergangen*Schrittweite)/100000; // 100000 = 100000 wegen der 1/100000 Schrittweite + } +} + +private func BerechneSonneY() +{ + var ZeitObjekt = FindObject(TIME); + if(!ZeitObjekt) + SonneY = 150; + else + { + // Da die Winkelangaben aufgrund ihres Integer-Wesens zu ungenau für eine schöne Laufbahn sind + // muss hier getrickst werden. Über Sin/Cos werden die Eckpunkte eines n-Ecks errechnet, auf den Linien + // dazwischen fährt dann die Sonne. + var Winkel = GibTageszeit()*360/100 +90; + var VonEck = GetHorizonHeight(0)-Sin(Winkel,300)-50; + Winkel = (GibTageszeit()+1)*360/100 +90; + var ZuEck = GetHorizonHeight(0)-Sin(Winkel,300)-50; + // Wieviele Ticks verstreichen während einem "Punkt" bei Tageszeit? + // Sprich: Wieviele Zwischenschritte liegen zwischen VonEck und ZuEck? + var Zwischenschritte = PrivateCall(ZeitObjekt,"TimeResolution") / 100; + // Schrittweite in 1/100000 Pixel + var Schrittweite = (ZuEck-VonEck)*100000 / Zwischenschritte; + Schrittweite/=TIME_Tick(); // Jedes Time-Tick besteht aus 10 einzelnen Ticks + // Wieviel TIME-Ticks sind seit der letzten "vollen" Tageszeit vergangen? + var Vergangen = Local(1, ZeitObjekt) - GibTageszeit()*100; + Vergangen=Vergangen*TIME_Tick()+FrameCounter()%10; + SonneY = VonEck + (Vergangen*Schrittweite)/100000; // 100000 = 100000 wegen der 1/100000 Schrittweite + } +} + +private func TIME_Tick() +{ + return(10); +} + +private func GibTageszeit() +{ + var ZeitObjekt = FindObject(TIME); + if (!ZeitObjekt) return(-1); + return(Local(1, ZeitObjekt)*100/PrivateCall(ZeitObjekt,"TimeResolution")); // 0-100=Mittag-Mittag +} + +private func GibVektorDist(iSpieler) +{ + return(Distance(GibMittelpunktX(iSpieler),GibMittelpunktY(iSpieler),SonneX,SonneY)); +} + +// Bodenhöhe. Aus dem Schmetterling übernommen und aktuelle Syntax und global gemacht und so. k? +private func GetHorizonHeight(iX) +{ + var iY = - GetY(); // Zu globaler Koordinate wandeln + iX -= GetX(); // Zu globaler Koordinate wandeln + while ( (iY<LandscapeHeight())&&(!GBackSemiSolid(iX,iY))) + { + iY+=10; + } + return(iY+GetY()); +}
\ No newline at end of file |
