Subversion Repositories plumbers

Compare Revisions

Regard whitespace Rev 9 → Rev 10

/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);