Subversion Repositories spacemission

Rev

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