Subversion Repositories spacemission

Rev

Rev 8 | Rev 15 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit LevMain;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, MMSystem,
  7.   Dialogs, StdCtrls, ExtCtrls, Menus, DIB, DXClass, DXSprite, DXDraws,
  8.   DXSounds, Spin, ComCtrls{$IF CompilerVersion >= 23.0}, System.UITypes,
  9.   WinAPI.DirectDraw{$ELSE}, DirectX{$IFEND};
  10.  
  11. type
  12.   TMainForm = class(TDXForm)
  13.     MainMenu: TMainMenu;
  14.     Spiel: TMenuItem;
  15.     Beenden: TMenuItem;
  16.     Hilfe: TMenuItem;
  17.     Leer1: TMenuItem;
  18.     Level: TMenuItem;
  19.     Informationen: TMenuItem;
  20.     Enemy1: TRadioButton;
  21.     Enemy2: TRadioButton;
  22.     Enemy3: TRadioButton;
  23.     Enemy4: TRadioButton;
  24.     Enemy5: TRadioButton;
  25.     Enemy6: TRadioButton;
  26.     Enemy7: TRadioButton;
  27.     ScrollBar: TScrollBar;
  28.     Bevel1: TBevel;
  29.     Bevel2: TBevel;
  30.     SelLabel: TLabel;
  31.     SelPanel: TPanel;
  32.     Bevel3: TBevel;
  33.     SLabel1a: TLabel;
  34.     SLabel2a: TLabel;
  35.     SLabel1b: TLabel;
  36.     SLabel2b: TLabel;
  37.     SLabel0: TLabel;
  38.     Neu: TMenuItem;
  39.     Image1: TImage;
  40.     SLabel3a: TLabel;
  41.     SLabel3b: TLabel;
  42.     SLabel4a: TLabel;
  43.     SLabel4b: TLabel;
  44.     LivesLabel: TLabel;
  45.     Quelltext1: TMenuItem;
  46.     StatusBar: TStatusBar;
  47.     N1: TMenuItem;
  48.     Spielfelderweitern1: TMenuItem;
  49.     LivesEdt: TEdit;
  50.     Lives: TUpDown;
  51.     procedure DXDrawFinalize(Sender: TObject);
  52.     procedure DXDrawInitialize(Sender: TObject);
  53.     procedure FormCreate(Sender: TObject);
  54.     procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
  55.     procedure BeendenClick(Sender: TObject);
  56.     procedure FormDestroy(Sender: TObject);
  57.     procedure LevelClick(Sender: TObject);
  58.     procedure FormShow(Sender: TObject);
  59.     procedure InformationenClick(Sender: TObject);
  60.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  61.     procedure DXDrawMouseDown(Sender: TObject; Button: TMouseButton;
  62.       Shift: TShiftState; X, Y: Integer);
  63.     procedure EnemyClick(Sender: TObject);
  64.     procedure EnemyAdd(x, y, art, lives: integer);
  65.     procedure NeuClick(Sender: TObject);
  66.     procedure DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
  67.       Y: Integer);
  68.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  69.     procedure Quelltext1Click(Sender: TObject);
  70.     procedure Spielfelderweitern1Click(Sender: TObject);
  71.     procedure ScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode;
  72.       var ScrollPos: Integer);
  73.     procedure LivesClick(Sender: TObject; Button: TUDBtnType);
  74.     procedure LivesEdtKeyPress(Sender: TObject; var Key: Char);
  75.     procedure LivesEdtChange(Sender: TObject);
  76.   public
  77.     { VCL-Ersatz }
  78.     spriteengine: tdxspriteengine;
  79.     dxtimer: tdxtimer;
  80.     imagelist: tdximagelist;
  81.     dxdraw: tdxdraw;
  82.     { Variablen }
  83.     FMenuItem: integer;
  84.     Enemys: TStrings;
  85.     ArtChecked: integer;
  86.     LiveEdit: integer;
  87.     ScrollP: integer;
  88.     AltScrollPos: integer;
  89.     Boss: boolean;
  90.     LevChanged: boolean;
  91.     NumEnemys: integer;
  92.     { Level-Routinen }
  93.     procedure EnemyCreate(x, y: integer);
  94.     procedure DestroyLevel;
  95.     procedure AnzeigeAct;
  96.     { Initialisiations-Routinen }
  97.     procedure DXInit;
  98.     procedure ProgramInit;
  99.     { Farb-Routinen }
  100.     function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
  101.     procedure PalleteAnim(Col: TRGBQuad; Time: Integer);
  102.     { Sonstiges }
  103.     procedure LivesChange(newval: integer);
  104.   end;
  105.  
  106. var
  107.   MainForm: TMainForm;
  108.  
  109. implementation
  110.  
  111. uses
  112.   Global, LevSplash, LevSpeicherung, ComInfo, LevSource, LevOptions,
  113.   ComLevelReader;
  114.  
  115. const
  116.   FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
  117.   status_info = ' Zeigen Sie mit dem Mauszeiger auf eine Einheit, um deren Eigenschaften anzuzeigen...';
  118.   status_lives = ' Leben: ';
  119.   status_nolives = ' Einheit hat keine Lebensangabe';
  120.   RasterW = 48;
  121.   RasterH = 32;
  122.  
  123. {$R *.DFM}
  124.  
  125. type
  126.   TBackground = class(TBackgroundSprite)
  127.   protected
  128.     procedure DoMove(MoveCount: Integer); override;
  129.   end;
  130.  
  131.   TEnemy = class(TImageSprite)
  132.   private
  133.     Lives: integer;
  134.     Art: integer;
  135.     XCor: integer;
  136.     CorInit: boolean;
  137.   protected
  138.     procedure DoMove(MoveCount: Integer); override;
  139.   public
  140.     constructor Create(AParent: TSprite); override;
  141.   end;
  142.  
  143. procedure TMainForm.DXInit;
  144. begin
  145.   Imagelist.Items.LoadFromFile(FDirectory+'DirectX\Graphic.dxg');
  146.   ImageList.Items.MakeColorTable;
  147.   DXDraw.ColorTable := ImageList.Items.ColorTable;
  148.   DXDraw.DefColorTable := ImageList.Items.ColorTable;
  149.   DXDraw.UpdatePalette;
  150.   DXDraw.Initialize;
  151. end;
  152.  
  153. procedure TEnemy.DoMove(MoveCount: Integer);
  154. begin
  155.   if not CorInit then
  156.   begin
  157.     XCor := trunc(x) + (MainForm.ScrollP * RasterW);
  158.     CorInit := true;
  159.   end;
  160.   if MainForm.Enemys.IndexOf(floattostr(XCor)+'-'+floattostr(y)+':'+
  161.     inttostr(Art)+'('+inttostr(Lives)+')') = -1 then dead;
  162.   X := XCor - (MainForm.ScrollP * RasterW);
  163. end;
  164.  
  165. procedure TBackground.DoMove(MoveCount: Integer);
  166. begin
  167.   X := -(MainForm.ScrollP * RasterW);
  168. end;
  169.  
  170. constructor TEnemy.Create(AParent: TSprite);
  171. begin
  172.   inherited Create(AParent);
  173.   if MainForm.ArtChecked = 1 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
  174.   if MainForm.ArtChecked = 2 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
  175.   if MainForm.ArtChecked = 3 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
  176.   if MainForm.ArtChecked = 4 then Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
  177.   if MainForm.ArtChecked = 5 then Image := MainForm.ImageList.Items.Find('Enemy-Disk');
  178.   if MainForm.ArtChecked = 6 then Image := MainForm.ImageList.Items.Find('Enemy-Disk2');
  179.   if MainForm.ArtChecked = 7 then Image := MainForm.ImageList.Items.Find('Enemy-Boss');
  180.   if MainForm.ArtChecked = 4 then Lives := 0 else Lives := MainForm.LiveEdit;
  181.   Art := MainForm.ArtChecked;
  182.   Width := Image.Width;
  183.   Height := Image.Height;
  184.   PixelCheck := True;
  185. end;
  186.  
  187. procedure TMainForm.FormCreate(Sender: TObject);
  188. var
  189.   LevelData: TLevelData;
  190. begin
  191.   { VCL-Ersatz start }
  192.   dxtimer := tdxtimer.create(self);
  193.   dxtimer.Interval := 100;
  194.   dxtimer.ActiveOnly := false;
  195.   dxtimer.Enabled := false;
  196.   dxtimer.OnTimer := DxTimerTimer;
  197.  
  198.   dxdraw := tdxdraw.Create(self);
  199.   dxdraw.Parent := self;
  200.   dxdraw.Left := 0;
  201.   dxdraw.Top := 0;
  202.   dxdraw.Width := 640;
  203.   dxdraw.Height := 480;
  204.   dxdraw.AutoInitialize := False;
  205.   dxdraw.AutoSize := False;
  206.   dxdraw.Color := clBlack;
  207.   dxdraw.Display.BitCount := 24;
  208.   dxdraw.Display.FixedBitCount := False;
  209.   dxdraw.Display.FixedRatio := False;
  210.   dxdraw.Display.FixedSize := False;
  211.   dxdraw.Display.Height := 600;
  212.   dxdraw.Display.Width := 800;
  213.   dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, {doRetainedMode,} doHardware, doSelectDriver];
  214.   dxdraw.OnFinalize := DXDrawFinalize;
  215.   dxdraw.OnInitialize := DXDrawInitialize;
  216.   dxdraw.ParentShowHint := False;
  217.   dxdraw.ShowHint := False;
  218.   dxdraw.TabOrder := 0;
  219.   dxdraw.OnMouseDown := DXDrawMouseDown;
  220.   dxdraw.OnMouseMove := DXDrawMouseMove;
  221.  
  222.   spriteengine := tdxspriteengine.create(self);
  223.   spriteengine.DXDraw := dxdraw;
  224.  
  225.   imagelist := tdximagelist.create(self);
  226.   imagelist.DXDraw := dxdraw;
  227.  
  228.   { VCL-Ersatz ende }
  229.  
  230.   ArtChecked := 1;
  231.   LiveEdit := 1;
  232.   // Leeres Level am Anfang braucht keine Beenden-Bestätigung.
  233.   // LevChanged := true;
  234.  
  235.   //Application.Title := 'SpaceMission '+ProgramVersion+' - Leveleditor';
  236.   Caption := 'SpaceMission '+ProgramVersion+' - Leveleditor';
  237.   DXInit;
  238.   if (paramcount > 0) and (fileexists(paramstr(1))) then
  239.   begin
  240.     LevelData := TLevelData.Create;
  241.     try
  242.       try
  243.         LevelData.Load(paramstr(1));
  244.       except
  245.         showmessage(FileError);
  246.         ProgramInit;
  247.         exit;
  248.       end;
  249.     finally
  250.       FreeAndNil(LevelData);
  251.     end;
  252.     { Laden }
  253.     exit;
  254.   end;
  255.   if fileexists(fdirectory+'Bilder\Auswahl.bmp') then
  256.     Image1.Picture.LoadFromFile(fdirectory+'Bilder\Auswahl.bmp');
  257.   {else
  258.     SelPanel.visible := false;}
  259.   ProgramInit;
  260. end;
  261.  
  262. procedure TMainForm.FormDestroy(Sender: TObject);
  263. begin
  264.   Enemys.Free;
  265.   //spriteengine.Free;
  266.   dxtimer.Free;
  267.   imagelist.Free;
  268.   dxdraw.free;
  269. end;
  270.  
  271. procedure TMainForm.BeendenClick(Sender: TObject);
  272. begin
  273.   close;
  274. end;
  275.  
  276. procedure TMainForm.DXDrawInitialize(Sender: TObject);
  277. begin
  278.   DXTimer.Enabled := True;
  279. end;
  280.  
  281. procedure TMainForm.DXDrawFinalize(Sender: TObject);
  282. begin
  283.   DXTimer.Enabled := False;
  284. end;
  285.  
  286. procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
  287. begin
  288.   if not DXDraw.CanDraw then exit;
  289.   LagCount := 1000 div 60;
  290.   SpriteEngine.Move(LagCount);
  291.   SpriteEngine.Dead;
  292.   DxDraw.Surface.Fill(0);
  293.   SpriteEngine.Draw;
  294.   DXDraw.Flip;
  295. end;
  296.  
  297. function TMainForm.ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
  298. begin
  299.   with Result do
  300.   begin
  301.     rgbRed := Src.rgbRed+((Dest.rgbRed-Src.rgbRed)*Percent div 256);
  302.     rgbGreen := Src.rgbGreen+((Dest.rgbGreen-Src.rgbGreen)*Percent div 256);
  303.     rgbBlue := Src.rgbBlue+((Dest.rgbBlue-Src.rgbBlue)*Percent div 256);
  304.     rgbReserved := 0;
  305.   end;
  306. end;
  307.  
  308. procedure TMainForm.PalleteAnim(Col: TRGBQuad; Time: Integer);
  309. var
  310.   i: Integer;
  311.   t, t2: DWORD;
  312.   ChangePalette: Boolean;
  313.   c: Integer;
  314. begin
  315.   if DXDraw.Initialized then
  316.   begin
  317.     c := DXDraw.Surface.ColorMatch(RGB(Col.rgbRed, Col.rgbGreen, Col.rgbBlue));
  318.     ChangePalette := False;
  319.     if DXDraw.CanPaletteAnimation then
  320.     begin
  321.       t := GetTickCount;
  322.       while Abs(GetTickCount-t)<Time do
  323.       begin
  324.         t2 := Trunc(Abs(GetTickCount-t)/Time*255);
  325.         for i := 0 to 255 do
  326.           DXDraw.ColorTable[i] := ComposeColor(Col, DXDraw.DefColorTable[i], t2);
  327.         DXDraw.UpdatePalette;
  328.         ChangePalette := True;
  329.       end;
  330.     end else
  331.       Sleep(Time);
  332.     for i := 0 to 4 do
  333.     begin
  334.       DXDraw.Surface.Fill(c);
  335.       DXDraw.Flip;
  336.     end;
  337.     if ChangePalette then
  338.     begin
  339.       DXDraw.ColorTable := DXDraw.DefColorTable;
  340.       DXDraw.UpdatePalette;
  341.     end;
  342.     DXDraw.Surface.Fill(c);
  343.     DXDraw.Flip;
  344.   end;
  345. end;
  346.  
  347. procedure TMainForm.ProgramInit;
  348. {var
  349.   i, j: Integer;}
  350. begin
  351.   Enemys := TStringList.create;
  352.   sleep(500);
  353.   //PlayerSprite
  354.   with TBackground.Create(SpriteEngine.Engine) do
  355.   begin
  356.     SetMapSize(1, 1);
  357.     Image := mainform.ImageList.Items.Find('Star3');
  358.     Z := -13;
  359.     Y := 40;
  360.     Tile := True;
  361.   end;
  362.   with TBackground.Create(SpriteEngine.Engine) do
  363.   begin
  364.     SetMapSize(1, 1);
  365.     Image := mainform.ImageList.Items.Find('Star2');
  366.     Z := -12;
  367.     Y := 30;
  368.     Tile := True;
  369.   end;
  370.   with TBackground.Create(SpriteEngine.Engine) do
  371.   begin
  372.     SetMapSize(1, 1);
  373.     Image := mainform.ImageList.Items.Find('Star1');
  374.     Z := -11;
  375.     Y := 10;
  376.     Tile := True;
  377.   end;
  378.   with TBackground.Create(SpriteEngine.Engine) do
  379.   begin
  380.     SetMapSize(1, 1);
  381.     Image := mainform.ImageList.Items.Find('Matrix');
  382.     Z := -10;
  383.     Tile := True;
  384.   end;
  385.   {with TBackground.Create(SpriteEngine.Engine) do
  386.   begin
  387.     SetMapSize(200, 10);
  388.     Y := 10;
  389.     Z := -13;
  390.     FSpeed := 1 / 2;
  391.     Tile := True;
  392.     for i := 0 to MapHeight-1 do
  393.     begin
  394.       for j := 0 to MapWidth-1 do
  395.       begin
  396.         Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 8);
  397.         if Random(100)<95 then Chips[j, i] := -1;
  398.       end;
  399.     end;
  400.   end;
  401.   with TBackground.Create(SpriteEngine.Engine) do
  402.   begin
  403.     SetMapSize(200, 10);
  404.     Y := 30;
  405.     Z := -12;
  406.     FSpeed := 1;
  407.     Tile := True;
  408.     for i := 0 to MapHeight-1 do
  409.     begin
  410.       for j := 0 to MapWidth-1 do
  411.       begin
  412.         Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 4);
  413.         if Random(100)<95 then Chips[j, i] := -1;
  414.       end;
  415.     end;
  416.   end;
  417.   with TBackground.Create(SpriteEngine.Engine) do
  418.   begin
  419.     SetMapSize(200, 10);
  420.     Y := 40;
  421.     Z := -11;
  422.     FSpeed := 2;
  423.     Tile := True;
  424.     for i := 0 to MapHeight-1 do
  425.     begin
  426.       for j := 0 to MapWidth-1 do
  427.       begin
  428.         Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 2);
  429.         if Random(100)<95 then Chips[j, i] := -1;
  430.       end;
  431.     end;
  432.   end;}
  433.   PalleteAnim(RGBQuad(0, 0, 0), 300);
  434.   mainform.Visible := true;
  435. end;
  436.  
  437. procedure TMainForm.LevelClick(Sender: TObject);
  438. begin
  439.   speicherungform.showmodal;
  440. end;
  441.  
  442. procedure TMainForm.FormShow(Sender: TObject);
  443. begin
  444.   SplashForm.Hide;
  445.   SplashForm.Free;
  446.  
  447.   dxtimer.Enabled := true;
  448.   dxtimer.ActiveOnly := true;
  449. end;
  450.  
  451. procedure TMainForm.InformationenClick(Sender: TObject);
  452. begin
  453.   mainform.dxtimer.enabled := false;
  454.   InfoForm.showmodal;
  455.   mainform.dxtimer.enabled := true;
  456. end;
  457.  
  458. procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
  459. begin
  460.   SpriteEngine.Engine.Clear;
  461.   DXTimer.Enabled := False;
  462. end;
  463.  
  464. procedure TMainForm.DXDrawMouseDown(Sender: TObject; Button: TMouseButton;
  465.   Shift: TShiftState; X, Y: Integer);
  466. var
  467.   i, j, k, l, ex, ey: integer;
  468.   ok, breaked: boolean;
  469. begin
  470.   ex := trunc(x/RasterW) * RasterW;
  471.   ey := trunc(y/RasterH) * RasterH;
  472.   EnemyCreate(ex, ey);
  473.   breaked := false;
  474.   { Setzen }
  475.   if Button = mbLeft then
  476.   begin
  477.     ok := true;
  478.     if (ArtChecked = 7) and boss then ok := false
  479.     else
  480.     begin
  481.       for i := 1 to 7 do
  482.       begin
  483.         for j := 0 to 999 do
  484.         begin
  485.           if boss then
  486.           begin
  487.             for k := 0 to 3 do
  488.             begin
  489.               for l := 0 to 1 do
  490.               begin
  491.                 if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':7('+inttostr(j)+')') <> -1 then
  492.                 begin
  493.                   ok := false;
  494.                   break;
  495.                 end;
  496.               end;
  497.               if not ok then break;
  498.             end;
  499.             if not ok then break;
  500.           end;
  501.           if Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
  502.             inttostr(i)+'('+inttostr(j)+')') <> -1 then
  503.           begin
  504.             ok := false;
  505.             break;
  506.           end;
  507.         end;
  508.         if not ok then break;
  509.       end;
  510.     end;
  511.     if ok then
  512.     begin
  513.       if ArtChecked <> 4 then
  514.         Enemys.Add(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
  515.           inttostr(ArtChecked)+'('+inttostr(LiveEdit)+')')
  516.       else
  517.         Enemys.Add(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
  518.           inttostr(ArtChecked)+'(0)');
  519.       inc(NumEnemys);
  520.       if ArtChecked = 7 then boss := true;
  521.     end
  522.     else beep;
  523.   end
  524.   { Löschen }
  525.   else if Button = mbRight then
  526.   begin
  527.     for i := 1 to 7 do
  528.     begin
  529.       for j := 0 to 999 do
  530.       begin
  531.         if boss and (i = 7) then
  532.         begin
  533.           for k := 0 to 3 do
  534.           begin
  535.             for l := 0 to 1 do
  536.             begin
  537.               if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')') <> -1 then
  538.               begin
  539.                 Enemys.Delete(Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')'));
  540.                 Boss := false;
  541.                 dec(NumEnemys);
  542.                 breaked := true;
  543.                 break;
  544.               end;
  545.             end;
  546.             if breaked then break;
  547.           end;
  548.         end;
  549.         if Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
  550.           inttostr(i)+'('+inttostr(j)+')') <> -1 then
  551.         begin
  552.           Enemys.Delete(Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+
  553.             ':'+inttostr(i)+'('+inttostr(j)+')'));
  554.           if i = 7 then Boss := false;
  555.           dec(NumEnemys);
  556.           breaked := true;
  557.           break;
  558.         end;
  559.       end;
  560.       if breaked then break;
  561.     end;
  562.   end;
  563.   LevChanged := true;
  564.   AnzeigeAct;
  565. end;
  566.  
  567. procedure TMainForm.EnemyClick(Sender: TObject);
  568. begin
  569.   if sender = Enemy1 then ArtChecked := 1;
  570.   if sender = Enemy2 then ArtChecked := 2;
  571.   if sender = Enemy3 then ArtChecked := 3;
  572.   if sender = Enemy4 then ArtChecked := 4;
  573.   if sender = Enemy5 then ArtChecked := 5;
  574.   if sender = Enemy6 then ArtChecked := 6;
  575.   if sender = Enemy7 then ArtChecked := 7;
  576.   Image1.Left := -(87 * (ArtChecked - 1)) + 1;
  577.   Lives.Enabled := sender <> Enemy4;
  578.   LivesLabel.Enabled := sender <> Enemy4;
  579.   if sender = Enemy4 then LivesEdt.Font.Color := clBtnShadow // andere farbe?
  580.     else LivesEdt.Font.Color := clWindowText;
  581. end;
  582.  
  583. procedure TMainForm.EnemyCreate(x, y: integer);
  584. var
  585.   Enemy: TSprite;
  586. begin
  587.   Enemy := TEnemy.Create(SpriteEngine.Engine);
  588.   Enemy.x := x;
  589.   Enemy.y := y;
  590. end;
  591.  
  592. procedure TMainForm.DestroyLevel;
  593. begin
  594.   ScrollBar.Position := 0; // this doesn't call ScrollBarScroll()
  595.   ScrollP := 0;
  596.   Enemys.Clear;
  597.   NumEnemys := 0;
  598.   Boss := false;
  599.   LevChanged := true;
  600.   Lives.Position := 1;
  601.   LivesChange(Lives.Position);
  602.   Enemy1.Checked := true;
  603.   EnemyClick(Enemy1);
  604.   AnzeigeAct;
  605. end;
  606.  
  607. procedure TMainForm.AnzeigeAct;
  608. begin
  609.   SLabel1b.Caption := inttostr(NumEnemys);
  610.   if Boss then SLabel2b.Caption := 'Ja' else SLabel2b.Caption := 'Nein';
  611.   SLabel3b.Caption := inttostr(ScrollBar.Max);
  612.   if LevChanged then
  613.   begin
  614.     SLabel4a.Font.Color := $00000096;
  615.     SLabel4b.Font.Color := $00000096;
  616.     SLabel4b.Caption := 'Nein';
  617.   end
  618.   else
  619.   begin
  620.     SLabel4a.Font.Color := $00009600;
  621.     SLabel4b.Font.Color := $00009600;
  622.     SLabel4b.Caption := 'Ja';
  623.   end;
  624. end;
  625.  
  626. procedure TMainForm.EnemyAdd(x, y, art, lives: integer);
  627. begin
  628.   Enemys.Add(inttostr(x)+'-'+inttostr(y)+':'+inttostr(art)+'('+inttostr(lives)+')');
  629. end;
  630.  
  631. procedure TMainForm.NeuClick(Sender: TObject);
  632. begin
  633.   if MessageDlg('Level wirklich löschen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  634.     DestroyLevel;
  635. end;
  636.  
  637. procedure TMainForm.DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
  638.   Y: Integer);
  639. var
  640.   ex, ey, i, j, k, l, wert: integer;
  641.   breaked: boolean;
  642. begin
  643.   if sender <> DxDraw then
  644.   begin
  645.     StatusBar.SimpleText := status_info;
  646.     exit;
  647.   end;
  648.   ex := trunc(x/RasterW) * RasterW;
  649.   ey := trunc(y/RasterH) * RasterH;
  650.   wert := -1;
  651.   breaked := false;
  652.   for i := 1 to 7 do
  653.   begin
  654.     for j := 0 to 999 do
  655.     begin
  656.       if boss and (i = 7) then
  657.       begin
  658.         for k := 0 to 3 do
  659.         begin
  660.           for l := 0 to 1 do
  661.           begin
  662.             if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')') <> -1 then
  663.             begin
  664.               wert := j;
  665.               breaked := true;
  666.               break;
  667.             end;
  668.           end;
  669.           if breaked then break;
  670.         end;
  671.       end;
  672.       if (breaked = false) and (Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
  673.         inttostr(i)+'('+inttostr(j)+')') <> -1) then
  674.       begin
  675.         wert := j;
  676.         breaked := true;
  677.         break;
  678.       end;
  679.     end;
  680.     if breaked then break;
  681.   end;
  682.   if wert <> -1 then
  683.   begin
  684.     if wert > 0 then
  685.       StatusBar.SimpleText := status_lives + inttostr(wert)
  686.     else
  687.       StatusBar.SimpleText := status_nolives;
  688.   end
  689.   else
  690.     StatusBar.SimpleText := status_info;
  691. end;
  692.  
  693. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  694. begin
  695.   if LevChanged then
  696.     CanClose := MessageDlg('Beenden ohne abspeichern?', mtConfirmation, [mbYes, mbNo], 0) = mrYes;
  697. end;
  698.  
  699. procedure TMainForm.Quelltext1Click(Sender: TObject);
  700. begin
  701.   SourceForm.Aktualisieren;
  702.   SourceForm.showmodal;
  703. end;
  704.  
  705. procedure TMainForm.Spielfelderweitern1Click(Sender: TObject);
  706. begin
  707.   LevelForm.Aktualisieren;
  708.   LevelForm.showmodal;
  709. end;
  710.  
  711. procedure TMainForm.ScrollBarScroll(Sender: TObject;
  712.   ScrollCode: TScrollCode; var ScrollPos: Integer);
  713. begin
  714.   ScrollP := ScrollPos;
  715. end;
  716.  
  717. procedure TMainForm.LivesChange(newval: integer);
  718. begin
  719.   LiveEdit := newval;
  720.   livesedt.Text := inttostr(LiveEdit);
  721.   lives.Position := newval;
  722. end;
  723.  
  724. procedure TMainForm.LivesClick(Sender: TObject; Button: TUDBtnType);
  725. begin
  726.   LivesChange(lives.Position);
  727. end;
  728.  
  729. procedure TMainForm.LivesEdtKeyPress(Sender: TObject; var Key: Char);
  730. begin
  731.   if not (Key in [#13, #08, '0'..'9']) then
  732.     Key := #0;
  733. end;
  734.  
  735. procedure TMainForm.LivesEdtChange(Sender: TObject);
  736. begin
  737.   LivesChange(strtoint(livesedt.text));
  738. end;
  739.  
  740. end.
  741.  
  742.