summaryrefslogtreecommitdiffstats
path: root/TemplePushing.c4s/Locals.c4d/Sonne.c4d/Script.c
diff options
context:
space:
mode:
authorJan <>2015-02-02 17:05:03 +0100
committerJan <_>2015-07-10 17:44:33 +0200
commitf5a80c493dcefbc8f45987b8fd454d974f739cf7 (patch)
tree724195326f990379940b35e0f5eaacb37e4860bc /TemplePushing.c4s/Locals.c4d/Sonne.c4d/Script.c
downloadtempelschubsen-f5a80c493dcefbc8f45987b8fd454d974f739cf7.tar.gz
tempelschubsen-f5a80c493dcefbc8f45987b8fd454d974f739cf7.zip
TemplePushBeta.c4s
Diffstat (limited to 'TemplePushing.c4s/Locals.c4d/Sonne.c4d/Script.c')
-rw-r--r--TemplePushing.c4s/Locals.c4d/Sonne.c4d/Script.c191
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