unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, GLScene, GLObjects, GLCoordinates, GLWin32Viewer, GLCrossPlatform, GLCadencer, jpeg, GLNavigator, Math, ExtCtrls, StdCtrls, ComCtrls, GLBitmapFont, GLWindowsFont, GLGameMenu, GLHUDObjects, GLConsole, GLGui, GLWindows, typinfo, ScktComp, GLGeomObjects,UMyUtils, GLBaseClasses; type THeight=(Down,Up); //todo 1:Zeitanzeige type TInhaltSorte=( empty,Arrow,Goal,YSNP,Green,GreenTrap, //0..8 WallTrap,Speed,BadSpeed,GreenSpeed,Turner,UpDownPorter,UpPorter, //9..15 DownPorter,Explosion,RainbowTrap,Pusher,BlackExplosion,Lightning //16..20 ); type TPanelConfig=record ID:Cardinal; TopDivH,LeftDivW,HeightDivH,WidthDivW:Real; Text:String; FontColor,BackGroundColor:TColor; FontSizeDivH:Real; Seconds:Real; DontShowIfWon:Boolean; SpeedAtEnd:Boolean; end; type PPanelConfig=^TPanelConfig; type TInhalt=record Sorte:Integer; Daten:Pointer; end; type TPlayer=record X,Y,Z:Real; LastX,LastZ:Real; LastTimeStart,LastTimeEnd:Cardinal; Ceilwalk:Boolean; jumping:Boolean; jumptime:Real; Speed:Real; Dead:Boolean; OutOfMaze:Boolean; end; type TRoomtype=record MaterialName:array[THeight] of string; ID:Cardinal; Roomfrequenzy:Real; Explode:array[THeight] of Boolean; ExplodeOtherPlayer:array[THeight] of Boolean; PortTo:array[THeight] of Boolean; TurnToGoal:array[THeight] of Boolean; WinAtArrival:Boolean; YSNP:array[THeight] of Boolean; GreenWallsAround:Boolean; ChangeAtArrivalTo:array[THeight] of Integer;//-1=nicht ändern, 0=Feld leeren ChangeWallsAtArrival:Boolean; ChangeSpeedAtArrival:Real; ChangeSpeedRandom:array[THeight] of Boolean; TurnPlayer:Boolean; PortPlayerToCenter:Boolean; PushPlayer:array[THeight] of Boolean; TurnRandom:array[THeight] of Boolean; InkOthers:array[THeight] of Boolean; ChangeOtherPlayerSpeed:Boolean; Contaminate:Boolean; OPTanzGegner:Boolean; Passierbar:Boolean; NotAtSpawn:Boolean; WallCageTrap:Boolean; NotNextToSelf:Boolean; SPInvisible:Boolean; //todo 1: raus end; type PRoomtype=^TRoomtype; type PGLCube=^TGLCube; type TRichtung=(px,nx,pz,nz); type TWallset=set of TRichtung; type PWallset=^TWallset; type TRaum=record created:Boolean; Walls,UpWalls,DownWalls:TWallset; Inhalt:TInhalt; end; type PRaum=^TRaum; const mapsize=500; type TMap=array[-mapsize..mapsize,-mapsize..mapsize] of TRaum; type TMuhNPC=record //todo 2:nach Inhalt.Daten Body:TGLCube; MoveX,MoveY,MoveZ:Real; end; type TForm1 = class(TForm) Scene1: TGLScene; GLSceneViewer1: TGLSceneViewer; Panel1: TPanel; Timer1: TTimer; GLUserInterface1: TGLUserInterface; GLNavigator1: TGLNavigator; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Panel5: TPanel; Panel6: TPanel; Panel8: TPanel; Panel9: TPanel; Panel11: TPanel; Panel13: TPanel; RichEdit1: TRichEdit; MenuFont: TGLWindowsBitmapFont; PlayerGoalDistFont: TGLWindowsBitmapFont; Memo1: TMemo; Walls: TGLDummyCube; OtherPlayers: TGLDummyCube; GLCamera1: TGLCamera; Planes: TGLDummyCube; Pushers: TGLDummyCube; UpDownPorters: TGLDummyCube; GreenSpeeds: TGLDummyCube; Explosions: TGLDummyCube; BadSpeeds: TGLDummyCube; Turners: TGLDummyCube; Grounds: TGLDummyCube; Speeds: TGLDummyCube; Arrows: TGLDummyCube; YSNPs: TGLDummyCube; Ceilings: TGLDummyCube; Blackexplosions: TGLDummyCube; Lightnings: TGLDummyCube; Menu: TGLDummyCube; MPJoinMenu: TGLGameMenu; MPHostMenu: TGLGameMenu; MPMenu: TGLGameMenu; VideoMenu: TGLGameMenu; SettingsMenu: TGLGameMenu; MainMenu: TGLGameMenu; HUDTexts: TGLDummyCube; GLHUDText1: TGLHUDText; PlayerGoalDists: TGLDummyCube; GLHUDText2: TGLHUDText; MuhNPCs: TGLDummyCube; ThrustBar: TProgressBar; PlayerLight: TGLLightSource; procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); function NewWall(x,z:Integer; width,depth:Real):TGLCube; function NewUpWall(x,z:Integer; width,depth:Real):TGLCube; function NewDownWall(x,z:Integer; width,depth:Real):TGLCube; function NewMuhNPCBody(x,z:Integer):TGLCube; procedure startJump(ID:Integer); procedure activateWall(dir,x,z:Integer; activate:Boolean); procedure activateUpWall(dir,x,z:Integer; activate:Boolean); procedure activateDownWall(dir,x,z:Integer; activate:Boolean); procedure activateGreen(x,z:Integer; activate:Boolean); procedure Reload; procedure ReloadWallShaders; procedure ReloadTexQual; procedure CreateMap; procedure ReloadRoom(X,Z:Integer); procedure SpreadContamination(X,Z:Integer); procedure Explode(X,Z:Integer); function NewPlane(x,z:Integer; Height:THeight; Sorte:Integer):TGLPlane; function NewPlayer(ID:Integer):TGLCylinder; procedure Creategoal; procedure FormResize(Sender: TObject); procedure RearrangePanels; procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Respawn; procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure WinGame(ID: Cardinal); procedure LoseGame; procedure ChangeSpeedTo(NewSpeed:Real); procedure MultiplySpeedBy(Factor:Real); procedure ChangeSpeedBy(DeltaSpeed:Real); procedure ThrustBarMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure GLSceneViewer1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ShowPanel(ID:Cardinal); private end; function GetRT(X,Z:Integer):PRoomtype; function GetPC(X,Z:Integer):PPanelConfig; const PlayerDepth:array[Boolean] of Real=(1.6,0.3); PlayerHeight:array[Boolean] of Real=(0.3,1.6); RaumRange=8; Exploradius=4; Spawnradius=4; SpawnradiusNoSorte=7; SpawnradiusNoWalls=3; ViewFullscreen:Boolean=false; colortest=false; Debug=true; showMapCreateTime=false; Richtungen:array[TRichtung] of TRichtung=(px,nx,pz,nz); var StartSpeed:Real=15; start:Cardinal; GameEnded:Boolean=false; Camera:TGLCamera; PlayerGoalDistPanels:array of TGLHUDText; jumppressed:Boolean; log:TextFile; npl:TGLCylinder; Roomtypes:array of TRoomType; PanelConfigs:array of TPanelConfig; Players:array of TPlayer; MyID:Cardinal; MinGoalDist:Integer=22; MaxGoalDist:Integer=26; ShaderWidth:Integer=6; GoalProtectionRadius:Integer=2; inMenu:Boolean; Panel11Seconds,Panel13Seconds,RE1Seconds:Real; Form1: TForm1; Map:TMap; PosX,PosZ:Integer; playerarr:array of TGLCylinder; RoomInvisible,PlaneInvisible:array[-RaumRange..RaumRange,-RaumRange..RaumRange] of Boolean; Wallarr,DownWallArr,UpWallArr: array[0..1,-RaumRange..RaumRange+1,-RaumRange..RaumRange+1] of TGLCube; PlayerList:TList; MuhNPCArr:array[-RaumRange..RaumRange,-RaumRange..RaumRange] of TMuhNPC; PlaneArr: array of array[THeight,-RaumRange..RaumRange,-RaumRange..RaumRange] of TGLPlane; lasttime:Cardinal=0; PGoal:PRaum; GoalPos:TPoint; Lost,Won:Boolean; ThrustDrag:Boolean; SW:TMyStopWatch; implementation uses UNetwork, UMaterials, UCadencer, UMoveToRoom,UCreateRaum,UColorByID, UCheckmaze, UMessageThread, ShellAPI, UIni, IniFiles, UMainMenu, System.UITypes; {$R *.dfm} function GetRT(X,Z:Integer):PRoomtype; begin Result:=@Roomtypes[Map[X,Z].Inhalt.Sorte]; end; function GetPC(X,Z:Integer):PPanelConfig; begin Result:=@PanelConfigs[Map[X,Z].Inhalt.Sorte]; end; procedure TForm1.ChangeSpeedBy(DeltaSpeed:Real); begin Players[MyID].Speed:=Players[MyID].Speed+DeltaSpeed*ThrustBar.Position/1000; end; procedure TForm1.ChangeSpeedTo(NewSpeed:Real); begin Players[MyID].Speed:=NewSpeed*ThrustBar.Position/1000; end; procedure TForm1.MultiplySpeedBy(Factor:Real); begin Players[MyID].Speed:=Players[MyID].Speed*Factor; end; procedure TForm1.WinGame(ID: Cardinal); begin if Won then Exit; GameEnded:=true; if ID=MyID then begin Panel8.Font.Color:=RGB(25,150,25); Panel8.Color:=RGB(38,38,38); Panel8.Visible:=true; Panel8.Caption:='You win!'; Panel9.Font.Color:=RGB(25,150,25); Panel9.Color:=RGB(38,38,38); Panel9.Visible:=true; Panel9.Caption:='Made by EBY aka Eror'; ChangeSpeedBy(30); Won:=true; Beep; end else begin Panel8.Font.Color:=RGB(150,25,25); Panel8.Color:=RGB(38,38,38); Panel8.Visible:=true; Panel8.Caption:='Player '+IntToStr(ID)+' won the game!'; LoseGame; end; end; procedure TForm1.LoseGame; begin Form3.SendPosition; if Lost then Exit; Players[MyID].Dead:=true; Form3.SendKill(MyID); Panel9.Font.Color:=RGB(150,25,25); Panel9.Color:=RGB(38,38,38); Panel9.Visible:=true; Panel9.Caption:='You Lose...'; Lost:=true; Beep; end; procedure TForm1.RearrangePanels; var C2:Integer; begin MenuFont.Font.Size:=Round(OrigSizes[13]*self.Height); PlayerGoalDistFont.Font.Size:=Round(OrigSizes[14]*self.Height); for C2:=0 to High(PlayerGoalDistPanels) do PlayerGoalDistPanels[C2].Position.SetPoint (0.01*self.Width,Form1.PlayerGoalDistFont.Font.Size*(C2+0.5),0); Panel8.SetBounds( Round(self.Width*OrigSizes[5]), Round(self.Height*OrigSizes[7]), Round(self.Width*OrigSizes[6]), Round(self.Height*OrigSizes[8])); Panel9.SetBounds( Round(self.Width*OrigSizes[9]), Round(self.Height*OrigSizes[11]), Round(self.Width*OrigSizes[10]), Round(self.Height*OrigSizes[12])); MainMenu.Position.X:=self.Width*OrigSizes[15]; MainMenu.Position.Y:=self.Height*OrigSizes[16]; GLHUDText1.Position.X:=Round(self.Width*OrigSizes[21]); GLHUDText1.Position.Y:=Round(self.Height*OrigSizes[22]); GLHUDText2.Position.X:=Round(self.Width*OrigSizes[23]); GLHUDText2.Position.Y:=Round(self.Height*OrigSizes[24]); Panel13.SetBounds( Round(self.Width*OrigSizes[25]), Round(self.Height*OrigSizes[27]), Round(self.Width*OrigSizes[26]), Round(self.Height*OrigSizes[28])); Panel8.Font.Size:=Round(self.Width*OrigSizes[29]); Panel9.Font.Size:=Round(self.Width*OrigSizes[30]); Panel11.Font.Size:=Round(self.Width*OrigSizes[32]); MenuFont.Font.Size:=Round(self.Width*OrigSizes[33]); Panel13.Font.Size:=Round(self.Width*OrigSizes[34]); RichEdit1.SetBounds( Round(OrigSizes[35]*self.Width), Round(OrigSizes[37]*self.Height), Round(OrigSizes[36]*self.Width), Round(OrigSizes[38]*self.Height)); RichEdit1.Font.SIZE:=Round(OrigSizes[39]*self.Height); SettingsMenu.Position.X:=self.Width*OrigSizes[40]; SettingsMenu.Position.Y:=self.Height*OrigSizes[41]; VideoMenu.Position.X:=self.Width*OrigSizes[42]; VideoMenu.Position.Y:=self.Height*OrigSizes[43]; MPMenu.Position.X:=self.Width*OrigSizes[46]; MPMenu.Position.Y:=self.Height*OrigSizes[47]; MPHostMenu.Position.X:=self.Width*OrigSizes[48]; MPHostMenu.Position.Y:=self.Height*OrigSizes[49]; MPJoinMenu.Position.X:=self.Width*OrigSizes[50]; MPJoinMenu.Position.Y:=self.Height*OrigSizes[51]; ThrustBar.Top:=Round(self.Height*OrigSizes[52]); ThrustBar.Left:=Round(self.Width*OrigSizes[53]); ThrustBar.Height:=Round(self.Height*OrigSizes[54]); ThrustBar.Width:=Round(self.Width*OrigSizes[55]); end; procedure TForm1.ReloadRoom(X,Z:Integer); var C1,C2:Integer; begin if (XPosX+RaumRange) or (ZPosZ+RaumRange) then Exit; if not Map[X,Z].created then CreateRaum(X,Z); if RoomInvisible[X-PosX,Z-PosZ] then begin Wallarr[0,X-posX,Z-PosZ].Visible:=false; Wallarr[1,X-posX,Z-PosZ].Visible:=false; UpWallarr[0,X-posX,Z-PosZ].Visible:=false; UpWallarr[1,X-posX,Z-PosZ].Visible:=false; DownWallarr[0,X-posX,Z-PosZ].Visible:=false; DownWallarr[1,X-posX,Z-PosZ].Visible:=false; for C1:=0 to High(Roomtypes) do begin PlaneArr[C1,Down,X-posX,Z-PosZ].Visible:=false; PlaneArr[C1,Up,X-posX,Z-PosZ].Visible:=false; end; MuhNPCArr[X-posX,Z-posZ].Body.Visible:=false; Exit; end; if Map[X-1,Z].Inhalt.Sorte<>Integer(Green) then begin activateWall(0,X-posX,Z-posZ,nx in Map[X,Z].Walls); activateUpWall(0,X-posX,Z-posZ,nx in Map[X,Z].UpWalls); activateDownWall(0,X-posX,Z-posZ,nx in Map[X,Z].DownWalls); end; if Map[X+1,Z].Inhalt.Sorte<>Integer(Green) then begin activateWall(0,X+1-posX,Z-posZ,px in Map[X,Z].Walls); activateUpWall(0,X+1-posX,Z-posZ,px in Map[X,Z].UpWalls); activateDownWall(0,X+1-posX,Z-posZ,px in Map[X,Z].DownWalls); end; if Map[X,Z-1].Inhalt.Sorte<>Integer(Green) then begin activateWall(1,X-posX,Z-posZ,nz in Map[X,Z].Walls); activateUpWall(1,X-posX,Z-posZ,nz in Map[X,Z].UpWalls); activateDownWall(1,X-posX,Z-posZ,nz in Map[X,Z].DownWalls); end; if Map[X,Z+1].Inhalt.Sorte<>Integer(Green) then begin activateWall(1,X-posX,Z-posZ+1,pz in Map[X,Z].Walls); activateUpWall(1,X-posX,Z-posZ+1,pz in Map[X,Z].UpWalls); activateDownWall(1,X-posX,Z-posZ+1,pz in Map[X,Z].DownWalls); end; activateGreen(X-PosX,Z-posZ,Map[X,Z].Inhalt.Sorte=Integer(Green)); if PlaneInvisible[X-PosX,Z-PosZ] then begin for C1:=0 to High(Roomtypes) do begin PlaneArr[C1,Down,X-posX,Z-PosZ].Visible:=false; PlaneArr[C1,Up,X-posX,Z-PosZ].Visible:=false; end; MuhNPCArr[X-posX,Z-posZ].Body.Visible:=false; Exit; end; for C1:=0 to High(Roomtypes) do begin PlaneArr[C1,Down,X-PosX,Z-PosZ].Visible:=Map[X,Z].Inhalt.Sorte=C1; if Map[X,Z].Inhalt.Sorte=C1 then begin for C2:=C1+1 to High(Roomtypes) do if PlaneArr[C1,Down,X-PosX,Z-PosZ]<>PlaneArr[C2,Down,X-PosX,Z-PosZ] then PlaneArr[C2,Down,X-PosX,Z-PosZ].Visible:=false; Break; end; end; for C1:=0 to High(Roomtypes) do begin PlaneArr[C1,Up,X-PosX,Z-PosZ].Visible:=Map[X,Z].Inhalt.Sorte=C1; if Map[X,Z].Inhalt.Sorte=C1 then begin for C2:=C1+1 to High(Roomtypes) do if PlaneArr[C1,Up,X-PosX,Z-PosZ]<>PlaneArr[C2,Up,X-PosX,Z-PosZ] then PlaneArr[C2,Up,X-PosX,Z-PosZ].Visible:=false; Break; end; end; if (GetRT(X,Z).SPInvisible) and not Form3.ClientSocket.Active and not Form3.ServerSocket.Active then begin for C1:=1 to High(Roomtypes) do begin PlaneArr[C1,Down,X-PosX,Z-PosZ].Visible:=false; PlaneArr[C1,Up,X-PosX,Z-PosZ].Visible:=false; end; MuhNPCArr[X-posX,Z-posZ].Body.Visible:=false; PlaneArr[0,Down,X-PosX,Z-PosZ].Visible:=true; PlaneArr[0,Up,X-PosX,Z-PosZ].Visible:=true; Exit; end; if GetRT(X,Z).TurnRandom[Up] then if Assigned(Map[X,Z].Inhalt.Daten) then case TRichtung(Map[X,Z].Inhalt.Daten^) of pz:Planearr[Map[X,Z].Inhalt.Sorte,Up,x-PosX,z-posZ].RollAngle:=0; nx:Planearr[Map[X,Z].Inhalt.Sorte,Up,x-PosX,z-posZ].RollAngle:=90; nz:Planearr[Map[X,Z].Inhalt.Sorte,Up,x-PosX,z-posZ].RollAngle:=180; px:Planearr[Map[X,Z].Inhalt.Sorte,Up,x-PosX,z-posZ].RollAngle:=270; end; if GetRT(X,Z).TurnRandom[Down] then if Assigned(Map[X,Z].Inhalt.Daten) then case TRichtung(Map[X,Z].Inhalt.Daten^) of pz:Planearr[Map[X,Z].Inhalt.Sorte,Down,x-PosX,z-posZ].RollAngle:=180; nx:Planearr[Map[X,Z].Inhalt.Sorte,Down,x-PosX,z-posZ].RollAngle:=90; nz:Planearr[Map[X,Z].Inhalt.Sorte,Down,x-PosX,z-posZ].RollAngle:=0; px:Planearr[Map[X,Z].Inhalt.Sorte,Down,x-PosX,z-posZ].RollAngle:=270; end; if GetRT(X,Z).TurnToGoal[Up] then if Abs(GoalPos.X-X)>Abs(GoalPos.Y-Z) then begin if GoalPos.X-X>0 then Planearr[Map[X,Z].Inhalt.Sorte,Up,x-PosX,z-posZ].RollAngle:=-90//px else Planearr[Map[X,Z].Inhalt.Sorte,Up,x-PosX,z-posZ].RollAngle:=90//nx end else begin if GoalPos.Y-Z>0 then Planearr[Map[X,Z].Inhalt.Sorte,Up,x-PosX,z-posZ].RollAngle:=0//pz else Planearr[Map[X,Z].Inhalt.Sorte,Up,x-PosX,z-posZ].RollAngle:=180//nz end; if GetRT(X,Z).TurnToGoal[Down] then if Abs(GoalPos.X-X)>Abs(GoalPos.Y-Z) then begin if GoalPos.X-X>0 then Planearr[Map[X,Z].Inhalt.Sorte,Down,x-PosX,z-posZ].RollAngle:=-90//px else Planearr[Map[X,Z].Inhalt.Sorte,Down,x-PosX,z-posZ].RollAngle:=90//nx end else begin if GoalPos.Y-Z>0 then Planearr[Map[X,Z].Inhalt.Sorte,Down,x-PosX,z-posZ].RollAngle:=180//pz else Planearr[Map[X,Z].Inhalt.Sorte,Down,x-PosX,z-posZ].RollAngle:=0//nu end; MuhNPCArr[X-posX,Z-posZ].Body.Visible:=GetRT(X,Z).OPTanzGegner; end; procedure TForm1.Reload; var C1,C3,C2:Integer; begin CameraDirection:=Ceil(Camera.Direction.X)+2*Ceil(Camera.Direction.Z); for C1:=-RaumRange to RaumRange do for C2:=-RaumRange to RaumRange do begin RoomInvisible[C1,C2]:=false; PlaneInvisible[C1,C2]:=false; end; if GetRT(PosX,PosZ).GreenWallsAround then for C1:=-RaumRange to RaumRange do for C2:=-RaumRange to RaumRange do begin RoomInvisible[C1,C2]:=true; PlaneInvisible[C1,C2]:=true; end; if not Players[MyID].OutOfMaze then begin for C2:=1 to RaumRange do if (nx in Map[C2+PosX,PosZ].Walls) or (GetRT(C2+PosX,PosZ).GreenWallsAround) then begin PlaneInvisible[C2,0]:=true; for C1:=C2+1 to RaumRange do RoomInvisible[C1,0]:=true; Break; end; for C2:=1 to RaumRange do if (nz in Map[PosX,C2+PosZ].Walls) or (GetRT(PosX,C2+PosZ).GreenWallsAround) then begin PlaneInvisible[0,C2]:=true; for C1:=C2+1 to RaumRange do RoomInvisible[0,C1]:=true; Break; end; for C2:=-1 downto -RaumRange do if (pz in Map[PosX,C2+PosZ].Walls) or (GetRT(PosX,C2+PosZ).GreenWallsAround) then begin PlaneInvisible[0,C2]:=true; for C1:=C2-1 downto -RaumRange do RoomInvisible[0,C1]:=true; Break; end; for C2:=-1 downto -RaumRange do if (px in Map[C2+PosX,PosZ].Walls) or (GetRT(C2+PosX,PosZ).GreenWallsAround) then begin PlaneInvisible[C2,0]:=true; for C1:=C2-1 downto -RaumRange do RoomInvisible[C1,0]:=true; Break; end; if (((px in Map[PosX,PosZ].Walls) or (GetRT(PosX+1,PosZ).GreenWallsAround)) and ((pz in Map[PosX,PosZ].Walls) or (GetRT(PosX,PosZ+1).GreenWallsAround))) or (CameraDirection=0) then for C1:=1 to RaumRange do for C2:=1 to RaumRange do begin RoomInvisible[C1,C2]:=true; end; if (((px in Map[PosX,PosZ].Walls) or (GetRT(PosX+1,PosZ).GreenWallsAround)) and ((nz in Map[PosX,PosZ].Walls) or (GetRT(PosX,PosZ-1).GreenWallsAround))) or (CameraDirection=2) then for C1:=1 to RaumRange do for C2:=-1 downto -RaumRange do begin RoomInvisible[C1,C2]:=true; end; if (((nx in Map[PosX,PosZ].Walls) or (GetRT(PosX-1,PosZ).GreenWallsAround)) and ((nz in Map[PosX,PosZ].Walls) or (GetRT(PosX,PosZ-1).GreenWallsAround))) or (CameraDirection=3) then for C1:=-1 downto -RaumRange do for C2:=-1 downto -RaumRange do begin RoomInvisible[C1,C2]:=true; end; if (((nx in Map[PosX,PosZ].Walls) or (GetRT(PosX-1,PosZ).GreenWallsAround)) and ((pz in Map[PosX,PosZ].Walls) or (GetRT(PosX,PosZ+1).GreenWallsAround))) or (CameraDirection=1) then for C1:=-1 downto -RaumRange do for C2:=1 to RaumRange do begin RoomInvisible[C1,C2]:=true; end; for C1:=-1 to 1 do begin RoomInvisible[C1,0]:=false; RoomInvisible[0,C1]:=false; end; PlaneInvisible[0,0]:=false; end; for C1:=PosX-RaumRange to PosX+RaumRange do for C3:=PosZ-RaumRange to PosZ+RaumRange do ReloadRoom(C1,C3); ReloadWallShaders; ReloadTexQual; end; procedure TForm1.ReloadWallShaders; var C1,C3:Integer; begin for C1:=-RaumRange to RaumRange+1 do for C3:=-RaumRange to RaumRange+1 do if (C1<-ShaderWidth+1) or (C3<-ShaderWidth+1) or (C1>ShaderWidth) or (C3>ShaderWidth) then begin if Wallarr[0,C1,C3].Material.LibMaterialName='Wall' then Wallarr[0,C1,C3].Material.LibMaterialName:='WallFar'; if Wallarr[1,C1,C3].Material.LibMaterialName='Wall' then Wallarr[1,C1,C3].Material.LibMaterialName:='WallFar'; if UpWallarr[0,C1,C3].Material.LibMaterialName='HalfWall' then UpWallarr[0,C1,C3].Material.LibMaterialName:='HalfWallFar'; if UpWallarr[1,C1,C3].Material.LibMaterialName='HalfWall' then UpWallarr[1,C1,C3].Material.LibMaterialName:='HalfWallFar'; if DownWallarr[0,C1,C3].Material.LibMaterialName='HalfWall' then DownWallarr[0,C1,C3].Material.LibMaterialName:='HalfWallFar'; if DownWallarr[1,C1,C3].Material.LibMaterialName='HalfWall' then DownWallarr[1,C1,C3].Material.LibMaterialName:='HalfWallFar'; end; end; procedure TForm1.ReloadTexQual; var C1,C3:Integer; const HiResRad=3; LowResRad=6; begin for C1:=-RaumRange to RaumRange+1 do for C3:=-RaumRange to RaumRange+1 do if sqrt(sqr(C1)+sqr(C3))>LowResRad then begin if Wallarr[0,C1,C3].Material.LibMaterialName='Wall' then Wallarr[0,C1,C3].Material.LibMaterialName:='WallVeryLowRes'; if Wallarr[1,C1,C3].Material.LibMaterialName='Wall' then Wallarr[1,C1,C3].Material.LibMaterialName:='WallVeryLowRes'; if UpWallarr[0,C1,C3].Material.LibMaterialName='HalfWall' then UpWallarr[0,C1,C3].Material.LibMaterialName:='HalfWallVeryLowRes'; if UpWallarr[1,C1,C3].Material.LibMaterialName='HalfWall' then UpWallarr[1,C1,C3].Material.LibMaterialName:='HalfWallVeryLowRes'; if DownWallarr[0,C1,C3].Material.LibMaterialName='HalfWall' then DownWallarr[0,C1,C3].Material.LibMaterialName:='HalfWallVeryLowRes'; if DownWallarr[1,C1,C3].Material.LibMaterialName='HalfWall' then DownWallarr[1,C1,C3].Material.LibMaterialName:='HalfWallVeryLowRes'; end else if sqrt(sqr(C1)+sqr(C3))>HiResRad then begin if Wallarr[0,C1,C3].Material.LibMaterialName='Wall' then Wallarr[0,C1,C3].Material.LibMaterialName:='WallLowRes'; if Wallarr[1,C1,C3].Material.LibMaterialName='Wall' then Wallarr[1,C1,C3].Material.LibMaterialName:='WallLowRes'; if UpWallarr[0,C1,C3].Material.LibMaterialName='HalfWall' then UpWallarr[0,C1,C3].Material.LibMaterialName:='HalfWallLowRes'; if UpWallarr[1,C1,C3].Material.LibMaterialName='HalfWall' then UpWallarr[1,C1,C3].Material.LibMaterialName:='HalfWallLowRes'; if DownWallarr[0,C1,C3].Material.LibMaterialName='HalfWall' then DownWallarr[0,C1,C3].Material.LibMaterialName:='HalfWallLowRes'; if DownWallarr[1,C1,C3].Material.LibMaterialName='HalfWall' then DownWallarr[1,C1,C3].Material.LibMaterialName:='HalfWallLowRes'; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin GLHUDText2.Visible:=inMenu; if VideoMenu.Visible then begin VideoMenu.Items[2]:='Shading Distance: '+IntToStr(ShaderWidth); end; if MPHostMenu.Visible then begin MPHostMenu.Items[0]:='Port: '+IntToStr(MPPort); end; if MPJoinMenu.Visible then begin MPJoinMenu.Items[0]:='Server-IP: '+MPServerAddress; MPJoinMenu.Items[1]:='Port: '+IntToStr(MPPort); end; GLSceneViewer1MouseMove( Sender,[],Form1.ScreenToClient(Mouse.CursorPos).X, Form1.ScreenToClient(Mouse.CursorPos).Y); CalcFPS(TTimer(Sender).Interval/1000); if Panel1.Visible then Panel1.Caption:=floatToStr(Round(100*FPS)/100); Self.Caption:='Randomaze FPS: '+floatToStr(Round(100*FPS)/100); if Panel11.Visible then begin Panel11Seconds:=Panel11Seconds-TTimer(Sender).Interval/1000; if Panel11Seconds<0.01 then begin //Float Comparison Panel11Seconds:=0; Panel11.Visible:=false; end; end; //todo 1:panel11 position in panelconfig, RichEdit1 in origsizes if RichEdit1.Visible then begin RE1Seconds:=RE1Seconds-TTimer(Sender).Interval/1000; if RE1Seconds<0.01 then begin //Float Comparison RE1Seconds:=0; RichEdit1.Visible:=false; end; end; if Panel13.Visible then begin Panel13Seconds:=Panel13Seconds-TTimer(Sender).Interval/1000; if Panel13Seconds<0.01 then begin //Float Comparison Panel13Seconds:=0; Panel13.Visible:=false; end; end; if Panel2.Visible then Panel2.Caption:= FloatToStr(Round(100*GLCamera1.Position.X)/100)+',' +FloatToStr(Round(100*GLCamera1.Position.Y)/100)+',' +FloatToStr(Round(100*GLCamera1.Position.Z)/100); if Panel3.Visible then Panel3.Caption:=BoolToStr(players[MyId].CeilWalk,true); if Panel4.Visible then Panel4.Caption:=BoolToStr(won,true)+','+BoolToStr(lost,true); if Panel6.Visible then Panel6.Caption:=IntToStr(PosX)+','+IntToStr(PosZ); if Players[MyID].Speed<=0.01 then if IDRecieved then begin Panel8.Font.Color:=RGB(150,25,25); Panel8.Color:=RGB(38,38,38); Panel8.Visible:=true; Panel8.Caption:='Anticamper:'; LoseGame; end; end; function TForm1.NewWall(x,z:Integer; width,depth:Real):TGLCube; begin Result:=TGLCube(Walls.AddNewChild(TGLCube)); Result.Position.X:=x; Result.Position.Y:=1; Result.Position.Z:=z; Result.CubeWidth:=width; Result.CubeHeight:=6; Result.CubeDepth:=depth; Result.Material.MaterialLibrary:=Form2.GLMaterialLibrary1; Result.Material.LibMaterialName:='Wall'; end; function TForm1.NewMuhNPCBody(X,Z:Integer):TGLCube; begin Result:=TGLCube(MuhNPCs.AddNewChild(TGLCube)); Result.Position.X:=20*X; Result.Position.Y:=0; Result.Position.Z:=20*Z; Result.CubeWidth:=2; Result.CubeHeight:=2; Result.CubeDepth:=2; Result.Material.MaterialLibrary:=Form2.GLMaterialLibrary1; Result.Material.LibMaterialName:='Muh'; end; function TForm1.NewUpWall(x,z:Integer; width,depth:Real):TGLCube; begin Result:=TGLCube(Walls.AddNewChild(TGLCube)); Result.Position.X:=x; Result.Position.Y:=2.5; Result.Position.Z:=z; Result.CubeWidth:=width; Result.CubeHeight:=3; Result.CubeDepth:=depth; Result.Material.MaterialLibrary:=Form2.GLMaterialLibrary1; Result.Material.LibMaterialName:='HalfWall'; end; function TForm1.NewDownWall(x,z:Integer; width,depth:Real):TGLCube; begin Result:=TGLCube(Walls.AddNewChild(TGLCube)); Result.Position.X:=x; Result.Position.Y:=-0.5; Result.Position.Z:=z; Result.CubeWidth:=width; Result.CubeHeight:=3; Result.CubeDepth:=depth; Result.Material.MaterialLibrary:=Form2.GLMaterialLibrary1; Result.Material.LibMaterialName:='HalfWall'; end; procedure TForm1.SpreadContamination(X,Z:Integer); var C1,C2:Integer; R1:Real; Pos:TPoint; begin for C1:=X-1 to X+1 do for C2:=Z-1 to Z+1 do begin R1:=Random; if R1<0.3 then begin Map[C1,C2].Inhalt.Sorte:=Map[X,Z].Inhalt.Sorte; if GetRT(C1,C2).TurnRandom[Down] or GetRT(C1,C2).TurnRandom[Up] then Map[C1,C2].Inhalt.Daten:=@Richtungen[ TRichtung(Random(Integer(High(TRichtung))+1))] end else if R1<0.5 then Map[C1,C2].Inhalt.Sorte:=0; if R1<0.5 then if Form3.ServerSocket.Active then begin Pos.X:=C1; Pos.Y:=C2; Form3.SendRaum(Pos); end; end; end; procedure TForm1.ShowPanel(ID:Cardinal); begin Panel11.Top:=Round(PanelConfigs[ID].TopDivH*Self.Height); Panel11.Left:=Round(PanelConfigs[ID].LeftDivW*Self.Width); Panel11.Width:=Round(PanelConfigs[ID].WidthDivW*Self.Width); Panel11.Height:=Round(PanelConfigs[ID].HeightDivH*Self.Height); Panel11.Caption:=PanelConfigs[ID].Text; if PanelConfigs[ID].SpeedAtEnd then Panel11.Caption:=Panel11.Caption+' '+ Floattostr(Round(100*Players[MyID].Speed)/100); Panel11.Font.Color:=PanelConfigs[ID].FontColor; Panel11.Color:=PanelConfigs[ID].BackGroundColor; Panel11.Font.SIZE:=Round(PanelConfigs[ID].FontSizeDivH*Self.Height); Panel11Seconds:=PanelConfigs[ID].Seconds; Panel11.Visible:=true; end; procedure TForm1.Explode(X,Z:Integer); var C1,C2:Integer; begin if (X=PosX) and (Z=PosZ) then Form1.ShowPanel(14);//todo 1:testen if GetRT(X,Z).Explode[Up] or GetRT(X,Z).Explode[Down] then Map[X,Z].Inhalt.Sorte:=0; for C1:=X-Exploradius to X+Exploradius do for C2:=Z-Exploradius to Z+Exploradius do if (C1-MapSize) and (C2-MapSize) then begin if not Map[C1,C2].created then CreateRaum(C1,C2); if sqrt(sqr(X-C1)+sqr(Z-C2))LowResRad then begin if (Roomtypes[Sorte].MaterialName[Height]='Grass') then Result.Material.LibMaterialName:='GrassVeryLowRes'; if (Roomtypes[Sorte].MaterialName[Height]='Ceiling') then Result.Material.LibMaterialName:='CeilingVeryLowRes'; end else if sqrt(sqr(x)+sqr(z))>HiResRad then begin if (Roomtypes[Sorte].MaterialName[Height]='Grass') then Result.Material.LibMaterialName:='GrassLowRes'; if (Roomtypes[Sorte].MaterialName[Height]='Ceiling') then Result.Material.LibMaterialName:='CeilingLowRes'; end; end; procedure TForm1.activateWall(dir,x,z:Integer; activate:Boolean); begin Wallarr[dir,x,z].Visible:=activate; end; procedure TForm1.activateUpWall(dir,x,z:Integer; activate:Boolean); begin UpWallarr[dir,x,z].Visible:=activate; end; procedure TForm1.activateDownWall(dir,x,z:Integer; activate:Boolean); begin DownWallarr[dir,x,z].Visible:=activate; end; procedure TForm1.activateGreen(X,Z:Integer; activate:Boolean); begin if activate then begin if nx in Map[x+PosX,z+PosZ].UpWalls then begin DownWallarr[0,X,Z].Material.LibMaterialName:='HalfGreenWall'; UpWallarr[0,X,Z].Material.LibMaterialName:='HalfWall'; Wallarr[0,X,Z].Material.LibMaterialName:='Wall'; DownWallarr[0,X,Z].Visible:=true; UpWallarr[0,X,Z].Visible:=true; Wallarr[0,X,Z].Visible:=false; end else if nx in Map[x+PosX,z+PosZ].DownWalls then begin DownWallarr[0,X,Z].Material.LibMaterialName:='HalfWall'; UpWallarr[0,X,Z].Material.LibMaterialName:='HalfGreenWall'; Wallarr[0,X,Z].Material.LibMaterialName:='Wall'; DownWallarr[0,X,Z].Visible:=true; UpWallarr[0,X,Z].Visible:=true; Wallarr[0,X,Z].Visible:=false; end else if not (nx in Map[x+PosX,z+PosZ].Walls) then begin DownWallarr[0,X,Z].Material.LibMaterialName:='HalfWall'; UpWallarr[0,X,Z].Material.LibMaterialName:='HalfWall'; Wallarr[0,X,Z].Material.LibMaterialName:='GreenWall'; DownWallarr[0,X,Z].Visible:=false; UpWallarr[0,X,Z].Visible:=false; Wallarr[0,X,Z].Visible:=true; end else begin DownWallarr[0,X,Z].Material.LibMaterialName:='HalfWall'; UpWallarr[0,X,Z].Material.LibMaterialName:='HalfWall'; Wallarr[0,X,Z].Material.LibMaterialName:='Wall'; DownWallarr[0,X,Z].Visible:=false; UpWallarr[0,X,Z].Visible:=false; Wallarr[0,X,Z].Visible:=true; end; if px in Map[x+PosX,z+PosZ].UpWalls then begin DownWallarr[0,X+1,Z].Material.LibMaterialName:='HalfGreenWall'; UpWallarr[0,X+1,Z].Material.LibMaterialName:='HalfWall'; Wallarr[0,X+1,Z].Material.LibMaterialName:='Wall'; DownWallarr[0,X+1,Z].Visible:=true; UpWallarr[0,X+1,Z].Visible:=true; Wallarr[0,X+1,Z].Visible:=false; end else if px in Map[x+PosX,z+PosZ].DownWalls then begin DownWallarr[0,X+1,Z].Material.LibMaterialName:='HalfWall'; UpWallarr[0,X+1,Z].Material.LibMaterialName:='HalfGreenWall'; Wallarr[0,X+1,Z].Material.LibMaterialName:='Wall'; DownWallarr[0,X+1,Z].Visible:=true; UpWallarr[0,X+1,Z].Visible:=true; Wallarr[0,X+1,Z].Visible:=false; end else if not (px in Map[x+PosX,z+PosZ].Walls) then begin DownWallarr[0,X+1,Z].Material.LibMaterialName:='HalfWall'; UpWallarr[0,X+1,Z].Material.LibMaterialName:='HalfWall'; Wallarr[0,X+1,Z].Material.LibMaterialName:='GreenWall'; DownWallarr[0,X+1,Z].Visible:=false; UpWallarr[0,X+1,Z].Visible:=false; Wallarr[0,X+1,Z].Visible:=true; end else begin DownWallarr[0,X+1,Z].Material.LibMaterialName:='HalfWall'; UpWallarr[0,X+1,Z].Material.LibMaterialName:='HalfWall'; Wallarr[0,X+1,Z].Material.LibMaterialName:='Wall'; DownWallarr[0,X+1,Z].Visible:=false; UpWallarr[0,X+1,Z].Visible:=false; Wallarr[0,X+1,Z].Visible:=true; end; if nz in Map[x+PosX,z+PosZ].UpWalls then begin DownWallarr[1,X,Z].Material.LibMaterialName:='HalfGreenWall'; UpWallarr[1,X,Z].Material.LibMaterialName:='HalfWall'; Wallarr[1,X,Z].Material.LibMaterialName:='Wall'; DownWallarr[1,X,Z].Visible:=true; UpWallarr[1,X,Z].Visible:=true; Wallarr[1,X,Z].Visible:=false; end else if nz in Map[x+PosX,z+PosZ].DownWalls then begin DownWallarr[1,X,Z].Material.LibMaterialName:='HalfWall'; UpWallarr[1,X,Z].Material.LibMaterialName:='HalfGreenWall'; Wallarr[1,X,Z].Material.LibMaterialName:='Wall'; DownWallarr[1,X,Z].Visible:=true; UpWallarr[1,X,Z].Visible:=true; Wallarr[1,X,Z].Visible:=false; end else if not (nz in Map[x+PosX,z+PosZ].Walls) then begin DownWallarr[1,X,Z].Material.LibMaterialName:='HalfWall'; UpWallarr[1,X,Z].Material.LibMaterialName:='HalfWall'; Wallarr[1,X,Z].Material.LibMaterialName:='GreenWall'; DownWallarr[1,X,Z].Visible:=false; UpWallarr[1,X,Z].Visible:=false; Wallarr[1,X,Z].Visible:=true; end else begin DownWallarr[1,X,Z].Material.LibMaterialName:='HalfWall'; UpWallarr[1,X,Z].Material.LibMaterialName:='HalfWall'; Wallarr[1,X,Z].Material.LibMaterialName:='Wall'; DownWallarr[1,X,Z].Visible:=false; UpWallarr[1,X,Z].Visible:=false; Wallarr[1,X,Z].Visible:=true; end; if pz in Map[X+PosX,Z+PosZ].UpWalls then begin DownWallarr[1,X,Z+1].Material.LibMaterialName:='HalfGreenWall'; UpWallarr[1,X,Z+1].Material.LibMaterialName:='HalfWall'; Wallarr[1,X,Z+1].Material.LibMaterialName:='Wall'; DownWallarr[1,X,Z+1].Visible:=true; UpWallarr[1,X,Z+1].Visible:=true; Wallarr[1,X,Z+1].Visible:=false; end else if pz in Map[x+PosX,z+PosZ].DownWalls then begin DownWallarr[1,X,Z+1].Material.LibMaterialName:='HalfWall'; UpWallarr[1,X,Z+1].Material.LibMaterialName:='HalfGreenWall'; Wallarr[1,X,Z+1].Material.LibMaterialName:='Wall'; DownWallarr[1,X,Z+1].Visible:=true; UpWallarr[1,X,Z+1].Visible:=true; Wallarr[1,X,Z+1].Visible:=false; end else if not (pz in Map[x+PosX,z+PosZ].Walls) then begin DownWallarr[1,X,Z+1].Material.LibMaterialName:='HalfWall'; UpWallarr[1,X,Z+1].Material.LibMaterialName:='HalfWall'; Wallarr[1,X,Z+1].Material.LibMaterialName:='GreenWall'; DownWallarr[1,X,Z+1].Visible:=false; UpWallarr[1,X,Z+1].Visible:=false; Wallarr[1,X,Z+1].Visible:=true; end else begin DownWallarr[1,X,Z+1].Material.LibMaterialName:='HalfWall'; UpWallarr[1,X,Z+1].Material.LibMaterialName:='HalfWall'; Wallarr[1,X,Z+1].Material.LibMaterialName:='Wall'; DownWallarr[1,X,Z+1].Visible:=false; UpWallarr[1,X,Z+1].Visible:=false; Wallarr[1,X,Z+1].Visible:=true; end; end else begin if (Map[X+PosX-1,Z+PosZ].Inhalt.Sorte<>Integer(Green)) then begin DownWallarr[0,X,Z].Material.LibMaterialName:='HalfWall'; UpWallarr[0,X,Z].Material.LibMaterialName:='HalfWall'; Wallarr[0,X,Z].Material.LibMaterialName:='Wall'; end; if (Map[X+PosX+1,Z+PosZ].Inhalt.Sorte<>Integer(Green)) then begin DownWallarr[0,X+1,Z].Material.LibMaterialName:='HalfWall'; UpWallarr[0,X+1,Z].Material.LibMaterialName:='HalfWall'; Wallarr[0,X+1,Z].Material.LibMaterialName:='Wall'; end; if (Map[X+PosX,Z+PosZ].Inhalt.Sorte<>Integer(Green)) then begin DownWallarr[1,X,Z].Material.LibMaterialName:='HalfWall'; UpWallarr[1,X,Z].Material.LibMaterialName:='HalfWall'; Wallarr[1,X+1,Z].Material.LibMaterialName:='Wall'; end; if (Map[X+PosX,Z+PosZ+1].Inhalt.Sorte<>Integer(Green)) then begin DownWallarr[1,X,Z+1].Material.LibMaterialName:='HalfWall'; UpWallarr[1,X,Z+1].Material.LibMaterialName:='HalfWall'; Wallarr[1,X,Z+1].Material.LibMaterialName:='Wall'; end; end; end; procedure TForm1.Creategoal; var C1,C2,C3,C4:Integer; begin Lost:=false; Won:=false; if PGoal<>nil then begin PGoal.Inhalt.Sorte:=0; PGoal:=nil; end; Panel8.Visible:=false; C1:=GoalPos.x; C3:=GoalPos.y; // Map[C1,C3].created:=true; Map[C1,C3].Inhalt.Daten:=nil; for C4:=C1-GoalProtectionRadius to C1+GoalProtectionRadius do for C2:=C3-GoalProtectionRadius to C3+GoalProtectionRadius do begin if sqrt(sqr(C1-C4)+sqr(C3-C2))=Cardinal(Length(Players)) then setlength(Players,MyID+1); if MyID>=Cardinal(Length(playerarr)) then begin Setlength(playerarr,MyID+1); for C3:=0 to High(playerarr) do if not assigned(playerarr[C3]) then playerarr[C3]:=Form1.NewPlayer(C3); end; Players[MyID].Dead:=false; Players[MyID].jumping:=false; Players[MyID].X:=GLCamera1.Position.X; Players[MyID].Y:=GLCamera1.Position.Y; Players[MyID].Z:=GLCamera1.Position.Z; Players[MyID].CeilWalk:=false; ChangeSpeedTo(StartSpeed); ini:=TMyIni.Create(ExtractFilePath(ParamStr(0))+'Settings.ini'); ROOMini:=TMyIni.Create(ExtractFilePath(ParamStr(0))+'Roomtypes.ini'); ROOMini.ReadFloatDefault:=0; PanelIni:=TMyIni.Create(ExtractFilePath(ParamStr(0))+'PanelConfigs.ini'); if not ini.SectionExists('Difficulty') then begin RewriteDifficulty; end else ReadDifficulty; if not ini.SectionExists('Multiplayer') then begin RewriteMPSet; end else ReadMPSet; if (not ini.SectionExists('Roomtypelist')) or (not FileExists(ExtractFilePath(ParamStr(0))+'Roomtypes.ini')) then RewriteRoomtypes; ReadRoomtypes; if not FileExists(ExtractFilePath(ParamStr(0))+'PanelConfigs.ini') then RewritePanelConfigs; ReadPanelConfigs; Setlength(PlaneArr,Length(Roomtypes)); maxJumpHeight:=4-PlayerHeight[false]; Form2.loadTextures; Form1.Icon.LoadFromFile('Wall.ico'); MainMenu.Visible:=true; SettingsMenu.Visible:=false; VideoMenu.Visible:=false; MPMenu.Visible:=false; MPHostMenu.Visible:=false; MPJoinMenu.Visible:=false; inMenu:=true; if not inMenu then GLUserInterface1.MouseLookActivate else GLUserInterface1.MouseLookDeactivate; GLHUDText1.ModulateColor.SetColor(0/255,168/255,255/255); GLHUDText1.Visible:=true; ChangeSpeedTo(StartSpeed); GLHUDText1.Text:= 'Speed: '+Floattostr(Round(100*Players[MyID].Speed)/100)+' m/s'; Panel13.Left:=Round(Self.Width*0.05); Panel13.Width:=Round(Self.Width*0.9); Panel13.Top:=Round(Self.Height*0.1); Panel13.Height:=Round(Self.Height*0.8); Panel13.Font.Size:=300; PosX:=0; PosZ:=0; for C1:=-RaumRange to RaumRange+1 do for C3:=-RaumRange to RaumRange+1 do begin Wallarr[0,C1,C3]:=NewWall(20*C1-10,20*C3,1,20); Wallarr[1,C1,C3]:=NewWall(20*C1,20*C3-10,20,1); UpWallarr[0,C1,C3]:=NewUpWall(20*C1-10,20*C3,1,20); UpWallarr[1,C1,C3]:=NewUpWall(20*C1,20*C3-10,20,1); DownWallarr[0,C1,C3]:=NewDownWall(20*C1-10,20*C3,1,20); DownWallarr[1,C1,C3]:=NewDownWall(20*C1,20*C3-10,20,1); end; for C1:=-RaumRange to RaumRange do for C3:=-RaumRange to RaumRange do begin PlaneArr[0,Down,C1,C3]:=NewPlane(C1,C3,Down,0); PlaneArr[0,Up,C1,C3]:=NewPlane(C1,C3,Up,0); end; for C4:=1 to High(Roomtypes) do for C1:=-RaumRange to RaumRange do for C3:=-RaumRange to RaumRange do begin if Roomtypes[C4].MaterialName[Down]=Roomtypes[0].MaterialName[Down] then PlaneArr[C4,Down,C1,C3]:=PlaneArr[0,Down,C1,C3] else PlaneArr[C4,Down,C1,C3]:=NewPlane(C1,C3,Down,C4); if Roomtypes[C4].MaterialName[Up]=Roomtypes[0].MaterialName[Up] then PlaneArr[C4,Up,C1,C3]:=PlaneArr[0,Up,C1,C3] else PlaneArr[C4,Up,C1,C3]:=NewPlane(C1,C3,Up,C4); end; for C1:=-RaumRange to RaumRange do for C3:=-RaumRange to RaumRange do begin MuhNPCarr[C1,C3].Body:=NewMuhNPCBody(C1,C3); MuhNPCarr[C1,C3].MoveX:=(Random-0.5)*3; MuhNPCarr[C1,C3].MoveY:=(Random-0.5)*3; MuhNPCarr[C1,C3].MoveZ:=(Random-0.5)*3; end; GLSceneViewer1.FieldOfView:=150; GLSceneViewer1.Buffer.BackgroundColor:=RGB(66,66,66); Panel11.Left:=Panel9.Left; Panel11.Top:=Panel9.Top; RichEdit1.Left:=Panel9.Left; RichEdit1.Top:=Panel9.Top; if not ini.SectionExists('Proportions') then RewriteOrigSizes else ReadOrigSizes; start:=GetTickCount; Repcount:=0; repeat Inc(Repcount); CreateMap; InitValidate; Validate(0,0,Down); if Application.Terminated then Exit; if GetTickCount>start+20000 then if MessageDlg( 'The game is taking very a long time to create a winable map. '+#13+#10+ 'Try using "reini.bat" to reset the settings. Continue trying?', mtWarning, [mbYes, mbNo], 0) =mrNo then begin Application.Terminate; Break; end else start:=High(Cardinal)-20000; until valid[0,0,Down]; if showMapCreateTime then MessageOut( 'Map generated:'+#13+#10 +IntToStr(GetTickCount-start)+' ms,'+#13+#10 +IntToStr(Repcount)+' tries,'+#13+#10 +FloatToStr((GetTickCount-start)/repcount)+' ms/try', 'Map generated') else InformationDump:=Repcount; if Application.Terminated then Exit; Reload; SW:=TMyStopWatch.Create; end; procedure TForm1.CreateMap; var C1,C3,C4,C5:Integer; begin for C1:=-mapsize to mapsize do for C3:=-mapsize to mapsize do Map[C1,C3].created:=false; repeat GoalPos.x:=RandomRange(-MaxGoalDist-1,MaxGoalDist+1); GoalPos.y:=RandomRange(-MaxGoalDist-1,MaxGoalDist+1); if Application.Terminated then Exit; if GetTickCount>start+20000 then if MessageDlg( 'The game is taking very a long time to create a winable map. '+#13+#10+ 'Try using "reini.bat" to reset the settings. Continue trying?', mtWarning, [mbYes, mbNo], 0) =mrNo then begin Application.Terminate; Break; end else start:=High(Cardinal)-20000; until (sqrt(sqr(GoalPos.X)+sqr(GoalPos.Y))>=MinGoalDist) and (sqrt(sqr(GoalPos.X)+sqr(GoalPos.Y))<=MaxGoalDist); PGoal:=nil; Creategoal; for C4:=-SpawnradiusNoWalls to SpawnradiusNoWalls do for C5:=-SpawnradiusNoWalls to SpawnradiusNoWalls do begin if sqrt(sqr(PosX-C4)+sqr(PosZ-C5))'Grass' then if Assigned(PlaneArr[C3,Down,C1,C2]) then FreeAndNil(PlaneArr[C3,Down,C1,C2]); if Roomtypes[C3].MaterialName[Up]<>'Ceiling' then if Assigned(PlaneArr[C3,Up,C1,C2]) then FreeAndNil(PlaneArr[C3,Up,C1,C2]); end; end; procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); var vis:Boolean; C2:Char; begin if Debug then if Key='v' then begin vis:=not Panel1.Visible; Panel1.Visible:=vis; Panel2.Visible:=vis; Panel3.Visible:=vis; Panel4.Visible:=vis; Panel5.Visible:=vis; Panel6.Visible:=vis; end; if Key='b' then begin Close; end; if Key='m' then begin if self.Left=OrigSizes[0] then begin Self.BorderStyle:=bsnone; Self.Left:=0; Self.Top:=0; Self.Width:=Screen.Width; Self.Height:=Screen.Height; end else begin Self.BorderStyle:=TFormBorderStyle(Round(OrigSizes[4])); Self.SetBounds( Round(OrigSizes[0]), Round(OrigSizes[1]), Round(OrigSizes[2]), Round(OrigSizes[3])); end; end; if Key='n' then begin ShellExecute(Handle, 'open','restart.bat', PChar(extractFileName(application.ExeName)), nil, SW_SHOWNORMAL); Close; //parameter dateiname end; if (Key='p') or (Key=Char(27)) then begin inMenu:=not MainMenu.Visible; MainMenu.Visible:=inMenu; SettingsMenu.Visible:=false; VideoMenu.Visible:=false; MPMenu.Visible:=false; MPHostMenu.Visible:=false; MPJoinMenu.Visible:=false; if not inMenu then begin if players[MyId].CeilWalk then GLCamera1.Up.SetVector(0,-1,0) else GLCamera1.Up.SetVector(0,1,0); GLUserInterface1.MouseLookActivate; end else GLUserInterface1.MouseLookDeactivate; end; if Key='-' then begin inMenu:=not SettingsMenu.Visible; MainMenu.Visible:=false; SettingsMenu.Visible:=inMenu; VideoMenu.Visible:=false; MPMenu.Visible:=false; MPHostMenu.Visible:=false; MPJoinMenu.Visible:=false; if not inMenu then begin if players[MyId].CeilWalk then GLCamera1.Up.SetVector(0,-1,0) else GLCamera1.Up.SetVector(0,1,0); GLUserInterface1.MouseLookActivate; end else GLUserInterface1.MouseLookDeactivate; end; if Key='w' then if inMenu then begin MainMenu.SelectPrev; SettingsMenu.SelectPrev; VideoMenu.SelectPrev; MPMenu.SelectPrev; MPHostMenu.SelectPrev; MPJoinMenu.SelectPrev; end; if Key='r' then begin if (MessageDlg('Do you really want to respawn?', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then begin Respawn; while inMenu do begin C2:='p'; FormKeyPress(Sender,C2); end; end; end; if Key='s' then if inMenu then begin MainMenu.SelectNext; SettingsMenu.SelectNext; VideoMenu.SelectNext; MPMenu.SelectNext; MPHostMenu.SelectNext; MPJoinMenu.SelectNext; end; if Key=Char(32) then begin if not inMenu then begin StartJump(MyID); Form3.SendJump(MyID); end else GLSceneViewer1MouseDown(Sender,TMouseButton(3),[], Mouse.CursorPos.X,Mouse.CursorPos.Y); jumppressed:=true; end; Panel5.Caption:=IntToStr(Ord(Key))+'='+Key; end; procedure TForm1.StartJump(ID:Integer); begin if jumppressed then Exit; if Lost then Exit; if players[ID].jumping then Exit; players[ID].jumptime:=0.00001; players[ID].jumping:=true; end; procedure TForm1.FormResize(Sender: TObject); begin RearrangePanels; Camera.SetFieldOfView(160,GLSceneviewer1.Width); end; procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if not inMenu then Exit; if MainMenu.Visible then MenuSelect2(MainMenu,X,Y); if SettingsMenu.Visible then MenuSelect2(SettingsMenu,X,Y); if VideoMenu.Visible then MenuSelect2(VideoMenu,X,Y); if MPMenu.Visible then MenuSelect2(MPMenu,X,Y); if MPHostMenu.Visible then MenuSelect2(MPHostMenu,X,Y); if MPJoinMenu.Visible then MenuSelect2(MPJoinMenu,X,Y); if ThrustDrag then ThrustBarMouseDown(Sender,TMousebutton(mbLeft),Shift,X,Y); end; procedure TForm1.Respawn; var C3:Integer; begin if GameEnded then begin MessageOut('Game has already ended. Try "N" instead.','Respawn impossible'); Exit; end; Lost:=false; Panel8.Visible:=false; Panel9.Visible:=false; ThrustBar.Position:=ThrustBar.Max; if Form3.ClientSocket.Active then begin Form3.RequestNewID(Form3.ClientSocket.Socket); end else begin Players[MyID].Dead:=true; MyID:=High(Players)+1; Setlength(Players,MyID+1); Setlength(playerarr,MyID+1); for C3:=0 to High(playerarr) do if not assigned(playerarr[C3]) then playerarr[C3]:=Form1.NewPlayer(C3); Players[MyID].Dead:=false; ChangeSpeedTo(StartSpeed); Form1.GLHUDText1.Text:= 'Speed: '+Floattostr(Round(100*Players[MyID].Speed)/100)+' m/s'; Form1.GLCamera1.Up.SetVector(0,1,0); Form1.GLCamera1.Position.X:=0; Form1.GLCamera1.Position.Z:=0; Form1.GLNavigator1.VirtualUp.SetPoint(0,1,0); PosX:=0; PosZ:=0; Players[MyID].jumping:=false; Players[MyID].X:=0; Players[MyID].Y:=0; Players[MyID].Z:=0; Players[MyID].jumptime:=0.00001; Players[MyID].LastX:=0; Players[MyID].LastZ:=0; Players[MyID].Ceilwalk:=false; Form3.SendCeilWalk; Reload; end; end; procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if not inMenu then Exit; MouseDownMenu(Sender,Button,Shift,X,Y); end; procedure TForm1.ThrustBarMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var m,b:real; begin if not inMenu then Exit; ThrustDrag:=true; m:=-(ThrustBar.Max-ThrustBar.Min)/ThrustBar.Height; b:=ThrustBar.Max-m*ThrustBar.Top; ThrustBar.Position:= Round(m*ScreenToClient(Mouse.CursorPos).Y+b); if Round(m*Mouse.CursorPos.Y+b)>ThrustBar.Max then ThrustBar.Position:=ThrustBar.Max else if Round(m*Mouse.CursorPos.Y+b)<5 then ThrustBar.Position:=5; Form4.UpdateSpeed; end; procedure TForm1.GLSceneViewer1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if not inMenu then Exit; ThrustDrag:=false; end; end.