From: mixster
He somewhat sidestepped it and said he was going to equally support other includes (erm, phoenix.scar and….).
The problem is not so much one click installers as it is there not being an obvious place to look for how to setup Scar and SRL. Widget has just released a .exe SRL downloader (and maybe Scar - I didn't look too much at it). Likewise Scar has had the option to change which SVN SRL is downloaded from for a while now I think, but just no one has put that into a tutorial and made it obvious.
It's a SCAR script. I would have a SCAR downloader as well but I can't exactly replace the SCAR.exe while I'm using it to run the installer ;)
Also, SCAR's Form threading and firewall/filewall are a pain in the ass. Vista and/or Windows 7 will consider the form crashed even though you can still watch it write debug text in SCAR and grey it out but whatever.
From: Dan Cardin
Finally, if we're going for ease of use, i think that forms in scripts ought to become more prominent. Though, before that can happen en mass, the SRLPlayerform ought to be redone, nicerly and betterly.
I find that this style is easier to manage, though not very friendly if you have lots of per-player parameters:
Program mansLaughterForm;
var (* Form components *)
Form:TForm;
TabController:TPageControl;
Tabs:array[1..3] of TTabSheet;
PlayerScrollBox:TScrollBox;
PlayerFormEdits:array[1..5] of array of TEdit;
PlayerFormLabels:array[1..5] of array of TLabel;
PlayerFormChecks:array of TCheckBox;
OtherEdits:array[1..4] of TEdit;
Labels:array[1..4] of TLabel;
Checks:array[1..5] of TCheckBox;
HerbDropDown: TComboBox;
PlayerAdd,PlayerDelete,SaveSettings,LoadSettings:TButton;
Ok,Cancel:TButton;
AnObject:TObject; // Because TObjects can't be used as variants for ThreadSafeCalls
var (* Script variables *)
Settings: array[1..7] of Variant;
function TheForm:Boolean; forward;
procedure SetEditProperties(var anEdit:TEdit;var aLabel:TLabel;x,y,w,h:integer;text:string;password:boolean); forward;
procedure VanishLabel; forward;
procedure SafeVanishLabel(Sender:TObject); forward;
procedure AddPlayer; forward;
procedure SafeAddPlayer(Sender:TObject); forward;
procedure DeletePlayer; forward;
procedure SafeDeletePlayer(Sender:TObject); forward;
procedure EnablePlayer(Sender:TObject); forward;
procedure ScriptTerminate; forward;
procedure SaveTheSettings(Sender:TObject); forward;
procedure LoadTheSettings(Sender:TObject); forward;
procedure OnFormClose(Sender: TObject; var CanClose: Boolean); forward;
procedure CloseForm(Sender:TObject); forward;
function TheForm:Boolean;
var
i:integer;
s: array of string;
begin
Form := CreateForm;
Form.SetBounds(0,0,600,450);
Form.Position := poScreenCenter;
Form.Caption := 'mansLaughter [Edgeville Man Killer] —— by Widget';
Form.BorderIcons := [biSystemMenu];
Form.OnClick := @SafeVanishLabel;
Form.OnCloseQuery := @OnFormClose;
TabController := TPageControl.Create(Form);
TabController.Parent := Form;
TabController.SetBounds(2,2,590,385);
TabController.Visible := True;
for i := 1 to 2 do
begin
Tabs[i] := TTabSheet.Create(Form);
Tabs[i].PageControl := TabController;
end;
Tabs[1].Caption := 'Setup';
Tabs[2].Caption := 'Players';
// Tabs[3].Caption := 'Autoresponder'; // Not yet =)
for i := 1 to 4 do
begin
OtherEdits[i] := TEdit.Create(Form);
OtherEdits[i].Parent := Tabs[1];
OtherEdits[i].OnClick := @SafeVanishLabel;
Labels[i] := TLabel.Create(Form);
Labels[i].Parent := OtherEdits[i];
Labels[i].Font.Color := $AAAAAA;
Labels[i].Color := OtherEdits[i].Color;
Labels[i].Transparent := False;
Labels[i].OnClick := @SafeVanishLabel;
end;
SetEditProperties(OtherEdits[1],Labels[1],50,50,120,20,'Stats ID',False);
SetEditProperties(OtherEdits[2],Labels[2],175,50,150,20,'Stats Pass',True);
SetEditProperties(OtherEdits[3],Labels[3],50,80,135,20,'Mouse Speed',False);
SetEditProperties(OtherEdits[4],Labels[4],190,80,135,20,'SMART World',False);
OtherEdits[3].Text := '15';
OtherEdits[4].Text := '55';
for i := 1 to 5 do
begin
Checks[i] := TCheckBox.Create(Form);
Checks[i].Parent := Tabs[1]
Checks[i].SetBounds(51,80+30*i,270,20);
end;
Checks[1].Caption := 'Bury bones';
Checks[1].OnClick := @EnablePlayer;
Checks[2].Caption := 'Bank bones';
Checks[2].OnClick := @EnablePlayer;
Checks[3].Caption := 'Pick up herbs above';
Checks[3].OnClick := @EnablePlayer;
Checks[4].Caption := 'Keep door shut';
Checks[4].Checked := True;
Checks[5].Caption := 'as well as Guams (members worlds only)';
Checks[5].Checked := True;
Checks[5].Enabled := False;
Checks[5].SetBounds(276,170,270,20);
HerbDropDown := TComboBox.Create(Form);
HerbDropDown.Parent := Tabs[1];
HerbDropDown.SetBounds(170,170,100,20);
s := ['Guam','Marrentill','Tarromin','Harralander','Ranarr',
'Irit','Avantoe','Snapdragon','Cadantine','Lantadyme','Dwarf Weed'];
for i := 0 to High(s) do
HerbDropDown.Items.Append(s[i]);
HerbDropDown.Style := csDropDownList;
HerbDropDown.ItemIndex := 0;
HerbDropDown.Enabled := False;
PlayerScrollBox := TScrollBox.Create(Form);
PlayerScrollBox.Parent := Tabs[2];
PlayerScrollBox.SetBounds(10,10,560,275);
PlayerScrollBox.Color := 16119800;
SafeAddPlayer(Form);
PlayerAdd := TButton.Create(Form);
PlayerAdd.Parent := Tabs[2];
PlayerAdd.SetBounds(30,300,100,25);
PlayerAdd.Caption := 'Add Player';
PlayerAdd.OnClick := @SafeAddPlayer;
PlayerDelete := TButton.Create(Form);
PlayerDelete.Parent := Tabs[2];
PlayerDelete.SetBounds(135,300,100,25);
PlayerDelete.Caption := 'Delete Player';
PlayerDelete.OnClick := @SafeDeletePlayer;
SaveSettings := TButton.Create(Form);
SaveSettings.Parent := Form;
SaveSettings.SetBounds(5,387,100,25);
SaveSettings.Caption := 'Save Players';
SaveSettings.OnClick := @SaveTheSettings;
LoadSettings := TButton.Create(Form);
LoadSettings.Parent := Form;
LoadSettings.SetBounds(110,387,100,25);
LoadSettings.Caption := 'Load Players';
LoadSettings.OnClick := @LoadTheSettings;
LoadTheSettings(Form);
Ok := TButton.Create(Form);
Ok.Parent := Form;
Ok.SetBounds(485,387,100,25);
Ok.Caption := 'OK';
Ok.OnClick := @CloseForm;
Cancel := TButton.Create(Form);
Cancel.Parent := Form;
Cancel.SetBounds(380,387,100,25);
Cancel.Caption := 'Cancel';
Cancel.OnClick := @CloseForm;
Result := (Form.ShowModal=MrOk);
end;
function ShowForm:Boolean;
var
tva:Tvariantarray;
begin
result := ThreadSafeCall('TheForm',tva);
end;
procedure SetEditProperties(var anEdit:TEdit;var aLabel:TLabel;x,y,w,h:integer;text:string;password:boolean);
begin
anEdit.SetBounds(x,y,w,h);
if password then
anEdit.PasswordChar := '*';
aLabel.SetBounds(w-Form.Canvas.TextWidth(text)-5,-1,Form.Canvas.TextWidth(text)+5,20);
aLabel.Caption := text;
end;
procedure SafeVanishLabel(Sender:TObject);
var
tva:Tvariantarray;
begin
AnObject := Sender;
tva := [];
try
ThreadSafeCall('VanishLabel',tva);
except
Writeln('Thread error');
end;
end;
procedure VanishLabel;
var
i,i2:integer;
TheEdit:TEdit;
TheLabel:TLabel;
Sender:TObject;
begin
try
Sender := AnObject;
for i := 1 to high(OtherEdits) do
if not Labels[i].visible then
Labels[i].visible := true;
for i := 1 to 5 do
for i2 := 0 to (getarraylength(PlayerFormEdits[1])-1) do
if not PlayerFormLabels[i][i2].Visible then
PlayerFormLabels[i][i2].Visible := True;
TheLabel := nil;
TheEdit := nil;
for i := 1 to high(OtherEdits) do
if (Sender=OtherEdits[i]) OR (Sender=Labels[i]) then
begin
TheLabel := Labels[i];
TheEdit := OtherEdits[i];
end;
for i := 1 to high(PlayerFormEdits) do
for i2 := 1 to getarraylength(PlayerFormEdits[1]) do
if (Sender=PlayerFormEdits[i][i2-1]) OR (Sender=PlayerFormLabels[i][i2-1]) then
begin
TheLabel := PlayerFormLabels[i][i2-1];
TheEdit := PlayerFormEdits[i][i2-1];
end;
if not ((TheEdit=nil) OR (TheLabel=nil)) then
begin
TheLabel.Visible := False;
TheEdit.SetFocus;
end else
if not (Sender=Form) then
Form.SetFocus;
Sender := nil;
AnObject := nil;
except
Writeln('Weird error with the labels *sigh*');
end;
end;
procedure AddPlayer;
var
i,i2:integer;
begin
i2 := GetarrayLength(PlayerFormEdits[1]);
for i := 1 to 5 do
begin
SetarrayLength(PlayerFormEdits[i],GetarrayLength(PlayerFormEdits[i])+1);
SetarrayLength(PlayerFormLabels[i],GetarrayLength(PlayerFormLabels[i])+1);
PlayerFormEdits[i][i2] := TEdit.Create(Form);
PlayerFormEdits[i][i2].Visible := False;
PlayerFormEdits[i][i2].Parent := PlayerScrollBox;
PlayerFormEdits[i][i2].OnClick := @SafeVanishLabel;
PlayerFormLabels[i][i2] := TLabel.Create(Form);
PlayerFormLabels[i][i2].Parent := PlayerFormEdits[i][i2];
PlayerFormLabels[i][i2].Font.Color := $AAAAAA;
PlayerFormLabels[i][i2].Color := PlayerFormEdits[i][0].Color;
PlayerFormLabels[i][i2].OnClick := @SafeVanishLabel;
end;
SetarrayLength(PlayerFormChecks,GetarrayLength(PlayerFormChecks)+1);
SetEditProperties(PlayerFormEdits[1][i2],PlayerFormLabels[1][i2],25,10+25*i2,120,20,'Username',false);
SetEditProperties(PlayerFormEdits[2][i2],PlayerFormLabels[2][i2],150,10+25*i2,120,20,'Password',true);
SetEditProperties(PlayerFormEdits[3][i2],PlayerFormLabels[3][i2],275,10+25*i2,70,20,'Nick',false);
SetEditProperties(PlayerFormEdits[4][i2],PlayerFormLabels[4][i2],350,10+25*i2,70,20,'PIN',false);
SetEditProperties(PlayerFormEdits[5][i2],PlayerFormLabels[5][i2],425,10+25*i2,110,20,'Total Loads',false);
PlayerFormEdits[5][i2].Enabled := False;
PlayerFormEdits[5][i2].Text := 'N/A';
PlayerFormChecks[i2] := TCheckBox.Create(Form);
PlayerFormChecks[i2].Visible := False;
PlayerFormChecks[i2].Color := 16119800;
PlayerFormChecks[i2].Parent := PlayerScrollBox;
PlayerFormChecks[i2].SetBounds(5,11+25*i2,20,20);
PlayerFormChecks[i2].Checked := True;
PlayerFormChecks[i2].OnClick := @EnablePlayer;
for i := 1 to 5 do
begin
PlayerFormEdits[i][i2].Visible := True;
PlayerFormLabels[i][i2].Visible := True;
end;
PlayerFormChecks[i2].Visible := True;
end;
procedure SafeAddPlayer(Sender:TObject);
var
tva:Tvariantarray;
begin
ThreadSafeCall('AddPlayer',tva);
end;
procedure DeletePlayer;
var
i,i2:integer;
begin
try
i := GetarrayLength(PlayerFormChecks)-1;
if (i=0) then Exit;
for i2 := 1 to 5 do
begin
PlayerFormEdits[i2][i].Parent := nil;
PlayerFormLabels[i2][i].Parent := nil;
PlayerFormEdits[i2][i].Free;
PlayerFormLabels[i2][i].Free;
SetarrayLength(PlayerFormLabels[i2],i);
SetarrayLength(PlayerFormEdits[i2],i);
end;
PlayerFormChecks[i].Parent := nil;
SetarrayLength(PlayerFormChecks,i);
except
GetApplication.MessageBox('Error deleting player','Error',1);
end;
end;
procedure SafeDeletePlayer(Sender:TObject);
var
tva:Tvariantarray;
begin
ThreadSafeCall('DeletePlayer',tva);
end;
procedure EnablePlayer(Sender:TObject);
var
i,i2:integer;
begin
if Sender=Checks[3] then
begin
Checks[5].Enabled := Checks[3].Checked;
HerbDropDown.Enabled := Checks[3].Checked;
Exit;
end;
if (Sender=Checks[1]) and Checks[1].Checked then
Checks[2].Checked := False;
if (Sender=Checks[2]) and Checks[2].Checked then
Checks[1].Checked := False;
if (Sender=Checks[1]) or (Sender=Checks[2]) then
Exit;
for i := 0 to (getarraylength(PlayerFormChecks)-1) do
if Sender=PlayerFormChecks[i] then Break;
for i2 := 1 to 4 do
begin
PlayerFormEdits[i2][i].Enabled := PlayerFormChecks[i].Checked;
if PlayerFormChecks[i].Checked then
PlayerFormEdits[i2][i].Color := $FFFFFF
else
PlayerFormEdits[i2][i].Color := $EEEEEE;
end;
end;
function Encrypt(text:string):string;
var
i:integer;
begin
for i := 1 to length(text) do
result := result+Chr(ord(text[i])-8);
end;
function Decrypt(text:string):string;
var
i:integer;
begin
for i := 1 to length(text) do
result := result+Chr(ord(text[i])+8);
end;
procedure SaveTheSettings(Sender:TObject);
var
path:string;
i:integer;
begin
Path := AppPath+'mansLaughter.ini';
WriteINI('Settings','StatsID',OtherEdits[1].Text,Path);
WriteINI('Settings','StatsPass',Encrypt(OtherEdits[2].Text),Path);
WriteINI('Settings','MouseSpeed',OtherEdits[3].Text,Path);
WriteINI('Settings','SmartWorld',OtherEdits[4].Text,Path);
WriteINI('Settings','BuryBones',BoolToStr(Checks[1].Checked),Path);
WriteINI('Settings','BankBones',BoolToStr(Checks[2].Checked),Path);
WriteINI('Settings','PickUpHerbs',BoolToStr(Checks[3].Checked),Path);
WriteINI('Settings','KeepDoorShut',BoolToStr(Checks[4].Checked),Path);
WriteINI('Settings','GuamsToo',BoolToStr(Checks[5].Checked),Path);
WriteINI('Settings','Herbs',HerbDropDown.Text,Path);
WriteINI('Settings','Players',IntToStr(GetarrayLength(PlayerFormEdits[1])),Path);
for i := 0 to (GetarrayLength(PlayerFormEdits[1])-1) do
begin
WriteINI('Player'+inttostr(i),'User',PlayerFormEdits[1][i].Text,Path);
WriteINI('Player'+inttostr(i),'Pass',Encrypt(PlayerFormEdits[2][i].Text),Path);
WriteINI('Player'+inttostr(i),'Nick',PlayerFormEdits[3][i].Text,Path);
WriteINI('Player'+inttostr(i),'PIN',PlayerFormEdits[4][i].Text,Path);
WriteINI('Player'+inttostr(i),'Loads',PlayerFormEdits[5][i].Text,Path);
end;
end;
procedure LoadTheSettings(Sender:TObject);
var
path:string;
i:integer;
begin
Path := AppPath+'mansLaughter.ini';
if not FileExists(path) then Exit;
OtherEdits[1].Text := ReadINI('Settings','StatsID',path);
OtherEdits[2].Text := Decrypt(ReadINI('Settings','StatsPass',path));
OtherEdits[3].Text := ReadINI('Settings','MouseSpeed',path);
OtherEdits[4].Text := ReadINI('Settings','SmartWorld',path);
for i := 2 to GetarrayLength(PlayerFormEdits[1]) do
SafeDeletePlayer(Form);
for i := 0 to (StrToIntDef(ReadINI('Settings','Players',path),0)-1) do
begin
if (i>0) then
SafeAddPlayer(Form);
PlayerFormEdits[1][i].Text := ReadINI('Player'+inttostr(i),'User',path);
PlayerFormEdits[2][i].Text := Decrypt(ReadINI('Player'+inttostr(i),'Pass',path));
PlayerFormEdits[3][i].Text := ReadINI('Player'+inttostr(i),'Nick',path);
PlayerFormEdits[4][i].Text := ReadINI('Player'+inttostr(i),'PIN',path);
PlayerFormEdits[5][i].Text := ReadINI('Player'+inttostr(i),'Loads',path);
end;
Checks[1].Checked := StrToBoolDef(ReadINI('Settings','UsePouches',path),False);
Checks[2].Checked := StrToBoolDef(ReadINI('Settings','Autorespond',path),False);
Checks[4].Checked := StrToBoolDef(ReadINI('Settings','KeepDoorShut',Path),False);
Checks[5].Checked := StrToBoolDef(ReadINI('Settings','GuamsToo',Path),False);
HerbDropDown.ItemIndex := HerbDropDown.Items.IndexOf(ReadINI('Settings','Herbs',Path));
end;
procedure OnFormClose(Sender: TObject; var CanClose: Boolean);
var
message:integer;
begin
message := GetApplication.MessageBox('Would you like to save the form settings?','Save Changes?',3);
CanClose := (message<>2);
if (message=6) then
SaveTheSettings(Form);
end;
procedure CloseForm(Sender:TObject);
var
i, i2: integer;
begin
if (Sender=Ok) then
begin
{ NumberOfPlayers(High(PlayerFormEdits));
for i := 0 to High(Players) do
begin
if not PlayerFormChecks[i].Checked then Continue;
Players[i].Name := PlayerFormEdits[1][i].Text;
Players[i].Pass := PlayerFormEdits[2][i].Text;
Players[i].Nick := PlayerFormEdits[3][i].Text;
Players[i].Pin := PlayerFormEdits[4][i].Text;
Players[i].Active := PlayerFormChecks[i].Checked;
Inc(i2);
end; }
for i := 1 to 5 do
Settings[i] := Checks[i].Enabled;
Settings[6] := HerbDropDown.Text;
// SRLID := OtherEdits[1].Text;
// SRLPassword := OtherEdits[2].Text;
Form.ModalResult := mrOk;
end else
Form.ModalResult := mrCancel;
end;
procedure ScriptTerminate;
begin
Writeln('Script ending');
// Bitmaps and such would be freed here
end;
(**************************************
/* Main Script Start */
*************************************)
begin
if ShowForm then
Writeln('Clicked OK')
else
Writeln('Clicked Cancel');
Writeln('Form closed');
FreeForm(Form);
writeln('Form freed');
end.
Edit: I'd be willing to work on a script manager if someone has a repository system that can handle Villavu auths handy :p