UCreateRaum.pas 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. unit UCreateRaum;
  2. interface
  3. procedure CreateRaum(x, z: Integer);
  4. var
  5. WallProb:Real=0.31;
  6. UPWallProb:Real=0.11;
  7. DownWallProb:Real=0.11;
  8. implementation
  9. uses Unit1,UNetwork,SysUtils;
  10. const emptyMap=false;
  11. procedure CreateRaum(x,z:Integer);
  12. var C2,C3:Real; C4:TRichtung; C1,C5:Integer; found:Boolean;
  13. begin
  14. repeat
  15. Map[x,z].Walls:=[];
  16. Map[x,z].UpWalls:=[];
  17. Map[x,z].DownWalls:=[];
  18. for C4:=Low(TRichtung) to High(TRichtung) do begin
  19. C2:=Random;
  20. C3:=0;
  21. C3:=C3+WallProb;
  22. if C2<C3 then begin
  23. Map[x,z].Walls:=
  24. Map[x,z].Walls+[C4];
  25. Continue;
  26. end;
  27. C3:=C3+UPWallProb;
  28. if C2<C3 then begin
  29. Map[x,z].UpWalls:=
  30. Map[x,z].UpWalls+[C4];
  31. Continue;
  32. end;
  33. C3:=C3+DownWallProb;
  34. if C2<C3 then begin
  35. Map[x,z].DownWalls:=
  36. Map[x,z].DownWalls+[C4];
  37. Continue;
  38. end;
  39. end;
  40. if Map[x+1,z].created then begin
  41. if nx in Map[x+1,z].Walls
  42. then Map[x,z].Walls:=Map[x,z].Walls+[px]
  43. else Map[x,z].Walls:=Map[x,z].Walls-[px];
  44. if nx in Map[x+1,z].UpWalls
  45. then Map[x,z].UpWalls:=Map[x,z].UpWalls+[px]
  46. else Map[x,z].UpWalls:=Map[x,z].UpWalls-[px];
  47. if nx in Map[x+1,z].DownWalls
  48. then Map[x,z].DownWalls:=Map[x,z].DownWalls+[px]
  49. else Map[x,z].DownWalls:=Map[x,z].DownWalls-[px];
  50. end;
  51. if Map[x-1,z].created then begin
  52. if px in Map[x-1,z].Walls
  53. then Map[x,z].Walls:=Map[x,z].Walls+[nx]
  54. else Map[x,z].Walls:=Map[x,z].Walls-[nx];
  55. if px in Map[x-1,z].UpWalls
  56. then Map[x,z].UpWalls:=Map[x,z].UpWalls+[nx]
  57. else Map[x,z].UpWalls:=Map[x,z].UpWalls-[nx];
  58. if px in Map[x-1,z].DownWalls
  59. then Map[x,z].DownWalls:=Map[x,z].DownWalls+[nx]
  60. else Map[x,z].DownWalls:=Map[x,z].DownWalls-[nx];
  61. end;
  62. if Map[x,z+1].created then begin
  63. if nz in Map[x,z+1].Walls
  64. then Map[x,z].Walls:=Map[x,z].Walls+[pz]
  65. else Map[x,z].Walls:=Map[x,z].Walls-[pz];
  66. if nz in Map[x,z+1].UpWalls
  67. then Map[x,z].UpWalls:=Map[x,z].UpWalls+[pz]
  68. else Map[x,z].UpWalls:=Map[x,z].UpWalls-[pz];
  69. if nz in Map[x,z+1].DownWalls
  70. then Map[x,z].DownWalls:=Map[x,z].DownWalls+[pz]
  71. else Map[x,z].DownWalls:=Map[x,z].DownWalls-[pz];
  72. end;
  73. if Map[x,z-1].created then begin
  74. if pz in Map[x,z-1].Walls
  75. then Map[x,z].Walls:=Map[x,z].Walls+[nz]
  76. else Map[x,z].Walls:=Map[x,z].Walls-[nz];
  77. if pz in Map[x,z-1].UpWalls
  78. then Map[x,z].UpWalls:=Map[x,z].UpWalls+[nz]
  79. else Map[x,z].UpWalls:=Map[x,z].UpWalls-[nz];
  80. if pz in Map[x,z-1].DownWalls
  81. then Map[x,z].DownWalls:=Map[x,z].DownWalls+[nz]
  82. else Map[x,z].DownWalls:=Map[x,z].DownWalls-[nz];
  83. end;
  84. if Map[x,z-1].created
  85. and Map[x,z+1].created
  86. and Map[x+1,z].created
  87. and Map[x-1,z].created then Break;
  88. if Map[x,z+1].created
  89. and Map[x+1,z].created
  90. and Map[x-1,z].created then Break;
  91. if Map[x,z-1].created
  92. and Map[x+1,z].created
  93. and Map[x-1,z].created then Break;
  94. if Map[x,z-1].created
  95. and Map[x,z+1].created
  96. and Map[x-1,z].created then Break;
  97. if Map[x,z-1].created
  98. and Map[x,z+1].created
  99. and Map[x+1,z].created then Break;
  100. until ((Map[x,z].Walls<>[]) or (Random>0.75))
  101. and ((Map[x,z].Walls<>[px,nx,nz,pz]) or (Random>0.9))
  102. and ((Map[x,z].UpWalls<>[px,nx,nz])
  103. and (Map[x,z].UpWalls<>[px,nx,pz])
  104. and (Map[x,z].UpWalls<>[px,nz,pz])
  105. and (Map[x,z].UpWalls<>[nx,nz,pz])
  106. or (Random>0.25))
  107. and ((Map[x,z].DownWalls<>[px,nx,nz])
  108. and (Map[x,z].DownWalls<>[px,nx,pz])
  109. and (Map[x,z].DownWalls<>[px,nz,pz])
  110. and (Map[x,z].DownWalls<>[nx,nz,pz])
  111. or (Random>0.25))
  112. and ((Map[x,z].Walls<>[px,nx,nz])
  113. and (Map[x,z].Walls<>[px,nx,pz])
  114. and (Map[x,z].Walls<>[px,nz,pz])
  115. and (Map[x,z].Walls<>[nx,nz,pz])
  116. or (Random>0.2));
  117. if not emptyMap then begin
  118. Map[x,z].Inhalt.Daten:=nil;
  119. if (x=0) and (z=0) then
  120. Map[x,z].Inhalt.Sorte:=1
  121. else begin
  122. repeat
  123. C2:=Random;
  124. C3:=0;
  125. Map[x,z].Inhalt.Sorte:=0;
  126. for C1:=1 to High(Roomtypes) do begin
  127. C3:=C3+Roomtypes[C1].Roomfrequenzy;
  128. if C3>C2 then begin
  129. Map[x,z].Inhalt.Sorte:=C1;
  130. Break;
  131. end;
  132. end;
  133. if C3<C2 then Map[x,z].Inhalt.Sorte:=0;
  134. found:=false;
  135. if GetRT(x,z).NotNextToSelf then
  136. for C1:=X-2 to X+2 do
  137. for C5:=Z-2 to Z+2 do
  138. if Map[C1,C5].created then
  139. if (Map[x,z].Inhalt.Sorte=Map[C1,C5].Inhalt.Sorte)
  140. and ((x<>C1) or (z<>C5)) then begin
  141. found:=true;
  142. Break;
  143. end;
  144. until not found or (Map[x,z].Inhalt.Sorte=0);
  145. if GetRT(x,z).TurnRandom[Up]
  146. or GetRT(x,z).TurnRandom[Down] then
  147. Map[x,z].Inhalt.Daten:=@Richtungen[
  148. TRichtung(Random(Integer(High(TRichtung))+1))];
  149. end;
  150. end;
  151. if Form3.ClientSocket.Active then begin
  152. Form3.ClientSocket.Socket.SendText(AnsiString(
  153. 'CreateRaum;'
  154. +IntToStr(x)+';'
  155. +IntToStr(z)+';'));
  156. end else Map[x,z].created:=true;
  157. end;
  158. end.