Initial commit

- Basic interface setup
- Basic object structure worked out
This commit is contained in:
Mark van Renswoude 2014-06-30 14:37:42 +00:00
parent 71be6b1076
commit 75f07a0680
31 changed files with 3708 additions and 0 deletions

View File

@ -0,0 +1,30 @@
program ChivalryServerLauncher;
uses
Vcl.Forms,
Forms.Main in 'source\view\Forms.Main.pas' {MainForm},
Game.Base in 'source\model\Game.Base.pas',
Game.Chivalry.MedievalWarfare in 'source\model\Game.Chivalry.MedievalWarfare.pas',
Game.Intf in 'source\model\Game.Intf.pas',
Game.Chivalry in 'source\model\Game.Chivalry.pas',
Game.Registry in 'source\model\Game.Registry.pas',
Resources in 'source\Resources.pas',
Game.Map in 'source\model\Game.Map.pas',
Forms.Game in 'source\view\Forms.Game.pas' {GameForm},
Bindings.Converters in 'source\bindings\Bindings.Converters.pas',
Game.List in 'source\model\Game.List.pas',
Persist.GameList in 'source\persist\Persist.GameList.pas';
{$R *.res}
var
MainForm: TMainForm;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

View File

@ -0,0 +1,214 @@
 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{4CC5BE6F-BC4C-47D6-B434-FB070B81999F}</ProjectGuid>
<ProjectVersion>13.4</ProjectVersion>
<FrameworkType>VCL</FrameworkType>
<MainSource>ChivalryServerLauncher.dpr</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Build</Config>
<Platform Condition="'$(Platform)'==''">Win64</Platform>
<TargetedPlatforms>3</TargetedPlatforms>
<AppType>Application</AppType>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Build' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64)'!=''">
<Cfg_1_Win64>true</Cfg_1_Win64>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
<Cfg_1_Win32>true</Cfg_1_Win32>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<VerInfo_Keys>CompanyName=X²Software;FileDescription=Chivalry Server Launcher;FileVersion=0.1.0.0;InternalName=;LegalCopyright=Copyright (c) 2014 X²Software;LegalTrademarks=;OriginalFilename=ChivalryServerLauncher.exe;ProductName=Chivalry Server Launcher;ProductVersion=0.1</VerInfo_Keys>
<VerInfo_MinorVer>1</VerInfo_MinorVer>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1043</VerInfo_Locale>
<VerInfo_MajorVer>0</VerInfo_MajorVer>
<Icon_MainIcon>resources\icons\MainIcon.ico</Icon_MainIcon>
<Manifest_File>None</Manifest_File>
<DCC_UsePackage>fmx;IndySystem;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DataSnapServer;DataSnapProviderClient;DbxCommonDriver;dbxcds;DBXOracleDriver;CustomIPTransport;dsnap;fmxase;IndyCore;CloudService;FmxTeeUI;inetdbxpress;IPIndyImpl;bindcompfmx;rtl;dbrtl;DbxClientDriver;bindcomp;inetdb;xmlrtl;ibxpress;IndyProtocols;DBXMySQLDriver;soaprtl;bindengine;FMXTee;DBXInformixDriver;DBXFirebirdDriver;inet;fmxobj;DBXSybaseASADriver;fmxdae;dbexpress;DataSnapIndy10ServerTransport;$(DCC_UsePackage)</DCC_UsePackage>
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace>
<DCC_DcuOutput>.\lib\$(Platform)\</DCC_DcuOutput>
<DCC_ExeOutput>.\bin\$(Platform)\</DCC_ExeOutput>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<DCC_DcuOutput>.\lib\$(Platform)\</DCC_DcuOutput>
<DCC_ExeOutput>.\bin\$(Platform)\</DCC_ExeOutput>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_UsePackage>JvBDE;JvGlobus;JvMM;JvManagedThreads;TeeDB;JvDlgs;JvCrypt;rbDIDE1516;vclib;inetdbbde;DBXSybaseASEDriver;JvDotNetCtrls;JvNet;vclimg;rbTCUI1516;rbTC1516;fmi;JvXPCtrls;rbRCL1516;rbDAD1516;vcldb;vcldsnap;X2CLGL;rbIBE1516;DBXDb2Driver;dclRBBDE1516;rbDB1516;JvCore;dclRBIBE1516;dclRBADO1516;vcl;DBXMSSQLDriver;CodeSiteExpressPkg;rbRAP1516;JvAppFrm;JvDB;JvRuntimeDesign;webdsnap;X2CLMB;OmniThreadLibraryRuntimeXE2;JclDeveloperTools;rbRIDE1516;adortl;JvDocking;JvWizards;rbADO1516;madBasic_;JvHMI;JvBands;vcldbx;rbDBDE1516;dclRBE1516;JvPluginSystem;rbIDE1516;Tee;rbUSERDesign1516;DBXOdbcDriver;JvCmp;madDisAsm_;JvSystem;svnui;JvControls;JvTimeFramework;TeeUI;vclactnband;bindcompvcl;vclie;Jcl;madExcept_;JvStdCtrls;vcltouch;JvCustom;JvJans;websnap;JvPageComps;JvPrintPreview;rbBDE1516;rbUSER1516;dclRBDBE1516;VclSmp;DataSnapConnectors;dsnapcon;JclVcl;JvPascalInterpreter;vclx;rbCIDE1516;svn;rbDBE1516;bdertl;VirtualTreesR;$(DCC_UsePackage)</DCC_UsePackage>
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_Optimize>false</DCC_Optimize>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<DCC_RemoteDebug>true</DCC_RemoteDebug>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<DCC_RemoteDebug>false</DCC_RemoteDebug>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="source\view\Forms.Main.pas">
<Form>MainForm</Form>
<FormType>dfm</FormType>
</DCCReference>
<DCCReference Include="source\model\Game.Base.pas"/>
<DCCReference Include="source\model\Game.Chivalry.MedievalWarfare.pas"/>
<DCCReference Include="source\model\Game.Intf.pas"/>
<DCCReference Include="source\model\Game.Chivalry.pas"/>
<DCCReference Include="source\model\Game.Registry.pas"/>
<DCCReference Include="source\Resources.pas"/>
<DCCReference Include="source\model\Game.Map.pas"/>
<DCCReference Include="source\view\Forms.Game.pas">
<Form>GameForm</Form>
<FormType>dfm</FormType>
</DCCReference>
<DCCReference Include="source\bindings\Bindings.Converters.pas"/>
<DCCReference Include="source\model\Game.List.pas"/>
<DCCReference Include="source\persist\Persist.GameList.pas"/>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Build">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType/>
<BorlandProject>
<Delphi.Personality>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">1</VersionInfo>
<VersionInfo Name="MinorVer">0</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">1043</VersionInfo>
<VersionInfo Name="CodePage">1252</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName"/>
<VersionInfoKeys Name="FileDescription"/>
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName"/>
<VersionInfoKeys Name="LegalCopyright"/>
<VersionInfoKeys Name="LegalTrademarks"/>
<VersionInfoKeys Name="OriginalFilename"/>
<VersionInfoKeys Name="ProductName"/>
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"/>
</VersionInfoKeys>
<Source>
<Source Name="MainSource">ChivalryServerLauncher.dpr</Source>
</Source>
<Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxCoreRS16.bpl">ExpressCoreLibrary by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxLibraryRS16.bpl">Express Cross Platform Library by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxPageControlRS16.bpl">ExpressPageControl by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxServerModeRS16.bpl">ExpressDataController Server Mode by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxEditorsRS16.bpl">ExpressEditors Library by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxWizardControlRS16.bpl">ExpressWizardControl by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxBarRS16.bpl">ExpressBars by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxSchedulerRS16.bpl">ExpressScheduler by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxGridRS16.bpl">ExpressQuantumGrid by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPSCoreRS16.bpl">ExpressPrinting System by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPSTeeChartRS16.bpl">ExpressPrinting System ReportLink for TeeChart by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxPivotGridRS16.bpl">ExpressPivotGrid by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxOrgCRS16.bpl">ExpressOrgChart by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPSdxLCLnkRS16.bpl">ExpressPrinting System ReportLink for ExpressLayoutControl by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxDBXServerModeRS16.bpl">dbExpress Data Source for ExpressDataController Server Mode by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxADOServerModeRS16.bpl">ADO Data Source for ExpressDataController Server Mode by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxEditorFieldLinkRS16.bpl">ExpressEditors FieldLink by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxBarEditItemRS16.bpl">ExpressBars cxEditor item by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxBarExtDBItemsRS16.bpl">ExpressBars extended DB items by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxBarExtItemsRS16.bpl">ExpressBars extended items by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxBarDBNavRS16.bpl">ExpressBars DBNavigator by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxRibbonRS16.bpl">ExpressBars Ribbon controls by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxTabbedMDIRS16.bpl">ExpressBars Tabbed MDI by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxDockingRS16.bpl">ExpressDocking Library by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxLayoutControlRS16.bpl">ExpressLayout Control by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxTreeListRS16.bpl">ExpressQuantumTreeList by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxmdsRS16.bpl">ExpressMemData by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxSpreadSheetRS16.bpl">ExpressSpreadSheet by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxNavBarRS16.bpl">ExpressNavBar by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPSLnksRS16.bpl">ExpressPrinting System ReportLinks (Standard) by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPSDBTeeChartRS16.bpl">ExpressPrinting System ReportLink for DBTeeChart by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dxPScxPCProdRS16.bpl">ExpressPrinting System ContainerProducer for ExpressPageControl by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxPivotGridOLAPRS16.bpl">ExpressPivotGrid OLAP by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxdbtrRS16.bpl">ExpressDBTree by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxtrmdRS16.bpl">ExpressTreePrintedDataSet by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxDBOrRS16.bpl">ExpressDBOrgChart by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxFlowChartRS16.bpl">ExpressFlowChart by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxIconLibraryRS16.bpl">Express Cross Platform Library Icon Library by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxPageControldxBarPopupMenuRS16.bpl">ExpressPageControl dxBar Popup Menu by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxSchedulerRibbonStyleEventEditorRS16.bpl">ExpressScheduler Ribbon Event Window by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxSchedulerGridRS16.bpl">ExpressScheduler connection to ExpressQuantumGrid by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxSchedulerTreeBrowserRS16.bpl">ExpressScheduler tree browser by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxTreeListdxBarPopupMenuRS16.bpl">ExpressQuantumTreeList dxBar Built-In Menu by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxGridWizardRS16.bpl">ExpressQuantumGrid Wizard by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPScxCommonRS16.bpl">ExpressPrinting System Cross Platform Library by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPScxExtCommonRS16.bpl">ExpressPrinting System Extended Cross Platform Library by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPScxPivotGridLnkRS16.bpl">ExpressPrinting System ReportLink for ExpressPivotGrid by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPScxSchedulerLnkRS16.bpl">ExpressPrinting System ReportLink for ExpressScheduler by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPScxSSLnkRS16.bpl">ExpressPrinting System ReportLink for ExpressSpreadSheet by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPScxTLLnkRS16.bpl">ExpressPrinting System ReportLink for ExpressQuantumTreeList by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPSdxDBOCLnkRS16.bpl">ExpressPrinting System ReportLinks for ExpressDBOrgChart by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPSdxDBTVLnkRS16.bpl">ExpressPrinting System ReportLink for ExpressDBTree by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPSdxFCLnkRS16.bpl">ExpressPrinting System ReportLinks for ExpressFlowChart by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPScxGridLnkRS16.bpl">ExpressPrinting System ReportLink for ExpressQuantumGrid by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPSdxOCLnkRS16.bpl">ExpressPrinting System ReportLinks for ExpressOrgChart by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPSPrVwAdvRS16.bpl">ExpressPrinting System Advanced Preview Window by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dcldxPSPrVwRibbonRS16.bpl">ExpressPrinting System Ribbon Preview Window by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="D:\Program Files\Developer Express.VCL\Library\RS16\dclcxPivotGridChartRS16.bpl">ExpressPivotGrid connection to ExpressQuantumGrid Chart View by Developer Express Inc.</Excluded_Packages>
</Excluded_Packages>
</Delphi.Personality>
<Deployment/>
<Platforms>
<Platform value="Win64">True</Platform>
<Platform value="Win32">True</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/>
</Project>

BIN
ChivalryServerLauncher.res Normal file

Binary file not shown.

View File

@ -0,0 +1,76 @@
[Team Objective]
AOCTO-Battlegrounds_v3_P=Battlegrounds
AOCTO-Darkforest_p=Dark forest
AOCTO-Hillside_P=Hillside
AOCTO-Stoneshill_P=Stoneshill
AOCTO-Citadel_p=Citadel
[Capture the Flag]
AOCCTF-Frigid_p=Frigid
AOCCTF-Moor_p=Moor
AOCCTF-Ruins_Large_P=Ruins Large
AOCCTF-Ruins_P=Ruins
[Duel]
AOCDuel-Arena_Flat_p=Arena Flat
AOCDuel-Arena_p=Arena
AOCDuel-Bridge_p=Bridge
AOCDuel-Cistern_p=Cistern
AOCDuel-Courtyard_p=Courtyard
AOCDuel-Dininghall_p=Dining hall
AOCDuel-FrostPeak_p=Frost Peak
AOCDuel-Mines_p=Mines
AOCDuel-Shaft_p=Shaft
AOCDuel-Shipyard_p=Shipyard
AOCDuel-ThroneRoom_p=Throne Room
AOCDuel-Tower_p=Tower
[King of the Hill]
AOCKOTH-Arena3_p=Arena
AOCKOTH-Hillside_P=Hillside
AOCKOTH-Moor_p=Moor
AOCKOTH-Darkforest_Valley_p=Dark forest Valley
[Last Team Standing]
AOCLTS-Frigid_p=Frigid
AOCLTS-ArgonsWall_p=Argons Wall
AOCLTS-Arena3_p=Arena
AOCLTS-Battlegrounds_Farm_p=Battlegrounds Farm
AOCLTS-Battlegrounds_p=Battlegrounds
AOCLTS-Darkforest_XL_p=Dark forest
AOCLTS-Darkforest_Valley_p=Dark forest Valley
AOCLTS-Hillside_P=Hillside
AOCLTS-HillsidePyre_P=Hillside Pyre
AOCLTS-Moor_p=Moor
AOCLTS-Moor_Large_p=Moor Large
AOCLTS-Ruins_P=Ruins
AOCLTS-Ruins_Large_P=Ruins Large
AOCLTS-StoneshillVillage_P=Stoneshill Village
AOCLTS-ThroneRoom_P=Throne Room
[Free for All]
AOCFFA-Arena3_p=Arena
AOCFFA-Darkforest_Cistern_p=Dark forest Cistern
AOCFFA-Darkforest_Valley_p=Dark forest Valley
AOCFFA-HillsidePyre_P=Hillside Pyre
AOCFFA-Hillside_P=Hillside
AOCFFA-Moor_p=Moor
AOCFFA-Ruins_P=Ruins
AOCFFA-ThroneRoomXL_P=Throne Room XL
AOCFFA-StoneshillVillage_P=Stoneshill Village
[Team Deathmatch]
AOCTD-Frigid_p=Frigid
AOCTD-ArgonsWall_p=Argons Wall
AOCTD-Ruins_P=Ruins
AOCTD-ThroneRoom_P=Throne Room
AOCTD-StoneshillVillage_P=Stoneshill Village
AOCTD-Moor_p=Moor
AOCTD-Battlegrounds_Farm_p=Battlegrounds Farm
AOCTD-Battlegrounds_p=Battlegrounds
AOCTD-Hillside_P=Hillside
AOCTD-HillsidePyre_P=Hillside Pyre
AOCTD-Darkforest_XL_p=Dark forest XL
AOCTD-Darkforest_Valley_p=Dark forest Valley
AOCTD-Moor_Large_p=Moor Large
AOCTD-Ruins_Large_P=Ruins Large

23
license.txt Normal file
View File

@ -0,0 +1,23 @@
Chivalry Server Launcher is released under the zlib/libpng OSI-approved license.
For more information: http://www.opensource.org/
Copyright (c) 2014 X2Software
http://www.x2software.net/
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software in a
product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

19
readme.txt Normal file
View File

@ -0,0 +1,19 @@
Built using Embarcadero Delphi XE2
Required components:
JEDI Code Library (JCL) and Visual Component Library (JVCL)
http://www.delphi-jedi.org/
SuperObject
https://code.google.com/p/superobject/
Virtual Treeview
http://www.soft-gems.net/index.php/controls/virtual-treeview
X² Component Library
http://svn.x2software.net/wsvn/x2cl
X² Utils
http://svn.x2software.net/wsvn/x2utils

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 931 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 955 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 929 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

20
source/Resources.pas Normal file
View File

@ -0,0 +1,20 @@
unit Resources;
interface
const
AssetsPath = 'assets\';
function GetAssetPath(const AAsset: string): string;
implementation
uses
X2UtApp;
function GetAssetPath(const AAsset: string): string;
begin
Result := App.Path + AssetsPath + AAsset;
end;
end.

View File

@ -0,0 +1,42 @@
unit Bindings.Converters;
interface
implementation
uses
System.Bindings.Outputs,
System.Rtti;
const
IntToExtended = 'IntToExtended';
ExtendedToInt = 'ExtendedToInt';
procedure RegisterConverters;
begin
TValueRefConverterFactory.RegisterConversion([TypeInfo(Integer)], [TypeInfo(Extended)],
TConverterDescription.Create(
procedure(const I: TValue; var O: TValue)
begin
O := TValue.From<Extended>(I.AsInteger);
end,
IntToExtended, IntToExtended, '', True, '', nil)
);
TValueRefConverterFactory.RegisterConversion([TypeInfo(Extended)], [TypeInfo(Integer)],
TConverterDescription.Create(
procedure(const I: TValue; var O: TValue)
begin
O := TValue.From<Integer>(Trunc(I.AsExtended));
end,
ExtendedToInt, ExtendedToInt, '', True, '', nil)
);
end;
initialization
RegisterConverters;
end.

View File

@ -0,0 +1,48 @@
unit Game.Base;
interface
uses
System.Classes;
type
TCustomGame = class(TInterfacedPersistent)
private
FLocation: string;
protected
procedure Notify(const APropertyName: string); virtual;
public
class function GetGameName: string; virtual; abstract;
constructor Create(const ALocation: string); virtual;
procedure Load; virtual; abstract;
procedure Save; virtual; abstract;
property Location: string read FLocation;
end;
TCustomGameClass = class of TCustomGame;
implementation
uses
System.Bindings.Helper,
System.SysUtils;
{ TCustomGame }
constructor TCustomGame.Create(const ALocation: string);
begin
inherited Create;
FLocation := IncludeTrailingPathDelimiter(ALocation);
end;
procedure TCustomGame.Notify(const APropertyName: string);
begin
TBindings.Notify(Self, APropertyName);
end;
end.

View File

@ -0,0 +1,88 @@
unit Game.Chivalry.MedievalWarfare;
interface
uses
System.Generics.Collections,
Game.Chivalry,
Game.Intf;
type
{ I haven't actually done any research into the dedicated server
for the other Chivalry game, so for now most stuff is implemented
in the base Chivalry class. }
TChivalryMedievalWarfareGame = class(TChivalryGame)
protected
procedure LoadSupportedMapList(AList: TList<IGameMap>); override;
public
class function GetGameName: string; override;
end;
implementation
uses
System.Classes,
System.IniFiles,
System.SysUtils,
Resources,
Game.Map,
Game.Registry;
{ TChivalryMedievalWarfareGame }
class function TChivalryMedievalWarfareGame.GetGameName: string;
begin
Result := 'Chivalry: Medieval Warfare';
end;
procedure TChivalryMedievalWarfareGame.LoadSupportedMapList(AList: TList<IGameMap>);
var
mapListFileName: string;
mapList: TMemIniFile;
categories: TStringList;
categoryName: string;
maps: TStringList;
mapIndex: Integer;
begin
mapListFileName := GetAssetPath('Chivalry.MedievalWarfare.MapList.ini');
if not FileExists(mapListFileName) then
exit;
mapList := TMemIniFile.Create(mapListFileName);
try
categories := nil;
maps := nil;
try
categories := TStringList.Create;
maps := TStringList.Create;
mapList.ReadSections(categories);
for categoryName in categories do
begin
maps.Clear;
mapList.ReadSectionValues(categoryName, maps);
for mapIndex := 0 to Pred(maps.Count) do
AList.Add(TGameMap.Create(Trim(maps.Names[mapIndex]),
Trim(maps.ValueFromIndex[mapIndex]),
Trim(categoryName)));
end;
finally
FreeAndNil(maps);
FreeAndNil(categories);
end;
finally
FreeAndNil(mapList);
end;
end;
initialization
TGameRegistry.Register(TChivalryMedievalWarfareGame);
end.

View File

@ -0,0 +1,229 @@
unit Game.Chivalry;
interface
uses
System.Generics.Collections,
Game.Base,
Game.Intf;
type
TChivalryGame = class(TCustomGame, IGameNetwork, IGameName, IGameMapList)
private
FServerPort: Integer;
FPeerPort: Integer;
FQueryPort: Integer;
FServerName: string;
FMessageOfTheDay: string;
FSupportedMapList: TList<IGameMap>;
FMapList: TList<string>;
protected
procedure LoadSupportedMapList(AList: TList<IGameMap>); virtual; abstract;
public
constructor Create(const ALocation: string); override;
destructor Destroy; override;
procedure Load; override;
procedure Save; override;
{ IGameNetwork }
function GetServerPort: Integer;
function GetPeerPort: Integer;
function GetQueryPort: Integer;
procedure SetServerPort(const Value: Integer);
procedure SetPeerPort(const Value: Integer);
procedure SetQueryPort(const Value: Integer);
property ServerPort: Integer read GetServerPort write SetServerPort;
property PeerPort: Integer read GetPeerPort write SetPeerPort;
property QueryPort: Integer read GetQueryPort write SetQueryPort;
{ IGameName }
function GetServerName: string;
function GetMessageOfTheDay: string;
procedure SetServerName(const Value: string);
procedure SetMessageOfTheDay(const Value: string);
property ServerName: string read GetServerName write SetServerName;
property MessageOfTheDay: string read GetMessageOfTheDay write SetMessageOfTheDay;
{ IGameMapList }
function GetMapList: System.Generics.Collections.TList<System.string>;
function GetSupportedMapList: System.Generics.Collections.TList<Game.Intf.IGameMap>;
end;
implementation
uses
System.IniFiles,
System.SysUtils;
const
GameSettingsFileName = 'UDKGame\Config\PCServer-UDKGame.ini';
GameURL = 'URL';
GameURLPort = 'Port'; GameURLPortDefault = 7777;
GameURLPeerPort = 'PeerPort'; GameURLPeerPortDefault = 7778;
GameReplicationInfo = 'Engine.GameReplicationInfo';
GameReplicationInfoServerName = 'ServerName';
GameReplicationInfoMessageOfTheDay = 'MessageOfTheDay';
EngineSettingsFileName = 'UDKGame\Config\PCServer-UDKEngine.ini';
EngineSteam = 'OnlineSubsystemSteamworks.OnlineSubsystemSteamworks';
EngineSteamQueryPort = 'QueryPort'; EngineSteamQueryPortDefault = 27015;
{ TChivalryGame }
constructor TChivalryGame.Create(const ALocation: string);
begin
inherited Create(ALocation);
FSupportedMapList := TList<IGameMap>.Create;
FMapList := TList<string>.Create;
LoadSupportedMapList(FSupportedMapList);
end;
destructor TChivalryGame.Destroy;
begin
FreeAndNil(FMapList);
FreeAndNil(FSupportedMapList);
inherited Destroy;
end;
procedure TChivalryGame.Load;
var
gameSettings: TMemIniFile;
engineSettings: TMemIniFile;
begin
gameSettings := TMemIniFile.Create(Location + GameSettingsFileName);
try
FServerPort := gameSettings.ReadInteger(GameURL, GameURLPort, GameURLPortDefault);
FPeerPort := gameSettings.ReadInteger(GameURL, GameURLPeerPort, GameURLPeerPortDefault);
FServerName := gameSettings.ReadString(GameReplicationInfo, GameReplicationInfoServerName, '');
FMessageOfTheDay := gameSettings.ReadString(GameReplicationInfo, GameReplicationInfoMessageOfTheDay, '');
finally
FreeAndNil(gameSettings);
end;
engineSettings := TMemIniFile.Create(Location + EngineSettingsFileName);
try
FQueryPort := engineSettings.ReadInteger(EngineSteam, EngineSteamQueryPort, EngineSteamQueryPortDefault);
finally
FreeAndNil(engineSettings);
end;
// #ToDo1 -oMvR: 30-6-2014: load map list
end;
procedure TChivalryGame.Save;
begin
// #ToDo1 -oMvR: 30-6-2014: save to INI files
end;
function TChivalryGame.GetServerPort: Integer;
begin
Result := FServerPort;
end;
function TChivalryGame.GetPeerPort: Integer;
begin
Result := FPeerPort;
end;
function TChivalryGame.GetQueryPort: Integer;
begin
Result := FQueryPort;
end;
procedure TChivalryGame.SetServerPort(const Value: Integer);
begin
if Value <> FServerPort then
begin
FServerPort := Value;
Notify('ServerPort');
end;
end;
procedure TChivalryGame.SetPeerPort(const Value: Integer);
begin
if Value <> FPeerPort then
begin
FPeerPort := Value;
Notify('PeerPort');
end;
end;
procedure TChivalryGame.SetQueryPort(const Value: Integer);
begin
if Value <> FQueryPort then
begin
FQueryPort := Value;
Notify('QueryPort');
end;
end;
function TChivalryGame.GetServerName: string;
begin
Result := FServerName;
end;
function TChivalryGame.GetMessageOfTheDay: string;
begin
Result := FMessageOfTheDay;
end;
procedure TChivalryGame.SetServerName(const Value: string);
begin
if Value <> FServerName then
begin
FServerName := Value;
Notify('ServerName');
end;
end;
procedure TChivalryGame.SetMessageOfTheDay(const Value: string);
begin
if Value <> FMessageOfTheDay then
begin
FMessageOfTheDay := Value;
Notify('MessageOfTheDay');
end;
end;
function TChivalryGame.GetMapList: System.Generics.Collections.TList<System.string>;
begin
Result := FMapList;
end;
function TChivalryGame.GetSupportedMapList: System.Generics.Collections.TList<Game.Intf.IGameMap>;
begin
Result := FSupportedMapList;
end;
end.

View File

@ -0,0 +1,59 @@
unit Game.Intf;
interface
uses
System.Generics.Collections;
type
IGameNetwork = interface
['{0B1445D2-E6B7-45FD-98CB-A76F01B9D4B8}']
function GetServerPort: Integer;
function GetPeerPort: Integer;
function GetQueryPort: Integer;
procedure SetServerPort(const Value: Integer);
procedure SetPeerPort(const Value: Integer);
procedure SetQueryPort(const Value: Integer);
property ServerPort: Integer read GetServerPort write SetServerPort;
property PeerPort: Integer read GetPeerPort write SetPeerPort;
property QueryPort: Integer read GetQueryPort write SetQueryPort;
end;
IGameName = interface
['{44A04A0D-BE01-42B7-8EF1-7EC5CC431B66}']
function GetServerName: string;
function GetMessageOfTheDay: string;
procedure SetServerName(const Value: string);
procedure SetMessageOfTheDay(const Value: string);
property ServerName: string read GetServerName write SetServerName;
property MessageOfTheDay: string read GetMessageOfTheDay write SetMessageOfTheDay;
end;
IGameMap = interface
['{B50A090C-3731-401F-91B5-0895CBE99921}']
function GetCategory: string;
function GetName: string;
function GetDisplayName: string;
property Category: string read GetCategory;
property Name: string read GetName;
property DisplayName: string read GetDisplayName;
end;
IGameMapList = interface
['{E8552B4C-9447-4FAD-BB20-C5EB3AF07B0E}']
function GetSupportedMapList: TList<IGameMap>;
function GetMapList: TList<string>;
end;
implementation
end.

View File

@ -0,0 +1,46 @@
unit Game.List;
interface
uses
System.Generics.Collections,
Game.Base;
type
TGameList = class(TList<TCustomGame>)
private
class var SInstance: TGameList;
protected
class procedure Finalize;
public
class function Instance: TGameList;
end;
implementation
uses
System.SysUtils;
{ TGameList }
class procedure TGameList.Finalize;
begin
FreeAndNil(SInstance);
end;
class function TGameList.Instance: TGameList;
begin
if not Assigned(SInstance) then
SInstance := TGameList.Create;
Result := SInstance;
end;
initialization
finalization
TGameList.Finalize;
end.

57
source/model/Game.Map.pas Normal file
View File

@ -0,0 +1,57 @@
unit Game.Map;
interface
uses
Game.Intf;
type
TGameMap = class(TInterfacedObject, IGameMap)
private
FCategory: string;
FName: string;
FDisplayName: string;
public
constructor Create(const AName: string; const ADisplayName, ACategory: string);
{ IGameMap }
function GetCategory: string;
function GetName: string;
function GetDisplayName: string;
end;
implementation
uses
System.StrUtils;
{ TGameMap }
constructor TGameMap.Create(const AName, ADisplayName, ACategory: string);
begin
inherited Create;
FName := AName;
FDisplayName := IfThen(Length(ADisplayName) > 0, ADisplayName, AName);
FCategory := ACategory;
end;
function TGameMap.GetCategory: string;
begin
Result := FCategory;
end;
function TGameMap.GetName: string;
begin
Result := FName;
end;
function TGameMap.GetDisplayName: string;
begin
Result := FDisplayName;
end;
end.

View File

@ -0,0 +1,81 @@
unit Game.Registry;
interface
uses
System.Generics.Collections,
Game.Base;
type
TGameRegistryEnumerable = class(TObject)
public
function GetEnumerator: TEnumerator<TCustomGameClass>;
end;
TGameRegistry = class(TObject)
protected
class var SRegisteredGames: TList<TCustomGameClass>;
class var SEnumerable: TGameRegistryEnumerable;
class procedure Initialize;
class procedure Finalize;
public
class function RegisteredGames: TGameRegistryEnumerable;
class procedure Register(AGameClass: TCustomGameClass);
class procedure Unregister(AGameClass: TCustomGameClass);
end;
implementation
uses
System.SysUtils;
{ TGameRegistry }
class procedure TGameRegistry.Initialize;
begin
SRegisteredGames := TList<TCustomGameClass>.Create;
SEnumerable := TGameRegistryEnumerable.Create;
end;
class procedure TGameRegistry.Finalize;
begin
FreeAndNil(SEnumerable);
FreeAndNil(SRegisteredGames);
end;
class function TGameRegistry.RegisteredGames: TGameRegistryEnumerable;
begin
Result := SEnumerable;
end;
class procedure TGameRegistry.Register(AGameClass: TCustomGameClass);
begin
if not SRegisteredGames.Contains(AGameClass) then
SRegisteredGames.Add(AGameClass);
end;
class procedure TGameRegistry.Unregister(AGameClass: TCustomGameClass);
begin
SRegisteredGames.Remove(AGameClass);
end;
{ TGameRegistryEnumerable }
function TGameRegistryEnumerable.GetEnumerator: TEnumerator<TCustomGameClass>;
begin
Result := TGameRegistry.SRegisteredGames.GetEnumerator;
end;
initialization
TGameRegistry.Initialize;
finalization
TGameRegistry.Finalize;
end.

View File

@ -0,0 +1,27 @@
unit Persist.GameList;
interface
uses
Game.List;
type
TGameListPersist = class(TObject)
public
class procedure Load(const AFileName: string; AList: TGameList);
end;
implementation
uses
System.SysUtils;
{ TGameListPersist }
class procedure TGameListPersist.Load(const AFileName: string; AList: TGameList);
begin
if not FileExists(AFileName) then
exit;
end;
end.

121
source/view/Forms.Game.dfm Normal file
View File

@ -0,0 +1,121 @@
object GameForm: TGameForm
Left = 0
Top = 0
ActiveControl = deLocation
BorderIcons = [biSystemMenu]
BorderStyle = bsDialog
Caption = 'Game location'
ClientHeight = 124
ClientWidth = 519
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poOwnerFormCenter
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object gbGame: TGroupBox
AlignWithMargins = True
Left = 8
Top = 8
Width = 503
Height = 75
Margins.Left = 8
Margins.Top = 8
Margins.Right = 8
Margins.Bottom = 8
Align = alClient
TabOrder = 0
ExplicitLeft = 232
ExplicitTop = 136
ExplicitWidth = 185
ExplicitHeight = 105
DesignSize = (
503
75)
object lblGame: TLabel
Left = 20
Top = 15
Width = 31
Height = 13
Caption = 'Game:'
end
object lblLocation: TLabel
Left = 20
Top = 42
Width = 44
Height = 13
Caption = 'Location:'
end
object cmbGame: TComboBox
Left = 108
Top = 12
Width = 383
Height = 21
Style = csDropDownList
Anchors = [akLeft, akTop, akRight]
TabOrder = 0
ExplicitWidth = 509
end
object deLocation: TJvDirectoryEdit
Left = 108
Top = 39
Width = 383
Height = 21
DialogKind = dkWin32
DialogText = 'Select game location'
DialogOptionsWin32 = [odStatusAvailable, odEditBox, odNewDialogStyle, odNoNewButtonFolder]
Anchors = [akLeft, akTop, akRight]
TabOrder = 1
ExplicitWidth = 509
end
end
object pnlButtons: TPanel
AlignWithMargins = True
Left = 8
Top = 91
Width = 503
Height = 25
Margins.Left = 8
Margins.Top = 0
Margins.Right = 8
Margins.Bottom = 8
Align = alBottom
AutoSize = True
BevelOuter = bvNone
TabOrder = 1
object btnCancel: TButton
Left = 428
Top = 0
Width = 75
Height = 25
Align = alRight
Cancel = True
Caption = 'Cancel'
ModalResult = 2
TabOrder = 1
end
object btnOK: TButton
AlignWithMargins = True
Left = 345
Top = 0
Width = 75
Height = 25
Margins.Left = 0
Margins.Top = 0
Margins.Right = 8
Margins.Bottom = 0
Align = alRight
Caption = 'OK'
Default = True
TabOrder = 0
OnClick = btnOKClick
ExplicitLeft = 347
ExplicitTop = 3
end
end
end

133
source/view/Forms.Game.pas Normal file
View File

@ -0,0 +1,133 @@
unit Forms.Game;
interface
uses
System.Classes,
Vcl.Controls,
Vcl.Dialogs,
Vcl.ExtCtrls,
Vcl.Forms,
Vcl.Mask,
Vcl.StdCtrls,
JvExMask,
JvToolEdit,
Game.Base;
type
TGameForm = class(TForm)
btnCancel: TButton;
btnOK: TButton;
cmbGame: TComboBox;
deLocation: TJvDirectoryEdit;
gbGame: TGroupBox;
lblGame: TLabel;
lblLocation: TLabel;
pnlButtons: TPanel;
procedure FormCreate(Sender: TObject);
procedure btnOKClick(Sender: TObject);
private
function GetGameClass: TCustomGameClass;
function GetLocation: string;
procedure SetGameClass(const Value: TCustomGameClass);
procedure SetLocation(const Value: string);
protected
property GameClass: TCustomGameClass read GetGameClass write SetGameClass;
property Location: string read GetLocation write SetLocation;
public
class function Insert(AOwner: TComponent; out AGame: TCustomGame): Boolean;
end;
implementation
uses
System.SysUtils,
Winapi.Windows,
Game.Registry;
{$R *.dfm}
{ TGameForm }
class function TGameForm.Insert(AOwner: TComponent; out AGame: TCustomGame): Boolean;
begin
with Self.Create(AOwner) do
try
Result := (ShowModal = mrOk);
if Result then
AGame := GameClass.Create(Location);
finally
Free;
end;
end;
procedure TGameForm.FormCreate(Sender: TObject);
var
gameClass: TCustomGameClass;
begin
cmbGame.Items.BeginUpdate;
try
cmbGame.Items.Clear;
for gameClass in TGameRegistry.RegisteredGames do
cmbGame.Items.AddObject(gameClass.GetGameName, TObject(gameClass));
finally
cmbGame.Items.EndUpdate;
cmbGame.ItemIndex := 0;
end;
end;
procedure TGameForm.btnOKClick(Sender: TObject);
begin
if not Assigned(GameClass) then
begin
MessageBox(Self.Handle, 'Please select the game type', 'Error', MB_OK or MB_ICONERROR);
ActiveControl := cmbGame;
exit;
end;
if (Length(Location) = 0) or (not DirectoryExists(Location)) then
begin
MessageBox(Self.Handle, 'Please enter a valid location', 'Error', MB_OK or MB_ICONERROR);
ActiveControl := deLocation;
exit;
end;
ModalResult := mrOk;
end;
function TGameForm.GetGameClass: TCustomGameClass;
begin
Result := nil;
if cmbGame.ItemIndex > -1 then
Result := TCustomGameClass(cmbGame.Items.Objects[cmbGame.ItemIndex]);
end;
function TGameForm.GetLocation: string;
begin
Result := deLocation.Text;
end;
procedure TGameForm.SetGameClass(const Value: TCustomGameClass);
begin
cmbGame.ItemIndex := cmbGame.Items.IndexOfObject(TObject(Value));
end;
procedure TGameForm.SetLocation(const Value: string);
begin
deLocation.Text := Value;
end;
end.

1893
source/view/Forms.Main.dfm Normal file

File diff suppressed because it is too large Load Diff

502
source/view/Forms.Main.pas Normal file
View File

@ -0,0 +1,502 @@
unit Forms.Main;
interface
uses
System.Bindings.Expression,
System.Classes,
System.Generics.Collections,
Vcl.ComCtrls,
Vcl.Controls,
Vcl.ExtCtrls,
Vcl.Forms,
Vcl.Imaging.pngimage,
Vcl.ImgList,
Vcl.Mask,
Vcl.StdCtrls,
Vcl.ToolWin,
JvExControls,
JvExMask,
JvGradient,
JvGroupHeader,
JvSpin,
VirtualTrees,
X2CLGraphicList,
X2CLMenuBar,
X2CLmusikCubeMenuBarPainter,
Game.Base,
Game.Intf, Vcl.ActnList;
type
TMainForm = class(TForm)
edtMessageOfTheDay: TEdit;
edtServerName: TEdit;
gbPorts: TGroupBox;
gbServerName: TGroupBox;
gcMenu: TX2GraphicContainer;
gcMenuAbout: TX2GraphicContainerItem;
gcMenuGames: TX2GraphicContainerItem;
gcMenuMaplist: TX2GraphicContainerItem;
gcMenuNetwork: TX2GraphicContainerItem;
gcMenuSettings: TX2GraphicContainerItem;
gcToolbar: TX2GraphicContainer;
gcToolbaradd: TX2GraphicContainerItem;
gcToolbarremove: TX2GraphicContainerItem;
glMenu: TX2GraphicList;
glToolbar: TX2GraphicList;
grdMenu: TJvGradient;
imgGamesWarning: TImage;
imgLogo: TImage;
lblChivalry: TLabel;
lblPixelophilia: TLabel;
lblGamesWarning: TLabel;
lblGentleface: TLabel;
lblJCL: TLabel;
lblMessageOfTheDay: TLabel;
lblPeerPort: TLabel;
lblQueryPort: TLabel;
lblServerName: TLabel;
lblServerPort: TLabel;
lblVirtualTreeview: TLabel;
llChivalry: TLinkLabel;
llPixelophilia: TLinkLabel;
llGentleface: TLinkLabel;
llPixelophiliaCC: TLinkLabel;
llGentlefaceCC: TLinkLabel;
llJCL: TLinkLabel;
llVirtualTreeview: TLinkLabel;
mbMenu: TX2MenuBar;
mbpMenuPainter: TX2MenuBarmusikCubePainter;
pcMain: TPageControl;
pnlLogo: TPanel;
pnlGamesWarning: TPanel;
sePeerPort: TJvSpinEdit;
seQueryPort: TJvSpinEdit;
seServerPort: TJvSpinEdit;
shpMenu: TShape;
tbGames: TToolBar;
tbGameAdd: TToolButton;
tbGameRemove: TToolButton;
tsAbout: TTabSheet;
tsConfiguration: TTabSheet;
tsGames: TTabSheet;
tsMapList: TTabSheet;
tsNetwork: TTabSheet;
vstMapList: TVirtualStringTree;
VirtualStringTree2: TVirtualStringTree;
alMain: TActionList;
actGameAdd: TAction;
actGameRemove: TAction;
lblSuperObject: TLabel;
llSuperObject: TLinkLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure mbMenuCollapsing(Sender: TObject; Group: TX2MenuBarGroup; var Allowed: Boolean);
procedure mbMenuSelectedChanged(Sender: TObject; Item: TX2CustomMenuBarItem);
procedure llLinkClick(Sender: TObject; const Link: string; LinkType: TSysLinkType);
procedure SpinEditChange(Sender: TObject);
procedure EditChange(Sender: TObject);
procedure actGameAddExecute(Sender: TObject);
procedure actGameRemoveExecute(Sender: TObject);
private type
TBindingExpressionList = TList<TBindingExpression>;
TPageMenuMap = TDictionary<TTabSheet, TX2MenuBarItem>;
private
FActiveGame: TCustomGame;
FPageMenuMap: TPageMenuMap;
FUIBindings: TBindingExpressionList;
procedure SetActiveGame(const Value: TCustomGame);
protected
procedure ActiveGameChanged;
procedure ClearUIBindings;
procedure Bind(const APropertyName: string; ADestObject: TObject; const ADestPropertyName: string);
procedure BindGameNetwork;
procedure BindGameName;
procedure BindGameMapList;
procedure UpdateMenu;
property ActiveGame: TCustomGame read FActiveGame write SetActiveGame;
property PageMenuMap: TPageMenuMap read FPageMenuMap;
property UIBindings: TBindingExpressionList read FUIBindings;
end;
implementation
uses
System.Bindings.Helper,
System.Math,
System.StrUtils,
System.SysUtils,
System.Types,
Vcl.Graphics,
Vcl.GraphUtil,
Vcl.Themes,
Winapi.ShellAPI,
Winapi.Windows,
X2UtGraphics,
Forms.Game,
Game.Chivalry.MedievalWarfare,
Game.List,
Persist.GameList;
type
TINIHintWindow = class(THintWindow)
protected
function IsINIHint(const AHint: string): Boolean;
function GetINIHint(const AHint: string; out ASection, AKey: string): Boolean;
procedure Paint; override;
public
function CalcHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect; override;
end;
const
INIHintPrefix = 'INI:';
INIHintSeparator = '>';
{$R *.dfm}
{ TMainForm }
procedure TMainForm.FormCreate(Sender: TObject);
var
lightBtnFace: TColor;
pageIndex: Integer;
menuGroup: TX2MenuBarGroup;
menuItem: TX2MenuBarItem;
// game: TCustomGame;
begin
FUIBindings := TBindingExpressionList.Create;
FPageMenuMap := TPageMenuMap.Create(pcMain.PageCount);
{ Configure pages }
for pageIndex := 0 to Pred(pcMain.PageCount) do
pcMain.Pages[pageIndex].TabVisible := False;
pageIndex := 0;
for menuGroup in mbMenu.Groups do
for menuItem in menuGroup.Items do
begin
Assert(pageIndex < pcMain.PageCount);
FPageMenuMap.Add(pcMain.Pages[pageIndex], menuItem);
menuItem.Tag := pageIndex;
Inc(pageIndex);
end;
{ Eye-candy }
lightBtnFace := BlendColors(clBtnFace, clWindow, 196);
pnlGamesWarning.Color := lightBtnFace;
// #ToDo1 -oMvR: 30-6-2014: load last active game
// game := TChivalryMedievalWarfareGame.Create('D:\Steam\steamapps\common\chivalry_ded_server');
// game.Load;
// ActiveGame := game;
{ Initialize menu }
mbpMenuPainter.GroupColors.Hot.Assign(mbpMenuPainter.GroupColors.Normal);
mbMenu.SelectFirst;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
ClearUIBindings;
FreeAndNil(FPageMenuMap);
FreeAndNil(FUIBindings);
end;
procedure TMainForm.ActiveGameChanged;
begin
ClearUIBindings;
// #ToDo1 -oMvR: 30-6-2014: attach observer to monitor changes
if Supports(ActiveGame, IGameNetwork) then
BindGameNetwork;
if Supports(ActiveGame, IGameName) then
BindGameName;
if Supports(ActiveGame, IGameMapList) then
BindGameMapList;
UpdateMenu;
end;
procedure TMainForm.ClearUIBindings;
var
binding: TBindingExpression;
begin
for binding in UIBindings do
TBindings.RemoveBinding(binding);
UIBindings.Clear;
end;
procedure TMainForm.Bind(const APropertyName: string; ADestObject: TObject; const ADestPropertyName: string);
begin
{ Source -> Destination }
UIBindings.Add(TBindings.CreateManagedBinding(
[TBindings.CreateAssociationScope([Associate(ActiveGame, 'src')])],
'src.' + APropertyName,
[TBindings.CreateAssociationScope([Associate(ADestObject, 'dst')])],
'dst.' + ADestPropertyName,
nil, nil, [coNotifyOutput, coEvaluate]));
{ Destination -> Source }
UIBindings.Add(TBindings.CreateManagedBinding(
[TBindings.CreateAssociationScope([Associate(ADestObject, 'src')])],
'src.' + ADestPropertyName,
[TBindings.CreateAssociationScope([Associate(ActiveGame, 'dst')])],
'dst.' + APropertyName,
nil, nil, [coNotifyOutput]));
end;
procedure TMainForm.BindGameNetwork;
begin
Bind('ServerPort', seServerPort, 'Value');
Bind('PeerPort', sePeerPort, 'Value');
Bind('QueryPort', seQueryPort, 'Value');
end;
procedure TMainForm.BindGameName;
begin
Bind('ServerName', edtServerName, 'Text');
Bind('MessageOfTheDay', edtMessageOfTheDay, 'Text');
end;
procedure TMainForm.BindGameMapList;
begin
// #ToDo1 -oMvR: 30-6-2014: load map list
end;
procedure TMainForm.UpdateMenu;
procedure EnablePageByInterface(APage: TTabSheet; AInterface: TGUID);
begin
PageMenuMap[APage].Enabled := Supports(ActiveGame, AInterface);
end;
begin
EnablePageByInterface(tsNetwork, IGameNetwork);
EnablePageByInterface(tsConfiguration, IGameName);
EnablePageByInterface(tsMapList, IGameMapList);
if Assigned(mbMenu.SelectedItem) and (not mbMenu.SelectedItem.Enabled) then
mbMenu.SelectFirst;
end;
procedure TMainForm.SetActiveGame(const Value: TCustomGame);
begin
if Value <> FActiveGame then
begin
FActiveGame := Value;
ActiveGameChanged;
end;
end;
procedure TMainForm.mbMenuCollapsing(Sender: TObject; Group: TX2MenuBarGroup; var Allowed: Boolean);
begin
Allowed := False;
end;
procedure TMainForm.mbMenuSelectedChanged(Sender: TObject; Item: TX2CustomMenuBarItem);
begin
pcMain.ActivePageIndex := Item.Tag;
end;
procedure TMainForm.llLinkClick(Sender: TObject; const Link: string; LinkType: TSysLinkType);
begin
ShellExecute(0, 'open', PChar(Link), nil, nil, SW_SHOWNORMAL);
end;
procedure TMainForm.SpinEditChange(Sender: TObject);
begin
TBindings.Notify(Sender, 'Value');
end;
procedure TMainForm.EditChange(Sender: TObject);
begin
TBindings.Notify(Sender, 'Text');
end;
procedure TMainForm.actGameAddExecute(Sender: TObject);
var
game: TCustomGame;
begin
if TGameForm.Insert(Self, game) then
begin
//
end;
end;
procedure TMainForm.actGameRemoveExecute(Sender: TObject);
begin
//
end;
{ TINIHintWindow }
function TINIHintWindow.CalcHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect;
var
section: string;
key: string;
sectionRect: TRect;
begin
if GetINIHint(AHint, section, key) then
begin
Canvas.Font.Style := [fsBold];
try
sectionRect := inherited CalcHintRect(MaxWidth, section, AData);
finally
Canvas.Font.Style := [];
end;
Result := inherited CalcHintRect(MaxWidth, key, AData);
Result.Right := Max(Result.Right, sectionRect.Right);
Inc(Result.Bottom, RectHeight(sectionRect));
end else
Result := inherited CalcHintRect(MaxWidth, AHint, AData);
end;
procedure TINIHintWindow.Paint;
var
section: string;
key: string;
textRect: TRect;
clipRect: TRect;
elementColor: TColor;
elementDetails: TThemedElementDetails;
gradientStart: TColor;
gradientEnd: TColor;
textColor: TColor;
begin
if GetINIHint(Caption, section, key) then
begin
textRect := ClientRect;
textColor := Screen.HintFont.Color;
if StyleServices.Enabled then
begin
clipRect := textRect;
InflateRect(textRect, 4, 4);
if TOSVersion.Check(6) and StyleServices.IsSystemStyle then
begin
// Paint Windows gradient background
StyleServices.DrawElement(Canvas.Handle, StyleServices.GetElementDetails(tttStandardNormal), textRect, clipRect);
end else
begin
elementDetails := StyleServices.GetElementDetails(thHintNormal);
if StyleServices.GetElementColor(elementDetails, ecGradientColor1, elementColor) and (elementColor <> clNone) then
gradientStart := elementColor
else
gradientStart := clInfoBk;
if StyleServices.GetElementColor(elementDetails, ecGradientColor2, elementColor) and (elementColor <> clNone) then
gradientEnd := elementColor
else
gradientEnd := clInfoBk;
if StyleServices.GetElementColor(elementDetails, ecTextColor, elementColor) and (elementColor <> clNone) then
textColor := elementColor
else
textColor := Screen.HintFont.Color;
GradientFillCanvas(Canvas, gradientStart, gradientEnd, textRect, gdVertical);
end;
textRect := clipRect;
end;
Inc(textRect.Left, 2);
Inc(textRect.Top, 2);
Canvas.Font.Color := textColor;
Canvas.Font.Style := [fsBold];
try
DrawText(Canvas.Handle, section, -1, textRect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK or DrawTextBiDiModeFlagsReadingOnly);
Inc(textRect.Top, Canvas.TextHeight(section) + 2);
finally
Canvas.Font.Style := [];
end;
DrawText(Canvas.Handle, key, -1, textRect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK or DrawTextBiDiModeFlagsReadingOnly);
end else
inherited Paint;
end;
function TINIHintWindow.IsINIHint(const AHint: string): Boolean;
begin
Result := AnsiStartsText(INIHintPrefix, AHint);
end;
function TINIHintWindow.GetINIHint(const AHint: string; out ASection, AKey: string): Boolean;
var
hint: string;
separatorPos: Integer;
begin
Result := IsINIHint(AHint);
if Result then
begin
hint := Copy(AHint, Succ(Length(INIHintPrefix)), MaxInt);
ASection := '';
AKey := hint;
separatorPos := Pos(INIHintSeparator, hint);
if separatorPos > 0 then
begin
ASection := hint;
SetLength(ASection, Pred(separatorPos));
Delete(AKey, 1, Pred(separatorPos) + Length(INIHintSeparator));
end;
end;
end;
initialization
HintWindowClass := TINIHintWindow;
end.