1,5 → 1,9 |
unit LevMain; |
|
// TODO 2024: |
// - Wenn man ein Level "X" lädt, und dann Verwalten wieder öffnet, sollte diese Level-Nummer vorgeschlagen werden, sodass man direkt Speichern klicken kann |
// - Remove "Source edit" form |
|
interface |
|
uses |
42,6 → 46,7 |
SLabel4a: TLabel; |
SLabel4b: TLabel; |
LivesLabel: TLabel; |
Quelltext1: TMenuItem; |
StatusBar: TStatusBar; |
N1: TMenuItem; |
Spielfelderweitern1: TMenuItem; |
60,10 → 65,12 |
procedure DXDrawMouseDown(Sender: TObject; Button: TMouseButton; |
Shift: TShiftState; X, Y: Integer); |
procedure EnemyClick(Sender: TObject); |
procedure EnemyAdd(x, y, art, lives: integer); |
procedure NeuClick(Sender: TObject); |
procedure DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X, |
Y: Integer); |
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); |
procedure Quelltext1Click(Sender: TObject); |
procedure Spielfelderweitern1Click(Sender: TObject); |
procedure ScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode; |
var ScrollPos: Integer); |
75,7 → 82,7 |
dxdraw: tdxdraw; |
{ Variablen } |
FMenuItem: integer; |
LevData: TLevelData; |
Enemys: TStrings; |
ScrollP: integer; |
AltScrollPos: integer; |
Boss: boolean; |
83,7 → 90,8 |
NumEnemys: integer; |
function SelectedEnemyType: TEnemyType; |
{ Level-Routinen } |
procedure EnemyCreateSprite(x, y: integer; AEnemyType: TEnemyType; ALives: integer); |
procedure EnemyCreate(x, y: integer); overload; |
procedure EnemyCreate(x, y: integer; AEnemyType: TEnemyType; ALives: integer); overload; |
procedure DestroyLevel; |
procedure AnzeigeAct; |
{ Initialisiations-Routinen } |
100,7 → 108,7 |
implementation |
|
uses |
Global, LevSplash, LevSpeicherung, ComInfo, LevOptions; |
Global, LevSplash, LevSpeicherung, ComInfo, LevSource, LevOptions; |
|
const |
RasterW = 48; |
142,7 → 150,8 |
FXCor := trunc(x) + (MainForm.ScrollP * RasterW); |
FCorInit := true; |
end; |
if MainForm.LevData.IndexOfEnemy(FXCor, integer(round(Y)), FEnemyType, FLives) = -1 then dead; |
if MainForm.Enemys.IndexOf(floattostr(FXCor)+'-'+floattostr(y)+':'+ |
inttostr(Ord(FEnemyType))+'('+inttostr(FLives)+')') = -1 then dead; |
X := FXCor - (MainForm.ScrollP * RasterW); |
end; |
|
253,7 → 262,7 |
|
procedure TMainForm.FormDestroy(Sender: TObject); |
begin |
LevData.Free; |
Enemys.Free; |
//spriteengine.Free; |
dxtimer.Free; |
imagelist.Free; |
340,7 → 349,7 |
{var |
i, j: Integer;} |
begin |
LevData := TLevelData.create; |
Enemys := TStringList.create; |
sleep(500); |
//PlayerSprite |
with TBackground.Create(SpriteEngine.Engine) do |
461,7 → 470,7 |
begin |
ex := trunc(x/RasterW) * RasterW; |
ey := trunc(y/RasterH) * RasterH; |
EnemyCreateSprite(ex, ey, SelectedEnemyType, LivesEdit.Value); |
EnemyCreate(ex, ey); |
breaked := false; |
{ Setzen } |
if Button = mbLeft then |
471,7 → 480,7 |
ok := false // boss already exists |
else |
begin |
for i := 1 to NumEnemyTypes do |
for i := 1 to 7 do |
begin |
for j := 0 to 999 do |
begin |
481,7 → 490,7 |
begin |
for l := 0 to 1 do |
begin |
if LevData.IndexOfEnemy(ex + ((ScrollP - k) * RasterW), ey - (RasterH * l), etEnemyBoss, j) <> -1 then |
if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':7('+inttostr(j)+')') <> -1 then |
begin |
ok := false; |
break; |
491,7 → 500,8 |
end; |
if not ok then break; |
end; |
if LevData.IndexOfEnemy(ex + (ScrollP * RasterW), ey, TEnemyType(i), j) <> -1 then |
if Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+ |
inttostr(i)+'('+inttostr(j)+')') <> -1 then |
begin |
ok := false; |
break; |
503,9 → 513,11 |
if ok then |
begin |
if SelectedEnemyType <> etEnemyMeteor then |
LevData.AddEnemy(ex + (ScrollP * RasterW), ey, SelectedEnemyType, LivesEdit.Value) |
Enemys.Add(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+ |
inttostr(Ord(SelectedEnemyType))+'('+inttostr(LivesEdit.Value)+')') |
else |
LevData.AddEnemy(ex + (ScrollP * RasterW), ey, SelectedEnemyType, 0); |
Enemys.Add(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+ |
inttostr(Ord(SelectedEnemyType))+'(0)'); |
inc(NumEnemys); |
if SelectedEnemyType = etEnemyBoss then boss := true; |
end |
514,19 → 526,19 |
{ Löschen } |
else if Button = mbRight then |
begin |
for i := 1 to NumEnemyTypes do |
for i := 1 to 7 do |
begin |
for j := 0 to 999 do |
begin |
if boss and (TEnemyType(i) = etEnemyBoss) then |
if boss and (i = 7) then |
begin |
for k := 0 to 3 do |
begin |
for l := 0 to 1 do |
begin |
if LevData.IndexOfEnemy(ex + ((ScrollP - k) * RasterW), ey - (RasterH * l), TEnemyType(i), j) <> -1 then |
if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')') <> -1 then |
begin |
LevData.DeleteEnemy(ex + ((ScrollP - k) * RasterW), ey - (RasterH * l), TEnemyType(i), j); |
Enemys.Delete(Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')')); |
Boss := false; |
dec(NumEnemys); |
breaked := true; |
536,10 → 548,12 |
if breaked then break; |
end; |
end; |
if LevData.IndexOfEnemy(ex + (ScrollP * RasterW), ey, TEnemyType(i), j) <> -1 then |
if Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+ |
inttostr(i)+'('+inttostr(j)+')') <> -1 then |
begin |
LevData.DeleteEnemy(ex + (ScrollP * RasterW), ey, TEnemyType(i), j); |
if TEnemyType(i) = etEnemyBoss then Boss := false; |
Enemys.Delete(Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+ |
':'+inttostr(i)+'('+inttostr(j)+')')); |
if i = 7 then Boss := false; |
dec(NumEnemys); |
breaked := true; |
break; |
562,7 → 576,7 |
LivesLabel.Enabled := et <> etEnemyMeteor; |
end; |
|
procedure TMainForm.EnemyCreateSprite(x, y: integer; AEnemyType: TEnemyType; ALives: integer); |
procedure TMainForm.EnemyCreate(x, y: integer; AEnemyType: TEnemyType; ALives: integer); |
var |
Enemy: TSprite; |
begin |
571,12 → 585,16 |
Enemy.y := y; |
end; |
|
procedure TMainForm.EnemyCreate(x, y: integer); |
begin |
EnemyCreate(x, y, SelectedEnemyType, LivesEdit.Value); |
end; |
|
procedure TMainForm.DestroyLevel; |
begin |
ScrollBar.Position := 0; // this doesn't call ScrollBarScroll() |
ScrollP := 0; |
LevData.Clear; |
ScrollBar.Max := MainForm.LevData.LevelEditorLength; |
Enemys.Clear; |
NumEnemys := 0; |
Boss := false; |
LevChanged := true; |
605,6 → 623,11 |
end; |
end; |
|
procedure TMainForm.EnemyAdd(x, y, art, lives: integer); |
begin |
Enemys.Add(inttostr(x)+'-'+inttostr(y)+':'+inttostr(art)+'('+inttostr(lives)+')'); |
end; |
|
procedure TMainForm.NeuClick(Sender: TObject); |
begin |
if MessageDlg('Level wirklich löschen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then |
618,10 → 641,7 |
status_lives = 'Leben: '; |
status_nolives = 'Einheit hat keine Lebensangabe'; |
var |
ex, ey, i, j, k, l: integer; |
lifes: integer; |
enemyType: TEnemyType; |
enemyName: string; |
ex, ey, i, j, k, l, wert: integer; |
breaked: boolean; |
begin |
if sender <> DxDraw then |
631,22 → 651,21 |
end; |
ex := trunc(x/RasterW) * RasterW; |
ey := trunc(y/RasterH) * RasterH; |
lifes := -1; |
enemyType := etUnknown; |
wert := -1; |
breaked := false; |
for i := 1 to NumEnemyTypes do |
for i := 1 to 7 do |
begin |
for j := 0 to 999 do |
begin |
if boss and (TEnemyType(i) = etEnemyBoss) then |
if boss and (i = 7) then |
begin |
for k := 0 to 3 do |
begin |
for l := 0 to 1 do |
begin |
if LevData.IndexOfEnemy(ex + ((ScrollP - k) * RasterW), ey - (RasterH * l), TEnemyType(i), j) <> -1 then |
if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')') <> -1 then |
begin |
lifes := j; |
wert := j; |
breaked := true; |
break; |
end; |
654,10 → 673,10 |
if breaked then break; |
end; |
end; |
if (breaked = false) and (LevData.IndexOfEnemy(ex + (ScrollP * RasterW), ey, TEnemyType(i), j) <> -1) then |
if (breaked = false) and (Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+ |
inttostr(i)+'('+inttostr(j)+')') <> -1) then |
begin |
lifes := j; |
enemyType := TEnemyType(i); |
wert := j; |
breaked := true; |
break; |
end; |
664,20 → 683,12 |
end; |
if breaked then break; |
end; |
if lifes <> -1 then |
if wert <> -1 then |
begin |
if Ord(enemyType) = 1 then enemyName := Enemy1.Caption |
else if Ord(enemyType) = 2 then enemyName := Enemy2.Caption |
else if Ord(enemyType) = 3 then enemyName := Enemy3.Caption |
else if Ord(enemyType) = 4 then enemyName := Enemy4.Caption |
else if Ord(enemyType) = 5 then enemyName := Enemy5.Caption |
else if Ord(enemyType) = 6 then enemyName := Enemy6.Caption |
else if Ord(enemyType) = 7 then enemyName := Enemy7.Caption |
else enemyName := '???'; |
if lifes > 0 then |
StatusBar.SimpleText := ' ' + enemyName + ' - ' + status_lives + inttostr(lifes) |
if wert > 0 then |
StatusBar.SimpleText := ' ' + status_lives + inttostr(wert) |
else |
StatusBar.SimpleText := ' ' + enemyName + ' - ' + status_nolives; |
StatusBar.SimpleText := ' ' + status_nolives; |
end |
else |
StatusBar.SimpleText := ' ' + status_info; |
689,6 → 700,12 |
CanClose := MessageDlg('Beenden ohne abspeichern?', mtConfirmation, [mbYes, mbNo], 0) = mrYes; |
end; |
|
procedure TMainForm.Quelltext1Click(Sender: TObject); |
begin |
SourceForm.Aktualisieren; |
SourceForm.showmodal; |
end; |
|
procedure TMainForm.Spielfelderweitern1Click(Sender: TObject); |
begin |
LevelForm.Aktualisieren; |