Subversion Repositories spacemission

Rev

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

  1. unit LevMain;
  2.  
  3. // TODO 2024:
  4. // - Wenn man ein Level "X" lädt, und dann Verwalten wieder öffnet, sollte diese Level-Nummer vorgeschlagen werden, sodass man direkt Speichern klicken kann
  5.  
  6. interface
  7.  
  8. uses
  9.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, MMSystem,
  10.   Dialogs, StdCtrls, ExtCtrls, Menus, DIB, DXClass, DXSprite, DXDraws,
  11.   DXSounds, Spin, ComCtrls{$IF CompilerVersion >= 23.0}, System.UITypes,
  12.   WinAPI.DirectDraw{$ENDIF}, DirectX;
  13.  
  14. type
  15.   TMainForm = class(TDXForm)
  16.     MainMenu: TMainMenu;
  17.     Spiel: TMenuItem;
  18.     Beenden: TMenuItem;
  19.     Hilfe: TMenuItem;
  20.     Leer1: TMenuItem;
  21.     Level: TMenuItem;
  22.     Informationen: TMenuItem;
  23.     Enemy1: TRadioButton;
  24.     Enemy2: TRadioButton;
  25.     Enemy3: TRadioButton;
  26.     Enemy4: TRadioButton;
  27.     Enemy5: TRadioButton;
  28.     Enemy6: TRadioButton;
  29.     Enemy7: TRadioButton;
  30.     ScrollBar: TScrollBar;
  31.     Bevel1: TBevel;
  32.     Bevel2: TBevel;
  33.     SelLabel: TLabel;
  34.     SelPanel: TPanel;
  35.     Bevel3: TBevel;
  36.     SLabel1a: TLabel;
  37.     SLabel2a: TLabel;
  38.     SLabel1b: TLabel;
  39.     SLabel2b: TLabel;
  40.     SLabel0: TLabel;
  41.     Neu: TMenuItem;
  42.     Image1: TImage;
  43.     SLabel3a: TLabel;
  44.     SLabel3b: TLabel;
  45.     SLabel4a: TLabel;
  46.     SLabel4b: TLabel;
  47.     LivesLabel: TLabel;
  48.     Quelltext1: TMenuItem;
  49.     StatusBar: TStatusBar;
  50.     N1: TMenuItem;
  51.     Spielfelderweitern1: TMenuItem;
  52.     LivesEdt: TEdit;
  53.     Lives: TUpDown;
  54.     procedure DXDrawFinalize(Sender: TObject);
  55.     procedure DXDrawInitialize(Sender: TObject);
  56.     procedure FormCreate(Sender: TObject);
  57.     procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
  58.     procedure BeendenClick(Sender: TObject);
  59.     procedure FormDestroy(Sender: TObject);
  60.     procedure LevelClick(Sender: TObject);
  61.     procedure FormShow(Sender: TObject);
  62.     procedure InformationenClick(Sender: TObject);
  63.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  64.     procedure DXDrawMouseDown(Sender: TObject; Button: TMouseButton;
  65.       Shift: TShiftState; X, Y: Integer);
  66.     procedure EnemyClick(Sender: TObject);
  67.     procedure EnemyAdd(x, y, art, lives: integer);
  68.     procedure NeuClick(Sender: TObject);
  69.     procedure DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
  70.       Y: Integer);
  71.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  72.     procedure Quelltext1Click(Sender: TObject);
  73.     procedure Spielfelderweitern1Click(Sender: TObject);
  74.     procedure ScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode;
  75.       var ScrollPos: Integer);
  76.     procedure LivesClick(Sender: TObject; Button: TUDBtnType);
  77.     procedure LivesEdtKeyPress(Sender: TObject; var Key: Char);
  78.     procedure LivesEdtChange(Sender: TObject);
  79.   public
  80.     { VCL-Ersatz }
  81.     spriteengine: tdxspriteengine;
  82.     dxtimer: tdxtimer;
  83.     imagelist: tdximagelist;
  84.     dxdraw: tdxdraw;
  85.     { Variablen }
  86.     FMenuItem: integer;
  87.     Enemys: TStrings;
  88.     ArtChecked: integer;
  89.     LiveEdit: integer;
  90.     ScrollP: integer;
  91.     AltScrollPos: integer;
  92.     Boss: boolean;
  93.     LevChanged: boolean;
  94.     NumEnemys: integer;
  95.     { Level-Routinen }
  96.     procedure EnemyCreate(x, y: integer);
  97.     procedure DestroyLevel;
  98.     procedure AnzeigeAct;
  99.     { Initialisiations-Routinen }
  100.     procedure DXInit;
  101.     procedure ProgramInit;
  102.     { Farb-Routinen }
  103.     function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
  104.     procedure PalleteAnim(Col: TRGBQuad; Time: Integer);
  105.     { Sonstiges }
  106.     procedure LivesChange(newval: integer);
  107.   end;
  108.  
  109. var
  110.   MainForm: TMainForm;
  111.  
  112. implementation
  113.  
  114. uses
  115.   Global, LevSplash, LevSpeicherung, ComInfo, LevSource, LevOptions,
  116.   ComLevelReader;
  117.  
  118. const
  119.   FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
  120.   status_info = ' Zeigen Sie mit dem Mauszeiger auf eine Einheit, um deren Eigenschaften anzuzeigen...';
  121.   status_lives = ' Leben: ';
  122.   status_nolives = ' Einheit hat keine Lebensangabe';
  123.   RasterW = 48;
  124.   RasterH = 32;
  125.  
  126. {$R *.DFM}
  127.  
  128. type
  129.   TBackground = class(TBackgroundSprite)
  130.   protected
  131.     procedure DoMove(MoveCount: Integer); override;
  132.   end;
  133.  
  134.   TEnemy = class(TImageSprite)
  135.   private
  136.     Lives: integer;
  137.     Art: integer;
  138.     XCor: integer;
  139.     CorInit: boolean;
  140.   protected
  141.     procedure DoMove(MoveCount: Integer); override;
  142.   public
  143.     constructor Create(AParent: TSprite); override;
  144.   end;
  145.  
  146. procedure TMainForm.DXInit;
  147. begin
  148.   Imagelist.Items.LoadFromFile(FDirectory+'DirectX\Graphic.dxg');
  149.   ImageList.Items.MakeColorTable;
  150.   DXDraw.ColorTable := ImageList.Items.ColorTable;
  151.   DXDraw.DefColorTable := ImageList.Items.ColorTable;
  152.   DXDraw.UpdatePalette;
  153.   DXDraw.Initialize;
  154. end;
  155.  
  156. procedure TEnemy.DoMove(MoveCount: Integer);
  157. begin
  158.   if not CorInit then
  159.   begin
  160.     XCor := trunc(x) + (MainForm.ScrollP * RasterW);
  161.     CorInit := true;
  162.   end;
  163.   if MainForm.Enemys.IndexOf(floattostr(XCor)+'-'+floattostr(y)+':'+
  164.     inttostr(Art)+'('+inttostr(Lives)+')') = -1 then dead;
  165.   X := XCor - (MainForm.ScrollP * RasterW);
  166. end;
  167.  
  168. procedure TBackground.DoMove(MoveCount: Integer);
  169. begin
  170.   X := -(MainForm.ScrollP * RasterW);
  171. end;
  172.  
  173. constructor TEnemy.Create(AParent: TSprite);
  174. begin
  175.   inherited Create(AParent);
  176.   if MainForm.ArtChecked = 1 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
  177.   if MainForm.ArtChecked = 2 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
  178.   if MainForm.ArtChecked = 3 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
  179.   if MainForm.ArtChecked = 4 then Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
  180.   if MainForm.ArtChecked = 5 then Image := MainForm.ImageList.Items.Find('Enemy-Disk');
  181.   if MainForm.ArtChecked = 6 then Image := MainForm.ImageList.Items.Find('Enemy-Disk2');
  182.   if MainForm.ArtChecked = 7 then Image := MainForm.ImageList.Items.Find('Enemy-Boss');
  183.   if MainForm.ArtChecked = 4 then Lives := 0 else Lives := MainForm.LiveEdit;
  184.   Art := MainForm.ArtChecked;
  185.   Width := Image.Width;
  186.   Height := Image.Height;
  187.   PixelCheck := True;
  188. end;
  189.  
  190. procedure TMainForm.FormCreate(Sender: TObject);
  191. var
  192.   LevelData: TLevelData;
  193. begin
  194.   { VCL-Ersatz start }
  195.   dxtimer := tdxtimer.create(self);
  196.   dxtimer.Interval := 100;
  197.   dxtimer.ActiveOnly := false;
  198.   dxtimer.Enabled := false;
  199.   dxtimer.OnTimer := DxTimerTimer;
  200.  
  201.   dxdraw := tdxdraw.Create(self);
  202.   dxdraw.Parent := self;
  203.   dxdraw.Left := 0;
  204.   dxdraw.Top := 0;
  205.   dxdraw.Width := 640;
  206.   dxdraw.Height := 480;
  207.   dxdraw.AutoInitialize := False;
  208.   dxdraw.AutoSize := False;
  209.   dxdraw.Color := clBlack;
  210.   dxdraw.Display.BitCount := 24;
  211.   dxdraw.Display.FixedBitCount := False;
  212.   dxdraw.Display.FixedRatio := False;
  213.   dxdraw.Display.FixedSize := False;
  214.   dxdraw.Display.Height := 600;
  215.   dxdraw.Display.Width := 800;
  216.   dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, {doRetainedMode,} doHardware, doSelectDriver];
  217.   dxdraw.OnFinalize := DXDrawFinalize;
  218.   dxdraw.OnInitialize := DXDrawInitialize;
  219.   dxdraw.ParentShowHint := False;
  220.   dxdraw.ShowHint := False;
  221.   dxdraw.TabOrder := 0;
  222.   dxdraw.OnMouseDown := DXDrawMouseDown;
  223.   dxdraw.OnMouseMove := DXDrawMouseMove;
  224.  
  225.   spriteengine := tdxspriteengine.create(self);
  226.   spriteengine.DXDraw := dxdraw;
  227.  
  228.   imagelist := tdximagelist.create(self);
  229.   imagelist.DXDraw := dxdraw;
  230.  
  231.   { VCL-Ersatz ende }
  232.  
  233.   ArtChecked := 1;
  234.   LiveEdit := 1;
  235.   // Leeres Level am Anfang braucht keine Beenden-Bestätigung.
  236.   // LevChanged := true;
  237.  
  238.   //Application.Title := 'SpaceMission '+ProgramVersion+' - Leveleditor';
  239.   Caption := 'SpaceMission '+ProgramVersion+' - Leveleditor';
  240.   DXInit;
  241.   if (paramcount > 0) and (fileexists(paramstr(1))) then
  242.   begin
  243.     LevelData := TLevelData.Create;
  244.     try
  245.       try
  246.         LevelData.Load(paramstr(1));
  247.       except
  248.         showmessage(FileError);
  249.         ProgramInit;
  250.         exit;
  251.       end;
  252.     finally
  253.       FreeAndNil(LevelData);
  254.     end;
  255.     { Laden }
  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; // this doesn't call ScrollBarScroll()
  598.   ScrollP := 0;
  599.   Enemys.Clear;
  600.   NumEnemys := 0;
  601.   Boss := false;
  602.   LevChanged := true;
  603.   Lives.Position := 1;
  604.   LivesChange(Lives.Position);
  605.   Enemy1.Checked := true;
  606.   EnemyClick(Enemy1);
  607.   AnzeigeAct;
  608. end;
  609.  
  610. procedure TMainForm.AnzeigeAct;
  611. begin
  612.   SLabel1b.Caption := inttostr(NumEnemys);
  613.   if Boss then SLabel2b.Caption := 'Ja' else SLabel2b.Caption := 'Nein';
  614.   SLabel3b.Caption := inttostr(ScrollBar.Max);
  615.   if LevChanged then
  616.   begin
  617.     SLabel4a.Font.Color := $00000096;
  618.     SLabel4b.Font.Color := $00000096;
  619.     SLabel4b.Caption := 'Nein';
  620.   end
  621.   else
  622.   begin
  623.     SLabel4a.Font.Color := $00009600;
  624.     SLabel4b.Font.Color := $00009600;
  625.     SLabel4b.Caption := 'Ja';
  626.   end;
  627. end;
  628.  
  629. procedure TMainForm.EnemyAdd(x, y, art, lives: integer);
  630. begin
  631.   Enemys.Add(inttostr(x)+'-'+inttostr(y)+':'+inttostr(art)+'('+inttostr(lives)+')');
  632. end;
  633.  
  634. procedure TMainForm.NeuClick(Sender: TObject);
  635. begin
  636.   if MessageDlg('Level wirklich löschen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  637.     DestroyLevel;
  638. end;
  639.  
  640. procedure TMainForm.DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
  641.   Y: Integer);
  642. var
  643.   ex, ey, i, j, k, l, wert: integer;
  644.   breaked: boolean;
  645. begin
  646.   if sender <> DxDraw then
  647.   begin
  648.     StatusBar.SimpleText := status_info;
  649.     exit;
  650.   end;
  651.   ex := trunc(x/RasterW) * RasterW;
  652.   ey := trunc(y/RasterH) * RasterH;
  653.   wert := -1;
  654.   breaked := false;
  655.   for i := 1 to 7 do
  656.   begin
  657.     for j := 0 to 999 do
  658.     begin
  659.       if boss and (i = 7) then
  660.       begin
  661.         for k := 0 to 3 do
  662.         begin
  663.           for l := 0 to 1 do
  664.           begin
  665.             if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')') <> -1 then
  666.             begin
  667.               wert := j;
  668.               breaked := true;
  669.               break;
  670.             end;
  671.           end;
  672.           if breaked then break;
  673.         end;
  674.       end;
  675.       if (breaked = false) and (Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
  676.         inttostr(i)+'('+inttostr(j)+')') <> -1) then
  677.       begin
  678.         wert := j;
  679.         breaked := true;
  680.         break;
  681.       end;
  682.     end;
  683.     if breaked then break;
  684.   end;
  685.   if wert <> -1 then
  686.   begin
  687.     if wert > 0 then
  688.       StatusBar.SimpleText := status_lives + inttostr(wert)
  689.     else
  690.       StatusBar.SimpleText := status_nolives;
  691.   end
  692.   else
  693.     StatusBar.SimpleText := status_info;
  694. end;
  695.  
  696. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  697. begin
  698.   if LevChanged then
  699.     CanClose := MessageDlg('Beenden ohne abspeichern?', mtConfirmation, [mbYes, mbNo], 0) = mrYes;
  700. end;
  701.  
  702. procedure TMainForm.Quelltext1Click(Sender: TObject);
  703. begin
  704.   SourceForm.Aktualisieren;
  705.   SourceForm.showmodal;
  706. end;
  707.  
  708. procedure TMainForm.Spielfelderweitern1Click(Sender: TObject);
  709. begin
  710.   LevelForm.Aktualisieren;
  711.   LevelForm.showmodal;
  712. end;
  713.  
  714. procedure TMainForm.ScrollBarScroll(Sender: TObject;
  715.   ScrollCode: TScrollCode; var ScrollPos: Integer);
  716. begin
  717.   ScrollP := ScrollPos;
  718. end;
  719.  
  720. procedure TMainForm.LivesChange(newval: integer);
  721. begin
  722.   LiveEdit := newval;
  723.   livesedt.Text := inttostr(LiveEdit);
  724.   lives.Position := newval;
  725. end;
  726.  
  727. procedure TMainForm.LivesClick(Sender: TObject; Button: TUDBtnType);
  728. begin
  729.   LivesChange(lives.Position);
  730. end;
  731.  
  732. procedure TMainForm.LivesEdtKeyPress(Sender: TObject; var Key: Char);
  733. begin
  734.   {$IFDEF UNICODE}
  735.   if not CharInSet(Key, [#13, #08, '0'..'9']) then
  736.   {$ELSE}
  737.   if not (Key in [#13, #08, '0'..'9']) then
  738.   {$ENDIF}
  739.     Key := #0;
  740. end;
  741.  
  742. procedure TMainForm.LivesEdtChange(Sender: TObject);
  743. begin
  744.   LivesChange(strtoint(livesedt.text));
  745. end;
  746.  
  747. end.
  748.  
  749.