/planet/System.c4g/Commits.c

https://bitbucket.org/randrian/openclonk2 · C · 202 lines · 125 code · 34 blank · 43 comment · 58 complexity · b8e93bb1668775ff7cc908bcd43612d1 MD5 · raw file

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