SRL Archive - SRL Archives

New SRLPlayerForm


Richard

2009-04-19 18:08:14

(For misc/users.scar)

Me and Zeph have been working on an update for the SRLPlayerForm, adding buttons to the bottom, and adding PIN and RewardBox support. The new fields were added by Zeph, and the buttons by me:


and buttons at the top:

EDIT by Zeph: What do you guys think? Buttons at the top, the bottom or none at all. I'd like to get a community opinion before I add it to SRL. Thanks.

//-----------------------------------------------------------------//
//-- Scar Standard Resource Library --//
//-- ยป User Manager Routines --//
//-----------------------------------------------------------------//
// * procedure LoadCheckListForm; | by Sumilion
// * procedure ShowCheckListFormModal; | by Sumilion
// * procedure ShowCheckListForm; | by Sumilion
// * procedure SavePlayers(Create: Boolean); | by Starblaster100
// * procedure LoadPlayers(SetPlayers: Boolean); | by Starblaster100
// * procedure SwitchInTabArray(NewPlace, OldPlace: Integer; var V: array of TTabSheet); | by Sumilion
// * procedure SwitchInEditArray(NewPlace, OldPlace: Integer; var V: array of TEdit); | by Sumilion
// * procedure SwitchInComboArray(NewPlace, OldPlace: Integer; var V: array of TComboBox); | by Sumilion
// * procedure OnSRLPFMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); | by Sumilion
// * procedure OnSRLPFDragDrop(Sender, Source: TObject; X, Y: Integer); | by Sumilion
// * procedure OnSRLPFDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); | by Sumilion
// * procedure DeleteInEditArray(SpotToDelete: Integer; var V: array of TEdit); | by Sumilion
// * procedure DeleteInEditArrayOfArray(SpotToDelete: Integer; var V: array of array of TEdit); | by Sumilion
// * procedure DeleteInEditArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TEdit); | by Sumilion
// * procedure DeleteInComboArray(SpotToDelete: Integer; var V: array of TComboBox); | by Sumilion
// * procedure DeleteInComboArrayOfArray(SpotToDelete: Integer; var V: array of array of TComboBox); | by Sumilion
// * procedure DeleteInComboArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TComboBox); | by Sumilion
// * procedure DeleteInTabArray(SpotToDelete: Integer; var V: array of TTabSheet); | by Sumilion
// * procedure DeleteInTabArrayOfArray(SpotToDelete: Integer; var V: array of array of TTabSheet); | by Sumilion
// * procedure DeleteInPageControlArray(SpotToDelete: Integer; var V: array of TPageControl); | by Sumilion
// * procedure SetLabelsParent(Parent: Integer); | by Sumilion
// * procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer); | by Sumilion
// * procedure ClearPlayerInTab(ArmyNumber, PlayerNumber: Integer); | by Sumilion
// * procedure AddPlayerInTab(ArmyNumber: Integer); | by Sumilion
// * procedure AddArmy; | by Sumilion
// * procedure DeleteArmy(ArmyNumber, NextArmyTab: Integer); | by Sumilion
// * procedure RenameArmy(ArmyNumber: Integer); | by Sumilion
// * procedure ExportPlayerData; | by Starblaster100 / Sumilion
// * procedure ImportPlayerData; | by Starblaster100 / Sumilion
// * procedure OnSRLPFMainMenuClick(Sender: TObject); | by Sumilion
// * procedure OnSRLPFClick(Sender: TObject); | by Sumilion/Richard/ZephyrsFury
// * procedure OnSRLPFShow(Sender: TObject); | by Sumilion
// * procedure SRLPFMenuClick(Sender: TObject); | by Sumilion
// * procedure SetSRLPlayerFormArrays; | by Sumilion
// * procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer); | by Sumilion
// * procedure LoadSRLPlayerForm; | by Sumilion/Richard/ZephyrsFury
// * procedure ShowSRLPFFormModal; | by Sumilion
// * procedure SRLPlayerForm(ShowForm: Boolean; Booleans, Integers, Strings, Extendeds: TStringArray); | by Sumilion

var
// Main form components
srl_PlayerForm : TForm;
srlpf_PreviousTabIndex, srlpf_Width, HowManyArmies, ActiveArmy: Integer;
srlpf_TerminateWhenDone, srlpf_SaveWhenDone: Boolean;
srlpf_ArmyPageControl : TPageControl;
srlpf_PlayerPageControl : array of TPageControl;
ArmyPages : array of TTabSheet;
ArmyNames : TStringArray;
PlayerPages : array of array of TTabSheet;
// Menu items
srlpf_ArmyPopUpMenu, srlpf_PlayerPopUpMenu: TPopupMenu;
srlpf_MainMenu: TMainMenu;
FileItem, PlayerControlItem, ArmyControlItem, ExitItem,
AddPlayerItem, DeletePlayersItem, ClearPlayersItem, SaveAndStart, SaveAndExit,
JustExitItem, JustStartItem, AddArmyItem, DeleteArmiesItem, ClearArmiesItem, RenameArmyItem,
ExportPlayersItem, ImportPlayersItem: TMenuItem;
AddArmyPopUp, DelArmyPopUp, ChangeArmyNamePopUp, ClearArmyPopUp, AddPlayerPopUp, DelPlayerPopUp, ClearPlayerPopUp: TMenuItem;
// All labels
arBooleanLabels, arIntegerLabels,
arStringLabels, arExtendedLabels : array of TLabel;
UserNameLabel, PasswordLabel, NickLabel, ActiveLabel, PinLabel, BoxRewardsLabel: TLabel;
// All changeable settings
arUserNameEdits, arPasswordEdits, arNickEdits, arPinEdits, arBoxRewardsEdits : array of array of TEdit;
arActiveComboBoxes : array of array of TComboBox;
arBooleanComboBoxes : array of array of array of TComboBox;
arIntegerEdits, arStringEdits, arExtendedEdits : array of array of array of TEdit;
// All buttons on the form
DelPlayerButton, AddPlayerButton, PreviousButton, ExitButton,
NextButton, StartButton, SaveStartButton, SaveExitButton: TButton;
// Arrays of variable settings
srlpf_Booleans, srlpf_Integers, srlpf_Strings, srlpf_Extendeds: TStringArray;
// CheckList form vars
CheckListForm : TForm;
SRLPFCheckListBox: TCheckListBox;
CheckListButton: TButton;
// Other
srlpf_SavePath: string;

procedure SetSRLPlayerFormArrays; forward;
procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer); forward;
procedure OnSRLPFShow(Sender: TObject); forward;
procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer); forward;
procedure OnSRLPFClick(Sender: TObject); forward;

{*******************************************************************************
procedure LoadCheckListForm;
By: Sumilion
Description: Initializes the check list form needed for Users.scar
*******************************************************************************}

procedure LoadCheckListForm;
var
ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;

CheckListForm.Position := poDesktopCenter;
CheckListForm.Width := 200;
CheckListForm.Height := 135;
CheckListForm.Color := clBtnFace;
CheckListForm.Font.Color := clWindowText;
CheckListForm.Font.Height := -11;
CheckListForm.Font.Name := 'MS Sans Serif';
CheckListForm.Font.Style := [];
CheckListForm.Visible := False;
CheckListForm.PixelsPerInch := 96;
CheckListForm.BorderIcons := [biSystemMenu];
CheckListForm.BorderStyle := bsSingle;

SRLPFCheckListBox.Parent := CheckListForm;
SRLPFCheckListBox.Width := CheckListForm.Width;
SRLPFCheckListBox.Height := CheckListForm.Height - 65;
SRLPFCheckListBox.Align := alTop;
SRLPFCheckListBox.ItemHeight := 13;

CheckListButton.Parent := CheckListForm;
CheckListButton.Left := 70;
CheckListButton.Top := 80;
CheckListButton.Width := 50;
CheckListButton.Height := 20;
CheckListButton.OnClick := @OnSRLPFClick;
end;

{*******************************************************************************
procedure ShowCheckListFormModal;
By: Sumilion
Description: Showes the form.
*******************************************************************************}

procedure ShowCheckListFormModal;
begin
CheckListForm.ShowModal;
end;

{*******************************************************************************
procedure ShowCheckListForm;
By: Sumilion
Description: Safely initializes and shows the form
*******************************************************************************}

procedure ShowCheckListForm;
var
v: TVariantArray;
begin
V := [];
ThreadSafeCall('LoadCheckListForm', V);
V := [];
ThreadSafeCall('ShowCheckListFormModal', V);
end;

{*******************************************************************************
procedure SavePlayers;
By: Starblaster100
Description: Saves the players to a file / creates a file when needed.
*******************************************************************************}

procedure SavePlayers;
var
ArmyIndex, i, j, k: Integer;
Begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;
WriteINI('General', 'HowManyArmies', IntToStr(Length(ArmyPages)), srlpf_SavePath);
WriteINI('General', 'ActiveArmy', IntToStr(ArmyIndex), srlpf_SavePath);
for i := 0 to GetArrayLength(ArmyPages) - 1 do
begin
WriteINI('ArmyPages', 'Name[' +IntToStr(i)+ ']', ArmyPages[i].Caption, srlpf_SavePath);
WriteINI('ArmyPages', 'Number[' +IntToStr(i)+ ']', IntToStr(Length(PlayerPages[i])), srlpf_SavePath);
end;
for k := 0 to Length(ArmyPages) - 1 do
begin
for i := 0 to Length(PlayerPages[k]) - 1 do
begin
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Username', arUserNameEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Password', arPasswordEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Nickname', arNickEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Active', arActiveComboBoxes[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Pin', arPinEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'BoxRewards', Replace(arBoxRewardsEdits[k][i].Text, ' ', ''), srlpf_SavePath);
for j := 0 to Length(srlpf_Booleans) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Booleans[' +IntToStr(j)+ ']', arBooleanComboBoxes[k][j][i].Text, srlpf_SavePath);
for j := 0 to Length(srlpf_Integers) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Integers[' +IntToStr(j)+ ']', arIntegerEdits[k][j][i].Text, srlpf_SavePath);
for j := 0 to Length(srlpf_Strings) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Strings[' +IntToStr(j)+ ']', arStringEdits[k][j][i].Text, srlpf_SavePath);
for j := 0 to Length(srlpf_Extendeds) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Extendeds[' +IntToStr(k)+ ']', arExtendedEdits[k][j][i].Text, srlpf_SavePath);
end;
end;
end;

{*******************************************************************************
procedure LoadPlayers(SetPlayers: Boolean);
By: Starblaster100
Description: Loads the players from a file
*******************************************************************************}

procedure LoadPlayers(SetPlayers: Boolean);
var
ArmyIndex, i, j, k: Integer;
Begin
HowManyArmies := StrToIntDef(ReadINI('General', 'HowManyArmies', srlpf_SavePath), 1);
ArmyIndex := StrToIntDef(ReadINI('General', 'ActiveArmy', srlpf_SavePath), 0);
ActiveArmy := ArmyIndex;
SetLength(ArmyPages, HowManyArmies);
SetLength(ArmyNames, HowManyArmies);
for i := 0 to HowManyArmies - 1 do
ArmyNames[i] := ReadINI('ArmyPages', 'Name[' +IntToStr(i)+ ']', srlpf_SavePath);

if(SetPlayers)then
begin
HowManyPlayers := StrToIntDef(ReadINI('ArmyPages', 'Number[' +IntToStr(ArmyIndex)+ ']', srlpf_SavePath), 1);
NumberOfPlayers(HowManyPlayers);

for i := 0 to HowManyPlayers - 1 do
begin
Players[i].Name := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Username', srlpf_SavePath);
Players[i].Pass := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Password', srlpf_SavePath);
Players[i].Nick := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Nickname', srlpf_SavePath);
Players[i].Active := StrToBoolDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Active', srlpf_SavePath), True);
Players[i].Pin := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Pin', srlpf_SavePath);
Players[i].BoxRewards := srl_Explode(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'BoxRewards', srlpf_SavePath), ',');

for j := 0 to Length(srlpf_Booleans) - 1 do
Players[i].Booleans[j] := StrToBoolDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Booleans[' +IntToStr(j)+ ']', srlpf_SavePath), True);

for j := 0 to Length(srlpf_Integers) - 1 do
Players[i].Integers[j] := StrToIntDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Integers[' +IntToStr(j)+ ']', srlpf_SavePath), 0);

for j := 0 to Length(srlpf_Strings) - 1 do
Players[i].Strings[j] := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Strings[' +IntToStr(j)+ ']', srlpf_SavePath);

for j := 0 to Length(srlpf_Extendeds) - 1 do
Players[i].Extendeds[j] := StrToFloatDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Extendeds[' +IntToStr(j)+ ']', srlpf_SavePath), 0.0);
end;
end else
begin
SetLength(PlayerPages, HowManyArmies);
for i := 0 to HowManyArmies - 1 do
begin
HowManyPlayers := StrToIntDef(ReadINI('ArmyPages', 'Number[' +IntToStr(i)+ ']', srlpf_SavePath), 1);
SetLength(PlayerPages[i], HowManyPlayers);
end;
SetSRLPlayerFormArrays;

for k := 0 to HowManyArmies - 1 do
begin
HowManyPlayers := StrToIntDef(ReadINI('ArmyPages', 'Number[' +IntToStr(k)+ ']', srlpf_SavePath), 1);
for i := 0 to HowManyPlayers - 1 do
begin
arUserNameEdits[k][i] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[k][i] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[k][i].PasswordChar := '*';
arNickEdits[k][i] := TEdit.Create(srl_PlayerForm);
arActiveComboBoxes[k][i] := TComboBox.Create(srl_PlayerForm);
arPinEdits[k][i] := TEdit.Create(srl_PlayerForm);
arBoxRewardsEdits[k][i] := TEdit.Create(srl_PlayerForm);

arUserNameEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Username', srlpf_SavePath);
arPassWordEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Password', srlpf_SavePath);
arNickEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Nickname', srlpf_SavePath);
arActiveComboBoxes[k][i].Text := BoolToStr(StrToBoolDef(ReadINI(IntToStr(k) +',' +IntToStr(i), 'Active', srlpf_SavePath), True));
arPinEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Pin', srlpf_SavePath);
arBoxRewardsEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'BoxRewards', srlpf_SavePath);

for j := 0 to Length(srlpf_Booleans) - 1 do
begin
arBooleanComboBoxes[k][j][i] := TComboBox.Create(srl_PlayerForm);
arBooleanComboBoxes[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Booleans[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

for j := 0 to Length(srlpf_Integers) - 1 do
begin
arIntegerEdits[k][j][i] := TEdit.Create(srl_PlayerForm);
arIntegerEdits[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Integers[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

for j := 0 to Length(srlpf_Strings) - 1 do
begin
arStringEdits[k][j][i] := TEdit.Create(srl_PlayerForm);
arStringEdits[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Strings[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

for j := 0 to Length(srlpf_Extendeds) - 1 do
begin
arExtendedEdits[k][j][i] := TEdit.Create(srl_PlayerForm);
arExtendedEdits[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Extendeds[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

end;
end;
end;
end;

{*******************************************************************************
procedure SwitchInTabArray(NewPlace, OldPlace: Integer; var V: array of TTabSheet);
By: Sumilion
Description: Switches values in a TTabSheet array
*******************************************************************************}

procedure SwitchInTabArray(NewPlace, OldPlace: Integer; var V: array of TTabSheet);
var
k: Integer;
TempVarArray, TempAffectedArray: array of TTabSheet;
begin
SetLength(TempVarArray, Length(V));
SetLength(TempAffectedArray, 1 + (iAbs(OldPlace - NewPlace)));
for k := 0 to Length(V) - 1 do
TempVarArray[k] := V[k];
TempVarArray[NewPlace] := V[OldPlace];
if(OldPlace > NewPlace)then
begin
for k := NewPlace to OldPlace - 1 do
TempAffectedArray[k - NewPlace] := V[k];
for k := NewPlace + 1 to OldPlace do
TempVarArray[k] := TempAffectedArray[k - (NewPlace + 1)];
end else
begin
for k := OldPlace + 1 to NewPlace do
TempAffectedArray[k - (OldPlace + 1)] := V[k];
for k := OldPlace to NewPlace - 1 do
TempVarArray[k] := TempAffectedArray[k - OldPlace];
end;

V := TempVarArray;
end;

{*******************************************************************************
procedure SwitchInEditArray(NewPlace, OldPlace: Integer; var V: array of TEdit);
By: Sumilion
Description: Switches values in a TEdit array
*******************************************************************************}

procedure SwitchInEditArray(NewPlace, OldPlace: Integer; var V: array of TEdit);
var
k: Integer;
TempVarArray, TempAffectedArray: array of TEdit;
begin
SetLength(TempVarArray, Length(V));
SetLength(TempAffectedArray, 1 + (iAbs(OldPlace - NewPlace)));
for k := 0 to Length(V) - 1 do
TempVarArray[k] := V[k];
TempVarArray[NewPlace] := V[OldPlace];
if(OldPlace > NewPlace)then
begin
for k := NewPlace to OldPlace - 1 do
TempAffectedArray[k - NewPlace] := V[k];
for k := NewPlace + 1 to OldPlace do
TempVarArray[k] := TempAffectedArray[k - (NewPlace + 1)];
end else
begin
for k := OldPlace + 1 to NewPlace do
TempAffectedArray[k - (OldPlace + 1)] := V[k];
for k := OldPlace to NewPlace - 1 do
TempVarArray[k] := TempAffectedArray[k - OldPlace];
end;

V := TempVarArray;
end;

{*******************************************************************************
procedure SwitchInComboArray(NewPlace, OldPlace: Integer; var V: array of TComboBox);
By: Sumilion
Description: Switches values in a TComboBox array
*******************************************************************************}

procedure SwitchInComboArray(NewPlace, OldPlace: Integer; var V: array of TComboBox);
var
k: Integer;
TempVarArray, TempAffectedArray: array of TComboBox;
begin
SetLength(TempVarArray, Length(V));
SetLength(TempAffectedArray, 1 + (iAbs(OldPlace - NewPlace)));
for k := 0 to Length(V) - 1 do
TempVarArray[k] := V[k];
TempVarArray[NewPlace] := V[OldPlace];
if(OldPlace > NewPlace)then
begin
for k := NewPlace to OldPlace - 1 do
TempAffectedArray[k - NewPlace] := V[k];
for k := NewPlace + 1 to OldPlace do
TempVarArray[k] := TempAffectedArray[k - (NewPlace + 1)];
end else
begin
for k := OldPlace + 1 to NewPlace do
TempAffectedArray[k - (OldPlace + 1)] := V[k];
for k := OldPlace to NewPlace - 1 do
TempVarArray[k] := TempAffectedArray[k - OldPlace];
end;

V := TempVarArray;
end;

{*******************************************************************************
procedure OnSRLPFMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
By: Sumilion
Description: Form action on Mouse click
*******************************************************************************}

procedure OnSRLPFMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
i, ArmyIndex: Integer;
MousePosPoint: TPoint;
RightClick: Boolean;
begin
RightClick := Button;
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;
case Sender of
srlpf_PlayerPageControl[ArmyIndex]:
begin
if(RightClick)then
begin
srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex := srlpf_PlayerPageControl[ArmyIndex].IndexOfTabAt(x, y);
MousePosPoint := srlpf_PlayerPageControl[ArmyIndex].ClientToScreen(IntToPoint(x, y));
srlpf_PlayerPopUpMenu.Popup(MousePosPoint.x, MousePosPoint.y);
end;
if(ssCtrl in Shift)and(not RightClick)then
begin
srlpf_PlayerPageControl[ArmyIndex].BeginDrag(False);
srlpf_PreviousTabIndex := srlpf_PlayerPageControl[ArmyIndex].ActivePage.PageIndex;
end;
end;
srlpf_ArmyPageControl:
begin
if(RightClick)then
begin
srlpf_ArmyPageControl.ActivePageIndex := srlpf_ArmyPageControl.IndexOfTabAt(x, y);
MousePosPoint := srlpf_ArmyPageControl.ClientToScreen(IntToPoint(x, y));
srlpf_ArmyPopUpMenu.Popup(MousePosPoint.x, MousePosPoint.y);
end;
end;
end;
for i := 0 to Length(PlayerPages[ArmyIndex]) - 1 do
begin
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;
end;

{*******************************************************************************
procedure OnSRLPFDragDrop(Sender, Source: TObject; X, Y: Integer);
By: Sumilion
Description: Form action on drag drop
*******************************************************************************}

procedure OnSRLPFDragDrop(Sender, Source: TObject; X, Y: Integer);
var
i, ArmyIndex, PlayerIndex : Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePage.PageIndex;

srlpf_PlayerPageControl[ArmyIndex].ActivePage.PageIndex := srlpf_PlayerPageControl[ArmyIndex].IndexOfTabAt(X, Y);

PlayerIndex := srlpf_PlayerPageControl[ArmyIndex].ActivePage.PageIndex;

SwitchInTabArray(PlayerIndex, srlpf_PreviousTabIndex, PlayerPages[ArmyIndex]);

SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arUserNameEdits[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arPasswordEdits[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arNickEdits[ArmyIndex]);
SwitchInComboArray(PlayerIndex, srlpf_PreviousTabIndex, arActiveComboBoxes[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arPinEdits[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arBoxRewardsEdits[ArmyIndex]);

for i := 0 to Length(srlpf_Booleans) - 1 do
SwitchInComboArray(PlayerIndex, srlpf_PreviousTabIndex, arBooleanComboBoxes[ArmyIndex][i]);

for i := 0 to Length(srlpf_Integers) - 1 do
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arIntegerEdits[ArmyIndex][i]);

for i := 0 to Length(srlpf_Strings) - 1 do
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arStringEdits[ArmyIndex][i]);

for i := 0 to Length(srlpf_Extendeds) - 1 do
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arExtendedEdits[ArmyIndex][i]);

for i := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;

{*******************************************************************************
procedure OnSRLPFDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
By: Sumilion
Description: Form action on drag over
*******************************************************************************}

procedure OnSRLPFDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := (Sender is TPageControl);
end;

{*******************************************************************************
procedure DeleteInEditArray(SpotToDelete: Integer; var V: array of TEdit);
By: Sumilion
Description: Deletes a value in a TEdit array
*******************************************************************************}

procedure DeleteInEditArray(SpotToDelete: Integer; var V: array of TEdit);
var
k, l: Integer;
TempVarArray: array of TEdit;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInEditArrayOfArray(SpotToDelete: Integer; var V: array of array of TEdit);
By: Sumilion
Description: Deletes a value in a TEdit array
*******************************************************************************}

procedure DeleteInEditArrayOfArray(SpotToDelete: Integer; var V: array of array of TEdit);
var
k, l: Integer;
TempVarArray: array of array of TEdit;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInEditArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TEdit);
By: Sumilion
Description: Deletes a value in a TEdit array
*******************************************************************************}

procedure DeleteInEditArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TEdit);
var
k, l: Integer;
TempVarArray: array of array of array of TEdit;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInComboArray(SpotToDelete: Integer; var V: array of TComboBox);
By: Sumilion
Description: Deletes a value in a TComboBox array
*******************************************************************************}

procedure DeleteInComboArray(SpotToDelete: Integer; var V: array of TComboBox);
var
k, l: Integer;
TempVarArray: array of TComboBox;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInComboArrayOfArray(SpotToDelete: Integer; var V: array of array of TComboBox);
By: Sumilion
Description: Deletes a value in a TComboBox array
*******************************************************************************}

procedure DeleteInComboArrayOfArray(SpotToDelete: Integer; var V: array of array of TComboBox);
var
k, l: Integer;
TempVarArray: array of array of TComboBox;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInComboArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TComboBox);
By: Sumilion
Description: Deletes a value in a TComboBox array
*******************************************************************************}

procedure DeleteInComboArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TComboBox);
var
k, l: Integer;
TempVarArray: array of array of array of TComboBox;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInTabArray(SpotToDelete: Integer; var V: array of TTabSheet);
By: Sumilion
Description: Deletes a value in a TTabSheet array
*******************************************************************************}

procedure DeleteInTabArray(SpotToDelete: Integer; var V: array of TTabSheet);
var
k, l: Integer;
TempVarArray: array of TTabSheet;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInTabArrayOfArray(SpotToDelete: Integer; var V: array of array of TTabSheet);
By: Sumilion
Description: Deletes a value in a TTabSheet array
*******************************************************************************}

procedure DeleteInTabArrayOfArray(SpotToDelete: Integer; var V: array of array of TTabSheet);
var
k, l: Integer;
TempVarArray: array of array of TTabSheet;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInPageControlArray(SpotToDelete: Integer; var V: array of TPageControl);
By: Sumilion
Description: Deletes a value in a TTabSheet array
*******************************************************************************}

procedure DeleteInPageControlArray(SpotToDelete: Integer; var V: array of TPageControl);
var
k, l: Integer;
TempVarArray: array of TPageControl;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure SetLabelsParent(Parent: Integer);
By: Sumilion
Description: Sets all labels to the desired parent
*******************************************************************************}

procedure SetLabelsParent(Army, Tab: Integer);
var
i: Integer;
begin
UserNameLabel.Parent := PlayerPages[Army][Tab];
PasswordLabel.Parent := PlayerPages[Army][Tab];
NickLabel.Parent := PlayerPages[Army][Tab];
ActiveLabel.Parent := PlayerPages[Army][Tab];
PinLabel.Parent := PlayerPages[Army][Tab];
BoxRewardsLabel.Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Booleans) - 1 do
arBooleanLabels[i].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Integers) - 1 do
arIntegerLabels[i].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Strings) - 1 do
arStringLabels[i].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Extendeds) - 1 do
arExtendedLabels[i].Parent := PlayerPages[Army][Tab];
end;

{*******************************************************************************
procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer);
By: Sumilion
Description: Deletes a player in a desired tab and goes to the next desired tab.
*******************************************************************************}

procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer);
var
i, d, ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;

if(srlpf_PlayerPageControl[ArmyIndex].PageCount = 1)then
Exit;

if(NextPlayerTab < 0)then
NextPlayerTab := 0;
for i := PlayerNumber + 1 to Length(PlayerPages[ArmyNumber]) - 1 do
begin
arUserNameEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arPasswordEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arNickEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arActiveComboBoxes[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arPinEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arBoxRewardsEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Booleans) - 1 do
arBooleanComboBoxes[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Integers) - 1 do
arIntegerEdits[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Strings) - 1 do
arStringEdits[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Extendeds) - 1 do
arExtendedEdits[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

end;

PlayerPages[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1].Free;

SetLength(PlayerPages[ArmyNumber], srlpf_PlayerPageControl[ArmyNumber].PageCount);

DeleteInEditArray(PlayerNumber, arUserNameEdits[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arPasswordEdits[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arNickEdits[ArmyNumber]);
DeleteInComboArray(PlayerNumber, arActiveComboBoxes[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arPinEdits[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arBoxRewardsEdits[ArmyNumber]);
for d := 0 to Length(srlpf_Booleans) - 1 do
DeleteInComboArray(PlayerNumber, arBooleanComboBoxes[ArmyNumber][d]);

for d := 0 to Length(srlpf_Integers) - 1 do
DeleteInEditArray(PlayerNumber, arIntegerEdits[ArmyNumber][d]);

for d := 0 to Length(srlpf_Strings) - 1 do
DeleteInEditArray(PlayerNumber, arStringEdits[ArmyNumber][d]);

for d := 0 to Length(srlpf_Extendeds) - 1 do
DeleteInEditArray(PlayerNumber, arExtendedEdits[ArmyNumber][d]);

srlpf_ArmyPageControl.ActivePageIndex := ArmyIndex;
srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex := NextPlayerTab;
if(srlpf_PlayerPageControl[ArmyIndex].PageCount = 1)then
srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex := 0;
end;

{*******************************************************************************
procedure ClearPlayerInTab(ArmyNumber, PlayerNumber: Integer);
By: Sumilion
Description: Clears player settings in tab
*******************************************************************************}

procedure ClearPlayerInTab(ArmyNumber, PlayerNumber: Integer);
var
i: Integer;
begin
arUserNameEdits[ArmyNumber][PlayerNumber].Text := '';
arPasswordEdits[ArmyNumber][PlayerNumber].Text := '';
arNickEdits[ArmyNumber][PlayerNumber].Text := '';
arActiveComboBoxes[ArmyNumber][PlayerNumber].Text := 'True';
arPinEdits[ArmyNumber][PlayerNumber].Text := '';
arBoxRewardsEdits[ArmyNumber][PlayerNumber].Text := '';

for i := 0 to Length(arBooleanComboBoxes[ArmyNumber]) - 1 do
arBooleanComboBoxes[ArmyNumber][i][PlayerNumber].Text := 'False';

for i := 0 to Length(arIntegerEdits[ArmyNumber]) - 1 do
arIntegerEdits[ArmyNumber][i][PlayerNumber].Text := '';

for i := 0 to Length(arStringEdits[ArmyNumber]) - 1 do
arStringEdits[ArmyNumber][i][PlayerNumber].Text := '';

for i := 0 to Length(arExtendedEdits[ArmyNumber]) - 1 do
arExtendedEdits[ArmyNumber][i][PlayerNumber].Text := '';

PlayerPages[ArmyNumber][PlayerNumber].Caption := 'Player ' + IntToStr(PlayerNumber);
end;

{*******************************************************************************
procedure AddPlayerInTab(ArmyNumber: Integer);
By: Sumilion
Description: Deletes a player in a desired tab and goes to the next desired tab.
*******************************************************************************}

procedure AddPlayerInTab(ArmyNumber: Integer);
var
i: Integer;
begin
SetLength(PlayerPages[ArmyNumber], Length(PlayerPages[ArmyNumber]) + 1);
SetSRLPlayerFormArrays;

arUserNameEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arNickEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arActiveComboBoxes[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TComboBox.Create(srl_PlayerForm);
arActiveComboBoxes[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1].Text := 'True';
arPinEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arBoxRewardsEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arBooleanComboBoxes[ArmyNumber]) - 1 do
arBooleanComboBoxes[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TComboBox.Create(srl_PlayerForm);

for i := 0 to Length(arIntegerEdits[ArmyNumber]) - 1 do
arIntegerEdits[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arStringEdits[ArmyNumber]) - 1 do
arStringEdits[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arExtendedEdits[ArmyNumber]) - 1 do
arExtendedEdits[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

FillSRLPlayerFormTab(ArmyNumber, Length(PlayerPages[ArmyNumber]) - 1);
if(ArmyNumber = srlpf_ArmyPageControl.ActivePageIndex)then
srlpf_PlayerPageControl[ArmyNumber].ActivePageIndex := Length(PlayerPages[ArmyNumber]) - 1;
end;

{*******************************************************************************
procedure AddArmy;
By: Sumilion
Description: Adds an army to the form
*******************************************************************************}

procedure AddArmy;
var
i: Integer;
begin
SetLength(ArmyPages, Length(ArmyPages) + 1);
SetLength(srlpf_PlayerPageControl, Length(ArmyPages));

ArmyPages[Length(ArmyPages) - 1] := TTabSheet.Create(srl_PlayerForm);
ArmyPages[Length(ArmyPages) - 1].Caption := 'Army ' + IntToStr(Length(ArmyPages) - 1);
ArmyPages[Length(ArmyPages) - 1].PageControl := srlpf_ArmyPageControl;
ArmyPages[Length(ArmyPages) - 1].OnShow := @OnSRLPFShow;

srlpf_PlayerPageControl[Length(ArmyPages) - 1] := TPageControl.Create(srl_PlayerForm);
with srlpf_PlayerPageControl[Length(ArmyPages) - 1] do
begin
Parent := ArmyPages[Length(ArmyPages) - 1];
Width := ArmyPages[Length(ArmyPages) - 1].Width;
Height := ArmyPages[Length(ArmyPages) - 1].Height;
Align := alBottom;
OnMouseDown := @OnSRLPFMouseDown;
OnDragDrop := @OnSRLPFDragDrop;
OnDragOver := @OnSRLPFDragOver;
end;

SetLength(PlayerPages, Length(ArmyPages));
SetLength(PlayerPages[Length(ArmyPages) - 1], 1);
SetSRLPlayerFormArrays;

arUserNameEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arNickEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arActiveComboBoxes[Length(ArmyPages) - 1][0] := TComboBox.Create(srl_PlayerForm);
arActiveComboBoxes[Length(ArmyPages) - 1][0].Text := 'True';
arPinEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arBoxRewardsEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arBooleanComboBoxes[Length(ArmyPages) - 1]) - 1 do
arBooleanComboBoxes[Length(ArmyPages) - 1][i][0] := TComboBox.Create(srl_PlayerForm);

for i := 0 to Length(arIntegerEdits[Length(ArmyPages) - 1]) - 1 do
arIntegerEdits[Length(ArmyPages) - 1][i][0] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arStringEdits[Length(ArmyPages) - 1]) - 1 do
arStringEdits[Length(ArmyPages) - 1][i][0] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arExtendedEdits[Length(ArmyPages) - 1]) - 1 do
arExtendedEdits[Length(ArmyPages) - 1][i][0] := TEdit.Create(srl_PlayerForm);

FillSRLPlayerFormTab(Length(ArmyPages) - 1, 0);

srlpf_ArmyPageControl.ActivePageIndex := Length(ArmyPages) - 1;
end;

{*******************************************************************************
procedure DeleteArmy(ArmyNumber, NextArmyTab: Integer);
By: Sumilion
Description: Deletes an army in the form
*******************************************************************************}

procedure DeleteArmy(ArmyNumber, NextArmyTab: Integer);
var
i, j: Integer;
begin
if(NextArmyTab < 0)then
NextArmyTab := 0;
if(srlpf_ArmyPageControl.PageCount = 1)then
Exit;
if Armynumber > 0 then
srlpf_ArmyPageControl.ActivePageIndex := NextArmyTab
else
srlpf_ArmyPageControl.ActivePageIndex := 0;
if((srlpf_ArmyPageControl.PageCount - 1) > ArmyNumber)then
j := ArmyNumber + 1
else
j := ArmyNumber - 1;

for i := ArmyNumber + 1 to Length(ArmyPages) - 1 do
begin
srlpf_PlayerPageControl[i].Parent := ArmyPages[i - 1];
ArmyPages[i - 1].Caption := ArmyPages[i].Caption;
end;

srlpf_PlayerPageControl[ArmyNumber].Free;
ArmyPages[Length(ArmyPages) - 1].Free;
SetLength(ArmyPages, Length(ArmyPages) - 1);

DeleteInEditArrayOfArray(ArmyNumber, arUserNameEdits);
DeleteInEditArrayOfArray(ArmyNumber, arPasswordEdits);
DeleteInEditArrayOfArray(ArmyNumber, arNickEdits);
DeleteInComboArrayOfArray(ArmyNumber, arActiveComboBoxes);
DeleteInEditArrayOfArray(ArmyNumber, arPinEdits);
DeleteInEditArrayOfArray(ArmyNumber, arBoxRewardsEdits);
DeleteInComboArrayOfArrayOfArray(ArmyNumber, arBooleanComboBoxes);
DeleteInEditArrayOfArrayOfArray(ArmyNumber, arIntegerEdits);
DeleteInEditArrayOfArrayOfArray(ArmyNumber, arStringEdits);
DeleteInEditArrayOfArrayOfArray(ArmyNumber, arExtendedEdits);
DeleteInTabArrayOfArray(ArmyNumber, PlayerPages);
DeleteInPageControlArray(ArmyNumber, srlpf_PlayerPageControl);

srlpf_ArmyPageControl.ActivePageIndex := NextArmyTab;
//srlpf_PlayerPageControl[NextArmyTab].ActivePageIndex := 0;

for i := 0 to Length(ArmyPages) - 1 do
begin
if(Pos('Army', ArmyPages[i].Caption) = 1)then
ArmyPages[i].Caption := 'Army ' + IntToStr(i);
end;
end;

{*******************************************************************************
procedure RenameArmy(ArmyNumber: Integer);
By: Sumilion
Description: Renames an army's name
*******************************************************************************}

procedure RenameArmy(ArmyNumber: Integer);
var
ArmyName: string;
begin
ArmyName := Readln('New army name for : ' + ArmyPages[ArmyNumber].Caption +
Chr(13) + '(Leave blank for default)');
if(ArmyName = '')then
ArmyPages[ArmyNumber].Caption := 'Army ' + IntToStr(ArmyNumber)
else
ArmyPages[ArmyNumber].Caption := ArmyName;
end;

{*******************************************************************************
procedure ExportPlayerData;
By: Starblaster100 / Sumilion
Description: Turns the info input into the forms into a copy and pasteable
DeclarePlayers procedure
*******************************************************************************}

procedure ExportPlayerData;
var
i, j, ArmyIndex: Integer;
TempString: string;
OpenDialog1 : TSaveDialog;
a: TStringList;
begin
OpenDialog1 := TSaveDialog.Create(srl_PlayerForm);
a := TStringList.Create;

with OpenDialog1 do
begin
InitialDir := ScriptPath;
Filter := 'SCAR Scripts (*.scar)|*.scar|';
if(Execute)then
begin
if(ExtractFileExt(FileName) = '')then
TempString := FileName + '.scar'
else
TempString := FileName;
end else
begin
a.Free;
Free;
Exit;
end;
Free;
end;

ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;

a.Text := a.Text + 'procedure DeclarePlayers;' + Chr(13);
a.Text := a.Text + 'begin' + Chr(13);
a.Text := a.Text + ' NumberOfPlayers(' +IntToStr(Length(PlayerPages[ArmyIndex]))+ ');' + Chr(13);
a.Text := a.Text + ' HowManyBooleans := ' +IntToStr(Length(srlpf_Booleans))+ ';' + Chr(13);

for i := 0 to Length(PlayerPages[ArmyIndex])-1 do
begin
a.Text := a.Text + Chr(13);
if(arUserNameEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Name := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Name := ''' + arUserNameEdits[ArmyIndex][i].Text + ''';' + Chr(13);

if(arPasswordEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pass := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pass := ''' + arPasswordEdits[ArmyIndex][i].Text + ''';' + Chr(13);

if(arNickEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Nick := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Nick := ''' + arNickEdits[ArmyIndex][i].Text + ''';' + Chr(13);

a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Active := ' + arActiveComboBoxes[ArmyIndex][i].Text + ';' + Chr(13);

if(arPinEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pin := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pin := ''' + arPinEdits[ArmyIndex][i].Text + ''';' + Chr(13);

if(arBoxRewardsEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].BoxRewards := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].BoxRewards := ''' + arBoxRewardsEdits[ArmyIndex][i].Text + ''';' + Chr(13);

for j := 0 to Length(srlpf_Booleans) - 1 do
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Booleans[' + IntToStr(j) + '] := ' + arBooleanComboBoxes[ArmyIndex][j][i].Text + ';' + Chr(13);

for j := 0 to Length(srlpf_Integers) - 1 do
if(arIntegerEdits[ArmyIndex][j][i].Text = '')then
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Integers[' + IntToStr(j) + '] := 0;' + Chr(13)
else
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Integers[' + IntToStr(j) + '] := ' + arIntegerEdits[ArmyIndex][j][i].Text + ';' + Chr(13);

for j := 0 to Length(srlpf_Strings) - 1 do
if(arStringEdits[ArmyIndex][j][i].Text = '')then
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Strings[' + IntToStr(j) + '] := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Strings[' + IntToStr(j) + '] := ''' + arStringEdits[ArmyIndex][j][i].Text + ''';' + Chr(13);

for j := 0 to Length(srlpf_Extendeds) - 1 do
if(arExtendedEdits[ArmyIndex][j][i].Text = '')then
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Extendeds[' + IntToStr(j) + '] := 0.0;' + Chr(13)
else
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Extendeds[' + IntToStr(j) + '] := ' + arExtendedEdits[ArmyIndex][j][i].Text + ';' + Chr(13);
end;
a.Text := a.Text + 'end;' + Chr(13);

try
SaveToFile(a, TempString);
except
a.Free;
GetApplication.MessageBox('File not found!', '', 0);
Exit;
end;
end;

{*******************************************************************************
procedure ImportPlayerData;
By: Starblaster100 / Sumilion
Description: Inputs information from the DeclarePlayers procedure into the form
*******************************************************************************}

procedure ImportPlayerData;
var
i, j, ArmyIndex: Integer;
DeclarePlayers, TempString: string;
OpenDialog1 : TOpenDialog;
a: TStringList;
begin
OpenDialog1 := TOpenDialog.Create(srl_PlayerForm);
a := TStringList.Create;

with OpenDialog1 do
begin
InitialDir := ScriptPath;
Options := [ofFileMustExist, ofReadOnly];
Filter := 'SCAR Scripts (*.scar)|*.scar|' +
'Text Files (*.txt)|*.txt|' +
'All Files|*|';
if(Execute)then
TempString := FileName
else
begin
a.Free;
Free;
Exit;
end;
Free;
end;

try
LoadFromFile(a, TempString);
except
a.Free;
GetApplication.MessageBox('File not found!', '', 0);
Exit;
end;

DeclarePlayers := LowerCase(a.Text);
AddArmy;
a.Free;

HowManyPlayers := StrToIntDef(Between('numberofplayers(', ');', DeclarePlayers), 0);
if(HowManyPlayers = 0)then
HowManyPlayers := StrToIntDef(Between('howmanyplayers := ', ';', DeclarePlayers), 1);


ArmyIndex := srlpf_ArmyPageControl.PageCount - 1;
for i := 0 to HowManyPlayers - 2 do
AddPlayerInTab(ArmyIndex);

for i := 0 to HowManyPlayers - 1 do
begin
arUserNameEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].name := ''', ''';', DeclarePlayers);
arPassWordEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].pass := ''', ''';', DeclarePlayers);
arNickEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].nick := ''', ''';', DeclarePlayers);
arActiveComboBoxes[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].active := ', ';', DeclarePlayers);
arPinEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].pin := ''', ''';', DeclarePlayers);
arBoxRewardsEdits[ArmyIndex][i].Text := Replace(Between('players[' + IntToStr(i) + '].boxrewards := ''', ''';', DeclarePlayers), ' ', '');

for j := 0 to Length(srlpf_Booleans) - 1 do
arBooleanComboBoxes[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].booleans[' +IntToStr(j)+ '] := ', ';', DeclarePlayers);

for j := 0 to Length(srlpf_Integers) - 1 do
arIntegerEdits[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].integers[' +IntToStr(j)+ '] := ', ';', DeclarePlayers);

for j := 0 to Length(srlpf_Strings) - 1 do
arStringEdits[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].strings[' +IntToStr(j)+ '] := ''', ''';', DeclarePlayers);

for j := 0 to Length(srlpf_Extendeds) - 1 do
arExtendedEdits[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].extendeds[' +IntToStr(j)+ '] := ', ';', DeclarePlayers);

if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;
end;

{*******************************************************************************
procedure OnSRLPFMainMenuClick(Sender: TObject);
By: Sumilion
Description: Form actions on the MainMenu items
*******************************************************************************}

procedure OnSRLPFMainMenuClick(Sender: TObject);
var
i, j, ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePage.PageIndex;

case Sender of
AddPlayerItem: AddPlayerInTab(ArmyIndex);

DeletePlayersItem:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Delete';
CheckListForm.Caption := 'Delete Players :';
for i := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(PlayerPages[ArmyIndex][i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
if(srlpf_PlayerPageControl[ArmyIndex].PageCount > 1)then
if(i = ArmyIndex)then
DeletePlayerInTab(ArmyIndex, i, i - 1)
else
DeletePlayerInTab(ArmyIndex, i, ArmyIndex);
end;
FreeForm(CheckListForm);
end;

ClearPlayersItem:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Clear';
CheckListForm.Caption := 'Clear Players :';
for i := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(PlayerPages[ArmyIndex][i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
ClearPlayerInTab(ArmyIndex, i);
end;
FreeForm(CheckListForm);
end;

AddArmyItem: AddArmy;

DeleteArmiesItem:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Delete';
CheckListForm.Caption := 'Delete Armies :';
for i := 0 to srlpf_ArmyPageControl.PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(ArmyPages[i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
if(srlpf_ArmyPageControl.PageCount > 1)then
DeleteArmy(i, i - 1);
end;
FreeForm(CheckListForm);
end;

ClearArmiesItem:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Clear';
CheckListForm.Caption := 'Clear Armies :';
for i := 0 to srlpf_ArmyPageControl.PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(ArmyPages[i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
for j := 0 to srlpf_PlayerPageControl[i].PageCount - 1 do
ClearPlayerInTab(i, j);
end;
FreeForm(CheckListForm);
end;

RenameArmyItem: RenameArmy(ArmyIndex);

SaveAndStart: srl_PlayerForm.ModalResult := mrOk;

SaveAndExit:
begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;

JustExitItem:
begin
srlpf_SaveWhenDone := False;
srl_PlayerForm.ModalResult := mrOk;
end;

JustStartItem:
begin
srlpf_SaveWhenDone := False;
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;

ExportPlayersItem: ExportPlayerData;

ImportPlayersItem: ImportPlayerData;

end;
end;

{*******************************************************************************
procedure OnSRLPFClick(Sender: TObject);
By: Sumilion || edited by Richard and ZephyrsFury
Description: Form action on a click on a button
*******************************************************************************}

procedure OnSRLPFClick(Sender: TObject);
var
c, i, ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePage.PageIndex;

case Sender of
PreviousButton:
begin
srlpf_PlayerPageControl[ArmyIndex].ActivePage := srlpf_PlayerPageControl[ArmyIndex].FindNextPage(srlpf_PlayerPageControl[ArmyIndex].ActivePage,
False, True);
end;

DelPlayerButton:
begin
c := srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex;

DeletePlayerInTab(ArmyIndex, c, c - 1);
end;

AddPlayerButton: AddPlayerInTab(ArmyIndex);

NextButton: srlpf_PlayerPageControl[ArmyIndex].ActivePage := srlpf_PlayerPageControl[ArmyIndex].FindNextPage(srlpf_PlayerPageControl[ArmyIndex].ActivePage, True, True);

CheckListButton: CheckListForm.ModalResult := mrOk;

StartButton: begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_SaveWhenDone := False;
end;

ExitButton: Begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;

SaveExitButton: begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;

SaveStartButton: srl_PlayerForm.ModalResult := mrOk;

end;

for i := c to Length(PlayerPages[ArmyIndex]) - 1 do
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;

{*******************************************************************************
procedure OnSRLPFShow(Sender: TObject);
By: Sumilion
Description: Form action on a Tab show
*******************************************************************************}

procedure OnSRLPFShow(Sender: TObject);
var
i, j: Integer;
begin
for i := 0 to Length(ArmyPages) - 1 do
if(ArmyPages[i] = Sender)then
begin
SetLabelsParent(i, srlpf_PlayerPageControl[i].ActivePageIndex);
Exit;
end;

i := srlpf_ArmyPageControl.ActivePageIndex;

for j := 0 to Length(PlayerPages[i]) - 1 do
if(PlayerPages[i][j] = Sender)then
begin
SetLabelsParent(i, j);
Exit;
end;
end;

{*******************************************************************************
procedure SRLPFMenuClick(Sender: TObject);
By: Sumilion
Description: Form action on Menu click
*******************************************************************************}

procedure SRLPFMenuClick(Sender: TObject);
var
c, ArmyIndex, PlayerIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;
PlayerIndex := srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex;
case Sender of
AddArmyPopUp: AddArmy;

DelArmyPopUp:
begin
c := srlpf_ArmyPageControl.ActivePageIndex;
DeleteArmy(c, c - 1);
end;

ChangeArmyNamePopUp: RenameArmy(srlpf_ArmyPageControl.ActivePageIndex);

ClearArmyPopUp:
begin
for c := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
ClearPlayerInTab(ArmyIndex, c);
end;

AddPlayerPopUp: AddPlayerInTab(ArmyIndex);

DelPlayerPopUp:
begin
DeletePlayerInTab(ArmyIndex, PlayerIndex, PlayerIndex - 1);
for c := PlayerIndex to Length(PlayerPages[ArmyIndex]) - 1 do
if(arUserNameEdits[ArmyIndex][c].Text <> '')then
PlayerPages[ArmyIndex][c].Caption := arUserNameEdits[ArmyIndex][c].Text
else
PlayerPages[ArmyIndex][c].Caption := 'Player ' + IntToStr(c);
end;

ClearPlayerPopUp: ClearPlayerInTab(ArmyIndex, PlayerIndex);
end;
end;

{*******************************************************************************
procedure SetSRLPlayerFormArrays;
By: Sumilion
Description: Sets the arrays for the form
*******************************************************************************}

procedure SetSRLPlayerFormArrays;
var
i, j: Integer;
begin
SetLength(srlpf_PlayerPageControl, Length(ArmyPages));

SetLength(arUserNameEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arUserNameEdits[i], Length(PlayerPages[i]));

SetLength(arPasswordEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arPasswordEdits[i], Length(PlayerPages[i]));

SetLength(arNickEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arNickEdits[i], Length(PlayerPages[i]));

SetLength(arActiveComboBoxes, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arActiveComboBoxes[i], Length(PlayerPages[i]));

SetLength(arPinEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arPinEdits[i], Length(PlayerPages[i]));

SetLength(arBoxRewardsEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arBoxRewardsEdits[i], Length(PlayerPages[i]));

SetLength(arBooleanLabels, Length(srlpf_Booleans));
SetLength(arBooleanComboBoxes, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arBooleanComboBoxes[i], Length(srlpf_Booleans));
for j := 0 to Length(arBooleanComboBoxes[i]) - 1 do
SetLength(arBooleanComboBoxes[i][j], Length(PlayerPages[i]));
end;

SetLength(arIntegerLabels, Length(srlpf_Integers));
SetLength(arIntegerEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arIntegerEdits[i], Length(srlpf_Integers));
for j := 0 to Length(arIntegerEdits[i]) - 1 do
SetLength(arIntegerEdits[i][j], Length(PlayerPages[i]));
end;

SetLength(arStringLabels, Length(srlpf_Strings));
SetLength(arStringEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arStringEdits[i], Length(srlpf_Strings));
for j := 0 to Length(arStringEdits[i]) - 1 do
SetLength(arStringEdits[i][j], Length(PlayerPages[i]));
end;

SetLength(arExtendedLabels, Length(srlpf_Extendeds));
SetLength(arExtendedEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arExtendedEdits[i], Length(srlpf_Extendeds));
for j := 0 to Length(arExtendedEdits[i]) - 1 do
SetLength(arExtendedEdits[i][j], Length(PlayerPages[i]));
end;
end;

{*******************************************************************************
procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer);
By: Sumilion
Description: Fills the tabs with components
*******************************************************************************}

procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer);
var
a, b: Integer;
begin
b := 0;

PlayerPages[ArmyNumber][TabNumber] := TTabSheet.Create(srl_PlayerForm);

with PlayerPages[ArmyNumber][TabNumber] do
begin
if(arUserNameEdits[ArmyNumber][TabNumber].Text <> '')then
Caption := arUserNameEdits[ArmyNumber][TabNumber].Text
else
Caption := 'Player ' + IntToStr(TabNumber);
PageControl := srlpf_PlayerPageControl[ArmyNumber];
Parent := srlpf_PlayerPageControl[ArmyNumber];
OnMouseDown := @OnSRLPFMouseDown;
OnShow := @OnSRLPFShow;
end;

with arUserNameEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 53;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

with arPasswordEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 83;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

with arNickEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 113;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

with arActiveComboBoxes[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 143;
Width := 121;
Height := 21;
ItemHeight := 13;
TabOrder := 8;
OnClick := @OnSRLPFClick;
Items.Add('True');
Items.Add('False');
end;

with arPinEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 173;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

with arBoxRewardsEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

for a := 0 to Length(srlpf_Booleans) - 1 do
begin
b := b + 1;

with arBooleanLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Booleans[a] = '')then
Caption := 'Boolean[' + IntToStr(a) + ']'
else
Caption := srlpf_Booleans[a];
end;

with arBooleanComboBoxes[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203 + (b * 30);
Width := 121;
Height := 21;
ItemHeight := 13;
TabOrder := 8;
OnClick := @OnSRLPFClick;
if(Text = '')then
Text := 'False';
Items.Add('True');
Items.Add('False');
end;
end;

for a := 0 to Length(srlpf_Integers) - 1 do
begin
b := b + 1;

with arIntegerLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Integers[a] = '')then
Caption := 'Integer[' + IntToStr(a) + ']'
else
Caption := srlpf_Integers[a];
end;

with arIntegerEdits[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203 + (b * 30);
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;
end;

for a := 0 to Length(srlpf_Strings) - 1 do
begin
b := b + 1;

with arStringLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Strings[a] = '')then
Caption := 'String[' + IntToStr(a) + ']'
else
Caption := srlpf_Strings[a];
end;

with arStringEdits[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203 + (b * 30);
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;
end;

for a := 0 to Length(srlpf_Extendeds) - 1 do
begin
b := b + 1;

with arExtendedLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Extendeds[a] = '')then
Caption := 'Extended[' + IntToStr(a) + ']'
else
Caption := srlpf_Extendeds[a];
end;

with arExtendedEdits[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203 + (b * 30);
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;
end;
end;

{*******************************************************************************
procedure LoadSRLPlayerForm;
By: Sumilion || edited by Richard and ZephyrsFury
Description: Loads the main SRL player form
*******************************************************************************}

procedure LoadSRLPlayerForm;
var
i, j, ArmyIndex: Integer;
begin
srl_PlayerForm := CreateForm;
srl_PlayerForm.Position := poDesktopCenter;
srl_PlayerForm.Width := 243;
srl_PlayerForm.Height := 385 + (Length(srlpf_Booleans) * 30) + //285 + 30 +30 = 345 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) + // + extra 40 for buttons = 385
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
srl_PlayerForm.Caption := 'SRL Playerform';
srl_PlayerForm.Color := clWhite;
srl_PlayerForm.Font.Color := clWindowText;
srl_PlayerForm.Font.Height := -11;
srl_PlayerForm.Font.Name := 'MS Sans Serif';
srl_PlayerForm.Font.Style := [];
srl_PlayerForm.Visible := False;
srl_PlayerForm.PixelsPerInch := 96;
srl_PlayerForm.BorderIcons := [biSystemMenu];
srl_PlayerForm.BorderStyle := bsSingle;

srlpf_MainMenu := TMainMenu.Create(srl_PlayerForm);

FileItem := TMenuItem.Create(srl_PlayerForm);
FileItem.Caption := 'File';

ImportPlayersItem := TMenuItem.Create(srl_PlayerForm);
ImportPlayersItem.Caption := 'Import Players';
ImportPlayersItem.OnClick := @OnSRLPFMainMenuClick;

ExportPlayersItem := TMenuItem.Create(srl_PlayerForm);
ExportPlayersItem.Caption := 'Export Players';
ExportPlayersItem.OnClick := @OnSRLPFMainMenuClick;

srlpf_MainMenu.Items.Add(FileItem);
srlpf_MainMenu.Items.Items[0].Add(ImportPlayersItem);
srlpf_MainMenu.Items.Items[0].Add(ExportPlayersItem);

PlayerControlItem := TMenuItem.Create(srl_PlayerForm);
PlayerControlItem.Caption := 'Player Control';

AddPlayerItem := TMenuItem.Create(srl_PlayerForm);
AddPlayerItem.Caption := 'Add Player';
AddPlayerItem.OnClick := @OnSRLPFMainMenuClick;

DeletePlayersItem := TMenuItem.Create(srl_PlayerForm);
DeletePlayersItem.Caption := 'Delete Players';
DeletePlayersItem.OnClick := @OnSRLPFMainMenuClick;

ClearPlayersItem := TMenuItem.Create(srl_PlayerForm);
ClearPlayersItem.Caption := 'Clear Players';
ClearPlayersItem.OnClick := @OnSRLPFMainMenuClick;

srlpf_MainMenu.Items.Add(PlayerControlItem);
srlpf_MainMenu.Items.Items[1].Add(AddPlayerItem);
srlpf_MainMenu.Items.Items[1].Add(DeletePlayersItem);
srlpf_MainMenu.Items.Items[1].Add(ClearPlayersItem);

ArmyControlItem := TMenuItem.Create(srl_PlayerForm);
ArmyControlItem.Caption := 'Army Control';

AddArmyItem := TMenuItem.Create(srl_PlayerForm);
AddArmyItem.Caption := 'Add Army';
AddArmyItem.OnClick := @OnSRLPFMainMenuClick;

DeleteArmiesItem := TMenuItem.Create(srl_PlayerForm);
DeleteArmiesItem.Caption := 'Delete Armies';
DeleteArmiesItem.OnClick := @OnSRLPFMainMenuClick;

ClearArmiesItem := TMenuItem.Create(srl_PlayerForm);
ClearArmiesItem.Caption := 'Clear Armies';
ClearArmiesItem.OnClick := @OnSRLPFMainMenuClick;

RenameArmyItem := TMenuItem.Create(srl_PlayerForm);
RenameArmyItem.Caption := 'Rename Army';
RenameArmyItem.OnClick := @OnSRLPFMainMenuClick;

srlpf_MainMenu.Items.Add(ArmyControlItem);
srlpf_MainMenu.Items.Items[2].Add(AddArmyItem);
srlpf_MainMenu.Items.Items[2].Add(DeleteArmiesItem);
srlpf_MainMenu.Items.Items[2].Add(ClearArmiesItem);
srlpf_MainMenu.Items.Items[2].Add(RenameArmyItem);

ExitItem := TMenuItem.Create(srl_PlayerForm);
ExitItem.Caption := 'Exit';

SaveAndStart := TMenuItem.Create(srl_PlayerForm);
SaveAndStart.Caption := 'Save and Start';
SaveAndStart.OnClick := @OnSRLPFMainMenuClick;

SaveAndExit := TMenuItem.Create(srl_PlayerForm);
SaveAndExit.Caption := 'Save and Exit';
SaveAndExit.OnClick := @OnSRLPFMainMenuClick;

JustExitItem := TMenuItem.Create(srl_PlayerForm);
JustExitItem.Caption := 'Start';
JustExitItem.OnClick := @OnSRLPFMainMenuClick;

JustStartItem := TMenuItem.Create(srl_PlayerForm);
JustStartItem.Caption := 'Exit';
JustStartItem.OnClick := @OnSRLPFMainMenuClick;

srlpf_MainMenu.Items.Add(ExitItem);
srlpf_MainMenu.Items.Items[3].Add(SaveAndStart);
srlpf_MainMenu.Items.Items[3].Add(SaveAndExit);
srlpf_MainMenu.Items.Items[3].Add(JustExitItem);
srlpf_MainMenu.Items.Items[3].Add(JustStartItem);

srlpf_Width := 58;
for i := 0 to Length(srlpf_Booleans) - 1 do
begin
arBooleanLabels[i] := TLabel.Create(srl_PlayerForm);
arBooleanLabels[i].Caption := srlpf_Booleans[i];
srlpf_Width := Max(srlpf_Width, arBooleanLabels[i].Width);
end;

for i := 0 to Length(srlpf_Integers) - 1 do
begin
arIntegerLabels[i] := TLabel.Create(srl_PlayerForm);
arIntegerLabels[i].Caption := srlpf_Integers[i];
srlpf_Width := Max(srlpf_Width, arIntegerLabels[i].Width);
end;

for i := 0 to Length(srlpf_Strings) - 1 do
begin
arStringLabels[i] := TLabel.Create(srl_PlayerForm);
arStringLabels[i].Caption := srlpf_Strings[i];
srlpf_Width := Max(srlpf_Width, arStringLabels[i].Width);
end;

for i := 0 to Length(srlpf_Extendeds) - 1 do
begin
arExtendedLabels[i] := TLabel.Create(srl_PlayerForm);
arExtendedLabels[i].Caption := srlpf_Extendeds[i];
srlpf_Width := Max(srlpf_Width, arExtendedLabels[i].Width);
end;

srl_PlayerForm.Width := srl_PlayerForm.Width + srlpf_Width;

srlpf_ArmyPageControl := TPageControl.Create(srl_PlayerForm);
srlpf_ArmyPageControl.Parent := srl_PlayerForm;
srlpf_ArmyPageControl.Align := alNone;
srlpf_ArmyPageControl.Top := 0;
srlpf_ArmyPageControl.Width := srl_PlayerForm.Width;
srlpf_ArmyPageControl.Height := 305 + (Length(srlpf_Booleans) * 30) + //285 + 30 +30 = 345 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) +
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
srlpf_ArmyPageControl.OnMouseDown := @OnSRLPFMouseDown;
//srlpf_ArmyPageControl.OnChange := @OnSRLPFChange;

for i := 0 to Length(ArmyPages) - 1 do
begin
ArmyPages[i] := TTabSheet.Create(srl_PlayerForm);
if(ArmyNames[i] <> '')then
ArmyPages[i].Caption := ArmyNames[i]
else
ArmyPages[i].Caption := 'Army ' + IntToStr(i);
ArmyPages[i].PageControl := srlpf_ArmyPageControl;
ArmyPages[i].OnShow := @OnSRLPFShow;
end;
srlpf_ArmyPageControl.ActivePageIndex := ActiveArmy;
ArmyIndex := ActiveArmy;

SetSRLPlayerFormArrays;

for i := 0 to Length(srlpf_PlayerPageControl) - 1 do
begin
srlpf_PlayerPageControl[i] := TPageControl.Create(srl_PlayerForm);
srlpf_PlayerPageControl[i].Parent := ArmyPages[i];
srlpf_PlayerPageControl[i].Width := ArmyPages[i].Width;
srlpf_PlayerPageControl[i].Height := ArmyPages[i].Height;
srlpf_PlayerPageControl[i].Align := alBottom;
srlpf_PlayerPageControl[i].OnMouseDown := @OnSRLPFMouseDown;
srlpf_PlayerPageControl[i].OnDragDrop := @OnSRLPFDragDrop;
srlpf_PlayerPageControl[i].OnDragOver := @OnSRLPFDragOver;
end;

for j := 0 to Length(PlayerPages) - 1 do
for i := 0 to Length(PlayerPages[j]) - 1 do
FillSRLPlayerFormTab(j, i);

UserNameLabel := TLabel.Create(srl_PlayerForm);
UserNameLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
UserNameLabel.Top := 56;
UserNameLabel.Caption := 'Username';

PasswordLabel := TLabel.Create(srl_PlayerForm);
PasswordLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
PasswordLabel.Top := 86;
PasswordLabel.Caption := 'Password';

NickLabel := TLabel.Create(srl_PlayerForm);
NickLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
NickLabel.Top := 116;
NickLabel.Caption := 'Nickname';

ActiveLabel := TLabel.Create(srl_PlayerForm);
ActiveLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
ActiveLabel.Top := 146;
ActiveLabel.Caption := 'Active';

PinLabel := TLabel.Create(srl_PlayerForm);
PinLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
PinLabel.Top := 176;
PinLabel.Caption := 'Bank Pin';

BoxRewardsLabel := TLabel.Create(srl_PlayerForm);
BoxRewardsLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
BoxRewardsLabel.Top := 206;
BoxRewardsLabel.Caption := 'Box Rewards';

srlpf_ArmyPopUpMenu := TPopupMenu.Create(srlpf_ArmyPageControl);

AddArmyPopUp := TMenuItem.Create(srl_PlayerForm);
AddArmyPopUp.Caption := 'Add Army';
AddArmyPopUp.OnClick := @SRLPFMenuClick;

DelArmyPopUp := TMenuItem.Create(srl_PlayerForm);
DelArmyPopUp.Caption := 'Delete Army';
DelArmyPopUp.OnClick := @SRLPFMenuClick;

ChangeArmyNamePopUp := TMenuItem.Create(srl_PlayerForm);
ChangeArmyNamePopUp.Caption := 'Rename Army';
ChangeArmyNamePopUp.OnClick := @SRLPFMenuClick;

ClearArmyPopUp := TMenuItem.Create(srl_PlayerForm);
ClearArmyPopUp.Caption := 'Clear Army';
ClearArmyPopUp.OnClick := @SRLPFMenuClick;

srlpf_ArmyPopUpMenu.Items.Add(AddArmyPopUp);
srlpf_ArmyPopUpMenu.Items.Add(DelArmyPopUp);
srlpf_ArmyPopUpMenu.Items.Add(ChangeArmyNamePopUp);
srlpf_ArmyPopUpMenu.Items.Add(ClearArmyPopUp);

srlpf_PlayerPopUpMenu := TPopupMenu.Create(srl_PlayerForm);

AddPlayerPopUp := TMenuItem.Create(srl_PlayerForm);
AddPlayerPopUp.Caption := 'Add Player';
AddPlayerPopUp.OnClick := @SRLPFMenuClick;

DelPlayerPopUp := TMenuItem.Create(srl_PlayerForm);
DelPlayerPopUp.Caption := 'Delete Player';
DelPlayerPopUp.OnClick := @SRLPFMenuClick;

ClearPlayerPopUp := TMenuItem.Create(srl_PlayerForm);
ClearPlayerPopUp.Caption := 'Clear Player';
ClearPlayerPopUp.OnClick := @SRLPFMenuClick;

srlpf_PlayerPopUpMenu.Items.Add(AddPlayerPopUp);
srlpf_PlayerPopUpMenu.Items.Add(DelPlayerPopUp);
srlpf_PlayerPopUpMenu.Items.Add(ClearPlayerPopUp);

PreviousButton := TButton.Create(srl_PlayerForm);
PreviousButton.Parent := srl_PlayerForm;
PreviousButton.Left := (srl_PlayerForm.Width / 2) - 109;
PreviousButton.Top := 60;
PreviousButton.Width := 29;
PreviousButton.Height := 25;
PreviousButton.Caption := '<----';
PreviousButton.TabOrder := 8;
PreviousButton.OnClick := @OnSRLPFClick;

AddPlayerButton := TButton.Create(srl_PlayerForm);
AddPlayerButton.Parent := srl_PlayerForm;
AddPlayerButton.Left := (srl_PlayerForm.Width / 2) - 80;
AddPlayerButton.Top := 60;
AddPlayerButton.Width := 75;
AddPlayerButton.Height := 25;
AddPlayerButton.Caption := 'Add Player';
AddPlayerButton.TabOrder := 8;
AddPlayerButton.OnClick := @OnSRLPFClick;

DelPlayerButton := TButton.Create(srl_PlayerForm);
DelPlayerButton.Parent := srl_PlayerForm;
DelPlayerButton.Left := (srl_PlayerForm.Width / 2) - 5;
DelPlayerButton.Top := 60;
DelPlayerButton.Width := 75;
DelPlayerButton.Height := 25;
DelPlayerButton.Caption := 'Delete Player';
DelPlayerButton.TabOrder := 8;
DelPlayerButton.OnClick := @OnSRLPFClick;

NextButton := TButton.Create(srl_PlayerForm);
NextButton.Parent := srl_PlayerForm;
NextButton.Left := (srl_PlayerForm.Width / 2) + 70;
NextButton.Top := 60;
NextButton.Width := 29;
NextButton.Height := 25;
NextButton.Caption := '---->';
NextButton.TabOrder := 8;
NextButton.OnClick := @OnSRLPFClick;

StartButton := TButton.Create(srl_PlayerForm);
StartButton.Parent := srl_PlayerForm;
StartButton.Left := (srl_PlayerForm.Width / 2) - 130;
StartButton.Top := 310 + (Length(srlpf_Booleans) * 30) + //250 + 30 +30 = 310 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) +
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
StartButton.Width := 40;
StartButton.Height := 25;
StartButton.Caption := 'Start';
StartButton.TabOrder := 7;
StartButton.OnClick := @OnSRLPFClick;

ExitButton := TButton.Create(srl_PlayerForm);
ExitButton.Parent := srl_PlayerForm;
ExitButton.Left := (srl_PlayerForm.Width / 2) + 70;
ExitButton.Top := 310 + (Length(srlpf_Booleans) * 30) + //250 + 30 +30 = 310 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) +
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
ExitButton.Width := 40;
ExitButton.Height := 25;
ExitButton.Caption := 'Exit';
ExitButton.TabOrder := 7;
ExitButton.OnClick := @OnSRLPFClick;

SaveStartButton := TButton.Create(srl_PlayerForm);
SaveStartButton.Parent := srl_PlayerForm;
SaveStartButton.Left := (srl_PlayerForm.Width / 2) - 90;
SaveStartButton.Top := 310 + (Length(srlpf_Booleans) * 30) + //250 + 30 +30 = 310 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) +
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
SaveStartButton.Width := 80;
SaveStartButton.Height := 25;
SaveStartButton.Caption := 'Start and Save';
SaveStartButton.TabOrder := 7;
SaveStartButton.OnClick := @OnSRLPFClick;

SaveExitButton := TButton.Create(srl_PlayerForm);
SaveExitButton.Parent := srl_PlayerForm;
SaveExitButton.Left := (srl_PlayerForm.Width / 2) - 10;
SaveExitButton.Top := 310 + (Length(srlpf_Booleans) * 30) + //250 + 30 +30 = 310 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) +
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
SaveExitButton.Width := 80;
SaveExitButton.Height := 25;
SaveExitButton.Caption := 'Exit and Save';
SaveExitButton.TabOrder := 7;
SaveExitButton.OnClick := @OnSRLPFClick;
end;

{*******************************************************************************
procedure ShowSRLPFFormModal;
By: Sumilion
Description: Shows the form
*******************************************************************************}

procedure ShowSRLPFFormModal;
begin
srl_PlayerForm.ShowModal;
end;

{*******************************************************************************
procedure SRLPlayerForm(ShowForm: Boolean; Booleans, Integers, Strings, Extendeds: TStringArray);
By: Sumilion
Description: Main function, sets and loads values needed for player settings and the form.
*******************************************************************************}

procedure SRLPlayerForm(ShowForm: Boolean; Booleans, Integers, Strings, Extendeds: TStringArray);
var
V: TVariantArray;
begin
srlpf_SavePath := AppPath + 'Chars.INI';
srlpf_Booleans := Booleans;
srlpf_Integers := Integers;
srlpf_Strings := Strings;
srlpf_Extendeds := Extendeds;
LoadPlayers(False);
if(ShowForm)then
begin
srlpf_SaveWhenDone := True;
V := [];
ThreadSafeCall('LoadSRLPlayerForm', V);
V := [];
ThreadSafeCall('ShowSRLPFFormModal', V);
if(srlpf_SaveWhenDone)then
SavePlayers;
if(srlpf_TerminateWhenDone)then
TerminateScript;
end;
LoadPlayers(True);
end;

Richard

2009-04-19 18:09:25

In order for the new boxes to work, Zeph made some additions to the text.scar:

//-----------------------------------------------------------------//
//-- Scar Standard Resource Library --//
//-- ยป Text Routines --//
//-----------------------------------------------------------------//
// * function srl_Explode(str, del: string): TStringArray; // * by Mixster
// * function srl_Implode(Pieces: TStringArray; Separator: string): string; // * by ZephyrsFury
// * procedure TypeByte(k: Byte); // * by Mutant Squirrle
// * procedure TypeSend(Text: String); // * by SKy Scripter
// * function AddMistakes(Orig: string; Chance: Integer): string; // * by ZephyrsFury
// * function GetUpText: String; // * by Freddy1990
// * function IsUpText(UpText: String): Boolean; // * by Masquerader / Nielsie95 / Freddy1990
// * function IsUpTextMultiCustom(Text: TStringArray): Boolean; // * by Starblaster100 / Nielsie95 / Freddy1990
// * function FindNPCChatText(txt: string; Action: (ClickLeft,ClickRight,Move,Nothing)): Boolean; // * by Kernel Klink and Nielsie95
// * function FindText(var cx, cy: Integer; txt: String; font, xs, ys, xe, ye: Integer): Boolean; // * by Stupid3ooo
// * function ClickText(txt: String; font, x1, y1, x2, y2: Integer; left: Boolean): Boolean; // * by Stupid3ooo and SKy Scripter
// * function ChooseOptionMultiEx(Text: TStringArray; TextType: String): Boolean; // * by Wizzup?, Nava2, and modified by N1ke!
// * function ChooseOptionMulti(Text: TStringArray): Boolean; // * by Wizzup? modified by N1ke!
// * function ChooseOptionEx(Txt, TextType: String): Boolean; // * by Wizzup?, Nava2, and modified by N1ke!
// * function ChooseOption(txt: String): Boolean; // * by Stupid3ooo, modded by Sumilion
// * procedure CloseWindow; // * by Solemn Wishes, Starblaster100 and ZephyrsFury
// * function TextCoords(textn: Integer): TPoint; // * by Wizzup?
// * function GetChatBoxText(Line, TextCol: Integer): string; // * by ZephyrsFury
// * function FindChatBoxText(Line: Integer; Text: string; TextCol: Integer): Boolean; // * by ZephyrsFury
// * function IsChatBoxTextAnyLine(Text: string; TextCol: Integer): Boolean; // * by ZephyrsFury
// * function ChatBoxTextArray(TextCol: Integer): TStringArray; // * by ZephyrsFury
// * Function GetBlackChatMessage: String; // * by Wizzup?
// * Function FindBlackChatMessage(ChatMsg: String): Boolean; // * by Wizzup?
// * function LastChatter(var name: String): Boolean; // * by masquerader
// * function GetLastChatText(var chat: String): Boolean; // * by masquerader
// * procedure FixChat; // * by WT-Fakawi
// * function SaveToChatLog: Boolean; // * by WT-Fakawi / masquerader
// * function InChat(Text: String): Boolean; // * by WT-Fakawi
// * Function Function LoadTextTPA(Text : String; Chars : Integer;var height : integer) : TPointArray; // * by Raymond
// * Function FindTextTpa(Color,Tol,xs,ys,xe,ye : integer; Txt : string; Chars : Integer; Action : (ClickLeft,ClickRight,Move,Nothing)) : Boolean; // * by Raymond
// * function RandChatFx(bColor, bMovement: Boolean): string; // * by Evil Chicken
// * Function InStrArrEx(S: String; StrArr: TStringArray; Var W: Integer): Boolean; // * by n3ss3s

{ var OldLine,TheLine, TheName: String;
Description: ChatLog vars. }
var
OldLine, TheLine, TheName: string;

{ type fnct_ActionOptions;
Description: Action options. }
type
fnct_ActionOptions = (ClickLeft,ClickRight,Move,Nothing);

{ const clMessage, clChat, clTrade, clFriend
Description: Text colour constants. }
const
clMessage = clBlack;
clChat = clBlue;
clTrade = clPurple;
clFriend = 128;

{*******************************************************************************
function srl_Explode(str, del: string): TStringArray;
By: Mixster
Description: Explodes a string into a TStringArray, seperated by del.
*******************************************************************************}

function srl_Explode(str, del: string): TStringArray;
var
i, l: Integer;
begin
i := 0;
l := -1;
SetLength(Result, 0);
if (str = '') then
Exit;
repeat
Inc(l);
SetLength(Result, l + 1);
i := Pos(del, str);
if i <= 0 then
Break;
Result[l] := Copy(str, 1, i - 1);
Delete(str, 1, i + Length(del) - 1);
until false
Result[l] := Copy(str, 1, Length(str));
end;

{*******************************************************************************
function srl_Implode(Pieces: TStringArray; Separator: string): string;
By: ZephyrsFury
Description: Combines Pieces in a single string separated by a Separator.
*******************************************************************************}

function srl_Implode(Pieces: TStringArray; Separator: string): string;
var
II, H: Integer;
begin
H := High(Pieces);
if (H < 0) then Exit;
Result := Pieces[0];
for II := 0 to H do
Result := Result + Separator + Pieces[II];
end;

{*******************************************************************************
procedure TypeByte(k: Byte);
By: Mutant Squirrle
Description: Types one char.
*******************************************************************************}

procedure TypeByte(k: Byte);
begin
KeyDown(k);
Wait(10 + Random(50));
KeyUp(k);
end;

{*******************************************************************************
procedure TypeSend(Text: string);
By: SKy Scripter
Description: Sends human like text.
*******************************************************************************}
procedure TypeSend(Text: string);
var
S: string;
I, L: Integer;
C: Byte;
Shift: Boolean;
begin
S:= 'ABCDEFGHIJKLMNOPQRSTUVWXZ' + '~!@#$%^&*()_+{}|:"<>?';
L := Length(Text);
for I:= 1 to L do
begin
Shift:= (Pos(Text[i], S) > 0);
if(Shift)then
begin
KeyDown(VK_SHIFT) Wait(40 + Random(40));
while(Pos(Text[i], S) > 0)and(I <= Length(Text))do
begin
C := GetKeyCode(StrGet(Text, I));
TypeByte(c);
I:= I + 1;
if(I > Length(Text))then Break;
end;
end;
if(Shift)then
KeyUp(VK_SHIFT);
Wait(40 + Random(40));
if(I <= Length(Text))then
begin
C:= GetKeyCode(StrGet(Text, I));
TypeByte(C);
Wait(40 + Random(40));
end;
end;
C := GetKeyCode(Chr(13));
TypeByte(C);
end;

{*******************************************************************************
function AddMistakes(Orig: string; Chance: Integer): string;
By: ZephyrsFury
Description: Adds human mistakes to Orig such as mistypes, missing letters,
wrong cases. Probability that a character is typed wrong is 1 / Chance. ie.
Higher 'Chance' = less mistakes (I know thats stupid but oh well...).
Probability is the chance that an individual character is typed incorrectly.
That is if you have more characters in a string you will get more mistakes overall.
20 - 30 is usually good but it varies depending on your string so experiment!
Use: TypeSend(AddMistakes('Hello', 20));
*******************************************************************************}
function AddMistakes(Orig: string; Chance: Integer): string;
var
Line1, Line2, Line: array [0..3] of string;
i, j, TPos, Prob, Mist, L: Integer;
Norm, Caps, Excp, TLine, NewKey: string;
begin
Norm := '`1234567890-=qwertyuiop[]\asdfghjkl;''zxcvbnm,./';
Caps := '~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?';
Excp := '`1234567890-=[]\;'',./~!@#$%^&*()_+{}|:"<>?';

Line1[0] := '`1234567890-= '; Line2[0] := '~!@#$%^&*()_+ ';
Line1[1] := ' qwertyuiop[]\'; Line2[1] := ' QWERTYUIOP{}|';
Line1[2] := ' asdfghjkl;'' '; Line2[2] := ' ASDFGHJKL:" ';
Line1[3] := ' zxcvbnm,./ '; Line2[3] := ' ZXCVBNM<>? ';

L := Length(Orig);
for i := 1 to L do
begin
Prob := Chance;
Prob := Prob + Mist; //More mistakes = less chance of another mistake
if (Pos(Orig[i], Excp) <> 0) then Prob := Prob - 2; //If char is hard to type (numbers/symbols) - more chance
if (i = 1) then Prob := Prob + 5; //The first letter - less chance

if (Orig[i] <> ' ') and (Random(Max(Prob, 0)) = 0) then
begin
if (Pos(Orig[i], Norm) <> 0) then
Line := Line1
else
if (Pos(Orig[i], Caps) <> 0) then
Line := Line2;

for j := 0 to 3 do
begin
TPos := Pos(Orig[i], Line[j]);
if (TPos <> 0) then
case Random(19) of
0..5: //Same line
begin
TLine := Line[j];
try
NewKey := TLine[TPos - 1 + Random(3)];
except end;
if (NewKey = '') or (NewKey = ' ') then
NewKey := TLine[TPos];
end;
6..8: //Line above
begin
TLine := Line[Max(j - 1, 0)]
try
NewKey := Line[j - 1][TPos + Random(2)];
except end;
if (NewKey = '') or (NewKey = ' ') then
NewKey := TLine[TPos];
end;
9..11: //Line below
begin
TLine := Line[Min(j + 1, High(Line))]
try
NewKey := TLine[TPos - 1 + Random(2)]; //Wrong case
except end;
if (NewKey = '') or (NewKey = ' ') then
NewKey := TLine[TPos];
end;
12..16:
begin
if (i - 1 >= 1) then
begin
if (Pos(Orig[i - 1], Caps) <> 0) then
NewKey := Line2[j][TPos]
else
if (Pos(Orig[i - 1], Norm) <> 0) then
NewKey := Line1[j][TPos]
end else
if (i + 1 <= Length(Orig)) then
begin
if (Pos(Orig[i + 1], Caps) <> 0) then
NewKey := Line2[j][TPos]
else
if (Pos(Orig[i + 1], Norm) <> 0) then
NewKey := Line1[j][TPos];
end;
end;
17, 18: if (i <> 1) then NewKey := ''; //Missing letters
end;
end;
end else
NewKey := Orig[i];
if (NewKey <> Orig[i]) then Inc(Mist);
Result := Result + NewKey;
end;
end;

{*******************************************************************************
function GetUpText: String;
By: Freddy1990
Description: Returns text in upperleft corner.
*******************************************************************************}

function GetUpText: string;
begin
Result := rs_GetUpText;
end;

{*******************************************************************************
function IsUpText(UpText: String): Boolean;
By: Freddy1990
Description: Returns up text that might be to the right
*******************************************************************************}

function IsUpText(UpText: string): Boolean;
begin
Result := (Pos(UpText, rs_GetUpText) > 0);
end;

{*******************************************************************************
function IsUpTextMultiCustom(Text: TStringArray): Boolean;
By: Starblaster100 / Nielsie95 / Freddy1990
Description: Checks for the occurance of any of the strings in the array.
Use: IsUpTextMultiCustom(['Att', 'ttac', 'ack', 'monst', 'ster'])
*******************************************************************************}

function IsUpTextMultiCustom(Text: TStringArray): Boolean;
var
TheText: string;
i, n: Integer;
begin
TheText := rs_GetUpText;
n := High(Text);
for i := 0 to n do
if (Pos(Text[i], TheText) <> 0) then
begin
Result := True;
Exit;
end;
end;

{*******************************************************************************
function FindNPCChatText(txt: string; Action: (ClickLeft,ClickRight,Move,Nothing)): Boolean;
By: Kernel Klink and Nielsie95
Description: Finds a text said by a NPC in chat. If found it'll perform action,
where action can be:
Nothing - Just return wether its found
Move - Just move the mouse to it
Clickleft - Movemouse & Clickmouse left
Clickright - MoveMouse & Clickmouse right
*******************************************************************************}

function FindNPCChatText(txt: string; Action: fnct_ActionOptions): Boolean;
var
tx, ty, S: Integer;
begin
Result := False;
if txt = '' then
begin
srl_Warn('FindNPCChatText', 'txt is empty', warn_AllVersions);
Exit;
end;
S := CreateBitmapMaskFromText(txt, NPCChars);
if FindBitmapMaskTolerance(S, tx, ty, 9, 348, 523, 471, 50, 10) then
begin
Result := True;
case Action of
Move: MMouse(tx, ty + 2, Random(Length(txt) * 5), 4);
ClickLeft: Mouse(tx, ty + 2, Random(Length(txt) * 5), 4, True);
ClickRight: Mouse(tx, ty + 2, Random(Length(txt) * 5), 4, False);
end;
end;
FreeBitmap(S);
end;

{*******************************************************************************
function FindText(var cx, cy: Integer; txt: String; font, xs, ys, xe, ye: Integer): Boolean;
By: Stupid3ooo
Description: Searches for text in specified box with specified font.
*******************************************************************************}

function FindText(var cx, cy: Integer; txt: string; font, xs, ys, xe, ye:
Integer): Boolean; //by Stupid3ooo
var
S: Integer;
begin
S := CreateBitmapMaskFromText(txt, font);
if (xs < 0) then xs := 0;
if (ys < 0) then ys := 0;
Result := FindBitmapMaskTolerance(S, cx, cy, xs, ys, xe, ye, 30, 30);
FreeBitmap(S);
end;

{*******************************************************************************
function ClickText(Text: string; Chars, x1, y1, x2, y2: Integer; Left: Boolean): Boolean;
By: SKy Scripter
Description: Clicks text if found in box.
*******************************************************************************}

function ClickText(Text: string; Chars, x1, y1, x2, y2: Integer; Left: Boolean): Boolean;
var
Mask, w, h, tx, ty: Integer;
begin
try
Mask:= CreateBitmapMaskFromText(Text, Chars);
except
srl_Warn('ClickText', 'Invalid Character Names', warn_AllVersions);
Exit;
end;
Result:= FindBitmapMaskTolerance(Mask, tx, ty, x1, y1, x2, 502, 10, 10);
GetBitmapSize(Mask, W, H);
FreeBitmap(Mask);
if(Result)then
Mouse(TX + (W/4), TY + (H/4), (W/2), (H/2), Left);
end;

{*******************************************************************************
Function Function LoadTextTPA(Text : String; Chars : Integer;var height : integer) : TPointArray;
By: Raymond
Description: Loads a TPA of the text.. It also returns the real height
of the Text.. Used in FindTextTPAinTPA
*******************************************************************************}
Function LoadTextTPA(Text : String; Chars : Integer;var height : integer) : TPointArray;
var
DC : HDC;
CTS,w,h : INteger;
BMP : Integer;
begin;
BMP := CreateBitmapMaskFromText(Text,Chars);
DC := GetClientCanvas.Handle;
CTS := GetColorToleranceSpeed;
ColorToleranceSpeed(0);
GetBitmapSize(BMP,W,H);
SetTargetDc(GetBitmapDc(BMP));
FindColorsTolerance(Result,clwhite,0,0,w+1,h+1,0);
height := h - 1;
SetTargetDC(DC);
ColorToleranceSpeed(CTS);
FreeBitmap(BMP);
end;
{*******************************************************************************
Function FindTextTpaEx(Color,Tol,xs,ys,xe,ye : integer;var x,y : integer; Txt : string; Chars : Integer; Action : (ClickLeft,ClickRight,Move,Nothing)) : Boolean;
By: Raymond
Description: Uses TPA's to find text..Returns the found pos in x and y (if not found both are 0)
In action you can put what you want to do after its found..
Nothing - Just return wether its found
Move - Just move the mouse to it
Clickleft - Movemouse & Clickmouse left
Clickright - MoveMouse & Clickmouse right
*******************************************************************************}

Function FindTextTpaEx(Color,Tol,xs,ys,xe,ye : integer;var x,y : integer; Txt : string; Chars : Integer; Action :fnct_ActionOptions ) : Boolean;
var
TextTPA,SearchTPA, Matches: TPointArray;
Box : TBox;
xx,yy : integer;
begin
FindColorsTolerance(SearchTPA,Color,xs,ys,xe,ye,tol);
if Length(SearchTPA) < 1 then
Exit;
TextTPA:= LoadTextTPA(Txt,Chars,yy);
Result := FindTextTPAinTPA(yy,TextTPA,SearchTPA,Matches);
x := 0; y:=0;
if Result = False then
Exit;
Box := GetTPABounds(TextTPA);
SortTPAFrom(Matches, Point(Box.x1, Box.y1));
x := matches[0].x;
y := matches[0].y;
if Action = Nothing then
Exit;
GetMousePos(xx,yy);
if not IntInBox(xx,yy,IntToBox(matches[0].x,matches[0].y,matches[0].x + Box.x2,Matches[0].y + (Box.y2 shr 1))) then
MMouse(matches[0].x + Random(box.x2),Matches[0].y + Random(Box.y2 shr 1),0,0);
if Action = Move then
Exit;
GetMousePos(xx,yy);
Case Action of
ClickLeft : Mouse(xx,yy,0,0,true);
ClickRight: Mouse(xx,yy,0,0,false);
end;
end;

{*******************************************************************************
Function FindTextTpa(Color,Tol,xs,ys,xe,ye : integer; Txt : string; Chars : Integer; Action : (ClickLeft,ClickRight,Move,Nothing)) : Boolean;
By: Raymond
Description: Just like FindTextTPAEx, but without the x and y pos returning.
*******************************************************************************}

Function FindTextTpa(Color,Tol,xs,ys,xe,ye : integer; Txt : string; Chars : Integer; Action :fnct_ActionOptions ) : Boolean;
var
x,y : integer;
begin
Result := FindTextTPAEx(Color,Tol,xs,ys,xe,ye,x,y,Txt,chars,action);
end;

{*******************************************************************************
function ChooseOptionMultiEx(Texts: TStringArray; TextType: String): Boolean;
By: Wizzup?, Nava2, and modified by N1ke!
Description: Finds Popup menu, then clicks on it.
Will look for the first string first and so on.
It will search for the Text Type you input valid arguments are
'action', 'player': The white text
'npc': The yellow text
'object': The cyan text
'all': Searches for all colors of text.
Will default to 'all'.
*******************************************************************************}
function ChooseOptionMultiEx(Texts: TStringArray; TextType: String): Boolean;
var
B, T: TBox;
TPA, TextTPA: TPointArray;
aTPA: T2DPointArray;
I, C, H, HH, ii, L: Integer;
P: TPoint;
Occurances: array [0..4] of TPointArray;
Colors: TIntegerArray;
begin
Result := False;
GetClientDimensions(B.X2, B.Y2);
B.X1 := 0;
B.Y1 := 0;
FindColorsTolerance(TPA, 4674653, B.X1, B.Y1, B.X2, B.Y2, 0);
If Length(TPA) < 10 Then
Exit;
B.X2 := 0;
B.Y2 := 0;

P := TPA[0];
H := High(TPA);
Dec(H);
For I := 0 To H Do
If TPA[i].X = TPA[I+1].X - 1 Then
Begin
If C > 5 Then
Begin
B.X1 := P.X;
B.Y1 := P.Y;
Break;
End Else
C := C + 1;
End
Else
Begin
P := TPA[I + 1];
C := 0;
End;
If I = Length(TPA) Then
Begin
WriteLn('Choose Option Menu Getting Failed');
Exit;
End;
InvertTPA(TPA);
C := 0;
P := TPA[0];
H := High(TPA);
Dec(H);
For I := 0 To H Do
If TPA[i].X = TPA[I+1].X + 1 Then
Begin
If C > 5 Then
Begin
B.X2 := P.X;
B.Y2 := P.Y;
Break;
End Else
C := C + 1;
End Else
Begin
P := TPA[I + 1];
C := 0;
End;
If I = Length(TPA) Then
Begin
WriteLn('Choose Option Menu Getting Failed');
Exit;
End;

TPA := [];
Colors := [16777215, 4231423, 2070783, 65535, 16776960];
case LowerCase(TextType) of
'action', 'player': FindColorsTolerance(Occurances[0], Colors[0], B.x1, B.y1, B.x2, B.y2, 3);
'item' : begin
FindColorsTolerance(Occurances[1], Colors[1], B.x1, B.y1, B.x2, B.y2, 3);
FindColorsTolerance(Occurances[2], Colors[2], B.x1, B.y1, B.x2, B.y2, 3);
end;
'npc' : FindColorsTolerance(Occurances[3], Colors[3], B.x1, B.y1, B.x2, B.y2, 3);
'object': FindColorsTolerance(Occurances[4], Colors[4], B.x1, B.y1, B.x2, B.y2, 3);
else
begin
FindColorsTolerance(Occurances[0], 4674653, B.X1, B.Y1, B.X2, B.Y2, 0);
FindColorsTolerance(Occurances[1], clBlack, B.X1, B.Y1, B.X2, B.Y2, 0);
TPA := MergeATPA(Occurances);
TPA := ReturnPointsNotInTPA(TPA, B);
end;
end;
if High(TPA) < 1 then TPA := MergeATPA(Occurances);
aTPA := SplitTPAEx(TPA, 7, 1);
SortATPAFromFirstPoint(aTPA, Point(B.x1, B.y1));

H := High(Texts);
L := High(aTPA);
// for i := 0 to L do
// DebugTPA(atpa[i], inttostr(i));

For I :=0 To H do
begin
TextTPA := LoadTextTPA(Texts[I], UpChars, HH);
for ii := 0 to L do
If FindTextTPAInTPA(HH, TextTPA, aTPA[ii], TPA) Then
Begin
T := GetTPABounds(TPA);
Result := True;
Mouse(B.X1 + 5, T.y1 - 2, B.X2 - B.X1 - 5, T.Y2 - T.Y1, True);
Exit;
End;
end;

MMouse(B.X1 - 50, B.Y1 - 50, 40, B.Y2 - B.Y1);
Wait(200 + Random(100));
end;

{*******************************************************************************
function ChooseOptionMulti(Text: TStringArray): Boolean;
By: Wizzup? modified by N1ke!
Description: Finds Popup menu, then clicks on it.
Will look for the first string first and so on.
*******************************************************************************}
function ChooseOptionMulti(Txt: TStringArray): Boolean;
begin
Result := ChooseOptionMultiEx(Txt, 'All');
end;

{*******************************************************************************
function ChooseOptionEx(Txt, TextType: string): Boolean;
By: Wizzup?
Description: Finds an option in a popup menu, then clicks on it. Searches for
TextType. See ChooseOptionMultiEx for valid options.
Default is 'all'.
*******************************************************************************}
function ChooseOptionEx(Txt, TextType: string): Boolean;
begin
Result := ChooseOptionMultiEx([Txt], TextType);
end;

{*******************************************************************************
function ChooseOption(txt: String): Boolean;
By: Wizzup?
Description: Finds an option in a popup menu, then clicks on it.
*******************************************************************************}
function ChooseOption(Txt: String): Boolean;
begin
Result := ChooseOptionMultiEx([Txt], 'All');
end;

{*******************************************************************************
function CloseWindow: Boolean;
By: Solemn Wishes, Starblaster100 and ZephyrsFury
Description: Closes any open windows.
*******************************************************************************}

function CloseWindow: Boolean;
var
WindowType : array[0..2] of Integer;
i, x, y, w, h: Integer;
Begin
WindowType[0] := BitmapFromString(8, 8, 'beNrTUhIVFgSivJSAjDjvrCRfIIKIS' +
'IgKAxFEqjAtEMIFIqACCENGQhSOUqM9IHqVZMXgKCHMNSnCDagdiL' +
'RUZFUVpYAkEAEVQ9QD2bpqCnAE5AK1QNh6mopANhABGRBkqKUEREA' +
'DIcYCEUgEAE7rJ6k='); //Bank screen, graphics settings
WindowType[1] := BitmapFromString(12, 12, 'beNrbUXV4duzZpekPdlRBEAMDIxD' +
'BuUApNAVYEUEF1EXILsSlgBg1xNhFjNeICaKdE4MJKlvf7omsDIsv' +
'APcbFLA='); //Skills
WindowType[2] := BitmapFromString(17, 18, 'beNqNks9LAnEQxf8h/4HATmF6qMs' +
'iiD8iusSSHhYClVZcQS+CHoIKkkoWRaIgQiQior/Nz/JkWFw14bHM' +
'vJl539mZyaXyuRXeHq7/hSWDj1F9H1j+51Nj0Dy5C5yXfjkcXvKFM' +
'YgHGLjkf09aAPf93jWQsJFHGVL6uN7FMXjsVRSFFF89OwJWIkxvI9' +
'd3M10vC0xZTcKb7LmTRpaHlFA8PSBf/YjhRUgxalKN/b12MK4Kh6i' +
'pGRgrQRZ3Db+zAKBPoWxgJUgZuRu7S36m7STiJRsTtpVowslo8l0m' +
'wHhVMvRL8ZD+11bMl07YEQbTs53qWgTt7iv0sW13kAwW0tYXvxb6J' +
'LQY3+gGWCuLIx8dSEEn1K7l4YmK5DLnz02V8AT2GiCZG1GkcOP3vw' +
'+i5CUPp90+'); //Quest status windows
for i := 0 to 2 do
begin
If(FindBitmapToleranceIn(WindowType[i], x, y, MSX1, MSY1, MSX2, MSY2, 25)) then
begin
GetBitmapSize(WindowType[i], w, h);
Mouse(x, y, w, h, true);
Result := True;
Break;
end else
Wait(10);
end;
for i := 0 to 2 do
FreeBitmap(WindowType[i]);
end;

{*******************************************************************************
Function TextCoords(textn: Integer): TPoint;
By: Wizzup?
Description: Returns x, y for text. (1 to 8)
*******************************************************************************}

Function TextCoords(textn: Integer): TPoint;

Begin
Result.X := 11;
Result.Y := 346 + (14 * (textn - 1));
End;

{*******************************************************************************
function GetChatBoxText(Line, TextCol: Integer): string;
By: ZephyrsFury
Description: Gets text on the line Line with colour TextCol. (Line 1 is the top,
Line 8 is the bottom line).
Colours:
clMessage/clBlack - Black text messages ("Oh Dear you are dead", etc).
clChat/clBlue - Chat messages from you and other players.
clTrade/clPurple - Colour of trade request text.
clFriend - Colour of friend and clan chat.
Works with other colours too.
*******************************************************************************}
function GetChatBoxText(Line, TextCol: Integer): string;
var
P: TPoint;
cArr: TPointArray;
B: TBox;
begin
P := TextCoords(Line);
if (FindColorsTolerance(cArr, TextCol, MCX1, P.y, MCX2, P.y + 13, 0)) then
begin
B := GetTPABounds(cArr);
Result := Trim(GetTextAtEx(B.x1 - 1, B.y1 - 2, 0, SmallChars, False, False,
0, 1, TextCol, 80, False, tr_AllChars));
end;
end;

{*******************************************************************************
function FindChatBoxText(Text: string; Line: Integer; TextCol: Integer): Boolean;
By: ZephyrsFury
Description: Searches for Text on Line with colour TextCol. True if found.
*******************************************************************************}
function FindChatBoxText(Text: string; Line: Integer; TextCol: Integer): Boolean;
begin
Result := (Pos(Text, GetChatBoxText(Line, TextCol)) > 0);
end;

{*******************************************************************************
function IsChatBoxTextAnyLine(Text: string; TextCol: Integer): Boolean;
By: ZephyrsFury
Description: Returns true if Text with colour TextCol is found anywhere in the
chat box.
*******************************************************************************}
function IsChatBoxTextAnyLine(Text: string; TextCol: Integer): Boolean;
var
II: Integer;
begin
Result := True;
for II := 8 downto 1 do
if (FindChatBoxText(Text, II, TextCol)) then
Exit;
Result := False;
end;

{*******************************************************************************
function ChatBoxTextArray(TextCol: Integer): TStringArray;
By: ZephyrsFury
Description: Gets and return a TStringArray with the contents of each line with
the colour TextCol (see GetChatBoxText for list of colours).
Line 1 is Result[1]
Line 2 is Result[2]
Line 3 is Result[3]
Line 4 is Result[4]
Line 5 is Result[5]
Line 6 is Result[6]
Line 7 is Result[7]
Line 8 is Result[8]
*******************************************************************************}
function ChatBoxTextArray(TextCol: Integer): TStringArray;
var
II: Integer;
begin
SetLength(Result, 9);
for II := 8 downto 1 do
Result[II] := GetChatBoxText(II, TextCol);
end;

{*******************************************************************************
function GetBlackChatMessage: String;
By: Wizzup?
Description: Gets text with color 0 in last chat line.
*******************************************************************************}

function GetBlackChatMessage: string;
begin
Result := GetChatBoxText(8, clMessage);
end;

{*******************************************************************************
function FindBlackChatMessage(ChatMsg: String): Boolean;
By: Wizzup?
Description: Returns True if text with color 0 in last chat line is found.
*******************************************************************************}

function FindBlackChatMessage(ChatMsg: string): Boolean;
begin
Result := (Pos(ChatMsg, GetChatBoxText(8, clMessage)) > 0);
end;

{*******************************************************************************
function LastChatter(var name: String): Boolean;
By: masquerader
Description:Returns name and true if a person was talking, or false and the text
*******************************************************************************}

function LastChatter(var name: string): Boolean;
var
i: Integer;
begin
Result := False;
Name := LowerCase(GetBlackChatMessage);
i := Pos(':', name)
if (i <> 0) then
begin
Delete(Name, i, i);
Result := True;
end;
end;

{*******************************************************************************
function GetLastChatText(var chat: String): Boolean;
By: masquerader / Wizzup?
Description: Returns true if blue chat text was found
*******************************************************************************}

function GetLastChatText(var chat: string): Boolean;
begin
Chat := GetChatBoxText(8, clChat);
Result := (Chat <> '');
end;

{*******************************************************************************
function InChat(Text: String): Boolean;
By: WT-Fakawi
Description: Grabs Last Chat Line and performs checks on occurence of text
*******************************************************************************}

function InChat(Text: string): Boolean;
var
s: string;
begin
if (not (GetLastChatText(s))) then
LastChatter(s);
Result := (Pos(Text, s) > 0);
end;

{*******************************************************************************
procedure FixChat;
by: WT-Fakawi
Description: Scrolls ChatText scrollbar down.
*******************************************************************************}

procedure FixChat;
var
ScrollX, ScrollY: Integer;
begin
ScrollX := 499 + Random(8);
ScrollY := 445 + Random(8);
if (GetColor(500, 441) = 1975337) then
begin
MMouse(ScrollX, ScrollY, 0, 0)
while (GetColor(500, 441) = 1975337) do
begin
HoldMouse(ScrollX, ScrollY, True);
Wait(10);
end;
Wait(100);
ReleaseMouse(ScrollX, ScrollY, True);
Wait(100);
end;
end;

{*******************************************************************************
function SaveToChatLog: Boolean;
By: WT-Fakawi / masquerader
Description: Saves chat to log file
*******************************************************************************}

procedure SaveToChatLog;
begin
FixChat;
OldLine := TheLine;

if(LastChatter(TheName))then
begin
GetLastChatText(TheLine);
TheLine:=' '+TheLine+' ';
if OldLine <> TheLine then
try AddToSRLLog(TheName+':'+TheLine); except end;
end else
begin
TheLine:=TheName;
if OldLine <> TheLine then
try AddToSRLLog(TheLine); except end;
end;
end;

{*******************************************************************************
function RandChatFx(Effect: Byte): string;
By: EvilChicken!
Description: Returns a RS chat effect based on 'Effect'.
0 reteurns completely random effect(s), 1 returns a colorful chat effect,
2 returns a text moving effect, 3 returns both types of effects.
Use example: TypeSend(RandChatEffect(0) + 'I love pie!');
*******************************************************************************}
function RandChatFx(Effect: Byte): string;
var
ChatEffects: array [1..2] of TStringArray;
Byt, ChatEffect, ChatEffect2: Byte;

begin
if not InRange(Effect, 0, 3) then
begin
SRL_Warn('RandChatFx', '"' + IntToStr(Effect) + '" is not a valid effect option', Warn_AllVersions);
Exit;
end;
Byt := Effect;
ChatEffects[1] := ['flash1:', 'flash2:', 'flash3:', 'glow1:', 'glow2:', 'glow3:', 'red:', 'green:', 'cyan:', 'purple:', 'white:'];
ChatEffects[2] := ['scroll:', 'shake:', 'slide:', 'wave:', 'wave2:'];
if Byt = 0 then Byt := random(3) + 1;
case Byt of
1: ChatEffect := Random(High(ChatEffects[1]));
2: ChatEffect := Random(High(ChatEffects[2]));
3: begin
ChatEffect := Random(High(ChatEffects[1]));
ChatEffect2 := Random(High(ChatEffects[2]));
end;
end;
if Byt < 3 then result := ChatEffects[Byt][ChatEffect]
else result := ChatEffects[1][ChatEffect] + ChatEffects[2][ChatEffect2];
end;

{*******************************************************************************
Function InStrArrEx(S: String; StrArr: TStringArray; Var Where: Integer): Boolean;
By: n3ss3s
Description: Returns true if the string S was found in the StrArr, and if so
stores the index into Where.
*******************************************************************************}
Function InStrArrEx(S: String; StrArr: TStringArray; Var Where: Integer): Boolean;
Var
I, H: Integer;
Begin
H := High(StrArr);
For I := 0 To H Do
If LowerCase(StrArr[i]) = LowerCase(S) Then
Begin
Where := i;
Result := True;
Break;
End;
End;

NiCbaZ

2009-04-19 18:14:57

GJ, taking into account that SRL Player Form is very confusing.

Richard

2009-04-19 18:16:09

From: NiCbaZ
GJ, taking into account that SRL Player Form is very confusing.


You were able to deal with it :) I just have a smaller brain…

Richard

2009-04-21 22:30:15

Uploaded a picture for those wanting to know what it looks like.

Gu3st...

2009-04-21 22:55:37

What is these Boolean Example and String Example? Examples? Some newbeginners may find that confusing (not knowing what to put there)

Richard

2009-04-21 22:58:14

That's just an example, that would have the code:

SRLPlayerForm(True, ['Boolean Example'], ['Integer Example'], ['String Example'], ['Extended Example']);

The normal one wouldn't have that, you can have as many of each of those as you like (as long as it fits on a standard monitor).

nielsie95

2009-04-21 23:01:46

Nice job :) but I don't like the buttons very much, to be honest.

From: Zyt3x
What is these Boolean Example and String Example? Examples? Some newbeginners may find that confusing (not knowing what to put there)

Have you never used the SRL PlayerForm? You can enter variables for the user to fill in, in this case Boolean Example, String Example, etc..
In a script you can use "Loads to do" as integer or "Wear Pickaxe" as boolean for example.

Richard

2009-04-21 23:20:03

And you call them later the same as you would normal DeclarePlayers, with the first in the array being .Integers[0] (or whatever variable type).

I also just noticed a very stupid error, I didn't account for the army tab page changing width if you have long field, the fix is there now.

Nava2

2009-04-22 07:37:06

I'm not a fan of the buttons either. Thanks for the effort though. The pin and box rewards look nice.

ZephyrsFury

2009-04-22 09:20:55

I like the buttons. It would look better at the top IMO but I think that was too hard to add.

Richard

2009-04-22 10:30:04

It is possible to add the buttons at the top, I'll look into it and see what I can do.

ian.

2009-04-22 10:33:27

=X

idk what's so bad about the buttons.. :p

Naum

2009-04-22 11:05:42

Why not, when you exit, a pop-up comes up which asks you to save it or not :)

Floor66

2009-04-22 19:47:17

SRL 3.20 only? If I try it with 3.15b I get srl_Explode error x.x

Richard

2009-04-22 20:34:21

I'm testing with 3.15b and it works fine.

Heres a preview with the buttons at the top:


Code:

//-----------------------------------------------------------------//
//-- Scar Standard Resource Library --//
//-- ยป User Manager Routines --//
//-----------------------------------------------------------------//
// * procedure LoadCheckListForm; | by Sumilion
// * procedure ShowCheckListFormModal; | by Sumilion
// * procedure ShowCheckListForm; | by Sumilion
// * procedure SavePlayers(Create: Boolean); | by Starblaster100
// * procedure LoadPlayers(SetPlayers: Boolean); | by Starblaster100
// * procedure SwitchInTabArray(NewPlace, OldPlace: Integer; var V: array of TTabSheet); | by Sumilion
// * procedure SwitchInEditArray(NewPlace, OldPlace: Integer; var V: array of TEdit); | by Sumilion
// * procedure SwitchInComboArray(NewPlace, OldPlace: Integer; var V: array of TComboBox); | by Sumilion
// * procedure OnSRLPFMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); | by Sumilion
// * procedure OnSRLPFDragDrop(Sender, Source: TObject; X, Y: Integer); | by Sumilion
// * procedure OnSRLPFDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); | by Sumilion
// * procedure DeleteInEditArray(SpotToDelete: Integer; var V: array of TEdit); | by Sumilion
// * procedure DeleteInEditArrayOfArray(SpotToDelete: Integer; var V: array of array of TEdit); | by Sumilion
// * procedure DeleteInEditArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TEdit); | by Sumilion
// * procedure DeleteInComboArray(SpotToDelete: Integer; var V: array of TComboBox); | by Sumilion
// * procedure DeleteInComboArrayOfArray(SpotToDelete: Integer; var V: array of array of TComboBox); | by Sumilion
// * procedure DeleteInComboArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TComboBox); | by Sumilion
// * procedure DeleteInTabArray(SpotToDelete: Integer; var V: array of TTabSheet); | by Sumilion
// * procedure DeleteInTabArrayOfArray(SpotToDelete: Integer; var V: array of array of TTabSheet); | by Sumilion
// * procedure DeleteInPageControlArray(SpotToDelete: Integer; var V: array of TPageControl); | by Sumilion
// * procedure SetLabelsParent(Parent: Integer); | by Sumilion
// * procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer); | by Sumilion
// * procedure ClearPlayerInTab(ArmyNumber, PlayerNumber: Integer); | by Sumilion
// * procedure AddPlayerInTab(ArmyNumber: Integer); | by Sumilion
// * procedure AddArmy; | by Sumilion
// * procedure DeleteArmy(ArmyNumber, NextArmyTab: Integer); | by Sumilion
// * procedure RenameArmy(ArmyNumber: Integer); | by Sumilion
// * procedure ExportPlayerData; | by Starblaster100 / Sumilion
// * procedure ImportPlayerData; | by Starblaster100 / Sumilion
// * procedure OnSRLPFMainMenuClick(Sender: TObject); | by Sumilion
// * procedure OnSRLPFClick(Sender: TObject); | by Sumilion / Richard
// * procedure OnSRLPFShow(Sender: TObject); | by Sumilion
// * procedure SRLPFMenuClick(Sender: TObject); | by Sumilion
// * procedure SetSRLPlayerFormArrays; | by Sumilion
// * procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer); | by Sumilion
// * procedure LoadSRLPlayerForm; | by Sumilion / Richard / ZephyrsFury
// * procedure ShowSRLPFFormModal; | by Sumilion
// * procedure SRLPlayerForm(ShowForm: Boolean; Booleans, Integers, Strings, Extendeds: TStringArray); | by Sumilion

var
// Main form components
srl_PlayerForm : TForm;
srlpf_PreviousTabIndex, srlpf_Width, HowManyArmies, ActiveArmy: Integer;
srlpf_TerminateWhenDone, srlpf_SaveWhenDone: Boolean;
srlpf_ArmyPageControl : TPageControl;
srlpf_PlayerPageControl : array of TPageControl;
ArmyPages : array of TTabSheet;
ArmyNames : TStringArray;
PlayerPages : array of array of TTabSheet;
// Menu items
srlpf_ArmyPopUpMenu, srlpf_PlayerPopUpMenu: TPopupMenu;
srlpf_MainMenu: TMainMenu;
FileItem, PlayerControlItem, ArmyControlItem, ExitItem,
AddPlayerItem, DeletePlayersItem, ClearPlayersItem, SaveAndStart, SaveAndExit,
JustExitItem, JustStartItem, AddArmyItem, DeleteArmiesItem, ClearArmiesItem, RenameArmyItem,
ExportPlayersItem, ImportPlayersItem: TMenuItem;
AddArmyPopUp, DelArmyPopUp, ChangeArmyNamePopUp, ClearArmyPopUp, AddPlayerPopUp, DelPlayerPopUp, ClearPlayerPopUp: TMenuItem;
// All labels
arBooleanLabels, arIntegerLabels,
arStringLabels, arExtendedLabels : array of TLabel;
UserNameLabel, PasswordLabel, NickLabel, ActiveLabel, PinLabel, BoxRewardsLabel: TLabel;
// All changeable settings
arUserNameEdits, arPasswordEdits, arNickEdits, arPinEdits, arBoxRewardsEdits : array of array of TEdit;
arActiveComboBoxes : array of array of TComboBox;
arBooleanComboBoxes : array of array of array of TComboBox;
arIntegerEdits, arStringEdits, arExtendedEdits : array of array of array of TEdit;
// All buttons on the form
DelPlayerButton, AddPlayerButton, PreviousButton, ExitButton,
NextButton, StartButton, SaveStartButton, SaveExitButton: TButton;
// Arrays of variable settings
srlpf_Booleans, srlpf_Integers, srlpf_Strings, srlpf_Extendeds: TStringArray;
// CheckList form vars
CheckListForm : TForm;
SRLPFCheckListBox: TCheckListBox;
CheckListButton: TButton;
// Other
srlpf_SavePath: string;

procedure SetSRLPlayerFormArrays; forward;
procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer); forward;
procedure OnSRLPFShow(Sender: TObject); forward;
procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer); forward;
procedure OnSRLPFClick(Sender: TObject); forward;

{*******************************************************************************
procedure LoadCheckListForm;
By: Sumilion
Description: Initializes the check list form needed for Users.scar
*******************************************************************************}

procedure LoadCheckListForm;
var
ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;

CheckListForm.Position := poDesktopCenter;
CheckListForm.Width := 200;
CheckListForm.Height := 135;
CheckListForm.Color := clBtnFace;
CheckListForm.Font.Color := clWindowText;
CheckListForm.Font.Height := -11;
CheckListForm.Font.Name := 'MS Sans Serif';
CheckListForm.Font.Style := [];
CheckListForm.Visible := False;
CheckListForm.PixelsPerInch := 96;
CheckListForm.BorderIcons := [biSystemMenu];
CheckListForm.BorderStyle := bsSingle;

SRLPFCheckListBox.Parent := CheckListForm;
SRLPFCheckListBox.Width := CheckListForm.Width;
SRLPFCheckListBox.Height := CheckListForm.Height - 65;
SRLPFCheckListBox.Align := alTop;
SRLPFCheckListBox.ItemHeight := 13;

CheckListButton.Parent := CheckListForm;
CheckListButton.Left := 70;
CheckListButton.Top := 80;
CheckListButton.Width := 50;
CheckListButton.Height := 20;
CheckListButton.OnClick := @OnSRLPFClick;
end;

{*******************************************************************************
procedure ShowCheckListFormModal;
By: Sumilion
Description: Showes the form.
*******************************************************************************}

procedure ShowCheckListFormModal;
begin
CheckListForm.ShowModal;
end;

{*******************************************************************************
procedure ShowCheckListForm;
By: Sumilion
Description: Safely initializes and shows the form
*******************************************************************************}

procedure ShowCheckListForm;
var
v: TVariantArray;
begin
V := [];
ThreadSafeCall('LoadCheckListForm', V);
V := [];
ThreadSafeCall('ShowCheckListFormModal', V);
end;

{*******************************************************************************
procedure SavePlayers;
By: Starblaster100
Description: Saves the players to a file / creates a file when needed.
*******************************************************************************}

procedure SavePlayers;
var
ArmyIndex, i, j, k: Integer;
Begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;
WriteINI('General', 'HowManyArmies', IntToStr(Length(ArmyPages)), srlpf_SavePath);
WriteINI('General', 'ActiveArmy', IntToStr(ArmyIndex), srlpf_SavePath);
for i := 0 to GetArrayLength(ArmyPages) - 1 do
begin
WriteINI('ArmyPages', 'Name[' +IntToStr(i)+ ']', ArmyPages[i].Caption, srlpf_SavePath);
WriteINI('ArmyPages', 'Number[' +IntToStr(i)+ ']', IntToStr(Length(PlayerPages[i])), srlpf_SavePath);
end;
for k := 0 to Length(ArmyPages) - 1 do
begin
for i := 0 to Length(PlayerPages[k]) - 1 do
begin
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Username', arUserNameEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Password', arPasswordEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Nickname', arNickEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Active', arActiveComboBoxes[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Pin', arPinEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'BoxRewards', Replace(arBoxRewardsEdits[k][i].Text, ' ', ''), srlpf_SavePath);
for j := 0 to Length(srlpf_Booleans) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Booleans[' +IntToStr(j)+ ']', arBooleanComboBoxes[k][j][i].Text, srlpf_SavePath);
for j := 0 to Length(srlpf_Integers) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Integers[' +IntToStr(j)+ ']', arIntegerEdits[k][j][i].Text, srlpf_SavePath);
for j := 0 to Length(srlpf_Strings) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Strings[' +IntToStr(j)+ ']', arStringEdits[k][j][i].Text, srlpf_SavePath);
for j := 0 to Length(srlpf_Extendeds) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Extendeds[' +IntToStr(k)+ ']', arExtendedEdits[k][j][i].Text, srlpf_SavePath);
end;
end;
end;

{*******************************************************************************
procedure LoadPlayers(SetPlayers: Boolean);
By: Starblaster100
Description: Loads the players from a file
*******************************************************************************}

procedure LoadPlayers(SetPlayers: Boolean);
var
ArmyIndex, i, j, k: Integer;
Begin
HowManyArmies := StrToIntDef(ReadINI('General', 'HowManyArmies', srlpf_SavePath), 1);
ArmyIndex := StrToIntDef(ReadINI('General', 'ActiveArmy', srlpf_SavePath), 0);
ActiveArmy := ArmyIndex;
SetLength(ArmyPages, HowManyArmies);
SetLength(ArmyNames, HowManyArmies);
for i := 0 to HowManyArmies - 1 do
ArmyNames[i] := ReadINI('ArmyPages', 'Name[' +IntToStr(i)+ ']', srlpf_SavePath);

if(SetPlayers)then
begin
HowManyPlayers := StrToIntDef(ReadINI('ArmyPages', 'Number[' +IntToStr(ArmyIndex)+ ']', srlpf_SavePath), 1);
NumberOfPlayers(HowManyPlayers);

for i := 0 to HowManyPlayers - 1 do
begin
Players[i].Name := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Username', srlpf_SavePath);
Players[i].Pass := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Password', srlpf_SavePath);
Players[i].Nick := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Nickname', srlpf_SavePath);
Players[i].Active := StrToBoolDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Active', srlpf_SavePath), True);
Players[i].Pin := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Pin', srlpf_SavePath);
Players[i].BoxRewards := srl_Explode(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'BoxRewards', srlpf_SavePath), ',');

for j := 0 to Length(srlpf_Booleans) - 1 do
Players[i].Booleans[j] := StrToBoolDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Booleans[' +IntToStr(j)+ ']', srlpf_SavePath), True);

for j := 0 to Length(srlpf_Integers) - 1 do
Players[i].Integers[j] := StrToIntDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Integers[' +IntToStr(j)+ ']', srlpf_SavePath), 0);

for j := 0 to Length(srlpf_Strings) - 1 do
Players[i].Strings[j] := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Strings[' +IntToStr(j)+ ']', srlpf_SavePath);

for j := 0 to Length(srlpf_Extendeds) - 1 do
Players[i].Extendeds[j] := StrToFloatDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Extendeds[' +IntToStr(j)+ ']', srlpf_SavePath), 0.0);
end;
end else
begin
SetLength(PlayerPages, HowManyArmies);
for i := 0 to HowManyArmies - 1 do
begin
HowManyPlayers := StrToIntDef(ReadINI('ArmyPages', 'Number[' +IntToStr(i)+ ']', srlpf_SavePath), 1);
SetLength(PlayerPages[i], HowManyPlayers);
end;
SetSRLPlayerFormArrays;

for k := 0 to HowManyArmies - 1 do
begin
HowManyPlayers := StrToIntDef(ReadINI('ArmyPages', 'Number[' +IntToStr(k)+ ']', srlpf_SavePath), 1);
for i := 0 to HowManyPlayers - 1 do
begin
arUserNameEdits[k][i] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[k][i] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[k][i].PasswordChar := '*';
arNickEdits[k][i] := TEdit.Create(srl_PlayerForm);
arActiveComboBoxes[k][i] := TComboBox.Create(srl_PlayerForm);
arPinEdits[k][i] := TEdit.Create(srl_PlayerForm);
arBoxRewardsEdits[k][i] := TEdit.Create(srl_PlayerForm);

arUserNameEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Username', srlpf_SavePath);
arPassWordEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Password', srlpf_SavePath);
arNickEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Nickname', srlpf_SavePath);
arActiveComboBoxes[k][i].Text := BoolToStr(StrToBoolDef(ReadINI(IntToStr(k) +',' +IntToStr(i), 'Active', srlpf_SavePath), True));
arPinEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Pin', srlpf_SavePath);
arBoxRewardsEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'BoxRewards', srlpf_SavePath);

for j := 0 to Length(srlpf_Booleans) - 1 do
begin
arBooleanComboBoxes[k][j][i] := TComboBox.Create(srl_PlayerForm);
arBooleanComboBoxes[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Booleans[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

for j := 0 to Length(srlpf_Integers) - 1 do
begin
arIntegerEdits[k][j][i] := TEdit.Create(srl_PlayerForm);
arIntegerEdits[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Integers[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

for j := 0 to Length(srlpf_Strings) - 1 do
begin
arStringEdits[k][j][i] := TEdit.Create(srl_PlayerForm);
arStringEdits[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Strings[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

for j := 0 to Length(srlpf_Extendeds) - 1 do
begin
arExtendedEdits[k][j][i] := TEdit.Create(srl_PlayerForm);
arExtendedEdits[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Extendeds[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

end;
end;
end;
end;

{*******************************************************************************
procedure SwitchInTabArray(NewPlace, OldPlace: Integer; var V: array of TTabSheet);
By: Sumilion
Description: Switches values in a TTabSheet array
*******************************************************************************}

procedure SwitchInTabArray(NewPlace, OldPlace: Integer; var V: array of TTabSheet);
var
k: Integer;
TempVarArray, TempAffectedArray: array of TTabSheet;
begin
SetLength(TempVarArray, Length(V));
SetLength(TempAffectedArray, 1 + (iAbs(OldPlace - NewPlace)));
for k := 0 to Length(V) - 1 do
TempVarArray[k] := V[k];
TempVarArray[NewPlace] := V[OldPlace];
if(OldPlace > NewPlace)then
begin
for k := NewPlace to OldPlace - 1 do
TempAffectedArray[k - NewPlace] := V[k];
for k := NewPlace + 1 to OldPlace do
TempVarArray[k] := TempAffectedArray[k - (NewPlace + 1)];
end else
begin
for k := OldPlace + 1 to NewPlace do
TempAffectedArray[k - (OldPlace + 1)] := V[k];
for k := OldPlace to NewPlace - 1 do
TempVarArray[k] := TempAffectedArray[k - OldPlace];
end;

V := TempVarArray;
end;

{*******************************************************************************
procedure SwitchInEditArray(NewPlace, OldPlace: Integer; var V: array of TEdit);
By: Sumilion
Description: Switches values in a TEdit array
*******************************************************************************}

procedure SwitchInEditArray(NewPlace, OldPlace: Integer; var V: array of TEdit);
var
k: Integer;
TempVarArray, TempAffectedArray: array of TEdit;
begin
SetLength(TempVarArray, Length(V));
SetLength(TempAffectedArray, 1 + (iAbs(OldPlace - NewPlace)));
for k := 0 to Length(V) - 1 do
TempVarArray[k] := V[k];
TempVarArray[NewPlace] := V[OldPlace];
if(OldPlace > NewPlace)then
begin
for k := NewPlace to OldPlace - 1 do
TempAffectedArray[k - NewPlace] := V[k];
for k := NewPlace + 1 to OldPlace do
TempVarArray[k] := TempAffectedArray[k - (NewPlace + 1)];
end else
begin
for k := OldPlace + 1 to NewPlace do
TempAffectedArray[k - (OldPlace + 1)] := V[k];
for k := OldPlace to NewPlace - 1 do
TempVarArray[k] := TempAffectedArray[k - OldPlace];
end;

V := TempVarArray;
end;

{*******************************************************************************
procedure SwitchInComboArray(NewPlace, OldPlace: Integer; var V: array of TComboBox);
By: Sumilion
Description: Switches values in a TComboBox array
*******************************************************************************}

procedure SwitchInComboArray(NewPlace, OldPlace: Integer; var V: array of TComboBox);
var
k: Integer;
TempVarArray, TempAffectedArray: array of TComboBox;
begin
SetLength(TempVarArray, Length(V));
SetLength(TempAffectedArray, 1 + (iAbs(OldPlace - NewPlace)));
for k := 0 to Length(V) - 1 do
TempVarArray[k] := V[k];
TempVarArray[NewPlace] := V[OldPlace];
if(OldPlace > NewPlace)then
begin
for k := NewPlace to OldPlace - 1 do
TempAffectedArray[k - NewPlace] := V[k];
for k := NewPlace + 1 to OldPlace do
TempVarArray[k] := TempAffectedArray[k - (NewPlace + 1)];
end else
begin
for k := OldPlace + 1 to NewPlace do
TempAffectedArray[k - (OldPlace + 1)] := V[k];
for k := OldPlace to NewPlace - 1 do
TempVarArray[k] := TempAffectedArray[k - OldPlace];
end;

V := TempVarArray;
end;

{*******************************************************************************
procedure OnSRLPFMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
By: Sumilion
Description: Form action on Mouse click
*******************************************************************************}

procedure OnSRLPFMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
i, ArmyIndex: Integer;
MousePosPoint: TPoint;
RightClick: Boolean;
begin
RightClick := Button;
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;
case Sender of
srlpf_PlayerPageControl[ArmyIndex]:
begin
if(RightClick)then
begin
srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex := srlpf_PlayerPageControl[ArmyIndex].IndexOfTabAt(x, y);
MousePosPoint := srlpf_PlayerPageControl[ArmyIndex].ClientToScreen(IntToPoint(x, y));
srlpf_PlayerPopUpMenu.Popup(MousePosPoint.x, MousePosPoint.y);
end;
if(ssCtrl in Shift)and(not RightClick)then
begin
srlpf_PlayerPageControl[ArmyIndex].BeginDrag(False);
srlpf_PreviousTabIndex := srlpf_PlayerPageControl[ArmyIndex].ActivePage.PageIndex;
end;
end;
srlpf_ArmyPageControl:
begin
if(RightClick)then
begin
srlpf_ArmyPageControl.ActivePageIndex := srlpf_ArmyPageControl.IndexOfTabAt(x, y);
MousePosPoint := srlpf_ArmyPageControl.ClientToScreen(IntToPoint(x, y));
srlpf_ArmyPopUpMenu.Popup(MousePosPoint.x, MousePosPoint.y);
end;
end;
end;
for i := 0 to Length(PlayerPages[ArmyIndex]) - 1 do
begin
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;
end;

{*******************************************************************************
procedure OnSRLPFDragDrop(Sender, Source: TObject; X, Y: Integer);
By: Sumilion
Description: Form action on drag drop
*******************************************************************************}

procedure OnSRLPFDragDrop(Sender, Source: TObject; X, Y: Integer);
var
i, ArmyIndex, PlayerIndex : Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePage.PageIndex;

srlpf_PlayerPageControl[ArmyIndex].ActivePage.PageIndex := srlpf_PlayerPageControl[ArmyIndex].IndexOfTabAt(X, Y);

PlayerIndex := srlpf_PlayerPageControl[ArmyIndex].ActivePage.PageIndex;

SwitchInTabArray(PlayerIndex, srlpf_PreviousTabIndex, PlayerPages[ArmyIndex]);

SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arUserNameEdits[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arPasswordEdits[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arNickEdits[ArmyIndex]);
SwitchInComboArray(PlayerIndex, srlpf_PreviousTabIndex, arActiveComboBoxes[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arPinEdits[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arBoxRewardsEdits[ArmyIndex]);

for i := 0 to Length(srlpf_Booleans) - 1 do
SwitchInComboArray(PlayerIndex, srlpf_PreviousTabIndex, arBooleanComboBoxes[ArmyIndex][i]);

for i := 0 to Length(srlpf_Integers) - 1 do
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arIntegerEdits[ArmyIndex][i]);

for i := 0 to Length(srlpf_Strings) - 1 do
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arStringEdits[ArmyIndex][i]);

for i := 0 to Length(srlpf_Extendeds) - 1 do
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arExtendedEdits[ArmyIndex][i]);

for i := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;

{*******************************************************************************
procedure OnSRLPFDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
By: Sumilion
Description: Form action on drag over
*******************************************************************************}

procedure OnSRLPFDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := (Sender is TPageControl);
end;

{*******************************************************************************
procedure DeleteInEditArray(SpotToDelete: Integer; var V: array of TEdit);
By: Sumilion
Description: Deletes a value in a TEdit array
*******************************************************************************}

procedure DeleteInEditArray(SpotToDelete: Integer; var V: array of TEdit);
var
k, l: Integer;
TempVarArray: array of TEdit;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInEditArrayOfArray(SpotToDelete: Integer; var V: array of array of TEdit);
By: Sumilion
Description: Deletes a value in a TEdit array
*******************************************************************************}

procedure DeleteInEditArrayOfArray(SpotToDelete: Integer; var V: array of array of TEdit);
var
k, l: Integer;
TempVarArray: array of array of TEdit;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInEditArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TEdit);
By: Sumilion
Description: Deletes a value in a TEdit array
*******************************************************************************}

procedure DeleteInEditArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TEdit);
var
k, l: Integer;
TempVarArray: array of array of array of TEdit;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInComboArray(SpotToDelete: Integer; var V: array of TComboBox);
By: Sumilion
Description: Deletes a value in a TComboBox array
*******************************************************************************}

procedure DeleteInComboArray(SpotToDelete: Integer; var V: array of TComboBox);
var
k, l: Integer;
TempVarArray: array of TComboBox;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInComboArrayOfArray(SpotToDelete: Integer; var V: array of array of TComboBox);
By: Sumilion
Description: Deletes a value in a TComboBox array
*******************************************************************************}

procedure DeleteInComboArrayOfArray(SpotToDelete: Integer; var V: array of array of TComboBox);
var
k, l: Integer;
TempVarArray: array of array of TComboBox;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInComboArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TComboBox);
By: Sumilion
Description: Deletes a value in a TComboBox array
*******************************************************************************}

procedure DeleteInComboArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TComboBox);
var
k, l: Integer;
TempVarArray: array of array of array of TComboBox;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInTabArray(SpotToDelete: Integer; var V: array of TTabSheet);
By: Sumilion
Description: Deletes a value in a TTabSheet array
*******************************************************************************}

procedure DeleteInTabArray(SpotToDelete: Integer; var V: array of TTabSheet);
var
k, l: Integer;
TempVarArray: array of TTabSheet;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInTabArrayOfArray(SpotToDelete: Integer; var V: array of array of TTabSheet);
By: Sumilion
Description: Deletes a value in a TTabSheet array
*******************************************************************************}

procedure DeleteInTabArrayOfArray(SpotToDelete: Integer; var V: array of array of TTabSheet);
var
k, l: Integer;
TempVarArray: array of array of TTabSheet;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInPageControlArray(SpotToDelete: Integer; var V: array of TPageControl);
By: Sumilion
Description: Deletes a value in a TTabSheet array
*******************************************************************************}

procedure DeleteInPageControlArray(SpotToDelete: Integer; var V: array of TPageControl);
var
k, l: Integer;
TempVarArray: array of TPageControl;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure SetLabelsParent(Parent: Integer);
By: Sumilion
Description: Sets all labels to the desired parent
*******************************************************************************}

procedure SetLabelsParent(Army, Tab: Integer);
var
i: Integer;
begin
UserNameLabel.Parent := PlayerPages[Army][Tab];
PasswordLabel.Parent := PlayerPages[Army][Tab];
NickLabel.Parent := PlayerPages[Army][Tab];
ActiveLabel.Parent := PlayerPages[Army][Tab];
PinLabel.Parent := PlayerPages[Army][Tab];
BoxRewardsLabel.Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Booleans) - 1 do
arBooleanLabels[i].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Integers) - 1 do
arIntegerLabels[i].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Strings) - 1 do
arStringLabels[i].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Extendeds) - 1 do
arExtendedLabels[i].Parent := PlayerPages[Army][Tab];
end;

{*******************************************************************************
procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer);
By: Sumilion
Description: Deletes a player in a desired tab and goes to the next desired tab.
*******************************************************************************}

procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer);
var
i, d, ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;

if(srlpf_PlayerPageControl[ArmyIndex].PageCount = 1)then
Exit;

if(NextPlayerTab < 0)then
NextPlayerTab := 0;
for i := PlayerNumber + 1 to Length(PlayerPages[ArmyNumber]) - 1 do
begin
arUserNameEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arPasswordEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arNickEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arActiveComboBoxes[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arPinEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arBoxRewardsEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Booleans) - 1 do
arBooleanComboBoxes[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Integers) - 1 do
arIntegerEdits[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Strings) - 1 do
arStringEdits[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Extendeds) - 1 do
arExtendedEdits[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

end;

PlayerPages[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1].Free;

SetLength(PlayerPages[ArmyNumber], srlpf_PlayerPageControl[ArmyNumber].PageCount);

DeleteInEditArray(PlayerNumber, arUserNameEdits[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arPasswordEdits[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arNickEdits[ArmyNumber]);
DeleteInComboArray(PlayerNumber, arActiveComboBoxes[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arPinEdits[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arBoxRewardsEdits[ArmyNumber]);
for d := 0 to Length(srlpf_Booleans) - 1 do
DeleteInComboArray(PlayerNumber, arBooleanComboBoxes[ArmyNumber][d]);

for d := 0 to Length(srlpf_Integers) - 1 do
DeleteInEditArray(PlayerNumber, arIntegerEdits[ArmyNumber][d]);

for d := 0 to Length(srlpf_Strings) - 1 do
DeleteInEditArray(PlayerNumber, arStringEdits[ArmyNumber][d]);

for d := 0 to Length(srlpf_Extendeds) - 1 do
DeleteInEditArray(PlayerNumber, arExtendedEdits[ArmyNumber][d]);

srlpf_ArmyPageControl.ActivePageIndex := ArmyIndex;
srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex := NextPlayerTab;
if(srlpf_PlayerPageControl[ArmyIndex].PageCount = 1)then
srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex := 0;
end;

{*******************************************************************************
procedure ClearPlayerInTab(ArmyNumber, PlayerNumber: Integer);
By: Sumilion
Description: Clears player settings in tab
*******************************************************************************}

procedure ClearPlayerInTab(ArmyNumber, PlayerNumber: Integer);
var
i: Integer;
begin
arUserNameEdits[ArmyNumber][PlayerNumber].Text := '';
arPasswordEdits[ArmyNumber][PlayerNumber].Text := '';
arNickEdits[ArmyNumber][PlayerNumber].Text := '';
arActiveComboBoxes[ArmyNumber][PlayerNumber].Text := 'True';
arPinEdits[ArmyNumber][PlayerNumber].Text := '';
arBoxRewardsEdits[ArmyNumber][PlayerNumber].Text := '';

for i := 0 to Length(arBooleanComboBoxes[ArmyNumber]) - 1 do
arBooleanComboBoxes[ArmyNumber][i][PlayerNumber].Text := 'False';

for i := 0 to Length(arIntegerEdits[ArmyNumber]) - 1 do
arIntegerEdits[ArmyNumber][i][PlayerNumber].Text := '';

for i := 0 to Length(arStringEdits[ArmyNumber]) - 1 do
arStringEdits[ArmyNumber][i][PlayerNumber].Text := '';

for i := 0 to Length(arExtendedEdits[ArmyNumber]) - 1 do
arExtendedEdits[ArmyNumber][i][PlayerNumber].Text := '';

PlayerPages[ArmyNumber][PlayerNumber].Caption := 'Player ' + IntToStr(PlayerNumber);
end;

{*******************************************************************************
procedure AddPlayerInTab(ArmyNumber: Integer);
By: Sumilion
Description: Deletes a player in a desired tab and goes to the next desired tab.
*******************************************************************************}

procedure AddPlayerInTab(ArmyNumber: Integer);
var
i: Integer;
begin
SetLength(PlayerPages[ArmyNumber], Length(PlayerPages[ArmyNumber]) + 1);
SetSRLPlayerFormArrays;

arUserNameEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arNickEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arActiveComboBoxes[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TComboBox.Create(srl_PlayerForm);
arActiveComboBoxes[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1].Text := 'True';
arPinEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arBoxRewardsEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arBooleanComboBoxes[ArmyNumber]) - 1 do
arBooleanComboBoxes[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TComboBox.Create(srl_PlayerForm);

for i := 0 to Length(arIntegerEdits[ArmyNumber]) - 1 do
arIntegerEdits[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arStringEdits[ArmyNumber]) - 1 do
arStringEdits[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arExtendedEdits[ArmyNumber]) - 1 do
arExtendedEdits[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

FillSRLPlayerFormTab(ArmyNumber, Length(PlayerPages[ArmyNumber]) - 1);
if(ArmyNumber = srlpf_ArmyPageControl.ActivePageIndex)then
srlpf_PlayerPageControl[ArmyNumber].ActivePageIndex := Length(PlayerPages[ArmyNumber]) - 1;
end;

{*******************************************************************************
procedure AddArmy;
By: Sumilion
Description: Adds an army to the form
*******************************************************************************}

procedure AddArmy;
var
i: Integer;
begin
SetLength(ArmyPages, Length(ArmyPages) + 1);
SetLength(srlpf_PlayerPageControl, Length(ArmyPages));

ArmyPages[Length(ArmyPages) - 1] := TTabSheet.Create(srl_PlayerForm);
ArmyPages[Length(ArmyPages) - 1].Caption := 'Army ' + IntToStr(Length(ArmyPages) - 1);
ArmyPages[Length(ArmyPages) - 1].PageControl := srlpf_ArmyPageControl;
ArmyPages[Length(ArmyPages) - 1].OnShow := @OnSRLPFShow;

srlpf_PlayerPageControl[Length(ArmyPages) - 1] := TPageControl.Create(srl_PlayerForm);
with srlpf_PlayerPageControl[Length(ArmyPages) - 1] do
begin
Parent := ArmyPages[Length(ArmyPages) - 1];
Width := ArmyPages[Length(ArmyPages) - 1].Width;
Height := ArmyPages[Length(ArmyPages) - 1].Height;
Align := alBottom;
OnMouseDown := @OnSRLPFMouseDown;
OnDragDrop := @OnSRLPFDragDrop;
OnDragOver := @OnSRLPFDragOver;
end;

SetLength(PlayerPages, Length(ArmyPages));
SetLength(PlayerPages[Length(ArmyPages) - 1], 1);
SetSRLPlayerFormArrays;

arUserNameEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arNickEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arActiveComboBoxes[Length(ArmyPages) - 1][0] := TComboBox.Create(srl_PlayerForm);
arActiveComboBoxes[Length(ArmyPages) - 1][0].Text := 'True';
arPinEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arBoxRewardsEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arBooleanComboBoxes[Length(ArmyPages) - 1]) - 1 do
arBooleanComboBoxes[Length(ArmyPages) - 1][i][0] := TComboBox.Create(srl_PlayerForm);

for i := 0 to Length(arIntegerEdits[Length(ArmyPages) - 1]) - 1 do
arIntegerEdits[Length(ArmyPages) - 1][i][0] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arStringEdits[Length(ArmyPages) - 1]) - 1 do
arStringEdits[Length(ArmyPages) - 1][i][0] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arExtendedEdits[Length(ArmyPages) - 1]) - 1 do
arExtendedEdits[Length(ArmyPages) - 1][i][0] := TEdit.Create(srl_PlayerForm);

FillSRLPlayerFormTab(Length(ArmyPages) - 1, 0);

srlpf_ArmyPageControl.ActivePageIndex := Length(ArmyPages) - 1;
end;

{*******************************************************************************
procedure DeleteArmy(ArmyNumber, NextArmyTab: Integer);
By: Sumilion
Description: Deletes an army in the form
*******************************************************************************}

procedure DeleteArmy(ArmyNumber, NextArmyTab: Integer);
var
i, j: Integer;
begin
if(NextArmyTab < 0)then
NextArmyTab := 0;
if(srlpf_ArmyPageControl.PageCount = 1)then
Exit;
if Armynumber > 0 then
srlpf_ArmyPageControl.ActivePageIndex := NextArmyTab
else
srlpf_ArmyPageControl.ActivePageIndex := 0;
if((srlpf_ArmyPageControl.PageCount - 1) > ArmyNumber)then
j := ArmyNumber + 1
else
j := ArmyNumber - 1;

for i := ArmyNumber + 1 to Length(ArmyPages) - 1 do
begin
srlpf_PlayerPageControl[i].Parent := ArmyPages[i - 1];
ArmyPages[i - 1].Caption := ArmyPages[i].Caption;
end;

srlpf_PlayerPageControl[ArmyNumber].Free;
ArmyPages[Length(ArmyPages) - 1].Free;
SetLength(ArmyPages, Length(ArmyPages) - 1);

DeleteInEditArrayOfArray(ArmyNumber, arUserNameEdits);
DeleteInEditArrayOfArray(ArmyNumber, arPasswordEdits);
DeleteInEditArrayOfArray(ArmyNumber, arNickEdits);
DeleteInComboArrayOfArray(ArmyNumber, arActiveComboBoxes);
DeleteInEditArrayOfArray(ArmyNumber, arPinEdits);
DeleteInEditArrayOfArray(ArmyNumber, arBoxRewardsEdits);
DeleteInComboArrayOfArrayOfArray(ArmyNumber, arBooleanComboBoxes);
DeleteInEditArrayOfArrayOfArray(ArmyNumber, arIntegerEdits);
DeleteInEditArrayOfArrayOfArray(ArmyNumber, arStringEdits);
DeleteInEditArrayOfArrayOfArray(ArmyNumber, arExtendedEdits);
DeleteInTabArrayOfArray(ArmyNumber, PlayerPages);
DeleteInPageControlArray(ArmyNumber, srlpf_PlayerPageControl);

srlpf_ArmyPageControl.ActivePageIndex := NextArmyTab;
//srlpf_PlayerPageControl[NextArmyTab].ActivePageIndex := 0;

for i := 0 to Length(ArmyPages) - 1 do
begin
if(Pos('Army', ArmyPages[i].Caption) = 1)then
ArmyPages[i].Caption := 'Army ' + IntToStr(i);
end;
end;

{*******************************************************************************
procedure RenameArmy(ArmyNumber: Integer);
By: Sumilion
Description: Renames an army's name
*******************************************************************************}

procedure RenameArmy(ArmyNumber: Integer);
var
ArmyName: string;
begin
ArmyName := Readln('New army name for : ' + ArmyPages[ArmyNumber].Caption +
Chr(13) + '(Leave blank for default)');
if(ArmyName = '')then
ArmyPages[ArmyNumber].Caption := 'Army ' + IntToStr(ArmyNumber)
else
ArmyPages[ArmyNumber].Caption := ArmyName;
end;

{*******************************************************************************
procedure ExportPlayerData;
By: Starblaster100 / Sumilion
Description: Turns the info input into the forms into a copy and pasteable
DeclarePlayers procedure
*******************************************************************************}

procedure ExportPlayerData;
var
i, j, ArmyIndex: Integer;
TempString: string;
OpenDialog1 : TSaveDialog;
a: TStringList;
begin
OpenDialog1 := TSaveDialog.Create(srl_PlayerForm);
a := TStringList.Create;

with OpenDialog1 do
begin
InitialDir := ScriptPath;
Filter := 'SCAR Scripts (*.scar)|*.scar|';
if(Execute)then
begin
if(ExtractFileExt(FileName) = '')then
TempString := FileName + '.scar'
else
TempString := FileName;
end else
begin
a.Free;
Free;
Exit;
end;
Free;
end;

ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;

a.Text := a.Text + 'procedure DeclarePlayers;' + Chr(13);
a.Text := a.Text + 'begin' + Chr(13);
a.Text := a.Text + ' NumberOfPlayers(' +IntToStr(Length(PlayerPages[ArmyIndex]))+ ');' + Chr(13);
a.Text := a.Text + ' HowManyBooleans := ' +IntToStr(Length(srlpf_Booleans))+ ';' + Chr(13);

for i := 0 to Length(PlayerPages[ArmyIndex])-1 do
begin
a.Text := a.Text + Chr(13);
if(arUserNameEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Name := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Name := ''' + arUserNameEdits[ArmyIndex][i].Text + ''';' + Chr(13);

if(arPasswordEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pass := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pass := ''' + arPasswordEdits[ArmyIndex][i].Text + ''';' + Chr(13);

if(arNickEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Nick := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Nick := ''' + arNickEdits[ArmyIndex][i].Text + ''';' + Chr(13);

a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Active := ' + arActiveComboBoxes[ArmyIndex][i].Text + ';' + Chr(13);

if(arPinEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pin := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pin := ''' + arPinEdits[ArmyIndex][i].Text + ''';' + Chr(13);

if(arBoxRewardsEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].BoxRewards := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].BoxRewards := ''' + arBoxRewardsEdits[ArmyIndex][i].Text + ''';' + Chr(13);

for j := 0 to Length(srlpf_Booleans) - 1 do
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Booleans[' + IntToStr(j) + '] := ' + arBooleanComboBoxes[ArmyIndex][j][i].Text + ';' + Chr(13);

for j := 0 to Length(srlpf_Integers) - 1 do
if(arIntegerEdits[ArmyIndex][j][i].Text = '')then
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Integers[' + IntToStr(j) + '] := 0;' + Chr(13)
else
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Integers[' + IntToStr(j) + '] := ' + arIntegerEdits[ArmyIndex][j][i].Text + ';' + Chr(13);

for j := 0 to Length(srlpf_Strings) - 1 do
if(arStringEdits[ArmyIndex][j][i].Text = '')then
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Strings[' + IntToStr(j) + '] := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Strings[' + IntToStr(j) + '] := ''' + arStringEdits[ArmyIndex][j][i].Text + ''';' + Chr(13);

for j := 0 to Length(srlpf_Extendeds) - 1 do
if(arExtendedEdits[ArmyIndex][j][i].Text = '')then
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Extendeds[' + IntToStr(j) + '] := 0.0;' + Chr(13)
else
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Extendeds[' + IntToStr(j) + '] := ' + arExtendedEdits[ArmyIndex][j][i].Text + ';' + Chr(13);
end;
a.Text := a.Text + 'end;' + Chr(13);

try
SaveToFile(a, TempString);
except
a.Free;
GetApplication.MessageBox('File not found!', '', 0);
Exit;
end;
end;

{*******************************************************************************
procedure ImportPlayerData;
By: Starblaster100 / Sumilion
Description: Inputs information from the DeclarePlayers procedure into the form
*******************************************************************************}

procedure ImportPlayerData;
var
i, j, ArmyIndex: Integer;
DeclarePlayers, TempString: string;
OpenDialog1 : TOpenDialog;
a: TStringList;
begin
OpenDialog1 := TOpenDialog.Create(srl_PlayerForm);
a := TStringList.Create;

with OpenDialog1 do
begin
InitialDir := ScriptPath;
Options := [ofFileMustExist, ofReadOnly];
Filter := 'SCAR Scripts (*.scar)|*.scar|' +
'Text Files (*.txt)|*.txt|' +
'All Files|*|';
if(Execute)then
TempString := FileName
else
begin
a.Free;
Free;
Exit;
end;
Free;
end;

try
LoadFromFile(a, TempString);
except
a.Free;
GetApplication.MessageBox('File not found!', '', 0);
Exit;
end;

DeclarePlayers := LowerCase(a.Text);
AddArmy;
a.Free;

HowManyPlayers := StrToIntDef(Between('numberofplayers(', ');', DeclarePlayers), 0);
if(HowManyPlayers = 0)then
HowManyPlayers := StrToIntDef(Between('howmanyplayers := ', ';', DeclarePlayers), 1);


ArmyIndex := srlpf_ArmyPageControl.PageCount - 1;
for i := 0 to HowManyPlayers - 2 do
AddPlayerInTab(ArmyIndex);

for i := 0 to HowManyPlayers - 1 do
begin
arUserNameEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].name := ''', ''';', DeclarePlayers);
arPassWordEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].pass := ''', ''';', DeclarePlayers);
arNickEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].nick := ''', ''';', DeclarePlayers);
arActiveComboBoxes[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].active := ', ';', DeclarePlayers);
arPinEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].pin := ''', ''';', DeclarePlayers);
arBoxRewardsEdits[ArmyIndex][i].Text := Replace(Between('players[' + IntToStr(i) + '].boxrewards := ''', ''';', DeclarePlayers), ' ', '');

for j := 0 to Length(srlpf_Booleans) - 1 do
arBooleanComboBoxes[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].booleans[' +IntToStr(j)+ '] := ', ';', DeclarePlayers);

for j := 0 to Length(srlpf_Integers) - 1 do
arIntegerEdits[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].integers[' +IntToStr(j)+ '] := ', ';', DeclarePlayers);

for j := 0 to Length(srlpf_Strings) - 1 do
arStringEdits[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].strings[' +IntToStr(j)+ '] := ''', ''';', DeclarePlayers);

for j := 0 to Length(srlpf_Extendeds) - 1 do
arExtendedEdits[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].extendeds[' +IntToStr(j)+ '] := ', ';', DeclarePlayers);

if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;
end;

{*******************************************************************************
procedure OnSRLPFMainMenuClick(Sender: TObject);
By: Sumilion
Description: Form actions on the MainMenu items
*******************************************************************************}

procedure OnSRLPFMainMenuClick(Sender: TObject);
var
i, j, ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePage.PageIndex;

case Sender of
AddPlayerItem: AddPlayerInTab(ArmyIndex);

DeletePlayersItem:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Delete';
CheckListForm.Caption := 'Delete Players :';
for i := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(PlayerPages[ArmyIndex][i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
if(srlpf_PlayerPageControl[ArmyIndex].PageCount > 1)then
if(i = ArmyIndex)then
DeletePlayerInTab(ArmyIndex, i, i - 1)
else
DeletePlayerInTab(ArmyIndex, i, ArmyIndex);
end;
FreeForm(CheckListForm);
end;

ClearPlayersItem:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Clear';
CheckListForm.Caption := 'Clear Players :';
for i := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(PlayerPages[ArmyIndex][i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
ClearPlayerInTab(ArmyIndex, i);
end;
FreeForm(CheckListForm);
end;

AddArmyItem: AddArmy;

DeleteArmiesItem:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Delete';
CheckListForm.Caption := 'Delete Armies :';
for i := 0 to srlpf_ArmyPageControl.PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(ArmyPages[i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
if(srlpf_ArmyPageControl.PageCount > 1)then
DeleteArmy(i, i - 1);
end;
FreeForm(CheckListForm);
end;

ClearArmiesItem:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Clear';
CheckListForm.Caption := 'Clear Armies :';
for i := 0 to srlpf_ArmyPageControl.PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(ArmyPages[i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
for j := 0 to srlpf_PlayerPageControl[i].PageCount - 1 do
ClearPlayerInTab(i, j);
end;
FreeForm(CheckListForm);
end;

RenameArmyItem: RenameArmy(ArmyIndex);

SaveAndStart: srl_PlayerForm.ModalResult := mrOk;

SaveAndExit:
begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;

JustExitItem:
begin
srlpf_SaveWhenDone := False;
srl_PlayerForm.ModalResult := mrOk;
end;

JustStartItem:
begin
srlpf_SaveWhenDone := False;
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;

ExportPlayersItem: ExportPlayerData;

ImportPlayersItem: ImportPlayerData;

end;
end;

{*******************************************************************************
procedure OnSRLPFClick(Sender: TObject);
By: Sumilion
Description: Form action on a click on a button
*******************************************************************************}

procedure OnSRLPFClick(Sender: TObject);
var
c, i, ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePage.PageIndex;

case Sender of
PreviousButton:
begin
srlpf_PlayerPageControl[ArmyIndex].ActivePage := srlpf_PlayerPageControl[ArmyIndex].FindNextPage(srlpf_PlayerPageControl[ArmyIndex].ActivePage,
False, True);
end;

DelPlayerButton:
begin
c := srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex;

DeletePlayerInTab(ArmyIndex, c, c - 1);
end;

AddPlayerButton: AddPlayerInTab(ArmyIndex);

NextButton: srlpf_PlayerPageControl[ArmyIndex].ActivePage := srlpf_PlayerPageControl[ArmyIndex].FindNextPage(srlpf_PlayerPageControl[ArmyIndex].ActivePage, True, True);

CheckListButton: CheckListForm.ModalResult := mrOk;

StartButton: begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_SaveWhenDone := False;
end;

ExitButton: Begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;

SaveExitButton: begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;

SaveStartButton: srl_PlayerForm.ModalResult := mrOk;

end;

for i := c to Length(PlayerPages[ArmyIndex]) - 1 do
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;

{*******************************************************************************
procedure OnSRLPFShow(Sender: TObject);
By: Sumilion
Description: Form action on a Tab show
*******************************************************************************}

procedure OnSRLPFShow(Sender: TObject);
var
i, j: Integer;
begin
for i := 0 to Length(ArmyPages) - 1 do
if(ArmyPages[i] = Sender)then
begin
SetLabelsParent(i, srlpf_PlayerPageControl[i].ActivePageIndex);
Exit;
end;

i := srlpf_ArmyPageControl.ActivePageIndex;

for j := 0 to Length(PlayerPages[i]) - 1 do
if(PlayerPages[i][j] = Sender)then
begin
SetLabelsParent(i, j);
Exit;
end;
end;

{*******************************************************************************
procedure SRLPFMenuClick(Sender: TObject);
By: Sumilion
Description: Form action on Menu click
*******************************************************************************}

procedure SRLPFMenuClick(Sender: TObject);
var
c, ArmyIndex, PlayerIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;
PlayerIndex := srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex;
case Sender of
AddArmyPopUp: AddArmy;

DelArmyPopUp:
begin
c := srlpf_ArmyPageControl.ActivePageIndex;
DeleteArmy(c, c - 1);
end;

ChangeArmyNamePopUp: RenameArmy(srlpf_ArmyPageControl.ActivePageIndex);

ClearArmyPopUp:
begin
for c := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
ClearPlayerInTab(ArmyIndex, c);
end;

AddPlayerPopUp: AddPlayerInTab(ArmyIndex);

DelPlayerPopUp:
begin
DeletePlayerInTab(ArmyIndex, PlayerIndex, PlayerIndex - 1);
for c := PlayerIndex to Length(PlayerPages[ArmyIndex]) - 1 do
if(arUserNameEdits[ArmyIndex][c].Text <> '')then
PlayerPages[ArmyIndex][c].Caption := arUserNameEdits[ArmyIndex][c].Text
else
PlayerPages[ArmyIndex][c].Caption := 'Player ' + IntToStr(c);
end;

ClearPlayerPopUp: ClearPlayerInTab(ArmyIndex, PlayerIndex);
end;
end;

{*******************************************************************************
procedure SetSRLPlayerFormArrays;
By: Sumilion
Description: Sets the arrays for the form
*******************************************************************************}

procedure SetSRLPlayerFormArrays;
var
i, j: Integer;
begin
SetLength(srlpf_PlayerPageControl, Length(ArmyPages));

SetLength(arUserNameEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arUserNameEdits[i], Length(PlayerPages[i]));

SetLength(arPasswordEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arPasswordEdits[i], Length(PlayerPages[i]));

SetLength(arNickEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arNickEdits[i], Length(PlayerPages[i]));

SetLength(arActiveComboBoxes, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arActiveComboBoxes[i], Length(PlayerPages[i]));

SetLength(arPinEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arPinEdits[i], Length(PlayerPages[i]));

SetLength(arBoxRewardsEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arBoxRewardsEdits[i], Length(PlayerPages[i]));

SetLength(arBooleanLabels, Length(srlpf_Booleans));
SetLength(arBooleanComboBoxes, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arBooleanComboBoxes[i], Length(srlpf_Booleans));
for j := 0 to Length(arBooleanComboBoxes[i]) - 1 do
SetLength(arBooleanComboBoxes[i][j], Length(PlayerPages[i]));
end;

SetLength(arIntegerLabels, Length(srlpf_Integers));
SetLength(arIntegerEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arIntegerEdits[i], Length(srlpf_Integers));
for j := 0 to Length(arIntegerEdits[i]) - 1 do
SetLength(arIntegerEdits[i][j], Length(PlayerPages[i]));
end;

SetLength(arStringLabels, Length(srlpf_Strings));
SetLength(arStringEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arStringEdits[i], Length(srlpf_Strings));
for j := 0 to Length(arStringEdits[i]) - 1 do
SetLength(arStringEdits[i][j], Length(PlayerPages[i]));
end;

SetLength(arExtendedLabels, Length(srlpf_Extendeds));
SetLength(arExtendedEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arExtendedEdits[i], Length(srlpf_Extendeds));
for j := 0 to Length(arExtendedEdits[i]) - 1 do
SetLength(arExtendedEdits[i][j], Length(PlayerPages[i]));
end;
end;

{*******************************************************************************
procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer);
By: Sumilion
Description: Fills the tabs with components
*******************************************************************************}

procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer);
var
a, b: Integer;
begin
b := 0;

PlayerPages[ArmyNumber][TabNumber] := TTabSheet.Create(srl_PlayerForm);

with PlayerPages[ArmyNumber][TabNumber] do
begin
if(arUserNameEdits[ArmyNumber][TabNumber].Text <> '')then
Caption := arUserNameEdits[ArmyNumber][TabNumber].Text
else
Caption := 'Player ' + IntToStr(TabNumber);
PageControl := srlpf_PlayerPageControl[ArmyNumber];
Parent := srlpf_PlayerPageControl[ArmyNumber];
OnMouseDown := @OnSRLPFMouseDown;
OnShow := @OnSRLPFShow;
end;

with arUserNameEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 53;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

with arPasswordEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 83;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

with arNickEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 113;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

with arActiveComboBoxes[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 143;
Width := 121;
Height := 21;
ItemHeight := 13;
TabOrder := 8;
OnClick := @OnSRLPFClick;
Items.Add('True');
Items.Add('False');
end;

with arPinEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 173;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

with arBoxRewardsEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

for a := 0 to Length(srlpf_Booleans) - 1 do
begin
b := b + 1;

with arBooleanLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Booleans[a] = '')then
Caption := 'Boolean[' + IntToStr(a) + ']'
else
Caption := srlpf_Booleans[a];
end;

with arBooleanComboBoxes[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203 + (b * 30);
Width := 121;
Height := 21;
ItemHeight := 13;
TabOrder := 8;
OnClick := @OnSRLPFClick;
if(Text = '')then
Text := 'False';
Items.Add('True');
Items.Add('False');
end;
end;

for a := 0 to Length(srlpf_Integers) - 1 do
begin
b := b + 1;

with arIntegerLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Integers[a] = '')then
Caption := 'Integer[' + IntToStr(a) + ']'
else
Caption := srlpf_Integers[a];
end;

with arIntegerEdits[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203 + (b * 30);
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;
end;

for a := 0 to Length(srlpf_Strings) - 1 do
begin
b := b + 1;

with arStringLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Strings[a] = '')then
Caption := 'String[' + IntToStr(a) + ']'
else
Caption := srlpf_Strings[a];
end;

with arStringEdits[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203 + (b * 30);
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;
end;

for a := 0 to Length(srlpf_Extendeds) - 1 do
begin
b := b + 1;

with arExtendedLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Extendeds[a] = '')then
Caption := 'Extended[' + IntToStr(a) + ']'
else
Caption := srlpf_Extendeds[a];
end;

with arExtendedEdits[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203 + (b * 30);
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;
end;
end;

{*******************************************************************************
procedure LoadSRLPlayerForm;
By: Sumilion
Description: Loads the main SRL player form
*******************************************************************************}

procedure LoadSRLPlayerForm;
var
i, j, ArmyIndex: Integer;
begin
srl_PlayerForm := CreateForm;
srl_PlayerForm.Position := poDesktopCenter;
srl_PlayerForm.Width := 243;
srl_PlayerForm.Height := 385 + (Length(srlpf_Booleans) * 30) + //285 + 30 +30 = 345 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) + // + extra 40 for buttons = 385
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
srl_PlayerForm.Caption := 'SRL Playerform';
srl_PlayerForm.Color := clWhite;
srl_PlayerForm.Font.Color := clWindowText;
srl_PlayerForm.Font.Height := -11;
srl_PlayerForm.Font.Name := 'MS Sans Serif';
srl_PlayerForm.Font.Style := [];
srl_PlayerForm.Visible := False;
srl_PlayerForm.PixelsPerInch := 96;
srl_PlayerForm.BorderIcons := [biSystemMenu];
srl_PlayerForm.BorderStyle := bsSingle;

srlpf_MainMenu := TMainMenu.Create(srl_PlayerForm);

FileItem := TMenuItem.Create(srl_PlayerForm);
FileItem.Caption := 'File';

ImportPlayersItem := TMenuItem.Create(srl_PlayerForm);
ImportPlayersItem.Caption := 'Import Players';
ImportPlayersItem.OnClick := @OnSRLPFMainMenuClick;

ExportPlayersItem := TMenuItem.Create(srl_PlayerForm);
ExportPlayersItem.Caption := 'Export Players';
ExportPlayersItem.OnClick := @OnSRLPFMainMenuClick;

srlpf_MainMenu.Items.Add(FileItem);
srlpf_MainMenu.Items.Items[0].Add(ImportPlayersItem);
srlpf_MainMenu.Items.Items[0].Add(ExportPlayersItem);

PlayerControlItem := TMenuItem.Create(srl_PlayerForm);
PlayerControlItem.Caption := 'Player Control';

AddPlayerItem := TMenuItem.Create(srl_PlayerForm);
AddPlayerItem.Caption := 'Add Player';
AddPlayerItem.OnClick := @OnSRLPFMainMenuClick;

DeletePlayersItem := TMenuItem.Create(srl_PlayerForm);
DeletePlayersItem.Caption := 'Delete Players';
DeletePlayersItem.OnClick := @OnSRLPFMainMenuClick;

ClearPlayersItem := TMenuItem.Create(srl_PlayerForm);
ClearPlayersItem.Caption := 'Clear Players';
ClearPlayersItem.OnClick := @OnSRLPFMainMenuClick;

srlpf_MainMenu.Items.Add(PlayerControlItem);
srlpf_MainMenu.Items.Items[1].Add(AddPlayerItem);
srlpf_MainMenu.Items.Items[1].Add(DeletePlayersItem);
srlpf_MainMenu.Items.Items[1].Add(ClearPlayersItem);

ArmyControlItem := TMenuItem.Create(srl_PlayerForm);
ArmyControlItem.Caption := 'Army Control';

AddArmyItem := TMenuItem.Create(srl_PlayerForm);
AddArmyItem.Caption := 'Add Army';
AddArmyItem.OnClick := @OnSRLPFMainMenuClick;

DeleteArmiesItem := TMenuItem.Create(srl_PlayerForm);
DeleteArmiesItem.Caption := 'Delete Armies';
DeleteArmiesItem.OnClick := @OnSRLPFMainMenuClick;

ClearArmiesItem := TMenuItem.Create(srl_PlayerForm);
ClearArmiesItem.Caption := 'Clear Armies';
ClearArmiesItem.OnClick := @OnSRLPFMainMenuClick;

RenameArmyItem := TMenuItem.Create(srl_PlayerForm);
RenameArmyItem.Caption := 'Rename Army';
RenameArmyItem.OnClick := @OnSRLPFMainMenuClick;

srlpf_MainMenu.Items.Add(ArmyControlItem);
srlpf_MainMenu.Items.Items[2].Add(AddArmyItem);
srlpf_MainMenu.Items.Items[2].Add(DeleteArmiesItem);
srlpf_MainMenu.Items.Items[2].Add(ClearArmiesItem);
srlpf_MainMenu.Items.Items[2].Add(RenameArmyItem);

ExitItem := TMenuItem.Create(srl_PlayerForm);
ExitItem.Caption := 'Exit';

SaveAndStart := TMenuItem.Create(srl_PlayerForm);
SaveAndStart.Caption := 'Save and Start';
SaveAndStart.OnClick := @OnSRLPFMainMenuClick;

SaveAndExit := TMenuItem.Create(srl_PlayerForm);
SaveAndExit.Caption := 'Save and Exit';
SaveAndExit.OnClick := @OnSRLPFMainMenuClick;

JustExitItem := TMenuItem.Create(srl_PlayerForm);
JustExitItem.Caption := 'Start';
JustExitItem.OnClick := @OnSRLPFMainMenuClick;

JustStartItem := TMenuItem.Create(srl_PlayerForm);
JustStartItem.Caption := 'Exit';
JustStartItem.OnClick := @OnSRLPFMainMenuClick;

srlpf_MainMenu.Items.Add(ExitItem);
srlpf_MainMenu.Items.Items[3].Add(SaveAndStart);
srlpf_MainMenu.Items.Items[3].Add(SaveAndExit);
srlpf_MainMenu.Items.Items[3].Add(JustExitItem);
srlpf_MainMenu.Items.Items[3].Add(JustStartItem);

srlpf_Width := 58;
for i := 0 to Length(srlpf_Booleans) - 1 do
begin
arBooleanLabels[i] := TLabel.Create(srl_PlayerForm);
arBooleanLabels[i].Caption := srlpf_Booleans[i];
srlpf_Width := Max(srlpf_Width, arBooleanLabels[i].Width);
end;

for i := 0 to Length(srlpf_Integers) - 1 do
begin
arIntegerLabels[i] := TLabel.Create(srl_PlayerForm);
arIntegerLabels[i].Caption := srlpf_Integers[i];
srlpf_Width := Max(srlpf_Width, arIntegerLabels[i].Width);
end;

for i := 0 to Length(srlpf_Strings) - 1 do
begin
arStringLabels[i] := TLabel.Create(srl_PlayerForm);
arStringLabels[i].Caption := srlpf_Strings[i];
srlpf_Width := Max(srlpf_Width, arStringLabels[i].Width);
end;

for i := 0 to Length(srlpf_Extendeds) - 1 do
begin
arExtendedLabels[i] := TLabel.Create(srl_PlayerForm);
arExtendedLabels[i].Caption := srlpf_Extendeds[i];
srlpf_Width := Max(srlpf_Width, arExtendedLabels[i].Width);
end;

srl_PlayerForm.Width := srl_PlayerForm.Width + srlpf_Width;

srlpf_ArmyPageControl := TPageControl.Create(srl_PlayerForm);
srlpf_ArmyPageControl.Parent := srl_PlayerForm;
srlpf_ArmyPageControl.Align := alNone;
srlpf_ArmyPageControl.Top := 31;
srlpf_ArmyPageControl.Width := srl_PlayerForm.Width - 4;
srlpf_ArmyPageControl.Height := 310 + (Length(srlpf_Booleans) * 30) +
(Length(srlpf_Integers) * 30) +
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
srlpf_ArmyPageControl.OnMouseDown := @OnSRLPFMouseDown;
//srlpf_ArmyPageControl.OnChange := @OnSRLPFChange;

for i := 0 to Length(ArmyPages) - 1 do
begin
ArmyPages[i] := TTabSheet.Create(srl_PlayerForm);
if(ArmyNames[i] <> '')then
ArmyPages[i].Caption := ArmyNames[i]
else
ArmyPages[i].Caption := 'Army ' + IntToStr(i);
ArmyPages[i].PageControl := srlpf_ArmyPageControl;
ArmyPages[i].OnShow := @OnSRLPFShow;
end;
srlpf_ArmyPageControl.ActivePageIndex := ActiveArmy;
ArmyIndex := ActiveArmy;

SetSRLPlayerFormArrays;

for i := 0 to Length(srlpf_PlayerPageControl) - 1 do
begin
srlpf_PlayerPageControl[i] := TPageControl.Create(srl_PlayerForm);
srlpf_PlayerPageControl[i].Parent := ArmyPages[i];
srlpf_PlayerPageControl[i].Width := ArmyPages[i].Width;
srlpf_PlayerPageControl[i].Height := ArmyPages[i].Height;
srlpf_PlayerPageControl[i].Align := alBottom;
srlpf_PlayerPageControl[i].OnMouseDown := @OnSRLPFMouseDown;
srlpf_PlayerPageControl[i].OnDragDrop := @OnSRLPFDragDrop;
srlpf_PlayerPageControl[i].OnDragOver := @OnSRLPFDragOver;
end;

for j := 0 to Length(PlayerPages) - 1 do
for i := 0 to Length(PlayerPages[j]) - 1 do
FillSRLPlayerFormTab(j, i);

UserNameLabel := TLabel.Create(srl_PlayerForm);
UserNameLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
UserNameLabel.Top := 56;
UserNameLabel.Caption := 'Username';

PasswordLabel := TLabel.Create(srl_PlayerForm);
PasswordLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
PasswordLabel.Top := 86;
PasswordLabel.Caption := 'Password';

NickLabel := TLabel.Create(srl_PlayerForm);
NickLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
NickLabel.Top := 116;
NickLabel.Caption := 'Nickname';

ActiveLabel := TLabel.Create(srl_PlayerForm);
ActiveLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
ActiveLabel.Top := 146;
ActiveLabel.Caption := 'Active';

PinLabel := TLabel.Create(srl_PlayerForm);
PinLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
PinLabel.Top := 176;
PinLabel.Caption := 'Bank Pin';

BoxRewardsLabel := TLabel.Create(srl_PlayerForm);
BoxRewardsLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
BoxRewardsLabel.Top := 206;
BoxRewardsLabel.Caption := 'Box Rewards';

srlpf_ArmyPopUpMenu := TPopupMenu.Create(srlpf_ArmyPageControl);

AddArmyPopUp := TMenuItem.Create(srl_PlayerForm);
AddArmyPopUp.Caption := 'Add Army';
AddArmyPopUp.OnClick := @SRLPFMenuClick;

DelArmyPopUp := TMenuItem.Create(srl_PlayerForm);
DelArmyPopUp.Caption := 'Delete Army';
DelArmyPopUp.OnClick := @SRLPFMenuClick;

ChangeArmyNamePopUp := TMenuItem.Create(srl_PlayerForm);
ChangeArmyNamePopUp.Caption := 'Rename Army';
ChangeArmyNamePopUp.OnClick := @SRLPFMenuClick;

ClearArmyPopUp := TMenuItem.Create(srl_PlayerForm);
ClearArmyPopUp.Caption := 'Clear Army';
ClearArmyPopUp.OnClick := @SRLPFMenuClick;

srlpf_ArmyPopUpMenu.Items.Add(AddArmyPopUp);
srlpf_ArmyPopUpMenu.Items.Add(DelArmyPopUp);
srlpf_ArmyPopUpMenu.Items.Add(ChangeArmyNamePopUp);
srlpf_ArmyPopUpMenu.Items.Add(ClearArmyPopUp);

srlpf_PlayerPopUpMenu := TPopupMenu.Create(srl_PlayerForm);

AddPlayerPopUp := TMenuItem.Create(srl_PlayerForm);
AddPlayerPopUp.Caption := 'Add Player';
AddPlayerPopUp.OnClick := @SRLPFMenuClick;

DelPlayerPopUp := TMenuItem.Create(srl_PlayerForm);
DelPlayerPopUp.Caption := 'Delete Player';
DelPlayerPopUp.OnClick := @SRLPFMenuClick;

ClearPlayerPopUp := TMenuItem.Create(srl_PlayerForm);
ClearPlayerPopUp.Caption := 'Clear Player';
ClearPlayerPopUp.OnClick := @SRLPFMenuClick;

srlpf_PlayerPopUpMenu.Items.Add(AddPlayerPopUp);
srlpf_PlayerPopUpMenu.Items.Add(DelPlayerPopUp);
srlpf_PlayerPopUpMenu.Items.Add(ClearPlayerPopUp);

PreviousButton := TButton.Create(srl_PlayerForm);
PreviousButton.Parent := srl_PlayerForm;
PreviousButton.Left := (srl_PlayerForm.Width / 2) - 109;
PreviousButton.Top := 91;
PreviousButton.Width := 29;
PreviousButton.Height := 25;
PreviousButton.Caption := '<----';
PreviousButton.TabOrder := 8;
PreviousButton.OnClick := @OnSRLPFClick;

AddPlayerButton := TButton.Create(srl_PlayerForm);
AddPlayerButton.Parent := srl_PlayerForm;
AddPlayerButton.Left := (srl_PlayerForm.Width / 2) - 80;
AddPlayerButton.Top := 91;
AddPlayerButton.Width := 75;
AddPlayerButton.Height := 25;
AddPlayerButton.Caption := 'Add Player';
AddPlayerButton.TabOrder := 8;
AddPlayerButton.OnClick := @OnSRLPFClick;

DelPlayerButton := TButton.Create(srl_PlayerForm);
DelPlayerButton.Parent := srl_PlayerForm;
DelPlayerButton.Left := (srl_PlayerForm.Width / 2) - 5;
DelPlayerButton.Top := 91;
DelPlayerButton.Width := 75;
DelPlayerButton.Height := 25;
DelPlayerButton.Caption := 'Delete Player';
DelPlayerButton.TabOrder := 8;
DelPlayerButton.OnClick := @OnSRLPFClick;

NextButton := TButton.Create(srl_PlayerForm);
NextButton.Parent := srl_PlayerForm;
NextButton.Left := (srl_PlayerForm.Width / 2) + 70;
NextButton.Top := 91;
NextButton.Width := 29;
NextButton.Height := 25;
NextButton.Caption := '---->';
NextButton.TabOrder := 8;
NextButton.OnClick := @OnSRLPFClick;

StartButton := TButton.Create(srl_PlayerForm);
StartButton.Parent := srl_PlayerForm;
StartButton.Left := (srl_PlayerForm.Width / 2) - 130;
StartButton.Top := 3;
StartButton.Width := 40;
StartButton.Height := 25;
StartButton.Caption := 'Start';
StartButton.TabOrder := 7;
StartButton.OnClick := @OnSRLPFClick;

ExitButton := TButton.Create(srl_PlayerForm);
ExitButton.Parent := srl_PlayerForm;
ExitButton.Left := (srl_PlayerForm.Width / 2) + 70;
ExitButton.Top := 3;
ExitButton.Width := 40;
ExitButton.Height := 25;
ExitButton.Caption := 'Exit';
ExitButton.TabOrder := 7;
ExitButton.OnClick := @OnSRLPFClick;

SaveStartButton := TButton.Create(srl_PlayerForm);
SaveStartButton.Parent := srl_PlayerForm;
SaveStartButton.Left := (srl_PlayerForm.Width / 2) - 90;
SaveStartButton.Top := 3;
SaveStartButton.Width := 80;
SaveStartButton.Height := 25;
SaveStartButton.Caption := 'Start and Save';
SaveStartButton.TabOrder := 7;
SaveStartButton.OnClick := @OnSRLPFClick;

SaveExitButton := TButton.Create(srl_PlayerForm);
SaveExitButton.Parent := srl_PlayerForm;
SaveExitButton.Left := (srl_PlayerForm.Width / 2) - 10;
SaveExitButton.Top := 3;
SaveExitButton.Width := 80;
SaveExitButton.Height := 25;
SaveExitButton.Caption := 'Exit and Save';
SaveExitButton.TabOrder := 7;
SaveExitButton.OnClick := @OnSRLPFClick;
end;

{*******************************************************************************
procedure ShowSRLPFFormModal;
By: Sumilion
Description: Shows the form
*******************************************************************************}

procedure ShowSRLPFFormModal;
begin
srl_PlayerForm.ShowModal;
end;

{*******************************************************************************
procedure SRLPlayerForm(ShowForm: Boolean; Booleans, Integers, Strings, Extendeds: TStringArray);
By: Sumilion
Description: Main function, sets and loads values needed for player settings and the form.
*******************************************************************************}

procedure SRLPlayerForm(ShowForm: Boolean; Booleans, Integers, Strings, Extendeds: TStringArray);
var
V: TVariantArray;
begin
srlpf_SavePath := AppPath + 'Chars.INI';
srlpf_Booleans := Booleans;
srlpf_Integers := Integers;
srlpf_Strings := Strings;
srlpf_Extendeds := Extendeds;
LoadPlayers(False);
if(ShowForm)then
begin
srlpf_SaveWhenDone := True;
V := [];
ThreadSafeCall('LoadSRLPlayerForm', V);
V := [];
ThreadSafeCall('ShowSRLPFFormModal', V);
if(srlpf_SaveWhenDone)then
SavePlayers;
if(srlpf_TerminateWhenDone)then
TerminateScript;
end;
LoadPlayers(True);
end;

Floor66

2009-04-22 20:38:16

I'm missing something ;o
Can you find where srl_Explode is located?

Richard

2009-04-22 20:46:41

Did you read the second post as well?

Floor66

2009-04-22 21:35:05

Oh silly me ;)
Got it now; me likes!

ZephyrsFury

2009-04-23 12:46:20

What do you guys like? Buttons at the top, the bottom or no buttons at all? I'd add a poll if I could but I guess I dont have enough power yet.

Dark Arcana

2009-04-23 12:57:22

I don't really mind where it is.

EvilChicken!

2009-04-23 13:31:30

I like the buttons pretty well, keep them!
And, I think they'd be nicer placed at the bottom than at the top.

Bonfield

2009-04-23 14:03:51

how about if u make a form to long it creates a scrollbar…. ie the form is to long for the height of the screen a scrollbar appears

footballjds

2009-04-23 14:46:25

From: Richard
Did you read the second post as well?


I like the buttons!!!

[offtopic]I saw visiBone in you sig for the first time… i got TONS of visi sheets :D[/offtopic]

Bobarkinator

2009-04-23 16:48:52

I vote no buttons.

Richard

2009-04-23 20:35:59

Adding a poll now so you can vote Zeph :)

Also thanks Zeph for editting the first post so people can see both button layouts.

footballjds

2009-04-23 21:31:48

i like with buttons ;)

jakeyboy29

2009-04-23 23:21:43

top. but i dont mind.

BKNYKavkaz

2009-04-24 00:53:56

to be honest with you. I couldn't care less on how the gui looks like. The point of all of this is the script. However, the only useful thing that can be added to the playerform is the scroll bar. I might do that a little later, working on my maple/willow banker atm. But of course, i dont mind a nice gui so not bad ;)

Richard

2009-04-24 01:38:45

Its mainly for the end user, not the scripter…

And I'm sure adding a scroll bar wouldn't be that hard, just making sure everything fits nicely and symmetrically is slightly harder, but if you know the width of the scroll bar then it should be pretty easy. Just a bit hard deciphering that code, Sumillion is pretty good at scripting :)

Dan Cardin

2009-04-24 03:18:09

Does this form need to be edited by script makers? because really, a form like this (i think) shouldnt be anywhere near 2000 lines. I shall have to look into it, but i think i can shorten the length of this form by quite a lot. The only problem being that it will probably a lot less easily read.

EDIT: i havent even really done much and i've gotten rid of quite a lot of useless space and whatnot which is 200 lines. But i have noticed that there is a lot of useless stuff. There's 3 ways to do stuff. There's the main menu, the buttons, and right clicking on the tabs, all do the same thing. Its just a messy form with way too much stuff on it. I'll keep shortening, but just letting dev's/whoever know.

BKNYKavkaz

2009-04-25 02:06:37

From: Richard
Its mainly for the end user, not the scripter…


to be honest if the "end user" does not know how to setup a pre-made script, then its a leecher.

ZaSz

2009-04-25 02:09:03

instead of buttons, how bout a scroll bar for when it gets to long. (thats what she said :p) But like if it is greater then 10 inputs or something, it has a scroll bar?

BKNYKavkaz

2009-04-25 02:51:50

From: zasz
instead of buttons, how bout a scroll bar for when it gets to long. (thats what she said :p) But like if it is greater then 10 inputs or something, it has a scroll bar?


ehm

From: caustic
to be honest with you. I couldn't care less on how the gui looks like. The point of all of this is the script. However, the only useful thing that can be added to the playerform is the scroll bar. I might do that a little later, working on my maple/willow banker atm. But of course, i dont mind a nice gui so not bad ;)


;)

ZaSz

2009-04-25 02:59:38

From: caustic
ehm



;)


Oh :D:p Didn't look. Well still.

Cazax

2009-04-25 03:23:07

I've just made a procedure to detects non numerical pin numbers and delete them:
{*******************************************************************************
procedure arPinEditsPress(Sender : TEdit; var Key : Char);
By: Cazax
Description: Detects if user press non numerical keys to remove them
from the Pin Edit
*******************************************************************************}
procedure arPinEditsPress(Sender: TObject; var Key: Char);
begin
If Key = '' Then
Exit;
Case Key Of
#48..#57: If Length(arPinEdits[EditK][EditI].Text) = 4 Then Key := #0;
Else
Key := #0;
End;
end;
But, it need changes in the form:

//-----------------------------------------------------------------//
//-- Scar Standard Resource Library --//
//-- ยป User Manager Routines --//
//-----------------------------------------------------------------//
// * procedure LoadCheckListForm; | by Sumilion
// * procedure ShowCheckListFormModal; | by Sumilion
// * procedure ShowCheckListForm; | by Sumilion
// * procedure SavePlayers(Create: Boolean); | by Starblaster100
// * procedure LoadPlayers(SetPlayers: Boolean); | by Starblaster100
// * procedure SwitchInTabArray(NewPlace, OldPlace: Integer; var V: array of TTabSheet); | by Sumilion
// * procedure SwitchInEditArray(NewPlace, OldPlace: Integer; var V: array of TEdit); | by Sumilion
// * procedure SwitchInComboArray(NewPlace, OldPlace: Integer; var V: array of TComboBox); | by Sumilion
// * procedure OnSRLPFMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); | by Sumilion
// * procedure OnSRLPFDragDrop(Sender, Source: TObject; X, Y: Integer); | by Sumilion
// * procedure OnSRLPFDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); | by Sumilion
// * procedure DeleteInEditArray(SpotToDelete: Integer; var V: array of TEdit); | by Sumilion
// * procedure DeleteInEditArrayOfArray(SpotToDelete: Integer; var V: array of array of TEdit); | by Sumilion
// * procedure DeleteInEditArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TEdit); | by Sumilion
// * procedure DeleteInComboArray(SpotToDelete: Integer; var V: array of TComboBox); | by Sumilion
// * procedure DeleteInComboArrayOfArray(SpotToDelete: Integer; var V: array of array of TComboBox); | by Sumilion
// * procedure DeleteInComboArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TComboBox); | by Sumilion
// * procedure DeleteInTabArray(SpotToDelete: Integer; var V: array of TTabSheet); | by Sumilion
// * procedure DeleteInTabArrayOfArray(SpotToDelete: Integer; var V: array of array of TTabSheet); | by Sumilion
// * procedure DeleteInPageControlArray(SpotToDelete: Integer; var V: array of TPageControl); | by Sumilion
// * procedure SetLabelsParent(Parent: Integer); | by Sumilion
// * procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer); | by Sumilion
// * procedure ClearPlayerInTab(ArmyNumber, PlayerNumber: Integer); | by Sumilion
// * procedure AddPlayerInTab(ArmyNumber: Integer); | by Sumilion
// * procedure AddArmy; | by Sumilion
// * procedure DeleteArmy(ArmyNumber, NextArmyTab: Integer); | by Sumilion
// * procedure RenameArmy(ArmyNumber: Integer); | by Sumilion
// * procedure ExportPlayerData; | by Starblaster100 / Sumilion
// * procedure ImportPlayerData; | by Starblaster100 / Sumilion
// * procedure OnSRLPFMainMenuClick(Sender: TObject); | by Sumilion
// * procedure OnSRLPFClick(Sender: TObject); | by Sumilion/Richard/ZephyrsFury
// * procedure OnSRLPFShow(Sender: TObject); | by Sumilion
// * procedure SRLPFMenuClick(Sender: TObject); | by Sumilion
// * procedure SetSRLPlayerFormArrays; | by Sumilion
// * procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer); | by Sumilion
// * procedure LoadSRLPlayerForm; | by Sumilion/Richard/ZephyrsFury
// * procedure ShowSRLPFFormModal; | by Sumilion
// * procedure SRLPlayerForm(ShowForm: Boolean; Booleans, Integers, Strings, Extendeds: TStringArray); | by Sumilion

var
// Main form components
srl_PlayerForm : TForm;
srlpf_PreviousTabIndex, srlpf_Width, HowManyArmies, ActiveArmy: Integer;
srlpf_TerminateWhenDone, srlpf_SaveWhenDone: Boolean;
srlpf_ArmyPageControl : TPageControl;
srlpf_PlayerPageControl : array of TPageControl;
ArmyPages : array of TTabSheet;
ArmyNames : TStringArray;
PlayerPages : array of array of TTabSheet;
// Menu items
srlpf_ArmyPopUpMenu, srlpf_PlayerPopUpMenu: TPopupMenu;
srlpf_MainMenu: TMainMenu;
FileItem, PlayerControlItem, ArmyControlItem, ExitItem,
AddPlayerItem, DeletePlayersItem, ClearPlayersItem, SaveAndStart, SaveAndExit,
JustExitItem, JustStartItem, AddArmyItem, DeleteArmiesItem, ClearArmiesItem, RenameArmyItem,
ExportPlayersItem, ImportPlayersItem: TMenuItem;
AddArmyPopUp, DelArmyPopUp, ChangeArmyNamePopUp, ClearArmyPopUp, AddPlayerPopUp, DelPlayerPopUp, ClearPlayerPopUp: TMenuItem;
// All labels
arBooleanLabels, arIntegerLabels,
arStringLabels, arExtendedLabels : array of TLabel;
UserNameLabel, PasswordLabel, NickLabel, ActiveLabel, PinLabel, BoxRewardsLabel: TLabel;
// All changeable settings
arUserNameEdits, arPasswordEdits, arNickEdits, arPinEdits, arBoxRewardsEdits : array of array of TEdit;
arActiveComboBoxes : array of array of TComboBox;
arBooleanComboBoxes : array of array of array of TComboBox;
arIntegerEdits, arStringEdits, arExtendedEdits : array of array of array of TEdit;
// All buttons on the form
DelPlayerButton, AddPlayerButton, PreviousButton, ExitButton,
NextButton, StartButton, SaveStartButton, SaveExitButton: TButton;
// Arrays of variable settings
srlpf_Booleans, srlpf_Integers, srlpf_Strings, srlpf_Extendeds: TStringArray;
// CheckList form vars
CheckListForm : TForm;
SRLPFCheckListBox: TCheckListBox;
CheckListButton: TButton;
// Other
srlpf_SavePath: string;
EditK, EditI : Integer;

procedure SetSRLPlayerFormArrays; forward;
procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer); forward;
procedure OnSRLPFShow(Sender: TObject); forward;
procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer); forward;
procedure OnSRLPFClick(Sender: TObject); forward;

{*******************************************************************************
procedure LoadCheckListForm;
By: Sumilion
Description: Initializes the check list form needed for Users.scar
*******************************************************************************}

procedure LoadCheckListForm;
var
ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;

CheckListForm.Position := poDesktopCenter;
CheckListForm.Width := 200;
CheckListForm.Height := 135;
CheckListForm.Color := clBtnFace;
CheckListForm.Font.Color := clWindowText;
CheckListForm.Font.Height := -11;
CheckListForm.Font.Name := 'MS Sans Serif';
CheckListForm.Font.Style := [];
CheckListForm.Visible := False;
CheckListForm.PixelsPerInch := 96;
CheckListForm.BorderIcons := [biSystemMenu];
CheckListForm.BorderStyle := bsSingle;

SRLPFCheckListBox.Parent := CheckListForm;
SRLPFCheckListBox.Width := CheckListForm.Width;
SRLPFCheckListBox.Height := CheckListForm.Height - 65;
SRLPFCheckListBox.Align := alTop;
SRLPFCheckListBox.ItemHeight := 13;

CheckListButton.Parent := CheckListForm;
CheckListButton.Left := 70;
CheckListButton.Top := 80;
CheckListButton.Width := 50;
CheckListButton.Height := 20;
CheckListButton.OnClick := @OnSRLPFClick;
end;

{*******************************************************************************
procedure ShowCheckListFormModal;
By: Sumilion
Description: Showes the form.
*******************************************************************************}

procedure ShowCheckListFormModal;
begin
CheckListForm.ShowModal;
end;

{*******************************************************************************
procedure ShowCheckListForm;
By: Sumilion
Description: Safely initializes and shows the form
*******************************************************************************}

procedure ShowCheckListForm;
var
v: TVariantArray;
begin
V := [];
ThreadSafeCall('LoadCheckListForm', V);
V := [];
ThreadSafeCall('ShowCheckListFormModal', V);
end;

{*******************************************************************************
procedure SavePlayers;
By: Starblaster100
Description: Saves the players to a file / creates a file when needed.
*******************************************************************************}

procedure SavePlayers;
var
ArmyIndex, i, j, k: Integer;
Begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;
WriteINI('General', 'HowManyArmies', IntToStr(Length(ArmyPages)), srlpf_SavePath);
WriteINI('General', 'ActiveArmy', IntToStr(ArmyIndex), srlpf_SavePath);
for i := 0 to GetArrayLength(ArmyPages) - 1 do
begin
WriteINI('ArmyPages', 'Name[' +IntToStr(i)+ ']', ArmyPages[i].Caption, srlpf_SavePath);
WriteINI('ArmyPages', 'Number[' +IntToStr(i)+ ']', IntToStr(Length(PlayerPages[i])), srlpf_SavePath);
end;
for k := 0 to Length(ArmyPages) - 1 do
begin
for i := 0 to Length(PlayerPages[k]) - 1 do
begin
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Username', arUserNameEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Password', arPasswordEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Nickname', arNickEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Active', arActiveComboBoxes[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Pin', arPinEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'BoxRewards', Replace(arBoxRewardsEdits[k][i].Text, ' ', ''), srlpf_SavePath);
for j := 0 to Length(srlpf_Booleans) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Booleans[' +IntToStr(j)+ ']', arBooleanComboBoxes[k][j][i].Text, srlpf_SavePath);
for j := 0 to Length(srlpf_Integers) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Integers[' +IntToStr(j)+ ']', arIntegerEdits[k][j][i].Text, srlpf_SavePath);
for j := 0 to Length(srlpf_Strings) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Strings[' +IntToStr(j)+ ']', arStringEdits[k][j][i].Text, srlpf_SavePath);
for j := 0 to Length(srlpf_Extendeds) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Extendeds[' +IntToStr(k)+ ']', arExtendedEdits[k][j][i].Text, srlpf_SavePath);
end;
end;
end;

{*******************************************************************************
procedure arPinEditsPress(Sender : TEdit; var Key : Char);
By: Cazax
Description: Detects if user press non numerical keys to remove them
from the Pin Edit
*******************************************************************************}
procedure arPinEditsPress(Sender: TObject; var Key: Char);
begin
If Key = '' Then
Exit;
Case Key Of
#48..#57: If Length(arPinEdits[EditK][EditI].Text) = 4 Then Key := #0;
Else
Key := #0;
End;
end;

{*******************************************************************************
procedure LoadPlayers(SetPlayers: Boolean);
By: Starblaster100
Description: Loads the players from a file
*******************************************************************************}

procedure LoadPlayers(SetPlayers: Boolean);
var
ArmyIndex, j, i, k: Integer;
Begin
HowManyArmies := StrToIntDef(ReadINI('General', 'HowManyArmies', srlpf_SavePath), 1);
ArmyIndex := StrToIntDef(ReadINI('General', 'ActiveArmy', srlpf_SavePath), 0);
ActiveArmy := ArmyIndex;
SetLength(ArmyPages, HowManyArmies);
SetLength(ArmyNames, HowManyArmies);
for i := 0 to HowManyArmies - 1 do
ArmyNames[i] := ReadINI('ArmyPages', 'Name[' +IntToStr(i)+ ']', srlpf_SavePath);

if(SetPlayers)then
begin
HowManyPlayers := StrToIntDef(ReadINI('ArmyPages', 'Number[' +IntToStr(ArmyIndex)+ ']', srlpf_SavePath), 1);
NumberOfPlayers(HowManyPlayers);

for i := 0 to HowManyPlayers - 1 do
begin
Players[i].Name := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Username', srlpf_SavePath);
Players[i].Pass := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Password', srlpf_SavePath);
Players[i].Nick := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Nickname', srlpf_SavePath);
Players[i].Active := StrToBoolDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Active', srlpf_SavePath), True);
Players[i].Pin := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Pin', srlpf_SavePath);
Players[i].BoxRewards := srl_Explode(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'BoxRewards', srlpf_SavePath), ',');

for j := 0 to Length(srlpf_Booleans) - 1 do
Players[i].Booleans[j] := StrToBoolDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Booleans[' +IntToStr(j)+ ']', srlpf_SavePath), True);

for j := 0 to Length(srlpf_Integers) - 1 do
Players[i].Integers[j] := StrToIntDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Integers[' +IntToStr(j)+ ']', srlpf_SavePath), 0);

for j := 0 to Length(srlpf_Strings) - 1 do
Players[i].Strings[j] := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Strings[' +IntToStr(j)+ ']', srlpf_SavePath);

for j := 0 to Length(srlpf_Extendeds) - 1 do
Players[i].Extendeds[j] := StrToFloatDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Extendeds[' +IntToStr(j)+ ']', srlpf_SavePath), 0.0);
end;
end else
begin
SetLength(PlayerPages, HowManyArmies);
for i := 0 to HowManyArmies - 1 do
begin
HowManyPlayers := StrToIntDef(ReadINI('ArmyPages', 'Number[' +IntToStr(i)+ ']', srlpf_SavePath), 1);
SetLength(PlayerPages[i], HowManyPlayers);
end;
SetSRLPlayerFormArrays;

for k := 0 to HowManyArmies - 1 do
begin
HowManyPlayers := StrToIntDef(ReadINI('ArmyPages', 'Number[' +IntToStr(k)+ ']', srlpf_SavePath), 1);
for i := 0 to HowManyPlayers - 1 do
begin
arUserNameEdits[k][i] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[k][i] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[k][i].PasswordChar := '*';
arNickEdits[k][i] := TEdit.Create(srl_PlayerForm);
arActiveComboBoxes[k][i] := TComboBox.Create(srl_PlayerForm);
arPinEdits[k][i] := TEdit.Create(srl_PlayerForm);
EditK := k;
EditI := i;
arPinEdits[k][i].OnKeyPress := @arPinEditsPress;
arBoxRewardsEdits[k][i] := TEdit.Create(srl_PlayerForm);

arUserNameEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Username', srlpf_SavePath);
arPassWordEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Password', srlpf_SavePath);
arNickEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Nickname', srlpf_SavePath);
arActiveComboBoxes[k][i].Text := BoolToStr(StrToBoolDef(ReadINI(IntToStr(k) +',' +IntToStr(i), 'Active', srlpf_SavePath), True));
arPinEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Pin', srlpf_SavePath);
arBoxRewardsEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'BoxRewards', srlpf_SavePath);

for j := 0 to Length(srlpf_Booleans) - 1 do
begin
arBooleanComboBoxes[k][j][i] := TComboBox.Create(srl_PlayerForm);
arBooleanComboBoxes[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Booleans[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

for j := 0 to Length(srlpf_Integers) - 1 do
begin
arIntegerEdits[k][j][i] := TEdit.Create(srl_PlayerForm);
arIntegerEdits[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Integers[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

for j := 0 to Length(srlpf_Strings) - 1 do
begin
arStringEdits[k][j][i] := TEdit.Create(srl_PlayerForm);
arStringEdits[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Strings[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

for j := 0 to Length(srlpf_Extendeds) - 1 do
begin
arExtendedEdits[k][j][i] := TEdit.Create(srl_PlayerForm);
arExtendedEdits[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Extendeds[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

end;
end;
end;
end;

{*******************************************************************************
procedure SwitchInTabArray(NewPlace, OldPlace: Integer; var V: array of TTabSheet);
By: Sumilion
Description: Switches values in a TTabSheet array
*******************************************************************************}

procedure SwitchInTabArray(NewPlace, OldPlace: Integer; var V: array of TTabSheet);
var
k: Integer;
TempVarArray, TempAffectedArray: array of TTabSheet;
begin
SetLength(TempVarArray, Length(V));
SetLength(TempAffectedArray, 1 + (iAbs(OldPlace - NewPlace)));
for k := 0 to Length(V) - 1 do
TempVarArray[k] := V[k];
TempVarArray[NewPlace] := V[OldPlace];
if(OldPlace > NewPlace)then
begin
for k := NewPlace to OldPlace - 1 do
TempAffectedArray[k - NewPlace] := V[k];
for k := NewPlace + 1 to OldPlace do
TempVarArray[k] := TempAffectedArray[k - (NewPlace + 1)];
end else
begin
for k := OldPlace + 1 to NewPlace do
TempAffectedArray[k - (OldPlace + 1)] := V[k];
for k := OldPlace to NewPlace - 1 do
TempVarArray[k] := TempAffectedArray[k - OldPlace];
end;

V := TempVarArray;
end;

{*******************************************************************************
procedure SwitchInEditArray(NewPlace, OldPlace: Integer; var V: array of TEdit);
By: Sumilion
Description: Switches values in a TEdit array
*******************************************************************************}

procedure SwitchInEditArray(NewPlace, OldPlace: Integer; var V: array of TEdit);
var
k: Integer;
TempVarArray, TempAffectedArray: array of TEdit;
begin
SetLength(TempVarArray, Length(V));
SetLength(TempAffectedArray, 1 + (iAbs(OldPlace - NewPlace)));
for k := 0 to Length(V) - 1 do
TempVarArray[k] := V[k];
TempVarArray[NewPlace] := V[OldPlace];
if(OldPlace > NewPlace)then
begin
for k := NewPlace to OldPlace - 1 do
TempAffectedArray[k - NewPlace] := V[k];
for k := NewPlace + 1 to OldPlace do
TempVarArray[k] := TempAffectedArray[k - (NewPlace + 1)];
end else
begin
for k := OldPlace + 1 to NewPlace do
TempAffectedArray[k - (OldPlace + 1)] := V[k];
for k := OldPlace to NewPlace - 1 do
TempVarArray[k] := TempAffectedArray[k - OldPlace];
end;

V := TempVarArray;
end;

{*******************************************************************************
procedure SwitchInComboArray(NewPlace, OldPlace: Integer; var V: array of TComboBox);
By: Sumilion
Description: Switches values in a TComboBox array
*******************************************************************************}

procedure SwitchInComboArray(NewPlace, OldPlace: Integer; var V: array of TComboBox);
var
k: Integer;
TempVarArray, TempAffectedArray: array of TComboBox;
begin
SetLength(TempVarArray, Length(V));
SetLength(TempAffectedArray, 1 + (iAbs(OldPlace - NewPlace)));
for k := 0 to Length(V) - 1 do
TempVarArray[k] := V[k];
TempVarArray[NewPlace] := V[OldPlace];
if(OldPlace > NewPlace)then
begin
for k := NewPlace to OldPlace - 1 do
TempAffectedArray[k - NewPlace] := V[k];
for k := NewPlace + 1 to OldPlace do
TempVarArray[k] := TempAffectedArray[k - (NewPlace + 1)];
end else
begin
for k := OldPlace + 1 to NewPlace do
TempAffectedArray[k - (OldPlace + 1)] := V[k];
for k := OldPlace to NewPlace - 1 do
TempVarArray[k] := TempAffectedArray[k - OldPlace];
end;

V := TempVarArray;
end;

{*******************************************************************************
procedure OnSRLPFMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
By: Sumilion
Description: Form action on Mouse click
*******************************************************************************}

procedure OnSRLPFMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
i, ArmyIndex: Integer;
MousePosPoint: TPoint;
RightClick: Boolean;
begin
RightClick := Button;
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;
case Sender of
srlpf_PlayerPageControl[ArmyIndex]:
begin
if(RightClick)then
begin
srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex := srlpf_PlayerPageControl[ArmyIndex].IndexOfTabAt(x, y);
MousePosPoint := srlpf_PlayerPageControl[ArmyIndex].ClientToScreen(IntToPoint(x, y));
srlpf_PlayerPopUpMenu.Popup(MousePosPoint.x, MousePosPoint.y);
end;
if(ssCtrl in Shift)and(not RightClick)then
begin
srlpf_PlayerPageControl[ArmyIndex].BeginDrag(False);
srlpf_PreviousTabIndex := srlpf_PlayerPageControl[ArmyIndex].ActivePage.PageIndex;
end;
end;
srlpf_ArmyPageControl:
begin
if(RightClick)then
begin
srlpf_ArmyPageControl.ActivePageIndex := srlpf_ArmyPageControl.IndexOfTabAt(x, y);
MousePosPoint := srlpf_ArmyPageControl.ClientToScreen(IntToPoint(x, y));
srlpf_ArmyPopUpMenu.Popup(MousePosPoint.x, MousePosPoint.y);
end;
end;
end;
for i := 0 to Length(PlayerPages[ArmyIndex]) - 1 do
begin
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;
end;

{*******************************************************************************
procedure OnSRLPFDragDrop(Sender, Source: TObject; X, Y: Integer);
By: Sumilion
Description: Form action on drag drop
*******************************************************************************}

procedure OnSRLPFDragDrop(Sender, Source: TObject; X, Y: Integer);
var
i, ArmyIndex, PlayerIndex : Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePage.PageIndex;

srlpf_PlayerPageControl[ArmyIndex].ActivePage.PageIndex := srlpf_PlayerPageControl[ArmyIndex].IndexOfTabAt(X, Y);

PlayerIndex := srlpf_PlayerPageControl[ArmyIndex].ActivePage.PageIndex;

SwitchInTabArray(PlayerIndex, srlpf_PreviousTabIndex, PlayerPages[ArmyIndex]);

SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arUserNameEdits[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arPasswordEdits[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arNickEdits[ArmyIndex]);
SwitchInComboArray(PlayerIndex, srlpf_PreviousTabIndex, arActiveComboBoxes[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arPinEdits[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arBoxRewardsEdits[ArmyIndex]);

for i := 0 to Length(srlpf_Booleans) - 1 do
SwitchInComboArray(PlayerIndex, srlpf_PreviousTabIndex, arBooleanComboBoxes[ArmyIndex][i]);

for i := 0 to Length(srlpf_Integers) - 1 do
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arIntegerEdits[ArmyIndex][i]);

for i := 0 to Length(srlpf_Strings) - 1 do
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arStringEdits[ArmyIndex][i]);

for i := 0 to Length(srlpf_Extendeds) - 1 do
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arExtendedEdits[ArmyIndex][i]);

for i := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;

{*******************************************************************************
procedure OnSRLPFDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
By: Sumilion
Description: Form action on drag over
*******************************************************************************}

procedure OnSRLPFDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := (Sender is TPageControl);
end;

{*******************************************************************************
procedure DeleteInEditArray(SpotToDelete: Integer; var V: array of TEdit);
By: Sumilion
Description: Deletes a value in a TEdit array
*******************************************************************************}

procedure DeleteInEditArray(SpotToDelete: Integer; var V: array of TEdit);
var
k, l: Integer;
TempVarArray: array of TEdit;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInEditArrayOfArray(SpotToDelete: Integer; var V: array of array of TEdit);
By: Sumilion
Description: Deletes a value in a TEdit array
*******************************************************************************}

procedure DeleteInEditArrayOfArray(SpotToDelete: Integer; var V: array of array of TEdit);
var
k, l: Integer;
TempVarArray: array of array of TEdit;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInEditArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TEdit);
By: Sumilion
Description: Deletes a value in a TEdit array
*******************************************************************************}

procedure DeleteInEditArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TEdit);
var
k, l: Integer;
TempVarArray: array of array of array of TEdit;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInComboArray(SpotToDelete: Integer; var V: array of TComboBox);
By: Sumilion
Description: Deletes a value in a TComboBox array
*******************************************************************************}

procedure DeleteInComboArray(SpotToDelete: Integer; var V: array of TComboBox);
var
k, l: Integer;
TempVarArray: array of TComboBox;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInComboArrayOfArray(SpotToDelete: Integer; var V: array of array of TComboBox);
By: Sumilion
Description: Deletes a value in a TComboBox array
*******************************************************************************}

procedure DeleteInComboArrayOfArray(SpotToDelete: Integer; var V: array of array of TComboBox);
var
k, l: Integer;
TempVarArray: array of array of TComboBox;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInComboArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TComboBox);
By: Sumilion
Description: Deletes a value in a TComboBox array
*******************************************************************************}

procedure DeleteInComboArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TComboBox);
var
k, l: Integer;
TempVarArray: array of array of array of TComboBox;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInTabArray(SpotToDelete: Integer; var V: array of TTabSheet);
By: Sumilion
Description: Deletes a value in a TTabSheet array
*******************************************************************************}

procedure DeleteInTabArray(SpotToDelete: Integer; var V: array of TTabSheet);
var
k, l: Integer;
TempVarArray: array of TTabSheet;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInTabArrayOfArray(SpotToDelete: Integer; var V: array of array of TTabSheet);
By: Sumilion
Description: Deletes a value in a TTabSheet array
*******************************************************************************}

procedure DeleteInTabArrayOfArray(SpotToDelete: Integer; var V: array of array of TTabSheet);
var
k, l: Integer;
TempVarArray: array of array of TTabSheet;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInPageControlArray(SpotToDelete: Integer; var V: array of TPageControl);
By: Sumilion
Description: Deletes a value in a TTabSheet array
*******************************************************************************}

procedure DeleteInPageControlArray(SpotToDelete: Integer; var V: array of TPageControl);
var
k, l: Integer;
TempVarArray: array of TPageControl;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure SetLabelsParent(Parent: Integer);
By: Sumilion
Description: Sets all labels to the desired parent
*******************************************************************************}

procedure SetLabelsParent(Army, Tab: Integer);
var
i: Integer;
begin
UserNameLabel.Parent := PlayerPages[Army][Tab];
PasswordLabel.Parent := PlayerPages[Army][Tab];
NickLabel.Parent := PlayerPages[Army][Tab];
ActiveLabel.Parent := PlayerPages[Army][Tab];
PinLabel.Parent := PlayerPages[Army][Tab];
BoxRewardsLabel.Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Booleans) - 1 do
arBooleanLabels[i].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Integers) - 1 do
arIntegerLabels[i].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Strings) - 1 do
arStringLabels[i].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Extendeds) - 1 do
arExtendedLabels[i].Parent := PlayerPages[Army][Tab];
end;

{*******************************************************************************
procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer);
By: Sumilion
Description: Deletes a player in a desired tab and goes to the next desired tab.
*******************************************************************************}

procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer);
var
i, d, ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;

if(srlpf_PlayerPageControl[ArmyIndex].PageCount = 1)then
Exit;

if(NextPlayerTab < 0)then
NextPlayerTab := 0;
for i := PlayerNumber + 1 to Length(PlayerPages[ArmyNumber]) - 1 do
begin
arUserNameEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arPasswordEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arNickEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arActiveComboBoxes[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arPinEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arBoxRewardsEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Booleans) - 1 do
arBooleanComboBoxes[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Integers) - 1 do
arIntegerEdits[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Strings) - 1 do
arStringEdits[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Extendeds) - 1 do
arExtendedEdits[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

end;

PlayerPages[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1].Free;

SetLength(PlayerPages[ArmyNumber], srlpf_PlayerPageControl[ArmyNumber].PageCount);

DeleteInEditArray(PlayerNumber, arUserNameEdits[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arPasswordEdits[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arNickEdits[ArmyNumber]);
DeleteInComboArray(PlayerNumber, arActiveComboBoxes[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arPinEdits[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arBoxRewardsEdits[ArmyNumber]);
for d := 0 to Length(srlpf_Booleans) - 1 do
DeleteInComboArray(PlayerNumber, arBooleanComboBoxes[ArmyNumber][d]);

for d := 0 to Length(srlpf_Integers) - 1 do
DeleteInEditArray(PlayerNumber, arIntegerEdits[ArmyNumber][d]);

for d := 0 to Length(srlpf_Strings) - 1 do
DeleteInEditArray(PlayerNumber, arStringEdits[ArmyNumber][d]);

for d := 0 to Length(srlpf_Extendeds) - 1 do
DeleteInEditArray(PlayerNumber, arExtendedEdits[ArmyNumber][d]);

srlpf_ArmyPageControl.ActivePageIndex := ArmyIndex;
srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex := NextPlayerTab;
if(srlpf_PlayerPageControl[ArmyIndex].PageCount = 1)then
srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex := 0;
end;

{*******************************************************************************
procedure ClearPlayerInTab(ArmyNumber, PlayerNumber: Integer);
By: Sumilion
Description: Clears player settings in tab
*******************************************************************************}

procedure ClearPlayerInTab(ArmyNumber, PlayerNumber: Integer);
var
i: Integer;
begin
arUserNameEdits[ArmyNumber][PlayerNumber].Text := '';
arPasswordEdits[ArmyNumber][PlayerNumber].Text := '';
arNickEdits[ArmyNumber][PlayerNumber].Text := '';
arActiveComboBoxes[ArmyNumber][PlayerNumber].Text := 'True';
arPinEdits[ArmyNumber][PlayerNumber].Text := '';
arBoxRewardsEdits[ArmyNumber][PlayerNumber].Text := '';

for i := 0 to Length(arBooleanComboBoxes[ArmyNumber]) - 1 do
arBooleanComboBoxes[ArmyNumber][i][PlayerNumber].Text := 'False';

for i := 0 to Length(arIntegerEdits[ArmyNumber]) - 1 do
arIntegerEdits[ArmyNumber][i][PlayerNumber].Text := '';

for i := 0 to Length(arStringEdits[ArmyNumber]) - 1 do
arStringEdits[ArmyNumber][i][PlayerNumber].Text := '';

for i := 0 to Length(arExtendedEdits[ArmyNumber]) - 1 do
arExtendedEdits[ArmyNumber][i][PlayerNumber].Text := '';

PlayerPages[ArmyNumber][PlayerNumber].Caption := 'Player ' + IntToStr(PlayerNumber);
end;

{*******************************************************************************
procedure AddPlayerInTab(ArmyNumber: Integer);
By: Sumilion
Description: Deletes a player in a desired tab and goes to the next desired tab.
*******************************************************************************}

procedure AddPlayerInTab(ArmyNumber: Integer);
var
i: Integer;
begin
SetLength(PlayerPages[ArmyNumber], Length(PlayerPages[ArmyNumber]) + 1);
SetSRLPlayerFormArrays;

arUserNameEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arNickEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arActiveComboBoxes[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TComboBox.Create(srl_PlayerForm);
arActiveComboBoxes[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1].Text := 'True';
arPinEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arBoxRewardsEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arBooleanComboBoxes[ArmyNumber]) - 1 do
arBooleanComboBoxes[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TComboBox.Create(srl_PlayerForm);

for i := 0 to Length(arIntegerEdits[ArmyNumber]) - 1 do
arIntegerEdits[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arStringEdits[ArmyNumber]) - 1 do
arStringEdits[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arExtendedEdits[ArmyNumber]) - 1 do
arExtendedEdits[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

FillSRLPlayerFormTab(ArmyNumber, Length(PlayerPages[ArmyNumber]) - 1);
if(ArmyNumber = srlpf_ArmyPageControl.ActivePageIndex)then
srlpf_PlayerPageControl[ArmyNumber].ActivePageIndex := Length(PlayerPages[ArmyNumber]) - 1;
end;

{*******************************************************************************
procedure AddArmy;
By: Sumilion
Description: Adds an army to the form
*******************************************************************************}

procedure AddArmy;
var
i: Integer;
begin
SetLength(ArmyPages, Length(ArmyPages) + 1);
SetLength(srlpf_PlayerPageControl, Length(ArmyPages));

ArmyPages[Length(ArmyPages) - 1] := TTabSheet.Create(srl_PlayerForm);
ArmyPages[Length(ArmyPages) - 1].Caption := 'Army ' + IntToStr(Length(ArmyPages) - 1);
ArmyPages[Length(ArmyPages) - 1].PageControl := srlpf_ArmyPageControl;
ArmyPages[Length(ArmyPages) - 1].OnShow := @OnSRLPFShow;

srlpf_PlayerPageControl[Length(ArmyPages) - 1] := TPageControl.Create(srl_PlayerForm);
with srlpf_PlayerPageControl[Length(ArmyPages) - 1] do
begin
Parent := ArmyPages[Length(ArmyPages) - 1];
Width := ArmyPages[Length(ArmyPages) - 1].Width;
Height := ArmyPages[Length(ArmyPages) - 1].Height;
Align := alBottom;
OnMouseDown := @OnSRLPFMouseDown;
OnDragDrop := @OnSRLPFDragDrop;
OnDragOver := @OnSRLPFDragOver;
end;

SetLength(PlayerPages, Length(ArmyPages));
SetLength(PlayerPages[Length(ArmyPages) - 1], 1);
SetSRLPlayerFormArrays;

arUserNameEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arNickEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arActiveComboBoxes[Length(ArmyPages) - 1][0] := TComboBox.Create(srl_PlayerForm);
arActiveComboBoxes[Length(ArmyPages) - 1][0].Text := 'True';
arPinEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arBoxRewardsEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arBooleanComboBoxes[Length(ArmyPages) - 1]) - 1 do
arBooleanComboBoxes[Length(ArmyPages) - 1][i][0] := TComboBox.Create(srl_PlayerForm);

for i := 0 to Length(arIntegerEdits[Length(ArmyPages) - 1]) - 1 do
arIntegerEdits[Length(ArmyPages) - 1][i][0] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arStringEdits[Length(ArmyPages) - 1]) - 1 do
arStringEdits[Length(ArmyPages) - 1][i][0] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arExtendedEdits[Length(ArmyPages) - 1]) - 1 do
arExtendedEdits[Length(ArmyPages) - 1][i][0] := TEdit.Create(srl_PlayerForm);

FillSRLPlayerFormTab(Length(ArmyPages) - 1, 0);

srlpf_ArmyPageControl.ActivePageIndex := Length(ArmyPages) - 1;
end;

{*******************************************************************************
procedure DeleteArmy(ArmyNumber, NextArmyTab: Integer);
By: Sumilion
Description: Deletes an army in the form
*******************************************************************************}

procedure DeleteArmy(ArmyNumber, NextArmyTab: Integer);
var
i, j: Integer;
begin
if(NextArmyTab < 0)then
NextArmyTab := 0;
if(srlpf_ArmyPageControl.PageCount = 1)then
Exit;
if Armynumber > 0 then
srlpf_ArmyPageControl.ActivePageIndex := NextArmyTab
else
srlpf_ArmyPageControl.ActivePageIndex := 0;
if((srlpf_ArmyPageControl.PageCount - 1) > ArmyNumber)then
j := ArmyNumber + 1
else
j := ArmyNumber - 1;

for i := ArmyNumber + 1 to Length(ArmyPages) - 1 do
begin
srlpf_PlayerPageControl[i].Parent := ArmyPages[i - 1];
ArmyPages[i - 1].Caption := ArmyPages[i].Caption;
end;

srlpf_PlayerPageControl[ArmyNumber].Free;
ArmyPages[Length(ArmyPages) - 1].Free;
SetLength(ArmyPages, Length(ArmyPages) - 1);

DeleteInEditArrayOfArray(ArmyNumber, arUserNameEdits);
DeleteInEditArrayOfArray(ArmyNumber, arPasswordEdits);
DeleteInEditArrayOfArray(ArmyNumber, arNickEdits);
DeleteInComboArrayOfArray(ArmyNumber, arActiveComboBoxes);
DeleteInEditArrayOfArray(ArmyNumber, arPinEdits);
DeleteInEditArrayOfArray(ArmyNumber, arBoxRewardsEdits);
DeleteInComboArrayOfArrayOfArray(ArmyNumber, arBooleanComboBoxes);
DeleteInEditArrayOfArrayOfArray(ArmyNumber, arIntegerEdits);
DeleteInEditArrayOfArrayOfArray(ArmyNumber, arStringEdits);
DeleteInEditArrayOfArrayOfArray(ArmyNumber, arExtendedEdits);
DeleteInTabArrayOfArray(ArmyNumber, PlayerPages);
DeleteInPageControlArray(ArmyNumber, srlpf_PlayerPageControl);

srlpf_ArmyPageControl.ActivePageIndex := NextArmyTab;
//srlpf_PlayerPageControl[NextArmyTab].ActivePageIndex := 0;

for i := 0 to Length(ArmyPages) - 1 do
begin
if(Pos('Army', ArmyPages[i].Caption) = 1)then
ArmyPages[i].Caption := 'Army ' + IntToStr(i);
end;
end;

{*******************************************************************************
procedure RenameArmy(ArmyNumber: Integer);
By: Sumilion
Description: Renames an army's name
*******************************************************************************}

procedure RenameArmy(ArmyNumber: Integer);
var
ArmyName: string;
begin
ArmyName := Readln('New army name for : ' + ArmyPages[ArmyNumber].Caption +
Chr(13) + '(Leave blank for default)');
if(ArmyName = '')then
ArmyPages[ArmyNumber].Caption := 'Army ' + IntToStr(ArmyNumber)
else
ArmyPages[ArmyNumber].Caption := ArmyName;
end;

{*******************************************************************************
procedure ExportPlayerData;
By: Starblaster100 / Sumilion
Description: Turns the info input into the forms into a copy and pasteable
DeclarePlayers procedure
*******************************************************************************}

procedure ExportPlayerData;
var
i, j, ArmyIndex: Integer;
TempString: string;
OpenDialog1 : TSaveDialog;
a: TStringList;
begin
OpenDialog1 := TSaveDialog.Create(srl_PlayerForm);
a := TStringList.Create;

with OpenDialog1 do
begin
InitialDir := ScriptPath;
Filter := 'SCAR Scripts (*.scar)|*.scar|';
if(Execute)then
begin
if(ExtractFileExt(FileName) = '')then
TempString := FileName + '.scar'
else
TempString := FileName;
end else
begin
a.Free;
Free;
Exit;
end;
Free;
end;

ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;

a.Text := a.Text + 'procedure DeclarePlayers;' + Chr(13);
a.Text := a.Text + 'begin' + Chr(13);
a.Text := a.Text + ' NumberOfPlayers(' +IntToStr(Length(PlayerPages[ArmyIndex]))+ ');' + Chr(13);
a.Text := a.Text + ' HowManyBooleans := ' +IntToStr(Length(srlpf_Booleans))+ ';' + Chr(13);

for i := 0 to Length(PlayerPages[ArmyIndex])-1 do
begin
a.Text := a.Text + Chr(13);
if(arUserNameEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Name := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Name := ''' + arUserNameEdits[ArmyIndex][i].Text + ''';' + Chr(13);

if(arPasswordEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pass := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pass := ''' + arPasswordEdits[ArmyIndex][i].Text + ''';' + Chr(13);

if(arNickEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Nick := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Nick := ''' + arNickEdits[ArmyIndex][i].Text + ''';' + Chr(13);

a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Active := ' + arActiveComboBoxes[ArmyIndex][i].Text + ';' + Chr(13);

if(arPinEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pin := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pin := ''' + arPinEdits[ArmyIndex][i].Text + ''';' + Chr(13);

if(arBoxRewardsEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].BoxRewards := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].BoxRewards := ''' + arBoxRewardsEdits[ArmyIndex][i].Text + ''';' + Chr(13);

for j := 0 to Length(srlpf_Booleans) - 1 do
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Booleans[' + IntToStr(j) + '] := ' + arBooleanComboBoxes[ArmyIndex][j][i].Text + ';' + Chr(13);

for j := 0 to Length(srlpf_Integers) - 1 do
if(arIntegerEdits[ArmyIndex][j][i].Text = '')then
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Integers[' + IntToStr(j) + '] := 0;' + Chr(13)
else
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Integers[' + IntToStr(j) + '] := ' + arIntegerEdits[ArmyIndex][j][i].Text + ';' + Chr(13);

for j := 0 to Length(srlpf_Strings) - 1 do
if(arStringEdits[ArmyIndex][j][i].Text = '')then
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Strings[' + IntToStr(j) + '] := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Strings[' + IntToStr(j) + '] := ''' + arStringEdits[ArmyIndex][j][i].Text + ''';' + Chr(13);

for j := 0 to Length(srlpf_Extendeds) - 1 do
if(arExtendedEdits[ArmyIndex][j][i].Text = '')then
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Extendeds[' + IntToStr(j) + '] := 0.0;' + Chr(13)
else
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Extendeds[' + IntToStr(j) + '] := ' + arExtendedEdits[ArmyIndex][j][i].Text + ';' + Chr(13);
end;
a.Text := a.Text + 'end;' + Chr(13);

try
SaveToFile(a, TempString);
except
a.Free;
GetApplication.MessageBox('File not found!', '', 0);
Exit;
end;
end;

{*******************************************************************************
procedure ImportPlayerData;
By: Starblaster100 / Sumilion
Description: Inputs information from the DeclarePlayers procedure into the form
*******************************************************************************}

procedure ImportPlayerData;
var
i, j, ArmyIndex: Integer;
DeclarePlayers, TempString: string;
OpenDialog1 : TOpenDialog;
a: TStringList;
begin
OpenDialog1 := TOpenDialog.Create(srl_PlayerForm);
a := TStringList.Create;

with OpenDialog1 do
begin
InitialDir := ScriptPath;
Options := [ofFileMustExist, ofReadOnly];
Filter := 'SCAR Scripts (*.scar)|*.scar|' +
'Text Files (*.txt)|*.txt|' +
'All Files|*|';
if(Execute)then
TempString := FileName
else
begin
a.Free;
Free;
Exit;
end;
Free;
end;

try
LoadFromFile(a, TempString);
except
a.Free;
GetApplication.MessageBox('File not found!', '', 0);
Exit;
end;

DeclarePlayers := LowerCase(a.Text);
AddArmy;
a.Free;

HowManyPlayers := StrToIntDef(Between('numberofplayers(', ');', DeclarePlayers), 0);
if(HowManyPlayers = 0)then
HowManyPlayers := StrToIntDef(Between('howmanyplayers := ', ';', DeclarePlayers), 1);


ArmyIndex := srlpf_ArmyPageControl.PageCount - 1;
for i := 0 to HowManyPlayers - 2 do
AddPlayerInTab(ArmyIndex);

for i := 0 to HowManyPlayers - 1 do
begin
arUserNameEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].name := ''', ''';', DeclarePlayers);
arPassWordEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].pass := ''', ''';', DeclarePlayers);
arNickEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].nick := ''', ''';', DeclarePlayers);
arActiveComboBoxes[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].active := ', ';', DeclarePlayers);
arPinEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].pin := ''', ''';', DeclarePlayers);
arBoxRewardsEdits[ArmyIndex][i].Text := Replace(Between('players[' + IntToStr(i) + '].boxrewards := ''', ''';', DeclarePlayers), ' ', '');

for j := 0 to Length(srlpf_Booleans) - 1 do
arBooleanComboBoxes[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].booleans[' +IntToStr(j)+ '] := ', ';', DeclarePlayers);

for j := 0 to Length(srlpf_Integers) - 1 do
arIntegerEdits[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].integers[' +IntToStr(j)+ '] := ', ';', DeclarePlayers);

for j := 0 to Length(srlpf_Strings) - 1 do
arStringEdits[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].strings[' +IntToStr(j)+ '] := ''', ''';', DeclarePlayers);

for j := 0 to Length(srlpf_Extendeds) - 1 do
arExtendedEdits[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].extendeds[' +IntToStr(j)+ '] := ', ';', DeclarePlayers);

if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;
end;

{*******************************************************************************
procedure OnSRLPFMainMenuClick(Sender: TObject);
By: Sumilion
Description: Form actions on the MainMenu items
*******************************************************************************}

procedure OnSRLPFMainMenuClick(Sender: TObject);
var
i, j, ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePage.PageIndex;

case Sender of
AddPlayerItem: AddPlayerInTab(ArmyIndex);

DeletePlayersItem:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Delete';
CheckListForm.Caption := 'Delete Players :';
for i := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(PlayerPages[ArmyIndex][i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
if(srlpf_PlayerPageControl[ArmyIndex].PageCount > 1)then
if(i = ArmyIndex)then
DeletePlayerInTab(ArmyIndex, i, i - 1)
else
DeletePlayerInTab(ArmyIndex, i, ArmyIndex);
end;
FreeForm(CheckListForm);
end;

ClearPlayersItem:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Clear';
CheckListForm.Caption := 'Clear Players :';
for i := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(PlayerPages[ArmyIndex][i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
ClearPlayerInTab(ArmyIndex, i);
end;
FreeForm(CheckListForm);
end;

AddArmyItem: AddArmy;

DeleteArmiesItem:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Delete';
CheckListForm.Caption := 'Delete Armies :';
for i := 0 to srlpf_ArmyPageControl.PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(ArmyPages[i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
if(srlpf_ArmyPageControl.PageCount > 1)then
DeleteArmy(i, i - 1);
end;
FreeForm(CheckListForm);
end;

ClearArmiesItem:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Clear';
CheckListForm.Caption := 'Clear Armies :';
for i := 0 to srlpf_ArmyPageControl.PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(ArmyPages[i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
for j := 0 to srlpf_PlayerPageControl[i].PageCount - 1 do
ClearPlayerInTab(i, j);
end;
FreeForm(CheckListForm);
end;

RenameArmyItem: RenameArmy(ArmyIndex);

SaveAndStart: srl_PlayerForm.ModalResult := mrOk;

SaveAndExit:
begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;

JustExitItem:
begin
srlpf_SaveWhenDone := False;
srl_PlayerForm.ModalResult := mrOk;
end;

JustStartItem:
begin
srlpf_SaveWhenDone := False;
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;

ExportPlayersItem: ExportPlayerData;

ImportPlayersItem: ImportPlayerData;

end;
end;

{*******************************************************************************
procedure OnSRLPFClick(Sender: TObject);
By: Sumilion || edited by Richard and ZephyrsFury
Description: Form action on a click on a button
*******************************************************************************}

procedure OnSRLPFClick(Sender: TObject);
var
c, i, ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePage.PageIndex;

case Sender of
PreviousButton:
begin
srlpf_PlayerPageControl[ArmyIndex].ActivePage := srlpf_PlayerPageControl[ArmyIndex].FindNextPage(srlpf_PlayerPageControl[ArmyIndex].ActivePage,
False, True);
end;

DelPlayerButton:
begin
c := srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex;

DeletePlayerInTab(ArmyIndex, c, c - 1);
end;

AddPlayerButton: AddPlayerInTab(ArmyIndex);

NextButton: srlpf_PlayerPageControl[ArmyIndex].ActivePage := srlpf_PlayerPageControl[ArmyIndex].FindNextPage(srlpf_PlayerPageControl[ArmyIndex].ActivePage, True, True);

CheckListButton: CheckListForm.ModalResult := mrOk;

StartButton: begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_SaveWhenDone := False;
end;

ExitButton: Begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;

SaveExitButton: begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;

SaveStartButton: srl_PlayerForm.ModalResult := mrOk;

end;

for i := c to Length(PlayerPages[ArmyIndex]) - 1 do
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;

{*******************************************************************************
procedure OnSRLPFShow(Sender: TObject);
By: Sumilion
Description: Form action on a Tab show
*******************************************************************************}

procedure OnSRLPFShow(Sender: TObject);
var
i, j: Integer;
begin
for i := 0 to Length(ArmyPages) - 1 do
if(ArmyPages[i] = Sender)then
begin
SetLabelsParent(i, srlpf_PlayerPageControl[i].ActivePageIndex);
Exit;
end;

i := srlpf_ArmyPageControl.ActivePageIndex;

for j := 0 to Length(PlayerPages[i]) - 1 do
if(PlayerPages[i][j] = Sender)then
begin
SetLabelsParent(i, j);
Exit;
end;
end;

{*******************************************************************************
procedure SRLPFMenuClick(Sender: TObject);
By: Sumilion
Description: Form action on Menu click
*******************************************************************************}

procedure SRLPFMenuClick(Sender: TObject);
var
c, ArmyIndex, PlayerIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;
PlayerIndex := srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex;
case Sender of
AddArmyPopUp: AddArmy;

DelArmyPopUp:
begin
c := srlpf_ArmyPageControl.ActivePageIndex;
DeleteArmy(c, c - 1);
end;

ChangeArmyNamePopUp: RenameArmy(srlpf_ArmyPageControl.ActivePageIndex);

ClearArmyPopUp:
begin
for c := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
ClearPlayerInTab(ArmyIndex, c);
end;

AddPlayerPopUp: AddPlayerInTab(ArmyIndex);

DelPlayerPopUp:
begin
DeletePlayerInTab(ArmyIndex, PlayerIndex, PlayerIndex - 1);
for c := PlayerIndex to Length(PlayerPages[ArmyIndex]) - 1 do
if(arUserNameEdits[ArmyIndex][c].Text <> '')then
PlayerPages[ArmyIndex][c].Caption := arUserNameEdits[ArmyIndex][c].Text
else
PlayerPages[ArmyIndex][c].Caption := 'Player ' + IntToStr(c);
end;

ClearPlayerPopUp: ClearPlayerInTab(ArmyIndex, PlayerIndex);
end;
end;

{*******************************************************************************
procedure SetSRLPlayerFormArrays;
By: Sumilion
Description: Sets the arrays for the form
*******************************************************************************}

procedure SetSRLPlayerFormArrays;
var
i, j: Integer;
begin
SetLength(srlpf_PlayerPageControl, Length(ArmyPages));

SetLength(arUserNameEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arUserNameEdits[i], Length(PlayerPages[i]));

SetLength(arPasswordEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arPasswordEdits[i], Length(PlayerPages[i]));

SetLength(arNickEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arNickEdits[i], Length(PlayerPages[i]));

SetLength(arActiveComboBoxes, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arActiveComboBoxes[i], Length(PlayerPages[i]));

SetLength(arPinEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arPinEdits[i], Length(PlayerPages[i]));

SetLength(arBoxRewardsEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arBoxRewardsEdits[i], Length(PlayerPages[i]));

SetLength(arBooleanLabels, Length(srlpf_Booleans));
SetLength(arBooleanComboBoxes, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arBooleanComboBoxes[i], Length(srlpf_Booleans));
for j := 0 to Length(arBooleanComboBoxes[i]) - 1 do
SetLength(arBooleanComboBoxes[i][j], Length(PlayerPages[i]));
end;

SetLength(arIntegerLabels, Length(srlpf_Integers));
SetLength(arIntegerEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arIntegerEdits[i], Length(srlpf_Integers));
for j := 0 to Length(arIntegerEdits[i]) - 1 do
SetLength(arIntegerEdits[i][j], Length(PlayerPages[i]));
end;

SetLength(arStringLabels, Length(srlpf_Strings));
SetLength(arStringEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arStringEdits[i], Length(srlpf_Strings));
for j := 0 to Length(arStringEdits[i]) - 1 do
SetLength(arStringEdits[i][j], Length(PlayerPages[i]));
end;

SetLength(arExtendedLabels, Length(srlpf_Extendeds));
SetLength(arExtendedEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arExtendedEdits[i], Length(srlpf_Extendeds));
for j := 0 to Length(arExtendedEdits[i]) - 1 do
SetLength(arExtendedEdits[i][j], Length(PlayerPages[i]));
end;
end;

{*******************************************************************************
procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer);
By: Sumilion
Description: Fills the tabs with components
*******************************************************************************}

procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer);
var
a, b: Integer;
begin
b := 0;

PlayerPages[ArmyNumber][TabNumber] := TTabSheet.Create(srl_PlayerForm);

with PlayerPages[ArmyNumber][TabNumber] do
begin
if(arUserNameEdits[ArmyNumber][TabNumber].Text <> '')then
Caption := arUserNameEdits[ArmyNumber][TabNumber].Text
else
Caption := 'Player ' + IntToStr(TabNumber);
PageControl := srlpf_PlayerPageControl[ArmyNumber];
Parent := srlpf_PlayerPageControl[ArmyNumber];
OnMouseDown := @OnSRLPFMouseDown;
OnShow := @OnSRLPFShow;
end;

with arUserNameEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 53;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

with arPasswordEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 83;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

with arNickEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 113;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

with arActiveComboBoxes[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 143;
Width := 121;
Height := 21;
ItemHeight := 13;
TabOrder := 8;
OnClick := @OnSRLPFClick;
Items.Add('True');
Items.Add('False');
end;

with arPinEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 173;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

with arBoxRewardsEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203;
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;

for a := 0 to Length(srlpf_Booleans) - 1 do
begin
b := b + 1;

with arBooleanLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Booleans[a] = '')then
Caption := 'Boolean[' + IntToStr(a) + ']'
else
Caption := srlpf_Booleans[a];
end;

with arBooleanComboBoxes[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203 + (b * 30);
Width := 121;
Height := 21;
ItemHeight := 13;
TabOrder := 8;
OnClick := @OnSRLPFClick;
if(Text = '')then
Text := 'False';
Items.Add('True');
Items.Add('False');
end;
end;

for a := 0 to Length(srlpf_Integers) - 1 do
begin
b := b + 1;

with arIntegerLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Integers[a] = '')then
Caption := 'Integer[' + IntToStr(a) + ']'
else
Caption := srlpf_Integers[a];
end;

with arIntegerEdits[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203 + (b * 30);
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;
end;

for a := 0 to Length(srlpf_Strings) - 1 do
begin
b := b + 1;

with arStringLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Strings[a] = '')then
Caption := 'String[' + IntToStr(a) + ']'
else
Caption := srlpf_Strings[a];
end;

with arStringEdits[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203 + (b * 30);
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;
end;

for a := 0 to Length(srlpf_Extendeds) - 1 do
begin
b := b + 1;

with arExtendedLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Extendeds[a] = '')then
Caption := 'Extended[' + IntToStr(a) + ']'
else
Caption := srlpf_Extendeds[a];
end;

with arExtendedEdits[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Left := (srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2);
Top := 203 + (b * 30);
Width := 121;
Height := 21;
TabOrder := 8;
OnMouseDown := @OnSRLPFMouseDown;
end;
end;
end;

{*******************************************************************************
procedure LoadSRLPlayerForm;
By: Sumilion || edited by Richard and ZephyrsFury
Description: Loads the main SRL player form
*******************************************************************************}

procedure LoadSRLPlayerForm;
var
i, j, ArmyIndex: Integer;
begin
srl_PlayerForm := CreateForm;
srl_PlayerForm.Position := poDesktopCenter;
srl_PlayerForm.Width := 243;
srl_PlayerForm.Height := 385 + (Length(srlpf_Booleans) * 30) + //285 + 30 +30 = 345 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) + // + extra 40 for buttons = 385
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
srl_PlayerForm.Caption := 'SRL Playerform';
srl_PlayerForm.Color := clWhite;
srl_PlayerForm.Font.Color := clWindowText;
srl_PlayerForm.Font.Height := -11;
srl_PlayerForm.Font.Name := 'MS Sans Serif';
srl_PlayerForm.Font.Style := [];
srl_PlayerForm.Visible := False;
srl_PlayerForm.PixelsPerInch := 96;
srl_PlayerForm.BorderIcons := [biSystemMenu];
srl_PlayerForm.BorderStyle := bsSingle;

srlpf_MainMenu := TMainMenu.Create(srl_PlayerForm);

FileItem := TMenuItem.Create(srl_PlayerForm);
FileItem.Caption := 'File';

ImportPlayersItem := TMenuItem.Create(srl_PlayerForm);
ImportPlayersItem.Caption := 'Import Players';
ImportPlayersItem.OnClick := @OnSRLPFMainMenuClick;

ExportPlayersItem := TMenuItem.Create(srl_PlayerForm);
ExportPlayersItem.Caption := 'Export Players';
ExportPlayersItem.OnClick := @OnSRLPFMainMenuClick;

srlpf_MainMenu.Items.Add(FileItem);
srlpf_MainMenu.Items.Items[0].Add(ImportPlayersItem);
srlpf_MainMenu.Items.Items[0].Add(ExportPlayersItem);

PlayerControlItem := TMenuItem.Create(srl_PlayerForm);
PlayerControlItem.Caption := 'Player Control';

AddPlayerItem := TMenuItem.Create(srl_PlayerForm);
AddPlayerItem.Caption := 'Add Player';
AddPlayerItem.OnClick := @OnSRLPFMainMenuClick;

DeletePlayersItem := TMenuItem.Create(srl_PlayerForm);
DeletePlayersItem.Caption := 'Delete Players';
DeletePlayersItem.OnClick := @OnSRLPFMainMenuClick;

ClearPlayersItem := TMenuItem.Create(srl_PlayerForm);
ClearPlayersItem.Caption := 'Clear Players';
ClearPlayersItem.OnClick := @OnSRLPFMainMenuClick;

srlpf_MainMenu.Items.Add(PlayerControlItem);
srlpf_MainMenu.Items.Items[1].Add(AddPlayerItem);
srlpf_MainMenu.Items.Items[1].Add(DeletePlayersItem);
srlpf_MainMenu.Items.Items[1].Add(ClearPlayersItem);

ArmyControlItem := TMenuItem.Create(srl_PlayerForm);
ArmyControlItem.Caption := 'Army Control';

AddArmyItem := TMenuItem.Create(srl_PlayerForm);
AddArmyItem.Caption := 'Add Army';
AddArmyItem.OnClick := @OnSRLPFMainMenuClick;

DeleteArmiesItem := TMenuItem.Create(srl_PlayerForm);
DeleteArmiesItem.Caption := 'Delete Armies';
DeleteArmiesItem.OnClick := @OnSRLPFMainMenuClick;

ClearArmiesItem := TMenuItem.Create(srl_PlayerForm);
ClearArmiesItem.Caption := 'Clear Armies';
ClearArmiesItem.OnClick := @OnSRLPFMainMenuClick;

RenameArmyItem := TMenuItem.Create(srl_PlayerForm);
RenameArmyItem.Caption := 'Rename Army';
RenameArmyItem.OnClick := @OnSRLPFMainMenuClick;

srlpf_MainMenu.Items.Add(ArmyControlItem);
srlpf_MainMenu.Items.Items[2].Add(AddArmyItem);
srlpf_MainMenu.Items.Items[2].Add(DeleteArmiesItem);
srlpf_MainMenu.Items.Items[2].Add(ClearArmiesItem);
srlpf_MainMenu.Items.Items[2].Add(RenameArmyItem);

ExitItem := TMenuItem.Create(srl_PlayerForm);
ExitItem.Caption := 'Exit';

SaveAndStart := TMenuItem.Create(srl_PlayerForm);
SaveAndStart.Caption := 'Save and Start';
SaveAndStart.OnClick := @OnSRLPFMainMenuClick;

SaveAndExit := TMenuItem.Create(srl_PlayerForm);
SaveAndExit.Caption := 'Save and Exit';
SaveAndExit.OnClick := @OnSRLPFMainMenuClick;

JustExitItem := TMenuItem.Create(srl_PlayerForm);
JustExitItem.Caption := 'Start';
JustExitItem.OnClick := @OnSRLPFMainMenuClick;

JustStartItem := TMenuItem.Create(srl_PlayerForm);
JustStartItem.Caption := 'Exit';
JustStartItem.OnClick := @OnSRLPFMainMenuClick;

srlpf_MainMenu.Items.Add(ExitItem);
srlpf_MainMenu.Items.Items[3].Add(SaveAndStart);
srlpf_MainMenu.Items.Items[3].Add(SaveAndExit);
srlpf_MainMenu.Items.Items[3].Add(JustExitItem);
srlpf_MainMenu.Items.Items[3].Add(JustStartItem);

srlpf_Width := 58;
for i := 0 to Length(srlpf_Booleans) - 1 do
begin
arBooleanLabels[i] := TLabel.Create(srl_PlayerForm);
arBooleanLabels[i].Caption := srlpf_Booleans[i];
srlpf_Width := Max(srlpf_Width, arBooleanLabels[i].Width);
end;

for i := 0 to Length(srlpf_Integers) - 1 do
begin
arIntegerLabels[i] := TLabel.Create(srl_PlayerForm);
arIntegerLabels[i].Caption := srlpf_Integers[i];
srlpf_Width := Max(srlpf_Width, arIntegerLabels[i].Width);
end;

for i := 0 to Length(srlpf_Strings) - 1 do
begin
arStringLabels[i] := TLabel.Create(srl_PlayerForm);
arStringLabels[i].Caption := srlpf_Strings[i];
srlpf_Width := Max(srlpf_Width, arStringLabels[i].Width);
end;

for i := 0 to Length(srlpf_Extendeds) - 1 do
begin
arExtendedLabels[i] := TLabel.Create(srl_PlayerForm);
arExtendedLabels[i].Caption := srlpf_Extendeds[i];
srlpf_Width := Max(srlpf_Width, arExtendedLabels[i].Width);
end;

srl_PlayerForm.Width := srl_PlayerForm.Width + srlpf_Width;

srlpf_ArmyPageControl := TPageControl.Create(srl_PlayerForm);
srlpf_ArmyPageControl.Parent := srl_PlayerForm;
srlpf_ArmyPageControl.Align := alNone;
srlpf_ArmyPageControl.Top := 0;
srlpf_ArmyPageControl.Width := srl_PlayerForm.Width;
srlpf_ArmyPageControl.Height := 305 + (Length(srlpf_Booleans) * 30) + //285 + 30 +30 = 345 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) +
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
srlpf_ArmyPageControl.OnMouseDown := @OnSRLPFMouseDown;
//srlpf_ArmyPageControl.OnChange := @OnSRLPFChange;

for i := 0 to Length(ArmyPages) - 1 do
begin
ArmyPages[i] := TTabSheet.Create(srl_PlayerForm);
if(ArmyNames[i] <> '')then
ArmyPages[i].Caption := ArmyNames[i]
else
ArmyPages[i].Caption := 'Army ' + IntToStr(i);
ArmyPages[i].PageControl := srlpf_ArmyPageControl;
ArmyPages[i].OnShow := @OnSRLPFShow;
end;
srlpf_ArmyPageControl.ActivePageIndex := ActiveArmy;
ArmyIndex := ActiveArmy;

SetSRLPlayerFormArrays;

for i := 0 to Length(srlpf_PlayerPageControl) - 1 do
begin
srlpf_PlayerPageControl[i] := TPageControl.Create(srl_PlayerForm);
srlpf_PlayerPageControl[i].Parent := ArmyPages[i];
srlpf_PlayerPageControl[i].Width := ArmyPages[i].Width;
srlpf_PlayerPageControl[i].Height := ArmyPages[i].Height;
srlpf_PlayerPageControl[i].Align := alBottom;
srlpf_PlayerPageControl[i].OnMouseDown := @OnSRLPFMouseDown;
srlpf_PlayerPageControl[i].OnDragDrop := @OnSRLPFDragDrop;
srlpf_PlayerPageControl[i].OnDragOver := @OnSRLPFDragOver;
end;

for j := 0 to Length(PlayerPages) - 1 do
for i := 0 to Length(PlayerPages[j]) - 1 do
FillSRLPlayerFormTab(j, i);

UserNameLabel := TLabel.Create(srl_PlayerForm);
UserNameLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
UserNameLabel.Top := 56;
UserNameLabel.Caption := 'Username';

PasswordLabel := TLabel.Create(srl_PlayerForm);
PasswordLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
PasswordLabel.Top := 86;
PasswordLabel.Caption := 'Password';

NickLabel := TLabel.Create(srl_PlayerForm);
NickLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
NickLabel.Top := 116;
NickLabel.Caption := 'Nickname';

ActiveLabel := TLabel.Create(srl_PlayerForm);
ActiveLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
ActiveLabel.Top := 146;
ActiveLabel.Caption := 'Active';

PinLabel := TLabel.Create(srl_PlayerForm);
PinLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
PinLabel.Top := 176;
PinLabel.Caption := 'Bank Pin';

BoxRewardsLabel := TLabel.Create(srl_PlayerForm);
BoxRewardsLabel.Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
BoxRewardsLabel.Top := 206;
BoxRewardsLabel.Caption := 'Box Rewards';

srlpf_ArmyPopUpMenu := TPopupMenu.Create(srlpf_ArmyPageControl);

AddArmyPopUp := TMenuItem.Create(srl_PlayerForm);
AddArmyPopUp.Caption := 'Add Army';
AddArmyPopUp.OnClick := @SRLPFMenuClick;

DelArmyPopUp := TMenuItem.Create(srl_PlayerForm);
DelArmyPopUp.Caption := 'Delete Army';
DelArmyPopUp.OnClick := @SRLPFMenuClick;

ChangeArmyNamePopUp := TMenuItem.Create(srl_PlayerForm);
ChangeArmyNamePopUp.Caption := 'Rename Army';
ChangeArmyNamePopUp.OnClick := @SRLPFMenuClick;

ClearArmyPopUp := TMenuItem.Create(srl_PlayerForm);
ClearArmyPopUp.Caption := 'Clear Army';
ClearArmyPopUp.OnClick := @SRLPFMenuClick;

srlpf_ArmyPopUpMenu.Items.Add(AddArmyPopUp);
srlpf_ArmyPopUpMenu.Items.Add(DelArmyPopUp);
srlpf_ArmyPopUpMenu.Items.Add(ChangeArmyNamePopUp);
srlpf_ArmyPopUpMenu.Items.Add(ClearArmyPopUp);

srlpf_PlayerPopUpMenu := TPopupMenu.Create(srl_PlayerForm);

AddPlayerPopUp := TMenuItem.Create(srl_PlayerForm);
AddPlayerPopUp.Caption := 'Add Player';
AddPlayerPopUp.OnClick := @SRLPFMenuClick;

DelPlayerPopUp := TMenuItem.Create(srl_PlayerForm);
DelPlayerPopUp.Caption := 'Delete Player';
DelPlayerPopUp.OnClick := @SRLPFMenuClick;

ClearPlayerPopUp := TMenuItem.Create(srl_PlayerForm);
ClearPlayerPopUp.Caption := 'Clear Player';
ClearPlayerPopUp.OnClick := @SRLPFMenuClick;

srlpf_PlayerPopUpMenu.Items.Add(AddPlayerPopUp);
srlpf_PlayerPopUpMenu.Items.Add(DelPlayerPopUp);
srlpf_PlayerPopUpMenu.Items.Add(ClearPlayerPopUp);

PreviousButton := TButton.Create(srl_PlayerForm);
PreviousButton.Parent := srl_PlayerForm;
PreviousButton.Left := (srl_PlayerForm.Width / 2) - 109;
PreviousButton.Top := 60;
PreviousButton.Width := 29;
PreviousButton.Height := 25;
PreviousButton.Caption := '<----';
PreviousButton.TabOrder := 8;
PreviousButton.OnClick := @OnSRLPFClick;

AddPlayerButton := TButton.Create(srl_PlayerForm);
AddPlayerButton.Parent := srl_PlayerForm;
AddPlayerButton.Left := (srl_PlayerForm.Width / 2) - 80;
AddPlayerButton.Top := 60;
AddPlayerButton.Width := 75;
AddPlayerButton.Height := 25;
AddPlayerButton.Caption := 'Add Player';
AddPlayerButton.TabOrder := 8;
AddPlayerButton.OnClick := @OnSRLPFClick;

DelPlayerButton := TButton.Create(srl_PlayerForm);
DelPlayerButton.Parent := srl_PlayerForm;
DelPlayerButton.Left := (srl_PlayerForm.Width / 2) - 5;
DelPlayerButton.Top := 60;
DelPlayerButton.Width := 75;
DelPlayerButton.Height := 25;
DelPlayerButton.Caption := 'Delete Player';
DelPlayerButton.TabOrder := 8;
DelPlayerButton.OnClick := @OnSRLPFClick;

NextButton := TButton.Create(srl_PlayerForm);
NextButton.Parent := srl_PlayerForm;
NextButton.Left := (srl_PlayerForm.Width / 2) + 70;
NextButton.Top := 60;
NextButton.Width := 29;
NextButton.Height := 25;
NextButton.Caption := '---->';
NextButton.TabOrder := 8;
NextButton.OnClick := @OnSRLPFClick;

StartButton := TButton.Create(srl_PlayerForm);
StartButton.Parent := srl_PlayerForm;
StartButton.Left := (srl_PlayerForm.Width / 2) - 130;
StartButton.Top := 310 + (Length(srlpf_Booleans) * 30) + //250 + 30 +30 = 310 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) +
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
StartButton.Width := 40;
StartButton.Height := 25;
StartButton.Caption := 'Start';
StartButton.TabOrder := 7;
StartButton.OnClick := @OnSRLPFClick;

ExitButton := TButton.Create(srl_PlayerForm);
ExitButton.Parent := srl_PlayerForm;
ExitButton.Left := (srl_PlayerForm.Width / 2) + 70;
ExitButton.Top := 310 + (Length(srlpf_Booleans) * 30) + //250 + 30 +30 = 310 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) +
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
ExitButton.Width := 40;
ExitButton.Height := 25;
ExitButton.Caption := 'Exit';
ExitButton.TabOrder := 7;
ExitButton.OnClick := @OnSRLPFClick;

SaveStartButton := TButton.Create(srl_PlayerForm);
SaveStartButton.Parent := srl_PlayerForm;
SaveStartButton.Left := (srl_PlayerForm.Width / 2) - 90;
SaveStartButton.Top := 310 + (Length(srlpf_Booleans) * 30) + //250 + 30 +30 = 310 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) +
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
SaveStartButton.Width := 80;
SaveStartButton.Height := 25;
SaveStartButton.Caption := 'Start and Save';
SaveStartButton.TabOrder := 7;
SaveStartButton.OnClick := @OnSRLPFClick;

SaveExitButton := TButton.Create(srl_PlayerForm);
SaveExitButton.Parent := srl_PlayerForm;
SaveExitButton.Left := (srl_PlayerForm.Width / 2) - 10;
SaveExitButton.Top := 310 + (Length(srlpf_Booleans) * 30) + //250 + 30 +30 = 310 //Pin and BoxRewards
(Length(srlpf_Integers) * 30) +
(Length(srlpf_Strings) * 30) +
(Length(srlpf_Extendeds) * 30);
SaveExitButton.Width := 80;
SaveExitButton.Height := 25;
SaveExitButton.Caption := 'Exit and Save';
SaveExitButton.TabOrder := 7;
SaveExitButton.OnClick := @OnSRLPFClick;
end;

{*******************************************************************************
procedure ShowSRLPFFormModal;
By: Sumilion
Description: Shows the form
*******************************************************************************}

procedure ShowSRLPFFormModal;
begin
srl_PlayerForm.ShowModal;
end;

{*******************************************************************************
procedure SRLPlayerForm(ShowForm: Boolean; Booleans, Integers, Strings, Extendeds: TStringArray);
By: Sumilion
Description: Main function, sets and loads values needed for player settings and the form.
*******************************************************************************}

procedure SRLPlayerForm(ShowForm: Boolean; Booleans, Integers, Strings, Extendeds: TStringArray);
var
V: TVariantArray;
begin
srlpf_SavePath := AppPath + 'Chars.INI';
srlpf_Booleans := Booleans;
srlpf_Integers := Integers;
srlpf_Strings := Strings;
srlpf_Extendeds := Extendeds;
LoadPlayers(False);
if(ShowForm)then
begin
srlpf_SaveWhenDone := True;
V := [];
ThreadSafeCall('LoadSRLPlayerForm', V);
V := [];
ThreadSafeCall('ShowSRLPFFormModal', V);
if(srlpf_SaveWhenDone)then
SavePlayers;
if(srlpf_TerminateWhenDone)then
TerminateScript;
end;
LoadPlayers(True);
end;

Try it

Richard

2009-04-25 13:34:03

Perhaps post an image? I've already messed up my users.scar enough :p

I'm going to look into adding a scroll bar, when you guys say whether its 10 inputs or more, do you mean 10 inputs including name, pass etc.? Or excluding these (because there's not going to be many scripts with 10 inputs per player).

Torrent of Flame

2009-04-25 16:02:14

Dan Cardin, it doesn't really matter to be honest. Not alot of people look directly at the code when using SRL Player Form anyway.

Richard

2009-04-25 16:21:49

Anyone have much experience in putting scroll bars in forms? Because they are a lot harder than they look :p

Dan Cardin

2009-04-26 19:42:17

From: Cazax
I've just made a procedure to detects non numerical pin numbers and delete them

what exactly did you change? Ive changed too much to use the original.

As for the scrollbar, if you just put all of the boxes that they need to fill in into a TScrollBox, then it should automatically (as long as autoscroll is on…which it is by default) do all that work for you. (/me is already adding this though)

Naum

2009-04-26 20:17:39

Just do something like if Form.Height > 800 then AddscrollBar.

Cazax

2009-04-26 23:16:33

That's a function I made to enable user only to put 4 numbers in the Pin Edit. Though I added it wrongly.

Richard

2009-04-26 23:38:30

From: NaumanAkhlaQ
Just do something like if Form.Height > 800 then AddscrollBar.


The way that is easier is something much more like:

If (Length(srlpf_Booleans)  +
Length(srlpf_Integers) +
Length(srlpf_Strings) +
Length(srlpf_Extendeds)) >= 4 then

Dynamite

2009-04-26 23:47:06

hey i was wondering is a different style of button better?

this what i quickly came up with, just ask if you want dif style or dont like.


Richard

2009-04-27 00:35:53

Images on the SRLPF = way too much memory required.

Dynamite

2009-04-27 00:38:05

oh yeh!

Good point ;)

T~M

Dan Cardin

2009-04-27 02:09:14

From: Richard
Images on the SRLPF = way too much memory required.

that = very much lies. especially for only a couple of images, you could have a LOT more. The only thing i would be worried about is it not looking in compliance with the rest of the form.

@the post a couple up, if you just put them on a TScrollBox, you dont need any of that…

Richard

2009-04-27 02:12:23

From: Dan Cardin
that = very much lies. especially for only a couple of images, you could have a LOT more. The only thing i would be worried about is it not looking in compliance with the rest of the form.

@the post a couple up, if you just put them on a TScrollBox, you dont need any of that…


We're talking about 4 images for the new buttons, then they would probably look out of place so you'd do the same for the other 4, then they'd all look out of place and you'd probably end up making the whole form have a background image.

Your welcome to try, but it will slow it down a lot

Da 0wner

2009-04-27 02:44:46

Loading them from the computer should not take that much memory.

Sewoemio

2009-04-27 03:03:00

I say no buttons at all.

ZephyrsFury

2009-04-27 05:35:20

No I won't be adding images to the form.

Dan Cardin

2009-04-27 14:54:12

From: Richard
We're talking about 4 images for the new buttons, then they would probably look out of place so you'd do the same for the other 4, then they'd all look out of place and you'd probably end up making the whole form have a background image.

Your welcome to try, but it will slow it down a lot

I completely disagree, this really isn't about the form since making it look good would just take more effort than is really needed, but you're either seriously underestimating the power of SCAR or you're overestimating how memory intensive loading some images is.

Anyways, through the use of some arrays getting rid of useless stuff (which basically makes it a heck of a lot easier to add stuff if something needs to be added later), i think its down, around 300 lines. Anything more will require me to actually look through the form to see how its put together (which ill probably do when i have some time).
//-----------------------------------------------------------------//
//-- Scar Standard Resource Library --//
//-- ยป User Manager Routines --//
//-----------------------------------------------------------------//
// * procedure LoadCheckListForm; | by Sumilion
// * procedure ShowCheckListFormModal; | by Sumilion
// * procedure ShowCheckListForm; | by Sumilion
// * procedure SavePlayers(Create: Boolean); | by Starblaster100
// * procedure LoadPlayers(SetPlayers: Boolean); | by Starblaster100
// * procedure SwitchInTabArray(NewPlace, OldPlace: Integer; var V: array of TTabSheet); | by Sumilion
// * procedure SwitchInEditArray(NewPlace, OldPlace: Integer; var V: array of TEdit); | by Sumilion
// * procedure SwitchInComboArray(NewPlace, OldPlace: Integer; var V: array of TComboBox); | by Sumilion
// * procedure OnSRLPFMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); | by Sumilion
// * procedure OnSRLPFDragDrop(Sender, Source: TObject; X, Y: Integer); | by Sumilion
// * procedure OnSRLPFDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); | by Sumilion
// * procedure DeleteInEditArray(SpotToDelete: Integer; var V: array of TEdit); | by Sumilion
// * procedure DeleteInEditArrayOfArray(SpotToDelete: Integer; var V: array of array of TEdit); | by Sumilion
// * procedure DeleteInEditArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TEdit); | by Sumilion
// * procedure DeleteInComboArray(SpotToDelete: Integer; var V: array of TComboBox); | by Sumilion
// * procedure DeleteInComboArrayOfArray(SpotToDelete: Integer; var V: array of array of TComboBox); | by Sumilion
// * procedure DeleteInComboArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TComboBox); | by Sumilion
// * procedure DeleteInTabArray(SpotToDelete: Integer; var V: array of TTabSheet); | by Sumilion
// * procedure DeleteInTabArrayOfArray(SpotToDelete: Integer; var V: array of array of TTabSheet); | by Sumilion
// * procedure DeleteInPageControlArray(SpotToDelete: Integer; var V: array of TPageControl); | by Sumilion
// * procedure SetLabelsParent(Parent: Integer); | by Sumilion
// * procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer); | by Sumilion
// * procedure ClearPlayerInTab(ArmyNumber, PlayerNumber: Integer); | by Sumilion
// * procedure AddPlayerInTab(ArmyNumber: Integer); | by Sumilion
// * procedure AddArmy; | by Sumilion
// * procedure DeleteArmy(ArmyNumber, NextArmyTab: Integer); | by Sumilion
// * procedure RenameArmy(ArmyNumber: Integer); | by Sumilion
// * procedure ExportPlayerData; | by Starblaster100 / Sumilion
// * procedure ImportPlayerData; | by Starblaster100 / Sumilion
// * procedure OnSRLPFMainMenuClick(Sender: TObject); | by Sumilion
// * procedure OnSRLPFClick(Sender: TObject); | by Sumilion/Richard/ZephyrsFury
// * procedure OnSRLPFShow(Sender: TObject); | by Sumilion
// * procedure SRLPFMenuClick(Sender: TObject); | by Sumilion
// * procedure SetSRLPlayerFormArrays; | by Sumilion
// * procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer); | by Sumilion
// * procedure LoadSRLPlayerForm; | by Sumilion/Richard/ZephyrsFury
// * procedure ShowSRLPFFormModal; | by Sumilion
// * procedure SRLPlayerForm(ShowForm: Boolean; Booleans, Integers, Strings, Extendeds: TStringArray); | by Sumilion

var
// Main form components
srl_PlayerForm : TForm;
srlpf_PreviousTabIndex, srlpf_Width, HowManyArmies, ActiveArmy: Integer;
srlpf_TerminateWhenDone, srlpf_SaveWhenDone: Boolean;
srlpf_ArmyPageControl : TPageControl;
srlpf_PlayerPageControl : array of TPageControl;
ArmyPages : array of TTabSheet;
ArmyNames : TStringArray;
PlayerPages : array of array of TTabSheet;
// Menu items
srlpf_ArmyPopUpMenu, srlpf_PlayerPopUpMenu: TPopupMenu;
srlpf_MainMenu: TMainMenu;
mItem: array of array of TMenuItem;
apop, ppop: array of TMenuItem;
// All labels
arBooleanLabels, arIntegerLabels,
arStringLabels, arExtendedLabels, labels: array of TLabel;
// All changeable settings
arUserNameEdits, arPasswordEdits, arNickEdits, arPinEdits, arBoxRewardsEdits : array of array of TEdit;
arActiveComboBoxes : array of array of TComboBox;
arBooleanComboBoxes : array of array of array of TComboBox;
arIntegerEdits, arStringEdits, arExtendedEdits : array of array of array of TEdit;
// All buttons on the form
pcontrol, control: array of TButton;
// Arrays of variable settings
srlpf_Booleans, srlpf_Integers, srlpf_Strings, srlpf_Extendeds: TStringArray;
// CheckList form vars
CheckListForm : TForm;
SRLPFCheckListBox: TCheckListBox;
CheckListButton: TButton;
// Other
srlpf_SavePath: string;

procedure SetSRLPlayerFormArrays; forward;
procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer); forward;
procedure OnSRLPFShow(Sender: TObject); forward;
procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer); forward;
procedure OnSRLPFClick(Sender: TObject); forward;

{*******************************************************************************
procedure LoadCheckListForm;
By: Sumilion
Description: Initializes the check list form needed for Users.scar
*******************************************************************************}

procedure LoadCheckListForm;
var
ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;

CheckListForm.Position := poDesktopCenter;
CheckListForm.Width := 200;
CheckListForm.Height := 135;
CheckListForm.Color := clBtnFace;
CheckListForm.Font.Color := clWindowText;
CheckListForm.Font.Height := -11;
CheckListForm.Font.Name := 'MS Sans Serif';
CheckListForm.Font.Style := [];
CheckListForm.Visible := False;
CheckListForm.PixelsPerInch := 96;
CheckListForm.BorderIcons := [biSystemMenu];
CheckListForm.BorderStyle := bsSingle;

SRLPFCheckListBox.Parent := CheckListForm;
SRLPFCheckListBox.Width := CheckListForm.Width;
SRLPFCheckListBox.Height := CheckListForm.Height - 65;
SRLPFCheckListBox.Align := alTop;
SRLPFCheckListBox.ItemHeight := 13;

CheckListButton.Parent := CheckListForm;
CheckListButton.Left := 70;
CheckListButton.Top := 80;
CheckListButton.Width := 50;
CheckListButton.Height := 20;
CheckListButton.OnClick := @OnSRLPFClick;
end;

{*******************************************************************************
procedure ShowCheckListFormModal;
By: Sumilion
Description: Showes the form.
*******************************************************************************}

procedure ShowCheckListFormModal;
begin
CheckListForm.ShowModal;
end;

{*******************************************************************************
procedure ShowCheckListForm;
By: Sumilion
Description: Safely initializes and shows the form
*******************************************************************************}

procedure ShowCheckListForm;
var
v: TVariantArray;
begin
V := [];
ThreadSafeCall('LoadCheckListForm', V);
V := [];
ThreadSafeCall('ShowCheckListFormModal', V);
end;

{*******************************************************************************
procedure SavePlayers;
By: Starblaster100
Description: Saves the players to a file / creates a file when needed.
*******************************************************************************}

procedure SavePlayers;
var
ArmyIndex, i, j, k: Integer;
Begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;
WriteINI('General', 'HowManyArmies', IntToStr(Length(ArmyPages)), srlpf_SavePath);
WriteINI('General', 'ActiveArmy', IntToStr(ArmyIndex), srlpf_SavePath);
for i := 0 to GetArrayLength(ArmyPages) - 1 do
begin
WriteINI('ArmyPages', 'Name[' +IntToStr(i)+ ']', ArmyPages[i].Caption, srlpf_SavePath);
WriteINI('ArmyPages', 'Number[' +IntToStr(i)+ ']', IntToStr(Length(PlayerPages[i])), srlpf_SavePath);
end;
for k := 0 to Length(ArmyPages) - 1 do
begin
for i := 0 to Length(PlayerPages[k]) - 1 do
begin
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Username', arUserNameEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Password', arPasswordEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Nickname', arNickEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Active', arActiveComboBoxes[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Pin', arPinEdits[k][i].Text, srlpf_SavePath);
WriteINI(IntToStr(k) +',' +IntToStr(i), 'BoxRewards', Replace(arBoxRewardsEdits[k][i].Text, ' ', ''), srlpf_SavePath);
for j := 0 to Length(srlpf_Booleans) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Booleans[' +IntToStr(j)+ ']', arBooleanComboBoxes[k][j][i].Text, srlpf_SavePath);
for j := 0 to Length(srlpf_Integers) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Integers[' +IntToStr(j)+ ']', arIntegerEdits[k][j][i].Text, srlpf_SavePath);
for j := 0 to Length(srlpf_Strings) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Strings[' +IntToStr(j)+ ']', arStringEdits[k][j][i].Text, srlpf_SavePath);
for j := 0 to Length(srlpf_Extendeds) - 1 do
WriteINI(IntToStr(k) +',' +IntToStr(i), 'Extendeds[' +IntToStr(k)+ ']', arExtendedEdits[k][j][i].Text, srlpf_SavePath);
end;
end;
end;

{*******************************************************************************
procedure arPinEditsPress(Sender : TEdit; var Key : Char);
By: Cazax
Description: Detects if user press non numerical keys to remove them
from the Pin Edit
*******************************************************************************}
{procedure arPinEditsPress(Sender: TObject; var Key: Char);
begin
If Key = '' Then
Exit;
Case Key Of
#48..#57: If Length(arPinEdits[EditK][EditI].Text) = 4 Then Key := #0;
Else
Key := #0;
End;
end;}

{*******************************************************************************
procedure LoadPlayers(SetPlayers: Boolean);
By: Starblaster100
Description: Loads the players from a file
*******************************************************************************}

procedure LoadPlayers(SetPlayers: Boolean);
var
ArmyIndex, i, j, k: Integer;
Begin
HowManyArmies := StrToIntDef(ReadINI('General', 'HowManyArmies', srlpf_SavePath), 1);
ArmyIndex := StrToIntDef(ReadINI('General', 'ActiveArmy', srlpf_SavePath), 0);
ActiveArmy := ArmyIndex;
SetLength(ArmyPages, HowManyArmies);
SetLength(ArmyNames, HowManyArmies);
for i := 0 to HowManyArmies - 1 do
ArmyNames[i] := ReadINI('ArmyPages', 'Name[' +IntToStr(i)+ ']', srlpf_SavePath);

if(SetPlayers)then
begin
HowManyPlayers := StrToIntDef(ReadINI('ArmyPages', 'Number[' +IntToStr(ArmyIndex)+ ']', srlpf_SavePath), 1);
NumberOfPlayers(HowManyPlayers);

for i := 0 to HowManyPlayers - 1 do
begin
Players[i].Name := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Username', srlpf_SavePath);
Players[i].Pass := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Password', srlpf_SavePath);
Players[i].Nick := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Nickname', srlpf_SavePath);
Players[i].Active := StrToBoolDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Active', srlpf_SavePath), True);
Players[i].Pin := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Pin', srlpf_SavePath);
Players[i].BoxRewards := srl_Explode(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'BoxRewards', srlpf_SavePath), ',');

for j := 0 to Length(srlpf_Booleans) - 1 do
Players[i].Booleans[j] := StrToBoolDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Booleans[' +IntToStr(j)+ ']', srlpf_SavePath), True);

for j := 0 to Length(srlpf_Integers) - 1 do
Players[i].Integers[j] := StrToIntDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Integers[' +IntToStr(j)+ ']', srlpf_SavePath), 0);

for j := 0 to Length(srlpf_Strings) - 1 do
Players[i].Strings[j] := ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Strings[' +IntToStr(j)+ ']', srlpf_SavePath);

for j := 0 to Length(srlpf_Extendeds) - 1 do
Players[i].Extendeds[j] := StrToFloatDef(ReadINI(IntToStr(ArmyIndex) +',' +IntToStr(i), 'Extendeds[' +IntToStr(j)+ ']', srlpf_SavePath), 0.0);
end;
end else
begin
SetLength(PlayerPages, HowManyArmies);
for i := 0 to HowManyArmies - 1 do
begin
HowManyPlayers := StrToIntDef(ReadINI('ArmyPages', 'Number[' +IntToStr(i)+ ']', srlpf_SavePath), 1);
SetLength(PlayerPages[i], HowManyPlayers);
end;
SetSRLPlayerFormArrays;

for k := 0 to HowManyArmies - 1 do
begin
HowManyPlayers := StrToIntDef(ReadINI('ArmyPages', 'Number[' +IntToStr(k)+ ']', srlpf_SavePath), 1);
for i := 0 to HowManyPlayers - 1 do
begin
arUserNameEdits[k][i] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[k][i] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[k][i].PasswordChar := '*';
arNickEdits[k][i] := TEdit.Create(srl_PlayerForm);
arActiveComboBoxes[k][i] := TComboBox.Create(srl_PlayerForm);
arPinEdits[k][i] := TEdit.Create(srl_PlayerForm);
arBoxRewardsEdits[k][i] := TEdit.Create(srl_PlayerForm);

arUserNameEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Username', srlpf_SavePath);
arPassWordEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Password', srlpf_SavePath);
arNickEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Nickname', srlpf_SavePath);
arActiveComboBoxes[k][i].Text := BoolToStr(StrToBoolDef(ReadINI(IntToStr(k) +',' +IntToStr(i), 'Active', srlpf_SavePath), True));
arPinEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Pin', srlpf_SavePath);
arBoxRewardsEdits[k][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'BoxRewards', srlpf_SavePath);

for j := 0 to Length(srlpf_Booleans) - 1 do
begin
arBooleanComboBoxes[k][j][i] := TComboBox.Create(srl_PlayerForm);
arBooleanComboBoxes[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Booleans[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

for j := 0 to Length(srlpf_Integers) - 1 do
begin
arIntegerEdits[k][j][i] := TEdit.Create(srl_PlayerForm);
arIntegerEdits[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Integers[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

for j := 0 to Length(srlpf_Strings) - 1 do
begin
arStringEdits[k][j][i] := TEdit.Create(srl_PlayerForm);
arStringEdits[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Strings[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

for j := 0 to Length(srlpf_Extendeds) - 1 do
begin
arExtendedEdits[k][j][i] := TEdit.Create(srl_PlayerForm);
arExtendedEdits[k][j][i].Text := ReadINI(IntToStr(k) +',' +IntToStr(i), 'Extendeds[' +IntToStr(j)+ ']', srlpf_SavePath);
end;

end;
end;
end;
end;

{*******************************************************************************
procedure SwitchInTabArray(NewPlace, OldPlace: Integer; var V: array of TTabSheet);
By: Sumilion
Description: Switches values in a TTabSheet array
*******************************************************************************}

procedure SwitchInTabArray(NewPlace, OldPlace: Integer; var V: array of TTabSheet);
var
k: Integer;
TempVarArray, TempAffectedArray: array of TTabSheet;
begin
SetLength(TempVarArray, Length(V));
SetLength(TempAffectedArray, 1 + (iAbs(OldPlace - NewPlace)));
for k := 0 to Length(V) - 1 do
TempVarArray[k] := V[k];
TempVarArray[NewPlace] := V[OldPlace];
if(OldPlace > NewPlace)then
begin
for k := NewPlace to OldPlace - 1 do
TempAffectedArray[k - NewPlace] := V[k];
for k := NewPlace + 1 to OldPlace do
TempVarArray[k] := TempAffectedArray[k - (NewPlace + 1)];
end else
begin
for k := OldPlace + 1 to NewPlace do
TempAffectedArray[k - (OldPlace + 1)] := V[k];
for k := OldPlace to NewPlace - 1 do
TempVarArray[k] := TempAffectedArray[k - OldPlace];
end;

V := TempVarArray;
end;

{*******************************************************************************
procedure SwitchInEditArray(NewPlace, OldPlace: Integer; var V: array of TEdit);
By: Sumilion
Description: Switches values in a TEdit array
*******************************************************************************}

procedure SwitchInEditArray(NewPlace, OldPlace: Integer; var V: array of TEdit);
var
k: Integer;
TempVarArray, TempAffectedArray: array of TEdit;
begin
SetLength(TempVarArray, Length(V));
SetLength(TempAffectedArray, 1 + (iAbs(OldPlace - NewPlace)));
for k := 0 to Length(V) - 1 do
TempVarArray[k] := V[k];
TempVarArray[NewPlace] := V[OldPlace];
if(OldPlace > NewPlace)then
begin
for k := NewPlace to OldPlace - 1 do
TempAffectedArray[k - NewPlace] := V[k];
for k := NewPlace + 1 to OldPlace do
TempVarArray[k] := TempAffectedArray[k - (NewPlace + 1)];
end else
begin
for k := OldPlace + 1 to NewPlace do
TempAffectedArray[k - (OldPlace + 1)] := V[k];
for k := OldPlace to NewPlace - 1 do
TempVarArray[k] := TempAffectedArray[k - OldPlace];
end;

V := TempVarArray;
end;

{*******************************************************************************
procedure SwitchInComboArray(NewPlace, OldPlace: Integer; var V: array of TComboBox);
By: Sumilion
Description: Switches values in a TComboBox array
*******************************************************************************}

procedure SwitchInComboArray(NewPlace, OldPlace: Integer; var V: array of TComboBox);
var
k: Integer;
TempVarArray, TempAffectedArray: array of TComboBox;
begin
SetLength(TempVarArray, Length(V));
SetLength(TempAffectedArray, 1 + (iAbs(OldPlace - NewPlace)));
for k := 0 to Length(V) - 1 do
TempVarArray[k] := V[k];
TempVarArray[NewPlace] := V[OldPlace];
if(OldPlace > NewPlace)then
begin
for k := NewPlace to OldPlace - 1 do
TempAffectedArray[k - NewPlace] := V[k];
for k := NewPlace + 1 to OldPlace do
TempVarArray[k] := TempAffectedArray[k - (NewPlace + 1)];
end else
begin
for k := OldPlace + 1 to NewPlace do
TempAffectedArray[k - (OldPlace + 1)] := V[k];
for k := OldPlace to NewPlace - 1 do
TempVarArray[k] := TempAffectedArray[k - OldPlace];
end;

V := TempVarArray;
end;

{*******************************************************************************
procedure OnSRLPFMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
By: Sumilion
Description: Form action on Mouse click
*******************************************************************************}

procedure OnSRLPFMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
i, ArmyIndex: Integer;
MousePosPoint: TPoint;
RightClick: Boolean;
begin
RightClick := Button;
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;
case Sender of
srlpf_PlayerPageControl[ArmyIndex]:
begin
if(RightClick)then
begin
srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex := srlpf_PlayerPageControl[ArmyIndex].IndexOfTabAt(x, y);
MousePosPoint := srlpf_PlayerPageControl[ArmyIndex].ClientToScreen(IntToPoint(x, y));
srlpf_PlayerPopUpMenu.Popup(MousePosPoint.x, MousePosPoint.y);
end;
if(ssCtrl in Shift)and(not RightClick)then
begin
srlpf_PlayerPageControl[ArmyIndex].BeginDrag(False);
srlpf_PreviousTabIndex := srlpf_PlayerPageControl[ArmyIndex].ActivePage.PageIndex;
end;
end;
srlpf_ArmyPageControl:
begin
if(RightClick)then
begin
srlpf_ArmyPageControl.ActivePageIndex := srlpf_ArmyPageControl.IndexOfTabAt(x, y);
MousePosPoint := srlpf_ArmyPageControl.ClientToScreen(IntToPoint(x, y));
srlpf_ArmyPopUpMenu.Popup(MousePosPoint.x, MousePosPoint.y);
end;
end;
end;
for i := 0 to Length(PlayerPages[ArmyIndex]) - 1 do
begin
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;
end;

{*******************************************************************************
procedure OnSRLPFDragDrop(Sender, Source: TObject; X, Y: Integer);
By: Sumilion
Description: Form action on drag drop
*******************************************************************************}

procedure OnSRLPFDragDrop(Sender, Source: TObject; X, Y: Integer);
var
i, ArmyIndex, PlayerIndex : Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePage.PageIndex;

srlpf_PlayerPageControl[ArmyIndex].ActivePage.PageIndex := srlpf_PlayerPageControl[ArmyIndex].IndexOfTabAt(X, Y);

PlayerIndex := srlpf_PlayerPageControl[ArmyIndex].ActivePage.PageIndex;

SwitchInTabArray(PlayerIndex, srlpf_PreviousTabIndex, PlayerPages[ArmyIndex]);

SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arUserNameEdits[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arPasswordEdits[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arNickEdits[ArmyIndex]);
SwitchInComboArray(PlayerIndex, srlpf_PreviousTabIndex, arActiveComboBoxes[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arPinEdits[ArmyIndex]);
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arBoxRewardsEdits[ArmyIndex]);

for i := 0 to Length(srlpf_Booleans) - 1 do
SwitchInComboArray(PlayerIndex, srlpf_PreviousTabIndex, arBooleanComboBoxes[ArmyIndex][i]);

for i := 0 to Length(srlpf_Integers) - 1 do
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arIntegerEdits[ArmyIndex][i]);

for i := 0 to Length(srlpf_Strings) - 1 do
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arStringEdits[ArmyIndex][i]);

for i := 0 to Length(srlpf_Extendeds) - 1 do
SwitchInEditArray(PlayerIndex, srlpf_PreviousTabIndex, arExtendedEdits[ArmyIndex][i]);

for i := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;

{*******************************************************************************
procedure OnSRLPFDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
By: Sumilion
Description: Form action on drag over
*******************************************************************************}

procedure OnSRLPFDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := (Sender is TPageControl);
end;

{*******************************************************************************
procedure DeleteInEditArray(SpotToDelete: Integer; var V: array of TEdit);
By: Sumilion
Description: Deletes a value in a TEdit array
*******************************************************************************}

procedure DeleteInEditArray(SpotToDelete: Integer; var V: array of TEdit);
var
k, l: Integer;
TempVarArray: array of TEdit;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInEditArrayOfArray(SpotToDelete: Integer; var V: array of array of TEdit);
By: Sumilion
Description: Deletes a value in a TEdit array
*******************************************************************************}

procedure DeleteInEditArrayOfArray(SpotToDelete: Integer; var V: array of array of TEdit);
var
k, l: Integer;
TempVarArray: array of array of TEdit;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInEditArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TEdit);
By: Sumilion
Description: Deletes a value in a TEdit array
*******************************************************************************}

procedure DeleteInEditArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TEdit);
var
k, l: Integer;
TempVarArray: array of array of array of TEdit;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInComboArray(SpotToDelete: Integer; var V: array of TComboBox);
By: Sumilion
Description: Deletes a value in a TComboBox array
*******************************************************************************}

procedure DeleteInComboArray(SpotToDelete: Integer; var V: array of TComboBox);
var
k, l: Integer;
TempVarArray: array of TComboBox;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInComboArrayOfArray(SpotToDelete: Integer; var V: array of array of TComboBox);
By: Sumilion
Description: Deletes a value in a TComboBox array
*******************************************************************************}

procedure DeleteInComboArrayOfArray(SpotToDelete: Integer; var V: array of array of TComboBox);
var
k, l: Integer;
TempVarArray: array of array of TComboBox;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInComboArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TComboBox);
By: Sumilion
Description: Deletes a value in a TComboBox array
*******************************************************************************}

procedure DeleteInComboArrayOfArrayOfArray(SpotToDelete: Integer; var V: array of array of array of TComboBox);
var
k, l: Integer;
TempVarArray: array of array of array of TComboBox;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInTabArray(SpotToDelete: Integer; var V: array of TTabSheet);
By: Sumilion
Description: Deletes a value in a TTabSheet array
*******************************************************************************}

procedure DeleteInTabArray(SpotToDelete: Integer; var V: array of TTabSheet);
var
k, l: Integer;
TempVarArray: array of TTabSheet;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInTabArrayOfArray(SpotToDelete: Integer; var V: array of array of TTabSheet);
By: Sumilion
Description: Deletes a value in a TTabSheet array
*******************************************************************************}

procedure DeleteInTabArrayOfArray(SpotToDelete: Integer; var V: array of array of TTabSheet);
var
k, l: Integer;
TempVarArray: array of array of TTabSheet;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure DeleteInPageControlArray(SpotToDelete: Integer; var V: array of TPageControl);
By: Sumilion
Description: Deletes a value in a TTabSheet array
*******************************************************************************}

procedure DeleteInPageControlArray(SpotToDelete: Integer; var V: array of TPageControl);
var
k, l: Integer;
TempVarArray: array of TPageControl;
begin
SetLength(TempVarArray, Length(V) - 1);
for k := 0 to Length(V) - 1 do
begin
if not(k = SpotToDelete)then
begin
TempVarArray[l] := V[k];
l := l + 1;
end;
end;
V := TempVarArray;
end;

{*******************************************************************************
procedure SetLabelsParent(Parent: Integer);
By: Sumilion
Description: Sets all labels to the desired parent
*******************************************************************************}

procedure SetLabelsParent(Army, Tab: Integer);
var
i: Integer;
begin
labels[0].Parent := PlayerPages[Army][Tab];
labels[1].Parent := PlayerPages[Army][Tab];
labels[2].Parent := PlayerPages[Army][Tab];
labels[3].Parent := PlayerPages[Army][Tab];
labels[4].Parent := PlayerPages[Army][Tab];
labels[5].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Booleans) - 1 do
arBooleanLabels[i].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Integers) - 1 do
arIntegerLabels[i].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Strings) - 1 do
arStringLabels[i].Parent := PlayerPages[Army][Tab];

for i := 0 to Length(srlpf_Extendeds) - 1 do
arExtendedLabels[i].Parent := PlayerPages[Army][Tab];
end;

{*******************************************************************************
procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer);
By: Sumilion
Description: Deletes a player in a desired tab and goes to the next desired tab.
*******************************************************************************}

procedure DeletePlayerInTab(ArmyNumber, PlayerNumber, NextPlayerTab: Integer);
var
i, d, ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;

if(srlpf_PlayerPageControl[ArmyIndex].PageCount = 1)then
Exit;

if(NextPlayerTab < 0)then
NextPlayerTab := 0;
for i := PlayerNumber + 1 to Length(PlayerPages[ArmyNumber]) - 1 do
begin
arUserNameEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arPasswordEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arNickEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arActiveComboBoxes[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arPinEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];
arBoxRewardsEdits[ArmyNumber][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Booleans) - 1 do
arBooleanComboBoxes[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Integers) - 1 do
arIntegerEdits[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Strings) - 1 do
arStringEdits[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

for d := 0 to Length(srlpf_Extendeds) - 1 do
arExtendedEdits[ArmyNumber][d][i].Parent := PlayerPages[ArmyNumber][i - 1];

end;

PlayerPages[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1].Free;

SetLength(PlayerPages[ArmyNumber], srlpf_PlayerPageControl[ArmyNumber].PageCount);

DeleteInEditArray(PlayerNumber, arUserNameEdits[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arPasswordEdits[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arNickEdits[ArmyNumber]);
DeleteInComboArray(PlayerNumber, arActiveComboBoxes[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arPinEdits[ArmyNumber]);
DeleteInEditArray(PlayerNumber, arBoxRewardsEdits[ArmyNumber]);
for d := 0 to Length(srlpf_Booleans) - 1 do
DeleteInComboArray(PlayerNumber, arBooleanComboBoxes[ArmyNumber][d]);

for d := 0 to Length(srlpf_Integers) - 1 do
DeleteInEditArray(PlayerNumber, arIntegerEdits[ArmyNumber][d]);

for d := 0 to Length(srlpf_Strings) - 1 do
DeleteInEditArray(PlayerNumber, arStringEdits[ArmyNumber][d]);

for d := 0 to Length(srlpf_Extendeds) - 1 do
DeleteInEditArray(PlayerNumber, arExtendedEdits[ArmyNumber][d]);

srlpf_ArmyPageControl.ActivePageIndex := ArmyIndex;
srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex := NextPlayerTab;
if(srlpf_PlayerPageControl[ArmyIndex].PageCount = 1)then
srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex := 0;
end;

{*******************************************************************************
procedure ClearPlayerInTab(ArmyNumber, PlayerNumber: Integer);
By: Sumilion
Description: Clears player settings in tab
*******************************************************************************}

procedure ClearPlayerInTab(ArmyNumber, PlayerNumber: Integer);
var
i: Integer;
begin
arUserNameEdits[ArmyNumber][PlayerNumber].Text := '';
arPasswordEdits[ArmyNumber][PlayerNumber].Text := '';
arNickEdits[ArmyNumber][PlayerNumber].Text := '';
arActiveComboBoxes[ArmyNumber][PlayerNumber].Text := 'True';
arPinEdits[ArmyNumber][PlayerNumber].Text := '';
arBoxRewardsEdits[ArmyNumber][PlayerNumber].Text := '';

for i := 0 to Length(arBooleanComboBoxes[ArmyNumber]) - 1 do
arBooleanComboBoxes[ArmyNumber][i][PlayerNumber].Text := 'False';

for i := 0 to Length(arIntegerEdits[ArmyNumber]) - 1 do
arIntegerEdits[ArmyNumber][i][PlayerNumber].Text := '';

for i := 0 to Length(arStringEdits[ArmyNumber]) - 1 do
arStringEdits[ArmyNumber][i][PlayerNumber].Text := '';

for i := 0 to Length(arExtendedEdits[ArmyNumber]) - 1 do
arExtendedEdits[ArmyNumber][i][PlayerNumber].Text := '';

PlayerPages[ArmyNumber][PlayerNumber].Caption := 'Player ' + IntToStr(PlayerNumber);
end;

{*******************************************************************************
procedure AddPlayerInTab(ArmyNumber: Integer);
By: Sumilion
Description: Deletes a player in a desired tab and goes to the next desired tab.
*******************************************************************************}

procedure AddPlayerInTab(ArmyNumber: Integer);
var
i: Integer;
begin
SetLength(PlayerPages[ArmyNumber], Length(PlayerPages[ArmyNumber]) + 1);
SetSRLPlayerFormArrays;

arUserNameEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arNickEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arActiveComboBoxes[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TComboBox.Create(srl_PlayerForm);
arActiveComboBoxes[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1].Text := 'True';
arPinEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);
arBoxRewardsEdits[ArmyNumber][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arBooleanComboBoxes[ArmyNumber]) - 1 do
arBooleanComboBoxes[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TComboBox.Create(srl_PlayerForm);

for i := 0 to Length(arIntegerEdits[ArmyNumber]) - 1 do
arIntegerEdits[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arStringEdits[ArmyNumber]) - 1 do
arStringEdits[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arExtendedEdits[ArmyNumber]) - 1 do
arExtendedEdits[ArmyNumber][i][Length(PlayerPages[ArmyNumber]) - 1] := TEdit.Create(srl_PlayerForm);

FillSRLPlayerFormTab(ArmyNumber, Length(PlayerPages[ArmyNumber]) - 1);
if(ArmyNumber = srlpf_ArmyPageControl.ActivePageIndex)then
srlpf_PlayerPageControl[ArmyNumber].ActivePageIndex := Length(PlayerPages[ArmyNumber]) - 1;
end;

{*******************************************************************************
procedure AddArmy;
By: Sumilion
Description: Adds an army to the form
*******************************************************************************}

procedure AddArmy;
var
i: Integer;
begin
SetLength(ArmyPages, Length(ArmyPages) + 1);
SetLength(srlpf_PlayerPageControl, Length(ArmyPages));

ArmyPages[Length(ArmyPages) - 1] := TTabSheet.Create(srl_PlayerForm);
ArmyPages[Length(ArmyPages) - 1].Caption := 'Army ' + IntToStr(Length(ArmyPages) - 1);
ArmyPages[Length(ArmyPages) - 1].PageControl := srlpf_ArmyPageControl;
ArmyPages[Length(ArmyPages) - 1].OnShow := @OnSRLPFShow;

srlpf_PlayerPageControl[Length(ArmyPages) - 1] := TPageControl.Create(srl_PlayerForm);
with srlpf_PlayerPageControl[Length(ArmyPages) - 1] do
begin
Parent := ArmyPages[Length(ArmyPages) - 1];
Width := ArmyPages[Length(ArmyPages) - 1].Width;
Height := ArmyPages[Length(ArmyPages) - 1].Height;
Align := alBottom;
OnMouseDown := @OnSRLPFMouseDown;
OnDragDrop := @OnSRLPFDragDrop;
OnDragOver := @OnSRLPFDragOver;
end;

SetLength(PlayerPages, Length(ArmyPages));
SetLength(PlayerPages[Length(ArmyPages) - 1], 1);
SetSRLPlayerFormArrays;

arUserNameEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arPasswordEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arNickEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arActiveComboBoxes[Length(ArmyPages) - 1][0] := TComboBox.Create(srl_PlayerForm);
arActiveComboBoxes[Length(ArmyPages) - 1][0].Text := 'True';
arPinEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);
arBoxRewardsEdits[Length(ArmyPages) - 1][0] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arBooleanComboBoxes[Length(ArmyPages) - 1]) - 1 do
arBooleanComboBoxes[Length(ArmyPages) - 1][i][0] := TComboBox.Create(srl_PlayerForm);

for i := 0 to Length(arIntegerEdits[Length(ArmyPages) - 1]) - 1 do
arIntegerEdits[Length(ArmyPages) - 1][i][0] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arStringEdits[Length(ArmyPages) - 1]) - 1 do
arStringEdits[Length(ArmyPages) - 1][i][0] := TEdit.Create(srl_PlayerForm);

for i := 0 to Length(arExtendedEdits[Length(ArmyPages) - 1]) - 1 do
arExtendedEdits[Length(ArmyPages) - 1][i][0] := TEdit.Create(srl_PlayerForm);

FillSRLPlayerFormTab(Length(ArmyPages) - 1, 0);

srlpf_ArmyPageControl.ActivePageIndex := Length(ArmyPages) - 1;
end;

{*******************************************************************************
procedure DeleteArmy(ArmyNumber, NextArmyTab: Integer);
By: Sumilion
Description: Deletes an army in the form
*******************************************************************************}

procedure DeleteArmy(ArmyNumber, NextArmyTab: Integer);
var
i, j: Integer;
begin
if(NextArmyTab < 0)then
NextArmyTab := 0;
if(srlpf_ArmyPageControl.PageCount = 1)then
Exit;
if Armynumber > 0 then
srlpf_ArmyPageControl.ActivePageIndex := NextArmyTab
else
srlpf_ArmyPageControl.ActivePageIndex := 0;
if((srlpf_ArmyPageControl.PageCount - 1) > ArmyNumber)then
j := ArmyNumber + 1
else
j := ArmyNumber - 1;

for i := ArmyNumber + 1 to Length(ArmyPages) - 1 do
begin
srlpf_PlayerPageControl[i].Parent := ArmyPages[i - 1];
ArmyPages[i - 1].Caption := ArmyPages[i].Caption;
end;

srlpf_PlayerPageControl[ArmyNumber].Free;
ArmyPages[Length(ArmyPages) - 1].Free;
SetLength(ArmyPages, Length(ArmyPages) - 1);

DeleteInEditArrayOfArray(ArmyNumber, arUserNameEdits);
DeleteInEditArrayOfArray(ArmyNumber, arPasswordEdits);
DeleteInEditArrayOfArray(ArmyNumber, arNickEdits);
DeleteInComboArrayOfArray(ArmyNumber, arActiveComboBoxes);
DeleteInEditArrayOfArray(ArmyNumber, arPinEdits);
DeleteInEditArrayOfArray(ArmyNumber, arBoxRewardsEdits);
DeleteInComboArrayOfArrayOfArray(ArmyNumber, arBooleanComboBoxes);
DeleteInEditArrayOfArrayOfArray(ArmyNumber, arIntegerEdits);
DeleteInEditArrayOfArrayOfArray(ArmyNumber, arStringEdits);
DeleteInEditArrayOfArrayOfArray(ArmyNumber, arExtendedEdits);
DeleteInTabArrayOfArray(ArmyNumber, PlayerPages);
DeleteInPageControlArray(ArmyNumber, srlpf_PlayerPageControl);

srlpf_ArmyPageControl.ActivePageIndex := NextArmyTab;
//srlpf_PlayerPageControl[NextArmyTab].ActivePageIndex := 0;

for i := 0 to Length(ArmyPages) - 1 do
begin
if(Pos('Army', ArmyPages[i].Caption) = 1)then
ArmyPages[i].Caption := 'Army ' + IntToStr(i);
end;
end;

{*******************************************************************************
procedure RenameArmy(ArmyNumber: Integer);
By: Sumilion
Description: Renames an army's name
*******************************************************************************}

procedure RenameArmy(ArmyNumber: Integer);
var
ArmyName: string;
begin
ArmyName := Readln('New army name for : ' + ArmyPages[ArmyNumber].Caption +
Chr(13) + '(Leave blank for default)');
if(ArmyName = '')then
ArmyPages[ArmyNumber].Caption := 'Army ' + IntToStr(ArmyNumber)
else
ArmyPages[ArmyNumber].Caption := ArmyName;
end;

{*******************************************************************************
procedure ExportPlayerData;
By: Starblaster100 / Sumilion
Description: Turns the info input into the forms into a copy and pasteable
DeclarePlayers procedure
*******************************************************************************}

procedure ExportPlayerData;
var
i, j, ArmyIndex: Integer;
TempString: string;
OpenDialog1 : TSaveDialog;
a: TStringList;
begin
OpenDialog1 := TSaveDialog.Create(srl_PlayerForm);
a := TStringList.Create;

with OpenDialog1 do
begin
InitialDir := ScriptPath;
Filter := 'SCAR Scripts (*.scar)|*.scar|';
if(Execute)then
begin
if(ExtractFileExt(FileName) = '')then
TempString := FileName + '.scar'
else
TempString := FileName;
end else
begin
a.Free;
Free;
Exit;
end;
Free;
end;

ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;

a.Text := a.Text + 'procedure DeclarePlayers;' + Chr(13);
a.Text := a.Text + 'begin' + Chr(13);
a.Text := a.Text + ' NumberOfPlayers(' +IntToStr(Length(PlayerPages[ArmyIndex]))+ ');' + Chr(13);
a.Text := a.Text + ' HowManyBooleans := ' +IntToStr(Length(srlpf_Booleans))+ ';' + Chr(13);

for i := 0 to Length(PlayerPages[ArmyIndex])-1 do
begin
a.Text := a.Text + Chr(13);
if(arUserNameEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Name := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Name := ''' + arUserNameEdits[ArmyIndex][i].Text + ''';' + Chr(13);

if(arPasswordEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pass := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pass := ''' + arPasswordEdits[ArmyIndex][i].Text + ''';' + Chr(13);

if(arNickEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Nick := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Nick := ''' + arNickEdits[ArmyIndex][i].Text + ''';' + Chr(13);

a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Active := ' + arActiveComboBoxes[ArmyIndex][i].Text + ';' + Chr(13);

if(arPinEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pin := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].Pin := ''' + arPinEdits[ArmyIndex][i].Text + ''';' + Chr(13);

if(arBoxRewardsEdits[ArmyIndex][i].Text = '')then
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].BoxRewards := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' +IntToStr(i)+ '].BoxRewards := ''' + arBoxRewardsEdits[ArmyIndex][i].Text + ''';' + Chr(13);

for j := 0 to Length(srlpf_Booleans) - 1 do
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Booleans[' + IntToStr(j) + '] := ' + arBooleanComboBoxes[ArmyIndex][j][i].Text + ';' + Chr(13);

for j := 0 to Length(srlpf_Integers) - 1 do
if(arIntegerEdits[ArmyIndex][j][i].Text = '')then
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Integers[' + IntToStr(j) + '] := 0;' + Chr(13)
else
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Integers[' + IntToStr(j) + '] := ' + arIntegerEdits[ArmyIndex][j][i].Text + ';' + Chr(13);

for j := 0 to Length(srlpf_Strings) - 1 do
if(arStringEdits[ArmyIndex][j][i].Text = '')then
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Strings[' + IntToStr(j) + '] := '''';' + Chr(13)
else
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Strings[' + IntToStr(j) + '] := ''' + arStringEdits[ArmyIndex][j][i].Text + ''';' + Chr(13);

for j := 0 to Length(srlpf_Extendeds) - 1 do
if(arExtendedEdits[ArmyIndex][j][i].Text = '')then
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Extendeds[' + IntToStr(j) + '] := 0.0;' + Chr(13)
else
a.Text := a.Text + ' Players[' + IntToStr(i) + '].Extendeds[' + IntToStr(j) + '] := ' + arExtendedEdits[ArmyIndex][j][i].Text + ';' + Chr(13);
end;
a.Text := a.Text + 'end;' + Chr(13);
try
SaveToFile(a, TempString);
except
a.Free;
GetApplication.MessageBox('File not found!', '', 0);
Exit;
end;
end;

{*******************************************************************************
procedure ImportPlayerData;
By: Starblaster100 / Sumilion
Description: Inputs information from the DeclarePlayers procedure into the form
*******************************************************************************}

procedure ImportPlayerData;
var
i, j, ArmyIndex: Integer;
DeclarePlayers, TempString: string;
OpenDialog1 : TOpenDialog;
a: TStringList;
begin
OpenDialog1 := TOpenDialog.Create(srl_PlayerForm);
a := TStringList.Create;
with OpenDialog1 do
begin
InitialDir := ScriptPath;
Options := [ofFileMustExist, ofReadOnly];
Filter := 'SCAR Scripts (*.scar)|*.scar|' +
'Text Files (*.txt)|*.txt|' +
'All Files|*|';
if(Execute)then
TempString := FileName
else
begin
a.Free;
Free;
Exit;
end;
Free;
end;
try
LoadFromFile(a, TempString);
except
a.Free;
GetApplication.MessageBox('File not found!', '', 0);
Exit;
end;
DeclarePlayers := LowerCase(a.Text);
AddArmy;
a.Free;
HowManyPlayers := StrToIntDef(Between('numberofplayers(', ');', DeclarePlayers), 0);
if(HowManyPlayers = 0)then
HowManyPlayers := StrToIntDef(Between('howmanyplayers := ', ';', DeclarePlayers), 1);
ArmyIndex := srlpf_ArmyPageControl.PageCount - 1;
for i := 0 to HowManyPlayers - 2 do
AddPlayerInTab(ArmyIndex);
for i := 0 to HowManyPlayers - 1 do
begin
arUserNameEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].name := ''', ''';', DeclarePlayers);
arPassWordEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].pass := ''', ''';', DeclarePlayers);
arNickEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].nick := ''', ''';', DeclarePlayers);
arActiveComboBoxes[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].active := ', ';', DeclarePlayers);
arPinEdits[ArmyIndex][i].Text := Between('players[' + IntToStr(i) + '].pin := ''', ''';', DeclarePlayers);
arBoxRewardsEdits[ArmyIndex][i].Text := Replace(Between('players[' + IntToStr(i) + '].boxrewards := ''', ''';', DeclarePlayers), ' ', '');
for j := 0 to Length(srlpf_Booleans) - 1 do
arBooleanComboBoxes[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].booleans[' +IntToStr(j)+ '] := ', ';', DeclarePlayers);
for j := 0 to Length(srlpf_Integers) - 1 do
arIntegerEdits[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].integers[' +IntToStr(j)+ '] := ', ';', DeclarePlayers);
for j := 0 to Length(srlpf_Strings) - 1 do
arStringEdits[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].strings[' +IntToStr(j)+ '] := ''', ''';', DeclarePlayers);
for j := 0 to Length(srlpf_Extendeds) - 1 do
arExtendedEdits[ArmyIndex][j][i].Text := Between('players[' + IntToStr(i) + '].extendeds[' +IntToStr(j)+ '] := ', ';', DeclarePlayers);
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;
end;

{*******************************************************************************
procedure OnSRLPFMainMenuClick(Sender: TObject);
By: Sumilion
Description: Form actions on the MainMenu items
*******************************************************************************}

procedure OnSRLPFMainMenuClick(Sender: TObject);
var
i, j, ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePage.PageIndex;
case Sender of
mItem[1][1]: AddPlayerInTab(ArmyIndex);
mItem[1][2]:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Delete';
CheckListForm.Caption := 'Delete Players :';
for i := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(PlayerPages[ArmyIndex][i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
if(srlpf_PlayerPageControl[ArmyIndex].PageCount > 1)then
if(i = ArmyIndex)then
DeletePlayerInTab(ArmyIndex, i, i - 1)
else
DeletePlayerInTab(ArmyIndex, i, ArmyIndex);
end;
FreeForm(CheckListForm);
end;
mItem[1][3]:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Clear';
CheckListForm.Caption := 'Clear Players :';
for i := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(PlayerPages[ArmyIndex][i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
ClearPlayerInTab(ArmyIndex, i);
end;
FreeForm(CheckListForm);
end;
mItem[2][1]: AddArmy;
mItem[2][2]:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Delete';
CheckListForm.Caption := 'Delete Armies :';
for i := 0 to srlpf_ArmyPageControl.PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(ArmyPages[i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
if(srlpf_ArmyPageControl.PageCount > 1)then
DeleteArmy(i, i - 1);
end;
FreeForm(CheckListForm);
end;
mItem[2][3]:
begin
CheckListForm := CreateForm;
SRLPFCheckListBox := TCheckListBox.Create(CheckListForm);
SRLPFCheckListBox.Parent := CheckListForm;
CheckListButton := TButton.Create(CheckListForm);
CheckListButton.Caption := 'Clear';
CheckListForm.Caption := 'Clear Armies :';
for i := 0 to srlpf_ArmyPageControl.PageCount - 1 do
begin
SRLPFCheckListBox.Items.Add(ArmyPages[i].Caption);
end;
ShowCheckListForm;
for i := SRLPFCheckListBox.Items.Count - 1 downto 0 do
begin
if(SRLPFCheckListBox.Checked[i])then
for j := 0 to srlpf_PlayerPageControl[i].PageCount - 1 do
ClearPlayerInTab(i, j);
end;
FreeForm(CheckListForm);
end;
mItem[2][4]: RenameArmy(ArmyIndex);
mItem[3][1]: srl_PlayerForm.ModalResult := mrOk;
mItem[3][2]:
begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;
mItem[3][3]:
begin
srlpf_SaveWhenDone := False;
srl_PlayerForm.ModalResult := mrOk;
end;
mItem[3][4]:
begin
srlpf_SaveWhenDone := False;
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;
mItem[0][2]: ExportPlayerData;
mItem[0][1]: ImportPlayerData;
end;
end;

{*******************************************************************************
procedure OnSRLPFClick(Sender: TObject);
By: Sumilion || edited by Richard and ZephyrsFury
Description: Form action on a click on a button
*******************************************************************************}

procedure OnSRLPFClick(Sender: TObject);
var
c, i, ArmyIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePage.PageIndex;
case Sender of
pcontrol[0]:
begin
srlpf_PlayerPageControl[ArmyIndex].ActivePage := srlpf_PlayerPageControl[ArmyIndex].FindNextPage(srlpf_PlayerPageControl[ArmyIndex].ActivePage,
False, True);
end;
pcontrol[2]:
begin
c := srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex;

DeletePlayerInTab(ArmyIndex, c, c - 1);
end;
pcontrol[1]: AddPlayerInTab(ArmyIndex);
pcontrol[3]: srlpf_PlayerPageControl[ArmyIndex].ActivePage := srlpf_PlayerPageControl[ArmyIndex].FindNextPage(srlpf_PlayerPageControl[ArmyIndex].ActivePage, True, True);
CheckListButton: CheckListForm.ModalResult := mrOk;
control[0]: begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_SaveWhenDone := False;
end;
control[1]: Begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;
control[2]: begin
srl_PlayerForm.ModalResult := mrOk;
srlpf_TerminateWhenDone := True;
end;
control[3]: srl_PlayerForm.ModalResult := mrOk;
end;
for i := c to Length(PlayerPages[ArmyIndex]) - 1 do
if(arUserNameEdits[ArmyIndex][i].Text <> '')then
PlayerPages[ArmyIndex][i].Caption := arUserNameEdits[ArmyIndex][i].Text
else
PlayerPages[ArmyIndex][i].Caption := 'Player ' + IntToStr(i);
end;

{*******************************************************************************
procedure OnSRLPFShow(Sender: TObject);
By: Sumilion
Description: Form action on a Tab show
*******************************************************************************}

procedure OnSRLPFShow(Sender: TObject);
var
i, j: Integer;
begin
for i := 0 to Length(ArmyPages) - 1 do
if(ArmyPages[i] = Sender)then
begin
SetLabelsParent(i, srlpf_PlayerPageControl[i].ActivePageIndex);
Exit;
end;
i := srlpf_ArmyPageControl.ActivePageIndex;
for j := 0 to Length(PlayerPages[i]) - 1 do
if(PlayerPages[i][j] = Sender)then
begin
SetLabelsParent(i, j);
Exit;
end;
end;

{*******************************************************************************
procedure SRLPFMenuClick(Sender: TObject);
By: Sumilion
Description: Form action on Menu click
*******************************************************************************}

procedure SRLPFMenuClick(Sender: TObject);
var
c, ArmyIndex, PlayerIndex: Integer;
begin
ArmyIndex := srlpf_ArmyPageControl.ActivePageIndex;
PlayerIndex := srlpf_PlayerPageControl[ArmyIndex].ActivePageIndex;
case Sender of
apop[0]: AddArmy;

apop[1]:
begin
c := srlpf_ArmyPageControl.ActivePageIndex;
DeleteArmy(c, c - 1);
end;

apop[2]: RenameArmy(srlpf_ArmyPageControl.ActivePageIndex);

apop[3]:
begin
for c := 0 to srlpf_PlayerPageControl[ArmyIndex].PageCount - 1 do
ClearPlayerInTab(ArmyIndex, c);
end;

ppop[0]: AddPlayerInTab(ArmyIndex);

ppop[1]:
begin
DeletePlayerInTab(ArmyIndex, PlayerIndex, PlayerIndex - 1);
for c := PlayerIndex to Length(PlayerPages[ArmyIndex]) - 1 do
if(arUserNameEdits[ArmyIndex][c].Text <> '')then
PlayerPages[ArmyIndex][c].Caption := arUserNameEdits[ArmyIndex][c].Text
else
PlayerPages[ArmyIndex][c].Caption := 'Player ' + IntToStr(c);
end;
ppop[2]: ClearPlayerInTab(ArmyIndex, PlayerIndex);
end;
end;

{*******************************************************************************
procedure SetSRLPlayerFormArrays;
By: Sumilion
Description: Sets the arrays for the form
*******************************************************************************}

procedure SetSRLPlayerFormArrays;
var
i, j: Integer;
begin
SetLength(srlpf_PlayerPageControl, Length(ArmyPages));
SetLength(arUserNameEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arUserNameEdits[i], Length(PlayerPages[i]));
SetLength(arPasswordEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arPasswordEdits[i], Length(PlayerPages[i]));
SetLength(arNickEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arNickEdits[i], Length(PlayerPages[i]));
SetLength(arActiveComboBoxes, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arActiveComboBoxes[i], Length(PlayerPages[i]));
SetLength(arPinEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arPinEdits[i], Length(PlayerPages[i]));
SetLength(arBoxRewardsEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
SetLength(arBoxRewardsEdits[i], Length(PlayerPages[i]));
SetLength(arBooleanLabels, Length(srlpf_Booleans));
SetLength(arBooleanComboBoxes, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arBooleanComboBoxes[i], Length(srlpf_Booleans));
for j := 0 to Length(arBooleanComboBoxes[i]) - 1 do
SetLength(arBooleanComboBoxes[i][j], Length(PlayerPages[i]));
end;
SetLength(arIntegerLabels, Length(srlpf_Integers));
SetLength(arIntegerEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arIntegerEdits[i], Length(srlpf_Integers));
for j := 0 to Length(arIntegerEdits[i]) - 1 do
SetLength(arIntegerEdits[i][j], Length(PlayerPages[i]));
end;
SetLength(arStringLabels, Length(srlpf_Strings));
SetLength(arStringEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arStringEdits[i], Length(srlpf_Strings));
for j := 0 to Length(arStringEdits[i]) - 1 do
SetLength(arStringEdits[i][j], Length(PlayerPages[i]));
end;
SetLength(arExtendedLabels, Length(srlpf_Extendeds));
SetLength(arExtendedEdits, Length(ArmyPages));
for i := 0 to Length(ArmyPages) - 1 do
begin
SetLength(arExtendedEdits[i], Length(srlpf_Extendeds));
for j := 0 to Length(arExtendedEdits[i]) - 1 do
SetLength(arExtendedEdits[i][j], Length(PlayerPages[i]));
end;
end;

{*******************************************************************************
procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer);
By: Sumilion
Description: Fills the tabs with components
*******************************************************************************}

procedure FillSRLPlayerFormTab(ArmyNumber, TabNumber: Integer);
var
a, b: Integer;
begin
b := 0;
PlayerPages[ArmyNumber][TabNumber] := TTabSheet.Create(srl_PlayerForm);
with PlayerPages[ArmyNumber][TabNumber] do
begin
if(arUserNameEdits[ArmyNumber][TabNumber].Text <> '')then
Caption := arUserNameEdits[ArmyNumber][TabNumber].Text
else
Caption := 'Player ' + IntToStr(TabNumber);
PageControl := srlpf_PlayerPageControl[ArmyNumber];
Parent := srlpf_PlayerPageControl[ArmyNumber];
OnMouseDown := @OnSRLPFMouseDown;
OnShow := @OnSRLPFShow;
end;
with arUserNameEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
SetBounds((srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2), 53,121,21);
OnMouseDown := @OnSRLPFMouseDown;
end;
with arPasswordEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
SetBounds((srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2), 83,121,21);
OnMouseDown := @OnSRLPFMouseDown;
end;
with arNickEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
SetBounds((srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2),113,121,21);
OnMouseDown := @OnSRLPFMouseDown;
end;
with arActiveComboBoxes[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
SetBounds((srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2),143,121,21);
OnClick := @OnSRLPFClick;
Items.Add('True');
Items.Add('False');
end;
with arPinEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
SetBounds((srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2),173,121,21);
OnMouseDown := @OnSRLPFMouseDown;
end;
with arBoxRewardsEdits[ArmyNumber][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
SetBounds((srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2),203,121,21);
OnMouseDown := @OnSRLPFMouseDown;
end;
for a := 0 to Length(srlpf_Booleans) - 1 do
begin
b := b + 1;
with arBooleanLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Booleans[a] = '')then
Caption := 'Boolean[' + IntToStr(a) + ']'
else
Caption := srlpf_Booleans[a];
end;
with arBooleanComboBoxes[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
Setbounds((srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2), 203 + (b * 30),121,21);
OnClick := @OnSRLPFClick;
if(Text = '')then
Text := 'False';
Items.Add('True');
Items.Add('False');
end;
end;
for a := 0 to Length(srlpf_Integers) - 1 do
begin
b := b + 1;
with arIntegerLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Integers[a] = '')then
Caption := 'Integer[' + IntToStr(a) + ']'
else
Caption := srlpf_Integers[a];
end;
with arIntegerEdits[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
SetBounds((srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2), 203 + (b * 30), 121,21);
OnMouseDown := @OnSRLPFMouseDown;
end;
end;
for a := 0 to Length(srlpf_Strings) - 1 do
begin
b := b + 1;
with arStringLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Strings[a] = '')then
Caption := 'String[' + IntToStr(a) + ']'
else
Caption := srlpf_Strings[a];
end;
with arStringEdits[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
SetBounds((srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2), 203 + (b * 30), 121,21);
OnMouseDown := @OnSRLPFMouseDown;
end;
end;
for a := 0 to Length(srlpf_Extendeds) - 1 do
begin
b := b + 1;
with arExtendedLabels[a] do
begin
Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
Top := 206 + (b * 30);
if(srlpf_Extendeds[a] = '')then
Caption := 'Extended[' + IntToStr(a) + ']'
else
Caption := srlpf_Extendeds[a];
end;
with arExtendedEdits[ArmyNumber][a][TabNumber] do
begin
Parent := PlayerPages[ArmyNumber][TabNumber];
SetBounds((srl_PlayerForm.Width / 2) - 64 + (srlpf_Width / 2), 203 + (b * 30), 121,21);
OnMouseDown := @OnSRLPFMouseDown;
end;
end;
end;

{*******************************************************************************
procedure LoadSRLPlayerForm;
By: Sumilion || edited by Richard and ZephyrsFury
Description: Loads the main SRL player form
*******************************************************************************}

procedure LoadSRLPlayerForm;
var
i, j, ArmyIndex, e: Integer;
mname: array of TStringArray;
names: TStringArray;
num, num2: Tintegerarray;
begin
srl_PlayerForm := CreateForm;
srl_PlayerForm.Position := poDesktopCenter;
srl_PlayerForm.Width := 243;
srl_PlayerForm.Height := 385 + (Length(srlpf_Booleans) * 30) + (Length(srlpf_Integers) * 30) + (Length(srlpf_Strings) * 30) +(Length(srlpf_Extendeds) * 30);
srl_PlayerForm.Caption := 'SRL Playerform';
srl_PlayerForm.Color := clWhite;
srl_PlayerForm.BorderIcons := [biSystemMenu];
srl_PlayerForm.BorderStyle := bsSingle;

srlpf_MainMenu := TMainMenu.Create(srl_PlayerForm);
SetArrayLength(mname, 4);
mname[0] := ['File', 'Import Players','Export Players'];
mname[1] := ['Player Control','Add Player','Delete Players','Clear Players'];
mname[2] := ['Army Control','Add Army','Delete Armies','Clear Armies','Rename Army'];
mname[3] := ['Exit','Save and Start','Save and Exit','Start','Exit'];
SetArrayLength(mItem, GetArrayLength(mName));
for i := 0 to high(mItem) do
begin
SetArrayLength(mItem[i], GetArrayLength(mName[i]));
for e := 0 to high(mItem[i]) do
begin
mItem[i][e] := TMenuItem.Create(srl_PlayerForm);
mItem[i][e].Caption := mName[i][e];
mItem[i][e].OnClick := @OnSRLPFMainMenuClick;
if e = 0 then
srlpf_MainMenu.Items.add(mItem[i][e])
else
srlpf_MainMenu.Items.Items[i].add(mItem[i][e]);
end;
end;
srlpf_Width := 58;
for i := 0 to Length(srlpf_Booleans) - 1 do
begin
arBooleanLabels[i] := TLabel.Create(srl_PlayerForm);
arBooleanLabels[i].Caption := srlpf_Booleans[i];
srlpf_Width := Max(srlpf_Width, arBooleanLabels[i].Width);
end;
for i := 0 to Length(srlpf_Integers) - 1 do
begin
arIntegerLabels[i] := TLabel.Create(srl_PlayerForm);
arIntegerLabels[i].Caption := srlpf_Integers[i];
srlpf_Width := Max(srlpf_Width, arIntegerLabels[i].Width);
end;
for i := 0 to Length(srlpf_Strings) - 1 do
begin
arStringLabels[i] := TLabel.Create(srl_PlayerForm);
arStringLabels[i].Caption := srlpf_Strings[i];
srlpf_Width := Max(srlpf_Width, arStringLabels[i].Width);
end;
for i := 0 to Length(srlpf_Extendeds) - 1 do
begin
arExtendedLabels[i] := TLabel.Create(srl_PlayerForm);
arExtendedLabels[i].Caption := srlpf_Extendeds[i];
srlpf_Width := Max(srlpf_Width, arExtendedLabels[i].Width);
end;
srl_PlayerForm.Width := srl_PlayerForm.Width + srlpf_Width;

srlpf_ArmyPageControl := TPageControl.Create(srl_PlayerForm);
srlpf_ArmyPageControl.Parent := srl_PlayerForm;
srlpf_ArmyPageControl.SetBounds(0,0,srl_PlayerForm.Width,305 + (Length(srlpf_Booleans) * 30) + (Length(srlpf_Integers) * 30) +(Length(srlpf_Strings) * 30) +(Length(srlpf_Extendeds) * 30));
srlpf_ArmyPageControl.OnMouseDown := @OnSRLPFMouseDown;
for i := 0 to Length(ArmyPages) - 1 do
begin
ArmyPages[i] := TTabSheet.Create(srl_PlayerForm);
if(ArmyNames[i] <> '')then
ArmyPages[i].Caption := ArmyNames[i]
else
ArmyPages[i].Caption := 'Army ' + IntToStr(i);
ArmyPages[i].PageControl := srlpf_ArmyPageControl;
ArmyPages[i].OnShow := @OnSRLPFShow;
end;
srlpf_ArmyPageControl.ActivePageIndex := ActiveArmy;
ArmyIndex := ActiveArmy;

SetSRLPlayerFormArrays;

for i := 0 to Length(srlpf_PlayerPageControl) - 1 do
begin
srlpf_PlayerPageControl[i] := TPageControl.Create(srl_PlayerForm);
srlpf_PlayerPageControl[i].Parent := ArmyPages[i];
srlpf_PlayerPageControl[i].Width := ArmyPages[i].Width;
srlpf_PlayerPageControl[i].Height := ArmyPages[i].Height;
srlpf_PlayerPageControl[i].Align := alBottom;
srlpf_PlayerPageControl[i].OnMouseDown := @OnSRLPFMouseDown;
srlpf_PlayerPageControl[i].OnDragDrop := @OnSRLPFDragDrop;
srlpf_PlayerPageControl[i].OnDragOver := @OnSRLPFDragOver;
end;
for j := 0 to Length(PlayerPages) - 1 do
for i := 0 to Length(PlayerPages[j]) - 1 do
FillSRLPlayerFormTab(j, i);
names := ['Username','Password', 'Nickname','Active','Bank Pin','Box Rewards'];
SetArrayLength(labels, 6)
for i := 0 to high(labels) do
begin
labels[i] := TLabel.Create(srl_PlayerForm);
labels[i].parent := srl_PlayerForm;
labels[i].Left := (srl_PlayerForm.Width / 2) - 75 - (srlpf_Width / 2);
labels[i].Top := 56 + (i * 30);
labels[i].Caption := names[i];
end;
srlpf_ArmyPopUpMenu := TPopupMenu.Create(srlpf_ArmyPageControl);
names := ['Add Army','Delete Army','Rename Army','Clear Army'];
SetArrayLength(aPop, GetArrayLength(names));
for i := 0 to high(aPop) do
begin
apop[i] := TMenuItem.Create(srl_PlayerForm);
apop[i].OnClick := @SRLPFMenuClick;
apop[i].Caption := names[i];
srlpf_ArmyPopUpMenu.Items.Add(apop[i]);
end;
srlpf_PlayerPopUpMenu := TPopupMenu.Create(srl_PlayerForm);
names := ['Add Player','Delete Player','Clear Player'];
SetArrayLength(pPop, GetArrayLength(names));
for i := 0 to high(pPop) do
begin
ppop[i] := TMenuItem.Create(srl_PlayerForm);
ppop[i].OnClick := @SRLPFMenuClick;
ppop[i].Caption := names[i];
srlpf_PlayerPopUpMenu.Items.Add(ppop[i]);
end;
num := [- 109, -80, -5, 70];
num2 := [29,75,75,29];
names := ['<----','Add Player','Delete Player','---->'];
SetArrayLength(pcontrol, GetArrayLength(names));
for i := 0 to high(names) do
begin
pControl[i] := TButton.Create(srl_PlayerForm);
pcontrol[i].Parent := srl_PlayerForm;
pcontrol[i].SetBounds((srl_PlayerForm.Width / 2) + num[i], 60,num2[i],25);
pcontrol[i].Caption := names[i];
pcontrol[i].OnClick := @OnSRLPFClick;
end;
num := [-130, 70, -90, -10];
num2 := [40,40,80,80];
names := ['Start','Exit','Start and Save','Exit and Save'];
SetArrayLength(control, GetArrayLength(names));
for i := 0 to high(names) do
begin
Control[i] := TButton.Create(srl_PlayerForm);
control[i].Parent := srl_PlayerForm;
control[i].SetBounds((srl_PlayerForm.Width / 2) + num[i],310 + (Length(srlpf_Booleans) * 30) +(Length(srlpf_Integers) * 30) +(Length(srlpf_Strings) * 30) +(Length(srlpf_Extendeds) * 30),num2[i],25);
control[i].Caption := names[i];
control[i].OnClick := @OnSRLPFClick;
end;
end;

{*******************************************************************************
procedure ShowSRLPFFormModal;
By: Sumilion
Description: Shows the form
*******************************************************************************}

procedure ShowSRLPFFormModal;
begin
srl_PlayerForm.ShowModal;
end;

{*******************************************************************************
procedure SRLPlayerForm(ShowForm: Boolean; Booleans, Integers, Strings, Extendeds: TStringArray);
By: Sumilion
Description: Main function, sets and loads values needed for player settings and the form.
*******************************************************************************}

procedure SRLPlayerForm(ShowForm: Boolean; Booleans, Integers, Strings, Extendeds: TStringArray);
var
V: TVariantArray;
begin
srlpf_SavePath := AppPath + 'Chars.INI';
srlpf_Booleans := Booleans;
srlpf_Integers := Integers;
srlpf_Strings := Strings;
srlpf_Extendeds := Extendeds;
LoadPlayers(False);
if(ShowForm)then
begin
srlpf_SaveWhenDone := True;
V := [];
ThreadSafeCall('LoadSRLPlayerForm', V);
V := [];
ThreadSafeCall('ShowSRLPFFormModal', V);
if(srlpf_SaveWhenDone)then
SavePlayers;
if(srlpf_TerminateWhenDone)then
TerminateScript;
end;
LoadPlayers(True);
end;

BobboHobbo

2009-04-27 16:08:30

TBH i dont like it, i prefer the old one.

Floor66

2009-04-27 16:17:52

I don't really care about buttons, all I care about is functionality.

Dan Cardin

2009-04-27 22:45:27

From: BobboHobbo
TBH i dont like it, i prefer the old one.

old one?

Smartzkid

2009-04-27 23:07:24

Honestly, I don't like either of them. Now to figure out why…

Sumilion

2009-04-30 19:19:42

Lol, SRLPF, good ol' form still in use ?

Well let me poop out a few lines about SRLPF ..
  1. I wouldn't understand it now either … I made it AGES ago and it's too darn complicated
  2. It can be shorted a LOT, all the DeleteIn*** functions that are in there … had to be made cause at the time you couldn't, in scar, make a function that accepted all sorts of arrays. I believe you can now … but I'm not familiar with the detailed info on how or what
  3. Don't try to edit it … its a brain breaker ;), if you desire edits in it so much, start from the beginning. You will learn an amazingly big amount about forms that way and the end result will be 10x better.
  4. No buttons, they suck. I explicitely did not add those buttons because the main crowd will just want to save and start. The close button, just the windows X thingy or whatever you'd call it is also Save & Start. Everytime I used SRLPF I'd use the X button. But in some RARE case I'd just want to Exit, or only Save, or whatever, there is the Menu list. So for gods sake no buttons ;)
  5. Is it being used much nowadays ? The SRLPF .. ?