1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
/*-- Lenseflare --*/
// Sonnenskript includieren
#include SONE
#strict
local SonneX, SonneY;
// Initialisierung
protected func Initialize()
{
// Nur für den Herrn und Meister sichtbar
SetVisibility (VIS_Owner(), this());
if(!FindObject(GetID()))
// Das erste Lenseflare-Objekt prüft nur, dass jeder Spieler auch sein Umweltobjekt hat
{
SetOwner(-1,this()); // Unparteiisch sein!
SetCategory(1 | C4D_MouseIgnore(),this()); // Nicht bewegen
SetAction("IchWillNurSpielerZaehlen");
return();
}
}
// Initialisierung als Haupt-Lenseflare
public func WerdeHauptlenseflareFuerDeinenHerrn()
{
SetCategory(C4D_StaticBack()|C4D_Background()| C4D_MouseIgnore());
for(var i=0; i<MIJON(); ++i)
{
Local(i) = CreateObject(GetID());
SetOwner(GetOwner(),Local(i));
SetCategory(C4D_StaticBack()| C4D_MouseIgnore()|C4D_Foreground(),Local(i));
ObjectSetAction(Local(i),Format("Fleck%d",i%14));
}
SetAction("SeiBrav");
}
// Erstellt einen Lenseflare und weist ihm einen Besitzer zu
private func ErstelleLenseflare(FuerDiesenSpieler)
{
var Flare = CreateObject(GetID());
SetOwner(FuerDiesenSpieler,Flare);
Flare->WerdeHauptlenseflareFuerDeinenHerrn();
}
// Von "SeiBrav" aufgerufen
protected func TuWasBraves()
{
// Hat es seinen Besitzer verloren? :(
if((!GetPlayerName(GetOwner())) || GetOwner()==-1)
{
for(var i=0; i<MIJON(); ++i)
RemoveObject(Local(i));
RemoveObject(this());
return();
}
// Sonnenposition anpassen
BerechneSonne();
SetPosition(SonneX,SonneY);
// unskalierten Vektor ermitteln
var VektorX=GibVektorX(GetOwner());
var VektorY=GibVektorY(GetOwner());
var VektorDist=GibVektorDist(GetOwner());
// Die Modulation ist für alle Flares gleich
var FarbModulation = RGBa(GibFarbMod(),GibFarbMod(),GibFarbMod(),GibAlphaMod(VektorDist));
// Genauso auch die Abstandsangabe
var Abstaende = 1000-BoundBy((3000-VektorDist*10)/3,0,1000); // Promilleangabe 0 = nahe, 1000 = weit weg; 300 Pixel sind dabei "weit weg"
var AbstaendeAbsolut = (50*Abstaende)/10; // Wieviele 1/100 Pixel zwischen den einzelnen Lenseflares sind
// Ist unsere liebe Sonne überhaupt sichtbar (also Tag + unverdeckt)
var SonneSichtbar = IsDay() && (!GBackSemiSolid(0,0));
// Tagsüber die Sonne einblenden
if(IsDay())
{
SetVisibility (VIS_Owner());
}
else
{
SetVisibility (VIS_None());
}
// Alle Lenseflares durchgehen
for(var i=0; i<MIJON(); ++i)
{
if(SonneSichtbar)
{
// Tags sichtbar
SetVisibility (VIS_Owner(), Local(i));
SetClrModulation(FarbModulation,Local(i));
var LensDist = (i*AbstaendeAbsolut)/100;
SetPosition(GibLensPosX(LensDist,VektorX,VektorDist), GibLensPosY(LensDist,VektorY,VektorDist),Local(i));
}
else
// Nachts unsichtbar ODER bei verdeckter Sonne
SetVisibility (VIS_None(), Local(i));
}
// Sofern der Spieler alleine ist
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());
}
}
// Für die Farbmodulation (Entfernung + Nacht)
private func GibHelligkeit()
{
var ZeitObjekt = FindObject(TIME);
if(!ZeitObjekt)
return(100);
return(Local(2, ZeitObjekt));
}
private func GibSonnenMod() // Dämmerung
{
var Helligkeit = GibHelligkeit();
// Folgende Farbwerte sind in Promille
var Rot = 1000;
var Grun = 1000;
var Blau = 1000;
if(Inside(Helligkeit,1,20)) // Dämmerung -> Rotstich
{
var RotStich = Cos(Helligkeit*4,500);
Grun -= RotStich/2;
Blau -= RotStich;
}
// Nun die Farbe berechnen
return(RGB((255*Rot)/1000,(255*Grun)/1000,(255*Blau)/1000));
}
private func GibFarbMod()
{
return((255*GibHelligkeit())/100);
}
private func GibAlphaMod(iEntfernung)
{
var Staerke = BoundBy((2000-iEntfernung)/20,75,100); // Prozentangabe 75 = weit weg, 100 = nahe; 2000 Pixel sind dabei "weit weg"
return(255-(255*Staerke)/100);
}
// Genutzte Gammarampe
global func GammaRampe_Lenseflare()
{
return(2);
}
// Den (unskalierten) Vektor. Er wird skaliert, um die Lenseflare-Positionen zu errechnen
private func GibVektorX(iSpieler)
{
return(GibMittelpunktX(iSpieler) - SonneX);
}
private func GibVektorY(iSpieler)
{
return(GibMittelpunktY(iSpieler) - SonneY);
}
// Skaliere den Vektor mit der gewünschten Entfernung Lenseflare->Sonne
private func GibLensPosX(iEntfernung, VektorX, VektorDist)
{
// Skalierung in Promille
var Skalierung = (iEntfernung*1000) / VektorDist;
var TempX = (VektorX * Skalierung)/1000;
return(TempX + SonneX);
}
private func GibLensPosY(iEntfernung, VektorY, VektorDist)
{
// Skalierung in Promille
var Skalierung = (iEntfernung*1000) / VektorDist;
var TempY = (VektorY * Skalierung)/1000;
return(TempY + SonneY);
}
// Wieviele Lenseflares hätten's denn gerne
private func MIJON()
{
// etwa alle 50 Pixel einen Lenseflare
return(LandscapeWidth() / 2 / 50);
}
|