PageRenderTime 34ms CodeModel.GetById 15ms app.highlight 17ms RepoModel.GetById 1ms app.codeStats 0ms

/planet/System.c4g/Commits.c

https://bitbucket.org/randrian/openclonk2
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}