/trunk/FileFormat/Delphi/GameBinStruct.pas |
---|
54,12 → 54,15 |
unknown2: array[0..1] of Word; |
scenes: array[0..99] of TSceneDef; // Scenes start at 0x0016 |
pictures: array[0..1999] of TPictureDef; // Pictures start at 0x2596 |
function AddSceneAtEnd(SceneID: integer): PSceneDef; |
procedure DeleteScene(SceneIndex: integer); |
procedure SwapScene(IndexA, IndexB: integer); |
procedure DeletePicture(PictureIndex: integer); |
procedure SwapPicture(IndexA, IndexB: integer); |
function AddPictureBetween(Index: integer): PPictureDef; |
function AddPictureBetween(Index: integer; assignToUpperScene: boolean=true): PPictureDef; |
function RealPictureCount: integer; |
function RealActionCount: integer; |
end; |
procedure _WriteStringToFilename(x: PAnsiFileName; s: AnsiString); |
93,8 → 96,31 |
CopyMemory(@Self.scenes[SceneIndex], @Self.scenes[SceneIndex+1], (Length(Self.scenes)-SceneIndex-1)*SizeOf(TSceneDef)); |
end; |
ZeroMemory(@Self.scenes[Length(Self.scenes)-1], SizeOf(TSceneDef)); |
Dec(Self.numScenes); |
end; |
function TGameBinFile.RealActionCount: integer; |
var |
iScene: integer; |
begin |
result := 0; |
for iScene := 0 to Self.numScenes - 1 do |
begin |
result := result + Self.scenes[iScene].numActions; |
end; |
end; |
function TGameBinFile.RealPictureCount: integer; |
var |
iScene: integer; |
begin |
result := 0; |
for iScene := 0 to Self.numScenes - 1 do |
begin |
result := result + Self.scenes[iScene].numPics; |
end; |
end; |
procedure TGameBinFile.SwapScene(IndexA, IndexB: integer); |
var |
bakScene: TSceneDef; |
108,10 → 134,12 |
procedure TGameBinFile.DeletePicture(PictureIndex: integer); |
var |
iScene: integer; |
iScene, iScene2: integer; |
protection: integer; // prevents that two scenes get the same picture index when all pictures in a scene are deleted |
begin |
if (PictureIndex < 0) or (PictureIndex >= Length(Self.pictures)) then raise Exception.Create('Invalid picture index'); |
protection := 0; |
for iScene := 0 to Self.numScenes-1 do |
begin |
if (PictureIndex >= Self.scenes[iScene].pictureIndex) and |
118,18 → 146,31 |
(PictureIndex <= Self.scenes[iScene].pictureIndex + Self.scenes[iScene].numPics - 1) then |
begin |
Dec(Self.scenes[iScene].numPics); |
if Self.scenes[iScene].numPics = 0 then |
begin |
for iScene2 := 0 to Self.numScenes-1 do |
begin |
if Self.scenes[iScene2].pictureIndex = PictureIndex+1 then |
begin |
protection := 1; |
break; |
end; |
end; |
end; |
end |
else if (PictureIndex < Self.scenes[iScene].pictureIndex) then |
else if (PictureIndex+protection < Self.scenes[iScene].pictureIndex) then |
begin |
Dec(Self.scenes[iScene].pictureIndex); |
end; |
end; |
If PictureIndex < Length(Self.pictures)-1 then |
If (PictureIndex+protection < Length(Self.pictures)-1) and (protection = 0) then |
begin |
CopyMemory(@Self.pictures[PictureIndex], @Self.pictures[PictureIndex+1], (Length(Self.pictures)-PictureIndex-1)*SizeOf(TPictureDef)); |
CopyMemory(@Self.pictures[PictureIndex+protection], @Self.pictures[PictureIndex+protection+1], (Length(Self.pictures)-PictureIndex+protection-1)*SizeOf(TPictureDef)); |
end; |
ZeroMemory(@Self.pictures[Length(Self.pictures)-1], SizeOf(TPictureDef)); |
Dec(Self.numPics); |
end; |
procedure TGameBinFile.SwapPicture(IndexA, IndexB: integer); |
146,13 → 187,34 |
CopyMemory(@Self.pictures[IndexB], @bakPicture, SizeOf(TPictureDef)); |
end; |
function TGameBinFile.AddPictureBetween(Index: integer): PPictureDef; |
function TGameBinFile.AddPictureBetween(Index: integer; assignToUpperScene: boolean=true): PPictureDef; |
function _HasBuffer(Index: integer): boolean; |
var |
iScene: integer; |
begin |
for iScene := 0 to Self.numScenes-1 do |
begin |
if Self.scenes[iScene].pictureIndex = Index+1 then |
begin |
result := true; |
exit; |
end; |
end; |
result := false; |
end; |
var |
iScene: integer; |
begin |
if Self.numPics >= Length(Self.pictures) then raise Exception.Create('No more space for another picture'); |
if ((Index < 0) or (Index >= Length(Self.pictures))) then raise Exception.Create('Invalid picture index'); |
if assignToUpperScene then |
begin |
// Sc1 Sc2 Sc1 Sc2 |
// A B | C ==> A B | X C |
// ^ |
for iScene := 0 to Self.numScenes-1 do |
begin |
if (Index >= Self.scenes[iScene].pictureIndex) and |
160,15 → 222,40 |
begin |
Inc(Self.scenes[iScene].numPics); |
end |
else if (index < Self.scenes[iScene].pictureIndex) then |
else if (index < Self.scenes[iScene].pictureIndex) and not _HasBuffer(index) then |
begin |
Inc(Self.scenes[iScene].pictureIndex); |
end; |
end; |
end |
else |
begin |
// Sc1 Sc2 Sc1 Sc2 |
// A B | C ==> A B X | C |
// ^ |
for iScene := 0 to Self.numScenes-1 do |
begin |
if (Index >= 1 + Self.scenes[iScene].pictureIndex) and |
(index <= 1 + Self.scenes[iScene].pictureIndex + Max(0,Self.scenes[iScene].numPics-1)) then |
begin |
Inc(Self.scenes[iScene].numPics); |
end |
else if (index <= Self.scenes[iScene].pictureIndex) and not _HasBuffer(index) then |
begin |
Inc(Self.scenes[iScene].pictureIndex); |
end; |
end; |
end; |
result := @Self.pictures[Index]; |
if not _HasBuffer(index) then |
begin |
CopyMemory(@Self.pictures[Index+1], result, (Length(Self.pictures)-Index-1)*SizeOf(TPictureDef)); |
end; |
ZeroMemory(result, SizeOf(TPictureDef)); |
Inc(Self.numPics); |
end; |
end. |
/trunk/SceneEditor/Unit1.dfm |
---|
15,6 → 15,7 |
Menu = MainMenu1 |
OldCreateOrder = False |
Position = poScreenCenter |
OnCloseQuery = FormCloseQuery |
OnCreate = FormCreate |
OnShow = FormShow |
DesignSize = ( |
65,7 → 66,7 |
Height = 46 |
Anchors = [akLeft, akBottom] |
Caption = 'Save' |
TabOrder = 6 |
TabOrder = 7 |
OnClick = Button3Click |
end |
object Button4: TButton |
95,7 → 96,7 |
Height = 46 |
Anchors = [akLeft, akBottom] |
Caption = 'Save + Test' |
TabOrder = 7 |
TabOrder = 8 |
OnClick = Button10Click |
end |
object PageControl2: TPageControl |
105,7 → 106,7 |
Height = 603 |
ActivePage = TabSheet4 |
Anchors = [akLeft, akTop, akRight, akBottom] |
TabOrder = 8 |
TabOrder = 9 |
object TabSheet4: TTabSheet |
Caption = 'Pictures' |
DesignSize = ( |
302,56 → 303,18 |
OnClick = Button13Click |
end |
object MediaPlayer1: TMediaPlayer |
Left = 684 |
Top = 371 |
Left = 604 |
Top = 21 |
Width = 29 |
Height = 30 |
Height = 25 |
ColoredButtons = [] |
VisibleButtons = [btPlay] |
DoubleBuffered = True |
Visible = False |
ParentDoubleBuffered = False |
TabOrder = 14 |
end |
object GroupBox1: TGroupBox |
Left = 591 |
Top = 63 |
Width = 185 |
Height = 121 |
Caption = 'Scene length' |
TabOrder = 15 |
object Label20: TLabel |
Left = 16 |
Top = 24 |
Width = 119 |
Height = 13 |
Caption = 'Picture sequence length:' |
end |
object Label21: TLabel |
Left = 16 |
Top = 43 |
Width = 37 |
Height = 13 |
Caption = 'Label21' |
end |
object Label22: TLabel |
Left = 16 |
Top = 72 |
Width = 91 |
Height = 13 |
Caption = 'Soundtrack length:' |
end |
object Label23: TLabel |
Left = 16 |
Top = 91 |
Width = 37 |
Height = 13 |
Caption = 'Label23' |
end |
end |
object GroupBox2: TGroupBox |
Left = 591 |
Top = 190 |
Top = 234 |
Width = 185 |
Height = 167 |
Caption = 'Playback' |
403,7 → 366,7 |
Left = 272 |
Top = 439 |
Width = 305 |
Height = 125 |
Height = 122 |
Anchors = [akLeft, akTop, akBottom] |
ItemHeight = 13 |
PopupMenu = PopupMenu1 |
417,6 → 380,7 |
Top = 143 |
Width = 26 |
Height = 21 |
Hint = 'Open file' |
Caption = '1' |
Font.Charset = DEFAULT_CHARSET |
Font.Color = clWindowText |
424,6 → 388,8 |
Font.Name = 'Wingdings' |
Font.Style = [] |
ParentFont = False |
ParentShowHint = False |
ShowHint = True |
TabOrder = 10 |
Visible = False |
OnClick = Button12Click |
433,6 → 399,7 |
Top = 60 |
Width = 31 |
Height = 21 |
Hint = 'Open file' |
Caption = '1' |
Font.Charset = DEFAULT_CHARSET |
Font.Color = clWindowText |
440,6 → 407,8 |
Font.Name = 'Wingdings' |
Font.Style = [] |
ParentFont = False |
ParentShowHint = False |
ShowHint = True |
TabOrder = 2 |
Visible = False |
OnClick = Button18Click |
450,7 → 419,7 |
Width = 305 |
Height = 212 |
BevelOuter = bvNone |
TabOrder = 16 |
TabOrder = 15 |
object Image2: TImage |
Left = 0 |
Top = 1 |
461,22 → 430,125 |
end |
end |
object Panel3: TPanel |
Left = 583 |
Left = 592 |
Top = 439 |
Width = 194 |
Width = 185 |
Height = 122 |
BevelOuter = bvNone |
TabOrder = 17 |
TabOrder = 16 |
object Image3: TImage |
Left = 8 |
Left = 0 |
Top = 0 |
Width = 177 |
Height = 108 |
Width = 185 |
Height = 122 |
Stretch = True |
OnDblClick = ListBox3DblClick |
end |
end |
object PageControl3: TPageControl |
Left = 592 |
Top = 68 |
Width = 185 |
Height = 141 |
ActivePage = TabSheet6 |
TabOrder = 17 |
object TabSheet6: TTabSheet |
Caption = 'Scene length' |
ExplicitWidth = 281 |
ExplicitHeight = 165 |
object Label20: TLabel |
Left = 16 |
Top = 15 |
Width = 119 |
Height = 13 |
Caption = 'Picture sequence length:' |
end |
object Label21: TLabel |
Left = 16 |
Top = 34 |
Width = 37 |
Height = 13 |
Caption = 'Label21' |
end |
object Label22: TLabel |
Left = 16 |
Top = 63 |
Width = 91 |
Height = 13 |
Caption = 'Soundtrack length:' |
end |
object Label23: TLabel |
Left = 16 |
Top = 82 |
Width = 37 |
Height = 13 |
Caption = 'Label23' |
end |
end |
object TabSheet7: TTabSheet |
Caption = 'Stats' |
ImageIndex = 1 |
ExplicitWidth = 281 |
ExplicitHeight = 165 |
object Label34: TLabel |
Left = 16 |
Top = 16 |
Width = 61 |
Height = 13 |
Caption = 'SceneIndex:' |
end |
object Label35: TLabel |
Left = 98 |
Top = 16 |
Width = 12 |
Height = 13 |
Caption = '---' |
end |
object Label32: TLabel |
Left = 16 |
Top = 35 |
Width = 66 |
Height = 13 |
Caption = 'PictureCount:' |
end |
object Label33: TLabel |
Left = 98 |
Top = 35 |
Width = 12 |
Height = 13 |
Caption = '---' |
end |
object Label30: TLabel |
Left = 16 |
Top = 54 |
Width = 65 |
Height = 13 |
Caption = 'PictureIndex:' |
end |
object Label31: TLabel |
Left = 98 |
Top = 54 |
Width = 12 |
Height = 13 |
Caption = '---' |
end |
object Label36: TLabel |
Left = 16 |
Top = 73 |
Width = 63 |
Height = 13 |
Caption = 'ActionCount:' |
end |
object Label37: TLabel |
Left = 98 |
Top = 73 |
Width = 12 |
Height = 13 |
Caption = '---' |
end |
end |
end |
end |
object TabSheet5: TTabSheet |
Caption = 'Decision' |
ImageIndex = 1 |
631,6 → 703,7 |
Width = 145 |
Height = 21 |
Style = csDropDownList |
ItemHeight = 13 |
TabOrder = 0 |
OnChange = ActionTargetChange |
end |
665,6 → 738,7 |
Width = 145 |
Height = 21 |
Style = csDropDownList |
ItemHeight = 13 |
TabOrder = 0 |
OnChange = ActionTargetChange |
end |
754,6 → 828,7 |
Width = 145 |
Height = 21 |
Style = csDropDownList |
ItemHeight = 13 |
TabOrder = 0 |
OnChange = ActionTargetChange |
end |
830,6 → 905,7 |
Top = 35 |
Width = 30 |
Height = 21 |
Hint = 'Open file' |
Caption = '1' |
Font.Charset = DEFAULT_CHARSET |
Font.Color = clWindowText |
837,6 → 913,8 |
Font.Name = 'Wingdings' |
Font.Style = [] |
ParentFont = False |
ParentShowHint = False |
ShowHint = True |
TabOrder = 1 |
Visible = False |
OnClick = Button11Click |
873,6 → 951,15 |
TabOrder = 5 |
OnClick = Button14Click |
end |
object Button19: TButton |
Left = 136 |
Top = 534 |
Width = 81 |
Height = 25 |
Caption = 'Undo all' |
TabOrder = 6 |
OnClick = Button19Click |
end |
object Timer1: TTimer |
Enabled = False |
Interval = 100 |
/trunk/SceneEditor/Unit1.pas |
---|
1,24 → 1,25 |
unit Unit1; |
// BUG: deleting of pictures does not work! the editor becomes very confused, and the changes are not saved at all? |
// TODO: when closing the editor: ask if the user wants to save (but only if they changed something) |
// TODO: the "folder open" icons look like you can CHOOSE a file, not open it! |
// - change the icon to something else |
// - add open-dialogs for choosing the bmp and wav files |
// TODO: Give controls better names |
// Idea: When actions are deleted, remove the colorful marking on the picture? |
// Idea: decision bitmap markings: anti moiree? |
// Idea: unused liste auch bei decision page anzeigen |
// Idea: hotspots: netz ziehen anstelle linke und rechts maustaste. netz in jede beliebige richtung ziehen und topleft/bottomright automatisch bestimmen |
// Idea: decision bitmap markings: anti moiree? |
// Idea: Automatic correct wrong Game.numScenes/numPics values? (especially since we rely on them when adding a scene) |
// Idea: "defragmentation": shift all pictures to the left if a scene has a higher "numPics" value than actual pictures |
interface |
uses |
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, |
Dialogs, StdCtrls, Spin, Grids, GameBinStruct, ComCtrls, ExtCtrls, Vcl.MPlayer, |
Vcl.Menus; |
Dialogs, StdCtrls, Spin, Grids, GameBinStruct, ComCtrls, ExtCtrls, MPlayer, |
Menus; |
const |
CUR_VER = '2017-10-03'; |
CUR_VER = '2017-10-04'; |
type |
TForm1 = class(TForm) |
87,11 → 88,6 |
Button14: TButton; |
MediaPlayer1: TMediaPlayer; |
Timer1: TTimer; |
GroupBox1: TGroupBox; |
Label20: TLabel; |
Label21: TLabel; |
Label22: TLabel; |
Label23: TLabel; |
GroupBox2: TGroupBox; |
Button15: TButton; |
Button17: TButton; |
125,6 → 121,22 |
Panel2: TPanel; |
Panel3: TPanel; |
Image3: TImage; |
Button19: TButton; |
PageControl3: TPageControl; |
TabSheet6: TTabSheet; |
TabSheet7: TTabSheet; |
Label20: TLabel; |
Label21: TLabel; |
Label22: TLabel; |
Label23: TLabel; |
Label34: TLabel; |
Label35: TLabel; |
Label32: TLabel; |
Label33: TLabel; |
Label30: TLabel; |
Label31: TLabel; |
Label36: TLabel; |
Label37: TLabel; |
procedure ListBox1Click(Sender: TObject); |
procedure Edit1Change(Sender: TObject); |
procedure Edit2Change(Sender: TObject); |
171,8 → 183,11 |
procedure ListBox3MouseDown(Sender: TObject; Button: TMouseButton; |
Shift: TShiftState; X, Y: Integer); |
procedure ListBox3Click(Sender: TObject); |
procedure Button19Click(Sender: TObject); |
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); |
private |
Game: TGameBinFile; |
GameBak: TGameBinFile; |
PlayStart: Cardinal; |
MediaplayerOpened: boolean; |
StopPlayRequest: boolean; |
195,6 → 210,7 |
procedure RecalcSlideshowLength; |
procedure RecalcSoundtrackLength; |
procedure RecalcUnusedFiles; |
procedure RecalcStats; |
procedure HandlePossibleEmptySceneList; |
procedure DisableEnableSceneControls(enable: boolean); |
procedure DisableEnablePictureControls(enable: boolean); |
212,6 → 228,10 |
uses |
Math, MMSystem, ShellAPI; |
const |
DEFAULT_DURATION = 0; |
DEFAULT_FILENAME = 'DUMMY.BMP'; |
function GetSceneIDFromName(sceneName: string): Integer; |
var |
sSceneID: string; |
221,6 → 241,16 |
if not TryStrToInt(sSceneID, result) then raise Exception.Create('Scene name invalid'); |
end; |
procedure SelectFilenameBase(Edit: TEdit); |
begin |
if Edit.CanFocus then |
begin |
Edit.SetFocus; |
Edit.SelStart := 0; |
Edit.SelLength := Pos('.', Edit.Text)-1; |
end; |
end; |
function _DecisecondToTime(ds: integer): string; |
begin |
result := FormatDatetime('hh:nn:ss', ds / 10 / (24*60*60))+','+IntToStr(ds mod 10); |
323,7 → 353,7 |
procedure TForm1.Button10Click(Sender: TObject); |
begin |
Save; |
if not FileExists('ShowTime32.exe') then raise Exception.Create('ShowTime32.exe not found.'); |
if not FileExists('ShowTime32.exe') then raise Exception.Create('GAME.BIN saved; ShowTime32.exe not found.'); |
ShellExecute(Application.Handle, 'open', 'ShowTime32.exe', '', '', SW_NORMAL); |
end; |
373,7 → 403,6 |
procedure TForm1.Button14Click(Sender: TObject); |
begin |
New; |
HandlePossibleEmptySceneList; |
end; |
procedure TForm1.DisableEnableSceneControls(enable: boolean); |
579,6 → 608,12 |
ShellExecute(Application.Handle, 'open', PChar(fileName), '', '', SW_NORMAL); |
end; |
procedure TForm1.Button19Click(Sender: TObject); |
begin |
CopyMemory(@Game, @GameBak, SizeOf(Game)); |
SetupGUIAfterLoad; |
end; |
procedure TForm1.NewScene; |
var |
sceneID: integer; |
594,6 → 629,7 |
newScene := Game.AddSceneAtEnd(sceneID); |
newScene.actions[0].nextSceneID := SCENEID_ENDGAME; |
newScene.pictureIndex := Game.numPics; |
ListBox1.Items.Add(newScene.szSceneFolder); |
ReloadActionSceneLists; |
HandlePossibleEmptySceneList; |
652,7 → 688,6 |
end; |
Game.DeleteScene(ListBox1.ItemIndex); |
Dec(Game.numScenes); |
bakItemindex := ListBox1.ItemIndex; |
ListBox1.Items.Delete(bakItemindex); |
691,19 → 726,25 |
var |
pic: PPictureDef; |
begin |
pic := Game.AddPictureBetween(CurScene^.pictureIndex + Max(ListBox2.ItemIndex,0)); |
pic.duration := 0; |
pic.szBitmapFile := 'DUMMY.BMP'; |
ListBox2.Items.Insert(ListBox2.ItemIndex, '(0) DUMMY.BMP'); |
if ListBox2.Items.Count > 0 then |
pic := Game.AddPictureBetween(CurScene^.pictureIndex + Max(ListBox2.ItemIndex+1,0), false) |
else |
pic := Game.AddPictureBetween(CurScene^.pictureIndex + Max(ListBox2.ItemIndex,0), true); |
pic.duration := DEFAULT_DURATION; |
pic.szBitmapFile := DEFAULT_FILENAME; |
if ListBox2.ItemIndex = -1 then |
begin |
ListBox2.Items.Insert(ListBox2.Count, Format('(%d) %s', [DEFAULT_DURATION, DEFAULT_FILENAME])); |
ListBox2.ItemIndex := ListBox2.Count - 1; |
end |
else |
begin |
ListBox2.ItemIndex := ListBox2.ItemIndex - 1; |
ListBox2.Items.Insert(ListBox2.ItemIndex+1, Format('(%d) %s', [DEFAULT_DURATION, DEFAULT_FILENAME])); |
ListBox2.ItemIndex := ListBox2.ItemIndex + 1; |
end; |
ListBox2Click(Listbox2); |
SelectFilenameBase(Edit3); |
RecalcStats; |
end; |
procedure TForm1.Button7Click(Sender: TObject); |
713,7 → 754,7 |
if Listbox2.Count > 0 then |
begin |
bakIdx := ListBox2.ItemIndex; |
Game.DeletePicture(bakIdx); |
Game.DeletePicture(CurScene^.pictureIndex + bakIdx); |
ListBox2.Items.Delete(bakIdx); |
if ListBox2.Count > 0 then |
begin |
723,6 → 764,7 |
end; |
RecalcUnusedFiles; |
end; |
RecalcStats; |
end; |
procedure TForm1.Button8Click(Sender: TObject); |
743,6 → 785,8 |
var |
fs: TFileStream; |
begin |
CopyMemory(@GameBak, @Game, SizeOf(Game)); |
fs := TFileStream.Create('GAME.BIN', fmOpenWrite or fmCreate); |
try |
fs.WriteBuffer(Game, SizeOf(Game)); |
811,10 → 855,33 |
Button12.Visible := CurPicture^.szBitmapFile <> ''; |
end; |
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); |
begin |
if not CompareMem(@Game, @GameBak, SizeOf(Game)) then |
begin |
case MessageDlg('Do you want to save the changes?', mtConfirmation, mbYesNoCancel, 0) of |
ID_YES: |
begin |
Save; |
CanClose := true; |
end; |
ID_NO: |
begin |
CanClose := true; |
end; |
ID_CANCEL: |
begin |
CanClose := false; |
end; |
end; |
end; |
end; |
procedure TForm1.FormCreate(Sender: TObject); |
begin |
PageControl1.ActivePageIndex := 0; |
PageControl2.ActivePageIndex := 0; |
PageControl3.ActivePageIndex := 0; |
Label10.Caption := ''; |
Label21.Caption := ''; |
Label23.Caption := ''; |
897,7 → 964,26 |
end; |
procedure TForm1.ListBox2Click(Sender: TObject); |
var |
bakEvent: TNotifyEvent; |
begin |
if CurScene^.numPics = 0 then |
begin |
SpinEdit13.Value := 0; |
bakEvent := Edit3.OnChange; |
try |
Edit3.OnChange := nil; |
Edit3.Text := ''; |
finally |
Edit3.OnChange := bakEvent; |
end; |
Label18.Caption := ''; |
Image2.Picture := nil; |
exit; |
end; |
SpinEdit13.Value := CurPicture^.duration; |
Edit3.Text := string(CurPicture^.szBitmapFile); |
909,6 → 995,8 |
begin |
Button15Click(Button15); |
end; |
RecalcStats; |
end; |
procedure TForm1.ListBox2DblClick(Sender: TObject); |
982,6 → 1070,7 |
procedure TForm1.New; |
begin |
ZeroMemory(@Game, SizeOf(Game)); |
ZeroMemory(@GameBak, SizeOf(Game)); |
SetupGUIAfterLoad; |
end; |
997,6 → 1086,14 |
FreeAndNil(fs); |
end; |
if Game.RealPictureCount <> Game.numPics then |
begin |
MessageDlg('Picture count was wrong. Value was corrected.', mtInformation, [mbOk], 0); |
Game.numPics := Game.RealPictureCount; |
end; |
CopyMemory(@GameBak, @Game, SizeOf(Game)); |
SetupGUIAfterLoad; |
end; |
1118,15 → 1215,17 |
procedure _PreparePictureList; |
var |
i: integer; |
pic: PPictureDef; |
//pic: PPictureDef; |
begin |
ListBox2.Clear; |
if CurScene^.numPics = 0 then |
begin |
(* |
pic := Game.AddPictureBetween(CurScene^.pictureIndex + Max(ListBox2.ItemIndex,0)); |
pic.duration := 0; |
pic.szBitmapFile := 'DUMMY.BMP'; |
pic.duration := DEFAULT_DURATION; |
pic.szBitmapFile := DEFAULT_FILENAME; |
*) |
end; |
for i := CurScene^.pictureIndex to CurScene^.pictureIndex + CurScene^.numPics - 1 do |
1174,8 → 1273,24 |
RecalcSoundtrackLength; |
RecalcUnusedFiles; |
RecalcStats; |
end; |
procedure TForm1.RecalcStats; |
begin |
Label35.Caption := IntToStr(ListBox1.ItemIndex) + ' / ' + IntToStr(Game.numScenes); |
if ListBox2.ItemIndex >= 0 then |
Label31.Caption := IntToStr(CurScene^.pictureIndex) + ' + ' + IntToStr(ListBox2.ItemIndex) + ' = ' + IntToStr(CurScene^.pictureIndex+ListBox2.ItemIndex) |
else |
Label31.Caption := IntToStr(CurScene^.pictureIndex); |
Label33.Caption := IntToStr(CurScene^.numPics) + ' / ' + IntToStr(Game.numPics); |
Label37.Caption := IntToStr(CurScene^.numActions) + ' / ' + IntToStr(Game.RealActionCount); |
end; |
procedure TForm1.ReloadActionSceneLists; |
procedure _ReloadActionSceneLists(ComboBox: TComboBox); |
1220,6 → 1335,8 |
CurScene^.numActions := SpinEdit12.Value; |
// QUE: zero data of actions which are inactive (numActions<action)? |
RecalcStats; |
end; |
procedure TForm1.SpinEdit13Change(Sender: TObject); |
1267,7 → 1384,7 |
procedure TForm1.About1Click(Sender: TObject); |
begin |
ShowMessage('Plumbers Dont''t Wear Ties - GAME.BIN editor (can be also used to create new games based on the "ShowTime" engine!)'+#13#10#13#10+'Written by Daniel Marschall (www.daniel-marschall.de)'+#13#10#13#10+'Published by ViaThinkSoft (www.viathinksoft.com)'+#13#10#13#10+'Current version: ' + CUR_VER); |
ShowMessage('Plumbers Don''t Wear Ties - GAME.BIN editor (can be also used to create new games based on the "ShowTime" engine!)'+#13#10#13#10+'Written by Daniel Marschall (www.daniel-marschall.de)'+#13#10#13#10+'Published by ViaThinkSoft (www.viathinksoft.com)'+#13#10#13#10+'Current version: ' + CUR_VER); |
end; |
procedure TForm1.ActionSpinEditsChange(Sender: TObject); |