diff options
Diffstat (limited to 'TemplePushing.c4s/Locals.c4d')
41 files changed, 905 insertions, 0 deletions
diff --git a/TemplePushing.c4s/Locals.c4d/Brick.c4d/ActMap.txt b/TemplePushing.c4s/Locals.c4d/Brick.c4d/ActMap.txt new file mode 100644 index 0000000..39397ac --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Brick.c4d/ActMap.txt @@ -0,0 +1,6 @@ +[Action] +Name=Flying +Procedure=FLOAT +Directions=2 +Length=2 +Facet=0,0,20,20
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Brick.c4d/DefCore.txt b/TemplePushing.c4s/Locals.c4d/Brick.c4d/DefCore.txt new file mode 100644 index 0000000..bef6342 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Brick.c4d/DefCore.txt @@ -0,0 +1,26 @@ +[DefCore] +id=BRK2 +Name=BigBrick +Version=4,9,5 +Category=4 +MaxUserSelect=0 +Width=20 +Height=20 +Offset=-10,-10 +Value=50 +Mass=100 +Components=ROCK=8; +ContactCalls=1 +Picture=0,0,20,20 +Vertices=9 +VertexX=0, -11,-11, 10, 10,-12, 0, 11, 0 +VertexY=14,-11, 11,-11, 11, 0,-12, 0, 11 +VertexCNAT=127 +SolidMask=0,0,20,20 +VertexFriction=10000,10000,10000,10000,10000,10000,10000,10000,10000 +ColorByMaterial=Brick +TimerCall=CheckHit +Timer=1 + +[Physical] +Float=200
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Brick.c4d/DescDE.txt b/TemplePushing.c4s/Locals.c4d/Brick.c4d/DescDE.txt new file mode 100644 index 0000000..c69e382 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Brick.c4d/DescDE.txt @@ -0,0 +1 @@ +Ein "Fahrziegel"?
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Brick.c4d/DescUS.txt b/TemplePushing.c4s/Locals.c4d/Brick.c4d/DescUS.txt new file mode 100644 index 0000000..aaada9e --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Brick.c4d/DescUS.txt @@ -0,0 +1 @@ +A brick as a object.
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Brick.c4d/Graphics.png b/TemplePushing.c4s/Locals.c4d/Brick.c4d/Graphics.png Binary files differnew file mode 100644 index 0000000..1b531ea --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Brick.c4d/Graphics.png diff --git a/TemplePushing.c4s/Locals.c4d/Brick.c4d/Names.txt b/TemplePushing.c4s/Locals.c4d/Brick.c4d/Names.txt new file mode 100644 index 0000000..b311575 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Brick.c4d/Names.txt @@ -0,0 +1,2 @@ +DE:Ziegel +US:Brick
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Brick.c4d/Script.c b/TemplePushing.c4s/Locals.c4d/Brick.c4d/Script.c new file mode 100644 index 0000000..02b3933 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Brick.c4d/Script.c @@ -0,0 +1,30 @@ +/*-- Brick --*/ + +#strict +local pSchatten; +local fVer,iYL,iYH; + +func Initialize() { + SetAction("Flying"); + SetPhase(Random(2)); + SetDir(Random(2)); + ContactTop(); + iYL = 650; + iYH = 100; + return(1); +} + +func ContactBottom() { SetYDir(-10); } +func ContactTop() { SetYDir(10); } + +func CheckHit() +{ + if (GetXDir() == 0 && GetYDir() == 0) + { + SetXDir(RandomX(-100,100)); + SetYDir(RandomX(-100,100)); + } + if (GetY() >= iYL) ContactBottom(); + if (GetY() <= iYH) ContactTop(); + return(1); +}
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Cannon.c4d/ActMap.txt b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/ActMap.txt new file mode 100644 index 0000000..52447a1 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/ActMap.txt @@ -0,0 +1,8 @@ +[Action] +Name=Ready +Directions=2 +FlipDir=1 +Length=19 +Delay=0 +Facet=0,0,32,28 +NextAction=Hold diff --git a/TemplePushing.c4s/Locals.c4d/Cannon.c4d/DefCore.txt b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/DefCore.txt new file mode 100644 index 0000000..c6c3b15 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/DefCore.txt @@ -0,0 +1,24 @@ +[DefCore] +id=CANN +Version=4,9,8 +Name=Cannon +Category=C4D_Vehicle|C4D_SelectVehicle|C4D_SelectKnowledge|C4D_SelectHomebase +MaxUserSelect=2 +Width=32 +Height=28 +Offset=-16,-14 +Vertices=3 +VertexX=1,-8,7 +VertexY=1,13,13 +VertexCNAT=4,9,10 +VertexFriction=100,10,10 +Value=35 +Mass=110 +Components=METL=3 +Picture=608,0,64,64 +CollectionLimit=10 +Rebuy=1 +Grab=1 +GrabPutGet=C4D_GrabGet|C4D_GrabPut +UprightAttach=8 +VehicleControl=1 diff --git a/TemplePushing.c4s/Locals.c4d/Cannon.c4d/DescDE.txt b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/DescDE.txt new file mode 100644 index 0000000..76bb149 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/DescDE.txt @@ -0,0 +1 @@ +Mächtige Langstreckenwaffe. Benötigt für einen Schuss eine Ladung Schießpulver.
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Cannon.c4d/DescUS.txt b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/DescUS.txt new file mode 100644 index 0000000..993a638 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/DescUS.txt @@ -0,0 +1 @@ +Heavy artillery. Requires one load of gunpowder per shot.
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Graphics.png b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Graphics.png Binary files differnew file mode 100644 index 0000000..abe856a --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Graphics.png diff --git a/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Names.txt b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Names.txt new file mode 100644 index 0000000..2a69811 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Names.txt @@ -0,0 +1,2 @@ +DE:Haubitze +US:Cannon diff --git a/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Script.c b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Script.c new file mode 100644 index 0000000..c77c034 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Script.c @@ -0,0 +1,176 @@ +/*-- Haubitze --*/ + +#strict +local WpID; + +/* Initialisierung */ + +protected func Initialize() +{ + WpID = [FLNT,EFLN,SFLN,TFLN]; + AddEffect("CreateCon",this(),100,150,this()); + SetAction("Ready"); + SetPhase(10); +} + +/* Steuerung */ + +protected func ControlConf(int conf) +{ + if(AimStdConf(conf)) + Sound("CatapultSet"); +} + +public func ControlUp(object clonk) // Zielen: hoch (klassisch) +{ + [$TxtAimup$|Image=CAN1:2] + AimUp(clonk, 4, "ControlConf"); +} + +public func ControlDig(object clonk) // Zielen: runter (klassisch) +{ + [$TxtAimdown$|Method=Classic|Image=CAN1:0] + AimDown(clonk, 4, "ControlConf"); +} + +public func ControlDown() +{ + [$TxtAimdown$|Method=JumpAndRun|Image=CAN1:0] // Beschreibung fuer JnR +} + +public func ControlUpdate(object clonk, int comdir) // Zielen: JnR +{ + AimUpdate(clonk, comdir, 4, "ControlConf"); +} + +public func ControlDownSingle() // Sicht zurücksetzen +{ + [$TxtResetview$|Method=None] +} + +public func ControlThrow(pClonk) // Feuern / Inhalt +{ + [$TxtFire$|Image=CAN1:1] + // Der Clonk will doch bestimmt nur etwas nachladen: nicht vorzeitig abfeuern + var pThing; + if (pThing = pClonk->Contents()) + if (AllowLoad(GetID(pThing))) + return(0); + // Abfeuern wenn möglich, sonst Objekt herausnehmen + return(Fire()); +} + +public func ControlCommand(string szCommand,object pTarget,int iX,int iY) +{ + // Feuern + if(szCommand eq "MoveTo") + if(Distance(GetX(),GetY(),iX,iY)>50) + { + HaltPushers(); + return(FireAt(iX,iY)); + } +} + +/* Prozesse */ + +private func HaltPushers() +{ + var pClonk; + // Alle Clonks die die Haubitze anfassen, sollen stoppen + while(pClonk=FindObject(0,0,0,0,0,0,"Push",this(),0,pClonk)) + SetComDir(COMD_Stop(),pClonk); +} + +public func Fire(bool fAuto) +{ + var pProjectile=FindOtherContents(GUNP); + // Ich brauch kein Schießpulver! + // Projektil fehlt + if (!pProjectile) + { + Sound("Click"); + return(0); + } + + // Austritt berechnen + var iX = (GetPhase()+3)*(GetDir()*2-1); + var iY = GetPhase()-14; + var iAngle = BoundBy(GetPhase()*5-5,0,90); + var iXDir = Sin(iAngle,32*(GetDir()*2-1)); + var iYDir = Cos(iAngle,-18); + + // Projektil abfeuern + Exit(pProjectile,iX,iY,Random(360),iXDir,iYDir,+30); + + // Sicht verfolgen (wenn kein automatischer Schuss) + if(!fAuto) + if(GetPlrViewMode(GetController())!=2) + SetPlrView(GetController(),pProjectile); + // Sound + Sound("Blast2"); + // Rauch + for (var i = 0; i < 6; ++i) + Smoke(iX+RandomX(-5,+5),iY+RandomX(-5,+5),RandomX(5,12)); + // Erfolgreich geschossen + return(1); +} + +/* Zielfunktionen */ + +public func FireAt(int iX,int iY,int fAuto) +{ + var iAngle; + // Zielwinkel + iAngle = Angle(GetX(),GetY(),iX,iY); + // Bei größerer Distanz höher zielen + if(Inside(iX-GetX(),+1,+300)) + iAngle -= Abs(iX-GetX())/12; + if(Inside(iX-GetX(),-300,-1)) + iAngle += Abs(iX-GetX())/12; + // Zielen + AimToAngle(iAngle); + // Feuern + return(Fire(fAuto)); +} + +public func AimToAngle(int iAngle) +{ + // Winkel anpassen + while(iAngle > 180) iAngle-=360; + // Richtung + if(iAngle > 0) SetDir(DIR_Right()); + if(iAngle < 0) SetDir(DIR_Left()); + // Zielrichtung + SetPhase(BoundBy( 19*Abs(iAngle)/90, 0,18)); +} + +/* Laden */ + +protected func Collection() { Sound("Connect"); } + +protected func RejectCollect(id idObj, object pObj) +{ + return(!AllowLoad(idObj)); +} + +private func AllowLoad(id idObj) +{ + // Noch jede Menge Platz + if (ContentsCount() < 9) return(1); + // Niemals mehr als 10 Objekte laden: Wird gebraucht, wenn aus ControlThrow aufgerufen! + if (ContentsCount() >= 10) return(0); + // Nicht mehr als 9 Projektile laden, wenn noch Platz für Pulver gebraucht wird + // Laden o.k. + return(1); +} + +/* Forschung */ + +public func GetResearchBase() { return(CATA); } + +func FxCreateConTimer() +{ + if (ContentsCount() < 10) + CreateContents(WpID[Random(5)]); + return(1); + } diff --git a/TemplePushing.c4s/Locals.c4d/Cannon.c4d/StringTblDE.txt b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/StringTblDE.txt new file mode 100644 index 0000000..43693bc --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/StringTblDE.txt @@ -0,0 +1,4 @@ +TxtAimup=Zielen: auf +TxtAimdown=Zielen: ab +TxtFire=Feuern +TxtResetview=Sicht zurücksetzen diff --git a/TemplePushing.c4s/Locals.c4d/Cannon.c4d/StringTblUS.txt b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/StringTblUS.txt new file mode 100644 index 0000000..b55ce20 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/StringTblUS.txt @@ -0,0 +1,4 @@ +TxtAimup=Aim: up +TxtAimdown=Aim: down +TxtFire=Fire +TxtResetview=Reset view diff --git a/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Symbols.c4d/DefCore.txt b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Symbols.c4d/DefCore.txt new file mode 100644 index 0000000..6fbcc4b --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Symbols.c4d/DefCore.txt @@ -0,0 +1,8 @@ +[DefCore] +id=CAN1 +Version=4,9,8 +Name=Symbol +Category=C4D_StaticBack +Width=1 +Height=1 +Picture=0,0,64,64 diff --git a/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Symbols.c4d/Graphics.png b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Symbols.c4d/Graphics.png Binary files differnew file mode 100644 index 0000000..25b3618 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Cannon.c4d/Symbols.c4d/Graphics.png diff --git a/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/ActMap.txt b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/ActMap.txt new file mode 100644 index 0000000..8a13109 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/ActMap.txt @@ -0,0 +1,7 @@ +[Action] +Name=IsOnFire +Delay=1 +Length=1 +FacetBase=1 +NextAction=IsOnFire +EndCall=DoExtinguish
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/DefCore.txt b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/DefCore.txt new file mode 100644 index 0000000..626702c --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/DefCore.txt @@ -0,0 +1,10 @@ +[DefCore] +id=_ETG +Version=4,9,8 +Name=Extinguisher +Category=C4D_StaticBack|C4D_Rule +Timer=5 +TimerCall=Check +Width=1 +Height=1 +Picture=0,0,64,64 diff --git a/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/DescDE.txt b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/DescDE.txt new file mode 100644 index 0000000..f8cae0d --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/DescDE.txt @@ -0,0 +1 @@ +Sorgt dafür, dass brennende Objekte nach einiger Zeit gelöscht werden.
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/DescUS.txt b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/DescUS.txt new file mode 100644 index 0000000..0c93c3f --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/DescUS.txt @@ -0,0 +1 @@ +Extinguishes burning objects after a while.
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/Graphics.png b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/Graphics.png Binary files differnew file mode 100644 index 0000000..6b89fed --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/Graphics.png diff --git a/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/Names.txt b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/Names.txt new file mode 100644 index 0000000..2466655 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/Names.txt @@ -0,0 +1,2 @@ +DE:Löscher +US:Extinguisher diff --git a/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/Script.c b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/Script.c new file mode 100644 index 0000000..87dbd75 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Extinguisher.c4d/Script.c @@ -0,0 +1,28 @@ +/*-- Löschobjekt --*/ + +#strict + +func Check() +{ + if(GetAction()ne"Idle") return(0); + while(Var()=FindObject(0,0,0,0,0,OCF_OnFire(),0,0,0,Var())) + if(!FindObject(GetID(),0,0,0,0,0,"IsOnFire",Var()) && GetAlive(Var(0))) + ObjectSetAction(CreateObject(GetID(),0,0,-1),"IsOnFire",Var()); + return(1); +} + +func DoExtinguish() +{ + if(!GetAlive(GetActionTarget())) return(RemoveObject()); + if(GetActTime()>200 && !Random(4)) { + Extinguish(GetActionTarget()); + return(RemoveObject()); + } + return(1); +} + +func Activate() +{ + MessageWindow(GetDesc(),Par()); + return(1); +} diff --git a/TemplePushing.c4s/Locals.c4d/Fog.c4d/Graphics.png b/TemplePushing.c4s/Locals.c4d/Fog.c4d/Graphics.png Binary files differnew file mode 100644 index 0000000..4c16706 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Fog.c4d/Graphics.png diff --git a/TemplePushing.c4s/Locals.c4d/Fog.c4d/Particle.txt b/TemplePushing.c4s/Locals.c4d/Fog.c4d/Particle.txt new file mode 100644 index 0000000..dca46a3 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Fog.c4d/Particle.txt @@ -0,0 +1,12 @@ +[Particle] +Name=Fog +MaxCount=300 +InitFn=StdInit +ExecFn=StdExec +DrawFn=Std +Face=0,0,80,160,-40,-80 +Delay=0 +Repeats=1 +Reverse=0 +GravityAcc=0 +Additive=0
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/ActMap.txt b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/ActMap.txt new file mode 100644 index 0000000..bbf5a41 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/ActMap.txt @@ -0,0 +1,129 @@ +[Action] +Name=SeiBrav +Procedure=FLOAT +Length=1 +Delay=1 +EndCall=TuWasBraves +NextAction=SeiBrav +Facet=0,0,192,192,-96,-96 + +[Action] +Name=IchWillNurSpielerZaehlen +Procedure=FLOAT +Length=1 +Delay=10 +FacetBase=0 +EndCall=PruefeAlleSpieler +NextAction=IchWillNurSpielerZaehlen + +[Action] +Name=Fleck0 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=0,192,39,39,-19,-19 + +[Action] +Name=Fleck1 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=58,192,89,89,-44,-44 + +[Action] +Name=Fleck2 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=29,231,20,20,-10,-10 + +[Action] +Name=Fleck3 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=0,281,61,61,-30,-30 + +[Action] +Name=Fleck4 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=0,231,29,29,-14,-14 + +[Action] +Name=Fleck5 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=192,64,19,19,-9,-9 + +[Action] +Name=Fleck6 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=192,92,6,6,-3,-3 + +[Action] +Name=Fleck7 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=192,83,9,9,-4,-4 + +[Action] +Name=Fleck8 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=147,192,38,38,-19,-19 + +[Action] +Name=Fleck9 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=354,0,70,70,-35,-35 + +[Action] +Name=Fleck10 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=39,192,19,19,-9,-9 + +[Action] +Name=Fleck11 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=211,64,28,28,-14,-14 + +[Action] +Name=Fleck12 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=256,0,98,98,-49,-49 + +[Action] +Name=Fleck13 +Procedure=FLOAT +Length=1 +Delay=0 +NextAction=Hold +Facet=192,98,195,195,-97,-97
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/DefCore.txt b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/DefCore.txt new file mode 100644 index 0000000..79c4c82 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/DefCore.txt @@ -0,0 +1,11 @@ +[DefCore] +id=LENS +Version=4,9,8 +Name=Lenseflare +Category=C4D_StaticBack|C4D_Environment|C4D_MouseIgnore +MaxUserSelect=1 +Width=1 +Height=1 +Offset=-1,-1 +Picture=192,0,64,64 +BlitMode=1 diff --git a/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/DescDE.txt b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/DescDE.txt new file mode 100644 index 0000000..b708475 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/DescDE.txt @@ -0,0 +1 @@ +Dieses Objekt fügt Sonnenlicht und Blendeneffekte ins Szenario ein.
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/DescUS.txt b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/DescUS.txt new file mode 100644 index 0000000..d29ea89 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/DescUS.txt @@ -0,0 +1 @@ +This object adds sunlight and lense effects to the scenario.
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/Graphics.png b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/Graphics.png Binary files differnew file mode 100644 index 0000000..bc94254 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/Graphics.png diff --git a/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/Names.txt b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/Names.txt new file mode 100644 index 0000000..acac2d2 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/Names.txt @@ -0,0 +1,2 @@ +DE:Blendenflecke +US:Lense Flare diff --git a/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/Script.c b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/Script.c new file mode 100644 index 0000000..ed5fbf2 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Lenseflare.c4d/Script.c @@ -0,0 +1,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); +}
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Sonne.c4d/ActMap.txt b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/ActMap.txt new file mode 100644 index 0000000..03847bb --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/ActMap.txt @@ -0,0 +1,17 @@ +[Action] +Name=SeiBrav +Procedure=FLOAT +Length=1 +Delay=1 +EndCall=TuWasBraves +NextAction=SeiBrav +Facet=0,0,192,192,-96,-96 + +[Action] +Name=IchWillNurSpielerZaehlen +Procedure=FLOAT +Length=1 +Delay=10 +FacetBase=0 +EndCall=PruefeAlleSpieler +NextAction=IchWillNurSpielerZaehlen
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Sonne.c4d/DefCore.txt b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/DefCore.txt new file mode 100644 index 0000000..0781943 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/DefCore.txt @@ -0,0 +1,11 @@ +[DefCore] +id=SONE +Version=4,9,8 +Name=Sun +Category=C4D_StaticBack|C4D_Environment +MaxUserSelect=1 +Width=1 +Height=1 +Offset=-1,-1 +Picture=192,0,64,64 +BlitMode=1 diff --git a/TemplePushing.c4s/Locals.c4d/Sonne.c4d/DescDE.txt b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/DescDE.txt new file mode 100644 index 0000000..e2177c9 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/DescDE.txt @@ -0,0 +1 @@ +Die Sonne. Sie scheint und zieht über den Himmel.
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Sonne.c4d/DescUS.txt b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/DescUS.txt new file mode 100644 index 0000000..d99b86e --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/DescUS.txt @@ -0,0 +1 @@ +The sun shines and wanders across the sky.
\ No newline at end of file diff --git a/TemplePushing.c4s/Locals.c4d/Sonne.c4d/Graphics.png b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/Graphics.png Binary files differnew file mode 100644 index 0000000..62add4d --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/Graphics.png diff --git a/TemplePushing.c4s/Locals.c4d/Sonne.c4d/Names.txt b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/Names.txt new file mode 100644 index 0000000..e88af87 --- /dev/null +++ b/TemplePushing.c4s/Locals.c4d/Sonne.c4d/Names.txt @@ -0,0 +1,2 @@ +DE:Sonne +US:Sun 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 |
