123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442 |
- unit UMoveToRoom;
- interface
- procedure MoveToRoom(LastX,LastZ:Integer);
- procedure ChangePlayerSpeed(LastX,LastZ:Integer);
- procedure WarpWalls(LastX,LastZ:Integer);
- implementation
- uses Unit1,UNetwork,SysUtils,Types,Windows,Math,UCadencer;
- procedure WarpWalls(LastX,LastZ:Integer);
- var Pos:TPoint;
- begin
- if LastX<>PosX-1 then begin
- if nx in Map[PosX,PosZ].Walls
- then begin
- Map[PosX,PosZ].Walls:=Map[PosX,PosZ].Walls-[nx];
- Map[PosX-1,PosZ].Walls:=Map[PosX-1,PosZ].Walls-[px];
- end else if nx in Map[PosX,PosZ].UpWalls
- then begin
- Map[PosX,PosZ].UpWalls:=Map[PosX,PosZ].UpWalls-[nx];
- Map[PosX-1,PosZ].UpWalls:=Map[PosX-1,PosZ].UpWalls-[px];
- Map[PosX,PosZ].DownWalls:=Map[PosX,PosZ].DownWalls+[nx];
- Map[PosX-1,PosZ].DownWalls:=Map[PosX-1,PosZ].DownWalls+[px];
- end else if nx in Map[PosX,PosZ].DownWalls
- then begin
- Map[PosX,PosZ].DownWalls:=Map[PosX,PosZ].DownWalls-[nx];
- Map[PosX-1,PosZ].DownWalls:=Map[PosX-1,PosZ].DownWalls-[px];
- Map[PosX,PosZ].UpWalls:=Map[PosX,PosZ].UpWalls+[nx];
- Map[PosX-1,PosZ].UpWalls:=Map[PosX-1,PosZ].UpWalls+[px];
- end else begin
- Map[PosX,PosZ].Walls:=Map[PosX,PosZ].Walls+[nx];
- Map[PosX-1,PosZ].Walls:=Map[PosX-1,PosZ].Walls+[px];
- end;
- end;
- if LastX<>PosX+1 then begin
- if px in Map[PosX,PosZ].Walls
- then begin
- Map[PosX,PosZ].Walls:=Map[PosX,PosZ].Walls-[px];
- Map[PosX+1,PosZ].Walls:=Map[PosX+1,PosZ].Walls-[nx];
- end else if px in Map[PosX,PosZ].UpWalls
- then begin
- Map[PosX,PosZ].UpWalls:=Map[PosX,PosZ].UpWalls-[px];
- Map[PosX+1,PosZ].UpWalls:=Map[PosX+1,PosZ].UpWalls-[nx];
- Map[PosX,PosZ].DownWalls:=Map[PosX,PosZ].DownWalls+[px];
- Map[PosX+1,PosZ].DownWalls:=Map[PosX+1,PosZ].DownWalls+[nx];
- end else if px in Map[PosX,PosZ].DownWalls
- then begin
- Map[PosX,PosZ].DownWalls:=Map[PosX,PosZ].DownWalls-[px];
- Map[PosX+1,PosZ].DownWalls:=Map[PosX+1,PosZ].DownWalls-[nx];
- Map[PosX,PosZ].UpWalls:=Map[PosX,PosZ].UpWalls+[px];
- Map[PosX+1,PosZ].UpWalls:=Map[PosX+1,PosZ].UpWalls+[nx];
- end else begin
- Map[PosX,PosZ].Walls:=Map[PosX,PosZ].Walls+[px];
- Map[PosX+1,PosZ].Walls:=Map[PosX+1,PosZ].Walls+[nx];
- end;
- end;
- if LastZ<>PosZ-1 then begin
- if nz in Map[PosX,PosZ].Walls
- then begin
- Map[PosX,PosZ].Walls:=Map[PosX,PosZ].Walls-[nz];
- Map[PosX,PosZ-1].Walls:=Map[PosX,PosZ-1].Walls-[pz];
- end else if nz in Map[PosX,PosZ].UpWalls
- then begin
- Map[PosX,PosZ].UpWalls:=Map[PosX,PosZ].UpWalls-[nz];
- Map[PosX,PosZ-1].UpWalls:=Map[PosX,PosZ-1].UpWalls-[pz];
- Map[PosX,PosZ].DownWalls:=Map[PosX,PosZ].DownWalls+[nz];
- Map[PosX,PosZ-1].DownWalls:=Map[PosX,PosZ-1].DownWalls+[pz];
- end else if nz in Map[PosX,PosZ].DownWalls
- then begin
- Map[PosX,PosZ].DownWalls:=Map[PosX,PosZ].DownWalls-[nz];
- Map[PosX,PosZ-1].DownWalls:=Map[PosX,PosZ-1].DownWalls-[pz];
- Map[PosX,PosZ].UpWalls:=Map[PosX,PosZ].UpWalls+[nz];
- Map[PosX,PosZ-1].UpWalls:=Map[PosX,PosZ-1].UpWalls+[pz];
- end else begin
- Map[PosX,PosZ].Walls:=Map[PosX,PosZ].Walls+[nz];
- Map[PosX,PosZ-1].Walls:=Map[PosX,PosZ-1].Walls+[pz];
- end;
- end;
- if LastZ<>PosZ+1 then begin
- if pz in Map[PosX,PosZ].Walls
- then begin
- Map[PosX,PosZ].Walls:=Map[PosX,PosZ].Walls-[pz];
- Map[PosX,PosZ+1].Walls:=Map[PosX,PosZ+1].Walls-[nz];
- end else if pz in Map[PosX,PosZ].UpWalls
- then begin
- Map[PosX,PosZ].UpWalls:=Map[PosX,PosZ].UpWalls-[pz];
- Map[PosX,PosZ+1].UpWalls:=Map[PosX,PosZ-1].UpWalls-[nz];
- Map[PosX,PosZ].DownWalls:=Map[PosX,PosZ].DownWalls+[pz];
- Map[PosX,PosZ+1].DownWalls:=Map[PosX,PosZ+1].DownWalls+[nz];
- end else if pz in Map[PosX,PosZ].DownWalls
- then begin
- Map[PosX,PosZ].DownWalls:=Map[PosX,PosZ].DownWalls-[pz];
- Map[PosX,PosZ+1].DownWalls:=Map[PosX,PosZ+1].DownWalls-[nz];
- Map[PosX,PosZ].UpWalls:=Map[PosX,PosZ].UpWalls+[pz];
- Map[PosX,PosZ+1].UpWalls:=Map[PosX,PosZ+1].UpWalls+[nz];
- end else begin
- Map[PosX,PosZ].Walls:=Map[PosX,PosZ].Walls+[pz];
- Map[PosX,PosZ+1].Walls:=Map[PosX,PosZ+1].Walls+[nz];
- end;
- end;
- Pos.X:=PosX;
- Pos.Y:=PosZ;
- Form3.SendRaum(Pos);
-
- Pos.X:=PosX+1;
- Form3.SendRaum(Pos);
- Pos.X:=PosX-1;
- Form3.SendRaum(Pos);
-
- Pos.X:=PosX;
- Pos.Y:=PosZ+1;
- Form3.SendRaum(Pos);
- Pos.Y:=PosZ-1;
- Form3.SendRaum(Pos);
- end;
- procedure NormalSpeedLoss(LastX,LastZ:Integer);
- begin
- if not Won then begin
- if (not GetRT(PosX,PosZ).PushPlayer[Up])
- and (not GetRT(PosX,PosZ).PushPlayer[Down])
- and (not GetRT(LastX,LastZ).PushPlayer[Up])
- and (not GetRT(LastX,LastZ).PushPlayer[Down]) then
- Form1.ChangeSpeedBy(-0.08);
- if ((Camera.Position.X<-8.5) and
- (((nx in Map[PosX,PosZ].UpWalls) and players[MyId].CeilWalk)
- or ((nx in Map[PosX,PosZ].DownWalls) and not players[MyId].CeilWalk)))
- then Form1.ChangeSpeedBy(-1);
- if ((Camera.Position.X>8.5) and
- (((px in Map[PosX,PosZ].UpWalls) and players[MyId].CeilWalk)
- or ((px in Map[PosX,PosZ].DownWalls) and not players[MyId].CeilWalk)))
- then Form1.ChangeSpeedBy(-1);
- if ((Camera.Position.Z<-8.5) and
- (((nz in Map[PosX,PosZ].UpWalls) and players[MyId].CeilWalk)
- or ((nz in Map[PosX,PosZ].DownWalls) and not players[MyId].CeilWalk)))
- then Form1.ChangeSpeedBy(-1);
- if ((Camera.Position.Z>8.5) and
- (((pz in Map[PosX,PosZ].UpWalls) and players[MyId].CeilWalk)
- or ((pz in Map[PosX,PosZ].DownWalls) and not players[MyId].CeilWalk)))
- then Form1.ChangeSpeedBy(-1);
- end;
- end;
- procedure ChangePlayerSpeed(LastX,LastZ:Integer);
- label LNormalLoss;
- begin
- if sqrt(sqr(PosX)+sqr(PosZ))>Spawnradius then begin
-
- if GetRT(PosX,PosZ).SPInvisible
- and not Form3.ClientSocket.Active
- and not Form3.ServerSocket.Active then begin
- NormalSpeedLoss(LastX,LastZ);
- Exit;
- end;
- if GetRT(PosX,PosZ).ChangeSpeedRandom[THeight(Players[MyID].Ceilwalk)]
- then begin
- if not Won then begin
- Form1.ChangeSpeedBy(
- GetRT(PosX,PosZ).ChangeSpeedAtArrival*(Random-0.4)/0.6);
- end else begin
- Form1.ChangeSpeedBy(GetRT(PosX,PosZ).ChangeSpeedAtArrival*Random);
- end;
- Form1.Panel11.Visible:=true;
- Form1.Panel11.Caption:='Speed changed randomly to '
- +Floattostr(Round(100*Players[MyID].Speed)/100);
- Panel11Seconds:=3;
- end else if (GetRT(PosX,PosZ).ChangeSpeedAtArrival<0.0001)
- and (GetRT(PosX,PosZ).ChangeSpeedAtArrival>-0.0001) then begin
- NormalSpeedLoss(LastX,LastZ)
- end else if (GetRT(PosX,PosZ).ChangeSpeedAtArrival<0.0001)
- and not Won then begin
- Form1.ChangeSpeedBy(GetRT(PosX,PosZ).ChangeSpeedAtArrival);
- end else if (GetRT(PosX,PosZ).ChangeSpeedAtArrival>0.0001) then begin
- Form1.ChangeSpeedBy(GetRT(PosX,PosZ).ChangeSpeedAtArrival);
- end;
- end;
- end;
- procedure MoveToRoom(LastX,LastZ:Integer);
- var Pos:TPoint; C1:Integer; OrigHeight:THeight;
- label LSPInvisible,LOutOfMaze;
- begin
- OrigHeight:=THeight(Players[MyID].Ceilwalk);
-
- if PosX<-mapsize+RaumRange+1 then
- PosX:=mapsize-RaumRange-1;
- if PosX>mapsize-RaumRange-1 then
- PosX:=-mapsize+RaumRange+1;
- if PosZ<-mapsize+RaumRange+1 then
- PosZ:=mapsize-RaumRange-1;
- if PosZ>mapsize-RaumRange-1 then
- PosZ:=-mapsize+RaumRange+1;
- if Players[MyID].OutOfMaze then
- goto LOutOfMaze;
- ChangePlayerSpeed(LastX,LastZ);
- if GetRT(PosX,PosZ).SPInvisible
- and not Form3.ClientSocket.Active
- and not Form3.ServerSocket.Active then
- goto LSPInvisible;
- if GetRT(PosX,PosZ).PortPlayerToCenter and not Won then begin
- Camera.Up.X:=0;
- Camera.Up.Z:=0;
- Camera.Position.X:=0;
- Camera.Position.Z:=0;
- end;
-
- if GetRT(PosX,PosZ).TurnPlayer and not Won then begin
- Camera.Direction.X:=0;
- Camera.Direction.Y:=0;
- Camera.Direction.Z:=0;
- if not players[MyId].CeilWalk
- then Camera.Up.Y:=1
- else Camera.Up.Y:=-1;
- Camera.Turn(Random(360));
- end;
-
- if GetRT(PosX,PosZ).WinAtArrival then
- if not Won then begin
- Form1.WinGame(MyID);
- Form3.SendWin(MyID);
- end;
- if not Players[MyID].jumping then begin
- Players[MyID].jumptime:=
- (100*sqrt(sqr(Form4.JumpStrength(Players[MyID].Speed))-
- (981*(-2+PlayerDepth[false]))/50)+100
- *Form4.JumpStrength(Players[MyID].Speed))/981
- end;
- if GetRT(PosX,PosZ).YSNP[THeight(Players[MyID].Ceilwalk)] and (not Won)
- then begin
- Form1.Panel8.Font.Color:=RGB(150,25,25);
- Form1.Panel8.Color:=RGB(38,38,38);
- Form1.Panel8.Visible:=true;
- Form1.Panel8.Caption:='You Shall not Pass!';
- Form1.LoseGame;
- end;
- if GetRT(PosX,PosZ).OPTanzGegner and (not Won)
- then begin
- Form1.Panel8.Font.Color:=RGB(202,0,215);
- Form1.Panel8.Color:=RGB(127,127,127);
- Form1.Panel8.Visible:=true;
- Form1.Panel8.Caption:='Overpowered: Muh!';
- Form1.LoseGame;
- end;
-
- if (Map[PosX,PosZ].Inhalt.Sorte=Integer(RainbowTrap)) and (not Won)
- then begin //todo 2:ini
- Form1.RichEdit1.Color:=RGB(38,38,38);
- Form1.RichEdit1.Visible:=true;
- Form1.RichEdit1.Lines.Clear;
- Form1.RichEdit1.Lines.Add('');
- Form1.RichEdit1.Lines.Add('A Hidden Rainbow!');
- Form1.RichEdit1.SelStart:=2;
- Form1.RichEdit1.SelLength:=1;
- Form1.RichEdit1.SelAttributes.Color := RGB(122,0,255);
- Form1.RichEdit1.SelStart:=4;
- Form1.RichEdit1.SelLength:=2;
- Form1.RichEdit1.SelAttributes.Color := RGB(0,0,255);
- Form1.RichEdit1.SelStart:=6;
- Form1.RichEdit1.SelLength:=2;
- Form1.RichEdit1.SelAttributes.Color := RGB(0,184,0);
- Form1.RichEdit1.SelStart:=8;
- Form1.RichEdit1.SelLength:=2;
- Form1.RichEdit1.SelAttributes.Color := RGB(244,244,0);
- Form1.RichEdit1.SelStart:=11;
- Form1.RichEdit1.SelLength:=1;
- Form1.RichEdit1.SelAttributes.Color := RGB(244,177,0);
- Form1.RichEdit1.SelStart:=12;
- Form1.RichEdit1.SelLength:=2;
- Form1.RichEdit1.SelAttributes.Color := RGB(246,74,0);
- Form1.RichEdit1.SelStart:=14;
- Form1.RichEdit1.SelLength:=1;
- Form1.RichEdit1.SelAttributes.Color := RGB(255,0,0);
- Form1.RichEdit1.SelStart:=16;
- Form1.RichEdit1.SelLength:=2;
- Form1.RichEdit1.SelAttributes.Color := RGB(135,1,0);
- Form1.RichEdit1.SelStart:=18;
- Form1.RichEdit1.SelLength:=1;
- Form1.RichEdit1.SelAttributes.Color := RGB(0,0,0);
-
- RE1Seconds:=3;
- end;
- if GetRT(PosX,PosZ).ChangeWallsAtArrival and (not Won) then
- WarpWalls(LastX,LastZ);
- if GetRT(PosX,PosZ).WallCageTrap and (not Won) then begin
- Map[PosX,PosZ].Walls:=[pz,px,nx,nz];
- Map[PosX,PosZ].UpWalls:=[];
- Map[PosX,PosZ].DownWalls:=[];
- Map[PosX+1,PosZ].Walls:=Map[PosX+1,PosZ].Walls+[nx];
- Map[PosX-1,PosZ].Walls:=Map[PosX+1,PosZ].Walls+[px];
- Map[PosX,PosZ+1].Walls:=Map[PosX+1,PosZ].Walls+[nz];
- Map[PosX,PosZ-1].Walls:=Map[PosX+1,PosZ].Walls+[pz];
- Map[PosX+1,PosZ].UpWalls:=Map[PosX+1,PosZ].UpWalls-[nx];
- Map[PosX-1,PosZ].UpWalls:=Map[PosX+1,PosZ].UpWalls-[px];
- Map[PosX,PosZ+1].UpWalls:=Map[PosX+1,PosZ].UpWalls-[nz];
- Map[PosX,PosZ-1].UpWalls:=Map[PosX+1,PosZ].UpWalls-[pz];
- Map[PosX+1,PosZ].DownWalls:=Map[PosX+1,PosZ].DownWalls-[nx];
- Map[PosX-1,PosZ].DownWalls:=Map[PosX+1,PosZ].DownWalls-[px];
- Map[PosX,PosZ+1].DownWalls:=Map[PosX+1,PosZ].DownWalls-[nz];
- Map[PosX,PosZ-1].DownWalls:=Map[PosX+1,PosZ].DownWalls-[pz];
- Pos.X:=PosX;
- Pos.Y:=PosZ;
- Form3.SendRaum(Pos);
- Pos.X:=PosX+1;
- Form3.SendRaum(Pos);
- Pos.X:=PosX-1;
- Form3.SendRaum(Pos);
- Pos.X:=PosX;
- Pos.Y:=PosZ+1;
- Form3.SendRaum(Pos);
- Pos.Y:=PosZ-1;
- Form3.SendRaum(Pos);
- end;
- if GetRT(PosX,PosZ).Contaminate and (not Won)
- then begin
- Form1.ChangeSpeedBy(-RandomRange(-50,292)/100);
- Form1.Panel11.Font.Color:=RGB(0,0,0);
- Form1.Panel11.Color:=RGB(249,245,0);
- Form1.Panel11.Visible:=true;
- Form1.Panel11.Caption:='Contamination! Speed decreased to '
- +Floattostr(Round(100*Players[MyID].Speed)/100);
- Panel11Seconds:=3;
- if Form3.ClientSocket.Active then
- Form3.SendContaminate(PosX,PosZ) else
- Form1.SpreadContamination(PosX,PosZ);
- end;
-
- if GetRT(PosX,PosZ).InkOthers[THeight(Players[MyID].Ceilwalk)]
- then Form3.SendInkTrigger(MyID);
- if GetRT(PosX,PosZ).PortTo[Up] and (not Won)
- and not players[MyId].CeilWalk
- then begin
- players[MyId].CeilWalk:=true;
- Form3.SendCeilWalk;
- Camera.Up.SetVector(0,-1,0);
- end else
- if GetRT(PosX,PosZ).PortTo[Down] and (not Won)
- and players[MyId].CeilWalk
- then begin
- players[MyId].CeilWalk:=false;
- Form3.SendCeilWalk;
- Camera.Up.SetVector(0,1,0);
- end;
- if GetRT(PosX,PosZ).Explode[THeight(Players[MyID].Ceilwalk)]
- then begin
- Form3.SendExplode(PosX,PosZ);
- Form1.Explode(PosX,PosZ);
- end else if GetRT(PosX,PosZ).ChangeOtherPlayerSpeed then begin
- if Form3.ClientSocket.Active then begin
- Form3.ClientSocket.Socket.SendText(
- 'Lightning;'
- +IntToStr(MyID)+';')
- end else if Form3.ServerSocket.Active then begin
- Form3.SendSpeedChange(MyID);
- end;
- end;
- if GetRT(PosX,PosZ).ExplodeOtherPlayer[THeight(Players[MyID].Ceilwalk)]
- then begin
- for C1:=0 to High(Players) do
- if (Cardinal(C1)<>MyID)
- and not Players[C1].Dead then begin
- Form3.SendExplode(Round(Players[C1].X/20),Round(Players[C1].Z/20));
- Form1.Explode(Round(Players[C1].X/20),Round(Players[C1].Z/20));
- end;
- if not Won then begin
- Form1.Panel13.Font.Color:=RGB(255,255,255);
- Form1.Panel13.Color:=RGB(0,0,0);
- Form1.Panel13.Visible:=true;
- Form1.Panel13.Caption:='BOOM';
- Panel13Seconds:=2;
- end;
- end;
- LSPInvisible:
- Form1.GLHUDText1.Text:='Speed: '
- +Floattostr(Round(100*Players[MyID].Speed)/100)+' m/s';
- if Players[MyID].Speed<0.0001 then
- Form1.GLHUDText1.Text:='Speed: 0 m/s';
- if GetPC(PosX,PosZ).Text<>'' then
- Form1.ShowPanel(Map[PosX,PosZ].Inhalt.Sorte);
- if GetRT(PosX,PosZ).ChangeAtArrivalTo[OrigHeight]>=0 then begin
- Map[PosX,PosZ].Inhalt.Sorte:=GetRT(PosX,PosZ).ChangeAtArrivalTo[OrigHeight];
- if GetRT(PosX,PosZ).TurnRandom[Up]
- or GetRT(PosX,PosZ).TurnRandom[Down] then begin
- if Assigned(Map[PosX,PosZ].Inhalt.Daten) then
- Map[PosX,PosZ].Inhalt.Daten:=@Richtungen[
- TRichtung(Random(Integer(High(TRichtung))+1))];
- Pos.X:=PosX;
- Pos.Y:=PosZ;
- Form3.SendRaum(Pos);
- end else
- Form3.SendRaumSorte(PosX,PosZ);
- end;
- LOutOfMaze:
- if Players[MyID].Ceilwalk then
- Form1.GLNavigator1.VirtualUp.SetPoint(0,-1,0)
- else
- Form1.GLNavigator1.VirtualUp.SetPoint(0,1,0);
- if Random<0.2 then
- Form1.Memo1.Visible:=false;
- Form1.Reload;
- end;
- end.
|