/planet/System.c4g/Commits.c
C | 202 lines | 125 code | 34 blank | 43 comment | 54 complexity | b8e93bb1668775ff7cc908bcd43612d1 MD5 | raw file
Possible License(s): WTFPL, 0BSD, LGPL-2.1, CC-BY-3.0
1#strict 2
2
3/*-- flgr --*/
4
5// Liefert das Offset zur gew�nschten Landscape-X-Position zur�ck
6global func AbsX(int x) { return x - GetX(); }
7
8// Liefert das Offset zur gew�nschten Landscape-Y-Position zur�ck
9global func AbsY(int y) { return y - GetY(); }
10
11// Unterst�tzt negative Werte und kann Zufallszahlen zwischen 2 Werten liefern
12
13global func RandomX(int iStart, int iEnd) {
14 var iSwap;
15 // Werte vertauscht: trotzdem richtig rechnen
16 if(iStart > iEnd) { iSwap=iStart; iStart=iEnd; iEnd=iSwap; }
17 // Zuf�lligen Faktor bestimmen (Differenz plus die null) und iStart aufrechnen
18 return Random(iEnd-iStart+1)+iStart;
19}
20
21// Setzt die Fertigstellung von this auf iNewCon
22global func SetCon(int new_con) {
23 return DoCon(new_con - GetCon());
24}
25
26// Setzt X- und Y-Dir eines Objektes
27global func SetSpeed(int x_dir, int y_dir, int prec) {
28 SetXDir(x_dir, prec);
29 SetYDir(y_dir, prec);
30}
31
32// Setzt X- und Y-Koordinate eines Vertices zugleich
33global func SetVertexXY(int index, int x, int y) {
34 // Vertices setzen
35 SetVertex(index, VTX_X, x);
36 SetVertex(index, VTX_Y, y);
37}
38
39// Liefert die Anzahl aller feststeckenden Vertices von this zur�ck
40global func VerticesStuck() {
41 var vertices;
42 var x_offset;
43 var y_offset;
44
45 // Vertices durchgehen
46 for (var i = -1; i < GetVertexNum(); i++) {
47 // solid?
48 if (GBackSolid(x_offset + GetVertex(i, VTX_X),
49 y_offset + GetVertex(i, VTX_Y)))
50 // hochz�hlen
51 vertices++;
52 }
53 return vertices;
54}
55
56/*-- Joern --*/
57
58//F�gt zum Konto des genannten Spielers iValue Gold hinzu
59global func DoWealth(int iPlayer, int iValue)
60{
61 return SetWealth(iPlayer, iValue + GetWealth(iPlayer));
62}
63
64/*-- Tyron --*/
65
66
67// Pr�ft ob die angegebene Definition vorhanden ist
68global func FindDefinition(id idDef) {
69 if(GetDefCoreVal("id","DefCore",idDef)) return true;
70}
71
72// Erzeugt amount viele Objekte des Typs id im angegebenen Zielrechteck (optional) im angegeben Material. Gibt die Anzahl der Iterationen zur�ck, oder -1 wenn die Erzeugung fehlschl�gt
73global func PlaceObjects(id id,int amount,string strmat,int x,int y,int wdt,int hgt,bool onsf,bool nostuck) {
74 var i,j;
75 var rndx,rndy,obj;
76 var mtype, mat;
77 var func, objhgt=GetDefCoreVal("Height","DefCore",id);
78
79 mat=Material(strmat);
80 // some failsavety
81 if(mat==-1)
82 if(strmat != "GBackSolid" && strmat != "GBackSemiSolid" && strmat != "GBackLiquid" && strmat != "GBackSky")
83 return -1;
84
85 // optional parameters wdt and hgt
86 if(!wdt) wdt=LandscapeWidth()-x-GetX();
87 if(!hgt) hgt=LandscapeHeight()-y-GetY();
88
89 // cycle-saving method
90 if(mat!=-1)
91 while(i<amount) {
92 // if there's isn't any or not enough of the given material, break before it gets an endless loop
93 if(j++>20000) return -1;
94 // destinated rectangle
95 rndx=x+Random(wdt);
96 rndy=y+Random(hgt);
97 // positioning
98 if(GetMaterial(rndx,rndy)==mat) {
99 // on-surface Option
100 if(onsf) while(GBackSemiSolid(rndx, rndy) && rndy>=y) rndy--;
101 if(rndy<y) continue;
102 // create and verify stuckness ;)
103 obj=CreateObject(id,rndx,rndy+objhgt/2,-1);
104 obj->SetR(Random(360));
105 if(obj->Stuck() || nostuck) i++;
106 else obj->RemoveObject();
107 }
108 }
109
110 if(mat==-1)
111 while(i<amount) {
112 // if there's isn't any or not enough of the given material, break before it gets an endless loop
113 if(j++>20000) return -1;
114 // destinated rectangle
115 rndx=x+Random(wdt);
116 rndy=y+Random(hgt);
117 // positioning
118 if(eval(Format("%s(%d,%d)",strmat,rndx,rndy))) {
119 // on-surface Option
120 if(onsf) while(GBackSemiSolid(rndx, rndy) && rndy>=y) rndy--;
121 if(rndy<y) continue;
122 // create and verify stuckness ;)
123 obj=CreateObject(id,rndx,rndy+objhgt/2,-1);
124 obj->SetR(Random(360));
125 if(obj->Stuck() || nostuck) i++;
126 else obj->RemoveObject();
127 }
128 }
129
130 return j;
131}
132
133global func CastObjects(iddef,am,lev,x,y,angs,angw) {
134 if(!angw) angw = 180;
135 for(var i=0; i<am; i++) {
136 var obj = CreateObject(iddef,x,y,NO_OWNER);
137 var ang = angs + RandomX(-angw/2,angw/2);
138 var xdir = xdir=Cos(ang,lev) + RandomX(-3,3);
139 obj->SetR(Random(360));
140 obj->SetXDir(xdir);
141 obj->SetYDir(Sin(ang,lev) + RandomX(-3,3));
142 obj->SetRDir((10+Random(21))*xdir/Abs(xdir));
143 }
144}
145
146global func CastPXS(string mat,int am,int lev,int x,int y,int angs,int angw) {
147 if(!angw) angw = 180;
148 for(var i=0;i<am;i++) {
149 var ang = angs + RandomX(-angw/2,angw/2);
150 InsertMaterial(Material(mat),x,y,Cos(ang,lev)+RandomX(-3,3),Sin(ang,lev)+RandomX(-3,3));
151 }
152}
153
154
155global func Tan(int iAngle, int iRadius, int iPrec) {
156 return (iRadius * Sin(iAngle,iRadius*100, iPrec)) / Cos(iAngle,iRadius*100, iPrec) ;
157}
158
159/*-- Newton -- */
160
161global func CheckVisibility(int iPlr)
162{
163 var iVisible = this["Visibility"];
164 if (GetType(iVisible) == C4V_Array) iVisible = iVisible[0];
165
166 // garnicht sichtbar
167 if(iVisible == VIS_None) return false;
168 // f�r jeden sichtbar
169 if(iVisible == VIS_All) return true;
170
171 // Objekt geh�rt dem anggb. Spieler
172 if(GetOwner() == iPlr)
173 { if(iVisible & VIS_Owner) return true; }
174 // Objekt geh�rt einem Spieler, der iPlr feindlich gesonnen ist
175 else if(Hostile(GetOwner(),iPlr))
176 { if(iVisible & VIS_Enemies) return true; }
177 // Objekt geh�rt einem Spieler, der iPlr freundlich gesonnen ist
178 else
179 { if(iVisible & VIS_Allies) return true; }
180
181 if(iVisible & VIS_Select)
182 if(this["Visibility"][1+iPlr/32] & 1<<iPlr)
183 return true;
184
185 return false;
186}
187
188/*-- timi --*/
189
190global func GetPlayerByName(string strPlrName)
191{
192 // Alle Spieler durchgehen
193 var i = GetPlayerCount();
194 while (i--)
195 // Passt der Spielername mit dem gesuchten �berein?
196 if (WildcardMatch(GetPlayerName(GetPlayerByIndex(i)), strPlrName))
197 // Wenn ja, Spielernummer zur�ckgeben!
198 return GetPlayerByIndex(i);
199
200 // Es gibt keinen Spieler, der so hei�t!
201 return -1;
202}